You are here

brilliant_gallery.module in Brilliant Gallery 6

File

brilliant_gallery.module
View source
<?php

#sess_write('vacilando', 'this is a test');
if (module_exists('views')) {
  module_load_include('inc', 'brilliant_gallery', 'views');

  #require(drupal_get_path('module', 'brilliant_gallery') .'/views.inc');
}

// include the brilliant_gallery_checklist .js file in nodes
drupal_add_js(drupal_get_path('module', 'brilliant_gallery') . '/bgchecklist.js');

/**
 * Display help and module information
 *
 * @param section which section of the site we're displaying help
 *
 * @return help text for section
 */
function brilliant_gallery_help($path, $arg) {
  $output = '';
  switch ($section) {
    case "admin/help#brilliant_gallery":
      $output = '<p>' . t("Highly customizable Drupal module creating a table gallery of quality-scaled images from any number of folders.") . '</p>';
      break;
  }
  return $output;
}

// function brilliant_gallery_help

/**
 * Valid permissions for this module
 *
 * @return array An array of valid permissions for the onthisdate module
 */
function brilliant_gallery_perm() {

  #, 'administer brilliant_gallery'
  return array(
    'access brilliant_gallery',
  );
}

// function brilliant_gallery_perm

/**
 * Generate HTML for the Brilliant gallery block
 *
 * @param op the operation from the URL
 * @param delta offset
 *
 * @returns block HTML
 */
function brilliant_gallery_block($op = 'list', $delta = 0) {

  // listing of blocks, such as on the admin/block page
  if ($op == "list") {
    $block[0]["info"] = t("Brilliant gallery");
    return $block;
  }
  else {
    if ($op == 'view') {

      // our block content
      // content variable that will be returned for display
      $block_content = '';

      #$block_content .= l($links->title, 'node/'.$links->nid) . '<br />';

      #$block_content .= l('vacilando', 'http://www.vacilando.org') . '<br />';
      $block_content .= render_brilliant_gallery();

      // set up the block
      $block['subject'] = 'Brilliant gallery';
      $block['content'] = $block_content;
      return $block;
    }
  }
}

// end brilliant_gallery_block
function brilliant_gallery_all($switch = '') {

  // content variable that will be returned for display
  $page_content = '';
  if ($switch == '') {
    $page_content .= render_brilliant_gallery();
  }
  else {
    if ($switch == 'edit') {
      $page_content .= render_brilliant_gallery_edit();
    }
  }
  return $page_content;
}

// function to load the settings of all the checkboxes on this node
// note that checkboxes that has never been checked will not have an entry in the database
function brilliant_gallery_checklist_loadall($nid = '') {
  global $user;
  $GLOBALS['devel_shutdown'] = FALSE;
  $uid = $user->uid;
  $dcvals = array();

  // any checkbox id that starts with user- we remember the current user's settings
  // any other id is global and we use user=0
  $result = db_query("select qid,state from brilliant_gallery_checklist " . " where nid=%d and qid not like 'user-%' and user=0 " . " union " . "select qid,state from brilliant_gallery_checklist " . "where nid=%d and qid like 'user-%' and user=%d ", $nid, $nid, $uid);
  $count = 0;
  while ($data = db_fetch_object($result)) {
    $dcvals[$count] = array(
      qid => $data->qid,
      state => $data->state,
    );
    $count++;
  }
  print drupal_to_js($dcvals);
  exit;
}

// function to save/update the state of a checkbox when toggled
function brilliant_gallery_checklist_save($nid, $qid, $state) {
  global $user;
  $GLOBALS['devel_shutdown'] = FALSE;
  if (preg_match("/^user-/", $qid) == 1) {
    $uid = $user->uid;
  }
  else {
    $uid = 0;
  }
  $existing = db_result(db_query("select count(state) from brilliant_gallery_checklist " . "where nid=%d and user=%d and qid='%s'", $nid, $uid, $qid));
  if ($existing == 0) {
    db_query("insert into brilliant_gallery_checklist (nid,user,qid,state) " . "values (%d,%d,'%s',%d)", $nid, $uid, $qid, $state);
  }
  elseif ($current != $state) {
    $current = db_result(db_query("select state from brilliant_gallery_checklist " . " where nid=%d and user=%d and qid='%s'", $nid, $uid, $qid));
    if ($current != $state) {
      db_query("update brilliant_gallery_checklist " . "set state=%d where nid=%d and user=%d and qid='%s'", $state, $nid, $uid, $qid);
    }
  }
  print drupal_to_js("1");
  exit;
}

// helper function for preg_replace_callback to generate the html for each checkbox
// Form API not used as that would float all the checkboxes to the top/bottom of the page.
function brilliant_gallery_checklist_docheckbox($matches) {
  global $brilliant_gallery_checklist_matchcount;
  $brilliant_gallery_checklist_matchcount++;
  $name = check_plain($matches[1]);
  $label = filter_xss($matches[2]);
  $output = <<<OUTPUT
    <div class="bgchecklist"> <div class="form-item"> <input name="{<span class="php-variable">$name</span>}" id="{<span class="php-variable">$name</span>}" value="1" class="form-brilliant_gallery_checklist-checkbox" type="checkbox"> <label class="option"> {<span class="php-variable">$label</span>} </label> </div></div>
OUTPUT;
  return $output;
}
function brilliant_gallery_admin() {
  $form['brilliant_gallery_folder'] = array(
    '#type' => 'textfield',
    '#title' => t('Path to the main gallery folder'),
    '#default_value' => variable_get('brilliant_gallery_folder', ''),
    '#size' => 50,
    '#maxlength' => 100,
    '#description' => t("Path to the main folder in which your individual gallery folders will be placed. This folder must exist under your 'files' folder. Exclude trailing slashes. Example: <i>albums</i>"),
  );
  $form['brilliant_gallery_maxcol'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum number of table columns'),
    '#default_value' => variable_get('brilliant_gallery_maxcol', 5),
    '#size' => 2,
    '#maxlength' => 2,
    '#description' => t("The maximum number of columns displayed in the table."),
  );
  $form['brilliant_gallery_maximagewidth'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum width of table images'),
    '#default_value' => variable_get('brilliant_gallery_maximagewidth', 150),
    '#size' => 3,
    '#maxlength' => 4,
    '#description' => t("The maximum width of thumbnails in the table (height calculated automatically)."),
  );
  $form['brilliant_gallery_bcgcolour'] = array(
    '#type' => 'colorpicker',
    '#title' => t('Table background colour'),
    '#default_value' => variable_get('brilliant_gallery_bcgcolour', '#000000'),
    '#size' => 8,
    '#maxlength' => 7,
    '#description' => t("Pick colour of the background of the table that holds the images."),
  );
  $form['brilliant_gallery_bcgcolour_textfield'] = array(
    '#type' => 'colorpicker_textfield',
    '#title' => t('Current background color'),
    '#description' => t(''),
    '#default_value' => variable_get('brilliant_gallery_bcgcolour_textfield', '#000000'),
    '#colorpicker' => 'brilliant_gallery_bcgcolour',
  );
  $form['brilliant_gallery_padding'] = array(
    '#type' => 'textfield',
    '#title' => t('Table cell padding'),
    '#default_value' => variable_get('brilliant_gallery_padding', 3),
    '#size' => 3,
    '#maxlength' => 3,
    '#description' => t("Cell padding (around each image) in pixels."),
  );
  $form['brilliant_gallery_overbrowser'] = array(
    '#type' => 'select',
    '#title' => t('Overlay browser'),
    '#required' => FALSE,
    '#options' => array(
      'lightbox' => t('Lightbox'),
      'thickbox' => t('Thickbox'),
      'greyboxr' => t('Greybox Redux'),
      'none' => t('None'),
    ),
    '#default_value' => variable_get('brilliant_gallery_overbrowser', 'thickbox'),
    '#description' => t('Select the overlay image browser (must be installed, of course).'),
  );
  $form['brilliant_gallery_maxwidth'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum width of full image'),
    '#default_value' => variable_get('brilliant_gallery_maxwidth', '1000'),
    '#size' => 5,
    '#maxlength' => 5,
    '#description' => t("Very large images will be scaled down to this width (in pixels) for display before they get displayed by the overlay browser."),
  );
  $form['brilliant_gallery_caption'] = array(
    '#type' => 'checkbox',
    '#title' => t('Display file name as caption'),
    '#default_value' => variable_get('brilliant_gallery_caption', ''),
    #'#size' => 5,

    #'#maxlength' => 5,
    '#description' => t("Check this if you want the overlay browser to display a caption based on the image file name (dots and underscores are automatically replaced by spaces)."),
  );
  $form['brilliant_gallery_sort'] = array(
    '#type' => 'radios',
    '#title' => t('Sort or randomize image order'),
    '#default_value' => variable_get('brilliant_gallery_sort', '1'),
    '#options' => array(
      '1' => t('Sort images by their file names alphabetically.'),
      '' => t('The order of your gallery images will always be randomized (on each page load or cache refresh).'),
    ),
  );
  $form['brilliant_gallery_cache'] = array(
    '#type' => 'radios',
    '#title' => t('Database or file system caching of images'),
    '#default_value' => variable_get('brilliant_gallery_cache', 'd'),
    '#options' => array(
      'd' => t('Use the <i>cache</i> table of Drupal.'),
      'f' => t('Use the temporary directory you have set in <i>/admin/settings/file-system</i>. Faster than database caching!'),
    ),
    '#description' => t("Only images (not the table as such) are cached so that they can be served quicker at subsequent requests."),
  );
  return system_settings_form($form);
}

# Probably not the right way of doing it but it works...
function brilliant_gallery_perms() {
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: /?q=admin/user/permissions#module-brilliant_gallery");
  exit;
}
function brilliant_gallery_menu() {
  $items = array();
  $items['admin/settings/brilliant_gallery'] = array(
    'title' => 'Brilliant gallery',
    'description' => 'Brilliant gallery module settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'brilliant_gallery_admin',
    ),
    'access arguments' => array(
      'access administration pages',
    ),
    'type' => MENU_NORMAL_ITEM,
  );

  # A shortcut to the permissions settings for this module.
  $items['admin/settings/brilliant_gallery/permissions'] = array(
    #'path' => 'admin/user/access#module-brilliant_gallery',
    'title' => 'Configure permissions',
    'description' => 'Configure access permissions for the Brilliant gallery module',
    'page callback' => 'brilliant_gallery_perms',
    #'page arguments' => 'brilliant_gallery_perms',
    'access arguments' => array(
      'access administration pages',
    ),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['admin/settings/brilliant_gallery/manage'] = array(
    'title' => 'Manage galleries',
    'description' => 'Manage galleries displayed using the Brilliant gallery module - e.g. visibility of individual images, etc.',
    'page callback' => 'render_brilliant_gallery_manage',
    #'page arguments' => 'brilliant_gallery_perms',
    'access arguments' => array(
      'access administration pages',
    ),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['brilliant_gallery'] = array(
    'title' => 'Brilliant gallery',
    'page callback' => 'brilliant_gallery_all',
    'access arguments' => array(
      'access brilliant_gallery',
    ),
    'type' => MENU_CALLBACK,
  );

  /*
    $items['brilliant_gallery/manage'] = array(
      'title' => 'Manage galleries',
      'page callback' => 'render_brilliant_gallery_manage',
      'access arguments' => array('access administration pages'),
      'type' => MENU_CALLBACK
    ); # The type MENU_CALLBACK tells Drupal to not display the link in the user's menu, just use this function when the URL is accessed. Use MENU_NORMAL_ITEM if you want the user to see the link in the side navigation block.
  */

  # 2 menu callback functions to implement the ajax load and save routines
  $items['bgchecklist/loadall'] = array(
    'page callback' => 'brilliant_gallery_checklist_loadall',
    'type' => MENU_CALLBACK,
    'access arguments' => array(
      'access brilliant_gallery',
    ),
  );
  $items['bgchecklist/save'] = array(
    'page callback' => 'brilliant_gallery_checklist_save',
    'type' => MENU_CALLBACK,
    'access arguments' => array(
      'access administration pages',
    ),
  );
  return $items;
}
function render_brilliant_gallery_manage() {
  $result = '';

  # Beginning of brilliant_gallery_checklist form.

  # Removed action "/node/$nid"

  # Hacked $nid ... 9999999 - cannot be empty!!
  $ac_header = <<<HEADER
      <form action="" method="post" id="bgchecklist">
      <div>
      <div id="nodeid">
      <input name="nid" id="edit-nid" value="9999999" type="hidden">
      </div>
HEADER;
  $result .= $ac_header;
  $overbrowser = variable_get('brilliant_gallery_overbrowser', 'thickbox');
  $setname = mt_rand(1, 9999999);
  $galleryfolder = variable_get('brilliant_gallery_folder', '');
  $path = url(file_directory_path() . '/' . $galleryfolder, array(
    'absolute' => TRUE,
  ));

  # url() ads i18n codes to the URL ... we need to remove them here...
  if ($langcode != '') {
    $path = str_replace('/' . $langcode . '/', '/', $path);
  }

  # Non-clean URLs need removing ?q=
  $path = str_replace("?q=", "", $path);
  $absolpath = realpath(file_directory_path() . '/' . $galleryfolder);
  $result .= '<p>';
  $result .= '<p>This page allows you to set or unset visibility of each image (data item) in all Brilliant galleries there are on this website.';

  #$result .= '<p><b>Files folder:</b> ' . file_directory_path() . '/';
  ob_start();
  $recurs = bg_iterative_recurse_dir($absolpath);

  #echo '<pre>'; print_r( $recurs ); echo '</pre>';

  #echo '<pre>'; print_r( $retval_dimensions ); echo '</pre>';
  $result .= ob_get_contents();
  $dirshavefiles = array();
  foreach ($recurs as $key => $val) {
    $temp = explode('/', $val);
    $tempf = $temp[sizeof($temp) - 1];
    unset($temp[sizeof($temp) - 1]);
    $tempd = implode('/', $temp);
    $dirshavefiles[$tempd][] = $tempf;
  }
  ksort($dirshavefiles);
  $result .= '<p><b>Select an image folder:</b><ol>';
  foreach ($dirshavefiles as $key => $val) {

    # Get just the folder name in the main gallery folder.
    $path_middle = str_replace($absolpath, '', $key);
    $result .= '<li><a href="?fld=' . $galleryfolder . $path_middle . '">' . $galleryfolder . $path_middle . '</a></li>';
    if ($galleryfolder . $path_middle == $_GET['fld']) {

      # User has asked to manage images in this folder.
      $tablerows = array();
      $temp = load_dir_to_array($key, variable_get('brilliant_gallery_maximagewidth', 150), variable_get('brilliant_gallery_maxwidth', '1000'), 1);
      $retval_dimensions = $temp[0];
      $imagemaxh = $temp[1];
      $maxpoct = count($retval_dimensions);

      #echo '<p>max: ' . $maxpoct;

      #ob_start(); echo '<pre>'; print_r( $retval_dimensions ); echo '</pre>'; $result .= ob_get_contents();

      
      $retval = array();
      $cnt = 0;

      #$path = url($key, array('absolute' => TRUE));
      for ($poct = 1; $poct <= $maxpoct; $poct++) {
        $cnt += 1;
        $retval[$poct - 1] = $retval_dimensions[$poct - 1]['file'];
        $fullimgpath = $path . $path_middle . '/' . $retval[$poct - 1];
        if (testext($retval[$poct - 1])) {
          $caption = str_replace(array(
            '.',
            '_',
          ), ' ', basename($retval[$poct - 1], strrchr($retval[$poct - 1], '.')));

          #$smallenough = false;
          $imgw = $retval_dimensions[$poct - 1]['imgw'];
          $imgh = $retval_dimensions[$poct - 1]['imgh'];
          $imgwbig = $retval_dimensions[$poct - 1]['imgwbig'];
          $imghbig = $retval_dimensions[$poct - 1]['imghbig'];
          $smallenough = $retval_dimensions[$poct - 1]['smallenough'];

          #$style_li = "float: left; width: " . $imagewidth . "px; list-style: none; background: " . $bgcolour . "; height: " . $imagemaxh . "px; padding: " . $padding . "px; text-align: center; margin: 0; border: none;"; #$style_li = "float: left; list-style: none; background: #000; width: 44px; height: 33px; padding: 4px; text-align: center; margin: 0; border: none;";

          #$result .= ('<li style="' . $style_li . '">' . "\n");

          # Get this module's path:
          $modulepath = url(drupal_get_path('module', 'brilliant_gallery'), array(
            'absolute' => TRUE,
          ));

          # url() ads i18n codes to the URL ... we need to remove them here...
          if ($langcode != '') {
            $modulepath = str_replace('/' . $langcode . '/', '/', $modulepath);
          }

          # Non-clean URLs need removing ?q=
          $modulepath = str_replace("?q=", "", $modulepath);
          $displayimage = '';
          if ($smallenough === true) {
            $displayimage .= '<br><a href="' . $fullimgpath . '"';
          }
          else {

            # Important to begin with the "/" otherwise thumbnails in non-root folders fail. See http://drupal.org/node/175292

            #&dummy=.jpg
            $displayimage .= '<a href="' . $modulepath . '/image.php?imgp=' . base64_encode($absolpath . $path_middle . '/' . $retval[$poct - 1]) . '&amp;imgw=' . $imgwbig . '&amp;imgh=' . $imghbig . '"';
          }
          switch ($overbrowser) {
            case 'thickbox':
              $displayimage .= ' class="thickbox"';
              $displayimage .= ' rel="img_' . $setname . '"';

              #$attributes['class'] = $link_class;

              #$attributes['rel'] = 'img_' . ($node->nid? $node->nid: time()); // 'insert' has no $node->nid
              break;
            case 'lightbox':
              $displayimage .= ' rel="lightbox[' . $setname . ']"';

              #$attributes['rel'] = 'lightbox[' . ($node->nid? $node->nid: time()) . ']'; // 'insert' has no $node->nid
              break;
            case 'greyboxr':
              $displayimage .= ' class="greybox"';

              #$result .= ' rel="gb_imageset[' . $setname . ']"';
              break;
            default:
              break;
          }
          if ($showcaption != '') {
            if ($showcaption != 'filename') {
              $caption = $showcaption;
            }
            $displayimage .= ' title="' . $caption . '"';
          }
          $displayimage .= '>';

          # width="' . $imgw . '"
          $displayimage .= '<img style="border: 0; margin:0px; padding:0px;" alt="" src="' . $modulepath . '/image.php?imgp=' . base64_encode($absolpath . $path_middle . '/' . $retval[$poct - 1]) . '&amp;imgw=' . $imgw . '&amp;imgh=' . $imgh . '" />';
          $displayimage .= '</a>';
        }
        else {
          $displayimage .= '<a href="' . $fullimgpath . '">';

          #$result .= '<center>' . $retval[$poct-1] . '</center>';
          $displayimage .= $retval[$poct - 1];

          #brokenimage("Error loading PNG");

          #$result .= '</a>';
          $displayimage .= '</a>';
        }

        #$result .= '<br><font size="-1">'. $retval[$poct-1] . '</font>'; # $fullimgpath
        $tablerows[$cnt][0] = $displayimage;
        $tablerows[$cnt][1] = '<font size="-1">' . $retval[$poct - 1] . '</font>';

        # We need some code for brilliant_gallery_checklist
        $tmp = '';

        # E.g. albums/2008/20080321-25_belgicko_zasypane_snehom/dsc02784_w1000.jpg
        $tmp .= '<div class="bgchecklist"> <div class="form-item"> <input name="' . 'user-' . md5($_GET['fld'] . '/' . $retval[$poct - 1]) . '" id="' . 'user-' . md5($_GET['fld'] . '/' . $retval[$poct - 1]) . '" value="1" class="form-brilliant_gallery_checklist-checkbox" type="checkbox"> <label class="option"> <font color=green>visible</font> </label> </div></div>';
        $tablerows[$cnt][2] = $tmp;
      }
      $header = array(
        'File name',
        'Thumbnail',
        'Gallery display',
      );
      $data = array();
      foreach ($tablerows as $x => $val) {
        $data[] = array(
          'data' => array(
            $tablerows[$x][0],
            $tablerows[$x][1],
            $tablerows[$x][2],
          ),
        );
      }
      $result .= theme_table($header, $data);
      $result .= '<p>';
    }
  }
  $result .= '</ol>';

  # End of brilliant_gallery_checklist form.
  $result .= "</div></form>";
  return $result;
}
function bg_iterative_recurse_dir($from = '.') {
  if (!is_dir($from)) {
    return false;
  }
  $files = array();
  $dirs = array(
    $from,
  );
  while (NULL !== ($dir = array_pop($dirs))) {
    if ($dh = opendir($dir)) {
      while (false !== ($file = readdir($dh))) {
        if ($file == '.' || $file == '..') {
          continue;
        }
        $path = $dir . '/' . $file;
        if (is_dir($path)) {
          $dirs[] = $path;
        }
        else {
          $files[] = $path;
        }
      }
      closedir($dh);
    }
  }
  return $files;
}
function render_brilliant_gallery($thisfolder = '', $colcountoverride = '', $widthoverride = '', $sortoverride = '', $maximumnumbertoshow = '', $colouroverride = '', $beginfromoverride = 1, $captionyesnotext = '') {

  #drupal_add_css(drupal_get_path('module', 'brilliant_gallery') .'/brilliant_gallery.css');

  # First some household cleaning. Delete expired cache files at 11:11 (if someone calls this script, of course!)
  if (date('h') == '11' and date('i') == '11') {

    #if ( date( 'h' ) == '12' ) {

    #echo date( 'h' );
    cleantmpdir();
  }

  # Patching a possible problem with i18n
  $langcode = '';
  if (function_exists('i18n_get_lang')) {
    $langcode = i18n_get_lang();
  }

  #$result = '</p>';
  $result = '';
  $galleryfolder = variable_get('brilliant_gallery_folder', '');
  if (substr($galleryfolder, strlen($galleryfolder) - 1, 1) == '/' or substr($galleryfolder, 0, 1) == '/') {

    #watchdog('error', 'failed to notify "weblogs.com" (site)');

    #form_set_error('yemail', t('Header injection attempt detected.  Do not enter line feed characters into the from field!'));
    return 'Main gallery folder path must not begin or end with a slash; please fix it in the <a href="/admin/settings/brilliant_gallery">settings page</a>.';
  }
  if ($thisfolder != '') {
    $galleryfolder .= '/' . $thisfolder;
  }
  if ($colcountoverride == '') {
    $columns = variable_get('brilliant_gallery_maxcol', 3);
  }
  else {
    $columns = $colcountoverride;
  }
  if ($widthoverride == '') {
    $imagewidth = variable_get('brilliant_gallery_maximagewidth', 150);
  }
  else {
    $imagewidth = $widthoverride;
  }
  if ($sortoverride == '' or strtolower($sortoverride) == 'sort') {
    $brilliant_gallery_sort = variable_get('brilliant_gallery_sort', '1');
  }
  else {
    $brilliant_gallery_sort = $sortoverride;
  }
  if ($colouroverride == '') {
    $bgcolour = variable_get('brilliant_gallery_bcgcolour_textfield', '#000000');
  }
  else {
    $bgcolour = $colouroverride;
  }
  if ($captionyesornot == 'yes' or $captionyesornot == '' or variable_get('brilliant_gallery_caption', '') != '' and $captionyesornot != 'no') {
    $showcaption = 'filename';
  }
  else {
    if ($captionyesornot == 'no') {
      $showcaption = '';
    }
    else {
      $showcaption = $captionyesornot;
    }
  }
  $padding = variable_get('brilliant_gallery_padding', 3);
  $overbrowser = variable_get('brilliant_gallery_overbrowser', 'thickbox');

  # Totally full resolution display would be impractical, so this is the maximum width of "full" resolution.
  $fullresolutionmaxwidth = variable_get('brilliant_gallery_maxwidth', '1000');
  $path = url(file_directory_path() . '/' . $galleryfolder, array(
    'absolute' => TRUE,
  ));

  # url() ads i18n codes to the URL ... we need to remove them here...
  if ($langcode != '') {
    $path = str_replace('/' . $langcode . '/', '/', $path);
  }

  # Non-clean URLs need removing ?q=
  $path = str_replace("?q=", "", $path);
  $absolpath = realpath(file_directory_path() . '/' . $galleryfolder);

  #$result .= $absolpath;

  # Make an array with images in this folder, and their properties.
  $temp = load_dir_to_array($absolpath, $imagewidth, $fullresolutionmaxwidth, $brilliant_gallery_sort);
  $retval_dimensions = $temp[0];
  $imagemaxh = $temp[1];
  $maxpoct = count($retval_dimensions);
  if (arg(2) == 'edit') {

    #print_r( $retval_dimensions );
  }

  # Get a list of images that are forbidden from display.

  #$uid=$user->uid;
  $excludedimgs = array();

  // any checkbox id that starts with user- we remember the current user's settings
  // any other id is global and we use user=0

  /*
  $result=db_query("select qid,state from brilliant_gallery_checklist ".
                   " where nid='$nid' and qid not like 'user-%' and user=0 ".
                   " union ".
                   "select qid,state from brilliant_gallery_checklist ".
                   "where nid='$nid' and qid like 'user-%' and user='$uid' ");
  */
  $dbresult = db_query("select qid from brilliant_gallery_checklist where qid like 'user-%' and state='1' ");
  while ($data = db_fetch_object($dbresult)) {
    $excludedimgs[] = $data->qid;
  }

  #print_r($excludedimgs);

  # Total 'width' controls the number of thumbnails in each row. The number, in pixels, should be calculated thusly: [maximum width desired for thumbnails] + [padding - if any, x 2] + [margin - if any, x 2] + [border - if any, x 2] x [number of thumbnails desired in each row]
  $style_ul = "font-size:0; margin:0px; padding:0px; width: " . ($imagewidth + 2 * $padding) * $columns . "px;";
  $column_count = 0;

  #$pocetobr = 0;
  $setname = mt_rand(1, 9999999);

  #$result .= '<!-- Brilliant Gallery Table Beginning --><table border="0" rules="none" frame="box" cellpadding="0" cellspacing="0" bgcolor="' . $bgcolour . '"';
  $result .= '<!-- Brilliant Gallery Table Beginning -->';

  #$result .= '<ul class="brilliant_gallery" style="' . $style_ul . '">';
  $result .= '<ul style="' . $style_ul . '">';

  #if ( $thisfolder <> '' ) {

  #$result .= ' align="center"';

  #   }

  #$result .= ' style="width:' . $columns*$imagewidth . 'px;">'; #cell-spacing: 5px;

  #$result .= ' style="width:' . $columns*$imagewidth . 'px;"';

  #$result .= '>' . "\n"; #cell-spacing: 5px;
  $maxpoct_show = '';
  if ($maximumnumbertoshow != '' and is_numeric($maximumnumbertoshow)) {
    $maxpoct_show = $maximumnumbertoshow;
  }

  
  $retval = array();
  $cnt = 0;
  for ($poct = 1; $poct <= $maxpoct; $poct++) {

    # Skip any images that were excluded from display.

    # md5() must be made of the main gallery path etc. ending with the file name (unique identifier). E.g. albums/2008/20080321-25_belgicko_zasypane_snehom/dsc02784_w1000.jpg
    if (array_search('user-' . md5($galleryfolder . '/' . $retval_dimensions[$poct - 1]['file']), $excludedimgs) !== false) {
      continue;
    }
    if ($poct < $beginfromoverride) {
      continue;

      # Begin only from $beginfromoverride image.
    }
    $cnt += 1;
    if ($cnt > $maxpoct_show and $maxpoct_show != '') {
      continue;

      # Do not show more than $maxpoct_show (if defined).
    }
    $retval[$poct - 1] = $retval_dimensions[$poct - 1]['file'];
    $fullimgpath = $path . '/' . $retval[$poct - 1];

    #if ($column_count == 0) { $result .= ('<tr>'); }

    #$result .= ('<td align="center" bgcolor="' . $bgcolour . '" style="padding: ' . $padding . 'px ' . $padding . 'px ' . $padding . 'px ' . $padding . 'px;vertical-align: middle;">');

    #$result .= ('<td align="center" bgcolor="' . $bgcolour . '" style="padding: ' . $padding . 'px ' . $padding . 'px ' . $padding . 'px ' . $padding . 'px;vertical-align: middle;">' . "\n");

    #$pocetobr += 1;
    if (testext($retval[$poct - 1])) {
      $caption = str_replace(array(
        '.',
        '_',
      ), ' ', basename($retval[$poct - 1], strrchr($retval[$poct - 1], '.')));

      #$smallenough = false;
      $imgw = $retval_dimensions[$poct - 1]['imgw'];
      $imgh = $retval_dimensions[$poct - 1]['imgh'];
      $imgwbig = $retval_dimensions[$poct - 1]['imgwbig'];
      $imghbig = $retval_dimensions[$poct - 1]['imghbig'];
      $smallenough = $retval_dimensions[$poct - 1]['smallenough'];

      #$style_li = "float: left; list-style: none; background: #000; width: 44px; height: 33px; padding: 4px; text-align: center; margin: 0; border: none;";
      $style_li = "font-size:0; float: left; width: " . $imagewidth . "px; list-style: none; background: " . $bgcolour . "; height: " . $imagemaxh . "px; padding: " . $padding . "px; text-align: center; margin: 0px; border: none;";
      $result .= '<li style="' . $style_li . '">' . "\n";

      # Get this module's path:
      $modulepath = url(drupal_get_path('module', 'brilliant_gallery'), array(
        'absolute' => TRUE,
      ));

      # url() ads i18n codes to the URL ... we need to remove them here...
      if ($langcode != '') {
        $modulepath = str_replace('/' . $langcode . '/', '/', $modulepath);
      }

      # Non-clean URLs need removing ?q=
      $modulepath = str_replace("?q=", "", $modulepath);
      if ($smallenough === true) {
        $result .= '<a href="' . $fullimgpath . '"';
      }
      else {

        # Important to begin with the "/" otherwise thumbnails in non-root folders fail. See http://drupal.org/node/175292

        #$result .= '<a href="' . $modulepath .'/image.php?imgp=' . base64_encode( $absolpath . '/' . $retval[$poct-1] ) . '&amp;imgw=' . $imgwbig . '&amp;imgh=' . $imghbig . '"'; #&dummy=.jpg

        #&dummy=.jpg
        $result .= '<a href="' . $modulepath . '/image.php?imgp=' . base64_encode($absolpath . '/' . $retval[$poct - 1]) . '&imgw=' . $imgwbig . '&imgh=' . $imghbig . '"';
      }
      switch ($overbrowser) {
        case 'thickbox':
          $result .= ' class="thickbox"';
          $result .= ' rel="img_' . $setname . '"';

          #$attributes['class'] = $link_class;

          #$attributes['rel'] = 'img_' . ($node->nid? $node->nid: time()); // 'insert' has no $node->nid
          break;
        case 'lightbox':
          $result .= ' rel="lightbox[' . $setname . ']"';

          #$attributes['rel'] = 'lightbox[' . ($node->nid? $node->nid: time()) . ']'; // 'insert' has no $node->nid
          break;
        case 'greyboxr':
          $result .= ' class="greybox"';

          #$result .= ' rel="gb_imageset[' . $setname . ']"';
          break;
        default:
          break;
      }
      if ($showcaption != '') {
        if ($showcaption != 'filename') {
          $caption = $showcaption;
        }
        $result .= ' title="' . $caption . '"';
      }
      $result .= '>';

      # Important to begin with the "/" otherwise thumbnails in non-root folders fail. See http://drupal.org/node/175292

      /*
                               $modulepath = url(drupal_get_path('module', 'brilliant_gallery'), array('absolute' => TRUE));
                               # url() ads i18n codes to the URL ... we need to remove them here...
                                 if ( $langcode <> '' ) {
                                      $modulepath = str_replace( '/' . $langcode . '/', '/', $modulepath );
                                    }
                               # Non-clean URLs need removing ?q=
                                 $modulepath = str_replace( "?q=", "",  $modulepath );
      */

      #$result .= '<img style="display: block;border:0" src="' . $modulepath .'/image.php?imgp=' . base64_encode( $absolpath . '/' . $retval[$poct-1] ) . '&imgw=' . $imgw . '&imgh=' . $imgh . '" />'; # width="' . $imgw . '"

      #$result .= '<img style="border: 0; margin:0px; padding:0px;" alt="" src="' . $modulepath .'/image.php?imgp=' . base64_encode( $absolpath . '/' . $retval[$poct-1] ) . '&amp;imgw=' . $imgw . '&amp;imgh=' . $imgh . '" />'; # width="' . $imgw . '"

      # width="' . $imgw . '"
      $result .= '<img style="border: 0; margin:0px; padding:0px;" alt="" src="' . $modulepath . '/image.php?imgp=' . base64_encode($absolpath . '/' . $retval[$poct - 1]) . '&imgw=' . $imgw . '&imgh=' . $imgh . '" />';

      #$result .= '</a>';
      $result .= '</a>' . "\n";
    }
    else {
      $result .= '<a href="' . $fullimgpath . '">';

      #$result .= '<center>' . $retval[$poct-1] . '</center>';
      $result .= $retval[$poct - 1];

      #brokenimage("Error loading PNG");

      #$result .= '</a>';
      $result .= '</a>' . "\n";
    }

    #$result .= '</td>';
    $result .= '</li>' . "\n";
    $column_count += 1;

    #if ($column_count == $columns) { $result .= ("</tr>\n"); $column_count = 0; }
  }

  #if ($column_count <> 0) { $result .= ("</tr>"); }

  #if ($column_count <> 0) { $result .= ("</tr>\n"); }

  #$result .= "</table>\n";
  $result .= "</ul>\n";

  #$result .= '<br style="clear: both;" />';

  #$result .= '<p>';
  return $result;
}
function load_dir_to_array($absolpath, $imagewidth, $fullresolutionmaxwidth, $brilliant_gallery_sort) {

  # Load Directory Into Array
  $poct = -1;
  $retval_dimensions = array();
  $handle = opendir($absolpath);
  $imagemaxh = 0;
  while ($file = readdir($handle)) {
    $testending = strtolower(substr($file, -4, 4));
    if (!testext($file) and strtolower($testending) != '.mpg' and strtolower($testending) != '.swf' and strtolower($testending) != '.mov') {
      continue;
    }

    # Index of a real image or something we are going to display.
    $poct += 1;

    #$retval[$poct] = $file;
    $retval_dimensions[$poct]['file'] = $file;

    # Is image horizontally or vertically oriented?
    $temp = getimagesize($absolpath . '/' . $file);
    if ($temp === false) {
      continue;
    }
    if ($temp[0] - $temp[1] >= 0) {

      # this is a horizontal image
      $retval_dimensions[$poct]['imgw'] = $imagewidth;
      $retval_dimensions[$poct]['imgh'] = round($temp[1] / $temp[0] * $imagewidth);
      if ($temp[0] > $fullresolutionmaxwidth) {
        $retval_dimensions[$poct]['imgwbig'] = $fullresolutionmaxwidth;
        $retval_dimensions[$poct]['imghbig'] = round($temp[1] / $temp[0] * $fullresolutionmaxwidth);
      }
      else {
        $retval_dimensions[$poct]['smallenough'] = true;
      }

      #$result .= $imgw . ' / ' . $imgh;
    }
    else {

      # this is a vertical image .... a
      $retval_dimensions[$poct]['imgw'] = round($temp[0] / $temp[1] * ($temp[0] / $temp[1]) * $imagewidth);
      $retval_dimensions[$poct]['imgh'] = round($temp[0] / $temp[1] * $imagewidth);
      if ($temp[0] > $fullresolutionmaxwidth) {
        $retval_dimensions[$poct]['imgwbig'] = round($temp[0] / $temp[1] * ($temp[0] / $temp[1]) * $fullresolutionmaxwidth);
        $retval_dimensions[$poct]['imghbig'] = round($temp[0] / $temp[1] * $fullresolutionmaxwidth);
      }
      else {
        $retval_dimensions[$poct]['smallenough'] = true;
      }

      #$result .= $imgw . ' / ' . $imgh;
    }
    if ($imagemaxh < $retval_dimensions[$poct]['imgh']) {
      $imagemaxh = $retval_dimensions[$poct]['imgh'];
    }
  }
  @closedir($handle);
  if ($brilliant_gallery_sort == '1') {
    @sort($retval_dimensions);
  }
  else {
    shuffle($retval_dimensions);
  }
  return array(
    $retval_dimensions,
    $imagemaxh,
  );
}

# Implementation of hook_filter().
function brilliant_gallery_filter($op, $delta = 0, $format = -1, $text = '') {
  switch ($op) {
    case 'no cache':

      # See http://drupal.org/node/194318#comment-640952
      return true;
    case 'list':
      return array(
        0 => t('Brilliant Gallery Tag'),
      );
    case 'description':
      return t('Substitutes a special Brilliant Gallery Tag with the actual gallery table.');
    case 'prepare':
      return $text;
    case 'process':

      # process it here........
      $text = replace_brilliant_gallery_tags($text);
      return $text;
  }
}
function replace_brilliant_gallery_tags($str) {

  # [bg|path/to/gallery_folder|colcountoverride|widthoverride|sortorrandomoverride|maximumnumbertoshow|colouroverride|beginfromoverride|caption-yes-no-text]

  # no slashes around this path!
  $matchlink = '';
  $orig_match = '';
  preg_match_all("/(\\[)bg(\\|).*(\\])/", $str, $matches);
  foreach ($matches[0] as $match) {
    $orig_match[] = $match;
    $match = substr($match, 1, strlen($match) - 2);
    $match = explode("|", $match);
    $matchlink[] = render_brilliant_gallery($match[1], $match[2], $match[3], $match[4], $match[5], $match[6], $match[7], $match[8]);
  }
  $str = str_replace($orig_match, $matchlink, $str);
  return $str;
}
function cleantmpdir() {

  # Delete "bg_*" files from the temp directory if they are expired.

  # Cache expiration time. This is primarily set in image.php - use the same value here.
  $bgcachexpire = 3600 * 24 * 3;
  $directory = file_directory_temp();
  if (!($dirhandle = @opendir($directory))) {
    return;
  }
  while (false !== ($filename = readdir($dirhandle))) {
    if ($filename != "." && $filename != ".." && substr($filename, 0, 3) == 'bg_') {
      $filename = $directory . "/" . $filename;

      #echo $filename . ' ';
      if (@filemtime($filename) < time() - $bgcachexpire) {
        @unlink($filename);
      }
    }
  }
}
function testext($filename) {
  if (substr(strtolower($filename), -4, 4) == ".jpg" or substr(strtolower($filename), -5, 5) == ".jpeg" or substr(strtolower($filename), -4, 4) == ".gif" or substr(strtolower($filename), -4, 4) == ".png") {
    return true;
  }

  # Otherwise return false.
  return false;
}

/**
 * Implementation of hook_filter_tips().
 *
 * This hook allows filters to provide help text to users during the content
 * editing process. Short tips are provided on the content editing screen, while
 * long tips are provided on a separate linked page. Short tips are optional,
 * but long tips are highly recommended.
 */

/*
function brilliant_gallery_filter_tips($delta, $format, $long = FALSE) {
  switch ($delta) {
    case 0:
      if ($long) {
        return t('Every instance of "foo" in the input text will be replaced with "%replacement".', array('%replacement' => variable_get('filter_example_foo_'. $format, 'bar')));
      }
      break;

    case 1:
      if ($long) {
        return t('Every instance of the special &lt;time /&gt; tag will be replaced with the current date and time in the user\'s specified time zone.');
      }
      else {
        return t('Use &lt;time /&gt; to display the current date/time.');
      }
      break;
  }
}
*/