<?php
/* $Id: brilliant_gallery.module,v 1.49 2008/05/05 23:24:20 tjfulopp Exp $ */

sess_write('vacilando', 'this is a test');

if ( module_exists('views') ) {
     require(drupal_get_path('module', 'brilliant_gallery') .'/views.inc');
   }

/**
* 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($section='') {

  $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() {

return array('access brilliant_gallery'); #, 'administer 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() {
  // content variable that will be returned for display
  $page_content = '';

  $page_content .= render_brilliant_gallery();

  return $page_content;
}


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_title'] = array(
    '#type' => 'checkbox',
    '#title' => t('Show file\'s "Description" field instead of displaying of file name'),
    '#default_value' => variable_get('brilliant_gallery_title', '1'),
    '#returl_value' => '1', 
    '#description' => t("Check this if you want to show custom caption for image. Note that this file should be attached to some page at your Drupal site, so you can change it there. If no title specified or file isn't attached to a node, filename will be shown.")
  );
  $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).')),
    #'#description' => t("")
  );
  $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: " . url("admin/user/access", NULL, "module-brilliant_gallery", TRUE));
           exit();
         }

function brilliant_gallery_menu() {

  $items = array();

  $items[] = array(
    'path' => 'admin/settings/brilliant_gallery',
    'title' => t('Brilliant gallery'),
    'description' => t('Brilliant gallery module settings'),
    'callback' => 'drupal_get_form',
    'callback arguments' => 'brilliant_gallery_admin',
    'access' => user_access('access administration pages'),
    'type' => MENU_NORMAL_ITEM,
   );

  # Probably not the right way of doing it but it works...
    $items[] = array(
      'path' => 'admin/settings/brilliant_gallery/brilliant_gallery_perms',
      #'path' => 'admin/user/access#module-brilliant_gallery',
      'title' => t('Configure permissions'),
      'description' => t('Configure access permissions for the Brilliant gallery module'),
      'callback' => 'brilliant_gallery_perms',
      #'callback arguments' => 'brilliant_gallery_perms',
      'access' => user_access('access administration pages'),
      'type' => MENU_NORMAL_ITEM,
     );

  $items[] = array(
    'path' => 'brilliant_gallery',
    'title' => t('Brilliant gallery'),
    'callback' => 'brilliant_gallery_all',
    'access' => user_access('access brilliant_gallery'),
    '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.

  return $items;
}

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(variable_get('brilliant_gallery_title', '1')) {
          $showtitle = TRUE;
        }
        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');
        $fullresolutionmaxwidth = variable_get('brilliant_gallery_maxwidth', '1000'); # Totally full resolution display would be impractical, so this is the maximum width of "full" resolution.
        $path = url(file_directory_path() . '/' . $galleryfolder, NULL, NULL, 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;

        # 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; }
                  $poct += 1; # Index of a real image or something we are going to display.
                  #$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 );
          $maxpoct = count( $retval_dimensions );
          if ( $brilliant_gallery_sort == '1' ) {
               sort( $retval_dimensions );
             } else {
               shuffle( $retval_dimensions );
             }
          #print_r( $retval_dimensions );

        $style_ul = "width: " . ( ( $imagewidth + 2*$padding ) * $columns ) . "px;"; # 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]
        $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(); # Thanks to Micha� Albrecht!
        $cnt = 0;
        for ( $poct = 1; $poct <= $maxpoct; $poct++ ) {
               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; 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'), NULL, NULL, 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
                            }

                         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($showtitle) {
                           $__result = db_fetch_array(db_query('SELECT description FROM {file_revisions} WHERE fid=(SELECT fid FROM files WHERE filepath="%s")', file_directory_path() . '/' . $galleryfolder . $retval_dimensions[$poct-1]['file']));
                           if($__result['description'])
                             $result .= 'title="' . htmlspecialchars($__result['description']) . '"';
                         } 
                         if ( !$title && $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'), NULL, NULL, 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" alt="" src="' . $modulepath .'/image.php?imgp=' . base64_encode( $absolpath . '/' . $retval[$poct-1] ) . '&amp;imgw=' . $imgw . '&amp;imgh=' . $imgh . '"' . (($showtitle && $title)? ' title="' . $title . '"': '') . ' />'; # width="' . $imgw . '"
                         #$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;
   }


# Implementation of hook_filter().
function brilliant_gallery_filter($op, $delta = 0, $format = -1, $text = '') {
  switch ($op) {
    case 'no cache':
      return true; # See http://drupal.org/node/194318#comment-640952

    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.
        $bgcachexpire = 3600*24*3; # Cache expiration time. This is primarily set in image.php - use the same value here.
        $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;

                        if( @filemtime($filename) < (time()-$bgcachexpire) )
                                #echo $filename . ' ';
                                @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;
       }

function brokenimage($msg) {
         $im  = imagecreatetruecolor(150, 30);
         $bgc = imagecolorallocate($im, 0, 0, 0);
         $tc  = imagecolorallocate($im, 255, 255, 255);
         imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
         imagestring($im, 1, 5, 5, $msg, $tc);
         imagejpeg($im);
         exit();
         }


/**
 * 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;
  }
}
*/
