mholtum
06-25-2004, 03:00 PM
This module will display a random image on your portal using Gallery.
Copy and paste the entire contents into a file named "block-random.php" and FTP it or otherwise place it in your Gallery installation directory.
<?
/*
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2001 Bharat Mediratta
*
* 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; either version 2 of the License, or (at
* your option) any later version.
*
* 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.
*/
/*
* This block selects a random photo for display. It will only display photos
* from albums that are visible to the public. It will not display hidden
* photos.
*
* Once a day (or whatever you set CACHE_EXPIRED to) we scan all albums and
* create a cache file listing each public album and the number of photos it
* contains. For all subsequent attempts we use that cache file. This means
* that if you change your albums around it may take a day before this block
* starts (or stops) displaying them.
*/
/*
* With Barca-Hall modifications
*
* Latest revision: 8-Jun-2004 to clean-up HTML output to pass W3C validation.
*
*
* See: http://www.barcahall.com/gallery-block-random.html.
*/
// Hack prevention.
if (!empty($HTTP_GET_VARS["GALLERY_BASEDIR"]) ||
!empty($HTTP_POST_VARS["GALLERY_BASEDIR"]) ||
!empty($HTTP_COOKIE_VARS["GALLERY_BASEDIR"])) {
print "Security violation\n";
exit;
}
require($GALLERY_BASEDIR . "init.php");
if ($profile) {
$timer = time();
}
/* Initializing the seed */
srand ((double) microtime() * 1000000);
define(CACHE_FILE, $gallery->app->albumDir . "/block-random.cache");
define(CACHE_EXPIRED, 86400);
// Check the cache file to see if it's up to date
$rebuild = 1;
if (fs_file_exists(CACHE_FILE)) {
$stat = fs_stat(CACHE_FILE);
$mtime = $stat[9];
if (time() - $mtime < CACHE_EXPIRED) {
$rebuild = 0;
}
}
// Only select sub-albums that Everybody can access
$everybody = $gallery->userDB->getEverybody();
if ($rebuild) {
scanAlbums();
saveCache();
} else {
readCache();
}
// Parameter: size
// Specify that the thumbnail image should be resized when displayed,
// to fit a specific dimension in both height and width. Aspect ratio is maintained.
// Intended to reduce the size of images, but if the size specified is larger than either thumbnail dimension,
// the image will be enlarged (with a corresponding loss of quality.)
// Note: This does not create an additional thumbnail, nor does it alter the existing thumbnail;
// the image is dynamically scaled by the browser when rendered.
// Example: size=75
// Default: 0, meaning no resize.
if (!empty($HTTP_GET_VARS["size"]))
$size = $HTTP_GET_VARS["size"];
else
$size = 0;
// Parameter: domain
// Specify the value to which document.domain should be set.
// Not needed if this page and the page calling it are on the same server.
// Allows the page embedding this random photo page to resize the containing IFRAME,
// when the two pages are on different servers, but within a common domain (e.g. "www.foo.com" and "gallery.foo.com").
// The value specified must be the common suffix of the two server names, cannot be simply ".com",
// and the calling page must set its document.domain to the same value.
// Example: domain=foo.com
// Default: none. If not specified, no document.domain statement will be executed.
if (!empty($HTTP_GET_VARS["domain"]))
$domain = $HTTP_GET_VARS["domain"];
// Parameter: target
// Specify the value to be used in the target= attribute of the A tag.
// Example: target=_top
// Default: _blank
if (!empty($HTTP_GET_VARS["target"]))
$targetAttr = "target=\"".$HTTP_GET_VARS["target"] ."\"";
else
$targetAttr = "target=\"_blank\"";
// Parameter: album
// Limit the photo block to only one album (including its sub-albums).
// Example: album=nytrip
// Default: none. If not specified, all visible albums will be used.
if (!empty($HTTP_GET_VARS["album"]))
{
$album = new Album();
$album->load($HTTP_GET_VARS["album"]);
}
else
$album = chooseAlbum();
if ($album) {
$index = choosePhoto();
}
if (!$GALLERY_EMBEDDED_INSIDE) {
echo "<head>"
.getStyleSheetLink();
echo "<style type=\"text/css\">";
echo "BODY { margin:0 0; }";
if ($album->fields["bgcolor"]) {
echo "BODY { background-color:".$album->fields[bgcolor]."; }";
}
if ($album->fields["textcolor"]) {
echo "BODY {color:".$album->fields[textcolor]."; }";
}
echo "</style>";
if ($domain) {
echo "<script language='JavaScript'>document.domain='$domain';</script>";
}
echo "</head>";
}
if (isset($index)) {
$id = $album->getPhotoId($index);
echo "<center>"
."<a href=\"" .makeAlbumUrl($album->fields["name"], $id) ."\" $targetAttr>"
.$album->getThumbnailTag($index,$size)
."</a>";
$caption = $album->getCaption($index);
echo "<span class=caption>";
if ($caption) {
echo "<br>$caption";
}
echo "<br><i>From: </i>"
."<a href=\"" .makeAlbumUrl($album->fields["name"]) ."\" $targetAttr>"
.$album->fields["title"]
."</a></span></center></body>";
} else
{
// No photo chosen. Provide link to album itself, otherwise to top-level of gallery.
if ($album) {
echo "<center>"
."<a href=\"" .makeAlbumUrl($album->fields["name"]) ."\" $targetAttr>"
.$album->getHighlightAsThumbnailTag($size)
."</a><span class=caption><br>"
."<a href=\"" .makeAlbumUrl($album->fields["name"]) ."\" $targetAttr>"
.$album->fields["title"]
."</a></span></center></body>";
} else {
print "<center><a href=\"" . makeGalleryUrl("albums.php") . "\" $targetAttr>" . $gallery->app->galleryTitle . "</a></center>";
}
// print "No photo chosen.";
}
if ($profile) {
$elapsed = time() - $timer;
print "<br>Elapsed: $elapsed secs";
}
/*
* --------------------------------------------------
* Support functions
* --------------------------------------------------
*/
function saveCache() {
global $cache;
if ($fd = fs_fopen(CACHE_FILE, "w")) {
foreach ($cache as $key => $val) {
fwrite($fd, "$key/$val\n");
}
fclose($fd);
}
}
function readCache() {
global $cache;
if ($fd = fs_fopen(CACHE_FILE, "r")) {
while ($line = fgets($fd, 4096)) {
list($key, $val) = explode("/", $line);
$cache[$key] = trim($val);
}
fclose($fd);
}
}
function choosePhoto() {
global $cache;
global $album;
$count = $cache[$album->fields["name"]];
if ($count == 0) {
// Shouldn't happen
return null;
} else if ($count == 1) {
$choose = 1;
} else {
$choose = rand(1, (int) $count);
$wrap = 0;
// Skip an item in the album if it is Private (a hidden photo, or a protected sub-album)
while ( isPrivate($album, $choose) ) {
$choose++;
if ($choose > $count) {
$choose = 1;
$wrap++;
if ($wrap == 2) {
return null;
}
}
}
}
/*
* If we've picked a sub-album, then
* make it the chosen album, and
* recursively choose a photo from *it*
*/
$isSubAlbum = FALSE;
$subAlbumName = '';
// Backwards compatibility was lost in v1.4.3
if (method_exists($album, 'isAlbum')) {
// Gallery v1.4.3 or later
if ( $album->isAlbum($choose) ) {
$isSubAlbum = TRUE;
$subAlbumName = $album->getAlbumName($choose);
}
}
else {
// Gallery v1.4.2 or earlier
if ( $album->isAlbumName($choose) ) {
$isSubAlbum = TRUE;
$subAlbumName = $album->isAlbumName($choose);
}
}
if ( $isSubAlbum ) {
$album->load($subAlbumName);
return choosePhoto();
}
return $choose;
}
function chooseAlbum() {
global $cache;
/*
* The odds that an album will be selected is proportional
* to the number of (visible) items in the album.
*/
$total = 0;
foreach ($cache as $name => $count) {
if (!$choose) {
$choose = $name;
}
$total += $count;
if ($total != 0 && ($total == 1 || rand(1, $total) <= $count)) {
$choose = $name;
}
}
if ($choose) {
$album = new Album();
$album->load($choose);
return $album;
} else {
return null;
}
}
function scanAlbums() {
global $cache;
global $gallery;
global $everybody;
$cache = array();
// $everybody = $gallery->userDB->getEverybody();
$albumDB = new AlbumDB();
foreach ($albumDB->albumList as $tmpAlbum) {
if ($everybody->canReadAlbum($tmpAlbum)) {
$seeHidden = $everybody->canWriteToAlbum($tmpAlbum);
$numPhotos = $tmpAlbum->numPhotos($seeHidden);
$name = $tmpAlbum->fields["name"];
if ($numPhotos > 0) {
$cache[$name] = $numPhotos;
}
}
}
}
function isPrivate($alb, $idx) {
global $everybody;
$isSubAlbum = FALSE;
$subAlbumName = '';
if (method_exists($alb, 'isAlbum')) {
// Gallery v1.4.3 or later
$isSubAlbum = $alb->isAlbum($idx);
$subAlbumName = $alb->getAlbumName($idx);
}
else {
// Gallery v1.4.2 or earlier
$isSubAlbum = $alb->isAlbumName($idx);
$subAlbumName = $alb->isAlbumName($idx);
}
if ( $isSubAlbum ) {
$tmpAlb = new Album();
$tmpAlb->load($subAlbumName);
return ! $everybody->canReadAlbum($tmpAlb);
}
return $alb->isHidden($idx);
}
?>
Copy and paste the entire contents into a file named "block-random-support.js", and FTP it or otherwise place it in the docroot of your web server (not in your Gallery installation directory). You then must reference this file in the HTML Head of the page on which you want to display random images. Do this by placing the following line of code into the HEAD of your page (just above the closing </HEAD> is a good place), adjusting the SRC pathname as needed for your installation: script language="JavaScript" type="text/javascript" SRC="/block-random-support.js"></script>
// document.domain='yourdomain.com'; // Uncomment and edit if Access is Denied runtime JavaScript error occurs
function iFrameHeight(obj) {
aID = obj.id;
// if contentDocument exists, W3C compliant (Mozilla)
if (document.getElementById(aID).contentDocument){
obj.height = document.getElementById(aID).contentDocument.body.scrollHeight;
} else {
// IE
obj.style.height = document.frames[aID].document.body.scrollHeight;
}
}
Create a Template named adv_portal_random
<!-- Random Gallery Block -->
<script language="JavaScript" type="text/javascript" SRC="http://www.ravensrealm.net/block-random-support.js"></script>
<table align="center" border="0" cellpadding="$stylevar[cellpadding]" cellspacing="$stylevar[cellspacing]" class="tborder" width="100%">
<thead>
<tr>
<td class="tcat"><span class="smallfont"><strong>$vba_options[portal_blockbullet] Random Image </strong></span></td>
</tr>
</thead>
<tr>
<td class="$getbgrow" width="100%" align="center">
<IFRAME id="blockrandom1"
name="blockrandom1"
onLoad="iFrameHeight(this);"
src="http://yourdomain.com/gallery/block-random.php?size=125&target=_top"
width="125"
height="120" align=top scrolling=no frameborder=0>
[This feature requires IFRAME.]</IFRAME>
</td>
</tr>
</table>
<br />
<!-- End Random Gallery Block -->
Create a Module:
Module Title: Random Images (or whatever you want_
Module Identifier: Blank
File to include: None
Template to include random
Activate and place where you wish!
Copy and paste the entire contents into a file named "block-random.php" and FTP it or otherwise place it in your Gallery installation directory.
<?
/*
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2001 Bharat Mediratta
*
* 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; either version 2 of the License, or (at
* your option) any later version.
*
* 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.
*/
/*
* This block selects a random photo for display. It will only display photos
* from albums that are visible to the public. It will not display hidden
* photos.
*
* Once a day (or whatever you set CACHE_EXPIRED to) we scan all albums and
* create a cache file listing each public album and the number of photos it
* contains. For all subsequent attempts we use that cache file. This means
* that if you change your albums around it may take a day before this block
* starts (or stops) displaying them.
*/
/*
* With Barca-Hall modifications
*
* Latest revision: 8-Jun-2004 to clean-up HTML output to pass W3C validation.
*
*
* See: http://www.barcahall.com/gallery-block-random.html.
*/
// Hack prevention.
if (!empty($HTTP_GET_VARS["GALLERY_BASEDIR"]) ||
!empty($HTTP_POST_VARS["GALLERY_BASEDIR"]) ||
!empty($HTTP_COOKIE_VARS["GALLERY_BASEDIR"])) {
print "Security violation\n";
exit;
}
require($GALLERY_BASEDIR . "init.php");
if ($profile) {
$timer = time();
}
/* Initializing the seed */
srand ((double) microtime() * 1000000);
define(CACHE_FILE, $gallery->app->albumDir . "/block-random.cache");
define(CACHE_EXPIRED, 86400);
// Check the cache file to see if it's up to date
$rebuild = 1;
if (fs_file_exists(CACHE_FILE)) {
$stat = fs_stat(CACHE_FILE);
$mtime = $stat[9];
if (time() - $mtime < CACHE_EXPIRED) {
$rebuild = 0;
}
}
// Only select sub-albums that Everybody can access
$everybody = $gallery->userDB->getEverybody();
if ($rebuild) {
scanAlbums();
saveCache();
} else {
readCache();
}
// Parameter: size
// Specify that the thumbnail image should be resized when displayed,
// to fit a specific dimension in both height and width. Aspect ratio is maintained.
// Intended to reduce the size of images, but if the size specified is larger than either thumbnail dimension,
// the image will be enlarged (with a corresponding loss of quality.)
// Note: This does not create an additional thumbnail, nor does it alter the existing thumbnail;
// the image is dynamically scaled by the browser when rendered.
// Example: size=75
// Default: 0, meaning no resize.
if (!empty($HTTP_GET_VARS["size"]))
$size = $HTTP_GET_VARS["size"];
else
$size = 0;
// Parameter: domain
// Specify the value to which document.domain should be set.
// Not needed if this page and the page calling it are on the same server.
// Allows the page embedding this random photo page to resize the containing IFRAME,
// when the two pages are on different servers, but within a common domain (e.g. "www.foo.com" and "gallery.foo.com").
// The value specified must be the common suffix of the two server names, cannot be simply ".com",
// and the calling page must set its document.domain to the same value.
// Example: domain=foo.com
// Default: none. If not specified, no document.domain statement will be executed.
if (!empty($HTTP_GET_VARS["domain"]))
$domain = $HTTP_GET_VARS["domain"];
// Parameter: target
// Specify the value to be used in the target= attribute of the A tag.
// Example: target=_top
// Default: _blank
if (!empty($HTTP_GET_VARS["target"]))
$targetAttr = "target=\"".$HTTP_GET_VARS["target"] ."\"";
else
$targetAttr = "target=\"_blank\"";
// Parameter: album
// Limit the photo block to only one album (including its sub-albums).
// Example: album=nytrip
// Default: none. If not specified, all visible albums will be used.
if (!empty($HTTP_GET_VARS["album"]))
{
$album = new Album();
$album->load($HTTP_GET_VARS["album"]);
}
else
$album = chooseAlbum();
if ($album) {
$index = choosePhoto();
}
if (!$GALLERY_EMBEDDED_INSIDE) {
echo "<head>"
.getStyleSheetLink();
echo "<style type=\"text/css\">";
echo "BODY { margin:0 0; }";
if ($album->fields["bgcolor"]) {
echo "BODY { background-color:".$album->fields[bgcolor]."; }";
}
if ($album->fields["textcolor"]) {
echo "BODY {color:".$album->fields[textcolor]."; }";
}
echo "</style>";
if ($domain) {
echo "<script language='JavaScript'>document.domain='$domain';</script>";
}
echo "</head>";
}
if (isset($index)) {
$id = $album->getPhotoId($index);
echo "<center>"
."<a href=\"" .makeAlbumUrl($album->fields["name"], $id) ."\" $targetAttr>"
.$album->getThumbnailTag($index,$size)
."</a>";
$caption = $album->getCaption($index);
echo "<span class=caption>";
if ($caption) {
echo "<br>$caption";
}
echo "<br><i>From: </i>"
."<a href=\"" .makeAlbumUrl($album->fields["name"]) ."\" $targetAttr>"
.$album->fields["title"]
."</a></span></center></body>";
} else
{
// No photo chosen. Provide link to album itself, otherwise to top-level of gallery.
if ($album) {
echo "<center>"
."<a href=\"" .makeAlbumUrl($album->fields["name"]) ."\" $targetAttr>"
.$album->getHighlightAsThumbnailTag($size)
."</a><span class=caption><br>"
."<a href=\"" .makeAlbumUrl($album->fields["name"]) ."\" $targetAttr>"
.$album->fields["title"]
."</a></span></center></body>";
} else {
print "<center><a href=\"" . makeGalleryUrl("albums.php") . "\" $targetAttr>" . $gallery->app->galleryTitle . "</a></center>";
}
// print "No photo chosen.";
}
if ($profile) {
$elapsed = time() - $timer;
print "<br>Elapsed: $elapsed secs";
}
/*
* --------------------------------------------------
* Support functions
* --------------------------------------------------
*/
function saveCache() {
global $cache;
if ($fd = fs_fopen(CACHE_FILE, "w")) {
foreach ($cache as $key => $val) {
fwrite($fd, "$key/$val\n");
}
fclose($fd);
}
}
function readCache() {
global $cache;
if ($fd = fs_fopen(CACHE_FILE, "r")) {
while ($line = fgets($fd, 4096)) {
list($key, $val) = explode("/", $line);
$cache[$key] = trim($val);
}
fclose($fd);
}
}
function choosePhoto() {
global $cache;
global $album;
$count = $cache[$album->fields["name"]];
if ($count == 0) {
// Shouldn't happen
return null;
} else if ($count == 1) {
$choose = 1;
} else {
$choose = rand(1, (int) $count);
$wrap = 0;
// Skip an item in the album if it is Private (a hidden photo, or a protected sub-album)
while ( isPrivate($album, $choose) ) {
$choose++;
if ($choose > $count) {
$choose = 1;
$wrap++;
if ($wrap == 2) {
return null;
}
}
}
}
/*
* If we've picked a sub-album, then
* make it the chosen album, and
* recursively choose a photo from *it*
*/
$isSubAlbum = FALSE;
$subAlbumName = '';
// Backwards compatibility was lost in v1.4.3
if (method_exists($album, 'isAlbum')) {
// Gallery v1.4.3 or later
if ( $album->isAlbum($choose) ) {
$isSubAlbum = TRUE;
$subAlbumName = $album->getAlbumName($choose);
}
}
else {
// Gallery v1.4.2 or earlier
if ( $album->isAlbumName($choose) ) {
$isSubAlbum = TRUE;
$subAlbumName = $album->isAlbumName($choose);
}
}
if ( $isSubAlbum ) {
$album->load($subAlbumName);
return choosePhoto();
}
return $choose;
}
function chooseAlbum() {
global $cache;
/*
* The odds that an album will be selected is proportional
* to the number of (visible) items in the album.
*/
$total = 0;
foreach ($cache as $name => $count) {
if (!$choose) {
$choose = $name;
}
$total += $count;
if ($total != 0 && ($total == 1 || rand(1, $total) <= $count)) {
$choose = $name;
}
}
if ($choose) {
$album = new Album();
$album->load($choose);
return $album;
} else {
return null;
}
}
function scanAlbums() {
global $cache;
global $gallery;
global $everybody;
$cache = array();
// $everybody = $gallery->userDB->getEverybody();
$albumDB = new AlbumDB();
foreach ($albumDB->albumList as $tmpAlbum) {
if ($everybody->canReadAlbum($tmpAlbum)) {
$seeHidden = $everybody->canWriteToAlbum($tmpAlbum);
$numPhotos = $tmpAlbum->numPhotos($seeHidden);
$name = $tmpAlbum->fields["name"];
if ($numPhotos > 0) {
$cache[$name] = $numPhotos;
}
}
}
}
function isPrivate($alb, $idx) {
global $everybody;
$isSubAlbum = FALSE;
$subAlbumName = '';
if (method_exists($alb, 'isAlbum')) {
// Gallery v1.4.3 or later
$isSubAlbum = $alb->isAlbum($idx);
$subAlbumName = $alb->getAlbumName($idx);
}
else {
// Gallery v1.4.2 or earlier
$isSubAlbum = $alb->isAlbumName($idx);
$subAlbumName = $alb->isAlbumName($idx);
}
if ( $isSubAlbum ) {
$tmpAlb = new Album();
$tmpAlb->load($subAlbumName);
return ! $everybody->canReadAlbum($tmpAlb);
}
return $alb->isHidden($idx);
}
?>
Copy and paste the entire contents into a file named "block-random-support.js", and FTP it or otherwise place it in the docroot of your web server (not in your Gallery installation directory). You then must reference this file in the HTML Head of the page on which you want to display random images. Do this by placing the following line of code into the HEAD of your page (just above the closing </HEAD> is a good place), adjusting the SRC pathname as needed for your installation: script language="JavaScript" type="text/javascript" SRC="/block-random-support.js"></script>
// document.domain='yourdomain.com'; // Uncomment and edit if Access is Denied runtime JavaScript error occurs
function iFrameHeight(obj) {
aID = obj.id;
// if contentDocument exists, W3C compliant (Mozilla)
if (document.getElementById(aID).contentDocument){
obj.height = document.getElementById(aID).contentDocument.body.scrollHeight;
} else {
// IE
obj.style.height = document.frames[aID].document.body.scrollHeight;
}
}
Create a Template named adv_portal_random
<!-- Random Gallery Block -->
<script language="JavaScript" type="text/javascript" SRC="http://www.ravensrealm.net/block-random-support.js"></script>
<table align="center" border="0" cellpadding="$stylevar[cellpadding]" cellspacing="$stylevar[cellspacing]" class="tborder" width="100%">
<thead>
<tr>
<td class="tcat"><span class="smallfont"><strong>$vba_options[portal_blockbullet] Random Image </strong></span></td>
</tr>
</thead>
<tr>
<td class="$getbgrow" width="100%" align="center">
<IFRAME id="blockrandom1"
name="blockrandom1"
onLoad="iFrameHeight(this);"
src="http://yourdomain.com/gallery/block-random.php?size=125&target=_top"
width="125"
height="120" align=top scrolling=no frameborder=0>
[This feature requires IFRAME.]</IFRAME>
</td>
</tr>
</table>
<br />
<!-- End Random Gallery Block -->
Create a Module:
Module Title: Random Images (or whatever you want_
Module Identifier: Blank
File to include: None
Template to include random
Activate and place where you wish!