view mgallery.php @ 29:8cf743c7ea23

Add focal length and lens model display.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 17 Apr 2016 13:59:39 +0300
parents 2d8112d6c3bc
children 300396947f04
line wrap: on
line source

<?php
//
// Yet Another Image Gallery
// (C) Copyright 2015 Tecnic Software productions (TNSP)
//
require "mgeneric.inc.php";
require "mgallery.inc.php";


//
// Various utility functions
//
function mgGetImageURL()
{
  global $galImageURL, $galPath;
  return str_replace("//", "/", $galImageURL.$galPath."/".implode("", func_get_args()));
}


function mgGetURL($path, $image, $entities = TRUE)
{
  global $galBaseURL, $galCleanURLS;
  $amp = $entities ? "&amp;" : "&";

  if ($galCleanURLS)
  {
    $url = $galBaseURL.$path."/".($image !== FALSE ? $image : "");
  }
  else
  {
    $url =
      $galBaseURL.mgGetSetting("mgallery_php")."?path=".
      $path.($image !== FALSE ? $amp."image=".$image : "");
  }

  return str_replace("//", "/", $url);
}


function mgGetNaviActive(&$galIndex, $index, $delta, &$res, &$url, $entities)
{
  global $galPath;
  $res = $index + $delta;
  if ($res >= 0 && $res <= sizeof($galIndex) - 1)
  {
    $url = mgGetURL($galPath, $galIndex[$res], $entities);
    return TRUE;
  }
  else
    return FALSE;
}


function mgGetNaviControlImage(&$galIndex, $index, $class, $url)
{
  global $galTNPath;

  $img = "<div class=\"imageCtrl ".$class."\">";

  if ($url !== FALSE)
  {
    $img .=
    "<a href=\"".$url."\"><img src=\"".
    mgGetImageURL($galTNPath, $galIndex[$index]).
    "\" alt=\"".$galIndex[$index]."\" /></a>";
  }

  return $img."</div>\n";
}


function mgGetNaviControlImageBox(&$galIndex, $index, $class, $delta)
{
  if (!mgGetNaviActive($galIndex, $index, $delta, $res, $url, TRUE))
    $url = FALSE;

  return mgGetNaviControlImage($galIndex, $res, $class, $url);
}


function mgGetControlText($id, $active, $url, $naviFlags)
{
  if ($naviFlags & GNAV_TEXT)
  {
    $str = chentities(mgGetSetting("navi_ctrl_".$id));
    return
      "<span class=\"naviControl ".$id."\">[".
      ($active ? "<a href=\"".$url."\">".$str."</a>" : $str).
      "]</span>";
  }
  else
    return "";
}


function mgGetControl($id, &$galIndex, $index, $delta, $naviFlags)
{
  $active = mgGetNaviActive($galIndex, $index, $delta, $res, $url, TRUE);
  if ($active && ($naviFlags & GNAV_IMG))
    $img = mgGetNaviControlImage($galIndex, $res, $id, $url);
  else
    $img = "";

  $text = mgGetControlText($id, $active, $url, $naviFlags);

  if ($delta < 0)
    return $img.$text;
  else
    return $text.$img;
}


function mgGetNaviControls(&$galIndex, $index, $naviFlags)
{
  global $galPath;

  return
    "<div class=\"naviControls\">".
    mgGetControl("prev", $galIndex, $index, -1, $naviFlags).
    mgGetControlText("up", TRUE, mgGetURL($galPath, FALSE), $naviFlags).
    mgGetControl("next", $galIndex, $index,  1, $naviFlags).
    "</div>\n";
}


function mgPrintTable($class, &$galEntries, &$galIndex, $start, $limit)
{
  global $galAlbumIcon, $galPath, $galTNPath, $galImageURL, $galUseCoverImages, $galUseTables;

  $galCount = count($galIndex);
  if ($start >= $galCount)
    return $start;

  $end = ($limit === FALSE) ? $galCount : $start + $limit;
  if ($end > $galCount) $end = $galCount;

  $rowLimit = mgGetSetting("album_row_limit");
  $n = 0;

  if ($galUseTables)
    echo "<table class=\"galleryTable ".$class."\">\n";
  else
    echo "<div class=\"galleryTable ".$class."\">\n";

  for ($index = $start; $index < $end; $index++)
  {
    $filename = &$galIndex[$index];
    $data = &$galEntries[$filename];

    if ($galUseTables && $n == 0) echo " <tr>\n";

    if ($galUseTables)
      echo "  <td class=\"galleryEntry\" id=\"cd".$data["base"]."\">\n";
    else
      echo "  <div class=\"galleryEntry\">\n";

    if ($data["type"] == 0)
    {
      echo
      "    <div class=\"imageBox\"><a href=\"".mgGetURL($galPath, $filename)."\">".
      "<img src=\"".mgGetImageURL($galTNPath, $filename)."\" alt=\"".
      chentities($filename)."\"></a></div>\n".
      mgGetArr($data, "caption", "    <div class=\"imageCaption\">%1</div>\n", "", "chentities");
/*
      if ($mode == "")
      {
      echo
        "  <select class=\"dropdown\" id=\"dd".$data["base"]."\" name=\"dd".$data["base"].
        "\" onchange=\"galPhotoDataChanged('".$data["base"]."');\">\n";

      foreach ($picChoices as $name => $value)
      {
        echo "   <option value=\"$value\"".($value == $data["id"] ? " selected=\"selected\"" : "").">".chentities($name)."</option>\n";
      }
      echo
        "  </select>\n";
      }
*/
    }
    else
    {
      $atmp = ($galUseCoverImages && isset($data["image"])) ? $galImageURL.mgCleanPath(TRUE, $galPath, $filename, $galTNPath, $data["image"]) : $galAlbumIcon;
      echo
      "    <a href=\"".mgGetURL(mgCleanPath(TRUE, $galPath, $filename), FALSE)."\">".
      "<img class=\"albumIcon\" src=\"".$atmp."\" alt=\"".chentities($data["caption"])."\" />\n".
      "    <div class=\"albumTitle\">".chentities($data["caption"])."</div></a>\n";
    }

    if ($galUseTables)
    {
      echo "  </td>\n";
      if (++$n >= $rowLimit)
      {
        echo " </tr>\n";
        $n = 0;
      }
    }
    else
      echo "  </div>\n";
  }

  if ($galUseTables)
  {
    if ($n > 0)
    {
      while ($n++ < $rowLimit)
        echo "  <td></td>\n";
      echo " </tr>\n";
    }
    echo "</table>\n";
  }
  else
    echo "</div>\n";

  return $index;
}


function mgTimeStr($str)
{
  $tmp = date_create_from_format("Y:m:d H:i:s", $str);
  return date_format($tmp, "d M Y (H:i)");
}


function mgPrintPageInfoFooter()
{
  if (($str = mgGetSetting("page_info")) !== FALSE)
    echo "<div class=\"pageInfoFooter\">".$str."</div>";
}


function mgPrintBreadCrumbs($galData)
{
  $res = array();
  if ($galData["caption"])
    $res[] = "<a class=\"naviBreadCrumbCurr\" href=\"".mgGetURL($galData["path"], FALSE)."\">".chentities($galData["caption"])."</a>";

  $tmp = $galData;
  while (isset($tmp["parent"]))
  {
    $pdata = $tmp["parent"];
    $res[] = "<a class=\"naviBreadCrumbItem\" href=\"".mgGetURL($pdata["path"], FALSE)."\">".chentities($pdata["caption"])."</a>";
    $tmp = $tmp["parent"];
  }

  if (count($res) > 1)
  {
    echo
      "<div class=\"naviBreadCrumbs\">".
      implode("<span class=\"naviBreadCrumbSep\"></span>", array_reverse($res)).
      "</div>\n";
  }
}


//
// Get gallery settings
//
mgReadSettings();

$pageCSS = mgGetSetting("css");
$pageCSSSelect = mgGetSetting("css_select");
$galBasePath = mgGetSetting("base_path");
$galBaseURL = mgGetSetting("base_url");
$galImageURL = mgGetSetting("image_url", mgGetSetting("base_url"));

$galUseCoverImages = mgGetSetting("cover_images");
$galUseTables = mgGetSetting("use_tables");

$galAlbumIcon = mgGetSetting("album_icon");
$galCleanURLS = mgGetSetting("clean_urls");
$galTNPath = mgGetSetting("tn_path");
$galMedSuffix = mgGetSetting("med_suffix");
$galTitlePrefix = mgGetSetting("title_prefix");
$galTitleSep = mgGetSetting("title_sep");

$galMode = stGetRequestItem("mode", "view", TRUE);
$galPath = stGetRequestItem("path", ".", TRUE);
$galPageIndex = intval(stGetRequestItem("index", 0, TRUE));
$galImage = stGetRequestItem("image", FALSE, TRUE);

if (is_string($galImage))
  $galImage = basename($galImage);


//
// Attempt to read the data cache file
//
$filename = mgGetPath(mgCleanPath(TRUE, $galBasePath, $galPath), "cache_file");
$filename2 = mgGetPath(mgCleanPath(FALSE, $galBasePath, $galPath), "cache_file");
if ($filename == $filename2 && file_exists($filename) && ($fp = @fopen($filename, "rb")) !== FALSE)
{
  if (flock($fp, LOCK_SH))
  {
    require($filename);
    flock($fp, LOCK_UN);
  }
  fclose($fp);
}


// If no data available, show an error page
if (!isset($galData) || !isset($galEntries) ||
    !isset($galAlbumsIndex) || !isset($galImagesIndex))
{
  cmPrintPageHeader(mgGetVal(array("title_prefix", "title_sep"), "%1%2")."ERROR!");

  echo
    "<h1>Gallery error</h1>\n".
    "<p>Gallery path <b>".chentities($galPath)."</b> does not exist or is invalid.</p>\n";

  //echo "<p>filename=: '".$filename."', X: galData=".intval(isset($galData)).", galEntries=".intval(isset($galEntries))."\n";

  mgPrintPageInfoFooter();
  cmPrintPageFooter(TRUE);
  exit;
}


//
// Print page header, etc.
//
if (($index = array_search($galImage, $galImagesIndex)) !== FALSE)
{
  //
  // Single image mode
  //
  $naviFlags = mgGetSetting("image_navigation");
  $data = $galEntries[$galImage];

  $pageTitle = $galTitlePrefix.$galTitleSep.$galData["caption"]." - ".$galImage;
  cmPrintPageHeader($pageTitle);
  echo "<h1>".chentities($pageTitle)."</h1>\n";

  if ($naviFlags & GNAV_BREADCRUMBS)
    mgPrintBreadCrumbs($galData);

  if ($naviFlags & GNAV_TOP)
    echo mgGetNaviControls($galImagesIndex, $index, $naviFlags);

  echo
  "<div class=\"imageCBox\">\n".
  mgGetNaviControlImageBox($galImagesIndex, $index, "prev", -1).
  "<div class=\"imageBox\">\n".
  "<a target=\"_blank\" href=\"".$galImageURL.$galPath."/".$galImage."\">".
  "<img src=\"".mgGetImageURL($galTNPath, $data["base"].$galMedSuffix.$data["ext"])."\" alt=\"".
  chentities($data["base"].$galMedSuffix.$data["ext"])."\"></a>\n".
  "</div>\n".
  mgGetNaviControlImageBox($galImagesIndex, $index, "next", 1).
  "</div>\n".
  "<div class=\"imageCaption\">".mgGetArr($data, "caption", "%1", "")."</div>\n";

  $list = array(
    mgGetArr($data, array("width", "height"), "<span class=\"infoDimensions\"><b>%1</b> x <b>%2</b> px</span>", NULL),
    mgGetArr($data, "model", "<span class=\"infoModel\"><b>%1</b></span>", NULL),
    mgGetArr($data, "fnumber", "<span class=\"infoFNumber\"><b>f/%1</b></span>", NULL),
    mgGetArr($data, "exposure", "<span class=\"infoExposure\"><b>%1</b> sec</span>", NULL, NULL),
    mgGetArr($data, "iso", "<span class=\"infoISO\">ISO <b>%1</b></span>", NULL),
    mgGetArr($data, "focallength", "<span class=\"infoFocalLength\">F-L <b>%1</b>mm</span>", NULL),
    mgGetArr($data, "lensmodel", "<span class=\"infoLensModel\"><i>%1</i></span>", NULL),
  );

  echo
    "<div class=\"infoBox\">\n".
    mgGetArr($data, "datetime", "<span class=\"infoDateTime\">%1</span>", "", "mgTimeStr").
    implode(", ", array_filter($list, function($a) { return $a !== NULL; })).
    "</div>\n";

  if ($naviFlags & GNAV_BOTTOM)
    echo mgGetNaviControls($galImagesIndex, $index, $naviFlags);

  // Javascript navigation
  if ($naviFlags & GNAV_JAVASCRIPT)
  {
    $prevActive = mgGetNaviActive($galImagesIndex, $index, -1, $res, $prevURL, FALSE);
    $nextActive = mgGetNaviActive($galImagesIndex, $index, 1, $res, $nextURL, FALSE);
    echo
      "<script type=\"text/javascript\">\n".
      "var mgalPrevURL = \"".($prevActive ? $prevURL : "")."\";\n".
      "var mgalNextURL = \"".($nextActive ? $nextURL : "")."\";\n".
      "\n";
?>
function mgalNavigateTo(url)
{
    if (url != "")
        window.location = url;
}


function mgalProcessKeyPress(ev)
{
    ev = ev || window.event;
    var key = ev.keyCode ? ev.keyCode : ev.which;
    switch (key)
    {
        case 37:
        case 65:
            // left
            mgalNavigateTo(mgalPrevURL);
            break;

        case 39:
        case 68:
            // right
            mgalNavigateTo(mgalNextURL);
            break;
    }
}

document.onkeypress = mgalProcessKeyPress;
<?
    echo
      "</script>\n";
  }
}
else
{
  //
  // Gallery mode
  //
  // - needs sub-modes / handling of order shit
  // - Javascript stuff for picture data updates
  //
  $pageTitle = $galTitlePrefix.mgGetArr($galData, "caption", " - %1", "", "chentities");
  cmPrintPageHeader($pageTitle);
  echo "<h1>".$pageTitle."</h1>\n";

  $naviFlags = mgGetSetting("album_navigation");
  if ($naviFlags & GNAV_BREADCRUMBS)
    mgPrintBreadCrumbs($galData);

  if (isset($galData["header"]) && strlen($galData["header"]) > 0)
  {
    // Translate relative URLs in header, if needed
    $baseURL = mgGetSetting("image_url");

    $headerText = preg_replace_callback(
      "@href\s*=\s*\"([^\"]+)\"@i",
      function ($matches) use($galPath, $baseURL)
      {
        $mstmp = $matches[1];
        if (preg_match("@^[a-z]+://@i", $mstmp) === 0)
        {
          if ($mstmp[0] != "/")
            $mstmp = $baseURL."/".$galPath."/".str_replace("//", "/", $mstmp);
        }
        return "href=\"".$mstmp."\"";
      },
      $galData["header"]);

    echo "<div class=\"albumHeaderText\">".$headerText."</div>\n";
  }

  mgPrintTable("albumTable", $galEntries, $galAlbumsIndex, 0, FALSE);
  mgPrintTable("imageTable", $galEntries, $galImagesIndex, 0, FALSE);
}

mgPrintPageInfoFooter();
cmPrintPageFooter(TRUE);
?>