From 0a1e8f2af4db3cf722aa80a678f27d16fc17993c Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Sat, 4 Feb 2012 12:20:49 -0500 Subject: [PATCH 01/36] Store config values that are used inside a loop. --- ext/tag_list/theme.php | 16 ++++++++++------ ext/upload/main.php | 2 ++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ext/tag_list/theme.php b/ext/tag_list/theme.php index 99d83664..7014bb3c 100644 --- a/ext/tag_list/theme.php +++ b/ext/tag_list/theme.php @@ -69,23 +69,27 @@ class TagListTheme extends Themelet { */ public function display_popular_block(Page $page, $tag_infos) { global $config; + + $info_link = $config->get_string('info_link'); + $tag_list_num = $config->get_bool("tag_list_numbers"); $html = ""; $n = 0; + foreach($tag_infos as $row) { $tag = $row['tag']; $h_tag = html_escape($tag); $h_tag_no_underscores = str_replace("_", " ", $h_tag); $count = $row['count']; if($n++) $html .= "\n
"; - if(!is_null($config->get_string('info_link'))) { - $link = str_replace('$tag', $tag, $config->get_string('info_link')); - $html .= " ?"; + if(!is_null($info_link)) { + $link = str_replace('$tag', $tag, $info_link); + $html .= ' ?'; } $link = $this->tag_link($row['tag']); - $html .= " $h_tag_no_underscores"; - if($config->get_bool("tag_list_numbers")) { - $html .= " $count"; + $html .= ' '.$h_tag_no_underscores.''; + if($tag_list_num) { + $html .= ' '.$count.''; } } diff --git a/ext/upload/main.php b/ext/upload/main.php index 979ab413..8d2281fa 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -58,6 +58,8 @@ class Upload extends SimpleExtension { $this->is_full = false; } else { + // TODO: This size limit should be configureable by the admin... + // currently set to 100 MB $this->is_full = $free_num < 100*1024*1024; } From 68e9bd694ef492a2516c119e7c8e993f6e21e5e4 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Sat, 4 Feb 2012 14:17:52 -0500 Subject: [PATCH 02/36] Storing copies of config variables outside of for loops. --- core/page.class.php | 10 +++++++--- ext/comment/theme.php | 9 ++++++--- ext/tag_list/theme.php | 13 +++++++++---- ext/upload/theme.php | 3 ++- themes/danbooru/comment.theme.php | 8 ++++++-- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/core/page.class.php b/core/page.class.php index 6570632b..356febdf 100644 --- a/core/page.class.php +++ b/core/page.class.php @@ -289,7 +289,11 @@ class Page { { global $config; - if (!$config->get_bool("autocache_css") && !$config->get_bool("autocache_js")) { + // store local copy for speed. + $autocache_css = $config->get_bool("autocache_css"); + $autocache_js = config->get_bool("autocache_js") + + if (!$autocache_css && !$autocache_js) { return false; // caching disabled } @@ -307,7 +311,7 @@ class Page { $data_href = get_base_href(); /* ----- CSS Files ----- */ - if ($config->get_bool("autocache_css")) + if ($autocache_css) { // First get all the CSS from the lib directory $contents_from_lib = ''; @@ -374,7 +378,7 @@ class Page { /* ----- JavaScript Files ----- */ - if ($config->get_bool("autocache_js")) + if ($autocache_js) { $data = ''; $js_files = glob("lib/*.js"); diff --git a/ext/comment/theme.php b/ext/comment/theme.php index 56afa513..15911c47 100644 --- a/ext/comment/theme.php +++ b/ext/comment/theme.php @@ -35,14 +35,17 @@ class CommentListTheme extends Themelet { // parts for each image $position = 10; + + $comment_limit = $config->get_int("comment_list_count", 10); + $comment_captcha = $config->get_bool('comment_captcha'); + foreach($images as $pair) { $image = $pair[0]; $comments = $pair[1]; $thumb_html = $this->build_thumb_html($image); - $comment_html = ""; - $comment_limit = $config->get_int("comment_list_count", 10); + $comment_count = count($comments); if($comment_limit > 0 && $comment_count > $comment_limit) { $hidden = $comment_count - $comment_limit; @@ -59,7 +62,7 @@ class CommentListTheme extends Themelet { } } else { if ($can_post) { - if(!$config->get_bool('comment_captcha')) { + if(!$comment_captcha) { $comment_html .= $this->build_postbox($image->id); } else { diff --git a/ext/tag_list/theme.php b/ext/tag_list/theme.php index 7014bb3c..23065572 100644 --- a/ext/tag_list/theme.php +++ b/ext/tag_list/theme.php @@ -70,6 +70,7 @@ class TagListTheme extends Themelet { public function display_popular_block(Page $page, $tag_infos) { global $config; + // store local copies for speed. $info_link = $config->get_string('info_link'); $tag_list_num = $config->get_bool("tag_list_numbers"); @@ -107,19 +108,23 @@ class TagListTheme extends Themelet { public function display_refine_block(Page $page, $tag_infos, $search) { global $config; + // store local copy for speed. + $info_link = $config->get_string('info_link'); + $html = ""; $n = 0; + foreach($tag_infos as $row) { $tag = $row['tag']; $h_tag = html_escape($tag); $h_tag_no_underscores = str_replace("_", " ", $h_tag); if($n++) $html .= "\n
"; - if(!is_null($config->get_string('info_link'))) { - $link = str_replace('$tag', $tag, $config->get_string('info_link')); - $html .= " ?"; + if(!is_null($info_link)) { + $link = str_replace('$tag', $tag, $info_link); + $html .= ' ?'; } $link = $this->tag_link($row['tag']); - $html .= " $h_tag_no_underscores"; + $html .= ' '.$h_tag_no_underscores.''; $html .= $this->ars($tag, $search); } diff --git a/ext/upload/theme.php b/ext/upload/theme.php index 9e66e457..c237493d 100644 --- a/ext/upload/theme.php +++ b/ext/upload/theme.php @@ -18,6 +18,7 @@ class UploadTheme extends Themelet { $upload_list = ""; $upload_count = $config->get_int('upload_count'); + for($i=0; $i<$upload_count; $i++) { $a=$i+1; @@ -53,7 +54,7 @@ class UploadTheme extends Themelet { ". ""; - if($a==$config->get_int('upload_count')){ + if($a == $upload_count){ $upload_list .=""; }else{ $js1 = 'javascript:$(function() { diff --git a/themes/danbooru/comment.theme.php b/themes/danbooru/comment.theme.php index ff728eac..a9ee90e1 100644 --- a/themes/danbooru/comment.theme.php +++ b/themes/danbooru/comment.theme.php @@ -25,6 +25,10 @@ class CustomCommentListTheme extends CommentListTheme { // parts for each image $position = 10; + + $comment_captcha = $config->get_bool('comment_captcha'); + $comment_limit = $config->get_int("comment_list_count", 10); + foreach($images as $pair) { $image = $pair[0]; $comments = $pair[1]; @@ -42,7 +46,7 @@ class CustomCommentListTheme extends CommentListTheme { $r = class_exists("Ratings") ? "Rating ".Ratings::rating_to_human($image->rating) : ""; $comment_html = "Date $p $s User $un $s $r
Tags $t

 "; - $comment_limit = $config->get_int("comment_list_count", 10); + $comment_count = count($comments); if($comment_limit > 0 && $comment_count > $comment_limit) { $hidden = $comment_count - $comment_limit; @@ -57,7 +61,7 @@ class CustomCommentListTheme extends CommentListTheme { $comment_html .= $this->build_postbox($image->id); } else { - if(!$config->get_bool('comment_captcha')) { + if(!$comment_captcha) { $comment_html .= $this->build_postbox($image->id); } else { From cd1f5d9ed0a133af3563234602ee1530db33b62a Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Sat, 4 Feb 2012 14:49:48 -0500 Subject: [PATCH 03/36] Missed a semicolon. --- core/page.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/page.class.php b/core/page.class.php index 356febdf..2995814c 100644 --- a/core/page.class.php +++ b/core/page.class.php @@ -291,7 +291,7 @@ class Page { // store local copy for speed. $autocache_css = $config->get_bool("autocache_css"); - $autocache_js = config->get_bool("autocache_js") + $autocache_js = config->get_bool("autocache_js"); if (!$autocache_css && !$autocache_js) { return false; // caching disabled From 3b028696a06fe55af9912400f41d247ac38db79d Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Sat, 4 Feb 2012 15:35:21 -0500 Subject: [PATCH 04/36] Rewind arrays before foreach loops over all the elements. (fixed a small typo as well) --- contrib/favorites/theme.php | 2 ++ contrib/log_db/theme.php | 2 ++ contrib/rating/main.php | 3 +++ core/config.class.php | 1 + core/imageboard.pack.php | 9 +++++++++ core/page.class.php | 4 ++-- ext/upload/main.php | 4 ++++ 7 files changed, 23 insertions(+), 2 deletions(-) diff --git a/contrib/favorites/theme.php b/contrib/favorites/theme.php index 4bb452ae..14a4fd39 100644 --- a/contrib/favorites/theme.php +++ b/contrib/favorites/theme.php @@ -24,6 +24,8 @@ class FavoritesTheme extends Themelet { $i_favorites = count($username_array); $html = "$i_favorites people:"; + reset($username_array); // rewind to first element in array. + foreach($username_array as $row) { $username = html_escape($row); $html .= "
$username"; diff --git a/contrib/log_db/theme.php b/contrib/log_db/theme.php index 6ac2d3a1..1d3d8ccf 100644 --- a/contrib/log_db/theme.php +++ b/contrib/log_db/theme.php @@ -41,6 +41,8 @@ class LogDatabaseTheme extends Themelet { \n"; $n = 0; + reset($events); // rewind to first element in array. + foreach($events as $event) { $oe = ($n++ % 2 == 0) ? "even" : "odd"; $c = $this->pri_to_col($event['priority']); diff --git a/contrib/rating/main.php b/contrib/rating/main.php index b246b14e..ba1546ab 100644 --- a/contrib/rating/main.php +++ b/contrib/rating/main.php @@ -40,6 +40,9 @@ class Ratings implements Extension { while(true) { $images = Image::find_images($n, 100, Tag::explode($_POST["query"])); if(count($images) == 0) break; + + reset($images); // rewind to first element in array. + foreach($images as $image) { send_event(new RatingSetEvent($image, $user, $_POST['rating'])); } diff --git a/core/config.class.php b/core/config.class.php index 2f918173..92c27b23 100644 --- a/core/config.class.php +++ b/core/config.class.php @@ -188,6 +188,7 @@ class DatabaseConfig extends BaseConfig { */ public function save($name=null) { if(is_null($name)) { + reset($this->values); // rewind the array to the first element foreach($this->values as $name => $value) { $this->save($name); } diff --git a/core/imageboard.pack.php b/core/imageboard.pack.php index 1be135fa..d215337e 100644 --- a/core/imageboard.pack.php +++ b/core/imageboard.pack.php @@ -770,6 +770,8 @@ class Image { } } + reset($terms); // rewind to first element in array. + // turn each term into a specific type of querylet foreach($terms as $term) { $negative = false; @@ -1002,8 +1004,15 @@ class Tag { } } + /** + * This function takes a list (array) of tags and changes any tags that have aliases + * + * @param $tags Array of tags + * @return Array of tags + */ public static function resolve_list($tags) { $tags = Tag::explode($tags); + reset($tags); // rewind array to the first element. $new = array(); foreach($tags as $tag) { $new_set = explode(' ', Tag::resolve_alias($tag)); diff --git a/core/page.class.php b/core/page.class.php index 2995814c..411c9053 100644 --- a/core/page.class.php +++ b/core/page.class.php @@ -291,7 +291,7 @@ class Page { // store local copy for speed. $autocache_css = $config->get_bool("autocache_css"); - $autocache_js = config->get_bool("autocache_js"); + $autocache_js = $config->get_bool("autocache_js"); if (!$autocache_css && !$autocache_js) { return false; // caching disabled @@ -396,7 +396,7 @@ class Page { // Minify the JS if enabled. if ($config->get_bool("autocache_min_js")){ // not supported yet. - // TODO: add support for Minifying CSS files. + // TODO: add support for Minifying JS files. } // compute the MD5 sum of the concatenated JavaScript files diff --git a/ext/upload/main.php b/ext/upload/main.php index 8d2281fa..2aee068f 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -152,12 +152,14 @@ class Upload extends SimpleExtension { $tags = ''; // Tags aren't changed when uploading. Set to null to stop PHP warnings. if(count($_FILES)) { + reset($_FILES); // rewind to first element in array. foreach($_FILES as $file) { $ok = $this->try_upload($file, $tags, $source, $image_id); break; // leave the foreach loop. } } else { + reset($_POST); // rewind to first element in array. foreach($_POST as $name => $value) { if(substr($name, 0, 3) == "url" && strlen($value) > 0) { $ok = $this->try_transload($value, $tags, $source, $image_id); @@ -188,9 +190,11 @@ class Upload extends SimpleExtension { $source = isset($_POST['source']) ? $_POST['source'] : null; $ok = true; foreach($_FILES as $file) { + reset($_FILES); // rewind to first element in array. $ok = $ok & $this->try_upload($file, $tags, $source); } foreach($_POST as $name => $value) { + reset($_POST); // rewind to first element in array. if(substr($name, 0, 3) == "url" && strlen($value) > 0) { $ok = $ok & $this->try_transload($value, $tags, $source); } From 9e67e531aa7f1b62662999c44eb9f8b7fd6959ef Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Sat, 4 Feb 2012 23:16:50 -0500 Subject: [PATCH 05/36] How is this typo still in here? --- core/extension.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/extension.class.php b/core/extension.class.php index e5ce13d2..b54956de 100644 --- a/core/extension.class.php +++ b/core/extension.class.php @@ -191,7 +191,7 @@ abstract class DataHandlerExtension extends SimpleExtension { } } - public function onThumnbnailGeneration(ThumbnailGenerationEvent $event) { + public function onThumbnailGeneration(ThumbnailGenerationEvent $event) { if($this->supported_ext($event->type)) { if (method_exists($this, 'create_thumb_force') && $event->force == true) { $this->create_thumb_force($event->hash); From 8db3546c8d87fff7ab396a32fe2c910c98bc89e2 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Sun, 5 Feb 2012 12:11:56 -0500 Subject: [PATCH 06/36] Changes to the install script for Issue 101. --- install.php | 78 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 32 deletions(-) diff --git a/install.php b/install.php index 09da4d33..61a1bf69 100755 --- a/install.php +++ b/install.php @@ -1,7 +1,8 @@ - + + Shimmie Installation - @@ -31,9 +33,10 @@ TD INPUT {width: 350px;}

Install Error

Shimmie needs to be run via a web server with PHP support -- you appear to be either opening the file from your hard disk, or your - web server is mis-configured. + web server is mis-configured.

If you've installed a web server on your desktop PC, you probably - want to visit the local web server. + want to visit the local web server.

+

@@ -52,6 +55,7 @@ if(is_readable("config.php")) { <h1>Shimmie Repair Console</h1> <?php include "config.php"; + if($_SESSION['dsn'] == DATABASE_DSN || $_POST['dsn'] == DATABASE_DSN) { if($_POST['dsn']) {$_SESSION['dsn'] = $_POST['dsn'];} @@ -76,10 +80,12 @@ if(is_readable("config.php")) { </form> "; */ - echo "<h3>Database quick fix for User deletion</h3>"; - echo "just a database fix for those who instaled shimmie before 2012 january the 22rd.<br>"; - echo "Note: some things needs to be done manually, to work properly.<br>"; - echo "WARNING: ONLY PROCEEDS IF YOU KNOW WHAT YOU ARE DOING!"; + echo "<h3>Database Fix for User deletion</h3>"; + echo "This is a database fix for those who instaled shimmie before 2012 January 22rd.<br/>"; + echo "<b>This is only for users with <u>MySQL</u> databases!</b><br/>"; + echo "Note: Some things needs to be done manually, to work properly.<br/>"; + echo "Please BACKUP YOUR DATABASE before performing this fix!<br>"; + echo "WARNING: ONLY PROCEEDS IF YOU KNOW WHAT YOU ARE DOING!<br>"; echo " <form action='install.php?action=Database_user_deletion_fix' method='POST'> <input type='submit' value='go!'> @@ -102,8 +108,7 @@ if(is_readable("config.php")) { } else { echo " <h3>Login</h3> - Enter the database DSN exactly as in config.php (ie, as originally - installed) to access advanced recovery tools: + <p>Enter the database DSN exactly as in config.php (ie, as originally installed) to access advanced recovery tools:</p> <form action='install.php' method='POST'> <center> @@ -249,7 +254,7 @@ function begin() { // {{{ <h3>Help</h3> <p>Please make sure the database you have chosen exists and is empty.<br> - The username provided must have access to create tables within the database. + The username provided must have access to create tables within the database.</p> </div> EOD; @@ -354,11 +359,12 @@ function build_dirs() { // {{{ !file_exists("images") || !file_exists("thumbs") || !file_exists("data") || !is_writable("images") || !is_writable("thumbs") || !is_writable("data") ) { - print "Shimmie needs three folders in it's directory, 'images', 'thumbs', and 'data', - and they need to be writable by the PHP user (if you see this error, - if probably means the folders are owned by you, and they need to be - writable by the web server). - <p>Once you have created these folders, hit 'refresh' to continue."; + print "<p>Shimmie needs three folders in it's directory, 'images', 'thumbs', and 'data', + and they need to be writable by the PHP user.</p> + <p>If you see this error, if probably means the folders are owned by you, and they need to be + writable by the web server.</p> + <p>PHP reports that it is currently running as user: ".$_ENV["USER"]." (". $_SERVER["USER"] .")</p> + <p>Once you have created these folders and/or changed the ownership of the shimmie folder, hit 'refresh' to continue.</p>"; exit; } } // }}} @@ -393,10 +399,18 @@ function Database_user_deletion_fix() { require_once "core/database.class.php"; $db = new Database(); - echo "Fixing user_favorites table...."; + if ($database->db->getAttribute(PDO::ATTR_DRIVER_NAME) !== 'mysql') { + echo "<br><br>Database is not MySQL - Aborting changes.<br><br>"; + echo '<a href="install.php">Go Back</a>'; + return; + } else { + echo "<h3>Performing Database Fix Operations</h3><br>"; + } + + echo "Fixing user_favorites table....<br><br>"; ($db->Execute("ALTER TABLE user_favorites ENGINE=InnoDB;")) ? print_r("ok<br>") : print_r("failed<br>"); - echo "adding Foreign key to user ids..."; + echo "adding Foreign key to user ids...<br><br>"; ($db->Execute("ALTER TABLE user_favorites ADD CONSTRAINT foreign_user_favorites_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;"))? print_r("ok<br>"):print_r("failed<br>"); echo "cleaning, the table from deleted image favorites...<br>"; @@ -406,17 +420,17 @@ function Database_user_deletion_fix() { foreach( $rows as $key => $value) $db->Execute("DELETE FROM user_favorites WHERE image_id = :image_id;", array("image_id" => $value["image_id"])); - echo "adding forign key to image ids..."; + echo "adding forign key to image ids...<br><br>"; ($db->Execute("ALTER TABLE user_favorites ADD CONSTRAINT user_favorites_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE;"))? print_r("ok<br>"):print_r("failed<br>"); - echo "adding foreign keys to private messages..."; + echo "adding foreign keys to private messages...<br><br>"; ($db->Execute("ALTER TABLE private_message ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;")) ? print_r("ok<br>"):print_r("failed<br>"); - echo "Just one more step...which you need to do manually:<br>"; + echo "<br><br>Just one more step...which you need to do manually:<br>"; echo "You need to go to your database and Delete the foreign key on the owner_id in the images table.<br><br>"; echo "<a href='http://www.justin-cook.com/wp/2006/05/09/how-to-remove-foreign-keys-in-mysql/'>How to remove foreign keys</a><br><br>"; echo "and finally execute this querry:<br><br>"; From a78ca78c9b0210f1eac1ebe798d6b3a55c9ac191 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" <jgen.tech@gmail.com> Date: Sun, 5 Feb 2012 16:35:34 -0500 Subject: [PATCH 07/36] More changes to the install script. More error checking, better formating, etc.. --- core/database.class.php | 2 +- install.php | 65 +++++++++++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/core/database.class.php b/core/database.class.php index 27805521..53abd16e 100644 --- a/core/database.class.php +++ b/core/database.class.php @@ -310,7 +310,7 @@ class Database { } $matches = array(); - if(CACHE_DSN && preg_match("#(memcache|apc)://(.*)#", CACHE_DSN, $matches)) { + if( defined("CACHE_DSN") && CACHE_DSN && preg_match("#(memcache|apc)://(.*)#", CACHE_DSN, $matches)) { if($matches[1] == "memcache") { $this->cache = new MemcacheCache($matches[2]); } diff --git a/install.php b/install.php index 61a1bf69..a14c4c7a 100755 --- a/install.php +++ b/install.php @@ -54,10 +54,32 @@ if(is_readable("config.php")) { <div id="iblock"> <h1>Shimmie Repair Console</h1> <?php - include "config.php"; + + /* + * Compute the path to the folder containing "install.php" and + * store it as the 'Shimmie Root' folder for later on. + * + * Example: + * __SHIMMIE_ROOT__ = '/var/www/shimmie2/' + * + */ + define('__SHIMMIE_ROOT__', trim( remove_trailing_slash( dirname(__FILE__) ) ) . '/' ); + + // Pull in necessary files + require_once __SHIMMIE_ROOT__."config.php"; // Load user/site specifics First + require_once __SHIMMIE_ROOT__."core/default_config.inc.php"; // Defaults for the rest. + require_once __SHIMMIE_ROOT__."core/util.inc.php"; + require_once __SHIMMIE_ROOT__."core/database.class.php"; - if($_SESSION['dsn'] == DATABASE_DSN || $_POST['dsn'] == DATABASE_DSN) { - if($_POST['dsn']) {$_SESSION['dsn'] = $_POST['dsn'];} + if ( + ( array_key_exists('dsn', $_SESSION) && $_SESSION['dsn'] === DATABASE_DSN ) || + ( array_key_exists('dsn', $_POST) && $_POST['dsn'] === DATABASE_DSN ) + ) + { + if ( array_key_exists('dsn', $_POST) && !empty($_POST['dsn']) ) + { + $_SESSION['dsn'] = $_POST['dsn']; + } if(empty($_GET["action"])) { echo "<h3>Basic Checks</h3>"; @@ -81,14 +103,14 @@ if(is_readable("config.php")) { "; */ echo "<h3>Database Fix for User deletion</h3>"; - echo "This is a database fix for those who instaled shimmie before 2012 January 22rd.<br/>"; - echo "<b>This is only for users with <u>MySQL</u> databases!</b><br/>"; - echo "Note: Some things needs to be done manually, to work properly.<br/>"; + echo "<p>This is a database fix for those who instaled shimmie before 2012 January 22rd.</p>"; + echo "<p><b>This is only for users with <u>MySQL</u> databases!</b></p>"; + echo "<p>Note: Some things needs to be done manually, to work properly.<br/>"; echo "Please BACKUP YOUR DATABASE before performing this fix!<br>"; - echo "WARNING: ONLY PROCEEDS IF YOU KNOW WHAT YOU ARE DOING!<br>"; + echo "WARNING: ONLY PROCEED IF YOU KNOW WHAT YOU ARE DOING!<br></p>"; echo " <form action='install.php?action=Database_user_deletion_fix' method='POST'> - <input type='submit' value='go!'> + <input type='submit' value='Go'> </form> "; @@ -101,6 +123,7 @@ if(is_readable("config.php")) { } else if($_GET["action"] == "logout") { session_destroy(); + echo "<h3>Logged Out</h3><p>You have been logged out.</p><a href='index.php'>Main Shimmie Page</a>"; } else if($_GET["action"] == "Database_user_deletion_fix") { Database_user_deletion_fix(); @@ -123,13 +146,24 @@ if(is_readable("config.php")) { echo "\t\t</div>"; exit; } -require_once "core/compat.inc.php"; -require_once "core/util.inc.php"; -require_once "core/database.class.php"; do_install(); // utilities {{{ + +/** + * Strips off any kind of slash at the end so as to normalise the path. + * @param string $path Path to normalise. + * @return string Path without trailing slash. + */ +function remove_trailing_slash($path) { + if ((substr($path, -1) === '/') || (substr($path, -1) === '\\')) { + return substr($path, 0, -1); + } else { + return $path; + } +} + function check_gd_version() { $gdversion = 0; @@ -394,15 +428,14 @@ EOD; } } // }}} -function Database_user_deletion_fix() { +function Database_user_deletion_fix() { // {{{ try { - require_once "core/database.class.php"; $db = new Database(); - if ($database->db->getAttribute(PDO::ATTR_DRIVER_NAME) !== 'mysql') { + if ($db->db->getAttribute(PDO::ATTR_DRIVER_NAME) !== 'mysql') { echo "<br><br>Database is not MySQL - Aborting changes.<br><br>"; echo '<a href="install.php">Go Back</a>'; - return; + throw new PDOException("Database is not MySQL."); } else { echo "<h3>Performing Database Fix Operations</h3><br>"; } @@ -443,7 +476,7 @@ function Database_user_deletion_fix() { // FIXME: Make the error message user friendly exit($e->getMessage()); } -} +} // }}} ?> </body> </html> From d3d395c3472c62fcc96e4a300c326f10c3474250 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Wed, 1 Feb 2012 19:16:55 +0000 Subject: [PATCH 08/36] reset image id function for admin this basically grabs all the image_id's > sets them all from 1-whatever (so it would be like you never deleted an image) --- contrib/admin/main.php | 43 +++++++++++++++++++++++++++++++++++++++++ contrib/admin/theme.php | 1 + 2 files changed, 44 insertions(+) diff --git a/contrib/admin/main.php b/contrib/admin/main.php index 3d03915d..de3bf10a 100644 --- a/contrib/admin/main.php +++ b/contrib/admin/main.php @@ -78,6 +78,10 @@ class AdminPage extends SimpleExtension { case 'database dump': $this->dbdump($page); break; + case 'reset image ids': + $this->reset_imageids(); + $redirect = true; + break; } if($redirect) { @@ -175,5 +179,44 @@ class AdminPage extends SimpleExtension { } } */ + + private function reset_imageids() { + global $database; + //This might be a bit laggy on boards with lots of images (?) + //Seems to work fine with 1.2k~ images though. + $i = 0; + $image = $database->get_all("SELECT * FROM images ORDER BY images.id ASC"); + /*$score_log = $database->get_all("SELECT message FROM score_log");*/ + foreach($image as $img){ + $xid = $img[0]; + $i = $i + 1; + $table = array( //Might be missing some tables? + "image_tags", "tag_histories", "image_reports", "comments", "user_favorites", "tag_histories", + "numeric_score_votes", "pool_images", "slext_progress_cache", "notes"); + + $sql = + "SET FOREIGN_KEY_CHECKS=0; + UPDATE images + SET id=".$i. + " WHERE id=".$xid.";"; //id for images + + foreach($table as $tbl){ + $sql .= " + UPDATE ".$tbl." + SET image_id=".$i." + WHERE image_id=".$xid.";"; + } + + /*foreach($score_log as $sl){ + //This seems like a bad idea. + //TODO: Might be better for log_info to have an $id option (which would then affix the id to the table?) + preg_replace(".Image \\#[0-9]+.", "Image #".$i, $sl); + }*/ + $sql .= " SET FOREIGN_KEY_CHECKS=1;"; + $database->execute($sql); + } + $count = (count($image)) + 1; + $database->execute("ALTER TABLE images AUTO_INCREMENT=".$count); + } } ?> diff --git a/contrib/admin/theme.php b/contrib/admin/theme.php index 18cc9687..37d1f7e2 100644 --- a/contrib/admin/theme.php +++ b/contrib/admin/theme.php @@ -26,6 +26,7 @@ class AdminPageTheme extends Themelet { <option value='recount tag use'>Recount tag use</option> <option value='purge unused tags'>Purge unused tags</option> <option value='database dump'>Download database contents</option> + <option value='reset image ids'>Reset image ids</option> <!--<option value='convert to innodb'>Convert database to InnoDB (MySQL only)</option>--> </select> <input type='submit' value='Go'> From 26b688fe9b6d19c7d8b5ef354c2b6eb5003db817 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Thu, 2 Feb 2012 00:56:17 +0000 Subject: [PATCH 09/36] bookmarklet now supports oreno.imouto --- ext/upload/bookmarklet.js | 40 ++++++++++++++++++++++++++++++--------- ext/upload/theme.php | 8 ++++---- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ext/upload/bookmarklet.js b/ext/upload/bookmarklet.js index 2838bdca..86710973 100644 --- a/ext/upload/bookmarklet.js +++ b/ext/upload/bookmarklet.js @@ -4,22 +4,45 @@ var maxsze = (maxsze.match("(?:\.*[0-9])")) * 1024; //This assumes we are only working with MB. var toobig = "The file you are trying to upload is too big to upload!"; var notsup = "The file you are trying to upload is not supported!"; +if (CA === 0 || CA > 2){ //Default + if (confirm("OK = Use Current tags.\nCancel = Use new tags.")==true){ + }else{ + var tag=prompt("Enter Tags",""); + var chk=1; //This makes sure it doesn't use current tags. + } +}else if (CA === 1){ //Current Tags +}else if (CA === 2){ //New Tags + var tag=prompt("Enter Tags",""); + var chk=1; +} -if (confirm("OK = Use Current tags.\nCancel = Use new tags.")==true){}else{var tag=prompt("Enter Tags","");var chk=1;}; - -// Danbooru +// Danbooru | oreno.imouto if(document.getElementById("post_tags") !== null){ if (typeof tag !=="ftp://ftp." && chk !==1){var tag=document.getElementById("post_tags").value;} - var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*)<\/li>")[1]; var srx="http://" + document.location.hostname + document.location.href.match("\/post\/show\/[0-9]+\/"); + var hrs=document.getElementById("highres").href; + if(srx.search("oreno\\.imouto") >= 0){ + var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*) <span")[1]; + }else{ + var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*)<\/li>")[1]; + } if(tag.search(/\bflash\b/)===-1){ - var filesze=document.getElementById("stats").innerHTML.match("[0-9] \\(((?:\.*[0-9])) ([a-zA-Z]+)"); + if(srx.search("oreno\\.imouto") >= 0){ //oreno's theme seems to have moved the filesize + var filesze = document.getElementById("highres").innerHTML.match("[a-zA-Z0-9]+ \\(+([0-9]+\\.[0-9]+) ([a-zA-Z]+)"); + }else{ + var filesze=document.getElementById("stats").innerHTML.match("[0-9] \\(((?:\.*[0-9])) ([a-zA-Z]+)"); + } if(filesze[2] == "MB"){var filesze = filesze[1] * 1024;}else{var filesze = filesze[2].match("[0-9]+");} - if(supext.search(document.getElementById("highres").href.match("http\:\/\/.*\\.([a-z0-9]+)")[1]) !== -1){ + if(supext.search(hrs.match("http\:\/\/.*\\.([a-z0-9]+)")[1]) !== -1){ if(filesze <= maxsze){ - location.href=ste+document.getElementById("highres").href+"&tags="+tag+"&rating="+rtg+"&source="+srx; + if(srx.search("oreno\\.imouto") >= 0){ + //this regex tends to be a bit picky with tags -_-;; + var hrs=hrs.match("(http\:\/\/[a-z0-9]+\.[a-z]+\.org\/[a-z0-9]+\/[a-z0-9]+)\/[a-z0-9A-Z%_]+(\.[a-zA-Z0-9]+)"); + var hrs=hrs[1]+hrs[2]; //this should bypass hotlink protection + } + location.href=ste+hrs+"&tags="+tag+"&rating="+rtg+"&source="+srx; }else{alert(toobig);} }else{alert(notsup);} }else{ @@ -29,6 +52,7 @@ if(document.getElementById("post_tags") !== null){ } } /* Shimmie +One problem with shimmie is each theme does not show the same info as other themes (I.E only the danbooru & lite themes show statistics) Shimmie doesn't seem to have any way to grab tags via id unless you have the ability to edit tags. Have to go the round about way of checking the title for tags. This crazy way of checking "should" work with older releases though (Seems to work with 2009~ ver) */ @@ -36,7 +60,6 @@ else if(document.getElementsByTagName("title")[0].innerHTML.search("Image [0-9.- if (typeof tag !=="ftp://ftp." && chk !==1){var tag=document.getElementsByTagName("title")[0].innerHTML.match("Image [0-9.-]+\: (.*)")[1];} //TODO: Make rating show in statistics. var srx="http://" + document.location.hostname + document.location.href.match("\/post\/view\/[0-9]+"); - /*TODO: Figure out regex for shortening file link. I.E http://blah.net/_images/1234abcd/everysingletag.png > http://blah.net/_images/1234abcd.png*/ /*TODO: Make file size show on all themes (Only seems to show in lite/Danbooru themes.)*/ if(tag.search(/\bflash\b/)==-1){ var img = document.getElementById("main_image").src; @@ -52,7 +75,6 @@ else if(document.getElementsByTagName("title")[0].innerHTML.search("Image [0-9.- } // Gelbooru else if(document.getElementById("tags") !== null){ - //Gelbooru has an annoying anti-hotlinking thing which doesn't seem to like the bookmarklet. if (typeof tag !=="ftp://ftp." && chk !==1){var tag=document.getElementById("tags").value;} var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*)<\/li>")[1]; //Can't seem to grab source due to url containing a & diff --git a/ext/upload/theme.php b/ext/upload/theme.php index 9e66e457..0e5e7127 100644 --- a/ext/upload/theme.php +++ b/ext/upload/theme.php @@ -145,8 +145,7 @@ class UploadTheme extends Themelet { { /* Imageboard > Shimmie Bookmarklet This is more or less, an upgraded version of the "Danbooru>Shimmie" bookmarklet. - At the moment this works with Shimmie & Danbooru. - It would also work with Gelbooru but unless someone can figure out how to bypass their hotlinking..meh. + At the moment this works with Shimmie/Danbooru/Gelbooru/oreno.imouto. The bookmarklet is now also loaded via the .js file in this folder. */ //Bookmarklet checks if shimmie supports ext. If not, won't upload to site/shows alert saying not supported. @@ -156,8 +155,9 @@ class UploadTheme extends Themelet { if(file_exists("ext/handle_mp3")){$supported_ext .= " mp3";} if(file_exists("ext/handle_svg")){$supported_ext .= " svg";} $title = "Booru to " . $config->get_string('title'); - $html .= '<p><a href="javascript:var ste=&quot;'. $link . $delimiter .'url=&quot;; var supext=&quot;'.$supported_ext.'&quot;; var maxsze=&quot;'.$max_kb.'&quot;; void(document.body.appendChild(document.createElement(&quot;script&quot;)).src=&quot;'.make_http(make_link("ext/upload/bookmarklet.js")).'&quot;)">'. - $title . '</a> (Click when looking at an image page. Works on sites running Shimmie/Danbooru/Gelbooru. (This also grabs the tags/rating/source!))'; + //CA=0: Ask to use current or new tags | CA=1: Always use current tags | CA=2: Always use new tags + $html .= '<p><a href="javascript:var ste=&quot;'. $link . $delimiter .'url=&quot;; var supext=&quot;'.$supported_ext.'&quot;; var maxsze=&quot;'.$max_kb.'&quot;; var CA=0; void(document.body.appendChild(document.createElement(&quot;script&quot;)).src=&quot;'.make_http(make_link("ext/upload/bookmarklet.js")).'&quot;)">'. + $title . '</a> (Click when looking at an image page. Works on sites running Shimmie/Danbooru/Gelbooru/oreno.imouto. (This also grabs the tags/rating/source!))'; } } From a25f4054707a691b2ad06683c41d8ecaaded8895 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Thu, 2 Feb 2012 13:01:40 +0000 Subject: [PATCH 10/36] bookmarklet now supports sankaku and konachan --- ext/upload/bookmarklet.js | 14 +++++++++----- ext/upload/theme.php | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ext/upload/bookmarklet.js b/ext/upload/bookmarklet.js index 86710973..5f45c6fc 100644 --- a/ext/upload/bookmarklet.js +++ b/ext/upload/bookmarklet.js @@ -16,19 +16,19 @@ if (CA === 0 || CA > 2){ //Default var chk=1; } -// Danbooru | oreno.imouto +// Danbooru | oreno.imouto | konachan | sankakucomplex if(document.getElementById("post_tags") !== null){ if (typeof tag !=="ftp://ftp." && chk !==1){var tag=document.getElementById("post_tags").value;} var srx="http://" + document.location.hostname + document.location.href.match("\/post\/show\/[0-9]+\/"); var hrs=document.getElementById("highres").href; - if(srx.search("oreno\\.imouto") >= 0){ + if(srx.search("oreno\\.imouto") >= 0 || srx.search("konachan\\.com") >= 0){ var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*) <span")[1]; }else{ var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*)<\/li>")[1]; } if(tag.search(/\bflash\b/)===-1){ - if(srx.search("oreno\\.imouto") >= 0){ //oreno's theme seems to have moved the filesize + if(srx.search("oreno\\.imouto") >= 0 || srx.search("konachan\\.com") >= 0){ //oreno's theme seems to have moved the filesize var filesze = document.getElementById("highres").innerHTML.match("[a-zA-Z0-9]+ \\(+([0-9]+\\.[0-9]+) ([a-zA-Z]+)"); }else{ var filesze=document.getElementById("stats").innerHTML.match("[0-9] \\(((?:\.*[0-9])) ([a-zA-Z]+)"); @@ -39,10 +39,14 @@ if(document.getElementById("post_tags") !== null){ if(filesze <= maxsze){ if(srx.search("oreno\\.imouto") >= 0){ //this regex tends to be a bit picky with tags -_-;; - var hrs=hrs.match("(http\:\/\/[a-z0-9]+\.[a-z]+\.org\/[a-z0-9]+\/[a-z0-9]+)\/[a-z0-9A-Z%_]+(\.[a-zA-Z0-9]+)"); + var hrs=hrs.match("(http\:\/\/[a-z0-9]+\.[a-z]+\.[a-z]\/[a-z0-9]+\/[a-z0-9]+)\/[a-z0-9A-Z%_-]+(\.[a-zA-Z0-9]+)"); var hrs=hrs[1]+hrs[2]; //this should bypass hotlink protection + }else if(srx.search("konachan\\.com") >= 0){ + //konachan affixs konachan.com to the start of the tags, this requires different regex + var hrs=hrs.match("(http\:\/\/[a-z0-9]+\.[a-z]+\.[a-z]\/[a-z0-9]+\/[a-z0-9]+)\/[a-z0-9A-Z%_]+\.[a-zA-Z0-9%_-]+(\.[a-z0-9A-Z]+)") + var hrs=hrs[1]+hrs[2]; } - location.href=ste+hrs+"&tags="+tag+"&rating="+rtg+"&source="+srx; + location.href="|"+ste+hrs+"&tags="+tag+"&rating="+rtg+"&source="+srx; }else{alert(toobig);} }else{alert(notsup);} }else{ diff --git a/ext/upload/theme.php b/ext/upload/theme.php index 0e5e7127..47cc9147 100644 --- a/ext/upload/theme.php +++ b/ext/upload/theme.php @@ -145,7 +145,7 @@ class UploadTheme extends Themelet { { /* Imageboard > Shimmie Bookmarklet This is more or less, an upgraded version of the "Danbooru>Shimmie" bookmarklet. - At the moment this works with Shimmie/Danbooru/Gelbooru/oreno.imouto. + At the moment this is known to work with Shimmie/Danbooru/Gelbooru/oreno.imouto/konachan/sankakucomplex. The bookmarklet is now also loaded via the .js file in this folder. */ //Bookmarklet checks if shimmie supports ext. If not, won't upload to site/shows alert saying not supported. @@ -157,7 +157,7 @@ class UploadTheme extends Themelet { $title = "Booru to " . $config->get_string('title'); //CA=0: Ask to use current or new tags | CA=1: Always use current tags | CA=2: Always use new tags $html .= '<p><a href="javascript:var ste=&quot;'. $link . $delimiter .'url=&quot;; var supext=&quot;'.$supported_ext.'&quot;; var maxsze=&quot;'.$max_kb.'&quot;; var CA=0; void(document.body.appendChild(document.createElement(&quot;script&quot;)).src=&quot;'.make_http(make_link("ext/upload/bookmarklet.js")).'&quot;)">'. - $title . '</a> (Click when looking at an image page. Works on sites running Shimmie/Danbooru/Gelbooru/oreno.imouto. (This also grabs the tags/rating/source!))'; + $title . '</a> (Click when looking at an image page. Works on sites running Shimmie/Danbooru/Gelbooru. (This also grabs the tags/rating/source!))'; } } From 1f871a69e14e50c88c439acfd6e811880f533a6a Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Thu, 2 Feb 2012 13:22:33 +0000 Subject: [PATCH 11/36] fixing flash again :x --- ext/upload/bookmarklet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/upload/bookmarklet.js b/ext/upload/bookmarklet.js index 5f45c6fc..ba0f79ed 100644 --- a/ext/upload/bookmarklet.js +++ b/ext/upload/bookmarklet.js @@ -20,7 +20,6 @@ if (CA === 0 || CA > 2){ //Default if(document.getElementById("post_tags") !== null){ if (typeof tag !=="ftp://ftp." && chk !==1){var tag=document.getElementById("post_tags").value;} var srx="http://" + document.location.hostname + document.location.href.match("\/post\/show\/[0-9]+\/"); - var hrs=document.getElementById("highres").href; if(srx.search("oreno\\.imouto") >= 0 || srx.search("konachan\\.com") >= 0){ var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*) <span")[1]; }else{ @@ -28,6 +27,7 @@ if(document.getElementById("post_tags") !== null){ } if(tag.search(/\bflash\b/)===-1){ + var hrs=document.getElementById("highres").href; if(srx.search("oreno\\.imouto") >= 0 || srx.search("konachan\\.com") >= 0){ //oreno's theme seems to have moved the filesize var filesze = document.getElementById("highres").innerHTML.match("[a-zA-Z0-9]+ \\(+([0-9]+\\.[0-9]+) ([a-zA-Z]+)"); }else{ From 6e602aa430491b45dd6baadf2a91d31d57463c97 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Thu, 2 Feb 2012 13:25:27 +0000 Subject: [PATCH 12/36] forgot to remove this... --- ext/upload/bookmarklet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/upload/bookmarklet.js b/ext/upload/bookmarklet.js index ba0f79ed..687d0c20 100644 --- a/ext/upload/bookmarklet.js +++ b/ext/upload/bookmarklet.js @@ -46,7 +46,7 @@ if(document.getElementById("post_tags") !== null){ var hrs=hrs.match("(http\:\/\/[a-z0-9]+\.[a-z]+\.[a-z]\/[a-z0-9]+\/[a-z0-9]+)\/[a-z0-9A-Z%_]+\.[a-zA-Z0-9%_-]+(\.[a-z0-9A-Z]+)") var hrs=hrs[1]+hrs[2]; } - location.href="|"+ste+hrs+"&tags="+tag+"&rating="+rtg+"&source="+srx; + location.href=ste+hrs+"&tags="+tag+"&rating="+rtg+"&source="+srx; }else{alert(toobig);} }else{alert(notsup);} }else{ From 9efce5378cee5ed5eac90d8b3ae6f19a8306cd11 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Thu, 2 Feb 2012 21:00:00 +0000 Subject: [PATCH 13/36] small fix for bookmarklet image url --- ext/upload/bookmarklet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/upload/bookmarklet.js b/ext/upload/bookmarklet.js index 687d0c20..cf951acd 100644 --- a/ext/upload/bookmarklet.js +++ b/ext/upload/bookmarklet.js @@ -19,7 +19,7 @@ if (CA === 0 || CA > 2){ //Default // Danbooru | oreno.imouto | konachan | sankakucomplex if(document.getElementById("post_tags") !== null){ if (typeof tag !=="ftp://ftp." && chk !==1){var tag=document.getElementById("post_tags").value;} - var srx="http://" + document.location.hostname + document.location.href.match("\/post\/show\/[0-9]+\/"); + var srx="http://" + document.location.hostname + document.location.href.match("\/post\/show\/[0-9]+"); if(srx.search("oreno\\.imouto") >= 0 || srx.search("konachan\\.com") >= 0){ var rtg=document.getElementById("stats").innerHTML.match("<li>Rating: (.*) <span")[1]; }else{ From 94d2f99df2a8c3518fe0ffae089dc01e95866ccf Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Sat, 4 Feb 2012 23:58:19 +0000 Subject: [PATCH 14/36] this should fix bookmarklet not working with nice urls --- ext/upload/theme.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/upload/theme.php b/ext/upload/theme.php index 47cc9147..17410a96 100644 --- a/ext/upload/theme.php +++ b/ext/upload/theme.php @@ -156,7 +156,7 @@ class UploadTheme extends Themelet { if(file_exists("ext/handle_svg")){$supported_ext .= " svg";} $title = "Booru to " . $config->get_string('title'); //CA=0: Ask to use current or new tags | CA=1: Always use current tags | CA=2: Always use new tags - $html .= '<p><a href="javascript:var ste=&quot;'. $link . $delimiter .'url=&quot;; var supext=&quot;'.$supported_ext.'&quot;; var maxsze=&quot;'.$max_kb.'&quot;; var CA=0; void(document.body.appendChild(document.createElement(&quot;script&quot;)).src=&quot;'.make_http(make_link("ext/upload/bookmarklet.js")).'&quot;)">'. + $html .= '<p><a href="javascript:var ste=&quot;'. $link . $delimiter .'url=&quot;; var supext=&quot;'.$supported_ext.'&quot;; var maxsze=&quot;'.$max_kb.'&quot;; var CA=0; void(document.body.appendChild(document.createElement(&quot;script&quot;)).src=&quot;'.make_http(get_base_href())."/ext/upload/bookmarklet.js".'&quot;)">'. $title . '</a> (Click when looking at an image page. Works on sites running Shimmie/Danbooru/Gelbooru. (This also grabs the tags/rating/source!))'; } From 1fd565fa87a2c7ce25fd847030ee499261df585c Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Mon, 6 Feb 2012 05:23:37 +0000 Subject: [PATCH 15/36] can't check if rating is null if it doesn't exist... --- themes/danbooru/view.theme.php | 2 +- themes/lite/view.theme.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/danbooru/view.theme.php b/themes/danbooru/view.theme.php index 31c553e9..ae5895e6 100644 --- a/themes/danbooru/view.theme.php +++ b/themes/danbooru/view.theme.php @@ -38,7 +38,7 @@ class CustomViewImageTheme extends ViewImageTheme { $html .= "<br>Source: <a href='$h_source'>link</a>"; } - if(!is_null($image->rating) && file_exists("ext/rating")) { + if(file_exists("ext/rating")) { if($image->rating == null || $image->rating == "u"){ $image->rating = "u"; } diff --git a/themes/lite/view.theme.php b/themes/lite/view.theme.php index 70fd4583..1327b33a 100644 --- a/themes/lite/view.theme.php +++ b/themes/lite/view.theme.php @@ -44,7 +44,7 @@ class CustomViewImageTheme extends ViewImageTheme { $html .= "<br>Source: <a href='$h_source'>link</a>"; } - if(!is_null($image->rating) && file_exists("ext/rating")) { + if(file_exists("ext/rating")) { if($image->rating == null || $image->rating == "u"){ $image->rating = "u"; } From 07e786101d40318426a78aa8c335359eedf5e760 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Mon, 6 Feb 2012 06:52:04 +0000 Subject: [PATCH 16/36] download all images function for admin --- .gitignore | 4 +++- contrib/admin/main.php | 26 ++++++++++++++++++++++++++ contrib/admin/theme.php | 1 + 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6dd0495a..1258151b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ .svn +backup +data config.php images +imgdump-*.zip thumbs -data sql.log shimmie.log !lib/images diff --git a/contrib/admin/main.php b/contrib/admin/main.php index de3bf10a..c7e5b1a1 100644 --- a/contrib/admin/main.php +++ b/contrib/admin/main.php @@ -82,6 +82,9 @@ class AdminPage extends SimpleExtension { $this->reset_imageids(); $redirect = true; break; + case 'image dump': + $this->imgdump($page); + break; } if($redirect) { @@ -218,5 +221,28 @@ class AdminPage extends SimpleExtension { $count = (count($image)) + 1; $database->execute("ALTER TABLE images AUTO_INCREMENT=".$count); } + + private function imgdump($page) { + global $database; + $zip = new ZipArchive; + $images = $database->get_all("SELECT * FROM images"); + $filename = 'imgdump-'.date('Ymd').'.zip'; + + if($zip->open($filename, 1 ? ZIPARCHIVE::OVERWRITE:ZIPARCHIVE::CREATE)===TRUE){ + foreach($images as $img){ + $hash = $img["hash"]; + preg_match("^[A-Za-z0-9]{2}^", $hash, $matches); + $img_loc = "images/".$matches[0]."/".$hash; + if(file_exists($img_loc)){ + $zip->addFile($img_loc, $hash.".".$img["ext"]); + } + + } + $zip->close(); + } + $page->set_mode("redirect"); + $page->set_redirect(make_link($filename)); //Fairly sure there is better way to do this.. + //TODO: Delete file after downloaded? + } } ?> diff --git a/contrib/admin/theme.php b/contrib/admin/theme.php index 37d1f7e2..c1126fdb 100644 --- a/contrib/admin/theme.php +++ b/contrib/admin/theme.php @@ -27,6 +27,7 @@ class AdminPageTheme extends Themelet { <option value='purge unused tags'>Purge unused tags</option> <option value='database dump'>Download database contents</option> <option value='reset image ids'>Reset image ids</option> + <option value='image dump'>Download all images</option> <!--<option value='convert to innodb'>Convert database to InnoDB (MySQL only)</option>--> </select> <input type='submit' value='Go'> From 80970f924ebc6398e39fd6ecd114cab4d19ddf14 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Mon, 6 Feb 2012 07:08:38 +0000 Subject: [PATCH 17/36] this should be here >_< --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1258151b..57872564 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .svn backup -data config.php +data images imgdump-*.zip thumbs From e92d4f6809e2b3e2a942543f06e214203368c60a Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Mon, 6 Feb 2012 10:22:57 +0000 Subject: [PATCH 18/36] fixes gelbooru with bookmarklet --- ext/upload/bookmarklet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/upload/bookmarklet.js b/ext/upload/bookmarklet.js index cf951acd..590adaef 100644 --- a/ext/upload/bookmarklet.js +++ b/ext/upload/bookmarklet.js @@ -87,6 +87,6 @@ else if(document.getElementById("tags") !== null){ //Since Gelbooru does not allow flash, no need to search for flash tag. //Gelbooru doesn't show file size in statistics either... if(supext.search(gmi.match("http\:\/\/.*\\.([a-z0-9]+)")[1]) !== -1){ - location.href=ste+gmi+"&tags="+tag+"&rating="+rtg[1];//+"&source="+srx; + location.href=ste+gmi+"&tags="+tag+"&rating="+rtg;//+"&source="+srx; }else{alert(notsup);} } From cca3ce513ad3d2e80232b505e097b87c7c36c6f1 Mon Sep 17 00:00:00 2001 From: Daku <dakutree@codeanimu.net> Date: Tue, 7 Feb 2012 00:02:30 +0000 Subject: [PATCH 19/36] added confirm/warning to resetting image ids --- contrib/admin/theme.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/contrib/admin/theme.php b/contrib/admin/theme.php index c1126fdb..e72a372a 100644 --- a/contrib/admin/theme.php +++ b/contrib/admin/theme.php @@ -19,9 +19,20 @@ class AdminPageTheme extends Themelet { public function display_form(Page $page) { global $user; - $html = " - ".make_form(make_link("admin_utils"))." - <select name='action'> + $html = ' + <script type="text/javascript"> + function imgidconfirm(){ + if(document.getElementById("misc").selectedIndex == 4){ + if(confirm("This function WILL break any bookmarks & links.\n The event log will also not be updated with new ids. \n Are you sure you wish to continue?")){ + return true; + }else{ + return false; + } + } + } + </script> + '.make_form(make_link("admin_utils"),"post", false, false, "return imgidconfirm()")." + <select name='action' id='misc'> <option value='lowercase all tags'>All tags to lowercase</option> <option value='recount tag use'>Recount tag use</option> <option value='purge unused tags'>Purge unused tags</option> From bb49c09279a9d87eed890f7107526b7b1bb2f3fb Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 11:36:28 +0000 Subject: [PATCH 20/36] jquery does lots now --- lib/shimmie.js | 40 ++-------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/lib/shimmie.js b/lib/shimmie.js index 6ed41062..31e7e7e3 100644 --- a/lib/shimmie.js +++ b/lib/shimmie.js @@ -43,9 +43,8 @@ $(document).ready(function() { var sections=get_sections(); for(var i=0;i<sections.length;i++) toggle(sections[i]); - initGray("search_input", "Search"); - initGray("commentBox", "Comment"); - initGray("tagBox", "tagme"); + $("#commentBox").DefaultValue("Comment"); + $("#tagBox").DefaultValue("tagme"); // if we're going to show with JS, hide with JS first pass_confirm = byId("pass_confirm"); @@ -54,41 +53,6 @@ $(document).ready(function() { } }); -function initGray(boxname, text) { - var box = byId(boxname); - if(!box) return; - - var clr = function () {cleargray(box, text);}; - var set = function () {setgray(box, text);}; - - addEvent(box, "focus", clr, false); - addEvent(box, "blur", set, false); - - if(box.value == text) { - box.style.color = "#999"; - box.style.textAlign = "center"; - } - else { - box.style.color = "#000"; - box.style.textAlign = "left"; - } -} - -function cleargray(box, text) { - if(box.value == text) { - box.value = ""; - box.style.color = "#000"; - box.style.textAlign = "left"; - } -} -function setgray(box, text) { - if(box.value == "") { - box.style.textAlign = "center"; - box.style.color = "gray"; - box.value = text; - } -} - function showUp(elem) { e = document.getElementById(elem) if(!e) return; From bff5a8453f52e3ebfc7c7fc923608d4b84aa8f73 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 13:44:54 +0000 Subject: [PATCH 21/36] start of fine-grained permissions --- core/user.class.php | 14 ++++++++++++++ core/util.inc.php | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/user.class.php b/core/user.class.php index 85d90df5..653a6929 100644 --- a/core/user.class.php +++ b/core/user.class.php @@ -4,6 +4,11 @@ function _new_user($row) { return new User($row); } +$_perm_map = array( + "override_config" => "admin", +); + + /** * An object representing a row in the "users" table. * @@ -90,6 +95,15 @@ class User { /* * useful user object functions start here */ + public function can($ability) { + global $_perm_map; + $needed = $_perm_map[$ability]; + if($needed == "admin" && $this->is_admin()) return true; + if($needed == "user" && $this->is_logged_in()) return true; + if($needed == "anon") return true; + return false; + } + /** * Test if this user is anonymous (not logged in) diff --git a/core/util.inc.php b/core/util.inc.php index 882c8560..3529fb87 100644 --- a/core/util.inc.php +++ b/core/util.inc.php @@ -879,7 +879,7 @@ function get_debug_info() { // print_obj ($object, $title, $return) function print_obj($object,$title="Object Information", $return=false) { global $user; - if(DEBUG && isset($_GET['debug']) && $user->is_admin()) { + if(DEBUG && isset($_GET['DEBUG']) && $user->can("override_config")) { $pr = print_r($object,true); $count = substr_count($pr,"\n")<=25?substr_count($pr,"\n"):25; $pr = "<textarea rows='".$count."' cols='80'>$pr</textarea>"; From 0589f9d72e94af74557cbb92a283c0aafd113121 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 15:15:18 +0000 Subject: [PATCH 22/36] fine grained permission bits --- core/imageboard.pack.php | 2 +- core/user.class.php | 78 +++++++++++++++++++++++++++++++++----- ext/alias_editor/main.php | 10 ++--- ext/alias_editor/theme.php | 13 ++++--- ext/comment/main.php | 2 +- ext/comment/theme.php | 5 +-- ext/ext_manager/main.php | 4 +- ext/image/main.php | 8 ++-- ext/setup/main.php | 4 +- ext/tag_edit/main.php | 16 ++++---- ext/upload/main.php | 4 +- ext/user/main.php | 14 +++---- ext/user/theme.php | 4 +- ext/view/theme.php | 2 +- lib/shimmie.js | 27 +------------ 15 files changed, 114 insertions(+), 79 deletions(-) diff --git a/core/imageboard.pack.php b/core/imageboard.pack.php index 73eb31f3..ca198452 100644 --- a/core/imageboard.pack.php +++ b/core/imageboard.pack.php @@ -119,7 +119,7 @@ class Image { if($limit < 1) $limit = 1; if(SPEED_HAX) { - if($user->is_anonymous() and count($tags) > 3) { + if(!$user->can("big_search") and count($tags) > 3) { die("Anonymous users may only search for up to 3 tags at a time"); // FIXME: throw an exception? } } diff --git a/core/user.class.php b/core/user.class.php index 653a6929..39204ff6 100644 --- a/core/user.class.php +++ b/core/user.class.php @@ -4,10 +4,6 @@ function _new_user($row) { return new User($row); } -$_perm_map = array( - "override_config" => "admin", -); - /** * An object representing a row in the "users" table. @@ -96,12 +92,74 @@ class User { * useful user object functions start here */ public function can($ability) { - global $_perm_map; - $needed = $_perm_map[$ability]; - if($needed == "admin" && $this->is_admin()) return true; - if($needed == "user" && $this->is_logged_in()) return true; - if($needed == "anon") return true; - return false; + global $config; + + // TODO: make this into an editable database table + $user_classes = array( + "anonymous" => array( + "change_setting" => False, # web-level settings, eg the config table + "override_config" => False, # sys-level config, eg config.php + "big_search" => False, # more than 3 tags (speed mode only) + "lock_image" => False, + "view_ip" => False, # view IP addresses associated with things + "change_password" => False, + "change_user_info" => False, + "delete_user" => False, + "delete_image" => False, + "delete_comment" => False, + "replace_image" => False, + "manage_extension_list" => False, + "manage_alias_list" => False, + "edit_tag" => $config->get_bool("tag_edit_anon"), + "edit_source" => $config->get_bool("source_edit_anon"), + "mass_tag_edit" => False, + ), + "user" => array( + "change_setting" => False, + "override_config" => False, + "big_search" => True, + "lock_image" => False, + "view_ip" => False, + "change_password" => False, + "change_user_info" => False, + "delete_user" => False, + "delete_image" => False, + "delete_comment" => False, + "replace_image" => False, + "manage_extension_list" => False, + "manage_alias_list" => False, + "edit_tag" => True, + "edit_source" => True, + "mass_tag_edit" => False, + ), + "admin" => array( + "change_setting" => True, + "override_config" => True, + "big_search" => True, + "lock_image" => True, + "view_ip" => True, + "change_password" => True, + "change_user_info" => True, + "delete_user" => True, + "delete_image" => True, + "delete_comment" => True, + "replace_image" => True, + "manage_extension_list" => True, + "manage_alias_list" => True, + "edit_tag" => True, + "edit_source" => True, + "mass_tag_edit" => True, + ), + ); + + return $user_classes[$this->get_class()][$action]; + } + + // FIXME: this should be a column in the users table + public function get_class() { + if($this->is_admin()) return "admin"; + else if($this->is_logged_in()) return "user"; + else return"anonymous"; } diff --git a/ext/alias_editor/main.php b/ext/alias_editor/main.php index 2942809d..7a246144 100755 --- a/ext/alias_editor/main.php +++ b/ext/alias_editor/main.php @@ -28,7 +28,7 @@ class AliasEditor extends SimpleExtension { if($event->page_matches("alias")) { if($event->get_arg(0) == "add") { - if($user->is_admin()) { + if($user->can("manage_alias_list")) { if(isset($_POST['oldtag']) && isset($_POST['newtag'])) { try { $aae = new AddAliasEvent($_POST['oldtag'], $_POST['newtag']); @@ -43,7 +43,7 @@ class AliasEditor extends SimpleExtension { } } else if($event->get_arg(0) == "remove") { - if($user->is_admin()) { + if($user->can("manage_alias_list")) { if(isset($_POST['oldtag'])) { $database->execute("DELETE FROM aliases WHERE oldtag=:oldtag", array("oldtag" => $_POST['oldtag'])); log_info("alias_editor", "Deleted alias for ".$_POST['oldtag']); @@ -74,7 +74,7 @@ class AliasEditor extends SimpleExtension { $total_pages = ceil($database->get_one("SELECT COUNT(*) FROM aliases") / $alias_per_page); - $this->theme->display_aliases($page, $alias, $user->is_admin(), $page_number + 1, $total_pages); + $this->theme->display_aliases($alias, $page_number + 1, $total_pages); } else if($event->get_arg(0) == "export") { $page->set_mode("data"); @@ -82,7 +82,7 @@ class AliasEditor extends SimpleExtension { $page->set_data($this->get_alias_csv($database)); } else if($event->get_arg(0) == "import") { - if($user->is_admin()) { + if($user->can("manage_alias_list")) { if(count($_FILES) > 0) { $tmp = $_FILES['alias_file']['tmp_name']; $contents = file_get_contents($tmp); @@ -115,7 +115,7 @@ class AliasEditor extends SimpleExtension { public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; - if($user->is_admin()) { + if($user->can("manage_alias_list")) { $event->add_link("Alias Editor", make_link("alias/list")); } } diff --git a/ext/alias_editor/theme.php b/ext/alias_editor/theme.php index cec35af0..7b6bfb49 100644 --- a/ext/alias_editor/theme.php +++ b/ext/alias_editor/theme.php @@ -5,10 +5,13 @@ class AliasEditorTheme extends Themelet { * Show a page of aliases: * * $aliases = an array of ($old_tag => $new_tag) - * $is_admin = whether things like "add new alias" should be shown + * $can_manage = whether things like "add new alias" should be shown */ - public function display_aliases(Page $page, $aliases, $is_admin, $pageNumber, $totalPages) { - if($is_admin) { + public function display_aliases($aliases, $pageNumber, $totalPages) { + global $page, $user; + + $can_manage = $user->can("manage_alias_list"); + if($can_manage) { $action = "<th width='10%'>Action</th>"; $add = " <tr> @@ -33,7 +36,7 @@ class AliasEditorTheme extends Themelet { $oe = ($n++ % 2 == 0) ? "even" : "odd"; $h_aliases .= "<tr class='$oe'><td>$h_old</td><td>$h_new</td>"; - if($is_admin) { + if($can_manage) { $h_aliases .= " <td> ".make_form(make_link("alias/remove"))." @@ -70,7 +73,7 @@ class AliasEditorTheme extends Themelet { $page->set_heading("Alias List"); $page->add_block(new NavBlock()); $page->add_block(new Block("Aliases", $html)); - if($is_admin) { + if($can_manage) { $page->add_block(new Block("Bulk Upload", $bulk_html, "main", 51)); } diff --git a/ext/comment/main.php b/ext/comment/main.php index 0a1aaebf..b64a8984 100644 --- a/ext/comment/main.php +++ b/ext/comment/main.php @@ -128,7 +128,7 @@ class CommentList extends SimpleExtension { } } else if($event->get_arg(0) === "delete") { - if($user->is_admin()) { + if($user->can("delete_comment")) { // FIXME: post, not args if($event->count_args() === 3) { send_event(new CommentDeletionEvent($event->get_arg(1))); diff --git a/ext/comment/theme.php b/ext/comment/theme.php index c0f8ca0b..d594ebe8 100644 --- a/ext/comment/theme.php +++ b/ext/comment/theme.php @@ -170,10 +170,9 @@ class CommentListTheme extends Themelet { $hash = md5(strtolower($comment->owner_email)); $avatar = "<img src=\"http://www.gravatar.com/avatar/$hash.jpg\"><br>"; } - $a = $user->is_admin(); $h_reply = " - <a href='javascript: replyTo($i_image_id, $i_comment_id)'>Reply</a>"; - $h_ip = $a ? "<br>$h_poster_ip" : ""; - $h_del = $a ? + $h_ip = $user->can("view_ip") ? "<br>$h_poster_ip" : ""; + $h_del = $user->can("delete_comment") ? ' - <a onclick="return confirm(\'Delete comment by '.$h_name.':\\n'.$stripped_nonl.'\');" '. 'href="'.make_link('comment/delete/'.$i_comment_id.'/'.$i_image_id).'">Del</a>' : ''; return ' diff --git a/ext/ext_manager/main.php b/ext/ext_manager/main.php index 1b90ef0a..3500401c 100644 --- a/ext/ext_manager/main.php +++ b/ext/ext_manager/main.php @@ -91,7 +91,7 @@ class ExtManager extends SimpleExtension { public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("ext_manager")) { - if($user->is_admin()) { + if($user->can("manage_extension_list")) { if($event->get_arg(0) == "set" && $user->check_auth_token()) { if(is_writable("ext")) { $this->set_things($_POST); @@ -130,7 +130,7 @@ class ExtManager extends SimpleExtension { public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; - if($user->is_admin()) { + if($user->can("manage_extension_list")) { $event->add_link("Extension Manager", make_link("ext_manager")); } else { diff --git a/ext/image/main.php b/ext/image/main.php index 0fde1e24..d0288131 100644 --- a/ext/image/main.php +++ b/ext/image/main.php @@ -162,7 +162,7 @@ class ImageIO extends SimpleExtension { } if($event->page_matches("image_admin/delete")) { global $page, $user; - if($user->is_admin() && isset($_POST['image_id']) && $user->check_auth_token()) { + if($user->can("delete_image") && isset($_POST['image_id']) && $user->check_auth_token()) { $image = Image::by_id($_POST['image_id']); if($image) { send_event(new ImageDeletionEvent($image)); @@ -173,7 +173,7 @@ class ImageIO extends SimpleExtension { } if($event->page_matches("image_admin/replace")) { global $page, $user; - if($user->is_admin() && isset($_POST['image_id']) && $user->check_auth_token()) { + if($user->can("replace_image") && isset($_POST['image_id']) && $user->check_auth_token()) { $image = Image::by_id($_POST['image_id']); if($image) { $page->set_mode("redirect"); @@ -190,11 +190,11 @@ class ImageIO extends SimpleExtension { global $user; global $config; - if($user->is_admin()) { + if($user->can("delete_image")) { $event->add_part($this->theme->get_deleter_html($event->image->id)); } /* In the future, could perhaps allow users to replace images that they own as well... */ - if ($user->is_admin() && $config->get_bool("upload_replace")) { + if ($user->can("replace_image") && $config->get_bool("upload_replace")) { $event->add_part($this->theme->get_replace_html($event->image->id)); } } diff --git a/ext/setup/main.php b/ext/setup/main.php index f93ac7fa..4e5b950a 100644 --- a/ext/setup/main.php +++ b/ext/setup/main.php @@ -187,7 +187,7 @@ class Setup extends SimpleExtension { } if($event->page_matches("setup")) { - if(!$user->is_admin()) { + if(!$user->can("change_setting")) { $this->theme->display_permission_denied($page); } else { @@ -329,7 +329,7 @@ class Setup extends SimpleExtension { public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; - if($user->is_admin()) { + if($user->can("change_setting")) { $event->add_link("Board Config", make_link("setup")); } } diff --git a/ext/tag_edit/main.php b/ext/tag_edit/main.php index a06425c1..184a5dba 100644 --- a/ext/tag_edit/main.php +++ b/ext/tag_edit/main.php @@ -60,7 +60,7 @@ class TagEdit extends SimpleExtension { global $user, $page; if($event->page_matches("tag_edit")) { if($event->get_arg(0) == "replace") { - if($user->is_admin() && isset($_POST['search']) && isset($_POST['replace'])) { + if($user->can("mass_tag_edit") && isset($_POST['search']) && isset($_POST['replace'])) { $search = $_POST['search']; $replace = $_POST['replace']; $this->mass_tag_edit($search, $replace); @@ -82,7 +82,7 @@ class TagEdit extends SimpleExtension { else { $this->theme->display_error($page, "Error", "Anonymous tag editing is disabled"); } - if($user->is_admin()) { + if($user->can("lock_image")) { $locked = isset($_POST['tag_edit__locked']) && $_POST['tag_edit__locked']=="on"; send_event(new LockSetEvent($event->image, $locked)); } @@ -90,21 +90,21 @@ class TagEdit extends SimpleExtension { public function onTagSet(TagSetEvent $event) { global $user; - if($user->is_admin() || !$event->image->is_locked()) { + if($user->can("edit_tag") || !$event->image->is_locked()) { $event->image->set_tags($event->tags); } } public function onSourceSet(SourceSetEvent $event) { global $user; - if($user->is_admin() || !$event->image->is_locked()) { + if($user->can("edit_tag") || !$event->image->is_locked()) { $event->image->set_source($event->source); } } public function onLockSet(LockSetEvent $event) { global $user; - if($user->is_admin()) { + if($user->can("lock_image")) { $event->image->set_locked($event->locked); } } @@ -130,7 +130,7 @@ class TagEdit extends SimpleExtension { if($this->can_source($event->image)) { $event->add_part($this->theme->get_source_editor_html($event->image), 41); } - if($user->is_admin()) { + if($user->can("lock_image")) { $event->add_part($this->theme->get_lock_editor_html($event->image), 42); } } @@ -147,7 +147,7 @@ class TagEdit extends SimpleExtension { global $config, $user; return ( ($config->get_bool("tag_edit_anon") || !$user->is_anonymous()) && - ($user->is_admin() || !$image->is_locked()) + ($user->can("edit_tag") || !$image->is_locked()) ); } @@ -155,7 +155,7 @@ class TagEdit extends SimpleExtension { global $config, $user; return ( ($config->get_bool("source_edit_anon") || !$user->is_anonymous()) && - ($user->is_admin() || !$image->is_locked()) + ($user->can("edit_source") || !$image->is_locked()) ); } diff --git a/ext/upload/main.php b/ext/upload/main.php index 979ab413..938a27fa 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -120,7 +120,7 @@ class Upload extends SimpleExtension { } // check if the user is an administrator and can upload files. - if(!$user->is_admin()) { + if(!$user->can("replace_image")) { $this->theme->display_permission_denied($page); } else { @@ -308,7 +308,7 @@ class Upload extends SimpleExtension { } // Checks if user is admin > check if you want locked. - if($user->is_admin() && !empty($_GET['locked'])){ + if($user->can("lock_image") && !empty($_GET['locked'])){ $locked = bool_escape($_GET['locked']); } diff --git a/ext/user/main.php b/ext/user/main.php index b5c9dc64..678b5b9c 100644 --- a/ext/user/main.php +++ b/ext/user/main.php @@ -187,7 +187,7 @@ class UserPage extends SimpleExtension { $this->theme->display_user_links($page, $user, $ubbe->parts); } if( - ($user->is_admin() || ($user->is_logged_in() && $user->id == $event->display_user->id)) && # admin or self-user + ($user->can("view_ip") || ($user->is_logged_in() && $user->id == $event->display_user->id)) && # admin or self-user ($event->display_user->id != $config->get_int('anon_id')) # don't show anon's IP list, it is le huge ) { $this->theme->display_ip_list( @@ -256,7 +256,7 @@ class UserPage extends SimpleExtension { $user_id = int_escape($matches[2]); $event->add_querylet(new Querylet("images.owner_id = $user_id")); } - else if($user->is_admin() && preg_match("/^(poster|user)_ip=([0-9\.]+)$/i", $event->term, $matches)) { + else if($user->can("view_ip") && preg_match("/^(poster|user)_ip=([0-9\.]+)$/i", $event->term, $matches)) { $user_ip = $matches[2]; // FIXME: ip_escape? $event->add_querylet(new Querylet("images.owner_ip = '$user_ip'")); } @@ -354,7 +354,7 @@ class UserPage extends SimpleExtension { $duser = User::by_id($id); - if((!$user->is_admin()) && ($duser->name != $user->name)) { + if((!$user->can("change_user_info")) && ($duser->name != $user->name)) { $this->theme->display_error($page, "Error", "You need to be an admin to change other people's passwords"); } @@ -392,7 +392,7 @@ class UserPage extends SimpleExtension { $duser = User::by_id($id); - if((!$user->is_admin()) && ($duser->name != $user->name)) { + if((!$user->can("change_user_info")) && ($duser->name != $user->name)) { $this->theme->display_error($page, "Error", "You need to be an admin to change other people's addressess"); } @@ -419,7 +419,7 @@ class UserPage extends SimpleExtension { $page->set_title("Error"); $page->set_heading("Error"); $page->add_block(new NavBlock()); - if(!$user->is_admin()) { + if(!$user->can("change_user_info")) { $page->add_block(new Block("Not Admin", "Only admins can edit accounts")); } else if(!isset($_POST['id']) || !is_numeric($_POST['id'])) { @@ -479,7 +479,7 @@ class UserPage extends SimpleExtension { $page->set_heading("Error"); $page->add_block(new NavBlock()); - if (!$user->is_admin()) { + if (!$user->can("delete_user")) { $page->add_block(new Block("Not Admin", "Only admins can delete accounts")); } else if(!isset($_POST['id']) || !is_numeric($_POST['id'])) { @@ -510,7 +510,7 @@ class UserPage extends SimpleExtension { $page->set_heading("Error"); $page->add_block(new NavBlock()); - if (!$user->is_admin()) { + if (!$user->can("delete_user") || !$user->can("delete_image")) { $page->add_block(new Block("Not Admin", "Only admins can delete accounts")); } else if(!isset($_POST['id']) || !is_numeric($_POST['id'])) { diff --git a/ext/user/theme.php b/ext/user/theme.php index df6b7553..69b852fc 100644 --- a/ext/user/theme.php +++ b/ext/user/theme.php @@ -141,7 +141,7 @@ class UserPageTheme extends Themelet { $page->add_block(new Block("Stats", join("<br>", $stats), "main", 0)); if(!$user->is_anonymous()) { - if($user->id == $duser->id || $user->is_admin()) { + if($user->id == $duser->id || $user->can("change_user_info")) { $page->add_block(new Block("Options", $this->build_options($duser), "main", 20)); } } @@ -173,7 +173,7 @@ class UserPageTheme extends Themelet { </form> "; - if($user->is_admin()) { + if($user->can("change_user_info")) { $i_user_id = int_escape($duser->id); $h_is_admin = $duser->is_admin() ? " checked" : ""; $html .= " diff --git a/ext/view/theme.php b/ext/view/theme.php index 59f6b730..666ac8bf 100644 --- a/ext/view/theme.php +++ b/ext/view/theme.php @@ -90,7 +90,7 @@ class ViewImageTheme extends Themelet { $html = ""; $html .= "<p>Uploaded by <a href='".make_link("user/$h_owner")."'>$h_owner</a> $h_date"; - if($user->is_admin()) { + if($user->can("view_ip")) { $html .= " ($h_ip)"; } if(!is_null($image->source)) { diff --git a/lib/shimmie.js b/lib/shimmie.js index 31e7e7e3..611d49ee 100644 --- a/lib/shimmie.js +++ b/lib/shimmie.js @@ -45,25 +45,8 @@ $(document).ready(function() { $("#commentBox").DefaultValue("Comment"); $("#tagBox").DefaultValue("tagme"); - - // if we're going to show with JS, hide with JS first - pass_confirm = byId("pass_confirm"); - if(pass_confirm) { - pass_confirm.style.display = "none"; - } }); -function showUp(elem) { - e = document.getElementById(elem) - if(!e) return; - e.style.display = ""; -// alert(e.type+": "+e.value); - if(e.value.match(/^http|^ftp/)) { - e.type = "text"; - alert("Box is web upload"); - } -} - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ * LibShish-JS * @@ -83,6 +66,7 @@ function byId(id) { } +// used once in ext/setup/main function getHTTPObject() { if (window.XMLHttpRequest){ return new XMLHttpRequest(); @@ -92,15 +76,6 @@ function getHTTPObject() { } } -function ajaxRequest(url, callback) { - var http = getHTTPObject(); - http.open("GET", url, true); - http.onreadystatechange = function() { - if(http.readyState == 4) callback(http.responseText); - } - http.send(null); -} - /* get, set, and delete cookies */ function getCookie( name ) { From d715b3d8a6d1b0b58bc9aa43e4d45e51238b8d92 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 18:27:53 +0000 Subject: [PATCH 23/36] brain-o --- core/user.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/user.class.php b/core/user.class.php index 39204ff6..0c98597b 100644 --- a/core/user.class.php +++ b/core/user.class.php @@ -152,7 +152,7 @@ class User { ), ); - return $user_classes[$this->get_class()][$action]; + return $user_classes[$this->get_class()][$ability]; } // FIXME: this should be a column in the users table From 1455956f187bfa6c451b77f8a9cef3a2a6f1a3c5 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 19:18:58 +0000 Subject: [PATCH 24/36] putting foreign key additions into auto-upgrade ext --- ext/upgrade/main.php | 58 +++++++++++++++++++++++++++++---------- install.php | 64 -------------------------------------------- 2 files changed, 44 insertions(+), 78 deletions(-) diff --git a/ext/upgrade/main.php b/ext/upgrade/main.php index 4d8f32b9..81b79f70 100644 --- a/ext/upgrade/main.php +++ b/ext/upgrade/main.php @@ -10,6 +10,8 @@ class Upgrade extends SimpleExtension { public function onInitExt(InitExtEvent $event) { global $config, $database; + if($config->get_bool("in_upgrade")) return; + if(!is_numeric($config->get_string("db_version"))) { $config->set_int("db_version", 2); } @@ -18,28 +20,56 @@ class Upgrade extends SimpleExtension { // cry :S } - if($config->get_int("db_version") < 7) { - /* - // mysql-adodb specific - if($database->engine->name == "mysql") { - $tables = $database->db->MetaTables(); - foreach($tables as $table) { - log_info("upgrade", "converting $table to innodb"); - $database->execute("ALTER TABLE $table TYPE=INNODB"); - } - } - */ - $config->set_int("db_version", 7); - log_info("upgrade", "Database at version 7"); - } + // v7 is convert to innodb with adodb + // now done again as v9 with PDO if($config->get_int("db_version") < 8) { // if this fails, don't try again + $config->set_bool("in_upgrade", true); $config->set_int("db_version", 8); $database->execute($database->engine->scoreql_to_sql( "ALTER TABLE images ADD COLUMN locked SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N" )); log_info("upgrade", "Database at version 8"); + $config->set_bool("in_upgrade", false); + } + + if($config->get_int("db_version") < 9) { + $config->set_bool("in_upgrade", true); + if($database->db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { + $tables = $database->get_col("SHOW TABLES"); + foreach($tables as $table) { + log_info("upgrade", "converting $table to innodb"); + $database->execute("ALTER TABLE $table TYPE=INNODB"); + } + } + $config->set_int("db_version", 9); + log_info("upgrade", "Database at version 9"); + $config->set_bool("in_upgrade", false); + } + + if($config->get_int("db_version") < 10) { + $config->set_bool("in_upgrade", true); + + log_info("upgrade", "Cleaning user favourites"); + $database->Execute("DELETE FROM user_favorites WHERE user_id NOT IN (SELECT id FROM users)"); + $database->Execute("DELETE FROM user_favorites WHERE image_id NOT IN (SELECT id FROM images)"); + + log_info("upgrade", "Adding foreign keys to user favourites"); + $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT foreign_user_favorites_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;"); + $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT user_favorites_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE;"); + + log_info("upgrade", "Adding foreign keys to private messages"); + $database->Execute("ALTER TABLE private_message + ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, + ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;"); + + log_info("upgrade", "Adding foreign keys to images"); + $database->Execute("ALTER TABLE images ADD CONSTRAINT foreign_images_owner_id FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT"); + + $config->set_int("db_version", 10); + log_info("upgrade", "Database at version 10"); + $config->set_bool("in_upgrade", false); } } diff --git a/install.php b/install.php index a14c4c7a..89d6e50c 100755 --- a/install.php +++ b/install.php @@ -102,17 +102,6 @@ if(is_readable("config.php")) { </form> "; */ - echo "<h3>Database Fix for User deletion</h3>"; - echo "<p>This is a database fix for those who instaled shimmie before 2012 January 22rd.</p>"; - echo "<p><b>This is only for users with <u>MySQL</u> databases!</b></p>"; - echo "<p>Note: Some things needs to be done manually, to work properly.<br/>"; - echo "Please BACKUP YOUR DATABASE before performing this fix!<br>"; - echo "WARNING: ONLY PROCEED IF YOU KNOW WHAT YOU ARE DOING!<br></p>"; - echo " - <form action='install.php?action=Database_user_deletion_fix' method='POST'> - <input type='submit' value='Go'> - </form> - "; echo "<h3>Log Out</h3>"; echo " @@ -125,9 +114,6 @@ if(is_readable("config.php")) { session_destroy(); echo "<h3>Logged Out</h3><p>You have been logged out.</p><a href='index.php'>Main Shimmie Page</a>"; } - else if($_GET["action"] == "Database_user_deletion_fix") { - Database_user_deletion_fix(); - } } else { echo " <h3>Login</h3> @@ -427,56 +413,6 @@ EOD; exit; } } // }}} - -function Database_user_deletion_fix() { // {{{ - try { - $db = new Database(); - - if ($db->db->getAttribute(PDO::ATTR_DRIVER_NAME) !== 'mysql') { - echo "<br><br>Database is not MySQL - Aborting changes.<br><br>"; - echo '<a href="install.php">Go Back</a>'; - throw new PDOException("Database is not MySQL."); - } else { - echo "<h3>Performing Database Fix Operations</h3><br>"; - } - - echo "Fixing user_favorites table....<br><br>"; - - ($db->Execute("ALTER TABLE user_favorites ENGINE=InnoDB;")) ? print_r("ok<br>") : print_r("failed<br>"); - echo "adding Foreign key to user ids...<br><br>"; - - ($db->Execute("ALTER TABLE user_favorites ADD CONSTRAINT foreign_user_favorites_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;"))? print_r("ok<br>"):print_r("failed<br>"); - echo "cleaning, the table from deleted image favorites...<br>"; - - $rows = $db->get_all("SELECT * FROM user_favorites WHERE image_id NOT IN ( SELECT id FROM images );"); - - foreach( $rows as $key => $value) - $db->Execute("DELETE FROM user_favorites WHERE image_id = :image_id;", array("image_id" => $value["image_id"])); - - echo "adding forign key to image ids...<br><br>"; - - ($db->Execute("ALTER TABLE user_favorites ADD CONSTRAINT user_favorites_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE;"))? print_r("ok<br>"):print_r("failed<br>"); - - echo "adding foreign keys to private messages...<br><br>"; - - ($db->Execute("ALTER TABLE private_message - ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, - ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;")) ? print_r("ok<br>"):print_r("failed<br>"); - - echo "<br><br>Just one more step...which you need to do manually:<br>"; - echo "You need to go to your database and Delete the foreign key on the owner_id in the images table.<br><br>"; - echo "<a href='http://www.justin-cook.com/wp/2006/05/09/how-to-remove-foreign-keys-in-mysql/'>How to remove foreign keys</a><br><br>"; - echo "and finally execute this querry:<br><br>"; - echo "ALTER TABLE images ADD CONSTRAINT foreign_images_owner_id FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT;<br><br>"; - echo "if this is all sucesfull you are done!"; - - } - catch (PDOException $e) - { - // FIXME: Make the error message user friendly - exit($e->getMessage()); - } -} // }}} ?> </body> </html> From 25b8193191c7c5da5d354dce002645da4a26fc02 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 19:20:58 +0000 Subject: [PATCH 25/36] db_version starts at 10 --- install.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.php b/install.php index 89d6e50c..139bc4c5 100755 --- a/install.php +++ b/install.php @@ -340,7 +340,7 @@ function create_tables() { // {{{ CONSTRAINT foreign_image_tags_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE, CONSTRAINT foreign_image_tags_tag_id FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE "); - $db->execute("INSERT INTO config(name, value) VALUES('db_version', 8)"); + $db->execute("INSERT INTO config(name, value) VALUES('db_version', 10)"); } catch (PDOException $e) { From 37bffe06890febfea82a28cc7a4cd4d754e87b0a Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 19:26:40 +0000 Subject: [PATCH 26/36] actually, ext-specific DB changes should live in that ext... --- contrib/favorites/main.php | 11 +++++++++++ contrib/pm/main.php | 13 ++++++++++++- ext/upgrade/main.php | 13 ------------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/contrib/favorites/main.php b/contrib/favorites/main.php index ad37edd0..15f266c2 100644 --- a/contrib/favorites/main.php +++ b/contrib/favorites/main.php @@ -152,6 +152,17 @@ class Favorites extends SimpleExtension { "); $config->set_int("ext_favorites_version", 1); } + + if($config->get_int("ext_favorites_version") < 2) { + log_info("favorites", "Cleaning user favourites"); + $database->Execute("DELETE FROM user_favorites WHERE user_id NOT IN (SELECT id FROM users)"); + $database->Execute("DELETE FROM user_favorites WHERE image_id NOT IN (SELECT id FROM images)"); + + log_info("favorites", "Adding foreign keys to user favourites"); + $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT foreign_user_favorites_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;"); + $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT user_favorites_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE;"); + $config->set_int("ext_favorites_version", 2); + } } private function add_vote($image_id, $user_id, $do_set) { diff --git a/contrib/pm/main.php b/contrib/pm/main.php index e0190f1a..ae75d228 100755 --- a/contrib/pm/main.php +++ b/contrib/pm/main.php @@ -57,11 +57,22 @@ class PrivMsg extends SimpleExtension { subject VARCHAR(64) NOT NULL, message TEXT NOT NULL, is_read SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N, - INDEX (to_id) + INDEX (to_id), + FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, + FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE "); $config->set_int("pm_version", 1); log_info("pm", "extension installed"); } + + if($config->get_int("pm_version") < 2) { + log_info("pm", "Adding foreign keys to private messages"); + $database->Execute("ALTER TABLE private_message + ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, + ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;"); + $config->set_int("pm_version", 2); + log_info("pm", "extension installed"); + } } /* diff --git a/ext/upgrade/main.php b/ext/upgrade/main.php index 81b79f70..35854e1d 100644 --- a/ext/upgrade/main.php +++ b/ext/upgrade/main.php @@ -51,19 +51,6 @@ class Upgrade extends SimpleExtension { if($config->get_int("db_version") < 10) { $config->set_bool("in_upgrade", true); - log_info("upgrade", "Cleaning user favourites"); - $database->Execute("DELETE FROM user_favorites WHERE user_id NOT IN (SELECT id FROM users)"); - $database->Execute("DELETE FROM user_favorites WHERE image_id NOT IN (SELECT id FROM images)"); - - log_info("upgrade", "Adding foreign keys to user favourites"); - $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT foreign_user_favorites_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;"); - $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT user_favorites_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE;"); - - log_info("upgrade", "Adding foreign keys to private messages"); - $database->Execute("ALTER TABLE private_message - ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, - ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;"); - log_info("upgrade", "Adding foreign keys to images"); $database->Execute("ALTER TABLE images ADD CONSTRAINT foreign_images_owner_id FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT"); From 763c00ccdf84f5a13fea2b961a57b29f045759c3 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 19:30:51 +0000 Subject: [PATCH 27/36] clean PMs first --- contrib/pm/main.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/pm/main.php b/contrib/pm/main.php index ae75d228..0e050f55 100755 --- a/contrib/pm/main.php +++ b/contrib/pm/main.php @@ -67,6 +67,8 @@ class PrivMsg extends SimpleExtension { if($config->get_int("pm_version") < 2) { log_info("pm", "Adding foreign keys to private messages"); + $database->Execute("delete from private_message where to_id not in (select id from users);"); + $database->Execute("delete from private_message where from_id not in (select id from users);"); $database->Execute("ALTER TABLE private_message ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;"); From 5c1f028249c106e0dc051f65fb39e4a13e3fca82 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Tue, 7 Feb 2012 19:55:31 +0000 Subject: [PATCH 28/36] more type hints --- core/config.class.php | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/core/config.class.php b/core/config.class.php index 2f918173..6d85b971 100644 --- a/core/config.class.php +++ b/core/config.class.php @@ -8,17 +8,17 @@ interface Config { * so that the next time a page is loaded it will use the new * configuration */ - public function save($name=null); + public function save(/*string*/ $name=null); /** @name set_* * Set a configuration option to a new value, regardless * of what the value is at the moment */ //@{ - public function set_int($name, $value); - public function set_string($name, $value); - public function set_bool($name, $value); - public function set_array($name, $value); + public function set_int(/*string*/ $name, $value); + public function set_string(/*string*/ $name, $value); + public function set_bool(/*string*/ $name, $value); + public function set_array(/*string*/ $name, $value); //@} /** @name set_default_* @@ -30,10 +30,10 @@ interface Config { * "default" paramater won't show up. */ //@{ - public function set_default_int($name, $value); - public function set_default_string($name, $value); - public function set_default_bool($name, $value); - public function set_default_array($name, $value); + public function set_default_int(/*string*/ $name, $value); + public function set_default_string(/*string*/ $name, $value); + public function set_default_bool(/*string*/ $name, $value); + public function set_default_array(/*string*/ $name, $value); //@} /** @name get_* @@ -41,10 +41,10 @@ interface Config { * appropritate data type */ //@{ - public function get_int($name, $default=null); - public function get_string($name, $default=null); - public function get_bool($name, $default=null); - public function get_array($name, $default=array()); + public function get_int(/*string*/ $name, $default=null); + public function get_string(/*string*/ $name, $default=null); + public function get_bool(/*string*/ $name, $default=null); + public function get_array(/*string*/ $name, $default=array()); //@} } @@ -56,60 +56,60 @@ interface Config { abstract class BaseConfig implements Config { var $values = array(); - public function set_int($name, $value) { + public function set_int(/*string*/ $name, $value) { $this->values[$name] = parse_shorthand_int($value); $this->save($name); } - public function set_string($name, $value) { + public function set_string(/*string*/ $name, $value) { $this->values[$name] = $value; $this->save($name); } - public function set_bool($name, $value) { + public function set_bool(/*string*/ $name, $value) { $this->values[$name] = (($value == 'on' || $value === true) ? 'Y' : 'N'); $this->save($name); } - public function set_array($name, $value) { + public function set_array(/*string*/ $name, $value) { assert(is_array($value)); $this->values[$name] = implode(",", $value); $this->save($name); } - public function set_default_int($name, $value) { + public function set_default_int(/*string*/ $name, $value) { if(is_null($this->get($name))) { $this->values[$name] = parse_shorthand_int($value); } } - public function set_default_string($name, $value) { + public function set_default_string(/*string*/ $name, $value) { if(is_null($this->get($name))) { $this->values[$name] = $value; } } - public function set_default_bool($name, $value) { + public function set_default_bool(/*string*/ $name, $value) { if(is_null($this->get($name))) { $this->values[$name] = (($value == 'on' || $value === true) ? 'Y' : 'N'); } } - public function set_default_array($name, $value) { + public function set_default_array(/*string*/ $name, $value) { assert(is_array($value)); if(is_null($this->get($name))) { $this->values[$name] = implode(",", $value); } } - public function get_int($name, $default=null) { + public function get_int(/*string*/ $name, $default=null) { return (int)($this->get($name, $default)); } - public function get_string($name, $default=null) { + public function get_string(/*string*/ $name, $default=null) { return $this->get($name, $default); } - public function get_bool($name, $default=null) { + public function get_bool(/*string*/ $name, $default=null) { return undb_bool($this->get($name, $default)); } - public function get_array($name, $default=array()) { + public function get_array(/*string*/ $name, $default=array()) { return explode(",", $this->get($name, "")); } - private function get($name, $default=null) { + private function get(/*string*/ $name, $default=null) { if(isset($this->values[$name])) { return $this->values[$name]; } @@ -144,7 +144,7 @@ class StaticConfig extends BaseConfig { } } - public function save($name=null) { + public function save(/*string*/ $name=null) { // static config is static } } @@ -167,7 +167,7 @@ class DatabaseConfig extends BaseConfig { /* * Load the config table from a database */ - public function DatabaseConfig($database) { + public function DatabaseConfig(Database $database) { $this->database = $database; $cached = $this->database->cache->get("config"); @@ -186,10 +186,10 @@ class DatabaseConfig extends BaseConfig { /* * Save the current values as the new config table */ - public function save($name=null) { + public function save(/*string*/ $name=null) { if(is_null($name)) { foreach($this->values as $name => $value) { - $this->save($name); + $this->save(/*string*/ $name); } } else { From 9707c1f7ce7a994d0266621ab2a279b125f1bcf3 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Wed, 8 Feb 2012 00:29:01 +0000 Subject: [PATCH 29/36] we already have a global jquery install... --- contrib/notes/jquery.js | 3408 --------------------------------------- 1 file changed, 3408 deletions(-) delete mode 100644 contrib/notes/jquery.js diff --git a/contrib/notes/jquery.js b/contrib/notes/jquery.js deleted file mode 100644 index 2e43a823..00000000 --- a/contrib/notes/jquery.js +++ /dev/null @@ -1,3408 +0,0 @@ -(function(){ -/* - * jQuery 1.2.3 - New Wave Javascript - * - * Copyright (c) 2008 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $ - * $Rev: 4663 $ - */ - -// Map over jQuery in case of overwrite -if ( window.jQuery ) - var _jQuery = window.jQuery; - -var jQuery = window.jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.prototype.init( selector, context ); -}; - -// Map over the $ in case of overwrite -if ( window.$ ) - var _$ = window.$; - -// Map the jQuery namespace to the '$' one -window.$ = jQuery; - -// A simple way to check for HTML strings or ID strings -// (both of which we optimize for) -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/; - -// Is it a simple selector -var isSimple = /^.[^:#\[\.]*$/; - -jQuery.fn = jQuery.prototype = { - init: function( selector, context ) { - // Make sure that a selection was provided - selector = selector || document; - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this[0] = selector; - this.length = 1; - return this; - - // Handle HTML strings - } else if ( typeof selector == "string" ) { - // Are we dealing with HTML string or an ID? - var match = quickExpr.exec( selector ); - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) - selector = jQuery.clean( [ match[1] ], context ); - - // HANDLE: $("#id") - else { - var elem = document.getElementById( match[3] ); - - // Make sure an element was located - if ( elem ) - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id != match[3] ) - return jQuery().find( selector ); - - // Otherwise, we inject the element directly into the jQuery object - else { - this[0] = elem; - this.length = 1; - return this; - } - - else - selector = []; - } - - // HANDLE: $(expr, [context]) - // (which is just equivalent to: $(content).find(expr) - } else - return new jQuery( context ).find( selector ); - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) - return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); - - return this.setArray( - // HANDLE: $(array) - selector.constructor == Array && selector || - - // HANDLE: $(arraylike) - // Watch for when an array-like object, contains DOM nodes, is passed in as the selector - (selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) || - - // HANDLE: $(*) - [ selector ] ); - }, - - // The current version of jQuery being used - jquery: "1.2.3", - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - // The number of elements contained in the matched element set - length: 0, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == undefined ? - - // Return a 'clean' array - jQuery.makeArray( this ) : - - // Return just the object - this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - // Build a new jQuery matched element set - var ret = jQuery( elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Force the current matched set of elements to become - // the specified array of elements (destroying the stack in the process) - // You should use pushStack() in order to do this, but maintain the stack - setArray: function( elems ) { - // Resetting the length to 0, then using the native Array push - // is a super-fast way to populate an object with array-like properties - this.length = 0; - Array.prototype.push.apply( this, elems ); - - return this; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - var ret = -1; - - // Locate the position of the desired element - this.each(function(i){ - if ( this == elem ) - ret = i; - }); - - return ret; - }, - - attr: function( name, value, type ) { - var options = name; - - // Look for the case where we're accessing a style value - if ( name.constructor == String ) - if ( value == undefined ) - return this.length && jQuery[ type || "attr" ]( this[0], name ) || undefined; - - else { - options = {}; - options[ name ] = value; - } - - // Check to see if we're setting style values - return this.each(function(i){ - // Set all the styles - for ( name in options ) - jQuery.attr( - type ? - this.style : - this, - name, jQuery.prop( this, options[ name ], type, i, name ) - ); - }); - }, - - css: function( key, value ) { - // ignore negative width and height values - if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) - value = undefined; - return this.attr( key, value, "curCSS" ); - }, - - text: function( text ) { - if ( typeof text != "object" && text != null ) - return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); - - var ret = ""; - - jQuery.each( text || this, function(){ - jQuery.each( this.childNodes, function(){ - if ( this.nodeType != 8 ) - ret += this.nodeType != 1 ? - this.nodeValue : - jQuery.fn.text( [ this ] ); - }); - }); - - return ret; - }, - - wrapAll: function( html ) { - if ( this[0] ) - // The elements to wrap the target around - jQuery( html, this[0].ownerDocument ) - .clone() - .insertBefore( this[0] ) - .map(function(){ - var elem = this; - - while ( elem.firstChild ) - elem = elem.firstChild; - - return elem; - }) - .append(this); - - return this; - }, - - wrapInner: function( html ) { - return this.each(function(){ - jQuery( this ).contents().wrapAll( html ); - }); - }, - - wrap: function( html ) { - return this.each(function(){ - jQuery( this ).wrapAll( html ); - }); - }, - - append: function() { - return this.domManip(arguments, true, false, function(elem){ - if (this.nodeType == 1) - this.appendChild( elem ); - }); - }, - - prepend: function() { - return this.domManip(arguments, true, true, function(elem){ - if (this.nodeType == 1) - this.insertBefore( elem, this.firstChild ); - }); - }, - - before: function() { - return this.domManip(arguments, false, false, function(elem){ - this.parentNode.insertBefore( elem, this ); - }); - }, - - after: function() { - return this.domManip(arguments, false, true, function(elem){ - this.parentNode.insertBefore( elem, this.nextSibling ); - }); - }, - - end: function() { - return this.prevObject || jQuery( [] ); - }, - - find: function( selector ) { - var elems = jQuery.map(this, function(elem){ - return jQuery.find( selector, elem ); - }); - - return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? - jQuery.unique( elems ) : - elems ); - }, - - clone: function( events ) { - // Do the clone - var ret = this.map(function(){ - if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { - // IE copies events bound via attachEvent when - // using cloneNode. Calling detachEvent on the - // clone will also remove the events from the orignal - // In order to get around this, we use innerHTML. - // Unfortunately, this means some modifications to - // attributes in IE that are actually only stored - // as properties will not be copied (such as the - // the name attribute on an input). - var clone = this.cloneNode(true), - container = document.createElement("div"); - container.appendChild(clone); - return jQuery.clean([container.innerHTML])[0]; - } else - return this.cloneNode(true); - }); - - // Need to set the expando to null on the cloned set if it exists - // removeData doesn't work here, IE removes it from the original as well - // this is primarily for IE but the data expando shouldn't be copied over in any browser - var clone = ret.find("*").andSelf().each(function(){ - if ( this[ expando ] != undefined ) - this[ expando ] = null; - }); - - // Copy the events from the original to the clone - if ( events === true ) - this.find("*").andSelf().each(function(i){ - if (this.nodeType == 3) - return; - var events = jQuery.data( this, "events" ); - - for ( var type in events ) - for ( var handler in events[ type ] ) - jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); - }); - - // Return the cloned set - return ret; - }, - - filter: function( selector ) { - return this.pushStack( - jQuery.isFunction( selector ) && - jQuery.grep(this, function(elem, i){ - return selector.call( elem, i ); - }) || - - jQuery.multiFilter( selector, this ) ); - }, - - not: function( selector ) { - if ( selector.constructor == String ) - // test special case where just one selector is passed in - if ( isSimple.test( selector ) ) - return this.pushStack( jQuery.multiFilter( selector, this, true ) ); - else - selector = jQuery.multiFilter( selector, this ); - - var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; - return this.filter(function() { - return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; - }); - }, - - add: function( selector ) { - return !selector ? this : this.pushStack( jQuery.merge( - this.get(), - selector.constructor == String ? - jQuery( selector ).get() : - selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ? - selector : [selector] ) ); - }, - - is: function( selector ) { - return selector ? - jQuery.multiFilter( selector, this ).length > 0 : - false; - }, - - hasClass: function( selector ) { - return this.is( "." + selector ); - }, - - val: function( value ) { - if ( value == undefined ) { - - if ( this.length ) { - var elem = this[0]; - - // We need to handle select boxes special - if ( jQuery.nodeName( elem, "select" ) ) { - var index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type == "select-one"; - - // Nothing was selected - if ( index < 0 ) - return null; - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - if ( option.selected ) { - // Get the specifc value for the option - value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; - - // We don't need an array for one selects - if ( one ) - return value; - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - - // Everything else, we just grab the value - } else - return (this[0].value || "").replace(/\r/g, ""); - - } - - return undefined; - } - - return this.each(function(){ - if ( this.nodeType != 1 ) - return; - - if ( value.constructor == Array && /radio|checkbox/.test( this.type ) ) - this.checked = (jQuery.inArray(this.value, value) >= 0 || - jQuery.inArray(this.name, value) >= 0); - - else if ( jQuery.nodeName( this, "select" ) ) { - var values = value.constructor == Array ? - value : - [ value ]; - - jQuery( "option", this ).each(function(){ - this.selected = (jQuery.inArray( this.value, values ) >= 0 || - jQuery.inArray( this.text, values ) >= 0); - }); - - if ( !values.length ) - this.selectedIndex = -1; - - } else - this.value = value; - }); - }, - - html: function( value ) { - return value == undefined ? - (this.length ? - this[0].innerHTML : - null) : - this.empty().append( value ); - }, - - replaceWith: function( value ) { - return this.after( value ).remove(); - }, - - eq: function( i ) { - return this.slice( i, i + 1 ); - }, - - slice: function() { - return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function(elem, i){ - return callback.call( elem, i, elem ); - })); - }, - - andSelf: function() { - return this.add( this.prevObject ); - }, - - data: function( key, value ){ - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value == null ) { - var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - if ( data == undefined && this.length ) - data = jQuery.data( this[0], key ); - - return data == null && parts[1] ? - this.data( parts[0] ) : - data; - } else - return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ - jQuery.data( this, key, value ); - }); - }, - - removeData: function( key ){ - return this.each(function(){ - jQuery.removeData( this, key ); - }); - }, - - domManip: function( args, table, reverse, callback ) { - var clone = this.length > 1, elems; - - return this.each(function(){ - if ( !elems ) { - elems = jQuery.clean( args, this.ownerDocument ); - - if ( reverse ) - elems.reverse(); - } - - var obj = this; - - if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) - obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); - - var scripts = jQuery( [] ); - - jQuery.each(elems, function(){ - var elem = clone ? - jQuery( this ).clone( true )[0] : - this; - - // execute all scripts after the elements have been injected - if ( jQuery.nodeName( elem, "script" ) ) { - scripts = scripts.add( elem ); - } else { - // Remove any inner scripts for later evaluation - if ( elem.nodeType == 1 ) - scripts = scripts.add( jQuery( "script", elem ).remove() ); - - // Inject the elements into the document - callback.call( obj, elem ); - } - }); - - scripts.each( evalScript ); - }); - } -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.prototype.init.prototype = jQuery.prototype; - -function evalScript( i, elem ) { - if ( elem.src ) - jQuery.ajax({ - url: elem.src, - async: false, - dataType: "script" - }); - - else - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); - - if ( elem.parentNode ) - elem.parentNode.removeChild( elem ); -} - -jQuery.extend = jQuery.fn.extend = function() { - // copy reference to target object - var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; - - // Handle a deep copy situation - if ( target.constructor == Boolean ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target != "object" && typeof target != "function" ) - target = {}; - - // extend jQuery itself if only one argument is passed - if ( length == 1 ) { - target = this; - i = 0; - } - - for ( ; i < length; i++ ) - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) - // Extend the base object - for ( var name in options ) { - // Prevent never-ending loop - if ( target === options[ name ] ) - continue; - - // Recurse if we're merging object values - if ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType ) - target[ name ] = jQuery.extend( target[ name ], options[ name ] ); - - // Don't bring in undefined values - else if ( options[ name ] != undefined ) - target[ name ] = options[ name ]; - - } - - // Return the modified object - return target; -}; - -var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {}; - -// exclude the following css properties to add px -var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; - -jQuery.extend({ - noConflict: function( deep ) { - window.$ = _$; - - if ( deep ) - window.jQuery = _jQuery; - - return jQuery; - }, - - // See test/unit/core.js for details concerning this function. - isFunction: function( fn ) { - return !!fn && typeof fn != "string" && !fn.nodeName && - fn.constructor != Array && /function/i.test( fn + "" ); - }, - - // check if an element is in a (or is an) XML document - isXMLDoc: function( elem ) { - return elem.documentElement && !elem.body || - elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; - }, - - // Evalulates a script in a global context - globalEval: function( data ) { - data = jQuery.trim( data ); - - if ( data ) { - // Inspired by code by Andrea Giammarchi - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.getElementsByTagName("head")[0] || document.documentElement, - script = document.createElement("script"); - - script.type = "text/javascript"; - if ( jQuery.browser.msie ) - script.text = data; - else - script.appendChild( document.createTextNode( data ) ); - - head.appendChild( script ); - head.removeChild( script ); - } - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); - }, - - cache: {}, - - data: function( elem, name, data ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // Compute a unique ID for the element - if ( !id ) - id = elem[ expando ] = ++uuid; - - // Only generate the data cache if we're - // trying to access or manipulate it - if ( name && !jQuery.cache[ id ] ) - jQuery.cache[ id ] = {}; - - // Prevent overriding the named cache with undefined values - if ( data != undefined ) - jQuery.cache[ id ][ name ] = data; - - // Return the named cache data, or the ID for the element - return name ? - jQuery.cache[ id ][ name ] : - id; - }, - - removeData: function( elem, name ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // If we want to remove a specific section of the element's data - if ( name ) { - if ( jQuery.cache[ id ] ) { - // Remove the section of cache data - delete jQuery.cache[ id ][ name ]; - - // If we've removed all the data, remove the element's cache - name = ""; - - for ( name in jQuery.cache[ id ] ) - break; - - if ( !name ) - jQuery.removeData( elem ); - } - - // Otherwise, we want to remove all of the element's data - } else { - // Clean up the element expando - try { - delete elem[ expando ]; - } catch(e){ - // IE has trouble directly removing the expando - // but it's ok with using removeAttribute - if ( elem.removeAttribute ) - elem.removeAttribute( expando ); - } - - // Completely remove the data cache - delete jQuery.cache[ id ]; - } - }, - - // args is for internal usage only - each: function( object, callback, args ) { - if ( args ) { - if ( object.length == undefined ) { - for ( var name in object ) - if ( callback.apply( object[ name ], args ) === false ) - break; - } else - for ( var i = 0, length = object.length; i < length; i++ ) - if ( callback.apply( object[ i ], args ) === false ) - break; - - // A special, fast, case for the most common use of each - } else { - if ( object.length == undefined ) { - for ( var name in object ) - if ( callback.call( object[ name ], name, object[ name ] ) === false ) - break; - } else - for ( var i = 0, length = object.length, value = object[0]; - i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} - } - - return object; - }, - - prop: function( elem, value, type, i, name ) { - // Handle executable functions - if ( jQuery.isFunction( value ) ) - value = value.call( elem, i ); - - // Handle passing in a number to a CSS property - return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? - value + "px" : - value; - }, - - className: { - // internal only, use addClass("class") - add: function( elem, classNames ) { - jQuery.each((classNames || "").split(/\s+/), function(i, className){ - if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) - elem.className += (elem.className ? " " : "") + className; - }); - }, - - // internal only, use removeClass("class") - remove: function( elem, classNames ) { - if (elem.nodeType == 1) - elem.className = classNames != undefined ? - jQuery.grep(elem.className.split(/\s+/), function(className){ - return !jQuery.className.has( classNames, className ); - }).join(" ") : - ""; - }, - - // internal only, use is(".class") - has: function( elem, className ) { - return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; - } - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations - swap: function( elem, options, callback ) { - var old = {}; - // Remember the old values, and insert the new ones - for ( var name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - callback.call( elem ); - - // Revert the old values - for ( var name in options ) - elem.style[ name ] = old[ name ]; - }, - - css: function( elem, name, force ) { - if ( name == "width" || name == "height" ) { - var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; - - function getWH() { - val = name == "width" ? elem.offsetWidth : elem.offsetHeight; - var padding = 0, border = 0; - jQuery.each( which, function() { - padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; - border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; - }); - val -= Math.round(padding + border); - } - - if ( jQuery(elem).is(":visible") ) - getWH(); - else - jQuery.swap( elem, props, getWH ); - - return Math.max(0, val); - } - - return jQuery.curCSS( elem, name, force ); - }, - - curCSS: function( elem, name, force ) { - var ret; - - // A helper method for determining if an element's values are broken - function color( elem ) { - if ( !jQuery.browser.safari ) - return false; - - var ret = document.defaultView.getComputedStyle( elem, null ); - return !ret || ret.getPropertyValue("color") == ""; - } - - // We need to handle opacity special in IE - if ( name == "opacity" && jQuery.browser.msie ) { - ret = jQuery.attr( elem.style, "opacity" ); - - return ret == "" ? - "1" : - ret; - } - // Opera sometimes will give the wrong display answer, this fixes it, see #2037 - if ( jQuery.browser.opera && name == "display" ) { - var save = elem.style.outline; - elem.style.outline = "0 solid black"; - elem.style.outline = save; - } - - // Make sure we're using the right name for getting the float value - if ( name.match( /float/i ) ) - name = styleFloat; - - if ( !force && elem.style && elem.style[ name ] ) - ret = elem.style[ name ]; - - else if ( document.defaultView && document.defaultView.getComputedStyle ) { - - // Only "float" is needed here - if ( name.match( /float/i ) ) - name = "float"; - - name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); - - var getComputedStyle = document.defaultView.getComputedStyle( elem, null ); - - if ( getComputedStyle && !color( elem ) ) - ret = getComputedStyle.getPropertyValue( name ); - - // If the element isn't reporting its values properly in Safari - // then some display: none elements are involved - else { - var swap = [], stack = []; - - // Locate all of the parent display: none elements - for ( var a = elem; a && color(a); a = a.parentNode ) - stack.unshift(a); - - // Go through and make them visible, but in reverse - // (It would be better if we knew the exact display type that they had) - for ( var i = 0; i < stack.length; i++ ) - if ( color( stack[ i ] ) ) { - swap[ i ] = stack[ i ].style.display; - stack[ i ].style.display = "block"; - } - - // Since we flip the display style, we have to handle that - // one special, otherwise get the value - ret = name == "display" && swap[ stack.length - 1 ] != null ? - "none" : - ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || ""; - - // Finally, revert the display styles back - for ( var i = 0; i < swap.length; i++ ) - if ( swap[ i ] != null ) - stack[ i ].style.display = swap[ i ]; - } - - // We should always get a number back from opacity - if ( name == "opacity" && ret == "" ) - ret = "1"; - - } else if ( elem.currentStyle ) { - var camelCase = name.replace(/\-(\w)/g, function(all, letter){ - return letter.toUpperCase(); - }); - - ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { - // Remember the original values - var style = elem.style.left, runtimeStyle = elem.runtimeStyle.left; - - // Put in the new values to get a computed value out - elem.runtimeStyle.left = elem.currentStyle.left; - elem.style.left = ret || 0; - ret = elem.style.pixelLeft + "px"; - - // Revert the changed values - elem.style.left = style; - elem.runtimeStyle.left = runtimeStyle; - } - } - - return ret; - }, - - clean: function( elems, context ) { - var ret = []; - context = context || document; - // !context.createElement fails in IE with an error but returns typeof 'object' - if (typeof context.createElement == 'undefined') - context = context.ownerDocument || context[0] && context[0].ownerDocument || document; - - jQuery.each(elems, function(i, elem){ - if ( !elem ) - return; - - if ( elem.constructor == Number ) - elem = elem.toString(); - - // Convert html string into DOM nodes - if ( typeof elem == "string" ) { - // Fix "XHTML"-style tags in all browsers - elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ - return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? - all : - front + "></" + tag + ">"; - }); - - // Trim whitespace, otherwise indexOf won't work as expected - var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div"); - - var wrap = - // option or optgroup - !tags.indexOf("<opt") && - [ 1, "<select multiple='multiple'>", "</select>" ] || - - !tags.indexOf("<leg") && - [ 1, "<fieldset>", "</fieldset>" ] || - - tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && - [ 1, "<table>", "</table>" ] || - - !tags.indexOf("<tr") && - [ 2, "<table><tbody>", "</tbody></table>" ] || - - // <thead> matched above - (!tags.indexOf("<td") || !tags.indexOf("<th")) && - [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || - - !tags.indexOf("<col") && - [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || - - // IE can't serialize <link> and <script> tags normally - jQuery.browser.msie && - [ 1, "div<div>", "</div>" ] || - - [ 0, "", "" ]; - - // Go to html and back, then peel off extra wrappers - div.innerHTML = wrap[1] + elem + wrap[2]; - - // Move to the right depth - while ( wrap[0]-- ) - div = div.lastChild; - - // Remove IE's autoinserted <tbody> from table fragments - if ( jQuery.browser.msie ) { - - // String was a <table>, *may* have spurious <tbody> - var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ? - div.firstChild && div.firstChild.childNodes : - - // String was a bare <thead> or <tfoot> - wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ? - div.childNodes : - []; - - for ( var j = tbody.length - 1; j >= 0 ; --j ) - if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) - tbody[ j ].parentNode.removeChild( tbody[ j ] ); - - // IE completely kills leading whitespace when innerHTML is used - if ( /^\s/.test( elem ) ) - div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); - - } - - elem = jQuery.makeArray( div.childNodes ); - } - - if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) ) - return; - - if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options ) - ret.push( elem ); - - else - ret = jQuery.merge( ret, elem ); - - }); - - return ret; - }, - - attr: function( elem, name, value ) { - // don't set attributes on text and comment nodes - if (!elem || elem.nodeType == 3 || elem.nodeType == 8) - return undefined; - - var fix = jQuery.isXMLDoc( elem ) ? - {} : - jQuery.props; - - // Safari mis-reports the default selected property of a hidden option - // Accessing the parent's selectedIndex property fixes it - if ( name == "selected" && jQuery.browser.safari ) - elem.parentNode.selectedIndex; - - // Certain attributes only work when accessed via the old DOM 0 way - if ( fix[ name ] ) { - if ( value != undefined ) - elem[ fix[ name ] ] = value; - - return elem[ fix[ name ] ]; - - } else if ( jQuery.browser.msie && name == "style" ) - return jQuery.attr( elem.style, "cssText", value ); - - else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName( elem, "form" ) && (name == "action" || name == "method") ) - return elem.getAttributeNode( name ).nodeValue; - - // IE elem.getAttribute passes even for style - else if ( elem.tagName ) { - - if ( value != undefined ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) - throw "type property can't be changed"; - - // convert the value to a string (all browsers do this but IE) see #1070 - elem.setAttribute( name, "" + value ); - } - - if ( jQuery.browser.msie && /href|src/.test( name ) && !jQuery.isXMLDoc( elem ) ) - return elem.getAttribute( name, 2 ); - - return elem.getAttribute( name ); - - // elem is actually elem.style ... set the style - } else { - // IE actually uses filters for opacity - if ( name == "opacity" && jQuery.browser.msie ) { - if ( value != undefined ) { - // IE has trouble with opacity if it does not have layout - // Force it by setting the zoom level - elem.zoom = 1; - - // Set the alpha filter to set the opacity - elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + - (parseFloat( value ).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); - } - - return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? - (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : - ""; - } - - name = name.replace(/-([a-z])/ig, function(all, letter){ - return letter.toUpperCase(); - }); - - if ( value != undefined ) - elem[ name ] = value; - - return elem[ name ]; - } - }, - - trim: function( text ) { - return (text || "").replace( /^\s+|\s+$/g, "" ); - }, - - makeArray: function( array ) { - var ret = []; - - // Need to use typeof to fight Safari childNodes crashes - if ( typeof array != "array" ) - for ( var i = 0, length = array.length; i < length; i++ ) - ret.push( array[ i ] ); - else - ret = array.slice( 0 ); - - return ret; - }, - - inArray: function( elem, array ) { - for ( var i = 0, length = array.length; i < length; i++ ) - if ( array[ i ] == elem ) - return i; - - return -1; - }, - - merge: function( first, second ) { - // We have to loop this way because IE & Opera overwrite the length - // expando of getElementsByTagName - - // Also, we need to make sure that the correct elements are being returned - // (IE returns comment nodes in a '*' query) - if ( jQuery.browser.msie ) { - for ( var i = 0; second[ i ]; i++ ) - if ( second[ i ].nodeType != 8 ) - first.push( second[ i ] ); - - } else - for ( var i = 0; second[ i ]; i++ ) - first.push( second[ i ] ); - - return first; - }, - - unique: function( array ) { - var ret = [], done = {}; - - try { - - for ( var i = 0, length = array.length; i < length; i++ ) { - var id = jQuery.data( array[ i ] ); - - if ( !done[ id ] ) { - done[ id ] = true; - ret.push( array[ i ] ); - } - } - - } catch( e ) { - ret = array; - } - - return ret; - }, - - grep: function( elems, callback, inv ) { - var ret = []; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) - if ( !inv && callback( elems[ i ], i ) || inv && !callback( elems[ i ], i ) ) - ret.push( elems[ i ] ); - - return ret; - }, - - map: function( elems, callback ) { - var ret = []; - - // Go through the array, translating each of the items to their - // new value (or values). - for ( var i = 0, length = elems.length; i < length; i++ ) { - var value = callback( elems[ i ], i ); - - if ( value !== null && value != undefined ) { - if ( value.constructor != Array ) - value = [ value ]; - - ret = ret.concat( value ); - } - } - - return ret; - } -}); - -var userAgent = navigator.userAgent.toLowerCase(); - -// Figure out what browser is being used -jQuery.browser = { - version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1], - safari: /webkit/.test( userAgent ), - opera: /opera/.test( userAgent ), - msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), - mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) -}; - -var styleFloat = jQuery.browser.msie ? - "styleFloat" : - "cssFloat"; - -jQuery.extend({ - // Check to see if the W3C box model is being used - boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat", - - props: { - "for": "htmlFor", - "class": "className", - "float": styleFloat, - cssFloat: styleFloat, - styleFloat: styleFloat, - innerHTML: "innerHTML", - className: "className", - value: "value", - disabled: "disabled", - checked: "checked", - readonly: "readOnly", - selected: "selected", - maxlength: "maxLength", - selectedIndex: "selectedIndex", - defaultValue: "defaultValue", - tagName: "tagName", - nodeName: "nodeName" - } -}); - -jQuery.each({ - parent: function(elem){return elem.parentNode;}, - parents: function(elem){return jQuery.dir(elem,"parentNode");}, - next: function(elem){return jQuery.nth(elem,2,"nextSibling");}, - prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}, - nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}, - prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}, - siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}, - children: function(elem){return jQuery.sibling(elem.firstChild);}, - contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);} -}, function(name, fn){ - jQuery.fn[ name ] = function( selector ) { - var ret = jQuery.map( this, fn ); - - if ( selector && typeof selector == "string" ) - ret = jQuery.multiFilter( selector, ret ); - - return this.pushStack( jQuery.unique( ret ) ); - }; -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function(name, original){ - jQuery.fn[ name ] = function() { - var args = arguments; - - return this.each(function(){ - for ( var i = 0, length = args.length; i < length; i++ ) - jQuery( args[ i ] )[ original ]( this ); - }); - }; -}); - -jQuery.each({ - removeAttr: function( name ) { - jQuery.attr( this, name, "" ); - if (this.nodeType == 1) - this.removeAttribute( name ); - }, - - addClass: function( classNames ) { - jQuery.className.add( this, classNames ); - }, - - removeClass: function( classNames ) { - jQuery.className.remove( this, classNames ); - }, - - toggleClass: function( classNames ) { - jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames ); - }, - - remove: function( selector ) { - if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) { - // Prevent memory leaks - jQuery( "*", this ).add(this).each(function(){ - jQuery.event.remove(this); - jQuery.removeData(this); - }); - if (this.parentNode) - this.parentNode.removeChild( this ); - } - }, - - empty: function() { - // Remove element nodes and prevent memory leaks - jQuery( ">*", this ).remove(); - - // Remove any remaining nodes - while ( this.firstChild ) - this.removeChild( this.firstChild ); - } -}, function(name, fn){ - jQuery.fn[ name ] = function(){ - return this.each( fn, arguments ); - }; -}); - -jQuery.each([ "Height", "Width" ], function(i, name){ - var type = name.toLowerCase(); - - jQuery.fn[ type ] = function( size ) { - // Get window width or height - return this[0] == window ? - // Opera reports document.body.client[Width/Height] properly in both quirks and standards - jQuery.browser.opera && document.body[ "client" + name ] || - - // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths) - jQuery.browser.safari && window[ "inner" + name ] || - - // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode - document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] : - - // Get document width or height - this[0] == document ? - // Either scroll[Width/Height] or offset[Width/Height], whichever is greater - Math.max( - Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]), - Math.max(document.body["offset" + name], document.documentElement["offset" + name]) - ) : - - // Get or set width or height on the element - size == undefined ? - // Get width or height on the element - (this.length ? jQuery.css( this[0], type ) : null) : - - // Set the width or height on the element (default to pixels if value is unitless) - this.css( type, size.constructor == String ? size : size + "px" ); - }; -}); - -var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? - "(?:[\\w*_-]|\\\\.)" : - "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", - quickChild = new RegExp("^>\\s*(" + chars + "+)"), - quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), - quickClass = new RegExp("^([#.]?)(" + chars + "*)"); - -jQuery.extend({ - expr: { - "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);}, - "#": function(a,i,m){return a.getAttribute("id")==m[2];}, - ":": { - // Position Checks - lt: function(a,i,m){return i<m[3]-0;}, - gt: function(a,i,m){return i>m[3]-0;}, - nth: function(a,i,m){return m[3]-0==i;}, - eq: function(a,i,m){return m[3]-0==i;}, - first: function(a,i){return i==0;}, - last: function(a,i,m,r){return i==r.length-1;}, - even: function(a,i){return i%2==0;}, - odd: function(a,i){return i%2;}, - - // Child Checks - "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;}, - "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;}, - "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");}, - - // Parent Checks - parent: function(a){return a.firstChild;}, - empty: function(a){return !a.firstChild;}, - - // Text Check - contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;}, - - // Visibility - visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";}, - hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";}, - - // Form attributes - enabled: function(a){return !a.disabled;}, - disabled: function(a){return a.disabled;}, - checked: function(a){return a.checked;}, - selected: function(a){return a.selected||jQuery.attr(a,"selected");}, - - // Form elements - text: function(a){return "text"==a.type;}, - radio: function(a){return "radio"==a.type;}, - checkbox: function(a){return "checkbox"==a.type;}, - file: function(a){return "file"==a.type;}, - password: function(a){return "password"==a.type;}, - submit: function(a){return "submit"==a.type;}, - image: function(a){return "image"==a.type;}, - reset: function(a){return "reset"==a.type;}, - button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");}, - input: function(a){return /input|select|textarea|button/i.test(a.nodeName);}, - - // :has() - has: function(a,i,m){return jQuery.find(m[3],a).length;}, - - // :header - header: function(a){return /h\d/i.test(a.nodeName);}, - - // :animated - animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;} - } - }, - - // The regular expressions that power the parsing engine - parse: [ - // Match: [@value='test'], [@foo] - /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, - - // Match: :contains('foo') - /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, - - // Match: :even, :last-chlid, #id, .class - new RegExp("^([:.#]*)(" + chars + "+)") - ], - - multiFilter: function( expr, elems, not ) { - var old, cur = []; - - while ( expr && expr != old ) { - old = expr; - var f = jQuery.filter( expr, elems, not ); - expr = f.t.replace(/^\s*,\s*/, "" ); - cur = not ? elems = f.r : jQuery.merge( cur, f.r ); - } - - return cur; - }, - - find: function( t, context ) { - // Quickly handle non-string expressions - if ( typeof t != "string" ) - return [ t ]; - - // check to make sure context is a DOM element or a document - if ( context && context.nodeType != 1 && context.nodeType != 9) - return [ ]; - - // Set the correct context (if none is provided) - context = context || document; - - // Initialize the search - var ret = [context], done = [], last, nodeName; - - // Continue while a selector expression exists, and while - // we're no longer looping upon ourselves - while ( t && last != t ) { - var r = []; - last = t; - - t = jQuery.trim(t); - - var foundToken = false; - - // An attempt at speeding up child selectors that - // point to a specific element tag - var re = quickChild; - var m = re.exec(t); - - if ( m ) { - nodeName = m[1].toUpperCase(); - - // Perform our own iteration and filter - for ( var i = 0; ret[i]; i++ ) - for ( var c = ret[i].firstChild; c; c = c.nextSibling ) - if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) ) - r.push( c ); - - ret = r; - t = t.replace( re, "" ); - if ( t.indexOf(" ") == 0 ) continue; - foundToken = true; - } else { - re = /^([>+~])\s*(\w*)/i; - - if ( (m = re.exec(t)) != null ) { - r = []; - - var merge = {}; - nodeName = m[2].toUpperCase(); - m = m[1]; - - for ( var j = 0, rl = ret.length; j < rl; j++ ) { - var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild; - for ( ; n; n = n.nextSibling ) - if ( n.nodeType == 1 ) { - var id = jQuery.data(n); - - if ( m == "~" && merge[id] ) break; - - if (!nodeName || n.nodeName.toUpperCase() == nodeName ) { - if ( m == "~" ) merge[id] = true; - r.push( n ); - } - - if ( m == "+" ) break; - } - } - - ret = r; - - // And remove the token - t = jQuery.trim( t.replace( re, "" ) ); - foundToken = true; - } - } - - // See if there's still an expression, and that we haven't already - // matched a token - if ( t && !foundToken ) { - // Handle multiple expressions - if ( !t.indexOf(",") ) { - // Clean the result set - if ( context == ret[0] ) ret.shift(); - - // Merge the result sets - done = jQuery.merge( done, ret ); - - // Reset the context - r = ret = [context]; - - // Touch up the selector string - t = " " + t.substr(1,t.length); - - } else { - // Optimize for the case nodeName#idName - var re2 = quickID; - var m = re2.exec(t); - - // Re-organize the results, so that they're consistent - if ( m ) { - m = [ 0, m[2], m[3], m[1] ]; - - } else { - // Otherwise, do a traditional filter check for - // ID, class, and element selectors - re2 = quickClass; - m = re2.exec(t); - } - - m[2] = m[2].replace(/\\/g, ""); - - var elem = ret[ret.length-1]; - - // Try to do a global search by ID, where we can - if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) { - // Optimization for HTML document case - var oid = elem.getElementById(m[2]); - - // Do a quick check for the existence of the actual ID attribute - // to avoid selecting by the name attribute in IE - // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form - if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] ) - oid = jQuery('[@id="'+m[2]+'"]', elem)[0]; - - // Do a quick check for node name (where applicable) so - // that div#foo searches will be really fast - ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; - } else { - // We need to find all descendant elements - for ( var i = 0; ret[i]; i++ ) { - // Grab the tag name being searched for - var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2]; - - // Handle IE7 being really dumb about <object>s - if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" ) - tag = "param"; - - r = jQuery.merge( r, ret[i].getElementsByTagName( tag )); - } - - // It's faster to filter by class and be done with it - if ( m[1] == "." ) - r = jQuery.classFilter( r, m[2] ); - - // Same with ID filtering - if ( m[1] == "#" ) { - var tmp = []; - - // Try to find the element with the ID - for ( var i = 0; r[i]; i++ ) - if ( r[i].getAttribute("id") == m[2] ) { - tmp = [ r[i] ]; - break; - } - - r = tmp; - } - - ret = r; - } - - t = t.replace( re2, "" ); - } - - } - - // If a selector string still exists - if ( t ) { - // Attempt to filter it - var val = jQuery.filter(t,r); - ret = r = val.r; - t = jQuery.trim(val.t); - } - } - - // An error occurred with the selector; - // just return an empty set instead - if ( t ) - ret = []; - - // Remove the root context - if ( ret && context == ret[0] ) - ret.shift(); - - // And combine the results - done = jQuery.merge( done, ret ); - - return done; - }, - - classFilter: function(r,m,not){ - m = " " + m + " "; - var tmp = []; - for ( var i = 0; r[i]; i++ ) { - var pass = (" " + r[i].className + " ").indexOf( m ) >= 0; - if ( !not && pass || not && !pass ) - tmp.push( r[i] ); - } - return tmp; - }, - - filter: function(t,r,not) { - var last; - - // Look for common filter expressions - while ( t && t != last ) { - last = t; - - var p = jQuery.parse, m; - - for ( var i = 0; p[i]; i++ ) { - m = p[i].exec( t ); - - if ( m ) { - // Remove what we just matched - t = t.substring( m[0].length ); - - m[2] = m[2].replace(/\\/g, ""); - break; - } - } - - if ( !m ) - break; - - // :not() is a special case that can be optimized by - // keeping it out of the expression list - if ( m[1] == ":" && m[2] == "not" ) - // optimize if only one selector found (most common case) - r = isSimple.test( m[3] ) ? - jQuery.filter(m[3], r, true).r : - jQuery( r ).not( m[3] ); - - // We can get a big speed boost by filtering by class here - else if ( m[1] == "." ) - r = jQuery.classFilter(r, m[2], not); - - else if ( m[1] == "[" ) { - var tmp = [], type = m[3]; - - for ( var i = 0, rl = r.length; i < rl; i++ ) { - var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ]; - - if ( z == null || /href|src|selected/.test(m[2]) ) - z = jQuery.attr(a,m[2]) || ''; - - if ( (type == "" && !!z || - type == "=" && z == m[5] || - type == "!=" && z != m[5] || - type == "^=" && z && !z.indexOf(m[5]) || - type == "$=" && z.substr(z.length - m[5].length) == m[5] || - (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not ) - tmp.push( a ); - } - - r = tmp; - - // We can get a speed boost by handling nth-child here - } else if ( m[1] == ":" && m[2] == "nth-child" ) { - var merge = {}, tmp = [], - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( - m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || - !/\D/.test(m[3]) && "0n+" + m[3] || m[3]), - // calculate the numbers (first)n+(last) including if they are negative - first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0; - - // loop through all the elements left in the jQuery object - for ( var i = 0, rl = r.length; i < rl; i++ ) { - var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode); - - if ( !merge[id] ) { - var c = 1; - - for ( var n = parentNode.firstChild; n; n = n.nextSibling ) - if ( n.nodeType == 1 ) - n.nodeIndex = c++; - - merge[id] = true; - } - - var add = false; - - if ( first == 0 ) { - if ( node.nodeIndex == last ) - add = true; - } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 ) - add = true; - - if ( add ^ not ) - tmp.push( node ); - } - - r = tmp; - - // Otherwise, find the expression to execute - } else { - var fn = jQuery.expr[ m[1] ]; - if ( typeof fn == "object" ) - fn = fn[ m[2] ]; - - if ( typeof fn == "string" ) - fn = eval("false||function(a,i){return " + fn + ";}"); - - // Execute it against the current filter - r = jQuery.grep( r, function(elem, i){ - return fn(elem, i, m, r); - }, not ); - } - } - - // Return an array of filtered elements (r) - // and the modified expression string (t) - return { r: r, t: t }; - }, - - dir: function( elem, dir ){ - var matched = []; - var cur = elem[dir]; - while ( cur && cur != document ) { - if ( cur.nodeType == 1 ) - matched.push( cur ); - cur = cur[dir]; - } - return matched; - }, - - nth: function(cur,result,dir,elem){ - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) - if ( cur.nodeType == 1 && ++num == result ) - break; - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType == 1 && (!elem || n != elem) ) - r.push( n ); - } - - return r; - } -}); - -/* - * A number of helper functions used for managing events. - * Many of the ideas behind this code orignated from - * Dean Edwards' addEvent library. - */ -jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function(elem, types, handler, data) { - if ( elem.nodeType == 3 || elem.nodeType == 8 ) - return; - - // For whatever reason, IE has trouble passing the window object - // around, causing it to be cloned in the process - if ( jQuery.browser.msie && elem.setInterval != undefined ) - elem = window; - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) - handler.guid = this.guid++; - - // if data is passed, bind to handler - if( data != undefined ) { - // Create temporary function pointer to original handler - var fn = handler; - - // Create unique handler function, wrapped around original handler - handler = function() { - // Pass arguments and context to original handler - return fn.apply(this, arguments); - }; - - // Store data in unique handler - handler.data = data; - - // Set the guid of unique handler to the same of original handler, so it can be removed - handler.guid = fn.guid; - } - - // Init the element's event structure - var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), - handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ - // returned undefined or false - var val; - - // Handle the second event of a trigger and when - // an event is called after a page has unloaded - if ( typeof jQuery == "undefined" || jQuery.event.triggered ) - return val; - - val = jQuery.event.handle.apply(arguments.callee.elem, arguments); - - return val; - }); - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native - // event in IE. - handle.elem = elem; - - // Handle multiple events seperated by a space - // jQuery(...).bind("mouseover mouseout", fn); - jQuery.each(types.split(/\s+/), function(index, type) { - // Namespaced event handlers - var parts = type.split("."); - type = parts[0]; - handler.type = parts[1]; - - // Get the current list of functions bound to this event - var handlers = events[type]; - - // Init the event handler queue - if (!handlers) { - handlers = events[type] = {}; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) { - // Bind the global event handler to the element - if (elem.addEventListener) - elem.addEventListener(type, handle, false); - else if (elem.attachEvent) - elem.attachEvent("on" + type, handle); - } - } - - // Add the function to the element's handler list - handlers[handler.guid] = handler; - - // Keep track of which events have been used, for global triggering - jQuery.event.global[type] = true; - }); - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - guid: 1, - global: {}, - - // Detach an event or set of events from an element - remove: function(elem, types, handler) { - // don't do events on text and comment nodes - if ( elem.nodeType == 3 || elem.nodeType == 8 ) - return; - - var events = jQuery.data(elem, "events"), ret, index; - - if ( events ) { - // Unbind all events for the element - if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") ) - for ( var type in events ) - this.remove( elem, type + (types || "") ); - else { - // types is actually an event object here - if ( types.type ) { - handler = types.handler; - types = types.type; - } - - // Handle multiple events seperated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - jQuery.each(types.split(/\s+/), function(index, type){ - // Namespaced event handlers - var parts = type.split("."); - type = parts[0]; - - if ( events[type] ) { - // remove the given handler for the given type - if ( handler ) - delete events[type][handler.guid]; - - // remove all handlers for the given type - else - for ( handler in events[type] ) - // Handle the removal of namespaced events - if ( !parts[1] || events[type][handler].type == parts[1] ) - delete events[type][handler]; - - // remove generic event handler if no more handlers exist - for ( ret in events[type] ) break; - if ( !ret ) { - if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) { - if (elem.removeEventListener) - elem.removeEventListener(type, jQuery.data(elem, "handle"), false); - else if (elem.detachEvent) - elem.detachEvent("on" + type, jQuery.data(elem, "handle")); - } - ret = null; - delete events[type]; - } - } - }); - } - - // Remove the expando if it's no longer used - for ( ret in events ) break; - if ( !ret ) { - var handle = jQuery.data( elem, "handle" ); - if ( handle ) handle.elem = null; - jQuery.removeData( elem, "events" ); - jQuery.removeData( elem, "handle" ); - } - } - }, - - trigger: function(type, data, elem, donative, extra) { - // Clone the incoming data, if any - data = jQuery.makeArray(data || []); - - if ( type.indexOf("!") >= 0 ) { - type = type.slice(0, -1); - var exclusive = true; - } - - // Handle a global trigger - if ( !elem ) { - // Only trigger if we've ever bound an event for it - if ( this.global[type] ) - jQuery("*").add([window, document]).trigger(type, data); - - // Handle triggering a single element - } else { - // don't do events on text and comment nodes - if ( elem.nodeType == 3 || elem.nodeType == 8 ) - return undefined; - - var val, ret, fn = jQuery.isFunction( elem[ type ] || null ), - // Check to see if we need to provide a fake event, or not - event = !data[0] || !data[0].preventDefault; - - // Pass along a fake event - if ( event ) - data.unshift( this.fix({ type: type, target: elem }) ); - - // Enforce the right trigger type - data[0].type = type; - if ( exclusive ) - data[0].exclusive = true; - - // Trigger the event - if ( jQuery.isFunction( jQuery.data(elem, "handle") ) ) - val = jQuery.data(elem, "handle").apply( elem, data ); - - // Handle triggering native .onfoo handlers - if ( !fn && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) - val = false; - - // Extra functions don't get the custom event object - if ( event ) - data.shift(); - - // Handle triggering of extra function - if ( extra && jQuery.isFunction( extra ) ) { - // call the extra function and tack the current return value on the end for possible inspection - ret = extra.apply( elem, val == null ? data : data.concat( val ) ); - // if anything is returned, give it precedence and have it overwrite the previous value - if (ret !== undefined) - val = ret; - } - - // Trigger the native events (except for clicks on links) - if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) { - this.triggered = true; - try { - elem[ type ](); - // prevent IE from throwing an error for some hidden elements - } catch (e) {} - } - - this.triggered = false; - } - - return val; - }, - - handle: function(event) { - // returned undefined or false - var val; - - // Empty object is for triggered events with no data - event = jQuery.event.fix( event || window.event || {} ); - - // Namespaced event handlers - var parts = event.type.split("."); - event.type = parts[0]; - - var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 ); - args.unshift( event ); - - for ( var j in handlers ) { - var handler = handlers[j]; - // Pass in a reference to the handler function itself - // So that we can later remove it - args[0].handler = handler; - args[0].data = handler.data; - - // Filter the functions by class - if ( !parts[1] && !event.exclusive || handler.type == parts[1] ) { - var ret = handler.apply( this, args ); - - if ( val !== false ) - val = ret; - - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - - // Clean up added properties in IE to prevent memory leak - if (jQuery.browser.msie) - event.target = event.preventDefault = event.stopPropagation = - event.handler = event.data = null; - - return val; - }, - - fix: function(event) { - // store a copy of the original event object - // and clone to set read-only properties - var originalEvent = event; - event = jQuery.extend({}, originalEvent); - - // add preventDefault and stopPropagation since - // they will not work on the clone - event.preventDefault = function() { - // if preventDefault exists run it on the original event - if (originalEvent.preventDefault) - originalEvent.preventDefault(); - // otherwise set the returnValue property of the original event to false (IE) - originalEvent.returnValue = false; - }; - event.stopPropagation = function() { - // if stopPropagation exists run it on the original event - if (originalEvent.stopPropagation) - originalEvent.stopPropagation(); - // otherwise set the cancelBubble property of the original event to true (IE) - originalEvent.cancelBubble = true; - }; - - // Fix target property, if necessary - if ( !event.target ) - event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either - - // check if target is a textnode (safari) - if ( event.target.nodeType == 3 ) - event.target = originalEvent.target.parentNode; - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) - event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var doc = document.documentElement, body = document.body; - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); - } - - // Add which for key events - if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) - event.which = event.charCode || event.keyCode; - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) - event.metaKey = event.ctrlKey; - - // Add which for click: 1 == left; 2 == middle; 3 == right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button ) - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - - return event; - }, - - special: { - ready: { - setup: function() { - // Make sure the ready event is setup - bindReady(); - return; - }, - - teardown: function() { return; } - }, - - mouseenter: { - setup: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler); - return true; - }, - - teardown: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler); - return true; - }, - - handler: function(event) { - // If we actually just moused on to a sub-element, ignore it - if ( withinElement(event, this) ) return true; - // Execute the right handlers by setting the event type to mouseenter - arguments[0].type = "mouseenter"; - return jQuery.event.handle.apply(this, arguments); - } - }, - - mouseleave: { - setup: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler); - return true; - }, - - teardown: function() { - if ( jQuery.browser.msie ) return false; - jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler); - return true; - }, - - handler: function(event) { - // If we actually just moused on to a sub-element, ignore it - if ( withinElement(event, this) ) return true; - // Execute the right handlers by setting the event type to mouseleave - arguments[0].type = "mouseleave"; - return jQuery.event.handle.apply(this, arguments); - } - } - } -}; - -jQuery.fn.extend({ - bind: function( type, data, fn ) { - return type == "unload" ? this.one(type, data, fn) : this.each(function(){ - jQuery.event.add( this, type, fn || data, fn && data ); - }); - }, - - one: function( type, data, fn ) { - return this.each(function(){ - jQuery.event.add( this, type, function(event) { - jQuery(this).unbind(event); - return (fn || data).apply( this, arguments); - }, fn && data); - }); - }, - - unbind: function( type, fn ) { - return this.each(function(){ - jQuery.event.remove( this, type, fn ); - }); - }, - - trigger: function( type, data, fn ) { - return this.each(function(){ - jQuery.event.trigger( type, data, this, true, fn ); - }); - }, - - triggerHandler: function( type, data, fn ) { - if ( this[0] ) - return jQuery.event.trigger( type, data, this[0], false, fn ); - return undefined; - }, - - toggle: function() { - // Save reference to arguments for access in closure - var args = arguments; - - return this.click(function(event) { - // Figure out which function to execute - this.lastToggle = 0 == this.lastToggle ? 1 : 0; - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[this.lastToggle].apply( this, arguments ) || false; - }); - }, - - hover: function(fnOver, fnOut) { - return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut); - }, - - ready: function(fn) { - // Attach the listeners - bindReady(); - - // If the DOM is already ready - if ( jQuery.isReady ) - // Execute the function immediately - fn.call( document, jQuery ); - - // Otherwise, remember the function for later - else - // Add the function to the wait list - jQuery.readyList.push( function() { return fn.call(this, jQuery); } ); - - return this; - } -}); - -jQuery.extend({ - isReady: false, - readyList: [], - // Handle when the DOM is ready - ready: function() { - // Make sure that the DOM is not already loaded - if ( !jQuery.isReady ) { - // Remember that the DOM is ready - jQuery.isReady = true; - - // If there are functions bound, to execute - if ( jQuery.readyList ) { - // Execute all of them - jQuery.each( jQuery.readyList, function(){ - this.apply( document ); - }); - - // Reset the list of functions - jQuery.readyList = null; - } - - // Trigger any bound ready events - jQuery(document).triggerHandler("ready"); - } - } -}); - -var readyBound = false; - -function bindReady(){ - if ( readyBound ) return; - readyBound = true; - - // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event - if ( document.addEventListener && !jQuery.browser.opera) - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); - - // If IE is used and is not in a frame - // Continually check to see if the document is ready - if ( jQuery.browser.msie && window == top ) (function(){ - if (jQuery.isReady) return; - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch( error ) { - setTimeout( arguments.callee, 0 ); - return; - } - // and execute any waiting functions - jQuery.ready(); - })(); - - if ( jQuery.browser.opera ) - document.addEventListener( "DOMContentLoaded", function () { - if (jQuery.isReady) return; - for (var i = 0; i < document.styleSheets.length; i++) - if (document.styleSheets[i].disabled) { - setTimeout( arguments.callee, 0 ); - return; - } - // and execute any waiting functions - jQuery.ready(); - }, false); - - if ( jQuery.browser.safari ) { - var numStyles; - (function(){ - if (jQuery.isReady) return; - if ( document.readyState != "loaded" && document.readyState != "complete" ) { - setTimeout( arguments.callee, 0 ); - return; - } - if ( numStyles === undefined ) - numStyles = jQuery("style, link[rel=stylesheet]").length; - if ( document.styleSheets.length != numStyles ) { - setTimeout( arguments.callee, 0 ); - return; - } - // and execute any waiting functions - jQuery.ready(); - })(); - } - - // A fallback to window.onload, that will always work - jQuery.event.add( window, "load", jQuery.ready ); -} - -jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + - "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + - "submit,keydown,keypress,keyup,error").split(","), function(i, name){ - - // Handle event binding - jQuery.fn[name] = function(fn){ - return fn ? this.bind(name, fn) : this.trigger(name); - }; -}); - -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function(event, elem) { - // Check if mouse(over|out) are still within the same parent element - var parent = event.relatedTarget; - // Traverse up the tree - while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; } - // Return true if we actually just moused on to a sub-element - return parent == elem; -}; - -// Prevent memory leaks in IE -// And prevent errors on refresh with events like mouseover in other browsers -// Window isn't included so as not to unbind existing unload events -jQuery(window).bind("unload", function() { - jQuery("*").add(document).unbind(); -}); -jQuery.fn.extend({ - load: function( url, params, callback ) { - if ( jQuery.isFunction( url ) ) - return this.bind("load", url); - - var off = url.indexOf(" "); - if ( off >= 0 ) { - var selector = url.slice(off, url.length); - url = url.slice(0, off); - } - - callback = callback || function(){}; - - // Default to a GET request - var type = "GET"; - - // If the second parameter was provided - if ( params ) - // If it's a function - if ( jQuery.isFunction( params ) ) { - // We assume that it's the callback - callback = params; - params = null; - - // Otherwise, build a param string - } else { - params = jQuery.param( params ); - type = "POST"; - } - - var self = this; - - // Request the remote document - jQuery.ajax({ - url: url, - type: type, - dataType: "html", - data: params, - complete: function(res, status){ - // If successful, inject the HTML into all the matched elements - if ( status == "success" || status == "notmodified" ) - // See if a selector was specified - self.html( selector ? - // Create a dummy div to hold the results - jQuery("<div/>") - // inject the contents of the document in, removing the scripts - // to avoid any 'Permission Denied' errors in IE - .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) - - // Locate the specified elements - .find(selector) : - - // If not, just inject the full result - res.responseText ); - - self.each( callback, [res.responseText, status, res] ); - } - }); - return this; - }, - - serialize: function() { - return jQuery.param(this.serializeArray()); - }, - serializeArray: function() { - return this.map(function(){ - return jQuery.nodeName(this, "form") ? - jQuery.makeArray(this.elements) : this; - }) - .filter(function(){ - return this.name && !this.disabled && - (this.checked || /select|textarea/i.test(this.nodeName) || - /text|hidden|password/i.test(this.type)); - }) - .map(function(i, elem){ - var val = jQuery(this).val(); - return val == null ? null : - val.constructor == Array ? - jQuery.map( val, function(val, i){ - return {name: elem.name, value: val}; - }) : - {name: elem.name, value: val}; - }).get(); - } -}); - -// Attach a bunch of functions for handling common AJAX events -jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ - jQuery.fn[o] = function(f){ - return this.bind(o, f); - }; -}); - -var jsc = (new Date).getTime(); - -jQuery.extend({ - get: function( url, data, callback, type ) { - // shift arguments if data argument was ommited - if ( jQuery.isFunction( data ) ) { - callback = data; - data = null; - } - - return jQuery.ajax({ - type: "GET", - url: url, - data: data, - success: callback, - dataType: type - }); - }, - - getScript: function( url, callback ) { - return jQuery.get(url, null, callback, "script"); - }, - - getJSON: function( url, data, callback ) { - return jQuery.get(url, data, callback, "json"); - }, - - post: function( url, data, callback, type ) { - if ( jQuery.isFunction( data ) ) { - callback = data; - data = {}; - } - - return jQuery.ajax({ - type: "POST", - url: url, - data: data, - success: callback, - dataType: type - }); - }, - - ajaxSetup: function( settings ) { - jQuery.extend( jQuery.ajaxSettings, settings ); - }, - - ajaxSettings: { - global: true, - type: "GET", - timeout: 0, - contentType: "application/x-www-form-urlencoded", - processData: true, - async: true, - data: null, - username: null, - password: null, - accepts: { - xml: "application/xml, text/xml", - html: "text/html", - script: "text/javascript, application/javascript", - json: "application/json, text/javascript", - text: "text/plain", - _default: "*/*" - } - }, - - // Last-Modified header cache for next request - lastModified: {}, - - ajax: function( s ) { - var jsonp, jsre = /=\?(&|$)/g, status, data; - - // Extend the settings, but re-extend 's' so that it can be - // checked again later (in the test suite, specifically) - s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); - - // convert data if not already a string - if ( s.data && s.processData && typeof s.data != "string" ) - s.data = jQuery.param(s.data); - - // Handle JSONP Parameter Callbacks - if ( s.dataType == "jsonp" ) { - if ( s.type.toLowerCase() == "get" ) { - if ( !s.url.match(jsre) ) - s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"; - } else if ( !s.data || !s.data.match(jsre) ) - s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; - s.dataType = "json"; - } - - // Build temporary JSONP function - if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) { - jsonp = "jsonp" + jsc++; - - // Replace the =? sequence both in the query string and the data - if ( s.data ) - s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); - s.url = s.url.replace(jsre, "=" + jsonp + "$1"); - - // We need to make sure - // that a JSONP style response is executed properly - s.dataType = "script"; - - // Handle JSONP-style loading - window[ jsonp ] = function(tmp){ - data = tmp; - success(); - complete(); - // Garbage collect - window[ jsonp ] = undefined; - try{ delete window[ jsonp ]; } catch(e){} - if ( head ) - head.removeChild( script ); - }; - } - - if ( s.dataType == "script" && s.cache == null ) - s.cache = false; - - if ( s.cache === false && s.type.toLowerCase() == "get" ) { - var ts = (new Date()).getTime(); - // try replacing _= if it is there - var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); - // if nothing was replaced, add timestamp to the end - s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); - } - - // If data is available, append data to url for get requests - if ( s.data && s.type.toLowerCase() == "get" ) { - s.url += (s.url.match(/\?/) ? "&" : "?") + s.data; - - // IE likes to send both get and post data, prevent this - s.data = null; - } - - // Watch for a new set of requests - if ( s.global && ! jQuery.active++ ) - jQuery.event.trigger( "ajaxStart" ); - - // If we're requesting a remote document - // and trying to load JSON or Script with a GET - if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && s.dataType == "script" && s.type.toLowerCase() == "get" ) { - var head = document.getElementsByTagName("head")[0]; - var script = document.createElement("script"); - script.src = s.url; - if (s.scriptCharset) - script.charset = s.scriptCharset; - - // Handle Script loading - if ( !jsonp ) { - var done = false; - - // Attach handlers for all browsers - script.onload = script.onreadystatechange = function(){ - if ( !done && (!this.readyState || - this.readyState == "loaded" || this.readyState == "complete") ) { - done = true; - success(); - complete(); - head.removeChild( script ); - } - }; - } - - head.appendChild(script); - - // We handle everything using the script element injection - return undefined; - } - - var requestDone = false; - - // Create the request object; Microsoft failed to properly - // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available - var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); - - // Open the socket - xml.open(s.type, s.url, s.async, s.username, s.password); - - // Need an extra try/catch for cross domain requests in Firefox 3 - try { - // Set the correct header, if data is being sent - if ( s.data ) - xml.setRequestHeader("Content-Type", s.contentType); - - // Set the If-Modified-Since header, if ifModified mode. - if ( s.ifModified ) - xml.setRequestHeader("If-Modified-Since", - jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); - - // Set header so the called script knows that it's an XMLHttpRequest - xml.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - - // Set the Accepts header for the server, depending on the dataType - xml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? - s.accepts[ s.dataType ] + ", */*" : - s.accepts._default ); - } catch(e){} - - // Allow custom headers/mimetypes - if ( s.beforeSend ) - s.beforeSend(xml); - - if ( s.global ) - jQuery.event.trigger("ajaxSend", [xml, s]); - - // Wait for a response to come back - var onreadystatechange = function(isTimeout){ - // The transfer is complete and the data is available, or the request timed out - if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) { - requestDone = true; - - // clear poll interval - if (ival) { - clearInterval(ival); - ival = null; - } - - status = isTimeout == "timeout" && "timeout" || - !jQuery.httpSuccess( xml ) && "error" || - s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" || - "success"; - - if ( status == "success" ) { - // Watch for, and catch, XML document parse errors - try { - // process the data (runs the xml through httpData regardless of callback) - data = jQuery.httpData( xml, s.dataType ); - } catch(e) { - status = "parsererror"; - } - } - - // Make sure that the request was successful or notmodified - if ( status == "success" ) { - // Cache Last-Modified header, if ifModified mode. - var modRes; - try { - modRes = xml.getResponseHeader("Last-Modified"); - } catch(e) {} // swallow exception thrown by FF if header is not available - - if ( s.ifModified && modRes ) - jQuery.lastModified[s.url] = modRes; - - // JSONP handles its own success callback - if ( !jsonp ) - success(); - } else - jQuery.handleError(s, xml, status); - - // Fire the complete handlers - complete(); - - // Stop memory leaks - if ( s.async ) - xml = null; - } - }; - - if ( s.async ) { - // don't attach the handler to the request, just poll it instead - var ival = setInterval(onreadystatechange, 13); - - // Timeout checker - if ( s.timeout > 0 ) - setTimeout(function(){ - // Check to see if the request is still happening - if ( xml ) { - // Cancel the request - xml.abort(); - - if( !requestDone ) - onreadystatechange( "timeout" ); - } - }, s.timeout); - } - - // Send the data - try { - xml.send(s.data); - } catch(e) { - jQuery.handleError(s, xml, null, e); - } - - // firefox 1.5 doesn't fire statechange for sync requests - if ( !s.async ) - onreadystatechange(); - - function success(){ - // If a local callback was specified, fire it and pass it the data - if ( s.success ) - s.success( data, status ); - - // Fire the global callback - if ( s.global ) - jQuery.event.trigger( "ajaxSuccess", [xml, s] ); - } - - function complete(){ - // Process result - if ( s.complete ) - s.complete(xml, status); - - // The request was completed - if ( s.global ) - jQuery.event.trigger( "ajaxComplete", [xml, s] ); - - // Handle the global AJAX counter - if ( s.global && ! --jQuery.active ) - jQuery.event.trigger( "ajaxStop" ); - } - - // return XMLHttpRequest to allow aborting the request etc. - return xml; - }, - - handleError: function( s, xml, status, e ) { - // If a local callback was specified, fire it - if ( s.error ) s.error( xml, status, e ); - - // Fire the global callback - if ( s.global ) - jQuery.event.trigger( "ajaxError", [xml, s, e] ); - }, - - // Counter for holding the number of active queries - active: 0, - - // Determines if an XMLHttpRequest was successful or not - httpSuccess: function( r ) { - try { - // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 - return !r.status && location.protocol == "file:" || - ( r.status >= 200 && r.status < 300 ) || r.status == 304 || r.status == 1223 || - jQuery.browser.safari && r.status == undefined; - } catch(e){} - return false; - }, - - // Determines if an XMLHttpRequest returns NotModified - httpNotModified: function( xml, url ) { - try { - var xmlRes = xml.getResponseHeader("Last-Modified"); - - // Firefox always returns 200. check Last-Modified date - return xml.status == 304 || xmlRes == jQuery.lastModified[url] || - jQuery.browser.safari && xml.status == undefined; - } catch(e){} - return false; - }, - - httpData: function( r, type ) { - var ct = r.getResponseHeader("content-type"); - var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0; - var data = xml ? r.responseXML : r.responseText; - - if ( xml && data.documentElement.tagName == "parsererror" ) - throw "parsererror"; - - // If the type is "script", eval it in global context - if ( type == "script" ) - jQuery.globalEval( data ); - - // Get the JavaScript object, if JSON is used. - if ( type == "json" ) - data = eval("(" + data + ")"); - - return data; - }, - - // Serialize an array of form elements or a set of - // key/values into a query string - param: function( a ) { - var s = []; - - // If an array was passed in, assume that it is an array - // of form elements - if ( a.constructor == Array || a.jquery ) - // Serialize the form elements - jQuery.each( a, function(){ - s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) ); - }); - - // Otherwise, assume that it's an object of key/value pairs - else - // Serialize the key/values - for ( var j in a ) - // If the value is an array then the key names need to be repeated - if ( a[j] && a[j].constructor == Array ) - jQuery.each( a[j], function(){ - s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) ); - }); - else - s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) ); - - // Return the resulting serialization - return s.join("&").replace(/%20/g, "+"); - } - -}); -jQuery.fn.extend({ - show: function(speed,callback){ - return speed ? - this.animate({ - height: "show", width: "show", opacity: "show" - }, speed, callback) : - - this.filter(":hidden").each(function(){ - this.style.display = this.oldblock || ""; - if ( jQuery.css(this,"display") == "none" ) { - var elem = jQuery("<" + this.tagName + " />").appendTo("body"); - this.style.display = elem.css("display"); - // handle an edge condition where css is - div { display:none; } or similar - if (this.style.display == "none") - this.style.display = "block"; - elem.remove(); - } - }).end(); - }, - - hide: function(speed,callback){ - return speed ? - this.animate({ - height: "hide", width: "hide", opacity: "hide" - }, speed, callback) : - - this.filter(":visible").each(function(){ - this.oldblock = this.oldblock || jQuery.css(this,"display"); - this.style.display = "none"; - }).end(); - }, - - // Save the old toggle function - _toggle: jQuery.fn.toggle, - - toggle: function( fn, fn2 ){ - return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? - this._toggle( fn, fn2 ) : - fn ? - this.animate({ - height: "toggle", width: "toggle", opacity: "toggle" - }, fn, fn2) : - this.each(function(){ - jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); - }); - }, - - slideDown: function(speed,callback){ - return this.animate({height: "show"}, speed, callback); - }, - - slideUp: function(speed,callback){ - return this.animate({height: "hide"}, speed, callback); - }, - - slideToggle: function(speed, callback){ - return this.animate({height: "toggle"}, speed, callback); - }, - - fadeIn: function(speed, callback){ - return this.animate({opacity: "show"}, speed, callback); - }, - - fadeOut: function(speed, callback){ - return this.animate({opacity: "hide"}, speed, callback); - }, - - fadeTo: function(speed,to,callback){ - return this.animate({opacity: to}, speed, callback); - }, - - animate: function( prop, speed, easing, callback ) { - var optall = jQuery.speed(speed, easing, callback); - - return this[ optall.queue === false ? "each" : "queue" ](function(){ - if ( this.nodeType != 1) - return false; - - var opt = jQuery.extend({}, optall); - var hidden = jQuery(this).is(":hidden"), self = this; - - for ( var p in prop ) { - if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) - return jQuery.isFunction(opt.complete) && opt.complete.apply(this); - - if ( p == "height" || p == "width" ) { - // Store display property - opt.display = jQuery.css(this, "display"); - - // Make sure that nothing sneaks out - opt.overflow = this.style.overflow; - } - } - - if ( opt.overflow != null ) - this.style.overflow = "hidden"; - - opt.curAnim = jQuery.extend({}, prop); - - jQuery.each( prop, function(name, val){ - var e = new jQuery.fx( self, opt, name ); - - if ( /toggle|show|hide/.test(val) ) - e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop ); - else { - var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), - start = e.cur(true) || 0; - - if ( parts ) { - var end = parseFloat(parts[2]), - unit = parts[3] || "px"; - - // We need to compute starting value - if ( unit != "px" ) { - self.style[ name ] = (end || 1) + unit; - start = ((end || 1) / e.cur(true)) * start; - self.style[ name ] = start + unit; - } - - // If a +=/-= token was provided, we're doing a relative animation - if ( parts[1] ) - end = ((parts[1] == "-=" ? -1 : 1) * end) + start; - - e.custom( start, end, unit ); - } else - e.custom( start, val, "" ); - } - }); - - // For JS strict compliance - return true; - }); - }, - - queue: function(type, fn){ - if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) { - fn = type; - type = "fx"; - } - - if ( !type || (typeof type == "string" && !fn) ) - return queue( this[0], type ); - - return this.each(function(){ - if ( fn.constructor == Array ) - queue(this, type, fn); - else { - queue(this, type).push( fn ); - - if ( queue(this, type).length == 1 ) - fn.apply(this); - } - }); - }, - - stop: function(clearQueue, gotoEnd){ - var timers = jQuery.timers; - - if (clearQueue) - this.queue([]); - - this.each(function(){ - // go in reverse order so anything added to the queue during the loop is ignored - for ( var i = timers.length - 1; i >= 0; i-- ) - if ( timers[i].elem == this ) { - if (gotoEnd) - // force the next step to be the last - timers[i](true); - timers.splice(i, 1); - } - }); - - // start the next in the queue if the last step wasn't forced - if (!gotoEnd) - this.dequeue(); - - return this; - } - -}); - -var queue = function( elem, type, array ) { - if ( !elem ) - return undefined; - - type = type || "fx"; - - var q = jQuery.data( elem, type + "queue" ); - - if ( !q || array ) - q = jQuery.data( elem, type + "queue", - array ? jQuery.makeArray(array) : [] ); - - return q; -}; - -jQuery.fn.dequeue = function(type){ - type = type || "fx"; - - return this.each(function(){ - var q = queue(this, type); - - q.shift(); - - if ( q.length ) - q[0].apply( this ); - }); -}; - -jQuery.extend({ - - speed: function(speed, easing, fn) { - var opt = speed && speed.constructor == Object ? speed : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && easing.constructor != Function && easing - }; - - opt.duration = (opt.duration && opt.duration.constructor == Number ? - opt.duration : - { slow: 600, fast: 200 }[opt.duration]) || 400; - - // Queueing - opt.old = opt.complete; - opt.complete = function(){ - if ( opt.queue !== false ) - jQuery(this).dequeue(); - if ( jQuery.isFunction( opt.old ) ) - opt.old.apply( this ); - }; - - return opt; - }, - - easing: { - linear: function( p, n, firstNum, diff ) { - return firstNum + diff * p; - }, - swing: function( p, n, firstNum, diff ) { - return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; - } - }, - - timers: [], - timerId: null, - - fx: function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if ( !options.orig ) - options.orig = {}; - } - -}); - -jQuery.fx.prototype = { - - // Simple function for setting a style value - update: function(){ - if ( this.options.step ) - this.options.step.apply( this.elem, [ this.now, this ] ); - - (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); - - // Set display property to block for height/width animations - if ( this.prop == "height" || this.prop == "width" ) - this.elem.style.display = "block"; - }, - - // Get the current size - cur: function(force){ - if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null ) - return this.elem[ this.prop ]; - - var r = parseFloat(jQuery.css(this.elem, this.prop, force)); - return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; - }, - - // Start an animation from one number to another - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - this.update(); - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - jQuery.timers.push(t); - - if ( jQuery.timerId == null ) { - jQuery.timerId = setInterval(function(){ - var timers = jQuery.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval( jQuery.timerId ); - jQuery.timerId = null; - } - }, 13); - } - }, - - // Simple 'show' function - show: function(){ - // Remember where we started, so that we can go back to it later - this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); - this.options.show = true; - - // Begin the animation - this.custom(0, this.cur()); - - // Make sure that we start at a small width/height to avoid any - // flash of content - if ( this.prop == "width" || this.prop == "height" ) - this.elem.style[this.prop] = "1px"; - - // Start by showing the element - jQuery(this.elem).show(); - }, - - // Simple 'hide' function - hide: function(){ - // Remember where we started, so that we can go back to it later - this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); - this.options.hide = true; - - // Begin the animation - this.custom(this.cur(), 0); - }, - - // Each step of an animation - step: function(gotoEnd){ - var t = (new Date()).getTime(); - - if ( gotoEnd || t > this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if ( this.options.display != null ) { - // Reset the overflow - this.elem.style.overflow = this.options.overflow; - - // Reset the display - this.elem.style.display = this.options.display; - if ( jQuery.css(this.elem, "display") == "none" ) - this.elem.style.display = "block"; - } - - // Hide the element if the "hide" operation was done - if ( this.options.hide ) - this.elem.style.display = "none"; - - // Reset the properties, if the item has been hidden or shown - if ( this.options.hide || this.options.show ) - for ( var p in this.options.curAnim ) - jQuery.attr(this.elem.style, p, this.options.orig[p]); - } - - // If a callback was provided, execute it - if ( done && jQuery.isFunction( this.options.complete ) ) - // Execute the complete function - this.options.complete.apply( this.elem ); - - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - - // Perform the easing function, defaults to swing - this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - - // Perform the next step of the animation - this.update(); - } - - return true; - } - -}; - -jQuery.fx.step = { - scrollLeft: function(fx){ - fx.elem.scrollLeft = fx.now; - }, - - scrollTop: function(fx){ - fx.elem.scrollTop = fx.now; - }, - - opacity: function(fx){ - jQuery.attr(fx.elem.style, "opacity", fx.now); - }, - - _default: function(fx){ - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - } -}; -// The Offset Method -// Originally By Brandon Aaron, part of the Dimension Plugin -// http://jquery.com/plugins/project/dimensions -jQuery.fn.offset = function() { - var left = 0, top = 0, elem = this[0], results; - - if ( elem ) with ( jQuery.browser ) { - var parent = elem.parentNode, - offsetChild = elem, - offsetParent = elem.offsetParent, - doc = elem.ownerDocument, - safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent), - fixed = jQuery.css(elem, "position") == "fixed"; - - // Use getBoundingClientRect if available - if ( elem.getBoundingClientRect ) { - var box = elem.getBoundingClientRect(); - - // Add the document scroll offsets - add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), - box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); - - // IE adds the HTML element's border, by default it is medium which is 2px - // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; } - // IE 7 standards mode, the border is always 2px - // This border/offset is typically represented by the clientLeft and clientTop properties - // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS - // Therefore this method will be off by 2px in IE while in quirksmode - add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop ); - - // Otherwise loop through the offsetParents and parentNodes - } else { - - // Initial element offsets - add( elem.offsetLeft, elem.offsetTop ); - - // Get parent offsets - while ( offsetParent ) { - // Add offsetParent offsets - add( offsetParent.offsetLeft, offsetParent.offsetTop ); - - // Mozilla and Safari > 2 does not include the border on offset parents - // However Mozilla adds the border for table or table cells - if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 ) - border( offsetParent ); - - // Add the document scroll offsets if position is fixed on any offsetParent - if ( !fixed && jQuery.css(offsetParent, "position") == "fixed" ) - fixed = true; - - // Set offsetChild to previous offsetParent unless it is the body element - offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent; - // Get next offsetParent - offsetParent = offsetParent.offsetParent; - } - - // Get parent scroll offsets - while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) { - // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug - if ( !/^inline|table.*$/i.test(jQuery.css(parent, "display")) ) - // Subtract parent scroll offsets - add( -parent.scrollLeft, -parent.scrollTop ); - - // Mozilla does not add the border for a parent that has overflow != visible - if ( mozilla && jQuery.css(parent, "overflow") != "visible" ) - border( parent ); - - // Get next parent - parent = parent.parentNode; - } - - // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild - // Mozilla doubles body offsets with a non-absolutely positioned offsetChild - if ( (safari2 && (fixed || jQuery.css(offsetChild, "position") == "absolute")) || - (mozilla && jQuery.css(offsetChild, "position") != "absolute") ) - add( -doc.body.offsetLeft, -doc.body.offsetTop ); - - // Add the document scroll offsets if position is fixed - if ( fixed ) - add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), - Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); - } - - // Return an object with top and left properties - results = { top: top, left: left }; - } - - function border(elem) { - add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) ); - } - - function add(l, t) { - left += parseInt(l) || 0; - top += parseInt(t) || 0; - } - - return results; -}; -})(); From 5af54bb9e091d2a6166f30044e6e370a6c792920 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" <jgen.tech@gmail.com> Date: Tue, 7 Feb 2012 20:05:38 -0500 Subject: [PATCH 30/36] Added some more comments and type hints. --- core/imageboard.pack.php | 11 ++++++++--- core/user.class.php | 3 +++ core/util.inc.php | 29 +++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/core/imageboard.pack.php b/core/imageboard.pack.php index ca198452..084cd712 100644 --- a/core/imageboard.pack.php +++ b/core/imageboard.pack.php @@ -106,8 +106,10 @@ class Image { /** * Search for an array of images + * + * @retval Array */ - public static function find_images($start, $limit, $tags=array()) { + public static function find_images(/*int*/ $start, /*int*/ $limit, $tags=array()) { assert(is_numeric($start)); assert(is_numeric($limit)); assert(is_array($tags)); @@ -383,7 +385,7 @@ class Image { /** * Set the image's source URL */ - public function set_source($source) { + public function set_source(/*string*/ $source) { global $database; if(empty($source)) $source = null; if($source != $this->source) { @@ -392,7 +394,10 @@ class Image { } } - + /** + * Check if the image is locked. + * @retval bool + */ public function is_locked() { return ($this->locked === true || $this->locked == "Y" || $this->locked == "t"); } diff --git a/core/user.class.php b/core/user.class.php index 0c98597b..843d6c9d 100644 --- a/core/user.class.php +++ b/core/user.class.php @@ -216,6 +216,7 @@ class User { /** * Get a snippet of HTML which will render the user's avatar, be that * a local file, a remote file, a gravatar, a something else, etc + * @retval String of HTML */ public function get_avatar_html() { // FIXME: configurable @@ -242,6 +243,8 @@ class User { * authtok = md5(sesskey, salt), presented to the user in web forms, to make sure that * the form was generated within the session. Salted and re-hashed so that * reading a web page from the user's cache doesn't give access to the session key + * + * @retval String containing auth token (MD5sum) */ public function get_auth_token() { global $config; diff --git a/core/util.inc.php b/core/util.inc.php index 3529fb87..8ddb2fb3 100644 --- a/core/util.inc.php +++ b/core/util.inc.php @@ -190,12 +190,26 @@ function undb_bool($val) { if($val === false || $val == 'N' || $val == 'n' || $val == 'F' || $val == 'f' || $val === 0) return false; } -function startsWith($haystack, $needle) { +/** + * Checks if a given string contains another at the beginning. + * + * @param $haystack String to examine. + * @param $needle String to look for. + * @retval bool + */ +function startsWith(/*string*/ $haystack, /*string*/ $needle) { $length = strlen($needle); return (substr($haystack, 0, $length) === $needle); } -function endsWith($haystack, $needle) { +/** + * Checks if a given string contains another at the end. + * + * @param $haystack String to examine. + * @param $needle String to look for. + * @retval bool + */ +function endsWith(/*string*/ $haystack, /*string*/ $needle) { $length = strlen($needle); $start = $length * -1; //negative return (substr($haystack, $start) === $needle); @@ -621,6 +635,7 @@ function log_msg($section, $priority, $message) { send_event(new LogEvent($section, $priority, $message)); } +// More shorthand ways of logging function log_debug($section, $message) {log_msg($section, SCORE_LOG_DEBUG, $message);} function log_info($section, $message) {log_msg($section, SCORE_LOG_INFO, $message);} function log_warning($section, $message) {log_msg($section, SCORE_LOG_WARNING, $message);} @@ -847,6 +862,13 @@ function send_event(Event $event) { // string representation of a number, it's two numbers separated by a space. // What the fuck were the PHP developers smoking. $_load_start = microtime(true); + +/** + * Collects some debug information (execution time, memory usage, queries, etc) + * and formats it to stick in the footer of the page. + * + * @retval String of debug info to add to the page. + */ function get_debug_info() { global $config, $_event_count, $database, $_execs, $_load_start; @@ -1051,6 +1073,9 @@ function _load_extensions() { ctx_log_endok(); } +/** + * Used to display fatal errors to the web user. + */ function _fatal_error(Exception $e) { $version = VERSION; $message = $e->getMessage(); From ac1b3d00e296da55b944f94c6a9dc305a1b34ba0 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" <jgen.tech@gmail.com> Date: Tue, 7 Feb 2012 20:13:58 -0500 Subject: [PATCH 31/36] Some more comments. --- core/event.class.php | 11 +++++++++++ core/page.class.php | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/event.class.php b/core/event.class.php index cbff2fcf..e6511cff 100644 --- a/core/event.class.php +++ b/core/event.class.php @@ -39,6 +39,8 @@ class PageRequestEvent extends Event { * Test if the requested path matches a given pattern. * * If it matches, store the remaining path elements in $args + * + * @retval bool */ public function page_matches(/*string*/ $name) { $parts = explode("/", $name); @@ -57,6 +59,11 @@ class PageRequestEvent extends Event { return true; } + /** + * Get the n th argument of the page request (if it exists.) + * @param $n integer + * @retval The argmuent (string) or NULL + */ public function get_arg(/*int*/ $n) { $offset = $this->part_count + $n; if($offset >= 0 && $offset < $this->arg_count) { @@ -67,6 +74,10 @@ class PageRequestEvent extends Event { } } + /** + * Returns the number of arguments the page request has. + * @retval int + */ public function count_args() { return (int)($this->arg_count - $this->part_count); } diff --git a/core/page.class.php b/core/page.class.php index 4060d4f7..e3102ccc 100644 --- a/core/page.class.php +++ b/core/page.class.php @@ -237,7 +237,7 @@ class Page { protected function add_auto_html_headers() { $data_href = get_base_href(); - $this->add_html_header("<script>base_href = '$data_href';</script>"); + $this->add_html_header("<script type='text/javascript'>base_href = '$data_href';</script>"); /* Attempt to cache the CSS & JavaScript files */ if ($this->add_cached_auto_html_headers() === FALSE) { From 0cdc3033979021f03c9dd41b62138b1305ef46c8 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" <jgen.tech@gmail.com> Date: Tue, 7 Feb 2012 20:25:05 -0500 Subject: [PATCH 32/36] Just more comments. --- ext/upload/main.php | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/ext/upload/main.php b/ext/upload/main.php index 938a27fa..571a56af 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -1,5 +1,5 @@ <?php -/* +/** * Name: Uploader * Author: Shish * Description: Allows people to upload files to the website @@ -218,14 +218,28 @@ class Upload extends SimpleExtension { } // }}} // do things {{{ + + /** + * Check if a given user can upload. + * @param $user The user to check. + * @retval bool + */ private function can_upload(User $user) { global $config; return ($config->get_bool("upload_anon") || !$user->is_anonymous()); } - // Helper function based on the one from the online PHP Documentation - // which is licensed under Creative Commons Attribution 3.0 License - // TODO: Make these messages user/admin editable + /** + * Returns a descriptive error message for the specified PHP error code. + * + * This is a helper function based on the one from the online PHP Documentation + * which is licensed under Creative Commons Attribution 3.0 License + * + * TODO: Make these messages user/admin editable + * + * @param $error_code PHP error code (int) + * @retval String + */ private function upload_error_message($error_code) { switch ($error_code) { case UPLOAD_ERR_INI_SIZE: @@ -247,6 +261,10 @@ class Upload extends SimpleExtension { } } + /** + * Handle an upload. + * @retval bool TRUE on upload successful. + */ private function try_upload($file, $tags, $source, $replace='') { global $page; global $config; @@ -293,6 +311,10 @@ class Upload extends SimpleExtension { return $ok; } + /** + * Handle an transload. + * @retval bool TRUE on transload successful. + */ private function try_transload($url, $tags, $source, $replace='') { global $page; global $config; From 2d443f0be9c3fef126886a9f3df8081226cfc8b1 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" <jgen.tech@gmail.com> Date: Tue, 7 Feb 2012 21:52:11 -0500 Subject: [PATCH 33/36] Mostly just adding the Link to comments. --- contrib/ban_words/main.php | 1 + contrib/bulk_add/main.php | 5 ++++- contrib/et/main.php | 3 +++ contrib/featured/main.php | 1 + contrib/handle_flash/main.php | 3 ++- contrib/handle_svg/main.php | 3 ++- contrib/ipban/main.php | 1 + contrib/log_db/main.php | 5 +++-- contrib/news/main.php | 1 + contrib/numeric_score/main.php | 1 + contrib/random_image/main.php | 1 + contrib/rating/main.php | 1 + contrib/regen_thumb/main.php | 1 + contrib/site_description/main.php | 1 + ext/tag_list/main.php | 18 +++++++++++++++--- ext/upgrade/main.php | 3 ++- 16 files changed, 40 insertions(+), 9 deletions(-) diff --git a/contrib/ban_words/main.php b/contrib/ban_words/main.php index aee98417..f64b1f69 100644 --- a/contrib/ban_words/main.php +++ b/contrib/ban_words/main.php @@ -2,6 +2,7 @@ /* * Name: Comment Word Ban * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: For stopping spam and other comment abuse * Documentation: diff --git a/contrib/bulk_add/main.php b/contrib/bulk_add/main.php index 0fa89029..c31d43fb 100644 --- a/contrib/bulk_add/main.php +++ b/contrib/bulk_add/main.php @@ -2,6 +2,7 @@ /* * Name: Bulk Add * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Bulk add server-side images * Documentation: @@ -30,7 +31,9 @@ class BulkAdd extends SimpleExtension { $this->theme->display_admin_block(); } - + /** + * Generate the necessary DataUploadEvent for a given image and tags. + */ private function add_image($tmpname, $filename, $tags) { assert(file_exists($tmpname)); diff --git a/contrib/et/main.php b/contrib/et/main.php index dd6babe2..088d21f6 100644 --- a/contrib/et/main.php +++ b/contrib/et/main.php @@ -29,6 +29,9 @@ class ET extends SimpleExtension { } } + /** + * Collect the information and return it in a keyed array. + */ private function get_info() { global $config, $database; global $_event_listeners; // yay for using secret globals \o/ diff --git a/contrib/featured/main.php b/contrib/featured/main.php index 12f06b08..83ace62e 100644 --- a/contrib/featured/main.php +++ b/contrib/featured/main.php @@ -2,6 +2,7 @@ /* * Name: Featured Image * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Bring a specific image to the users' attentions * Documentation: diff --git a/contrib/handle_flash/main.php b/contrib/handle_flash/main.php index 013528ac..21b19b30 100644 --- a/contrib/handle_flash/main.php +++ b/contrib/handle_flash/main.php @@ -2,7 +2,8 @@ /* * Name: Handle Flash * Author: Shish <webmaster@shishnet.org> - * Description: Handle Flash files + * Link: http://code.shishnet.org/shimmie2/ + * Description: Handle Flash files. (No thumbnail is generated for flash files) */ class FlashFileHandler extends DataHandlerExtension { diff --git a/contrib/handle_svg/main.php b/contrib/handle_svg/main.php index e2d02a3f..bab0cf14 100644 --- a/contrib/handle_svg/main.php +++ b/contrib/handle_svg/main.php @@ -2,7 +2,8 @@ /* * Name: Handle SVG * Author: Shish <webmaster@shishnet.org> - * Description: Handle SVG files + * Link: http://code.shishnet.org/shimmie2/ + * Description: Handle SVG files. (No thumbnail is generated for SVG files) */ class SVGFileHandler implements Extension { diff --git a/contrib/ipban/main.php b/contrib/ipban/main.php index bd9a11d0..3af43ead 100644 --- a/contrib/ipban/main.php +++ b/contrib/ipban/main.php @@ -2,6 +2,7 @@ /* * Name: IP Ban * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Ban IP addresses * Documentation: diff --git a/contrib/log_db/main.php b/contrib/log_db/main.php index 2e51ce24..da5a590c 100644 --- a/contrib/log_db/main.php +++ b/contrib/log_db/main.php @@ -1,8 +1,9 @@ <?php /* * Name: Logging (Database) - * Author: Shish - * Description: Keep a record of SCore events + * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ + * Description: Keep a record of SCore events (in the database). * Visibility: admin */ diff --git a/contrib/news/main.php b/contrib/news/main.php index 69c87255..bd3f8388 100644 --- a/contrib/news/main.php +++ b/contrib/news/main.php @@ -2,6 +2,7 @@ /* * Name: News * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Show a short amount of text in a block on the post list * Documentation: diff --git a/contrib/numeric_score/main.php b/contrib/numeric_score/main.php index 0e7d5181..79a0ca35 100755 --- a/contrib/numeric_score/main.php +++ b/contrib/numeric_score/main.php @@ -2,6 +2,7 @@ /* * Name: Image Scores (Numeric) * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Allow users to score images * Documentation: diff --git a/contrib/random_image/main.php b/contrib/random_image/main.php index bad07792..75fcccf0 100644 --- a/contrib/random_image/main.php +++ b/contrib/random_image/main.php @@ -2,6 +2,7 @@ /* * Name: Random Image * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Do things with a random image * Documentation: diff --git a/contrib/rating/main.php b/contrib/rating/main.php index b246b14e..e672c311 100644 --- a/contrib/rating/main.php +++ b/contrib/rating/main.php @@ -2,6 +2,7 @@ /* * Name: Image Ratings * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Allow users to rate images "safe", "questionable" or "explicit" */ diff --git a/contrib/regen_thumb/main.php b/contrib/regen_thumb/main.php index cf3e2eb6..22950666 100644 --- a/contrib/regen_thumb/main.php +++ b/contrib/regen_thumb/main.php @@ -2,6 +2,7 @@ /* * Name: Regen Thumb * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Description: Regenerate a thumbnail image * Documentation: diff --git a/contrib/site_description/main.php b/contrib/site_description/main.php index 43ed38b1..5f294e3b 100644 --- a/contrib/site_description/main.php +++ b/contrib/site_description/main.php @@ -2,6 +2,7 @@ /* * Name: Site Description * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * License: GPLv2 * Visibility: admin * Description: A description for search engines diff --git a/ext/tag_list/main.php b/ext/tag_list/main.php index c30aacb6..c7d57716 100644 --- a/ext/tag_list/main.php +++ b/ext/tag_list/main.php @@ -1,7 +1,8 @@ <?php -/* +/** * Name: Tag List - * Author: Shish + * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * Description: Show the tags in various ways */ @@ -107,13 +108,18 @@ class TagList extends SimpleExtension { return make_link("post/list/$u_tag/1"); } + /** + * Get the minimum number of times a tag needs to be used + * in order to be considered in the tag list. + * @retval int + */ private function get_tags_min() { if(isset($_GET['mincount'])) { return int_escape($_GET['mincount']); } else { global $config; - return $config->get_int('tags_min'); + return $config->get_int('tags_min'); // get the default. } } @@ -170,6 +176,8 @@ class TagList extends SimpleExtension { $tags_min = $this->get_tags_min(); $starts_with = $this->get_starts_with(); + + // check if we have a cached version $cache_key = "data/tag_cloud-" . md5("tc" . $tags_min . $starts_with) . ".html"; if(file_exists($cache_key)) {return file_get_contents($cache_key);} @@ -205,6 +213,8 @@ class TagList extends SimpleExtension { $tags_min = $this->get_tags_min(); $starts_with = $this->get_starts_with(); + + // check if we have a cached version $cache_key = "data/tag_alpha-" . md5("ta" . $tags_min . $starts_with) . ".html"; if(file_exists($cache_key)) {return file_get_contents($cache_key);} @@ -239,6 +249,8 @@ class TagList extends SimpleExtension { global $database; $tags_min = $this->get_tags_min(); + + // check if we have a cached version $cache_key = "data/tag_popul-" . md5("tp" . $tags_min) . ".html"; if(file_exists($cache_key)) {return file_get_contents($cache_key);} diff --git a/ext/upgrade/main.php b/ext/upgrade/main.php index 35854e1d..7445d2d4 100644 --- a/ext/upgrade/main.php +++ b/ext/upgrade/main.php @@ -1,7 +1,8 @@ <?php /* * Name: Database Upgrader - * Author: Shish + * Author: Shish <webmaster@shishnet.org> + * Link: http://code.shishnet.org/shimmie2/ * Description: Keeps things happy behind the scenes * Visibility: admin */ From 4697e21fcd4bab9fb6cf2599cb6ff18f762c4e16 Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Wed, 8 Feb 2012 11:24:25 +0000 Subject: [PATCH 34/36] HINT ALL THE TYPES. SIMPLE ALL THE EXTENSIONS. --- contrib/admin/main.php | 10 +- contrib/artists/main.php | 2 +- contrib/blocks/main.php | 4 +- contrib/blotter/main.php | 8 +- contrib/bookmarks/main.php | 15 +- contrib/browser_search/main.php | 65 +++--- contrib/bulk_add/main.php | 4 +- contrib/danbooru_api/main.php | 32 +-- contrib/emoticons/main.php | 6 +- contrib/et/main.php | 7 +- contrib/favorites/main.php | 28 +-- contrib/featured/main.php | 8 +- contrib/forum/main.php | 6 +- contrib/handle_archive/main.php | 6 +- contrib/handle_ico/main.php | 8 +- contrib/holiday/main.php | 6 +- contrib/ipban/main.php | 12 +- contrib/link_image/main.php | 38 ++-- contrib/log_db/main.php | 10 +- contrib/mass_tagger/main.php | 4 +- contrib/news/main.php | 4 +- contrib/notes/main.php | 12 +- contrib/numeric_score/main.php | 387 ++++++++++++++++---------------- contrib/oekaki/main.php | 4 +- contrib/pm/main.php | 12 +- contrib/pools/main.php | 12 +- contrib/qr_code/main.php | 2 +- contrib/random_image/main.php | 6 +- contrib/regen_thumb/main.php | 4 +- contrib/report_image/main.php | 82 +++---- contrib/res_limit/main.php | 99 ++++---- contrib/resize/main.php | 8 +- contrib/rss_comments/main.php | 4 +- contrib/rss_images/main.php | 4 +- contrib/simpletest/main.php | 4 +- contrib/sitemap/main.php | 4 +- contrib/tag_history/main.php | 19 +- contrib/tagger/main.php | 53 ++--- contrib/tips/main.php | 6 +- contrib/twitter_soc/main.php | 4 +- contrib/update/main.php | 6 +- contrib/wiki/main.php | 8 +- contrib/word_filter/main.php | 4 +- 43 files changed, 492 insertions(+), 535 deletions(-) diff --git a/contrib/admin/main.php b/contrib/admin/main.php index 3d03915d..12c2e347 100644 --- a/contrib/admin/main.php +++ b/contrib/admin/main.php @@ -30,13 +30,13 @@ */ class AdminBuildingEvent extends Event { var $page; - public function AdminBuildingEvent($page) { + public function AdminBuildingEvent(Page $page) { $this->page = $page; } } class AdminPage extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("admin")) { @@ -88,20 +88,20 @@ class AdminPage extends SimpleExtension { } } - public function onAdminBuilding($event) { + public function onAdminBuilding(AdminBuildingEvent $event) { global $page; $this->theme->display_page($page); $this->theme->display_form($page); } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_link("Board Admin", make_link("admin")); } } - private function delete_by_query($query) { + private function delete_by_query(/*array(string)*/ $query) { global $page, $user; assert(strlen($query) > 1); foreach(Image::find_images(0, 1000000, Tag::explode($query)) as $image) { diff --git a/contrib/artists/main.php b/contrib/artists/main.php index 0bde987d..361502e8 100644 --- a/contrib/artists/main.php +++ b/contrib/artists/main.php @@ -11,7 +11,7 @@ class AuthorSetEvent extends Event { var $image, $user, $author; - public function AuthorSetEvent(Image $image, User $user, $author) + public function AuthorSetEvent(Image $image, User $user, /*string*/ $author) { $this->image = $image; $this->user = $user; diff --git a/contrib/blocks/main.php b/contrib/blocks/main.php index c3525c63..2fd3dfa7 100644 --- a/contrib/blocks/main.php +++ b/contrib/blocks/main.php @@ -28,7 +28,7 @@ */ class Blocks extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $page; $all = $config->get_string("blocks_text"); $blocks = explode("----", $all); @@ -70,7 +70,7 @@ class Blocks extends SimpleExtension { } } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Blocks"); $sb->add_label("See <a href='".make_link("ext_doc/blocks")."'>the docs</a> for formatting"); $sb->add_longtext_option("blocks_text"); diff --git a/contrib/blotter/main.php b/contrib/blotter/main.php index d689ba15..8dd4daad 100644 --- a/contrib/blotter/main.php +++ b/contrib/blotter/main.php @@ -9,7 +9,7 @@ * Development TODO at http://github.com/zshall/shimmie2/issues */ class Blotter extends SimpleExtension { - public function onInitExt(Event $event) { + public function onInitExt(InitExtEvent $event) { /** * I love re-using this installer don't I... */ @@ -43,7 +43,7 @@ class Blotter extends SimpleExtension { $config->set_default_string("blotter_position", "subheading"); } - public function onSetupBuilding(Event $event) { + public function onSetupBuilding(SetupBuildingEvent $event) { global $config; $sb = new SetupBlock("Blotter"); $sb->add_int_option("blotter_recent", "<br />Number of recent entries to display: "); @@ -51,13 +51,13 @@ class Blotter extends SimpleExtension { $sb->add_choice_option("blotter_position", array("Top of page" => "subheading", "In navigation bar" => "left"), "<br>Position: "); $event->panel->add_block($sb); } - public function onUserBlockBuilding(Event $event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_link("Blotter Editor", make_link("blotter/editor")); } } - public function onPageRequest(Event $event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $database, $user; if($event->page_matches("blotter")) { switch($event->get_arg(0)) { diff --git a/contrib/bookmarks/main.php b/contrib/bookmarks/main.php index da86f605..3ed8db45 100644 --- a/contrib/bookmarks/main.php +++ b/contrib/bookmarks/main.php @@ -6,16 +6,15 @@ * Description: Allow users to bookmark searches */ -class Bookmarks implements Extension { - var $theme; +class Bookmarks extends SimpleExtension { + public function onInitExt(InitExtEvent $event) { + $this->install(); + } - public function get_priority() {return 50;} + public function onPageRequest(PageRequestEvent $event) { + global $page; - public function receive_event(Event $event) { - global $config, $database, $page, $user; - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if(($event instanceof PageRequestEvent) && $event->page_matches("bookmark")) { + if($event->page_matches("bookmark")) { if($event->get_arg(0) == "add") { if(isset($_POST['url'])) { $page->set_mode("redirect"); diff --git a/contrib/browser_search/main.php b/contrib/browser_search/main.php index cf5ee6ac..80c399c2 100755 --- a/contrib/browser_search/main.php +++ b/contrib/browser_search/main.php @@ -13,36 +13,29 @@ * engine" notification they have */ -class BrowserSearch implements Extension { +class BrowserSearch extends SimpleExtension { + public function onInitExt(InitExtEvent $event) { + global $config; + $config->set_default_string("search_suggestions_results_order", 'a'); + } - public function get_priority() {return 50;} - public function receive_event(Event $event) { - global $page; - global $config; - - if($event instanceof InitExtEvent) { - $config->set_default_string("search_suggestions_results_order", 'a'); - } + public function onPageRequest(PageRequestEvent $event) { + global $config, $database, $page; // Add in header code to let the browser know that the search plugin exists - if($event instanceof PageRequestEvent) { - // We need to build the data for the header - global $config; - $search_title = $config->get_string('title'); - $search_file_url = make_link('browser_search/please_dont_use_this_tag_as_it_would_break_stuff__search.xml'); - $page->add_html_header("<link rel='search' type='application/opensearchdescription+xml' title='$search_title' href='$search_file_url'>"); - } + // We need to build the data for the header + $search_title = $config->get_string('title'); + $search_file_url = make_link('browser_search/please_dont_use_this_tag_as_it_would_break_stuff__search.xml'); + $page->add_html_header("<link rel='search' type='application/opensearchdescription+xml' title='$search_title' href='$search_file_url'>"); // The search.xml file that is generated on the fly - if(($event instanceof PageRequestEvent) && $event->page_matches("browser_search/please_dont_use_this_tag_as_it_would_break_stuff__search.xml")) { + if($event->page_matches("browser_search/please_dont_use_this_tag_as_it_would_break_stuff__search.xml")) { // First, we need to build all the variables we'll need - $search_title = $config->get_string('title'); $search_form_url = make_link('post/list/{searchTerms}'); $suggenton_url = make_link('browser_search/')."{searchTerms}"; $icon_b64 = base64_encode(file_get_contents("favicon.ico")); - // Now for the XML $xml = " <SearchPlugin xmlns='http://www.mozilla.org/2006/browser/search/' xmlns:os='http://a9.com/-/spec/opensearch/1.1/'> @@ -63,12 +56,10 @@ class BrowserSearch implements Extension { $page->set_data($xml); } - else if(($event instanceof PageRequestEvent) && ( - $event->page_matches("browser_search") && - !$config->get_bool("disable_search_suggestions") - )) { - global $database; - + else if( + $event->page_matches("browser_search") && + !$config->get_bool("disable_search_suggestions") + ) { // We have to build some json stuff $tag_search = $event->get_arg(0); @@ -89,29 +80,25 @@ class BrowserSearch implements Extension { array_push($tags_array,$tag['tag']); } - $json_tag_list .= implode("\",\"", $tags_array); -// $json_tag_list = implode($tags_array,", "); -// $json_tag_list = "\"".implode($tags_array,"\", \"")."\""; - // And now for the final output $json_string = "[\"$tag_search\",[\"$json_tag_list\"],[],[]]"; $page->set_mode("data"); $page->set_data($json_string); } + } - if($event instanceof SetupBuildingEvent) { - $sort_by = array(); - $sort_by['Alphabetical'] = 'a'; - $sort_by['Tag Count'] = 't'; + public function onSetupBuilding(SetupBuildingEvent $event) { + $sort_by = array(); + $sort_by['Alphabetical'] = 'a'; + $sort_by['Tag Count'] = 't'; - $sb = new SetupBlock("Browser Search"); - $sb->add_bool_option("disable_search_suggestions", "Disable search suggestions: "); - $sb->add_label("<br>"); - $sb->add_choice_option("search_suggestions_results_order", $sort_by, "Sort the suggestions by:"); - $event->panel->add_block($sb); - } + $sb = new SetupBlock("Browser Search"); + $sb->add_bool_option("disable_search_suggestions", "Disable search suggestions: "); + $sb->add_label("<br>"); + $sb->add_choice_option("search_suggestions_results_order", $sort_by, "Sort the suggestions by:"); + $event->panel->add_block($sb); } } ?> diff --git a/contrib/bulk_add/main.php b/contrib/bulk_add/main.php index 0fa89029..676fc14e 100644 --- a/contrib/bulk_add/main.php +++ b/contrib/bulk_add/main.php @@ -15,7 +15,7 @@ */ class BulkAdd extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("bulk_add")) { if($user->is_admin() && $user->check_auth_token() && isset($_POST['dir'])) { @@ -26,7 +26,7 @@ class BulkAdd extends SimpleExtension { } } - public function onAdminBuilding($event) { + public function onAdminBuilding(AdminBuildingEvent $event) { $this->theme->display_admin_block(); } diff --git a/contrib/danbooru_api/main.php b/contrib/danbooru_api/main.php index 898680f2..f47a34e8 100644 --- a/contrib/danbooru_api/main.php +++ b/contrib/danbooru_api/main.php @@ -47,33 +47,23 @@ Completely compatibility will probably involve a rewrite with a different URL */ -class DanbooruApi implements Extension -{ - - public function get_priority() {return 50;} - // Receive the event - public function receive_event(Event $event) - { - // Check if someone is accessing /api/danbooru (us) - if(($event instanceof PageRequestEvent) && ($event->page_matches("api")) && ($event->get_arg(0) == 'danbooru')) - { - // execute the danbooru processing code +class DanbooruApi extends SimpleExtension { + public function onPageRequest(PageRequestEvent $event) { + if($event->page_matches("api") && ($event->get_arg(0) == 'danbooru')) { $this->api_danbooru($event); } - if($event instanceof SearchTermParseEvent) - { - $matches = array(); - if(preg_match("/^md5:([0-9a-fA-F]*)$/i", $event->term, $matches)) - { - $hash = strtolower($matches[1]); - $event->add_querylet(new Querylet("images.hash = '$hash'")); // :-O -// $event->set_querylet(new Querylet("images.hash = '$hash'")); - } + } + + public function onSearchTermParse(SearchTermParseEvent $event) { + $matches = array(); + if(preg_match("/^md5:([0-9a-fA-F]*)$/i", $event->term, $matches)) { + $hash = strtolower($matches[1]); + $event->add_querylet(new Querylet("images.hash = '$hash'")); // :-O } } // Danbooru API - private function api_danbooru($event) + private function api_danbooru(PageRequestEvent $event) { global $page; global $config; diff --git a/contrib/emoticons/main.php b/contrib/emoticons/main.php index 67d14e29..d7805f47 100644 --- a/contrib/emoticons/main.php +++ b/contrib/emoticons/main.php @@ -13,19 +13,19 @@ */ class Emoticons extends FormatterExtension { - public function format($text) { + public function format(/*string*/ $text) { $data_href = get_base_href(); $text = preg_replace("/:([a-z]*?):/s", "<img src='$data_href/ext/emoticons/default/\\1.gif'>", $text); return $text; } - public function strip($text) { + public function strip(/*string*/ $text) { return $text; } } class EmoticonList extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("emote/list")) { $this->theme->display_emotes(glob("ext/emoticons/default/*")); } diff --git a/contrib/et/main.php b/contrib/et/main.php index dd6babe2..d54b5631 100644 --- a/contrib/et/main.php +++ b/contrib/et/main.php @@ -13,7 +13,7 @@ */ class ET extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $user; if($event->page_matches("system_info")) { if($user->is_admin()) { @@ -22,7 +22,7 @@ class ET extends SimpleExtension { } } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_link("System Info", make_link("system_info")); @@ -46,9 +46,6 @@ class ET extends SimpleExtension { $info['sys_disk'] = to_shorthand_int(disk_total_space("./") - disk_free_space("./")) . " / " . to_shorthand_int(disk_total_space("./")); $info['sys_server'] = $_SERVER["SERVER_SOFTWARE"]; - $proto = preg_replace("#(.*)://.*#", "$1", DATABASE_DSN); - #$db = $database->db->ServerInfo(); - #$info['sys_db'] = "$proto / {$db['version']}"; $info['stat_images'] = $database->get_one("SELECT COUNT(*) FROM images"); $info['stat_comments'] = $database->get_one("SELECT COUNT(*) FROM comments"); diff --git a/contrib/favorites/main.php b/contrib/favorites/main.php index 15f266c2..9a66fd65 100644 --- a/contrib/favorites/main.php +++ b/contrib/favorites/main.php @@ -16,7 +16,7 @@ class FavoriteSetEvent extends Event { var $image_id, $user, $do_set; - public function FavoriteSetEvent($image_id, User $user, $do_set) { + public function FavoriteSetEvent(/*int*/ $image_id, User $user, /*boolean*/ $do_set) { assert(is_numeric($image_id)); assert(is_bool($do_set)); @@ -27,14 +27,14 @@ class FavoriteSetEvent extends Event { } class Favorites extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config; if($config->get_int("ext_favorites_version", 0) < 1) { $this->install(); } } - public function onImageAdminBlockBuilding($event) { + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { global $database, $page, $user; if(!$user->is_anonymous()) { $user_id = $user->id; @@ -48,14 +48,14 @@ class Favorites extends SimpleExtension { } } - public function onDisplayingImage($event) { + public function onDisplayingImage(DisplayingImageEvent $event) { $people = $this->list_persons_who_have_favorited($event->image); if(count($people) > 0) { $html = $this->theme->display_people($people); } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("change_favorite") && !$user->is_anonymous() && $user->check_auth_token()) { $image_id = int_escape($_POST['image_id']); @@ -67,7 +67,7 @@ class Favorites extends SimpleExtension { } } - public function onUserPageBuilding($event) { + public function onUserPageBuilding(UserPageBuildingEvent $event) { $i_favorites_count = Image::count_images(array("favorited_by={$event->display_user->name}")); $i_days_old = ((time() - strtotime($event->display_user->join_date)) / 86400) + 1; $h_favorites_rate = sprintf("%.1f", ($i_favorites_count / $i_days_old)); @@ -75,7 +75,7 @@ class Favorites extends SimpleExtension { $event->add_stats("<a href='$favorites_link'>Images favorited</a>: $i_favorites_count, $h_favorites_rate per day"); } - public function onImageInfoSet($event) { + public function onImageInfoSet(ImageInfoSetEvent $event) { global $user; if( in_array('favorite_action', $_POST) && @@ -85,28 +85,30 @@ class Favorites extends SimpleExtension { } } - public function onFavoriteSet($event) { + public function onFavoriteSet(FavoriteSetEvent $event) { global $user; $this->add_vote($event->image_id, $user->id, $event->do_set); } - public function onImageDeletion($event) { + // FIXME: this should be handled by the foreign key. Check that it + // is, and then remove this + public function onImageDeletion(ImageDeletionEvent $event) { global $database; $database->execute("DELETE FROM user_favorites WHERE image_id=:image_id", array("image_id"=>$event->image->id)); } - public function onParseLinkTemplate($event) { + public function onParseLinkTemplate(ParseLinkTemplateEvent $event) { $event->replace('$favorites', $event->image->favorites); } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; $username = url_escape($user->name); $event->add_link("My Favorites", make_link("post/list/favorited_by=$username/1"), 20); } - public function onSearchTermParse($event) { + public function onSearchTermParse(SearchTermParseEvent $event) { $matches = array(); if(preg_match("/favorites(<|>|<=|>=|=)(\d+)/", $event->term, $matches)) { $cmp = $matches[1]; @@ -181,7 +183,7 @@ class Favorites extends SimpleExtension { array("image_id"=>$image_id, "user_id"=>$user_id)); } - private function list_persons_who_have_favorited($image) { + private function list_persons_who_have_favorited(Image $image) { global $database; return $database->get_col( diff --git a/contrib/featured/main.php b/contrib/featured/main.php index 12f06b08..a4defb11 100644 --- a/contrib/featured/main.php +++ b/contrib/featured/main.php @@ -19,12 +19,12 @@ */ class Featured extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_int('featured_id', 0); } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $page, $user; if($event->page_matches("featured_image")) { if($event->get_arg(0) == "set" && $user->check_auth_token()) { @@ -54,7 +54,7 @@ class Featured extends SimpleExtension { } } - public function onPostListBuilding($event) { + public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $database, $page, $user; $fid = $config->get_int("featured_id"); if($fid > 0) { @@ -74,7 +74,7 @@ class Featured extends SimpleExtension { } } - public function onImageAdminBlockBuilding($event) { + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_part($this->theme->get_buttons_html($event->image->id)); diff --git a/contrib/forum/main.php b/contrib/forum/main.php index a2b2365e..2604c426 100644 --- a/contrib/forum/main.php +++ b/contrib/forum/main.php @@ -9,7 +9,7 @@ */ class Forum extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config, $database; // shortcut to latest @@ -57,7 +57,7 @@ class Forum extends SimpleExtension { $event->panel->add_block($sb); } - public function onUserPageBuilding($event) { + public function onUserPageBuilding(UserPageBuildingEvent $event) { global $page, $user, $database; $threads_count = $database->get_one("SELECT COUNT(*) FROM forum_threads WHERE user_id=?", array($event->display_user->id)); @@ -73,7 +73,7 @@ class Forum extends SimpleExtension { } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("forum")) { diff --git a/contrib/handle_archive/main.php b/contrib/handle_archive/main.php index 976f3ca0..c8b92200 100644 --- a/contrib/handle_archive/main.php +++ b/contrib/handle_archive/main.php @@ -11,12 +11,12 @@ */ class ArchiveFileHandler extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string('archive_extract_command', 'unzip -d "%d" "%f"'); } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Archive Handler Options"); $sb->add_text_option("archive_tmp_dir", "Temporary folder: "); $sb->add_text_option("archive_extract_command", "<br>Extraction command: "); @@ -24,7 +24,7 @@ class ArchiveFileHandler extends SimpleExtension { $event->panel->add_block($sb); } - public function onDataUpload($event) { + public function onDataUpload(DataUploadEvent $event) { if($this->supported_ext($event->type)) { global $config; $tmp = sys_get_temp_dir(); diff --git a/contrib/handle_ico/main.php b/contrib/handle_ico/main.php index 771dd506..d8475279 100644 --- a/contrib/handle_ico/main.php +++ b/contrib/handle_ico/main.php @@ -6,7 +6,7 @@ */ class IcoFileHandler extends SimpleExtension { - public function onDataUpload($event) { + public function onDataUpload(DataUploadEvent $event) { if($this->supported_ext($event->type) && $this->check_contents($event->tmpname)) { $hash = $event->hash; $ha = substr($hash, 0, 2); @@ -22,20 +22,20 @@ class IcoFileHandler extends SimpleExtension { } } - public function onThumbnailGeneration($event) { + public function onThumbnailGeneration(ThumbnailGenerationEvent $event) { if($this->supported_ext($event->type)) { $this->create_thumb($event->hash); } } - public function onDisplayingImage($event) { + public function onDisplayingImage(DisplayingImageEvent $event) { global $page; if($this->supported_ext($event->image->ext)) { $this->theme->display_image($page, $event->image); } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page; if($event->page_matches("get_ico")) { $id = int_escape($event->get_arg(0)); diff --git a/contrib/holiday/main.php b/contrib/holiday/main.php index aea352f8..58c90a37 100644 --- a/contrib/holiday/main.php +++ b/contrib/holiday/main.php @@ -7,19 +7,19 @@ * Description: Use an additional stylesheet on certain holidays. */ class Holiday extends SimpleExtension { - public function onInitExt(Event $event) { + public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_bool("holiday_aprilfools", false); } - public function onSetupBuilding(Event $event) { + public function onSetupBuilding(SetupBuildingEvent $event) { global $config; $sb = new SetupBlock("Holiday Theme"); $sb->add_bool_option("holiday_aprilfools", "Enable April Fools"); $event->panel->add_block($sb); } - public function onPageRequest(Event $event) { + public function onPageRequest(PageRequestEvent $event) { global $config; $date = /*date('d/m') == '01/01' ||date('d/m') == '14/02' || */date('d/m') == '01/04'/* || date('d/m') == '24/12' || date('d/m') == '25/12' || date('d/m') == '31/12'*/; if($date){ diff --git a/contrib/ipban/main.php b/contrib/ipban/main.php index bd9a11d0..2697155a 100644 --- a/contrib/ipban/main.php +++ b/contrib/ipban/main.php @@ -37,7 +37,7 @@ class AddIPBanEvent extends Event { class IPBan extends SimpleExtension { public function get_priority() {return 10;} - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config; if($config->get_int("ext_ipban_version") < 5) { $this->install(); @@ -45,7 +45,7 @@ class IPBan extends SimpleExtension { $this->check_ip_ban(); } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("ip_ban")) { global $config, $database, $page, $user; if($user->is_admin()) { @@ -77,19 +77,19 @@ class IPBan extends SimpleExtension { } } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_link("IP Bans", make_link("ip_ban/list")); } } - public function onAddIPBan($event) { + public function onAddIPBan(AddIPBanEvent $event) { global $user; $this->add_ip_ban($event->ip, $event->reason, $event->end, $user); } - public function onRemoveIPBan($event) { + public function onRemoveIPBan(RemoveIPBanEvent $event) { global $database; $database->Execute("DELETE FROM bans WHERE id = :id", array("id"=>$event->id)); $database->cache->delete("ip_bans_sorted"); @@ -178,7 +178,7 @@ class IPBan extends SimpleExtension { } } - private function block($remote) { + private function block(/*string*/ $remote) { global $config, $database; $prefix = ($database->engine->name == "sqlite" ? "bans." : ""); diff --git a/contrib/link_image/main.php b/contrib/link_image/main.php index d8773362..28366e4d 100644 --- a/contrib/link_image/main.php +++ b/contrib/link_image/main.php @@ -4,29 +4,22 @@ * Author: Artanis <artanis.00@gmail.com> * Description: Show various forms of link to each image, for copy & paste */ -class LinkImage implements Extension { - var $theme; +class LinkImage extends SimpleExtension { + public function onDisplayingImage(DisplayingImageEvent $event) { + global $page; + $this->theme->links_block($page, $this->data($event->image)); + } - public function get_priority() {return 50;} + public function onSetupBuildingEvent(SetupBuildingEvent $event) { + $sb = new SetupBlock("Link to Image"); + $sb->add_text_option("ext_link-img_text-link_format", "Text Link Format: "); + $event->panel->add_block($sb); + } - public function receive_event(Event $event) { - global $config, $database, $page, $user; - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if(($event instanceof DisplayingImageEvent)) { - $this->theme->links_block($page, $this->data($event->image)); - } - if($event instanceof SetupBuildingEvent) { - $sb = new SetupBlock("Link to Image"); - $sb->add_text_option("ext_link-img_text-link_format", "Text Link Format: "); - $event->panel->add_block($sb); - } - if($event instanceof InitExtEvent) { - //just set default if empty. - $config->set_default_string("ext_link-img_text-link_format", - '$title - $id ($ext $size $filesize)'); - } - } + public function onInitExtEvent(InitExtEvent $event) { + global $config; + $config->set_default_string("ext_link-img_text-link_format", '$title - $id ($ext $size $filesize)'); + } private function hostify($str) { $str = str_replace(" ", "%20", $str); @@ -37,7 +30,8 @@ class LinkImage implements Extension { return "http://" . $_SERVER["HTTP_HOST"] . $str; } } - private function data($image) { + + private function data(Image $image) { global $config; $text_link = $image->parse_link_template($config->get_string("ext_link-img_text-link_format")); diff --git a/contrib/log_db/main.php b/contrib/log_db/main.php index 2e51ce24..f83a2aa6 100644 --- a/contrib/log_db/main.php +++ b/contrib/log_db/main.php @@ -7,7 +7,7 @@ */ class LogDatabase extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $database; global $config; @@ -28,7 +28,7 @@ class LogDatabase extends SimpleExtension { $config->set_default_int("log_db_priority", SCORE_LOG_INFO); } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Logging (Database)"); $sb->add_choice_option("log_db_priority", array( "Debug" => SCORE_LOG_DEBUG, @@ -40,7 +40,7 @@ class LogDatabase extends SimpleExtension { $event->panel->add_block($sb); } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $database, $user; if($event->page_matches("log/view")) { if($user->is_admin()) { @@ -104,14 +104,14 @@ class LogDatabase extends SimpleExtension { } } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_link("Event Log", make_link("log/view")); } } - public function onLog($event) { + public function onLog(LogEvent $event) { global $config, $database, $user; $username = ($user && $user->name) ? $user->name : "null"; diff --git a/contrib/mass_tagger/main.php b/contrib/mass_tagger/main.php index a83dda44..8cc3c893 100644 --- a/contrib/mass_tagger/main.php +++ b/contrib/mass_tagger/main.php @@ -15,7 +15,7 @@ */ class MassTagger extends SimpleExtension { - public function onPostListBuilding($event) { + public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page, $user; if( !$user->is_admin() ) return; @@ -23,7 +23,7 @@ class MassTagger extends SimpleExtension { $this->theme->display_mass_tagger( $page, $event, $config ); } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $page, $user; if( !$event->page_matches("mass_tagger") ) return; if( !$user->is_admin() ) return; diff --git a/contrib/news/main.php b/contrib/news/main.php index 69c87255..2091a6ef 100644 --- a/contrib/news/main.php +++ b/contrib/news/main.php @@ -9,14 +9,14 @@ */ class News extends SimpleExtension { - public function onPostListBuilding($event) { + public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; if(strlen($config->get_string("news_text")) > 0) { $this->theme->display_news($page, $config->get_string("news_text")); } } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("News"); $sb->add_longtext_option("news_text"); $event->panel->add_block($sb); diff --git a/contrib/notes/main.php b/contrib/notes/main.php index ea82ea6c..3e894770 100644 --- a/contrib/notes/main.php +++ b/contrib/notes/main.php @@ -8,7 +8,7 @@ */ class Notes extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config, $database; // shortcut to latest @@ -66,9 +66,7 @@ class Notes extends SimpleExtension { } } - - - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("note")) { @@ -179,7 +177,7 @@ class Notes extends SimpleExtension { /* * HERE WE LOAD THE NOTES IN THE IMAGE */ - public function onDisplayingImage($event) { + public function onDisplayingImage(DisplayingImageEvent $event) { global $page, $user; //display form on image event @@ -191,7 +189,7 @@ class Notes extends SimpleExtension { /* * HERE WE ADD THE BUTTONS ON SIDEBAR */ - public function onImageAdminBlockBuilding($event) { + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { global $user; if(!$user->is_anonymous()) { $event->add_part($this->theme->note_button($event->image->id)); @@ -207,7 +205,7 @@ class Notes extends SimpleExtension { /* * HERE WE ADD QUERYLETS TO ADD SEARCH SYSTEM */ - public function onSearchTermParse($event) { + public function onSearchTermParse(SearchTermParseEvent $event) { $matches = array(); if(preg_match("/note=(.*)/i", $event->term, $matches)) { $notes = int_escape($matches[1]); diff --git a/contrib/numeric_score/main.php b/contrib/numeric_score/main.php index 0e7d5181..7bcf15aa 100755 --- a/contrib/numeric_score/main.php +++ b/contrib/numeric_score/main.php @@ -12,226 +12,227 @@ class NumericScoreSetEvent extends Event { var $image_id, $user, $score; - public function NumericScoreSetEvent($image_id, $user, $score) { + public function NumericScoreSetEvent(/*int*/ $image_id, User $user, /*int*/ $score) { $this->image_id = $image_id; $this->user = $user; $this->score = $score; } } -class NumericScore implements Extension { - var $theme; - - public function get_priority() {return 50;} - - public function receive_event(Event $event) { - global $config, $database, $page, $user; - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if($event instanceof InitExtEvent) { - if($config->get_int("ext_numeric_score_version", 0) < 1) { - $this->install(); - } +class NumericScore extends SimpleExtension { + public function onInitExt(InitExtEvent $event) { + global $config; + if($config->get_int("ext_numeric_score_version", 0) < 1) { + $this->install(); } + } - if($event instanceof DisplayingImageEvent) { + public function onDisplayingImage(DisplayingImageEvent $event) { + global $user, $page; + if(!$user->is_anonymous()) { + $html = $this->theme->get_voter_html($event->image); + $page->add_block(new Block("Image Score", $html, "left", 20)); + } + } + + public function onUserPageBuilding(UserPageBuildingEvent $event) { + global $page; + $html = $this->theme->get_nuller_html($event->display_user); + $page->add_block(new Block("Votes", $html, "main", 60)); + } + + public function onPageRequest(PageRequestEvent $event) { + global $config, $database, $user, $page; + + if($event->page_matches("numeric_score_votes")) { + $image_id = int_escape($event->get_arg(0)); + $x = $database->get_all( + "SELECT users.name as username, user_id, score + FROM numeric_score_votes + JOIN users ON numeric_score_votes.user_id=users.id + WHERE image_id=?", + array($image_id)); + $html = "<table>"; + foreach($x as $vote) { + $html .= "<tr><td>"; + $html .= "<a href='/user/{$vote['username']}'>{$vote['username']}</a>"; + $html .= "</td><td>"; + $html .= $vote['score']; + $html .= "</td></tr>"; + } + die($html); + } + if($event->page_matches("numeric_score_vote") && $user->check_auth_token()) { if(!$user->is_anonymous()) { - $html = $this->theme->get_voter_html($event->image); - $page->add_block(new Block("Image Score", $html, "left", 20)); + $image_id = int_escape($_POST['image_id']); + $char = $_POST['vote']; + $score = null; + if($char == "up") $score = 1; + else if($char == "null") $score = 0; + else if($char == "down") $score = -1; + if(!is_null($score) && $image_id>0) send_event(new NumericScoreSetEvent($image_id, $user, $score)); + $page->set_mode("redirect"); + $page->set_redirect(make_link("post/view/$image_id")); } } - - if($event instanceof UserPageBuildingEvent) { - $html = $this->theme->get_nuller_html($event->display_user); - $page->add_block(new Block("Votes", $html, "main", 60)); + if($event->page_matches("numeric_score/remove_votes_on") && $user->check_auth_token()) { + if($user->is_admin()) { + $image_id = int_escape($_POST['image_id']); + $database->execute( + "DELETE FROM numeric_score_votes WHERE image_id=?", + array($image_id)); + $database->execute( + "UPDATE images SET numeric_score=0 WHERE id=?", + array($image_id)); + $page->set_mode("redirect"); + $page->set_redirect(make_link("post/view/$image_id")); + } } + if($event->page_matches("numeric_score/remove_votes_by") && $user->check_auth_token()) { + if($user->is_admin()) { + $user_id = int_escape($_POST['user_id']); + $image_ids = $database->get_col("SELECT image_id FROM numeric_score_votes WHERE user_id=?", array($user_id)); - if($event instanceof PageRequestEvent) { - if($event->page_matches("numeric_score_votes")) { - $image_id = int_escape($event->get_arg(0)); - $x = $database->get_all( - "SELECT users.name as username, user_id, score - FROM numeric_score_votes - JOIN users ON numeric_score_votes.user_id=users.id - WHERE image_id=?", - array($image_id)); - $html = "<table>"; - foreach($x as $vote) { - $html .= "<tr><td>"; - $html .= "<a href='/user/{$vote['username']}'>{$vote['username']}</a>"; - $html .= "</td><td>"; - $html .= $vote['score']; - $html .= "</td></tr>"; - } - die($html); + $database->execute( + "DELETE FROM numeric_score_votes WHERE user_id=? AND image_id IN ?", + array($user_id, $image_ids)); + $database->execute( + "UPDATE images SET numeric_score=(SELECT SUM(score) FROM numeric_score_votes WHERE image_id=images.id) WHERE images.id IN ?", + array($image_ids)); + $page->set_mode("redirect"); + $page->set_redirect(make_link()); } - if($event->page_matches("numeric_score_vote") && $user->check_auth_token()) { - if(!$user->is_anonymous()) { - $image_id = int_escape($_POST['image_id']); - $char = $_POST['vote']; - $score = null; - if($char == "up") $score = 1; - else if($char == "null") $score = 0; - else if($char == "down") $score = -1; - if(!is_null($score) && $image_id>0) send_event(new NumericScoreSetEvent($image_id, $user, $score)); - $page->set_mode("redirect"); - $page->set_redirect(make_link("post/view/$image_id")); - } + } + if($event->page_matches("popular_by_day") || $event->page_matches("popular_by_month") || $event->page_matches("popular_by_year")) { + $t_images = $config->get_int("index_height") * $config->get_int("index_width"); + + //TODO: Add Popular_by_week. + + //year + if(empty($_GET['year'])){ + $year = date("Y"); + }else{ + $year = $_GET['year']; } - if($event->page_matches("numeric_score/remove_votes_on") && $user->check_auth_token()) { - if($user->is_admin()) { - $image_id = int_escape($_POST['image_id']); - $database->execute( - "DELETE FROM numeric_score_votes WHERE image_id=?", - array($image_id)); - $database->execute( - "UPDATE images SET numeric_score=0 WHERE id=?", - array($image_id)); - $page->set_mode("redirect"); - $page->set_redirect(make_link("post/view/$image_id")); - } + //month + if(empty($_GET['month']) || int_escape($_GET['month']) > 12){ + $month = date("m"); + }else{ + $month = $_GET['month']; } - if($event->page_matches("numeric_score/remove_votes_by") && $user->check_auth_token()) { - if($user->is_admin()) { - $user_id = int_escape($_POST['user_id']); - $image_ids = $database->get_col("SELECT image_id FROM numeric_score_votes WHERE user_id=?", array($user_id)); - - $database->execute( - "DELETE FROM numeric_score_votes WHERE user_id=? AND image_id IN ?", - array($user_id, $image_ids)); - $database->execute( - "UPDATE images SET numeric_score=(SELECT SUM(score) FROM numeric_score_votes WHERE image_id=images.id) WHERE images.id IN ?", - array($image_ids)); - $page->set_mode("redirect"); - $page->set_redirect(make_link()); - } + //day + if(empty($_GET['day']) || int_escape($_GET['day']) > 31){ + $day = date("d"); + }else{ + $day = $_GET['day']; } - if($event->page_matches("popular_by_day") || $event->page_matches("popular_by_month") || $event->page_matches("popular_by_year")) { - $t_images = $config->get_int("index_height") * $config->get_int("index_width"); + $totaldate = $year."/".$month."/".$day; - //TODO: Add Popular_by_week. + $sql = + "SELECT * FROM images + WHERE EXTRACT(YEAR FROM posted) = :year + "; - //year - if(empty($_GET['year'])){ - $year = date("Y"); - }else{ - $year = $_GET['year']; - } - //month - if(empty($_GET['month']) || int_escape($_GET['month']) > 12){ - $month = date("m"); - }else{ - $month = $_GET['month']; - } - //day - if(empty($_GET['day']) || int_escape($_GET['day']) > 31){ - $day = date("d"); - }else{ - $day = $_GET['day']; - } - $totaldate = $year."/".$month."/".$day; + $agrs = array("limit" => $t_images, "year" => $year); - $sql = - "SELECT * FROM images - WHERE EXTRACT(YEAR FROM posted) = :year + if($event->page_matches("popular_by_day")){ + $sql .= + "AND EXTRACT(MONTH FROM posted) = :month + AND EXTRACT(DAY FROM posted) = :day + AND NOT numeric_score=0 "; + //array_push doesn't seem to like using double arrows + //this requires us to instead create two arrays and merge + $sgra = array("month" => $month, "day" => $day); + $args = array_merge($agrs, $sgra); - $agrs = array("limit" => $t_images, "year" => $year); - - if($event->page_matches("popular_by_day")){ - $sql .= - "AND EXTRACT(MONTH FROM posted) = :month - AND EXTRACT(DAY FROM posted) = :day - AND NOT numeric_score=0 - "; - //array_push doesn't seem to like using double arrows - //this requires us to instead create two arrays and merge - $sgra = array("month" => $month, "day" => $day); - $args = array_merge($agrs, $sgra); - - $dte = array($totaldate, date("F jS, Y", (strtotime($totaldate))), "\\y\\e\\a\\r\\=Y\\&\\m\\o\\n\\t\\h\\=m\\&\\d\\a\\y\\=d", "day"); - } - if($event->page_matches("popular_by_month")){ - $sql .= - "AND EXTRACT(MONTH FROM posted) = :month - AND NOT numeric_score=0 - "; - $sgra = array("month" => $month); - $args = array_merge($agrs, $sgra); - - $title = date("F Y", (strtotime($totaldate))); - $dte = array($totaldate, $title, "\\y\\e\\a\\r\\=Y\\&\\m\\o\\n\\t\\h\\=m", "month"); - } - if($event->page_matches("popular_by_year")){ - $sql .= "AND NOT numeric_score=0"; - $dte = array($totaldate, $year, "\y\e\a\\r\=Y", "year"); - $args = $agrs; - } - $sql .= " ORDER BY numeric_score DESC LIMIT :limit OFFSET 0"; - - //filter images by year/score != 0 > limit to max images on one page > order from highest to lowest score - $result = $database->get_all($sql, $args); - - $images = array(); - foreach($result as $singleResult) { - $images[] = Image::by_id($singleResult["id"]); - } - $this->theme->view_popular($images, $dte); + $dte = array($totaldate, date("F jS, Y", (strtotime($totaldate))), "\\y\\e\\a\\r\\=Y\\&\\m\\o\\n\\t\\h\\=m\\&\\d\\a\\y\\=d", "day"); } + if($event->page_matches("popular_by_month")){ + $sql .= + "AND EXTRACT(MONTH FROM posted) = :month + AND NOT numeric_score=0 + "; + $sgra = array("month" => $month); + $args = array_merge($agrs, $sgra); + + $title = date("F Y", (strtotime($totaldate))); + $dte = array($totaldate, $title, "\\y\\e\\a\\r\\=Y\\&\\m\\o\\n\\t\\h\\=m", "month"); + } + if($event->page_matches("popular_by_year")){ + $sql .= "AND NOT numeric_score=0"; + $dte = array($totaldate, $year, "\y\e\a\\r\=Y", "year"); + $args = $agrs; + } + $sql .= " ORDER BY numeric_score DESC LIMIT :limit OFFSET 0"; + + //filter images by year/score != 0 > limit to max images on one page > order from highest to lowest score + $result = $database->get_all($sql, $args); + + $images = array(); + foreach($result as $singleResult) { + $images[] = Image::by_id($singleResult["id"]); + } + $this->theme->view_popular($images, $dte); } + } - if($event instanceof NumericScoreSetEvent) { - log_info("numeric_score", "Rated Image #{$event->image_id} as {$event->score}"); - $this->add_vote($event->image_id, $user->id, $event->score); + public function onNumericScoreSet(NumericScoreSetEvent $event) { + global $user; + log_info("numeric_score", "Rated Image #{$event->image_id} as {$event->score}"); + $this->add_vote($event->image_id, $user->id, $event->score); + } + + public function onImageDeletion(ImageDeletionEvent $event) { + global $database; + $database->execute("DELETE FROM numeric_score_votes WHERE image_id=:id", array("id" => $event->image->id)); + } + + // FIXME: on user deletion + // FIXME: on user vote nuke + + public function onParseLinkTemplate(ParseLinkTemplateEvent $event) { + $event->replace('$score', $event->image->numeric_score); + } + + public function onSearchTermParse(SearchTermParseEvent $event) { + $matches = array(); + if(preg_match("/^score(<|<=|=|>=|>)(\d+)$/", $event->term, $matches)) { + $cmp = $matches[1]; + $score = $matches[2]; + $event->add_querylet(new Querylet("numeric_score $cmp $score")); } - - if($event instanceof ImageDeletionEvent) { - $database->execute("DELETE FROM numeric_score_votes WHERE image_id=:id", array("id" => $event->image->id)); + if(preg_match("/^upvoted_by=(.*)$/", $event->term, $matches)) { + $duser = User::by_name($matches[1]); + if(is_null($duser)) { + throw new SearchTermParseException( + "Can't find the user named ".html_escape($matches[1])); + } + $event->add_querylet(new Querylet( + "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=1)", + array("ns_user_id"=>$duser->id))); } - - if($event instanceof ParseLinkTemplateEvent) { - $event->replace('$score', $event->image->numeric_score); + if(preg_match("/^downvoted_by=(.*)$/", $event->term, $matches)) { + $duser = User::by_name($matches[1]); + if(is_null($duser)) { + throw new SearchTermParseException( + "Can't find the user named ".html_escape($matches[1])); + } + $event->add_querylet(new Querylet( + "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=-1)", + array("ns_user_id"=>$duser->id))); } - - if($event instanceof SearchTermParseEvent) { - $matches = array(); - if(preg_match("/^score(<|<=|=|>=|>)(\d+)$/", $event->term, $matches)) { - $cmp = $matches[1]; - $score = $matches[2]; - $event->add_querylet(new Querylet("numeric_score $cmp $score")); - } - if(preg_match("/^upvoted_by=(.*)$/", $event->term, $matches)) { - $duser = User::by_name($matches[1]); - if(is_null($duser)) { - throw new SearchTermParseException( - "Can't find the user named ".html_escape($matches[1])); - } - $event->add_querylet(new Querylet( - "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=1)", - array("ns_user_id"=>$duser->id))); - } - if(preg_match("/^downvoted_by=(.*)$/", $event->term, $matches)) { - $duser = User::by_name($matches[1]); - if(is_null($duser)) { - throw new SearchTermParseException( - "Can't find the user named ".html_escape($matches[1])); - } - $event->add_querylet(new Querylet( - "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=-1)", - array("ns_user_id"=>$duser->id))); - } - if(preg_match("/^upvoted_by_id=(\d+)$/", $event->term, $matches)) { - $iid = int_escape($matches[1]); - $event->add_querylet(new Querylet( - "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=1)", - array("ns_user_id"=>$iid))); - } - if(preg_match("/^downvoted_by_id=(\d+)$/", $event->term, $matches)) { - $iid = int_escape($matches[1]); - $event->add_querylet(new Querylet( - "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=-1)", - array("ns_user_id"=>$iid))); - } + if(preg_match("/^upvoted_by_id=(\d+)$/", $event->term, $matches)) { + $iid = int_escape($matches[1]); + $event->add_querylet(new Querylet( + "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=1)", + array("ns_user_id"=>$iid))); + } + if(preg_match("/^downvoted_by_id=(\d+)$/", $event->term, $matches)) { + $iid = int_escape($matches[1]); + $event->add_querylet(new Querylet( + "images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=-1)", + array("ns_user_id"=>$iid))); } } @@ -259,7 +260,7 @@ class NumericScore implements Extension { } } - private function add_vote($image_id, $user_id, $score) { + private function add_vote(/*int*/ $image_id, /*int*/ $user_id, /*int*/ $score) { global $database; $database->execute( "DELETE FROM numeric_score_votes WHERE image_id=:imageid AND user_id=:userid", diff --git a/contrib/oekaki/main.php b/contrib/oekaki/main.php index 7a571242..3027dcfd 100644 --- a/contrib/oekaki/main.php +++ b/contrib/oekaki/main.php @@ -6,7 +6,7 @@ */ class Oekaki extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $user, $page; if($event->page_matches("oekaki")) { @@ -82,7 +82,7 @@ class Oekaki extends SimpleExtension { } // FIXME: "edit this image" button on existing images? - function onPostListBuilding($event) { + function onPostListBuilding(PostListBuildingEvent $event) { global $user, $page; if($this->can_upload($user)) { $this->theme->display_block($page); diff --git a/contrib/pm/main.php b/contrib/pm/main.php index 0e050f55..5e380278 100755 --- a/contrib/pm/main.php +++ b/contrib/pm/main.php @@ -11,7 +11,7 @@ */ class SendPMEvent extends Event { - public function __construct($pm) { + public function __construct(PM $pm) { $this->pm = $pm; } } @@ -43,7 +43,7 @@ class PM { } class PrivMsg extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config, $database; // shortcut to latest @@ -78,7 +78,7 @@ class PrivMsg extends SimpleExtension { } /* - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuilding $event) { global $user; if(!$user->is_anonymous()) { $event->add_link("Private Messages", make_link("pm")); @@ -86,7 +86,7 @@ class PrivMsg extends SimpleExtension { } */ - public function onUserPageBuilding($event) { + public function onUserPageBuilding(UserPageBuilding $event) { global $page, $user; $duser = $event->display_user; if(!$user->is_anonymous() && !$duser->is_anonymous()) { @@ -99,7 +99,7 @@ class PrivMsg extends SimpleExtension { } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $database, $page, $user; if($event->page_matches("pm")) { if(!$user->is_anonymous()) { @@ -153,7 +153,7 @@ class PrivMsg extends SimpleExtension { } } - public function onSendPM($event) { + public function onSendPM(SendPMEvent $event) { global $database; $database->execute(" INSERT INTO private_message( diff --git a/contrib/pools/main.php b/contrib/pools/main.php index a679f222..fb15d491 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -11,7 +11,7 @@ class PoolCreationException extends SCoreException { } class Pools extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config, $database; if ($config->get_int("ext_pools_version") < 1){ @@ -65,7 +65,7 @@ class Pools extends SimpleExtension { $event->panel->add_block($sb); } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $page, $user; if($event->page_matches("pool")) { @@ -216,7 +216,7 @@ class Pools extends SimpleExtension { } } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { $event->add_link("Pools", make_link("pool/list")); } @@ -224,7 +224,7 @@ class Pools extends SimpleExtension { /* * HERE WE GET THE POOLS WHERE THE IMAGE APPEARS WHEN THE IMAGE IS DISPLAYED */ - public function onDisplayingImage($event) { + public function onDisplayingImage(DisplayingImageEvent $event) { global $config, $database, $page; if($config->get_bool("poolsInfoOnViewImage")) { @@ -242,7 +242,7 @@ class Pools extends SimpleExtension { } } - public function onImageAdminBlockBuilding($event) { + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { global $config, $database, $user; if($config->get_bool("poolsAdderOnViewImage") && !$user->is_anonymous()) { if($user->is_admin()) { @@ -261,7 +261,7 @@ class Pools extends SimpleExtension { /* * HERE WE GET THE LIST OF POOLS */ - private function list_pools(Page $page, $pageNumber) { + private function list_pools(Page $page, /*int*/ $pageNumber) { global $config, $database; if(is_null($pageNumber) || !is_numeric($pageNumber)) diff --git a/contrib/qr_code/main.php b/contrib/qr_code/main.php index 9309fbb6..7f5b706f 100644 --- a/contrib/qr_code/main.php +++ b/contrib/qr_code/main.php @@ -8,7 +8,7 @@ * and replace it with a link to google chart APIs */ class QRImage extends SimpleExtension { - public function onDisplayingImage($event) { + public function onDisplayingImage(DisplayingImageEvent $event) { $this->theme->links_block(make_http(make_link('image/'.$event->image->id.'.jpg'))); } } diff --git a/contrib/random_image/main.php b/contrib/random_image/main.php index bad07792..79fc6d4f 100644 --- a/contrib/random_image/main.php +++ b/contrib/random_image/main.php @@ -20,7 +20,7 @@ */ class RandomImage extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page, $user; if($event->page_matches("random_image")) { if($event->count_args() == 1) { @@ -51,13 +51,13 @@ class RandomImage extends SimpleExtension { } } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Random Image"); $sb->add_bool_option("show_random_block", "Show Random Block: "); $event->panel->add_block($sb); } - public function onPostListBuilding($event) { + public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; if($config->get_bool("show_random_block")) { $image = Image::by_random($event->search_terms); diff --git a/contrib/regen_thumb/main.php b/contrib/regen_thumb/main.php index cf3e2eb6..e5855976 100644 --- a/contrib/regen_thumb/main.php +++ b/contrib/regen_thumb/main.php @@ -13,7 +13,7 @@ */ class RegenThumb extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page, $user; if($event->page_matches("regen_thumb") && $user->is_admin() && isset($_POST['image_id'])) { @@ -23,7 +23,7 @@ class RegenThumb extends SimpleExtension { } } - public function onImageAdminBlockBuilding($event) { + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_part($this->theme->get_buttons_html($event->image->id)); diff --git a/contrib/report_image/main.php b/contrib/report_image/main.php index 970be8d7..28c0e826 100755 --- a/contrib/report_image/main.php +++ b/contrib/report_image/main.php @@ -29,24 +29,19 @@ class AddReportedImageEvent extends Event { } } -class ReportImage implements Extension { - var $theme; +class ReportImage extends SimpleExtension { + public function onInitExt(InitExtEvent $event) { + global $config; + $config->set_default_bool('report_image_show_thumbs', true); - public function get_priority() {return 50;} - - public function receive_event(Event $event) { - global $config, $database, $page, $user; - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if($event instanceof InitExtEvent) { - $config->set_default_bool('report_image_show_thumbs', true); - - if($config->get_int("ext_report_image_version") < 1) { - $this->install(); - } + if($config->get_int("ext_report_image_version") < 1) { + $this->install(); } + } - if(($event instanceof PageRequestEvent) && $event->page_matches("image_report")) { + public function onPageRequest(PageRequestEvent $event) { + global $page, $user; + if($event->page_matches("image_report")) { if($event->get_arg(0) == "add") { if(isset($_POST['image_id']) && isset($_POST['reason'])) { $image_id = int_escape($_POST['image_id']); @@ -70,40 +65,45 @@ class ReportImage implements Extension { } } } + } - if($event instanceof AddReportedImageEvent) { - $database->Execute( - "INSERT INTO image_reports(image_id, reporter_id, reason) - VALUES (?, ?, ?)", - array($event->image_id, $event->reporter_id, $event->reason)); - } + public function onAddReportedImage(AddReportedImageEvent $event) { + global $database; + $database->Execute( + "INSERT INTO image_reports(image_id, reporter_id, reason) + VALUES (?, ?, ?)", + array($event->image_id, $event->reporter_id, $event->reason)); + } - if($event instanceof RemoveReportedImageEvent) { - $database->Execute("DELETE FROM image_reports WHERE id = ?", array($event->id)); - } + public function onRemoveReportedImage(RemoveReportedImageEvent $event) { + global $database; + $database->Execute("DELETE FROM image_reports WHERE id = ?", array($event->id)); + } - if($event instanceof DisplayingImageEvent) { - if($config->get_bool('report_image_anon') || !$user->is_anonymous()) { - $this->theme->display_image_banner($page, $event->image); - } + public function onDisplayingImage(DisplayingImageEvent $event) { + global $config, $user, $page; + if($config->get_bool('report_image_anon') || !$user->is_anonymous()) { + $this->theme->display_image_banner($page, $event->image); } + } - if($event instanceof SetupBuildingEvent) { - $sb = new SetupBlock("Report Image Options"); - $sb->add_bool_option("report_image_anon", "Allow anonymous image reporting: "); - $sb->add_bool_option("report_image_show_thumbs", "<br>Show thumbnails in admin panel: "); - $event->panel->add_block($sb); - } + public function onSetupBuilding(SetupBuildingEvent $event) { + $sb = new SetupBlock("Report Image Options"); + $sb->add_bool_option("report_image_anon", "Allow anonymous image reporting: "); + $sb->add_bool_option("report_image_show_thumbs", "<br>Show thumbnails in admin panel: "); + $event->panel->add_block($sb); + } - if($event instanceof UserBlockBuildingEvent) { - if($user->is_admin()) { - $event->add_link("Reported Images", make_link("image_report/list")); - } + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { + global $user; + if($user->is_admin()) { + $event->add_link("Reported Images", make_link("image_report/list")); } + } - if($event instanceof ImageDeletionEvent) { - $database->Execute("DELETE FROM image_reports WHERE image_id = ?", array($event->image->id)); - } + public function onImageDeletion(ImageDeletionEvent $event) { + global $database; + $database->Execute("DELETE FROM image_reports WHERE image_id = ?", array($event->image->id)); } protected function install() { diff --git a/contrib/res_limit/main.php b/contrib/res_limit/main.php index d8ff1dc0..459faa90 100644 --- a/contrib/res_limit/main.php +++ b/contrib/res_limit/main.php @@ -5,69 +5,68 @@ * License: GPLv2 * Description: Allows the admin to set min / max image dimentions */ -class ResolutionLimit implements Extension { +class ResolutionLimit extends SimpleExtension { public function get_priority() {return 40;} // early, to veto ImageUploadEvent - public function receive_event(Event $event) { - if($event instanceof ImageAdditionEvent) { - global $config; - $min_w = $config->get_int("upload_min_width", -1); - $min_h = $config->get_int("upload_min_height", -1); - $max_w = $config->get_int("upload_max_width", -1); - $max_h = $config->get_int("upload_max_height", -1); - $ratios = explode(" ", $config->get_string("upload_ratios", "")); + public function onImageAddition(ImageAdditionEvent $event) { + global $config; + $min_w = $config->get_int("upload_min_width", -1); + $min_h = $config->get_int("upload_min_height", -1); + $max_w = $config->get_int("upload_max_width", -1); + $max_h = $config->get_int("upload_max_height", -1); + $ratios = explode(" ", $config->get_string("upload_ratios", "")); - $image = $event->image; + $image = $event->image; - if($min_w > 0 && $image->width < $min_w) throw new UploadException("Image too small"); - if($min_h > 0 && $image->height < $min_h) throw new UploadException("Image too small"); - if($max_w > 0 && $image->width > $max_w) throw new UploadException("Image too large"); - if($max_h > 0 && $image->height > $max_h) throw new UploadException("Image too large"); + if($min_w > 0 && $image->width < $min_w) throw new UploadException("Image too small"); + if($min_h > 0 && $image->height < $min_h) throw new UploadException("Image too small"); + if($max_w > 0 && $image->width > $max_w) throw new UploadException("Image too large"); + if($max_h > 0 && $image->height > $max_h) throw new UploadException("Image too large"); - if(count($ratios) > 0) { - $ok = false; - $valids = 0; - foreach($ratios as $ratio) { - $parts = explode(":", $ratio); - if(count($parts) < 2) continue; - $valids++; - $width = $parts[0]; - $height = $parts[1]; - if($image->width / $width == $image->height / $height) { - $ok = true; - break; - } - } - if($valids > 0 && !$ok) { - throw new UploadException( - "Image needs to be in one of these ratios: ". - html_escape($config->get_string("upload_ratios", ""))); + if(count($ratios) > 0) { + $ok = false; + $valids = 0; + foreach($ratios as $ratio) { + $parts = explode(":", $ratio); + if(count($parts) < 2) continue; + $valids++; + $width = $parts[0]; + $height = $parts[1]; + if($image->width / $width == $image->height / $height) { + $ok = true; + break; } } + if($valids > 0 && !$ok) { + throw new UploadException( + "Image needs to be in one of these ratios: ". + html_escape($config->get_string("upload_ratios", ""))); + } } - if($event instanceof SetupBuildingEvent) { - $sb = new SetupBlock("Resolution Limits"); + } - $sb->add_label("Min "); - $sb->add_int_option("upload_min_width"); - $sb->add_label(" x "); - $sb->add_int_option("upload_min_height"); - $sb->add_label(" px"); + public function onSetupBuilding(SetupBuildingEvent $event) { + $sb = new SetupBlock("Resolution Limits"); - $sb->add_label("<br>Max "); - $sb->add_int_option("upload_max_width"); - $sb->add_label(" x "); - $sb->add_int_option("upload_max_height"); - $sb->add_label(" px"); + $sb->add_label("Min "); + $sb->add_int_option("upload_min_width"); + $sb->add_label(" x "); + $sb->add_int_option("upload_min_height"); + $sb->add_label(" px"); - $sb->add_label("<br>(-1 for no limit)"); + $sb->add_label("<br>Max "); + $sb->add_int_option("upload_max_width"); + $sb->add_label(" x "); + $sb->add_int_option("upload_max_height"); + $sb->add_label(" px"); - $sb->add_label("<br>Ratios "); - $sb->add_text_option("upload_ratios"); - $sb->add_label("<br>(eg. '4:3 16:9', blank for no limit)"); + $sb->add_label("<br>(-1 for no limit)"); - $event->panel->add_block($sb); - } + $sb->add_label("<br>Ratios "); + $sb->add_text_option("upload_ratios"); + $sb->add_label("<br>(eg. '4:3 16:9', blank for no limit)"); + + $event->panel->add_block($sb); } } ?> diff --git a/contrib/resize/main.php b/contrib/resize/main.php index 2b75661f..60bc86b9 100644 --- a/contrib/resize/main.php +++ b/contrib/resize/main.php @@ -28,7 +28,7 @@ class ImageResizeException extends SCoreException { */ class ResizeImage extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_bool('resize_enabled', true); $config->set_default_bool('resize_upload', false); @@ -36,7 +36,7 @@ class ResizeImage extends SimpleExtension { $config->set_default_int('resize_default_height', 0); } - public function onImageAdminBlockBuilding($event) { + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { global $user, $config; if($user->is_admin() && $config->get_bool("resize_enabled")) { /* Add a link to resize the image */ @@ -44,7 +44,7 @@ class ResizeImage extends SimpleExtension { } } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Image Resize"); $sb->add_bool_option("resize_enabled", "Allow resizing images: "); $sb->add_bool_option("resize_upload", "<br>Resize on upload: "); @@ -89,7 +89,7 @@ class ResizeImage extends SimpleExtension { } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $user; if ( $event->page_matches("resize") && $user->is_admin() ) { diff --git a/contrib/rss_comments/main.php b/contrib/rss_comments/main.php index 975a384e..8c32bbbf 100644 --- a/contrib/rss_comments/main.php +++ b/contrib/rss_comments/main.php @@ -7,7 +7,7 @@ */ class RSS_Comments extends SimpleExtension { - public function onPostListBuilding($event) { + public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; $title = $config->get_string('title'); @@ -15,7 +15,7 @@ class RSS_Comments extends SimpleExtension { "title=\"$title - Comments\" href=\"".make_link("rss/comments")."\" />"); } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page; if($event->page_matches("rss/comments")) { $page->set_mode("data"); diff --git a/contrib/rss_images/main.php b/contrib/rss_images/main.php index 400767d2..675016e7 100644 --- a/contrib/rss_images/main.php +++ b/contrib/rss_images/main.php @@ -7,7 +7,7 @@ */ class RSS_Images extends SimpleExtension { - public function onPostListBuilding($event) { + public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; $title = $config->get_string('title'); @@ -22,7 +22,7 @@ class RSS_Images extends SimpleExtension { } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("rss/images")) { $search_terms = $event->get_search_terms(); $page_number = $event->get_page_number(); diff --git a/contrib/simpletest/main.php b/contrib/simpletest/main.php index 22ef730e..f56d322a 100644 --- a/contrib/simpletest/main.php +++ b/contrib/simpletest/main.php @@ -206,7 +206,7 @@ class TestFinder extends TestSuite { } class SimpleSCoreTest extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page; if($event->page_matches("test")) { set_time_limit(0); @@ -220,7 +220,7 @@ class SimpleSCoreTest extends SimpleExtension { } } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_link("Run Tests", make_link("test/all")); diff --git a/contrib/sitemap/main.php b/contrib/sitemap/main.php index 306c3085..8858bb9c 100644 --- a/contrib/sitemap/main.php +++ b/contrib/sitemap/main.php @@ -8,14 +8,14 @@ */ class XMLSitemap extends SimpleExtension { - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("sitemap.xml")) { $images = Image::find_images(0, 50, array()); $this->do_xml($images); } } - private function do_xml($images) { + private function do_xml(/*array(Image)*/ $images) { global $page; $page->set_mode("data"); $page->set_type("application/xml"); diff --git a/contrib/tag_history/main.php b/contrib/tag_history/main.php index 40835fc3..e83fd2c0 100644 --- a/contrib/tag_history/main.php +++ b/contrib/tag_history/main.php @@ -9,7 +9,7 @@ class Tag_History extends SimpleExtension { // in before tags are actually set, so that "get current tags" works public function get_priority() {return 40;} - public function onInitExtEvent($event) { + public function onInitExtEvent(InitExtEvent $event) { global $config; $config->set_default_int("history_limit", -1); @@ -19,7 +19,7 @@ class Tag_History extends SimpleExtension { } } - public function onAdminBuildingEvent($event) { + public function onAdminBuildingEvent(AdminBuildingEvent $event) { global $user; if(isset($_POST['revert_ip']) && $user->is_admin() && $user->check_auth_token()) { @@ -55,7 +55,7 @@ class Tag_History extends SimpleExtension { } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $page, $user; if ($event->page_matches("tag_history")) { @@ -78,18 +78,18 @@ class Tag_History extends SimpleExtension { } } - public function onDisplayingImage($event) { + public function onDisplayingImage(DisplayingImageEvent $event) { global $page; // handle displaying a link on the view page $this->theme->display_history_link($page, $event->image->id); } - public function onImageDeletion($event) { + public function onImageDeletion(ImageDeletionEvent $event) { // handle removing of history when an image is deleted $this->delete_all_tag_history($event->image->id); } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Tag History"); $sb->add_label("Limit to "); $sb->add_int_option("history_limit"); @@ -98,19 +98,18 @@ class Tag_History extends SimpleExtension { $event->panel->add_block($sb); } - public function onTagSetEvent($event) { + public function onTagSet(TagSetEvent $event) { $this->add_tag_history($event->image, $event->tags); } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuilding $event) { global $user; if($user->is_admin()) { $event->add_link("Tag Changes", make_link("tag_history")); } } - protected function install() - { + protected function install() { global $database; global $config; diff --git a/contrib/tagger/main.php b/contrib/tagger/main.php index 547f9ebc..3f2256f9 100644 --- a/contrib/tagger/main.php +++ b/contrib/tagger/main.php @@ -6,46 +6,37 @@ * Do not remove this notice. */ -class Tagger implements Extension { - var $theme; +class Tagger extends SimpleExtension { + public function onDisplayingImage(DisplayingImageEvent $event) { + global $page, $config, $user; - public function get_priority() {return 50;} - - public function receive_event(Event $event) { - if(is_null($this->theme)) - $this->theme = get_theme_object($this); - - if($event instanceof DisplayingImageEvent) { - global $page, $config, $user; - - if($config->get_bool("tag_edit_anon") - || ($user->id != $config->get_int("anon_id")) - && $config->get_bool("ext_tagger_enabled")) - { - $this->theme->build_tagger($page,$event); - } + if($config->get_bool("tag_edit_anon") + || ($user->id != $config->get_int("anon_id")) + && $config->get_bool("ext_tagger_enabled")) + { + $this->theme->build_tagger($page,$event); } + } - if($event instanceof SetupBuildingEvent) { - $sb = new SetupBlock("Tagger"); - $sb->add_bool_option("ext_tagger_enabled","Enable Tagger"); - $sb->add_int_option("ext_tagger_search_delay","<br/>Delay queries by "); - $sb->add_label(" milliseconds."); - $sb->add_label("<br/>Limit queries returning more than "); - $sb->add_int_option("ext_tagger_tag_max"); - $sb->add_label(" tags to "); - $sb->add_int_option("ext_tagger_limit"); - $event->panel->add_block($sb); - } + public function onSetupBuilding(SetupBuildingEvent $event) { + $sb = new SetupBlock("Tagger"); + $sb->add_bool_option("ext_tagger_enabled","Enable Tagger"); + $sb->add_int_option("ext_tagger_search_delay","<br/>Delay queries by "); + $sb->add_label(" milliseconds."); + $sb->add_label("<br/>Limit queries returning more than "); + $sb->add_int_option("ext_tagger_tag_max"); + $sb->add_label(" tags to "); + $sb->add_int_option("ext_tagger_limit"); + $event->panel->add_block($sb); } } // Tagger AJAX back-end -class TaggerXML implements Extension { +class TaggerXML extends SimpleExtension { public function get_priority() {return 10;} - public function receive_event(Event $event) { - if(($event instanceof PageRequestEvent) && $event->page_matches("tagger/tags")) { + public function onPageRequest(PageRequestEvent $event) { + if($event->page_matches("tagger/tags")) { global $page; //$match_tags = null; diff --git a/contrib/tips/main.php b/contrib/tips/main.php index 7cfdf868..bf6ced29 100644 --- a/contrib/tips/main.php +++ b/contrib/tips/main.php @@ -9,7 +9,7 @@ */ class Tips extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $config, $database; if ($config->get_int("ext_tips_version") < 1){ @@ -31,7 +31,7 @@ class Tips extends SimpleExtension { } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $page, $user; $this->getTip(); @@ -67,7 +67,7 @@ class Tips extends SimpleExtension { } } - public function onUserBlockBuilding($event) { + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { global $user; if($user->is_admin()) { $event->add_link("Tips Editor", make_link("tips/list")); diff --git a/contrib/twitter_soc/main.php b/contrib/twitter_soc/main.php index 04d42c48..9f7bed06 100644 --- a/contrib/twitter_soc/main.php +++ b/contrib/twitter_soc/main.php @@ -7,14 +7,14 @@ */ class TwitterSoc extends SimpleExtension { - public function onPostListBuilding($event) { + public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; if(strlen($config->get_string("twitter_soc_username")) > 0) { $this->theme->display_feed($page, $config->get_string("twitter_soc_username")); } } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Tweet!"); $sb->add_text_option("twitter_soc_username", "Username "); $event->panel->add_block($sb); diff --git a/contrib/update/main.php b/contrib/update/main.php index 912f918a..a2ac7ad6 100644 --- a/contrib/update/main.php +++ b/contrib/update/main.php @@ -7,13 +7,13 @@ * Description: Shimmie updater! */ class Update extends SimpleExtension { - public function onInitExt(Event $event) { + public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string("update_url", "http://nodeload.github.com/shish/shimmie2/zipball/master"); //best to avoid using https $config->set_default_string("commit_hash", ""); } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { global $config; //Would prefer to use the admin panel for this. //But since the admin panel is optional...kind of stuck to using this. @@ -25,7 +25,7 @@ class Update extends SimpleExtension { $event->panel->add_block($sb); } - public function onPageRequest(Event $event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $user; if($event->page_matches("update") && $user->is_admin()) { $ok = $this->update_shimmie(); diff --git a/contrib/wiki/main.php b/contrib/wiki/main.php index 17159e0d..9b5df534 100644 --- a/contrib/wiki/main.php +++ b/contrib/wiki/main.php @@ -54,7 +54,7 @@ class WikiPage { } class Wiki extends SimpleExtension { - public function onInitExt($event) { + public function onInitExt(InitExtEvent $event) { global $database; global $config; @@ -80,7 +80,7 @@ class Wiki extends SimpleExtension { } } - public function onPageRequest($event) { + public function onPageRequest(PageRequestEvent $event) { global $config, $page, $user; if($event->page_matches("wiki")) { if(is_null($event->get_arg(0)) || strlen(trim($event->get_arg(0))) == 0) { @@ -153,7 +153,7 @@ class Wiki extends SimpleExtension { } } - public function onWikiUpdate($event) { + public function onWikiUpdate(WikiUpdateEvent $event) { global $database; $wpage = $event->wikipage; try { @@ -167,7 +167,7 @@ class Wiki extends SimpleExtension { } } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Wiki"); $sb->add_bool_option("wiki_edit_anon", "Allow anonymous edits: "); $sb->add_bool_option("wiki_edit_user", "<br>Allow user edits: "); diff --git a/contrib/word_filter/main.php b/contrib/word_filter/main.php index 1ce8e259..5e9e8acb 100644 --- a/contrib/word_filter/main.php +++ b/contrib/word_filter/main.php @@ -10,12 +10,12 @@ class WordFilter extends SimpleExtension { // before emoticon filter public function get_priority() {return 40;} - public function onTextFormatting($event) { + public function onTextFormatting(TextFormattingEvent $event) { $event->formatted = $this->filter($event->formatted); $event->stripped = $this->filter($event->stripped); } - public function onSetupBuilding($event) { + public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Word Filter"); $sb->add_longtext_option("word_filter"); $sb->add_label("<br>(each line should be search term and replace term, separated by a comma)"); From 2b85e2d2fd0698625405dc465c60ce0e9b8075bd Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Wed, 8 Feb 2012 11:45:35 +0000 Subject: [PATCH 35/36] all the extensions are simple now --- contrib/artists/main.php | 62 ++++++------ contrib/handle_svg/main.php | 43 +++----- contrib/rating/main.php | 180 ++++++++++++++++----------------- contrib/tag_editcloud/main.php | 78 +++++++------- 4 files changed, 169 insertions(+), 194 deletions(-) diff --git a/contrib/artists/main.php b/contrib/artists/main.php index 361502e8..2b8a79fd 100644 --- a/contrib/artists/main.php +++ b/contrib/artists/main.php @@ -19,41 +19,37 @@ class AuthorSetEvent extends Event { } } -class Artists implements Extension { - var $theme; - - public function get_priority() {return 50;} - - public function receive_event(Event $event) - { +class Artists extends SimpleExtension { + public function onImageInfoSet(ImageInfoSetEvent $event) { global $user; - - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if ($event instanceof ImageInfoSetEvent) - if (isset($_POST["tag_edit__author"])) - send_event(new AuthorSetEvent($event->image, $user, $_POST["tag_edit__author"])); - - if ($event instanceof AuthorSetEvent) - $this->update_author($event); - - if($event instanceof InitExtEvent) - $this->try_install(); - - if ($event instanceof ImageInfoBoxBuildingEvent) - $this->add_author_field_to_image($event); - - if ($event instanceof PageRequestEvent) - $this->handle_commands($event); - - if ($event instanceof SearchTermParseEvent) { - $matches = array(); - if(preg_match("/^author=(.*)$/", $event->term, $matches)) { - $char = $matches[1]; - $event->add_querylet(new Querylet("Author = :author_char", array("author_char"=>$char))); - } + if (isset($_POST["tag_edit__author"])) { + send_event(new AuthorSetEvent($event->image, $user, $_POST["tag_edit__author"])); } - } + } + + public function onAuthorSet(AuthorSetEvent $event) { + $this->update_author($event); + } + + public function onInitExt(InitExtEvent $event) { + $this->try_install(); + } + + public function onImageInfoBoxBuilding(ImageInfoBoxBuildingEvent $event) { + $this->add_author_field_to_image($event); + } + + public function onPageRequest(PageRequestEvent $event) { + $this->handle_commands($event); + } + + public function onSearchTermParse(SearchTermParseEvent $event) { + $matches = array(); + if(preg_match("/^author=(.*)$/", $event->term, $matches)) { + $char = $matches[1]; + $event->add_querylet(new Querylet("Author = :author_char", array("author_char"=>$char))); + } + } public function try_install() { global $config, $database; diff --git a/contrib/handle_svg/main.php b/contrib/handle_svg/main.php index e2d02a3f..c65edf49 100644 --- a/contrib/handle_svg/main.php +++ b/contrib/handle_svg/main.php @@ -5,15 +5,9 @@ * Description: Handle SVG files */ -class SVGFileHandler implements Extension { - var $theme; - - public function get_priority() {return 50;} - - public function receive_event(Event $event) { - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if(($event instanceof DataUploadEvent) && $this->supported_ext($event->type) && $this->check_contents($event->tmpname)) { +class SVGFileHandler extends SimpleExtension { + public function onDataUpload(DataUploadEvent $event) { + if($this->supported_ext($event->type) && $this->check_contents($event->tmpname)) { $hash = $event->hash; $ha = substr($hash, 0, 2); if(!move_upload_to_archive($event)) return; @@ -26,33 +20,28 @@ class SVGFileHandler implements Extension { send_event($iae); $event->image_id = $iae->image->id; } + } - if(($event instanceof ThumbnailGenerationEvent) && $this->supported_ext($event->type)) { + public function onThumbnailGeneration(ThumbnailGenerationEvent $event) { + global $config; + if($this->supported_ext($event->type)) { $hash = $event->hash; $ha = substr($hash, 0, 2); - global $config; - -// if($config->get_string("thumb_engine") == "convert") { -// $w = $config->get_int("thumb_width"); -// $h = $config->get_int("thumb_height"); -// $q = $config->get_int("thumb_quality"); -// $mem = $config->get_int("thumb_max_memory") / 1024 / 1024; // IM takes memory in MB -// -// exec("convert images/{$ha}/{$hash}[0] -geometry {$w}x{$h} -quality {$q} jpg:thumbs/{$ha}/{$hash}"); -// } -// else { - copy("ext/handle_svg/thumb.jpg", warehouse_path("thumbs", $hash)); -// } + copy("ext/handle_svg/thumb.jpg", warehouse_path("thumbs", $hash)); } + } - if(($event instanceof DisplayingImageEvent) && $this->supported_ext($event->image->ext)) { - global $page; + public function onDisplayingImage(DisplayingImageEvent $event) { + global $page; + if($this->supported_ext($event->image->ext)) { $this->theme->display_image($page, $event->image); } + } - if(($event instanceof PageRequestEvent) && $event->page_matches("get_svg")) { - global $config, $database, $page; + public function onPageRequest(PageRequestEvent $event) { + global $config, $database, $page; + if($event->page_matches("get_svg")) { $id = int_escape($event->get_arg(0)); $image = Image::by_id($id); $hash = $image->hash; diff --git a/contrib/rating/main.php b/contrib/rating/main.php index b246b14e..71fc0cf8 100644 --- a/contrib/rating/main.php +++ b/contrib/rating/main.php @@ -17,20 +17,13 @@ class RatingSetEvent extends Event { } } -class Ratings implements Extension { - var $theme; +class Ratings extends SimpleExtension { + public function onAdminBuilding(AdminBuildingEvent $event) { + $this->theme->display_bulk_rater(); + } - public function get_priority() {return 50;} - - public function receive_event(Event $event) { - global $config, $database, $page, $user; - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if($event instanceof AdminBuildingEvent) { - $this->theme->display_bulk_rater(); - } - - if(($event instanceof PageRequestEvent) && $event->page_matches("admin/bulk_rate")) { + public function onPageRequest(PageRequestEvent $event) { + if($event->page_matches("admin/bulk_rate")) { global $database, $user, $page; if(!$user->is_admin()) { throw PermissionDeniedException(); @@ -54,95 +47,98 @@ class Ratings implements Extension { $page->set_redirect(make_link("admin")); } } + } - if($event instanceof InitExtEvent) { - if($config->get_int("ext_ratings2_version") < 2) { - $this->install(); - } + public function onInitExt(InitExtEvent $event) { + global $config; - $config->set_default_string("ext_rating_anon_privs", 'squ'); - $config->set_default_string("ext_rating_user_privs", 'sqeu'); - $config->set_default_string("ext_rating_admin_privs", 'sqeu'); + if($config->get_int("ext_ratings2_version") < 2) { + $this->install(); } - if($event instanceof RatingSetEvent) { - if(empty($event->image->rating)){ - $old_rating = ""; - }else{ - $old_rating = $event->image->rating; - } - $this->set_rating($event->image->id, $event->rating, $old_rating); - } + $config->set_default_string("ext_rating_anon_privs", 'squ'); + $config->set_default_string("ext_rating_user_privs", 'sqeu'); + $config->set_default_string("ext_rating_admin_privs", 'sqeu'); + } - if($event instanceof ImageInfoBoxBuildingEvent) { - if($this->can_rate()) { - $event->add_part($this->theme->get_rater_html($event->image->id, $event->image->rating), 80); - } + public function onRatingSet(RatingSetEvent $event) { + if(empty($event->image->rating)){ + $old_rating = ""; + }else{ + $old_rating = $event->image->rating; } + $this->set_rating($event->image->id, $event->rating, $old_rating); + } - if($event instanceof ImageInfoSetEvent) { - if($this->can_rate() && isset($_POST["rating"])) { - send_event(new RatingSetEvent($event->image, $user, $_POST['rating'])); - } - } - - if($event instanceof SetupBuildingEvent) { - $privs = array(); - $privs['Safe Only'] = 's'; - $privs['Safe and Unknown'] = 'su'; - $privs['Safe and Questionable'] = 'sq'; - $privs['Safe, Questionable, Unknown'] = 'squ'; - $privs['All'] = 'sqeu'; - - $sb = new SetupBlock("Image Ratings"); - $sb->add_choice_option("ext_rating_anon_privs", $privs, "Anonymous: "); - $sb->add_choice_option("ext_rating_user_privs", $privs, "<br>Users: "); - $sb->add_choice_option("ext_rating_admin_privs", $privs, "<br>Admins: "); - $event->panel->add_block($sb); - } - - if($event instanceof ParseLinkTemplateEvent) { - $event->replace('$rating', $this->theme->rating_to_name($event->image->rating)); - } - - if($event instanceof SearchTermParseEvent) { - $matches = array(); - if(is_null($event->term) && $this->no_rating_query($event->context)) { - $set = Ratings::privs_to_sql(Ratings::get_user_privs($user)); - $event->add_querylet(new Querylet("rating IN ($set)")); - } - if(preg_match("/^rating=([sqeu]+)$/", $event->term, $matches)) { - $sqes = $matches[1]; - $arr = array(); - $length = strlen($sqes); - for($i=0; $i<$length; $i++) { - $arr[] = "'" . $sqes[$i] . "'"; - } - $set = join(', ', $arr); - $event->add_querylet(new Querylet("rating IN ($set)")); - } - if(preg_match("/^rating=(safe|questionable|explicit|unknown)$/", strtolower($event->term), $matches)) { - $text = $matches[1]; - $char = $text[0]; - $event->add_querylet(new Querylet("rating = :img_rating", array("img_rating"=>$char))); - } - } - - if($event instanceof DisplayingImageEvent) { - /** - * Deny images upon insufficient permissions. - **/ - global $user, $database, $page; - $user_view_level = Ratings::get_user_privs($user); - $user_view_level = preg_split('//', $user_view_level, -1); - if(!in_array($event->image->rating, $user_view_level)) { - $page->set_mode("redirect"); - $page->set_redirect(make_link("post/list")); - } + public function onImageInfoBoxBuilding(ImageInfoBoxBuildingEvent $event) { + if($this->can_rate()) { + $event->add_part($this->theme->get_rater_html($event->image->id, $event->image->rating), 80); } } - public static function get_user_privs($user) { + public function onImageInfoSet(ImageInfoSetEvent $event) { + global $user; + if($this->can_rate() && isset($_POST["rating"])) { + send_event(new RatingSetEvent($event->image, $user, $_POST['rating'])); + } + } + + public function onSetupBuilding(SetupBuildingEvent $event) { + $privs = array(); + $privs['Safe Only'] = 's'; + $privs['Safe and Unknown'] = 'su'; + $privs['Safe and Questionable'] = 'sq'; + $privs['Safe, Questionable, Unknown'] = 'squ'; + $privs['All'] = 'sqeu'; + + $sb = new SetupBlock("Image Ratings"); + $sb->add_choice_option("ext_rating_anon_privs", $privs, "Anonymous: "); + $sb->add_choice_option("ext_rating_user_privs", $privs, "<br>Users: "); + $sb->add_choice_option("ext_rating_admin_privs", $privs, "<br>Admins: "); + $event->panel->add_block($sb); + } + + public function onParseLinkTemplate(ParseLinkTemplateEvent $event) { + $event->replace('$rating', $this->theme->rating_to_name($event->image->rating)); + } + + public function onSearchTermParse(SearchTermParseEvent $event) { + $matches = array(); + if(is_null($event->term) && $this->no_rating_query($event->context)) { + $set = Ratings::privs_to_sql(Ratings::get_user_privs($user)); + $event->add_querylet(new Querylet("rating IN ($set)")); + } + if(preg_match("/^rating=([sqeu]+)$/", $event->term, $matches)) { + $sqes = $matches[1]; + $arr = array(); + $length = strlen($sqes); + for($i=0; $i<$length; $i++) { + $arr[] = "'" . $sqes[$i] . "'"; + } + $set = join(', ', $arr); + $event->add_querylet(new Querylet("rating IN ($set)")); + } + if(preg_match("/^rating=(safe|questionable|explicit|unknown)$/", strtolower($event->term), $matches)) { + $text = $matches[1]; + $char = $text[0]; + $event->add_querylet(new Querylet("rating = :img_rating", array("img_rating"=>$char))); + } + } + + public function onDisplayingImage(DisplayingImageEvent $event) { + /** + * Deny images upon insufficient permissions. + **/ + global $user, $page; + $user_view_level = Ratings::get_user_privs($user); + $user_view_level = preg_split('//', $user_view_level, -1); + if(!in_array($event->image->rating, $user_view_level)) { + $page->set_mode("redirect"); + $page->set_redirect(make_link("post/list")); + } + } + + public static function get_user_privs(User $user) { global $config; if($user->is_anonymous()) { $sqes = $config->get_string("ext_rating_anon_privs"); diff --git a/contrib/tag_editcloud/main.php b/contrib/tag_editcloud/main.php index a6b9ecf0..75819299 100644 --- a/contrib/tag_editcloud/main.php +++ b/contrib/tag_editcloud/main.php @@ -12,56 +12,50 @@ * colorize used tags in cloud || always show used tags in front of cloud * theme junk */ -class TagEditCloud implements Extension { - var $theme; +class TagEditCloud extends SimpleExtension { + public function onImageInfoBoxBuilding(ImageInfoBoxBuildingEvent $event) { + global $config; - public function get_priority() {return 50;} - - public function receive_event(Event $event) { - global $config, $database, $page, $user; - //if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if($event instanceof ImageInfoBoxBuildingEvent) { - if(!$config->get_bool("tageditcloud_disable")) { - if($this->can_tag($event->image)) { - if(!$cfg_minusage=$config->get_int("tageditcloud_minusage")) $cfg_minusage=2; - if(!$cfg_defcount=$config->get_int("tageditcloud_defcount")) $cfg_defcount=40; - if(!$cfg_maxcount=$config->get_int("tageditcloud_maxcount")) $cfg_maxcount=4096; - if($config->get_string("tageditcloud_sort") != "p") { - $event->add_part($this->build_tag_map($event->image,$cfg_minusage,false),40); - } else { - $event->add_part($this->build_tag_map($event->image,$cfg_defcount,$cfg_maxcount),40); - } + if(!$config->get_bool("tageditcloud_disable")) { + if($this->can_tag($event->image)) { + if(!$cfg_minusage=$config->get_int("tageditcloud_minusage")) $cfg_minusage=2; + if(!$cfg_defcount=$config->get_int("tageditcloud_defcount")) $cfg_defcount=40; + if(!$cfg_maxcount=$config->get_int("tageditcloud_maxcount")) $cfg_maxcount=4096; + if($config->get_string("tageditcloud_sort") != "p") { + $event->add_part($this->build_tag_map($event->image,$cfg_minusage,false),40); + } else { + $event->add_part($this->build_tag_map($event->image,$cfg_defcount,$cfg_maxcount),40); } } } + } - if($event instanceof InitExtEvent) { - $config->set_default_bool("tageditcloud_disable",false); - $config->set_default_bool("tageditcloud_usedfirst",true); - $config->set_default_string("tageditcloud_sort",'a'); - $config->set_default_int("tageditcloud_minusage",2); - $config->set_default_int("tageditcloud_defcount",40); - $config->set_default_int("tageditcloud_maxcount",4096); - } + public function onInitExt(InitExtEvent $event) { + global $config; + $config->set_default_bool("tageditcloud_disable",false); + $config->set_default_bool("tageditcloud_usedfirst",true); + $config->set_default_string("tageditcloud_sort",'a'); + $config->set_default_int("tageditcloud_minusage",2); + $config->set_default_int("tageditcloud_defcount",40); + $config->set_default_int("tageditcloud_maxcount",4096); + } - if($event instanceof SetupBuildingEvent) { - $sort_by = array('Alphabetical'=>'a','Popularity'=>'p'); + public function onSetupBuilding(SetupBuildingEvent $event) { + $sort_by = array('Alphabetical'=>'a','Popularity'=>'p'); - $sb = new SetupBlock("Tag Edit Cloud"); - $sb->add_bool_option("tageditcloud_disable", "Disable Tag Selection Cloud: "); - $sb->add_choice_option("tageditcloud_sort", $sort_by, "<br>Sort the tags by:"); - $sb->add_bool_option("tageditcloud_usedfirst","<br>Always show used tags first: "); - $sb->add_label("<br><b>Alpha sort</b>:<br>Only show tags used at least "); - $sb->add_int_option("tageditcloud_minusage"); - $sb->add_label(" times.<br><b>Popularity sort</b>:<br>Show "); - $sb->add_int_option("tageditcloud_defcount"); - $sb->add_label(" tags by default.<br>Show a maximum of "); - $sb->add_int_option("tageditcloud_maxcount"); - $sb->add_label(" tags."); + $sb = new SetupBlock("Tag Edit Cloud"); + $sb->add_bool_option("tageditcloud_disable", "Disable Tag Selection Cloud: "); + $sb->add_choice_option("tageditcloud_sort", $sort_by, "<br>Sort the tags by:"); + $sb->add_bool_option("tageditcloud_usedfirst","<br>Always show used tags first: "); + $sb->add_label("<br><b>Alpha sort</b>:<br>Only show tags used at least "); + $sb->add_int_option("tageditcloud_minusage"); + $sb->add_label(" times.<br><b>Popularity sort</b>:<br>Show "); + $sb->add_int_option("tageditcloud_defcount"); + $sb->add_label(" tags by default.<br>Show a maximum of "); + $sb->add_int_option("tageditcloud_maxcount"); + $sb->add_label(" tags."); - $event->panel->add_block($sb); - } + $event->panel->add_block($sb); } private function tag_link($tag) { From 0698b780f94ca757eeaac6a389f29dbb0bfb124c Mon Sep 17 00:00:00 2001 From: Shish <shish@shishnet.org> Date: Wed, 8 Feb 2012 12:07:01 +0000 Subject: [PATCH 36/36] remove regular Extension, have SimpleExtension take its place, optimise the event system based on SimpleExtension methods --- contrib/admin/main.php | 2 +- contrib/amazon_s3/main.php | 2 +- contrib/artists/main.php | 2 +- contrib/ban_words/main.php | 2 +- contrib/blocks/main.php | 2 +- contrib/blotter/main.php | 2 +- contrib/bookmarks/main.php | 2 +- contrib/browser_search/main.php | 2 +- contrib/bulk_add/main.php | 2 +- contrib/danbooru_api/main.php | 2 +- contrib/downtime/main.php | 2 +- contrib/emoticons/main.php | 2 +- contrib/et/main.php | 2 +- contrib/favorites/main.php | 2 +- contrib/featured/main.php | 2 +- contrib/forum/main.php | 2 +- contrib/handle_archive/main.php | 2 +- contrib/handle_ico/main.php | 2 +- contrib/handle_svg/main.php | 2 +- contrib/holiday/main.php | 2 +- contrib/home/main.php | 2 +- contrib/image_hash_ban/main.php | 2 +- contrib/ipban/main.php | 2 +- contrib/link_image/main.php | 2 +- contrib/log_db/main.php | 2 +- contrib/mass_tagger/main.php | 2 +- contrib/news/main.php | 2 +- contrib/notes/main.php | 2 +- contrib/numeric_score/main.php | 2 +- contrib/oekaki/main.php | 2 +- contrib/pm/main.php | 2 +- contrib/pools/main.php | 2 +- contrib/qr_code/main.php | 2 +- contrib/random_image/main.php | 2 +- contrib/rating/main.php | 2 +- contrib/regen_thumb/main.php | 2 +- contrib/report_image/main.php | 2 +- contrib/res_limit/main.php | 2 +- contrib/resize/main.php | 2 +- contrib/rss_comments/main.php | 2 +- contrib/rss_images/main.php | 2 +- contrib/shimmie_api/main.php | 2 +- contrib/simpletest/main.php | 2 +- contrib/site_description/main.php | 2 +- contrib/sitemap/main.php | 2 +- contrib/tag_editcloud/main.php | 2 +- contrib/tag_history/main.php | 2 +- contrib/tagger/main.php | 4 +-- contrib/tips/main.php | 2 +- contrib/twitter_soc/main.php | 2 +- contrib/update/main.php | 2 +- contrib/wiki/main.php | 2 +- contrib/word_filter/main.php | 2 +- core/extension.class.php | 43 +++++-------------------------- core/util.inc.php | 14 +++------- ext/alias_editor/main.php | 2 +- ext/comment/main.php | 2 +- ext/ext_manager/main.php | 2 +- ext/handle_404/main.php | 2 +- ext/image/main.php | 2 +- ext/index/main.php | 2 +- ext/mail/main.php | 4 +-- ext/setup/main.php | 2 +- ext/tag_edit/main.php | 2 +- ext/tag_list/main.php | 2 +- ext/upgrade/main.php | 2 +- ext/upload/main.php | 2 +- ext/user/main.php | 2 +- ext/view/main.php | 2 +- 69 files changed, 79 insertions(+), 116 deletions(-) diff --git a/contrib/admin/main.php b/contrib/admin/main.php index 12c2e347..020d4640 100644 --- a/contrib/admin/main.php +++ b/contrib/admin/main.php @@ -35,7 +35,7 @@ class AdminBuildingEvent extends Event { } } -class AdminPage extends SimpleExtension { +class AdminPage extends Extension { public function onPageRequest(PageRequestEvent $event) { global $page, $user; diff --git a/contrib/amazon_s3/main.php b/contrib/amazon_s3/main.php index 741b7378..b4191a69 100644 --- a/contrib/amazon_s3/main.php +++ b/contrib/amazon_s3/main.php @@ -9,7 +9,7 @@ require_once "lib/S3.php"; -class UploadS3 extends SimpleExtension { +class UploadS3 extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string("amazon_s3_access", ""); diff --git a/contrib/artists/main.php b/contrib/artists/main.php index 2b8a79fd..4c2422fa 100644 --- a/contrib/artists/main.php +++ b/contrib/artists/main.php @@ -19,7 +19,7 @@ class AuthorSetEvent extends Event { } } -class Artists extends SimpleExtension { +class Artists extends Extension { public function onImageInfoSet(ImageInfoSetEvent $event) { global $user; if (isset($_POST["tag_edit__author"])) { diff --git a/contrib/ban_words/main.php b/contrib/ban_words/main.php index aee98417..e5f42b89 100644 --- a/contrib/ban_words/main.php +++ b/contrib/ban_words/main.php @@ -19,7 +19,7 @@ * from Essex" */ -class BanWords extends SimpleExtension { +class BanWords extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string('banned_words', " diff --git a/contrib/blocks/main.php b/contrib/blocks/main.php index 2fd3dfa7..f3ee274d 100644 --- a/contrib/blocks/main.php +++ b/contrib/blocks/main.php @@ -27,7 +27,7 @@ * </pre> */ -class Blocks extends SimpleExtension { +class Blocks extends Extension { public function onPageRequest(PageRequestEvent $event) { global $config, $page; $all = $config->get_string("blocks_text"); diff --git a/contrib/blotter/main.php b/contrib/blotter/main.php index 8dd4daad..23dc5fe8 100644 --- a/contrib/blotter/main.php +++ b/contrib/blotter/main.php @@ -8,7 +8,7 @@ * * Development TODO at http://github.com/zshall/shimmie2/issues */ -class Blotter extends SimpleExtension { +class Blotter extends Extension { public function onInitExt(InitExtEvent $event) { /** * I love re-using this installer don't I... diff --git a/contrib/bookmarks/main.php b/contrib/bookmarks/main.php index 3ed8db45..8e47bc83 100644 --- a/contrib/bookmarks/main.php +++ b/contrib/bookmarks/main.php @@ -6,7 +6,7 @@ * Description: Allow users to bookmark searches */ -class Bookmarks extends SimpleExtension { +class Bookmarks extends Extension { public function onInitExt(InitExtEvent $event) { $this->install(); } diff --git a/contrib/browser_search/main.php b/contrib/browser_search/main.php index 80c399c2..78c3b878 100755 --- a/contrib/browser_search/main.php +++ b/contrib/browser_search/main.php @@ -13,7 +13,7 @@ * engine" notification they have */ -class BrowserSearch extends SimpleExtension { +class BrowserSearch extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string("search_suggestions_results_order", 'a'); diff --git a/contrib/bulk_add/main.php b/contrib/bulk_add/main.php index 676fc14e..21e5a9a3 100644 --- a/contrib/bulk_add/main.php +++ b/contrib/bulk_add/main.php @@ -14,7 +14,7 @@ * <p><b>Note:</b> requires the "admin" extension to be enabled */ -class BulkAdd extends SimpleExtension { +class BulkAdd extends Extension { public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("bulk_add")) { diff --git a/contrib/danbooru_api/main.php b/contrib/danbooru_api/main.php index f47a34e8..ad9cc13c 100644 --- a/contrib/danbooru_api/main.php +++ b/contrib/danbooru_api/main.php @@ -47,7 +47,7 @@ Completely compatibility will probably involve a rewrite with a different URL */ -class DanbooruApi extends SimpleExtension { +class DanbooruApi extends Extension { public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("api") && ($event->get_arg(0) == 'danbooru')) { $this->api_danbooru($event); diff --git a/contrib/downtime/main.php b/contrib/downtime/main.php index 8c9ced34..3e87bdf3 100644 --- a/contrib/downtime/main.php +++ b/contrib/downtime/main.php @@ -11,7 +11,7 @@ * message specified in the box. */ -class Downtime extends SimpleExtension { +class Downtime extends Extension { public function get_priority() {return 10;} public function onSetupBuilding($event) { diff --git a/contrib/emoticons/main.php b/contrib/emoticons/main.php index d7805f47..be958040 100644 --- a/contrib/emoticons/main.php +++ b/contrib/emoticons/main.php @@ -24,7 +24,7 @@ class Emoticons extends FormatterExtension { } } -class EmoticonList extends SimpleExtension { +class EmoticonList extends Extension { public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("emote/list")) { $this->theme->display_emotes(glob("ext/emoticons/default/*")); diff --git a/contrib/et/main.php b/contrib/et/main.php index d54b5631..6a26ec40 100644 --- a/contrib/et/main.php +++ b/contrib/et/main.php @@ -12,7 +12,7 @@ * versions of PHP I should test with, etc. */ -class ET extends SimpleExtension { +class ET extends Extension { public function onPageRequest(PageRequestEvent $event) { global $user; if($event->page_matches("system_info")) { diff --git a/contrib/favorites/main.php b/contrib/favorites/main.php index 9a66fd65..7c14554f 100644 --- a/contrib/favorites/main.php +++ b/contrib/favorites/main.php @@ -26,7 +26,7 @@ class FavoriteSetEvent extends Event { } } -class Favorites extends SimpleExtension { +class Favorites extends Extension { public function onInitExt(InitExtEvent $event) { global $config; if($config->get_int("ext_favorites_version", 0) < 1) { diff --git a/contrib/featured/main.php b/contrib/featured/main.php index a4defb11..ee25b121 100644 --- a/contrib/featured/main.php +++ b/contrib/featured/main.php @@ -18,7 +18,7 @@ * every couple of hours. */ -class Featured extends SimpleExtension { +class Featured extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_int('featured_id', 0); diff --git a/contrib/forum/main.php b/contrib/forum/main.php index 2604c426..cd5ccdaf 100644 --- a/contrib/forum/main.php +++ b/contrib/forum/main.php @@ -8,7 +8,7 @@ * Documentation: */ -class Forum extends SimpleExtension { +class Forum extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; diff --git a/contrib/handle_archive/main.php b/contrib/handle_archive/main.php index c8b92200..2fb2498b 100644 --- a/contrib/handle_archive/main.php +++ b/contrib/handle_archive/main.php @@ -10,7 +10,7 @@ * <br>7-zip: <code>7zr x -o"%d" "%f"</code> */ -class ArchiveFileHandler extends SimpleExtension { +class ArchiveFileHandler extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string('archive_extract_command', 'unzip -d "%d" "%f"'); diff --git a/contrib/handle_ico/main.php b/contrib/handle_ico/main.php index d8475279..7582fc53 100644 --- a/contrib/handle_ico/main.php +++ b/contrib/handle_ico/main.php @@ -5,7 +5,7 @@ * Description: Handle windows icons */ -class IcoFileHandler extends SimpleExtension { +class IcoFileHandler extends Extension { public function onDataUpload(DataUploadEvent $event) { if($this->supported_ext($event->type) && $this->check_contents($event->tmpname)) { $hash = $event->hash; diff --git a/contrib/handle_svg/main.php b/contrib/handle_svg/main.php index c65edf49..0c59f59d 100644 --- a/contrib/handle_svg/main.php +++ b/contrib/handle_svg/main.php @@ -5,7 +5,7 @@ * Description: Handle SVG files */ -class SVGFileHandler extends SimpleExtension { +class SVGFileHandler extends Extension { public function onDataUpload(DataUploadEvent $event) { if($this->supported_ext($event->type) && $this->check_contents($event->tmpname)) { $hash = $event->hash; diff --git a/contrib/holiday/main.php b/contrib/holiday/main.php index 58c90a37..f435099a 100644 --- a/contrib/holiday/main.php +++ b/contrib/holiday/main.php @@ -6,7 +6,7 @@ * License: GPLv2 * Description: Use an additional stylesheet on certain holidays. */ -class Holiday extends SimpleExtension { +class Holiday extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_bool("holiday_aprilfools", false); diff --git a/contrib/home/main.php b/contrib/home/main.php index f9485309..2ac2412d 100644 --- a/contrib/home/main.php +++ b/contrib/home/main.php @@ -15,7 +15,7 @@ * alongside the default choices. */ -class Home extends SimpleExtension { +class Home extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string("home_links", '[$base/post/list|Posts] diff --git a/contrib/image_hash_ban/main.php b/contrib/image_hash_ban/main.php index ab0f9bf0..79150d98 100644 --- a/contrib/image_hash_ban/main.php +++ b/contrib/image_hash_ban/main.php @@ -29,7 +29,7 @@ class AddImageHashBanEvent extends Event { } } // }}} -class ImageBan extends SimpleExtension { +class ImageBan extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; if($config->get_int("ext_imageban_version") < 1) { diff --git a/contrib/ipban/main.php b/contrib/ipban/main.php index 2697155a..4da24231 100644 --- a/contrib/ipban/main.php +++ b/contrib/ipban/main.php @@ -34,7 +34,7 @@ class AddIPBanEvent extends Event { } // }}} -class IPBan extends SimpleExtension { +class IPBan extends Extension { public function get_priority() {return 10;} public function onInitExt(InitExtEvent $event) { diff --git a/contrib/link_image/main.php b/contrib/link_image/main.php index 28366e4d..ab52935e 100644 --- a/contrib/link_image/main.php +++ b/contrib/link_image/main.php @@ -4,7 +4,7 @@ * Author: Artanis <artanis.00@gmail.com> * Description: Show various forms of link to each image, for copy & paste */ -class LinkImage extends SimpleExtension { +class LinkImage extends Extension { public function onDisplayingImage(DisplayingImageEvent $event) { global $page; $this->theme->links_block($page, $this->data($event->image)); diff --git a/contrib/log_db/main.php b/contrib/log_db/main.php index f83a2aa6..bba7c996 100644 --- a/contrib/log_db/main.php +++ b/contrib/log_db/main.php @@ -6,7 +6,7 @@ * Visibility: admin */ -class LogDatabase extends SimpleExtension { +class LogDatabase extends Extension { public function onInitExt(InitExtEvent $event) { global $database; global $config; diff --git a/contrib/mass_tagger/main.php b/contrib/mass_tagger/main.php index 8cc3c893..751cfcdf 100644 --- a/contrib/mass_tagger/main.php +++ b/contrib/mass_tagger/main.php @@ -14,7 +14,7 @@ * As of now only compatible with the lite theme. */ -class MassTagger extends SimpleExtension { +class MassTagger extends Extension { public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page, $user; diff --git a/contrib/news/main.php b/contrib/news/main.php index 2091a6ef..27765c71 100644 --- a/contrib/news/main.php +++ b/contrib/news/main.php @@ -8,7 +8,7 @@ * Any HTML is allowed */ -class News extends SimpleExtension { +class News extends Extension { public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; if(strlen($config->get_string("news_text")) > 0) { diff --git a/contrib/notes/main.php b/contrib/notes/main.php index 3e894770..aa960c1d 100644 --- a/contrib/notes/main.php +++ b/contrib/notes/main.php @@ -7,7 +7,7 @@ * Documentation: */ -class Notes extends SimpleExtension { +class Notes extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; diff --git a/contrib/numeric_score/main.php b/contrib/numeric_score/main.php index 7bcf15aa..7df72142 100755 --- a/contrib/numeric_score/main.php +++ b/contrib/numeric_score/main.php @@ -19,7 +19,7 @@ class NumericScoreSetEvent extends Event { } } -class NumericScore extends SimpleExtension { +class NumericScore extends Extension { public function onInitExt(InitExtEvent $event) { global $config; if($config->get_int("ext_numeric_score_version", 0) < 1) { diff --git a/contrib/oekaki/main.php b/contrib/oekaki/main.php index 3027dcfd..16e5748e 100644 --- a/contrib/oekaki/main.php +++ b/contrib/oekaki/main.php @@ -5,7 +5,7 @@ * Description: ChibiPaint-based Oekaki uploader */ -class Oekaki extends SimpleExtension { +class Oekaki extends Extension { public function onPageRequest(PageRequestEvent $event) { global $user, $page; diff --git a/contrib/pm/main.php b/contrib/pm/main.php index 5e380278..dc95db92 100755 --- a/contrib/pm/main.php +++ b/contrib/pm/main.php @@ -42,7 +42,7 @@ class PM { } } -class PrivMsg extends SimpleExtension { +class PrivMsg extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; diff --git a/contrib/pools/main.php b/contrib/pools/main.php index fb15d491..afec342c 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -10,7 +10,7 @@ class PoolCreationException extends SCoreException { } -class Pools extends SimpleExtension { +class Pools extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; diff --git a/contrib/qr_code/main.php b/contrib/qr_code/main.php index 7f5b706f..ed671fd3 100644 --- a/contrib/qr_code/main.php +++ b/contrib/qr_code/main.php @@ -7,7 +7,7 @@ * Further modified by Shish to remove the 7MB local QR generator * and replace it with a link to google chart APIs */ -class QRImage extends SimpleExtension { +class QRImage extends Extension { public function onDisplayingImage(DisplayingImageEvent $event) { $this->theme->links_block(make_http(make_link('image/'.$event->image->id.'.jpg'))); } diff --git a/contrib/random_image/main.php b/contrib/random_image/main.php index 79fc6d4f..11d5daa7 100644 --- a/contrib/random_image/main.php +++ b/contrib/random_image/main.php @@ -19,7 +19,7 @@ * <code>/random_image/download/size=1024x768+cute</code> */ -class RandomImage extends SimpleExtension { +class RandomImage extends Extension { public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page, $user; if($event->page_matches("random_image")) { diff --git a/contrib/rating/main.php b/contrib/rating/main.php index 71fc0cf8..4bcbe3f7 100644 --- a/contrib/rating/main.php +++ b/contrib/rating/main.php @@ -17,7 +17,7 @@ class RatingSetEvent extends Event { } } -class Ratings extends SimpleExtension { +class Ratings extends Extension { public function onAdminBuilding(AdminBuildingEvent $event) { $this->theme->display_bulk_rater(); } diff --git a/contrib/regen_thumb/main.php b/contrib/regen_thumb/main.php index e5855976..11355330 100644 --- a/contrib/regen_thumb/main.php +++ b/contrib/regen_thumb/main.php @@ -12,7 +12,7 @@ * since been increased. */ -class RegenThumb extends SimpleExtension { +class RegenThumb extends Extension { public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page, $user; diff --git a/contrib/report_image/main.php b/contrib/report_image/main.php index 28c0e826..aa4290f8 100755 --- a/contrib/report_image/main.php +++ b/contrib/report_image/main.php @@ -29,7 +29,7 @@ class AddReportedImageEvent extends Event { } } -class ReportImage extends SimpleExtension { +class ReportImage extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_bool('report_image_show_thumbs', true); diff --git a/contrib/res_limit/main.php b/contrib/res_limit/main.php index 459faa90..b9657a17 100644 --- a/contrib/res_limit/main.php +++ b/contrib/res_limit/main.php @@ -5,7 +5,7 @@ * License: GPLv2 * Description: Allows the admin to set min / max image dimentions */ -class ResolutionLimit extends SimpleExtension { +class ResolutionLimit extends Extension { public function get_priority() {return 40;} // early, to veto ImageUploadEvent public function onImageAddition(ImageAdditionEvent $event) { diff --git a/contrib/resize/main.php b/contrib/resize/main.php index 60bc86b9..38075290 100644 --- a/contrib/resize/main.php +++ b/contrib/resize/main.php @@ -26,7 +26,7 @@ class ImageResizeException extends SCoreException { /** * This class handles image resize requests. */ -class ResizeImage extends SimpleExtension { +class ResizeImage extends Extension { public function onInitExt(InitExtEvent $event) { global $config; diff --git a/contrib/rss_comments/main.php b/contrib/rss_comments/main.php index 8c32bbbf..d7c02b87 100644 --- a/contrib/rss_comments/main.php +++ b/contrib/rss_comments/main.php @@ -6,7 +6,7 @@ * Description: Self explanatory */ -class RSS_Comments extends SimpleExtension { +class RSS_Comments extends Extension { public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; $title = $config->get_string('title'); diff --git a/contrib/rss_images/main.php b/contrib/rss_images/main.php index 675016e7..26924d62 100644 --- a/contrib/rss_images/main.php +++ b/contrib/rss_images/main.php @@ -6,7 +6,7 @@ * Description: Self explanatory */ -class RSS_Images extends SimpleExtension { +class RSS_Images extends Extension { public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; $title = $config->get_string('title'); diff --git a/contrib/shimmie_api/main.php b/contrib/shimmie_api/main.php index d7f3128f..b8b9bc0d 100644 --- a/contrib/shimmie_api/main.php +++ b/contrib/shimmie_api/main.php @@ -26,7 +26,7 @@ class _SafeImage { } } -class ShimmieApi extends SimpleExtension { +class ShimmieApi extends Extension { public function onPageRequest(PageRequestEvent $event) { global $database, $page; diff --git a/contrib/simpletest/main.php b/contrib/simpletest/main.php index f56d322a..38666898 100644 --- a/contrib/simpletest/main.php +++ b/contrib/simpletest/main.php @@ -205,7 +205,7 @@ class TestFinder extends TestSuite { } } -class SimpleSCoreTest extends SimpleExtension { +class SimpleSCoreTest extends Extension { public function onPageRequest(PageRequestEvent $event) { global $page; if($event->page_matches("test")) { diff --git a/contrib/site_description/main.php b/contrib/site_description/main.php index 43ed38b1..f2f7f57d 100644 --- a/contrib/site_description/main.php +++ b/contrib/site_description/main.php @@ -9,7 +9,7 @@ * This extension sets the "description" meta tag in the header * of pages so that search engines can pick it up */ -class SiteDescription extends SimpleExtension { +class SiteDescription extends Extension { public function onPageRequest(PageRequestEvent $event) { global $config, $page; if(strlen($config->get_string("site_description")) > 0) { diff --git a/contrib/sitemap/main.php b/contrib/sitemap/main.php index 8858bb9c..e481510f 100644 --- a/contrib/sitemap/main.php +++ b/contrib/sitemap/main.php @@ -7,7 +7,7 @@ * Documentation: */ -class XMLSitemap extends SimpleExtension { +class XMLSitemap extends Extension { public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("sitemap.xml")) { $images = Image::find_images(0, 50, array()); diff --git a/contrib/tag_editcloud/main.php b/contrib/tag_editcloud/main.php index 75819299..71dabc9e 100644 --- a/contrib/tag_editcloud/main.php +++ b/contrib/tag_editcloud/main.php @@ -12,7 +12,7 @@ * colorize used tags in cloud || always show used tags in front of cloud * theme junk */ -class TagEditCloud extends SimpleExtension { +class TagEditCloud extends Extension { public function onImageInfoBoxBuilding(ImageInfoBoxBuildingEvent $event) { global $config; diff --git a/contrib/tag_history/main.php b/contrib/tag_history/main.php index e83fd2c0..2a6d45ca 100644 --- a/contrib/tag_history/main.php +++ b/contrib/tag_history/main.php @@ -5,7 +5,7 @@ * Description: Keep a record of tag changes, and allows you to revert changes. */ -class Tag_History extends SimpleExtension { +class Tag_History extends Extension { // in before tags are actually set, so that "get current tags" works public function get_priority() {return 40;} diff --git a/contrib/tagger/main.php b/contrib/tagger/main.php index 3f2256f9..076457b6 100644 --- a/contrib/tagger/main.php +++ b/contrib/tagger/main.php @@ -6,7 +6,7 @@ * Do not remove this notice. */ -class Tagger extends SimpleExtension { +class Tagger extends Extension { public function onDisplayingImage(DisplayingImageEvent $event) { global $page, $config, $user; @@ -32,7 +32,7 @@ class Tagger extends SimpleExtension { } // Tagger AJAX back-end -class TaggerXML extends SimpleExtension { +class TaggerXML extends Extension { public function get_priority() {return 10;} public function onPageRequest(PageRequestEvent $event) { diff --git a/contrib/tips/main.php b/contrib/tips/main.php index bf6ced29..41cc7823 100644 --- a/contrib/tips/main.php +++ b/contrib/tips/main.php @@ -8,7 +8,7 @@ * Formatting is done with HTML */ -class Tips extends SimpleExtension { +class Tips extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; diff --git a/contrib/twitter_soc/main.php b/contrib/twitter_soc/main.php index 9f7bed06..90f60658 100644 --- a/contrib/twitter_soc/main.php +++ b/contrib/twitter_soc/main.php @@ -6,7 +6,7 @@ * Description: Show a twitter feed with the Sea of Clouds script */ -class TwitterSoc extends SimpleExtension { +class TwitterSoc extends Extension { public function onPostListBuilding(PostListBuildingEvent $event) { global $config, $page; if(strlen($config->get_string("twitter_soc_username")) > 0) { diff --git a/contrib/update/main.php b/contrib/update/main.php index a2ac7ad6..3a2f9a11 100644 --- a/contrib/update/main.php +++ b/contrib/update/main.php @@ -6,7 +6,7 @@ * License: GPLv2 * Description: Shimmie updater! */ -class Update extends SimpleExtension { +class Update extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string("update_url", "http://nodeload.github.com/shish/shimmie2/zipball/master"); //best to avoid using https diff --git a/contrib/wiki/main.php b/contrib/wiki/main.php index 9b5df534..ff7da165 100644 --- a/contrib/wiki/main.php +++ b/contrib/wiki/main.php @@ -53,7 +53,7 @@ class WikiPage { } } -class Wiki extends SimpleExtension { +class Wiki extends Extension { public function onInitExt(InitExtEvent $event) { global $database; global $config; diff --git a/contrib/word_filter/main.php b/contrib/word_filter/main.php index 5e9e8acb..df13e73f 100644 --- a/contrib/word_filter/main.php +++ b/contrib/word_filter/main.php @@ -6,7 +6,7 @@ * Description: Simple search and replace */ -class WordFilter extends SimpleExtension { +class WordFilter extends Extension { // before emoticon filter public function get_priority() {return 40;} diff --git a/core/extension.class.php b/core/extension.class.php index b54956de..6798df29 100644 --- a/core/extension.class.php +++ b/core/extension.class.php @@ -13,20 +13,14 @@ * $formatted_text = $tfe->formatted; * \endcode * - * An extension is something which is capable of reacting to events. They - * register themselves using the add_event_listener() function, after which - * events will be sent to the object's recieve_event() function. - * - * SimpleExtension subclasses are slightly different -- they are registered - * automatically, and events are sent to a named method, eg PageRequestEvent - * will be sent to onPageRequest() + * An extension is something which is capable of reacting to events. * * * \page hello The Hello World Extension * * \code * // ext/hello/main.php - * public class Hello extends SimpleExtension { + * public class Hello extends Extension { * public void onPageRequest(PageRequestEvent $event) { * global $page, $user; * $this->theme->display_hello($page, $user); @@ -62,33 +56,17 @@ * */ -/** - * A generic extension class, for subclassing - */ -interface Extension { - public function receive_event(Event $event); - public function get_priority(); -} - /** * send_event(BlahEvent()) -> onBlah($event) * * Also loads the theme object into $this->theme if available * - * index.php will load all SimpleExtension subclasses, - * so no need for register_extension(new Foo()) - * - * Automatic registration is done with priority returned by get_priority() - * - * Hopefully this removes as much copy & paste code from the extension - * files as possible~ - * - * The original concept came from Artanis's SimpleExtension extension + * The original concept came from Artanis's Extension extension * --> http://github.com/Artanis/simple-extension/tree/master * Then re-implemented by Shish after he broke the forum and couldn't * find the thread where the original was posted >_< */ -abstract class SimpleExtension implements Extension { +abstract class Extension { var $theme; var $_child; @@ -100,15 +78,6 @@ abstract class SimpleExtension implements Extension { if(is_null($this->theme)) $this->theme = get_theme_object($child, false); } - public function receive_event(Event $event) { - $name = get_class($event); - // this is rather clever.. - $name = "on".str_replace("Event", "", $name); - if(method_exists($this->_child, $name)) { - $this->_child->$name($event); - } - } - public function get_priority() { return 50; } @@ -117,7 +86,7 @@ abstract class SimpleExtension implements Extension { /** * Several extensions have this in common, make a common API */ -abstract class FormatterExtension extends SimpleExtension { +abstract class FormatterExtension extends Extension { public function onTextFormatting(TextFormattingEvent $event) { $event->formatted = $this->format($event->formatted); $event->stripped = $this->strip($event->stripped); @@ -131,7 +100,7 @@ abstract class FormatterExtension extends SimpleExtension { * This too is a common class of extension with many methods in common, * so we have a base class to extend from */ -abstract class DataHandlerExtension extends SimpleExtension { +abstract class DataHandlerExtension extends Extension { public function onDataUpload(DataUploadEvent $event) { if($this->supported_ext($event->type) && $this->check_contents($event->tmpname)) { if(!move_upload_to_archive($event)) return; diff --git a/core/util.inc.php b/core/util.inc.php index 3529fb87..43197f5c 100644 --- a/core/util.inc.php +++ b/core/util.inc.php @@ -824,6 +824,7 @@ $_event_count = 0; function send_event(Event $event) { global $_event_listeners, $_event_count; if(!isset($_event_listeners[get_class($event)])) return; + $method_name = "on".str_replace("Event", "", get_class($event)); ctx_log_start(get_class($event)); // SHIT: http://bugs.php.net/bug.php?id=35106 @@ -831,7 +832,7 @@ function send_event(Event $event) { ksort($my_event_listeners); foreach($my_event_listeners as $listener) { ctx_log_start(get_class($listener)); - $listener->receive_event($event); + $listener->$method_name($event); ctx_log_endok(); } $_event_count++; @@ -1001,7 +1002,7 @@ function _load_extensions() { if($rclass->isAbstract()) { // don't do anything } - elseif(is_subclass_of($class, "SimpleExtension")) { + elseif(is_subclass_of($class, "Extension")) { $c = new $class(); $c->i_am($c); $my_events = array(); @@ -1012,10 +1013,6 @@ function _load_extensions() { } add_event_listener($c, $c->get_priority(), $my_events); } - elseif(is_subclass_of($class, "Extension")) { - $c = new $class(); - add_event_listener($c, $c->get_priority(), $all_events); - } } if(COMPILE_ELS) { @@ -1024,13 +1021,10 @@ function _load_extensions() { foreach(get_declared_classes() as $class) { $rclass = new ReflectionClass($class); if($rclass->isAbstract()) {} - elseif(is_subclass_of($class, "SimpleExtension")) { + elseif(is_subclass_of($class, "Extension")) { $p .= "\$$class = new $class(); "; $p .= "\${$class}->i_am(\$$class);\n"; } - elseif(is_subclass_of($class, "Extension")) { - $p .= "\$$class = new $class();\n"; - } } $p .= "\$_event_listeners = array(\n"; diff --git a/ext/alias_editor/main.php b/ext/alias_editor/main.php index 7a246144..cfbf1777 100755 --- a/ext/alias_editor/main.php +++ b/ext/alias_editor/main.php @@ -22,7 +22,7 @@ class AddAliasEvent extends Event { class AddAliasException extends SCoreException {} -class AliasEditor extends SimpleExtension { +class AliasEditor extends Extension { public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page, $user; diff --git a/ext/comment/main.php b/ext/comment/main.php index b64a8984..451cbd51 100644 --- a/ext/comment/main.php +++ b/ext/comment/main.php @@ -60,7 +60,7 @@ class Comment { } } -class CommentList extends SimpleExtension { +class CommentList extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; $config->set_default_bool('comment_anon', true); diff --git a/ext/ext_manager/main.php b/ext/ext_manager/main.php index 3500401c..911274e5 100644 --- a/ext/ext_manager/main.php +++ b/ext/ext_manager/main.php @@ -87,7 +87,7 @@ class ExtensionInfo { } } -class ExtManager extends SimpleExtension { +class ExtManager extends Extension { public function onPageRequest(PageRequestEvent $event) { global $page, $user; if($event->page_matches("ext_manager")) { diff --git a/ext/handle_404/main.php b/ext/handle_404/main.php index b7e80aa0..ed01cec1 100644 --- a/ext/handle_404/main.php +++ b/ext/handle_404/main.php @@ -8,7 +8,7 @@ * Description: Shows an error message when the user views a page with no content */ -class Handle404 extends SimpleExtension { +class Handle404 extends Extension { public function onPageRequest(PageRequestEvent $event) { global $page; // hax. diff --git a/ext/image/main.php b/ext/image/main.php index d0288131..b6d842b0 100644 --- a/ext/image/main.php +++ b/ext/image/main.php @@ -129,7 +129,7 @@ class ParseLinkTemplateEvent extends Event { /** * A class to handle adding / getting / removing image files from the disk. */ -class ImageIO extends SimpleExtension { +class ImageIO extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_int('thumb_width', 192); diff --git a/ext/index/main.php b/ext/index/main.php index 14a0ac5c..3494edef 100644 --- a/ext/index/main.php +++ b/ext/index/main.php @@ -128,7 +128,7 @@ class PostListBuildingEvent extends Event { } } -class Index extends SimpleExtension { +class Index extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_int("index_width", 3); diff --git a/ext/mail/main.php b/ext/mail/main.php index 9bf09169..fb3aec97 100644 --- a/ext/mail/main.php +++ b/ext/mail/main.php @@ -7,7 +7,7 @@ * Description: Provides an interface for sending and receiving mail. */ -class Mail extends SimpleExtension { +class Mail extends Extension { public function onSetupBuilding(SetupBuildingEvent $event) { $sb = new SetupBlock("Mailing Options"); $sb->add_text_option("mail_sub", "<br>Subject prefix: "); @@ -26,7 +26,7 @@ class Mail extends SimpleExtension { $config->set_default_string("mail_fot", "<a href='".make_http(make_link())."'>".$config->get_string("site_title")."</a>"); } } -class MailTest extends SimpleExtension { +class MailTest extends Extension { public function onPageRequest(PageRequestEvent $event) { if($event->page_matches("mail/test")) { global $page; diff --git a/ext/setup/main.php b/ext/setup/main.php index 4e5b950a..40551e5c 100644 --- a/ext/setup/main.php +++ b/ext/setup/main.php @@ -161,7 +161,7 @@ class SetupBlock extends Block { } // }}} -class Setup extends SimpleExtension { +class Setup extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_string("title", "Shimmie"); diff --git a/ext/tag_edit/main.php b/ext/tag_edit/main.php index 184a5dba..bdae3ec0 100644 --- a/ext/tag_edit/main.php +++ b/ext/tag_edit/main.php @@ -55,7 +55,7 @@ class LockSetEvent extends Event { } } -class TagEdit extends SimpleExtension { +class TagEdit extends Extension { public function onPageRequest(PageRequestEvent $event) { global $user, $page; if($event->page_matches("tag_edit")) { diff --git a/ext/tag_list/main.php b/ext/tag_list/main.php index c30aacb6..d21de882 100644 --- a/ext/tag_list/main.php +++ b/ext/tag_list/main.php @@ -5,7 +5,7 @@ * Description: Show the tags in various ways */ -class TagList extends SimpleExtension { +class TagList extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_int("tag_list_length", 15); diff --git a/ext/upgrade/main.php b/ext/upgrade/main.php index 35854e1d..0ddc9401 100644 --- a/ext/upgrade/main.php +++ b/ext/upgrade/main.php @@ -6,7 +6,7 @@ * Visibility: admin */ -class Upgrade extends SimpleExtension { +class Upgrade extends Extension { public function onInitExt(InitExtEvent $event) { global $config, $database; diff --git a/ext/upload/main.php b/ext/upload/main.php index 938a27fa..ae719f4e 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -41,7 +41,7 @@ class UploadException extends SCoreException {} * All files that are uploaded to the site are handled through this class. * This also includes transloaded files as well. */ -class Upload extends SimpleExtension { +class Upload extends Extension { // early, so it can stop the DataUploadEvent before any data handlers see it public function get_priority() {return 40;} diff --git a/ext/user/main.php b/ext/user/main.php index 678b5b9c..96f5ac69 100644 --- a/ext/user/main.php +++ b/ext/user/main.php @@ -42,7 +42,7 @@ class UserCreationEvent extends Event { class UserCreationException extends SCoreException {} -class UserPage extends SimpleExtension { +class UserPage extends Extension { public function onInitExt(InitExtEvent $event) { global $config; $config->set_default_bool("login_signup_enabled", true); diff --git a/ext/view/main.php b/ext/view/main.php index 3fa700f6..4c4eb074 100644 --- a/ext/view/main.php +++ b/ext/view/main.php @@ -66,7 +66,7 @@ class ImageAdminBlockBuildingEvent extends Event { } } -class ViewImage extends SimpleExtension { +class ViewImage extends Extension { public function onPageRequest(PageRequestEvent $event) { global $page, $user;