<?php

/**
 * @author     Stefan Jahn
 * @copyright  Copyright (C) 2005 Stefan Jahn
 * @link       http://www.stefanjahn.de
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @version    20060731
 * 
 * Datei		dwgallery.php
 * Erstellt am 20.12.2005
 *
 * Plugin für DokuWiki. Erstellt aus den Bildern eines Namensraums eine
 * Galerie. Auf Wunsch werden die Thumbnails permanent abgespeichert.
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */


/**
 * Einstellungen vornehmen
 *
 * @return array 
 */
function gallery_init() {
	global $conf;
	
	// Namensraum der für Galerien vorbehalten ist
	$gallery['namespace'] = 'Fotos';
	
	// Diverse Meldungen
	$gallery['nopicture'] = 'Es sind noch keine Bilder vorhanden.';
	$gallery['picturename'] = 'Bild #';
	$gallery['of'] = 'von';
	$gallery['content'] = 'Übersicht';
	$gallery['city'] = 'Ort';
	$gallery['country'] = 'Land';
	$gallery['count'] = 'Anzahl der Bilder:';
	
	// HTML-Codes
	$gallery['titlestart'] = '<h2>';					// Überschrift Start
	$gallery['titleend'] = '</h2>';						// Überschrift Ende
	$gallery['displaystart'] = '<div class="level2">';	// Start der Ausgabe
	$gallery['displayend'] = '</div>';					// Ende der Ausgabe
	
	$gallery['exif'] = TRUE;							// EXIF-Unterstützung
	$gallery['iptc'] = TRUE;							// IPTC-Unterstützung
		
	$gallery['savethumbs'] = FALSE;						// Thumbnails erstellen und abspeichern
	$gallery['thumbwidth'] = 100;						// Breite der Thumbnails

	$gallery['randomwidth'] = 150;						// Breiter der Thumbails der Zufallbilder
	$gallery['index'] = 'index.txt';					// Liste mit den Zufallsbildern
	
	// Eigene Einstellungen vornehmen
	@require_once('config.php');

	// Pfad zum Datenverzeichnis
	$dir = trim($conf['savedir']);
	if ($dir{0} == '.') $dir = substr($dir, 1);
	if ($dir{0} == '/') $dir = substr($dir, 1);
	if ($dir{strlen($dir)-1} == '/') $dir = substr($dir, 0, strlen($dir)-1);
	$gallery['datadir'] = $dir;

	return $gallery;
}


/**
 * Hauptroutine - Galerie starten
 *
 * Funktion wird im Template "main.php" aufgerufen 
 */
function tpl_gallery() {
	global $ID;
	global $ACT;
	global $conf;
	global $INFO;

	// Werte einstellen
	$gallery = gallery_init();
	
	// Galerie nur anzeigen wenn Seite nicht bearbeitet wird und Seite vorhanden ist
	if ($ACT != 'show' or $INFO['exists'] != 1) return;

	// Galerie nur anzeigen wenn man sich im korrekten Namespace befindet
	$array_id = split(':', $ID);
	if (strtolower($array_id[0]) != strtolower($gallery['namespace'])) return;

	// Parameter einlesen
	$gallery['pic'] = $_GET['pic'];
	
	// Name der Seite ermitteln
	$gallery['name'] = $array_id[count($array_id)-1];
	
	// Galerie nicht anzeigen wenn eine "Startseite" aktiv ist
	if (strtolower($gallery['name']) == strtolower($conf['start'])) return;
	
	// Namespaces ermitteln
	$gallery['space'] = str_replace(':', '/', str_replace(':'.$gallery['name'], '', $ID));
	
	// Suffix für Dateinamen der Bilder erstellen
	$gallery['suffix'] = strtolower($gallery['name']).'_';
	
	// Pfad zu den Bildern
	$gallery['dir'] = $gallery['datadir'].'/media/'.$gallery['space'];
	$gallery['media'] = 'media/'.$gallery['space'];

	// Prüfen ob Verzeichnis vorhanden ist
	if (!is_dir($gallery['dir'])) {
		echo '<p>'.$gallery['nopicture']."</p>\n";
		return;
	}

	// Verzeichnis einlesen
	$array = gallery_readdir($gallery);
	$gallery['image'] = $array[1];
	$gallery['thumbnail'] = $array[2];
	$gallery['imagename'] = $array[3];
	$gallery['thumbname'] = $array[4];

	// Anzahl der Bilder ermitteln
	$gallery['max'] = count($gallery['image']);

	// Prüfen ob Bilder vorhanden sind
	if ($gallery['max'] == 0) {
		echo '<p>'.$gallery['nopicture']."</p>\n";
		return;
	}

	// Parameter prüfen
	if (isset($gallery['pic'])) {
		if ($gallery['pic'] > $gallery['max']) $gallery['pic'] = $gallery['max'];
		if ($gallery['pic'] < 1) $gallery['pic'] = 1;
	}
	
	// Gallerie oder einzelnes Bild anzeigen
	if (!isset($gallery['pic'])) gallery_displaythumbnails($gallery);
	else gallery_displayimage($gallery);

	return;
}


/**
 * Zufallsbild anzeigen
 */
function tpl_gallery_random() {
	global $conf;
	global $ACT;
	global $INFO;
	global $ID;
	
	// Werte einstellen
	$gallery = gallery_init();
	$namespace = strtolower($gallery['namespace']);

	// Galerie nur anzeigen wenn Seite nicht bearbeitet wird und Seite vorhanden ist
	if ($ACT != 'show' or $INFO['exists'] != 1) return;

	// Galerie nur anzeigen wenn "Startseite" aktiv ist
	if (strtolower($ID) != strtolower($conf['start'])) return;

	// Pfad+Dateiname der Index-Datei
	$file = $gallery['datadir'].'/media/'.$namespace.'/'.$gallery['index'];
	
	// Inhalt der Index-Datei einlesen
	if (file_exists($file)) {
		$index = file($file);
		$max = count($index);
	
		// Einträge in der Index-Datei sind vorhanden
		if ($max > 0) {
			$nr = rand(0, $max);								// Zufallsbild auswählen
			$picture = $namespace.'/'.trim($index[$nr]);		// Dateiname des Bildes
			$sizeimage = getimagesize($gallery['datadir'].'/media/'.$picture, $info);
			$height = $sizeimage[1]/($sizeimage[0]/$gallery['randomwidth']);
			$media = ml(str_replace('/', ':', $picture), 'w='.$gallery['randomwidth'].'&amp;h='.$height.'&amp;cache=cache', TRUE);
			if (isset($info["APP13"]) and $gallery['iptc']) {
				$iptc = iptcparse ($info['APP13']);
				
				$alt = htmlentities($iptc['2#120'][0]);
				$iptc_caption = str_ireplace("\r\n", '<br />', $alt);
				$iptc_caption = str_ireplace("\r", '<br />', $iptc_caption);
				$iptc_caption = str_ireplace("\n", '<br />', $iptc_caption);
				
				$alt = htmlentities($iptc['2#090'][0]);
				$iptc_city = str_ireplace("\r\n", '<br />', $alt);
				$iptc_city = str_ireplace("\r", '<br />', $iptc_city);
				$iptc_city = str_ireplace("\n", '<br />', $iptc_city);
			} else {
				unset($iptc_caption);
				unset($iptc_city);
			}
			
			// Bild anzeigen
			$script = wl($gallery['namespace'].':'.$conf['start']);
			echo '<div class="randompicture" style="width:'.$gallery['randomwidth'].'px">'."\n";
			echo '<a href="'.$script.'"><img src="'.$media.'" alt="'.$alt.'" width="'.$gallery['randomwidth'].'" height="'.$height.'" /></a>'."\n";
			echo "<br />\n$iptc_caption\n";
			if ($iptc_city != '') echo "<br />\n($iptc_city)\n";
			echo '</div>'."\n";
		}
	
	}
}


/**
 * Thumbnails anzeigen
 *
 * @param array $gallery Daten-Array
 */
function gallery_displaythumbnails($gallery) {
	global $ID;
	
	$script = wl($ID);
	
	// Trenner für Parameter in URL
	$trenner = '?';	
	if (stristr($script, '?')) {
		$trenner = '&amp;';
	}
	
	echo $gallery['titlestart'].$gallery['content'].$gallery['titleend']."\n";
	echo $gallery['displaystart']."\n";
	echo $gallery['count'].' '.$gallery['max']."\n";

	echo '<div style="text-align:center">'."\n";
	for ($i = 0; $i < $gallery['max']; $i++):
		// Thumbnail erzeugen falls nicht vorhanden ist
		if ($gallery['savethumbs']) {
			if (!file_exists($gallery['thumbnail'][$i])) gallery_createthumbnail($gallery, $i);
			$sizethumb = getimagesize($gallery['thumbnail'][$i]);
		}

		$sizeimage = getimagesize($gallery['image'][$i], $info);
		
		// IPTC-Daten ermitteln
		if ($gallery['iptc'] and isset($info["APP13"])) {
			$iptc = iptcparse($info['APP13']);
			$iptc_caption = htmlentities($iptc['2#120'][0]);
			if ($iptc_caption != '') $iptc_caption = ' - '.$iptc_caption;
		} else unset($iptc_caption);
		
		// Thumbnail anzeigen
		if ($gallery['savethumbs']) {
			$media = ml(getNS($ID).':'.$gallery['thumbname'][$i], 'w=&amp;h=&amp;cache=cache', TRUE);
			echo '<a href="'.$script.$trenner.'pic='.($i+1).'" title="'.$gallery['picturename'].($i+1).$iptc_caption.'"><img class="thumb" src="'.$media.'" alt="'.$gallery['picturename'].($i+1).$iptc_caption.'" '.$sizethumb[3].' /></a>'."\n";
		} else {
			$media = ml(getNS($ID).':'.$gallery['imagename'][$i], 'w='.$gallery['thumbwidth'].'&amp;h=&amp;cache=cache', TRUE);
			$height = $sizeimage[1]/($sizeimage[0]/$gallery['thumbwidth']);
			echo '<a href="'.$script.$trenner.'pic='.($i+1).'" title="'.$gallery['picturename'].($i+1).$iptc_caption.'"><img class="thumb" src="'.$media.'" alt="'.$gallery['picturename'].($i+1).$iptc_caption.'" width="'.$gallery['thumbwidth'].'" height="'.$height.'" /></a>'."\n";
		}
		flush();
	endfor;
	echo '</div>'."\n";

	echo $gallery['displayend']."\n";
	
	flush();
}


/**
 * Bild anzeigen
 *
 * @param array $gallery Daten-Array
 */
function gallery_displayimage($gallery) {
	global $ID;
	
	$size = getimagesize($gallery['image'][$gallery['pic']-1], $info);

	// EXIF-Daten ermitteln
	if ($gallery['exif']) {
		$exif = exif_read_data($gallery['image'][$gallery['pic']-1],'',true,false);
		$exif_date = htmlentities($exif['DateTime']);
		$exif_make = htmlentities($exif['Make']);
		$exif_camera = htmlentities($exif['Model']);
	}

	// IPTC-Daten ermitteln
	if (isset($info["APP13"]) and $gallery['iptc']) {
		$iptc = iptcparse ($info['APP13']);
		$iptc_program = htmlentities($iptc['2#065'][0]);
		$iptc_jobid = htmlentities($iptc['2#022'][0]);
		$iptc_status = htmlentities($iptc['2#007'][0]);
		$iptc_copyright = htmlentities($iptc['2#116'][0]);
		$iptc_specialinstructions = htmlentities($iptc['2#040'][0]);
		$iptc_headline = htmlentities($iptc['2#105'][0]);
		$iptc_captionwriter = htmlentities($iptc['2#122'][0]);
		$iptc_caption = htmlentities($iptc['2#120'][0]);
		$iptc_caption = str_ireplace("\r\n", '<br />', $iptc_caption);
		$iptc_caption = str_ireplace("\r", '<br />', $iptc_caption);
		$iptc_caption = str_ireplace("\n", '<br />', $iptc_caption);
		$iptc_originaltransmissionreference = htmlentities($iptc['2#103'][0]);
		$iptc_countrycode = htmlentities($iptc['2#100'][0]);
		$iptc_country = htmlentities($iptc['2#101'][0]);
		$iptc_state = htmlentities($iptc['2#095'][0]);
		$iptc_sublocation = htmlentities($iptc['2#092'][0]);
		$iptc_city = htmlentities($iptc['2#090'][0]);
		$iptc_objectname = htmlentities($iptc['2#005'][0]);
		$iptc_source = htmlentities($iptc['2#115'][0]);
		$iptc_credit = htmlentities($iptc['2#110'][0]);
		$iptc_bylinetitle = htmlentities($iptc['2#085'][0]);
		$iptc_byline = htmlentities($iptc['2#080'][0]);
	} else {
		unset($iptc_program);
		unset($iptc_jobid);
		unset($iptc_status);
		unset($iptc_copyright);
		unset($iptc_specialinstructions);
		unset($iptc_headline);
		unset($iptc_captionwriter);
		unset($iptc_caption);
		unset($iptc_originaltransmissionreference);
		unset($iptc_countrycode);
		unset($iptc_country);
		unset($iptc_state);
		unset($iptc_sublocation);
		unset($iptc_city);
		unset($iptc_objectname);
		unset($iptc_source);
		unset($iptc_credit);
		unset($iptc_bylinetitle);
		unset($iptc_byline);
	}
	
	echo $gallery['titlestart'].$gallery['picturename'].$gallery['pic'].' '.$gallery['of'].' '.$gallery['max'].$gallery['titleend']."\n";
	echo $gallery['displaystart']."\n";

	// Bild anzeigen
	$detail = ml(getNS($ID).':'.$gallery['imagename'][$gallery['pic']-1], 'id='.$ID.'&amp;cache=cache', FALSE);
	$media = ml(getNS($ID).':'.$gallery['imagename'][$gallery['pic']-1], 'w=&amp;h=&amp;cache=cache', TRUE);
	$alt = getNS($ID).':'.$gallery['imagename'][$gallery['pic']-1];
	echo '<div style="text-align:center">'."\n";
	echo '<a href="'.$detail.'" title="'.$alt.'" onclick="return svchk()" onkeypress="return svchk()">';
	echo '<img class="photo" src="'.$media.'" alt="'.$gallery['picturename'].$gallery['pic'].' '.$gallery['of'].' '.$gallery['max'].'" '.$size[3].' />';
	echo '</a>'."\n";
	echo '<br />'."\n";

	// Beschreibung anzeigen
	if ($exif_date != '' and $gallery['exif']) {
		echo $exif_date."\n";
		echo '<br />'."\n";
	}
	
	if ($gallery['iptc']) {
		if ($iptc_caption != '') {
			echo $iptc_caption."\n";
			echo '<br />'."\n";
		}
		if ($iptc_city != '') {
			echo $gallery['city'].': '.$iptc_city;
			if ($iptc_country != '') echo ', '.$iptc_country;
			echo '<br />'."\n";
		} elseif ($iptc_country != '') {
			echo $gallery['country'].': '.$iptc_country."\n";
			echo '<br />'."\n";
		}
		if ($iptc_sublocation != '') {
			echo $iptc_sublocation."\n";
			echo '<br />'."\n";
		}
	}

	echo '<br />'."\n";
	
	// Navigation anzeigen
	gallery_navigation($gallery);

	echo '</div>'."\n";

	echo $gallery['displayend']."\n";
	
	flush();
}


/**
 * Verzeichnis einlesen
 *
 * @param array $gallery Daten-Array
 * @return array
 */
function gallery_readdir($gallery) {
	$path = $gallery['dir'].'/';
	$suffix = strtolower($gallery['suffix']);
	$len = strlen($suffix);
	$dir = dir($path);
	
	while ($file = $dir->read()) {
		$filename = strtolower($file);
		if (substr($filename,0,6) != 'thumb_' and substr($filename,0,$len) == $suffix) {
			if (stristr($filename, '.jpg')) {
				$image[] = $path.$filename;
				$thumbnail[] = $path.'thumb_'.$filename;
				$imagename[] = $filename;
				$thumbname[] = 'thumb_'.$filename;
			}
			if (stristr($filename, '.jpeg')) {
				$image[] = $path.$filename;
				$thumbnail[] = $path.'thumb_'.$filename;
				$imagename[] = $filename;
				$thumbname[] = 'thumb_'.$filename;
			}
			if (stristr($filename, '.png')) {
				$image[] = $path.$filename;
				$thumbnail[] = $path.'thumb_'.$filename;
				$imagename[] = $filename;
				$thumbname[] = 'thumb_'.$filename;
			}
			if (stristr($filename, '.gif')) {
				$image[] = $path.$filename;
				$thumbnail[] = $path.'thumb_'.$filename;
				$imagename[] = $filename;
				$thumbname[] = 'thumb_'.$filename;
			}
		}
	}
	$dir->close();

	// Inhaltsverzeichnis sortieren
	if (count($image) > 0) {	
		sort($image);
		sort($thumbnail);
		sort($imagename);
		sort($thumbname);
	}

	$array[1] = $image;
	$array[2] = $thumbnail;
	$array[3] = $imagename;
	$array[4] = $thumbname;
	
	return $array;
}


/**
 * Thumbnail erzeugen
 *
 * @param array $gallery Daten-Array
 * @param integer $nr Nummer des Bildes
 */
function gallery_createthumbnail($gallery, $nr) {
	$image = $gallery['image'][$nr];
	$thumbnail = $gallery['thumbnail'][$nr];
	
	// Infos über Bild holen
	$info = getimagesize($image);
	$width = $info[0];
	$height = $info[1];
	$type = $info[2];

	// Thumbnail erstellen
	if ($type == 1) $new = imagecreatefromgif($image);
	elseif ($type == 2) $new = imagecreatefromjpeg($image);
	elseif ($type == 3) $new = imagecreatefrompng($image);

	$newwidth = $gallery['thumbwidth'];
	$newheight = $height/($width/$newwidth);
	$newimage = imagecreatetruecolor($newwidth, $newheight);
	imagecopyresampled($newimage, $new, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

	// Thumbnail speichern
	if ($type == 1) imagegif($newimage, $thumbnail);
	elseif ($type == 2) imagejpeg($newimage, $thumbnail);
	elseif ($type == 3) imagepng($newimage, $thumbnail);
}


/**
 * Navigation anzeigen
 *
 * @param array $gallery Daten-Array
 */
function gallery_navigation($gallery) {
	global $ID;
	
	$script = wl($ID);

	// Trenner für Parameter in URL
	$trenner = '?';	
	if (stristr($script, '?')) {
		$trenner = '&amp;';
	}

	echo "<p>\n";

	// Thumbnails
	$start = $gallery['pic']-2;
	if ($start < 1) $start = 1;
	
	$ende = $start+5;
	if ($ende > $gallery['max']+1) {
		$ende = $gallery['max']+1;
		
		if ($ende-5 < $start) $start = $ende-5;
		if ($start < 1) $start = 1;
	}
	
	for ($i = $start-1; $i < $ende-1; $i++) {
		if ($gallery['savethumbs']) $sizethumb = getimagesize($gallery['thumbnail'][$i]);
		$sizeimage = getimagesize($gallery['image'][$i], $info);

		// IPTC-Daten ermitteln
		if (isset($info["APP13"]) and $gallery['iptc']) {
			$iptc = iptcparse($info['APP13']);
			$iptc_caption = htmlentities($iptc['2#120'][0]);
			if ($iptc_caption != '') $iptc_caption = ' - '.$iptc_caption;
		} else unset($iptc_caption);
		
		// Thumbnail anzeigen
		if ($gallery['savethumbs']) {
			$media = ml(getNS($ID).':'.$gallery['thumbname'][$i], 'w=&amp;h=&amp;cache=cache', TRUE);
		} else {
			$media = ml(getNS($ID).':'.$gallery['imagename'][$i], 'w='.$gallery['thumbwidth'].'&amp;h=&amp;cache=cache', TRUE);
			$height = $sizeimage[1]/($sizeimage[0]/$gallery['thumbwidth']);
		}
		$thumb = str_replace('/', '%3A', $thumb);

		if ($i+1 == $gallery['pic']) {
			if ($gallery['savethumbs']) echo '<img class="thumbactiv" src="'.$media.'" alt="'.$gallery['picturename'].($i+1).$iptc_caption.'" '.$sizethumb[3].' />'."\n";
			else echo '<img class="thumbactiv" src="'.$media.'" alt="'.$gallery['picturename'].($i+1).$iptc_caption.'" width="'.$gallery['thumbwidth'].'" height="'.$height.'" />'."\n";
		} else {
			if ($gallery['savethumbs']) echo '<a href="'.$script.$trenner.'pic='.($i+1).'" title="'.$gallery['picturename'].($i+1).$iptc_caption.'"><img class="thumb" src="'.$media.'" alt="'.$gallery['picturename'].($i+1).$iptc_caption.'" '.$sizethumb[3].' /></a>'."\n";
			else echo '<a href="'.$script.$trenner.'pic='.($i+1).'" title="'.$gallery['picturename'].($i+1).$iptc_caption.'"><img class="thumb" src="'.$media.'" alt="'.$gallery['picturename'].($i+1).$iptc_caption.'" width="'.$gallery['thumbwidth'].'" height="'.$height.'" /></a>'."\n";
		}
		flush();
	}
	
	flush();

	echo "<br />\n";
	
	// Textlinks
	if ($gallery['pic'] > 1) {
		echo '<a href="'.$script.$trenner.'pic=1" title="'.$gallery['picturename'].'1">&lt;&lt;</a>&nbsp;'."\n";
		echo '<a href="'.$script.$trenner.'pic='.($gallery['pic']-1).'" title="'.$gallery['picturename'].($gallery['pic']-1).'">&lt;</a>&nbsp;'."\n";
	} else {
		echo '&lt;&lt;&nbsp;'."\n";
		echo '&lt;&nbsp;'."\n";
	}

	echo '<a href="'.$script.'" title="'.$gallery['content'].'">'.$gallery['content'].'</a>&nbsp;'."\n";

	if ($gallery['pic'] < $gallery['max']) {
		echo '<a href="'.$script.$trenner.'pic='.($gallery['pic']+1).'" title="'.$gallery['picturename'].($gallery['pic']+1).'">&gt;</a>&nbsp;'."\n";
		echo '<a href="'.$script.$trenner.'pic='.$gallery['max'].'" title="'.$gallery['picturename'].$gallery['max'].'">&gt;&gt;</a>'."\n";
	} else {
		echo '&gt;&nbsp;'."\n";
		echo '&gt;&gt;'."\n";
	}

	echo "</p>\n";

	flush();
	
	return;
}

?>