diff options
| author | Nathan Kinkade <nkinkade@nkinka.de> | 2010-09-01 17:40:01 +0000 | 
|---|---|---|
| committer | Nathan Kinkade <nkinkade@nkinka.de> | 2010-09-01 17:40:01 +0000 | 
| commit | 538df03dd14f93419209ef61107a674575828e25 (patch) | |
| tree | f5874b59fa616d538abaf08f9c9bf61724788bba /modules | |
| parent | 940f9330efca76c84e7a645cafc93acd2751a225 (diff) | |
| parent | 78c590ebaee738435260e3b0bf6cb8fb5431a08d (diff) | |
Manually merged changes to .htaccess file resolving conflicts due to my changes of the file.
Diffstat (limited to 'modules')
41 files changed, 384 insertions, 448 deletions
| diff --git a/modules/comment/helpers/comment.php b/modules/comment/helpers/comment.php index 92a286c7..7aa007cb 100644 --- a/modules/comment/helpers/comment.php +++ b/modules/comment/helpers/comment.php @@ -45,6 +45,7 @@ class comment_Core {        ->error_messages("required", t("You must enter a comment"));      $group->hidden("item_id")->value($item->id);      module::event("comment_add_form", $form); +    module::event("captcha_protect_form", $form);      $group->submit("")->value(t("Add"))->class("ui-state-default ui-corner-all");      return $form; diff --git a/modules/g2_import/controllers/g2.php b/modules/g2_import/controllers/g2.php index 2c6ad1b4..d260c9b4 100644 --- a/modules/g2_import/controllers/g2.php +++ b/modules/g2_import/controllers/g2.php @@ -35,12 +35,9 @@ class G2_Controller extends Controller {      $id = $input->get("g2_itemId");      if ($id) { -      // Requests by id are either core.DownloadItem or -      // core.ShowItem requests. -      // Later versions of Gallery 2 don't specify g2_view if -      // it's the default (core.ShowItem). -      // And in some cases (bbcode, embedding) people are using -      // the id style URLs although URL rewriting is enabled. +      // Requests by id are either core.DownloadItem or core.ShowItem requests. Later versions of +      // Gallery 2 don't specify g2_view if it's the default (core.ShowItem). And in some cases +      // (bbcode, embedding) people are using the id style URLs although URL rewriting is enabled.        $where = array(array("g2_id", "=", $id));        $view = $input->get("g2_view");        if ($view) { diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php index f2e9dad9..c3737f8f 100644 --- a/modules/g2_import/helpers/g2_import.php +++ b/modules/g2_import/helpers/g2_import.php @@ -178,7 +178,17 @@ class g2_import_Core {             "module", "rewrite", "modrewrite.embeddedLocation", $g2_embed_location));        g2($gallery->getStorage()->checkPoint());      } -    self::$g2_base_url = $g2_embed_location; + +    if ($g2_embed_location) { +      self::$g2_base_url = $g2_embed_location; +    } else { +      self::$g2_base_url = $GLOBALS["gallery"]->getUrlGenerator()->generateUrl( +        array(), +        array("forceSessionId" => false, +              "htmlEntities" => false, +              "urlEncode" => false, +              "useAuthToken" => false)); +    }      return true;    } @@ -689,8 +699,7 @@ class g2_import_Core {          $title = $g2_item->getTitle();          $title or $title = $g2_item->getPathComponent();          $messages[] = -          t("<a href=\"%g2_url\">%title</a> from Gallery 2 could not be processed; " . -            "(imported as <a href=\"%g3_url\">%title</a>)", +          t("<a href=\"%g2_url\">%title</a> from Gallery 2 could not be processed; (imported as <a href=\"%g3_url\">%title</a>)",              array("g2_url" => $g2_item_url,                    "g3_url" => $item->url(),                    "title" => $title)); @@ -846,6 +855,11 @@ class g2_import_Core {                 array("id" => $g2_comment_id, "exception" => (string)$e));      } +    if (self::map($g2_comment->getId())) { +      // Already imported +      return; +    } +      $item_id = self::map($g2_comment->getParentId());      if (empty($item_id)) {        // Item was not mapped. @@ -878,6 +892,8 @@ class g2_import_Core {            $e);      } +    self::set_map($g2_comment->getId(), $comment->id, "comment"); +      // Backdate the creation date.  We can't do this at creation time because      // Comment_Model::save() will override it.      db::update("comments") diff --git a/modules/gallery/config/cookie.php b/modules/gallery/config/cookie.php index ded3bdaa..7f6ea265 100644 --- a/modules/gallery/config/cookie.php +++ b/modules/gallery/config/cookie.php @@ -37,10 +37,9 @@ $config['path'] = '/';  $config['expire'] = 0;  /** - * Enable this option to only allow the cookie to be read when using the a - * secure protocol. + * Set the secure bit on the cookie if we're using HTTPS.   */ -$config['secure'] = false; +$config['secure'] = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on';  /**   * Enable this option to disable the cookie from being accessed when using a diff --git a/modules/gallery/config/sendmail.php b/modules/gallery/config/sendmail.php deleted file mode 100644 index 65b1d59b..00000000 --- a/modules/gallery/config/sendmail.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php defined("SYSPATH") or die("No direct script access."); -/** - * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA. - */ -/** - * PHP Mail Configuration parameters - * from        => email address that appears as the from address - * line-length => word wrap length (PHP documentations suggest no larger tha 70 characters - * reply-to    => what goes into the reply to header - */ -$config["from"] = "admin@gallery3.com"; -$config["line_length"] = 70; -$config["reply_to"] = "public@gallery3.com"; -$config["header_separator"] = "\n"; diff --git a/modules/gallery/controllers/admin_theme_options.php b/modules/gallery/controllers/admin_theme_options.php index 15a42ee5..57f32f96 100644 --- a/modules/gallery/controllers/admin_theme_options.php +++ b/modules/gallery/controllers/admin_theme_options.php @@ -22,14 +22,14 @@ class Admin_Theme_Options_Controller extends Admin_Controller {      $view = new Admin_View("admin.html");      $view->page_title = t("Theme options");      $view->content = new View("admin_theme_options.html"); -    $view->content->form = theme::get_edit_form_admin(); +    $view->content->form = $this->_get_edit_form_admin();      print $view;    }    public function save() {      access::verify_csrf(); -    $form = theme::get_edit_form_admin(); +    $form = $this->_get_edit_form_admin();      if ($form->validate()) {        module::set_var("gallery", "page_size", $form->edit_theme->page_size->value); @@ -58,6 +58,7 @@ class Admin_Theme_Options_Controller extends Admin_Controller {        module::set_var("gallery", "header_text", $form->edit_theme->header_text->value);        module::set_var("gallery", "footer_text", $form->edit_theme->footer_text->value);        module::set_var("gallery", "show_credits", $form->edit_theme->show_credits->value); +      module::set_var("gallery", "favicon_url", $form->edit_theme->favicon_url->value);        module::event("theme_edit_form_completed", $form); @@ -70,5 +71,40 @@ class Admin_Theme_Options_Controller extends Admin_Controller {        print $view;      }    } + +  private function _get_edit_form_admin() { +    $form = new Forge("admin/theme_options/save/", "", null, array("id" =>"g-theme-options-form")); +    $group = $form->group("edit_theme")->label(t("Theme layout")); +    $group->input("page_size")->label(t("Items per page"))->id("g-page-size") +      ->rules("required|valid_digit") +      ->error_messages("required", t("You must enter a number")) +      ->error_messages("valid_digit", t("You must enter a number")) +      ->value(module::get_var("gallery", "page_size")); +    $group->input("thumb_size")->label(t("Thumbnail size (in pixels)"))->id("g-thumb-size") +      ->rules("required|valid_digit") +      ->error_messages("required", t("You must enter a number")) +      ->error_messages("valid_digit", t("You must enter a number")) +      ->value(module::get_var("gallery", "thumb_size")); +    $group->input("resize_size")->label(t("Resized image size (in pixels)"))->id("g-resize-size") +      ->rules("required|valid_digit") +      ->error_messages("required", t("You must enter a number")) +      ->error_messages("valid_digit", t("You must enter a number")) +      ->value(module::get_var("gallery", "resize_size")); +    $group->input("favicon_url")->label(t("URL (or relative path) to your favicon.ico")) +      ->id("g-favicon") +      ->value(module::get_var("gallery", "favicon_url")); +    $group->textarea("header_text")->label(t("Header text"))->id("g-header-text") +      ->value(module::get_var("gallery", "header_text")); +    $group->textarea("footer_text")->label(t("Footer text"))->id("g-footer-text") +      ->value(module::get_var("gallery", "footer_text")); +    $group->checkbox("show_credits")->label(t("Show site credits"))->id("g-footer-text") +      ->checked(module::get_var("gallery", "show_credits")); + +    module::event("theme_edit_form", $form); + +    $group = $form->group("buttons"); +    $group->submit("")->value(t("Save")); +    return $form; +  }  } diff --git a/modules/gallery/controllers/albums.php b/modules/gallery/controllers/albums.php index fb7d5c59..b0887195 100644 --- a/modules/gallery/controllers/albums.php +++ b/modules/gallery/controllers/albums.php @@ -68,7 +68,7 @@ class Albums_Controller extends Items_Controller {      $template->set_global("item", $album);      $template->set_global("children", $album->viewable()->children($page_size, $offset));      $template->set_global("children_count", $children_count); -    $template->set_global("parents", $album->parents()); +    $template->set_global("parents", $album->parents()->as_array()); // view calls empty() on this      $template->content = new View("album.html");      // We can't use math in ORM or the query builder, so do this by hand.  It's important diff --git a/modules/gallery/controllers/move.php b/modules/gallery/controllers/move.php deleted file mode 100644 index 7b2d6165..00000000 --- a/modules/gallery/controllers/move.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php defined("SYSPATH") or die("No direct script access."); -/** - * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA. - */ -class Move_Controller extends Controller { -  public function browse($source_id) { -    $source = ORM::factory("item", $source_id); -    access::required("view", $source); -    access::required("edit", $source); - -    $view = new View("move_browse.html"); -    $view->source = $source; -    $view->tree = $this->_get_tree_html($source, ORM::factory("item", 1)); -    print $view; -  } - -  public function save($source_id) { -    access::verify_csrf(); -    $source = ORM::factory("item", $source_id); -    $target = ORM::factory("item", Input::instance()->post("target_id")); - -    access::required("view", $source); -    access::required("edit", $source); -    access::required("view", $target); -    access::required("edit", $target); - -    item::move($source, $target); - -    json::reply(array("result" => "success", "location" => $target->url())); -  } - -  public function show_sub_tree($source_id, $target_id) { -    $source = ORM::factory("item", $source_id); -    $target = ORM::factory("item", $target_id); -    access::required("view", $source); -    access::required("edit", $source); -    access::required("view", $target); -    // show targets even if they're not editable because they may contain children which *are* -    // editable - -    print $this->_get_tree_html($source, $target); -  } - -  private function _get_tree_html($source, $target) { -    $view = new View("move_tree.html"); -    $view->source = $source; -    $view->parent = $target; -    $view->children = ORM::factory("item") -      ->viewable() -      ->where("type", "=", "album") -      ->where("parent_id", "=", $target->id) -      ->find_all(); -    return $view; -  } - -} diff --git a/modules/gallery/controllers/movies.php b/modules/gallery/controllers/movies.php index 02d2a497..717eb8aa 100644 --- a/modules/gallery/controllers/movies.php +++ b/modules/gallery/controllers/movies.php @@ -41,7 +41,7 @@ class Movies_Controller extends Items_Controller {      $template->set_global("item", $movie);      $template->set_global("children", array());      $template->set_global("children_count", 0); -    $template->set_global("parents", $movie->parents()); +    $template->set_global("parents", $movie->parents()->as_array());      $template->set_global("next_item", $next_item);      $template->set_global("previous_item", $previous_item);      $template->set_global("sibling_count", $movie->parent()->viewable()->children_count($where)); diff --git a/modules/gallery/controllers/photos.php b/modules/gallery/controllers/photos.php index 8377e6c7..b22ac8e5 100644 --- a/modules/gallery/controllers/photos.php +++ b/modules/gallery/controllers/photos.php @@ -41,7 +41,7 @@ class Photos_Controller extends Items_Controller {      $template->set_global("item", $photo);      $template->set_global("children", array());      $template->set_global("children_count", 0); -    $template->set_global("parents", $photo->parents()); +    $template->set_global("parents", $photo->parents()->as_array());      $template->set_global("next_item", $next_item);      $template->set_global("previous_item", $previous_item);      $template->set_global("sibling_count", $photo->parent()->viewable()->children_count($where)); diff --git a/modules/gallery/controllers/uploader.php b/modules/gallery/controllers/uploader.php index 85d344d6..fb496f60 100644 --- a/modules/gallery/controllers/uploader.php +++ b/modules/gallery/controllers/uploader.php @@ -102,6 +102,14 @@ class Uploader_Controller extends Controller {      }    } +  public function status($success_count, $error_count) { +    // The "errors" won't be properly pluralized :-/ +    print t2("Uploaded %count photo (%error errors)", +             "Uploaded %count photos (%error errors)", +             $success_count, +             array("error" => $error_count)); +  } +    public function finish() {      access::verify_csrf(); diff --git a/modules/gallery/css/gallery.css b/modules/gallery/css/gallery.css index fb72bd48..275a3d7d 100644 --- a/modules/gallery/css/gallery.css +++ b/modules/gallery/css/gallery.css @@ -78,6 +78,10 @@    margin-bottom: 0  } +#g-add-photos-status-message { +  float: right; +} +  /* Permissions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */  #g-edit-permissions-form { @@ -196,3 +200,7 @@  .rtl #g-translations ol {    margin: 0 2em 1em 0;  } + +.rtl #g-add-photos-status-message { +  float: left; +} diff --git a/modules/gallery/helpers/gallery_event.php b/modules/gallery/helpers/gallery_event.php index e048118b..df5394c9 100644 --- a/modules/gallery/helpers/gallery_event.php +++ b/modules/gallery/helpers/gallery_event.php @@ -447,7 +447,6 @@ class gallery_event_Core {          break;        }        $cover_title = t("Choose as the album cover"); -      $move_title = t("Move to another album");        $csrf = access::csrf_token(); @@ -478,17 +477,6 @@ class gallery_event_Core {              ->url(url::site("quick/rotate/$item->id/cw?csrf=$csrf&from_id={$theme_item->id}&page_type=$page_type")));        } -      // @todo Don't move photos from the photo page; we don't yet have a good way of redirecting -      // after move -      if ($theme->page_subtype() == "album") { -        $options_menu -          ->append(Menu::factory("dialog") -                   ->id("move") -                   ->label($move_title) -                   ->css_class("ui-icon-folder-open") -                   ->url(url::site("move/browse/$item->id"))); -      } -        $parent = $item->parent();        if (access::can("edit", $parent)) {          // We can't make this item the highlight if it's an album with no album cover, or if it's diff --git a/modules/gallery/helpers/gallery_installer.php b/modules/gallery/helpers/gallery_installer.php index 569c5118..d5264fcc 100644 --- a/modules/gallery/helpers/gallery_installer.php +++ b/modules/gallery/helpers/gallery_installer.php @@ -300,7 +300,16 @@ class gallery_installer {      module::set_var("gallery", "simultaneous_upload_limit", 5);      module::set_var("gallery", "admin_area_timeout", 90 * 60);      module::set_var("gallery", "maintenance_mode", 0); -    module::set_version("gallery", 34); +    module::set_var("gallery", "visible_title_length", 15); +    module::set_var("gallery", "favicon_url", "lib/images/favicon.ico"); + +    // Sendmail configuration +    module::set_var("gallery", "email_from", "admin@example.com"); +    module::set_var("gallery", "email_reply_to", "public@example.com"); +    module::set_var("gallery", "email_line_length", 70); +    module::set_var("gallery", "email_header_separator", serialize("\n")); + +    module::set_version("gallery", 37);    }    static function upgrade($version) { @@ -584,6 +593,24 @@ class gallery_installer {        $db->query("ALTER TABLE {access_caches} ADD KEY (`item_id`)");        module::set_version("gallery", $version = 34);      } + +    if ($version == 34) { +      module::set_var("gallery", "visible_title_length", 15); +      module::set_version("gallery", $version = 35); +    } + +    if ($version == 35) { +      module::set_var("gallery", "favicon_url", "lib/images/favicon.ico"); +      module::set_version("gallery", $version = 36); +    } + +    if ($version == 36) { +      module::set_var("gallery", "email_from", "admin@example.com"); +      module::set_var("gallery", "email_reply_to", "public@example.com"); +      module::set_var("gallery", "email_line_length", 70); +      module::set_var("gallery", "email_header_separator", serialize("\n")); +      module::set_version("gallery", $version = 37); +    }    }    static function uninstall() { diff --git a/modules/gallery/helpers/gallery_task.php b/modules/gallery/helpers/gallery_task.php index 6a1fc28a..0886aad0 100644 --- a/modules/gallery/helpers/gallery_task.php +++ b/modules/gallery/helpers/gallery_task.php @@ -58,8 +58,7 @@ class gallery_task_Core {      $tasks[] = Task_Definition::factory()        ->callback("gallery_task::fix")        ->name(t("Fix your Gallery")) -      ->description(t("Fix a variety of problems that might cause your Gallery to act " . -                      "strangely.  Requires maintenance mode.")) +      ->description(t("Fix a variety of problems that might cause your Gallery to act strangely.  Requires maintenance mode."))        ->severity(log::SUCCESS);      return $tasks; diff --git a/modules/gallery/helpers/graphics.php b/modules/gallery/helpers/graphics.php index cc4d2e76..bb085ea5 100644 --- a/modules/gallery/helpers/graphics.php +++ b/modules/gallery/helpers/graphics.php @@ -338,8 +338,7 @@ class graphics_Core {          } else {            $toolkits->imagemagick->installed = false;            $toolkits->imagemagick->error = -            t("ImageMagick is installed, but PHP's open_basedir restriction " . -              "prevents Gallery from using it."); +            t("ImageMagick is installed, but PHP's open_basedir restriction prevents Gallery from using it.");          }        } else {          $toolkits->imagemagick->installed = false; @@ -363,8 +362,7 @@ class graphics_Core {          } else {            $toolkits->graphicsmagick->installed = false;            $toolkits->graphicsmagick->error = -            t("GraphicsMagick is installed, but PHP's open_basedir restriction " . -              "prevents Gallery from using it."); +            t("GraphicsMagick is installed, but PHP's open_basedir restriction prevents Gallery from using it.");          }        } else {          $toolkits->graphicsmagick->installed = false; diff --git a/modules/gallery/helpers/l10n_scanner.php b/modules/gallery/helpers/l10n_scanner.php index 2287a7ba..843c74f7 100644 --- a/modules/gallery/helpers/l10n_scanner.php +++ b/modules/gallery/helpers/l10n_scanner.php @@ -74,10 +74,21 @@ class l10n_scanner_Core {      unset($raw_tokens);      if (!empty($func_token_list["t"])) { -      l10n_scanner::_parse_t_calls($tokens, $func_token_list["t"], $cache); +      $errors = l10n_scanner::_parse_t_calls($tokens, $func_token_list["t"], $cache); +      foreach ($errors as $line => $error) { +        Kohana_Log::add( +          "error", "Translation scanner error.  " . +          "file: " . substr($file, strlen(DOCROOT)) . ", line: $line, context: $error"); +      }      } +      if (!empty($func_token_list["t2"])) { -      l10n_scanner::_parse_plural_calls($tokens, $func_token_list["t2"], $cache); +      $errors = l10n_scanner::_parse_plural_calls($tokens, $func_token_list["t2"], $cache); +      foreach ($errors as $line => $error) { +        Kohana_Log::add( +          "error", "Translation scanner error.  " . +          "file: " . substr($file, strlen(DOCROOT)) . ", line: $line, context: $error"); +      }      }    } @@ -91,6 +102,7 @@ class l10n_scanner_Core {    }    private static function _parse_t_calls(&$tokens, &$call_list, &$cache) { +    $errors = array();      foreach ($call_list as $index) {        $function_name = $tokens[$index++];        $parens = $tokens[$index++]; @@ -103,14 +115,21 @@ class l10n_scanner_Core {            $message = self::_escape_quoted_string($first_param[1]);            l10n_scanner::process_message($message, $cache);          } else { -          // t() found, but inside is something which is not a string literal. -          // @todo Call status callback with error filename/line. +          if (is_array($first_param) && ($first_param[0] == T_CONSTANT_ENCAPSED_STRING)) { +            // Malformed string literals; escalate this +            $errors[$first_param[2]] = +              var_export(array($function_name, $parens, $first_param, $next_token), 1); +          } else { +            // t() found, but inside is something which is not a string literal.  That's fine. +          }          }        }      } +    return $errors;    }    private static function _parse_plural_calls(&$tokens, &$call_list, &$cache) { +    $errors = array();      foreach ($call_list as $index) {        $function_name = $tokens[$index++];        $parens = $tokens[$index++]; @@ -127,11 +146,17 @@ class l10n_scanner_Core {            $plural = self::_escape_quoted_string($second_param[1]);            l10n_scanner::process_message(array("one" => $singular, "other" => $plural), $cache);          } else { -          // t2() found, but inside is something which is not a string literal. -          // @todo Call status callback with error filename/line. +          if (is_array($first_param) && $first_param[0] == T_CONSTANT_ENCAPSED_STRING) { +            $errors[$first_param[2]] = var_export( +              array($function_name, $parens, $first_param, +                    $first_separator, $second_param, $next_token), 1); +          } else { +            // t2() found, but inside is something which is not a string literal.  That's fine. +          }          }        }      } +    return $errors;    }    /** diff --git a/modules/gallery/helpers/movie.php b/modules/gallery/helpers/movie.php index 4ff29a7b..3e55eefe 100644 --- a/modules/gallery/helpers/movie.php +++ b/modules/gallery/helpers/movie.php @@ -84,7 +84,7 @@ class movie_Core {    }    static function find_ffmpeg() { -    if (!$ffmpeg_path = module::get_var("gallery", "ffmpeg_path")) { +    if (!($ffmpeg_path = module::get_var("gallery", "ffmpeg_path")) || !file_exists($ffmpeg_path)) {        $graphics_path = module::get_var("gallery", "graphics_toolkit_path", null);        putenv("PATH=" . getenv("PATH") . (empty($graphics_path) ? "" : ":$graphics_path") . diff --git a/modules/gallery/helpers/theme.php b/modules/gallery/helpers/theme.php index 9df3eaf2..1dc1f3b6 100644 --- a/modules/gallery/helpers/theme.php +++ b/modules/gallery/helpers/theme.php @@ -77,39 +77,6 @@ class theme_Core {      $config->set("core.modules", $modules);    } -  static function get_edit_form_admin() { -    $form = new Forge("admin/theme_options/save/", "", null, array("id" =>"g-theme-options-form")); -    $group = $form->group("edit_theme")->label(t("Theme layout")); -    $group->input("page_size")->label(t("Items per page"))->id("g-page-size") -      ->rules("required|valid_digit") -      ->error_messages("required", t("You must enter a number")) -      ->error_messages("valid_digit", t("You must enter a number")) -      ->value(module::get_var("gallery", "page_size")); -    $group->input("thumb_size")->label(t("Thumbnail size (in pixels)"))->id("g-thumb-size") -      ->rules("required|valid_digit") -      ->error_messages("required", t("You must enter a number")) -      ->error_messages("valid_digit", t("You must enter a number")) -      ->value(module::get_var("gallery", "thumb_size")); -    $group->input("resize_size")->label(t("Resized image size (in pixels)"))->id("g-resize-size") -      ->rules("required|valid_digit") -      ->error_messages("required", t("You must enter a number")) -      ->error_messages("valid_digit", t("You must enter a number")) -      ->value(module::get_var("gallery", "resize_size")); -    $group->textarea("header_text")->label(t("Header text"))->id("g-header-text") -      ->value(module::get_var("gallery", "header_text")); -    $group->textarea("footer_text")->label(t("Footer text"))->id("g-footer-text") -      ->value(module::get_var("gallery", "footer_text")); -    $group->checkbox("show_credits")->label(t("Show site credits"))->id("g-footer-text") -      ->checked(module::get_var("gallery", "show_credits")); - -    module::event("theme_edit_form", $form); - -    $group = $form->group("buttons") -      ->set_attr("style","border: none"); -    $group->submit("")->value(t("Save")); -    return $form; -  } -    static function get_info($theme_name) {      $theme_name = preg_replace("/[^a-zA-Z0-9\._-]/", "", $theme_name);      $file = THEMEPATH . "$theme_name/theme.info"; diff --git a/modules/gallery/helpers/user_profile.php b/modules/gallery/helpers/user_profile.php index e5ebce84..d9cc8ace 100644 --- a/modules/gallery/helpers/user_profile.php +++ b/modules/gallery/helpers/user_profile.php @@ -35,19 +35,20 @@ class user_profile_Core {      $group->input("reply_to")        ->label(t("From:"))        ->rules("required|length[1, 256]|valid_email") -      ->error_messages("required", t("Field is required")) -      ->error_messages("max_length", t("Field exceeds 256 bytes")) -      ->error_messages("valid_email", t("Field is not a valid email address")); +      ->error_messages("required", t("You must enter a valid email address")) +      ->error_messages("max_length", t("Your email address is too long")) +      ->error_messages("valid_email", t("You must enter a valid email address"));      $group->input("subject")        ->label(t("Subject:"))        ->rules("required|length[1, 256]") -      ->error_messages("required", t("Field is required")) -      ->error_messages("max_length", t("Field exceeds 256 bytes")); +      ->error_messages("required", t("Your message must have a subject")) +      ->error_messages("max_length", t("Your subject is too long"));      $group->textarea("message")        ->label(t("Message:"))        ->rules("required") -      ->error_messages("required", t("Field is required")); +      ->error_messages("required", t("You must enter a message"));      module::event("user_profile_contact_form", $form); +    module::event("captcha_protect_form", $form);      $group->submit("")->value(t("Send"));      return $form;    } diff --git a/modules/gallery/libraries/Form_Uploadify.php b/modules/gallery/libraries/Form_Uploadify.php index e5b6d819..79477763 100644 --- a/modules/gallery/libraries/Form_Uploadify.php +++ b/modules/gallery/libraries/Form_Uploadify.php @@ -46,6 +46,8 @@ class Form_Uploadify_Core extends Form_Input {      $v->album = $this->data["album"];      $v->script_data = $this->data["script_data"];      $v->simultaneous_upload_limit = module::get_var("gallery", "simultaneous_upload_limit"); +    $v->movies_allowed = (bool) movie::find_ffmpeg(); +    $v->suhosin_session_encrypt = (bool) ini_get("suhosin.session.encrypt");      return $v;    } diff --git a/modules/gallery/libraries/IdentityProvider.php b/modules/gallery/libraries/IdentityProvider.php index 5f341c90..4ef07e1a 100644 --- a/modules/gallery/libraries/IdentityProvider.php +++ b/modules/gallery/libraries/IdentityProvider.php @@ -61,8 +61,7 @@ class IdentityProvider_Core {     * Return a commen confirmation message     */    static function confirmation_message() { -    return t("Are you sure you want to change your Identity Provider? " . -             "Continuing will delete all existing users."); +    return t("Are you sure you want to change your Identity Provider? Continuing will delete all existing users.");    }    static function change_provider($new_provider) { @@ -113,8 +112,7 @@ class IdentityProvider_Core {          }          message::error( -          t("Error attempting to enable \"%new_provider\" identity provider, " . -            "reverted to \"%old_provider\" identity provider", +          t("Error attempting to enable \"%new_provider\" identity provider, reverted to \"%old_provider\" identity provider",              array("new_provider" => $new_provider, "old_provider" => $current_provider)));          $restore_already_running = false; diff --git a/modules/gallery/libraries/Sendmail.php b/modules/gallery/libraries/Sendmail.php index ded7b2ef..0fa554b4 100644 --- a/modules/gallery/libraries/Sendmail.php +++ b/modules/gallery/libraries/Sendmail.php @@ -35,10 +35,12 @@ class Sendmail_Core {    public function __construct() {      $this->headers = array(); -    $config = Kohana::config("sendmail"); -    foreach ($config as $key => $value) { -      $this->$key($value); -    } +    $domain = Input::instance()->server("HTTP_HOST"); +    $this->from(module::get_var("gallery", "email_from", "admin@$domain")); +    $this->reply_to(module::get_var("gallery", "email_reply_to", "public@$domain")); +    $this->line_length(module::get_var("gallery", "email_line_length", 70)); +    $separator = module::get_var("gallery", "email_header_separator", null); +    $this->header_separator(empty($separator) ? "\n" : deserialize($separator));    }    public function __get($key) { diff --git a/modules/gallery/libraries/Theme_View.php b/modules/gallery/libraries/Theme_View.php index 46291005..7a6bc1da 100644 --- a/modules/gallery/libraries/Theme_View.php +++ b/modules/gallery/libraries/Theme_View.php @@ -236,6 +236,13 @@ class Theme_View_Core extends Gallery_View {      case "thumb_bottom":      case "thumb_info":      case "thumb_top": +      if ($function == "head") { +        // Stash any CSS we have already; that came from the theme and we want theme CSS to +        // override module CSs +        $save_css = $this->css; +        $this->css = array(); +      } +        $blocks = array();        if (method_exists("gallery_theme", $function)) {          switch (count($args)) { @@ -275,6 +282,8 @@ class Theme_View_Core extends Gallery_View {        }        if ($function == "head") { +        // Merge the theme CSS/JS at the end +        $this->css = array_merge($this->css, $save_css);          array_unshift($blocks, $this->combine_files($this->css, "css"));          array_unshift($blocks, $this->combine_files($this->scripts, "javascript"));        } diff --git a/modules/gallery/models/item.php b/modules/gallery/models/item.php index c4591279..1db766e9 100644 --- a/modules/gallery/models/item.php +++ b/modules/gallery/models/item.php @@ -411,7 +411,9 @@ class Item_Model extends ORM_MPTT {          }          // This will almost definitely trigger another save, so put it at the end so that we're -        // tail recursive. +        // tail recursive.  Null out the data file variable first, otherwise the next save will +        // trigger an item_updated_data_file event. +        $this->data_file = null;          module::event("item_created", $this);        } else {          // Update an existing item diff --git a/modules/gallery/module.info b/modules/gallery/module.info index 084a0945..901158b5 100644 --- a/modules/gallery/module.info +++ b/modules/gallery/module.info @@ -1,3 +1,3 @@  name = "Gallery 3"  description = "Gallery core application" -version = 34 +version = 37 diff --git a/modules/gallery/tests/Gallery_Filters.php b/modules/gallery/tests/Gallery_Filters.php index 052990d5..1c07f93e 100644 --- a/modules/gallery/tests/Gallery_Filters.php +++ b/modules/gallery/tests/Gallery_Filters.php @@ -43,7 +43,6 @@ class GalleryCodeFilterIterator extends FilterIterator {        strpos($path_name, MODPATH . "unit_test") !== false ||        strpos($path_name, MODPATH . "exif/lib") !== false ||        strpos($path_name, MODPATH . "user/lib/PasswordHash") !== false || -      strpos($path_name, DOCROOT . "lib/swfupload") !== false ||        strpos($path_name, SYSPATH) !== false ||        strpos($path_name, MODPATH . "gallery/libraries/HTMLPurifier") !== false ||        substr($path_name, -1, 1) == "~"); diff --git a/modules/gallery/tests/Sendmail_Test.php b/modules/gallery/tests/Sendmail_Test.php index b9406047..92974e5c 100644 --- a/modules/gallery/tests/Sendmail_Test.php +++ b/modules/gallery/tests/Sendmail_Test.php @@ -23,9 +23,10 @@ class Sendmail_Test extends Gallery_Unit_Test_Case {    }    public function sendmail_test() { +    $domain = Input::instance()->server("HTTP_HOST");      $expected = "To: receiver@someemail.com\r\n" .                  "From: from@gallery3.com\n" . -                "Reply-To: public@gallery3.com\r\n" . +                "Reply-To: public@$domain\r\n" .                  "Subject: Test Email Unit test\r\n\r\n" .                  "The mail message body";      $result = Sendmail_For_Test::factory() @@ -45,8 +46,9 @@ class Sendmail_Test extends Gallery_Unit_Test_Case {    }    public function sendmail_reply_to_test() { +    $domain = Input::instance()->server("HTTP_HOST");      $expected = "To: receiver@someemail.com\r\n" . -                "From: from@gallery3.com\n" . +                "From: admin@$domain\n" .                  "Reply-To: reply-to@gallery3.com\r\n" .                  "Subject: Test Email Unit test\r\n\r\n" .                  "The mail message body"; @@ -61,9 +63,10 @@ class Sendmail_Test extends Gallery_Unit_Test_Case {    }    public function sendmail_html_message_test() { +    $domain = Input::instance()->server("HTTP_HOST");      $expected = "To: receiver@someemail.com\r\n" . -                "From: from@gallery3.com\n" . -                "Reply-To: public@gallery3.com\n" . +                "From: admin@$domain\n" . +                "Reply-To: public@$domain\n" .                  "MIME-Version: 1.0\n" .                  "Content-Type: text/html; charset=UTF-8\r\n" .                  "Subject: Test Email Unit test\r\n\r\n" . @@ -80,9 +83,10 @@ class Sendmail_Test extends Gallery_Unit_Test_Case {    }    public function sendmail_wrapped_message_test() { +    $domain = Input::instance()->server("HTTP_HOST");      $expected = "To: receiver@someemail.com\r\n" . -                "From: from@gallery3.com\n" . -                "Reply-To: public@gallery3.com\r\n" . +                "From: admin@$domain\n" . +                "Reply-To: public@$domain\r\n" .                  "Subject: Test Email Unit test\r\n\r\n" .                  "This is a long message that needs to go\n" .                  "over forty characters If we get lucky we\n" . diff --git a/modules/gallery/views/admin_theme_options.html.php b/modules/gallery/views/admin_theme_options.html.php index b4a90682..e452913e 100644 --- a/modules/gallery/views/admin_theme_options.html.php +++ b/modules/gallery/views/admin_theme_options.html.php @@ -1,35 +1,4 @@  <?php defined("SYSPATH") or die("No direct script access.") ?> -<script type="text/javascript"> -  $("#g-theme-options-form").ready(function() { -     var contents = $("#g-theme-options-form fieldset:not(:last-child)"); -     if (contents.length > 1) { -       $("<div id='g-theme-options-form-tabs'>" + -         "  <ul class='tabnav'></ul>" + -         "</div>").insertBefore("#g-theme-options-form fieldset:last-child"); -       $(contents).each(function(index) { -         var text = $("legend", this).text(); -         var tabId = "tab_" + index; -         var tabContentId = "tab_content_" + index; -         if (text == "") { -           text = <?= t("Tab_")->for_js() ?> + index; -         } -         $(".tabnav").append( -           "<li><a id='" + tabId + "' href='#" + tabContentId + "'>" + text + "</a></li>"); -         $("#g-theme-options-form-tabs").append( -           "<div id='" + tabContentId + "' class='tabdiv'></div>"); -         if ($("li.g-error", this).length > 0) { -           $("#" + tabId).addClass("g-error"); -         } -         $("#" + tabContentId).append($("ul", this)); -         $(this).remove(); -       }); -       $("#g-theme-options-form-tabs").tabs({}); -     } else { -       $("#g-theme-options-form fieldset:first legend").hide(); -     } -  }); -</script> -  <div class="g-block">    <h1> <?= t("Theme options") ?> </h1>    <div class="g-block-content"> diff --git a/modules/gallery/views/form_uploadify.html.php b/modules/gallery/views/form_uploadify.html.php index 4f564b07..36f5f284 100644 --- a/modules/gallery/views/form_uploadify.html.php +++ b/modules/gallery/views/form_uploadify.html.php @@ -2,109 +2,162 @@  <script type="text/javascript" src="<?= url::file("lib/swfobject.js") ?>"></script>  <script type="text/javascript" src="<?= url::file("lib/uploadify/jquery.uploadify.min.js") ?>"></script>  <script type="text/javascript"> +  <? $flash_minimum_version = "9.0.24" ?> +  var success_count = 0; +  var error_count = 0; +  var updating = 0;    $("#g-add-photos-canvas").ready(function () { -    $("#g-uploadify").uploadify({ -      width: 150, -      height: 33, -      uploader: "<?= url::file("lib/uploadify/uploadify.swf") ?>", -      script: "<?= url::site("uploader/add_photo/{$album->id}") ?>", -      scriptData: <?= json_encode($script_data) ?>, -      fileExt: "*.gif;*.jpg;*.jpeg;*.png;*.flv;*.mp4;*.m4v;*.GIF;*.JPG;*.JPEG;*.PNG;*.FLV;*.MP4;*.M4V", -      fileDesc: <?= t("Photos and movies")->for_js() ?>, -      cancelImg: "<?= url::file("lib/uploadify/cancel.png") ?>", -      simUploadLimit: <?= $simultaneous_upload_limit ?>, -      wmode: "transparent", -      hideButton: true, /* should be true */ -      auto: true, -      multi: true, -      onAllComplete: function(filesUploaded, errors, allbytesLoaded, speed) { -        $("#g-upload-cancel-all") -          .addClass("ui-state-disabled") -          .attr("disabled", "disabled"); -        return true; -      }, -      onClearQueue: function(event) { -        $("#g-upload-cancel-all") -          .addClass("ui-state-disabled") -          .attr("disabled", "disabled"); -        return true; -      }, -      onComplete: function(event, queueID, fileObj, response, data) { -        var re = /^error: (.*)$/i; -        var msg = re.exec(response); -        if (msg) { -          $("#g-add-photos-status ul").append( -            "<li class=\"g-error\">" + fileObj.name + " - " + msg[1] + "</li>"); -        } else { -          $("#g-add-photos-status ul").append( -            "<li class=\"g-success\">" + fileObj.name + " - " + <?= t("Completed")->for_js() ?> + "</li>"); -        } -        return true; -      }, -      onError: function(event, queueID, fileObj, errorObj) { -        var msg = " - "; -        if (errorObj.type == "HTTP") { -          if (errorObj.info == "500") { -            msg += <?= t("Unable to process this file")->for_js() ?>; -            // Server error - check server logs -          } else if (errorObj.info == "404") { -            msg += <?= t("The upload script was not found.")->for_js() ?>; -            // Server script not found -          } else { -            // Server Error: status: errorObj.info -            msg += (<?= t("Server error: __INFO__")->for_js() ?>.replace("__INFO__", errorObj.info)); -          } -        } else if (errorObj.type == "File Size") { -          var sizelimit = $("#g-uploadify").uploadifySettings(sizeLimit); -          msg += fileObj.name+' '+errorObj.type+' Limit: '+Math.round(d.sizeLimit/1024)+'KB'; -        } else { -          msg += (<?= t("Server error: __INFO__ (__TYPE__)")->for_js() ?> -            .replace("__INFO__", errorObj.info) -            .replace("__TYPE__", errorObj.type)); -        } -        $("#g-add-photos-status ul").append( -          "<li class=\"g-error\">" + fileObj.name + msg + "</li>"); -        $("#g-uploadify" + queueID).remove(); -      }, -      onSelect: function(event) { -        if ($("#g-upload-cancel-all").hasClass("ui-state-disabled")) { +    var update_status = function() { +      if (updating) { +        // poor man's mutex +        setTimeout(function() { update_status(); }, 500); +      } +      updating = 1; +      $.get("<?= url::site("uploader/status/_S/_E") ?>" +            .replace("_S", success_count).replace("_E", error_count), +          function(data) { +            $("#g-add-photos-status-message").html(data); +            updating = 0; +          }); +    }; + +    if (swfobject.hasFlashPlayerVersion("<?= $flash_minimum_version ?>")) { +      $("#g-uploadify").uploadify({ +        width: 150, +        height: 33, +        uploader: "<?= url::file("lib/uploadify/uploadify.swf") ?>", +        script: "<?= url::site("uploader/add_photo/{$album->id}") ?>", +        scriptData: <?= json_encode($script_data) ?>, +        fileExt: "*.gif;*.jpg;*.jpeg;*.png;*.GIF;*.JPG;*.JPEG;*.PNG<? if ($movies_allowed): ?>;*.flv;*.mp4;*.m4v;*.FLV;*.MP4;*.M4V<? endif ?>", +        fileDesc: <?= t("Photos and movies")->for_js() ?>, +        cancelImg: "<?= url::file("lib/uploadify/cancel.png") ?>", +        simUploadLimit: <?= $simultaneous_upload_limit ?>, +        wmode: "transparent", +        hideButton: true, /* should be true */ +        auto: true, +        multi: true, +        onAllComplete: function(filesUploaded, errors, allbytesLoaded, speed) { +          $("#g-upload-cancel-all") +            .addClass("ui-state-disabled") +            .attr("disabled", "disabled"); +          $("#g-upload-done") +            .removeClass("ui-state-disabled") +            .attr("disabled", null); +          return true; +        }, +        onClearQueue: function(event) {            $("#g-upload-cancel-all") +            .addClass("ui-state-disabled") +            .attr("disabled", "disabled"); +          $("#g-upload-done")              .removeClass("ui-state-disabled")              .attr("disabled", null); +          return true; +        }, +        onComplete: function(event, queueID, fileObj, response, data) { +          var re = /^error: (.*)$/i; +          var msg = re.exec(response); +          $("#g-add-photos-status ul").append( +            "<li id=\"q" + queueID + "\" class=\"g-success\">" + fileObj.name + " - " + +            <?= t("Completed")->for_js() ?> + "</li>"); +          setTimeout(function() { $("#q" + queueID).slideUp("slow") }, 5000); +          success_count++; +          update_status(); +          return true; +        }, +        onError: function(event, queueID, fileObj, errorObj) { +          var msg = " - "; +          if (errorObj.type == "HTTP") { +            if (errorObj.info == "500") { +              msg += <?= t("Unable to process this file")->for_js() ?>; +              // Server error - check server logs +            } else if (errorObj.info == "404") { +              msg += <?= t("The upload script was not found.")->for_js() ?>; +              // Server script not found +            } else { +              // Server Error: status: errorObj.info +              msg += (<?= t("Server error: __INFO__")->for_js() ?>.replace("__INFO__", errorObj.info)); +            } +          } else if (errorObj.type == "File Size") { +            var sizelimit = $("#g-uploadify").uploadifySettings(sizeLimit); +            msg += fileObj.name+' '+errorObj.type+' Limit: '+Math.round(d.sizeLimit/1024)+'KB'; +          } else { +            msg += (<?= t("Server error: __INFO__ (__TYPE__)")->for_js() ?> +              .replace("__INFO__", errorObj.info) +              .replace("__TYPE__", errorObj.type)); +          } +          $("#g-add-photos-status ul").append( +            "<li class=\"g-error\">" + fileObj.name + msg + "</li>"); +          $("#g-uploadify" + queueID).remove(); +          error_count++; +          update_status(); +        }, +        onSelect: function(event) { +          if ($("#g-upload-cancel-all").hasClass("ui-state-disabled")) { +            $("#g-upload-cancel-all") +              .removeClass("ui-state-disabled") +              .attr("disabled", null); +            $("#g-upload-done") +              .addClass("ui-state-disabled") +              .attr("disabled", "disabled"); +          } +          return true;          } -        return true; -      } -    }); +      }); +    } else { +      $(".requires-flash").hide(); +      $(".no-flash").show(); +    }    });  </script> -<? if (ini_get("suhosin.session.encrypt")): ?> -<ul id="g-action-status" class="g-message-block"> -  <li class="g-error"> -    <?= t("Error: your server is configured to use the <a href=\"%encrypt_url\"><code>suhosin.session.encrypt</code></a> setting from <a href=\"%suhosin_url\">Suhosin</a>.  You must disable this setting to upload photos.", -        array("encrypt_url" => "http://www.hardened-php.net/suhosin/configuration.html#suhosin.session.encrypt", -    "suhosin_url" => "http://www.hardened-php.net/suhosin/")) ?> -  </li> -</ul> -<? endif ?> +<div class="requires-flash"> +  <? if ($suhosin_session_encrypt || !$movies_allowed): ?> +  <div class="g-message-block g-info"> +    <? if ($suhosin_session_encrypt): ?> +    <p class="g-error"> +      <?= t("Error: your server is configured to use the <a href=\"%encrypt_url\"><code>suhosin.session.encrypt</code></a> setting from <a href=\"%suhosin_url\">Suhosin</a>.  You must disable this setting to upload photos.", +          array("encrypt_url" => "http://www.hardened-php.net/suhosin/configuration.html#suhosin.session.encrypt", +      "suhosin_url" => "http://www.hardened-php.net/suhosin/")) ?> +    </p> +    <? endif ?> -<div> -  <p> -    <?= t("Photos will be uploaded to album: ") ?> -  </p> -  <ul class="g-breadcrumbs ui-helper-clearfix"> -    <? foreach ($album->parents() as $i => $parent): ?> -    <li<? if ($i == 0) print " class=\"g-first\"" ?>> <?= html::clean($parent->title) ?> </li> -    <? endforeach ?> -    <li class="g-active"> <?= html::purify($album->title) ?> </li> -  </ul> -</div> +    <? if (!$movies_allowed): ?> +    <p class="g-warning"> +      <?= t("Can't find <i>ffmpeg</i> on your system. Movie uploading disabled. <a href=\"%help_url\">Help!</a>", array("help_url" => "http://codex.gallery2.org/Gallery3:FAQ#Why_does_it_say_I.27m_missing_ffmpeg.3F")) ?> +    </p> +    <? endif ?> +  </div> +  <? endif ?> + +  <div> +    <p> +      <?= t("Photos will be uploaded to album: ") ?> +    </p> +    <ul class="g-breadcrumbs ui-helper-clearfix"> +      <? foreach ($album->parents() as $i => $parent): ?> +      <li<? if ($i == 0) print " class=\"g-first\"" ?>> <?= html::clean($parent->title) ?> </li> +      <? endforeach ?> +      <li class="g-active"> <?= html::purify($album->title) ?> </li> +    </ul> +  </div> -<div id="g-add-photos-canvas"> -  <button id="g-add-photos-button" class="g-button ui-state-default ui-corner-all" href="#"><?= t("Select photos...") ?></button> -  <span id="g-uploadify"></span> +  <div id="g-add-photos-canvas"> +    <button id="g-add-photos-button" class="g-button ui-state-default ui-corner-all" href="#"><?= t("Select photos...") ?></button> +    <span id="g-uploadify"></span> +  </div> +  <div id="g-add-photos-status"> +    <ul id="g-action-status" class="g-message-block"> +    </ul> +  </div>  </div> -<div id="g-add-photos-status"> -  <ul id="g-action-status" class="g-message-block"> -  </ul> + +<div class="no-flash" style="display: none"> +  <p> +    <?= t("Your browser must have Adobe Flash Player version %flash_minimum_version or greater installed to use this feature.", array("flash_minimum_version" => $flash_minimum_version)) ?> +  </p> +  <a href="http://www.adobe.com/go/getflashplayer"> +    <img src="<?= request::protocol() ?>://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" +         alt=<?= t("Get Adobe Flash Player")->for_js() ?> /> +  </a>  </div> diff --git a/modules/gallery/views/form_uploadify_buttons.html.php b/modules/gallery/views/form_uploadify_buttons.html.php index d88bb6aa..e002d82d 100644 --- a/modules/gallery/views/form_uploadify_buttons.html.php +++ b/modules/gallery/views/form_uploadify_buttons.html.php @@ -1,8 +1,11 @@  <?php defined("SYSPATH") or die("No direct script access.") ?> -<!-- Proxy the done request back to our form, since its been ajaxified --> -<button id="g-upload-done" class="ui-state-default ui-corner-all" onclick="$('#g-add-photos-form').submit();return false;"> +<div class="requires-flash"> +  <!-- Proxy the done request back to our form, since its been ajaxified --> +  <button id="g-upload-done" class="ui-state-default ui-corner-all" onclick="$('#g-add-photos-form').submit();return false;">    <?= t("Done") ?> -</button> -<button id="g-upload-cancel-all" class="ui-state-default ui-corner-all ui-state-disabled" onclick="$('#g-uploadify').uploadifyClearQueue();return false;" disabled="disabled"> -  <?= t("Cancel All") ?> -</button> +  </button> +  <button id="g-upload-cancel-all" class="ui-state-default ui-corner-all ui-state-disabled" onclick="$('#g-uploadify').uploadifyClearQueue();return false;" disabled="disabled"> +  <?= t("Cancel uploads") ?> +  </button> +  <span id="g-add-photos-status-message" /> +</div> diff --git a/modules/gallery/views/move_browse.html.php b/modules/gallery/views/move_browse.html.php deleted file mode 100644 index f77c724c..00000000 --- a/modules/gallery/views/move_browse.html.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php defined("SYSPATH") or die("No direct script access.") ?> -<div> -<script type="text/javascript"> - var load_tree = function(target_id, locked) { -   var load_url = "<?= url::site("move/show_sub_tree/{$source->id}/__TARGETID__") ?>"; -   var node = $("#node_" + target_id); -   $("#g-move .node a").removeClass("selected"); -   node.find("a:first").addClass("selected"); -   if (locked) { -     $("#g-move-button").attr("disabled", "disabled"); -     $("#g-move form input[name=target_id]").attr("value", ""); -   } else { -     $("#g-move-button").removeAttr("disabled"); -     $("#g-move form input[name=target_id]").attr("value", target_id); -   } -   var sub_tree = $("#tree_" + target_id); -   if (sub_tree.length) { -     sub_tree.toggle(); -   } else { -     $.get(load_url.replace("__TARGETID__", target_id), {}, -           function(data) { -             node.html(data); -             node.find("a:first").addClass("selected"); -           }); -   } - } -</script> -<h1 style="display:none" > -  <? if ($source->type == "photo"): ?> -  <?= t("Move this photo to a new album") ?> -  <? elseif ($source->type == "movie"): ?> -  <?= t("Move this movie to a new album") ?> -  <? elseif ($source->type == "album"): ?> -  <?= t("Move this album to a new album") ?> -  <? endif ?> -</h1> -<div id="g-move"> -  <ul id="tree_0"> -    <li id="node_1" class="node"> -      <?= $tree ?> -    </li> -  </ul> -  <form method="post" action="<?= url::site("move/save/$source->id") ?>"> -    <?= access::csrf_form_field() ?> -    <input type="hidden" name="target_id" value="" /> -    <input type="submit" id="g-move-button" value="<?= t("Move")->for_html_attr() ?>" -       disabled="disabled" class="submit" /> -  </form> -</div> -</div> diff --git a/modules/gallery/views/move_tree.html.php b/modules/gallery/views/move_tree.html.php deleted file mode 100644 index e629e1bb..00000000 --- a/modules/gallery/views/move_tree.html.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php defined("SYSPATH") or die("No direct script access.") ?> -<?= $parent->thumb_img(array(), 25); ?> -<? if (!access::can("edit", $parent) || $source->contains($parent)): ?> -<a href="javascript:load_tree('<?= $parent->id ?>',1)"> <?= html::clean($parent->title) ?> <?= t("(locked)") ?> </a> -<? else: ?> -<a href="javascript:load_tree('<?= $parent->id ?>',0)"> <?= html::clean($parent->title) ?></a> -<? endif ?> -<ul id="tree_<?= $parent->id ?>"> -  <? foreach ($children as $child): ?> -  <li id="node_<?= $child->id ?>" class="node"> -    <?= $child->thumb_img(array(), 25); ?> -    <? if (!access::can("edit", $child) || $source->contains($child)): ?> -    <a href="javascript:load_tree('<?= $child->id ?>',1)"> <?= html::clean($child->title) ?> <?= t("(locked)") ?></a> -    <? else: ?> -    <a href="javascript:load_tree('<?= $child->id ?>',0)"> <?= html::clean($child->title) ?> </a> -    <? endif ?> -  </li> -  <? endforeach ?> -</ul> diff --git a/modules/notification/helpers/notification_event.php b/modules/notification/helpers/notification_event.php index df9dbe48..5cd10de8 100644 --- a/modules/notification/helpers/notification_event.php +++ b/modules/notification/helpers/notification_event.php @@ -21,15 +21,6 @@ class notification_event_Core {    // The assumption is that the exception was logged at a lower level, but we    // don't want to screw up the processing that was generating the notification    // so we don't pass the exception up the call stack -  static function item_updated($original, $new) { -    try { -      notification::send_item_updated($original, $new); -    } catch (Exception $e) { -      Kohana_Log::add("error", "@todo notification_event::item_updated() failed"); -      Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); -    } -  } -    static function item_created($item) {      try {        notification::send_item_add($item); diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 7b2ba8ef..2b6e4186 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -31,10 +31,9 @@ class Organize_Controller extends Controller {        $sort_fields[$field] = (string)$description;      }      $sort_order = array("ASC" => (string)t("Ascending"), "DESC" => (string)t("Descending")); -    $file_filter = json_encode( -      array("photo" => array("label" => "Images", -                             "types" => array("*.jpg", "*.jpeg", "*.png", "*.gif")), -            "movie" => array("label" => "Movies", "types" => array("*.flv", "*.mp4", "*.m4v")))); +    $file_filter = json_encode(array( +      "photo" => array("label" => "Images", "types" => array("*.jpg", "*.jpeg", "*.png", "*.gif")), +      "movie" => array("label" => "Movies", "types" => array("*.flv", "*.mp4", "*.m4v"))));      $v = new View("organize_dialog.html");      $v->album = $album; @@ -43,6 +42,7 @@ class Organize_Controller extends Controller {      $v->file_filter = addslashes($file_filter);      $v->sort_order = addslashes(json_encode($sort_order));      $v->sort_fields = addslashes(json_encode($sort_fields)); +    $v->selected_id = Input::instance()->get("selected_id", null);      $v->rest_uri = url::site("rest") . "/";      $v->controller_uri = url::site("organize") . "/";      $v->swf_uri = url::file("modules/organize/lib/Gallery3WebClient.swf?") . diff --git a/modules/organize/helpers/organize_event.php b/modules/organize/helpers/organize_event.php index ae05fb5d..2f997600 100644 --- a/modules/organize/helpers/organize_event.php +++ b/modules/organize/helpers/organize_event.php @@ -32,13 +32,23 @@ class organize_event_Core {    }    static function context_menu($menu, $theme, $item) { -    if ($item->is_album() && access::can("edit", $item)) { -      $menu->get("options_menu") -        ->append(Menu::factory("dialog") -                 ->id("organize") -                 ->label(t("Organize album")) -                 ->css_class("ui-icon-folder-open g-organize-link") -                 ->url(url::site("organize/dialog/{$item->id}"))); +    if (access::can("edit", $item)) { +      if ($item->is_album()) { +        $menu->get("options_menu") +          ->append(Menu::factory("dialog") +                   ->id("organize") +                   ->label(t("Organize album")) +                   ->css_class("ui-icon-folder-open g-organize-link") +                   ->url(url::site("organize/dialog/{$item->id}"))); +      } else { +        $parent = $item->parent(); +        $menu->get("options_menu") +          ->append(Menu::factory("dialog") +                   ->id("move") +                   ->label(t("Move to another album")) +                   ->css_class("ui-icon-folder-open g-organize-link") +                   ->url(url::site("organize/dialog/{$parent->id}?selected_id={$item->id}"))); +      }      }    } @@ -51,8 +61,7 @@ class organize_event_Core {    static function module_change($changes) {      if (!module::is_active("rest") || in_array("rest", $changes->deactivate)) {        site_status::warning( -        t("The Organize module requires the Rest module.  " . -          "<a href=\"%url\">Activate the Rest module now</a>", +        t("The Organize module requires the Rest module.  <a href=\"%url\">Activate the Rest module now</a>",            array("url" => html::mark_clean(url::site("admin/modules")))),          "organize_needs_rest");      } else { diff --git a/modules/organize/helpers/organize_installer.php b/modules/organize/helpers/organize_installer.php index bbe6fc65..2faa598b 100644 --- a/modules/organize/helpers/organize_installer.php +++ b/modules/organize/helpers/organize_installer.php @@ -22,12 +22,15 @@ class organize_installer {      site_status::clear("organize_needs_rest");    } +  static function install() { +    module::set_version("organize", $version = 2); +  } +    static function upgrade($version) {      if ($version == 1) {        if (!module::is_active("rest")) {          site_status::warning( -          t("The Organize module requires the Rest module.  " . -            "<a href=\"%url\">Activate the Rest module now</a>", +          t("The Organize module requires the Rest module.  <a href=\"%url\">Activate the Rest module now</a>",              array("url" => html::mark_clean(url::site("admin/modules")))),            "organize_needs_rest");        } diff --git a/modules/organize/lib/Gallery3WebClient.swf b/modules/organize/lib/Gallery3WebClient.swfBinary files differ index b37a74c3..b82c8a42 100644 --- a/modules/organize/lib/Gallery3WebClient.swf +++ b/modules/organize/lib/Gallery3WebClient.swf diff --git a/modules/organize/views/organize_dialog.html.php b/modules/organize/views/organize_dialog.html.php index 4cc6385e..b76813ad 100644 --- a/modules/organize/views/organize_dialog.html.php +++ b/modules/organize/views/organize_dialog.html.php @@ -1,10 +1,6 @@  <?php defined("SYSPATH") or die("No direct script access.") ?>  <script type="text/javascript" src="<?= url::file("lib/swfobject.js") ?>"></script>  <style type="text/css" media="screen"> -  #flashContent { -  //display:none; -  } -    .g-organize {      padding: 0;      margins: 0; @@ -21,10 +17,10 @@  </style>  <script type="text/javascript"> -      $("#g-dialog").bind("dialogclose", function(event, ui) { -        // @todo do a call to organize/closing to end the batch -        window.location.reload(); -      }); +  $("#g-dialog").bind("dialogclose", function(event, ui) { +    // @todo do a call to organize/closing to end the batch +    window.location.reload(); +  });    function closeOrganizeDialog() {      $("#g-dialog").dialog("close"); @@ -94,6 +90,7 @@        sortOrder: "<?= $sort_order ?>",        sortFields: "<?= $sort_fields ?>",        albumId: "<?= $album->id ?>", +      selectedId: "<?= $selected_id ?>",        restUri: "<?= $rest_uri ?>",        controllerUri: "<?= $controller_uri ?>"      }; @@ -129,8 +126,7 @@    <h1 style="display:none"><?= t("Organize :: %name", array("name" => html::purify($album->title))) ?></h1>    <div id="flashContent">      <p> -      <?= t("To use the Organize feature, please ensure that Adobe Flash Player version %flash_minimum_version " . -            "or greater is installed.", array("flash_minimum_version" => $flash_minimum_version)) ?> +      <?= t("Your browser must have Adobe Flash Player version %flash_minimum_version or greater installed to use this feature.", array("flash_minimum_version" => $flash_minimum_version)) ?>      </p>      <a href="http://www.adobe.com/go/getflashplayer">        <img src="<?= request::protocol() ?>://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" diff --git a/modules/recaptcha/helpers/recaptcha_event.php b/modules/recaptcha/helpers/recaptcha_event.php index fda998e1..f185f92b 100644 --- a/modules/recaptcha/helpers/recaptcha_event.php +++ b/modules/recaptcha/helpers/recaptcha_event.php @@ -18,21 +18,17 @@   * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA.   */  class recaptcha_event_Core { -  static function user_profile_contact_form($form) { +  static function captcha_protect_form($form) {      if (module::get_var("recaptcha", "public_key")) { -      $form->message->recaptcha("recaptcha")->label("")->id("g-recaptcha"); -    } -  } +      foreach ($form->inputs as $input) { +        if ($input instanceof Form_Group) { +          $input->recaptcha("recaptcha")->label("")->id("g-recaptcha"); +          return; +        } +      } -  static function comment_add_form($form) { -    if (module::get_var("recaptcha", "public_key")) { -      $form->add_comment->recaptcha("recaptcha")->label("")->id("g-recaptcha"); -    } -  } - -  static function register_add_form($form) { -    if (module::get_var("recaptcha", "public_key")) { -      $form->register_user->recaptcha("recaptcha")->label("")->id("g-recaptcha"); +      // If we haven't returned yet, then add the captcha at the end of the form +      $form->recaptcha("recaptcha")->label("")->id("g-recaptcha");      }    } diff --git a/modules/slideshow/helpers/slideshow_event.php b/modules/slideshow/helpers/slideshow_event.php index 6cb5d019..167fa7ff 100644 --- a/modules/slideshow/helpers/slideshow_event.php +++ b/modules/slideshow/helpers/slideshow_event.php @@ -27,8 +27,7 @@ class slideshow_event_Core {    static function module_change($changes) {      if (!module::is_active("rss") || in_array("rss", $changes->deactivate)) {        site_status::warning( -        t("The Slideshow module requires the RSS module.  " . -          "<a href=\"%url\">Activate the RSS module now</a>", +        t("The Slideshow module requires the RSS module.  <a href=\"%url\">Activate the RSS module now</a>",            array("url" => html::mark_clean(url::site("admin/modules")))),          "slideshow_needs_rss");      } else { | 
