Subversion Repositories svnkaklik

Rev

Blame | Last modification | View Log | Download

<?php
// +-----------------------------------------------------------------------+
// | PhpWebGallery - a PHP based picture gallery                           |
// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
// | Copyright (C) 2003-2005 PhpWebGallery Team - http://phpwebgallery.net |
// +-----------------------------------------------------------------------+
// | branch        : BSF (Best So Far)
// | file          : $RCSfile: functions_category.inc.php,v $
// | last update   : $Date: 2005/05/02 20:59:47 $
// | last modifier : $Author: plg $
// | revision      : $Revision: 1.66.2.1 $
// +-----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation                                          |
// |                                                                       |
// | This program is distributed in the hope that it will be useful, but   |
// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
// | General Public License for more details.                              |
// |                                                                       |
// | You should have received a copy of the GNU General Public License     |
// | along with this program; if not, write to the Free Software           |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA.                                                                  |
// +-----------------------------------------------------------------------+

/**
 * Provides functions to handle categories.
 *
 * 
 */

/**
 * Is the category accessible to the connected user ?
 *
 * Note : if the user is not authorized to see this category, page creation
 * ends (exit command in this function)
 *
 * @param int category id to verify
 * @return void
 */
function check_restrictions( $category_id )
{
  global $user,$lang;

  if ( in_array( $category_id, $user['restrictions'] ) )
  {
    echo '<div style="text-align:center;">'.$lang['access_forbiden'].'<br />';
    echo '<a href="'.add_session_id( './category.php' ).'">';
    echo $lang['thumbnails'].'</a></div>';
    exit();
  }
}

/**
 * Checks whether the argument is a right parameter category id
 *
 * The argument is a right parameter if corresponds to one of these :
 *
 *  - is numeric and corresponds to a category in the database
 *  - equals 'fav' (for favorites)
 *  - equals 'search' (when the result of a search is displayed)
 *  - equals 'most_visited'
 *  - equals 'best_rated'
 *  - equals 'recent_pics'
 *  - equals 'recent_cats'
 *  - equals 'calendar'
 *  - equals 'list'
 *
 * The function fills the global var $page['cat'] and returns nothing
 *
 * @param mixed category id or special category name
 * @return void
 */
function check_cat_id( $cat )
{
  global $page;

  unset( $page['cat'] );
  if ( isset( $cat ) )
  {
    if ( isset( $page['plain_structure'][$cat] ) )
    {
      $page['cat'] = $cat;
    }
    else if ( is_numeric( $cat ) )
    {
      $query = 'SELECT id';
      $query.= ' FROM '.CATEGORIES_TABLE.' WHERE id = '.$cat.';';
      $result = pwg_query( $query );
      if ( mysql_num_rows( $result ) != 0 )
      {
        $page['cat'] = $cat;
      }
    }
    if ( $cat == 'fav'
         or $cat == 'most_visited'
         or $cat == 'best_rated'
         or $cat == 'recent_pics'
         or $cat == 'recent_cats'
         or $cat == 'calendar' )
    {
      $page['cat'] = $cat;
    }
    if ($cat == 'search' and isset($_GET['search']))
    {
      $page['cat'] = $cat;
    }
    if ($cat == 'list'
        and isset($_GET['list'])
        and preg_match('/^\d+(,\d+)*$/', $_GET['list']))
    {
      $page['cat'] = 'list';
    }
  }
}

function get_categories_menu()
{
  global $page,$user;
  
  $infos = array('');
  
  $query = '
SELECT name,id,date_last,nb_images,global_rank
  FROM '.CATEGORIES_TABLE.'
  WHERE 1 = 1'; // stupid but permit using AND after it !
  if (!$user['expand'])
  {
    $query.= '
    AND (id_uppercat is NULL';
    if (isset ($page['tab_expand']) and count($page['tab_expand']) > 0)
    {
      $query.= ' OR id_uppercat IN ('.implode(',',$page['tab_expand']).')';
    }
    $query.= ')';
  }
  if ($user['forbidden_categories'] != '')
  {
    $query.= '
    AND id NOT IN ('.$user['forbidden_categories'].')';
  }
  $query.= '
;';

  $result = pwg_query($query);
  $cats = array();
  while ($row = mysql_fetch_array($result))
  {
    array_push($cats, $row);
  }
  usort($cats, 'global_rank_compare');

  return get_html_menu_category($cats);
}

function count_user_total_images()
{
  global $user;

  $query = 'SELECT SUM(nb_images) AS total';
  $query.= ' FROM '.CATEGORIES_TABLE;
  if ( count( $user['restrictions'] ) > 0 )
    $query.= ' WHERE id NOT IN ('.$user['forbidden_categories'].')';
  $query.= ';';
 
  $row = mysql_fetch_array( pwg_query( $query ) );

  if ( !isset( $row['total'] ) ) $row['total'] = 0;
  return $row['total'];
}

/**
 * Retrieve informations about a category in the database
 *
 * Returns an array with following keys :
 *
 *  - comment
 *  - dir : directory, might be empty for virtual categories
 *  - name : an array with indexes from 0 (lowest cat name) to n (most
 *           uppercat name findable)
 *  - nb_images
 *  - id_uppercat
 *  - site_id
 *  - 
 *
 * @param int category id
 * @return array
 */
function get_cat_info( $id )
{
  $infos = array('nb_images','id_uppercat','comment','site_id'
                 ,'dir','date_last','uploadable','status','visible'
                 ,'representative_picture_id','uppercats','commentable');
  
  $query = '
SELECT '.implode(',', $infos).'
  FROM '.CATEGORIES_TABLE.'
  WHERE id = '.$id.'
;';
  $row = mysql_fetch_array(pwg_query($query));

  $cat = array();
  foreach ($infos as $info)
  {
    if (isset($row[$info]))
    {
      $cat[$info] = $row[$info];
    }
    else
    {
      $cat[$info] = '';
    }
    // If the field is true or false, the variable is transformed into a
    // boolean value.
    if ($cat[$info] == 'true' or $cat[$info] == 'false')
    {
      $cat[$info] = get_boolean( $cat[$info] );
    }
  }
  $cat['comment'] = nl2br($cat['comment']);

  $names = array();
  $query = '
SELECT name,id
  FROM '.CATEGORIES_TABLE.'
  WHERE id IN ('.$cat['uppercats'].')
;';
  $result = pwg_query($query);
  while($row = mysql_fetch_array($result))
  {
    $names[$row['id']] = $row['name'];
  }

  // category names must be in the same order than uppercats list
  $cat['name'] = array();
  foreach (explode(',', $cat['uppercats']) as $cat_id)
  {
    $cat['name'][$cat_id] = $names[$cat_id];
  }
  
  return $cat;
}

// get_complete_dir returns the concatenation of get_site_url and
// get_local_dir
// Example : "pets > rex > 1_year_old" is on the the same site as the
// PhpWebGallery files and this category has 22 for identifier
// get_complete_dir(22) returns "./galleries/pets/rex/1_year_old/"
function get_complete_dir( $category_id )
{
  return get_site_url($category_id).get_local_dir($category_id);
}

// get_local_dir returns an array with complete path without the site url
// Example : "pets > rex > 1_year_old" is on the the same site as the
// PhpWebGallery files and this category has 22 for identifier
// get_local_dir(22) returns "pets/rex/1_year_old/"
function get_local_dir( $category_id )
{
  global $page;

  $uppercats = '';
  $local_dir = '';

  if ( isset( $page['plain_structure'][$category_id]['uppercats'] ) )
  {
    $uppercats = $page['plain_structure'][$category_id]['uppercats'];
  }
  else
  {
    $query = 'SELECT uppercats';
    $query.= ' FROM '.CATEGORIES_TABLE.' WHERE id = '.$category_id;
    $query.= ';';
    $row = mysql_fetch_array( pwg_query( $query ) );
    $uppercats = $row['uppercats'];
  }

  $upper_array = explode( ',', $uppercats );

  $database_dirs = array();
  $query = 'SELECT id,dir';
  $query.= ' FROM '.CATEGORIES_TABLE.' WHERE id IN ('.$uppercats.')';
  $query.= ';';
  $result = pwg_query( $query );
  while( $row = mysql_fetch_array( $result ) )
  {
    $database_dirs[$row['id']] = $row['dir'];
  }
  foreach ($upper_array as $id)
  {
    $local_dir.= $database_dirs[$id].'/';
  }

  return $local_dir;
}

// retrieving the site url : "http://domain.com/gallery/" or
// simply "./galleries/"
function get_site_url($category_id)
{
  global $page;

  $query = '
SELECT galleries_url
  FROM '.SITES_TABLE.' AS s,'.CATEGORIES_TABLE.' AS c
  WHERE s.id = c.site_id
    AND c.id = '.$category_id.'
;';
  $row = mysql_fetch_array(pwg_query($query));
  return $row['galleries_url'];
}

// initialize_category initializes ;-) the variables in relation
// with category :
// 1. calculation of the number of pictures in the category
// 2. determination of the SQL query part to ask to find the right category
//    $page['where'] is not the same if we are in
//       - simple category
//       - search result
//       - favorites displaying
//       - most visited pictures
//       - best rated pictures
//       - recent pictures
//       - defined list (used for random)
// 3. determination of the title of the page
// 4. creation of the navigation bar
function initialize_category( $calling_page = 'category' )
{
  pwg_debug( 'start initialize_category' );
  global $page,$lang,$user,$conf;

  if ( isset( $page['cat'] ) )
  {
    // $page['nb_image_page'] is the number of picture to display on this page
    // By default, it is the same as the $user['nb_image_page']
    $page['nb_image_page'] = $user['nb_image_page'];
    // $url is used to create the navigation bar
    $url = PHPWG_ROOT_PATH.'category.php?cat='.$page['cat'];
    if ( isset($page['expand']) ) $url.= '&amp;expand='.$page['expand'];
    // simple category
    if ( is_numeric( $page['cat'] ) )
    {
      $result = get_cat_info( $page['cat'] );
      $page['comment']        = $result['comment'];
      $page['cat_dir']        = $result['dir'];
      $page['cat_name']       = $result['name'];
      $page['cat_nb_images']  = $result['nb_images'];
      $page['cat_site_id']    = $result['site_id'];
      $page['cat_uploadable'] = $result['uploadable'];
      $page['cat_commentable'] = $result['commentable'];
      $page['uppercats']      = $result['uppercats'];
      $page['title'] =
        get_cat_display_name($page['cat_name'],
                             '',
                             false);
      $page['where'] = ' WHERE category_id = '.$page['cat'];
    }
    else
    {
      if ($page['cat'] == 'search'
          or $page['cat'] == 'most_visited'
          or $page['cat'] == 'recent_pics'
          or $page['cat'] == 'recent_cats'
          or $page['cat'] == 'best_rated'
          or $page['cat'] == 'calendar'
          or $page['cat'] == 'list')
      {
        // we must not show pictures of a forbidden category
        if ( $user['forbidden_categories'] != '' )
        {
          $forbidden = ' category_id NOT IN ';
          $forbidden.= '('.$user['forbidden_categories'].')';
        }
      }
      // search result
      if ( $page['cat'] == 'search' )
      {
        // analyze search string given in URL (created in search.php)
        $tokens = explode('|', $_GET['search']);

        if (isset($tokens[1]) and $tokens[1] == 'AND')
        {
          $search['mode'] = 'AND';
        }
        else
        {
          $search['mode'] = 'OR';
        }

        $search_tokens = explode('--', $tokens[0]);
        foreach ($search_tokens as $search_token)
        {
          $tokens = explode(':', $search_token);
          $field_name = $tokens[0];
          $field_content = $tokens[1];

          $tokens = explode('~', $tokens[1]);
          if (isset($tokens[1]))
          {
            $search['fields'][$field_name]['mode'] = $tokens[1];
          }
          else
          {
            $search['fields'][$field_name]['mode'] = '';
          }

          $search['fields'][$field_name]['words'] = array();
          $tokens = explode(',', $tokens[0]);
          foreach ($tokens as $token)
          {
            array_push($search['fields'][$field_name]['words'],
                       htmlentities($token));
          }
        }
        
        $page['title'] = $lang['search_result'];
        if ( $calling_page == 'picture' )
        {
          $page['title'].= ' : <span style="font-style:italic;">';
          $page['title'].= $_GET['search']."</span>";
        }

        // SQL where clauses are stored in $clauses array during query
        // construction
        $clauses = array();
        
        $textfields = array('file', 'name', 'comment', 'keywords', 'author');
        foreach ($textfields as $textfield)
        {
          if (isset($search['fields'][$textfield]))
          {
            $local_clauses = array();
            foreach ($search['fields'][$textfield]['words'] as $word)
            {
              array_push($local_clauses, $textfield." LIKE '%".$word."%'");
            }
            // adds brackets around where clauses
            array_walk($local_clauses,create_function('&$s','$s="(".$s.")";'));
            array_push($clauses,
                       implode(' '.$search['fields'][$textfield]['mode'].' ',
                               $local_clauses));
          }
        }

        if (isset($search['fields']['allwords']))
        {
          $fields = array('file', 'name', 'comment', 'keywords', 'author');
          // in the OR mode, request bust be :
          // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
          // OR (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
          //
          // in the AND mode :
          // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
          // AND (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
          $word_clauses = array();
          foreach ($search['fields']['allwords']['words'] as $word)
          {
            $field_clauses = array();
            foreach ($fields as $field)
            {
              array_push($field_clauses, $field." LIKE '%".$word."%'");
            }
            // adds brackets around where clauses
            array_push($word_clauses, implode(' OR ', $field_clauses));
          }
          array_walk($word_clauses, create_function('&$s','$s="(".$s.")";'));
          array_push($clauses,
                     implode(' '.$search['fields']['allwords']['mode'].' ',
                               $word_clauses));
        }

        $datefields = array('date_available', 'date_creation');
        foreach ($datefields as $datefield)
        {
          $key = $datefield;
          if (isset($search['fields'][$key]))
          {
            $local_clause = $datefield." = '";
            $local_clause.= str_replace('.', '-',
                                        $search['fields'][$key]['words'][0]);
            $local_clause.= "'";
            array_push($clauses, $local_clause);
          }

          foreach (array('after','before') as $suffix)
          {
            $key = $datefield.'-'.$suffix;
            if (isset($search['fields'][$key]))
            {
              $local_clause = $datefield;
              if ($suffix == 'after')
              {
                $local_clause.= ' >';
              }
              else
              {
                $local_clause.= ' <';
              }
              if (isset($search['fields'][$key]['mode'])
                  and $search['fields'][$key]['mode'] == 'inc')
              {
                $local_clause.= '=';
              }
              $local_clause.= " '";
              $local_clause.= str_replace('.', '-',
                                          $search['fields'][$key]['words'][0]);
              $local_clause.= "'";
              array_push($clauses, $local_clause);
            }
          }
        }

        if (isset($search['fields']['cat']))
        {
          if ($search['fields']['cat']['mode'] == 'sub_inc')
          {
            // searching all the categories id of sub-categories
            $cat_ids = get_subcat_ids($search['fields']['cat']['words']);
          }
          else
          {
            $cat_ids = $search['fields']['cat']['words'];
          }
          
          $local_clause = 'category_id IN ('.implode(',', $cat_ids).')';
          array_push($clauses, $local_clause);
        }

        // adds brackets around where clauses
        array_walk($clauses, create_function('&$s', '$s = "(".$s.")";'));
        $page['where'] = 'WHERE '.implode(' '.$search['mode'].' ', $clauses);
        if ( isset( $forbidden ) ) $page['where'].= ' AND '.$forbidden;

        $query = '
SELECT COUNT(DISTINCT(id)) AS nb_total_images
  FROM '.IMAGES_TABLE.'
    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
  '.$page['where'].'
;';
        $url.= '&amp;search='.$_GET['search'];
      }
      // favorites displaying
      else if ( $page['cat'] == 'fav' )
      {
        check_user_favorites();
        
        $page['title'] = $lang['favorites'];

        $page['where'] = ', '.FAVORITES_TABLE.' AS fav';
        $page['where'].= ' WHERE user_id = '.$user['id'];
        $page['where'].= ' AND fav.image_id = id';
      
        $query = 'SELECT COUNT(*) AS nb_total_images';
        $query.= ' FROM '.FAVORITES_TABLE;
        $query.= ' WHERE user_id = '.$user['id'];
        $query.= ';';
      }
      // pictures within the short period
      else if ( $page['cat'] == 'recent_pics' )
      {
        $page['title'] = $lang['recent_pics_cat'];
        // We must find the date corresponding to :
        // today - $conf['periode_courte']
        $date = time() - 60*60*24*$user['recent_period'];
        $page['where'] = " WHERE date_available > '";
        $page['where'].= date( 'Y-m-d', $date )."'";
        if ( isset( $forbidden ) ) $page['where'].= ' AND '.$forbidden;

        $query = '
SELECT COUNT(DISTINCT(id)) AS nb_total_images
  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic
    ON id = ic.image_id
  '.$page['where'].'
;';
      }
      // categories containing recent pictures
      else if ( $page['cat'] == 'recent_cats' )
      {
        $page['title'] = $lang['recent_cats_cat'];
        $page['cat_nb_images'] = 0;
      }
      // most visited pictures
      else if ( $page['cat'] == 'most_visited' )
      {
        $page['title'] = $conf['top_number'].' '.$lang['most_visited_cat'];

        $page['where'] = 'WHERE hit > 0';
        if (isset($forbidden))
        {
          $page['where'] = "\n".'    AND '.$forbidden;
        }

        $conf['order_by'] = ' ORDER BY hit DESC, file ASC';

        // $page['cat_nb_images'] equals $conf['top_number'] unless there
        // are less visited items
        $query ='
SELECT COUNT(DISTINCT(id)) AS count
  FROM '.IMAGES_TABLE.'
    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
  '.$page['where'].'
;';
        $row = mysql_fetch_array(pwg_query($query));
        if ($row['count'] < $conf['top_number'])
        {
          $page['cat_nb_images'] = $row['count'];
        }
        else
        {
          $page['cat_nb_images'] = $conf['top_number'];
        }
        unset($query);
        
        if ( isset( $page['start'] )
             and ($page['start']+$user['nb_image_page']>=$conf['top_number']))
        {
          $page['nb_image_page'] = $conf['top_number'] - $page['start'];
        }
      }
      else if ( $page['cat'] == 'calendar' )
      {
        $page['cat_nb_images'] = 0;
        $page['title'] = $lang['calendar'];
        if (isset($_GET['year'])
            and preg_match('/^\d+$/', $_GET['year']))
        {
          $page['calendar_year'] = (int)$_GET['year'];
        }
        if (isset($_GET['month'])
            and preg_match('/^(\d+)\.(\d{2})$/', $_GET['month'], $matches))
        {
          $page['calendar_year'] = (int)$matches[1];
          $page['calendar_month'] = (int)$matches[2];
        }
        if (isset($_GET['day'])
            and preg_match('/^(\d+)\.(\d{2})\.(\d{2})$/',
                           $_GET['day'],
                           $matches))
        {
          $page['calendar_year'] = (int)$matches[1];
          $page['calendar_month'] = (int)$matches[2];
          $page['calendar_day'] = (int)$matches[3];
        }
        if (isset($page['calendar_year']))
        {
          $page['title'] .= ' (';
          if (isset($page['calendar_day']))
          {
            if ($page['calendar_year'] >= 1970)
            {
              $unixdate = mktime(0,0,0,
                                 $page['calendar_month'],
                                 $page['calendar_day'],
                                 $page['calendar_year']);
              $page['title'].= $lang['day'][date("w", $unixdate)];
            }
            $page['title'].= ' '.$page['calendar_day'].', ';
          }
          if (isset($page['calendar_month']))
          {
            $page['title'] .= $lang['month'][$page['calendar_month']].' ';
          }
          $page['title'] .= $page['calendar_year'];
          $page['title'] .= ')';
        }
        
        $page['where'] = 'WHERE '.$conf['calendar_datefield'].' IS NOT NULL';
        if (isset($forbidden))
        {
          $page['where'].= ' AND '.$forbidden;
        }
      }
      else if ($page['cat'] == 'best_rated')
      {
        $page['title'] = $conf['top_number'].' '.$lang['best_rated_cat'];

        $page['where'] = ' WHERE average_rate IS NOT NULL';
        
        if (isset($forbidden))
        {
          $page['where'].= ' AND '.$forbidden;
        }

        $conf['order_by'] = ' ORDER BY average_rate DESC, id ASC';

        // $page['cat_nb_images'] equals $conf['top_number'] unless there
        // are less rated items
        $query ='
SELECT COUNT(DISTINCT(id)) AS count
  FROM '.IMAGES_TABLE.'
    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
  '.$page['where'].'
;';
        $row = mysql_fetch_array(pwg_query($query));
        if ($row['count'] < $conf['top_number'])
        {
          $page['cat_nb_images'] = $row['count'];
        }
        else
        {
          $page['cat_nb_images'] = $conf['top_number'];
        }
        unset($query);
          

        if (isset($page['start'])
            and ($page['start']+$user['nb_image_page']>=$conf['top_number']))
        {
          $page['nb_image_page'] = $conf['top_number'] - $page['start'];
        }
      }
      else if ($page['cat'] == 'list')
      {
        $page['title'] = $lang['random_cat'];
          
        $page['where'] = 'WHERE 1=1';
        if (isset($forbidden))
        {
          $page['where'].= ' AND '.$forbidden;
        }
        $page['where'].= ' AND image_id IN ('.$_GET['list'].')';
        $page['cat_nb_images'] = count(explode(',', $_GET['list']));

        $url.= '&amp;list='.$_GET['list'];
      }

      if (isset($query))
      {
        $result = pwg_query( $query );
        $row = mysql_fetch_array( $result );
        $page['cat_nb_images'] = $row['nb_total_images'];
      }
    }
    if ( $calling_page == 'category' )
    {
      $page['navigation_bar'] =
        create_navigation_bar( $url, $page['cat_nb_images'], $page['start'],
                               $user['nb_image_page'], 'back' );
    }
  }
  else
  {
    $page['title'] = $lang['no_category'];
  }
  pwg_debug( 'end initialize_category' );
}

function display_select_categories($categories,
                                   $selecteds,
                                   $blockname,
                                   $fullname = true)
{
  global $template;

  foreach ($categories as $category)
  {
    $selected = '';
    if (in_array($category['id'], $selecteds))
    {
      $selected = ' selected="selected"';
    }

    if ($fullname)
    {
      $option = get_cat_display_name_cache($category['uppercats'],
                                           '',
                                           false);
    }
    else
    {
      $option = str_repeat('&nbsp;',
                           (3 * substr_count($category['global_rank'], '.')));
      $option.= '- '.$category['name'];
    }
    
    $template->assign_block_vars(
      $blockname,
      array('SELECTED'=>$selected,
            'VALUE'=>$category['id'],
            'OPTION'=>$option
        ));
  }
}

function display_select_cat_wrapper($query, $selecteds, $blockname,
                                    $fullname = true)
{
  $result = pwg_query($query);
  $categories = array();
  if (!empty($result))
  {
    while ($row = mysql_fetch_array($result))
    {
      array_push($categories, $row);
    }
  }
  usort($categories, 'global_rank_compare');
  display_select_categories($categories, $selecteds, $blockname, $fullname);
}

/**
 * returns all subcategory identifiers of given category ids
 *
 * @param array ids
 * @return array
 */
function get_subcat_ids($ids)
{
  $query = '
SELECT DISTINCT(id)
  FROM '.CATEGORIES_TABLE.'
  WHERE ';
  foreach ($ids as $num => $category_id)
  {
    if ($num > 0)
    {
      $query.= '
    OR ';
    }
    $query.= 'uppercats REGEXP \'(^|,)'.$category_id.'(,|$)\'';
  }
  $query.= '
;';
  $result = pwg_query($query);

  $subcats = array();
  while ($row = mysql_fetch_array($result))
  {
    array_push($subcats, $row['id']);
  }
  return $subcats;
}

function global_rank_compare($a, $b)
{
  return strnatcasecmp($a['global_rank'], $b['global_rank']);
}
?>