Index: /tags/bug-1_3beta-002/admin/install.php
===================================================================
--- /tags/bug-1_3beta-002/admin/install.php	(revision 115)
+++ /tags/bug-1_3beta-002/admin/install.php	(revision 115)
@@ -0,0 +1,297 @@
+<?php
+/***************************************************************************
+ *                                install.php                              *
+ *                            -------------------                          *
+ *   application   : PhpWebGallery 1.3 <http://phpwebgallery.net>          *
+ *   author        : Pierrick LE GALL <pierrick@z0rglub.com>               *
+ *                                                                         *
+ *   $Id$
+ *                                                                         *
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation;                                         *
+ *                                                                         *
+ ***************************************************************************/
+
+//-------------------------------------------------------------------- includes
+define( PREFIX_INCLUDE, '.' );
+include( '../include/vtemplate.class.php' );
+include( '../include/functions.inc.php' );
+//----------------------------------------------------- template initialization
+$vtp = new VTemplate;
+$handle = $vtp->Open( '../template/default/admin/install.vtp' );
+$vtp->setGlobalVar( $handle, 'release', '1.3' );
+//-------------------------------------------------------------------- language
+if ( isset( $_GET['language'] ) )
+{
+  $isadmin = true;
+  $lang = array();
+  include( '../language/'.$_GET['language'].'.php' );
+  $tpl = array( 'step1_err_copy', 'step1_err_copy_2', 'step1_err_copy_next',
+                'errors_title', 'step1_title','step1_host','step1_host_info',
+                'step1_user','step1_user_info','step1_pass','step1_pass_info',
+                'step1_database','step1_database_info','step1_prefix',
+                'step1_prefix_info','submit','infos_title','step2_title',
+                'conf_general_webmaster','conf_general_webmaster_info',
+                'step2_pwd','step2_pwd_info','step2_pwd_conf',
+                'step2_pwd_conf_info','conf_general_mail',
+                'conf_general_mail_info','install_end_title',
+                'install_end_message');
+  templatize_array( $tpl, 'lang', $handle );
+  $vtp->setGlobalVar( $handle, 'language', $_GET['language'] );
+}
+//---------------------- Step 1 : connection informations, write of config file
+if ( $_GET['step'] == 1 )
+{
+  $errors = array();
+  $infos  = array();
+  // creation of ./include/mysql.inc.php : file containing database
+  // connection informations
+  if ( isset( $_POST['cfgBase'] )
+       and isset( $_POST['cfgUser'] )
+       and isset( $_POST['cfgPassword'] )
+       and isset( $_POST['cfgHote'] ) )
+  {
+    if ( @mysql_connect( $_POST['cfgHote'],
+                         $_POST['cfgUser'],
+                         $_POST['cfgPassword'] ) )
+    {
+      if ( @mysql_select_db($_POST['cfgBase'] ) )
+      {
+        array_push( $infos, $lang['step1_confirmation'] );
+      }
+      else
+      {
+        array_push( $errors, $lang['step1_err_db'] );
+      }
+    }
+    else
+    {
+      array_push( $errors, $lang['step1_err_server'] );
+    }
+			
+    if ( count( $errors ) == 0 )
+    {
+      $file_content = "<?php";
+      $file_content.= "\n\$cfgBase = '".     $_POST['cfgBase']."';";
+      $file_content.= "\n\$cfgUser = '".     $_POST['cfgUser']."';";
+      $file_content.= "\n\$cfgPassword = '". $_POST['cfgPassword']."';";
+      $file_content.= "\n\$cfgHote = '".     $_POST['cfgHote']."';";
+      $file_content.= "\n\$prefix_table = '".$_POST['prefix_table']."';";
+      $file_content.= "\n?>";
+      // writting the configuration file
+      if ( $fp = @fopen( '../include/mysql.inc.php', 'a+' ) )
+      {
+        fwrite( $fp, $file_content ); 
+        fclose( $fp );
+      }
+      $cfgHote     = '';
+      $cfgUser     = '';
+      $cfgPassword = '';
+      $cfgBase     = '';
+      include( '../include/mysql.inc.php' );
+      $file_OK = false;
+      if ( @mysql_connect( $cfgHote, $cfgUser, $cfgPassword ) )
+      {
+        if ( @mysql_select_db( $cfgBase ) ) $file_OK = true;
+      }
+      if ( !$file_OK )
+      {
+        $vtp->addSession( $handle, 'error_copy' );
+        $html_content = htmlentities( $file_content, ENT_QUOTES );
+        $html_content = nl2br( $html_content );
+        $vtp->setVar( $handle, 'error_copy.file_content', $html_content );
+        $vtp->closeSession( $handle, 'error_copy' );
+      }
+      else
+      {
+        $url = 'install.php?step=2&language='.$_GET['language'];
+        header( 'Request-URI: '.$url );  
+        header( 'Content-Location: '.$url);  
+        header( 'Location: '.$url );
+        exit();
+      }
+    }
+  }
+  // errors display
+  if ( sizeof( $errors ) != 0 )
+  {
+    $vtp->addSession( $handle, 'errors' );
+    foreach ( $errors as $error ) {
+      $vtp->addSession( $handle, 'error' );
+      $vtp->setVar( $handle, 'error.content', $error );
+      $vtp->closeSession( $handle, 'error' );
+    }
+    $vtp->closeSession( $handle, 'errors' );
+  }
+  // infos display
+  if ( sizeof( $infos ) != 0 )
+  {
+    $vtp->addSession( $handle, 'infos' );
+    foreach ( $infos as $info ) {
+      $vtp->addSession( $handle, 'info' );
+      $vtp->setVar( $handle, 'info.content', $info );
+      $vtp->closeSession( $handle, 'info' );
+    }
+    $vtp->closeSession( $handle, 'infos' );
+  }
+  // form display (if necessary)
+  if ( !isset( $_POST['submit'] ) or sizeof( $errors ) > 0 )
+  {
+    $vtp->addSession( $handle, 'step1' );
+
+    // host
+    if ( !isset( $_POST['cfgHote'] ) )
+      $vtp->setVar( $handle, 'step1.f_host', 'localhost' );
+    else
+      $vtp->setVar( $handle, 'step1.f_host', $_POST['cfgHote'] );
+    // user
+    $vtp->setVar( $handle, 'step1.f_user', $_POST['cfgUser'] );
+    // base
+    $vtp->setVar( $handle, 'step1.f_base', $_POST['cfgBase'] );
+    // prefix_table
+    if ( !isset( $_POST['prefix_table'] ) )
+      $vtp->setVar( $handle, 'step1.f_prefix_table', 'phpwebgallery_' );
+    else
+      $vtp->setVar( $handle, 'step1.f_prefix_table', $_POST['prefix_table'] );
+
+    $vtp->closeSession( $handle, 'step1' );
+  }
+}
+//------------------------------------- Step 2 : creation of tables in database
+else if ( $_GET['step'] == 2 )
+{
+  $errors = array();
+  $infos  = array();
+
+  include( '../include/mysql.inc.php' );
+  mysql_connect( $cfgHote, $cfgUser, $cfgPassword )
+    or die ( "Can't connect to database host" );
+  mysql_select_db( $cfgBase )
+    or die ( "Connection to host succeeded, but database selection failed" );
+		
+  if ( !isset( $_POST['submit'] ) )
+  {
+    // tables creation, based on phpwebgallery_structure.sql
+    $sql_lines = file( './phpwebgallery_structure.sql' );
+    $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( 'phpwebgallery_', $prefix_table, $query );
+        // we don't execute "DROP TABLE" queries
+        if ( !preg_match( '/^DROP TABLE/i', $query ) )
+          mysql_query( $query );
+        $query = '';
+      }
+    }
+  }
+
+  if ( isset( $_POST['submit'] ) )
+  {
+    // webmaster login must be
+    // 1. non empty
+    // 2. without characters ' or "
+    $webmaster = preg_replace( '/\s{2,}/', ' ', $_POST['webmaster'] );
+    $webmaster = trim( $webmaster );
+    if ( $webmaster == '' )
+      array_push( $errors, $lang['step2_err_login1'] );
+    if ( preg_match( '/[\'"]/', $webmaster ) )
+      array_push( $errors, $lang['step2_err_login3'] );
+    // the webmaster string must be the same as its confirmation
+    if ( $_POST['pwdWebmaster'] != $_POST['pwdWebmasterConf'] )
+      array_push( $errors, $lang['step2_err_pass'] );
+    // mail address must have this format : name@server.com
+    $error_mail_address = validate_mail_address( $_POST['mail_webmaster'] );
+    if ( $error_mail_address != '' )
+      array_push( $errors, $error_mail_address );
+    if ( $_POST['mail_webmaster'] == '' )
+      array_push( $errors, $lang['reg_err_mail_address'] );
+
+    // if no error found till here : insertion of data in tables
+    if ( count( $errors ) == 0 )
+    {
+      $query = 'DELETE FROM '.$prefix_table.'config';
+      mysql_query( $query );
+
+      $query = 'INSERT INTO '.$prefix_table.'config';
+      $query.= ' (webmaster,mail_webmaster) VALUES ';
+      $query.= " ('".$webmaster."','".$_POST['mail_webmaster']."')";
+      $query.= ';';
+      mysql_query( $query );
+
+      $query = 'INSERT INTO '.$prefix_table.'sites';
+      $query.= " (id,galleries_url) VALUES (1, './galleries/')";
+      $query.= ';';
+      mysql_query( $query );
+
+      // webmaster admin user
+      $query = 'INSERT INTO '.$prefix_table.'users';
+      $query.= ' (id,username,password,status,language) VALUES ';
+      $query.= "(1,'".$webmaster."','".md5( $_POST['pwdWebmaster'] )."'";
+      $query.= ",'admin','".$_GET['language']."')";
+      $query.= ';';
+      mysql_query($query);
+
+      // guest user
+      $query = 'INSERT INTO '.$prefix_table.'users';
+      $query.= '(id,username,password,status,language) VALUES ';
+      $query.= "(2,'guest','','guest','francais')";
+      $query.= ';';
+      mysql_query( $query );
+    }
+  }
+
+  // errors display
+  if ( sizeof( $errors ) != 0 )
+  {
+    $vtp->addSession( $handle, 'errors' );
+    foreach ( $errors as $error ) {
+      $vtp->addSession( $handle, 'error' );
+      $vtp->setVar( $handle, 'error.content', $error );
+      $vtp->closeSession( $handle, 'error' );
+      }
+    $vtp->closeSession( $handle, 'errors' );
+  }
+
+  if ( !isset( $_POST['submit'] ) or sizeof( $errors ) > 0 )
+  {
+    $vtp->addSession( $handle, 'step2' );
+    $vtp->setVar( $handle, 'step2.f_webmaster', $_POST['webmaster'] );
+    $vtp->setVar( $handle, 'step2.f_mail_webmaster', $_POST['mail_webmaster']);
+    $vtp->closeSession( $handle, 'step2' );
+  }
+
+  // end of installation message
+  if ( isset( $_POST['submit'] ) and count( $errors ) == 0 )
+  {
+    $vtp->addSession( $handle, 'install_end' );
+    $vtp->closeSession( $handle, 'install_end' );
+  }
+}
+//---------------------------------------------------- Step 0 : language choice
+else
+{
+  $vtp->addSession( $handle, 'step0' );
+  $languages = get_languages( '../language/' );
+  foreach ( $languages as $language ) {
+    $vtp->addSession( $handle, 'language' );
+    $vtp->setVar( $handle, 'language.name', $language );
+    $vtp->closeSession( $handle, 'language' );
+  }
+  $vtp->closeSession( $handle, 'step0' );
+}
+//----------------------------------------------------------- html code display
+$code = $vtp->Display( $handle, 0 );
+echo $code;
+?>
Index: /tags/bug-1_3beta-002/include/functions.inc.php
===================================================================
--- /tags/bug-1_3beta-002/include/functions.inc.php	(revision 115)
+++ /tags/bug-1_3beta-002/include/functions.inc.php	(revision 115)
@@ -0,0 +1,426 @@
+<?php
+/***************************************************************************
+ *                             functions.inc.php                           *
+ *                            -------------------                          *
+ *   application   : PhpWebGallery 1.3 <http://phpwebgallery.net>          *
+ *   author        : Pierrick LE GALL <pierrick@z0rglub.com>               *
+ *                                                                         *
+ *   $Id$
+ *                                                                         *
+ ***************************************************************************
+
+ ***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation;                                         *
+ *                                                                         *
+ ***************************************************************************/
+include( PREFIX_INCLUDE.'./include/functions_user.inc.php' );
+include( PREFIX_INCLUDE.'./include/functions_session.inc.php' );
+include( PREFIX_INCLUDE.'./include/functions_category.inc.php' );
+include( PREFIX_INCLUDE.'./include/functions_xml.inc.php' );
+include( PREFIX_INCLUDE.'./include/functions_group.inc.php' );
+
+//----------------------------------------------------------- generic functions
+
+// get_enums returns an array containing the possible values of a enum field
+// in a table of the database.
+function get_enums( $table, $field )
+{
+  // retrieving the properties of the table. Each line represents a field :
+  // columns are 'Field', 'Type'
+  $result=mysql_query("desc $table");
+  while ( $row = mysql_fetch_array( $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')
+      $option = explode( ',', substr($row['Type'], 5, -1 ) );
+      for ( $i = 0; $i < sizeof( $option ); $i++ )
+      {
+        // deletion of quotation marks
+        $option[$i] = str_replace( "'", '',$option[$i] );
+      }                 
+    }
+  }
+  mysql_free_result( $result );
+  return $option;
+}
+
+// get_boolean transforms a string to a boolean value. If the string is
+// "false" (case insensitive), then the boolean value false is returned. In
+// any other case, true is returned.
+function get_boolean( $string )
+{
+  $boolean = true;
+  if ( preg_match( '/^false$/i', $string ) )
+  {
+    $boolean = false;
+  }
+  return $boolean;
+}
+
+// array_remove removes a value from the given array if the value existed in
+// this array.
+function array_remove( $array, $value )
+{
+  $output = array();
+  foreach ( $array as $v ) {
+    if ( $v != $value ) array_push( $output, $v );
+  }
+  return $output;
+}
+
+// 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()
+{
+  $t1 = explode( ' ', microtime() );
+  $t2 = explode( '.', $t1[0] );
+  $t2 = $t1[1].'.'.$t2[1];
+  return $t2;
+}
+
+// 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
+  $start = 0;
+  $end = 0;
+  $start = strpos ( $remaining, '<' ); // -> 0
+  $end   = strpos ( $remaining, '>' ); // -> 16
+  // as long as a '<' and his friend '>' are found, we loop
+  while ( is_numeric( $start ) and is_numeric( $end ) )
+  {
+    // $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 ) );
+    $start = strpos ( $remaining, '<' );
+    $end   = strpos ( $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 )
+{
+  return substr( $filename, 0, strrpos( $filename, '.' ) );
+}
+
+// get_dirs retourne un tableau contenant tous les sous-répertoires d'un
+// répertoire
+function get_dirs( $rep )
+{
+  $sub_rep = array();
+
+  if ( $opendir = opendir ( $rep ) )
+  {
+    while ( $file = readdir ( $opendir ) )
+    {
+      if ( $file != '.' and $file != '..' and is_dir ( $rep.$file ) )
+      {
+        array_push( $sub_rep, $file );
+      }
+    }
+  }
+  return $sub_rep;
+}
+
+// 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;
+}
+//-------------------------------------------- PhpWebGallery specific functions
+
+// get_languages retourne un tableau contenant tous les languages
+// disponibles pour PhpWebGallery
+function get_languages( $rep_language )
+{
+  $languages = array();
+  $i = 0;
+  if ( $opendir = opendir ( $rep_language ) )
+  {
+    while ( $file = readdir ( $opendir ) )
+    {
+      if ( is_file ( $rep_language.$file )
+           and $file != "index.php"
+           and strrchr ( $file, "." ) == ".php" )
+      {
+        $languages[$i++] =
+          substr ( $file, 0, strlen ( $file )
+                   - strlen ( strrchr ( $file, "." ) ) );
+      }
+    }
+  }
+  return $languages;
+}
+
+// get_themes retourne un tableau contenant tous les "template - couleur"
+function get_themes( $theme_dir )
+{
+  $themes = array();
+  $main_themes = get_dirs( $theme_dir );
+  for ( $i = 0; $i < sizeof( $main_themes ); $i++ )
+  {
+    $colors = get_dirs( $theme_dir.$main_themes[$i].'/' );
+    for ( $j = 0; $j < sizeof( $colors ); $j++ )
+    {
+      array_push( $themes, $main_themes[$i].' - '.$colors[$j] );
+    }
+  }
+  return $themes;
+}
+
+// - add_style replaces the 
+//         $search  into <span style="$style">$search</span>
+// in the given $string.
+// - The function does not replace characters in HTML tags
+function add_style( $string, $search, $style )
+{
+  //return $string;
+  $return_string = '';
+  $remaining = $string;
+
+  $start = 0;
+  $end = 0;
+  $start = strpos ( $remaining, '<' );
+  $end   = strpos ( $remaining, '>' );
+  while ( is_numeric( $start ) and is_numeric( $end ) )
+  {
+    $treatment = substr ( $remaining, 0, $start );
+    $treatment = str_replace( $search, '<span style="'.$style.'">'.
+                              $search.'</span>', $treatment );
+    $return_string.= $treatment.substr( $remaining, $start, $end-$start+1 );
+    $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) );
+    $start = strpos ( $remaining, '<' );
+    $end   = strpos ( $remaining, '>' );
+  }
+  $treatment = str_replace( $search, '<span style="'.$style.'">'.
+                            $search.'</span>', $remaining );
+  $return_string.= $treatment;
+                
+  return $return_string;
+}
+
+// replace_search replaces a searched words array string by the search in
+// another style for the given $string.
+function replace_search( $string, $search )
+{
+  $words = explode( ',', $search );
+  $style = 'background-color:white;color:red;';
+  foreach ( $words as $word ) {
+    $string = add_style( $string, $word, $style );
+  }
+  return $string;
+}
+
+function database_connection()
+{
+  include( PREFIX_INCLUDE.'./include/mysql.inc.php' );
+  define( PREFIX_TABLE, $prefix_table );
+
+  @mysql_connect( $cfgHote, $cfgUser, $cfgPassword )
+    or die ( "Could not connect to server" );
+  @mysql_select_db( $cfgBase )
+    or die ( "Could not connect to database" );
+}
+
+function pwg_log( $file, $category, $picture = '' )
+{
+  global $conf, $user;
+
+  if ( $conf['log'] )
+  {
+    $query = 'insert into '.PREFIX_TABLE.'history';
+    $query.= ' (date,login,IP,file,category,picture) values';
+    $query.= " (".time().", '".$user['username']."'";
+    $query.= ",'".$_SERVER['REMOTE_ADDR']."'";
+    $query.= ",'".$file."','".$category."','".$picture."');";
+    mysql_query( $query );
+  }
+}
+
+function templatize_array( $array, $global_array_name, $handle )
+{
+  global $vtp, $lang, $page, $user, $conf;
+
+  foreach ( $array as $value ) {
+    $vtp->setGlobalVar( $handle, $value, ${$global_array_name}[$value] );
+  }
+}
+
+// format_date returns a formatted date for display. The date given in
+// argument can be a unixdate (number of seconds since the 01.01.1970) or an
+// american format (2003-09-15). By option, you can show the time. The
+// output is internationalized.
+//
+// format_date( "2003-09-15", 'us', true ) -> "Monday 15 September 2003 21:52"
+function format_date( $date, $type = 'us', $show_time = false )
+{
+  global $lang;
+
+  switch ( $type )
+  {
+  case 'us' :
+    list( $year,$month,$day ) = explode( '-', $date );
+    $unixdate = mktime(0,0,0,$month,$day,$year);
+    break;
+  case 'unix' :
+    $unixdate = $date;
+    break;
+  }
+  $formated_date = $lang['day'][date( "w", $unixdate )];
+  $formated_date.= date( " j ", $unixdate );
+  $formated_date.= $lang['month'][date( "n", $unixdate )];
+  $formated_date.= date( ' Y', $unixdate );
+  if ( $show_time )
+  {
+    $formated_date.= date( ' G:i', $unixdate );
+  }
+
+  return $formated_date;
+}
+
+// notify sends a email to every admin of the gallery
+function notify( $type, $infos = '' )
+{
+  global $conf;
+
+  $headers = 'From: '.$conf['webmaster'].' <'.$conf['mail_webmaster'].'>'."\n";
+  $headers.= 'Reply-To: '.$conf['mail_webmaster']."\n";
+  $headers.= 'X-Mailer: PhpWebGallery, PHP '.phpversion();
+
+  $options = '-f '.$conf['mail_webmaster'];
+  // retrieving all administrators
+  $query = 'SELECT username,mail_address,language';
+  $query.= ' FROM '.PREFIX_TABLE.'users';
+  $query.= " WHERE status = 'admin'";
+  $query.= ' AND mail_address IS NOT NULL';
+  $query.= ';';
+  $result = mysql_query( $query );
+  while ( $row = mysql_fetch_array( $result ) )
+  {
+    $to = $row['mail_address'];
+    include( PREFIX_INCLUDE.'./language/'.$row['language'].'.php' );
+    $content = $lang['mail_hello']."\n\n";
+    switch ( $type )
+    {
+    case 'upload' :
+      $subject = $lang['mail_new_upload_subject'];
+      $content.= $lang['mail_new_upload_content'];
+      break;
+    case 'comment' :
+      $subject = $lang['mail_new_comment_subject'];
+      $content.= $lang['mail_new_comment_content'];
+      break;
+    }
+    $infos = str_replace( '&nbsp;',  ' ', $infos );
+    $infos = str_replace( '&minus;', '-', $infos );
+    $content.= "\n\n".$infos;
+    $content.= "\n\n-- \nPhpWebGallery ".$conf['version'];
+    $content = wordwrap( $content, 72 );
+    @mail( $to, $subject, $content, $headers, $options );
+  }
+}
+?>
