Index: /branches/2.4/admin/include/functions.php
===================================================================
--- /branches/2.4/admin/include/functions.php	(revision 17667)
+++ /branches/2.4/admin/include/functions.php	(revision 17668)
@@ -1197,5 +1197,5 @@
  * @return array with ('info' and 'id') or ('error') key
  */
-function create_virtual_category($category_name, $parent_id=null)
+function create_virtual_category($category_name, $parent_id=null, $options=array())
 {
   global $conf, $user;
@@ -1206,14 +1206,52 @@
     return array('error' => l10n('The name of an album must not be empty'));
   }
-
-  $parent_id = !empty($parent_id) ? $parent_id : 'NULL';
-
+    
   $insert = array(
     'name' => $category_name,
     'rank' => 0,
-    'commentable' => boolean_to_string($conf['newcat_default_commentable']),
+    'global_rank' => 0,
     );
 
-  if ($parent_id != 'NULL')
+  // is the album commentable?
+  if (isset($options['commentable']) and is_bool($options['commentable']))
+  {
+    $insert['commentable'] = $options['commentable'];
+  }
+  else
+  {
+    $insert['commentable'] = $conf['newcat_default_commentable'];
+  }
+  $insert['commentable'] = boolean_to_string($insert['commentable']);
+
+  // is the album temporarily locked? (only visible by administrators,
+  // whatever permissions) (may be overwritten if parent album is not
+  // visible)
+  if (isset($options['visible']) and is_bool($options['visible']))
+  {
+    $insert['visible'] = $options['visible'];
+  }
+  else
+  {
+    $insert['visible'] = $conf['newcat_default_visible'];
+  }
+  $insert['visible'] = boolean_to_string($insert['visible']);
+
+  // is the album private? (may be overwritten if parent album is private)
+  if (isset($options['status']) and 'private' == $options['status'])
+  {
+    $insert['status'] = 'private';
+  }
+  else
+  {
+    $insert['status'] = $conf['newcat_default_status'];
+  }
+
+  // any description for this album?
+  if (isset($options['comment']))
+  {
+    $insert['comment'] = strip_tags($options['comment']);
+  }
+
+  if (!empty($parent_id) and is_numeric($parent_id))
   {
     $query = '
@@ -1234,8 +1272,4 @@
       $insert['visible'] = 'false';
     }
-    else
-    {
-      $insert['visible'] = boolean_to_string($conf['newcat_default_visible']);
-    }
 
     // at creation, must a category be public or private ? Warning : if the
@@ -1246,38 +1280,21 @@
       $insert['status'] = 'private';
     }
-    else
-    {
-      $insert['status'] = $conf['newcat_default_status'];
-    }
+
+    $uppercats_prefix = $parent['uppercats'].',';
   }
   else
   {
-    $insert['visible'] = boolean_to_string($conf['newcat_default_visible']);
-    $insert['status'] = $conf['newcat_default_status'];
-    $insert['global_rank'] = $insert['rank'];
+    $uppercats_prefix = '';
   }
 
   // we have then to add the virtual category
-  mass_inserts(
+  single_insert(CATEGORIES_TABLE, $insert);
+  $inserted_id = pwg_db_insert_id(CATEGORIES_TABLE);
+
+  single_update(
     CATEGORIES_TABLE,
-    array(
-      'site_id', 'name', 'id_uppercat', 'rank', 'commentable',
-      'visible', 'status', 'global_rank',
-      ),
-    array($insert)
+    array('uppercats' => $uppercats_prefix.$inserted_id),
+    array('id' => $inserted_id)
     );
-
-  $inserted_id = pwg_db_insert_id(CATEGORIES_TABLE);
-
-  $query = '
-UPDATE
-  '.CATEGORIES_TABLE.'
-  SET uppercats = \''.
-    (isset($parent) ? $parent{'uppercats'}.',' : '').
-    $inserted_id.
-    '\'
-  WHERE id = '.$inserted_id.'
-;';
-  pwg_query($query);
 
   update_global_rank();
Index: /branches/2.4/include/ws_functions.inc.php
===================================================================
--- /branches/2.4/include/ws_functions.inc.php	(revision 17667)
+++ /branches/2.4/include/ws_functions.inc.php	(revision 17668)
@@ -2303,7 +2303,30 @@
   include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
 
+  $options = array();
+  if (!empty($params['status']) and in_array($params['status'], array('private','public')))
+  {
+    $options['status'] = $params['status'];
+  }
+  
+  if (!empty($params['visible']) and in_array($params['visible'], array('true','false')))
+  {
+    $options['visible'] = get_boolean($params['visible']);
+  }
+  
+  if (!empty($params['commentable']) and in_array($params['commentable'], array('true','false')) )
+  {
+    $options['commentable'] = get_boolean($params['commentable']);
+  }
+  
+  if (!empty($params['comment']))
+  {
+    $options['comment'] = $params['comment'];
+  }
+  
+
   $creation_output = create_virtual_category(
     $params['name'],
-    $params['parent']
+    $params['parent'],
+    $options
     );
 
@@ -2311,36 +2334,4 @@
   {
     return new PwgError(500, $creation_output['error']);
-  }
-  
-  $updates = array();
-  if ( !empty($params['status']) and in_array($params['status'], array('private','public')) )
-  {
-    $updates['status'] = $params['status'];
-  }
-  if ( !empty($params['visible']) and in_array($params['visible'], array('true','false')) )
-  {
-    $updates['visible'] = $params['visible'];
-  }
-  if ( !empty($params['commentable']) and in_array($params['commentable'], array('true','false')) )
-  {
-    $updates['commentable'] = $params['commentable'];
-  }
-  if ( !empty($params['comment']) )
-  {
-    $updates['comment'] = strip_tags($params['comment']);
-  }
-
-  if (!empty($updates))
-  {
-    single_update(
-      CATEGORIES_TABLE,
-      $updates,
-      array('id'=>$creation_output['id'])
-      );
-  }
-  
-  if ( isset($updates['status']) and 'private' == $updates['status'] )
-  {
-    add_permission_on_category($creation_output['id'], get_admins());
   }
 
Index: /branches/2.4/ws.php
===================================================================
--- /branches/2.4/ws.php	(revision 17667)
+++ /branches/2.4/ws.php	(revision 17668)
@@ -310,6 +310,6 @@
       'parent' => array('default' => null),
       'comment' => array('default' => null),
-      'visible' => array('default' => boolean_to_string($conf['newcat_default_visible'])),
-      'status' => array('default' => $conf['newcat_default_status']),
+      'visible' => array('default' => null),
+      'status' => array('default' => null),
       'commentable' => array('default' => 'true'),
       ),
