Index: /trunk/admin/site_manager.php
===================================================================
--- /trunk/admin/site_manager.php	(revision 13487)
+++ /trunk/admin/site_manager.php	(revision 13488)
@@ -39,41 +39,4 @@
 }
 
-/**
- * requests the given $url (a remote create_listing_file.php) and fills a
- * list of lines corresponding to request output
- *
- * @param string $url
- * @return void
- */
-function remote_output($url)
-{
-  global $template, $page;
-
-  if (fetchRemote($url, $result))
-  {
-    $lines = explode("\r\n", $result);
-    // cleaning lines from HTML tags
-    foreach ($lines as $line)
-    {
-      $line = trim(strip_tags($line));
-      if (preg_match('/^PWG-([A-Z]+)-/', $line, $matches))
-      {
-        $template->append(
-          'remote_output',
-          array(
-            'CLASS' => 'remote'.ucfirst(strtolower($matches[1])),
-            'CONTENT' => $line
-           )
-         );
-      }
-    }
-  }
-  else
-  {
-    array_push($page['errors'], l10n('file create_listing_file.php on remote site was not found'));
-  }
-}
-
-
 // +-----------------------------------------------------------------------+
 // |                             template init                             |
@@ -87,12 +50,13 @@
 {
   $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 (! $is_remote)
+  if ( ! (strpos($url, '.') === 0 ) )
   {
-    if ( ! (strpos($url, '.') === 0 ) )
-    {
-      $url = './' . $url;
-    }
+    $url = './' . $url;
   }
 
@@ -111,36 +75,8 @@
   if (count($page['errors']) == 0)
   {
-    if ($is_remote)
+    if ( ! file_exists($url) )
     {
-      if ( ! isset($_POST['no_check']) )
-      {
-        $clf_url = $url.'create_listing_file.php';
-        $get_data = array(
-          'action' => 'test',
-          'version' => PHPWG_VERSION,
-        );
-        if (fetchRemote($clf_url, $result, $get_data))
-        {
-          $lines = explode("\r\n", $result);
-          $first_line = strip_tags($lines[0]);
-          if (!preg_match('/^PWG-INFO-2:/', $first_line))
-          {
-            array_push($page['errors'],
-                       l10n('an error happened').' : '.$first_line);
-          }
-        }
-        else
-        {
-          array_push($page['errors'], l10n('file create_listing_file.php on remote site was not found') );
-        }
-      }
-    }
-    else
-    { // local directory
-      if ( ! file_exists($url) )
-      {
-        array_push($page['errors'],
-          l10n('Directory does not exist').' ['.$url.']');
-      }
+      array_push($page['errors'],
+        l10n('Directory does not exist').' ['.$url.']');
     }
   }
@@ -177,22 +113,4 @@
   switch($_GET['action'])
   {
-    case 'generate' :
-    {
-      $title = $galleries_url.' : '.l10n('generate listing');
-      remote_output($galleries_url.'create_listing_file.php?action=generate');
-      break;
-    }
-    case 'test' :
-    {
-      $title = $galleries_url.' : '.l10n('test');
-      remote_output($galleries_url.'create_listing_file.php?action=test&version='.PHPWG_VERSION);
-      break;
-    }
-    case 'clean' :
-    {
-      $title = $galleries_url.' : '.l10n('clean');
-      remote_output($galleries_url.'create_listing_file.php?action=clean');
-      break;
-    }
     case 'delete' :
     {
@@ -212,21 +130,4 @@
     )
   );
-
-// +-----------------------------------------------------------------------+
-// |                           remote sites list                           |
-// +-----------------------------------------------------------------------+
-
-if ( is_file(PHPWG_ROOT_PATH.'listing.xml') )
-{
-  $xml_content = getXmlCode(PHPWG_ROOT_PATH.'listing.xml');
-  $local_listing_site_url = getAttribute(
-          getChild($xml_content, 'informations'),
-          'url'
-        );
-  if ( !url_is_remote($local_listing_site_url) )
-  {
-    $local_listing_site_url = null;
-  }
-}
 
 $query = '
@@ -267,14 +168,4 @@
      );
      
-   if ($is_remote)
-   {
-     $tpl_var['remote'] =
-       array(
-         'U_TEST' => $base_url.'test',
-         'U_GENERATE' => $row['galleries_url'].'create_listing_file.php?action=generate',
-         'U_CLEAN' => $base_url.'clean',
-         );
-   }
-
   if ($row['id'] != 1)
   {
@@ -290,28 +181,5 @@
 
   $template->append('sites', $tpl_var);
-
-  if ( isset($local_listing_site_url) and
-       $row['galleries_url']==$local_listing_site_url )
-  {
-    $local_listing_site_id = $row['id'];
-    $template->assign( 'local_listing',
-        array(
-          'URL' =>  $local_listing_site_url,
-          'U_SYNCHRONIZE' => $update_url.'&amp;local_listing=1'
-        )
-      );
-  }
 }
-
-if ( isset($local_listing_site_url) and !isset($local_listing_site_id) )
-{
-  $template->assign( 'local_listing',
-      array(
-        'URL' =>  $local_listing_site_url,
-        'CREATE' => true
-      )
-    );
-}
-
 
 $template->assign_var_from_handle('ADMIN_CONTENT', 'site_manager');
Index: unk/admin/site_reader_remote.php
===================================================================
--- /trunk/admin/site_reader_remote.php	(revision 13487)
+++ 	(revision )
@@ -1,249 +1,0 @@
-<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery                                    |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | This program is free software; you can redistribute it and/or modify  |
-// | it under the terms of the GNU General Public License as published by  |
-// | the Free Software Foundation                                          |
-// |                                                                       |
-// | This program is distributed in the hope that it will be useful, but   |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
-// | General Public License for more details.                              |
-// |                                                                       |
-// | You should have received a copy of the GNU General Public 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 a remote listing.xml
-class RemoteSiteReader
-{
-
-var $site_url;
-var $listing_url;
-var $site_dirs;
-var $site_files;
-var $insert_attributes;
-var $metadata_attributes;
-
-function RemoteSiteReader($url, $listing_url)
-{
-  $this->site_url = $url;
-  $this->insert_attributes = array(
-    'tn_ext',
-    );
-  $this->update_attributes = array(
-    'tn_ext', 'representative_ext', 'has_high',
-    );
-  $this->metadata_attributes = array(
-    'filesize', 'width', 'height', 'high_filesize', 'high_width', 'high_height',
-    );
-
-  if (!isset($listing_url))
-  {
-    $this->listing_url = $this->site_url.'listing.xml';
-  }
-  else
-  {
-    $this->listing_url = $listing_url;
-  }
-}
-
-/**
- * Is this remote site ok ?
- *
- * @return true on success, false otherwise
- */
-function open()
-{
-  global $errors;
-
-  if ($xml_content = getXmlCode($this->listing_url))
-  {
-    $this->site_dirs = array();
-    $this->site_files = array();
-    $info_xml_element = getChild($xml_content, 'informations');
-    if (getAttribute($info_xml_element , 'phpwg_version') != PHPWG_VERSION)
-    {
-      array_push(
-        $errors,
-        array(
-          'path' => $this->listing_url,
-          'type' => 'PWG-ERROR-VERSION'
-          )
-        );
-
-      return false;
-    }
-
-    $additional_metadata = getAttribute($info_xml_element, 'metadata');
-
-    if ($additional_metadata != '')
-    {
-      $this->metadata_attributes = array_merge(
-        $this->metadata_attributes,
-        explode(',', $additional_metadata)
-        );
-    }
-    
-    $this->build_structure($xml_content, '', 0);
-
-    return true;
-  }
-  else
-  {
-    array_push(
-      $errors,
-      array(
-        'path' => $this->listing_url,
-        'type' => 'PWG-ERROR-NOLISTING'
-        )
-      );
-
-    return false;
-  }
-}
-
-// retrieve xml sub-directories fulldirs
-function get_full_directories($basedir)
-{
-  $dirs = array();
-  foreach ( array_keys($this->site_dirs) as $dir)
-  {
-    $full_dir = $this->site_url . $dir;
-    if ($full_dir != $basedir
-        and strpos($full_dir, $basedir) === 0
-      )
-    {
-      array_push($dirs, $full_dir);
-    }
-  }
-  return $dirs;
-}
-
-/**
- * Returns a hash with all elements (images and files) inside the full $path
- * according to listing.xml
- * @param string $path recurse in this directory only
- * @return array like "pic.jpg"=>array('tn_ext'=>'jpg' ... )
- */
-function get_elements($path)
-{
-  $elements = array();
-  foreach ( $this->site_dirs as $dir=>$files)
-  {
-    $full_dir = $this->site_url . $dir;
-    if (strpos($full_dir, $path) === 0)
-    {
-      foreach ($files as $file)
-      {
-        $data = $this->get_element_attributes(
-          $file,
-          $this->insert_attributes
-          );
-        $elements[$file] = $data;
-      }
-    }
-  }
-
-  return $elements;
-}
-
-// returns the name of the attributes that are supported for
-// files update/synchronization
-function get_update_attributes()
-{
-  return $this->update_attributes;
-}
-
-function get_element_update_attributes($file)
-{
-  return $this->get_element_attributes(
-    $file,
-    $this->update_attributes
-    );
-}
-
-// returns the name of the attributes that are supported for
-// metadata update/synchronization according to listing.xml
-function get_metadata_attributes()
-{
-  return $this->metadata_attributes;
-}
-
-// returns a hash of attributes (metadata+width,...) for file
-function get_element_metadata($file, $has_high = false)
-{
-  return $this->get_element_attributes(
-    $file,
-    $this->metadata_attributes
-    );
-}
-
-//-------------------------------------------------- private functions --------
-/**
- * Returns a hash of image/file attributes
- * @param string $file fully qualified file name
- * @param array $attributes specifies which attributes to retrieve
- *  returned
-*/
-function get_element_attributes($file, $attributes)
-{
-  $xml_element = $this->site_files[$file];
-  if (!isset($xml_element))
-  {
-    return null;
-  }
-  $data = array();
-  foreach($attributes as $att)
-  {
-    if (getAttribute($xml_element, $att) != '')
-    {
-      $val = getAttribute($xml_element, $att);
-      $data[$att] = addslashes($val);
-    }
-  }
-  return $data;
-}
-
-// recursively parse the xml_content for later usage
-function build_structure($xml_content, $basedir, $level)
-{
-  $temp_dirs = getChildren($xml_content, 'dir'.$level);
-  foreach ($temp_dirs as $temp_dir)
-  {
-    $dir_name = $basedir;
-    if ($dir_name != '' )
-    {
-      $dir_name .= '/';
-    }
-    $dir_name .= getAttribute($temp_dir, 'name');
-    $this->site_dirs[ $dir_name ] = array();
-    $this->build_structure($temp_dir, $dir_name, $level+1);
-  }
-
-  if ($basedir != '')
-  {
-    $xml_elements = getChildren(
-      getChild($xml_content, 'root'),
-      'element'
-      );
-    foreach ($xml_elements as $xml_element)
-    {
-      $path = getAttribute($xml_element, 'path');
-      $this->site_files[$path] = $xml_element;
-      array_push($this->site_dirs[$basedir], $path);
-    }
-  }
-}
-
-}
-
-?>
Index: /trunk/admin/site_update.php
===================================================================
--- /trunk/admin/site_update.php	(revision 13487)
+++ /trunk/admin/site_update.php	(revision 13488)
@@ -59,20 +59,8 @@
     l10n('The name of directories and files must be composed of letters, numbers, "-", "_" or "."')
     ),
-  'PWG-UPDATE-2' => array(
-    l10n('missing thumbnail'),
-    l10n('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 :').implode(',', $conf['picture_ext'])
-    ),
   '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)')
     ),
-  'PWG-ERROR-VERSION' => array(
-    l10n('Piwigo version differs on the remote site'),
-    l10n('Version of create_listing_file.php on the remote site and Piwigo must be the same')
-    ),
-  'PWG-ERROR-NOLISTING' => array(
-    l10n('listing.xml file was not found'),
-    l10n('listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager')
-    )
   );
 $errors = array();
@@ -82,12 +70,4 @@
 {
   fatal_error('remote sites not supported');
-  include_once(PHPWG_ROOT_PATH.'admin/site_reader_remote.php');
-  $local_listing = null;
-  if ( isset($_GET['local_listing'])
-      and $_GET['local_listing'] )
-  {
-    $local_listing = PHPWG_ROOT_PATH.'listing.xml';
-  }
-  $site_reader = new RemoteSiteReader($site_url, $local_listing);
 }
 else
Index: /trunk/admin/themes/default/template/site_manager.tpl
===================================================================
--- /trunk/admin/themes/default/template/site_manager.tpl	(revision 13487)
+++ /trunk/admin/themes/default/template/site_manager.tpl	(revision 13488)
@@ -11,23 +11,4 @@
   </ul>
 </div>
-{/if}
-
-{if isset($local_listing)}
-{'A local listing.xml file has been found for'|@translate} {$local_listing.URL}
-{if isset($local_listing.CREATE)}
-<form action="{$F_ACTION}" method="post">
-  <p>
-    <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
-    {'Create this site'|@translate}:
-    <input type="hidden" name="no_check" value="1">
-    <input type="hidden" name="galleries_url" value="{$local_listing.URL}">
-    <input type="submit" name="submit" value="{'Submit'|@translate}">
-  </p>
-</form>
-{/if}
-{if isset($local_listing.U_SYNCHRONIZE)}
-&nbsp;<a href="{$local_listing.U_SYNCHRONIZE}" title="{'read local listing.xml and update'|@translate}">{'Synchronize'|@translate}</a>
-<br><br>
-{/if}
 {/if}
 
@@ -46,10 +27,4 @@
       [<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 isset($site.remote)}
-      <br>
-      [<a href="{$site.remote.U_TEST}" title="{'test this remote site'|@translate}">{'test'|@translate}</a>]
-      [<a href="{$site.remote.U_GENERATE}" title="{'generate file listing.xml on remote site'|@translate}">{'generate listing'|@translate}</a>]
-      [<a href="{$site.remote.U_CLEAN}" title="{'remove remote listing.xml file'|@translate}">{'clean'|@translate}</a>]
     {/if}
     {if not empty($site.plugin_links)}
Index: /trunk/include/functions.inc.php
===================================================================
--- /trunk/include/functions.inc.php	(revision 13487)
+++ /trunk/include/functions.inc.php	(revision 13488)
@@ -26,5 +26,4 @@
 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_xml.inc.php' );
 include_once( PHPWG_ROOT_PATH .'include/functions_html.inc.php' );
 include_once( PHPWG_ROOT_PATH .'include/functions_tag.inc.php' );
Index: unk/include/functions_xml.inc.php
===================================================================
--- /trunk/include/functions_xml.inc.php	(revision 13487)
+++ 	(revision )
@@ -1,134 +1,0 @@
-<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery                                    |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | This program is free software; you can redistribute it and/or modify  |
-// | it under the terms of the GNU General Public License as published by  |
-// | the Free Software Foundation                                          |
-// |                                                                       |
-// | This program is distributed in the hope that it will be useful, but   |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
-// | General Public License for more details.                              |
-// |                                                                       |
-// | You should have received a copy of the GNU General Public 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( 'ATT_REG', '\w+' );
-define( 'VAL_REG', '[^"]*' );
-
-//------------------------------------------------------------------- functions
-// getContent returns the content of a tag
-//
-// example : getContent( "<name>Joe</name>" ) returns "Joe"
-//
-// It also works with strings containing themself sub-tags :
-// <perso><name>Jean</name><firstname>Billie</fisrtname></perso> ->
-// <name>Jean</name><firstname>Billie</firstname>
-function getContent( $element )
-{
-  // deleting start of the tag
-  $content = preg_replace( '/^<[^>]+>/', '', $element );
-  // deleting end of the tag
-  $content = preg_replace( '/<\/[^>]+>$/', '', $content );
-  // replacing multiple instance of space character
-  $content = preg_replace( '/\s+/', ' ', $content );
-
-  return $content;
-}
-
-// The function get Attribute returns the value corresponding to the
-// attribute $attribute for the tag $element.
-function getAttribute( $element, $attribute )
-{
-//  echo htmlentities($element).'<br /><br />';
-  $regex = '/^<\w+[^>]*\b'.$attribute.'\s*=\s*"('.VAL_REG.')"/i';
-  if ( preg_match( $regex, $element, $out ) ) 
-  {
-    return html_entity_decode($out[1], ENT_QUOTES);
-  }
-  else return '';
-}
-
-// The function encode Attribute returns the xml attribute $attribute="$value" 
-function encodeAttribute( $attribute, $value )
-{
-  return $attribute.'="'.htmlspecialchars($value, ENT_QUOTES).'" ';
-}
-
-// The function getChild returns the first child
-// exemple : getChild( "<table><tr>XXX</tr><tr>YYY</tr></table>", "tr" )
-//           returns "<tr>XXX</tr>"
-function getChild( $document, $node )
-{
-  $regex = '/<'.$node.'(\s+'.ATT_REG.'="'.VAL_REG.'")*';
-  $regex.= '(\s*\/>|>.*<\/'.$node.'>)/U';
-
-  if
-    (
-      preg_match( $regex, $document, $out )
-      or
-      preg_last_error() == PREG_NO_ERROR
-    )
-  {
-    return $out[0];
-  }
-  else
-  {
-    die('getChild: error ['.preg_last_error().'] with preg_match function');
-  }
-}
-
-// getChildren returns a list of the children identified by the $node
-// example : 
-//     getChild( "<table><tr>XXX</tr><tr>YYY</tr></table>", "tr" )
-//     returns an array with :
-//          $array[0] equals "<tr>XXX</tr>"
-//          $array[1] equals "<tr>YYY</tr>"
-function getChildren( $document, $node )
-{
-  $regex = '/<'.$node.'(\s+'.ATT_REG.'="'.VAL_REG.'")*';
-  $regex.= '(\s*\/>|>.*<\/'.$node.'>)/U';
-
-  if
-    (
-      preg_match_all( $regex, $document, $out )
-      or
-      preg_last_error() == PREG_NO_ERROR
-    )
-  {
-    return $out[0];
-  }
-  else
-  {
-    die('getChild: error ['.preg_last_error().'] with preg_match_all function');
-  }
-}
-
-// get_CodeXML places the content of a text file in a PHP variable and
-// return it. If the file can't be opened, returns false.
-function getXmlCode( $filename )
-{
-  if (function_exists('ini_set'))
-  {
-    // limit must be growed with php5 and "big" listing file
-    ini_set("pcre.backtrack_limit", pow(2, 31));
-  }
-
-  if (!fetchRemote($filename, $xml_content))
-  {
-    return false;
-  }
-
-  $xml_content = str_replace( "\n", '', $xml_content );
-  $xml_content = str_replace( "\t", '', $xml_content );
-
-  return $xml_content;
-}
-?>
Index: /trunk/language/en_UK/admin.lang.php
===================================================================
--- /trunk/language/en_UK/admin.lang.php	(revision 13487)
+++ /trunk/language/en_UK/admin.lang.php	(revision 13488)
@@ -86,7 +86,5 @@
 $lang[', click on'] = ", click on";
 $lang['... or '] = '... or ';
-$lang['A local listing.xml file has been found for'] = "A local listing.xml file has been found for";
 $lang['A new version of Piwigo is available.'] = "A new version of Piwigo is available.";
-$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 :'] = "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['Access type'] = "Access type";
 $lang['ACCESS_0'] = "Free access";
@@ -299,5 +297,4 @@
 $lang['Extensions Update'] = 'Extensions Update';
 $lang['Failed to write file to disk'] = 'Failed to write file to disk';
-$lang['file create_listing_file.php on remote site was not found'] = "file create_listing_file.php not found on the remote site";
 $lang['File upload stopped by extension'] = 'File upload stopped by extension';
 $lang['File'] = "File";
@@ -319,6 +316,4 @@
 $lang['GD version'] = "GD version";
 $lang['General statistics'] = "General statistics";
-$lang['generate file listing.xml on remote site'] = "generate file listing.xml on the remote site";
-$lang['generate listing'] = "generate listing";
 $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';
@@ -405,6 +400,4 @@
 $lang['Link all album photos to some existing albums'] = "Link all album photos to some existing albums";
 $lang['Linked albums'] = "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 file not found on the remote site. This file is generated with the \"generate listing\" command in the Site manager";
-$lang['listing.xml file was not found'] = "listing.xml file not found";
 $lang['Local'] = "Local";
 $lang['Lock albums'] = "Lock albums";
@@ -449,5 +442,4 @@
 $lang['Missing a temporary folder'] = 'Missing a temporary folder';
 $lang['Missing Plugins'] = 'Missing Plugins';
-$lang['missing thumbnail'] = "missing thumbnail";
 $lang['Modify information'] = "Modify information";
 $lang['Month'] = "Month";
@@ -542,5 +534,4 @@
 $lang['Piwigo Update'] = 'Piwigo Update';
 $lang['Piwigo Uploader'] = 'Piwigo Uploader';
-$lang['Piwigo version differs on the remote site'] = "Piwigo version differs on the remote site";
 $lang['Piwigo version'] = "Piwigo version";
 $lang['pixels'] = 'pixels';
@@ -578,5 +569,4 @@
 $lang['Rating by guests'] = "Rating by guests";
 $lang['Rating'] = "Rating";
-$lang['read local listing.xml and update'] = "read local listing.xml and update";
 $lang['Read Piwigo Documentation'] = 'Read Piwigo Documentation';
 $lang['reduce to single existing albums'] = "reduce to single existing albums";
@@ -594,5 +584,4 @@
 $lang['remove creation date'] = 'remove creation date';
 $lang['Remove from caddie'] = 'Remove from caddie';
-$lang['remove remote listing.xml file'] = "remove remote listing.xml file";
 $lang['remove tags'] = "remove tags";
 $lang['remove this filter'] = 'remove this filter';
@@ -779,5 +768,4 @@
 $lang['Validate'] = "Validate";
 $lang['Validation'] = "Validation";
-$lang['Version of create_listing_file.php on the remote site and Piwigo must be the same'] = "Versions of create_listing_file.php on the remote site and Piwigo must be the same";
 $lang['Version'] = "Version";
 $lang['Virtual album added'] = "Virtual album added";
Index: unk/tools/create_listing_file.php
===================================================================
--- /trunk/tools/create_listing_file.php	(revision 13487)
+++ 	(revision )
@@ -1,1713 +1,0 @@
-<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery                                    |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | This program is free software; you can redistribute it and/or modify  |
-// | it under the terms of the GNU General Public License as published by  |
-// | the Free Software Foundation                                          |
-// |                                                                       |
-// | This program is distributed in the hope that it will be useful, but   |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
-// | General Public License for more details.                              |
-// |                                                                       |
-// | You should have received a copy of the GNU General Public License     |
-// | along with this program; if not, write to the Free Software           |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA.                                                                  |
-// +-----------------------------------------------------------------------+
-
-// +-----------------------------------------------------------------------+
-// |                                User configuration                     |
-// +-----------------------------------------------------------------------+
-
-// ****** Gallery configuration ****** //
-// Script version
-$conf['version'] = '2.4.0RC2';
-
-// URL of main gallery
-// Example : http://www.my.domain/my/directory
-$conf['gallery'] = 'http://piwigo.org/demo';
-
-// prefix for thumbnails in "thumbnail" sub directories
-$conf['prefix_thumbnail'] = 'TN-';
-
-// $conf['file_ext'] lists all extensions (case insensitive) allowed
-// for your Piwigo installation
-$conf['file_ext'] = array('jpg','JPG','jpeg','JPEG',
-                          'png','PNG','gif','GIF','mpg','zip',
-                          'avi','mp3','ogg');
-
-
-// $conf['picture_ext'] must be a subset of $conf['file_ext']
-$conf['picture_ext'] = array('jpg','JPG','jpeg','JPEG',
-                             'png','PNG','gif','GIF');
-
-// ****** Time limitation functionality ****** //
-// max execution time before refresh in seconds
-$conf['max_execution_time'] = (5*ini_get('max_execution_time'))/6; // 25 seconds with default PHP configuration
-// force the use of refresh method
-// in order to have live informations
-// or
-// to fix system witch are not safe mode but not autorized set_time_limit
-$conf['force_refresh_method'] =  true;
-
-// refresh delay is seconds
-$conf['refresh_delay'] = 0;
-
-// ****** EXIF support functionality ****** //
-// $conf['use_exif'] set to true if you want to use Exif information
-$conf['use_exif'] = true;
-
-// use_exif_mapping: same behaviour as use_iptc_mapping
-$conf['use_exif_mapping'] = array(
-  'date_creation' => 'DateTimeOriginal'
-  );
-
-// ****** IPTC support functionality ****** //
-// $conf['use_iptc'] set to true if you want to use IPTC informations of the
-// element according to get_sync_iptc_data function mapping, otherwise, set
-// to false
-$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');
-
-// ****** Directory protection functionality ****** //
-// Define if directories have to be protected if they are not
-$conf['protect'] = false;
-
-// true/false : show/hide warnings
-$conf['protect_warnings'] = true;
-
-// ****** Thumbnails generation functionality ****** //
-// Define if images have to be reduced if they are not
-$conf['thumbnail'] = false;
-
-// Define method to generate thumbnails : 
-// - fixed (width and height required);
-// - width (only width required);
-// - height (only height required);
-// - ratio (only ratio is required)
-// - exif (no other parameter required)
-$conf['thumbnail_method'] = 'ratio';
-
-// Height in pixels (greater than 0)
-$conf['thumbnail_height'] = 128;
-
-// Width in pixels (greater than 0)
-$conf['thumbnail_width'] = 128;
-
-// Ratio between original and thumbnail size (strictly between 0 and 1)
-$conf['thumbnail_ratio'] = 0.2;
-
-// Define thumbnail format : jpeg, png or gif (will be verified)
-$conf['thumbnail_format'] = 'jpeg';
-
-// ****** Directory mapping ****** //
-// directories names 
-$conf['thumbs'] = 'thumbnail'; // thumbnails
-$conf['high'] = 'pwg_high'; // high resolution
-$conf['represent'] = 'pwg_representative'; // non pictures representative files
-
-
-// +-----------------------------------------------------------------------+
-// | Overload configurations                                               |
-// +-----------------------------------------------------------------------+
-@include(dirname(__FILE__).'/'.basename(__FILE__, '.php').'_local.inc.php');
-
-
-// +-----------------------------------------------------------------------+
-// |                                Advanced script configuration          |
-// +-----------------------------------------------------------------------+
-
-// url of icon directory in yoga template
-$pwg_conf['icon_dir'] = $conf['gallery'].'/template/yoga/icon/';
-
-// list of actions managed by this script
-$pwg_conf['scan_action'] = array('clean', 'test', 'generate');
-
-// url of this script
-$pwg_conf['this_url'] = 
-    (empty($_SERVER['HTTPS']) ? 'http://' : 'https://')
-    .str_replace(':'.$_SERVER['SERVER_PORT'], '', $_SERVER['HTTP_HOST'])
-    .($_SERVER['SERVER_PORT'] != 80 ? ':'.$_SERVER['SERVER_PORT'] : '')
-    .$_SERVER['PHP_SELF'];
-
-// list of reserved directory names
-$pwg_conf['reserved_directory_names'] = array($conf['thumbs'], $conf['high'], $conf['represent'], ".", "..", ".svn");
-
-// content of index.php generated in protect action
-$pwg_conf['protect_content'] = '<?php header("Location: '.$conf['gallery'].'") ?>';
-
-// backup of PHP safe_mode INI parameter (used for time limitation)
-$pwg_conf['safe_mode'] = (ini_get('safe_mode') == '1') ? true : false;
-
-// This parameter will be fixed in pwg_init()
-$pwg_conf['gd_version_major'] = '';
-$pwg_conf['gd_version_full'] = '';
-$pwg_conf['gd_supported_format'] = array();
-
-// +-----------------------------------------------------------------------+
-// |                               Functions                               |
-// +-----------------------------------------------------------------------+
-
-/**
- * write line in log file
- *
- * @param string line
- * @return string
- */
-function pwg_log($line)
-{
-  $log_file = fopen(__FILE__.'.log', 'a');
-  fwrite($log_file, $line);
-  fclose($log_file);
-}
-
-/**
- * Check web server graphical capabilities
- *
- * @return string
- */
-function pwg_check_graphics()
-{
-  //~ pwg_log('>>>>> pwg_check_graphics() >>>>>'."\n");
-  
-  global $conf, $pwg_conf;
-  $log = '';
-  
-  // Verify gd library for thumbnail generation
-  if ($conf['thumbnail'] and !is_callable('gd_info'))
-  {
-    $log .= '          <code class="warning">Warning -</code> Your server can not generate thumbnails. Thumbnail creation switched off.<br />'."\n";
-    // Switch off thumbnail generation
-    $conf['thumbnail'] = false;
-    return $log;
-  }
-  
-  // Verify thumnail format
-  if ($conf['thumbnail'])
-  {
-    $info = gd_info();
-    
-    // Backup GD major version
-    $pwg_conf['gd_version_full'] = preg_replace('/[[:alpha:][:space:]()]+/', '', $info['GD Version']);
-    list($pwg_conf['gd_version_major']) = preg_split('/[.]+/', $pwg_conf['gd_version_full']);
-    
-    // Backup input/output format support
-    array_push($pwg_conf['gd_supported_format'], (isset($info['JPG Support']) and $info['JPG Support']) or (isset($info['JPEG Support']) and $info['JPEG Support']) ? 'jpeg' : NULL);
-    array_push($pwg_conf['gd_supported_format'], $info['PNG Support'] ? 'png' : NULL);
-    array_push($pwg_conf['gd_supported_format'], ($info['GIF Read Support'] and $info['GIF Create Support']) ? 'gif' : NULL);
-    
-    // Check output format support
-    if (!in_array($conf['thumbnail_format'], $pwg_conf['gd_supported_format']))
-    {
-      $log .= '          <code class="warning">Warning -</code> Your server does not support thumbnail\'s <code>';
-      $log .= $conf['thumbnail_format'].'</code> format. Thumbnail creation switched off.<br />'."\n";
-    }
-    
-    switch ($conf['thumbnail_method'])
-    {
-      case 'exif':
-      {
-        // exif_thumbnail() must be callable
-        if (!is_callable('exif_thumbnail'))
-        {
-          $log .= '          <code class="warning">Warning -</code> Your server does not support thumbnail creation through EXIF datas. Thumbnail creation switched off.<br />'."\n";
-        }
-        break;
-      }
-      case 'fixed':
-      {
-        // $conf['thumbnail_width'] > 0
-        if (!is_numeric($conf['thumbnail_width']) or $conf['thumbnail_width'] <= 0)
-        {
-          $log .= '          <code class="failure">Failure -</code> Bad value <code>thumbnail_width = ';
-          $log .= var_export($conf['thumbnail_width'], true).'</code>. Thumbnail creation switched off.<br />'."\n";
-        }
-        // $conf['thumbnail_height'] > 0
-        if (!is_numeric($conf['thumbnail_height']) or $conf['thumbnail_height'] <= 0)
-        {
-          $log .= '          <code class="failure">Failure -</code> Bad value <code>thumbnail_height = ';
-          $log .= var_export($conf['thumbnail_height'], true).'</code>. Thumbnail creation switched off.<br />'."\n";
-        }
-        break;
-      }
-      case 'ratio':
-      {
-        // 0 < $conf['thumbnail_ratio'] < 1
-        if (!is_numeric($conf['thumbnail_ratio']) or $conf['thumbnail_ratio'] <= 0 or $conf['thumbnail_ratio'] >= 1)
-        {
-          $log .= '          <code class="failure">Failure -</code> Bad value <code>thumbnail_ratio = ';
-          $log .= var_export($conf['thumbnail_ratio'], true).'</code>. Thumbnail creation switched off.<br />'."\n";
-        }
-        break;
-      }
-      case 'width':
-      {
-        // $conf['thumbnail_width'] > 0
-        if (!is_numeric($conf['thumbnail_width']) or $conf['thumbnail_width'] <= 0)
-        {
-          $log .= '          <code class="failure">Failure -</code> Bad value <code>thumbnail_width = ';
-          $log .= var_export($conf['thumbnail_width'], true).'</code>. Thumbnail creation switched off.<br />'."\n";
-        }
-        break;
-      }
-      case 'height':
-      {
-        // $conf['thumbnail_height'] > 0
-        if (!is_numeric($conf['thumbnail_height']) or $conf['thumbnail_height'] <= 0)
-        {
-          $log .= '          <code class="failure">Failure -</code> Bad value <code>thumbnail_height = ';
-          $log .= var_export($conf['thumbnail_height'], true).'</code>. Thumbnail creation switched off.<br />'."\n";
-        }
-        break;
-      }
-      default:
-      {
-        // unknown method
-          $log .= '          <code class="failure">Failure -</code> Bad value <code>thumbnail_method = ';
-          $log .= var_export($conf['thumbnail_method'], true).'</code>. Thumbnail creation switched off.<br />'."\n";
-        break;
-      }
-    }
-    
-    if (strlen($log))
-    {
-      $conf['thumbnail'] = false;
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_check_graphics() returns '.var_export($log, TRUE).' <<<<<'."\n");
-  return $log;
-}
-
-/**
- * returns xml </dirX> lines
- *
- * @param integer $dir_start
- * @param integer $dir_number
- * @return string
- */
-function pwg_close_level($dir_start, $dir_number)
-{
-  //~ pwg_log('>>>>> pwg_close_level($dir_start = '.var_export($dir_start, TRUE).', $dir_number = '.var_export($dir_number, TRUE).') >>>>>'."\n");
-  
-  $lines ='';
-  do
-  {
-    $lines .= str_repeat(' ', 2*$dir_start).'</dir'.$dir_start.">\n";
-    $dir_number--;
-    $dir_start--;
-  }
-  while(($dir_number > 0) && ($dir_start >= 0));
-  
-  //~ pwg_log('<<<<< pwg_close_level returns '.var_export($lines, TRUE).' <<<<<'."\n");
-  return $lines;
-}
-
-/**
- * return a cleaned IPTC value
- *
- * @param string value
- * @return string
- */
-function pwg_clean_iptc_value($value)
-{
-  //~ pwg_log('>>>>> pwg_clean_iptc_value ($value = '.var_export($value, TRUE).') >>>>>'."\n");
-  
-  // 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);
-
-  //~ pwg_log('<<<<< pwg_clean_iptc_value() returns '.var_export($value, TRUE).' <<<<<'."\n");
-  return $value;
-}
-
-/**
- * returns informations from IPTC metadata, mapping is done at the beginning
- * of the function
- *
- * @param string $filename
- * @param string $map
- * @return array
- */
-function pwg_get_iptc_data($filename, $map)
-{
-  //~ pwg_log('>>>>> pwg_get_iptc_data ($filename = '.var_export($filename, TRUE).', $map = '.var_export($map, TRUE).') >>>>>'."\n");
-  
-  $result = array();
-
-  // Read IPTC data
-  $iptc = array();
-
-  $imginfo = array();
-  getimagesize($filename, $imginfo);
-
-  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('pwg_clean_iptc_value', $iptc[$iptc_key]));
-          }
-          else
-          {
-            $value = pwg_clean_iptc_value($iptc[$iptc_key][0]);
-          }
-
-          foreach (array_keys($map, $iptc_key) as $pwg_key)
-          {
-            $result[$pwg_key] = $value;
-          }
-        }
-      }
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_get_iptc_data() returns '.var_export($result, TRUE).' <<<<<'."\n");
-  return $result;
-}
-
-/**
- * returns informations from IPTC metadata
- *
- * @param string $file
- * @return array iptc
- */
-function pwg_get_sync_iptc_data($file)
-{
-  //~ pwg_log('>>>>> pwg_get_sync_iptc_data ($file = '.var_export($file, TRUE).') >>>>>'."\n");
-
-  global $conf;
-
-  $map = $conf['use_iptc_mapping'];
-  $datefields = array('date_creation', 'date_available');
-
-  $iptc = pwg_get_iptc_data($file, $map);
-
-  foreach ($iptc as $pwg_key => $value)
-  {
-    if (in_array($pwg_key, $datefields))
-    {
-      if ( preg_match('/(\d{4})(\d{2})(\d{2})/', $value, $matches))
-      {
-        $value = $matches[1].'-'.$matches[2].'-'.$matches[3];
-      }
-    }
-    if ($pwg_key == 'keywords')
-    {
-      // official keywords separator is the comma
-      $value = preg_replace('/[.;]/', ',', $value);
-      $value = preg_replace('/^,+|,+$/', '', $value);
-    }
-    $iptc[$pwg_key] = htmlentities($value);
-  }
-
-  $iptc['keywords'] = isset($iptc['keywords']) ? implode(',', array_unique(explode(',', $iptc['keywords']))) : NULL;
-
-  //~ pwg_log('<<<<< pwg_get_sync_iptc_data() returns '.var_export($iptc, TRUE).' <<<<<'."\n");
-  return $iptc;
-}
-
-/**
- * return extension of the representative file
- *
- * @param string $file_dir
- * @param string $file_short
- * @return string
- */
-function pwg_get_representative_ext($file_dir, $file_short)
-{
-  //~ pwg_log('>>>>> pwg_get_representative_ext($file_dir = '.var_export($file_dir, TRUE).', $file_short = '.var_export($file_short, TRUE).') >>>>>'."\n");
-  
-  global $conf;
-  
-  $rep_ext = '';
-  foreach ($conf['picture_ext'] as $ext)
-  {
-    if (file_exists($file_dir.'/'.$conf['represent'].'/'.$file_short.'.'.$ext))
-    {
-      $rep_ext = $ext;
-      break;
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_get_representative_ext() returns '.var_export($rep_ext, TRUE).' <<<<<'."\n");
-  return $rep_ext; 
-}
-
-/**
- * return 'true' if high resolution picture exists else ''
- *
- * @param string $file_dir
- * @param string $file_base
- * @return boolean
- */
-function pwg_get_high($file_dir, $file_base)
-{
-  //~ pwg_log('>>>>> pwg_get_high($file = '.var_export($file_dir, TRUE).', $line = '.var_export($file_base, TRUE).') >>>>>'."\n");
-  
-  global $conf;
-  
-  $high = false;
-  if (file_exists($file_dir.'/'.$conf['high'].'/'.$file_base))
-  {
-    $high = true;
-  }
-  
-  //~ pwg_log('<<<<< pwg_get_high() returns '.var_export($high, TRUE).' <<<<<'."\n");
-  return $high; 
-}
-
-/**
- * return filename without extension
- *
- * @param string $filename
- * @return string
- */
-function pwg_get_filename_wo_extension($filename)
-{
-  //~ pwg_log('>>>>> _get_filename_wo_extension($filename = '.var_export($filename, TRUE).') >>>>>'."\n");
-  
-  $short_name = substr($filename, 0, strrpos($filename, '.'));
-  
-  //~ pwg_log('<<<<< _get_filename_wo_extension() returns '.var_export($short_name, TRUE).' <<<<<'."\n");
-  return $short_name;
-}
-
-/**
- * return extension of the thumbnail and complete error_log
- *
- * @param string $file_dir
- * @param string $file_short
- * @param string $file_ext
- * @param string &$error_log
- * @return string
- */
-function pwg_get_thumbnail_ext($file_dir, $file_short, $file_ext, &$error_log, &$icon_log)
-{
-  //~ pwg_log('>>>>> pwg_get_thumbnail_ext($file_dir = '.var_export($file_dir, TRUE).', $file_short = '.var_export($file_short, TRUE).') >>>>>'."\n");
-  
-  global $conf;
-  
-  $thumb_ext = '';
-  foreach ($conf['picture_ext'] as $ext)
-  {
-    if (file_exists($file_dir.'/'.$conf['thumbs'].'/'.$conf['prefix_thumbnail'].$file_short.'.'.$ext))
-    {
-      $thumb_ext = $ext;
-      break;
-    }
-  }
-  
-  if ($thumb_ext == '')
-  {
-    if ($conf['thumbnail'])
-    {
-      $log = pwg_icon_file($file_dir, $file_short, $file_ext);
-      if (strpos($log, 'success'))
-      {
-        $thumb_ext = $conf['thumbnail_format'];
-      }
-      $icon_log .= $log;  
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_get_thumbnail_ext() returns '.var_export($thumb_ext, TRUE).' <<<<<'."\n");
-  return $thumb_ext; 
-}
-
-
-/**
- * return error logs
- *
- * @param string $file_dir
- * @param string $file_short
- * @param string $file_ext
- * @return string
- */
-function pwg_icon_file($file_dir, $file_short, $file_ext)
-{
-  //~ pwg_log('>>>>> pwg_icon_file($file_dir = '.var_export($file_dir, TRUE).', $file_short = '.var_export($file_short, TRUE).') >>>>>'."\n");
-  
-  global $conf, $pwg_conf;
-  
-  $error_log = '';
-  
-  // Create thumbnail directory if not exists
-  if (!file_exists($file_dir.'/'.$conf['thumbs']))
-  {
-    mkdir($file_dir.'/'.$conf['thumbs']);
-  }
-
-  // Get original properties (width, height)
-  if ($image_size = getimagesize($file_dir.'/'.$file_short.'.'.$file_ext))
-  {
-    $src_width = $image_size[0];
-    $src_height = $image_size[1];
-  }
-  else
-  {
-    $error_log .= '          <code class="failure">Failure -</code> Can not generate icon for <code>';
-    $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code>';
-    $error_log .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="width/height are unreadable" /><br />'."\n";
-    return $error_log;
-  }
-  
-  // Check input format
-  $dst_format = $conf['thumbnail_format'];
-  $src_format = ($file_ext == 'jpg' or $file_ext == 'JPG') ? 'jpeg' : strtolower($file_ext);
-  if (!in_array($src_format, $pwg_conf['gd_supported_format']))
-  {
-    $error_log .= '          <code class="failure">Failure -</code> Can not generate icon for <code>';
-    $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code>';
-    $error_log .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="format not supported" /><br />'."\n";
-    return $error_log;
-  }
-  
-  // Calculate icon properties (width, height)
-  switch ($conf['thumbnail_method'])
-  {
-    case 'fixed':
-    {
-      $dst_width  = $conf['thumbnail_width'];
-      $dst_height = $conf['thumbnail_height'];
-      break;
-    }
-    case 'width':
-    {
-      $dst_width  = $conf['thumbnail_width'];
-      $dst_height = $dst_width * $src_height / $src_width;
-      break;
-    }
-    case 'height':
-    {
-      $dst_height = $conf['thumbnail_height'];
-      $dst_width  = $dst_height * $src_width / $src_height;
-      break;
-    }
-    case 'ratio':
-    {
-      $dst_width  = round($src_width * $conf['thumbnail_ratio']);
-      $dst_height = round($src_height * $conf['thumbnail_ratio']);
-      break;
-    }
-    case 'exif':
-    default:
-    {
-      // Nothing to do
-    }
-  }
-  
-  // Creating icon
-  if ($conf['thumbnail_method'] == 'exif')
-  {
-    $src = exif_thumbnail($file_dir.'/'.$file_short.'.'.$file_ext, $width, $height, $imagetype);
-    if ($src === false)
-    {
-      $error_log .= '          <code class="failure">Failure -</code> No EXIF thumbnail in <code>';
-      $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n";
-      return $error_log;
-    }
-    $dst = imagecreatefromstring($src);
-    if ($src === false)
-    {
-      $error_log .= '          <code class="failure">Failure -</code> EXIF thumbnail format not supported in <code>';
-      $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n";
-      return $error_log;
-    }
-  }
-  else
-  {
-    if (($pwg_conf['gd_version_major'] != 2)) // or ($conf['thumbnail_format'] == 'gif'))
-    {
-      $dst = imagecreate($dst_width, $dst_height);
-    }
-    else
-    {
-      $dst = imagecreatetruecolor($dst_width, $dst_height);
-    }
-    $src = call_user_func('imagecreatefrom'.$src_format, $file_dir.'/'.$file_short.'.'.$file_ext);
-    if (!$src)
-    {
-      $error_log .= '          <code class="failure">Failure -</code> Internal error for <code>imagecreatefrom'.$src_format.'()</code>';
-      $error_log .= 'with <code>'.$file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n";
-      return $error_log;
-    }
-     
-    if (($pwg_conf['gd_version_major'] != 2))
-    {
-      if (!imagecopyresized($dst, $src, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height))
-      {
-        $error_log .= '          <code class="failure">Failure -</code> Internal error for <code>imagecopyresized()</code>';
-        $error_log .= 'with <code>'.$file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n";
-        return $error_log;
-      }
-    }
-    else
-    {
-      if (!imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height))
-      {
-        $error_log .= '          <code class="failure">Failure -</code> Internal error for <code>imagecopyresampled()</code>';
-        $error_log .= 'with <code>'.$file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n";
-        return $error_log;
-      }
-    }
-  }
-  
-  if (!call_user_func('image'.$dst_format, $dst, $file_dir.'/'.$conf['thumbs'].'/'.$conf['prefix_thumbnail'].$file_short.'.'.$conf['thumbnail_format']))
-  {
-    $error_log .= '          <code class="failure">Failure -</code> Can not write <code>';
-    $error_log .= $file_dir.'/'.$conf['thumbs'].'/'.$conf['prefix_thumbnail'].$file_short.'.'.$file_ext.'</code> to generate thumbnail<br />'."\n";
-    return $error_log;
-  }
-  
-  $error_log .= '          <code class="success">Success -</code> Thumbnail generated for <code>';
-  $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n";
-
-  //~ pwg_log('<<<<< pwg_icon_file() returns '.var_export($error_log, TRUE).' <<<<<'."\n");
-  return $error_log; 
-}
-
-/**
- * completes xml line <element .../> and returns error log
- *
- * @param string $file
- * @param string &$line
- * @return string
- */
-function pwg_scan_file($file_full, &$line)
-{
-  //~ pwg_log('>>>>> pwg_scan_file($file = '.var_export($file_full, TRUE).', $line = '.var_export($line, TRUE).') >>>>>'."\n");
-  
-  global $conf, $pwg_conf;
-  
-  $error_log ='';
-  $icon_log = '';
-  
-  $file_base  = basename($file_full);
-  $file_short = pwg_get_filename_wo_extension($file_base);
-  $file_ext   = pwg_get_file_extension($file_base);
-  $file_dir   = dirname($file_full);
-
-  $element['file'] = $file_base;
-  $element['path'] = dirname($pwg_conf['this_url']).substr($file_dir, 1).'/'.$file_base;
-  
-  if (in_array($file_ext, $conf['picture_ext']))
-  {
-    // Here we scan a picture : thumbnail is mandatory, high is optionnal, representative is not scanned
-    $element['tn_ext'] = pwg_get_thumbnail_ext($file_dir, $file_short, $file_ext, $error_log, $icon_log);
-    if ($element['tn_ext'] != '')
-    {
-      // picture has a thumbnail, get image width, heigth, size in Mo
-      $element['filesize'] = floor(filesize($file_full) / 1024);
-      if ($image_size = getimagesize($file_full))
-      {
-        $element['width'] = $image_size[0];
-        $element['height'] = $image_size[1];
-      }
-      
-      // get high resolution
-      if (pwg_get_high($file_dir, $file_base))
-      {
-        $element['has_high'] = 'true';
-        
-        $high_file = $file_dir.'/'.$conf['high'].'/'.$file_base;
-        $element['high_filesize'] = floor(filesize($high_file) / 1024);
-        
-        if ($high_size = @getimagesize($high_file))
-        {
-          $element['high_width'] = $high_size[0];
-          $element['high_height'] = $high_size[1];
-        }
-      }
-      
-      // get EXIF meta datas
-      if ($conf['use_exif'])
-      {
-        // Verify activation of exif module
-        if (extension_loaded('exif'))
-        {
-          if ($exif = read_exif_data($file_full))
-          {
-            foreach ($conf['use_exif_mapping'] as $pwg_key => $exif_key )
-            {
-              if (isset($exif[$exif_key]))
-              {
-                if ( in_array($pwg_key, array('date_creation','date_available') ) )
-                {
-                  if (preg_match('/^(\d{4}):(\d{2}):(\d{2})/', $exif[$exif_key], $matches))
-                    {
-                      $element[$pwg_key] = $matches[1].'-'.$matches[2].'-'.$matches[3];
-                    }
-                }
-                else
-                {
-                  $element[$pwg_key] = $exif[$exif_key];
-                }
-              }
-            }
-          }
-        }
-      }
-      
-      // get IPTC meta datas
-      if ($conf['use_iptc'])
-      {
-        $iptc = pwg_get_sync_iptc_data($file_full);
-        if (count($iptc) > 0)
-        {
-          foreach (array_keys($iptc) as $key)
-          {
-            $element[$key] = addslashes($iptc[$key]);
-          }
-        }
-      }
-      
-    }
-    else
-    {
-      $error_log .= '          <code class="failure">Failure -</code> Thumbnail is missing for <code>'.$file_dir.'/'.$file_base.'</code>';
-      $error_log .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="'.$file_dir.'/thumbnail/'.$conf['prefix_thumbnail'].$file_short;
-      $error_log .= '.xxx ('.implode(', ', $conf['picture_ext']).')" /><br />'."\n";
-    }
-  }
-  else
-  {
-    // Here we scan a non picture file : thumbnail and high are unused, representative is optionnal
-    $element['tn_ext'] = pwg_get_thumbnail_ext($file_dir, $file_short, $file_ext, $log);
-    $ext = pwg_get_representative_ext($file_dir, $file_short);
-    if ($ext != '')
-    {
-      $element['representative_ext'] = $ext;
-    }
-    $element['filesize'] = floor(filesize($file_full) / 1024);
-  }
-  
-  if (strlen($error_log) == 0)
-  {
-    $line = pwg_get_indent('element').'<element ';
-    foreach($element as $key => $value)
-    {
-      $line .= $key.'="'.$value.'" ';
-    }
-    $line .= '/>'."\n";
-  }
-
-  // Adding Icon generation log to message
-  $error_log .= $icon_log;
-
-  //~ pwg_log('<<<<< pwg_scan_file() returns '.var_export($error_log, TRUE).' <<<<<'."\n");
-  return $error_log;
-}
-
-/**
- * returns current level in tree
- *
- * @return integer
- */
-function pwg_get_level($dir)
-{
-  //~ pwg_log('>>>>> pwg_get_level($dir = '.var_export($dir, TRUE).') >>>>>'."\n");
-  
-  $level = substr_count($dir, '/') - 1; // -1 because of ./ at the beginning of path
-  
-  //~ pwg_log('<<<<< pwg_get_level() returns '.var_export($level, TRUE).' <<<<<'."\n");
-  return $level;
-}
-
-/**
- * returns indentation of element 
- *
- * @param string $element_type : 'root', 'element', 'dir'
- * @return string
- */
-function pwg_get_indent($element_type)
-{
-  //~ pwg_log('>>>>> pwg_get_indent($element_type = '.var_export($element_type, TRUE).') >>>>>'."\n");
-  
-  $level = substr_count($_SESSION['scan_list_fold'][0], '/') - 1; // because of ./ at the beginning
-  switch($element_type)
-  {
-    case 'dir' :
-    {
-      $indent = str_repeat(' ', 2*pwg_get_level($_SESSION['scan_list_fold'][0]));
-      break;
-    }
-    case 'root' :
-    {
-      $indent = str_repeat(' ', 2*pwg_get_level($_SESSION['scan_list_fold'][0])+2);
-      break;
-    }
-    case 'element' :
-    {
-      $indent = str_repeat(' ', 2*pwg_get_level($_SESSION['scan_list_fold'][0])+4);
-      break;
-    }
-    default :
-    {
-      $indent = '';
-      break;
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_get_indent() returns '.var_export(strlen($indent), TRUE).' spaces <<<<<'."\n");
-  return $indent;
-}
-
-/**
- * create index.php in directory and reserved sub_directories, return logs
- *
- * @param string dir
- * @return string
- */
-function pwg_protect_directories($directory)
-{
-  //~ pwg_log('>>>>> pwg_protect_directories($directory = '.var_export($directory, true).') >>>>>'."\n");
-  
-  global $conf;
-  
-  $error_log = '';
-  $dirlist = array($directory, $directory.'/'.$conf['thumbs'], $directory.'/'.$conf['high'], $directory.'/'.$conf['represent']);
-  
-  foreach ($dirlist as $dir)
-  {
-    if (file_exists($dir))
-    {
-      if (!file_exists($dir.'/index.php'))
-      {
-        $file = @fopen($dir.'/index.php', 'w');
-        if ($file != false)
-        {
-          fwrite($file, $pwg_conf['protect_content']); // the return code should be verified
-          $error_log .= '          <code class="success">Success -</code> index.php created in directory <a href="'.$dir.'">'.$dir."</a><br />\n";
-        }
-        else
-        {
-          $error_log .= '          <code class="failure">Failure -</code> Can not create index.php in directory <code>'.$dir."</code><br />\n";
-        }
-      }
-      else
-      {
-        if ($conf['protect_warnings'])
-        {
-          $error_log .= '          <code class="warning">Warning -</code> index.php already exists in directory <a href="'.$dir.'">'.$dir."</a><br />\n";
-        }
-      }
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_protect_directories() returns '.var_export($error_log, true).' <<<<<'."\n");
-  return $error_log;
-}
-
-/**
- * returns file extension (.xxx)
- *
- * @param string $file
- * @return string
- */
-function pwg_get_file_extension($file)
-{
-  //~ pwg_log('>>>>> pwg_get_file_extension($file = '.var_export($file, true).') >>>>>'."\n");
-  
-  $ext = substr(strrchr($file, '.'), 1, strlen ($file));
-  
-  //~ pwg_log('<<<<< pwg_get_file_extension() returns '.var_export($ext, true).' <<<<<'."\n");
-  return $ext;
-}
-
-/**
- * completes directory list of supported files and returns error logs
- *
- * @param string $directory
- * @return string
- */
-function pwg_get_file_list($directory)
-{
-  //~ pwg_log('>>>>> pwg_get_file_list($directory = '.var_export($directory, true).') >>>>>'."\n");
-  
-  global $conf, $pwg_conf;
-
-  $errorLog = '';
-  $dir = opendir($directory);
-  while (($file = readdir($dir)) !== false)
-  {
-    switch (filetype($directory."/".$file))
-    {
-      case 'file' :
-      {
-        if (in_array(pwg_get_file_extension($file), $conf['file_ext']))
-        {
-          // The file pointed is a regular file with a supported extension
-          array_push($_SESSION['scan_list_file'], $directory.'/'.$file);
-          //~ pwg_log('--->> Push in $_SESSION[scan_list_file] value "'.$directory.'/'.$file.'"'."\n");
-          if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $file))
-          {
-            $errorLog .= '          <code class="failure">Failure -</code> Invalid file name for <code>'.$file.'</code> in <code>'.$directory.'</code>';
-            $errorLog .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png"';
-            $errorLog .= ' title="Name should be composed of letters, figures, -, _ or . ONLY" /><br />'."\n";
-          }
-        }
-        break; // End of filetype FILE
-      }
-      case 'dir' :
-      {
-        if(!in_array($file, $pwg_conf['reserved_directory_names']))
-        {
-          // The file pointed is a directory but neither system directory nor reserved by PWG
-          array_push($_SESSION['scan_list_fold'], $directory.'/'.$file);
-          //~ pwg_log('--->> Push in $_SESSION[scan_list_fold] value "'.$directory.'/'.$file.'"'."\n");
-          if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $file))
-          {
-            $errorLog .= '          <code class="failure">Failure -</code> Invalid directory name for <code>'.$directory.'/'.$file.'</code>';
-            $errorLog .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png"';
-            $errorLog .= ' title="Name should be composed of letters, figures, -, _ or . ONLY" /><br />'."\n";
-          }
-        }
-        break; // End of filetype DIR
-      }
-      case 'fifo' :
-      case 'char' :
-      case 'block' :
-      case 'link' :
-      case 'unknown':
-      default :
-      {
-        // PWG does not manage these cases
-        break;
-      }
-    }
-  }
-  closedir($dir);
-  
-  //~ pwg_log('<<<<< pwg_get_file_list() returns '.var_export($errorLog, true).' <<<<<'."\n");
-
-  return $errorLog;
-}
-
-/**
- * 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
- *
- * @return float
- */
-function pwg_get_moment()
-{
-  //~ pwg_log('>>>>> pwg_get_moment() >>>>>'."\n");
-  
-  $t1 = explode(' ', microtime());
-  $t2 = explode('.', $t1[0]);
-  $t2 = $t1[1].'.'.$t2[1];
-
-  //~ pwg_log('<<<<< pwg_get_moment() returns '.var_export($t2, true).' <<<<<'."\n");
-  return $t2;
-}
-
-/**
- * return true if HTTP_REFERER and PHP_SELF are similar
- *
- * return boolean
- */
-function pwg_referer_is_me()
-{
-  global $pwg_conf;
-
-  //~ pwg_log('>>>>> pwg_referer_is_me() >>>>>'."\n");
-  
-  $response = false;
-  $caller = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
-
-  if (strcasecmp($pwg_conf['this_url'], $caller) == 0) {
-    $response = true;
-  }
-
-  //~ pwg_log('<<<<< pwg_referer_is_me() returns '.var_export($response, true).' <<<<<'."\n");
-  return $response;
-}
-
-// +-----------------------------------------------------------------------+
-// |                                pwg_<ACTION>_<STEP> Functions          |
-// +-----------------------------------------------------------------------+
-
-function pwg_test_start()
-{
-  //~ pwg_log('>>>>> pwg_test_start() >>>>>'."\n");
-
-  global $g_message, $conf;
-  
-  if (isset($_REQUEST['version']))
-  {
-    if ($_REQUEST['version'] != $conf['version'])
-    {
-      $g_message = '0';
-    }
-    else
-    {
-      $g_message = '1';
-    }
-  }
-  else
-  {
-    $g_message  = '1';
-  }
-  $_SESSION['scan_step'] = 'exit';
-  
-  //~ pwg_log('<<<<< pwg_test_start() <<<<<'."\n");
-}
-
-function pwg_test_exit()
-{
-  //~ pwg_log('>>>>> pwg_test_exit() >>>>>'."\n");
-
-  global $g_header, $g_message, $g_footer, $conf, $pwg_conf;
- 
-  if (pwg_referer_is_me())
-  {
-    $g_header  = ' : <span class="success">Test</span>'."\n";
-    $g_footer  = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n";
-    
-    // Write version
-    $g_message  = '        <h3>Script version</h3>'."\n";
-    $g_message .= '        This script is tagged : <code class="failure">'.$conf['version'].'</code>'."\n";
-    // write GD support
-    if (!is_callable('gd_info'))
-    {
-      $g_message .= '        <code class="failure">Failure -</code> Your server can not generate imagess<br />'."\n";
-    }
-    else
-    {
-      $info = gd_info();
-      $gd_full_version = preg_replace('/[[:alpha:][:space:]()]+/', '', $info['GD Version']);
-      list($gd_version) = preg_split('/[.]+/', $gd_full_version);
-      
-      $g_message .= '        <h3>Image generation</h3>'."\n";
-      $g_message .= '        <code class="success">Success -</code> Your server can generate images<br />'."\n";
-      $g_message .= '        <code class="warning">Warning -</code> Your server support GD'.$gd_version.' (v'.$gd_full_version.')<br />'."\n";
-      $format_list = array();
-      $format = ($info['GIF Create Support']) ? '<code>gif</code>' : NULL;
-      array_push($format_list, $format);
-      $format = ((isset($info['JPG Support']) and $info['JPG Support']) or (isset($info['JPEG Support']) and $info['JPEG Support'])) ? '<code>jpg</code>' : NULL;
-      array_push($format_list, $format);
-      $format = ($info['PNG Support']) ? '<code>png</code>' : NULL;
-      array_push($format_list, $format);
-      $g_message .= '        <code class="warning">Warning -</code> Your server support format: '.implode(', ', $format_list)."\n";
-    }
-    
-    $g_message .= '        <h3>Directory parsing</h3>'."\n";
-    if ($pwg_conf['safe_mode'])
-    {
-      $g_message .= '        <code class="warning">Warning -</code> Your server does not support to resize execution time'."\n";
-    }
-    else
-    {
-      $g_message .= '        <code class="success">Success -</code> Your server supports to resize execution time'."\n";
-    }
-  }
-  else
-  {
-    // compare version in GET parameter with $conf['version'] 
-    if ($g_message == '1')
-    {
-      exit('<pre>PWG-INFO-2: test successful</pre>');
-    }
-    else
-    {
-      exit('<pre>PWG-ERROR-4: Piwigo versions differs</pre>');
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_test_exit() <<<<<'."\n");
-}
-
-function pwg_clean_start()
-{
-  //~ pwg_log('>>>>> pwg_clean_start() >>>>>'."\n");
-  
-  global $g_message;
-  
-  if(@unlink('./listing.xml'))
-  {
-    $g_message = '1';
-  }
-  else
-  {
-    $g_message = '0';
-  }
-
-  $_SESSION['scan_step'] = 'exit';
-  
-  //~ pwg_log('<<<<< pwg_clean_start() <<<<<'."\n");
-}
-
-function pwg_clean_exit()
-{
-  //~ pwg_log('>>>>> pwg_clean_exit() >>>>>'."\n");
-
-  global $g_header, $g_message, $g_footer, $conf, $pwg_conf;
-  
-  if(pwg_referer_is_me())
-  {
-    $g_header = ' : <span class="success">Clean</span>';
-    if ($g_message == '1')
-    {
-      $g_message = '        <code class="success">Success -</code> <code>listing.xml</code> file deleted'."\n";
-    }
-    else
-    {
-      $g_message = '        <code class="failure">Failure -</code> <code>listing.xml</code> does not exist or is read only'."\n";
-    }
-    $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>';
-  }
-  else
-  {
-    if ($g_message == '1')
-    {
-      exit('<pre>PWG-INFO-3 : listing.xml file deleted</pre>');
-    }
-    else
-    {
-      exit('<pre>PWG-ERROR-3 : listing.xml does not exist</pre>');
-    }
-  }
-  
-  //~ pwg_log('<<<<< pwg_clean_exit() <<<<<'."\n");
-}
-
-function pwg_generate_start()
-{
-  //~ pwg_log('>>>>> pwg_generate_start() >>>>>'."\n");
-  //~ pwg_log("GENARATE start >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE start >>>\n");
-
-  global $g_listing, $pwg_conf, $conf;
-  
-  // Flush line <informations>
-  $xml_header_url = dirname($pwg_conf['this_url']);
-  $xml_header_date = date('Y-m-d');
-  $xml_header_version = htmlentities($conf['version']);
-  
-  $attrs = array();
-  if ($conf['use_iptc'])
-  {
-    $attrs = array_merge($attrs, array_keys($conf['use_iptc_mapping']) );
-  }
-  if ($conf['use_exif'])
-  {
-    $attrs = array_merge($attrs, array_keys($conf['use_exif_mapping']) );
-  }
-  $xml_header_metadata = implode(',',array_unique($attrs));
-  
-  $xml_header = '<informations';
-  $xml_header .= ' generation_date="'.$xml_header_date.'"';
-  $xml_header .= ' phpwg_version="'.$xml_header_version.'"';
-  $xml_header .= ' metadata="'.$xml_header_metadata.'"';
-  $xml_header .= ' url="'.$xml_header_url.'/"';
-  $xml_header .= '>'."\n";
-  
-  fwrite($g_listing, $xml_header);
-  
-  // Initialization of directory and file lists
-  $_SESSION['scan_list_fold'] = array();
-  $_SESSION['scan_list_file'] = array();
-  $_SESSION['scan_logs'] .= pwg_get_file_list('.');
-  sort($_SESSION['scan_list_fold']);
-          
-  // Erase first file list because root directory does not contain images.
-  $_SESSION['scan_list_file'] = array();
-            
-  // What are we doing at next step
-  if(count($_SESSION['scan_list_fold']) > 0)
-  {
-    $_SESSION['scan_step'] = 'list';
-  }
-  else
-  {
-    $_SESSION['scan_step'] = 'stop';
-  }
-  
-  //~ pwg_log("GENARATE start <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE start <<<\n");
-  //~ pwg_log('<<<<< pwg_generate_start() <<<<<'."\n");
-}
-
-function pwg_generate_list()
-{
-  //~ pwg_log('>>>>> pwg_generate_list() >>>>>'."\n");
-  //~ pwg_log("GENARATE list >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE list >>>\n");
-  
-  global $g_listing;
-  
-  // Flush line <dirX name=""> in xml file
-  $dirname = basename($_SESSION['scan_list_fold'][0]);
-  $line = pwg_get_indent('dir').'<dir'.pwg_get_level($_SESSION['scan_list_fold'][0]).' name="'.$dirname.'">'."\n";
-  fwrite($g_listing, $line);
-  
-  // Get list of files and directories
-  $_SESSION['scan_logs'] .= pwg_get_file_list($_SESSION['scan_list_fold'][0]);
-  sort($_SESSION['scan_list_fold']); // Mandatory to keep the tree order
-  sort($_SESSION['scan_list_file']); // Easier to read when sorted
-  
-  // Flush line <root>
-  $line = pwg_get_indent('root').'<root>'."\n";
-  fwrite($g_listing, $line);
-  
-  // What are we doing at next step
-  $_SESSION['scan_step'] = 'scan';
-  
-  //~ pwg_log("GENARATE list <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE list <<<\n");
-  //~ pwg_log('<<<<< pwg_generate_list() <<<<<'."\n");
-}
-
-function pwg_generate_scan()
-{
-  //~ pwg_log('>>>>> pwg_generate_scan() >>>>>'."\n");
-  //~ pwg_log("GENARATE scan >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE scan >>>\n");
-  
-  global $g_listing, $conf;
-  
-  while (pwg_continue() and count($_SESSION['scan_list_file']) > 0)
-  {
-    $line = '';
-    $_SESSION['scan_logs'] .= pwg_scan_file($_SESSION['scan_list_file'][0], $line);
-    
-    if (strlen($line) > 0)
-    {
-      fwrite($g_listing, $line);
-    }
-    //~ pwg_log('---<< Pull of $_SESSION[scan_list_file] value "'.$_SESSION['scan_list_file'][0].'"'."\n");
-    array_shift($_SESSION['scan_list_file']);
-    $_SESSION['scan_cnt_file']++;
-  }
-          
-  if (count($_SESSION['scan_list_file']) <= 0)
-  {
-    $_SESSION['scan_step'] = 'prot';
-  }
-  
-  //~ pwg_log("GENERATE scan <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE scan <<<\n");
-  //~ pwg_log('<<<<< pwg_generate_scan() <<<<<'."\n");
-}
-
-function pwg_generate_prot()
-{
-  //~ pwg_log('>>>>> pwg_generate_prot() >>>>>'."\n");
-  //~ pwg_log("GENARATE prot >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE prot >>>\n");
-  
-  global $conf, $g_listing;
-  
-  // Flush line </root>
-  $line = pwg_get_indent('root').'</root>'."\n";
-  fwrite($g_listing, $line);
-  
-  if ($conf['protect'])
-  {
-    $_SESSION['scan_logs'] .= pwg_protect_directories($_SESSION['scan_list_fold'][0]);
-  }
-  
-  // How many directories to close
-  $current_level = pwg_get_level($_SESSION['scan_list_fold'][0]);
-  if (isset($_SESSION['scan_list_fold'][1]))
-  {
-    //~ pwg_log('---<< Pull of $_SESSION[scan_list_fold] value "'.$_SESSION['scan_list_fold'][0].'"'."\n");
-    array_shift($_SESSION['scan_list_fold']);
-    $_SESSION['scan_cnt_fold']++;
-    $next_level = pwg_get_level($_SESSION['scan_list_fold'][0]);
-    $_SESSION['scan_step'] = 'list';
-  }
-  else
-  {
-    $next_level = -1;
-    $_SESSION['scan_cnt_fold']++;
-    $_SESSION['scan_step'] = 'stop';
-  }
-  
-  if ($current_level == $next_level)
-  {
-    fwrite($g_listing, pwg_close_level($current_level, 1));
-  }
-  else
-  {
-    if (($current_level > $next_level))
-    {
-      fwrite($g_listing, pwg_close_level($current_level, $current_level-$next_level+1));
-    } // Nothing to do if current_level < next_level
-  }
-
-  //~ pwg_log("GENERATE prot <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE prot <<<\n");
-  //~ pwg_log('<<<<< pwg_generate_prot() <<<<<'."\n");
-}
-
-function pwg_generate_stop()
-{
-  //~ pwg_log('>>>>> pwg_generate_stop() >>>>>'."\n");
-  //~ pwg_log("GENARATE stop >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE stop >>>\n");
-  
-  global $pwg_conf, $g_listing, $g_header, $g_message, $g_footer;
-  
-  // Flush line </informations>
-  fwrite($g_listing, '</informations>'."\n");
-  
-  // backup error log before cleaning session
-  $time_elapsed = number_format(pwg_get_moment() - $_SESSION['scan_time'], 3, '.', ' ');
-  
-  $g_header   = ' : <span class="success">Generate</span>';
-  $g_message  = '        <div>'."\n".$_SESSION['scan_logs'].'        </div>'."\n";
-  $g_message .= '        <div><code class="success">'.$_SESSION['scan_cnt_fold'].'</code> directories parsed<br />'."\n";
-  $g_message .= '        <code class="success">'.$_SESSION['scan_cnt_file'].'</code> files scanned</div>'."\n";
-  $g_message .= '        <div>View <a href="listing.xml">listing.xml</a></div>'."\n";
-  $g_message .= '        <div style="{text-align: right;}">Listing generated in : <code>'.$time_elapsed.' s</code></div>';
-  $g_footer   = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>';
-      
-  // What are we doing at next step
-  $_SESSION['scan_step'] = 'exit';
-  
-  //~ pwg_log("GENARATE stop <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE stop <<<\n");
-  //~ pwg_log('<<<<< pwg_generate_stop() <<<<<'."\n");
-}
-
-// +-----------------------------------------------------------------------+
-// |                                ALWAYS CALLED FUNCTIONS                |
-// +-----------------------------------------------------------------------+
-
-/**
- * This function check step and time ellapsed to determine end of loop
- *
- * @return bool
- */
-function pwg_continue()
-{
-  //~ pwg_log('>>>>> pwg_continue() >>>>>'."\n");
-  
-  global $conf, $pwg_conf, $g_refresh, $g_header, $g_message, $g_footer, $start_time;
-  
-  if (!isset($_SESSION['scan_step']) or $_SESSION['scan_step'] == 'exit')
-  {
-    // evident end of process
-    $return = false;
-  }
-  else
-  {
-    if ($pwg_conf['safe_mode'] or $conf['force_refresh_method'])
-    {
-      // can not reset the time
-      $time_elapsed = pwg_get_moment() - $start_time;
-      if ($time_elapsed < $conf['max_execution_time'])
-      {
-        $return = true;
-      }
-      else
-      {
-        $start_time = $_SESSION['scan_time'];
-        $formated_time = number_format(pwg_get_moment() - $start_time, 3, '.', ' ');
-
-        $g_refresh = '<meta http-equiv="Refresh" content="'.$conf['refresh_delay'].'">'."\n";
-        $g_header  = ' : <span class="success">'.ucfirst($_SESSION['scan_action']).'</span>';
-        $g_message = '';
-        if ($_SESSION['scan_cnt_fold'] != 0)
-        {
-          $g_message .= '<code class="success">'.$_SESSION['scan_cnt_fold'].'</code> directories scanned<br />'."\n";
-        }
-        if ($_SESSION['scan_cnt_file'] != 0)
-        {
-          $g_message .= '<code class="success">'.$_SESSION['scan_cnt_file'].'</code> files scanned<br />'."\n";
-        }
-        $nb = count($_SESSION['scan_list_fold']);
-        if ($nb > 0)
-        {
-          $g_message .= '<code class="warning">'.$nb.'</code> directories to scan<br />'."\n";
-        }
-        $nb = count($_SESSION['scan_list_file']);
-        if ($nb > 0)
-        {
-          $g_message .= '<code class="warning">'.$nb.'</code> files to scan<br />'."\n";
-        }
-        $g_message .= '        <div style="{text-align: right;}">Time elapsed : <code>'.$formated_time.' s</code></div>';
-        $g_footer  = '<a href="'.$pwg_conf['this_url'].'?action='.$_SESSION['scan_action'].'" title="Continue"><img src="'.$pwg_conf['icon_dir'].'right.png" /></a>'."\n";
-        
-        $return = false;
-      }
-    }
-    else
-    {
-      // reset the time
-      set_time_limit(intval(ini_get('max_execution_time')));
-      $return = true;
-    }
-  }
-  //~ pwg_log('<<<<< pwg_continue() returns '.var_export($return, true).' <<<<<'."\n");
-  
-  return $return;
-}
-
-/**
- * This function :
- * -> Verify the script call
- * -> Lock the script
- * -> Open listing.xml if action is 'generate'
- * -> Initialize output and session variables
- *
- * @return nothing
- */
-function pwg_init()
-{
-  //~ pwg_log('>>>>> pwg_init() >>>>>'."\n");
-
-  global $g_message, $g_listing, $g_footer, $conf, $pwg_conf, $start_time;
-  $init_message = '';
-  
-  // Lock other script sessions, this lock will be remove during 'exit' step
-  if (!isset($_SESSION['scan_step']))
-  {
-    $fp = @fopen(__FILE__.'.lock', 'x+'); // return false if __FILE__.lock exists or if cannot create
-    if ($fp == false)
-    {
-      $g_header   = $_SESSION['scan_action'];
-      $g_message  = '        <code class="failure">Failure -</code> Another script is running';
-      $g_message .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="Delete file '.__FILE__.'.lock and retry" />';
-      $g_message .= "\n";
-      $g_footer   = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n";
-      $_SESSION['scan_step'] = 'exit';
-      //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n");
-      return;
-    }
-    else
-    {
-      fwrite($fp, session_id()); // Writing session_id to trace lock
-      fclose($fp);
-      $_SESSION['scan_step'] = 'init';
-    }
-  }
-  
-  // Verify and backup parameter action. This backup will be removed during step 'exit'
-  if (isset($_REQUEST['action']))
-  {
-    if (in_array($_REQUEST['action'], $pwg_conf['scan_action']))
-    {
-      if (isset($_SESSION['scan_action']))
-      {
-        if ($_SESSION['scan_action'] != $_REQUEST['action'])
-        {
-          // Fatal error
-          $g_message  = '        <code class="failure">Failure -</code> Parameter <code>action</code> differs between url and session';
-          $g_message .= "\n";
-          $g_footer   = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n";
-          $_SESSION['scan_step'] = 'exit';
-          //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n");
-          return;
-        }
-      }
-      else
-      {
-        $_SESSION['scan_action'] = $_REQUEST['action'];
-      }
-    }
-    else
-    {
-      // Fatal error
-      $g_message  = '        <code class="failure">Failure -</code> Problem with <code>action</code> parameter';
-      $g_message .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="empty, '.implode(', ', $pwg_conf['scan_action']).'" />';
-      $g_message .= "\n";
-      $g_footer   = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n";
-      $_SESSION['scan_step'] = 'exit';
-      //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n");
-      return;
-    }
-  }
-  else
-  {
-    // Here we are on welcome page
-    $g_message  = '        <ul>'."\n";
-    $g_message .= '          <li><a href="'.$pwg_conf['this_url'].'?action=test" title="Display/Compare script version">Test</a></li>'."\n";
-    $g_message .= '          <li><a href="'.$pwg_conf['this_url'].'?action=clean" title="Delete listing.xml if exists">Clean</a></li>'."\n";
-    $g_message .= '          <li><a href="'.$pwg_conf['this_url'].'?action=generate" title="Scan all images from this directory and write informations in listing.xml">Listing</a></li>'."\n";
-    $g_message .= '        </ul>'."\n";
-    $g_footer   = '<a href="'.$conf['gallery'].'/admin.php?page=site_manager" title="Main gallery :: site manager">';
-    $g_footer  .= '<img src="'.$pwg_conf['icon_dir'].'home.png" /></a>'."\n";
-    $_SESSION['scan_step'] = 'exit';
-    $_SESSION['scan_action'] = '';
-  }
-  
-  // Actions to do at the init of generate
-  if ($_SESSION['scan_action'] == 'generate')
-  {
-    // Open XML file
-    $mode = ($_SESSION['scan_step'] == 'init') ? 'w' : 'a'; // Erase old listing.xml at the beginning of generation (mode w)
-    $g_listing = @fopen('listing.xml', $mode);
-    if ($g_listing === false)
-    {
-      $g_header   = $_SESSION['scan_action'];
-      $g_message  = '        <code class="failure">Failure -</code> Can not write file <code>listing.xml</code>';
-      $g_message .= "\n";
-      $g_footer   = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n";
-      $_SESSION['scan_step'] = 'exit';
-      //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n");
-      return;
-    }
-    
-    // Check graphical capabilities
-    $init_message = pwg_check_graphics();
-  }
-    
-  // Initializing session counters. This counters will be completely unset during step 'exit'
-  if ($_SESSION['scan_step'] == 'init')
-  {
-    $_SESSION['scan_list_file'] = array();
-    $_SESSION['scan_list_fold'] = array();
-    $_SESSION['scan_cnt_file'] = 0;
-    $_SESSION['scan_cnt_fold'] = 0;
-    $_SESSION['scan_time'] = $start_time;
-    $_SESSION['scan_step'] = 'start';
-    $_SESSION['scan_logs'] = $init_message;
-  }
-  
-  //~ pwg_log('<<<<< pwg_init() success <<<<<'."\n");
-}
-
-/**
- * This function :
- * -> Close listing.xml if action is 'generate'
- * -> Unlock the script
- * -> Erase session variables
- *
- * @return nothing
- */
-function pwg_exit()
-{
-  //~ pwg_log('>>>>> pwg_exit() >>>>>'."\n");
-  
-  global $g_listing;
-  
-  // Close XML file
-  if ($_SESSION['scan_action'] == 'generate' and $g_listing != false)
-  {
-    fclose($g_listing);
-  }
-  
-  // Unlock script
-  unlink(__FILE__.'.lock');
-  
-  // Erase session counters
-  unset($_SESSION['scan_list_file']);
-  unset($_SESSION['scan_list_fold']);
-  unset($_SESSION['scan_cnt_file']);
-  unset($_SESSION['scan_cnt_fold']);
-  unset($_SESSION['scan_time']);
-  unset($_SESSION['scan_step']);
-  $local_action = $_SESSION['scan_action'];
-  unset($_SESSION['scan_action']);
-  unset($_SESSION['scan_logs']);
-  session_destroy();
-  
-  // Call specific action post process
-  if (is_callable('pwg_'.$local_action.'_exit'))
-  {
-    call_user_func('pwg_'.$local_action.'_exit');
-  }
-  
-  //~ pwg_log('<<<<< pwg_exit() <<<<<'."\n");
-}
-
-// +-----------------------------------------------------------------------+
-// |                                Script                                 |
-// +-----------------------------------------------------------------------+
-session_save_path('.');
-session_start();
-
-$start_time = pwg_get_moment();
-
-// Initializing message for web page
-$g_refresh = '';
-$g_header  = '';
-$g_message = '';
-$g_footer  = '';
-$g_listing = '';
-
-pwg_init();
-
-while(pwg_continue())
-{
-  if (is_callable('pwg_'.$_SESSION['scan_action'].'_'.$_SESSION['scan_step']))
-  {
-    call_user_func('pwg_'.$_SESSION['scan_action'].'_'.$_SESSION['scan_step']); // Run the step : start, list, scan, stop are available
-  }
-  else
-  {
-    $g_header   = $_SESSION['scan_action'];
-    $g_message  = '        <code class="failure">Failure -</code> INTERNAL STEP ERROR : <code>pwg_'.$_SESSION['scan_action'].'_'.$_SESSION['scan_step'].'()</code> undefined';
-    $g_message .= "\n";
-    $g_footer   = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n";
-    $_SESSION['scan_step'] = 'exit';
-  }
-}
-
-if ($_SESSION['scan_step'] == 'exit')
-{
-  pwg_exit();
-}
-
-?>
-<html>
-  <head>
-  <?php echo $g_refresh; ?>
-  <title>Manage remote gallery</title>
-  </head>
-    <style type="text/css">
-      code {font-weight: bold}
-      img {border-style: none; vertical-align: middle}
-      ul {list-style-image: url(<?php echo $pwg_conf['icon_dir']; ?>add_tag.png)}
-      .success {color: green}
-      .warning {color: orange}
-      .failure {color: red}
-      .header {text-align: center; font-variant: small-caps; font-weight: bold;}
-      .p {color: #F93;}
-      .w {color: #ccc;}
-      .g {color: #69C;}
-      .pwg {text-decoration: none; border-bottom-style: dotted; border-bottom-width: 1px;}
-      .content {width: 75%; position: absolute; top: 10%; left: 12%;}
-      .footer {text-align: right;}
-      .pwg_block {float: left;}
-    </style>
-  <body>
-    <div class="content">
-      <fieldset class="header">
-        <span class="p">Pi</span>
-        <span class="w">wi</span>
-        <span class="g">go</span>
-        &nbsp;remote site<? echo $g_header; ?>
-      </fieldset>
-      <fieldset>
-<?php echo $g_message; ?>
-      </fieldset>
-      <fieldset class="footer">
-        <div class="pwg_block">
-          Powered by <a href="http://piwigo.org" class="pwg">Piwigo</a>
-        </div>
-        <?php echo $g_footer; ?>
-      </fieldset>
-    </div>
-  </body>
-</html>
Index: unk/tools/create_listing_file_local.inc.php
===================================================================
--- /trunk/tools/create_listing_file_local.inc.php	(revision 13487)
+++ 	(revision )
@@ -1,14 +1,0 @@
-<?php
-// this file is provided as an example.
-// Move it to "create_listing_file.php"
-// directory if you want to modify default configuration.
-
-// URL of main gallery
-// Example : http://www.my.domain/my/directory
-$conf['gallery'] = 'http://demo.piwigo.net/';
-
-$conf['file_ext'] = array_merge($conf['file_ext'], array('flv', 'FLV'));
-
-$conf['force_refresh_method'] =  true;
-
-?>
