<?
/* block-random.php, as modified
*  
*  See: http://www.barcahall.com/gallery-block-random.html
* 
*  for info and usage instructions.
*  
*/



/*
* 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.
*/

// 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;
    }
}

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";

$album = chooseAlbum();

if ($album) {
    $index = choosePhoto($album);
}

if (isset($index)) {
    $id = $album->getPhotoId($index);
    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>";
    }
    
    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 {
    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($album) {
    global $cache;

    $count = $cache[$album->fields["name"]];
    if ($count == 0) {
    // Shouldn't happen
    return null;
    } else if ($count == 1) {
    $choose = 1;
    } else {
    $choose = rand(1, $count);
    $wrap = 0;
    if ($album->isHidden($choose)) {
        $choose++;
        if ($choose > $album->numPhotos(1)) {
        $choose = 1;
        $wrap++;

        if ($wrap = 2) {
            return null;
        }
        }
    }
    }

    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;

    $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;
        }
    }
    }
}
?>


