diff --git a/contrib/pools/main.php b/contrib/pools/main.php new file mode 100644 index 00000000..10d63a12 --- /dev/null +++ b/contrib/pools/main.php @@ -0,0 +1,673 @@ +<?php +/** + * Name: Pools System + * Author: Sein Kraft <mail@seinkraft.info> + * License: GPLv2 + * Description: Allow users to create groups of images + * Documentation: + */ + +class Pools extends SimpleExtension { + public function onInitExt($event) { + global $config, $database; + + if ($config->get_int("ext_pools_version") < 1){ + $database->create_table("pools", " + id SCORE_AIPK, + user_id INTEGER NOT NULL, + public SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N, + title VARCHAR(255) NOT NULL, + description TEXT, + date DATETIME NOT NULL, + posts INTEGER NOT NULL DEFAULT 0, + INDEX (id) + "); + $database->create_table("pool_images", " + pool_id INTEGER NOT NULL, + image_id INTEGER NOT NULL, + image_order INTEGER NOT NULL DEFAULT 0 + "); + $database->create_table("pool_history", " + id SCORE_AIPK, + pool_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + action INTEGER NOT NULL, + images TEXT, + count INTEGER NOT NULL DEFAULT 0, + date DATETIME NOT NULL, + INDEX (id) + "); + + $config->set_int("ext_pools_version", 1); + + $config->set_int("poolsMaxImportResults", 1000); + $config->set_int("poolsImagesPerPage", 20); + $config->set_int("poolsListsPerPage", 20); + $config->set_int("poolsUpdatedPerPage", 20); + $config->set_bool("poolsInfoOnViewImage", "N"); + $config->set_bool("poolsAdderOnViewImage", "N"); + + log_info("pools", "extension installed"); + } + } + + public function onSetupBuilding(SetupBuildingEvent $event) { + $sb = new SetupBlock("Pools"); + $sb->add_int_option("poolsMaxImportResults", "Max results on import: "); + $sb->add_int_option("poolsImagesPerPage", "<br>Images per page: "); + $sb->add_int_option("poolsListsPerPage", "<br>Index list items per page: "); + $sb->add_int_option("poolsUpdatedPerPage", "<br>Updated list items per page: "); + $sb->add_bool_option("poolsInfoOnViewImage", "<br>Show pool info on image: "); + //$sb->add_bool_option("poolsAdderOnViewImage", "<br>Show pool adder on image: "); + $event->panel->add_block($sb); + } + + public function onPageRequest($event) { + global $config, $page, $user; + + if($event->page_matches("pool")) { + switch($event->get_arg(0)) { + case "list": //index + $this->list_pools($page, int_escape($event->get_arg(1))); + break; + + case "new": // Show form + if(!$user->is_anonymous()){ + $this->theme->new_pool_composer($page); + } else { + $errMessage = "You must be registered and logged in to create a new pool."; + $this->theme->display_error($errMessage); + } + break; + + case "create": // ADD _POST + if(!$user->is_anonymous()) { + $newPoolID = $this->add_pool(); + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/view/".$newPoolID)); + } else { + $this->theme->display_error("You must be registered and logged in to add a image."); + } + break; + + case "view": + $poolID = int_escape($event->get_arg(1)); + $this->get_posts($event, $poolID); + break; + + case "updated": + $this->get_history(int_escape($event->get_arg(1))); + break; + + case "revert": + if(!$user->is_anonymous()) { + $historyID = int_escape($event->get_arg(1)); + $this->revert_history($historyID); + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/updated")); + } + break; + + case "edit": + $poolID = int_escape($event->get_arg(1)); + $pools = $this->get_pool($poolID); + + foreach($pools as $pool) { + // if the pool is public and user is logged OR if the user is admin OR the user is the owner + if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + $this->theme->edit_pool($page, $this->get_pool($poolID), $this->edit_posts($poolID)); + } else { + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/view/".$poolID)); + } + } + break; + + case "order": + if($_SERVER["REQUEST_METHOD"] == "GET") { + $poolID = int_escape($event->get_arg(1)); + $pools = $this->get_pool($poolID); + + foreach($pools as $pool) { + //if the pool is public and user is logged OR if the user is admin + if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + $this->theme->edit_order($page, $this->get_pool($poolID), $this->edit_order($poolID)); + } else { + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/view/".$poolID)); + } + } + } + else { + $pool_id = int_escape($_POST["pool_id"]); + $pool = $this->get_single_pool($pool_id); + + if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + $this->order_posts(); + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/view/".$pool_id)); + } else { + $this->theme->display_error("Permssion denied."); + } + } + break; + + case "import": + $pool_id = int_escape($_POST["pool_id"]); + $pool = $this->get_single_pool($pool_id); + + if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + $this->import_posts(); + } else { + $this->theme->display_error("Permssion denied."); + } + break; + + case "add_posts": + $pool_id = int_escape($_POST["pool_id"]); + $pool = $this->get_single_pool($pool_id); + + if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + $this->add_posts(); + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/view/".$pool_id)); + } else { + $this->theme->display_error("Permssion denied."); + } + break; + + case "remove_posts": + $pool_id = int_escape($_POST["pool_id"]); + $pool = $this->get_single_pool($pool_id); + + if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + $this->remove_posts(); + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/view/".$pool_id)); + } else { + $this->theme->display_error("Permssion denied."); + } + + break; + + case "nuke": + $pool_id = int_escape($_POST['pool_id']); + $pool = $this->get_single_pool($pool_id); + + // only admins and owners may do this + if($user->is_admin() || $user->id == $pool['user_id']) { + $this->nuke_pool($pool_id); + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/list")); + } else { + $this->theme->display_error("Permssion denied."); + } + break; + + default: + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/list")); + break; + } + } + } + + public function onUserBlockBuilding($event) { + $event->add_link("Pools", make_link("pool/list")); + } + + + /* + * HERE WE GET THE POOLS WHERE THE IMAGE APPEARS WHEN THE IMAGE IS DISPLAYED + */ + public function onDisplayingImage($event) { + global $config, $database, $page; + + if($config->get_bool("poolsInfoOnViewImage")) { + $imageID = $event->image->id; + $poolsIDs = $this->get_pool_id($imageID); + + $linksPools = array(); + foreach($poolsIDs as $poolID) { + $pools = $this->get_pool($poolID['pool_id']); + foreach ($pools as $pool){ + $linksPools[] = "<a href='".make_link("pool/view/".$pool['id'])."'>".html_escape($pool['title'])."</a>"; + } + } + $this->theme->pool_info($linksPools); + } + } + + public function onImageAdminBlockBuilding($event) { + global $config, $database, $user; + if($config->get_bool("poolsAdderOnViewImage") && !$user->is_anonymous()) { + if($user->is_admin()) { + $pools = $database->get_all("SELECT * FROM pools"); + } + else { + $pools = $database->get_all("SELECT * FROM pools WHERE user_id=?", array($user->id)); + } + if(count($pools) > 0) { + $event->add_part($this->theme->get_adder_html($event->image, $pools)); + } + } + } + + + /* + * HERE WE GET THE LIST OF POOLS + */ + private function list_pools(Page $page, $pageNumber) { + global $config, $database; + + if(is_null($pageNumber) || !is_numeric($pageNumber)) + $pageNumber = 0; + else if ($pageNumber <= 0) + $pageNumber = 0; + else + $pageNumber--; + + $poolsPerPage = $config->get_int("poolsListsPerPage"); + + $pools = $database->get_all( + "SELECT p.id, p.user_id, p.public, p.title, p.description, p.posts, u.name as user_name ". + "FROM pools AS p ". + "INNER JOIN users AS u ". + "ON p.user_id = u.id ". + "ORDER BY p.date DESC ". + "LIMIT ?, ?" + , array($pageNumber * $poolsPerPage, $poolsPerPage) + ); + + $totalPages = ceil($database->db->GetOne("SELECT COUNT(*) FROM pools") / $poolsPerPage); + + $this->theme->list_pools($page, $pools, $pageNumber + 1, $totalPages); + } + + + /* + * HERE WE CREATE A NEW POOL + */ + private function add_pool() { + global $user, $database; + + $public = $_POST["public"] == "Y" ? "Y" : "N"; + $database->execute(" + INSERT INTO pools (user_id, public, title, description, date) + VALUES (?, ?, ?, ?, now())", + array($user->id, $public, $_POST["title"], $_POST["description"])); + + $result = $database->get_row("SELECT LAST_INSERT_ID() AS poolID"); # FIXME database specific? + + log_info("pools", "Pool {$result["poolID"]} created by {$user->name}"); + + return $result["poolID"]; + } + + private function get_pool($poolID) { + global $database; + return $database->get_all("SELECT * FROM pools WHERE id=?", array($poolID)); + } + + private function get_single_pool($poolID) { + global $database; + return $database->get_row("SELECT * FROM pools WHERE id=?", array($poolID)); + } + + /* + * HERE WE GET THE ID OF THE POOL FROM AN IMAGE + */ + private function get_pool_id($imageID) { + global $database; + return $database->get_all("SELECT pool_id FROM pool_images WHERE image_id=?", array($imageID)); + } + + + /* + * HERE WE GET THE IMAGES FROM THE TAG ON IMPORT + */ + private function import_posts() { + global $page, $config, $database; + + $pool_id = int_escape($_POST["pool_id"]); + + $poolsMaxResults = $config->get_int("poolsMaxImportResults", 1000); + + $images = $images = Image::find_images(0, $poolsMaxResults, Tag::explode($_POST["pool_tag"])); + $this->theme->pool_result($page, $images, $pool_id); + } + + + /* + * HERE WE ADD CHECKED IMAGES FROM POOL AND UPDATE THE HISTORY + */ + private function add_posts() { + global $database; + + $poolID = int_escape($_POST['pool_id']); + $images = ""; + + foreach ($_POST['check'] as $imageID){ + if(!$this->check_post($poolID, $imageID)){ + $database->execute(" + INSERT INTO pool_images (pool_id, image_id) + VALUES (?, ?)", + array($poolID, $imageID)); + + $images .= " ".$imageID; + } + + } + + if(!strlen($images) == 0) { + $count = $database->db->GetOne("SELECT COUNT(*) FROM pool_images WHERE pool_id=?", array($poolID)); + $this->add_history($poolID, 1, $images, $count); + } + + $database->Execute(" + UPDATE pools + SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=?) + WHERE id=?", + array($poolID, $poolID) + ); + return $poolID; + } + + private function order_posts() { + global $database; + + $poolID = int_escape($_POST['pool_id']); + + foreach($_POST['imgs'] as $data) { + list($imageORDER, $imageID) = $data; + $database->Execute(" + UPDATE pool_images + SET image_order = ? + WHERE pool_id = ? AND image_id = ?", + array($imageORDER, $poolID, $imageID) + ); + } + + return $poolID; + } + + + /* + * HERE WE REMOVE CHECKED IMAGES FROM POOL AND UPDATE THE HISTORY + */ + private function remove_posts() { + global $database; + + $poolID = int_escape($_POST['pool_id']); + $images = ""; + + foreach($_POST['check'] as $imageID) { + $database->execute("DELETE FROM pool_images WHERE pool_id = ? AND image_id = ?", array($poolID, $imageID)); + $images .= " ".$imageID; + } + + $count = $database->db->GetOne("SELECT COUNT(*) FROM pool_images WHERE pool_id=?", array($poolID)); + $this->add_history($poolID, 0, $images, $count); + return $poolID; + } + + + /* + * HERE WE CHECK IF THE POST IS ALREADY ON POOL + * USED IN add_posts() + */ + private function check_post($poolID, $imageID) { + global $database; + $result = $database->db->GetOne("SELECT COUNT(*) FROM pool_images WHERE pool_id=? AND image_id=?", array($poolID, $imageID)); + return ($result != 0); + } + + + /* + * HERE WE GET ALL IMAGES FOR THE POOL + */ + private function get_posts($event, $poolID) { + global $config, $user, $database; + + $pageNumber = int_escape($event->get_arg(2)); + if(is_null($pageNumber) || !is_numeric($pageNumber)) + $pageNumber = 0; + else if ($pageNumber <= 0) + $pageNumber = 0; + else + $pageNumber--; + + $poolID = int_escape($poolID); + + $imagesPerPage = $config->get_int("poolsImagesPerPage"); + + // WE CHECK IF THE EXTENSION RATING IS INSTALLED, WHICH VERSION AND IF IT + // WORKS TO SHOW/HIDE SAFE, QUESTIONABLE, EXPLICIT AND UNRATED IMAGES FROM USER + if(class_exists("Ratings")) { + $rating = Ratings::privs_to_sql(Ratings::get_user_privs($user)); + + $result = $database->get_all(" + SELECT p.image_id + FROM pool_images AS p + INNER JOIN images AS i ON i.id = p.image_id + WHERE p.pool_id = ? AND i.rating IN ($rating) + ORDER BY p.image_order ASC + LIMIT ?, ?", + array($poolID, $pageNumber * $imagesPerPage, $imagesPerPage)); + + $totalPages = ceil($database->db->GetOne(" + SELECT COUNT(*) + FROM pool_images AS p + INNER JOIN images AS i ON i.id = p.image_id + WHERE pool_id=? AND i.rating IN ($rating)", + array($poolID)) / $imagesPerPage); + } + else { + $result = $database->get_all(" + SELECT image_id + FROM pool_images + WHERE pool_id=? + ORDER BY image_order ASC + LIMIT ?, ?", + array($poolID, $pageNumber * $imagesPerPage, $imagesPerPage)); + $totalPages = ceil($database->db->GetOne("SELECT COUNT(*) FROM pool_images WHERE pool_id=?", array($poolID)) / $imagesPerPage); + } + + $images = array(); + foreach($result as $singleResult) { + $images[] = Image::by_id($singleResult["image_id"]); + } + + $pool = $this->get_pool($poolID); + $this->theme->view_pool($pool, $images, $pageNumber + 1, $totalPages); + } + + + /* + * WE GET THE ORDER OF THE IMAGES + */ + private function edit_posts($poolID) { + global $database; + + $result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=? ORDER BY image_order ASC", array($poolID)); + + $images = array(); + while(!$result->EOF) { + $image = Image::by_id($result->fields["image_id"]); + $images[] = array($image); + $result->MoveNext(); + } + + return $images; + } + + + /* + * WE GET THE ORDER OF THE IMAGES BUT HERE WE SEND KEYS ADDED IN ARRAY TO GET THE ORDER IN THE INPUT VALUE + */ + private function edit_order($poolID) { + global $database; + + $result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=? ORDER BY image_order ASC", array($poolID)); + $images = array(); + while(!$result->EOF) { + $image = $database->get_row(" + SELECT * FROM images AS i + INNER JOIN pool_images AS p ON i.id = p.image_id + WHERE pool_id=? AND i.id=?", + array($poolID, $result->fields["image_id"])); + $image = ($image ? new Image($image) : null); + $images[] = array($image); + $result->MoveNext(); + } + // Original code + // + // $images = array(); + // while(!$result->EOF) { + // $image = Image::by_id($result->fields["image_id"]); + // $images[] = array($image); + // $result->MoveNext(); + // } + return $images; + } + + + /* + * HERE WE NUKE ENTIRE POOL. WE REMOVE POOLS AND POSTS FROM REMOVED POOL AND HISTORIES ENTRIES FROM REMOVED POOL + */ + private function nuke_pool($poolID) { + global $user, $database; + + if($user->is_admin()) { + $database->execute("DELETE FROM pool_history WHERE pool_id = ?", array($poolID)); + $database->execute("DELETE FROM pool_images WHERE pool_id = ?", array($poolID)); + $database->execute("DELETE FROM pools WHERE id = ?", array($poolID)); + } elseif(!$user->is_anonymous()) { + // FIXME: WE CHECK IF THE USER IS THE OWNER OF THE POOL IF NOT HE CAN'T DO ANYTHING + $database->execute("DELETE FROM pool_history WHERE pool_id = ?", array($poolID)); + $database->execute("DELETE FROM pool_images WHERE pool_id = ?", array($poolID)); + $database->execute("DELETE FROM pools WHERE id = ? AND user_id = ?", array($poolID, $user->id)); + } + } + + + /* + * HERE WE ADD A HISTORY ENTRY + * FOR $action 1 (one) MEANS ADDED, 0 (zero) MEANS REMOVED + */ + private function add_history($poolID, $action, $images, $count) { + global $user, $database; + $database->execute(" + INSERT INTO pool_history (pool_id, user_id, action, images, count, date) + VALUES (?, ?, ?, ?, ?, now())", + array($poolID, $user->id, $action, $images, $count)); + } + + + /* + * HERE WE GET THE HISTORY LIST + */ + private function get_history($pageNumber) { + global $config, $database; + + if(is_null($pageNumber) || !is_numeric($pageNumber)) + $pageNumber = 0; + else if ($pageNumber <= 0) + $pageNumber = 0; + else + $pageNumber--; + + + $historiesPerPage = $config->get_int("poolsUpdatedPerPage"); + + $history = $database->get_all( + "SELECT h.id, h.pool_id, h.user_id, h.action, h.images, h.count, h.date, u.name as user_name, p.title as title ". + "FROM pool_history AS h ". + "INNER JOIN pools AS p ". + "ON p.id = h.pool_id ". + "INNER JOIN users AS u ". + "ON h.user_id = u.id ". + "ORDER BY h.date DESC ". + "LIMIT ?, ?" + , array($pageNumber * $historiesPerPage, $historiesPerPage)); + + $totalPages = ceil($database->db->GetOne("SELECT COUNT(*) FROM pool_history") / $historiesPerPage); + + $this->theme->show_history($history, $pageNumber + 1, $totalPages); + } + + + + /* + * HERE GO BACK IN HISTORY AND ADD OR REMOVE POSTS TO POOL + */ + private function revert_history($historyID) { + global $database; + $status = $database->get_all("SELECT * FROM pool_history WHERE id=?", array($historyID)); + + foreach($status as $entry) { + $images = trim($entry['images']); + $images = explode(" ", $images); + $poolID = $entry['pool_id']; + $imageArray = ""; + + if($entry['action'] == 0) { + // READ ENTRIES + foreach($images as $image) { + $imageID = $image; + $this->add_post($poolID, $imageID); + + $imageArray .= " ".$imageID; + $newAction = 1; + } + } + else if($entry['action'] == 1) { + // DELETE ENTRIES + foreach($images as $image) { + $imageID = $image; + $this->delete_post($poolID, $imageID); + + $imageArray .= " ".$imageID; + $newAction = 0; + } + } + + $count = $database->db->GetOne("SELECT COUNT(*) FROM pool_images WHERE pool_id=?", array($poolID)); + $this->add_history($poolID, $newAction, $imageArray, $count); + } + } + + + + /* + * HERE WE ADD A SIMPLE POST FROM POOL + * USED WITH FOREACH IN revert_history() + */ + private function add_post($poolID, $imageID) { + global $database; + + if(!$this->check_post($poolID, $imageID)) { + $database->execute(" + INSERT INTO pool_images (pool_id, image_id) + VALUES (?, ?)", + array($poolID, $imageID)); + } + + $database->execute("UPDATE pools SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=?) WHERE id=?", array($poolID, $poolID)); + } + + + + /* + * HERE WE REMOVE A SIMPLE POST FROM POOL + * USED WITH FOREACH IN revert_history() + */ + private function delete_post($poolID, $imageID) { + global $database; + + $database->execute("DELETE FROM pool_images WHERE pool_id = ? AND image_id = ?", array($poolID, $imageID)); + $database->execute("UPDATE pools SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=?) WHERE id=?", array($poolID, $poolID)); + } + +} +?> diff --git a/contrib/pools/test.php b/contrib/pools/test.php new file mode 100644 index 00000000..b322ac6b --- /dev/null +++ b/contrib/pools/test.php @@ -0,0 +1,41 @@ +<?php +class PoolsTest extends ShimmieWebTestCase { + function testPools() { + $this->get_page('pool/list'); + $this->assert_title("Pools"); + + $this->get_page('pool/new'); + $this->assert_title("Error"); + + + $this->log_in_as_user(); + + $this->get_page('pool/list'); + $this->click("Create New"); + $this->assert_title("Create Pool"); + $this->click("Create"); + $this->assert_title("Error"); + + $this->get_page('pool/new'); + $this->assert_title("Create Pool"); + $this->set_field("title", "Test Pool Title"); + $this->set_field("description", "Test pool description"); + $this->click("Create"); + $this->assert_title("Pool: Test Pool Title"); + + $this->log_out(); + + + $this->log_in_as_admin(); + + $this->get_page('pool/list'); + $this->click("Test Pool Title"); + $this->assert_title("Pool: Test Pool Title"); + $this->click("Delete"); + $this->assert_title("Pools"); + $this->assert_no_text("Test Pool Title"); + + $this->log_out(); + } +} +?> diff --git a/contrib/pools/theme.php b/contrib/pools/theme.php new file mode 100644 index 00000000..3ef967a6 --- /dev/null +++ b/contrib/pools/theme.php @@ -0,0 +1,403 @@ +<?php +class PoolsTheme extends Themelet { + /* + * HERE WE ADD THE POOL INFO ON IMAGE + */ + public function pool_info($linksPools) { + global $page; + if(count($linksPools) > 0) { + $page->add_block(new Block("Pools", implode("<br>", $linksPools), "left")); + } + } + + public function get_adder_html(Image $image, $pools) { + $editor = ""; + $h = ""; + foreach($pools as $pool) { + $h .= "<option value='".$pool['id']."'>".html_escape($pool['title'])."</option>"; + } + $editor = " + <form method='POST' action='".make_link("pool/add_post")."'> + <select name='pool_id'> + $h + </select> + <input type='hidden' name='image_id' value='{$image->id}'> + <input type='submit' value='Add Image to Pool'> + </form> + "; + return $editor; + } + + + /* + * HERE WE SHOWS THE LIST OF POOLS + */ + public function list_pools(Page $page, $pools, $pageNumber, $totalPages) { + global $user; + $html = '<table id="poolsList" class="zebra">'. + "<thead><tr>". + "<th>Name</th>". + "<th>Creator</th>". + "<th>Posts</th>". + "<th>Public</th>". + "</tr></thead>"; + + $n = 0; + foreach($pools as $pool) { + $oe = ($n++ % 2 == 0) ? "even" : "odd"; + + $pool_link = '<a href="'.make_link("pool/view/".$pool['id']).'">'.html_escape($pool['title'])."</a>"; + $user_link = '<a href="'.make_link("user/".url_escape($pool['user_name'])).'">'.html_escape($pool['user_name'])."</a>"; + $public = ($pool['public'] == "Y" ? "Yes" : "No"); + + $html .= "<tr class='$oe'>". + "<td class='left'>".$pool_link."</td>". + "<td>".$user_link."</td>". + "<td>".$pool['posts']."</td>". + "<td>".$public."</td>". + "</tr>"; + } + + $html .= "</tbody></table>"; + + + $nav_html = " + <a href=".make_link().">Index</a> + <br><a href=".make_link("pool/new").">Create Pool</a> + <br><a href=".make_link("pool/updated").">Pool Changes</a> + "; + + $blockTitle = "Pools"; + $page->set_title(html_escape($blockTitle)); + $page->set_heading(html_escape($blockTitle)); + $page->add_block(new Block($blockTitle, $html, "main", 10)); + $page->add_block(new Block("Navigation", $nav_html, "left", 10)); + + $this->display_paginator($page, "pool/list", null, $pageNumber, $totalPages); + } + + + /* + * HERE WE DISPLAY THE NEW POOL COMPOSER + */ + public function new_pool_composer(Page $page) { + $create_html = "<form action=".make_link("pool/create")." method='POST'> + <table> + <tr><td>Title:</td><td><input type='text' name='title'></td></tr> + <tr><td>Public?</td><td><input name='public' type='checkbox' value='Y' checked='checked'/></td></tr> + <tr><td>Description:</td><td><textarea name='description'></textarea></td></tr> + <tr><td colspan='2'><input type='submit' value='Submit' /></td></tr> + </table> + "; + + $blockTitle = "Create Pool"; + $page->set_title(html_escape($blockTitle)); + $page->set_heading(html_escape($blockTitle)); + $page->add_block(new Block("Create Pool", $create_html, "main", 20)); + } + + + private function display_top($pools, $heading, $check_all=false) { + global $page, $user; + + $page->set_title($heading); + $page->set_heading($heading); + if(count($pools) == 1) { + $pool = $pools[0]; + if($pool['public'] == "Y" || $user->is_admin()) {// IF THE POOL IS PUBLIC OR IS ADMIN SHOW EDIT PANEL + if(!$user->is_anonymous()) {// IF THE USER IS REGISTERED AND LOGGED IN SHOW EDIT PANEL + $this->sidebar_options($page, $pool, $check_all); + } + } + $page->add_block(new Block(html_escape($pool['title']), html_escape($pool['description']), "main", 10)); + } + else { + $pool_info = "<table id='poolsList' class='zebra'>". + "<thead><tr>". + "<th class='left'>Title</th>". + "<th class='left'>Description</th>". + "</tr></thead>"; + + $n = 0; + foreach($pools as $pool) { + $oe = ($n++ % 2 == 0) ? "even" : "odd"; + + $pool_info .= "<tr class='$oe'>". + "<td class='left'>".html_escape($pool['title'])."</td>". + "<td class='left'>".html_escape($pool['description'])."</td>". + "</tr>"; + + // this will make disasters if more than one pool comes in the parameter + if($pool['public'] == "Y" || $user->is_admin()) {// IF THE POOL IS PUBLIC OR IS ADMIN SHOW EDIT PANEL + if(!$user->is_anonymous()) {// IF THE USER IS REGISTERED AND LOGGED IN SHOW EDIT PANEL + $this->sidebar_options($page, $pool, $check_all); + } + } + } + + $pool_info .= "</tbody></table>"; + $page->add_block(new Block($heading, $pool_info, "main", 10)); + } + } + + + /* + * HERE WE DISPLAY THE POOL WITH TITLE DESCRIPTION AND IMAGES WITH PAGINATION + */ + public function view_pool($pools, $images, $pageNumber, $totalPages) { + global $user, $page; + + $this->display_top($pools, "Viewing Pool"); + + $pool_images = ''; + foreach($images as $image) { + $thumb_html = $this->build_thumb_html($image); + $pool_images .= '<span class="thumb">'. + '<a href="$image_link">'.$thumb_html.'</a>'. + '</span>'; + } + + $page->add_block(new Block("Viewing Posts", $pool_images, "main", 30)); + $this->display_paginator($page, "pool/view/".$pools[0]['id'], null, $pageNumber, $totalPages); + } + + + /* + * HERE WE DISPLAY THE POOL OPTIONS ON SIDEBAR BUT WE HIDE REMOVE OPTION IF THE USER IS NOT THE OWNER OR ADMIN + */ + public function sidebar_options(Page $page, $pool, $check_all) { + global $user; + + $editor = " <form action='".make_link("pool/import")."' method='POST'> + <input type='text' name='pool_tag' id='edit' value='Please enter a tag' onclick='this.value=\"\";'/> + <input type='submit' name='edit' id='edit' value='Import'/> + <input type='hidden' name='pool_id' value='".$pool['id']."'> + </form> + + <form method='GET' action='".make_link("pool/edit/".$pool['id'])."'> + <input type='submit' name='edit' id='edit' value='Edit Pool'/> + </form> + + <form method='GET' action='".make_link("pool/order/".$pool['id'])."'> + <input type='submit' name='edit' id='edit' value='Order Pool'/> + </form> + "; + + if($user->id == $pool['user_id'] || $user->is_admin()){ + $editor .= " + <script type='text/javascript'> + function confirm_action() { + return confirm('Are you sure that you want to delete this pool?'); + } + </script> + + <form action='".make_link("pool/nuke")."' method='POST'> + <input type='submit' name='delete' id='delete' value='Delete Pool' onclick='return confirm_action()' /> + <input type='hidden' name='pool_id' value='".$pool['id']."'> + </form> + "; + } + + if($check_all) { + $editor .= " + <script language='JavaScript' type='text/javascript'> + function setAll(value) { + var a=new Array(); + a=document.getElementsByName('check[]'); + var p=0; + for(i=0;i<a.length;i++){ + a[i].checked = value; + } + } + </script> + <br><input type='button' name='CheckAll' value='Check All' onClick='setAll(true)'> + <input type='button' name='UnCheckAll' value='Uncheck All' onClick='setAll(false)'> + "; + } + $page->add_block(new Block("Manage Pool", $editor, "left", 10)); + } + + + /* + * HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT + */ + public function pool_result(Page $page, $images, $pool_id) { + $pool_images = " + <script language='JavaScript' type='text/javascript'> + function setAll(value) { + var a=new Array(); + a=document.getElementsByName('check[]'); + var p=0; + for(i=0;i<a.length;i++) { + a[i].checked = value; + } + } + + function confirm_action() { + return confirm('Are you sure you want to add selected posts to this pool?'); + } + </script> + "; + + $pool_images .= "<form action='".make_link("pool/add_posts")."' method='POST' name='checks'>"; + + foreach($images as $image) { + $thumb_html = $this->build_thumb_html($image); + + $pool_images .= '<span class="thumb">'. + '<a href="$image_link">'.$thumb_html.'</a>'. + '<br>'. + '<input name="check[]" type="checkbox" value="'.$image->id.'" />'. + '</span>'; + } + $pool_images .= "<br>". + "<input type='submit' name='edit' id='edit' value='Add Selected' onclick='return confirm_action()'/>". + "<input type='hidden' name='pool_id' value='".$pool_id."'>". + "</form>"; + + $page->add_block(new Block("Import", $pool_images, "main", 10)); + + $editor = " + <input type='button' name='CheckAll' value='Check All' onClick='setAll(true)'> + <input type='button' name='UnCheckAll' value='Uncheck All' onClick='setAll(false)'> + "; + + $page->add_block(new Block("Manage Pool", $editor, "left", 10)); + } + + + /* + * HERE WE DISPLAY THE POOL ORDERER + * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH A TEXT INPUT TO SET A NUMBER AND CHANGE THE ORDER + */ + public function edit_order(Page $page, $pools, $images) { + global $user; + + $this->display_top($pools, "Sorting Pool"); + + $pool_images = "<form action='".make_link("pool/order")."' method='POST' name='checks'>"; + $n = 0; + foreach($images as $pair) { + $image = $pair[0]; + $thumb_html = $this->build_thumb_html($image); + $pool_images .= '<span class="thumb">'. + '<a href="$image_link">'.$thumb_html.'</a>'. + '<br><input name="imgs['.$n.'][]" type="text" style="max-width:50px;" value="'.$image->image_order.'" />'. + '<input name="imgs['.$n.'][]" type="hidden" value="'.$image->id.'" />'. + '</span>'; + $n++; + } + + $pool_images .= "<br>". + "<input type='submit' name='edit' id='edit' value='Order'/>". + "<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>". + "</form>"; + + $page->add_block(new Block("Sorting Posts", $pool_images, "main", 30)); + } + + + /* + * HERE WE DISPLAY THE POOL EDITOR + * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH + * A CHECKBOX TO SELECT WHICH IMAGE WE WANT TO REMOVE + */ + public function edit_pool(Page $page, $pools, $images) { + global $user; + + $this->display_top($pools, "Editing Pool", true); + + $pool_images = " + "; + + $pool_images = "<form action='".make_link("pool/remove_posts")."' method='POST' name='checks'>"; + + foreach($images as $pair) { + $image = $pair[0]; + + $thumb_html = $this->build_thumb_html($image); + + $pool_images .= '<span class="thumb">'. + '<a href="$image_link">'.$thumb_html.'</a>'. + '<br><input name="check[]" type="checkbox" value="'.$image->id.'" />'. + '</span>'; + } + + $pool_images .= "<br>". + "<input type='submit' name='edit' id='edit' value='Remove Selected'/>". + "<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>". + "</form>"; + + $page->add_block(new Block("Editing Posts", $pool_images, "main", 30)); + } + + + /* + * HERE WE DISPLAY THE HISTORY LIST + */ + public function show_history($histories, $pageNumber, $totalPages) { + global $page; + $html = "<table id='poolsList' class='zebra'>". + "<thead><tr>". + "<th>Pool</th>". + "<th>Post Count</th>". + "<th>Changes</th>". + "<th>Updater</th>". + "<th>Date</th>". + "<th>Action</th>". + "</tr></thead>"; + + $n = 0; + foreach($histories as $history) { + $oe = ($n++ % 2 == 0) ? "even" : "odd"; + + $pool_link = "<a href='".make_link("pool/view/".$history['pool_id'])."'>".html_escape($history['title'])."</a>"; + $user_link = "<a href='".make_link("user/".url_escape($history['user_name']))."'>".html_escape($history['user_name'])."</a>"; + $revert_link = "<a href='".make_link("pool/revert/".$history['id'])."'>Revert</a>"; + + if ($history['action'] == 1) { + $prefix = "+"; + } elseif ($history['action'] == 0) { + $prefix = "-"; + } + + $images = trim($history['images']); + $images = explode(" ", $images); + + $image_link = ""; + foreach ($images as $image) { + $image_link .= "<a href='".make_link("post/view/".$image)."'>".$prefix.$image." </a>"; + } + + $html .= "<tr class='$oe'>". + "<td class='left'>".$pool_link."</td>". + "<td>".$history['count']."</td>". + "<td>".$image_link."</td>". + "<td>".$user_link."</td>". + "<td>".$history['date']."</td>". + "<td>".$revert_link."</td>". + "</tr>"; + } + + $html .= "</tbody></table>"; + + $page->set_title("Recent Changes"); + $page->set_heading("Recent Changes"); + $page->add_block(new Block("Recent Changes", $html, "main", 10)); + + $this->display_paginator($page, "pool/updated", null, $pageNumber, $totalPages); + } + + + /* + * HERE WE DISPLAY THE ERROR + */ + public function display_error($errMessage) { + global $page; + + $page->set_title("Error"); + $page->set_heading("Error"); + $page->add_block(new Block("Error", $errMessage, "main", 10)); + } +} +?>