id, ENT_QUOTES, "UTF-8") . "\"\n"); fwrite($fp, " title=\"" . htmlspecialchars($this->title, ENT_QUOTES, "UTF-8") . "\"\n"); fwrite($fp, " image=\"" . htmlspecialchars($this->image, ENT_QUOTES, "UTF-8") . "\"/>\n"); } public function show($indent, $cat) { $str = ""; $str .= $indent."\n"; if($cat == "photo") $str .= $indent." path . "/" . $this->image . "\">\n"; $str .= $indent." \n"; $str .= $indent." \"".$this-title."\"\n"; $str .= $indent." src=\"?mode=imagecache&uri=" . $this->path . "/" . $this->image . "&mod=gallery&cat=".$cat."\"/>\n"; $str .= $indent." \n"; if($cat == "photo") $str .= $indent." \n"; $str .= $indent." " . $this->title . "\n"; $str .= $indent."\n"; return $str; } public function showRef() { $str = ""; $str .= " \"".$this-title."\"\n"; $str .= " src=\"?mode=imagecache&uri=" . $this->path . "/" . $this->image . "&mod=gallery&cat=reficon\"/>\n"; return $str; } public function Photo($path, $id, $title, $image) { $this->path = $path; $this->id = $id; $this->title = $title; $this->image = $image; } } class Album { public $id; public $title; public $copyright; public $enabled; public $icon; public $photos = array(); public function add($photo) { $this->photos[$photo->id] = $photo; } public function write($fp) { fwrite($fp, " id, ENT_QUOTES, "UTF-8") . "\"\n"); fwrite($fp, " title=\"" . htmlspecialchars($this->title, ENT_QUOTES, "UTF-8") . "\"\n"); fwrite($fp, " copyright=\"" . htmlspecialchars($this->copyright, ENT_QUOTES, "UTF-8") . "\"\n"); fwrite($fp, " icon=\"" . htmlspecialchars($this->icon, ENT_QUOTES, "UTF-8") . "\"\n"); if($this->enabled) fwrite($fp, " enabled=\"true\">\n"); else fwrite($fp, " enabled=\"false\">\n"); foreach($this->photos as $photo) { $photo->write($fp); } fwrite($fp, " \n"); } public function show($indent) { global $page; if(!$this->enabled) return ""; $str = ""; $str .= $indent."\n"; // $str .= $indent."   ← Back to albums\n"; $str .= $indent." " . $this->title . "\n"; $str .= $indent." Copyright: " . $this->copyright . "\n"; foreach($this->photos as $photo) { $str .= $indent." id."&p=".$photo->id."\">\n"; $str .= $photo->show($indent." ", "albumicon"); $str .= $indent." \n"; } $str .= $indent."
  ← Back to albums\n"; // Back to gallery /* $str .= $indent." \n"; $str .= $indent."\n"; $str .= $indent." \n"; $str .= $indent." \"Back\n"; $str .= $indent." \n"; $str .= $indent." " . $this->title . "\n"; $str .= $indent."\n"; $str .= $indent." \n"; $str .= $indent."
\n"; */ return $str; } public function showIcon($indent) { global $page; $str = ""; $str .= $indent."id."\">\n"; $str .= $indent." ".$this->title."\n"; $str .= $indent." \n"; $str .= $this->photos[$this->icon]->show($indent." ", "albumicon"); $str .= $indent." \n"; $str .= $indent."\n"; return $str; } public function showRef() { global $page; $str = ""; $str .= $indent."id."\">\n"; $str .= $this->photos[$this->icon]->showRef() . " " .$this->title . "\n"; $str .= $indent."\n"; return $str; } public function showPhoto($indent, $photo) { global $GLOBALS; $album = $this->id; $str = ""; $str = $this->photos[$photo]->show($indent, "photo"); $str .= $indent."\n"; if($this->photos[$photo - 1]) { $str .= $indent." \n"; $str .= $this->photos[$photo - 1]->show($indent." ", "navicon"); $str .= $indent." \n"; } else { $str .= $indent." \n"; $str .= $indent." Stop\n"; $str .= $indent." \n"; } $str .= $indent." \n"; $str .= $indent." Home\n"; $str .= $indent." \n"; if($this->photos[$photo + 1]) { $str .= $indent." \n"; $str .= $this->photos[$photo + 1]->show($indent." ", "navicon"); $str .= $indent." \n"; } else { $str .= $indent." \n"; $str .= $indent." Stop\n"; $str .= $indent." \n"; } $str .= $indent."\n"; return $str; } public function getPath() { global $ALBUMS_DIR; return $ALBUMS_DIR . "/" . $this->id; } public function getNextID() { $maxid = 0; foreach($this->photos as $photo) { if($photo->id > $nextid) $maxid = $photo->id; } return $maxid + 1; } public function Album($id, $title, $copyright, $icon, $enabled) { $this->id = $id; $this->title = $title; $this->copyright = $copyright; $this->icon = $icon; $this->enabled = $enabled == "true" || $enabled == "on" || $enabled == "yes"; } } function unpackImages($zipfile, $album) { if(is_uploaded_file($zipfile['tmp_name'])) { echo "File ". $zipfile['name'] ." uploaded successfully.\n"; // // Unzip file // // http://dk.php.net/manual/en/book.zip.php $zip = new ZipArchive(); $zip->open($zipfile['tmp_name']); $folder = $zipfile['tmp_name'].'.unzip'; $zip->extractTo($folder); // // Look at EXIF header (Image Description) and move images // // http://dk.php.net/manual/en/book.exif.php if(!file_exists($album->getPath())) mkdir($album->getPath()); $imagefiles = array(); $d = opendir($folder); while(false !== ($f = readdir($d))) { if(!isJpeg($f)) continue; array_push($imagefiles, $f); } sort($imagefiles); foreach($imagefiles as $f) { $tags = exif_read_data($folder . "/" . $f, "ANY_TAG"); rename($folder . "/" . $f, $album->getPath() . "/" . $f); $photo = new Photo($album->getPath(), $album->getNextID(), $tags['ImageDescription'], $f); $album->add($photo); } closedir($d); // // Clean up (recursively) // cleanUp($folder); } } class Gallery { private $file; private $albums = array(); // Local attributes private $maxwidth_navicon; private $maxheight_navicon; private $maxwidth_icon; private $maxheight_icon; private $maxwidth_rand; private $maxheight_rand; private $maxwidth; private $maxheight; // Admin config public $admin_title = "Gallery"; public $admin_submodules = array("Options" => "options", "New album" => "new", "Edit album" => "edit", "Delete album" => "delete"); public function admin_new($action, $vars) { global $ALBUMS_DIR; switch($action) { case "create": $baseid = $vars['id']; $id = $baseid; $idcnt = 1; while(!$this->checkUniqueID($id)) { $id = $baseid . "-" . $idcnt; $idcnt++; } $album = new Album($id, $vars['title'], $vars['copyright'], "1", $vars['enabled']); unpackImages($_FILES['images'], $album); $this->add($album); $this->write(); echo $album->show("", "albumicon"); break; case "select": default: $form = new Form("create"); $form->addWidget(new LineEdit("Album title:", "title")); $form->addWidget(new LineEdit("Album copyright:", "copyright")); $form->addWidget(new LineEdit("Album ID:", "id", $this->getNextID())); $form->addWidget(new CheckBox("Album enabled:", "enabled")); $form->addWidget(new FileUpload("Select image archive:", "images", "application/zip")); $form->addWidget(new Button("Create")); $form->render(); break; } } public function admin_edit($action, $vars) { global $ALBUMS_DIR; switch($action) { case "update": $album = $this->albums[$vars["id"]]; $album->title = $vars["title"]; $album->copyright = $vars["copyright"]; $album->enabled = $vars["enabled"] == "on"; $this->write(); break; case "edit": $album = $this->albums[$vars["id"]]; $form = new Form("update"); $form->addWidget(new LineEdit("Album title:", "title", $album->title)); $form->addWidget(new LineEdit("Album copyright:", "copyright", $album->copyright)); $form->addWidget(new LineEdit("Album ID:", "id", $album->id)); $form->addWidget(new CheckBox("Album enabled:", "enabled", $album->enabled)); $form->addWidget(new Button("Update")); $form->render(); break; case "select": default: $albumlist = array(); foreach($this->albums as $album) { $albumlist[$album->title . " (".$album->id.")"] = $album->id; } krsort($albumlist); $form = new Form("edit"); $form->addWidget(new ComboBox("Select album:", "id", "", $albumlist)); $form->addWidget(new Button("Edit")); $form->render(); break; } } public function admin_options($action, $vars) { switch($action) { case "store": $this->maxwidth_navicon = $vars['maxwidth_navicon']; $this->maxheight_navicon = $vars['maxheight_navicon']; $this->maxwidth_icon = $vars['maxwidth_icon']; $this->maxheight_icon = $vars['maxheight_icon']; $this->maxwidth_rand = $vars['maxwidth_rand']; $this->maxheight_rand = $vars['maxheight_rand']; $this->maxwidth = $vars['maxwidth']; $this->maxheight = $vars['maxheight']; $this->write(); default: $form = new Form("store"); $form->addWidget(new LineEdit("NavIcon maxwidth:", "maxwidth_navicon", $this->maxwidth_navicon)); $form->addWidget(new LineEdit("NavIcon maxheight:", "maxheight_navicon", $this->maxheight_navicon)); $form->addWidget(new LineEdit("Icon maxwidth:", "maxwidth_icon", $this->maxwidth_icon)); $form->addWidget(new LineEdit("Icon maxheight:", "maxheight_icon", $this->maxheight_icon)); $form->addWidget(new LineEdit("Random maxwidth:", "maxwidth_rand", $this->maxwidth_rand)); $form->addWidget(new LineEdit("Random maxheight:", "maxheight_rand", $this->maxheight_rand)); $form->addWidget(new LineEdit("Image maxwidth:", "maxwidth", $this->maxwidth)); $form->addWidget(new LineEdit("Image maxheight:", "maxheight", $this->maxheight)); $form->addWidget(new Button("Update")); $form->render(); break; } } public function admin($sub, $action, $vars) { switch($sub) { case "options": $this->admin_options($action, $vars); break; case "new": $this->admin_new($action, $vars); break; case "edit": $this->admin_edit($action, $vars); break; case "delete": $this->admin_new($action, $vars); break; } } public function showRandomPhoto() { $str = ""; srand((float) microtime() * 10000000); if(sizeof($this->albums) == 0) return ""; $album = array_rand($this->albums); if(sizeof($this->albums[$album]->photos) == 0) return ""; $photo = array_rand($this->albums[$album]->photos); $str .= " \n"; $str .= $this->albums[$album]->photos[$photo]->show(" ", "randomimage"); $str .= " \n"; return $str; } public function showAlbums() { $str = ""; $str .= "\n\n"; foreach($this->albums as $album) { if($album->enabled) $str .= $album->showIcon(" "); } $str .= "\n"; return $str; } public function showPhoto($album, $photo) { $str = ""; if($this->albums[$album]) { $str .= $this->albums[$album]->showPhoto(" ", $photo); } return $str; } public function showRef($id) { if(!$this->albums[$id]) return ""; return $this->albums[$id]->showRef(); } public function run($params) { global $a, $p; $str = ""; $str .= "\n\n"; foreach($params as $param => $value) { switch($param) { case "random": $str .= $this->showRandomPhoto(); break; default: if($p != "" && $a != "") $str .= $this->showPhoto($a, $p); else if($a != "" && $this->albums[$a] && $p == "") $str .= $this->albums[$a]->show(" "); else $str .= $this->showAlbums(); break; } } $str .= "\n"; return $str; } public function add($album) { $this->albums[$album->id] = $album; } public function getNextID() { $maxid = 0; foreach($this->albums as $album) { if($album->id > $nextid) $maxid = $album->id; } return $maxid + 1; } public function checkUniqueID($id) { foreach($this->albums as $album) { if($album->id == $id) return false; } return true; } public function getImageSize($cat) { switch($cat) { case "photo": return new ImageSize($this->maxwidth, $this->maxheight, false); case "randomimage": return new ImageSize($this->maxwidth_rand, $this->maxheight_rand, true); case "navicon": return new ImageSize($this->maxwidth_navicon, $this->maxheight_navicon, true); case "albumicon": return new ImageSize($this->maxwidth_icon, $this->maxheight_icon, true); case "reficon": // return new ImageSize($this->maxwidth_reficon, $this->maxheight_reficon, true); return new ImageSize(32, 24, true); default: die(404); } } public function write() { $fp = fopen($this->file, "w"); fwrite($fp, "\n"); fwrite($fp, "maxwidth_navicon."\"\n"); fwrite($fp, " maxheight_navicon=\"".$this->maxheight_navicon."\"\n"); fwrite($fp, " maxwidth_icon=\"".$this->maxwidth_icon."\"\n"); fwrite($fp, " maxheight_icon=\"".$this->maxheight_icon."\"\n"); fwrite($fp, " maxwidth_rand=\"".$this->maxwidth_rand."\"\n"); fwrite($fp, " maxheight_rand=\"".$this->maxheight_rand."\"\n"); fwrite($fp, " maxwidth=\"".$this->maxwidth."\"\n"); fwrite($fp, " maxheight=\"".$this->maxheight."\">\n"); foreach($this->albums as $album) { $album->write($fp); } fwrite($fp, "\n"); fclose($fp); } private function read() { $dom = new DomDocument; $dom->resolveExternals = FALSE; $dom->substituteEntities = FALSE; $dom->preserveWhiteSpace = FALSE; $dom->load($this->file); $gallery = $dom->documentElement; $this->maxwidth_navicon = $gallery->getAttribute('maxwidth_navicon'); $this->maxheight_navicon = $gallery->getAttribute('maxheight_navicon'); $this->maxwidth_icon = $gallery->getAttribute('maxwidth_icon'); $this->maxheight_icon = $gallery->getAttribute('maxheight_icon'); $this->maxwidth_rand = $gallery->getAttribute('maxwidth_rand'); $this->maxheight_rand = $gallery->getAttribute('maxheight_rand'); $this->maxwidth = $gallery->getAttribute('maxwidth'); $this->maxheight = $gallery->getAttribute('maxheight'); foreach($gallery->childNodes as $albumElem) { if($albumElem->tagName != "album") continue; $album = new Album($albumElem->getAttribute('id'), $albumElem->getAttribute('title'), $albumElem->getAttribute('copyright'), $albumElem->getAttribute('icon'), $albumElem->getAttribute('enabled')); foreach($albumElem->childNodes as $photoElem) { if($photoElem->tagName != "photo") continue; $photo = new Photo($album->getPath(), $photoElem->getAttribute('id'), $photoElem->getAttribute('title'), $photoElem->getAttribute('image')); $album->add($photo); } $this->add($album); } } public function Gallery($file) { $this->file = $file; if(file_exists($file)) $this->read(); } } function gallery_init() { global $DATA_DIR; return new Gallery($DATA_DIR . "/gallery.xml"); } ?>