From 4f2750a0e27272909edc4d305fdf3c4bf8bee3f6 Mon Sep 17 00:00:00 2001 From: brentil Date: Fri, 27 Aug 2010 21:54:56 +0800 Subject: [PATCH 1/8] Version 2.0 - 2010.08.27 Fixed: comply with translated/t("string") standards Added: New caching system. ModuleUpdates now caches the last results so that it does not check every time the page is run. The cache expires every 30 days, when the user selects the option to Check Modules for Updates, or the cache is empty. Added: Color coding for more cases when versions are out of sync (Orange = Your file version is newer than the installed version & Pink = Your installed version is newer than file version). Added: Each module now links to it's location in the Gallery Codex so if your version is out of date you can go get the official version. This also allows for manual verification of DNE modules that are not in the GitHub. Added: GitHub status check along with status check to access the internet outbound from your Gallery installation. --- .../controllers/admin_moduleupdates.php | 187 ++++++++++++++---- .../helpers/moduleupdates_installer.php | 18 +- modules/moduleupdates/module.info | 2 +- .../views/admin_moduleupdates.html.php | 48 +++-- 4 files changed, 197 insertions(+), 58 deletions(-) diff --git a/modules/moduleupdates/controllers/admin_moduleupdates.php b/modules/moduleupdates/controllers/admin_moduleupdates.php index ba812515..1a7a2508 100644 --- a/modules/moduleupdates/controllers/admin_moduleupdates.php +++ b/modules/moduleupdates/controllers/admin_moduleupdates.php @@ -39,40 +39,136 @@ class Admin_Moduleupdates_Controller extends Admin_Controller { * @author brentil */ public function index() { + $view = new Admin_View("admin.html"); $view->page_title = t("Gallery 3 :: Manage Module Updates"); $view->content = new View("admin_moduleupdates.html"); - $all_modules = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); + $devDebug = false; + $refreshCache = false; + + $cache = unserialize(Cache::instance()->get("moduleupdates_cache")); + $cache_updates = unserialize(Cache::instance()->get("moduleupdates_cache_updates")); + + //--------------------------------------------------------------------------------------------- + //echo 'Message 01: ' .$cache_updates . '
'; + //--------------------------------------------------------------------------------------------- + + //if someone pressed the button to refresh now + if (request::method() == "post") { + access::verify_csrf(); + $cache = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); + $cache_updates = array("date" => "", "updates" => 0); + $refreshCache = true; + }else if(count($cache) < 1 or $cache_updates['date'] == ""){ + //if there are no items in the cache array or the update date is "" refresh the data + $cache = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); + $cache_updates = array("date" => "", "updates" => 0); + $refreshCache = true; + } + + //Check the ability to access the Gallery3 GitHub + $GitHub = null; + try { + $GitHub = fopen ("http://github.com", "r"); + if ($GitHub != null) { + $GitHub = 'Online'; + }else{ + $GitHub = 'Offline'; + } + } + catch (Exception $e) { + //echo 'Message: ' .$e->getMessage() . '
'; + } + //Check the ability to access the Google + $Google = null; + try { + $Google = fopen ("http://google.com", "r"); + if ($Google != null) { + $Google = 'Online'; + }else{ + $Google = 'Offline'; + } + } + catch (Exception $e) { + //echo 'Message: ' .$e->getMessage() . '
'; + } - foreach (module::available() as $this_module_name => $module_info) { - - $remote_version = ''; - $remote_server = ''; - - list ($remote_version, $remote_server) = $this->get_remote_module_version($this_module_name); - - $font_color = "black"; - if ($remote_version == "DNE") { - $font_color = "blue"; - } else if ($module_info->version != '' and $module_info->code_version < $module_info->version) { - $font_color = "pink"; - } else if ($module_info->version != '' and $module_info->code_version > $module_info->version) { - $font_color = "orange"; - } else if ($remote_version < $module_info->code_version or ($module_info->version != '' and $remote_version < $module_info->version)) { - $font_color = "green"; - } else if ($remote_version > $module_info->code_version or ($module_info->version != '' and $remote_version > $module_info->version)) { - $font_color = "red"; - } + if($refreshCache == true){ + foreach (module::available() as $this_module_name => $module_info) { + + //example code for setting cache values + //Cache::instance()->set($key, "$log{$msg}", array("task", "log", "import"), 2592000); + //example delete cache + //Cache::instance()->delete("update_l10n_cache:{$task->id}"); + //example for reading cache + //$log = Cache::instance()->get($key); + + $remote_version = ''; + $remote_server = ''; + $update_count = 0; + + list ($remote_version, $remote_server) = $this->get_remote_module_version($this_module_name, $devDebug); + + $font_color = "black"; + //BLUE - DNE: Does Not Exist, this module was not found + if ($remote_version == "DNE") { + $font_color = "blue"; + //PINK - Your installed version is newer than file version + } else if ($module_info->version != '' and $module_info->code_version < $module_info->version) { + $font_color = "pink"; + //ORANGE - Your file version is newer than the installed version + } else if ($module_info->version != '' and $module_info->code_version > $module_info->version) { + $font_color = "orange"; + //GREEN - Your version is newer than the GitHub + } else if ($remote_version < $module_info->code_version or ($module_info->version != '' + and $remote_version < $module_info->version)) { + $font_color = "green"; + //RED - Your version is older than the GitHub + } else if ($remote_version > $module_info->code_version or ($module_info->version != '' + and $remote_version > $module_info->version)) { + $font_color = "red"; + $update_count++; + /* + if($remote_server == "(G3)"){ + $module_info->name = "".$module_info->name.""; + }else if($remote_server == "(G3CC)"){ + $module_info->name = "".$module_info->name.""; + }else if($remote_server == "(brentil)"){ + $module_info->name = "".$module_info->name.""; + } + */ + } + + $module_info->name = "".$module_info->name.""; + + //populate the list fo modules and their data + $cache->$this_module_name = array ("name" => $module_info->name, "locked" => $module_info->locked, + "code_version" => $module_info->code_version, "active" => $module_info->active, + "version" => $module_info->version,"description" => $module_info->description, + "remote_version" => $remote_version, "remote_server" => $remote_server, "font_color" => $font_color); + } - $all_modules->$this_module_name = array ("name" => $module_info->name, "locked" => $module_info->locked, - "code_version" => $module_info->code_version, "active" => $module_info->active, - "version" => $module_info->version,"description" => $module_info->description, - "remote_version" => $remote_version, "remote_server" => $remote_server, "font_color" => $font_color); + //Define right now as YYYY.MM.DD HH:MM with the # of updates that are out of date + $cache_updates = array("date" => date("Y.m.d - H:i"), "updates" => $update_count); + + //--------------------------------------------------------------------------------------------- + //echo 'Message 02: ' .$cache_updates . '
'; + //--------------------------------------------------------------------------------------------- + + //Write out the new data to cache with a 30 day expiration & 0 for update data so it's always present + Cache::instance()->set("moduleupdates_cache", serialize($cache), array("ModuleUpdates"), 30*86400); + Cache::instance()->set("moduleupdates_cache_updates", serialize($cache_updates), array("ModuleUpdates"), null); + log::success("moduleupdates", t("Completed checking remote GitHub for modules updates.")); } + + $view->content->vars = $cache; + $view->content->update_time = $cache_updates['date']; + $view->content->csrf = access::csrf_token(); + $view->content->Google = $Google; + $view->content->GitHub = $GitHub; - $view->content->vars = $all_modules; - + print $view; } @@ -91,22 +187,41 @@ class Admin_Moduleupdates_Controller extends Admin_Controller { * @param String The folder name of the module to search for on the remote GitHub server * @return Array An array with the remote module version and the server it was found on. */ - private function get_remote_module_version ($module_name) { + private function get_remote_module_version ($module_name, $devDebug) { $version = 'DNE'; $server = ''; $file = null; - try { - $file = fopen ("http://github.com/gallery/gallery3/raw/master/modules/".$module_name."/module.info", "r"); - if ($file != null) { - $server = '(G3)'; - } - } - catch (Exception $e) { - //echo 'Message: ' .$e->getMessage() . '
'; + //For development debug only + if ($devDebug == true){ + if ($file == null) { + try { + $file = fopen ("http://github.com/brentil/gallery3-contrib/raw/master/modules/".$module_name."/module.info", "r"); + if ($file != null) { + $server = '(brentil)'; + } + } + catch (Exception $e) { + //echo 'Message: ' .$e->getMessage() . '
'; + } + } } + + //Check the main Gallery3 GitHub + if ($file == null) { + try { + $file = fopen ("http://github.com/gallery/gallery3/raw/master/modules/".$module_name."/module.info", "r"); + if ($file != null) { + $server = '(G3)'; + } + } + catch (Exception $e) { + //echo 'Message: ' .$e->getMessage() . '
'; + } + } + //Check the Gallery3 Community Contributions GitHub if ($file == null) { try { $file = fopen ("http://github.com/gallery/gallery3-contrib/raw/master/modules/".$module_name."/module.info", "r"); @@ -118,7 +233,7 @@ class Admin_Moduleupdates_Controller extends Admin_Controller { //echo 'Message: ' .$e->getMessage() . '
'; } } - + if ($file != null) { while (!feof ($file)) { $line = fgets ($file, 1024); diff --git a/modules/moduleupdates/helpers/moduleupdates_installer.php b/modules/moduleupdates/helpers/moduleupdates_installer.php index c15f4d82..dd0dddb8 100644 --- a/modules/moduleupdates/helpers/moduleupdates_installer.php +++ b/modules/moduleupdates/helpers/moduleupdates_installer.php @@ -17,21 +17,35 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + class moduleupdates_installer { static function install() { $version = module::get_version("moduleupdates"); if ($version == 0) { - module::set_version("moduleupdates", 1); + module::set_version("moduleupdates", 2); + //Remove the ModuleUpdates cache entry 'JIC' + Cache::instance()->delete("ModuleUpdates"); + //create the blank ModuleUpdates cache entry with an expiration of 0 days + Cache::instance()->set("moduleupdates_cache", "", array("ModuleUpdates"), null); + Cache::instance()->set("moduleupdates_cache_updates", "", array("ModuleUpdates"), null); } } static function upgrade($version) { + module::set_version("moduleupdates", 2); + //Remove the ModuleUpdates cache entry 'JIC' + Cache::instance()->delete("ModuleUpdates"); + //Empty the ModuleUpdates cache entry so our new version starts from scratch + Cache::instance()->set("moduleupdates_cache", "", array("ModuleUpdates"), null); + Cache::instance()->set("moduleupdates_cache_updates", "", array("ModuleUpdates"), null); } static function uninstall() { - + + //Remove the ModuleUpdates cache entry as we remove the module + Cache::instance()->delete("ModuleUpdates"); module::delete("moduleupdates"); } } diff --git a/modules/moduleupdates/module.info b/modules/moduleupdates/module.info index 446d30db..8fad54ff 100644 --- a/modules/moduleupdates/module.info +++ b/modules/moduleupdates/module.info @@ -1,3 +1,3 @@ name = "Module Updates" description = "Compares your installed module version against the ones stored in the GitHub." -version = 1 +version = 2 diff --git a/modules/moduleupdates/views/admin_moduleupdates.html.php b/modules/moduleupdates/views/admin_moduleupdates.html.php index 8a7c6494..3fdc06a7 100644 --- a/modules/moduleupdates/views/admin_moduleupdates.html.php +++ b/modules/moduleupdates/views/admin_moduleupdates.html.php @@ -1,21 +1,33 @@ +
-

-

-
") ?> - Red = Your version is older than the GitHub
") ?> - Green = Your version is newer than the GitHub
") ?> - Orange = Your file version is newer than the installed version
") ?> - Pink = Your installed version is newer than file version
") ?> - Blue = Does Not Exist/No information available
") ?> -

- -
    -
  • -
- +

+ +
+ +
" id="g-configure-moduleupdates-form"> + +
+ ModuleUpdates Information +
    +
  • Red = Your version is older than the GitHub
    ") ?>
  • +
  • Green = Your version is newer than the GitHub
    ") ?>
  • +
  • Orange = Your file version is newer than the installed version
    ") ?>
  • +
  • Pink = Your installed version is newer than file version
    ") ?>
  • +
  • Blue = Does Not Exist/No information available
    ") ?>
  • +
  • ") ?>
  • +
  • " class="submit" />
  • +
+
+
+ +
+
    +
  • +
+ @@ -25,14 +37,12 @@ "> - + - +
"; ?> "; ?> "; ?> "; ?> "; ?> "; ?>
-
-
-
\ No newline at end of file + \ No newline at end of file From 90ad68fcc68f3763bf4cd2caffe4f790ec08a328 Mon Sep 17 00:00:00 2001 From: hukoeth Date: Thu, 26 Aug 2010 21:46:20 +0200 Subject: [PATCH 2/8] Renamed modded tagfaces module to photoannotation to avoid confusion Started working on feature to delete annotations directly Added warning when tagfaces and photoannotation are activated at the same time --- .../controllers/photoannotation.php | 364 +++++ .../photoannotation/css/photoannotation.css | 200 +++ .../helpers/photoannotation_event.php | 86 ++ .../helpers/photoannotation_installer.php | 86 ++ .../helpers/photoannotation_theme.php | 32 + modules/photoannotation/images/delete.png | Bin 0 -> 334 bytes modules/photoannotation/images/jcrop.gif | Bin 0 -> 329 bytes modules/photoannotation/js/jquery.Jcrop.js | 1197 +++++++++++++++++ .../photoannotation/js/jquery.Jcrop.min.js | 163 +++ modules/photoannotation/js/jquery.annotate.js | 478 +++++++ .../photoannotation/js/jquery.annotate.min.js | 1 + modules/photoannotation/js/jquery.min.js | 19 + modules/photoannotation/models/items_face.php | 21 + modules/photoannotation/models/items_note.php | 21 + modules/photoannotation/module.info | 3 + .../views/photoannotation.html.php | 141 ++ .../photoannotation_highlight_block.html.php | 79 ++ 17 files changed, 2891 insertions(+) create mode 100644 modules/photoannotation/controllers/photoannotation.php create mode 100644 modules/photoannotation/css/photoannotation.css create mode 100644 modules/photoannotation/helpers/photoannotation_event.php create mode 100644 modules/photoannotation/helpers/photoannotation_installer.php create mode 100644 modules/photoannotation/helpers/photoannotation_theme.php create mode 100644 modules/photoannotation/images/delete.png create mode 100644 modules/photoannotation/images/jcrop.gif create mode 100644 modules/photoannotation/js/jquery.Jcrop.js create mode 100644 modules/photoannotation/js/jquery.Jcrop.min.js create mode 100644 modules/photoannotation/js/jquery.annotate.js create mode 100644 modules/photoannotation/js/jquery.annotate.min.js create mode 100644 modules/photoannotation/js/jquery.min.js create mode 100644 modules/photoannotation/models/items_face.php create mode 100644 modules/photoannotation/models/items_note.php create mode 100644 modules/photoannotation/module.info create mode 100644 modules/photoannotation/views/photoannotation.html.php create mode 100644 modules/photoannotation/views/photoannotation_highlight_block.html.php diff --git a/modules/photoannotation/controllers/photoannotation.php b/modules/photoannotation/controllers/photoannotation.php new file mode 100644 index 00000000..8395d726 --- /dev/null +++ b/modules/photoannotation/controllers/photoannotation.php @@ -0,0 +1,364 @@ +item_id = $item_data; + $newnote->x1 = $str_x1; + $newnote->y1 = $str_y1; + $newnote->x2 = $str_x2; + $newnote->y2 = $str_y2; + $newnote->title = $str_face_title; + $newnote->description = $str_face_description; + $newnote->save(); + } else { + // Check to see if the tag already has a face associated with it. + $existingFace = ORM::factory("items_face") + ->where("tag_id", "=", $tag_data) + ->where("item_id", "=", $item_data) + ->find_all(); + + if (count($existingFace) == 0) { + // Save the new face to the database. + $newface = ORM::factory("items_face"); + $newface->tag_id = $tag_data; + $newface->item_id = $item_data; + $newface->x1 = $str_x1; + $newface->y1 = $str_y1; + $newface->x2 = $str_x2; + $newface->y2 = $str_y2; + $newface->description = $str_face_description; + $newface->save(); + } else { + // Update the coordinates of an existing face. + $updatedFace = ORM::factory("items_face", $existingFace[0]->id); + $updatedFace->x1 = $str_x1; + $updatedFace->y1 = $str_y1; + $updatedFace->x2 = $str_x2; + $updatedFace->y2 = $str_y2; + $updatedFace->description = $str_face_description; + $updatedFace->save(); + } + } + message::success(t("Face saved.")); + url::redirect($redir_uri); + return; + } + + public function drawfaces($id) { + // Generate the page that allows the user to draw boxes over a photo. + // Make sure user has access to view and edit the photo. + $item = ORM::factory("item", $id); + access::required("view", $item); + access::required("edit", $item); + + // Create the page. + $template = new Theme_View("page.html", "other", "photoannotation"); + $template->set_global("item_id", $id); + $template->set_global("page_title", t("Draw Faces")); + $template->set_global("page_type", "other"); + $template->set_global("page_subtype", "photoface"); + $template->content = new View("photoannotation.html"); + $template->content->title = t("Tag Faces"); + $template->content->form = $this->_get_faces_form($id); + $template->content->delete_form = $this->_get_delfaces_form($id); + + // Display the page. + print $template; + } + + public function delface() { + // Delete the specified face data from the photo. + + // Prevent Cross Site Request Forgery + access::verify_csrf(); + + // Convert submitted data to local variables. + // Figure out which tagged faces and notes to delete. + $tag_data = Input::instance()->post("facesList"); + $note_data = Input::instance()->post("notesList"); + // Figure out the item id, in order to reload the correct face tagging page. + $item_data = Input::instance()->post("item_id"); + + // If the user didn't select a tag or note, display and error and abort. + if ((count($tag_data) == 0) && (count($note_data) == 0)) { + message::error(t("Please select a tag or note to delete.")); + url::redirect("photoannotation/drawfaces/$item_data"); + return; + } + + // Delete the face(s) from the database. + foreach ($tag_data as $one_tag) { + db::build()->delete("items_faces")->where("id", "=", $one_tag)->execute(); + } + + // Delete the notes(s) from the database. + foreach ($note_data as $one_note) { + db::build()->delete("items_notes")->where("id", "=", $one_note)->execute(); + } + + // Display a success message for deleted faces. + if (count($tag_data) == 1) { + message::success(t("One face deleted.")); + } elseif (count($tag_data) > 1) { + message::success(count($tag_data) . t(" faces deleted.")); + } + + // Display a success message for deleted notes. + if (count($note_data) == 1) { + message::success(t("One note deleted.")); + } elseif (count($note_data) > 1) { + message::success(count($note_data) . t(" notes deleted.")); + } + + // Re-load the face tagging page. + url::redirect("photoannotation/drawfaces/$item_data"); + } + + public function saveface() { + // Save the face coordinates to the specified tag. + + // Prevent Cross Site Request Forgery + access::verify_csrf(); + + // Convert submitted data to local variables. + $tag_data = Input::instance()->post("tagsList"); + $str_face_title = str_replace("'", "\'", Input::instance()->post("face_title")); + $str_face_description = str_replace("'", "\'", Input::instance()->post("face_description")); + $item_data = Input::instance()->post("item_id"); + $str_x1 = Input::instance()->post("x1"); + $str_y1 = Input::instance()->post("y1"); + $str_x2 = Input::instance()->post("x2"); + $str_y2 = Input::instance()->post("y2"); + + // If the user didn't select a face, display an error and abort. + if (($str_x1 == "") || ($str_x2 == "") || ($str_y1 == "") || ($str_y2 == "")) { + message::error(t("Please select a face.")); + url::redirect("photoannotation/drawfaces/$item_data"); + return; + } + + // Decide if we are saving a face or a note. + if ($tag_data == -1) { + // Make sure there's a title. + if ($str_face_title == "") { + message::error(t("Please select a Tag or specify a Title.")); + url::redirect("photoannotation/drawfaces/$item_data"); + return; + } + + // Save a new Note to the database. + $newnote = ORM::factory("items_note"); + $newnote->item_id = $item_data; + $newnote->x1 = $str_x1; + $newnote->y1 = $str_y1; + $newnote->x2 = $str_x2; + $newnote->y2 = $str_y2; + $newnote->title = $str_face_title; + $newnote->description = $str_face_description; + $newnote->save(); + + } else { + // Check to see if the tag already has a face associated with it. + $existingFace = ORM::factory("items_face") + ->where("tag_id", "=", $tag_data) + ->where("item_id", "=", $item_data) + ->find_all(); + + if (count($existingFace) == 0) { + // Save the new face to the database. + $newface = ORM::factory("items_face"); + $newface->tag_id = $tag_data; + $newface->item_id = $item_data; + $newface->x1 = $str_x1; + $newface->y1 = $str_y1; + $newface->x2 = $str_x2; + $newface->y2 = $str_y2; + $newface->description = $str_face_description; + $newface->save(); + } else { + // Update the coordinates of an existing face. + $updatedFace = ORM::factory("items_face", $existingFace[0]->id); + $updatedFace->x1 = $str_x1; + $updatedFace->y1 = $str_y1; + $updatedFace->x2 = $str_x2; + $updatedFace->y2 = $str_y2; + $updatedFace->description = $str_face_description; + $updatedFace->save(); + } + } + + // Redirect back to the main screen and display a "success" message. + message::success(t("Annotation saved.")); + url::redirect("photoannotation/drawfaces/$item_data"); + } + + private function _get_faces_form($id) { + // Generate the form that allows the user to select a tag to + // save the face too. Also displays the coordinates of the face + // and the "Save face" button. + + // Make a new Form. + $form = new Forge("photoannotation/saveface", "", "post", + array("id" => "g-tag-faces-form")); + + // Create an array of all the tags for the current item. + $all_tags = ORM::factory("tag") + ->join("items_tags", "tags.id", "items_tags.tag_id") + ->where("items_tags.item_id", "=", $id) + ->find_all(); + + // Generate an array of tags to use as checkboxes. + $array_tags = ""; + $array_tags[-1] = t("No Tag"); + foreach ($all_tags as $oneTag) { + $array_tags[$oneTag->id] = $oneTag->name; + } + + // Make a checklist of tags on the form. + $tags_group = $form->group("FaceTag") + ->label(t("Select a tag or enter in a title:")); + + $tags_group->dropdown('tagsList') + ->label(t("Tag:")) + ->id('tagsList') + ->options($array_tags); + + $tags_group->input("face_title") + ->id('face_title') + ->label(t("Note Title:")); + + $tags_description = $form->group("TagsDescription") + ->label(t("Description (optional):")); + $tags_description->input("face_description") + ->id('face_description'); + + // Generate input boxes to hold the coordinates of the face. + $coordinates_group = $form->group("FaceCoordinates") + ->label(t("Coordinates:")); + $coordinates_group->input('x1') + ->id('x1') + ->label(t("X1")); + $coordinates_group->input("y1") + ->id('y1') + ->label(t("Y1")); + $coordinates_group->input("x2") + ->id('x2') + ->label(t("X2")); + $coordinates_group->input("y2") + ->id('y2') + ->label(t("Y2")); + + // Add the id# of the photo and a save button to the form. + $coordinates_group->hidden("item_id")->value($id); + $form->submit("SaveFace")->value(t("Save face")); + + // Return the newly generated form. + return $form; + } + + private function _get_delfaces_form($id) { + // Generate a form to allow the user to remove face data + // from a photo. + // Make a new Form. + $form = new Forge("photoannotation/delface", "", "post", + array("id" => "g-tag-del-faces-form")); + + // Create an array of all the tags that already have faces. + $existing_faces = ORM::factory("items_face") + ->where("item_id", "=", $id) + ->find_all(); + + // turn the $existing_faces array into an array that can be used + // for a checklist. + $array_faces = ""; + foreach ($existing_faces as $oneFace) { + $array_faces[$oneFace->id] = array(ORM::factory("tag", + $oneFace->tag_id)->name, false); + } + + if ($array_faces) { + // Add a checklist to the form. + $tags_group = $form->group("ExistingFaces") + ->label(t("Tags with faces:")); + // Add the id# of the photo and a delete button to the form. + $tags_group->hidden("item_id")->value($id); + + $tags_group->checklist("facesList") + ->options($array_faces) + ->label(t("Select the tag(s) that correspond(s) to the face(s) you wish to delete:")); + } + + // Create an array of all the notes associated with this photo. + $existing_notes = ORM::factory("items_note") + ->where("item_id", "=", $id) + ->find_all(); + + // turn the $existing_notes array into an array that can be used + // for a checklist. + $array_notes = ""; + foreach ($existing_notes as $oneNote) { + $array_notes[$oneNote->id] = array($oneNote->title, false); + } + + if ($array_notes) { + // Add a checklist to the form. + $notes_group = $form->group("ExistingNotes") + ->label(t("Notes:")); + // Add the id# of the photo and a delete button to the form. + $notes_group->hidden("item_id")->value($id); + + $notes_group->checklist("notesList") + ->options($array_notes) + ->label(t("Select the notes you wish to delete:")); + } + + // Hide the delete button when there's nothing to delete. + if (($array_notes) || ($array_faces)) { + $form->submit("DeleteFace")->value(t("Delete face(s) / note(s)")); + } else { + $form->group("NoFacesNotes")->label(t("There is nothing to delete for this photo.")); + } + + // Return the newly generated form. + return $form; + } +} diff --git a/modules/photoannotation/css/photoannotation.css b/modules/photoannotation/css/photoannotation.css new file mode 100644 index 00000000..bc2f7f86 --- /dev/null +++ b/modules/photoannotation/css/photoannotation.css @@ -0,0 +1,200 @@ +.image-annotate-add { + background: #fff url(../images/asterisk_yellow.png) no-repeat 3px 3px; + color: #000 !important; + cursor: pointer; + display: block; + float: left; + font-family: Verdana, Sans-Serif; + font-size: 12px; + height: 18px; + line-height: 18px; + padding: 2px 0 2px 24px; + margin: 5px 0; + width: 64px; + text-decoration: none; +} +.image-annotate-add:hover { + background-color: #eee; +} +.image-annotate-canvas { + background-position: left top; + background-repeat: no-repeat; + display: block; + margin: 0 auto; + position: relative; +} +.image-annotate-view { + display: none; + position: relative; +} +.image-annotate-area { + border: 1px solid #000000; + position: absolute; + cursor: default; +} +.image-annotate-area div { + border: 1px solid #FFFFFF; + display: block; +} +.image-annotate-area-editable { + cursor: pointer; +} +.image-annotate-area-editable-hover div { + border-color: #00AD00 !important; +} +.image-annotate-note { + background: #000000 none repeat scroll 0 0; + color: #FFFFFF; + display: none; + font-family: Verdana, Sans-Serif; + font-size: 1.4em; + max-width: 200px; + padding: 3px 7px; + position: absolute; +} +.image-annotate-note .actions { + display: block; + font-size: 80%; +} +.image-annotate-edit { + display: none; +} +#image-annotate-edit-form { + background: #FFFFFF none repeat scroll 0 0; + border: 1px solid #000000; + height: 220px; + padding: 7px; + position: absolute; + width: 250px; +} +#image-annotate-edit-form form { + clear: right; + margin: 0 !important; + padding: 0; + z-index: 999; + text-align: left; + color: #000000; +} +#image-annotate-edit-form .box { + margin: 0; +} +#image-annotate-edit-form input.form-text, #image-annotate-edit-form #edit-comment-wrapper textarea { + width: 90%; +} +#image-annotate-edit-form textarea { + height: 50px; + font-family: Verdana, Sans-Serif; + font-size: 12px; + width: 248px; +} +#image-annotate-edit-form fieldset { + background: transparent none repeat scroll 0 0; +} +#image-annotate-edit-form .form-item { + margin: 0 0 5px; +} +#image-annotate-edit-form .form-button, #image-annotate-edit-form .form-submit { + margin: 0; +} +#image-annotate-edit-form a { + cursor: pointer; + display: block; + float: left; + margin: 3px 6px 3px 0; +} +.image-annotate-edit-area { + border: 1px solid black; + cursor: move; + display: block; + height: 60px; + left: 10px; + margin: 0; + padding: 0; + position: absolute; + top: 10px; + width: 60px; +} +.image-annotate-edit-area .ui-resizable-handle { + opacity: 0.8; +} +.image-annotate-edit-ok { + /*background-image: url(../images/accept.png);*/ +} +.image-annotate-edit-delete { + background-image: url(../images/delete.png); +} +.image-annotate-edit-close { + /*background-image: url(../images/cross.png);*/ +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + z-index: 99999; + display: block; +} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable- autohide .ui-resizable-handle { + display: block; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0px; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0px; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.photoannotation-del-button { + background-image: url('../images/delete.png'); + cursor: pointer; +} diff --git a/modules/photoannotation/helpers/photoannotation_event.php b/modules/photoannotation/helpers/photoannotation_event.php new file mode 100644 index 00000000..011a3f09 --- /dev/null +++ b/modules/photoannotation/helpers/photoannotation_event.php @@ -0,0 +1,86 @@ +deactivate)) { + site_status::warning( + t("The Photo Annotation module requires the Tags module. " . + "Activate the Tags module now", + array("url" => url::site("admin/modules"))), + "photoannotation_needs_tag"); + } else { + site_status::clear("photoannotation_needs_tag"); + } + if (module::is_active("tagfaces") || in_array("tagfaces", $changes->activate)) { + site_status::warning( + t("The Photo Annotation module cannot be used together with the TagFaces module. " . + "Dectivate the TagFaces module now", + array("url" => url::site("admin/modules"))), + "photoannotation_incompatibility_tagfaces"); + } else { + site_status::clear("photoannotation_incompatibility_tagfaces"); + } + } + + static function site_menu($menu, $theme) { + // Create a menu option for adding face data. + if (!$theme->item()) { + return; + } + + $item = $theme->item(); + + if ($item->is_photo()) { + if ((access::can("view", $item)) && (access::can("edit", $item))) { + $menu->get("options_menu") + ->append(Menu::factory("link") + ->id("photoannotation") + ->label(t("Add annotation")) + ->css_id("g-photoannotation-link") + ->url("#")); + $menu->get("options_menu") + ->append(Menu::factory("link") + ->id("photoannotation_edit") + ->label(t("Edit annotations")) + ->css_id("g-photoannotation-edit-link") + ->url(url::site("photoannotation/drawfaces/" . $item->id))); + } + } + } + + static function item_deleted($item) { + // Check for and delete existing Faces and Notes. + $existingFaces = ORM::factory("items_face") + ->where("item_id", "=", $item->id) + ->find_all(); + if (count($existingFaces) > 0) { + db::build()->delete("items_faces")->where("item_id", "=", $item->id)->execute(); + } + + $existingNotes = ORM::factory("items_note") + ->where("item_id", "=", $item->id) + ->find_all(); + if (count($existingNotes) > 0) { + db::build()->delete("items_notes")->where("item_id", "=", $item->id)->execute(); + } + } +} diff --git a/modules/photoannotation/helpers/photoannotation_installer.php b/modules/photoannotation/helpers/photoannotation_installer.php new file mode 100644 index 00000000..ea3b7c0f --- /dev/null +++ b/modules/photoannotation/helpers/photoannotation_installer.php @@ -0,0 +1,86 @@ +query("CREATE TABLE IF NOT EXISTS {items_faces} ( + `id` int(9) NOT NULL auto_increment, + `tag_id` int(9) NOT NULL, + `item_id` int(9) NOT NULL, + `x1` int(9) NOT NULL, + `y1` int(9) NOT NULL, + `x2` int(9) NOT NULL, + `y2` int(9) NOT NULL, + `description` varchar(2048) default NULL, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + + $db->query("CREATE TABLE IF NOT EXISTS {items_notes} ( + `id` int(9) NOT NULL auto_increment, + `item_id` int(9) NOT NULL, + `x1` int(9) NOT NULL, + `y1` int(9) NOT NULL, + `x2` int(9) NOT NULL, + `y2` int(9) NOT NULL, + `title` varchar(64) NOT NULL, + `description` varchar(2048) default NULL, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + + // Set the module's version number. + module::set_version("photoannotation", 1); + } + + static function upgrade($version) { + $db = Database::instance(); + if ($version == 1) { + $db->query("ALTER TABLE {items_faces} ADD `description` varchar(2048) default NULL"); + + $db->query("CREATE TABLE IF NOT EXISTS {items_notes} ( + `id` int(9) NOT NULL auto_increment, + `item_id` int(9) NOT NULL, + `x1` int(9) NOT NULL, + `y1` int(9) NOT NULL, + `x2` int(9) NOT NULL, + `y2` int(9) NOT NULL, + `title` varchar(64) NOT NULL, + `description` varchar(2048) default NULL, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + + module::set_version("photoannotation", $version = 1); + } + } + + static function deactivate() { + // Clear the require tags message when photoannotation is deactivated. + site_status::clear("photoannotation_needs_tag"); + site_status::clear("photoannotation_incompatibility_tagfaces"); + } + + static function uninstall() { + // Delete the face table before uninstalling. + $db = Database::instance(); + $db->query("DROP TABLE IF EXISTS {items_faces};"); + $db->query("DROP TABLE IF EXISTS {items_notes};"); + module::delete("photoannotation"); + } +} diff --git a/modules/photoannotation/helpers/photoannotation_theme.php b/modules/photoannotation/helpers/photoannotation_theme.php new file mode 100644 index 00000000..27661c92 --- /dev/null +++ b/modules/photoannotation/helpers/photoannotation_theme.php @@ -0,0 +1,32 @@ +css("photoannotation.css"); + //$theme->script("jquery.annotate.js"); + Return ""; + } + + static function photo_bottom($theme) { + // If it does, add an image map to the page to display them. + return new View("photoannotation_highlight_block.html"); + } +} diff --git a/modules/photoannotation/images/delete.png b/modules/photoannotation/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..13eccb1c413227aa295a4ae381b395f9fe35a575 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg44k^~#Ai#Q|(DmSC^@B`7O|B6Q%N@7`SgbwR!xV2gS#4-&V7<|@K;YQn4HsowU8l{B zw)=muMa99T!brcuVt-?z#J1ez-hJ=q79W?qf4NkaVM^-Gb*uSrZ)0UxI>n#Qz&Ci_ z^K|F8DxN)t<_$BKWvtvgBvXS4w#q z3T32|*KFM)ZOncl>bIHdy^zpS=4X{+P8*`5vRefnTl`Y7sJD9_BhmI|X{5xTzuVsh X&G(3@vFxY;`i#NT)z4*}Q$iB}h5dM$ literal 0 HcmV?d00001 diff --git a/modules/photoannotation/images/jcrop.gif b/modules/photoannotation/images/jcrop.gif new file mode 100644 index 0000000000000000000000000000000000000000..72ea7ccb5321d5384d70437cfaac73011237901e GIT binary patch literal 329 zcmZ?wbhEHb9b#5NV>2k zBC~b@b~P=nNfWAe-b%_i6tS^-1y(h@EsB~1TqDA_h@fkxG$bHgvj}VxE1JLgr!*!^ ILUxTc0Q$^Q5C8xG literal 0 HcmV?d00001 diff --git a/modules/photoannotation/js/jquery.Jcrop.js b/modules/photoannotation/js/jquery.Jcrop.js new file mode 100644 index 00000000..9d68d589 --- /dev/null +++ b/modules/photoannotation/js/jquery.Jcrop.js @@ -0,0 +1,1197 @@ +/** + * jquery.Jcrop.js v0.9.8 + * jQuery Image Cropping Plugin + * @author Kelly Hallman + * Copyright (c) 2008-2009 Kelly Hallman - released under MIT License {{{ + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + + * }}} + */ + +(function($) { + +$.Jcrop = function(obj,opt) +{ + // Initialization {{{ + + // Sanitize some options {{{ + var obj = obj, opt = opt; + + if (typeof(obj) !== 'object') obj = $(obj)[0]; + if (typeof(opt) !== 'object') opt = { }; + + // Some on-the-fly fixes for MSIE...sigh + if (!('trackDocument' in opt)) + { + opt.trackDocument = $.browser.msie ? false : true; + if ($.browser.msie && $.browser.version.split('.')[0] == '8') + opt.trackDocument = true; + } + + if (!('keySupport' in opt)) + opt.keySupport = $.browser.msie ? false : true; + + // }}} + // Extend the default options {{{ + var defaults = { + + // Basic Settings + trackDocument: false, + baseClass: 'jcrop', + addClass: null, + + // Styling Options + bgColor: 'black', + bgOpacity: .6, + borderOpacity: .4, + handleOpacity: .5, + + handlePad: 5, + handleSize: 9, + handleOffset: 5, + edgeMargin: 14, + + aspectRatio: 0, + keySupport: true, + cornerHandles: true, + sideHandles: true, + drawBorders: true, + dragEdges: true, + + boxWidth: 0, + boxHeight: 0, + + boundary: 8, + animationDelay: 20, + swingSpeed: 3, + + allowSelect: true, + allowMove: true, + allowResize: true, + + minSelect: [ 0, 0 ], + maxSize: [ 0, 0 ], + minSize: [ 0, 0 ], + + // Callbacks / Event Handlers + onChange: function() { }, + onSelect: function() { } + + }; + var options = defaults; + setOptions(opt); + + // }}} + // Initialize some jQuery objects {{{ + + var $origimg = $(obj); + var $img = $origimg.clone().removeAttr('id').css({ position: 'static' }); + + $img.width($origimg.width()); + $img.height($origimg.height()); + $origimg.after($img).hide(); + + presize($img,options.boxWidth,options.boxHeight); + + var boundx = $img.width(), + boundy = $img.height(), + + $div = $('
') + .width(boundx).height(boundy) + .addClass(cssClass('holder')) + .css({ + position: 'relative', + backgroundColor: options.bgColor + }).insertAfter($origimg).append($img); + ; + + if (options.addClass) $div.addClass(options.addClass); + //$img.wrap($div); + + var $img2 = $('')/*{{{*/ + .attr('src',$img.attr('src')) + .css('position','absolute') + .width(boundx).height(boundy) + ;/*}}}*/ + var $img_holder = $('
')/*{{{*/ + .width(pct(100)).height(pct(100)) + .css({ + zIndex: 310, + position: 'absolute', + overflow: 'hidden' + }) + .append($img2) + ;/*}}}*/ + var $hdl_holder = $('
')/*{{{*/ + .width(pct(100)).height(pct(100)) + .css('zIndex',320); + /*}}}*/ + var $sel = $('
')/*{{{*/ + .css({ + position: 'absolute', + zIndex: 300 + }) + .insertBefore($img) + .append($img_holder,$hdl_holder) + ;/*}}}*/ + + var bound = options.boundary; + var $trk = newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)) + .css({ position: 'absolute', top: px(-bound), left: px(-bound), zIndex: 290 }) + .mousedown(newSelection); + + /* }}} */ + // Set more variables {{{ + + var xlimit, ylimit, xmin, ymin; + var xscale, yscale, enabled = true; + var docOffset = getPos($img), + // Internal states + btndown, lastcurs, dimmed, animating, + shift_down; + + // }}} + + + // }}} + // Internal Modules {{{ + + var Coords = function()/*{{{*/ + { + var x1 = 0, y1 = 0, x2 = 0, y2 = 0, ox, oy; + + function setPressed(pos)/*{{{*/ + { + var pos = rebound(pos); + x2 = x1 = pos[0]; + y2 = y1 = pos[1]; + }; + /*}}}*/ + function setCurrent(pos)/*{{{*/ + { + var pos = rebound(pos); + ox = pos[0] - x2; + oy = pos[1] - y2; + x2 = pos[0]; + y2 = pos[1]; + }; + /*}}}*/ + function getOffset()/*{{{*/ + { + return [ ox, oy ]; + }; + /*}}}*/ + function moveOffset(offset)/*{{{*/ + { + var ox = offset[0], oy = offset[1]; + + if (0 > x1 + ox) ox -= ox + x1; + if (0 > y1 + oy) oy -= oy + y1; + + if (boundy < y2 + oy) oy += boundy - (y2 + oy); + if (boundx < x2 + ox) ox += boundx - (x2 + ox); + + x1 += ox; + x2 += ox; + y1 += oy; + y2 += oy; + }; + /*}}}*/ + function getCorner(ord)/*{{{*/ + { + var c = getFixed(); + switch(ord) + { + case 'ne': return [ c.x2, c.y ]; + case 'nw': return [ c.x, c.y ]; + case 'se': return [ c.x2, c.y2 ]; + case 'sw': return [ c.x, c.y2 ]; + } + }; + /*}}}*/ + function getFixed()/*{{{*/ + { + if (!options.aspectRatio) return getRect(); + // This function could use some optimization I think... + var aspect = options.aspectRatio, + min_x = options.minSize[0]/xscale, + min_y = options.minSize[1]/yscale, + max_x = options.maxSize[0]/xscale, + max_y = options.maxSize[1]/yscale, + rw = x2 - x1, + rh = y2 - y1, + rwa = Math.abs(rw), + rha = Math.abs(rh), + real_ratio = rwa / rha, + xx, yy + ; + if (max_x == 0) { max_x = boundx * 10 } + if (max_y == 0) { max_y = boundy * 10 } + if (real_ratio < aspect) + { + yy = y2; + w = rha * aspect; + xx = rw < 0 ? x1 - w : w + x1; + + if (xx < 0) + { + xx = 0; + h = Math.abs((xx - x1) / aspect); + yy = rh < 0 ? y1 - h: h + y1; + } + else if (xx > boundx) + { + xx = boundx; + h = Math.abs((xx - x1) / aspect); + yy = rh < 0 ? y1 - h : h + y1; + } + } + else + { + xx = x2; + h = rwa / aspect; + yy = rh < 0 ? y1 - h : y1 + h; + if (yy < 0) + { + yy = 0; + w = Math.abs((yy - y1) * aspect); + xx = rw < 0 ? x1 - w : w + x1; + } + else if (yy > boundy) + { + yy = boundy; + w = Math.abs(yy - y1) * aspect; + xx = rw < 0 ? x1 - w : w + x1; + } + } + + // Magic %-) + if(xx > x1) { // right side + if(xx - x1 < min_x) { + xx = x1 + min_x; + } else if (xx - x1 > max_x) { + xx = x1 + max_x; + } + if(yy > y1) { + yy = y1 + (xx - x1)/aspect; + } else { + yy = y1 - (xx - x1)/aspect; + } + } else if (xx < x1) { // left side + if(x1 - xx < min_x) { + xx = x1 - min_x + } else if (x1 - xx > max_x) { + xx = x1 - max_x; + } + if(yy > y1) { + yy = y1 + (x1 - xx)/aspect; + } else { + yy = y1 - (x1 - xx)/aspect; + } + } + + if(xx < 0) { + x1 -= xx; + xx = 0; + } else if (xx > boundx) { + x1 -= xx - boundx; + xx = boundx; + } + + if(yy < 0) { + y1 -= yy; + yy = 0; + } else if (yy > boundy) { + y1 -= yy - boundy; + yy = boundy; + } + + return last = makeObj(flipCoords(x1,y1,xx,yy)); + }; + /*}}}*/ + function rebound(p)/*{{{*/ + { + if (p[0] < 0) p[0] = 0; + if (p[1] < 0) p[1] = 0; + + if (p[0] > boundx) p[0] = boundx; + if (p[1] > boundy) p[1] = boundy; + + return [ p[0], p[1] ]; + }; + /*}}}*/ + function flipCoords(x1,y1,x2,y2)/*{{{*/ + { + var xa = x1, xb = x2, ya = y1, yb = y2; + if (x2 < x1) + { + xa = x2; + xb = x1; + } + if (y2 < y1) + { + ya = y2; + yb = y1; + } + return [ Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ]; + }; + /*}}}*/ + function getRect()/*{{{*/ + { + var xsize = x2 - x1; + var ysize = y2 - y1; + + if (xlimit && (Math.abs(xsize) > xlimit)) + x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); + if (ylimit && (Math.abs(ysize) > ylimit)) + y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); + + if (ymin && (Math.abs(ysize) < ymin)) + y2 = (ysize > 0) ? (y1 + ymin) : (y1 - ymin); + if (xmin && (Math.abs(xsize) < xmin)) + x2 = (xsize > 0) ? (x1 + xmin) : (x1 - xmin); + + if (x1 < 0) { x2 -= x1; x1 -= x1; } + if (y1 < 0) { y2 -= y1; y1 -= y1; } + if (x2 < 0) { x1 -= x2; x2 -= x2; } + if (y2 < 0) { y1 -= y2; y2 -= y2; } + if (x2 > boundx) { var delta = x2 - boundx; x1 -= delta; x2 -= delta; } + if (y2 > boundy) { var delta = y2 - boundy; y1 -= delta; y2 -= delta; } + if (x1 > boundx) { var delta = x1 - boundy; y2 -= delta; y1 -= delta; } + if (y1 > boundy) { var delta = y1 - boundy; y2 -= delta; y1 -= delta; } + + return makeObj(flipCoords(x1,y1,x2,y2)); + }; + /*}}}*/ + function makeObj(a)/*{{{*/ + { + return { x: a[0], y: a[1], x2: a[2], y2: a[3], + w: a[2] - a[0], h: a[3] - a[1] }; + }; + /*}}}*/ + + return { + flipCoords: flipCoords, + setPressed: setPressed, + setCurrent: setCurrent, + getOffset: getOffset, + moveOffset: moveOffset, + getCorner: getCorner, + getFixed: getFixed + }; + }(); + + /*}}}*/ + var Selection = function()/*{{{*/ + { + var start, end, dragmode, awake, hdep = 370; + var borders = { }; + var handle = { }; + var seehandles = false; + var hhs = options.handleOffset; + + /* Insert draggable elements {{{*/ + + // Insert border divs for outline + if (options.drawBorders) { + borders = { + top: insertBorder('hline') + .css('top',$.browser.msie?px(-1):px(0)), + bottom: insertBorder('hline'), + left: insertBorder('vline'), + right: insertBorder('vline') + }; + } + + // Insert handles on edges + if (options.dragEdges) { + handle.t = insertDragbar('n'); + handle.b = insertDragbar('s'); + handle.r = insertDragbar('e'); + handle.l = insertDragbar('w'); + } + + // Insert side handles + options.sideHandles && + createHandles(['n','s','e','w']); + + // Insert corner handles + options.cornerHandles && + createHandles(['sw','nw','ne','se']); + + /*}}}*/ + // Private Methods + function insertBorder(type)/*{{{*/ + { + var jq = $('
') + .css({position: 'absolute', opacity: options.borderOpacity }) + .addClass(cssClass(type)); + $img_holder.append(jq); + return jq; + }; + /*}}}*/ + function dragDiv(ord,zi)/*{{{*/ + { + var jq = $('
') + .mousedown(createDragger(ord)) + .css({ + cursor: ord+'-resize', + position: 'absolute', + zIndex: zi + }) + ; + $hdl_holder.append(jq); + return jq; + }; + /*}}}*/ + function insertHandle(ord)/*{{{*/ + { + return dragDiv(ord,hdep++) + .css({ top: px(-hhs+1), left: px(-hhs+1), opacity: options.handleOpacity }) + .addClass(cssClass('handle')); + }; + /*}}}*/ + function insertDragbar(ord)/*{{{*/ + { + var s = options.handleSize, + o = hhs, + h = s, w = s, + t = o, l = o; + + switch(ord) + { + case 'n': case 's': w = pct(100); break; + case 'e': case 'w': h = pct(100); break; + } + + return dragDiv(ord,hdep++).width(w).height(h) + .css({ top: px(-t+1), left: px(-l+1)}); + }; + /*}}}*/ + function createHandles(li)/*{{{*/ + { + for(i in li) handle[li[i]] = insertHandle(li[i]); + }; + /*}}}*/ + function moveHandles(c)/*{{{*/ + { + var midvert = Math.round((c.h / 2) - hhs), + midhoriz = Math.round((c.w / 2) - hhs), + north = west = -hhs+1, + east = c.w - hhs, + south = c.h - hhs, + x, y; + + 'e' in handle && + handle.e.css({ top: px(midvert), left: px(east) }) && + handle.w.css({ top: px(midvert) }) && + handle.s.css({ top: px(south), left: px(midhoriz) }) && + handle.n.css({ left: px(midhoriz) }); + + 'ne' in handle && + handle.ne.css({ left: px(east) }) && + handle.se.css({ top: px(south), left: px(east) }) && + handle.sw.css({ top: px(south) }); + + 'b' in handle && + handle.b.css({ top: px(south) }) && + handle.r.css({ left: px(east) }); + }; + /*}}}*/ + function moveto(x,y)/*{{{*/ + { + $img2.css({ top: px(-y), left: px(-x) }); + $sel.css({ top: px(y), left: px(x) }); + }; + /*}}}*/ + function resize(w,h)/*{{{*/ + { + $sel.width(w).height(h); + }; + /*}}}*/ + function refresh()/*{{{*/ + { + var c = Coords.getFixed(); + + Coords.setPressed([c.x,c.y]); + Coords.setCurrent([c.x2,c.y2]); + + updateVisible(); + }; + /*}}}*/ + + // Internal Methods + function updateVisible()/*{{{*/ + { if (awake) return update(); }; + /*}}}*/ + function update()/*{{{*/ + { + var c = Coords.getFixed(); + + resize(c.w,c.h); + moveto(c.x,c.y); + + options.drawBorders && + borders['right'].css({ left: px(c.w-1) }) && + borders['bottom'].css({ top: px(c.h-1) }); + + seehandles && moveHandles(c); + awake || show(); + + options.onChange(unscale(c)); + }; + /*}}}*/ + function show()/*{{{*/ + { + $sel.show(); + $img.css('opacity',options.bgOpacity); + awake = true; + }; + /*}}}*/ + function release()/*{{{*/ + { + disableHandles(); + $sel.hide(); + $img.css('opacity',1); + awake = false; + }; + /*}}}*/ + function showHandles()//{{{ + { + if (seehandles) + { + moveHandles(Coords.getFixed()); + $hdl_holder.show(); + } + }; + //}}} + function enableHandles()/*{{{*/ + { + seehandles = true; + if (options.allowResize) + { + moveHandles(Coords.getFixed()); + $hdl_holder.show(); + return true; + } + }; + /*}}}*/ + function disableHandles()/*{{{*/ + { + seehandles = false; + $hdl_holder.hide(); + }; + /*}}}*/ + function animMode(v)/*{{{*/ + { + (animating = v) ? disableHandles(): enableHandles(); + }; + /*}}}*/ + function done()/*{{{*/ + { + animMode(false); + refresh(); + }; + /*}}}*/ + + var $track = newTracker().mousedown(createDragger('move')) + .css({ cursor: 'move', position: 'absolute', zIndex: 360 }) + + $img_holder.append($track); + disableHandles(); + + return { + updateVisible: updateVisible, + update: update, + release: release, + refresh: refresh, + setCursor: function (cursor) { $track.css('cursor',cursor); }, + enableHandles: enableHandles, + enableOnly: function() { seehandles = true; }, + showHandles: showHandles, + disableHandles: disableHandles, + animMode: animMode, + done: done + }; + }(); + /*}}}*/ + var Tracker = function()/*{{{*/ + { + var onMove = function() { }, + onDone = function() { }, + trackDoc = options.trackDocument; + + if (!trackDoc) + { + $trk + .mousemove(trackMove) + .mouseup(trackUp) + .mouseout(trackUp) + ; + } + + function toFront()/*{{{*/ + { + $trk.css({zIndex:450}); + if (trackDoc) + { + $(document) + .mousemove(trackMove) + .mouseup(trackUp) + ; + } + } + /*}}}*/ + function toBack()/*{{{*/ + { + $trk.css({zIndex:290}); + if (trackDoc) + { + $(document) + .unbind('mousemove',trackMove) + .unbind('mouseup',trackUp) + ; + } + } + /*}}}*/ + function trackMove(e)/*{{{*/ + { + onMove(mouseAbs(e)); + }; + /*}}}*/ + function trackUp(e)/*{{{*/ + { + e.preventDefault(); + e.stopPropagation(); + + if (btndown) + { + btndown = false; + + onDone(mouseAbs(e)); + options.onSelect(unscale(Coords.getFixed())); + toBack(); + onMove = function() { }; + onDone = function() { }; + } + + return false; + }; + /*}}}*/ + + function activateHandlers(move,done)/* {{{ */ + { + btndown = true; + onMove = move; + onDone = done; + toFront(); + return false; + }; + /* }}} */ + + function setCursor(t) { $trk.css('cursor',t); }; + + $img.before($trk); + return { + activateHandlers: activateHandlers, + setCursor: setCursor + }; + }(); + /*}}}*/ + var KeyManager = function()/*{{{*/ + { + var $keymgr = $('') + .css({ position: 'absolute', left: '-30px' }) + .keypress(parseKey) + .blur(onBlur), + + $keywrap = $('
') + .css({ + position: 'absolute', + overflow: 'hidden' + }) + .append($keymgr) + ; + + function watchKeys()/*{{{*/ + { + if (options.keySupport) + { + $keymgr.show(); + $keymgr.focus(); + } + }; + /*}}}*/ + function onBlur(e)/*{{{*/ + { + $keymgr.hide(); + }; + /*}}}*/ + function doNudge(e,x,y)/*{{{*/ + { + if (options.allowMove) { + Coords.moveOffset([x,y]); + Selection.updateVisible(); + }; + e.preventDefault(); + e.stopPropagation(); + }; + /*}}}*/ + function parseKey(e)/*{{{*/ + { + if (e.ctrlKey) return true; + shift_down = e.shiftKey ? true : false; + var nudge = shift_down ? 10 : 1; + switch(e.keyCode) + { + case 37: doNudge(e,-nudge,0); break; + case 39: doNudge(e,nudge,0); break; + case 38: doNudge(e,0,-nudge); break; + case 40: doNudge(e,0,nudge); break; + + case 27: Selection.release(); break; + + case 9: return true; + } + + return nothing(e); + }; + /*}}}*/ + + if (options.keySupport) $keywrap.insertBefore($img); + return { + watchKeys: watchKeys + }; + }(); + /*}}}*/ + + // }}} + // Internal Methods {{{ + + function px(n) { return '' + parseInt(n) + 'px'; }; + function pct(n) { return '' + parseInt(n) + '%'; }; + function cssClass(cl) { return options.baseClass + '-' + cl; }; + function getPos(obj)/*{{{*/ + { + // Updated in v0.9.4 to use built-in dimensions plugin + var pos = $(obj).offset(); + return [ pos.left, pos.top ]; + }; + /*}}}*/ + function mouseAbs(e)/*{{{*/ + { + return [ (e.pageX - docOffset[0]), (e.pageY - docOffset[1]) ]; + }; + /*}}}*/ + function myCursor(type)/*{{{*/ + { + if (type != lastcurs) + { + Tracker.setCursor(type); + //Handles.xsetCursor(type); + lastcurs = type; + } + }; + /*}}}*/ + function startDragMode(mode,pos)/*{{{*/ + { + docOffset = getPos($img); + Tracker.setCursor(mode=='move'?mode:mode+'-resize'); + + if (mode == 'move') + return Tracker.activateHandlers(createMover(pos), doneSelect); + + var fc = Coords.getFixed(); + var opp = oppLockCorner(mode); + var opc = Coords.getCorner(oppLockCorner(opp)); + + Coords.setPressed(Coords.getCorner(opp)); + Coords.setCurrent(opc); + + Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect); + }; + /*}}}*/ + function dragmodeHandler(mode,f)/*{{{*/ + { + return function(pos) { + if (!options.aspectRatio) switch(mode) + { + case 'e': pos[1] = f.y2; break; + case 'w': pos[1] = f.y2; break; + case 'n': pos[0] = f.x2; break; + case 's': pos[0] = f.x2; break; + } + else switch(mode) + { + case 'e': pos[1] = f.y+1; break; + case 'w': pos[1] = f.y+1; break; + case 'n': pos[0] = f.x+1; break; + case 's': pos[0] = f.x+1; break; + } + Coords.setCurrent(pos); + Selection.update(); + }; + }; + /*}}}*/ + function createMover(pos)/*{{{*/ + { + var lloc = pos; + KeyManager.watchKeys(); + + return function(pos) + { + Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); + lloc = pos; + + Selection.update(); + }; + }; + /*}}}*/ + function oppLockCorner(ord)/*{{{*/ + { + switch(ord) + { + case 'n': return 'sw'; + case 's': return 'nw'; + case 'e': return 'nw'; + case 'w': return 'ne'; + case 'ne': return 'sw'; + case 'nw': return 'se'; + case 'se': return 'nw'; + case 'sw': return 'ne'; + }; + }; + /*}}}*/ + function createDragger(ord)/*{{{*/ + { + return function(e) { + if (options.disabled) return false; + if ((ord == 'move') && !options.allowMove) return false; + btndown = true; + startDragMode(ord,mouseAbs(e)); + e.stopPropagation(); + e.preventDefault(); + return false; + }; + }; + /*}}}*/ + function presize($obj,w,h)/*{{{*/ + { + var nw = $obj.width(), nh = $obj.height(); + if ((nw > w) && w > 0) + { + nw = w; + nh = (w/$obj.width()) * $obj.height(); + } + if ((nh > h) && h > 0) + { + nh = h; + nw = (h/$obj.height()) * $obj.width(); + } + xscale = $obj.width() / nw; + yscale = $obj.height() / nh; + $obj.width(nw).height(nh); + }; + /*}}}*/ + function unscale(c)/*{{{*/ + { + return { + x: parseInt(c.x * xscale), y: parseInt(c.y * yscale), + x2: parseInt(c.x2 * xscale), y2: parseInt(c.y2 * yscale), + w: parseInt(c.w * xscale), h: parseInt(c.h * yscale) + }; + }; + /*}}}*/ + function doneSelect(pos)/*{{{*/ + { + var c = Coords.getFixed(); + if (c.w > options.minSelect[0] && c.h > options.minSelect[1]) + { + Selection.enableHandles(); + Selection.done(); + } + else + { + Selection.release(); + } + Tracker.setCursor( options.allowSelect?'crosshair':'default' ); + }; + /*}}}*/ + function newSelection(e)/*{{{*/ + { + if (options.disabled) return false; + if (!options.allowSelect) return false; + btndown = true; + docOffset = getPos($img); + Selection.disableHandles(); + myCursor('crosshair'); + var pos = mouseAbs(e); + Coords.setPressed(pos); + Tracker.activateHandlers(selectDrag,doneSelect); + KeyManager.watchKeys(); + Selection.update(); + + e.stopPropagation(); + e.preventDefault(); + return false; + }; + /*}}}*/ + function selectDrag(pos)/*{{{*/ + { + Coords.setCurrent(pos); + Selection.update(); + }; + /*}}}*/ + function newTracker() + { + var trk = $('
').addClass(cssClass('tracker')); + $.browser.msie && trk.css({ opacity: 0, backgroundColor: 'white' }); + return trk; + }; + + // }}} + // API methods {{{ + + function animateTo(a)/*{{{*/ + { + var x1 = a[0] / xscale, + y1 = a[1] / yscale, + x2 = a[2] / xscale, + y2 = a[3] / yscale; + + if (animating) return; + + var animto = Coords.flipCoords(x1,y1,x2,y2); + var c = Coords.getFixed(); + var animat = initcr = [ c.x, c.y, c.x2, c.y2 ]; + var interv = options.animationDelay; + + var x = animat[0]; + var y = animat[1]; + var x2 = animat[2]; + var y2 = animat[3]; + var ix1 = animto[0] - initcr[0]; + var iy1 = animto[1] - initcr[1]; + var ix2 = animto[2] - initcr[2]; + var iy2 = animto[3] - initcr[3]; + var pcent = 0; + var velocity = options.swingSpeed; + + Selection.animMode(true); + + var animator = function() + { + return function() + { + pcent += (100 - pcent) / velocity; + + animat[0] = x + ((pcent / 100) * ix1); + animat[1] = y + ((pcent / 100) * iy1); + animat[2] = x2 + ((pcent / 100) * ix2); + animat[3] = y2 + ((pcent / 100) * iy2); + + if (pcent < 100) animateStart(); + else Selection.done(); + + if (pcent >= 99.8) pcent = 100; + + setSelectRaw(animat); + }; + }(); + + function animateStart() + { window.setTimeout(animator,interv); }; + + animateStart(); + }; + /*}}}*/ + function setSelect(rect)//{{{ + { + setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]); + }; + //}}} + function setSelectRaw(l) /*{{{*/ + { + Coords.setPressed([l[0],l[1]]); + Coords.setCurrent([l[2],l[3]]); + Selection.update(); + }; + /*}}}*/ + function setOptions(opt)/*{{{*/ + { + if (typeof(opt) != 'object') opt = { }; + options = $.extend(options,opt); + + if (typeof(options.onChange)!=='function') + options.onChange = function() { }; + + if (typeof(options.onSelect)!=='function') + options.onSelect = function() { }; + + }; + /*}}}*/ + function tellSelect()/*{{{*/ + { + return unscale(Coords.getFixed()); + }; + /*}}}*/ + function tellScaled()/*{{{*/ + { + return Coords.getFixed(); + }; + /*}}}*/ + function setOptionsNew(opt)/*{{{*/ + { + setOptions(opt); + interfaceUpdate(); + }; + /*}}}*/ + function disableCrop()//{{{ + { + options.disabled = true; + Selection.disableHandles(); + Selection.setCursor('default'); + Tracker.setCursor('default'); + }; + //}}} + function enableCrop()//{{{ + { + options.disabled = false; + interfaceUpdate(); + }; + //}}} + function cancelCrop()//{{{ + { + Selection.done(); + Tracker.activateHandlers(null,null); + }; + //}}} + function destroy()//{{{ + { + $div.remove(); + $origimg.show(); + }; + //}}} + + function interfaceUpdate(alt)//{{{ + // This method tweaks the interface based on options object. + // Called when options are changed and at end of initialization. + { + options.allowResize ? + alt?Selection.enableOnly():Selection.enableHandles(): + Selection.disableHandles(); + + Tracker.setCursor( options.allowSelect? 'crosshair': 'default' ); + Selection.setCursor( options.allowMove? 'move': 'default' ); + + $div.css('backgroundColor',options.bgColor); + + if ('setSelect' in options) { + setSelect(opt.setSelect); + Selection.done(); + delete(options.setSelect); + } + + if ('trueSize' in options) { + xscale = options.trueSize[0] / boundx; + yscale = options.trueSize[1] / boundy; + } + + xlimit = options.maxSize[0] || 0; + ylimit = options.maxSize[1] || 0; + xmin = options.minSize[0] || 0; + ymin = options.minSize[1] || 0; + + if ('outerImage' in options) + { + $img.attr('src',options.outerImage); + delete(options.outerImage); + } + + Selection.refresh(); + }; + //}}} + + // }}} + + $hdl_holder.hide(); + interfaceUpdate(true); + + var api = { + animateTo: animateTo, + setSelect: setSelect, + setOptions: setOptionsNew, + tellSelect: tellSelect, + tellScaled: tellScaled, + + disable: disableCrop, + enable: enableCrop, + cancel: cancelCrop, + + focus: KeyManager.watchKeys, + + getBounds: function() { return [ boundx * xscale, boundy * yscale ]; }, + getWidgetSize: function() { return [ boundx, boundy ]; }, + + release: Selection.release, + destroy: destroy + + }; + + $origimg.data('Jcrop',api); + return api; +}; + +$.fn.Jcrop = function(options)/*{{{*/ +{ + function attachWhenDone(from)/*{{{*/ + { + var loadsrc = options.useImg || from.src; + var img = new Image(); + img.onload = function() { $.Jcrop(from,options); }; + img.src = loadsrc; + }; + /*}}}*/ + if (typeof(options) !== 'object') options = { }; + + // Iterate over each object, attach Jcrop + this.each(function() + { + // If we've already attached to this object + if ($(this).data('Jcrop')) + { + // The API can be requested this way (undocumented) + if (options == 'api') return $(this).data('Jcrop'); + // Otherwise, we just reset the options... + else $(this).data('Jcrop').setOptions(options); + } + // If we haven't been attached, preload and attach + else attachWhenDone(this); + }); + + // Return "this" so we're chainable a la jQuery plugin-style! + return this; +}; +/*}}}*/ + +})(jQuery); diff --git a/modules/photoannotation/js/jquery.Jcrop.min.js b/modules/photoannotation/js/jquery.Jcrop.min.js new file mode 100644 index 00000000..cdf50ea7 --- /dev/null +++ b/modules/photoannotation/js/jquery.Jcrop.min.js @@ -0,0 +1,163 @@ +/** + * Jcrop v.0.9.8 (minimized) + * (c) 2008 Kelly Hallman and DeepLiquid.com + * More information: http://deepliquid.com/content/Jcrop.html + * Released under MIT License - this header must remain with code + */ + + +(function($){$.Jcrop=function(obj,opt) +{var obj=obj,opt=opt;if(typeof(obj)!=='object')obj=$(obj)[0];if(typeof(opt)!=='object')opt={};if(!('trackDocument'in opt)) +{opt.trackDocument=$.browser.msie?false:true;if($.browser.msie&&$.browser.version.split('.')[0]=='8') +opt.trackDocument=true;} +if(!('keySupport'in opt)) +opt.keySupport=$.browser.msie?false:true;var defaults={trackDocument:false,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:.6,borderOpacity:.4,handleOpacity:.5,handlePad:5,handleSize:9,handleOffset:5,edgeMargin:14,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,boxWidth:0,boxHeight:0,boundary:8,animationDelay:20,swingSpeed:3,allowSelect:true,allowMove:true,allowResize:true,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){}};var options=defaults;setOptions(opt);var $origimg=$(obj);var $img=$origimg.clone().removeAttr('id').css({position:'absolute'});$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('
').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);;if(options.addClass)$div.addClass(options.addClass);var $img2=$('').attr('src',$img.attr('src')).css('position','absolute').width(boundx).height(boundy);var $img_holder=$('
').width(pct(100)).height(pct(100)).css({zIndex:310,position:'absolute',overflow:'hidden'}).append($img2);var $hdl_holder=$('
').width(pct(100)).height(pct(100)).css('zIndex',320);var $sel=$('
').css({position:'absolute',zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var xlimit,ylimit,xmin,ymin;var xscale,yscale,enabled=true;var docOffset=getPos($img),btndown,lastcurs,dimmed,animating,shift_down;var Coords=function() +{var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos) +{var pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];};function setCurrent(pos) +{var pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];};function getOffset() +{return[ox,oy];};function moveOffset(offset) +{var ox=offset[0],oy=offset[1];if(0>x1+ox)ox-=ox+x1;if(0>y1+oy)oy-=oy+y1;if(boundyboundx) +{xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}} +else +{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0) +{yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;} +else if(yy>boundy) +{yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}} +if(xx>x1){if(xx-x1max_x){xx=x1+max_x;} +if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xxmax_x){xx=x1-max_x;} +if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}} +if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;} +if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;} +return last=makeObj(flipCoords(x1,y1,xx,yy));};function rebound(p) +{if(p[0]<0)p[0]=0;if(p[1]<0)p[1]=0;if(p[0]>boundx)p[0]=boundx;if(p[1]>boundy)p[1]=boundy;return[p[0],p[1]];};function flipCoords(x1,y1,x2,y2) +{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2xlimit)) +x2=(xsize>0)?(x1+xlimit):(x1-xlimit);if(ylimit&&(Math.abs(ysize)>ylimit)) +y2=(ysize>0)?(y1+ylimit):(y1-ylimit);if(ymin&&(Math.abs(ysize)0)?(y1+ymin):(y1-ymin);if(xmin&&(Math.abs(xsize)0)?(x1+xmin):(x1-xmin);if(x1<0){x2-=x1;x1-=x1;} +if(y1<0){y2-=y1;y1-=y1;} +if(x2<0){x1-=x2;x2-=x2;} +if(y2<0){y1-=y2;y2-=y2;} +if(x2>boundx){var delta=x2-boundx;x1-=delta;x2-=delta;} +if(y2>boundy){var delta=y2-boundy;y1-=delta;y2-=delta;} +if(x1>boundx){var delta=x1-boundy;y2-=delta;y1-=delta;} +if(y1>boundy){var delta=y1-boundy;y2-=delta;y1-=delta;} +return makeObj(flipCoords(x1,y1,x2,y2));};function makeObj(a) +{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};};return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}();var Selection=function() +{var start,end,dragmode,awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;if(options.drawBorders){borders={top:insertBorder('hline').css('top',$.browser.msie?px(-1):px(0)),bottom:insertBorder('hline'),left:insertBorder('vline'),right:insertBorder('vline')};} +if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');} +options.sideHandles&&createHandles(['n','s','e','w']);options.cornerHandles&&createHandles(['sw','nw','ne','se']);function insertBorder(type) +{var jq=$('
').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;};function dragDiv(ord,zi) +{var jq=$('
').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi});$hdl_holder.append(jq);return jq;};function insertHandle(ord) +{return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass('handle'));};function insertDragbar(ord) +{var s=options.handleSize,o=hhs,h=s,w=s,t=o,l=o;switch(ord) +{case'n':case's':w=pct(100);break;case'e':case'w':h=pct(100);break;} +return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});};function createHandles(li) +{for(i in li)handle[li[i]]=insertHandle(li[i]);};function moveHandles(c) +{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;'e'in handle&&handle.e.css({top:px(midvert),left:px(east)})&&handle.w.css({top:px(midvert)})&&handle.s.css({top:px(south),left:px(midhoriz)})&&handle.n.css({left:px(midhoriz)});'ne'in handle&&handle.ne.css({left:px(east)})&&handle.se.css({top:px(south),left:px(east)})&&handle.sw.css({top:px(south)});'b'in handle&&handle.b.css({top:px(south)})&&handle.r.css({left:px(east)});};function moveto(x,y) +{$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)});};function resize(w,h) +{$sel.width(w).height(h);};function refresh() +{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();};function updateVisible() +{if(awake)return update();};function update() +{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);options.drawBorders&&borders['right'].css({left:px(c.w-1)})&&borders['bottom'].css({top:px(c.h-1)});seehandles&&moveHandles(c);awake||show();options.onChange(unscale(c));};function show() +{$sel.show();$img.css('opacity',options.bgOpacity);awake=true;};function release() +{disableHandles();$sel.hide();$img.css('opacity',1);awake=false;};function showHandles() +{if(seehandles) +{moveHandles(Coords.getFixed());$hdl_holder.show();}};function enableHandles() +{seehandles=true;if(options.allowResize) +{moveHandles(Coords.getFixed());$hdl_holder.show();return true;}};function disableHandles() +{seehandles=false;$hdl_holder.hide();};function animMode(v) +{(animating=v)?disableHandles():enableHandles();};function done() +{animMode(false);refresh();};var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360}) +$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done};}();var Tracker=function() +{var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;if(!trackDoc) +{$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);} +function toFront() +{$trk.css({zIndex:450});if(trackDoc) +{$(document).mousemove(trackMove).mouseup(trackUp);}} +function toBack() +{$trk.css({zIndex:290});if(trackDoc) +{$(document).unbind('mousemove',trackMove).unbind('mouseup',trackUp);}} +function trackMove(e) +{onMove(mouseAbs(e));};function trackUp(e) +{e.preventDefault();e.stopPropagation();if(btndown) +{btndown=false;onDone(mouseAbs(e));options.onSelect(unscale(Coords.getFixed()));toBack();onMove=function(){};onDone=function(){};} +return false;};function activateHandlers(move,done) +{btndown=true;onMove=move;onDone=done;toFront();return false;};function setCursor(t){$trk.css('cursor',t);};$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}();var KeyManager=function() +{var $keymgr=$('').css({position:'absolute',left:'-30px'}).keypress(parseKey).blur(onBlur),$keywrap=$('
').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys() +{if(options.keySupport) +{$keymgr.show();$keymgr.focus();}};function onBlur(e) +{$keymgr.hide();};function doNudge(e,x,y) +{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible();};e.preventDefault();e.stopPropagation();};function parseKey(e) +{if(e.ctrlKey)return true;shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode) +{case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true;} +return nothing(e);};if(options.keySupport)$keywrap.insertBefore($img);return{watchKeys:watchKeys};}();function px(n){return''+parseInt(n)+'px';};function pct(n){return''+parseInt(n)+'%';};function cssClass(cl){return options.baseClass+'-'+cl;};function getPos(obj) +{var pos=$(obj).offset();return[pos.left,pos.top];};function mouseAbs(e) +{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];};function myCursor(type) +{if(type!=lastcurs) +{Tracker.setCursor(type);lastcurs=type;}};function startDragMode(mode,pos) +{docOffset=getPos($img);Tracker.setCursor(mode=='move'?mode:mode+'-resize');if(mode=='move') +return Tracker.activateHandlers(createMover(pos),doneSelect);var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);};function dragmodeHandler(mode,f) +{return function(pos){if(!options.aspectRatio)switch(mode) +{case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;} +else switch(mode) +{case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;} +Coords.setCurrent(pos);Selection.update();};};function createMover(pos) +{var lloc=pos;KeyManager.watchKeys();return function(pos) +{Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};};function oppLockCorner(ord) +{switch(ord) +{case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';};};function createDragger(ord) +{return function(e){if(options.disabled)return false;if((ord=='move')&&!options.allowMove)return false;btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};};function presize($obj,w,h) +{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0) +{nw=w;nh=(w/$obj.width())*$obj.height();} +if((nh>h)&&h>0) +{nh=h;nw=(h/$obj.height())*$obj.width();} +xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);};function unscale(c) +{return{x:parseInt(c.x*xscale),y:parseInt(c.y*yscale),x2:parseInt(c.x2*xscale),y2:parseInt(c.y2*yscale),w:parseInt(c.w*xscale),h:parseInt(c.h*yscale)};};function doneSelect(pos) +{var c=Coords.getFixed();if(c.w>options.minSelect[0]&&c.h>options.minSelect[1]) +{Selection.enableHandles();Selection.done();} +else +{Selection.release();} +Tracker.setCursor(options.allowSelect?'crosshair':'default');};function newSelection(e) +{if(options.disabled)return false;if(!options.allowSelect)return false;btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();Selection.update();e.stopPropagation();e.preventDefault();return false;};function selectDrag(pos) +{Coords.setCurrent(pos);Selection.update();};function newTracker() +{var trk=$('
').addClass(cssClass('tracker'));$.browser.msie&&trk.css({opacity:0,backgroundColor:'white'});return trk;};function animateTo(a) +{var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating)return;var animto=Coords.flipCoords(x1,y1,x2,y2);var c=Coords.getFixed();var animat=initcr=[c.x,c.y,c.x2,c.y2];var interv=options.animationDelay;var x=animat[0];var y=animat[1];var x2=animat[2];var y2=animat[3];var ix1=animto[0]-initcr[0];var iy1=animto[1]-initcr[1];var ix2=animto[2]-initcr[2];var iy2=animto[3]-initcr[3];var pcent=0;var velocity=options.swingSpeed;Selection.animMode(true);var animator=function() +{return function() +{pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent<100)animateStart();else Selection.done();if(pcent>=99.8)pcent=100;setSelectRaw(animat);};}();function animateStart() +{window.setTimeout(animator,interv);};animateStart();};function setSelect(rect) +{setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);};function setSelectRaw(l) +{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();};function setOptions(opt) +{if(typeof(opt)!='object')opt={};options=$.extend(options,opt);if(typeof(options.onChange)!=='function') +options.onChange=function(){};if(typeof(options.onSelect)!=='function') +options.onSelect=function(){};};function tellSelect() +{return unscale(Coords.getFixed());};function tellScaled() +{return Coords.getFixed();};function setOptionsNew(opt) +{setOptions(opt);interfaceUpdate();};function disableCrop() +{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');};function enableCrop() +{options.disabled=false;interfaceUpdate();};function cancelCrop() +{Selection.done();Tracker.activateHandlers(null,null);};function destroy() +{$div.remove();$origimg.show();};function interfaceUpdate(alt) +{options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles();Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');$div.css('backgroundColor',options.bgColor);if('setSelect'in options){setSelect(opt.setSelect);Selection.done();delete(options.setSelect);} +if('trueSize'in options){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;} +xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if('outerImage'in options) +{$img.attr('src',options.outerImage);delete(options.outerImage);} +Selection.refresh();};$hdl_holder.hide();interfaceUpdate(true);var api={animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},release:Selection.release,destroy:destroy};$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options) +{function attachWhenDone(from) +{var loadsrc=options.useImg||from.src;var img=new Image();img.onload=function(){$.Jcrop(from,options);};img.src=loadsrc;};if(typeof(options)!=='object')options={};this.each(function() +{if($(this).data('Jcrop')) +{if(options=='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);} +else attachWhenDone(this);});return this;};})(jQuery); \ No newline at end of file diff --git a/modules/photoannotation/js/jquery.annotate.js b/modules/photoannotation/js/jquery.annotate.js new file mode 100644 index 00000000..264f19b2 --- /dev/null +++ b/modules/photoannotation/js/jquery.annotate.js @@ -0,0 +1,478 @@ +/// +(function($) { + + $.fn.annotateImage = function(options) { + /// + /// Creates annotations on the given image. + /// Images are loaded from the "getUrl" propety passed into the options. + /// + var opts = $.extend({}, $.fn.annotateImage.defaults, options); + var image = this; + + this.image = this; + this.mode = 'view'; + + // Assign defaults + this.getUrl = opts.getUrl; + this.saveUrl = opts.saveUrl; + this.deleteUrl = opts.deleteUrl; + this.currentUrl = opts.currentUrl; + this.deleteUrl = opts.deleteUrl; + this.editable = opts.editable; + this.useAjax = opts.useAjax; + this.tags = opts.tags; + this.notes = opts.notes; + this.labels = opts.labels; + this.csrf = opts.csrf; + + // Add the canvas + this.canvas = $('
'); + this.canvas.children('.image-annotate-edit').hide(); + this.canvas.children('.image-annotate-view').hide(); + this.image.after(this.canvas); + + // Give the canvas and the container their size and background + this.canvas.height(this.height()); + this.canvas.width(this.width()); + this.canvas.css('background-image', 'url("' + this.attr('src') + '")'); + this.canvas.children('.image-annotate-view, .image-annotate-edit').height(this.height()); + this.canvas.children('.image-annotate-view, .image-annotate-edit').width(this.width()); + + // Add the behavior: hide/show the notes when hovering the picture + this.canvas.hover(function() { + if ($(this).children('.image-annotate-edit').css('display') == 'none') { + $(this).children('.image-annotate-view').show(); + } + }, function() { + $(this).children('.image-annotate-view').hide(); + $(this).children('.image-annotate-note').hide(); + }); + + this.canvas.children('.image-annotate-view').hover(function() { + $(this).show(); + }, function() { + $(this).hide(); + $(this).children('.image-annotate-note').hide(); + }); + + // load the notes + if (this.useAjax) { + $.fn.annotateImage.ajaxLoad(this); + } else { + $.fn.annotateImage.load(this, this.labels, this.editable, this.csrf, this.deleteUrl); + } + + // Add the "Add a note" button + if ($('#g-photoannotation-link').length != 0) { + this.button = $('#g-photoannotation-link'); + this.button.click(function() { + $.fn.annotateImage.add(image, opts.tags, opts.labels, opts.saveUrl, opts.currentUrl, opts.csrf); + }); + //this.canvas.after(this.button); + } + + // Hide the original + this.hide(); + + return this; + }; + + /** + * Plugin Defaults + **/ + $.fn.annotateImage.defaults = { + getUrl: 'your-get.rails', + saveUrl: 'your-save.rails', + deleteUrl: 'your-delete.rails', + editable: true, + useAjax: true, + tags: new Array(), + notes: new Array() + }; + + $.fn.annotateImage.clear = function(image) { + /// + /// Clears all existing annotations from the image. + /// + for (var i = 0; i < image.notes.length; i++) { + image.notes[image.notes[i]].destroy(); + } + image.notes = new Array(); + }; + + $.fn.annotateImage.ajaxLoad = function(image) { + /// + /// Loads the annotations from the "getUrl" property passed in on the + /// options object. + /// + $.getJSON(image.getUrl + '?ticks=' + $.fn.annotateImage.getTicks(), function(data) { + image.notes = data; + $.fn.annotateImage.load(image); + }); + }; + + $.fn.annotateImage.load = function(image, labels, editable, csrf, deleteUrl) { + /// + /// Loads the annotations from the notes property passed in on the + /// options object. + /// + for (var i = 0; i < image.notes.length; i++) { + image.notes[image.notes[i]] = new $.fn.annotateView(image, image.notes[i], labels, editable, csrf, deleteUrl); + } + }; + + $.fn.annotateImage.getTicks = function() { + /// + /// Gets a count og the ticks for the current date. + /// This is used to ensure that URLs are always unique and not cached by the browser. + /// + var now = new Date(); + return now.getTime(); + }; + + $.fn.annotateImage.add = function(image, tags, labels, saveUrl, currentUrl, csrf) { + /// + /// Adds a note to the image. + /// + if (image.mode == 'view') { + image.mode = 'edit'; + + // Create/prepare the editable note elements + var editable = new $.fn.annotateEdit(image, null, tags, labels, saveUrl, currentUrl, csrf); + + $.fn.annotateImage.createSaveButton(editable, image); + $.fn.annotateImage.createCancelButton(editable, image); + } + }; + + $.fn.annotateImage.createSaveButton = function(editable, image, note) { + /// + /// Creates a Save button on the editable note. + /// + var ok = $('OK'); + + ok.click(function() { + var form = $('#image-annotate-edit-form form'); + var text = $('#image-annotate-text').val(); + $.fn.annotateImage.appendPosition(form, editable) + image.mode = 'view'; + + form.submit(); + + editable.destroy(); + }); + editable.form.append(ok); + }; + + $.fn.annotateImage.createCancelButton = function(editable, image) { + /// + /// Creates a Cancel button on the editable note. + /// + var cancel = $('Cancel'); + cancel.click(function() { + editable.destroy(); + image.mode = 'view'; + }); + editable.form.append(cancel); + }; + + $.fn.annotateImage.saveAsHtml = function(image, target) { + var element = $(target); + var html = ""; + for (var i = 0; i < image.notes.length; i++) { + html += $.fn.annotateImage.createHiddenField("text_" + i, image.notes[i].text); + html += $.fn.annotateImage.createHiddenField("top_" + i, image.notes[i].top); + html += $.fn.annotateImage.createHiddenField("left_" + i, image.notes[i].left); + html += $.fn.annotateImage.createHiddenField("height_" + i, image.notes[i].height); + html += $.fn.annotateImage.createHiddenField("width_" + i, image.notes[i].width); + } + element.html(html); + }; + + $.fn.annotateImage.createHiddenField = function(name, value) { + return '<input type="hidden" name="' + name + '" value="' + value + '" />
'; + }; + + $.fn.annotateEdit = function(image, note, tags, labels, saveUrl, currentUrl, csrf) { + /// + /// Defines an editable annotation area. + /// + this.image = image; + + if (note) { + this.note = note; + } else { + var newNote = new Object(); + newNote.id = "new"; + newNote.top = 30; + newNote.left = 30; + newNote.width = 30; + newNote.height = 30; + newNote.text = ""; + this.note = newNote; + } + + // Set area + var area = image.canvas.children('.image-annotate-edit').children('.image-annotate-edit-area'); + this.area = area; + this.area.css('height', this.note.height + 'px'); + this.area.css('width', this.note.width + 'px'); + this.area.css('left', this.note.left + 'px'); + this.area.css('top', this.note.top + 'px'); + + // Show the edition canvas and hide the view canvas + image.canvas.children('.image-annotate-view').hide(); + image.canvas.children('.image-annotate-edit').show(); + + // Add the note (which we'll load with the form afterwards) + var tagdropdown = labels[0] + ''; + var form = $('
' + tagdropdown + labels[1] + '' + labels[2] + '
'); + this.form = form; + + $('body').append(this.form); + this.form.css('left', this.area.offset().left + 'px'); + this.form.css('top', (parseInt(this.area.offset().top) + parseInt(this.area.height()) + 7) + 'px'); + + // Set the area as a draggable/resizable element contained in the image canvas. + // Would be better to use the containment option for resizable but buggy + area.resizable({ + handles: 'all', + + stop: function(e, ui) { + form.css('left', area.offset().left + 'px'); + form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); + } + }) + .draggable({ + containment: image.canvas, + drag: function(e, ui) { + form.css('left', area.offset().left + 'px'); + form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); + }, + stop: function(e, ui) { + form.css('left', area.offset().left + 'px'); + form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); + } + }); + return this; + }; + + $.fn.annotateEdit.prototype.destroy = function() { + /// + /// Destroys an editable annotation area. + /// + this.image.canvas.children('.image-annotate-edit').hide(); + this.area.resizable('destroy'); + this.area.draggable('destroy'); + this.area.css('height', ''); + this.area.css('width', ''); + this.area.css('left', ''); + this.area.css('top', ''); + this.form.remove(); + } + + $.fn.annotateView = function(image, note, labels, editable, csrf, deleteUrl) { + /// + /// Defines a annotation area. + /// + this.image = image; + + this.note = note; + + // Add the area + this.area = $('
'); + image.canvas.children('.image-annotate-view').prepend(this.area); + + if (editable) { + this.delarea = $('
'); + image.canvas.children('.image-annotate-view').prepend(this.delarea); + this.delarea.bind('click',function () { + if (confirm(labels[3])) { + var alink = $(".g-fullsize-link"); + alink.unbind(); + alink.attr ('href', '#'); + alink.removeAttr ('rel'); + window.location = deleteUrl + "/" + csrf; + } + }) + this.delarea.hide(); + } + + // Add the note + this.form = $('
' + note.text + '
'); + this.form.hide(); + image.canvas.children('.image-annotate-view').append(this.form); + this.form.children('span.actions').hide(); + + // Set the position and size of the note + this.setPosition(); + + // Add the behavior: hide/display the note when hovering the area + var annotation = this; + this.area.hover(function() { + annotation.show(); + if (annotation.delarea != undefined) { + annotation.delarea.show(); + } + }, function() { + annotation.hide(); + if (annotation.delarea != undefined) { + annotation.delarea.hide(); + } + }); + + if (editable) { + this.delarea.hover(function() { + annotation.delarea.show(); + }, function() { + annotation.delarea.hide(); + }); + } + // Edit a note feature + if (note.url != "" && note.url != null) { + this.area.bind('click',function () { + var alink = $(".g-fullsize-link"); + alink.unbind(); + alink.attr ('href', '#'); + alink.removeAttr ('rel'); + window.location = note.url; + }) + } + + + + }; + + $.fn.annotateView.prototype.setPosition = function() { + /// + /// Sets the position of an annotation. + /// + this.area.children('div').height((parseInt(this.note.height) - 2) + 'px'); + this.area.children('div').width((parseInt(this.note.width) - 2) + 'px'); + this.area.css('left', (this.note.left) + 'px'); + this.area.css('top', (this.note.top) + 'px'); + this.form.css('left', (this.note.left) + 'px'); + this.form.css('top', (parseInt(this.note.top) + parseInt(this.note.height) + 7) + 'px'); + + if (this.delarea != undefined) { + this.delarea.children('div').height('14px'); + this.delarea.children('div').width('14px'); + this.delarea.css('left', (this.note.left + parseInt(this.note.width)) + 'px'); + this.delarea.css('top', (this.note.top) + 'px'); + } + }; + + $.fn.annotateView.prototype.show = function() { + /// + /// Highlights the annotation + /// + this.form.fadeIn(250); + if (!this.note.editable) { + this.area.addClass('image-annotate-area-hover'); + } else { + this.area.addClass('image-annotate-area-editable-hover'); + } + }; + + $.fn.annotateView.prototype.hide = function() { + /// + /// Removes the highlight from the annotation. + /// + this.form.fadeOut(250); + this.area.removeClass('image-annotate-area-hover'); + this.area.removeClass('image-annotate-area-editable-hover'); + }; + + $.fn.annotateView.prototype.destroy = function() { + /// + /// Destroys the annotation. + /// + this.area.remove(); + this.form.remove(); + } + + $.fn.annotateView.prototype.edit = function() { + /// + /// Edits the annotation. + /// + if (this.image.mode == 'view') { + this.image.mode = 'edit'; + var annotation = this; + + // Create/prepare the editable note elements + var editable = new $.fn.annotateEdit(this.image, this.note); + + $.fn.annotateImage.createSaveButton(editable, this.image, annotation); + + // Add the delete button + var del = $('Delete'); + del.click(function() { + var form = $('#image-annotate-edit-form form'); + + $.fn.annotateImage.appendPosition(form, editable) + + if (annotation.image.useAjax) { + $.ajax({ + url: annotation.image.deleteUrl, + data: form.serialize(), + error: function(e) { alert("An error occured deleting that note.") } + }); + } + + annotation.image.mode = 'view'; + editable.destroy(); + annotation.destroy(); + }); + editable.form.append(del); + + $.fn.annotateImage.createCancelButton(editable, this.image); + } + }; + + $.fn.annotateImage.appendPosition = function(form, editable) { + /// + /// Appends the annotations coordinates to the given form that is posted to the server. + /// + var areaFields = $('' + + '' + + '' + + '' + + ''); + form.append(areaFields); + } + + $.fn.annotateView.prototype.resetPosition = function(editable, text) { + /// + /// Sets the position of an annotation. + /// + this.form.html(text); + this.form.hide(); + + // Resize + this.area.children('div').height(editable.area.height() + 'px'); + this.area.children('div').width((editable.area.width() - 2) + 'px'); + this.area.css('left', (editable.area.position().left) + 'px'); + this.area.css('top', (editable.area.position().top) + 'px'); + this.form.css('left', (editable.area.position().left) + 'px'); + this.form.css('top', (parseInt(editable.area.position().top) + parseInt(editable.area.height()) + 7) + 'px'); + + // Save new position to note + this.note.top = editable.area.position().top; + this.note.left = editable.area.position().left; + this.note.height = editable.area.height(); + this.note.width = editable.area.width(); + this.note.text = text; + this.note.id = editable.note.id; + this.editable = true; + }; + +})(jQuery); diff --git a/modules/photoannotation/js/jquery.annotate.min.js b/modules/photoannotation/js/jquery.annotate.min.js new file mode 100644 index 00000000..e56337fd --- /dev/null +++ b/modules/photoannotation/js/jquery.annotate.min.js @@ -0,0 +1 @@ +(function($){$.fn.annotateImage=function(options){var opts=$.extend({},$.fn.annotateImage.defaults,options);var image=this;this.image=this;this.mode='view';this.getUrl=opts.getUrl;this.saveUrl=opts.saveUrl;this.deleteUrl=opts.deleteUrl;this.editable=opts.editable;this.useAjax=opts.useAjax;this.notes=opts.notes;this.canvas=$('
');this.canvas.children('.image-annotate-edit').hide();this.canvas.children('.image-annotate-view').hide();this.image.after(this.canvas);this.canvas.height(this.height());this.canvas.width(this.width());this.canvas.css('background-image','url("'+this.attr('src')+'")');this.canvas.children('.image-annotate-view, .image-annotate-edit').height(this.height());this.canvas.children('.image-annotate-view, .image-annotate-edit').width(this.width());this.canvas.hover(function(){if($(this).children('.image-annotate-edit').css('display')=='none'){$(this).children('.image-annotate-view').show()}},function(){$(this).children('.image-annotate-view').hide();$(this).children('.image-annotate-note').hide()});this.canvas.children('.image-annotate-view').hover(function(){$(this).show()},function(){$(this).hide();$(this).children('.image-annotate-note').hide()});if(this.useAjax){$.fn.annotateImage.ajaxLoad(this)}else{$.fn.annotateImage.load(this)}if(this.editable){this.button=$('Add Note');this.button.click(function(){$.fn.annotateImage.add(image)});this.canvas.after(this.button)}this.hide();return this};$.fn.annotateImage.defaults={getUrl:'your-get.rails',saveUrl:'your-save.rails',deleteUrl:'your-delete.rails',editable:true,useAjax:true,notes:new Array()};$.fn.annotateImage.clear=function(image){for(var i=0;iOK');ok.click(function(){var form=$('#image-annotate-edit-form form');var text=$('#image-annotate-text').val();$.fn.annotateImage.appendPosition(form,editable)image.mode='view';if(image.useAjax){$.ajax({url:image.saveUrl,data:form.serialize(),error:function(e){alert("An error occured saving that note.")},success:function(data){if(data.annotation_id!=undefined){editable.note.id=data.annotation_id}},dataType:"json"})}if(note){note.resetPosition(editable,text)}else{editable.note.editable=true;note=new $.fn.annotateView(image,editable.note)note.resetPosition(editable,text);image.notes.push(editable.note)}editable.destroy()});editable.form.append(ok)};$.fn.annotateImage.createCancelButton=function(editable,image){var cancel=$('Cancel');cancel.click(function(){editable.destroy();image.mode='view'});editable.form.append(cancel)};$.fn.annotateImage.saveAsHtml=function(image,target){var element=$(target);var html="";for(var i=0;i'};$.fn.annotateEdit=function(image,note){this.image=image;if(note){this.note=note}else{var newNote=new Object();newNote.id="new";newNote.top=30;newNote.left=30;newNote.width=30;newNote.height=30;newNote.text="";this.note=newNote}var area=image.canvas.children('.image-annotate-edit').children('.image-annotate-edit-area');this.area=area;this.area.css('height',this.note.height+'px');this.area.css('width',this.note.width+'px');this.area.css('left',this.note.left+'px');this.area.css('top',this.note.top+'px');image.canvas.children('.image-annotate-view').hide();image.canvas.children('.image-annotate-edit').show();var form=$('
');this.form=form;$('body').append(this.form);this.form.css('left',this.area.offset().left+'px');this.form.css('top',(parseInt(this.area.offset().top)+parseInt(this.area.height())+7)+'px');area.resizable({handles:'all',stop:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')}}).draggable({containment:image.canvas,drag:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')},stop:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')}});return this};$.fn.annotateEdit.prototype.destroy=function(){this.image.canvas.children('.image-annotate-edit').hide();this.area.resizable('destroy');this.area.draggable('destroy');this.area.css('height','');this.area.css('width','');this.area.css('left','');this.area.css('top','');this.form.remove()}$.fn.annotateView=function(image,note){this.image=image;this.note=note;this.area=$('
');image.canvas.children('.image-annotate-view').prepend(this.area);this.form=$('
'+note.text+'
');this.form.hide();image.canvas.children('.image-annotate-view').append(this.form);this.form.children('span.actions').hide();this.setPosition();var annotation=this;this.area.hover(function(){annotation.show()},function(){annotation.hide()});if(note.url!=""&¬e.url!=null){this.area.bind('click',function(){window.location=note.url})}};$.fn.annotateView.prototype.setPosition=function(){this.area.children('div').height((parseInt(this.note.height)-2)+'px');this.area.children('div').width((parseInt(this.note.width)-2)+'px');this.area.css('left',(this.note.left)+'px');this.area.css('top',(this.note.top)+'px');this.form.css('left',(this.note.left)+'px');this.form.css('top',(parseInt(this.note.top)+parseInt(this.note.height)+7)+'px')};$.fn.annotateView.prototype.show=function(){this.form.fadeIn(250);if(!this.editable){this.area.addClass('image-annotate-area-hover')}else{this.area.addClass('image-annotate-area-editable-hover')}};$.fn.annotateView.prototype.hide=function(){this.form.fadeOut(250);this.area.removeClass('image-annotate-area-hover');this.area.removeClass('image-annotate-area-editable-hover')};$.fn.annotateView.prototype.destroy=function(){this.area.remove();this.form.remove()}$.fn.annotateView.prototype.edit=function(){if(this.image.mode=='view'){this.image.mode='edit';var annotation=this;var editable=new $.fn.annotateEdit(this.image,this.note);$.fn.annotateImage.createSaveButton(editable,this.image,annotation);var del=$('Delete');del.click(function(){var form=$('#image-annotate-edit-form form');$.fn.annotateImage.appendPosition(form,editable)if(annotation.image.useAjax){$.ajax({url:annotation.image.deleteUrl,data:form.serialize(),error:function(e){alert("An error occured deleting that note.")}})}annotation.image.mode='view';editable.destroy();annotation.destroy()});editable.form.append(del);$.fn.annotateImage.createCancelButton(editable,this.image)}};$.fn.annotateImage.appendPosition=function(form,editable){var areaFields=$(''+''+''+''+'');form.append(areaFields)}$.fn.annotateView.prototype.resetPosition=function(editable,text){this.form.html(text);this.form.hide();this.area.children('div').height(editable.area.height()+'px');this.area.children('div').width((editable.area.width()-2)+'px');this.area.css('left',(editable.area.position().left)+'px');this.area.css('top',(editable.area.position().top)+'px');this.form.css('left',(editable.area.position().left)+'px');this.form.css('top',(parseInt(editable.area.position().top)+parseInt(editable.area.height())+7)+'px');this.note.top=editable.area.position().top;this.note.left=editable.area.position().left;this.note.height=editable.area.height();this.note.width=editable.area.width();this.note.text=text;this.note.id=editable.note.id;this.editable=true}})(jQuery); diff --git a/modules/photoannotation/js/jquery.min.js b/modules/photoannotation/js/jquery.min.js new file mode 100644 index 00000000..55c2e6d7 --- /dev/null +++ b/modules/photoannotation/js/jquery.min.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/modules/photoannotation/models/items_face.php b/modules/photoannotation/models/items_face.php new file mode 100644 index 00000000..70395b35 --- /dev/null +++ b/modules/photoannotation/models/items_face.php @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + +
+ dynamic_top() ?> +
+

+

+ resize_img(array("id" => "g-select-photo-id-{$item->id}", "class" => "g-select-resize", "style" => "position: fixed;")) ?> +
+
+ + + +
+ +
+ +


+ +
+
+

+ +
+
+ +
+ + + +dynamic_bottom() ?> diff --git a/modules/photoannotation/views/photoannotation_highlight_block.html.php b/modules/photoannotation/views/photoannotation_highlight_block.html.php new file mode 100644 index 00000000..bc18d181 --- /dev/null +++ b/modules/photoannotation/views/photoannotation_highlight_block.html.php @@ -0,0 +1,79 @@ +where("item_id", "=", $item->id) + ->find_all(); + $existingNotes = ORM::factory("items_note") + ->where("item_id", "=", $item->id) + ->find_all(); + $tags_arraystring = ""; + $jscode = ""; + // If it does, then insert some javascript and display an image map + // to show where the faces are at. + if ((count($existingFaces) > 0) || (count($existingNotes) > 0)) { + $jscode = "notes: [ "; + foreach ($existingFaces as $oneFace) { + $oneTag = ORM::factory("tag", $oneFace->tag_id); + $jscode .= "{ \"top\": ". $oneFace->y1 .",\n"; + $jscode .= "\"left\": ". $oneFace->x1 .",\n"; + $jscode .= "\"width\": ". ($oneFace->x2 - $oneFace->x1) .",\n"; + $jscode .= "\"height\": ". ($oneFace->y2 - $oneFace->y1) .",\n"; + $jscode .= "\"text\": \"". html::clean($oneTag->name) ."\",\n"; + $jscode .= "\"noteid\": ". $oneNote->id .",\n"; + $jscode .= "\"editable\": true,\n"; + $jscode .= "\"url\": \"". $oneTag->url() ."\" },\n"; + } + + foreach ($existingNotes as $oneNote) { + $tagdesc = ""; + if ($oneNote->description) { + $tagdesc = "
". html::clean($oneNote->description); + } + $jscode .= "{ \"top\": ". $oneNote->y1 .",\n"; + $jscode .= "\"left\": ". $oneNote->x1 .",\n"; + $jscode .= "\"width\": ". ($oneNote->x2 - $oneNote->x1) .",\n"; + $jscode .= "\"height\": ". ($oneNote->y2 - $oneNote->y1) .",\n"; + $jscode .= "\"text\": \"". html::clean($oneNote->title) . $tagdesc ."\",\n"; + $jscode .= "\"noteid\": ". $oneNote->id .",\n"; + $jscode .= "\"editable\": false,\n"; + $jscode .= "\"url\": \"\" },\n"; + } + $jscode = trim($jscode, ",\n"); + $jscode .= " ],"; + } + $item_tags = ORM::factory("tag") + ->join("items_tags", "tags.id", "items_tags.tag_id") + ->where("items_tags.item_id", "=", $item->id) + ->find_all(); + $tags_arraystring = "tags: [ "; + foreach ($item_tags as $current_tag) { + $tags_arraystring .= "{'name':'". html::clean($current_tag->name) ."','id':'". $current_tag->id ."'},"; + } + $tags_arraystring = trim($tags_arraystring, ","); + $tags_arraystring .= " ],"; + $labels_arraystring = "labels: [ '". t("Tag:") ."','". t("Note Title:") ."','". t("Description (optional):") ."','". t("Are you sure you want to delete this annotation?") ."' ],"; +?> + + + + From 92ac174dd9e142d89cc97e34793f065869948771 Mon Sep 17 00:00:00 2001 From: hukoeth Date: Sat, 28 Aug 2010 10:49:50 +0200 Subject: [PATCH 3/8] Removed tagfaces interface, annotations can now be deleted on the photo, annotations can be displayed under the photo --- .../controllers/admin_photoannotation.php | 57 + .../controllers/photoannotation.php | 476 ++----- .../photoannotation/css/photoannotation.css | 382 +++--- .../helpers/photoannotation_event.php | 174 +-- .../helpers/photoannotation_installer.php | 172 +-- .../helpers/photoannotation_theme.php | 64 +- modules/photoannotation/images/jcrop.gif | Bin 329 -> 0 bytes modules/photoannotation/js/jquery.Jcrop.js | 1197 ----------------- .../photoannotation/js/jquery.Jcrop.min.js | 163 --- modules/photoannotation/js/jquery.annotate.js | 957 ++++++------- .../photoannotation/js/jquery.annotate.min.js | 3 +- modules/photoannotation/js/jquery.min.js | 19 - modules/photoannotation/models/items_face.php | 40 +- modules/photoannotation/models/items_note.php | 40 +- modules/photoannotation/module.info | 2 +- .../views/admin_photoannotation.html.php | 11 + .../views/photoannotation.html.php | 141 -- .../photoannotation_highlight_block.html.php | 187 +-- 18 files changed, 1198 insertions(+), 2887 deletions(-) create mode 100644 modules/photoannotation/controllers/admin_photoannotation.php delete mode 100644 modules/photoannotation/images/jcrop.gif delete mode 100644 modules/photoannotation/js/jquery.Jcrop.js delete mode 100644 modules/photoannotation/js/jquery.Jcrop.min.js delete mode 100644 modules/photoannotation/js/jquery.min.js create mode 100644 modules/photoannotation/views/admin_photoannotation.html.php delete mode 100644 modules/photoannotation/views/photoannotation.html.php diff --git a/modules/photoannotation/controllers/admin_photoannotation.php b/modules/photoannotation/controllers/admin_photoannotation.php new file mode 100644 index 00000000..58d53444 --- /dev/null +++ b/modules/photoannotation/controllers/admin_photoannotation.php @@ -0,0 +1,57 @@ +_get_view(); + } + + public function handler() { + access::verify_csrf(); + + $form = $this->_get_form(); + if ($form->validate()) { + module::set_var( + "photoannotation", "showfaces", $form->photoannotation->showfaces->value, true); + module::set_var( + "photoannotation", "shownotes", $form->photoannotation->shownotes->value, true); + message::success(t("Your settings have been saved.")); + url::redirect("admin/photoannotation"); + } + print $this->_get_view($form); + } + + private function _get_view($form=null) { + $v = new Admin_View("admin.html"); + $v->content = new View("admin_photoannotation.html"); + $v->content->form = empty($form) ? $this->_get_form() : $form; + return $v; + } + + private function _get_form() { + $form = new Forge("admin/photoannotation/handler", "", "post", array("id" => "g-admin-form")); + $group = $form->group("photoannotation")->label(t("Photo annotation settings")); + $group->checkbox("showfaces")->label(t("Show face annotation below photo.")) + ->checked(module::get_var("photoannotation", "showfaces", false)); + $group->checkbox("shownotes")->label(t("Show note annotations below photo.")) + ->checked(module::get_var("photoannotation", "shownotes", false)); + $form->submit("submit")->value(t("Save")); + return $form; + } +} diff --git a/modules/photoannotation/controllers/photoannotation.php b/modules/photoannotation/controllers/photoannotation.php index 8395d726..4e690115 100644 --- a/modules/photoannotation/controllers/photoannotation.php +++ b/modules/photoannotation/controllers/photoannotation.php @@ -1,364 +1,112 @@ -item_id = $item_data; - $newnote->x1 = $str_x1; - $newnote->y1 = $str_y1; - $newnote->x2 = $str_x2; - $newnote->y2 = $str_y2; - $newnote->title = $str_face_title; - $newnote->description = $str_face_description; - $newnote->save(); - } else { - // Check to see if the tag already has a face associated with it. - $existingFace = ORM::factory("items_face") - ->where("tag_id", "=", $tag_data) - ->where("item_id", "=", $item_data) - ->find_all(); - - if (count($existingFace) == 0) { - // Save the new face to the database. - $newface = ORM::factory("items_face"); - $newface->tag_id = $tag_data; - $newface->item_id = $item_data; - $newface->x1 = $str_x1; - $newface->y1 = $str_y1; - $newface->x2 = $str_x2; - $newface->y2 = $str_y2; - $newface->description = $str_face_description; - $newface->save(); - } else { - // Update the coordinates of an existing face. - $updatedFace = ORM::factory("items_face", $existingFace[0]->id); - $updatedFace->x1 = $str_x1; - $updatedFace->y1 = $str_y1; - $updatedFace->x2 = $str_x2; - $updatedFace->y2 = $str_y2; - $updatedFace->description = $str_face_description; - $updatedFace->save(); - } - } - message::success(t("Face saved.")); - url::redirect($redir_uri); - return; - } - - public function drawfaces($id) { - // Generate the page that allows the user to draw boxes over a photo. - // Make sure user has access to view and edit the photo. - $item = ORM::factory("item", $id); - access::required("view", $item); - access::required("edit", $item); - - // Create the page. - $template = new Theme_View("page.html", "other", "photoannotation"); - $template->set_global("item_id", $id); - $template->set_global("page_title", t("Draw Faces")); - $template->set_global("page_type", "other"); - $template->set_global("page_subtype", "photoface"); - $template->content = new View("photoannotation.html"); - $template->content->title = t("Tag Faces"); - $template->content->form = $this->_get_faces_form($id); - $template->content->delete_form = $this->_get_delfaces_form($id); - - // Display the page. - print $template; - } - - public function delface() { - // Delete the specified face data from the photo. - - // Prevent Cross Site Request Forgery - access::verify_csrf(); - - // Convert submitted data to local variables. - // Figure out which tagged faces and notes to delete. - $tag_data = Input::instance()->post("facesList"); - $note_data = Input::instance()->post("notesList"); - // Figure out the item id, in order to reload the correct face tagging page. - $item_data = Input::instance()->post("item_id"); - - // If the user didn't select a tag or note, display and error and abort. - if ((count($tag_data) == 0) && (count($note_data) == 0)) { - message::error(t("Please select a tag or note to delete.")); - url::redirect("photoannotation/drawfaces/$item_data"); - return; - } - - // Delete the face(s) from the database. - foreach ($tag_data as $one_tag) { - db::build()->delete("items_faces")->where("id", "=", $one_tag)->execute(); - } - - // Delete the notes(s) from the database. - foreach ($note_data as $one_note) { - db::build()->delete("items_notes")->where("id", "=", $one_note)->execute(); - } - - // Display a success message for deleted faces. - if (count($tag_data) == 1) { - message::success(t("One face deleted.")); - } elseif (count($tag_data) > 1) { - message::success(count($tag_data) . t(" faces deleted.")); - } - - // Display a success message for deleted notes. - if (count($note_data) == 1) { - message::success(t("One note deleted.")); - } elseif (count($note_data) > 1) { - message::success(count($note_data) . t(" notes deleted.")); - } - - // Re-load the face tagging page. - url::redirect("photoannotation/drawfaces/$item_data"); - } - - public function saveface() { - // Save the face coordinates to the specified tag. - - // Prevent Cross Site Request Forgery - access::verify_csrf(); - - // Convert submitted data to local variables. - $tag_data = Input::instance()->post("tagsList"); - $str_face_title = str_replace("'", "\'", Input::instance()->post("face_title")); - $str_face_description = str_replace("'", "\'", Input::instance()->post("face_description")); - $item_data = Input::instance()->post("item_id"); - $str_x1 = Input::instance()->post("x1"); - $str_y1 = Input::instance()->post("y1"); - $str_x2 = Input::instance()->post("x2"); - $str_y2 = Input::instance()->post("y2"); - - // If the user didn't select a face, display an error and abort. - if (($str_x1 == "") || ($str_x2 == "") || ($str_y1 == "") || ($str_y2 == "")) { - message::error(t("Please select a face.")); - url::redirect("photoannotation/drawfaces/$item_data"); - return; - } - - // Decide if we are saving a face or a note. - if ($tag_data == -1) { - // Make sure there's a title. - if ($str_face_title == "") { - message::error(t("Please select a Tag or specify a Title.")); - url::redirect("photoannotation/drawfaces/$item_data"); - return; - } - - // Save a new Note to the database. - $newnote = ORM::factory("items_note"); - $newnote->item_id = $item_data; - $newnote->x1 = $str_x1; - $newnote->y1 = $str_y1; - $newnote->x2 = $str_x2; - $newnote->y2 = $str_y2; - $newnote->title = $str_face_title; - $newnote->description = $str_face_description; - $newnote->save(); - - } else { - // Check to see if the tag already has a face associated with it. - $existingFace = ORM::factory("items_face") - ->where("tag_id", "=", $tag_data) - ->where("item_id", "=", $item_data) - ->find_all(); - - if (count($existingFace) == 0) { - // Save the new face to the database. - $newface = ORM::factory("items_face"); - $newface->tag_id = $tag_data; - $newface->item_id = $item_data; - $newface->x1 = $str_x1; - $newface->y1 = $str_y1; - $newface->x2 = $str_x2; - $newface->y2 = $str_y2; - $newface->description = $str_face_description; - $newface->save(); - } else { - // Update the coordinates of an existing face. - $updatedFace = ORM::factory("items_face", $existingFace[0]->id); - $updatedFace->x1 = $str_x1; - $updatedFace->y1 = $str_y1; - $updatedFace->x2 = $str_x2; - $updatedFace->y2 = $str_y2; - $updatedFace->description = $str_face_description; - $updatedFace->save(); - } - } - - // Redirect back to the main screen and display a "success" message. - message::success(t("Annotation saved.")); - url::redirect("photoannotation/drawfaces/$item_data"); - } - - private function _get_faces_form($id) { - // Generate the form that allows the user to select a tag to - // save the face too. Also displays the coordinates of the face - // and the "Save face" button. - - // Make a new Form. - $form = new Forge("photoannotation/saveface", "", "post", - array("id" => "g-tag-faces-form")); - - // Create an array of all the tags for the current item. - $all_tags = ORM::factory("tag") - ->join("items_tags", "tags.id", "items_tags.tag_id") - ->where("items_tags.item_id", "=", $id) - ->find_all(); - - // Generate an array of tags to use as checkboxes. - $array_tags = ""; - $array_tags[-1] = t("No Tag"); - foreach ($all_tags as $oneTag) { - $array_tags[$oneTag->id] = $oneTag->name; - } - - // Make a checklist of tags on the form. - $tags_group = $form->group("FaceTag") - ->label(t("Select a tag or enter in a title:")); - - $tags_group->dropdown('tagsList') - ->label(t("Tag:")) - ->id('tagsList') - ->options($array_tags); - - $tags_group->input("face_title") - ->id('face_title') - ->label(t("Note Title:")); - - $tags_description = $form->group("TagsDescription") - ->label(t("Description (optional):")); - $tags_description->input("face_description") - ->id('face_description'); - - // Generate input boxes to hold the coordinates of the face. - $coordinates_group = $form->group("FaceCoordinates") - ->label(t("Coordinates:")); - $coordinates_group->input('x1') - ->id('x1') - ->label(t("X1")); - $coordinates_group->input("y1") - ->id('y1') - ->label(t("Y1")); - $coordinates_group->input("x2") - ->id('x2') - ->label(t("X2")); - $coordinates_group->input("y2") - ->id('y2') - ->label(t("Y2")); - - // Add the id# of the photo and a save button to the form. - $coordinates_group->hidden("item_id")->value($id); - $form->submit("SaveFace")->value(t("Save face")); - - // Return the newly generated form. - return $form; - } - - private function _get_delfaces_form($id) { - // Generate a form to allow the user to remove face data - // from a photo. - // Make a new Form. - $form = new Forge("photoannotation/delface", "", "post", - array("id" => "g-tag-del-faces-form")); - - // Create an array of all the tags that already have faces. - $existing_faces = ORM::factory("items_face") - ->where("item_id", "=", $id) - ->find_all(); - - // turn the $existing_faces array into an array that can be used - // for a checklist. - $array_faces = ""; - foreach ($existing_faces as $oneFace) { - $array_faces[$oneFace->id] = array(ORM::factory("tag", - $oneFace->tag_id)->name, false); - } - - if ($array_faces) { - // Add a checklist to the form. - $tags_group = $form->group("ExistingFaces") - ->label(t("Tags with faces:")); - // Add the id# of the photo and a delete button to the form. - $tags_group->hidden("item_id")->value($id); - - $tags_group->checklist("facesList") - ->options($array_faces) - ->label(t("Select the tag(s) that correspond(s) to the face(s) you wish to delete:")); - } - - // Create an array of all the notes associated with this photo. - $existing_notes = ORM::factory("items_note") - ->where("item_id", "=", $id) - ->find_all(); - - // turn the $existing_notes array into an array that can be used - // for a checklist. - $array_notes = ""; - foreach ($existing_notes as $oneNote) { - $array_notes[$oneNote->id] = array($oneNote->title, false); - } - - if ($array_notes) { - // Add a checklist to the form. - $notes_group = $form->group("ExistingNotes") - ->label(t("Notes:")); - // Add the id# of the photo and a delete button to the form. - $notes_group->hidden("item_id")->value($id); - - $notes_group->checklist("notesList") - ->options($array_notes) - ->label(t("Select the notes you wish to delete:")); - } - - // Hide the delete button when there's nothing to delete. - if (($array_notes) || ($array_faces)) { - $form->submit("DeleteFace")->value(t("Delete face(s) / note(s)")); - } else { - $form->group("NoFacesNotes")->label(t("There is nothing to delete for this photo.")); - } - - // Return the newly generated form. - return $form; - } -} +item_id = $item_data; + $newnote->x1 = $str_x1; + $newnote->y1 = $str_y1; + $newnote->x2 = $str_x2; + $newnote->y2 = $str_y2; + $newnote->title = $str_face_title; + $newnote->description = $str_face_description; + $newnote->save(); + } else { + // Check to see if the tag already has a face associated with it. + $existingFace = ORM::factory("items_face") + ->where("tag_id", "=", $tag_data) + ->where("item_id", "=", $item_data) + ->find_all(); + + if (count($existingFace) == 0) { + // Save the new face to the database. + $newface = ORM::factory("items_face"); + $newface->tag_id = $tag_data; + $newface->item_id = $item_data; + $newface->x1 = $str_x1; + $newface->y1 = $str_y1; + $newface->x2 = $str_x2; + $newface->y2 = $str_y2; + $newface->description = $str_face_description; + $newface->save(); + } else { + // Update the coordinates of an existing face. + $updatedFace = ORM::factory("items_face", $existingFace[0]->id); + $updatedFace->x1 = $str_x1; + $updatedFace->y1 = $str_y1; + $updatedFace->x2 = $str_x2; + $updatedFace->y2 = $str_y2; + $updatedFace->description = $str_face_description; + $updatedFace->save(); + } + } + message::success(t("Annotation saved.")); + url::redirect($redir_uri); + return; + } + + public function delete() { + // Prevent Cross Site Request Forgery + access::verify_csrf(); + + //Get form data + $noteid = $_POST["noteid"]; + $notetype = $_POST["notetype"]; + $redir_uri = $_POST["currenturl"]; + + if ($noteid == "" || $notetype == "") { + message::error(t("Please select a tag or note to delete.")); + url::redirect($redir_uri); + return; + } + + if ($notetype == "face") { + db::build()->delete("items_faces")->where("id", "=", $noteid)->execute(); + message::success(t("Annotation deleted.")); + } elseif ($notetype == "note") { + db::build()->delete("items_notes")->where("id", "=", $noteid)->execute(); + message::success(t("Annotation deleted.")); + } else { + message::error(t("Please select a tag or note to delete.")); + } + url::redirect($redir_uri); + } +} diff --git a/modules/photoannotation/css/photoannotation.css b/modules/photoannotation/css/photoannotation.css index bc2f7f86..eb63b714 100644 --- a/modules/photoannotation/css/photoannotation.css +++ b/modules/photoannotation/css/photoannotation.css @@ -1,200 +1,182 @@ -.image-annotate-add { - background: #fff url(../images/asterisk_yellow.png) no-repeat 3px 3px; - color: #000 !important; - cursor: pointer; - display: block; - float: left; - font-family: Verdana, Sans-Serif; - font-size: 12px; - height: 18px; - line-height: 18px; - padding: 2px 0 2px 24px; - margin: 5px 0; - width: 64px; - text-decoration: none; -} -.image-annotate-add:hover { - background-color: #eee; -} -.image-annotate-canvas { - background-position: left top; - background-repeat: no-repeat; - display: block; - margin: 0 auto; - position: relative; -} -.image-annotate-view { - display: none; - position: relative; -} -.image-annotate-area { - border: 1px solid #000000; - position: absolute; - cursor: default; -} -.image-annotate-area div { - border: 1px solid #FFFFFF; - display: block; -} -.image-annotate-area-editable { - cursor: pointer; -} -.image-annotate-area-editable-hover div { - border-color: #00AD00 !important; -} -.image-annotate-note { - background: #000000 none repeat scroll 0 0; - color: #FFFFFF; - display: none; - font-family: Verdana, Sans-Serif; - font-size: 1.4em; - max-width: 200px; - padding: 3px 7px; - position: absolute; -} -.image-annotate-note .actions { - display: block; - font-size: 80%; -} -.image-annotate-edit { - display: none; -} -#image-annotate-edit-form { - background: #FFFFFF none repeat scroll 0 0; - border: 1px solid #000000; - height: 220px; - padding: 7px; - position: absolute; - width: 250px; -} -#image-annotate-edit-form form { - clear: right; - margin: 0 !important; - padding: 0; - z-index: 999; - text-align: left; - color: #000000; -} -#image-annotate-edit-form .box { - margin: 0; -} -#image-annotate-edit-form input.form-text, #image-annotate-edit-form #edit-comment-wrapper textarea { - width: 90%; -} -#image-annotate-edit-form textarea { - height: 50px; - font-family: Verdana, Sans-Serif; - font-size: 12px; - width: 248px; -} -#image-annotate-edit-form fieldset { - background: transparent none repeat scroll 0 0; -} -#image-annotate-edit-form .form-item { - margin: 0 0 5px; -} -#image-annotate-edit-form .form-button, #image-annotate-edit-form .form-submit { - margin: 0; -} -#image-annotate-edit-form a { - cursor: pointer; - display: block; - float: left; - margin: 3px 6px 3px 0; -} -.image-annotate-edit-area { - border: 1px solid black; - cursor: move; - display: block; - height: 60px; - left: 10px; - margin: 0; - padding: 0; - position: absolute; - top: 10px; - width: 60px; -} -.image-annotate-edit-area .ui-resizable-handle { - opacity: 0.8; -} -.image-annotate-edit-ok { - /*background-image: url(../images/accept.png);*/ -} -.image-annotate-edit-delete { - background-image: url(../images/delete.png); -} -.image-annotate-edit-close { - /*background-image: url(../images/cross.png);*/ -} -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - z-index: 99999; - display: block; -} -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable- autohide .ui-resizable-handle { - display: block; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0px; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0px; -} -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0px; - height: 100%; -} -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0px; - height: 100%; -} -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} -.photoannotation-del-button { - background-image: url('../images/delete.png'); - cursor: pointer; -} +.image-annotate-canvas { + background-position: left top; + background-repeat: no-repeat; + display: block; + margin: 0 auto; + position: relative; +} +.image-annotate-view { + display: none; + position: relative; +} +.image-annotate-area { + border: 1px solid #000000; + position: absolute; + cursor: default; +} +.image-annotate-area div { + border: 1px solid #FFFFFF; + display: block; +} +.image-annotate-area-editable { + cursor: pointer; +} +.image-annotate-area-editable-hover div { + border-color: #00AD00 !important; +} +.image-annotate-note { + background: #000000 none repeat scroll 0 0; + color: #FFFFFF; + display: none; + font-family: Verdana, Sans-Serif; + font-size: 1.4em; + max-width: 200px; + padding: 3px 7px; + position: absolute; +} +.image-annotate-note .actions { + display: block; + font-size: 80%; +} +.image-annotate-edit { + display: none; +} +#image-annotate-edit-form { + background: #FFFFFF none repeat scroll 0 0; + border: 1px solid #000000; + height: 220px; + padding: 7px; + position: absolute; + width: 250px; +} +#image-annotate-edit-form form { + clear: right; + margin: 0 !important; + padding: 0; + z-index: 999; + text-align: left; + color: #000000; +} +#image-annotate-edit-form .box { + margin: 0; +} +#image-annotate-edit-form input.form-text, #image-annotate-edit-form #edit-comment-wrapper textarea { + width: 90%; +} +#image-annotate-edit-form textarea { + height: 50px; + font-family: Verdana, Sans-Serif; + font-size: 12px; + width: 248px; +} +#image-annotate-edit-form fieldset { + background: transparent none repeat scroll 0 0; +} +#image-annotate-edit-form .form-item { + margin: 0 0 5px; +} +#image-annotate-edit-form .form-button, #image-annotate-edit-form .form-submit { + margin: 0; +} +#image-annotate-edit-form a { + cursor: pointer; + display: block; + float: left; + margin: 3px 6px 3px 0; +} +.image-annotate-edit-area { + border: 1px solid black; + cursor: move; + display: block; + height: 60px; + left: 10px; + margin: 0; + padding: 0; + position: absolute; + top: 10px; + width: 60px; +} +.image-annotate-edit-area .ui-resizable-handle { + opacity: 0.8; +} +.image-annotate-edit-ok { + /*background-image: url(../images/accept.png);*/ +} +.image-annotate-edit-delete { + background-image: url(../images/delete.png); +} +.image-annotate-edit-close { + /*background-image: url(../images/cross.png);*/ +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + z-index: 99999; + display: block; +} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable- autohide .ui-resizable-handle { + display: block; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0px; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0px; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.photoannotation-del-button { + background-image: url('../images/delete.png'); + cursor: pointer; +} diff --git a/modules/photoannotation/helpers/photoannotation_event.php b/modules/photoannotation/helpers/photoannotation_event.php index 011a3f09..2a40e8ae 100644 --- a/modules/photoannotation/helpers/photoannotation_event.php +++ b/modules/photoannotation/helpers/photoannotation_event.php @@ -1,86 +1,88 @@ -deactivate)) { - site_status::warning( - t("The Photo Annotation module requires the Tags module. " . - "Activate the Tags module now", - array("url" => url::site("admin/modules"))), - "photoannotation_needs_tag"); - } else { - site_status::clear("photoannotation_needs_tag"); - } - if (module::is_active("tagfaces") || in_array("tagfaces", $changes->activate)) { - site_status::warning( - t("The Photo Annotation module cannot be used together with the TagFaces module. " . - "Dectivate the TagFaces module now", - array("url" => url::site("admin/modules"))), - "photoannotation_incompatibility_tagfaces"); - } else { - site_status::clear("photoannotation_incompatibility_tagfaces"); - } - } - - static function site_menu($menu, $theme) { - // Create a menu option for adding face data. - if (!$theme->item()) { - return; - } - - $item = $theme->item(); - - if ($item->is_photo()) { - if ((access::can("view", $item)) && (access::can("edit", $item))) { - $menu->get("options_menu") - ->append(Menu::factory("link") - ->id("photoannotation") - ->label(t("Add annotation")) - ->css_id("g-photoannotation-link") - ->url("#")); - $menu->get("options_menu") - ->append(Menu::factory("link") - ->id("photoannotation_edit") - ->label(t("Edit annotations")) - ->css_id("g-photoannotation-edit-link") - ->url(url::site("photoannotation/drawfaces/" . $item->id))); - } - } - } - - static function item_deleted($item) { - // Check for and delete existing Faces and Notes. - $existingFaces = ORM::factory("items_face") - ->where("item_id", "=", $item->id) - ->find_all(); - if (count($existingFaces) > 0) { - db::build()->delete("items_faces")->where("item_id", "=", $item->id)->execute(); - } - - $existingNotes = ORM::factory("items_note") - ->where("item_id", "=", $item->id) - ->find_all(); - if (count($existingNotes) > 0) { - db::build()->delete("items_notes")->where("item_id", "=", $item->id)->execute(); - } - } -} +deactivate)) { + site_status::warning( + t("The Photo Annotation module requires the Tags module. " . + "Activate the Tags module now", + array("url" => url::site("admin/modules"))), + "photoannotation_needs_tag"); + } else { + site_status::clear("photoannotation_needs_tag"); + } + if (module::is_active("tagfaces") || in_array("tagfaces", $changes->activate)) { + site_status::warning( + t("The Photo Annotation module cannot be used together with the TagFaces module. " . + "Dectivate the TagFaces module now", + array("url" => url::site("admin/modules"))), + "photoannotation_incompatibility_tagfaces"); + } else { + site_status::clear("photoannotation_incompatibility_tagfaces"); + } + } + + static function site_menu($menu, $theme) { + // Create a menu option for adding face data. + if (!$theme->item()) { + return; + } + + $item = $theme->item(); + + if ($item->is_photo()) { + if ((access::can("view", $item)) && (access::can("edit", $item))) { + $menu->get("options_menu") + ->append(Menu::factory("link") + ->id("photoannotation") + ->label(t("Add annotation")) + ->css_id("g-photoannotation-link") + ->url("#")); + } + } + } + + static function item_deleted($item) { + // Check for and delete existing Faces and Notes. + $existingFaces = ORM::factory("items_face") + ->where("item_id", "=", $item->id) + ->find_all(); + if (count($existingFaces) > 0) { + db::build()->delete("items_faces")->where("item_id", "=", $item->id)->execute(); + } + + $existingNotes = ORM::factory("items_note") + ->where("item_id", "=", $item->id) + ->find_all(); + if (count($existingNotes) > 0) { + db::build()->delete("items_notes")->where("item_id", "=", $item->id)->execute(); + } + } + + static function admin_menu($menu, $theme) { + $menu->get("settings_menu") + ->append(Menu::factory("link") + ->id("photoannotation_menu") + ->label(t("Photo Annotation")) + ->url(url::site("admin/photoannotation"))); + } +} diff --git a/modules/photoannotation/helpers/photoannotation_installer.php b/modules/photoannotation/helpers/photoannotation_installer.php index ea3b7c0f..0f84aad8 100644 --- a/modules/photoannotation/helpers/photoannotation_installer.php +++ b/modules/photoannotation/helpers/photoannotation_installer.php @@ -1,86 +1,86 @@ -query("CREATE TABLE IF NOT EXISTS {items_faces} ( - `id` int(9) NOT NULL auto_increment, - `tag_id` int(9) NOT NULL, - `item_id` int(9) NOT NULL, - `x1` int(9) NOT NULL, - `y1` int(9) NOT NULL, - `x2` int(9) NOT NULL, - `y2` int(9) NOT NULL, - `description` varchar(2048) default NULL, - PRIMARY KEY (`id`)) - DEFAULT CHARSET=utf8;"); - - $db->query("CREATE TABLE IF NOT EXISTS {items_notes} ( - `id` int(9) NOT NULL auto_increment, - `item_id` int(9) NOT NULL, - `x1` int(9) NOT NULL, - `y1` int(9) NOT NULL, - `x2` int(9) NOT NULL, - `y2` int(9) NOT NULL, - `title` varchar(64) NOT NULL, - `description` varchar(2048) default NULL, - PRIMARY KEY (`id`)) - DEFAULT CHARSET=utf8;"); - - // Set the module's version number. - module::set_version("photoannotation", 1); - } - - static function upgrade($version) { - $db = Database::instance(); - if ($version == 1) { - $db->query("ALTER TABLE {items_faces} ADD `description` varchar(2048) default NULL"); - - $db->query("CREATE TABLE IF NOT EXISTS {items_notes} ( - `id` int(9) NOT NULL auto_increment, - `item_id` int(9) NOT NULL, - `x1` int(9) NOT NULL, - `y1` int(9) NOT NULL, - `x2` int(9) NOT NULL, - `y2` int(9) NOT NULL, - `title` varchar(64) NOT NULL, - `description` varchar(2048) default NULL, - PRIMARY KEY (`id`)) - DEFAULT CHARSET=utf8;"); - - module::set_version("photoannotation", $version = 1); - } - } - - static function deactivate() { - // Clear the require tags message when photoannotation is deactivated. - site_status::clear("photoannotation_needs_tag"); - site_status::clear("photoannotation_incompatibility_tagfaces"); - } - - static function uninstall() { - // Delete the face table before uninstalling. - $db = Database::instance(); - $db->query("DROP TABLE IF EXISTS {items_faces};"); - $db->query("DROP TABLE IF EXISTS {items_notes};"); - module::delete("photoannotation"); - } -} +query("CREATE TABLE IF NOT EXISTS {items_faces} ( + `id` int(9) NOT NULL auto_increment, + `tag_id` int(9) NOT NULL, + `item_id` int(9) NOT NULL, + `x1` int(9) NOT NULL, + `y1` int(9) NOT NULL, + `x2` int(9) NOT NULL, + `y2` int(9) NOT NULL, + `description` varchar(2048) default NULL, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + + $db->query("CREATE TABLE IF NOT EXISTS {items_notes} ( + `id` int(9) NOT NULL auto_increment, + `item_id` int(9) NOT NULL, + `x1` int(9) NOT NULL, + `y1` int(9) NOT NULL, + `x2` int(9) NOT NULL, + `y2` int(9) NOT NULL, + `title` varchar(64) NOT NULL, + `description` varchar(2048) default NULL, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + + // Set the module's version number. + module::set_version("photoannotation", 1); + } + + static function upgrade($version) { + $db = Database::instance(); + if ($version == 1) { + $db->query("ALTER TABLE {items_faces} ADD `description` varchar(2048) default NULL"); + + $db->query("CREATE TABLE IF NOT EXISTS {items_notes} ( + `id` int(9) NOT NULL auto_increment, + `item_id` int(9) NOT NULL, + `x1` int(9) NOT NULL, + `y1` int(9) NOT NULL, + `x2` int(9) NOT NULL, + `y2` int(9) NOT NULL, + `title` varchar(64) NOT NULL, + `description` varchar(2048) default NULL, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + + module::set_version("photoannotation", $version = 1); + } + } + + static function deactivate() { + // Clear the require tags message when photoannotation is deactivated. + site_status::clear("photoannotation_needs_tag"); + site_status::clear("photoannotation_incompatibility_tagfaces"); + } + + static function uninstall() { + // Delete the face table before uninstalling. + $db = Database::instance(); + $db->query("DROP TABLE IF EXISTS {items_faces};"); + $db->query("DROP TABLE IF EXISTS {items_notes};"); + module::delete("photoannotation"); + } +} diff --git a/modules/photoannotation/helpers/photoannotation_theme.php b/modules/photoannotation/helpers/photoannotation_theme.php index 27661c92..88ac00f4 100644 --- a/modules/photoannotation/helpers/photoannotation_theme.php +++ b/modules/photoannotation/helpers/photoannotation_theme.php @@ -1,32 +1,32 @@ -css("photoannotation.css"); - //$theme->script("jquery.annotate.js"); - Return ""; - } - - static function photo_bottom($theme) { - // If it does, add an image map to the page to display them. - return new View("photoannotation_highlight_block.html"); - } -} +css("photoannotation.css"); + $theme->script("jquery.annotate.js"); + //Return ""; + } + + static function photo_bottom($theme) { + // If it does, add an image map to the page to display them. + return new View("photoannotation_highlight_block.html"); + } +} diff --git a/modules/photoannotation/images/jcrop.gif b/modules/photoannotation/images/jcrop.gif deleted file mode 100644 index 72ea7ccb5321d5384d70437cfaac73011237901e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmZ?wbhEHb9b#5NV>2k zBC~b@b~P=nNfWAe-b%_i6tS^-1y(h@EsB~1TqDA_h@fkxG$bHgvj}VxE1JLgr!*!^ ILUxTc0Q$^Q5C8xG diff --git a/modules/photoannotation/js/jquery.Jcrop.js b/modules/photoannotation/js/jquery.Jcrop.js deleted file mode 100644 index 9d68d589..00000000 --- a/modules/photoannotation/js/jquery.Jcrop.js +++ /dev/null @@ -1,1197 +0,0 @@ -/** - * jquery.Jcrop.js v0.9.8 - * jQuery Image Cropping Plugin - * @author Kelly Hallman - * Copyright (c) 2008-2009 Kelly Hallman - released under MIT License {{{ - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - - * }}} - */ - -(function($) { - -$.Jcrop = function(obj,opt) -{ - // Initialization {{{ - - // Sanitize some options {{{ - var obj = obj, opt = opt; - - if (typeof(obj) !== 'object') obj = $(obj)[0]; - if (typeof(opt) !== 'object') opt = { }; - - // Some on-the-fly fixes for MSIE...sigh - if (!('trackDocument' in opt)) - { - opt.trackDocument = $.browser.msie ? false : true; - if ($.browser.msie && $.browser.version.split('.')[0] == '8') - opt.trackDocument = true; - } - - if (!('keySupport' in opt)) - opt.keySupport = $.browser.msie ? false : true; - - // }}} - // Extend the default options {{{ - var defaults = { - - // Basic Settings - trackDocument: false, - baseClass: 'jcrop', - addClass: null, - - // Styling Options - bgColor: 'black', - bgOpacity: .6, - borderOpacity: .4, - handleOpacity: .5, - - handlePad: 5, - handleSize: 9, - handleOffset: 5, - edgeMargin: 14, - - aspectRatio: 0, - keySupport: true, - cornerHandles: true, - sideHandles: true, - drawBorders: true, - dragEdges: true, - - boxWidth: 0, - boxHeight: 0, - - boundary: 8, - animationDelay: 20, - swingSpeed: 3, - - allowSelect: true, - allowMove: true, - allowResize: true, - - minSelect: [ 0, 0 ], - maxSize: [ 0, 0 ], - minSize: [ 0, 0 ], - - // Callbacks / Event Handlers - onChange: function() { }, - onSelect: function() { } - - }; - var options = defaults; - setOptions(opt); - - // }}} - // Initialize some jQuery objects {{{ - - var $origimg = $(obj); - var $img = $origimg.clone().removeAttr('id').css({ position: 'static' }); - - $img.width($origimg.width()); - $img.height($origimg.height()); - $origimg.after($img).hide(); - - presize($img,options.boxWidth,options.boxHeight); - - var boundx = $img.width(), - boundy = $img.height(), - - $div = $('
') - .width(boundx).height(boundy) - .addClass(cssClass('holder')) - .css({ - position: 'relative', - backgroundColor: options.bgColor - }).insertAfter($origimg).append($img); - ; - - if (options.addClass) $div.addClass(options.addClass); - //$img.wrap($div); - - var $img2 = $('')/*{{{*/ - .attr('src',$img.attr('src')) - .css('position','absolute') - .width(boundx).height(boundy) - ;/*}}}*/ - var $img_holder = $('
')/*{{{*/ - .width(pct(100)).height(pct(100)) - .css({ - zIndex: 310, - position: 'absolute', - overflow: 'hidden' - }) - .append($img2) - ;/*}}}*/ - var $hdl_holder = $('
')/*{{{*/ - .width(pct(100)).height(pct(100)) - .css('zIndex',320); - /*}}}*/ - var $sel = $('
')/*{{{*/ - .css({ - position: 'absolute', - zIndex: 300 - }) - .insertBefore($img) - .append($img_holder,$hdl_holder) - ;/*}}}*/ - - var bound = options.boundary; - var $trk = newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)) - .css({ position: 'absolute', top: px(-bound), left: px(-bound), zIndex: 290 }) - .mousedown(newSelection); - - /* }}} */ - // Set more variables {{{ - - var xlimit, ylimit, xmin, ymin; - var xscale, yscale, enabled = true; - var docOffset = getPos($img), - // Internal states - btndown, lastcurs, dimmed, animating, - shift_down; - - // }}} - - - // }}} - // Internal Modules {{{ - - var Coords = function()/*{{{*/ - { - var x1 = 0, y1 = 0, x2 = 0, y2 = 0, ox, oy; - - function setPressed(pos)/*{{{*/ - { - var pos = rebound(pos); - x2 = x1 = pos[0]; - y2 = y1 = pos[1]; - }; - /*}}}*/ - function setCurrent(pos)/*{{{*/ - { - var pos = rebound(pos); - ox = pos[0] - x2; - oy = pos[1] - y2; - x2 = pos[0]; - y2 = pos[1]; - }; - /*}}}*/ - function getOffset()/*{{{*/ - { - return [ ox, oy ]; - }; - /*}}}*/ - function moveOffset(offset)/*{{{*/ - { - var ox = offset[0], oy = offset[1]; - - if (0 > x1 + ox) ox -= ox + x1; - if (0 > y1 + oy) oy -= oy + y1; - - if (boundy < y2 + oy) oy += boundy - (y2 + oy); - if (boundx < x2 + ox) ox += boundx - (x2 + ox); - - x1 += ox; - x2 += ox; - y1 += oy; - y2 += oy; - }; - /*}}}*/ - function getCorner(ord)/*{{{*/ - { - var c = getFixed(); - switch(ord) - { - case 'ne': return [ c.x2, c.y ]; - case 'nw': return [ c.x, c.y ]; - case 'se': return [ c.x2, c.y2 ]; - case 'sw': return [ c.x, c.y2 ]; - } - }; - /*}}}*/ - function getFixed()/*{{{*/ - { - if (!options.aspectRatio) return getRect(); - // This function could use some optimization I think... - var aspect = options.aspectRatio, - min_x = options.minSize[0]/xscale, - min_y = options.minSize[1]/yscale, - max_x = options.maxSize[0]/xscale, - max_y = options.maxSize[1]/yscale, - rw = x2 - x1, - rh = y2 - y1, - rwa = Math.abs(rw), - rha = Math.abs(rh), - real_ratio = rwa / rha, - xx, yy - ; - if (max_x == 0) { max_x = boundx * 10 } - if (max_y == 0) { max_y = boundy * 10 } - if (real_ratio < aspect) - { - yy = y2; - w = rha * aspect; - xx = rw < 0 ? x1 - w : w + x1; - - if (xx < 0) - { - xx = 0; - h = Math.abs((xx - x1) / aspect); - yy = rh < 0 ? y1 - h: h + y1; - } - else if (xx > boundx) - { - xx = boundx; - h = Math.abs((xx - x1) / aspect); - yy = rh < 0 ? y1 - h : h + y1; - } - } - else - { - xx = x2; - h = rwa / aspect; - yy = rh < 0 ? y1 - h : y1 + h; - if (yy < 0) - { - yy = 0; - w = Math.abs((yy - y1) * aspect); - xx = rw < 0 ? x1 - w : w + x1; - } - else if (yy > boundy) - { - yy = boundy; - w = Math.abs(yy - y1) * aspect; - xx = rw < 0 ? x1 - w : w + x1; - } - } - - // Magic %-) - if(xx > x1) { // right side - if(xx - x1 < min_x) { - xx = x1 + min_x; - } else if (xx - x1 > max_x) { - xx = x1 + max_x; - } - if(yy > y1) { - yy = y1 + (xx - x1)/aspect; - } else { - yy = y1 - (xx - x1)/aspect; - } - } else if (xx < x1) { // left side - if(x1 - xx < min_x) { - xx = x1 - min_x - } else if (x1 - xx > max_x) { - xx = x1 - max_x; - } - if(yy > y1) { - yy = y1 + (x1 - xx)/aspect; - } else { - yy = y1 - (x1 - xx)/aspect; - } - } - - if(xx < 0) { - x1 -= xx; - xx = 0; - } else if (xx > boundx) { - x1 -= xx - boundx; - xx = boundx; - } - - if(yy < 0) { - y1 -= yy; - yy = 0; - } else if (yy > boundy) { - y1 -= yy - boundy; - yy = boundy; - } - - return last = makeObj(flipCoords(x1,y1,xx,yy)); - }; - /*}}}*/ - function rebound(p)/*{{{*/ - { - if (p[0] < 0) p[0] = 0; - if (p[1] < 0) p[1] = 0; - - if (p[0] > boundx) p[0] = boundx; - if (p[1] > boundy) p[1] = boundy; - - return [ p[0], p[1] ]; - }; - /*}}}*/ - function flipCoords(x1,y1,x2,y2)/*{{{*/ - { - var xa = x1, xb = x2, ya = y1, yb = y2; - if (x2 < x1) - { - xa = x2; - xb = x1; - } - if (y2 < y1) - { - ya = y2; - yb = y1; - } - return [ Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ]; - }; - /*}}}*/ - function getRect()/*{{{*/ - { - var xsize = x2 - x1; - var ysize = y2 - y1; - - if (xlimit && (Math.abs(xsize) > xlimit)) - x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); - if (ylimit && (Math.abs(ysize) > ylimit)) - y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); - - if (ymin && (Math.abs(ysize) < ymin)) - y2 = (ysize > 0) ? (y1 + ymin) : (y1 - ymin); - if (xmin && (Math.abs(xsize) < xmin)) - x2 = (xsize > 0) ? (x1 + xmin) : (x1 - xmin); - - if (x1 < 0) { x2 -= x1; x1 -= x1; } - if (y1 < 0) { y2 -= y1; y1 -= y1; } - if (x2 < 0) { x1 -= x2; x2 -= x2; } - if (y2 < 0) { y1 -= y2; y2 -= y2; } - if (x2 > boundx) { var delta = x2 - boundx; x1 -= delta; x2 -= delta; } - if (y2 > boundy) { var delta = y2 - boundy; y1 -= delta; y2 -= delta; } - if (x1 > boundx) { var delta = x1 - boundy; y2 -= delta; y1 -= delta; } - if (y1 > boundy) { var delta = y1 - boundy; y2 -= delta; y1 -= delta; } - - return makeObj(flipCoords(x1,y1,x2,y2)); - }; - /*}}}*/ - function makeObj(a)/*{{{*/ - { - return { x: a[0], y: a[1], x2: a[2], y2: a[3], - w: a[2] - a[0], h: a[3] - a[1] }; - }; - /*}}}*/ - - return { - flipCoords: flipCoords, - setPressed: setPressed, - setCurrent: setCurrent, - getOffset: getOffset, - moveOffset: moveOffset, - getCorner: getCorner, - getFixed: getFixed - }; - }(); - - /*}}}*/ - var Selection = function()/*{{{*/ - { - var start, end, dragmode, awake, hdep = 370; - var borders = { }; - var handle = { }; - var seehandles = false; - var hhs = options.handleOffset; - - /* Insert draggable elements {{{*/ - - // Insert border divs for outline - if (options.drawBorders) { - borders = { - top: insertBorder('hline') - .css('top',$.browser.msie?px(-1):px(0)), - bottom: insertBorder('hline'), - left: insertBorder('vline'), - right: insertBorder('vline') - }; - } - - // Insert handles on edges - if (options.dragEdges) { - handle.t = insertDragbar('n'); - handle.b = insertDragbar('s'); - handle.r = insertDragbar('e'); - handle.l = insertDragbar('w'); - } - - // Insert side handles - options.sideHandles && - createHandles(['n','s','e','w']); - - // Insert corner handles - options.cornerHandles && - createHandles(['sw','nw','ne','se']); - - /*}}}*/ - // Private Methods - function insertBorder(type)/*{{{*/ - { - var jq = $('
') - .css({position: 'absolute', opacity: options.borderOpacity }) - .addClass(cssClass(type)); - $img_holder.append(jq); - return jq; - }; - /*}}}*/ - function dragDiv(ord,zi)/*{{{*/ - { - var jq = $('
') - .mousedown(createDragger(ord)) - .css({ - cursor: ord+'-resize', - position: 'absolute', - zIndex: zi - }) - ; - $hdl_holder.append(jq); - return jq; - }; - /*}}}*/ - function insertHandle(ord)/*{{{*/ - { - return dragDiv(ord,hdep++) - .css({ top: px(-hhs+1), left: px(-hhs+1), opacity: options.handleOpacity }) - .addClass(cssClass('handle')); - }; - /*}}}*/ - function insertDragbar(ord)/*{{{*/ - { - var s = options.handleSize, - o = hhs, - h = s, w = s, - t = o, l = o; - - switch(ord) - { - case 'n': case 's': w = pct(100); break; - case 'e': case 'w': h = pct(100); break; - } - - return dragDiv(ord,hdep++).width(w).height(h) - .css({ top: px(-t+1), left: px(-l+1)}); - }; - /*}}}*/ - function createHandles(li)/*{{{*/ - { - for(i in li) handle[li[i]] = insertHandle(li[i]); - }; - /*}}}*/ - function moveHandles(c)/*{{{*/ - { - var midvert = Math.round((c.h / 2) - hhs), - midhoriz = Math.round((c.w / 2) - hhs), - north = west = -hhs+1, - east = c.w - hhs, - south = c.h - hhs, - x, y; - - 'e' in handle && - handle.e.css({ top: px(midvert), left: px(east) }) && - handle.w.css({ top: px(midvert) }) && - handle.s.css({ top: px(south), left: px(midhoriz) }) && - handle.n.css({ left: px(midhoriz) }); - - 'ne' in handle && - handle.ne.css({ left: px(east) }) && - handle.se.css({ top: px(south), left: px(east) }) && - handle.sw.css({ top: px(south) }); - - 'b' in handle && - handle.b.css({ top: px(south) }) && - handle.r.css({ left: px(east) }); - }; - /*}}}*/ - function moveto(x,y)/*{{{*/ - { - $img2.css({ top: px(-y), left: px(-x) }); - $sel.css({ top: px(y), left: px(x) }); - }; - /*}}}*/ - function resize(w,h)/*{{{*/ - { - $sel.width(w).height(h); - }; - /*}}}*/ - function refresh()/*{{{*/ - { - var c = Coords.getFixed(); - - Coords.setPressed([c.x,c.y]); - Coords.setCurrent([c.x2,c.y2]); - - updateVisible(); - }; - /*}}}*/ - - // Internal Methods - function updateVisible()/*{{{*/ - { if (awake) return update(); }; - /*}}}*/ - function update()/*{{{*/ - { - var c = Coords.getFixed(); - - resize(c.w,c.h); - moveto(c.x,c.y); - - options.drawBorders && - borders['right'].css({ left: px(c.w-1) }) && - borders['bottom'].css({ top: px(c.h-1) }); - - seehandles && moveHandles(c); - awake || show(); - - options.onChange(unscale(c)); - }; - /*}}}*/ - function show()/*{{{*/ - { - $sel.show(); - $img.css('opacity',options.bgOpacity); - awake = true; - }; - /*}}}*/ - function release()/*{{{*/ - { - disableHandles(); - $sel.hide(); - $img.css('opacity',1); - awake = false; - }; - /*}}}*/ - function showHandles()//{{{ - { - if (seehandles) - { - moveHandles(Coords.getFixed()); - $hdl_holder.show(); - } - }; - //}}} - function enableHandles()/*{{{*/ - { - seehandles = true; - if (options.allowResize) - { - moveHandles(Coords.getFixed()); - $hdl_holder.show(); - return true; - } - }; - /*}}}*/ - function disableHandles()/*{{{*/ - { - seehandles = false; - $hdl_holder.hide(); - }; - /*}}}*/ - function animMode(v)/*{{{*/ - { - (animating = v) ? disableHandles(): enableHandles(); - }; - /*}}}*/ - function done()/*{{{*/ - { - animMode(false); - refresh(); - }; - /*}}}*/ - - var $track = newTracker().mousedown(createDragger('move')) - .css({ cursor: 'move', position: 'absolute', zIndex: 360 }) - - $img_holder.append($track); - disableHandles(); - - return { - updateVisible: updateVisible, - update: update, - release: release, - refresh: refresh, - setCursor: function (cursor) { $track.css('cursor',cursor); }, - enableHandles: enableHandles, - enableOnly: function() { seehandles = true; }, - showHandles: showHandles, - disableHandles: disableHandles, - animMode: animMode, - done: done - }; - }(); - /*}}}*/ - var Tracker = function()/*{{{*/ - { - var onMove = function() { }, - onDone = function() { }, - trackDoc = options.trackDocument; - - if (!trackDoc) - { - $trk - .mousemove(trackMove) - .mouseup(trackUp) - .mouseout(trackUp) - ; - } - - function toFront()/*{{{*/ - { - $trk.css({zIndex:450}); - if (trackDoc) - { - $(document) - .mousemove(trackMove) - .mouseup(trackUp) - ; - } - } - /*}}}*/ - function toBack()/*{{{*/ - { - $trk.css({zIndex:290}); - if (trackDoc) - { - $(document) - .unbind('mousemove',trackMove) - .unbind('mouseup',trackUp) - ; - } - } - /*}}}*/ - function trackMove(e)/*{{{*/ - { - onMove(mouseAbs(e)); - }; - /*}}}*/ - function trackUp(e)/*{{{*/ - { - e.preventDefault(); - e.stopPropagation(); - - if (btndown) - { - btndown = false; - - onDone(mouseAbs(e)); - options.onSelect(unscale(Coords.getFixed())); - toBack(); - onMove = function() { }; - onDone = function() { }; - } - - return false; - }; - /*}}}*/ - - function activateHandlers(move,done)/* {{{ */ - { - btndown = true; - onMove = move; - onDone = done; - toFront(); - return false; - }; - /* }}} */ - - function setCursor(t) { $trk.css('cursor',t); }; - - $img.before($trk); - return { - activateHandlers: activateHandlers, - setCursor: setCursor - }; - }(); - /*}}}*/ - var KeyManager = function()/*{{{*/ - { - var $keymgr = $('') - .css({ position: 'absolute', left: '-30px' }) - .keypress(parseKey) - .blur(onBlur), - - $keywrap = $('
') - .css({ - position: 'absolute', - overflow: 'hidden' - }) - .append($keymgr) - ; - - function watchKeys()/*{{{*/ - { - if (options.keySupport) - { - $keymgr.show(); - $keymgr.focus(); - } - }; - /*}}}*/ - function onBlur(e)/*{{{*/ - { - $keymgr.hide(); - }; - /*}}}*/ - function doNudge(e,x,y)/*{{{*/ - { - if (options.allowMove) { - Coords.moveOffset([x,y]); - Selection.updateVisible(); - }; - e.preventDefault(); - e.stopPropagation(); - }; - /*}}}*/ - function parseKey(e)/*{{{*/ - { - if (e.ctrlKey) return true; - shift_down = e.shiftKey ? true : false; - var nudge = shift_down ? 10 : 1; - switch(e.keyCode) - { - case 37: doNudge(e,-nudge,0); break; - case 39: doNudge(e,nudge,0); break; - case 38: doNudge(e,0,-nudge); break; - case 40: doNudge(e,0,nudge); break; - - case 27: Selection.release(); break; - - case 9: return true; - } - - return nothing(e); - }; - /*}}}*/ - - if (options.keySupport) $keywrap.insertBefore($img); - return { - watchKeys: watchKeys - }; - }(); - /*}}}*/ - - // }}} - // Internal Methods {{{ - - function px(n) { return '' + parseInt(n) + 'px'; }; - function pct(n) { return '' + parseInt(n) + '%'; }; - function cssClass(cl) { return options.baseClass + '-' + cl; }; - function getPos(obj)/*{{{*/ - { - // Updated in v0.9.4 to use built-in dimensions plugin - var pos = $(obj).offset(); - return [ pos.left, pos.top ]; - }; - /*}}}*/ - function mouseAbs(e)/*{{{*/ - { - return [ (e.pageX - docOffset[0]), (e.pageY - docOffset[1]) ]; - }; - /*}}}*/ - function myCursor(type)/*{{{*/ - { - if (type != lastcurs) - { - Tracker.setCursor(type); - //Handles.xsetCursor(type); - lastcurs = type; - } - }; - /*}}}*/ - function startDragMode(mode,pos)/*{{{*/ - { - docOffset = getPos($img); - Tracker.setCursor(mode=='move'?mode:mode+'-resize'); - - if (mode == 'move') - return Tracker.activateHandlers(createMover(pos), doneSelect); - - var fc = Coords.getFixed(); - var opp = oppLockCorner(mode); - var opc = Coords.getCorner(oppLockCorner(opp)); - - Coords.setPressed(Coords.getCorner(opp)); - Coords.setCurrent(opc); - - Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect); - }; - /*}}}*/ - function dragmodeHandler(mode,f)/*{{{*/ - { - return function(pos) { - if (!options.aspectRatio) switch(mode) - { - case 'e': pos[1] = f.y2; break; - case 'w': pos[1] = f.y2; break; - case 'n': pos[0] = f.x2; break; - case 's': pos[0] = f.x2; break; - } - else switch(mode) - { - case 'e': pos[1] = f.y+1; break; - case 'w': pos[1] = f.y+1; break; - case 'n': pos[0] = f.x+1; break; - case 's': pos[0] = f.x+1; break; - } - Coords.setCurrent(pos); - Selection.update(); - }; - }; - /*}}}*/ - function createMover(pos)/*{{{*/ - { - var lloc = pos; - KeyManager.watchKeys(); - - return function(pos) - { - Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); - lloc = pos; - - Selection.update(); - }; - }; - /*}}}*/ - function oppLockCorner(ord)/*{{{*/ - { - switch(ord) - { - case 'n': return 'sw'; - case 's': return 'nw'; - case 'e': return 'nw'; - case 'w': return 'ne'; - case 'ne': return 'sw'; - case 'nw': return 'se'; - case 'se': return 'nw'; - case 'sw': return 'ne'; - }; - }; - /*}}}*/ - function createDragger(ord)/*{{{*/ - { - return function(e) { - if (options.disabled) return false; - if ((ord == 'move') && !options.allowMove) return false; - btndown = true; - startDragMode(ord,mouseAbs(e)); - e.stopPropagation(); - e.preventDefault(); - return false; - }; - }; - /*}}}*/ - function presize($obj,w,h)/*{{{*/ - { - var nw = $obj.width(), nh = $obj.height(); - if ((nw > w) && w > 0) - { - nw = w; - nh = (w/$obj.width()) * $obj.height(); - } - if ((nh > h) && h > 0) - { - nh = h; - nw = (h/$obj.height()) * $obj.width(); - } - xscale = $obj.width() / nw; - yscale = $obj.height() / nh; - $obj.width(nw).height(nh); - }; - /*}}}*/ - function unscale(c)/*{{{*/ - { - return { - x: parseInt(c.x * xscale), y: parseInt(c.y * yscale), - x2: parseInt(c.x2 * xscale), y2: parseInt(c.y2 * yscale), - w: parseInt(c.w * xscale), h: parseInt(c.h * yscale) - }; - }; - /*}}}*/ - function doneSelect(pos)/*{{{*/ - { - var c = Coords.getFixed(); - if (c.w > options.minSelect[0] && c.h > options.minSelect[1]) - { - Selection.enableHandles(); - Selection.done(); - } - else - { - Selection.release(); - } - Tracker.setCursor( options.allowSelect?'crosshair':'default' ); - }; - /*}}}*/ - function newSelection(e)/*{{{*/ - { - if (options.disabled) return false; - if (!options.allowSelect) return false; - btndown = true; - docOffset = getPos($img); - Selection.disableHandles(); - myCursor('crosshair'); - var pos = mouseAbs(e); - Coords.setPressed(pos); - Tracker.activateHandlers(selectDrag,doneSelect); - KeyManager.watchKeys(); - Selection.update(); - - e.stopPropagation(); - e.preventDefault(); - return false; - }; - /*}}}*/ - function selectDrag(pos)/*{{{*/ - { - Coords.setCurrent(pos); - Selection.update(); - }; - /*}}}*/ - function newTracker() - { - var trk = $('
').addClass(cssClass('tracker')); - $.browser.msie && trk.css({ opacity: 0, backgroundColor: 'white' }); - return trk; - }; - - // }}} - // API methods {{{ - - function animateTo(a)/*{{{*/ - { - var x1 = a[0] / xscale, - y1 = a[1] / yscale, - x2 = a[2] / xscale, - y2 = a[3] / yscale; - - if (animating) return; - - var animto = Coords.flipCoords(x1,y1,x2,y2); - var c = Coords.getFixed(); - var animat = initcr = [ c.x, c.y, c.x2, c.y2 ]; - var interv = options.animationDelay; - - var x = animat[0]; - var y = animat[1]; - var x2 = animat[2]; - var y2 = animat[3]; - var ix1 = animto[0] - initcr[0]; - var iy1 = animto[1] - initcr[1]; - var ix2 = animto[2] - initcr[2]; - var iy2 = animto[3] - initcr[3]; - var pcent = 0; - var velocity = options.swingSpeed; - - Selection.animMode(true); - - var animator = function() - { - return function() - { - pcent += (100 - pcent) / velocity; - - animat[0] = x + ((pcent / 100) * ix1); - animat[1] = y + ((pcent / 100) * iy1); - animat[2] = x2 + ((pcent / 100) * ix2); - animat[3] = y2 + ((pcent / 100) * iy2); - - if (pcent < 100) animateStart(); - else Selection.done(); - - if (pcent >= 99.8) pcent = 100; - - setSelectRaw(animat); - }; - }(); - - function animateStart() - { window.setTimeout(animator,interv); }; - - animateStart(); - }; - /*}}}*/ - function setSelect(rect)//{{{ - { - setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]); - }; - //}}} - function setSelectRaw(l) /*{{{*/ - { - Coords.setPressed([l[0],l[1]]); - Coords.setCurrent([l[2],l[3]]); - Selection.update(); - }; - /*}}}*/ - function setOptions(opt)/*{{{*/ - { - if (typeof(opt) != 'object') opt = { }; - options = $.extend(options,opt); - - if (typeof(options.onChange)!=='function') - options.onChange = function() { }; - - if (typeof(options.onSelect)!=='function') - options.onSelect = function() { }; - - }; - /*}}}*/ - function tellSelect()/*{{{*/ - { - return unscale(Coords.getFixed()); - }; - /*}}}*/ - function tellScaled()/*{{{*/ - { - return Coords.getFixed(); - }; - /*}}}*/ - function setOptionsNew(opt)/*{{{*/ - { - setOptions(opt); - interfaceUpdate(); - }; - /*}}}*/ - function disableCrop()//{{{ - { - options.disabled = true; - Selection.disableHandles(); - Selection.setCursor('default'); - Tracker.setCursor('default'); - }; - //}}} - function enableCrop()//{{{ - { - options.disabled = false; - interfaceUpdate(); - }; - //}}} - function cancelCrop()//{{{ - { - Selection.done(); - Tracker.activateHandlers(null,null); - }; - //}}} - function destroy()//{{{ - { - $div.remove(); - $origimg.show(); - }; - //}}} - - function interfaceUpdate(alt)//{{{ - // This method tweaks the interface based on options object. - // Called when options are changed and at end of initialization. - { - options.allowResize ? - alt?Selection.enableOnly():Selection.enableHandles(): - Selection.disableHandles(); - - Tracker.setCursor( options.allowSelect? 'crosshair': 'default' ); - Selection.setCursor( options.allowMove? 'move': 'default' ); - - $div.css('backgroundColor',options.bgColor); - - if ('setSelect' in options) { - setSelect(opt.setSelect); - Selection.done(); - delete(options.setSelect); - } - - if ('trueSize' in options) { - xscale = options.trueSize[0] / boundx; - yscale = options.trueSize[1] / boundy; - } - - xlimit = options.maxSize[0] || 0; - ylimit = options.maxSize[1] || 0; - xmin = options.minSize[0] || 0; - ymin = options.minSize[1] || 0; - - if ('outerImage' in options) - { - $img.attr('src',options.outerImage); - delete(options.outerImage); - } - - Selection.refresh(); - }; - //}}} - - // }}} - - $hdl_holder.hide(); - interfaceUpdate(true); - - var api = { - animateTo: animateTo, - setSelect: setSelect, - setOptions: setOptionsNew, - tellSelect: tellSelect, - tellScaled: tellScaled, - - disable: disableCrop, - enable: enableCrop, - cancel: cancelCrop, - - focus: KeyManager.watchKeys, - - getBounds: function() { return [ boundx * xscale, boundy * yscale ]; }, - getWidgetSize: function() { return [ boundx, boundy ]; }, - - release: Selection.release, - destroy: destroy - - }; - - $origimg.data('Jcrop',api); - return api; -}; - -$.fn.Jcrop = function(options)/*{{{*/ -{ - function attachWhenDone(from)/*{{{*/ - { - var loadsrc = options.useImg || from.src; - var img = new Image(); - img.onload = function() { $.Jcrop(from,options); }; - img.src = loadsrc; - }; - /*}}}*/ - if (typeof(options) !== 'object') options = { }; - - // Iterate over each object, attach Jcrop - this.each(function() - { - // If we've already attached to this object - if ($(this).data('Jcrop')) - { - // The API can be requested this way (undocumented) - if (options == 'api') return $(this).data('Jcrop'); - // Otherwise, we just reset the options... - else $(this).data('Jcrop').setOptions(options); - } - // If we haven't been attached, preload and attach - else attachWhenDone(this); - }); - - // Return "this" so we're chainable a la jQuery plugin-style! - return this; -}; -/*}}}*/ - -})(jQuery); diff --git a/modules/photoannotation/js/jquery.Jcrop.min.js b/modules/photoannotation/js/jquery.Jcrop.min.js deleted file mode 100644 index cdf50ea7..00000000 --- a/modules/photoannotation/js/jquery.Jcrop.min.js +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Jcrop v.0.9.8 (minimized) - * (c) 2008 Kelly Hallman and DeepLiquid.com - * More information: http://deepliquid.com/content/Jcrop.html - * Released under MIT License - this header must remain with code - */ - - -(function($){$.Jcrop=function(obj,opt) -{var obj=obj,opt=opt;if(typeof(obj)!=='object')obj=$(obj)[0];if(typeof(opt)!=='object')opt={};if(!('trackDocument'in opt)) -{opt.trackDocument=$.browser.msie?false:true;if($.browser.msie&&$.browser.version.split('.')[0]=='8') -opt.trackDocument=true;} -if(!('keySupport'in opt)) -opt.keySupport=$.browser.msie?false:true;var defaults={trackDocument:false,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:.6,borderOpacity:.4,handleOpacity:.5,handlePad:5,handleSize:9,handleOffset:5,edgeMargin:14,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,boxWidth:0,boxHeight:0,boundary:8,animationDelay:20,swingSpeed:3,allowSelect:true,allowMove:true,allowResize:true,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){}};var options=defaults;setOptions(opt);var $origimg=$(obj);var $img=$origimg.clone().removeAttr('id').css({position:'absolute'});$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('
').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);;if(options.addClass)$div.addClass(options.addClass);var $img2=$('').attr('src',$img.attr('src')).css('position','absolute').width(boundx).height(boundy);var $img_holder=$('
').width(pct(100)).height(pct(100)).css({zIndex:310,position:'absolute',overflow:'hidden'}).append($img2);var $hdl_holder=$('
').width(pct(100)).height(pct(100)).css('zIndex',320);var $sel=$('
').css({position:'absolute',zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var xlimit,ylimit,xmin,ymin;var xscale,yscale,enabled=true;var docOffset=getPos($img),btndown,lastcurs,dimmed,animating,shift_down;var Coords=function() -{var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos) -{var pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];};function setCurrent(pos) -{var pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];};function getOffset() -{return[ox,oy];};function moveOffset(offset) -{var ox=offset[0],oy=offset[1];if(0>x1+ox)ox-=ox+x1;if(0>y1+oy)oy-=oy+y1;if(boundyboundx) -{xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}} -else -{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0) -{yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;} -else if(yy>boundy) -{yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}} -if(xx>x1){if(xx-x1max_x){xx=x1+max_x;} -if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xxmax_x){xx=x1-max_x;} -if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}} -if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;} -if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;} -return last=makeObj(flipCoords(x1,y1,xx,yy));};function rebound(p) -{if(p[0]<0)p[0]=0;if(p[1]<0)p[1]=0;if(p[0]>boundx)p[0]=boundx;if(p[1]>boundy)p[1]=boundy;return[p[0],p[1]];};function flipCoords(x1,y1,x2,y2) -{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2xlimit)) -x2=(xsize>0)?(x1+xlimit):(x1-xlimit);if(ylimit&&(Math.abs(ysize)>ylimit)) -y2=(ysize>0)?(y1+ylimit):(y1-ylimit);if(ymin&&(Math.abs(ysize)0)?(y1+ymin):(y1-ymin);if(xmin&&(Math.abs(xsize)0)?(x1+xmin):(x1-xmin);if(x1<0){x2-=x1;x1-=x1;} -if(y1<0){y2-=y1;y1-=y1;} -if(x2<0){x1-=x2;x2-=x2;} -if(y2<0){y1-=y2;y2-=y2;} -if(x2>boundx){var delta=x2-boundx;x1-=delta;x2-=delta;} -if(y2>boundy){var delta=y2-boundy;y1-=delta;y2-=delta;} -if(x1>boundx){var delta=x1-boundy;y2-=delta;y1-=delta;} -if(y1>boundy){var delta=y1-boundy;y2-=delta;y1-=delta;} -return makeObj(flipCoords(x1,y1,x2,y2));};function makeObj(a) -{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};};return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}();var Selection=function() -{var start,end,dragmode,awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;if(options.drawBorders){borders={top:insertBorder('hline').css('top',$.browser.msie?px(-1):px(0)),bottom:insertBorder('hline'),left:insertBorder('vline'),right:insertBorder('vline')};} -if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');} -options.sideHandles&&createHandles(['n','s','e','w']);options.cornerHandles&&createHandles(['sw','nw','ne','se']);function insertBorder(type) -{var jq=$('
').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;};function dragDiv(ord,zi) -{var jq=$('
').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi});$hdl_holder.append(jq);return jq;};function insertHandle(ord) -{return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass('handle'));};function insertDragbar(ord) -{var s=options.handleSize,o=hhs,h=s,w=s,t=o,l=o;switch(ord) -{case'n':case's':w=pct(100);break;case'e':case'w':h=pct(100);break;} -return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});};function createHandles(li) -{for(i in li)handle[li[i]]=insertHandle(li[i]);};function moveHandles(c) -{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;'e'in handle&&handle.e.css({top:px(midvert),left:px(east)})&&handle.w.css({top:px(midvert)})&&handle.s.css({top:px(south),left:px(midhoriz)})&&handle.n.css({left:px(midhoriz)});'ne'in handle&&handle.ne.css({left:px(east)})&&handle.se.css({top:px(south),left:px(east)})&&handle.sw.css({top:px(south)});'b'in handle&&handle.b.css({top:px(south)})&&handle.r.css({left:px(east)});};function moveto(x,y) -{$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)});};function resize(w,h) -{$sel.width(w).height(h);};function refresh() -{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();};function updateVisible() -{if(awake)return update();};function update() -{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);options.drawBorders&&borders['right'].css({left:px(c.w-1)})&&borders['bottom'].css({top:px(c.h-1)});seehandles&&moveHandles(c);awake||show();options.onChange(unscale(c));};function show() -{$sel.show();$img.css('opacity',options.bgOpacity);awake=true;};function release() -{disableHandles();$sel.hide();$img.css('opacity',1);awake=false;};function showHandles() -{if(seehandles) -{moveHandles(Coords.getFixed());$hdl_holder.show();}};function enableHandles() -{seehandles=true;if(options.allowResize) -{moveHandles(Coords.getFixed());$hdl_holder.show();return true;}};function disableHandles() -{seehandles=false;$hdl_holder.hide();};function animMode(v) -{(animating=v)?disableHandles():enableHandles();};function done() -{animMode(false);refresh();};var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360}) -$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done};}();var Tracker=function() -{var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;if(!trackDoc) -{$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);} -function toFront() -{$trk.css({zIndex:450});if(trackDoc) -{$(document).mousemove(trackMove).mouseup(trackUp);}} -function toBack() -{$trk.css({zIndex:290});if(trackDoc) -{$(document).unbind('mousemove',trackMove).unbind('mouseup',trackUp);}} -function trackMove(e) -{onMove(mouseAbs(e));};function trackUp(e) -{e.preventDefault();e.stopPropagation();if(btndown) -{btndown=false;onDone(mouseAbs(e));options.onSelect(unscale(Coords.getFixed()));toBack();onMove=function(){};onDone=function(){};} -return false;};function activateHandlers(move,done) -{btndown=true;onMove=move;onDone=done;toFront();return false;};function setCursor(t){$trk.css('cursor',t);};$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}();var KeyManager=function() -{var $keymgr=$('').css({position:'absolute',left:'-30px'}).keypress(parseKey).blur(onBlur),$keywrap=$('
').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys() -{if(options.keySupport) -{$keymgr.show();$keymgr.focus();}};function onBlur(e) -{$keymgr.hide();};function doNudge(e,x,y) -{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible();};e.preventDefault();e.stopPropagation();};function parseKey(e) -{if(e.ctrlKey)return true;shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode) -{case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true;} -return nothing(e);};if(options.keySupport)$keywrap.insertBefore($img);return{watchKeys:watchKeys};}();function px(n){return''+parseInt(n)+'px';};function pct(n){return''+parseInt(n)+'%';};function cssClass(cl){return options.baseClass+'-'+cl;};function getPos(obj) -{var pos=$(obj).offset();return[pos.left,pos.top];};function mouseAbs(e) -{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];};function myCursor(type) -{if(type!=lastcurs) -{Tracker.setCursor(type);lastcurs=type;}};function startDragMode(mode,pos) -{docOffset=getPos($img);Tracker.setCursor(mode=='move'?mode:mode+'-resize');if(mode=='move') -return Tracker.activateHandlers(createMover(pos),doneSelect);var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);};function dragmodeHandler(mode,f) -{return function(pos){if(!options.aspectRatio)switch(mode) -{case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;} -else switch(mode) -{case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;} -Coords.setCurrent(pos);Selection.update();};};function createMover(pos) -{var lloc=pos;KeyManager.watchKeys();return function(pos) -{Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};};function oppLockCorner(ord) -{switch(ord) -{case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';};};function createDragger(ord) -{return function(e){if(options.disabled)return false;if((ord=='move')&&!options.allowMove)return false;btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};};function presize($obj,w,h) -{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0) -{nw=w;nh=(w/$obj.width())*$obj.height();} -if((nh>h)&&h>0) -{nh=h;nw=(h/$obj.height())*$obj.width();} -xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);};function unscale(c) -{return{x:parseInt(c.x*xscale),y:parseInt(c.y*yscale),x2:parseInt(c.x2*xscale),y2:parseInt(c.y2*yscale),w:parseInt(c.w*xscale),h:parseInt(c.h*yscale)};};function doneSelect(pos) -{var c=Coords.getFixed();if(c.w>options.minSelect[0]&&c.h>options.minSelect[1]) -{Selection.enableHandles();Selection.done();} -else -{Selection.release();} -Tracker.setCursor(options.allowSelect?'crosshair':'default');};function newSelection(e) -{if(options.disabled)return false;if(!options.allowSelect)return false;btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();Selection.update();e.stopPropagation();e.preventDefault();return false;};function selectDrag(pos) -{Coords.setCurrent(pos);Selection.update();};function newTracker() -{var trk=$('
').addClass(cssClass('tracker'));$.browser.msie&&trk.css({opacity:0,backgroundColor:'white'});return trk;};function animateTo(a) -{var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating)return;var animto=Coords.flipCoords(x1,y1,x2,y2);var c=Coords.getFixed();var animat=initcr=[c.x,c.y,c.x2,c.y2];var interv=options.animationDelay;var x=animat[0];var y=animat[1];var x2=animat[2];var y2=animat[3];var ix1=animto[0]-initcr[0];var iy1=animto[1]-initcr[1];var ix2=animto[2]-initcr[2];var iy2=animto[3]-initcr[3];var pcent=0;var velocity=options.swingSpeed;Selection.animMode(true);var animator=function() -{return function() -{pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent<100)animateStart();else Selection.done();if(pcent>=99.8)pcent=100;setSelectRaw(animat);};}();function animateStart() -{window.setTimeout(animator,interv);};animateStart();};function setSelect(rect) -{setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);};function setSelectRaw(l) -{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();};function setOptions(opt) -{if(typeof(opt)!='object')opt={};options=$.extend(options,opt);if(typeof(options.onChange)!=='function') -options.onChange=function(){};if(typeof(options.onSelect)!=='function') -options.onSelect=function(){};};function tellSelect() -{return unscale(Coords.getFixed());};function tellScaled() -{return Coords.getFixed();};function setOptionsNew(opt) -{setOptions(opt);interfaceUpdate();};function disableCrop() -{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');};function enableCrop() -{options.disabled=false;interfaceUpdate();};function cancelCrop() -{Selection.done();Tracker.activateHandlers(null,null);};function destroy() -{$div.remove();$origimg.show();};function interfaceUpdate(alt) -{options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles();Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');$div.css('backgroundColor',options.bgColor);if('setSelect'in options){setSelect(opt.setSelect);Selection.done();delete(options.setSelect);} -if('trueSize'in options){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;} -xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if('outerImage'in options) -{$img.attr('src',options.outerImage);delete(options.outerImage);} -Selection.refresh();};$hdl_holder.hide();interfaceUpdate(true);var api={animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},release:Selection.release,destroy:destroy};$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options) -{function attachWhenDone(from) -{var loadsrc=options.useImg||from.src;var img=new Image();img.onload=function(){$.Jcrop(from,options);};img.src=loadsrc;};if(typeof(options)!=='object')options={};this.each(function() -{if($(this).data('Jcrop')) -{if(options=='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);} -else attachWhenDone(this);});return this;};})(jQuery); \ No newline at end of file diff --git a/modules/photoannotation/js/jquery.annotate.js b/modules/photoannotation/js/jquery.annotate.js index 264f19b2..56660594 100644 --- a/modules/photoannotation/js/jquery.annotate.js +++ b/modules/photoannotation/js/jquery.annotate.js @@ -1,478 +1,479 @@ -/// -(function($) { - - $.fn.annotateImage = function(options) { - /// - /// Creates annotations on the given image. - /// Images are loaded from the "getUrl" propety passed into the options. - /// - var opts = $.extend({}, $.fn.annotateImage.defaults, options); - var image = this; - - this.image = this; - this.mode = 'view'; - - // Assign defaults - this.getUrl = opts.getUrl; - this.saveUrl = opts.saveUrl; - this.deleteUrl = opts.deleteUrl; - this.currentUrl = opts.currentUrl; - this.deleteUrl = opts.deleteUrl; - this.editable = opts.editable; - this.useAjax = opts.useAjax; - this.tags = opts.tags; - this.notes = opts.notes; - this.labels = opts.labels; - this.csrf = opts.csrf; - - // Add the canvas - this.canvas = $('
'); - this.canvas.children('.image-annotate-edit').hide(); - this.canvas.children('.image-annotate-view').hide(); - this.image.after(this.canvas); - - // Give the canvas and the container their size and background - this.canvas.height(this.height()); - this.canvas.width(this.width()); - this.canvas.css('background-image', 'url("' + this.attr('src') + '")'); - this.canvas.children('.image-annotate-view, .image-annotate-edit').height(this.height()); - this.canvas.children('.image-annotate-view, .image-annotate-edit').width(this.width()); - - // Add the behavior: hide/show the notes when hovering the picture - this.canvas.hover(function() { - if ($(this).children('.image-annotate-edit').css('display') == 'none') { - $(this).children('.image-annotate-view').show(); - } - }, function() { - $(this).children('.image-annotate-view').hide(); - $(this).children('.image-annotate-note').hide(); - }); - - this.canvas.children('.image-annotate-view').hover(function() { - $(this).show(); - }, function() { - $(this).hide(); - $(this).children('.image-annotate-note').hide(); - }); - - // load the notes - if (this.useAjax) { - $.fn.annotateImage.ajaxLoad(this); - } else { - $.fn.annotateImage.load(this, this.labels, this.editable, this.csrf, this.deleteUrl); - } - - // Add the "Add a note" button - if ($('#g-photoannotation-link').length != 0) { - this.button = $('#g-photoannotation-link'); - this.button.click(function() { - $.fn.annotateImage.add(image, opts.tags, opts.labels, opts.saveUrl, opts.currentUrl, opts.csrf); - }); - //this.canvas.after(this.button); - } - - // Hide the original - this.hide(); - - return this; - }; - - /** - * Plugin Defaults - **/ - $.fn.annotateImage.defaults = { - getUrl: 'your-get.rails', - saveUrl: 'your-save.rails', - deleteUrl: 'your-delete.rails', - editable: true, - useAjax: true, - tags: new Array(), - notes: new Array() - }; - - $.fn.annotateImage.clear = function(image) { - /// - /// Clears all existing annotations from the image. - /// - for (var i = 0; i < image.notes.length; i++) { - image.notes[image.notes[i]].destroy(); - } - image.notes = new Array(); - }; - - $.fn.annotateImage.ajaxLoad = function(image) { - /// - /// Loads the annotations from the "getUrl" property passed in on the - /// options object. - /// - $.getJSON(image.getUrl + '?ticks=' + $.fn.annotateImage.getTicks(), function(data) { - image.notes = data; - $.fn.annotateImage.load(image); - }); - }; - - $.fn.annotateImage.load = function(image, labels, editable, csrf, deleteUrl) { - /// - /// Loads the annotations from the notes property passed in on the - /// options object. - /// - for (var i = 0; i < image.notes.length; i++) { - image.notes[image.notes[i]] = new $.fn.annotateView(image, image.notes[i], labels, editable, csrf, deleteUrl); - } - }; - - $.fn.annotateImage.getTicks = function() { - /// - /// Gets a count og the ticks for the current date. - /// This is used to ensure that URLs are always unique and not cached by the browser. - /// - var now = new Date(); - return now.getTime(); - }; - - $.fn.annotateImage.add = function(image, tags, labels, saveUrl, currentUrl, csrf) { - /// - /// Adds a note to the image. - /// - if (image.mode == 'view') { - image.mode = 'edit'; - - // Create/prepare the editable note elements - var editable = new $.fn.annotateEdit(image, null, tags, labels, saveUrl, currentUrl, csrf); - - $.fn.annotateImage.createSaveButton(editable, image); - $.fn.annotateImage.createCancelButton(editable, image); - } - }; - - $.fn.annotateImage.createSaveButton = function(editable, image, note) { - /// - /// Creates a Save button on the editable note. - /// - var ok = $('OK'); - - ok.click(function() { - var form = $('#image-annotate-edit-form form'); - var text = $('#image-annotate-text').val(); - $.fn.annotateImage.appendPosition(form, editable) - image.mode = 'view'; - - form.submit(); - - editable.destroy(); - }); - editable.form.append(ok); - }; - - $.fn.annotateImage.createCancelButton = function(editable, image) { - /// - /// Creates a Cancel button on the editable note. - /// - var cancel = $('Cancel'); - cancel.click(function() { - editable.destroy(); - image.mode = 'view'; - }); - editable.form.append(cancel); - }; - - $.fn.annotateImage.saveAsHtml = function(image, target) { - var element = $(target); - var html = ""; - for (var i = 0; i < image.notes.length; i++) { - html += $.fn.annotateImage.createHiddenField("text_" + i, image.notes[i].text); - html += $.fn.annotateImage.createHiddenField("top_" + i, image.notes[i].top); - html += $.fn.annotateImage.createHiddenField("left_" + i, image.notes[i].left); - html += $.fn.annotateImage.createHiddenField("height_" + i, image.notes[i].height); - html += $.fn.annotateImage.createHiddenField("width_" + i, image.notes[i].width); - } - element.html(html); - }; - - $.fn.annotateImage.createHiddenField = function(name, value) { - return '<input type="hidden" name="' + name + '" value="' + value + '" />
'; - }; - - $.fn.annotateEdit = function(image, note, tags, labels, saveUrl, currentUrl, csrf) { - /// - /// Defines an editable annotation area. - /// - this.image = image; - - if (note) { - this.note = note; - } else { - var newNote = new Object(); - newNote.id = "new"; - newNote.top = 30; - newNote.left = 30; - newNote.width = 30; - newNote.height = 30; - newNote.text = ""; - this.note = newNote; - } - - // Set area - var area = image.canvas.children('.image-annotate-edit').children('.image-annotate-edit-area'); - this.area = area; - this.area.css('height', this.note.height + 'px'); - this.area.css('width', this.note.width + 'px'); - this.area.css('left', this.note.left + 'px'); - this.area.css('top', this.note.top + 'px'); - - // Show the edition canvas and hide the view canvas - image.canvas.children('.image-annotate-view').hide(); - image.canvas.children('.image-annotate-edit').show(); - - // Add the note (which we'll load with the form afterwards) - var tagdropdown = labels[0] + ''; - var form = $('
' + tagdropdown + labels[1] + '' + labels[2] + '
'); - this.form = form; - - $('body').append(this.form); - this.form.css('left', this.area.offset().left + 'px'); - this.form.css('top', (parseInt(this.area.offset().top) + parseInt(this.area.height()) + 7) + 'px'); - - // Set the area as a draggable/resizable element contained in the image canvas. - // Would be better to use the containment option for resizable but buggy - area.resizable({ - handles: 'all', - - stop: function(e, ui) { - form.css('left', area.offset().left + 'px'); - form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); - } - }) - .draggable({ - containment: image.canvas, - drag: function(e, ui) { - form.css('left', area.offset().left + 'px'); - form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); - }, - stop: function(e, ui) { - form.css('left', area.offset().left + 'px'); - form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); - } - }); - return this; - }; - - $.fn.annotateEdit.prototype.destroy = function() { - /// - /// Destroys an editable annotation area. - /// - this.image.canvas.children('.image-annotate-edit').hide(); - this.area.resizable('destroy'); - this.area.draggable('destroy'); - this.area.css('height', ''); - this.area.css('width', ''); - this.area.css('left', ''); - this.area.css('top', ''); - this.form.remove(); - } - - $.fn.annotateView = function(image, note, labels, editable, csrf, deleteUrl) { - /// - /// Defines a annotation area. - /// - this.image = image; - - this.note = note; - - // Add the area - this.area = $('
'); - image.canvas.children('.image-annotate-view').prepend(this.area); - - if (editable) { - this.delarea = $('
'); - image.canvas.children('.image-annotate-view').prepend(this.delarea); - this.delarea.bind('click',function () { - if (confirm(labels[3])) { - var alink = $(".g-fullsize-link"); - alink.unbind(); - alink.attr ('href', '#'); - alink.removeAttr ('rel'); - window.location = deleteUrl + "/" + csrf; - } - }) - this.delarea.hide(); - } - - // Add the note - this.form = $('
' + note.text + '
'); - this.form.hide(); - image.canvas.children('.image-annotate-view').append(this.form); - this.form.children('span.actions').hide(); - - // Set the position and size of the note - this.setPosition(); - - // Add the behavior: hide/display the note when hovering the area - var annotation = this; - this.area.hover(function() { - annotation.show(); - if (annotation.delarea != undefined) { - annotation.delarea.show(); - } - }, function() { - annotation.hide(); - if (annotation.delarea != undefined) { - annotation.delarea.hide(); - } - }); - - if (editable) { - this.delarea.hover(function() { - annotation.delarea.show(); - }, function() { - annotation.delarea.hide(); - }); - } - // Edit a note feature - if (note.url != "" && note.url != null) { - this.area.bind('click',function () { - var alink = $(".g-fullsize-link"); - alink.unbind(); - alink.attr ('href', '#'); - alink.removeAttr ('rel'); - window.location = note.url; - }) - } - - - - }; - - $.fn.annotateView.prototype.setPosition = function() { - /// - /// Sets the position of an annotation. - /// - this.area.children('div').height((parseInt(this.note.height) - 2) + 'px'); - this.area.children('div').width((parseInt(this.note.width) - 2) + 'px'); - this.area.css('left', (this.note.left) + 'px'); - this.area.css('top', (this.note.top) + 'px'); - this.form.css('left', (this.note.left) + 'px'); - this.form.css('top', (parseInt(this.note.top) + parseInt(this.note.height) + 7) + 'px'); - - if (this.delarea != undefined) { - this.delarea.children('div').height('14px'); - this.delarea.children('div').width('14px'); - this.delarea.css('left', (this.note.left + parseInt(this.note.width)) + 'px'); - this.delarea.css('top', (this.note.top) + 'px'); - } - }; - - $.fn.annotateView.prototype.show = function() { - /// - /// Highlights the annotation - /// - this.form.fadeIn(250); - if (!this.note.editable) { - this.area.addClass('image-annotate-area-hover'); - } else { - this.area.addClass('image-annotate-area-editable-hover'); - } - }; - - $.fn.annotateView.prototype.hide = function() { - /// - /// Removes the highlight from the annotation. - /// - this.form.fadeOut(250); - this.area.removeClass('image-annotate-area-hover'); - this.area.removeClass('image-annotate-area-editable-hover'); - }; - - $.fn.annotateView.prototype.destroy = function() { - /// - /// Destroys the annotation. - /// - this.area.remove(); - this.form.remove(); - } - - $.fn.annotateView.prototype.edit = function() { - /// - /// Edits the annotation. - /// - if (this.image.mode == 'view') { - this.image.mode = 'edit'; - var annotation = this; - - // Create/prepare the editable note elements - var editable = new $.fn.annotateEdit(this.image, this.note); - - $.fn.annotateImage.createSaveButton(editable, this.image, annotation); - - // Add the delete button - var del = $('Delete'); - del.click(function() { - var form = $('#image-annotate-edit-form form'); - - $.fn.annotateImage.appendPosition(form, editable) - - if (annotation.image.useAjax) { - $.ajax({ - url: annotation.image.deleteUrl, - data: form.serialize(), - error: function(e) { alert("An error occured deleting that note.") } - }); - } - - annotation.image.mode = 'view'; - editable.destroy(); - annotation.destroy(); - }); - editable.form.append(del); - - $.fn.annotateImage.createCancelButton(editable, this.image); - } - }; - - $.fn.annotateImage.appendPosition = function(form, editable) { - /// - /// Appends the annotations coordinates to the given form that is posted to the server. - /// - var areaFields = $('' + - '' + - '' + - '' + - ''); - form.append(areaFields); - } - - $.fn.annotateView.prototype.resetPosition = function(editable, text) { - /// - /// Sets the position of an annotation. - /// - this.form.html(text); - this.form.hide(); - - // Resize - this.area.children('div').height(editable.area.height() + 'px'); - this.area.children('div').width((editable.area.width() - 2) + 'px'); - this.area.css('left', (editable.area.position().left) + 'px'); - this.area.css('top', (editable.area.position().top) + 'px'); - this.form.css('left', (editable.area.position().left) + 'px'); - this.form.css('top', (parseInt(editable.area.position().top) + parseInt(editable.area.height()) + 7) + 'px'); - - // Save new position to note - this.note.top = editable.area.position().top; - this.note.left = editable.area.position().left; - this.note.height = editable.area.height(); - this.note.width = editable.area.width(); - this.note.text = text; - this.note.id = editable.note.id; - this.editable = true; - }; - -})(jQuery); +/// +(function($) { + + $.fn.annotateImage = function(options) { + /// + /// Creates annotations on the given image. + /// Images are loaded from the "getUrl" propety passed into the options. + /// + var opts = $.extend({}, $.fn.annotateImage.defaults, options); + var image = this; + + this.image = this; + this.mode = 'view'; + + // Assign defaults + this.getUrl = opts.getUrl; + this.saveUrl = opts.saveUrl; + this.deleteUrl = opts.deleteUrl; + this.currentUrl = opts.currentUrl; + this.deleteUrl = opts.deleteUrl; + this.editable = opts.editable; + this.useAjax = opts.useAjax; + this.tags = opts.tags; + this.notes = opts.notes; + this.labels = opts.labels; + this.csrf = opts.csrf; + + // Add the canvas + this.canvas = $('
'); + this.canvas.children('.image-annotate-edit').hide(); + this.canvas.children('.image-annotate-view').hide(); + this.image.after(this.canvas); + + // Give the canvas and the container their size and background + this.canvas.height(this.height()); + this.canvas.width(this.width()); + this.canvas.css('background-image', 'url("' + this.attr('src') + '")'); + this.canvas.children('.image-annotate-view, .image-annotate-edit').height(this.height()); + this.canvas.children('.image-annotate-view, .image-annotate-edit').width(this.width()); + + // Add the behavior: hide/show the notes when hovering the picture + this.canvas.hover(function() { + if ($(this).children('.image-annotate-edit').css('display') == 'none') { + $(this).children('.image-annotate-view').show(); + } + }, function() { + $(this).children('.image-annotate-view').hide(); + $(this).children('.image-annotate-note').hide(); + }); + + this.canvas.children('.image-annotate-view').hover(function() { + $(this).show(); + }, function() { + $(this).hide(); + $(this).children('.image-annotate-note').hide(); + }); + + // load the notes + if (this.useAjax) { + $.fn.annotateImage.ajaxLoad(this); + } else { + $.fn.annotateImage.load(this, this.labels, this.editable, this.csrf, this.deleteUrl, this.currentUrl); + } + + // Add the "Add a note" button + if ($('#g-photoannotation-link').length != 0) { + this.button = $('#g-photoannotation-link'); + this.button.click(function() { + $.fn.annotateImage.add(image, opts.tags, opts.labels, opts.saveUrl, opts.currentUrl, opts.csrf); + }); + //this.canvas.after(this.button); + } + + // Hide the original + this.hide(); + + return this; + }; + + /** + * Plugin Defaults + **/ + $.fn.annotateImage.defaults = { + getUrl: 'your-get.rails', + saveUrl: 'your-save.rails', + deleteUrl: 'your-delete.rails', + editable: true, + useAjax: true, + tags: new Array(), + notes: new Array() + }; + + $.fn.annotateImage.clear = function(image) { + /// + /// Clears all existing annotations from the image. + /// + for (var i = 0; i < image.notes.length; i++) { + image.notes[image.notes[i]].destroy(); + } + image.notes = new Array(); + }; + + $.fn.annotateImage.ajaxLoad = function(image) { + /// + /// Loads the annotations from the "getUrl" property passed in on the + /// options object. + /// + $.getJSON(image.getUrl + '?ticks=' + $.fn.annotateImage.getTicks(), function(data) { + image.notes = data; + $.fn.annotateImage.load(image); + }); + }; + + $.fn.annotateImage.load = function(image, labels, editable, csrf, deleteUrl, currentUrl) { + /// + /// Loads the annotations from the notes property passed in on the + /// options object. + /// + for (var i = 0; i < image.notes.length; i++) { + image.notes[image.notes[i]] = new $.fn.annotateView(image, image.notes[i], labels, editable, csrf, deleteUrl, currentUrl); + } + }; + + $.fn.annotateImage.getTicks = function() { + /// + /// Gets a count og the ticks for the current date. + /// This is used to ensure that URLs are always unique and not cached by the browser. + /// + var now = new Date(); + return now.getTime(); + }; + + $.fn.annotateImage.add = function(image, tags, labels, saveUrl, currentUrl, csrf) { + /// + /// Adds a note to the image. + /// + if (image.mode == 'view') { + image.mode = 'edit'; + + // Create/prepare the editable note elements + var editable = new $.fn.annotateEdit(image, null, tags, labels, saveUrl, currentUrl, csrf); + + $.fn.annotateImage.createSaveButton(editable, image); + $.fn.annotateImage.createCancelButton(editable, image); + } + }; + + $.fn.annotateImage.createSaveButton = function(editable, image, note) { + /// + /// Creates a Save button on the editable note. + /// + var ok = $('OK'); + + ok.click(function() { + var form = $('#image-annotate-edit-form form'); + var text = $('#image-annotate-text').val(); + $.fn.annotateImage.appendPosition(form, editable) + image.mode = 'view'; + + form.submit(); + + editable.destroy(); + }); + editable.form.append(ok); + }; + + $.fn.annotateImage.createCancelButton = function(editable, image) { + /// + /// Creates a Cancel button on the editable note. + /// + var cancel = $('Cancel'); + cancel.click(function() { + editable.destroy(); + image.mode = 'view'; + }); + editable.form.append(cancel); + }; + + $.fn.annotateImage.saveAsHtml = function(image, target) { + var element = $(target); + var html = ""; + for (var i = 0; i < image.notes.length; i++) { + html += $.fn.annotateImage.createHiddenField("text_" + i, image.notes[i].text); + html += $.fn.annotateImage.createHiddenField("top_" + i, image.notes[i].top); + html += $.fn.annotateImage.createHiddenField("left_" + i, image.notes[i].left); + html += $.fn.annotateImage.createHiddenField("height_" + i, image.notes[i].height); + html += $.fn.annotateImage.createHiddenField("width_" + i, image.notes[i].width); + } + element.html(html); + }; + + $.fn.annotateImage.createHiddenField = function(name, value) { + return '<input type="hidden" name="' + name + '" value="' + value + '" />
'; + }; + + $.fn.annotateEdit = function(image, note, tags, labels, saveUrl, currentUrl, csrf) { + /// + /// Defines an editable annotation area. + /// + this.image = image; + + if (note) { + this.note = note; + } else { + var newNote = new Object(); + newNote.id = "new"; + newNote.top = 30; + newNote.left = 30; + newNote.width = 30; + newNote.height = 30; + newNote.text = ""; + this.note = newNote; + } + + // Set area + var area = image.canvas.children('.image-annotate-edit').children('.image-annotate-edit-area'); + this.area = area; + this.area.css('height', this.note.height + 'px'); + this.area.css('width', this.note.width + 'px'); + this.area.css('left', this.note.left + 'px'); + this.area.css('top', this.note.top + 'px'); + + // Show the edition canvas and hide the view canvas + image.canvas.children('.image-annotate-view').hide(); + image.canvas.children('.image-annotate-edit').show(); + + // Add the note (which we'll load with the form afterwards) + var tagdropdown = labels[0] + ''; + var form = $('
' + tagdropdown + labels[1] + '' + labels[2] + '
'); + this.form = form; + + $('body').append(this.form); + this.form.css('left', this.area.offset().left + 'px'); + this.form.css('top', (parseInt(this.area.offset().top) + parseInt(this.area.height()) + 7) + 'px'); + + // Set the area as a draggable/resizable element contained in the image canvas. + // Would be better to use the containment option for resizable but buggy + area.resizable({ + handles: 'all', + + stop: function(e, ui) { + form.css('left', area.offset().left + 'px'); + form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); + } + }) + .draggable({ + containment: image.canvas, + drag: function(e, ui) { + form.css('left', area.offset().left + 'px'); + form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); + }, + stop: function(e, ui) { + form.css('left', area.offset().left + 'px'); + form.css('top', (parseInt(area.offset().top) + parseInt(area.height()) + 2) + 'px'); + } + }); + return this; + }; + + $.fn.annotateEdit.prototype.destroy = function() { + /// + /// Destroys an editable annotation area. + /// + this.image.canvas.children('.image-annotate-edit').hide(); + this.area.resizable('destroy'); + this.area.draggable('destroy'); + this.area.css('height', ''); + this.area.css('width', ''); + this.area.css('left', ''); + this.area.css('top', ''); + this.form.remove(); + } + + $.fn.annotateView = function(image, note, labels, editable, csrf, deleteUrl, currentUrl) { + /// + /// Defines a annotation area. + /// + this.image = image; + + this.note = note; + + // Add the area + this.area = $('
'); + image.canvas.children('.image-annotate-view').prepend(this.area); + + if (editable) { + this.delarea = $('
'); + image.canvas.children('.image-annotate-view').prepend(this.delarea); + this.delarea.bind('click',function () { + if (confirm(labels[3])) { + var alink = $(".g-fullsize-link"); + alink.unbind(); + alink.attr ('href', '#'); + alink.removeAttr ('rel'); + var delform = $(this).children('div').children('form'); + delform.submit(); + } + }) + this.delarea.hide(); + } + + // Add the note + this.form = $('
' + note.text + '
'); + this.form.hide(); + image.canvas.children('.image-annotate-view').append(this.form); + this.form.children('span.actions').hide(); + + // Set the position and size of the note + this.setPosition(); + + // Add the behavior: hide/display the note when hovering the area + var annotation = this; + this.area.hover(function() { + annotation.show(); + if (annotation.delarea != undefined) { + annotation.delarea.show(); + } + }, function() { + annotation.hide(); + if (annotation.delarea != undefined) { + annotation.delarea.hide(); + } + }); + + if (editable) { + this.delarea.hover(function() { + annotation.delarea.show(); + }, function() { + annotation.delarea.hide(); + }); + } + // Edit a note feature + if (note.url != "" && note.url != null) { + this.area.bind('click',function () { + var alink = $(".g-fullsize-link"); + alink.unbind(); + alink.attr ('href', '#'); + alink.removeAttr ('rel'); + window.location = note.url; + }) + } + + + + }; + + $.fn.annotateView.prototype.setPosition = function() { + /// + /// Sets the position of an annotation. + /// + this.area.children('div').height((parseInt(this.note.height) - 2) + 'px'); + this.area.children('div').width((parseInt(this.note.width) - 2) + 'px'); + this.area.css('left', (this.note.left) + 'px'); + this.area.css('top', (this.note.top) + 'px'); + this.form.css('left', (this.note.left) + 'px'); + this.form.css('top', (parseInt(this.note.top) + parseInt(this.note.height) + 7) + 'px'); + + if (this.delarea != undefined) { + this.delarea.children('div').height('14px'); + this.delarea.children('div').width('14px'); + this.delarea.css('left', (this.note.left + parseInt(this.note.width)) + 'px'); + this.delarea.css('top', (this.note.top) + 'px'); + } + }; + + $.fn.annotateView.prototype.show = function() { + /// + /// Highlights the annotation + /// + this.form.fadeIn(250); + if (!this.note.editable) { + this.area.addClass('image-annotate-area-hover'); + } else { + this.area.addClass('image-annotate-area-editable-hover'); + } + }; + + $.fn.annotateView.prototype.hide = function() { + /// + /// Removes the highlight from the annotation. + /// + this.form.fadeOut(250); + this.area.removeClass('image-annotate-area-hover'); + this.area.removeClass('image-annotate-area-editable-hover'); + }; + + $.fn.annotateView.prototype.destroy = function() { + /// + /// Destroys the annotation. + /// + this.area.remove(); + this.form.remove(); + } + + $.fn.annotateView.prototype.edit = function() { + /// + /// Edits the annotation. + /// + if (this.image.mode == 'view') { + this.image.mode = 'edit'; + var annotation = this; + + // Create/prepare the editable note elements + var editable = new $.fn.annotateEdit(this.image, this.note); + + $.fn.annotateImage.createSaveButton(editable, this.image, annotation); + + // Add the delete button + var del = $('Delete'); + del.click(function() { + var form = $('#image-annotate-edit-form form'); + + $.fn.annotateImage.appendPosition(form, editable) + + if (annotation.image.useAjax) { + $.ajax({ + url: annotation.image.deleteUrl, + data: form.serialize(), + error: function(e) { alert("An error occured deleting that note.") } + }); + } + + annotation.image.mode = 'view'; + editable.destroy(); + annotation.destroy(); + }); + editable.form.append(del); + + $.fn.annotateImage.createCancelButton(editable, this.image); + } + }; + + $.fn.annotateImage.appendPosition = function(form, editable) { + /// + /// Appends the annotations coordinates to the given form that is posted to the server. + /// + var areaFields = $('' + + '' + + '' + + '' + + ''); + form.append(areaFields); + } + + $.fn.annotateView.prototype.resetPosition = function(editable, text) { + /// + /// Sets the position of an annotation. + /// + this.form.html(text); + this.form.hide(); + + // Resize + this.area.children('div').height(editable.area.height() + 'px'); + this.area.children('div').width((editable.area.width() - 2) + 'px'); + this.area.css('left', (editable.area.position().left) + 'px'); + this.area.css('top', (editable.area.position().top) + 'px'); + this.form.css('left', (editable.area.position().left) + 'px'); + this.form.css('top', (parseInt(editable.area.position().top) + parseInt(editable.area.height()) + 7) + 'px'); + + // Save new position to note + this.note.top = editable.area.position().top; + this.note.left = editable.area.position().left; + this.note.height = editable.area.height(); + this.note.width = editable.area.width(); + this.note.text = text; + this.note.id = editable.note.id; + this.editable = true; + }; + +})(jQuery); diff --git a/modules/photoannotation/js/jquery.annotate.min.js b/modules/photoannotation/js/jquery.annotate.min.js index e56337fd..db7667f2 100644 --- a/modules/photoannotation/js/jquery.annotate.min.js +++ b/modules/photoannotation/js/jquery.annotate.min.js @@ -1 +1,2 @@ -(function($){$.fn.annotateImage=function(options){var opts=$.extend({},$.fn.annotateImage.defaults,options);var image=this;this.image=this;this.mode='view';this.getUrl=opts.getUrl;this.saveUrl=opts.saveUrl;this.deleteUrl=opts.deleteUrl;this.editable=opts.editable;this.useAjax=opts.useAjax;this.notes=opts.notes;this.canvas=$('
');this.canvas.children('.image-annotate-edit').hide();this.canvas.children('.image-annotate-view').hide();this.image.after(this.canvas);this.canvas.height(this.height());this.canvas.width(this.width());this.canvas.css('background-image','url("'+this.attr('src')+'")');this.canvas.children('.image-annotate-view, .image-annotate-edit').height(this.height());this.canvas.children('.image-annotate-view, .image-annotate-edit').width(this.width());this.canvas.hover(function(){if($(this).children('.image-annotate-edit').css('display')=='none'){$(this).children('.image-annotate-view').show()}},function(){$(this).children('.image-annotate-view').hide();$(this).children('.image-annotate-note').hide()});this.canvas.children('.image-annotate-view').hover(function(){$(this).show()},function(){$(this).hide();$(this).children('.image-annotate-note').hide()});if(this.useAjax){$.fn.annotateImage.ajaxLoad(this)}else{$.fn.annotateImage.load(this)}if(this.editable){this.button=$('Add Note');this.button.click(function(){$.fn.annotateImage.add(image)});this.canvas.after(this.button)}this.hide();return this};$.fn.annotateImage.defaults={getUrl:'your-get.rails',saveUrl:'your-save.rails',deleteUrl:'your-delete.rails',editable:true,useAjax:true,notes:new Array()};$.fn.annotateImage.clear=function(image){for(var i=0;iOK');ok.click(function(){var form=$('#image-annotate-edit-form form');var text=$('#image-annotate-text').val();$.fn.annotateImage.appendPosition(form,editable)image.mode='view';if(image.useAjax){$.ajax({url:image.saveUrl,data:form.serialize(),error:function(e){alert("An error occured saving that note.")},success:function(data){if(data.annotation_id!=undefined){editable.note.id=data.annotation_id}},dataType:"json"})}if(note){note.resetPosition(editable,text)}else{editable.note.editable=true;note=new $.fn.annotateView(image,editable.note)note.resetPosition(editable,text);image.notes.push(editable.note)}editable.destroy()});editable.form.append(ok)};$.fn.annotateImage.createCancelButton=function(editable,image){var cancel=$('Cancel');cancel.click(function(){editable.destroy();image.mode='view'});editable.form.append(cancel)};$.fn.annotateImage.saveAsHtml=function(image,target){var element=$(target);var html="";for(var i=0;i'};$.fn.annotateEdit=function(image,note){this.image=image;if(note){this.note=note}else{var newNote=new Object();newNote.id="new";newNote.top=30;newNote.left=30;newNote.width=30;newNote.height=30;newNote.text="";this.note=newNote}var area=image.canvas.children('.image-annotate-edit').children('.image-annotate-edit-area');this.area=area;this.area.css('height',this.note.height+'px');this.area.css('width',this.note.width+'px');this.area.css('left',this.note.left+'px');this.area.css('top',this.note.top+'px');image.canvas.children('.image-annotate-view').hide();image.canvas.children('.image-annotate-edit').show();var form=$('
');this.form=form;$('body').append(this.form);this.form.css('left',this.area.offset().left+'px');this.form.css('top',(parseInt(this.area.offset().top)+parseInt(this.area.height())+7)+'px');area.resizable({handles:'all',stop:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')}}).draggable({containment:image.canvas,drag:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')},stop:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')}});return this};$.fn.annotateEdit.prototype.destroy=function(){this.image.canvas.children('.image-annotate-edit').hide();this.area.resizable('destroy');this.area.draggable('destroy');this.area.css('height','');this.area.css('width','');this.area.css('left','');this.area.css('top','');this.form.remove()}$.fn.annotateView=function(image,note){this.image=image;this.note=note;this.area=$('
');image.canvas.children('.image-annotate-view').prepend(this.area);this.form=$('
'+note.text+'
');this.form.hide();image.canvas.children('.image-annotate-view').append(this.form);this.form.children('span.actions').hide();this.setPosition();var annotation=this;this.area.hover(function(){annotation.show()},function(){annotation.hide()});if(note.url!=""&¬e.url!=null){this.area.bind('click',function(){window.location=note.url})}};$.fn.annotateView.prototype.setPosition=function(){this.area.children('div').height((parseInt(this.note.height)-2)+'px');this.area.children('div').width((parseInt(this.note.width)-2)+'px');this.area.css('left',(this.note.left)+'px');this.area.css('top',(this.note.top)+'px');this.form.css('left',(this.note.left)+'px');this.form.css('top',(parseInt(this.note.top)+parseInt(this.note.height)+7)+'px')};$.fn.annotateView.prototype.show=function(){this.form.fadeIn(250);if(!this.editable){this.area.addClass('image-annotate-area-hover')}else{this.area.addClass('image-annotate-area-editable-hover')}};$.fn.annotateView.prototype.hide=function(){this.form.fadeOut(250);this.area.removeClass('image-annotate-area-hover');this.area.removeClass('image-annotate-area-editable-hover')};$.fn.annotateView.prototype.destroy=function(){this.area.remove();this.form.remove()}$.fn.annotateView.prototype.edit=function(){if(this.image.mode=='view'){this.image.mode='edit';var annotation=this;var editable=new $.fn.annotateEdit(this.image,this.note);$.fn.annotateImage.createSaveButton(editable,this.image,annotation);var del=$('Delete');del.click(function(){var form=$('#image-annotate-edit-form form');$.fn.annotateImage.appendPosition(form,editable)if(annotation.image.useAjax){$.ajax({url:annotation.image.deleteUrl,data:form.serialize(),error:function(e){alert("An error occured deleting that note.")}})}annotation.image.mode='view';editable.destroy();annotation.destroy()});editable.form.append(del);$.fn.annotateImage.createCancelButton(editable,this.image)}};$.fn.annotateImage.appendPosition=function(form,editable){var areaFields=$(''+''+''+''+'');form.append(areaFields)}$.fn.annotateView.prototype.resetPosition=function(editable,text){this.form.html(text);this.form.hide();this.area.children('div').height(editable.area.height()+'px');this.area.children('div').width((editable.area.width()-2)+'px');this.area.css('left',(editable.area.position().left)+'px');this.area.css('top',(editable.area.position().top)+'px');this.form.css('left',(editable.area.position().left)+'px');this.form.css('top',(parseInt(editable.area.position().top)+parseInt(editable.area.height())+7)+'px');this.note.top=editable.area.position().top;this.note.left=editable.area.position().left;this.note.height=editable.area.height();this.note.width=editable.area.width();this.note.text=text;this.note.id=editable.note.id;this.editable=true}})(jQuery); + +(function($){$.fn.annotateImage=function(options){var opts=$.extend({},$.fn.annotateImage.defaults,options);var image=this;this.image=this;this.mode='view';this.getUrl=opts.getUrl;this.saveUrl=opts.saveUrl;this.deleteUrl=opts.deleteUrl;this.currentUrl=opts.currentUrl;this.deleteUrl=opts.deleteUrl;this.editable=opts.editable;this.useAjax=opts.useAjax;this.tags=opts.tags;this.notes=opts.notes;this.labels=opts.labels;this.csrf=opts.csrf;this.canvas=$('
');this.canvas.children('.image-annotate-edit').hide();this.canvas.children('.image-annotate-view').hide();this.image.after(this.canvas);this.canvas.height(this.height());this.canvas.width(this.width());this.canvas.css('background-image','url("'+this.attr('src')+'")');this.canvas.children('.image-annotate-view, .image-annotate-edit').height(this.height());this.canvas.children('.image-annotate-view, .image-annotate-edit').width(this.width());this.canvas.hover(function(){if($(this).children('.image-annotate-edit').css('display')=='none'){$(this).children('.image-annotate-view').show()}},function(){$(this).children('.image-annotate-view').hide();$(this).children('.image-annotate-note').hide()});this.canvas.children('.image-annotate-view').hover(function(){$(this).show()},function(){$(this).hide();$(this).children('.image-annotate-note').hide()});if(this.useAjax){$.fn.annotateImage.ajaxLoad(this)}else{$.fn.annotateImage.load(this,this.labels,this.editable,this.csrf,this.deleteUrl,this.currentUrl)}if($('#g-photoannotation-link').length!=0){this.button=$('#g-photoannotation-link');this.button.click(function(){$.fn.annotateImage.add(image,opts.tags,opts.labels,opts.saveUrl,opts.currentUrl,opts.csrf)})}this.hide();return this};$.fn.annotateImage.defaults={getUrl:'your-get.rails',saveUrl:'your-save.rails',deleteUrl:'your-delete.rails',editable:true,useAjax:true,tags:new Array(),notes:new Array()};$.fn.annotateImage.clear=function(image){for(var i=0;iOK');ok.click(function(){var form=$('#image-annotate-edit-form form');var text=$('#image-annotate-text').val();$.fn.annotateImage.appendPosition(form,editable)image.mode='view';form.submit();editable.destroy()});editable.form.append(ok)};$.fn.annotateImage.createCancelButton=function(editable,image){var cancel=$('Cancel');cancel.click(function(){editable.destroy();image.mode='view'});editable.form.append(cancel)};$.fn.annotateImage.saveAsHtml=function(image,target){var element=$(target);var html="";for(var i=0;i'};$.fn.annotateEdit=function(image,note,tags,labels,saveUrl,currentUrl,csrf){this.image=image;if(note){this.note=note}else{var newNote=new Object();newNote.id="new";newNote.top=30;newNote.left=30;newNote.width=30;newNote.height=30;newNote.text="";this.note=newNote}var area=image.canvas.children('.image-annotate-edit').children('.image-annotate-edit-area');this.area=area;this.area.css('height',this.note.height+'px');this.area.css('width',this.note.width+'px');this.area.css('left',this.note.left+'px');this.area.css('top',this.note.top+'px');image.canvas.children('.image-annotate-view').hide();image.canvas.children('.image-annotate-edit').show();var tagdropdown=labels[0]+'';var form=$('
'+tagdropdown+labels[1]+''+labels[2]+'
');this.form=form;$('body').append(this.form);this.form.css('left',this.area.offset().left+'px');this.form.css('top',(parseInt(this.area.offset().top)+parseInt(this.area.height())+7)+'px');area.resizable({handles:'all',stop:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')}}).draggable({containment:image.canvas,drag:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')},stop:function(e,ui){form.css('left',area.offset().left+'px');form.css('top',(parseInt(area.offset().top)+parseInt(area.height())+2)+'px')}});return this};$.fn.annotateEdit.prototype.destroy=function(){this.image.canvas.children('.image-annotate-edit').hide();this.area.resizable('destroy');this.area.draggable('destroy');this.area.css('height','');this.area.css('width','');this.area.css('left','');this.area.css('top','');this.form.remove()}$.fn.annotateView=function(image,note,labels,editable,csrf,deleteUrl,currentUrl){this.image=image;this.note=note;this.area=$('
');image.canvas.children('.image-annotate-view').prepend(this.area);if(editable){this.delarea=$('
');image.canvas.children('.image-annotate-view').prepend(this.delarea);this.delarea.bind('click',function(){if(confirm(labels[3])){var alink=$(".g-fullsize-link");alink.unbind();alink.attr('href','#');alink.removeAttr('rel');var delform=$(this).children('div').children('form');delform.submit()}})this.delarea.hide()}this.form=$('
'+note.text+'
');this.form.hide();image.canvas.children('.image-annotate-view').append(this.form);this.form.children('span.actions').hide();this.setPosition();var annotation=this;this.area.hover(function(){annotation.show();if(annotation.delarea!=undefined){annotation.delarea.show()}},function(){annotation.hide();if(annotation.delarea!=undefined){annotation.delarea.hide()}});if(editable){this.delarea.hover(function(){annotation.delarea.show()},function(){annotation.delarea.hide()})}if(note.url!=""&¬e.url!=null){this.area.bind('click',function(){var alink=$(".g-fullsize-link");alink.unbind();alink.attr('href','#');alink.removeAttr('rel');window.location=note.url})}};$.fn.annotateView.prototype.setPosition=function(){this.area.children('div').height((parseInt(this.note.height)-2)+'px');this.area.children('div').width((parseInt(this.note.width)-2)+'px');this.area.css('left',(this.note.left)+'px');this.area.css('top',(this.note.top)+'px');this.form.css('left',(this.note.left)+'px');this.form.css('top',(parseInt(this.note.top)+parseInt(this.note.height)+7)+'px');if(this.delarea!=undefined){this.delarea.children('div').height('14px');this.delarea.children('div').width('14px');this.delarea.css('left',(this.note.left+parseInt(this.note.width))+'px');this.delarea.css('top',(this.note.top)+'px')}};$.fn.annotateView.prototype.show=function(){this.form.fadeIn(250);if(!this.note.editable){this.area.addClass('image-annotate-area-hover')}else{this.area.addClass('image-annotate-area-editable-hover')}};$.fn.annotateView.prototype.hide=function(){this.form.fadeOut(250);this.area.removeClass('image-annotate-area-hover');this.area.removeClass('image-annotate-area-editable-hover')};$.fn.annotateView.prototype.destroy=function(){this.area.remove();this.form.remove()}$.fn.annotateView.prototype.edit=function(){if(this.image.mode=='view'){this.image.mode='edit';var annotation=this;var editable=new $.fn.annotateEdit(this.image,this.note);$.fn.annotateImage.createSaveButton(editable,this.image,annotation);var del=$('Delete');del.click(function(){var form=$('#image-annotate-edit-form form');$.fn.annotateImage.appendPosition(form,editable)if(annotation.image.useAjax){$.ajax({url:annotation.image.deleteUrl,data:form.serialize(),error:function(e){alert("An error occured deleting that note.")}})}annotation.image.mode='view';editable.destroy();annotation.destroy()});editable.form.append(del);$.fn.annotateImage.createCancelButton(editable,this.image)}};$.fn.annotateImage.appendPosition=function(form,editable){var areaFields=$(''+''+''+''+'');form.append(areaFields)}$.fn.annotateView.prototype.resetPosition=function(editable,text){this.form.html(text);this.form.hide();this.area.children('div').height(editable.area.height()+'px');this.area.children('div').width((editable.area.width()-2)+'px');this.area.css('left',(editable.area.position().left)+'px');this.area.css('top',(editable.area.position().top)+'px');this.form.css('left',(editable.area.position().left)+'px');this.form.css('top',(parseInt(editable.area.position().top)+parseInt(editable.area.height())+7)+'px');this.note.top=editable.area.position().top;this.note.left=editable.area.position().left;this.note.height=editable.area.height();this.note.width=editable.area.width();this.note.text=text;this.note.id=editable.note.id;this.editable=true}})(jQuery); diff --git a/modules/photoannotation/js/jquery.min.js b/modules/photoannotation/js/jquery.min.js deleted file mode 100644 index 55c2e6d7..00000000 --- a/modules/photoannotation/js/jquery.min.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/modules/photoannotation/models/items_face.php b/modules/photoannotation/models/items_face.php index 70395b35..8f3a4072 100644 --- a/modules/photoannotation/models/items_face.php +++ b/modules/photoannotation/models/items_face.php @@ -1,21 +1,21 @@ - +
+

+

+

TagFaces module by rWatcher.
+ This means that notes and faces that you create in either one will be shown and are editable by the other module as well.
+ However since both modules do the same you cannot have both active at the same time.

+ If you decide to show annotations below the photo but they are displayed below the comments section (or any other data), + please download and install the Module order module.") ?>

+ +
diff --git a/modules/photoannotation/views/photoannotation.html.php b/modules/photoannotation/views/photoannotation.html.php deleted file mode 100644 index 83a99677..00000000 --- a/modules/photoannotation/views/photoannotation.html.php +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - -
- dynamic_top() ?> -
-

-

- resize_img(array("id" => "g-select-photo-id-{$item->id}", "class" => "g-select-resize", "style" => "position: fixed;")) ?> -
-
- - - -
- -
- -


- -
-
-

- -
-
- -
- - - -dynamic_bottom() ?> diff --git a/modules/photoannotation/views/photoannotation_highlight_block.html.php b/modules/photoannotation/views/photoannotation_highlight_block.html.php index bc18d181..78fd9abc 100644 --- a/modules/photoannotation/views/photoannotation_highlight_block.html.php +++ b/modules/photoannotation/views/photoannotation_highlight_block.html.php @@ -1,79 +1,108 @@ -where("item_id", "=", $item->id) - ->find_all(); - $existingNotes = ORM::factory("items_note") - ->where("item_id", "=", $item->id) - ->find_all(); - $tags_arraystring = ""; - $jscode = ""; - // If it does, then insert some javascript and display an image map - // to show where the faces are at. - if ((count($existingFaces) > 0) || (count($existingNotes) > 0)) { - $jscode = "notes: [ "; - foreach ($existingFaces as $oneFace) { - $oneTag = ORM::factory("tag", $oneFace->tag_id); - $jscode .= "{ \"top\": ". $oneFace->y1 .",\n"; - $jscode .= "\"left\": ". $oneFace->x1 .",\n"; - $jscode .= "\"width\": ". ($oneFace->x2 - $oneFace->x1) .",\n"; - $jscode .= "\"height\": ". ($oneFace->y2 - $oneFace->y1) .",\n"; - $jscode .= "\"text\": \"". html::clean($oneTag->name) ."\",\n"; - $jscode .= "\"noteid\": ". $oneNote->id .",\n"; - $jscode .= "\"editable\": true,\n"; - $jscode .= "\"url\": \"". $oneTag->url() ."\" },\n"; - } - - foreach ($existingNotes as $oneNote) { - $tagdesc = ""; - if ($oneNote->description) { - $tagdesc = "
". html::clean($oneNote->description); - } - $jscode .= "{ \"top\": ". $oneNote->y1 .",\n"; - $jscode .= "\"left\": ". $oneNote->x1 .",\n"; - $jscode .= "\"width\": ". ($oneNote->x2 - $oneNote->x1) .",\n"; - $jscode .= "\"height\": ". ($oneNote->y2 - $oneNote->y1) .",\n"; - $jscode .= "\"text\": \"". html::clean($oneNote->title) . $tagdesc ."\",\n"; - $jscode .= "\"noteid\": ". $oneNote->id .",\n"; - $jscode .= "\"editable\": false,\n"; - $jscode .= "\"url\": \"\" },\n"; - } - $jscode = trim($jscode, ",\n"); - $jscode .= " ],"; - } - $item_tags = ORM::factory("tag") - ->join("items_tags", "tags.id", "items_tags.tag_id") - ->where("items_tags.item_id", "=", $item->id) - ->find_all(); - $tags_arraystring = "tags: [ "; - foreach ($item_tags as $current_tag) { - $tags_arraystring .= "{'name':'". html::clean($current_tag->name) ."','id':'". $current_tag->id ."'},"; - } - $tags_arraystring = trim($tags_arraystring, ","); - $tags_arraystring .= " ],"; - $labels_arraystring = "labels: [ '". t("Tag:") ."','". t("Note Title:") ."','". t("Description (optional):") ."','". t("Are you sure you want to delete this annotation?") ."' ],"; -?> - - - - +where("item_id", "=", $item->id) + ->find_all(); + $existingNotes = ORM::factory("items_note") + ->where("item_id", "=", $item->id) + ->find_all(); + $tags_arraystring = ""; + $jscode = ""; + $legend_faces = ""; + $legend_notes = ""; + // If it does, then insert some javascript and display an image map + // to show where the faces are at. + if ((count($existingFaces) > 0) || (count($existingNotes) > 0)) { + $jscode = "notes: [ "; + foreach ($existingFaces as $oneFace) { + $oneTag = ORM::factory("tag", $oneFace->tag_id); + $tagdesc = ""; + if ($oneFace->description) { + $tagdesc = "
". html::clean($oneFace->description); + } + if (module::get_var("photoannotation", "showfaces", false)) { + $legend_faces .= "url() ."\">". html::clean($oneTag->name) .", "; + } + $jscode .= "{ \"top\": ". $oneFace->y1 .",\n"; + $jscode .= "\"left\": ". $oneFace->x1 .",\n"; + $jscode .= "\"width\": ". ($oneFace->x2 - $oneFace->x1) .",\n"; + $jscode .= "\"height\": ". ($oneFace->y2 - $oneFace->y1) .",\n"; + $jscode .= "\"text\": \"". html::clean($oneTag->name) . $tagdesc ."\",\n"; + $jscode .= "\"noteid\": ". $oneFace->id .",\n"; + $jscode .= "\"notetype\": \"face\",\n"; + $jscode .= "\"editable\": true,\n"; + $jscode .= "\"url\": \"". $oneTag->url() ."\" },\n"; + } + if ($legend_faces != "") { + $legend_faces = trim($legend_faces, ", "); + $legend_faces = t("Faces on this photo: ") . $legend_faces; + } + foreach ($existingNotes as $oneNote) { + $tagdesc = ""; + if ($oneNote->description) { + $tagdesc = "
". html::clean($oneNote->description); + } + if (module::get_var("photoannotation", "shownotes", false)) { + $legend_notes .= html::clean($oneNote->title) .", "; + } + $jscode .= "{ \"top\": ". $oneNote->y1 .",\n"; + $jscode .= "\"left\": ". $oneNote->x1 .",\n"; + $jscode .= "\"width\": ". ($oneNote->x2 - $oneNote->x1) .",\n"; + $jscode .= "\"height\": ". ($oneNote->y2 - $oneNote->y1) .",\n"; + $jscode .= "\"text\": \"". html::clean($oneNote->title) . $tagdesc ."\",\n"; + $jscode .= "\"noteid\": ". $oneNote->id .",\n"; + $jscode .= "\"notetype\": \"note\",\n"; + $jscode .= "\"editable\": false,\n"; + $jscode .= "\"url\": \"\" },\n"; + } + $jscode = trim($jscode, ",\n"); + $jscode .= " ],"; + if ($legend_notes != "") { + $legend_notes = trim($legend_notes, ", "); + $legend_notes = t("Notes on this photo: ") . $legend_notes; + } + } + $legend_display = $legend_faces; + if ($legend_display == "") { + $legend_display = $legend_notes; + } else { + if ($legend_notes != "") { + $legend_display = $legend_display ."
". $legend_notes; + } + } + $item_tags = ORM::factory("tag") + ->join("items_tags", "tags.id", "items_tags.tag_id") + ->where("items_tags.item_id", "=", $item->id) + ->find_all(); + $tags_arraystring = "tags: [ "; + foreach ($item_tags as $current_tag) { + $tags_arraystring .= "{'name':'". html::clean($current_tag->name) ."','id':'". $current_tag->id ."'},"; + } + $tags_arraystring = trim($tags_arraystring, ","); + $tags_arraystring .= " ],"; + $labels_arraystring = "labels: [ '". t("Tag:") ."','". t("Note Title:") ."','". t("Description (optional):") ."','". t("Are you sure you want to delete this annotation?") ."' ],"; +?> + + + + ". $legend_display ."
" ?> + \ No newline at end of file From 20b07f9b2043d9241ce1aa7db21f0fba7eccc490 Mon Sep 17 00:00:00 2001 From: hukoeth Date: Sat, 28 Aug 2010 18:07:08 +0200 Subject: [PATCH 4/8] Module now allows editing of annotations --- .../controllers/photoannotation.php | 118 +++++++++++++----- .../photoannotation/css/photoannotation.css | 4 + .../helpers/photoannotation_theme.php | 2 +- modules/photoannotation/images/edit.png | Bin 0 -> 208 bytes modules/photoannotation/js/jquery.annotate.js | 93 ++++++++------ .../photoannotation_highlight_block.html.php | 16 +-- 6 files changed, 150 insertions(+), 83 deletions(-) create mode 100644 modules/photoannotation/images/edit.png diff --git a/modules/photoannotation/controllers/photoannotation.php b/modules/photoannotation/controllers/photoannotation.php index 4e690115..ea697be4 100644 --- a/modules/photoannotation/controllers/photoannotation.php +++ b/modules/photoannotation/controllers/photoannotation.php @@ -23,7 +23,8 @@ class photoannotation_Controller extends Controller { access::verify_csrf(); //Get form data - $id = $_POST["id"]; //Not yet needed since we are only creating new tagfaces will be needed when editing of existing ones is implemented + $noteid = $_POST["noteid"]; + $notetype = $_POST["notetype"]; $str_y1 = $_POST["top"]; $str_x1 = $_POST["left"]; $str_y2 = $_POST["height"] + $str_y1; //Annotation uses area size, tagfaces uses positions @@ -33,30 +34,25 @@ class photoannotation_Controller extends Controller { $str_face_description = $_POST["desc"]; $redir_uri = $_POST["currenturl"]; // Decide if we are saving a face or a note. - if ($tag_data == -1) { - if ($str_face_title == "") { - message::error(t("Please select a Tag or specify a Title.")); - url::redirect($redir_uri); - return; - } - //Save note - $newnote = ORM::factory("items_note"); - $newnote->item_id = $item_data; - $newnote->x1 = $str_x1; - $newnote->y1 = $str_y1; - $newnote->x2 = $str_x2; - $newnote->y2 = $str_y2; - $newnote->title = $str_face_title; - $newnote->description = $str_face_description; - $newnote->save(); - } else { - // Check to see if the tag already has a face associated with it. - $existingFace = ORM::factory("items_face") - ->where("tag_id", "=", $tag_data) - ->where("item_id", "=", $item_data) - ->find_all(); - - if (count($existingFace) == 0) { + + if ($noteid == "new") { + if ($tag_data == -1) { + if ($str_face_title == "") { + message::error(t("Please select a Tag or specify a Title.")); + url::redirect($redir_uri); + return; + } + //Save note + $newnote = ORM::factory("items_note"); + $newnote->item_id = $item_data; + $newnote->x1 = $str_x1; + $newnote->y1 = $str_y1; + $newnote->x2 = $str_x2; + $newnote->y2 = $str_y2; + $newnote->title = $str_face_title; + $newnote->description = $str_face_description; + $newnote->save(); + } else { // Save the new face to the database. $newface = ORM::factory("items_face"); $newface->tag_id = $tag_data; @@ -67,16 +63,70 @@ class photoannotation_Controller extends Controller { $newface->y2 = $str_y2; $newface->description = $str_face_description; $newface->save(); - } else { - // Update the coordinates of an existing face. - $updatedFace = ORM::factory("items_face", $existingFace[0]->id); - $updatedFace->x1 = $str_x1; - $updatedFace->y1 = $str_y1; - $updatedFace->x2 = $str_x2; - $updatedFace->y2 = $str_y2; - $updatedFace->description = $str_face_description; - $updatedFace->save(); } + } else { //update existing annotation + if ($notetype == "face") { //this is a face + $updatedAnnotation = ORM::factory("items_face") + ->where("id", "=", $noteid) + ->find(); + if ($tag_data == -1) { //needs conversion to note + if ($str_face_title == "") { + message::error(t("Please select a Tag or specify a Title.")); + url::redirect($redir_uri); + return; + } + //Save note + $newnote = ORM::factory("items_note"); + $newnote->item_id = $item_data; + $newnote->x1 = $str_x1; + $newnote->y1 = $str_y1; + $newnote->x2 = $str_x2; + $newnote->y2 = $str_y2; + $newnote->title = $str_face_title; + $newnote->description = $str_face_description; + $newnote->save(); + $updatedAnnotation->delete(); + } else { //stays a face + $updatedAnnotation->tag_id = $tag_data; + $updatedAnnotation->item_id = $item_data; + $updatedAnnotation->x1 = $str_x1; + $updatedAnnotation->y1 = $str_y1; + $updatedAnnotation->x2 = $str_x2; + $updatedAnnotation->y2 = $str_y2; + $updatedAnnotation->description = $str_face_description; + $updatedAnnotation->save(); + } + } else { //this is a note + $updatedAnnotation = ORM::factory("items_note") + ->where("id", "=", $noteid) + ->find(); + if ($tag_data == -1) { //stays a note + if ($str_face_title == "") { + message::error(t("Please select a Tag or specify a Title.")); + url::redirect($redir_uri); + return; + } + $updatedAnnotation->item_id = $item_data; + $updatedAnnotation->x1 = $str_x1; + $updatedAnnotation->y1 = $str_y1; + $updatedAnnotation->x2 = $str_x2; + $updatedAnnotation->y2 = $str_y2; + $updatedAnnotation->title = $str_face_title; + $updatedAnnotation->description = $str_face_description; + $updatedAnnotation->save(); + } else { //needs conversion to a face + $newface = ORM::factory("items_face"); + $newface->tag_id = $tag_data; + $newface->item_id = $item_data; + $newface->x1 = $str_x1; + $newface->y1 = $str_y1; + $newface->x2 = $str_x2; + $newface->y2 = $str_y2; + $newface->description = $str_face_description; + $newface->save(); + $updatedAnnotation->delete(); + } + } } message::success(t("Annotation saved.")); url::redirect($redir_uri); diff --git a/modules/photoannotation/css/photoannotation.css b/modules/photoannotation/css/photoannotation.css index eb63b714..e578e0d9 100644 --- a/modules/photoannotation/css/photoannotation.css +++ b/modules/photoannotation/css/photoannotation.css @@ -180,3 +180,7 @@ background-image: url('../images/delete.png'); cursor: pointer; } +.photoannotation-edit-button { + background-image: url('../images/edit.png'); + cursor: pointer; +} diff --git a/modules/photoannotation/helpers/photoannotation_theme.php b/modules/photoannotation/helpers/photoannotation_theme.php index 88ac00f4..e1374aa9 100644 --- a/modules/photoannotation/helpers/photoannotation_theme.php +++ b/modules/photoannotation/helpers/photoannotation_theme.php @@ -22,7 +22,7 @@ class photoannotation_theme_Core { // If it does, add an image map to the page to display them. $theme->css("photoannotation.css"); $theme->script("jquery.annotate.js"); - //Return ""; + //Return ""; } static function photo_bottom($theme) { diff --git a/modules/photoannotation/images/edit.png b/modules/photoannotation/images/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..6dbcb679f4d769ac2b2c818a361ac576a5f5d99d GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1SGfcUswyI7>k44ofy`glX(f`a29w(7Bet# z3xhBt!>laaucO?Ral001;Lp09co#e=Mz=4DL>?Qx-On*zO z1iEy?u6gsH%`BAck(w}N;j}YfMT@`OXLvO6c%1ctb>`*fn;DrMLS0oh9JjqTTh*9* zjfKMdu18P1rlxRBaLJo1el=y)Jx6(`KRS!mC%w&4+3zzU3}_pJr>mdKI;Vst04gg) A)&Kwi literal 0 HcmV?d00001 diff --git a/modules/photoannotation/js/jquery.annotate.js b/modules/photoannotation/js/jquery.annotate.js index 56660594..341ffd33 100644 --- a/modules/photoannotation/js/jquery.annotate.js +++ b/modules/photoannotation/js/jquery.annotate.js @@ -59,7 +59,7 @@ if (this.useAjax) { $.fn.annotateImage.ajaxLoad(this); } else { - $.fn.annotateImage.load(this, this.labels, this.editable, this.csrf, this.deleteUrl, this.currentUrl); + $.fn.annotateImage.load(this, this.labels, this.editable, this.csrf, this.deleteUrl, this.currentUrl, this.tags, this.saveUrl); } // Add the "Add a note" button @@ -111,13 +111,13 @@ }); }; - $.fn.annotateImage.load = function(image, labels, editable, csrf, deleteUrl, currentUrl) { + $.fn.annotateImage.load = function(image, labels, editable, csrf, deleteUrl, currentUrl, tags, saveUrl) { /// /// Loads the annotations from the notes property passed in on the /// options object. /// for (var i = 0; i < image.notes.length; i++) { - image.notes[image.notes[i]] = new $.fn.annotateView(image, image.notes[i], labels, editable, csrf, deleteUrl, currentUrl); + image.notes[image.notes[i]] = new $.fn.annotateView(image, image.notes[i], tags, labels, editable, csrf, deleteUrl, currentUrl, saveUrl); } }; @@ -203,12 +203,14 @@ this.note = note; } else { var newNote = new Object(); - newNote.id = "new"; + newNote.noteid = "new"; newNote.top = 30; newNote.left = 30; newNote.width = 30; newNote.height = 30; newNote.text = ""; + newNote.description = ""; + newNote.notetype = ""; this.note = newNote; } @@ -225,17 +227,30 @@ image.canvas.children('.image-annotate-edit').show(); // Add the note (which we'll load with the form afterwards) - var tagdropdown = labels[0] + ''; if (tags) { for (var tag in tags) { var tagval = tags[tag]; - tagdropdown += ''; + selectedtag = ""; + if (tagval.name == this.note.text && this.note.notetype == "face") { + selectedtag = " selected=\"selected\""; + } + tagdropdown += ''; } } tagdropdown += ''; - var form = $('
' + tagdropdown + labels[1] + '' + labels[2] + '
'); + var notetitle = ""; + if (this.note.notetype == "note") { + notetitle = this.note.text; + } + var form = $('
' + tagdropdown + labels[1] + '' + labels[2] + '
'); this.form = form; $('body').append(this.form); @@ -280,7 +295,7 @@ this.form.remove(); } - $.fn.annotateView = function(image, note, labels, editable, csrf, deleteUrl, currentUrl) { + $.fn.annotateView = function(image, note, tags, labels, editable, csrf, deleteUrl, currentUrl, saveUrl) { /// /// Defines a annotation area. /// @@ -294,7 +309,9 @@ if (editable) { this.delarea = $('
'); + this.editarea = $('
'); image.canvas.children('.image-annotate-view').prepend(this.delarea); + image.canvas.children('.image-annotate-view').prepend(this.editarea); this.delarea.bind('click',function () { if (confirm(labels[3])) { var alink = $(".g-fullsize-link"); @@ -305,11 +322,24 @@ delform.submit(); } }) + var form = this; + this.editarea.bind('click',function () { + var alink = $(".g-fullsize-link"); + alink.unbind(); + alink.attr ('href', '#'); + alink.removeAttr ('rel'); + form.edit(tags, labels, saveUrl, currentUrl, csrf); + }) this.delarea.hide(); + this.editarea.hide(); } // Add the note - this.form = $('
' + note.text + '
'); + var notedescription = ""; + if (note.description != "") { + notedescription = "
" + note.description; + } + this.form = $('
' + note.text + notedescription + '
'); this.form.hide(); image.canvas.children('.image-annotate-view').append(this.form); this.form.children('span.actions').hide(); @@ -323,19 +353,30 @@ annotation.show(); if (annotation.delarea != undefined) { annotation.delarea.show(); + annotation.editarea.show(); } }, function() { annotation.hide(); if (annotation.delarea != undefined) { annotation.delarea.hide(); + annotation.editarea.hide(); } }); if (editable) { this.delarea.hover(function() { annotation.delarea.show(); + annotation.editarea.show(); }, function() { annotation.delarea.hide(); + annotation.editarea.hide(); + }); + this.editarea.hover(function() { + annotation.delarea.show(); + annotation.editarea.show(); + }, function() { + annotation.delarea.hide(); + annotation.editarea.hide(); }); } // Edit a note feature @@ -348,9 +389,6 @@ window.location = note.url; }) } - - - }; $.fn.annotateView.prototype.setPosition = function() { @@ -369,6 +407,10 @@ this.delarea.children('div').width('14px'); this.delarea.css('left', (this.note.left + parseInt(this.note.width)) + 'px'); this.delarea.css('top', (this.note.top) + 'px'); + this.editarea.children('div').height('14px'); + this.editarea.children('div').width('14px'); + this.editarea.css('left', (this.note.left + parseInt(this.note.width)) + 'px'); + this.editarea.css('top', (this.note.top + 16) + 'px'); } }; @@ -401,7 +443,7 @@ this.form.remove(); } - $.fn.annotateView.prototype.edit = function() { + $.fn.annotateView.prototype.edit = function(tags, labels, saveUrl, currentUrl, csrf) { /// /// Edits the annotation. /// @@ -410,31 +452,8 @@ var annotation = this; // Create/prepare the editable note elements - var editable = new $.fn.annotateEdit(this.image, this.note); - + var editable = new $.fn.annotateEdit(this.image, this.note, tags, labels, saveUrl, currentUrl, csrf); $.fn.annotateImage.createSaveButton(editable, this.image, annotation); - - // Add the delete button - var del = $('Delete'); - del.click(function() { - var form = $('#image-annotate-edit-form form'); - - $.fn.annotateImage.appendPosition(form, editable) - - if (annotation.image.useAjax) { - $.ajax({ - url: annotation.image.deleteUrl, - data: form.serialize(), - error: function(e) { alert("An error occured deleting that note.") } - }); - } - - annotation.image.mode = 'view'; - editable.destroy(); - annotation.destroy(); - }); - editable.form.append(del); - $.fn.annotateImage.createCancelButton(editable, this.image); } }; diff --git a/modules/photoannotation/views/photoannotation_highlight_block.html.php b/modules/photoannotation/views/photoannotation_highlight_block.html.php index 78fd9abc..83d4011d 100644 --- a/modules/photoannotation/views/photoannotation_highlight_block.html.php +++ b/modules/photoannotation/views/photoannotation_highlight_block.html.php @@ -17,10 +17,6 @@ $jscode = "notes: [ "; foreach ($existingFaces as $oneFace) { $oneTag = ORM::factory("tag", $oneFace->tag_id); - $tagdesc = ""; - if ($oneFace->description) { - $tagdesc = "
". html::clean($oneFace->description); - } if (module::get_var("photoannotation", "showfaces", false)) { $legend_faces .= "url() ."\">". html::clean($oneTag->name) .", "; } @@ -28,7 +24,8 @@ $jscode .= "\"left\": ". $oneFace->x1 .",\n"; $jscode .= "\"width\": ". ($oneFace->x2 - $oneFace->x1) .",\n"; $jscode .= "\"height\": ". ($oneFace->y2 - $oneFace->y1) .",\n"; - $jscode .= "\"text\": \"". html::clean($oneTag->name) . $tagdesc ."\",\n"; + $jscode .= "\"text\": \"". html::clean($oneTag->name) ."\",\n"; + $jscode .= "\"description\": \"". html::clean($oneFace->description) ."\",\n"; $jscode .= "\"noteid\": ". $oneFace->id .",\n"; $jscode .= "\"notetype\": \"face\",\n"; $jscode .= "\"editable\": true,\n"; @@ -39,10 +36,6 @@ $legend_faces = t("Faces on this photo: ") . $legend_faces; } foreach ($existingNotes as $oneNote) { - $tagdesc = ""; - if ($oneNote->description) { - $tagdesc = "
". html::clean($oneNote->description); - } if (module::get_var("photoannotation", "shownotes", false)) { $legend_notes .= html::clean($oneNote->title) .", "; } @@ -50,7 +43,8 @@ $jscode .= "\"left\": ". $oneNote->x1 .",\n"; $jscode .= "\"width\": ". ($oneNote->x2 - $oneNote->x1) .",\n"; $jscode .= "\"height\": ". ($oneNote->y2 - $oneNote->y1) .",\n"; - $jscode .= "\"text\": \"". html::clean($oneNote->title) . $tagdesc ."\",\n"; + $jscode .= "\"text\": \"". html::clean($oneNote->title) ."\",\n"; + $jscode .= "\"description\": \"". html::clean($oneNote->description) ."\",\n"; $jscode .= "\"noteid\": ". $oneNote->id .",\n"; $jscode .= "\"notetype\": \"note\",\n"; $jscode .= "\"editable\": false,\n"; @@ -105,4 +99,4 @@ ". $legend_display ."
" ?> - \ No newline at end of file + From 6dfd62d01212a1697cc327cf06ee9de5c38be153 Mon Sep 17 00:00:00 2001 From: hukoeth Date: Sun, 29 Aug 2010 01:47:15 +0200 Subject: [PATCH 5/8] Made module compatible with greydragon theme, fixed clicking cancel when editing annotations --- modules/photoannotation/js/jquery.annotate.js | 16 +++++++++------- .../photoannotation_highlight_block.html.php | 10 +++++++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/modules/photoannotation/js/jquery.annotate.js b/modules/photoannotation/js/jquery.annotate.js index 341ffd33..30e8f8ae 100644 --- a/modules/photoannotation/js/jquery.annotate.js +++ b/modules/photoannotation/js/jquery.annotate.js @@ -24,6 +24,7 @@ this.notes = opts.notes; this.labels = opts.labels; this.csrf = opts.csrf; + this.cssaclass = opts.cssaclass; // Add the canvas this.canvas = $('
'); @@ -59,7 +60,7 @@ if (this.useAjax) { $.fn.annotateImage.ajaxLoad(this); } else { - $.fn.annotateImage.load(this, this.labels, this.editable, this.csrf, this.deleteUrl, this.currentUrl, this.tags, this.saveUrl); + $.fn.annotateImage.load(this, this.labels, this.editable, this.csrf, this.deleteUrl, this.currentUrl, this.tags, this.saveUrl, this.cssaclass); } // Add the "Add a note" button @@ -111,13 +112,13 @@ }); }; - $.fn.annotateImage.load = function(image, labels, editable, csrf, deleteUrl, currentUrl, tags, saveUrl) { + $.fn.annotateImage.load = function(image, labels, editable, csrf, deleteUrl, currentUrl, tags, saveUrl, cssaclass) { /// /// Loads the annotations from the notes property passed in on the /// options object. /// for (var i = 0; i < image.notes.length; i++) { - image.notes[image.notes[i]] = new $.fn.annotateView(image, image.notes[i], tags, labels, editable, csrf, deleteUrl, currentUrl, saveUrl); + image.notes[image.notes[i]] = new $.fn.annotateView(image, image.notes[i], tags, labels, editable, csrf, deleteUrl, currentUrl, saveUrl, cssaclass); } }; @@ -172,6 +173,7 @@ cancel.click(function() { editable.destroy(); image.mode = 'view'; + location.reload(); }); editable.form.append(cancel); }; @@ -295,7 +297,7 @@ this.form.remove(); } - $.fn.annotateView = function(image, note, tags, labels, editable, csrf, deleteUrl, currentUrl, saveUrl) { + $.fn.annotateView = function(image, note, tags, labels, editable, csrf, deleteUrl, currentUrl, saveUrl, cssaclass) { /// /// Defines a annotation area. /// @@ -314,7 +316,7 @@ image.canvas.children('.image-annotate-view').prepend(this.editarea); this.delarea.bind('click',function () { if (confirm(labels[3])) { - var alink = $(".g-fullsize-link"); + var alink = $(cssaclass); alink.unbind(); alink.attr ('href', '#'); alink.removeAttr ('rel'); @@ -324,7 +326,7 @@ }) var form = this; this.editarea.bind('click',function () { - var alink = $(".g-fullsize-link"); + var alink = $(cssaclass); alink.unbind(); alink.attr ('href', '#'); alink.removeAttr ('rel'); @@ -382,7 +384,7 @@ // Edit a note feature if (note.url != "" && note.url != null) { this.area.bind('click',function () { - var alink = $(".g-fullsize-link"); + var alink = $(cssaclass); alink.unbind(); alink.attr ('href', '#'); alink.removeAttr ('rel'); diff --git a/modules/photoannotation/views/photoannotation_highlight_block.html.php b/modules/photoannotation/views/photoannotation_highlight_block.html.php index 83d4011d..efde70c9 100644 --- a/modules/photoannotation/views/photoannotation_highlight_block.html.php +++ b/modules/photoannotation/views/photoannotation_highlight_block.html.php @@ -11,6 +11,13 @@ $jscode = ""; $legend_faces = ""; $legend_notes = ""; + if (module::get_var("gallery", "active_site_theme") == "greydragon") { + $css_item_id = "#g-photo-id-". $item->id; + $css_a_class = ".g-sb-preview"; + } else { + $css_item_id = "#g-item-id-". $item->id; + $css_a_class = ".g-fullsize-link"; + } // If it does, then insert some javascript and display an image map // to show where the faces are at. if ((count($existingFaces) > 0) || (count($existingNotes) > 0)) { @@ -80,7 +87,7 @@ + +
+
+
-
+ +
+
+ +
+
+ +
+
diff --git a/themes/greydragon/changelog.txt b/themes/greydragon/changelog.txt index f6750d23..3d5a1451 100644 --- a/themes/greydragon/changelog.txt +++ b/themes/greydragon/changelog.txt @@ -1,46 +1,239 @@ -Grey Dragon Theme Changelog - -version 1.5.8 -- Finally admin module for theme is there. After theme installation, visit Appearance/Theme Options to configure the theme. - If you had older version of the theme, initial setup is also required. - The following settings are available: - - Rows per album page - theme uses 3 columns layout for pictures, therefore default page_size is computed in x3 increments - - Thumb size is restricted to 200 and therefore not available for administration - - Mark to build resizes/thumbs - allows force rebuilding of images - - Show/Hide top/bottom photo navigators - - Specify allowed and default sidebar position - - Administrator can now specify Copyright message to display in the footer - - Site logo is now default to Gallery 3 logo, but admin can provide a path to custom logo. -- Sidebar session cookie is set to expire in 365 days - -version 1.5.7 -- Status message has been moved into header as popup to prevent obstruction of the main view. - jQuery is used to fade it out in 10 sec. -- Improved logic for dialogs on submit -- Theme related JS has been moved out of the page.html.php - -version 1.5.6 -- Fixed issue with tollbar buttons not properly aligned/shown when page is resized. -- Copyright info moved into DB. To change default settings add [th_greydragon/copyright] into VARS table. - -version 1.5.5 -- CSS fixes. -- Theme adjusted to be compatible with latest Git. -- Login links are moved into footer. -- Pagination module redesigned to support new structure of paging data. - -version 1.5.4 -- CSS fixes. -- Added support for Comments block. -- Improved support for Modal dialogs. - -version 1.5.3 -- Sync to git. -- Exif menu customization is now part of the theme. -- Sidebar management button is disabled for current mode. - -version 1.5.2 -- Code, layout, css cleanup. -- New thumbs for buttons. -- First set of Ajax dialogs is ready and now operational: Login, user info, edit album, exit info. +=== Grey Dragon Theme === +Grey Dragon Theme - a custom theme for Gallery 3 + +This theme was designed and built by Serguei Dosyukov, whose blog you will find at http://blog.dragonsoft.us/ +Copyright (C) 2009-2010 Serguei Dosyukov + +Tested up to: G3 3.0 RC2 (Santa Fe) Experimental +Minimum requirement: G3 3.0 RC2 (Santa Fe) Experimental +Donate link: http://blog.dragonsoft.us/gallery-3/ + +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. + +=== Open issues === +- Issue with Delete functionality +- Support for new organize module +- Support for Register module +- Issue with Comments module + +=== Changelog === + +version 2.3.1 +- Hide Rotate operations for pictures since they are not supported by the theme +- Added use of common gallery.ajax.js. Fix issue with some Ajax based links. +- Layout fixes for Translation form overlay +- Changed CSS styling for buttons to provide unified coverage for buttons and links exposed as buttons. +- ADMIN: Fixed options group styles in Theme's Admin panel +- ADMIN: Advanced Settings for Thumbs and Individual Photo are moved into separate sections. +- ADMIN: New option - display meta data in Photo description section +- ADMIN: New option/fix - SEO indexing is now allowed by default. In order to prevent your site from being indexed, you can now use "Disallow Search Engine Indexing" option + +version 2.3.0 +- Adopted for Gallery 3.0RC2 changes (minor template adjustments, css class name changes, etc.) + +version 2.2.1 +- Redesigned Ready event handler for the theme to ensure proper ShadowBox initialization +- Added support for gallery_dialog() function call used by some 3rd party modules - some sync issues are solved by imposed delay of 1 second +- GPS module - better action list alignment in the sidebar + +version 2.2.0 +- Added support for slideshow mode in Photo Preview +- Fixed issue with Info side block - missing markup +- Fixed issue with Upload dialog layout with some resolutions/fonts +- ADMIN: Added option to hide breadcrumbs +- ADMIN: Added prerequisite check for Info module - required for Thumb meta data display + +version 2.1.7 +- Added support for missing images in the thumbs to allow proper operations with empty albums or albums with broken thumbs +- Some color optimizations +- Color improvements for "Add Image" dialog +- Better support for Basket module + +version 2.1.6 +- Wind colorpack adjusted to closer match default Wind theme + +version 2.1.5 +- Minor changes in ADMIN infrastructure +- ADMIN: added check for Kbd Navigation module +- ADMIN: New color pack - carbon + +version 2.1.4 +- Minor refactoring in paginator +- Added support for keyboard navigation module (http://codex.gallery2.org/Gallery3:Modules:kbd_nav) + +version 2.1.3 +- Sidebar restricted to item related pages (album, photo, movie, etc) +- Fixed issue with bottom border not applied to all instances of H1 tag +- Min footer size set to 4em +- ADMIN: "Photo: Description Display Mode" option added +- ADMIN: Added new maintenance operation - "Reset Exif Info" + +version 2.1.2 +- Fixed issue with Album thumbs - empty space under +- Thumb Item's Title Display Mode expanded to be applied to Item's description in Photo page +- More documentations in CSS files, some movements +- Some cleanup for Wind color pack +- Fixed font name typo in screen.css +- Fixed "Waiting" roller for Wind theme to match background +- Added "up" button in navigation + +version 2.1.1 +- Increased size of Add photo dialog for better display on some lower resolutions. +- ADMIN: New option: "Thumb: Item's Title Display Mode" - specifies how to display item's title in thumbs : Overlay Bottom Hide + +version 2.1.0 +- Custom Info Block to include item's description +- Image is centered when "Actual Size" aspect is used for thumbs +- Added support for color packs - included: greydragon, wind +- ADMIN: Improved error handling +- ADMIN: Disable submit button on click to prevent Dbl-click +- ADMIN: New option: Enable page cache - adds header marker for page to be cached for 60 seconds + +version 2.0.1 +- Enable BBCode/HTML support in individual photo descriptions +- Fixed main menu overlay issue when in top position +- Theme's credits moved into dedicated method +- CSS clean up +- Comments module layout enhancements + +version 2.0.0 +- Major redesign of the gallery flow. + - Added caption and metadata (Admin/optional) overlay for thumbs. + - Added description overlay in individual Photo view (look for "Learn More" marker). + - Based on Admin setting, thumbs are adjusted to fit Digital/Film/Actual size. +- Attempt to fix issue with JS load latency to prevent unhandled AJAX calls +- Added code protection for theme initialization procedure +- ADMIN: Thumb Aspect Ratio option. See help section for more info. + +version 1.8.2 +- Increased based font size +- Layout adjusted to match new settings +- ADMIN: New option - Place Login Link in the Header + +version 1.8.1 +- ADMIN: small adjustments in layout and help info +- 3rd party module's related CSS moved into contrib.css +- Adjust user profile screen to match new layout +- initial design for calendar module + +version 1.8.0 +- ADMIN: Major redesign of the layout. Help section added. +- ADMIN: New option - Show main menu for guest user +- Minimum required Gallery version set to 30 +- When configured not to use sidebar, theme is switched into 4 columns layout + +version 1.7.6 +- Organize module: CSS improvements +- Fixed issue with Chrome browser + +version 1.7.5 +- ADMIN: Added option to reset theme to default state +- CSS: some size adjustments for dialogs. Added minimum height for overlay to keep dialogs from shrinking. + +version 1.7.4 +- ADMIN: Theme Gallery 3 core requirement changed to v.26 +- ADMIN: Most of theme's settings are documented using element's title attribute - hover over to see a description +- Edit Permissions form redesigned and enlarged to fit more information + +version 1.7.3 +- ADMIN: Default states for the theme options are no longer being stored. Please save theme settings at least once to take advantage of a new functionality. +- Photo Navigator default position is set to Top Only + +version 1.7.2 +- Fix in Uploader dialog to keep items inside respected boxes +- Organize module support has been abandoned. Please use GWT Organize module instead. Added item in Prerequisites Checklist. + +version 1.7.1 +- CSS: Fixed visibility of the "Select Photo" button in "Add photo" dialog +- CSS: Fixed "ghost" line for navigation buttons when zoomed-in in IE +- Admin: fixed issue with prerequisite check not detecting deleted modules +- /views/support folder deprecated. Logic moved into Theme_View extension class for Theme_View_Core +- Theme Options Page management, generic Page code and BBCode processor moved into Theme_View class +- HACK: Info block is not displayed if there is no description for the item + +version 1.6.4 +- Admin: Added "Show Sidebar for Albums only" option +- Admin: added error visibility to the requirements validation list +- Small CSS adjustments: Fixed footer min size issue when no site credit info is displayed; added space between Credits in the footer and Footer text area. +- Few missing parts from last git sync + +version 1.6.3 +- Kohana 2.4 support +- Support for Movie files view +- Admin: Allow hide Sidebar Block header + +version 1.6.2 +- Admin: Page navigator option changed to use combobox +- Admin: Added option to hide item description in albums + +version 1.6.2 +- Small CSS adjustments. +- All operation dialogs should be visible now +- Context menu: "Rotate 90..." items are removed due to an issue with image quality affected by the operation +- Context menu: "Choose as the album cover" is now properly handled + +version 1.6.1 +- Admin: When allowed sidebar position is "Default Only", don't disregard selected Default position +- Adjust item's toolbar buttons to align properly when side bar position is fixed +- BBCode parser improved to support stripping of BBCode for Page title and breadcrumbs +- Fixed issue with main menu missing class declaration not allowing open dialogs +- Adjust context dialogs to properly show caption info +- Caption added to Full size Preview +- "New Comment" form styled +- Admin: Option to align main menu to the top and Breadcrumbs to the left + +version 1.6.0 +- Admin: Fixed issue with "Rebuild thumbs" option in theme admin +- Admin: Fixed issue with Item's toolbar not properly aligned in Quirks Mode +- Exif data dialog Layout changes +- Item context menu improvements: + - Fixed issue with submit logic + - Layout fixes for context menu dialogs + +version 1.5.8 +- Admin: First release of the Theme admin option. After theme installation, visit Appearance/Theme + Options to configure the theme. If you had older version of the theme, initial setup is also required. + The following settings are available: + - Rows per album page - theme uses 3 columns layout for pictures, therefore default page_size is computed in x3 increments + - Thumb size is restricted to 200 and therefore not available for administration + - Mark to build resizes/thumbs - allows force rebuilding of images + - Show/Hide top/bottom photo navigators + - Specify allowed and default sidebar position + - Administrator can now specify Copyright message to display in the footer + - Site logo is now default to Gallery 3 logo, but admin can provide a path to custom logo. + - Admin module validates Theme's requirements (Shadowbox module need to be installed/active) +- Sidebar session cookie is set to expire in 365 days + +version 1.5.7 +- Status message has been moved into header as popup to prevent obstruction of the main view. + jQuery is used to fade it out in 10 sec. +- Improved logic for dialogs on submit +- Theme related JS has been moved out of the page.html.php + +version 1.5.6 +- Fixed issue with tollbar buttons not properly aligned/shown when page is resized. +- Copyright info moved into DB. To change default settings add [th_greydragon/copyright] into VARS table. + +version 1.5.5 +- CSS fixes. +- Theme adjusted to be compatible with latest Git. +- Login links are moved into footer. +- Pagination module redesigned to support new structure of paging data. + +version 1.5.4 +- CSS fixes. +- Added support for Comments block. +- Improved support for Modal dialogs. + +version 1.5.3 +- Updated to match latest git. +- Exif menu customization is now part of the theme. +- Sidebar management button is disabled for current mode. + +version 1.5.2 +- Code, layout, css cleanup. +- New thumbs for buttons. +- First set of Ajax dialogs is ready and now operational: Login, user info, edit album, exit info. - Fixed some browser related issues. \ No newline at end of file diff --git a/themes/greydragon/controllers/greydragon.php b/themes/greydragon/controllers/greydragon.php new file mode 100644 index 00000000..0796d801 --- /dev/null +++ b/themes/greydragon/controllers/greydragon.php @@ -0,0 +1,39 @@ +page_title = t("%name Profile", array("name" => $user->display_name())); + $v->content = new View("user_profile.html"); + + $v->content->user = $user; + $v->content->contactable = + !$user->guest && $user->id != identity::active_user()->id && $user->email; + $v->content->editable = + identity::is_writable() && !$user->guest && $user->id == identity::active_user()->id; + + $event_data = (object)array("user" => $user, "content" => array()); + module::event("show_user_profile", $event_data); + $v->content->info_parts = $event_data->content; + + print $v; + } +*/ +} diff --git a/themes/greydragon/css/colorpacks/carbon/colors.css b/themes/greydragon/css/colorpacks/carbon/colors.css new file mode 100644 index 00000000..57fd30dd --- /dev/null +++ b/themes/greydragon/css/colorpacks/carbon/colors.css @@ -0,0 +1,192 @@ +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * ColorPack: Carbon - Default color pack + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* styles.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +html { background-color: #333; } +body { color: #999; background-color: #333; } + +h1 { border-bottom: #6f6f6f 1px solid; } +a { color: #999 !important; font-weight: bold; } +.ui-icon { background-image: url(images/ui-icons.png); } + +/* styles.css - Header ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-header .g-message-block { border: 1px #888 solid; background-color: #AAA; color: #000; } +.g-breadcrumbs li { background: transparent url(images/ico-separator.png) no-repeat 0 0.2em; } + +/* styles.css - Content ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-main { background-color: #3f3f3f; margin-left: 10px; margin-right: 10px; } + +/* styles.css - Footer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +/* styles.css - Album Layout ~~~~~~~~~~~~~~~~~~~~~~~~~*/ +#g-info .g-description { border: #6f6f6f 1px solid; } + +.g-thumbslide, .g-thumbslide-ext { border: 1px solid #303E43; background-color: #555; } +.g-thumbcrop { border: 1px solid #303E43; } + +.g-album .g-thumbslide, +.g-album .g-thumbslide-ext { border-top: 1px solid #6f6f6f; border-left: 1px solid #6f6f6f; border-right: 4px double #6f6f6f; border-bottom: 4px double #6f6f6f; } +.g-photo .g-thumbslide, /* Need to compensate for double border in album's thumbs */ +.g-photo .g-thumbslide-ext { margin-bottom: 3px; } + +.g-thumbslide:hover .g-description { color: #fff; border-bottom: 1px solid #999; background: #1E1E1E; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } +.g-album .g-thumbslide:hover .g-description, +.g-album .g-thumbslide-ext .g-description { background: #555 url(images/ico-album.png) no-repeat 4px 2px; } + +.g-thumbslide:hover .g-metadata, +.g-thumbslide-ext:hover .g-metadata { border-top: 1px solid #999; background: #1E1E1E; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } + +/* styles.css - Photo Layout ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +div.g-resize { border: 1px solid #888; background: #555; } + +div.g-resize:hover .g-description { color: #fff; background: #1E1E1E; border-bottom: 1px solid #999; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } +div.g-resize .g-more { border: 1px solid #999; background: #1E1E1E; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } + +.g-movie { border: 1px solid #888; padding: 5px; background: #555; } + +/* styles.css - Reauthentificate ~~~~~~~~~~~~~~~~~~~~~*/ + +#g-reauthenticate-form ul { border: 1px #888 solid; } + +/* styles.css - Sidebar Blocks ~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-toolbar { border-bottom: 1px solid #737373; } + +/* styles.css - Sidebar Blocks : Common ~~~~~~~~~~~~~~*/ + +.g-block { border: 1px solid #737373; } +.g-block h2 { background: url(images/section.png) repeat-x; } + +/* styles.css - Sidebar Blocks : Buttons ~~~~~~~~~~~~~*/ + +#g-viewformat .g-viewthumb-left { background: url('images/view-left.png') no-repeat left top; } +#g-viewformat .g-viewthumb-right { background: url('images/view-right.png') no-repeat left top; } +#g-viewformat .g-viewthumb-full { background: url('images/view-full.png') no-repeat left top; } + +#g-slideshow-link { background: url("images/view-slideshow.png") top left no-repeat; } +.g-fullsize-link { background: url("images/view-fullsize.png") top left no-repeat; } +#g-exifdata-link { background: url("images/view-info.png") top left no-repeat; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* menus.css ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-site-menu ul { border: #000000 0 solid; } +#g-site-menu li a:hover { color: #000000; background-color: #333; } +#g-site-menu li:hover, +#g-site-menu li.iemhover { border: #303030 1px solid; background-color: #333; border-bottom: #000000 1px solid; } +#g-site-menu li ul { border: #000000 1px solid; } +#g-site-menu li ul li { border: #C0C0C0 0px solid; background-color: #333; } +#g-site-menu li ul li:hover, +#g-site-menu li ul li.iemhover { border: #C0C0C0 0 solid; background-color: #ddf2ff; } + +.g-item .g-context-menu { background-image: url(images/ui-icons.png); } +.g-item .g-context-menu:hover { background: #333 none; border: 1px #888 solid; } +.g-item .g-context-menu li li a:hover { background-color: #ddf2ff; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* forms.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-body { background: #101415 url('images/ajax-loading.gif') no-repeat center center; } +#sb-title { border-left: #303030 1px solid; border-right: #303030 1px solid; background-color: #333; } + +#sb-content.html_ajax p.g-error { color: red; } +#sb-content.html_ajax form { background-color: #101415; } +#sb-content.html_ajax>div { background-color: #101415; } + +/* forms.css - Permissions ~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-permissions .g-breadcrumbs { border: #303030 1px solid; } +#sb-content #g-edit-permissions-form { border: #303030 1px solid; } +#sb-content #g-move>ul { border: #303030 1px solid; } + +/* forms.css - Add item ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-add-photos-form .g-breadcrumbs { border: #303030 1px solid; } + +#g-add-photos-canvas { background-color: #101010; border: #303030 1px solid; } +#g-add-photos-button { border: #303030 1px solid; color: #bbb; } +#g-add-photos-status { background-color: #101010; border: #303030 1px solid; } + +#g-add-photos-status li.g-success { background: #d9efc2 url('images/ico-success.png') no-repeat .4em 50%; } +#g-add-photos-status li.g-error { background: #f6cbca url('images/ico-error.png') no-repeat .4em 50%; color: #f00; } + +/* forms.css - Organize ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content.html_ajax #g-organize { border: #303030 1px solid; } + +#g-organize-detail { border-left: #303030 1px solid; } +#g-organize .g-message-block { border-bottom: #303030 1px solid; } +.g-organize-microthumb-grid-cell { background-color: #303030; } +.g-organize-microthumb { background-color: #707070; } +#g-organize-controls { border-top: #303030 1px solid; } + +/* forms.css - User Profile ~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-user-profile .g-avatar { border: 1px solid #888; background: #555; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* menus.css ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-site-menu ul { border: #000000 0 solid; } +#g-site-menu li a:hover { color: #000000; background-color: #303030; } +#g-site-menu li:hover, +#g-site-menu li.iemhover { border: #303030 1px solid; background-color: #303030; border-bottom: #000000 1px solid; } +#g-site-menu li ul { border: #000000 1px solid; } +#g-site-menu li ul li { border: #C0C0C0 0px solid; background-color: #212121; } +#g-site-menu li ul li:hover, +#g-site-menu li ul li.iemhover { border: #C0C0C0 0 solid; background-color: #303030; } + +.g-item .g-context-menu { background-image: url(images/ui-icons.png); } +.g-item .g-context-menu:hover { background: #181818 none; border: 1px #888 solid; } +.g-item .g-context-menu li li a:hover { background-color: #303030; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* modules.css - Exif ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-exif-data table { border: #303030 1px solid; } +#sb-content #g-exif-data .g-even { background-color: #404040; } +#sb-content #g-exif-data .g-odd { background-color: #303030; } + +/* modules.css - Info module ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-metadata .g-description { border-top: 1px solid #737373; } + +/* modules.css - Image block ~~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-image-block img { border: 1px solid #888; background: #555; } + +/* modules.css - Comments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-comments .g-author { border-bottom: 1px solid #202628; color: #999; } +#g-comments-link { background-image: url(images/view-comments.png); } +#g-comment-detail>ul>li { border: 1px dotted #737373; } +#g-comment-form { border: 1px dotted #737373; } + +/* modules.css - Calendar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-view-menu #g-calendarview-link { background-image: url(images/view-calendar.png); } +#g-view-calendar-form ul { border: 1px #888 solid; } +table.calendar { border: #a2adbc 1px solid; color: #616b76; } +table.calendar th { border-bottom: #a2adbc 1px solid; border-right: #a2adbc 1px solid; background: #d9e2e1; color: #616b76; } +table.calendar td { border-bottom: #a2adbc 1px solid; border-right: #a2adbc 1px solid; } +table.calendar td.title { background-color: #a2adbc; color: #fff; } +table.calendar td.title a { color: #fff !important; } +table.calendar td a { color: red !important; } + +/* modules.css - Search ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-quick-search-form input[type="text"] { background-color: transparent; border: 1px solid #737373; color: #BBB; } +#g-quick-search-form input[type="submit"] { background: transparent url(images/search.png) no-repeat center top; border: none; } + +/* modules.css - Basket ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#checkout legend { background: url(images/section.png) repeat-x; } \ No newline at end of file diff --git a/themes/greydragon/images/ajax-loading.gif b/themes/greydragon/css/colorpacks/carbon/images/ajax-loading.gif similarity index 100% rename from themes/greydragon/images/ajax-loading.gif rename to themes/greydragon/css/colorpacks/carbon/images/ajax-loading.gif diff --git a/themes/greydragon/css/colorpacks/carbon/images/ico-album.png b/themes/greydragon/css/colorpacks/carbon/images/ico-album.png new file mode 100644 index 0000000000000000000000000000000000000000..ac87ec4fbf6acb75ac29259e60d8a9a0992cbef0 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0w6XA3y|d6q_!SNv7|ftIx;Y9?C1WI$O`0h7I;J! zGca%qfiUBxyLEqng6t)pzOL*yIe{8wlsqH7fI^Zbt`Q}{`DrEPiAAXl0g0J;C3=3Y zAqr*2dZv0NcD-lHfQn9fx;TbNTrR!1-|KLKgxkmXN8((Zi^|H1i>6eu&)uW=Q7Xo| zWA@_khq6m{?A&S5q0ljHmVJDXY*3-+{iizZ%>4OGF?VN4?l$6ilYV{ip{4eW-1%{9 zO{?~1yo%H3`FQqaZ~0E+&MR(NFD2)0(BAi9lW5tI?4t@LFH{yC^V06BatS`-c;k4x z{FSJ!JUb`XKRnT>-|4e-lIDjWwbO$+1*^G^tA%OxMsf5QL( literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/ico-error.png b/themes/greydragon/css/colorpacks/carbon/images/ico-error.png new file mode 100644 index 0000000000000000000000000000000000000000..c37bd062e60c3b38fc82e4d1f236a8ac2fae9d8c GIT binary patch literal 701 zcmV;u0z&N#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI literal 0 HcmV?d00001 diff --git a/themes/greydragon/images/ico-separator.png b/themes/greydragon/css/colorpacks/carbon/images/ico-separator.png similarity index 100% rename from themes/greydragon/images/ico-separator.png rename to themes/greydragon/css/colorpacks/carbon/images/ico-separator.png diff --git a/themes/greydragon/css/colorpacks/carbon/images/ico-success.png b/themes/greydragon/css/colorpacks/carbon/images/ico-success.png new file mode 100644 index 0000000000000000000000000000000000000000..a9925a06ab02db30c1e7ead9c701c15bc63145cb GIT binary patch literal 537 zcmV+!0_OdRP)Hs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1p004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000id000id0mpBsWB>pF8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;K%k z%ys|(0m?~4K~y+Tz12-i0znuD@IBO5QheEUch$Ul5JYNkUeu%nsY5STrsXZH%sPk~ zimiH4@S+F(3|0u`C-5MiJ^XVXFtD^Xlm>=*XN{J1p>GdwyygQ}{i zR;$S8^T_3L6xV7sTqF_;(YfGmcn_sg3B_U&UauE+yB(4w!Q=5DnM|V5XyEYpcrH2@ zyt=+YrBWeGuh&!8>2xp{3~)M~G?7{^YX>u#46@lQ91aJ}W;1x6hsk83*l08&olc|I z>tQDp`i9QUuuv$_k{QUB%0NL7=*qI}bUI)y8jEQITdfvGqY+gN14U7UEXx$TTrLcU zLjryNfHv?+Ez^K*w+ls42xOSs?WVnD?d|4hCtkFAzY#->1nKdNg^z zl3JdkH>uQWK%d`_%P(d4>yrO^L=tG?Eh{@2ZDlPT6>VJ=9X(ZDeN{aJH9bQ$eIs=PV@r3Rkmy~xKrNCbt`Q}{ z`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Ye$Op_0u{-7x;Tb#Tu-(*@TIYnk;A?rGeoFk jrsWKY8I7Mj5||kR?70MU=8OLTDrN9=^>bP0l+XkKClfE| literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/ui-icons.png b/themes/greydragon/css/colorpacks/carbon/images/ui-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..7d1723bf552fcc1f15a617b2246558416c012cba GIT binary patch literal 9312 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 M%34a5iq_%(2bpt6pa1{> literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/view-calendar.png b/themes/greydragon/css/colorpacks/carbon/images/view-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..5442fa51321e3a2a4f0d2ce50fa651316b729fc6 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%0VEiBdp33fDVB6cUq=Rpjs4tz5?O(Krjj7P zUE~zhw+=#aM-TBZ>d2^i z96H{8s@uD9!I~`)N;AFTzp-I`lJtPuXWe0 zc6zRUUguqgqtHInx3~UCbLZz-Y)&j`m zEbxddW?0j z`Mwlz`*|=mo;l+q@?OK4ah8EhL`srqTcw;k$0X4WY6}`n9YxI?S=MkaY%pCIeqdW7 s_l<35%tYR^I6Fp5e`{dvo(%LzPTB5*?IE4FfqrE0boFyt=akR{0KG?&;s5{u literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/view-full.png b/themes/greydragon/css/colorpacks/carbon/images/view-full.png new file mode 100644 index 0000000000000000000000000000000000000000..7145fd9d49d9231cfac264af85e5664f82fbcf67 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^fNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!uqB*-tAfuU^jSqmVK zv%n*=n1O-s5C}7hYIrpO1tm*dBT9nv(@M${i&7Z^5;OBk^!!{y6v~YCO!Z9cde4*r z6*YOfIEHAPPu59vV1J>cs^f5IdUNK|_x<_qjx!n?IW-QQIC0{@p%W~}1O(LG_M_NP&)JlnCE#pg!>q>BGHyKkjSU6FrT)tJy!>mw z&$QWK-Gu}dB@?yH#_Ee_A9h)!@9@m$Ns^DFX}i=yMur{toz;c;MYjW8!{F)a=d#Wz Gp$Py1x@KVj literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/view-fullsize.png b/themes/greydragon/css/colorpacks/carbon/images/view-fullsize.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd042373ea4517a820093cd18f823a9a20a8c03 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%0VEiBdp33fDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(GY3GxeOU?`h>)&j`m zEbxddW?8eR=RLCF%=h?3y^w370~qEv=}#LT=BJwMkFg)(D3Q#}*A-ZN!D zMKe5I978nDCuG$;zFqT6?njH=WvBz2Fdc^lpJgvANs}4mnJ) zNEehi004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000ib000ib0l1NC?EnA(8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;K%k z%ys|(0c%i9R7C&)02mk;PEJlFBqSOd8XzDbR8&+_Qc@-+CQ(sQWo2bpSXg9aWEmM5 zDk>^0EG#fEFf}zbH#avqIXOByIz2r-KR-V}KtMr3K|@1BL_|bKM@L9VNJ>gdOiWBq zPft`-R9aeEUS3{bUteToWMyS#XJ=<YbpP-Cc> zsi~{0tE{Z7t*x!DuCA}IuduMNv9YnTva+sxVgExy1Kf%ySu!+ zyuH1>zP`S|z`(@B#K*_S$jHda$;r;n&d<-!)z#J3*4Ee8*V)lq(=H}<;=Lxr}wEzGB4RlgYQvg0dLq|-Hp{uXa(%zSwdA|Sv0UAj}K~yNuozU4M z0$~&d@UbtsvSztR+0#%Vv}c4yK1-ABYZ1nlp=jvO_vp^ZOXupZtU0}MZ8UGjAF%800000NkvXXu0mjf@Wq7L literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/view-left.png b/themes/greydragon/css/colorpacks/carbon/images/view-left.png new file mode 100644 index 0000000000000000000000000000000000000000..c59af5d00dc95a3a9e5d09523e1795d93b9ac4c9 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^fNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!uqB*-tAfuU^jSqmVK zv%n*=n1O-s5C}7hYIrpO1tm*dBT9nv(@M${i&7Z^5;OBk^!!{y6v~YCO!Z9cde4*r z6?J;LIEHAPUwdIAZ?l6)^TYf8;T!Ipo!HmKE74$iX(NmF+;xXUJO$;HyacD~*`2)R z;+MCK>5AgKt=rdr+vdnHNrS7aDO^~HjmLp;NdoJ&;Nr5L$;oqM9zS6?$vElo?GI=5 zVz;sH-@B3LV?@>L>Gz)PHZQ4ER&h)C6QQ_CI6hn?A>F^Pu;|~%V~k5R+(epMs%3zV OV(@hJb6Mw<&;$VYA8Shh literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/view-right.png b/themes/greydragon/css/colorpacks/carbon/images/view-right.png new file mode 100644 index 0000000000000000000000000000000000000000..595054562d3a26ded057dca1ce7d79325d48ee14 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^fNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!uqB*-tAfuU^jSqmVK zv%n*=n1O-s5C}7hYIrpO1tm*dBT9nv(@M${i&7Z^5;OBk^!!{y6v~YCO!Z9cde4*r z6?J&JIEHAPUprwVZ-at>>-%_(m~)nI*4#P3IOp&=)tHk3ohKUSthnfOVtGZQ_`Ai6 zi>59y{ig;b?>_XKnTaoV6FL20)dHZK O7(8A5T-G@yGywoR&v1nR literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/carbon/images/view-slideshow.png b/themes/greydragon/css/colorpacks/carbon/images/view-slideshow.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb53ad09633e73cf42669bb918e1e42aae85b2d GIT binary patch literal 1014 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000ic000ic0Tn1pfB*mh8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;K%k z%ys|(14l_jK~zXfwUzBplV=o%`2+TGe+VRen~(qjg4+i>5()+BMqnlkEy2?8VhKT_ z&=9bUECYjSmQjuJB8qP9W_c?jP@)vv2FTbZPfJJ3HZv*M!DXMvv;kXa5qXl6`^$Z< z`<(m!o!=9qR;xLVh!LSN@A;FM(SkEho}|6Koq~dbh=oK1r>Cc5O@gq&fUAg1arTII<=0H91YqpE|Hs2$WK4m=<5C+<(YHz_T3BaH5d$g z;9)Bcz)k&wlzyhAs;CK#vXM_tD7akPhJE%AK0cL8YKDTY>wUOfE)o+HBZEcd1==jm zS5sZ0qr9*lO>r<>5Byd5~r1Bg-m6SoQFBwPOChk5^rNL2C2rSDjeR;|PnZc>eO= zsUPZEbyHfV!FcmF^NYWcl#~?tjstU&oSYn@2;up2X6<&y#~(2~GJ@a~P?f5pSA__V zjg8HjoSa~8ZkAi!H>s+s;6%bl(s0;pk6Bw=!(uV-tK|a+#Qz{4hMV-bxVR6r+8T1Q zK}^oz2jwmG!^>34#K^-RtJ&2CaI1^aJvp@x~sY@5K&3Kl+tkLqA&^Fg$L< z>pvlI$o%{~GMOy02`Lo0Qqr__hOZm0QF~U0zN!P&=?WfCEn^y*;(T=-Bcl^R_`twG zWN>myisTbEtDSnap5{sey7QfUE>m%}?FNG5Ka_H~rR9p$X5aOGewkiibKOt- z-+!@7Ax-cf62div { background-color: #101415; } + +/* styles.css - Photo Slideshow ~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-counter a { color: #fff !important; font-weight: bold; font-size: 11px; } + +/* forms.css - Permissions ~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-permissions .g-breadcrumbs { border: #303030 1px solid; } +#sb-content #g-edit-permissions-form { border: #303030 1px solid; } +#sb-content #g-move>ul { border: #303030 1px solid; } + +/* forms.css - Add item ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-add-photos-form .g-breadcrumbs { border: #303030 1px solid; } + +#g-add-photos-canvas { background-color: #101010; border: #303030 1px solid; } +#ag-add-photos-button { border: #303030 1px solid; color: #bbb; } +#g-add-photos-status { background-color: #101010; border: #303030 1px solid; } + +#g-add-photos-status li.g-success { background: url('images/ico-success.png') transparent no-repeat .4em 50%; } +#g-add-photos-status li.g-error { background: url('images/ico-error.png') transparent no-repeat .4em 50%; color: #f00; } + +/* forms.css - Organize ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content.html_ajax #g-organize { border: #303030 1px solid; } + +#g-organize-detail { border-left: #303030 1px solid; } +#g-organize .g-message-block { border-bottom: #303030 1px solid; } +.g-organize-microthumb-grid-cell { background-color: #303030; } +.g-organize-microthumb { background-color: #707070; } +#g-organize-controls { border-top: #303030 1px solid; } + +/* forms.css - User Profile ~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-user-profile .g-avatar { border: 1px solid #888; background: #555; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* menus.css ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-site-menu ul { border: #000000 0 solid; } +#g-site-menu li a:hover { color: #000000; background-color: #303030; } +#g-site-menu li:hover, +#g-site-menu li.iemhover { border: #303030 1px solid; background-color: #303030; border-bottom: #000000 1px solid; } +#g-site-menu li ul { border: #000000 1px solid; } +#g-site-menu li ul li { border: #C0C0C0 0px solid; background-color: #212121; } +#g-site-menu li ul li:hover, +#g-site-menu li ul li.iemhover { border: #C0C0C0 0 solid; background-color: #303030; } + +.g-item .g-context-menu { background-image: url(images/ui-icons.png); } +.g-item .g-context-menu:hover { background: #181818 none; border: 1px #888 solid; } +.g-item .g-context-menu li li a:hover { background-color: #303030; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* modules.css - Exif ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-exif-data table { border: #303030 1px solid; } +#sb-content #g-exif-data .g-even { background-color: #404040; } +#sb-content #g-exif-data .g-odd { background-color: #303030; } + +/* modules.css - Info module ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-metadata .g-description { border-top: 1px solid #737373; } + +/* modules.css - Image block ~~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-image-block img { border: 1px solid #888; background: #555; } + +/* modules.css - Comments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-comments .g-author { border-bottom: 1px solid #202628; color: #999; } +#g-comments-link { background-image: url(images/view-comments.png); } +#g-comment-detail>ul>li { border: 1px dotted #737373; } +#g-comment-form { border: 1px dotted #737373; } + +/* modules.css - Calendar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-view-menu #g-calendarview-link { background-image: url(images/view-calendar.png); } +#g-view-calendar-form ul { border: 1px #888 solid; } +table.calendar { border: #a2adbc 1px solid; color: #616b76; } +table.calendar th { border-bottom: #a2adbc 1px solid; border-right: #a2adbc 1px solid; background: #d9e2e1; color: #616b76; } +table.calendar td { border-bottom: #a2adbc 1px solid; border-right: #a2adbc 1px solid; } +table.calendar td.title { background-color: #a2adbc; color: #fff; } +table.calendar td.title a { color: #fff !important; } +table.calendar td a { color: red !important; } + +/* modules.css - Search ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-quick-search-form input[type="text"] { background-color: transparent; border: 1px solid #737373; color: #BBB; } +#g-quick-search-form input[type="submit"] { background: transparent url(images/search.png) no-repeat center top; border: none; } + +/* modules.css - Basket ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#checkout legend { background: url(images/section.png) repeat-x; } diff --git a/themes/greydragon/css/colorpacks/greydragon/images/ajax-loading.gif b/themes/greydragon/css/colorpacks/greydragon/images/ajax-loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..0996045a0978d28e0ac2fb83a634bc349cfab407 GIT binary patch literal 4782 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 literal 0 HcmV?d00001 diff --git a/themes/greydragon/images/background.gif b/themes/greydragon/css/colorpacks/greydragon/images/background.gif similarity index 100% rename from themes/greydragon/images/background.gif rename to themes/greydragon/css/colorpacks/greydragon/images/background.gif diff --git a/themes/greydragon/images/footer.png b/themes/greydragon/css/colorpacks/greydragon/images/footer.png similarity index 100% rename from themes/greydragon/images/footer.png rename to themes/greydragon/css/colorpacks/greydragon/images/footer.png diff --git a/themes/greydragon/css/colorpacks/greydragon/images/ico-album.png b/themes/greydragon/css/colorpacks/greydragon/images/ico-album.png new file mode 100644 index 0000000000000000000000000000000000000000..ac87ec4fbf6acb75ac29259e60d8a9a0992cbef0 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0w6XA3y|d6q_!SNv7|ftIx;Y9?C1WI$O`0h7I;J! zGca%qfiUBxyLEqng6t)pzOL*yIe{8wlsqH7fI^Zbt`Q}{`DrEPiAAXl0g0J;C3=3Y zAqr*2dZv0NcD-lHfQn9fx;TbNTrR!1-|KLKgxkmXN8((Zi^|H1i>6eu&)uW=Q7Xo| zWA@_khq6m{?A&S5q0ljHmVJDXY*3-+{iizZ%>4OGF?VN4?l$6ilYV{ip{4eW-1%{9 zO{?~1yo%H3`FQqaZ~0E+&MR(NFD2)0(BAi9lW5tI?4t@LFH{yC^V06BatS`-c;k4x z{FSJ!JUb`XKRnT>-|4e-lIDjWwbO$+1*^G^tA%OxMsf5QL( literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/ico-error.png b/themes/greydragon/css/colorpacks/greydragon/images/ico-error.png new file mode 100644 index 0000000000000000000000000000000000000000..c37bd062e60c3b38fc82e4d1f236a8ac2fae9d8c GIT binary patch literal 701 zcmV;u0z&N#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/ico-separator.png b/themes/greydragon/css/colorpacks/greydragon/images/ico-separator.png new file mode 100644 index 0000000000000000000000000000000000000000..3e158515556616fcf3cab5e837664263f6c58c59 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VkYHF5IUx~9v7|ftIx;Y9?C1WI$O_~$l?3?( zGcc4*K5GHwNtC!olmzFem6RtIr7{F0X6BXX`MHKDlo{(8o2`8QNEN6?(bL5-gyVX0 z!U4v#yhv;IWAnD9iq5gkd_O1j#iA2gADI~V9C;r3-B_CiRLtP%>gTe~DWM4fa9k}Q literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/ico-success.png b/themes/greydragon/css/colorpacks/greydragon/images/ico-success.png new file mode 100644 index 0000000000000000000000000000000000000000..a9925a06ab02db30c1e7ead9c701c15bc63145cb GIT binary patch literal 537 zcmV+!0_OdRP)Hs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1pxgn>}>2DY#bcy9GvW& zTpU2e1w`DO+&r8-JX}1y+`N3;eEdB8KqSD+FUTt($SWwsCn(G(B+M@?!Y?c;07N39 zf}&!AqT+&L;zD8)!s3#`5|SbkQX-PlqEbL4BPJ~?CL=2@BPT8^F9AeyK%^ikuPCLU z1a;#mH5vjm2mu|CnV`JD!10NJkweB~!-9j&9Ku>LCj=53+69!o=6Dn?YUpNS%eZr5 zW3oGwf^(OQ=B5TuW{u!gK9vhpo2DBi@AGlkysT-qMZVsRlbfIWu{kuFNqAjpytvq1 zUL%xCu_>4{V6od=hpn$zxFR-&-8facx^;cR{x}KmGM%=~5=JXxS34eV+g@N^FvEL# zUOS)Mr&oUuY}bz$P-NdChlxABv?lkH;JtH{d-kHeFUFR3r zua~f$)%x=C3jgg9XLpryi*JbCGsAaxS+2y6#3MJ(?k?w%G)m);_uI3hK2ZDlPT6>VJ=9X(ZDeN{aJH9bQ$eIs=PV@r3Rkmy~xKrNCbt`Q}{ z`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Ye$Op_0u{-7x;Tb#Tu-(*@TIYnk;A?rGeoFk jrsWKY8I7Mj5||kR?70MU=8OLTDrN9=^>bP0l+XkKClfE| literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/ui-icons.png b/themes/greydragon/css/colorpacks/greydragon/images/ui-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab15cae7d3a3fe41b721abe9ec09345d1e5559c GIT binary patch literal 9657 zcmZXa1z6MH|L8v(qohMpMu(u3ND2(3B?Uyf1*E%SfC|zn2+}1WA>A8-q;!jf(%k}M zu)FX7-rv37-*Z3Dvz>GHe71Am=e+av*?VnGWs*A#cK`q&QB_fR4ger*7dRro!@eJ; zw+>+&h@G5<8~}VxAVOQ>V#kDTDu$i_K-%`t3)FWxC5ru!-b?YNm#*t8FJDU!TR_{= z!NrSTQ&Eq_=Mn#7ei50tA3gxUDXOXt`d4TKOj29LBN=`&Q7b|KPM< zF#3M(adE-l-D>GbkzvCCsm)(f7Z(+%onL_mSFNM_lgrhJTTKDeR_qf0&jm~8=hpJC zaG5O8h>hnV0eHp;Vg|*i6M;l2-j+Xa->nW2IG?6}=Q2O9BXJ0W@sb;iEO9{Dm`=Y0 z>1;RaL9@`)LC(bEX@C>)=37d9tP^I4&g6gYi;i0ziRs%W~w@tj<2oI#Jv+@n#-Pe`jnW&j4Q025ZQ2kz8v&|peB)zI*DFYxOt(l(;C%V;j2yHr4-CujUE-lDxLqP3_UQ%HZV0YtW z)`Ij$vk00)qaqKqs6i|rbXad(HoD(l{7R_wydt~%6W8NmoBRP26d+$<{*wCQ%fwKX zNh=&HO4SkpujW@%xm4NzUirU9dXnYd=+5f=qr0ZJ8SOfYwkw4vw3e`JhZ7x3OjkDt z%SHwGuAzPB#Nc)4WrpTGZ?6{G1&m7@&C~Hw^XcIVQt?gWv+fI10)MK+1axrfM>6)K z^F4K1TlW?+=JT0S{IyltxevLz^wj4^!5Yec6)pU4d~&)6O~_^p#pS?hMnqg0%52G2c6G`66c%|0UkPyL#fO*_P%02GAGZPk(nzg|*|?T|z-d zYp_r9Cvo%l>I-;b5;E|DjqbJs)vY$tj5X#YrR>9Y4?j}xMsK7y^qGm_#z;sGoy0}t zp{H791&CUE=|RlQ)SDoyiL#->uH)aJGL%0Rd}yQgqh1JE8jk@bPdNG$G&7X_sFfj+ z3nZ9+ze}c(!}k~-q>ler;_ffW><7Gvggc4)o%BLA)7_`XnBV{~c7K>5D}~U@@<7rn zDetbqaGK=VW@Zl|J z?H9@MMsUj+!ub!(P((=)7i4(UU0-a|XK#A*B52eHfV zrUu<(+-cc;I_%PGPa9P2bFL!JnP}hCFpbbP2^BftDl&fAC9Up^>chYKII{5|9AG+tEY>E8%KJs zFPy;Yg~lD#8*lTv0pf@#GurwyOIYXisbMelPk*Tj_Ij&!b!nC_%K;|8zjTyD-m61GVs%73Uk^N8sPN0D|Iic&OOE zROVe*;(!3yU55YPqpXwOZsb!7(d6sNT_CvA85IBaq&z%~ocXNREGlV$3?}CD;8-Zp z$aiR$I6^0UGT>){U|Ja+qnC*z20yb1d7l@cd{M z;3o+a$&4M0Y3Up<01EKP9|vaixhimoLK3ao%hKlbWy^?7`QluPNsX?@F1u%PaW`K( z?Z5{xN00M|XFF3x&tp%iLH3IP=0&p&MrC6MApTyF>EaL|_&6auTw`HsbD|sn7}-W-b};07 z#+Rj737UPO!G5_A@^k4SkpiszqthHf$(9%{2TQJNe@MD~R+4etO*nF7sQDh2r zntx@&!>^b)>~odMrYmIv6x7_{P`uvd~8!|lG#N&bfM^7wJKMH_*+#5z6tfgOd#0`^bU%I zulPNC>4$gsbCG({eR{oL9!J0iZr}H=V~R!nq$2v%7f^V)>kgN?t%~{@pERJV-yQMoEDS6UUM~G#s8Sz8N1At9DP%%^Amsr^YA|^m2YJMNdp7C9$jK#~ znYI=NsKpaIIinrOM&AO&=kG6R@cAz5ar+ca0!o_mt{v(vqz7Lj27LbJRP)24JIfA; z)C6l@OkS?bgc?^tR#xxkJ*R7snG_RQNq!rWn|kM0Un-!U6A?L`;d3_2G*m?%d_S8@ z%NyCqS@rnwEiA$6h52AtCyThsrsfm}&@yVCwUB$E01W4_ z+^9~F1XjJw4k>h`5ionuAKr@Nu+29a!{~LO%0xozLX+$}uebWT(>5%F1R868TwGaL zU07WQ4dt|6L5A%Wr<++N$li(@H@mTBJ@FTAyV}T_pEfWben-OCYh+~9vuW(o@>co? ziSs8Dmx!h&jnANj5+->zD&E7xZCyl2OJS)QB{eJQ_dCD2EP^4C~_zqH@1{8tl&(%JPDpCLq8=f0KEEA;v z(yiVE9DhVzt@g%QUo86OUZRh>$sR!k$Y+0KiD`M^BonY$X{-1~B)wUVPIRRs#?R%_ zUqeM*JJgi5lh&y=;D@!CqzI?z?}ns~$8!41#E(c1Mtu0=WL%1!_i!@Yb3tSAD=!z| zEv)8*+xhpW<6Fm2%*{oeY6{m^W7m$fIEKe+5XiFMD#_o!3$Aq}jG{G3?8?vA%uSTd zz9n-$n;^*hZYgB3i-o_>gArFF*Tfb?* z>;C#|$4Zb3LarWR(3Eb?Mdp?{xW%R9SX=oazEe|@|7v%wGDY(n)c;%uBItWy;xnls z_I0-!kwd~D5~X9Zk`s79;a_QvFe3+N7cOrx?2!J*e9ZR&n0Qq*U+>nMRd?dp%X8K6 zkys<`!abIp3S5&-q(jwES~Mcf0|j)Q%G&rrJW!bDlu|x}ExF6!PvdNzGDV>FcqlmK zi!{KDx7EGsHf-)|BI*r#^&_JTb#XY#-+5_exiz)PEF049x37E^$0YTl{hB-9vH$4G z5vc->G8`Y^z!T(t75Pe1td}Kf&f*cjv0WeU20ysYuK%hN*1~}7eDymx5=$>?3l(x%LvLwK<${fW~ zqLtf81S+CKRDovj*O)mMnQpH|aKHq{<5kIYRB&77&NjBi)X^VdK_%Ld}JpqGpI!;?GHZtXoMc(Z&NpU8ul$w zgzY3P4$<{W(XOmv?tYa0(Q>J3g-}CABCO}ZNC!#!8@^&^>s*gRsm6kY>%Bk0Yt%UQ z#9o2VC@CW-2*o?_&gR*CXPSVunMpomR|I}cr*sFZ&~tcrc(0eyl{z>CrJe)6QE~;p zBW2?KgC_)8v3<6MjOrc~`4;Qj4%VyRIo%wkg@RNa9V-%# zq;8a~Au9F?79XC5;mihFu>>0X!EmMyBGvH>JMdz6?lf1OK!A^7ZD)t>-I(OwzmxD> z12g}(<2`vi`OEfmf^pzAYfxwNLF?`UiRwzE1aJw7Yv80qY)?5Z|e>~$IQo_1M!_O}8SV6i>F2ijqzuDJJj{wu< z`^-w0cUZR>7;@BZbQx++T<00sF`e(cRA}{~iE+Nm!57(O>^e$&<;>v-kGl}J!;XvS z*(zEyKUS&TFLf`it=Xma>nC3#LT=_%xwAP&D7H`|_UOvzYxR#m09A}VqAtJsMV)`u zKjl$5?~}dNY40oH5xdJqVq@6mQ<uc@{Rj>Tih|46-=t%|SrS<<1zz!}>y9{#2MV!j3yCcbH3x%#~ovmK` z_!UXeBhc#txS%77%J`2Lix)?G7LnI7fp{B{84#BelFB=TCiXxySk!X{<7s$OO?@l1cPPisIf{0N_BG4iFl9>BiSncv zGH5o=EzYrn=;8_u&Ky%cA9F7_KlthLl~+r3!a03{C(V%8oqzJ5>7qa*y0%OsY_*o0ZS^ zL$++@@Nv}z1qWBK#C*Eds>Ho|JO`op4Z0)(m-p_<1JqucY`{)miqK?cj0ksxm0|r7 z*!OUL-Y)myjsSh=+#zBmoJeN1s3v}`hf3?y6n!j$_0@rgb22RqS0P1rLrs2svZRFT zH%hl_{J0>7->PXjL@LnhuL*0>(^kU(04kk_7a>wEgJ)5Z_1zKayX3F@r6S`mLn2nX zxv99~_b=+fk6JG4<*>&y|5kk(%lQk zX6N@+_vnvf76DQi3EH^iQ{$zVQ2+LNMZ)g6-jVQLfQu$k(!f- zzTdAlbC=bE19!MT5^Nv2e4|WdA;`N2ySc25a+pc1FXj7+ zV=2-S4>q`YHj2;ZEJ=C)a(~RMgZ_OLmYg->sXJ&JwW4-{Gj}4zSL-K@6QogeKGeCY zfojX0mHw1~Co7l{95pDA5i|Bm9ExBaD~l8Fa~jZED!7lW!G7lmXK6Cp!9R>vcj+#@ zX0jiv>?zIlk(AmSqm*hN)tU#%Ugl%dh{W@4o@bez0l^t~#SZeo@8GN*{EKCGYVLT{ z)1CP)S&68$0Omo4c&RFOS8xp*7$0mQq>xufr~Fi*lVlKj&VON{4wPI4asaa*qs(T2 zsJX&~ZF0c%>g9Vzb$gZaB6{uQPJWQW_VY|T9;HtTKqG4HA$qSgk|^5@1Uh?iq%0r5 z=14^?2mG*cCnbZ_49P=P?+TZEcc_~)m;MV?Cq#0EGD8v@C>FL#oL%l4SQ*6@`UVT= zY?qy+-18Xg`qM@V;@HL%Z6-7j!mBu$CP*gp4^u_g^Pgg;nzCi74l}yZKJ1g-83^%0 zhW#NR1E4TP3V0bl^14lm_yvtA8H;9ata3WAWu%`wQB?0O4H)07KqYzNP!VL7_&1l_ z1?QWK?|-!cQ6N1FVx++tqMr^pJdD15)DVEpJ`9&d@W?l4)%?g(OEid)dWd@jfGdbs z40UMhxaHwT1iLYvUw<4-l()0ciJK=f)!8&)4Cn@b1U?f{v|?JYl=1VsPYwLNAO$M; zUPB@`00tyEVE`Q=fu7LiiE(A4_3x`Yy3fi@nIB_g>Hl2t_9Lvd3hBy~frKwbJsvsS z+{i`X(GzZ;9WIByXxOzo(e|26;f|2m%8Te39_xHvFGR3UDCo7N{gs}evRLyPJho{a zFM$UE_Q2&o_*-F6$mWzL-D`za)YyI9U) zd#mC?rSB*-V`DUZaXA?Ic=nU`Ffz=}d;)g(&H;^Z7= zbN?yLDvg_J5ty69y*RNY@@pXZn2KVobBCT1J|cee+-|zs<|w-AU|P)fHxZm- z6pP$<9%R=v=K>gmWwTF^shp$In0vb`0ii!H?c`XXiaJ>^hg{|hqQA$`*1aX7y`!~))$F^0<+@_5*5Ek-`JE!` zOwf#KUu%>|hSKehyX<}G6!f~+^V4dZv4ge(Ve{bg=O@%sqF?Mnm+F%$F_U<#Ho%#5 zG@xQ&5IXr`cyHeJ*~d)Z&&=Uf`HrfQUfo_>QpFnn+GaW^VbI(bQB%lRUgKS7zB#`A zT?NV1-Vd|p*1IjiadZ-YIzHE)9)Nfd+yTJaPpu3=Imm5^ThnI4teG`)@L3YUt@C`X zVh=(#u$45V<^IWIJR#j*rLrv~*fxf8&p`S-gAgn%6K&Ub7!);?Lc ze)DVIna`lM(zUb8Yyl<7=(mrgufr*PP6)>uNIJi9uL@=yHr1|wb0j&zYN{47Q6O@E zp9AZnRB{g%6>`T8r$UyQf=8vfM_q$W{74zaT&+gk1Om`+juGo?V|-=U!_6}*cVY@# zSZ2+xNMHwcFbT}EIUQKWu$S$-M3IB6sO}t`sWuld!<|?FosjcbeN+P6-zA(wBnA8| zoYL)vNNjJ*rz;en1zp`umu0x1`DbMV1S$Vzw-v6SttE}KVwlZg%jw1)Fw3FkaWd!G za^P-iHXmUrAE0&8wa~Bx=u;%{!DQ$S{$rw+g_d-H64r zoRH{;#$P{4k936bfK^&AOkjAyD`EK2x6&PVid1AfXxh(bjOR7P7CDq8bW;ERlNv3y z`Qn2B)1ViBL~yF`ZoUx$o*;nsXx6H7GbfP$pDa1{jaO!7<_Entnb-gKfs^RU_-%+u ziE?{HiRTS346|v{tFSfMl4}qaQY?!opAqdbP zcJfGL+u$9Fn_(+=j_{oC=1RXIM1mYS)tqg^c8k}La&adGqvZSt!NDM4MAn|K$ABktw+I`E;j?-tt@# zIO_!q^M$L2YbOa(_sWyh>;Zm zWO+>|#)oXa0aa`KuoQX7-Su$VMO^o7@TFJRDZgwsD!aH-9jw!9UIh^xUjf-LDLf+r zzsBt{iO?pMQx}jE??!jvvzq229LZ-yLrIzVK4ZEdCFfL0#UnMKGWSZ+L6LBwym zU_4v2Mdth*@cbIOJ0v&ZXaDoxg#SwTu!CCo0G-#?^(;Qzg9Rw8{5qt~3;_Tr0sO8C z&~{IQL~tk23_>3AViW``CWo6`Ig`vOF29Ap{Mqv5+?kL7SOFoiV7&(*#{uA01b|M^ ze-2%n=b-&`MA`*$^VgM(Nz&^OTl56E?#+EI#)dw$)6{1j*+O>AQe^HjqPTcn3JVQ) zj&H9I&5w`!n6-ZQVV2tcPeThJpuBH_*1fTd*y_B>m4sOajsH*0T-}_%{M~jM8(7<% zCyG?fpI|xPUKc*Ijc%!?E&4irwJ%}0H`M$Ji{P{{o3fYz6&Wm!Gu)l6#(>nQ0A7N2 z+vSL+t>w*kp%h|!qAq*6quEmF(l=+5Un(o(Dot91pKo3KF{E$E1J zq_lQ9piO^pn`5GO@yl~mZ|R$>ag7BC%S-98wDY@WZP1m6d(IlRVzI6;sHUlPS(LOy zV^Fh*IV>5w9j_aek@6n;@US%a@4TI|%R=LRTj{fPYPXOBQ=tQ07Lfyd4 zuBfwZ^F%%^2n-L}cve1k$nj4+!d&*r&TZy~c6P52Vx!C5>pw99Z-TH@#vXS27WzBF zT?>kc0A?cX$YTIT*?i1A$c_qibau8SqUEQqwI64*T$@6W8KeI}x5u5*fq&j}_dH%B z`C{7kf*=V*0nlUcnS+p$l9CEda4YRQY5wy`(N50so#I%L$g}SUM@k7 z54~*rq8R9R>pLSZil zCgTk$;lm@Xt-X#<-|b+Oh=H*vP*5(}?R;+p+-c*-#}~qmGY@{B=sHFRDv^F)X=kyWMGaU%hqx)AK&IA5NSZ?$2>%cni%TlASyc zvKaS~X|&*AzSAySTw(fNLmECp3HdQ`Nr3~XBaQc6J=w&=+V%_mFdcD>r^}a)?bYI} zf-$}{g1WUaDuV#5=^LsrS{6L UeJ;!CAJ3<%sHspTZxQ~#056d*x&QzG literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/view-calendar.png b/themes/greydragon/css/colorpacks/greydragon/images/view-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..206ccd66e043f44319ed6bf432b3c20cedb36179 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%0VEiBdp33fDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMprB-lYeY$Kep*R+Vo@qXKw@TIiJqTph(ejM zo~fSkf|rq3fu}8f=?+J9cf(xHgB?!Jz)%B3Xrf zye?n0#L_qt9%?uS)$UobXNL&KDX;GEh9BE_t|??~zwEbvZRhHuXIH+JH2=896Q=OW z>;2Kp>CfiGRn+`kI9FkxXtQd^t(3h-OG97$c{1~;tgga7)n?0%U8Zku{gLL*&$HO} z?n#`$eHo=acPrYj&U#?kY0R}tYGTWKpZ)v(JbLwccK`d^wS1lx%}=G;r#5y!P8a)f zRe{sq`tP%AuV?44-&6hP38#yM`-~g6XD2fxa2z}GWXgi(84_(0!afPIhXa@vO=K2R ziD43ShD0or;$lD}j nnV@*+#-SrT5+Mg?MmPyDm^-{Uz^N|@3SkCMS3j3^P6 literal 0 HcmV?d00001 diff --git a/themes/greydragon/images/view-comments.png b/themes/greydragon/css/colorpacks/greydragon/images/view-comments.png similarity index 100% rename from themes/greydragon/images/view-comments.png rename to themes/greydragon/css/colorpacks/greydragon/images/view-comments.png diff --git a/themes/greydragon/css/colorpacks/greydragon/images/view-full.png b/themes/greydragon/css/colorpacks/greydragon/images/view-full.png new file mode 100644 index 0000000000000000000000000000000000000000..b75de9467ef01a8907ec6f8050b1a54e57a2725d GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^fNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!uqB*-tAfuU^jSqmVK zv%n*=n1O-sFbFdq&tH)O6qGD+jVKAuPb(=;EJ|evNX*PD(erZ+Q7ALkGu1P(>pfEj zRCLzU#W6(Vd~5$%t|kYO*7K`besQQpNwIESt@9#1>(&kJ9lg`GYU^rjeG$6b_~452 z%Z-~Y0$xhMyXFI3MKMQ;^UtKr;%wmpe{)w~P hjrv=ZrR%4k6R(xZJbzz1|2NQM44$rjF6*2UngI3_j9vf$ literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/view-fullsize.png b/themes/greydragon/css/colorpacks/greydragon/images/view-fullsize.png new file mode 100644 index 0000000000000000000000000000000000000000..ed76257a8cfc001029190d078470850d16cc7d2a GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%0VEiBdp33fDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(GY3GxeOU?`h>)&j`m zEbxddW?{VmR zbkpwLuU|iVnr`&j(M7pgQILa=qgJ8s`7NDkhEg||^t+l@YK2%u=We;XCODzNfiH2A z_oRS6#;RP6@GZgo`@DaDh`AM9wJF%@%C9~5UwL0T9QpG5>gw;WS5B9x_;027NoN+D z7KHgp97eaYbI>gTe~DWM4fA=8($ literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/view-info.png b/themes/greydragon/css/colorpacks/greydragon/images/view-info.png new file mode 100644 index 0000000000000000000000000000000000000000..521439ce7c35951c231bf4759dd2874fc918cffd GIT binary patch literal 938 zcmV;b16BNqP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000ic000ic0Tn1pfB*mh8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;K%k z%ys|(0ew(RR7C&)02mk;PEJlFBqSOd8XzDbR8&+_Qc@-+CQ(sQWo2bpSXg9aWEmM5 zDk>^0EG#fEFf}zbH#avqIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w=9LqtSGM@L6U zNJvUbN=!^lPft%%Q&Ut_R9aeETwGjUUS3~cUu0xtWo2b&XJ=?=XlZF_Yinz4Y;0|9 zZEkLEZ*OmLadC2Ta&vQYbaZreb#-=jc6WDoczAevdU}0*eSUs^e}8{~fPjL6f`o*G zhK7cRhlhxWh>3}bjEszpjg5|uj*pLzkdTm)l9H2?la`j2nVFfInwp!No1LAVpP!$g zprE0lp`)Xtq@<*!rKP8*r>Uu_tE;Q5tgNlAt*)-FudlDLu&}YQv9hwVw6wIfwY9dk zwzs#pxVX5vxw*Q!y1To(yu7@)z;S5 z*VotC+1c9K+TGpV-{0Th;Na!u<>uz*=jZ2o4wQ)i000eiQchC=fEKKD8IfKqBJP%EXNC?X20K9$$o+U(W3u^QVAPXFxOl9nWi0)X&? z&1*ZdOo+0(D|K+V%&Q#9gvg2#YUVKPu?!)EoF{+s8W>&U2WRI>pcnZVO?_SuGmP+G zCzJ|*L@7kkg41$bDS*Y@Q9MlGRE$2t}mS&_C7qS&y2mPs_N$O(B0GPD`VQri#o>Ps+5+?F_zP` z(?LGTO!k8@#=aih`MIa0_s=g)Stxi1bRte8^Iq+`2OY}00000 M07*qoM6N<$f}e<{V*mgE literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/greydragon/images/view-left.png b/themes/greydragon/css/colorpacks/greydragon/images/view-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b93c7a5e0e191565a8970a8bbae7cbcbddcca5 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^fNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!uqB*-tAfuU^jSqmVK zv%n*=n1O-sFbFdq&tH)O6qGD+jVKAuPb(=;EJ|evNX*PD(erZ+Q7ALkGu1P(>pfEj zRCLDE#W6(VeCq_myh9EGuJ?PE7jTEJ^6;2u!5FfyDc`}>`MLKG20M2vy@QG?E-h<1 zx8tK9*X-2ItUsSlewO)fdTr!{l&XNw=37NCO!;-S=kQX=cJ5X`1*I7pYFv)8AuQ}N z3NxBJirCIE{8PF3Sn9yXD~Ej+vF|>sQkA#OM$Gnw(<1dr)7!OPhn`$ELF7lu)#qBO z-}C!!UcGqj!t|6Q44xmT3$r1`;yDe%%u3)VqWFH*vAvT iTAj%IJ+W#2YyEKX@E@h|rItW{F?hQAxvXNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!uqB*-tAfuU^jSqmVK zv%n*=n1O-sFbFdq&tH)O6qGD+jVKAuPb(=;EJ|evNX*PD(erZ+Q7ALkGu1P(>pfEj zRCLzU#W6(VeD4H9zC#8)uKVxu#J)Vz(h|}seBg?9L9<`%jU6oP4`gy;nw$+b8ckhW zlIirwL}jf+!KbA!PX6oj-EHG6bXZz+S)k_Zjqi8Q)_BfsB*);Yqom}pnemP2MuF7% z;T03lHW#Y=s5oTxOCo%=004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 za7bBm000id000id0mpBsWB>pF8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;K%k z%ys|(1C>ccK~zXfwU+%)QehOw`2+f~KSVb-r=m`sI;$TdH&HYxr!|ej88Opf&Ri*T z8s=K+Y^)`<@+DI%sL+%$3umIesF{^skOX^Kic0#8=V_P8%T=6px3lN&-t&CUIrsUV z1H9PSSg;ls7l++gOiYZ2#UoJOKfWk4Sa8a|eQ0QCKu%81wuw+CpU>xXOioTtI3t(A z(E9{dixqZ9v<%XkcI0ydr^2qfs(vx$i-DSz!%|S zSv|~SpRxa7CK6LbXt~(|o6QCyv(3VyOkXf@V9PAXmZ4Ol!kOF($P3EQP zYzWfwz|1?~n=RST2`()?N6T!w+zg|B5X{s(9ADkv)D5-G+fi5~hxYbeOiX>G4dvSg zoZ$HQct1rjv$Gg8n=v@}0#Ez7!3hot3CVc*atPz&W4P0L8zm*h;73Q% z<}jH?u&}TIgF(-!Wlk_D&3zzy19f_6Xy_h=LWzuY;nv__TY4ws#4{_%4N3oB7&|F> zSy@>iCXq-WlgV~%ERTYBQf4r|lu5D-#yMLoMq67OM^*XpmDrbOzU}1VX`UZ?x{Px`gVu732m6c`Gsnr4D0l_!4x4eL^pBs4l;yv0m zomgE4o(`JebVp!=OiWBbAP{&32nZI5GU=va<0!6FUPIYQ71Sk-kRC3^$g3IX`d;C5 zX*v1_hCJ}@?(Xfu@d*iZPMC~lRLIn*Ije!{bTf_$q-d(Y1;+9V;#?_2*;42p4Z!7c zAvHC1doWQ5`BnJoScbBw618R5P*r>tDrG&|wD+;$0`iU*A+O*poNIt@wq!r2Dr##l z(K0)3cH-UeBvuyPwBPRU>Rw!H8>qOTg5F?+eenm<($f46kP|Ev3jGw}Tv~#KVK6y4 zh4D9U;9Pa$e8u_TRY6KgOiaY|^aoh27WDQRP*YP4!J&h+Ic8?QV10cZqocz+(=h>u zg@w@rq5ltjuB4lB0l0000< KMNUMnLSTaZwCpbc literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/colors.css b/themes/greydragon/css/colorpacks/wind/colors.css new file mode 100644 index 00000000..09ab5a6a --- /dev/null +++ b/themes/greydragon/css/colorpacks/wind/colors.css @@ -0,0 +1,184 @@ +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * ColorPack: Wind - Wind theme-like color pack + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* styles.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +html { background-color: #ccc; } +body { color: #000; background-color: #ccc; padding-left: 10px; padding-right: 10px; } + +a { color: #33629f !important } +.ui-icon { background-image: url(images/ui-icons.png); } + +/* styles.css - Header ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-header { background-color: #e8e8e8; border-bottom: #ccc 1px solid; } +#g-header .g-message-block { border: 1px #888 solid; background-color: #aaa; color: #000; } +.g-breadcrumbs li { background: transparent url(images/ico-separator.png) no-repeat 0 0.2em; } + +/* styles.css - Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-main { background-color: #fff; } + +/* styles.css - Footer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-footer { background-color: #e8e8e8; border-top: #ccc 1px solid; } + +/* styles.css - Album Layout ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-info h1, #g-album-header h1 { border-bottom: #ccc 1px solid; } +#g-info .g-description { border: #888 1px solid; } + +.g-thumbslide { border: 1px solid #707E83; background-color: #e8e8e8; } +.g-thumbcrop { border: 1px solid #707E83; } + +.g-album .g-thumbslide, +.g-album .g-thumbslide-ext { border-top: 1px solid #707E83; border-left: 1px solid #707E83; border-right: 4px double #707E83; border-bottom: 4px double #707E83; } +.g-photo .g-thumbslide, /* Need to compensate for double border in album's thumbs */ +.g-photo .g-thumbslide-ext { margin-bottom: 3px; } + +.g-thumbslide:hover .g-description { color: #000; border-bottom: 1px solid #999; background: #e8e8e8; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } +.g-album .g-thumbslide:hover .g-description, +.g-album .g-thumbslide-ext .g-description { background: #fff url(images/ico-album.png) no-repeat 4px 2px; } + +.g-thumbslide:hover .g-metadata, +.g-thumbslide-ext:hover .g-metadata { border-top: 1px solid #999; background: #e8e8e8; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } + +/* styles.css - Photo Layout ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +div.g-resize { border: 1px solid #888; background: #e8e8e8; } + +div.g-resize:hover .g-description { color: #000; background: #e8e8e8; border-bottom: 1px solid #999; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } +div.g-resize .g-more { border: 1px solid #999; background: #e8e8e8; filter:alpha(opacity=85); opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; } + +.g-movie { border: 1px solid #888; padding: 5px; background: #e8e8e8; } + +/* styles.css - Reauthentificate ~~~~~~~~~~~~~~~~~~~~~*/ + +#g-reauthenticate-form ul { border: 1px #888 solid; } + +/* styles.css - Sidebar Blocks ~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-toolbar { border-bottom: 1px solid #ccc; } + +/* styles.css - Sidebar Blocks : Common ~~~~~~~~~~~~~~*/ + +.g-block { border: 1px solid #ccc; } +.g-block h2 { background-color: #e8e8e8; } + +/* styles.css - Sidebar Blocks : Buttons ~~~~~~~~~~~~~*/ + +#g-viewformat .g-viewthumb-left { background: url('images/view-left.png') no-repeat left top; } +#g-viewformat .g-viewthumb-right { background: url('images/view-right.png') no-repeat left top; } +#g-viewformat .g-viewthumb-full { background: url('images/view-full.png') no-repeat left top; } + +#g-slideshow-link { background: url("images/view-slideshow.png") top left no-repeat; } +.g-fullsize-link { background: url("images/view-fullsize.png") top left no-repeat; } +#g-exifdata-link { background: url("images/view-info.png") top left no-repeat; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* forms.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-body { background: #fff url('images/ajax-loading.gif') no-repeat center center; } +#sb-title { border-left: #303030 1px solid; border-right: #303030 1px solid; background: #e8e8e8; color: #000; } +#sb-title-inner { color: #000; } + +#sb-content.html_ajax p.g-error { color: red; } +#sb-content.html_ajax form { background-color: #fff; } +#sb-content.html_ajax>div { background-color: #fff; } + +/* forms.css - Permissions ~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-permissions .g-breadcrumbs { border: #303030 1px solid; } +#sb-content #g-edit-permissions-form { border: #303030 1px solid; } +#sb-content #g-move>ul { border: #303030 1px solid; } + +/* forms.css - Add item ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-add-photos-form .g-breadcrumbs { border: #303030 1px solid; } + +#g-add-photos-canvas { background-color: #fff; border: #303030 1px solid; } +#g-add-photos-button { border: #303030 1px solid; } +#g-add-photos-status { background-color: #fff; border: #303030 1px solid; } + +#g-add-photos-status li.g-success { background: #d9efc2 url('images/ico-success.png') no-repeat .4em 50%; } +#g-add-photos-status li.g-error { background: #f6cbca url('images/ico-error.png') no-repeat .4em 50%; color: #f00; } + +/* forms.css - Organize ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content.html_ajax #g-organize { border: #303030 1px solid; } + +#g-organize-detail { border-left: #303030 1px solid; } +#g-organize .g-message-block { border-bottom: #303030 1px solid; } +.g-organize-microthumb-grid-cell { background-color: #fff; } +.g-organize-microthumb { background-color: #fff; } +#g-organize-controls { border-top: #303030 1px solid; } + +/* forms.css - User Profile ~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-user-profile h1 { border-bottom: #ccc 1px solid; } +#g-user-profile .g-avatar { border: 1px solid #888; background: #fff; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* menus.css ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-site-menu ul { border: #000000 0 solid; } +#g-site-menu li { background-color: #bdd2ff; } +#g-site-menu li a:hover { color: #000000; background-color: #cfdeff; } +#g-site-menu li:hover, +#g-site-menu li.iemhover { border: #303030 1px solid; background-color: #cfdeff; border-bottom: #cfdeff 1px solid; } +#g-site-menu li ul { border: #cfdeff 1px solid; } +#g-site-menu li ul li { border: #C0C0C0 0px solid; background-color: #bdd2ff; } +#g-site-menu li ul li:hover, +#g-site-menu li ul li.iemhover { border: #C0C0C0 0 solid; background-color: #ddf2ff; } + +.g-item .g-context-menu { background-image: url(images/ui-icons.png); } +.g-item .g-context-menu:hover { background: #bdd2ff none; border: 1px #888 solid; } +.g-item .g-context-menu li li a:hover { background-color: #ddf2ff; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* modules.css - Exif ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-exif-data table { border: #303030 1px solid; } +#sb-content #g-exif-data .g-even { background-color: #A0A0A0; } +#sb-content #g-exif-data .g-odd { background-color: #C0C0C0; } + +/* modules.css - Info module ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-metadata .g-description { border-top: 1px solid #ccc; } + +/* modules.css - Image block ~~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-image-block img { border: 1px solid #888; background: #555; } + +/* modules.css - Comments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-comments .g-author { border-bottom: 1px solid #202628; color: #999; } +#g-comments-link { background-image: url(images/view-comments.png); } +#g-comment-detail>ul>li { border: 1px dotted #ccc; } +#g-comment-form { border: 1px dotted #ccc; } + +/* modules.css - Calendar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-view-menu #g-calendarview-link { background-image: url(images/view-calendar.png); } +#g-view-calendar-form ul { border: 1px #888 solid; } +table.calendar { border: #a2adbc 1px solid; color: #616b76; } +table.calendar th { border-bottom: #a2adbc 1px solid; border-right: #a2adbc 1px solid; background: #d9e2e1; color: #616b76; } +table.calendar td { border-bottom: #a2adbc 1px solid; border-right: #a2adbc 1px solid; } +table.calendar td.title { background-color: #a2adbc; color: #fff; } +table.calendar td.title a { color: #fff !important; } +table.calendar td a { color: red !important; } + +/* modules.css - Search ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-quick-search-form input[type="text"] { background-color: transparent; border: 1px solid #ccc; color: #666; } +#g-quick-search-form input[type="submit"] { border: #c5dbec 1px solid; text-indent: 0; width: auto; height: auto; font: 80% arial, helvetica, clean, sans-serif; font-weight: bold; padding-top: 3px; padding-bottom: 3px; } +#g-search-results h1 { border-bottom: #ccc 1px solid; } + +/* modules.css - Basket ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#checkout legend { background-color: #e8e8e8; } \ No newline at end of file diff --git a/themes/greydragon/css/colorpacks/wind/images/ajax-loading.gif b/themes/greydragon/css/colorpacks/wind/images/ajax-loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..53dd589fa194f5db985e4301c7a73ed4f1b9ad99 GIT binary patch literal 2545 zcma*pX;2hr8VB%~zPqQp=@B)`y1PS96NXtx1_oS2g;AJ+5se@Q;|&UOs2qwM!p4Ca zhJiUal?ExBdstaT~?f3m?cZgNh{frmzMrfcJ8)3 z;P)BJevgQNtw(cfF&90SnBnnr_M&xm@O%6 zzG;!w8(-4o!w_SKEsx_t8i2dHA{$xug+5j_t}~5!rEMsQGpY^uf8#e!ez!6*c<$`# z%2he_t-h<5RT`BLN|GpKWC}6HY^k+5Dom~L=dCyXf!71bXd=Do;)LbM zv+gGZ*&l+=TYuPh^HJ+{Um3v9W8Dqi zZsIDi!j*rKg;1w`oCOc;={#&)!ZF-E-<0u^i2Q3W!xltD%v-T4#;x)CfF(1Ouv)`p z>uUosDu9aCbKX*^H)pSF(Clw+wK}`3LC8Vd5wn~@j##n&8u(Or9|$_$-*q^|8tR^Ze!v`8XRU12fiFxN&Z^HeB_6{>ZFruBWn5U6U_WQI--B zG~o}Ys+mlEb+PC3o7FVVvN+9%m7%O}Y_c3WoYls|wT3|PzzV{wM+0F|$H`%9CT0Y^ za*mZIUl3}$c$+|-?~lU1Lc0B}sn(uvcimZ5#)MR#za@NWsrn^X=yb^$k3_>|w9gkR z>#sW<_Ea0KR$g0dg}fy7K69z6?%wR47d!o@ zGKEctobW(W=VY|Az1{V$NH$hYU5!_r3z~t<1_3#$IhT`+-0m8Lu3WANjbGvNg1vn1 z=E&h$lM^*FtCrg64J+q9{~$Yc&oK@)FJ9|wdu`CBEMKgD->DcQRuxrUW36azX6kqE z(WAIz&9a^4uqfQXZ?4*+k}M^TI=80q9GA}G8+>bb(fyeR`Q-S93>Q-=OX7E#U^f4~jWk3u>uE&r}55)J9D8+*U}{&~xy z+xheT3lqZ$_0RMat&nbp<_ki!f?+E=jik2kBu@#UnX z0AcCVU-1x`*#iFAGPG4?H)8U+YtUJCS?At3FP6 zWjMo76`C~5oga!z%d+xx$x-ljIYP1$9YjNGd0H&jsWL7XsM^)8O;wB>PVnYYXxtSh|$ifidD)RGQ}R zwHJrNIdVjTqdEklY&;>>dZRxDK`F>#B8Ki@pp8f7rwM2mppszvcw{I`Q1%>g09l6Ekr2-S;;<|g2awum zsj!Q?)Pbyi5x+M!F@WFk6jsdhHiry`x0GIzjy;Yj%rtk*Y|Rg9EEqf3wBpTM<@>(0 zk0}s;bd@I0{9$O~|I{qUIC4vLX&EGrCS`%OyAe_n3}9mSiO7}(QE&#Jdx176W`mkS qJBjK|(6Aas*VCO0)PD%QJkkj;=v4CXc=>?~L(zU6eu&)uW=Q7Xo| zWA@_khq6m{?A&S5q0ljHmVJDXY*3-+{iizZ%>4OGF?VN4?l$6ilYV{ip{4eW-1%{9 zO{?~1yo%H3`FQqaZ~0E+&MR(NFD2)0(BAi9lW5tI?4t@LFH{yC^V06BatS`-c;k4x z{FSJ!JUb`XKRnT>-|4e-lIDjWwbO$+1*^G^tA%OxMsf5QL( literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/ico-error.png b/themes/greydragon/css/colorpacks/wind/images/ico-error.png new file mode 100644 index 0000000000000000000000000000000000000000..c37bd062e60c3b38fc82e4d1f236a8ac2fae9d8c GIT binary patch literal 701 zcmV;u0z&N#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/ico-separator.png b/themes/greydragon/css/colorpacks/wind/images/ico-separator.png new file mode 100644 index 0000000000000000000000000000000000000000..3e158515556616fcf3cab5e837664263f6c58c59 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VkYHF5IUx~9v7|ftIx;Y9?C1WI$O_~$l?3?( zGcc4*K5GHwNtC!olmzFem6RtIr7{F0X6BXX`MHKDlo{(8o2`8QNEN6?(bL5-gyVX0 z!U4v#yhv;IWAnD9iq5gkd_O1j#iA2gADI~V9C;r3-B_CiRLtP%>gTe~DWM4fa9k}Q literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/ico-success.png b/themes/greydragon/css/colorpacks/wind/images/ico-success.png new file mode 100644 index 0000000000000000000000000000000000000000..a9925a06ab02db30c1e7ead9c701c15bc63145cb GIT binary patch literal 537 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 Pk4-YvHMw4)?HKcaF3|lA literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/view-calendar.png b/themes/greydragon/css/colorpacks/wind/images/view-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..13e0e8fa6ad01636e87a376aebada4612d937186 GIT binary patch literal 637 zcmV-@0)qXCP)D7ei;IhljEs$qjgF3vmX?;6mzS8Bn3dCU$;rvf%gfHr&d<-!(b3V;($dq@)6~?|*4Eb7*VowC*xA|H+S=OO+}z^g z;^X7vlt)=I7_<>+9?6?CkCB?e6aG^Yioc^z_3;Z)X4i010qNS#tmY4#5Bb z4#5Gqk!$S$000?uMObuGZ)S9NVRB^vP+@6qbS_RsR3LUUE;TMRK8?(F0002gNklXRGqXq|E9aC%$SE>sC?yodM2ylL?*BGC|I-$i?Rt0TTOKCqib?KW zAaB90l*C7nq)MMQ@)~3h^ULGCrj5J;?dq0`!%dv4(?)hc4JqL+D@Vn|eU3Kr63o28 zPei?})dmV}A;b!Iw2?RPt^X|6*2dg^Iu32*oeSh65B?wfC&wND X`katw^)ehH00000NkvXXu0mjfcAGp5 literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/view-comments.png b/themes/greydragon/css/colorpacks/wind/images/view-comments.png new file mode 100644 index 0000000000000000000000000000000000000000..f33bdf1952832e6e119e24fcf3589d040bdef66b GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%!VDyDo&1~%q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4NyWWz$e7DaN_pUr%zwL zeEG_iD|hbPdGzSflP6D}K7IQ9`SaJWU%!3(_T9U8pFe;8^5si$(vdQtF3tjv$YKTt zzC$3)D5~Mr02Gugag8Vm&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JvFkkp(pl!|;us=v zIXS_BX-|3L119G0@9yqybaKdIW`2H#lSjc(;Os@lz|w__8yj^W>M=`fQZ?AX=CE}W zn}LC*!_k={5)!Nn9`!KsoH@2fykXHE@g81@h!~jzY>b&~-#&d}n(+6HLszyai@}Z+F-V^$eg37(8A5T-G@yGywqUHG%>F literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/view-full.png b/themes/greydragon/css/colorpacks/wind/images/view-full.png new file mode 100644 index 0000000000000000000000000000000000000000..e465d36695fad7ad03029fbd8e1b54ea4b2949e5 GIT binary patch literal 537 zcmV+!0_OdRP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0001) zP)t-sJ3Bi)Jv~K5MMg$OO-)TsPEJoxPf$=$QBhG+Qc_h_RaRD3S65e9SXfzESz20J zTU%RPTwGmUU44Che}8{*k++A3hlq%XkB^U#kdTp)k&=>SZpP$Ri%hS`-)YR16+}z^g;^gGy<>lq)=jZF|>+S9B?(XjM^Yird z^n|kOv;Y7A32;bRa{vGi!2kdb!2!6DYwZ9402y>eSaefwW^{L9a%BKeVQFr3E>1;M zAa*k@H7+zhjm&lc006~FL_t(2&yA4B4#F@L1Vatg^xi@M8yh$H|Bqv}J_Urtljbsq zk=|yD&&w9C>cPagJ{EDkoRJ9Q{pNJ``_-Iy80WS{>2|9*aWIeS!5FhYUkw_>z$kSn zZwd{fV5EeRXb=f=uO5un+w!8(AR5M67>fq6Fd@JMG)RDXRuAU;_y5*t_6D(8&q!LM z)gSs!qejvi`9Qe5Q6sX^mWrB^u<{8f`JsXppo9j75W_HDCf7 b00000NkvXXu0mjf1~lf( literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/view-fullsize.png b/themes/greydragon/css/colorpacks/wind/images/view-fullsize.png new file mode 100644 index 0000000000000000000000000000000000000000..58b3e0b471b8503f066676fa3242893124462559 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%!3-qjE#*>x6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZP~e_=LC?PTW3y`R>!F zPoFt+=JMssSFT*SbLY z*ARs=V?9$n6T99sWk5w`o-U3d8t30$ILLQMLBKW8O=nvWx09AbaXS(L4GX%26Zrqa`1y-zm94<6=Bc<&Vx_9W1EuU}h@sqKETpNo>tU!1^R zdM9`C93f@PW4aTI@6EseQtA4s##a*Oz2f{@^8ea@+unbdA>@JJ+=dsLpMWl4@O1Ta JS?83{1OQ!uo!0;W literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/view-info.png b/themes/greydragon/css/colorpacks/wind/images/view-info.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc7a68ea0d6970ddc06d7bcfb26ab9d42ef8de7 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g%!VDyDo&1~%q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N$@$z$e7DxMN}A#O>>L zpE`Z|^ySN!uUxru=gyr+j~+dF^5p5$r_Y~1fBpLP+qZAuy?gih^XD&Lz8Lv%@B{U7 z7I;J!GcfQS0Aa?gYn_}xLCF%=h?3y^w370~qEv=}#LT=BJwMkFg)(D3Q#}*A-ZN!D zMN>Ro977~7Up=>x^N@o`!^8jcuCw_poVq||ZmaK{BaAHJMU!}v9CY3kE!q0fHOa-G zJY98H(|wltohT>s1K Zn3G!?+Ef3|mH@hs!PC{xWt~$(698=Do3Q`@ literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/colorpacks/wind/images/view-left.png b/themes/greydragon/css/colorpacks/wind/images/view-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b51e336884659567c903a75ee1d435cdebef3eba GIT binary patch literal 539 zcmV+$0_6RPP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0001) zP)t-sJ3Bi)Jv~K5MMg$OO-)TsPEJoxPf$=$QBhG+Qc_h_RaRD3S65e9SXfzESz20J zTU%RPTwGmUU44Che}8{*k++A3hlq%XkB^U#kdTp)k&=>SZpP$Ri%hS`-)YR16+}z^g;^gGy<>lq)=jZF|>+S9B?(XjM^Yird z^n|kOv;Y7A32;bRa{vGi!2kdb!2!6DYwZ9402y>eSaefwW^{L9a%BKeVQFr3E>1;M zAa*k@H7+zhjm&lc0075HL_t(2&yA3=4udcZM9)dYR*40=lmUsQo%;XZ!PJiJz|?+0 zoSs931gH{;-g0&>_DO@y3Fy|sD?l+-uAVe@2H>D7A{q+HR|!;70y5^KaIDop2Dt~2 z^wD@W%qK>^ilGoo4^}?>4auJ)-WIMS@878c=nh8p9-@NzeHQ$B)i=m zj-@eHZWvYX#=kV&E)5Z<1Ctn*G^nJ9>dlzb;9i?FcsFTKaXm-rmo#jdr|Q)>mWDK! d^004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0001) zP)t-sJ3Bi)Jv~K5MMg$OO-)TsPEJoxPf$=$QBhG+Qc_h_RaRD3S65e9SXfzESz20J zTU%RPTwGmUU44Che}8{*k++A3hlq%XkB^U#kdTp)k&=>SZpP$Ri%hS`-)YR16+}z^g;^gGy<>lq)=jZF|>+S9B?(XjM^Yird z^n|kOv;Y7A32;bRa{vGi!2kdb!2!6DYwZ9402y>eSaefwW^{L9a%BKeVQFr3E>1;M zAa*k@H7+zhjm&lc007NNL_t(2&yA41P6I&@gFUmS>mt!4X-I*TCRBO<=b(ZT3MzO2 zv|jAVk4RFGJAK-d<@L=tmbiK*Y%YcO3B)J+rkL{qNRU%R5rVok^kNt(!#RYkG${|t z^Tob4fIW%cl~K&1OBv&o^Hb*}ZJ{v?F`9D%-|Q=+zlL*KQ$`_MYw|SD(+mpdtn_Kt zwOHKjp17}#7jj?Bx&5z=Jhve$O++5scqN~Wl&dy$Uv2!&8FhGzCyimGa%a5M jeQm_@@p7+^+ctgysS004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00024 zP)t-sTy~Ucft_!Ko^XeubBLgEh@p3krFo90ev+zxldEx&w}Oj$IH;q)Y;P0)6~?|($(75+1uLN+uYpT*xcaW-{9Qe+9|9?e6aG^Yioc^z^e>p~e6J010qNS#tmY4#5Bb4#5Gqk!$S$000?u zMObuGZ)S9NVRB^vP+@6qbS_RsR3LUUE;TMRK8?(F0001_NklG_HmA)_#vW8YlP0EEpSO{4`ODPxgZm}9#jVz(p z1~qIng8{$I33_kYEhE2%pYRQxq}cc+;tl=Ca2oN1e&qoDrNMu(KPmPD4?kHU47is& P00000NkvXXu0mjf6khul literal 0 HcmV?d00001 diff --git a/themes/greydragon/css/forms.css b/themes/greydragon/css/forms.css index e1fb0c38..ab246779 100644 --- a/themes/greydragon/css/forms.css +++ b/themes/greydragon/css/forms.css @@ -1,33 +1,107 @@ -#sb-content { padding: 0px; margin: 0; } - -#g-exif-data { width: auto; min-height: 90%; margin: 10px; text-align: center; color: #ccc; background-color: #101415; overflow: auto; } -#g-exif-data table { border: #eee 1px solid; font-size: 10pt; } -#g-exif-data .g-even { background-color: #aaa; color: #000; } -#g-exif-data .g-odd { background-color: #999; color: #fff; } - -/* Login dialog ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -form { background: #101415 url('../images/section.png') repeat-x; overflow: hidden; } -form fieldset { border: none; } -form legend { color: #bbb; padding: 6px 0 0 10px; width: 100%; } -form ul { padding: 0; } -form li { padding: 8px 0 0 20px; } -form ul>fieldset>legend { display: none; } -form label { display: block; } -form textarea { width: 98%; } -form input[type="text"], -input[type="password"] { width: 90%; } - -#sb-content.html_ajax textarea { width: 270px; } -#sb-content.html_ajax p.g-error { padding-top: 4px; color: red; } - -#g-text { min-height: 70px; } - -#g-login-form { width: 100%; } -#g-login form ul { min-height: 160px; } -#g-edit-user-form ul { min-height: 276px; } -#g-password-reset { margin-left: 8px; } -#g-edit-album-form fieldset fieldset { border: none; } -#g-edit-album-form fieldset fieldset li { float: left; display: inline; } - -#g-add-photos-form { height: 100%; } \ No newline at end of file +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * CSS rules related to forms/dialogs + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* forms.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +input[type="submit"], .g-button, button { cursor: pointer; /* hand-shaped cursor */ cursor: hand; /* for IE 5.x */ font-size: 0.8em; color: #333 !important; padding: 2px 10px; margin-top: 0.4em; border: 1px solid; border-color: #999 #666 #666 #999; background-color: #ddd; font-weight: normal; } + +#sb-content.html_ajax { padding: 0 0.8em; margin: 0; } +#sb-content.html_ajax p.g-error { padding-top: 0.4em; } + +#sb-content.html_ajax form { background-color: #101415; overflow: hidden; } +#sb-content.html_ajax form fieldset { border: none; } +#sb-content.html_ajax form legend { display: none; width: 100%; } +#sb-content.html_ajax form ul { padding: 0; } +#sb-content.html_ajax form li { padding-top: 0.2em; } +#sb-content.html_ajax form>fieldset>ul { margin: 0 2px; } +#sb-content.html_ajax form label { display: block; padding: 0.2em 0; } +#sb-content.html_ajax form textarea { width: 99%; height: 4em; } +#sb-content.html_ajax input[type="submit"]{ margin: 6px 0; } +#sb-content.html_ajax input[type="text"], +#sb-content.html_ajax input[type="password"] { width: 99%; } +#sb-content.html_ajax>div { height: 94%; padding-top: 0.2em; overflow: auto; } +#sb-content #g-text { min-height: 6em; } + +#sb-content fieldset fieldset { border: none; } +#sb-content fieldset fieldset li { float: left; display: inline; margin-right: 1em; } + +/* forms.css - Login ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-login-form { width: 100%; } +#sb-content #g-login form ul { min-height: 10em; } +#sb-content #g-password-reset { margin-left: 0.4em; } + +/* forms.css - Edit Permissions ~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-permissions fieldset { border: none; margin: 1px; overflow: auto; width: 100%; } +#sb-content #g-permissions .g-breadcrumbs { position: static; padding: 0.4em; font-size: small; margin: 0.4em 0; } +#sb-content #g-permissions .g-breadcrumbs .g-first { padding-left: 0; } + +#sb-content #g-edit-permissions-form { margin: 0.4px 0; } +#sb-content #g-edit-permissions-form>fieldset>legend { display: none; } +#sb-content #g-edit-permissions-form>fieldset>table { font-size: small; } +#sb-content #g-edit-permissions-form>fieldset>table th, +#sb-content #g-edit-permissions-form>fieldset>table td { padding: 1px 2px; } + +/* forms.css - Delete Item ~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-confirm-delete { height: 5em; padding: 0.8em 0 0 0; } + +/* forms.css - Move Item ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-move>ul { height: 290px; margin-bottom: 0.4em; padding: 10px; overflow: auto; } +#sb-content #g-move>form { background: none; } + +/* forms.css - Add photo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-add-photos-form { height: 96%; } +#sb-content #g-add-photos-form .g-breadcrumbs { position: static; margin: 4px 0 0 0; padding: 4px; font-size: x-small; } +#sb-content #g-add-photos-form .g-breadcrumbs li { padding-top: 0; } +#sb-content #g-add-photos-form .g-breadcrumbs .g-first { padding-left: 0; } + +#g-add-photos-canvas { margin-top: 4px; height: 100px; } +#g-add-photos-button { padding: 2px 8px; z-index: 10; zoom: 1; } +#g-uploadifyUploader { z-index: 1005; zoom: 1; } +#g-uploadifyQueue { overflow: auto; height: 100%; } +#g-add-photos-status { margin-top: 4px; height: 90px; overflow: auto; } +#g-add-photos-status #g-action-status { margin: 0 0 1px 0; width: 100%; } +#g-add-photos-status #g-action-status li { margin: 0 0 1px 0; padding: 2px 0; text-indent: 30px; width: 100%; } + +/* forms.css - Organize ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content.html_ajax #g-organize { height: 440px; } +#g-organize #g-organize-content-pane { display: block; height: 440px; width: 690px; margin: 0 !important; overflow: hidden; } +#g-organize #g-organize-content-pane>div { float: left; height: 440px; } +#g-organize #g-organize-content-pane #g-organize-tree-container { overflow: auto; width: 164px; height: 428px; padding: 0 2px 0 4px !important; } +#g-organize #g-organize-detail { width: 518px; } +#g-organize #g-organize-detail .g-message-block li { padding: 0; } +#g-organize #g-organize-tree-container>ul { font-size: x-small; } +#g-organize #g-organize-tree-container>ul ul { padding: 0px; } +#g-organize #g-organize-album-tree { padding: 0; } +#g-organize .g-message-block { padding: 4px 0 4px 10px; } +#g-organize-microthumb-panel { background-color: transparent; border: none; height: 360px; } +#g-organize-microthumb-grid { position: static; height: 360px; border-style: none; padding: 0 2px !important; } +.g-organize-microthumb-grid-cell { float: left; margin: 2px; } +.g-organize-microthumb-grid-cell .ui-icon-note { background-position: -194px -144px; left: 8px; bottom: 4px; } +#g-organize-controls { position: absolute; background-color: transparent; padding: 6px 10px; } +#g-organize-controls li { display: inline; } +.g-organize-album-text { border: transparent 1px solid; } +#g-organize-close { display: none; } + +/* forms.css - User Profile ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-user-profile h1 { padding-bottom: 1px; margin: 0 0; } +#g-user-profile>div { margin: 2em 0 1em 10em; } +#g-user-profile .g-block-content { text-align: left; } +#g-user-profile .g-avatar { float: left; padding: 2px; } + +#g-user-profile th { text-align: left; padding-right: 20px; } +#g-change-email-user-form { min-height: 200px; } +#g-edit-user-form ul { min-height: 200px; } + +#g-quick-search-form input[type="submit"] { filter: none; margin-top: 0; } \ No newline at end of file diff --git a/themes/greydragon/css/layout.css b/themes/greydragon/css/layout.css index 18b76412..db55e4af 100644 --- a/themes/greydragon/css/layout.css +++ b/themes/greydragon/css/layout.css @@ -1,21 +1,38 @@ -html { overflow: auto; } -* { margin: 0px; } -body { min-width: 73em; padding: 0; margin: 0; } - -#g-header { position: relative; min-width: 73em; z-index: 5; } -#g-main, #g-main-in { min-width: 72.7em; height: auto; bottom: auto; } -#g-footer { position: relative; height: auto; min-width: 73em; clear: both; display: block; overflow: auto; } - -#g-column-left { float: left; width: 18em; min-height: 32em; overflow: hidden; height: 100%; } -#g-column-right { float: right; width: 18em; min-height: 32em; overflow: hidden; height: 100%; } -#g-column-center { margin: 0 19em 0 19em; min-height: 32em; overflow: hidden; height: 100%; } -#g-column-centerleft { margin: 0 19em 0 0; min-height: 32em; overflow: hidden; height: 100%; } -#g-column-centerright { margin: 0 0 0 19em; min-height: 32em; overflow: hidden; height: 100%; } -#g-column-centerfull { position: relative; margin: 0 0; min-height: 31em; overflow: hidden; height: 100%; } - -#g-footer-leftside { float: left; display: inline; } -#g-footer-rightside { float: right; display: inline; } - -.g-hideitem { display: none; } - -#g-main-in { overflow: auto; height: 100%; } \ No newline at end of file +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * CSS rules related to general layout + * Defined as 70em wide + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* layout.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +html { overflow: auto; overflow: -moz-scrollbars-vertical; overflow-y: scroll; } +* { margin: 0px; } +body { min-width: 70em; padding: 0; margin: 0; } + +.g-hideitem { display: none; } + +/* layout.css - Header ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-header { position: relative; min-width: 70em; z-index: 5; } + +/* layout.css - Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-main { min-width: 69.7em; height: auto; bottom: auto; } +#g-main-in { min-width: 69.7em; height: 100%; overflow: auto; bottom: auto; } +#g-column-left { float: left; width: 16em; min-height: 32em; overflow: hidden; height: 100%; } +#g-column-right { float: right; width: 16em; min-height: 32em; overflow: hidden; height: 100%; } +#g-column-center { margin: 0 17em 0 17em; min-height: 32em; overflow: hidden; height: 100%; } +#g-column-centerleft { margin: 0; min-height: 32em; overflow: hidden; height: 100%; } +#g-column-centerright { margin: 0; min-height: 32em; overflow: hidden; height: 100%; } +#g-column-centerfull { position: relative; margin: 0 0; min-height: 31em; overflow: hidden; height: 100%; } + +/* layout.css - Footer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-footer { position: relative; height: auto; min-width: 70em; min-height: 4em; clear: both; display: block; overflow: auto; } +#g-footer-leftside { float: left; display: inline; } +#g-footer-rightside { float: right; display: inline; } + diff --git a/themes/greydragon/css/menus.css b/themes/greydragon/css/menus.css index 1e27610c..3ba173f2 100644 --- a/themes/greydragon/css/menus.css +++ b/themes/greydragon/css/menus.css @@ -1,27 +1,56 @@ -#g-site-menu { position: absolute; bottom: 0px; left: 310px; } -#g-site-menu ul { float: left; padding: 0px; margin: 0px; width: 100%; border: #000000 0px solid; white-space: nowrap; z-index: 100; } -#g-site-menu a { display: block; padding: 3px 5px 4px 5px; text-align: center; width: auto; letter-spacing: 0px; cursor: pointer; } -#g-site-menu li { float: left; padding: 0px; background-color: transparent; border: transparent 1px solid; } -#g-site-menu li a:hover { color: #000000; cursor: pointer; background-color: #303030; } -#g-site-menu li:hover, -#g-site-menu li.iemhover { border: #303030 1px solid; background-color: #303030; border-bottom: #000000 1px solid; } -#g-site-menu li ul a { text-align: left; padding: 4px 0px; text-indent: 8px; letter-spacing: 0px; cursor: pointer; } -#g-site-menu li ul a:hover { background-image: none; cursor: pointer; } -#g-site-menu li ul { border: #000000 1px solid; position: absolute; margin: 0px 0px 0px -1px; width: 135px; height: auto; left: -999em; } -#g-site-menu li ul li { border: #C0C0C0 0px solid; background-color: #212121; } -#g-site-menu li ul li:hover, -#g-site-menu li ul li.iemhover { border: #C0C0C0 0px solid; background-color: #303030; } - -#g-site-menu li li { width: 135px; padding-right: 0px; } -#g-site-menu li ul a { width: 135px; } -#g-site-menu li ul ul { margin: -21px 0px 0px 135px; } -#g-site-menu li:hover ul ul, -#g-site-menu li:hover ul ul ul, -#g-site-menu li.iemhover ul ul, -#g-site-menu li.iemhover ul ul ul { left: -999em; } -#g-site-menu li:hover ul, -#g-site-menu li li:hover ul, -#g-site-menu li li li:hover ul, -#g-site-menu li.iemhover ul, -#g-site-menu li li.iemhover ul, -#g-site-menu li li li.iemhover ul { left: auto; } +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * CSS rules related to menus + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* menus.css - Main menu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-site-menu { position: absolute; left: 24em; } +#g-site-menu.default { bottom: 0; } +#g-site-menu.top { top: 0; } +#g-site-menu ul { float: left; padding-left: 0; width: 100%; white-space: nowrap; z-index: 10; } +#g-site-menu ul ul ul { padding-top: 0; } +#g-site-menu a { display: block; padding: 0.2em 0.4em; text-align: center; width: auto; letter-spacing: 0; cursor: pointer; } +#g-site-menu li { float: left; padding: 0; background-color: transparent; border: transparent 1px solid; z-index: 10; } +#g-site-menu li a:hover { cursor: pointer; } +#g-site-menu li ul a { text-align: left; padding: 0.3em 0; text-indent: 0.8em; letter-spacing: 0; cursor: pointer; } +#g-site-menu li ul a:hover { background-image: none; cursor: pointer; } +#g-site-menu li ul { position: absolute; margin: 0 0 0 -1px; width: 14em; height: auto; left: -999em; } + +#g-site-menu li li { width: 14em; padding-right: 0; } +#g-site-menu li ul a { width: 14em; } +#g-site-menu li ul ul { margin: -1.9em 0 0 14em; } +#g-site-menu li:hover ul ul, +#g-site-menu li:hover ul ul ul, +#g-site-menu li.iemhover ul ul, +#g-site-menu li.iemhover ul ul ul { left: -999em; } +#g-site-menu li:hover ul, +#g-site-menu li li:hover ul, +#g-site-menu li li li:hover ul, +#g-site-menu li.iemhover ul, +#g-site-menu li li.iemhover ul, +#g-site-menu li li li.iemhover ul { left: auto; } + +#g-site-menu>ul>li>ul { display: none; } + +#g-site-menu .ui-icon-rotate-ccw, +#g-site-menu .ui-icon-rotate-cw { display: none; } + +/* menus.css - Context menu ~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-item .g-context-menu { position: absolute; margin: 0; padding: 0; top: 6px; left: 196px; width: 14px; height: 14px; background-position: -178px -144px; z-index: 3; } +.g-item .g-context-menu li { width: 100%; padding: 0; margin: 0; text-indent: -9999px; } +.g-item .g-context-menu>li>a { font-size: 0em; } +.g-item .g-context-menu:hover { top: 4px; left: 6px; width: 200px; height: auto; z-index: 100; } +.g-item .g-context-menu ul { padding: 0; margin: 0; } +.g-item .g-context-menu li li { display: none; } +.g-item .g-context-menu li li a { display: block; padding: 4px 6px; } +.g-item .g-context-menu:hover li li { display: block; text-indent: 0px; } +.g-item .g-context-menu li li a.ui-icon-rotate-ccw, +.g-item .g-context-menu li li a.ui-icon-rotate-cw { display: none; } + +.g-item.g-detail .g-context-menu { left: auto; right: 6px; } +.g-item.g-detail .g-context-menu:hover { left: auto; right: 6px; } \ No newline at end of file diff --git a/themes/greydragon/css/modules.css b/themes/greydragon/css/modules.css new file mode 100644 index 00000000..371434f8 --- /dev/null +++ b/themes/greydragon/css/modules.css @@ -0,0 +1,135 @@ +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * CSS rules related to modules + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* modules.css - ShadowBox Skin ~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-title { overflow: hidden; } +#sb-title-inner { font-size: 10pt; font-weight: bold; padding-left: 10px; } +#sb-nav #sb-nav-close { background-image: url('../images/close.png'); width: 60px; } +#sb-container > #sb-overlay { min-height: 530px; overflow: auto; } + +/* modules.css - Exif Data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#sb-content #g-exif-data { width: auto; background-image: none; } +#sb-content #g-exif-data table { width: 100%; } +#sb-content #g-exif-data td { padding: 0.4em; } + +/* modules.css - Image Block ~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-image-block>div { margin-left: 1px; margin-right: 1px; } +.g-image-block { text-align: center; } +.g-image-block img { padding: 5px; } + +/* modules.css - RSS Feeds ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +ul#g-feeds { padding: 0; margin: 0; } + +/* modules.css - Tags ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-tag-cloud ul { padding: 0; font-size: 100%; } +#g-tag-cloud ul li { line-height: 1.2em; } +#g-tag-cloud ul li span { display: none; } +#g-add-tag-form { display: none; } + +/* modules.css - Comments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-comments { margin-top: 2em; padding-top: 0.4em; float: left; width: 100%; } +#g-comments ul li { margin: 0.4em 0; } +#g-comments .g-author { height: 32px; line-height: 32px; } +#g-comments .g-avatar { height: 32px; margin-right: .4em; width: 32px; } + +#g-admin-comment-button { width: 27px; right: 0.2em; text-indent: -900em; } +#g-comments-link { background-position: top left; background-repeat: no-repeat; } +#g-comments-link:hover { background-position: left bottom; } +#g-comment-detail ul { margin-top: 2em; padding: 0; } +#g-comment-detail>ul>li { margin: 4px 0; padding: 6px; min-height: 40px; } +#g-comment-detail div { margin-top: 6px; padding-bottom: 8px; } + +#g-comment-form fieldset { border: none; } +#g-comment-form legend { display: none; width: 100%; } +#g-comment-form ul { padding: 0; } +#g-comment-form>fieldset>ul { margin: 0px 10px; } +#g-comment-form label { display: block; } +#g-comment-form textarea { width: 99%; height: 140px; } +#g-comment-form input[type="text"], +#g-comment-form input[type="password"] { width: 99%; } + +/* modules.css - Gallery Stats ~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-gallerystats ul { padding: 0; font-size: x-small; } + +/* modules.css - Info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-metadata ul { padding: 0; } +#g-metadata .g-description { margin-top: 0.4em; padding: 0.4em 0; } + +/* modules.css - Calendar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-calendarview-link:hover { background-position: left bottom; } + +#g-view-calendar-form fieldset { border: none; } +#g-view-calendar-form ul { padding: 8px; } +#g-view-calendar-form li { padding-top: 8px; display: inline; padding-left: 10px; } +#g-view-calendar-form label { margin: 4px 0; } +#g-view-calendar-form select { margin: 4px 10px; } + +table.calendar { border-spacing: 1px; } +table.calendar td.title a { font-weight: bold; } + +/* modules.css - ClustrMaps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-clustrmaps .g-block-content { text-align: center; } + +/* modules.css - GPS Info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-exif-gps-maps ul { padding-left: 0; } + +/* modules.css - Search ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-quick-search-form { position: absolute; top: 3em; right: 1em; background: none transparent; } +#g-quick-search-form label { display: none; } +#g-quick-search-form li { display: inline; float: left; padding: 0px; } + +#g-quick-search-form input[type="text"] { width: 150px; } +#g-quick-search-form input[type="submit"] { display: block; width: 23px; height: 23px; text-indent: -9999px; overflow: hidden; } + +/* modules.css - Basket ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +.basketbuttons span.ui-icon { display: none; } +#payment { height: 100%; margin-left: 10px; } +#payment p { padding: 4px; } +#basketForm { width: 100%; float:right; } +#checkout { } +#checkout fieldset { border: none; } +#checkout legend { width: 100%; padding: 4px 4px 4px 8px; font-size: 1em; font-weight: bold; } +#checkout ul { padding: 8px; } +#checkout li { padding-top: 8px; display: inline; } +#checkout label { margin: 4px 0; } +#checkout select { margin: 4px 10px; } + +#checkout textarea { display: block; clear: both; padding: .2em; width: 90%; } + +/* modules.css - Register ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-welcome-message p { padding-bottom: 6px; } +#g-change-password-user-form { height: 100%; } + +/* modules.css - Localization ~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#l10n-client .labels { border-top: white 1px solid; height: 1.7em; } +#l10n-client h2 { padding-top: 0.4em; padding-bottom: 0.3em; } +#l10n-client .label.translation { margin-top: -0.4em; height: 1.7em; } +#l10n-client #l10n-client-toggler { line-height: 1.7em; height: 1.7em; } +#l10n-client .string-list li { font-size: 0.8em; line-height: 1.1em; } +#l10n-client #l10n-client-string-select { width: 24%; } +#l10n-client #l10n-client-string-select .string-list { border: 1px #ccc solid; } +#l10n-client #g-l10n-search-form ul { padding: 0; } +#l10n-client #l10n-client-string-editor { margin-left: 1em; } +#l10n-client-string-editor .source .source-text { margin: 0 0.4em 0 0; border: 1px #ccc solid; padding: 0.4em; line-height: 1em; } +#l10n-client-string-editor .translation { height: 19em; } +#l10n-client #l10n-edit-translation { width: 97%; height: 17em; border: 1px #ccc solid; font-family: monospace; padding: 0.4em; } diff --git a/themes/greydragon/css/old_ie.css b/themes/greydragon/css/old_ie.css index 70556d49..9a5da7b8 100644 --- a/themes/greydragon/css/old_ie.css +++ b/themes/greydragon/css/old_ie.css @@ -1,4 +1,16 @@ -body { word-wrap: break-word; } - -.g-item .g-metadata:hover { padding: 0px 0 4px 6px; } -#g-quick-search-form input[type="submit"] { padding: 60px 0 0 0; } +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * CSS rules - IE 6 hacks + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* old_ie.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +body { word-wrap: break-word; font-size: 100.1%; } + +.g-item .g-metadata:hover { padding: 0px 0 4px 6px; } +#g-quick-search-form input[type="submit"] { padding: 60px 0 0 0; } +#g-column-centerleft { margin: 0 19em 0 0; } +#g-column-centerright { margin: 0 0 0 19em; } diff --git a/themes/greydragon/css/screen.css b/themes/greydragon/css/screen.css index 974521a1..17ecf082 100644 --- a/themes/greydragon/css/screen.css +++ b/themes/greydragon/css/screen.css @@ -1,211 +1,224 @@ -/** - * Gallery 3 Grey Dragon Theme - * Copyright (C) 2006-2009 Serguei Dosyukov - * - * 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. - */ - -@import url(layout.css); -@import url(forms.css); - -html { background-color: #1A2022; overflow: -moz-scrollbars-vertical; overflow-y: scroll; } -body { background: url(../images/background.gif) #1A2022 repeat-x; color: #BBB; font: 0.8em Arial, verdana, sans-serif; } - -a { color: #6392CF !important; text-decoration: none; outline: none; -moz-outline-style: none; } -a:focus, a:active, a:hover { text-decoration: none; outline: none; } -img { border: none; } -p { font-size: small; text-indent: 0; } -ul { list-style: none none; } -input[type="submit"] { cursor: pointer; /* hand-shaped cursor */ cursor: hand; /* for IE 5.x */ } - -h1 { font-weight: bold; font-size: 1.2em; } -h2 { font-weight: bold; font-size: 1.2em; } -h3 { font-weight: bold; } -h4 { font-weight: bold; } -h5 { font-weight: bold; } - -/* Common elements ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -.txtright { text-align: right; } -.g-metadata { overflow: hidden; } - -.ui-icon { display: inline-block; zoom: 1; width: 16px; height: 16px; background-image: url(../images/ui-icons.png); } -.ui-icon-first { background-position: -32px -162px; } -.ui-icon-first-d { background-position: -162px -162px; } -.ui-icon-prev { background-position: -48px -162px; } -.ui-icon-prev-d { background-position: -178px -162px; } -.ui-icon-next { background-position: -64px -162px; } -.ui-icon-next-d { background-position: -194px -162px; } -.ui-icon-last { background-position: -80px -162px; } -.ui-icon-last-d { background-position: -210px -162px; } -.ui-icon-signal-diag { background-position: -16px -178px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-comment { background-position: -227px -219px; width: 27px; height: 20px; } -.ui-icon-left .ui-icon { float: left; margin-right: .2em; } -.ui-icon-right .ui-icon { float: right; margin-left: .2em; } - -.g-resize { border: 1px solid #888; padding: 5px; background: #555; } - -/* Header section ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -#g-header { height: 90px; padding: 0; font-size: 80%; } -#g-logo { position: absolute; top: 8px; left: 16px; } - -#g-login-menu { position: absolute; bottom: 10px; right: 14px; background-color: transparent; } -#g-login-menu li { display: inline; padding-left: 1.2em; } - -.g-breadcrumbs { position: absolute; bottom: 4px; right: 14px; background-color: transparent; } -.g-breadcrumbs li { display: inline; padding-left: 1em; background: transparent url('../images/ico-separator.png') no-repeat 0 2px; } -.g-breadcrumbs li.g-first { background-image: none; } - -/* Main section ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -#g-main { display: block; margin: 0; } -#g-main-in { display: block; position: relative; } - -#g-column-center, #g-column-centerleft { padding: 6px 6px 6px 16px; } -#g-column-centerfull { padding: 6px 12px 6px 10px; } -#g-column-centerright { padding: 6px 12px 6px 6px; } -#g-column-left { padding: 6px 4px 6px 10px; } -#g-column-right { padding: 6px 10px 6px 4px; } - -/* Pagination ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -.g-paginator { display: inline-block; width: 100%; padding: 4px 0 0 0; font-size: 80%; zoom: 1; } -.g-paginator li { display: inline; float: left; margin-left: 0; zoom: 1; } -.g-paginator a { padding: 0 0 0 2px; } - -.g-paginator .g-pagination { width: 80%; padding-top: 2px; } -.g-paginator .g-navigation { text-align: right; width: 20%; } - -/* Album grid ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -.g-thumbcrop { overflow: hidden; position: relative; width: 200px; height: 150px; } -#g-album-grid { padding: 6px 0 0 0; width: 100%; } -#g-album-grid .g-item { position: relative; float: left; padding: 10px 9px 0px 9px; width: 30.5%; height: 190px; background: url('../images/image_thumb.gif') no-repeat; } -#g-album-grid .g-item p { text-align: center; } -#g-album-grid h2 { position: absolute; top: 164px; left: 12px; width: 150px; font: 100%/100% Arial, Helvetica, sans-serif; } -#g-album-grid h2 a { display: block; margin-top: 4px; font: bold 70% Arial, Helvetica, Verdana, Sans-Serif; letter-spacing: 0.1em; text-transform: uppercase; min-height: 2em; } -#g-album-grid .g-album h2 { padding-left: 20px; background: url('../images/ico-album.png') no-repeat 0px 2px; } - -.g-item .g-metadata { display: block; position: absolute; margin: 0; padding: 0; top: 172px; left: 198px; width: 14px; height: 14px; background: url(../images/ui-icons.png) -162px -144px; } -.g-item .g-metadata li { padding: 0; margin: 0; text-indent: -9999px; font: bold 70% Arial, Helvetica, Verdana, Sans-Serif; letter-spacing: 0.1em; } -.g-item .g-metadata:hover { padding: 4px 0 0 6px; top: 148px; left: 6px; width: 198px; height: 32px; background: #181818 none; border: 1px #888 solid; z-index: 100; } -.g-item .g-metadata:hover li { text-indent: 0px; } - -.g-item .g-context-menu { position: absolute; margin: 0; padding: 0; top: 6px; left: 198px; width: 14px; height: 14px; background: url(../images/ui-icons.png) -178px -144px; } -.g-item .g-context-menu li { width: 100%; padding: 0; margin: 0; text-indent: -9999px; font: bold 70% Arial, Helvetica, Verdana, Sans-Serif; letter-spacing: 0.1em; } -.g-item .g-context-menu:hover { top: 4px; left: 6px; width: 204px; height: auto; background: #181818 none; border: 1px #888 solid; z-index: 100; } -.g-item .g-context-menu ul { display: block; padding: 0; margin: 0; } -.g-item .g-context-menu li li { display: none; font-size: 100%; width: 100%; } -.g-item .g-context-menu li li a { display: block; padding: 4px 6px; } -.g-item .g-context-menu:hover li li { display: block; text-indent: 0px; } -.g-item .g-context-menu li li a:hover { background-color: #303030; } - -.ul-table { text-align: center; margin: 0px auto; padding: 0; list-style-type: none; clear: both; } -.ul-table li { float: left; text-align: center; } - -#g-info { } -#g-info h1 { padding-bottom: 1px; border-bottom: 1px solid #888; } -#g-info .g-description { display: none; } -/* #g-info h1:hover .g-description { position: relative; z-index: 10; top: 10px; left: 0px; width: 90%; display: block; afloat: left; border: 1px solid #888; padding: 6px; }*/ -#g-photo { padding: 6px 0 6px 6px; text-align: center; } -#g-albumheader h1 { padding-bottom: 1px; margin-bottom: 6px; border-bottom: 1px solid #888; } - -/* Footer section ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -#g-footer { padding: 6px 6px 6px 14px; background: url('../images/footer.png') #1A2022 repeat-x top !important; zoom: 1; font-size: 80%; } -#g-footer ul { float: left; color: #999; padding: 0; text-align: left; } -#g-footer li { padding: 0 0 2px 0; } - -#g-visitors { float: left; display: inline; margin: 3px 4px 3px 12px; } -#g-copyright { font-size: x-small; color: #808080; } - -#g-footer-rightside { padding-right: 6px; text-align: right; } - -/* Design blocks ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -#g-quick-search-form { position: absolute; top: 10px; right: 14px; background: none transparent; } -#g-quick-search-form label { display: none; } -#g-quick-search-form li { display: inline; float: left; padding: 0px; } - -#g-quick-search-form input[type="text"] { background-color: transparent; border: 1px solid #737373; color: #BBB; width: 150px; /* margin-left: 2px; */ } -#g-quick-search-form input[type="submit"] { display: block; width: 23px; height: 23px; text-indent: -9999px; background: transparent url(../images/search.png) no-repeat center top; border: none; overflow: hidden; } - -#g-search-results h1 { border-bottom: #888 1px solid; } - -/* Sidebar Blocks ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -/* Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -.g-block { margin-bottom: 0.5em; padding-bottom: 4px; border: 1px solid #737373; background-color: #101415; position: relative; } -.g-block h2 { padding: 4px; font-size: 1.2em; background: url('../images/section.png') repeat-x; } -.g-block-content { margin: 4px 10px 0 10px; display: block; zoom: 1; } - -/* Image Block ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -#g-image-block>div { margin-left: 1px; margin-right: 1px; } -.g-image-block { text-align: center; } -.g-image-block img { border: 1px solid #888; background: #555; padding: 5px; } - -/* Feeds Block ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ul#g-feeds { padding: 0; margin: 0; } - -/* Tags and cloud ~~~~~~~~~~~~~~~~~~~~~~~~ */ -#g-tag-cloud ul { padding: 0; font-size: 100%; } -#g-tag-cloud ul li { line-height: 1.2em; } -#g-tag-cloud ul li span { display: none; } -#g-add-tag-form { display: none; } - -/* Comments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -#g-admin-comment-button { width: 27px; right: 10px; text-indent: -900em; } -.g-avatar { float: right; } -#g-comments-link { background: url('../images/view-comments.png') top left no-repeat; } -#g-comments .g-block-content { margin: 0; } -#g-comment-detail ul { padding: 0px; } -#g-comment-detail > ul > li { margin: 4px; padding: 6px; min-height: 40px; border: 1px dotted #737373; } -#g-comment-detail div { margin-right: 48px; margin-top: 8px; } - -/* Buttons ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -#g-viewformat { z-index: 5; position: absolute; padding: 0; top: 6px; right: 10px; } -#g-viewformat li { float: left; margin-right: 2px; } -#g-viewformat .g-viewthumb-left { background: url('../images/view-left.png') no-repeat left top; } -#g-viewformat .g-viewthumb-right { background: url('../images/view-right.png') no-repeat left top; } -#g-viewformat .g-viewthumb-full { background: url('../images/view-full.png') no-repeat left top; } -#g-viewformat span { line-height: 1px; text-indent: -900em; width: 17px; display: block; height: 15px; } -#g-viewformat span:hover, -#g-viewformat span.g-viewthumb-current { background-position: left bottom; } - -#g-view-menu { position: absolute; top: 6px; right: 70px; height: 16px; z-index: 5; zoom: 1; margin: 0 0 6px 0; padding: 0 0 4px 0; } -.g-toolbar { height: 16px; zoom: 1; margin: 0 0 4px 0; padding: 0 0 3px 0; border-bottom: 1px solid #737373; } -.g-menu { margin: 0; padding: 0; text-align: left; } -.g-menu li { display: inline; } - -.g-menu-element, -.g-menu-link { display: inline; float: left; margin-right: 4px; } - -.g-buttonset ul { height: 16px; } -.g-buttonset .g-menu-link { text-indent: -99999px; width: 22px; height: 15px; } - -#g-slideshow-link { background: url("../images/view-slideshow.png") top left no-repeat; } -.g-fullsize-link { background: url("../images/view-fullsize.png") top left no-repeat; } -#g-exifdata-link { background: url("../images/view-info.png") top left no-repeat; } - -#g-slideshow-link:hover, .g-fullsize-link:hover, #g-exifdata-link:hover, #g-comments-link:hover { background-position: left bottom; } - -/* ShadowBox Skin ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -#sb-body { background: #101415 url('../images/ajax-loading.gif') no-repeat center center; } -#sb-title-inner { display: none; } -#sb-nav #sb-nav-close { background-image: url('../images/close.png'); width: 60px; } - -.clear { clear: both; margin-top: -1px; height: 1px; overflow: hidden; } - -.g-message-block { position: absolute; z-index: 10; min-width: 30em; padding: 4px 6px; right: 10px; top: 34px; border: 1px #888 solid; background-color: #AAA; overflow: hidden; color: #000; font: bold 9pt Arial, verdana, sans-serif; text-align: center; } +/** + * Gallery 3 Grey Dragon Theme + * Copyright (C) 2006-2010 Serguei Dosyukov + * + * CSS rules - Kitchen sync + * + * Color rules for font/background/lines can be found in dedicated colorpack files + */ + +@import url(layout.css); +@import url(menus.css); +@import url(forms.css); +@import url(modules.css); + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* screen.css - Common ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +body { font-family: Arial, verdana, sans-serif; font-size: 0.9em; } + +a { text-decoration: none; outline: none; -moz-outline-style: none; } +a:focus, a:active, a:hover { text-decoration: none; outline: none; } +img { border: none; } +p { text-indent: 0; } +ul { list-style: none none; } + +h1 { font-weight: bold; font-size: 1.1em; padding-bottom: 1px; } +h2 { font-weight: bold; font-size: 1.1em; } +h3 { font-weight: bold; } +h4 { font-weight: bold; } +h5 { font-weight: bold; } + +.txtright { text-align: right; } +.g-metadata { overflow: hidden; } +.g-avatar { float: right; } + +.ui-icon { display: inline-block; zoom: 1; width: 16px; height: 15px; } +.ui-icon-first { background-position: -162px -178px; } +.ui-icon-first-d { background-position: -162px -162px; } +.ui-icon-prev { background-position: -178px -178px; } +.ui-icon-prev-d { background-position: -178px -162px; } +.ui-icon-parent { background-position: -226px -178px; } +.ui-icon-parent-d { background-position: -226px -162px; } +.ui-icon-next { background-position: -194px -178px; } +.ui-icon-next-d { background-position: -194px -162px; } +.ui-icon-last { background-position: -210px -178px; } +.ui-icon-last-d { background-position: -210px -162px; } +.ui-icon-signal-diag { background-position: -16px -178px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-plus { background-position: -14px -129px; } +.ui-icon-minus { background-position: -46px -129px; } +.ui-icon-note { background-position: -66px -98px; } + +.ui-icon-comment { background-position: -227px -219px; width: 27px; height: 20px; } +.ui-icon-left .ui-icon { float: left; margin-right: .2em; } +.ui-icon-right .ui-icon { float: right; margin-left: .2em; } + +/* screen.css - Header ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-header { height: 90px; padding: 0; font-size: 0.9em; } + +#g-logo { position: absolute; top: 8px; left: 16px; } + +.g-breadcrumbs { position: absolute; bottom: 4px; background-color: transparent; } +.g-breadcrumbs.default { right: 14px; } +.g-breadcrumbs.left { left: 304px; padding-left: 0; } +.g-breadcrumbs li { display: inline; padding-left: 1em; padding-right: 0.4em; } +.g-breadcrumbs li.g-first { background-image: none; } +.g-breadcrumbs li.g-active { padding-right: 0; } + +#g-header .g-message-block { position: absolute; z-index: 10; min-width: 30em; padding: 4px 6px; right: 20em; top: 34px; overflow: hidden; font: bold 9pt Arial, verdana, sans-serif; text-align: center; } + +#g-header #g-login-menu { position: absolute; top: 0.5em; right: 1em; background-color: transparent; display: none; } + +/* screen.css - Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-main { display: block; margin: 0; } +#g-main-in { display: block; position: relative; } + +#g-column-center, #g-column-centerleft { padding: 6px 6px 6px 16px; } +#g-column-centerfull { padding: 6px 12px 6px 10px; } +#g-column-centerright { padding: 6px 12px 6px 6px; } +#g-column-left { padding: 6px 4px 6px 10px; } +#g-column-right { padding: 6px 10px 6px 4px; } + +/* screen.css - Footer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-footer { padding: 6px 6px 6px 14px; zoom: 1; font-size: 0.9em; } +#g-footer ul { float: left; padding: 0; text-align: left; } +#g-footer li { padding: 0 0 2px 0; } + +#g-footer #g-login-menu { position: absolute; bottom: 0.5em; right: 1em; background-color: transparent; display: none; } + +#g-login-menu li { display: inline; padding-left: 1.2em; } +#g-logout-link { float: none; margin-right: 0; } + +#g-copyright { font-size: x-small; } +#g-footer #g-footer-rightside { float: right; padding-right: 6px; text-align: right; } +#g-credits { margin-right: 14px; } + +/* screen.css - Pagination ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-paginator { display: inline-block; width: 100%; padding: 4px 0 0 0; zoom: 1; } +.g-paginator li { display: inline; float: left; margin-left: 0; zoom: 1; } +.g-paginator a { padding: 0 0 0 2px; } + +.g-paginator .g-pagination { width: 80%; font-size: 0.8em; } +.g-paginator .g-navigation { text-align: right; width: 20%; } + +/* screen.css - Album grid ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-album-grid { padding: 6px 0 0 0; width: 100%; display: inline-block; } +#g-album-grid .g-item { position: relative; float: left; margin: 4px 0; min-width: 212px; width: 33%; zoom: 1; } /* amargin-right: 10px; */ +#g-album-grid .g-extra-column { width: 23%; } +#g-album-grid .g-item p { text-align: center; } +#g-album-grid h2 { position: absolute; top: 164px; left: 12px; width: 150px; font: 100%/100% Arial, Helvetica, sans-serif; } +#g-album-grid h2 a { display: block; margin-top: 4px; font: bold 0.8em Arial, Helvetica, Verdana, Sans-Serif; letter-spacing: 0.1em; text-transform: uppercase; min-height: 2em; } + +/* screen.css - Thumbs : Common ~~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-thumbcrop { overflow: hidden; position: relative; width: 200px; min-height: 133px; } + +.g-thumbtype-flm .g-thumbcrop { height: 150px; } +.g-thumbtype-dgt .g-thumbcrop { height: 133px; } +.g-thumbtype-sqr .g-thumbcrop { height: 200px; } +.g-album .g-description strong { padding-left: 16px; } + +/* screen.css - Thumbs : Overlay ~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-thumbslide { font-size: 0.9em; width: 208px; min-height: 139px; padding-top: 6px; padding-left: 6px; } +.g-thumbslide.g-thumbtype-flm { height: 158px; } +.g-thumbslide.g-thumbtype-dgt { height: 141px; } +.g-thumbslide.g-thumbtype-sqr { height: 208px; } + +.g-thumbcrop a.g-thumlink { display: block; position: relative; } +.g-thumbslide .g-thumbcrop .g-description { display: none; } +.g-thumbslide:hover .g-description { display: block; position: absolute; top: 0; min-height: 32px; width: 100%; overflow: hidden; z-index: 3; font-weight: bold; font-size: 0.9em; letter-spacing: 0.1em; text-transform: uppercase; text-align: left; } +.g-thumbslide:hover .g-description strong { display: block; margin-left: 10px; padding-top: 2px; } +.g-album .g-thumbslide:hover .g-description strong { padding-left: 16px; } +.g-thumbslide .g-description strong { display: block; margin-left: 10px; padding-top: 2px; } + +.g-thumbslide .g-metadata { display: none; } +.g-thumbslide:hover .g-metadata { display: block; position: absolute; bottom: 7px; margin: 0 0 1px 1px; padding: 2px 4px 2px 6px; width: 190px; } +.g-thumbslide:hover .g-metadata li { padding: 0; margin: 0; font-size: 0.9em; } +.g-album .g-thumbslide:hover .g-metadata { bottom: 10px; } + +/* screen.css - Thumbs : Extended View mode ~~~~~~~~~~~~*/ + +.g-thumbslide-ext { font-size: 0.9em; width: 208px; min-height: 139px; padding-top: 6px; padding-left: 6px; } +.g-thumbslide-ext.g-thumbtype-flm { height: 188px; } +.g-thumbslide-ext.g-thumbtype-dgt { height: 171px; } +.g-thumbslide-ext.g-thumbtype-sqr { height: 238px; } + +.g-thumbslide-ext .g-description { display: block; margin-top: 2px; width: 200px; overflow: hidden; font-weight: bold; font-size: 0.9em; letter-spacing: 0.1em; text-transform: uppercase; text-align: left; } +.g-thumbslide-ext .g-description strong { display: block; } +.g-album .g-thumbslide-ext .g-description strong { padding-left: 24px; } + +.g-thumbslide-ext .g-metadata { display: none; } +.g-thumbslide-ext:hover .g-metadata { display: block; position: absolute; bottom: 37px; margin: 0 0 1px 1px; padding: 2px 4px 2px 6px; width: 190px; } +.g-thumbslide-ext:hover .g-metadata li { padding: 0; margin: 0; font-size: 0.9em; } +.g-album .g-thumbslide-ext:hover .g-metadata { bottom: 40px; } + +/* screen.css - Photo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-item { float: left; height: 100%; width: 100%; } +#g-photo { padding: 6px 0 6px 6px; text-align: center; float: left; height: 100%; width: 100%; } +div.g-resize { position: relative; left: 50%; float: left; padding: 5px; font-size: 0.9em; } +div.g-resize>a { float: left; overflow: hidden; } +div.g-resize>a img { float: left; } +div.g-resize .g-description { display: none; } +div.g-resize:hover .g-description { position: absolute; display: block; top: 0px; margin-top: 5px; text-align: left; padding: 10px; } +div.g-resize:hover .g-description strong { display: block; margin-bottom: 5px; text-transform: uppercase; } + +div.g-resize .g-more { display: block; position: absolute; right: 16px; top: 16px; padding: 4px 8px; } +div.g-resize:hover .g-more { display: none; visibility: hidden; } + +.ul-table { text-align: center; margin: 0px auto; padding: 0; list-style-type: none; clear: both; } +.ul-table li { float: left; text-align: center; } + +#g-info { display: inline-block; width: 100%; } +#g-info .g-description { margin-top: 4px; margin-bottom: 4px; padding: 4px; } +#g-movie { padding: 6px 0 6px 6px; position: relative; } + +.g-movie { margin: 0 auto; } + +#g-albumheader h1 { margin-bottom: 6px; } + +.g-description .g-metadata { padding: 0.4em 0 0 0; font-size: 0.8em; } +.g-description .g-metadata li { display: inline; padding-right: 1em; } + +/* screen.css - Sidebar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +/* screen.css - Sidebar : Common ~~~~~~~~~~~~~~~~~~~~~~~*/ + +.g-block { margin-bottom: 4px; padding-bottom: 4px; position: relative; } +.g-block h2 { padding: 4px 4px 4px 8px; font-size: 1em; } +.g-block-content { margin: 4px 6px 0 6px; display: block; zoom: 1; } + +/* screen.css - Sidebar : Buttons ~~~~~~~~~~~~~~~~~~~~~~*/ + +#g-viewformat { z-index: 5; position: absolute; padding: 0; top: 6px; right: 10px; } +#g-viewformat li { float: left; margin-right: 2px; } +#g-viewformat span { line-height: 1px; text-indent: -900em; width: 17px; display: block; height: 15px; } +#g-viewformat span:hover, +#g-viewformat span.g-viewthumb-current { background-position: left bottom; } + +#g-view-menu { position: absolute; top: 6px; right: 70px; height: 16px; z-index: 5; zoom: 1; margin: 0 0 6px 0; padding: 0 0 4px 0; } +#g-view-menu.g-buttonset-shift { right: 6px; } +.g-toolbar { height: 1.1em; zoom: 1; margin: 0 0 4px 0; padding: 1px 0 3px 0; } +.g-menu { margin: 0; padding: 0; text-align: left; } +.g-menu li { display: inline; } + +.g-menu-element, +.g-menu-link { display: inline; float: left; margin-right: 4px; } + +.g-buttonset .g-menu-link { text-indent: -99999px; width: 22px; height: 15px; } + +#g-slideshow-link:hover, .g-fullsize-link:hover, #g-exifdata-link:hover { background-position: left bottom; } + +/* screen.css - Reauthentificate ~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-reauthenticate-form fieldset { border: none; width: 260px; } +#g-reauthenticate-form ul { padding: 8px; } +#g-reauthenticate-form li { padding-top: 8px; } +#g-reauthenticate-form label { display: block; } +#g-reauthenticate-form input[type="password"] { width: 98%; } diff --git a/themes/greydragon/helpers/exif_event.php b/themes/greydragon/helpers/exif_event.php index f61bcb7c..27b617a6 100644 --- a/themes/greydragon/helpers/exif_event.php +++ b/themes/greydragon/helpers/exif_event.php @@ -1,7 +1,7 @@ get("add_menu"); + if (!empty($submenu)) { + $item = $submenu->get("add_photos_item"); + if (!empty($item)) { $item->css_class("ui-icon-plus"); } + + $item = $submenu->get("add_album_item"); + if (!empty($item)) { $item->css_class("ui-icon-note"); } + } + + $submenu = $menu->get("options_menu"); + if (!empty($submenu)) { + $item = $submenu->get("edit_item"); + if (!empty($item)) { $item->css_class("ui-icon-pencil"); } + + $item = $submenu->get("edit_permissions"); + if (!empty($item)) { $item->css_class("ui-icon-key"); } + } + } +} diff --git a/themes/greydragon/helpers/greydragon_installer.php b/themes/greydragon/helpers/greydragon_installer.php new file mode 100644 index 00000000..461e6914 --- /dev/null +++ b/themes/greydragon/helpers/greydragon_installer.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/themes/greydragon/helpers/greydragon_theme.php b/themes/greydragon/helpers/greydragon_theme.php new file mode 100644 index 00000000..988da98c --- /dev/null +++ b/themes/greydragon/helpers/greydragon_theme.php @@ -0,0 +1,30 @@ +' + . $theme_info->name . ' ' . $theme_info->version . ''; + } +} + diff --git a/themes/greydragon/images/blue-grad.png b/themes/greydragon/images/blue-grad.png new file mode 100644 index 0000000000000000000000000000000000000000..36e0f6bc25b10ca27ca968108563518fe5dc49db GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^tUxT!!2~21I85*dQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jikv)M978H@CDnX=Db6gEkmSIs^Z()xp8pr0{(pS^|NIG+ z|398e{=m6H{efN6yPy6J_J`|F-ErUaKah395q{5i%p3*`AMWWWCU;$$4>XOz)78&q Iol`;+0KbGg>;M1& literal 0 HcmV?d00001 diff --git a/themes/greydragon/images/button-grad-active-vs.png b/themes/greydragon/images/button-grad-active-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..dc641725f90ae1c2600aa73f61fd71852de7b2ca GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTs!2~3;Wt?9DDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MOL0Jjv*Ddl1k3aJ<`B3Ln45YTUl8-&W@Q`+4B|WrDSr z1<%~X^wgl##FWaylc_d9MYf(Ujv*Ddl6qdpoNr)>`1k*R|C#h82i6y#Bx=~&{;RB1 zKk>gk{-1o?zxohU`MZ1SMP`4WKkZ?sTs#9K8^fQ=ep~#F0-b>dF?hQAxvXNn{1`T?2eVT!WkTr!?&^Y1$v$bU3)_cyQn8;92KVmR%~@c&)W>f9tIM(?IBO z>)vbAHeOn`?C|!D$G7i2J?-SRWhbv~KY4EZ$xGW$UR$uOAQEUGXMsm#F#`kNVGw3K zp1&dmC@5Lt8c`CQpH@L&ZCWNx zGxted(ER#$isbZTELLr{Gh`;dx$w>LzPG$h(aYj*XN$J`r>;4Zvw>6Ql$Cw$U%L}u p_ob@+p0?B>HSfmBFURXYFiNK=n!R29=seKn44$rjF6*2UngBBZs^b6v literal 0 HcmV?d00001 diff --git a/themes/greydragon/images/header.png b/themes/greydragon/images/header.png deleted file mode 100644 index b60c4a660c70d18c8f4bf8fb6031640bbbefbda4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^j6fX4!3-q*n$Glt1d4;)ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~uBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpu~g# zpAc7metrP~0YM-T0s>)S5fKqlQ4vuwQ895baS1UANpVRj2`OnwX&EUQS!r20X*qcr zc|}C zGBnmUGSM+M)ip8GH8IySwa_=SG_bHTu&_3?v@x=>HMe(i^78H1VVVkbn|O(9L`iUd zT1k0gQ7S_~VrE{6o}X)oLYc9i>0Z~xCxJ?oJY5_^IIbrrED$g-GBhx3Qe+nD7UYxM jup!{)4aH4%CdG^@9~l-YyJw37RWo?H`njxgN@xNAb4N@6 diff --git a/themes/greydragon/images/ico-album.png b/themes/greydragon/images/ico-album.png deleted file mode 100644 index 01463be470f10c8f0a21e0015c6ed05814b71e7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 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 VQ{!#2W*(&s;L{2M6xDGdMs diff --git a/themes/greydragon/images/missing-img.png b/themes/greydragon/images/missing-img.png new file mode 100644 index 0000000000000000000000000000000000000000..12b7394fcd832ee62201853240fb4a15a39bd793 GIT binary patch literal 33136 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 literal 0 HcmV?d00001 diff --git a/themes/greydragon/images/section.png b/themes/greydragon/images/section.png deleted file mode 100644 index bba5da2c8957740e8f514d6fec9916039c66b01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!VDx&KI(c25-1LGcVbv~P6otbNq6*hWMJ6X z&;2Kn706de_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!DJc@9Tja|6&*cQU42zO12sKEHGLy>17k~fpOENXxj-%AC9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiET^FAODv|SaaSY+Oo@{a8OJgS^hkZk4h)~B& g%NY_g8b1MDp~cOa_)Aff8>o`O)78&qol`;+03@nD2><{9 diff --git a/themes/greydragon/images/ui-icons.png b/themes/greydragon/images/ui-icons.png deleted file mode 100644 index 199b7fda5a1c1bfd678079befdd7f7b36ea169d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9273 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 z zKMt0=y_qCkXT7^)nU2gJ9bTvHA6YPq+VxJ)0X{&N_d{A$ykf3O@RDJgj^_z%cK z?z#3$+U0m-7=0TWaAw4YJRU~7E3x(4jV>q12O@e??snrZ%LlUjw(d&Ubdh&m2Z^{Z zb$-6YcKIHy_2atbao^SE1CIKq=Ni3(=!-}JdWd-?dO-77*s}vOK+*V?<>G>Zf@0^} zdX`OGT%7ZASKM30Nu$zd-?>4T=Yv7!Cp%Sxff4?c1zd)pY|+`PhxG{Gov+<5_Gxh& zBYB#?8@#rs@ZisM5B6mHhi{Vn50LFauI+DZZhFs6{SGd3o1r!m6Wvov=j+*xm`;P2_0mpTsu)qxVDid&WV zjA-JCy!L$Hg-h2A#PxC%jXT!M6$4T@@S^_;e*m)5<^2D;d#pwQJ#BXC6*tWIe&b=6 zi;IQpf%%~8tEZuS0cU?AcFqo#73Y1|@4Q~=c}sgr28~Y<0_0dU>}_O$L_AxDqgz+4 zLdKP0_f2ZGdJb3n!r$s&nZG+Ld0J-OvB`k76yTJU3am#eKBi% z9pwb7xwF3olPpK?fHstjV^C9s1^DYJ*;0m)<1dw&xs|Dt03S!;$dGbkey)4s90ssmiGYj)6D;)8ZAR=?f^4Iv$u zoGxp5d_Ej>+ys)^D2{Dr;h1g~@Iu}r8K&}zAqNGrgb05s;j2Nh-lp*#Q0EV}E~*vK z9w=b%?PJ!A&WID-$v-HX*h*SY+f%g!Nq$k*0X^5tWZ!fPF^LwZ6TtEkHoO>zC~((V zJesv6_VB*SBfZIcxv=sxndvQvNlbk0?U36^t1Ms8=v9E_@JxX7cYY|{nI>JiJ8$g? zFs;dD`K~KL0%#*@8pF}?g|KY8#Rt*UMYZ z;9&~w%~6u|2iFY!_rHjSXdDC4VMYIF=q!Tw@KGO9oTIs4(0i7{{tt9-JVn#{>+Ad4lTrKx_)V04z1Q?#73K8A|O3xNBmkx{#^mz8tB4LY}&cwsN_mWyt>l D03=e_ diff --git a/themes/greydragon/images/view-full.png b/themes/greydragon/images/view-full.png deleted file mode 100644 index e729031914f3065b9502029afbb3db3e7b585c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmV;n0ZIOeP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7j#8fbW?9;ba!ELWdKlNX>N2bPDNB8b~7$Dy+xzR0003INklsRO7GOH_l+W z$$g8H%$a#Z$K#V`#xbQ`G}BFK0?e)!-fTLQ0uxGs^XnULem0V_8c~h2Meb!asp|$q z8UWsZ93D^~xXkaZ$KgIDz&tOk#|;u8S$=0dtP+Zh$JJpK3AxB`t;Y@a#CROG#4#Qr z;Sp58%t1@fc1XQ2Y9{Q_bX7L9I;Caj;5Rx;DuMOK7VD=6U6evzK6ltWKT26?^17|? zR+G9eYa&Y+jpJ*w*?n7&A@9|X^_WvajOWknH9YpN>TCZV-V@_7W+BESq-aC2@B7@+ g69vV^!R|%;3;fc2fR4rcPyhe`07*qoM6N<$g5^=Mo&W#< diff --git a/themes/greydragon/images/view-fullsize.png b/themes/greydragon/images/view-fullsize.png deleted file mode 100644 index 5bff90dd32fda530062a04899e15c7f372402ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmV;d0aN~oP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7j#8fbW?9;ba!ELWdKlNX>N2bPDNB8b~7$Dy+xzR00038Nklb;@5CHcD*OPagV!;6`-avaziWHG3{eUQOD0l-BXIGJu7a&6siWpy%0`nmD z?8Rr`n8w=C>bx32#K{$7L_iS$VJJkByn6HYo(M5?+v~i$xygAu{aEzQJS^r$h!LoI zMJ=Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7j#8fbW?9;ba!ELWdKlNX>N2bPDNB8b~7$Dy+xzR0003pNklZCx3_mh19tZI4EB6jfIWi^lqIF*=-{sg<=8+}^YZG%mDSakr}_vXsRoMXG_^@e z_B51wfQ4-ttUGT4S8v+XVTmNn>)*c}Xtw0e z+4h3S!h&AK>v!zj)Di;m4pbNjOydjl-OUAI!Z^aj-rgJo07Eb)CZ_})#KbVfm|z0y z7={uk6B4jc;S!iIEMUPLN0=}oV3CE90~W}&hYBMHERbsl6$SE=Gei7O&|el0u#m-CT75(3eLn5f&lSguPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7j#8fbW?9;ba!ELWdKlNX>N2bPDNB8b~7$Dy+xzR00035NklGxF-inM5Jg|rl;fb08<{8u3!Y$&HWa*s_n6RZGf%J=5kX;2U?2zvYHGBC!8l5H zm%()FupK_=$FC=6O~vHJFRNd}l-P+?fkmUY%b|Z-4*g50G=hj=qL^s#qz)>A0}eka znS+SZ0UdjZN{xsy_E`Zd2s?~d z2-$N@{-ysl{_ZL@Dhx=Z;sGodD|^CrjZfe90CIWf9vwuJgV?z&P7kM-zCZs0F0p>K T=HdhD00000NkvXXu0mjfyR@aY diff --git a/themes/greydragon/images/view-right.png b/themes/greydragon/images/view-right.png deleted file mode 100644 index d1878dd689f02431724e8564363ca886532f0ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 zcmV;T0bTxyP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7j#8fbW?9;ba!ELWdKlNX>N2bPDNB8b~7$Dy+xzR0002}Nkl%sF-ikr5XJHTn;kbHR;IF1ECQY&Rw)H9;XP7V*m(sDFJhyxmk=z})+&OdL2?W!F9|yY~KOY`1wjye?_)x}Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU!C{RpPMGg)QFfcGNF)=bSGBh+aHa0dlH#a#sIXXHzJ3Bi(Jv%%+ zJUu-IPxf_`#{fNhF`bc%#@k&1Jjihh)dc$krTnvQv(gM@>GhKh-bh>nho zhk%rifS!+!kd}y^nv9*2k&%&+l8};=o0FZHnVFfAqMMYcprD|prlq8&sHLZ`tE{T6 zt*xf2u%)cGuAs56r?IW3wydwPuCKMOw7Iggv$V9dy0N~wvA?>yxxT)-zQ4V>yTiJ^ z#Jsr7zren^z{|t6#l*VD!NS78!^FkL#=^tN!N<(U$H>ac$;`~p&BW2n#L~~p-`2?3 z*Uj3|(aq7)(9_b=)YQ||)z#VA+1lFL+S=RM+uqyU-QC^X($nGJ+T-8f;^o`u<>TY# z<>lt)Few3>FDh2>Fw?6?dvJ6@9^yI z@$&8V`0o4n_4W7p_xJk$_x}I;^8Weu|M>X!`S|(!`}_O){{H*_{r&y_{Qv&{|GWg? zxc~qF7j#8fbW?9;ba!ELWdKlNX>N2bPDNB8b~7$Dy+xzR0004YNklZyno{6I^f8az3@r3!jKt3Bp zID3+olbwC^B01GLAjL3Yt0j>YQx-2;Xqwz7fFvvka>dk+y2=^G3`oL^^__{9T)GVl z3K)=u8F;}YlZ^sQ7+09^v0(sU2r4NVn4tqDB?cuHOu(tcUO5kdh0ZoIoE98 zo&y&aTGHh1_6INhQN$X(=K>%w} Vbjhhwk`Dj?002ovPDHLkV1fz09`yhK diff --git a/themes/greydragon/js/dialog.js b/themes/greydragon/js/dialog.js deleted file mode 100644 index 1d11a569..00000000 --- a/themes/greydragon/js/dialog.js +++ /dev/null @@ -1,17 +0,0 @@ -function setupLoginForm() { - setupAjaxForm('#gLoginForm'); -} - -function setupAjaxForm($form_id) { - var options = { - dataType: "json", - success: function(data) { - if (data.result == "success") { - if (data.location) { window.location = data.location; } - else { window.parent.Shadowbox.close(); } - } - } - }; - - $($form_id).ajaxForm(options); -}; diff --git a/themes/greydragon/js/menus.js b/themes/greydragon/js/menus.js deleted file mode 100644 index f4f1431a..00000000 --- a/themes/greydragon/js/menus.js +++ /dev/null @@ -1,14 +0,0 @@ -// Javascript originally by Patrick Griffiths and Dan Webb. -// http://htmldog.com/articles/suckerfish/dropdowns/ - -sfHover = function() { - var sfEls = document.getElementById("gSiteMenu").getElementsByTagName("ul")[0].getElementsByTagName("li"); - if (!sfEls) { return; } - - for (var i=0; iul>li>ul").show(); + $("#g-login-menu").show(); + $(".g-context-menu").show(); + }, + +// gallery_dialog_postprocess: function(href, title) { +// Shadowbox.open({player: 'ajax', content: href, width: 500, height: 420, enableKeys: false, animate: false, title: title, onFinish: myAjaxSubmit}); +// } +}); + +/* +(function($) { + + $.widget("ui.gallery_dialog", { + _init: function() { + var self = this; + if (!self.options.immediate) { + this.element.click(function(event) { + event.preventDefault(); + var href = $(event.currentTarget).attr("href"); + var title = $(event.currentTarget).attr("title"); + setTimeout(function() { $().gallery_dialog_postprocess(href, title); }, 1000); + return false; + }); + } else { + var href = this.element.attr("href"); + var title = this.element.attr("title"); + setTimeout(function() { $().gallery_dialog_postprocess(href, title); }, 1000); + } + } + }); +})(jQuery); +*/ + +$(document).ready(function() { + $().theme_ready(); +}); diff --git a/themes/greydragon/libraries/MY_Theme_View.php b/themes/greydragon/libraries/MY_Theme_View.php new file mode 100644 index 00000000..4f579ec2 --- /dev/null +++ b/themes/greydragon/libraries/MY_Theme_View.php @@ -0,0 +1,313 @@ +ensurevalue(module::get_var("th_greydragon", $key), $default)); + } + + public function load_sessioninfo() { + $this->sidebarvisible = $_REQUEST['sb']; + + if (empty($this->sidebarvisible)): + $session = Session::instance(); + $_sidebar_mode = $session->get("gd_sidebar"); + if ($_sidebar_mode): + $this->sidebarvisible = $_sidebar_mode; + else: + $this->sidebarvisible = $this->ensureoptionsvalue("sidebar_visible", "right"); + endif; + else: + // Sidebar position is kept for 360 days + Session::instance()->set("gd_sidebar", $this->sidebarvisible, time() + 31536000); + endif; + + $this->sidebarallowed = $this->ensureoptionsvalue("sidebar_allowed", "any"); + $this->sidebarvisible = $this->ensurevalue($this->sidebarvisible, "right"); + + if ($this->sidebarallowed == "none") { $this->sidebarvisible = $this->ensureoptionsvalue("sidebar_visible", "right"); }; + if ($this->sidebarallowed == "right") { $this->sidebarvisible = "right"; } + if ($this->sidebarallowed == "left") { $this->sidebarvisible = "left"; } + + if ($this->item()): + if ($this->ensureoptionsvalue("sidebar_albumonly", FALSE)): + if (!$this->item()->is_album()): + $this->sidebarallowed = "none"; + $this->sidebarvisible = "none"; + endif; + endif; + endif; + + $this->logopath = $this->ensureoptionsvalue("logo_path", url::file("lib/images/logo.png")); + $this->show_guest_menu = $this->ensureoptionsvalue("show_guest_menu", FALSE); + $this->horizontal_crop = $this->ensureoptionsvalue("horizontal_crop", FALSE); + $this->thumb_descmode = $this->ensureoptionsvalue("thumb_descmode", "overlay"); + $this->photo_descmode = $this->ensureoptionsvalue("photo_descmode", "overlay"); + $this->is_thumbmeta_visible = ((!$this->ensureoptionsvalue("hide_thumbmeta", FALSE)) and module::is_active("info")); + $this->is_photometa_visible = ((!$this->ensureoptionsvalue("hide_photometa", TRUE)) and module::is_active("info")); + $this->disable_seosupport = $this->ensureoptionsvalue("disable_seosupport", FALSE); + $this->is_blockheader_visible = (!$this->ensureoptionsvalue("hide_blockheader", FALSE)); + $this->mainmenu_position = $this->ensureoptionsvalue("mainmenu_position", "default"); + $this->show_breadcrumbs = (!$this->ensureoptionsvalue("hide_breadcrumbs", FALSE)); + $this->loginmenu_position = ($this->ensureoptionsvalue("loginmenu_position", "default")); + $this->copyright = ($this->ensureoptionsvalue("copyright", null)); + $this->photonav_position = module::get_var("th_greydragon", "photonav_position", "top"); + $this->desc_allowbbcode = $this->ensureoptionsvalue("desc_allowbbcode", FALSE); + $this->enable_pagecache = $this->ensureoptionsvalue("enable_pagecache", FALSE); + $this->color_pack = $this->ensureoptionsvalue("color_pack", "greydragon"); + + $cssfile = gallery::find_file("css/colorpacks/" . $this->color_pack, "colors.css", false); + + if (!$cssfile): + $this->color_pack = 'greydragon'; + endif; + + switch (module::get_var("th_greydragon", "thumb_ratio")): + case "digital": + $this->crop_factor = 4/3; + $this->crop_class = 'g-thumbtype-dgt'; + break; + case "square": + $this->crop_factor = 1; + $this->crop_class = 'g-thumbtype-sqr'; + break; + case "film": + $this->crop_factor = 3/2; + $this->crop_class = 'g-thumbtype-flm'; + break; + case "photo": + default: + $this->crop_factor = 1; + $this->crop_class = 'g-thumbtype-sqr'; + break; + endswitch; + + $this->_thumb_size_y = floor($this->_thumb_size_x / $this->crop_factor); + } + + public function is_sidebarallowed($align) { + return (($this->sidebarallowed == "any") or ($this->sidebarallowed == $align)); + } + + public function breadcrumb_menu($theme, $parents) { + $content = ""; + + if ($theme->item() && !empty($parents)): + $content .= ''; + endif; + + return $content; + } + + protected function sidebar_menu_item($type, $url, $caption, $css) { + if (!$this->is_sidebarallowed($type)): + return ""; + endif; + + $iscurrent = ($this->sidebarvisible == $type); + $content_menu = '
  • '; + if (!$iscurrent): + $content_menu .= ''; + endif; + $content_menu .= '' . $caption . ''; + if (!$iscurrent): + $content_menu .= ''; + endif; + + return $content_menu . '
  • '; + } + + public function sidebar_menu($url) { + if ($this->sidebarallowed != "any"): + return ""; + endif; + + $content_menu = ($this->sidebar_menu_item("left", $url, "Sidebar Left", "left")); + $content_menu .= ($this->sidebar_menu_item("none", $url, "No Sidebar", "full")); + $content_menu .= ($this->sidebar_menu_item("right", $url, "Sidebar Right", "right")); + return '
      ' . $content_menu . '
    '; + } + + public function add_paginator($position) { + if (($this->photonav_position == "both") or ($this->photonav_position == $position)): + return ($this->paginator()); + else: + return ""; + endif; + } + + public function get_thumb_element($item, $addcontext) { + $item_class = $item->is_album() ? "g-album" : "g-photo"; + + if (($this->sidebarallowed == "none") and ($this->sidebarvisible == "none")): + $item_class .= " g-extra-column"; + endif; + + $content = '
  • '; + $content .= $this->thumb_top($item); + + if (($this->crop_factor == 1) and ($item->thumb_width > $item->thumb_height)): + $_shift = 'style="margin-top: ' . floor(($this->_thumb_size_y - $item->thumb_height) / 2) . 'px;"'; + else: + if (($this->crop_factor > 0) and ($item->thumb_width < $item->thumb_height)): + $_shift = 'style="margin-top: -' . floor(($item->thumb_height - $this->_thumb_size_y) / 2) . 'px;"'; + else: + $_shift = ""; + endif; + endif; + + $content .= '
    crop_class . '">

    '; + if ($this->thumb_descmode == "overlay"): + $content .= ''; + $content .= '' . $this->bb2html(html::purify($item->title), 2) . ''; // html::purify(text::limit_chars($item->title, 44, "…")) + $content .= ''; + endif; + $content .= ''; + if (($item->thumb_height == 0) or ($item->thumb_width == 0)): + $content .= 'No Image'; + else: + $content .= $item->thumb_img(); + endif; + $content .= '

    '; + + if ($this->thumb_descmode == "bottom"): + $content .= ''; + $content .= '' . $this->bb2html(html::purify($item->title), 2) . ''; + $content .= ''; + endif; + + if (($this->is_thumbmeta_visible) and (module::is_active("info"))): + $content .= ''; + endif; + + if ($addcontext): + $_text = $this->context_menu($item, "#g-item-id-{$item->id} .g-thumbnail"); + $content .= (stripos($_text, '
  • '))? $_text : null; + endif; + + $content .= '
  • '; + $content .= $this->thumb_bottom($item); + $content .= ''; + + return $content; + } + + // $mode: bit 1 - use mix mode ($mode in [1, 3]), bit 2 - strips bbcode ($mode in [2, 3]) + public function bb2html($text, $mode) { + // Syntax Sample: + // -------------- + // [img]http://elouai.com/images/star.gif[/img] + // [url="http://elouai.com"]eLouai[/url] + // [size="25"]HUGE[/size] + // [color="red"]RED[/color] + // [b]bold[/b] + // [i]italic[/i] + // [u]underline[/u] + // [list][*]item[*]item[*]item[/list] + // [code]value="123";[/code] + // [quote]John said yadda yadda yadda[/quote] + + static $bbcode_mappings = array( + "#\\[b\\](.*?)\\[/b\\]#" => "$1", + "#\\[i\\](.*?)\\[/i\\]#" => "$1", + "#\\[u\\](.*?)\\[/u\\]#" => "$1", + "#\\[s\\](.*?)\\[/s\\]#" => "$1", + "#\\[o\\](.*?)\\[/o\\]#" => "$1", + "#\\[url\\](.*?)\[/url\\]#" => "$1", + "#\\[url=(.*?)\\](.*?)\[/url\\]#" => "$2", + "#\\[mail=(.*?)\\](.*?)\[/mail\\]#" => "$2", + "#\\[img\\](.*?)\\[/img\\]#" => "\"\"", + "#\\[img=(.*?)\\](.*?)\[/img\\]#" => "\"$2\"", + "#\\[quote\\](.*?)\\[/quote\\]#" => "

    $1

    ", + "#\\[code\\](.*?)\\[/code\\]#" => "
    $1
    ", + "#\\[size=([^\\[]*)\\]([^\\[]*)\\[/size\\]#" => "$2", + "#\\[color=([^\\[]*)\\]([^\\[]*)\\[/color\\]#" => "$2", + "#\\[class=([^\\[]*)\\]([^\\[]*)\\[/class\\]#" => "$2", + "#\\[center\\](.*?)\\[/center\\]#" => "
    $1
    ", + "#\\[list\\](.*?)\\[/list\\]#" => "
      $1
    ", + "#\\[ul\\](.*?)\\[/ul\\]#" => "
      $1
    ", + "#\\[li\\](.*?)\\[/li\\]#" => "
  • $1
  • ", + ); + + static $bbcode_strip = '|[[\/\!]*?[^\[\]]*?]|si'; + + // Replace any html brackets with HTML Entities to prevent executing HTML or script + // Don't use strip_tags here because it breaks [url] search by replacing & with amp + if (($mode == 1) or ($mode == 3)): + $newtext = str_replace("<", "<", $text); + $newtext = str_replace(">", ">", $newtext); + $newtext = str_replace(""", "\"", $newtext); + else: + $newtext = str_replace("<", "<", $text); + $newtext = str_replace(">", ">", $newtext); + $newtext = str_replace("&quot;", """, $newtext); + endif; + + // Convert new line chars to html
    tags + $newtext = nl2br($newtext); + + if (strpos($text, "[") !== false): + if (($mode == 2) or ($mode == 3)): + $newtext = preg_replace($bbcode_strip, '', $newtext); + else: + $newtext = preg_replace(array_keys($bbcode_mappings), array_values($bbcode_mappings), $newtext); + endif; + endif; + + return stripslashes($newtext); //stops slashing, useful when pulling from db + } +} + +?> \ No newline at end of file diff --git a/themes/greydragon/theme.info b/themes/greydragon/theme.info index 2deac9b4..cea1d8d0 100644 --- a/themes/greydragon/theme.info +++ b/themes/greydragon/theme.info @@ -1,6 +1,6 @@ name = "Grey Dragon Theme" -description = "A Crisp theme uses on clear grey colors and minimized on JS overhead" -version = 1.5.8 -author = "2009 Serguei Dosyukov" +description = "A Crisp flexible theme with support of Color Packs and minimized on JS overhead" +version = 2.3.1 +author = "2010 Serguei Dosyukov" site = 1 admin = 0 diff --git a/themes/greydragon/thumbnail.png b/themes/greydragon/thumbnail.png index 89cd6bdad4fd47e54da6357126c7f178dfa99e44..4b80ecaf35a50ced69c426d9c6b9e16b8af6a322 100644 GIT binary patch literal 25791 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�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 diff --git a/themes/greydragon/views/album.html.php b/themes/greydragon/views/album.html.php index 8164bace..49fa5cf4 100644 --- a/themes/greydragon/views/album.html.php +++ b/themes/greydragon/views/album.html.php @@ -1,51 +1,55 @@ - - -
    - album_top() ?> -

    title) ?>

    -
    description)? bb2html(html::purify($item->description), 1) : null; ?>
    -
    - - -paginator() ?> - - -
      - - $child): ?> - - is_album()): ?> - - - -
    • - thumb_top($child) ?> -

      - thumb_img() ?> -

      - thumb_bottom($child) ?> -

      title) ?>

      - context_menu($child, "#g-item-id-{$child->id} .g-thumbnail") ?> - '))? $_text : null; ?> - - - -
    • - - - admin || access::can("add", $item)): ?> - id") ?> -
    • Add some.", - array("attrs" => html::mark_clean("href=\"$addurl\" class=\"g-dialog-link\""))) ?>
    • - -
    • - - -
    -album_bottom() ?> - - -paginator() ?> - + +
    + album_top() ?> +

    bb2html(html::purify($item->title), 1) ?>

    +
    + +add_paginator("top"); ?> + +photo_descmode == "top") and ($item->description)): ?> +
    bb2html(html::purify($item->description), 1) ?>
    + + +
      + + $child): ?> + get_thumb_element($child, TRUE) ?> + + + admin || access::can("add", $item)): ?> + id") ?> +
    • Add some.", + array("attrs" => html::mark_clean("href=\"$addurl\" class=\"g-dialog-link\""))) ?>
    • + +
    • + + +
    +album_bottom() ?> + +photo_descmode == "bottom") and ($item->description)): ?> +
    bb2html(html::purify($item->description), 1) ?>
    + + +add_paginator("bottom"); ?> diff --git a/themes/greydragon/views/block.html.php b/themes/greydragon/views/block.html.php index 699d7c22..af29546f 100644 --- a/themes/greydragon/views/block.html.php +++ b/themes/greydragon/views/block.html.php @@ -1,10 +1,33 @@ - - - - -
    -

    -
    - -
    -
    + + + + +
    + is_blockheader_visible): ?> +

    + +
    + +
    +
    diff --git a/themes/greydragon/views/dynamic.html.php b/themes/greydragon/views/dynamic.html.php index e136fd53..1f787cf3 100644 --- a/themes/greydragon/views/dynamic.html.php +++ b/themes/greydragon/views/dynamic.html.php @@ -1,35 +1,39 @@ - -
    -
    - dynamic_top() ?> -
    -

    -
    - - -paginator() ?> - - -
      - $child): ?> -
    • "> - thumb_top($child) ?> -

      - photo -

      -

      title) ?>

      - thumb_bottom($child) ?> - -
    • - -
    -dynamic_bottom() ?> - - -paginator() ?> - \ No newline at end of file + +
    +
    + dynamic_top() ?> +
    +

    +
    + +add_paginator("top"); ?> + +
      + $child): ?> + get_thumb_element($child) ?> + +
    +dynamic_bottom() ?> + +add_paginator("bottom"); ?> diff --git a/themes/greydragon/views/info_block.html.php b/themes/greydragon/views/info_block.html.php index 69f6a1e9..d3860584 100644 --- a/themes/greydragon/views/info_block.html.php +++ b/themes/greydragon/views/info_block.html.php @@ -1,9 +1,24 @@ - - - + +
      + owner): ?> +
    • + + owner->url): ?> + owner->display_name()) ?> + + owner->display_name()) ?> + +
    • + + captured): ?> +
    • + + captured)?> +
    • + + description): ?> +
    • + bb2html(html::purify($item->description), 1) ?> +
    • + +
    diff --git a/themes/greydragon/views/movie.html.php b/themes/greydragon/views/movie.html.php index e69de29b..ec870608 100644 --- a/themes/greydragon/views/movie.html.php +++ b/themes/greydragon/views/movie.html.php @@ -0,0 +1,43 @@ + +
    + photo_top() ?> + +
    +

    bb2html(html::purify($item->title), 1) ?>

    +
    bb2html(html::purify($item->description), 1) ?>
    +
    + + add_paginator("top"); ?> + +
    + resize_top($item) ?> + movie_img(array("class" => "g-movie", "id" => "g-movie-id-{$item->id}")); ?> + context_menu($item, "#g-movie-id-{$item->id}") ?> + resize_bottom($item) ?> +
    + + add_paginator("bottom"); ?> + + photo_bottom() ?> +
    diff --git a/themes/greydragon/views/no_sidebar.html.php b/themes/greydragon/views/no_sidebar.html.php index 2239cf91..dd61bb77 100644 --- a/themes/greydragon/views/no_sidebar.html.php +++ b/themes/greydragon/views/no_sidebar.html.php @@ -1,3 +1,24 @@ - - -
     
    + + 
    ?> + diff --git a/themes/greydragon/views/page.html.php b/themes/greydragon/views/page.html.php index 90a9f09c..13664d65 100644 --- a/themes/greydragon/views/page.html.php +++ b/themes/greydragon/views/page.html.php @@ -1,76 +1,66 @@ - - - - +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +load_sessioninfo(); ?> + + enable_pagecache) and ($theme->item())): + // Page will expire in 60 seconds + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 60).'GMT'); + header("Cache-Control: public"); + header("Cache-Control: post-check=3600, pre-check=43200", false); + header("Content-Type: text/html; charset=UTF-8"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + endif; ?> - - - <? if ($page_title): ?> +<?= " <title>"; ?> +<? if ($page_title): ?> <?= $page_title ?> <? else: ?> <? if ($theme->item()): ?> <? if ($theme->item()->is_album()): ?> -<?= t("Browse Album :: %album_title", array("album_title" => $theme->item()->title)) ?> +<?= t("Browse Album :: %album_title", array("album_title" => $theme->bb2html($theme->item()->title, 2))) ?> <? elseif ($theme->item()->is_photo()): ?> -<?= t("Photo :: %photo_title", array("photo_title" => $theme->item()->title)) ?> +<?= t("Photo :: %photo_title", array("photo_title" => $theme->bb2html($theme->item()->title, 2))) ?> <? else: ?> -<?= t("Movie :: %movie_title", array("movie_title" => $theme->item()->title)) ?> +<?= t("Movie :: %movie_title", array("movie_title" => $theme->bb2html($theme->item()->title, 2))) ?> <? endif ?> <? elseif ($theme->tag()): ?> -<?= t("Browse Tag :: %tag_title", array("tag_title" => $theme->tag()->name)) ?> +<?= t("Browse Tag :: %tag_title", array("tag_title" => $theme->bb2html($theme->tag()->name, 2))) ?> <? else: /* Not an item, not a tag, no page_title specified. Help! */ ?> <?= t("Gallery") ?> <? endif ?> <? endif ?> - - - - - - " type="image/x-icon" /> - - script("jquery.js") ?> - script("jquery.form.js") ?> - script("jquery-ui.js") ?> - +disable_seosupport): ?> + ' . "\n"; ?> + ' . "\n"; ?> + ' . "\n"; ?> + ' . "\n"; ?> + ' . "\n"; ?> + +" type="image/x-icon" /> +script("jquery.js") ?> +script("jquery.form.js") ?> +script("jquery-ui.js") ?> +page_subtype == "movie"): ?> +script("flowplayer.js") ?> + +script("gallery.ajax.js") ?> head() ?> +" type="text/css" media="screen,print,projection" /> +color_pack . "/colors.css") ?>" type="text/css" media="screen,print,projection" /> - " type="text/css" media="screen,print,projection" /> - " type="text/css" media="screen,print,projection" /> + + - - - - + page_top() ?> @@ -80,56 +70,30 @@ -guest): ?> -
    - site_menu("") ?> +guest) or ($theme->show_guest_menu)): ?> +
    "> + site_menu() ?>
    messages() ?> header_bottom() ?> - - + +loginmenu_position == "header"): ?> + user_menu() ?> + +show_breadcrumbs): ?> + breadcrumb_menu($theme, $parents); ?> +
    - -
      - - - -
    • '; ?>">Sidebar Left"; ?>
    • - - - -
    • '; ?>">No Sidebar"; ?>
    • - - - -
    • '; ?>">Sidebar Right"; ?>
    • - -
    - - -
    + sidebar_menu($url) ?> +
    "> album_menu() ?> @@ -141,30 +105,29 @@
    - -' ?> - - -' ?> - + sidebarvisible=="left"): ?> + ' ?> + sidebarvisible=="none"): ?> + + ' ?> + -page_subtype != "login") && ($sidebarvisible != "none")): ?> - - -" : null ?> + page_subtype != "login") and ($theme->page_subtype != "reauthenticate") and ($theme->sidebarvisible != "none")): ?> + + + sidebarvisible != "none")? "
    " : null ?> - -' ?> - -' ?> - -' ?> - + sidebarvisible == "left"): ?> + ' ?> + sidebarvisible == "none"): ?> + ' ?> + + ' ?> + -
    +
    - page_bottom() ?> - - -// -// <bgsound src="/music/collection.m3u"> -// -// -// -// -?> diff --git a/themes/greydragon/views/pager_photo.html.php b/themes/greydragon/views/pager_photo.html.php deleted file mode 100644 index 59326ae5..00000000 --- a/themes/greydragon/views/pager_photo.html.php +++ /dev/null @@ -1,106 +0,0 @@ - - -parent()->children(); - $pagination_msg = t("Photo:") . ' '; - if ($sibling_count < 13) { - - for ($i = 1; $i <= $sibling_count; $i++) { - if ($i == $position) { - $pagination_msg .= '' . t($i) . ''; - } else { - - $pagination_msg .= '' . t($i) . ''; - } - if ($i < $sibling_count) { $pagination_msg .= '·'; }; - } - - } elseif ($position < 9) { - - for ($i = 1; $i <= 10; $i++) { - if ($i == $position) { - $pagination_msg .= '' . t($i) . ''; - } else { - $pagination_msg .= '' . t($i) . ''; - } - if ($i < 10) { $pagination_msg .= '·'; }; - } - - $pagination_msg .= '…'; - $pagination_msg .= '' . t($sibling_count - 1) . ''; - $pagination_msg .= '·'; - $pagination_msg .= '' . t($sibling_count) . ''; - - } elseif ($position > $sibling_count - 8) { - - $pagination_msg .= '' . t(1) . ''; - $pagination_msg .= '·'; - $pagination_msg .= '' . t(2) . ''; - $pagination_msg .= '…'; - - for ($i = $sibling_count - 9; $i <= $sibling_count; $i++) { - if ($i == $position) { - $pagination_msg .= '' . t($i) . ''; - } else { - $pagination_msg .= '' . t($i) . ''; - } - if ($i < $sibling_count) { $pagination_msg .= '·'; }; - } - - } else { - - $pagination_msg .= '' . t(1) . ''; - $pagination_msg .= '·'; - $pagination_msg .= '' . t(2) . ''; - $pagination_msg .= '…'; - - for ($i = $position - 5; $i <= $position + 5; $i++) { - if ($i == $position) { - $pagination_msg .= '' . t($i) . ''; - } else { - $pagination_msg .= '' . t($i) . ''; - } - if ($i < $position + 5) { $pagination_msg .= '·'; }; - } - - $pagination_msg .= '…'; - $pagination_msg .= '' . t($sibling_count - 1) . ''; - $pagination_msg .= '·'; - $pagination_msg .= '' . t($sibling_count) . ''; - } - } -?> - -
      -
    • -
    • - 1): ?> - ">  - -   - - - - ">  - -   - - - - ">  - -   - - - 1) && ($sibling_count > $position)): ?> - ">  - -   - -
    • -
    \ No newline at end of file diff --git a/themes/greydragon/views/paginator.html.php b/themes/greydragon/views/paginator.html.php index e5b2460a..9b5e725e 100644 --- a/themes/greydragon/views/paginator.html.php +++ b/themes/greydragon/views/paginator.html.php @@ -1,4 +1,25 @@ - + parent(); + endif; $current_page = $page; - $total_pages = $max_pages; + $total_pages = $max_pages; // Prepare page url list - for ($i = 1; $i <= $total_pages; $i++) { + for ($i = 1; $i <= $total_pages; $i++): $_pagelist[$i] = url::site(url::merge(array("page" => $i))); - } + endfor; break; case "item": + if ($item): + $parent = $item->parent(); + endif; $current_page = $position; $total_pages = $total; $siblings = $item->parent()->children(); - for ($i = 1; $i <= $total; $i++) { + for ($i = 1; $i <= $total; $i++): $_pagelist[$i] = $siblings[$i-1]->url(); - } + endfor; break; default: $current_page = 1; @@ -55,98 +78,109 @@ break; } - if ($total_pages <= 1) { + if ($total_pages <= 1): $pagination_msg = " "; - } else { + else: $pagination_msg = t("Page:") . ' '; - if ($total_pages < 13) { - for ($i = 1; $i <= $total_pages; $i++) { - if ($i == $current_page) { + if ($total_pages < 13): + for ($i = 1; $i <= $total_pages; $i++): + if ($i == $current_page): $pagination_msg .= '' . t($i) . ''; - } else { - $pagination_msg .= '' . t($i) . ''; - } - if ($i < $total_pages) { $pagination_msg .= '·'; }; - } - } elseif ($current_page < 9) { - for ($i = 1; $i <= 10; $i++) { - if ($i == $current_page) { + else: + $pagination_msg .= '' . t($i) . ''; + endif; + if ($i < $total_pages): + $pagination_msg .= '·'; + endif; + endfor; + elseif ($current_page < 9): + for ($i = 1; $i <= 10; $i++): + if ($i == $current_page): $pagination_msg .= '' . t($i) . ''; - } else { - $pagination_msg .= '' . t($i) . ''; - } - if ($i < 10) { $pagination_msg .= '·'; }; - } + else: + $pagination_msg .= '' . t($i) . ''; + endif; + if ($i < 10): + $pagination_msg .= '·'; + endif; + endfor; $pagination_msg .= '…'; - $pagination_msg .= '' . t($total_pages - 1) . ''; + $pagination_msg .= '' . t($total_pages - 1) . ''; $pagination_msg .= '·'; - $pagination_msg .= '' . t($total_pages) . ''; + $pagination_msg .= '' . t($total_pages) . ''; - } elseif ($current_page > $total_pages - 8) { - - $pagination_msg .= '' . t(1) . ''; + elseif ($current_page > $total_pages - 8): + $pagination_msg .= '' . t(1) . ''; $pagination_msg .= '·'; - $pagination_msg .= '' . t(2) . ''; + $pagination_msg .= '' . t(2) . ''; $pagination_msg .= '…'; - for ($i = $total_pages - 9; $i <= $total_pages; $i++) { - if ($i == $current_page) { + for ($i = $total_pages - 9; $i <= $total_pages; $i++): + if ($i == $current_page): $pagination_msg .= '' . t($i) . ''; - } else { - $pagination_msg .= '' . t($i) . ''; - } - if ($i < $total_pages) { $pagination_msg .= '·'; }; - } + else: + $pagination_msg .= '' . t($i) . ''; + endif; + if ($i < $total_pages): + $pagination_msg .= '·'; + endif; + endfor; - } else { - - $pagination_msg .= '' . t(1) . ''; + else: + $pagination_msg .= '' . t(1) . ''; $pagination_msg .= '·'; - $pagination_msg .= '' . t(2) . ''; + $pagination_msg .= '' . t(2) . ''; $pagination_msg .= '…'; - for ($i = $current_page - 5; $i <= $current_page + 5; $i++) { - if ($i == $current_page) { + for ($i = $current_page - 5; $i <= $current_page + 5; $i++): + if ($i == $current_page): $pagination_msg .= '' . t($i) . ''; - } else { - $pagination_msg .= '' . t($i) . ''; - } - if ($i < $current_page + 5) { $pagination_msg .= '·'; }; - } + else: + $pagination_msg .= '' . t($i) . ''; + endif; + if ($i < $current_page + 5): + $pagination_msg .= '·'; + endif; + endfor; $pagination_msg .= '…'; - $pagination_msg .= '' . t($total_pages - 1) . ''; + $pagination_msg .= '' . t($total_pages - 1) . ''; $pagination_msg .= '·'; - $pagination_msg .= '' . t($total_pages) . ''; - } - } + $pagination_msg .= '' . t($total_pages) . ''; + endif; + endif; ?> '; ?> + + +
    + bb2html(html::purify($item->title), 1); ?> +
    +

    +
    + add_paginator("top"); ?> + photo_top() ?> + photo_descmode == "top") and ($_description)): ?> +
    + +
    + resize_top($item) ?> + + file_url() . '" class="g-sb-preview" '; ?> + + + + resize_width; ?> + parent()->children(); ?> + +
    + rand_key != $item->rand_key)); $i++): + ?> + "> + resize_img(array("id" => "g-photo-id-{$item->id}", "class" => "g-resize", "alt" => $_title)) ?> + + + photo_descmode == "overlay") and ($_description)): ?> + More + + + + + +
    + resize_bottom($item) ?> +
    + photo_descmode == "bottom") and ($_description)): ?> +
    + + add_paginator("bottom"); ?> + photo_bottom() ?> +
    diff --git a/themes/greydragon/views/search.html.php b/themes/greydragon/views/search.html.php index d8045c7d..94fc170c 100644 --- a/themes/greydragon/views/search.html.php +++ b/themes/greydragon/views/search.html.php @@ -1,37 +1,43 @@ - - +

    $q)) ?>

    - -paginator() ?> - - + add_paginator("top"); ?>
      - - is_album()): ?> - - -
    • -

      - thumb_img() ?> -

      -

      title) ?>

      -
    • + is_album() ? "g-album" : "g-photo" ?> + "> ?> + get_thumb_element($item) ?> + ?>
    - - -paginator() ?> - - + add_paginator("bottom"); ?>

     

    %term", array("term" => $q)) ?>

    -
    - +
    \ No newline at end of file diff --git a/themes/greydragon/views/sidebar.html.php b/themes/greydragon/views/sidebar.html.php index da75de54..0cad333d 100644 --- a/themes/greydragon/views/sidebar.html.php +++ b/themes/greydragon/views/sidebar.html.php @@ -1,5 +1,8 @@ - -sidebar_top() ?> -
     
    -sidebar_blocks() ?> -sidebar_bottom() ?> + + +sidebar_top() ?> +
     
    +page_subtype == "album") or ($theme->page_subtype == "photo") or ($theme->page_subtype == "movie") or ($theme->item())): ?> +sidebar_blocks() ?> + +sidebar_bottom() ?> diff --git a/themes/greydragon/views/support/bbtohtml.php b/themes/greydragon/views/support/bbtohtml.php deleted file mode 100644 index c18faf4e..00000000 --- a/themes/greydragon/views/support/bbtohtml.php +++ /dev/null @@ -1,63 +0,0 @@ - "$1", - "#\\[i\\](.*?)\\[/i\\]#" => "$1", - "#\\[u\\](.*?)\\[/u\\]#" => "$1", - "#\\[s\\](.*?)\\[/s\\]#" => "$1", - "#\\[o\\](.*?)\\[/o\\]#" => "$1", - "#\\[url\\](.*?)\[/url\\]#" => "$1", - "#\\[url=(.*?)\\](.*?)\[/url\\]#" => "$2", - "#\\[mail=(.*?)\\](.*?)\[/mail\\]#" => "$2", - "#\\[img\\](.*?)\\[/img\\]#" => "\"\"", - "#\\[img=(.*?)\\](.*?)\[/img\\]#" => "\"$2\"", - "#\\[quote\\](.*?)\\[/quote\\]#" => "

    $1

    ", - "#\\[code\\](.*?)\\[/code\\]#" => "
    $1
    ", - "#\\[size=([^\\[]*)\\]([^\\[]*)\\[/size\\]#" => "$2", - "#\\[color=([^\\[]*)\\]([^\\[]*)\\[/color\\]#" => "$2", - "#\\[class=([^\\[]*)\\]([^\\[]*)\\[/class\\]#" => "$2", - "#\\[center\\](.*?)\\[/center\\]#" => "
    $1
    ", - "#\\[list\\](.*?)\\[/list\\]#" => "
      $1
    ", - "#\\[ul\\](.*?)\\[/ul\\]#" => "
      $1
    ", - "#\\[li\\](.*?)\\[/li\\]#" => "
  • $1
  • ", - ); - - // Replace any html brackets with HTML Entities to prevent executing HTML or script - // Don't use strip_tags here because it breaks [url] search by replacing & with amp - if ($mixmode == 1) - { - $newtext = str_replace("<", "<", $text); - $newtext = str_replace(">", ">", $newtext); - $newtext = str_replace(""", "\"", $newtext); - } else { - $newtext = str_replace("<", "<", $text); - $newtext = str_replace(">", ">", $newtext); - $newtext = str_replace("&quot;", """, $newtext); - } - - // Convert new line chars to html
    tags - $newtext = nl2br($newtext); - - if (strpos($text, "[") !== false) { - $newtext = preg_replace(array_keys($bbcode_mappings), array_values($bbcode_mappings), $newtext); - } - - return stripslashes($newtext); //stops slashing, useful when pulling from db -} - -?> \ No newline at end of file diff --git a/themes/greydragon/views/support/pagination.php b/themes/greydragon/views/support/pagination.php deleted file mode 100644 index e69de29b..00000000 diff --git a/themes/greydragon/views/tag_block.html.php b/themes/greydragon/views/tag_block.html.php index 6cb8acb9..f9bc5886 100644 --- a/themes/greydragon/views/tag_block.html.php +++ b/themes/greydragon/views/tag_block.html.php @@ -6,9 +6,19 @@ url, { max: 30, multiple: true, - multipleSeparator: ',', - cacheLength: 1} + multipleSeparator: ',', + cacheLength: 1} ); + + $("#g-add-tag-form").ajaxForm({ + dataType: "json", + success: function(data) { + if (data.result == "success") { + $("#g-tag-cloud").html(data.cloud); + } + $("#g-add-tag-form").resetForm(); + } + }); });
    "> diff --git a/themes/greydragon/views/user_profile.html.php b/themes/greydragon/views/user_profile.html.php new file mode 100644 index 00000000..b7d92f40 --- /dev/null +++ b/themes/greydragon/views/user_profile.html.php @@ -0,0 +1,50 @@ + + + +
    +

    $user->display_name())) ?>

    + + + + " + alt="display_name()) ?>" + class="g-avatar g-left" width="40" height="40" /> + + + +
    +

    title) ?>

    +
    + view ?> +
    +
    + +
    From d01599c1c172934b0fdc79ee3249b46420424441 Mon Sep 17 00:00:00 2001 From: Thomas Bleher Date: Mon, 30 Aug 2010 03:35:18 +0800 Subject: [PATCH 7/8] Add IPTC module Taken from http://gallery.menalto.com/node/95875 (file http://gallery.menalto.com/files/iptc_0.zip) Author: gcog (I just imported it into Git unchanged) --- modules/iptc/controllers/admin_iptc.php | 84 ++++++++++ modules/iptc/helpers/iptc.php | 207 ++++++++++++++++++++++++ modules/iptc/helpers/iptc_block.php | 43 +++++ modules/iptc/helpers/iptc_event.php | 42 +++++ modules/iptc/helpers/iptc_installer.php | 46 ++++++ modules/iptc/helpers/iptc_task.php | 88 ++++++++++ modules/iptc/lib/functions.php | 97 +++++++++++ modules/iptc/models/iptc_key.php | 21 +++ modules/iptc/models/iptc_record.php | 21 +++ modules/iptc/module.info | 3 + modules/iptc/views/admin_iptc.html.php | 7 + modules/iptc/views/iptc_block.html.php | 9 ++ 12 files changed, 668 insertions(+) create mode 100644 modules/iptc/controllers/admin_iptc.php create mode 100644 modules/iptc/helpers/iptc.php create mode 100644 modules/iptc/helpers/iptc_block.php create mode 100644 modules/iptc/helpers/iptc_event.php create mode 100644 modules/iptc/helpers/iptc_installer.php create mode 100644 modules/iptc/helpers/iptc_task.php create mode 100644 modules/iptc/lib/functions.php create mode 100644 modules/iptc/models/iptc_key.php create mode 100644 modules/iptc/models/iptc_record.php create mode 100644 modules/iptc/module.info create mode 100644 modules/iptc/views/admin_iptc.html.php create mode 100644 modules/iptc/views/iptc_block.html.php diff --git a/modules/iptc/controllers/admin_iptc.php b/modules/iptc/controllers/admin_iptc.php new file mode 100644 index 00000000..dd803951 --- /dev/null +++ b/modules/iptc/controllers/admin_iptc.php @@ -0,0 +1,84 @@ +content = new View("admin_iptc.html"); + $view->content->iptc_form = $this->_get_admin_form(); + print $view; + } + + public function saveprefs() { + // Save user preferences to the database. + + // Prevent Cross Site Request Forgery + access::verify_csrf(); + + // Make sure the user filled out the form properly. + $form = $this->_get_admin_form(); + if ($form->validate()) { + Kohana_Log::add("error",print_r($form,1)); + + // Save settings to Gallery's database. + foreach (iptc::keys() as $keyword => $iptcvar) { + $checkbox = false; + for ($i = 0; $i < count($form->Global->$keyword); $i++) { + if ($form->Global->$keyword->value[$i] == $keyword) { + $checkbox = true; + } + } + module::set_var("iptc", "show_".$keyword, $checkbox); + } + // Display a success message and redirect back to the TagsMap admin page. + message::success(t("Your settings have been saved.")); + url::redirect("admin/iptc"); + } + + // Else show the page with errors + $view = new Admin_View("admin.html"); + $view->content = new View("admin_iptc.html"); + $view->content->iptc_form = $form; + print $view; + } + + private function _get_admin_form() { + // Make a new Form. + $form = new Forge("admin/iptc/saveprefs", "", "post", array("id" => "g-iptc-adminForm")); + + // Create group for display settings + $iptc_display_group = $form->group("Global") + ->label(t("Display Settings")); + + $show = t("Show"); + foreach (iptc::keys() as $keyword => $iptcvar) { + unset($checkbox); + $checkbox[$keyword] = array($show." \"".$iptcvar[1]."\" ?", module::get_var("iptc", "show_".$keyword)); + $iptc_display_group->checklist($keyword) + ->options($checkbox); + } + // Add a save button to the form. + $form->submit("SaveSettings")->value(t("Save")); + + // Return the newly generated form. + return $form; + } +} diff --git a/modules/iptc/helpers/iptc.php b/modules/iptc/helpers/iptc.php new file mode 100644 index 00000000..cca0f61f --- /dev/null +++ b/modules/iptc/helpers/iptc.php @@ -0,0 +1,207 @@ +is_photo() && $item->mime_type == "image/jpeg") { + $info = getJpegHeader($item->file_path()); + if ($info !== FALSE) { + $iptcBlock = getIptcBlock($info); + if ($iptcBlock !== FALSE) { + $iptc = iptcparse($iptcBlock); + } else { + $iptc = array(); + } + $xmp = getXmpDom($info); + + foreach (self::keys() as $keyword => $iptcvar) { + $iptc_key = $iptcvar[0]; + $xpath = $iptcvar[2]; + $value = null; + if ($xpath != null) { + $value = getXmpValue($xmp, $xpath); + } + if ($value == null) { + if (!empty($iptc[$iptc_key])) { + $value = implode(";", $iptc[$iptc_key]); + if (function_exists("mb_detect_encoding") && mb_detect_encoding($value) != "UTF-8") { + $value = utf8_encode($value); + } + } + } + if ($value != null) { + $keys[$keyword] = Input::clean($value); + } + } + } + } + + $record = ORM::factory("iptc_record")->where("item_id", "=", $item->id)->find(); + if (!$record->loaded()) { + $record->item_id = $item->id; + } + $record->data = serialize($keys); + $record->key_count = count($keys); + $record->dirty = 0; + $record->save(); + } + + static function get($item) { + $iptc = array(); + $record = ORM::factory("iptc_record") + ->where("item_id", "=", $item->id) + ->find(); + if (!$record->loaded()) { + return array(); + } + + $definitions = self::keys(); + $keys = unserialize($record->data); + foreach ($keys as $key => $value) { + if (module::get_var("iptc", "show_".$key) == 1) + $iptc[] = array("caption" => $definitions[$key][1], "value" => $value); + } + + return $iptc; + } + + + public static function keys() { + if (!isset(self::$iptc_keys)) { + self::$iptc_keys = array( + "ObjectName" => array("2#005", + t("IPTC Object Name"), + "/x:xmpmeta/rdf:RDF/rdf:Description/dc:title/rdf:Alt/rdf:li" ), + "EditStatus" => array("2#007", + t("IPTC Edit Status"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@mediapro:Status" ), + "Category" => array("2#015", + t("IPTC Category"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:Category" ), + "SupplementalCategories" => array("2#020", + t("IPTC Categories"), + "/x:xmpmeta/rdf:RDF/rdf:Description/photoshop:SupplementalCategories/rdf:Bag/rdf:li" ), + "FixtureIdentifier" => array("2#022", + t("IPTC Identifier"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@mediapro:Event" ), + "Keywords" => array("2#025", + t("IPTC Keywords"), + "/x:xmpmeta/rdf:RDF/rdf:Description/dc:subject/rdf:Bag/rdf:li" ), + "LocationCode" => array("2#026", + t("IPTC Location Code"), + null ), + "SpecialInstructions" => array("2#040", + t("IPTC Instructions"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:Instructions" ), + "DateCreated" => array("2#055", + t("IPTC Created Date"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:DateCreated" ), + "ByLine" => array("2#080", + t("IPTC Author"), + "/x:xmpmeta/rdf:RDF/rdf:Description/dc:creator/rdf:Seq/rdf:li" ), + "ByLineTitle" => array("2#085", + t("IPTC Author Title"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:AuthorsPosition" ), + "City" => array("2#090", + t("IPTC City"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:City" ), + "SubLocation" => array("2#092", + t("IPTC SubLocation"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@Iptc4xmpCore:Location | /x:xmpmeta/rdf:RDF/rdf:Description/@mediapro:Location" ), + "ProvinceState" => array("2#095", + t("IPTC Province State"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:State" ), + "CountryCode" => array("2#100", + t("IPTC Country Code"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@Iptc4xmpCore:CountryCode" ), + "CountryName" => array("2#101", + t("IPTC Country Name"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:Country" ), + "Transmission" => array("2#103", + t("IPTC Transmission,"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:TransmissionReference" ), + "HeadLine" => array("2#105", + t("IPTC HeadLine"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:Headline" ), + "Credit" => array("2#110", + t("IPTC Credit"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:Credit | /x:xmpmeta/rdf:RDF/rdf:Description/photoshop:Credit" ), + "Source" => array("2#115", + t("IPTC Source"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:Source" ), + "Copyright" => array("2#116", + t("IPTC Copyright"), + "/x:xmpmeta/rdf:RDF/rdf:Description/dc:rights/rdf:Alt/rdf:li" ), + "Contacts" => array("2#118", + t("IPTC Contacts"), + "/x:xmpmeta/rdf:RDF/rdf:Description/mediapro:People/rdf:Bag/rdf:li" ), + "Caption" => array("2#120", + t("IPTC Caption"), + "/x:xmpmeta/rdf:RDF/rdf:Description/dc:description/rdf:Alt/rdf:li" ), + "Redactor" => array("2#122", + t("IPTC Redactor"), + "/x:xmpmeta/rdf:RDF/rdf:Description/@photoshop:CaptionWriter" ) + ); + } + return self::$iptc_keys; + } + + + static function stats() { + $missing_iptc = db::build() + ->select("items.id") + ->from("items") + ->join("iptc_records", "items.id", "iptc_records.item_id", "left") + ->where("type", "=", "photo") + ->and_open() + ->where("iptc_records.item_id", "IS", null) + ->or_where("iptc_records.dirty", "=", 1) + ->close() + ->execute() + ->count(); + + $total_items = ORM::factory("item")->where("type", "=", "photo")->count_all(); + if (!$total_items) { + return array(0, 0, 0); + } + return array($missing_iptc, $total_items, + round(100 * (($total_items - $missing_iptc) / $total_items))); + } + + static function check_index() { + list ($remaining) = iptc::stats(); + if ($remaining) { + site_status::warning( + t('Your Iptc index needs to be updated. Fix this now', + array("url" => html::mark_clean(url::site("admin/maintenance/start/iptc_task::update_index?csrf=__CSRF__")))), + "iptc_index_out_of_date"); + } + } +} diff --git a/modules/iptc/helpers/iptc_block.php b/modules/iptc/helpers/iptc_block.php new file mode 100644 index 00000000..1a6ed955 --- /dev/null +++ b/modules/iptc/helpers/iptc_block.php @@ -0,0 +1,43 @@ + t("IPTC info")); + } + + static function get($block_id, $theme) { + $block = ""; + switch ($block_id) { + case "iptc": + if ($theme->item()) { + $details = iptc::get($theme->item()); + if (count($details) > 0) { + $block = new Block(); + $block->css_id = "g-metadata"; + $block->title = t("IPTC info"); + $block->content = new View("iptc_block.html"); + $block->content->details = $details; + } + } + break; + } + return $block; + } +} \ No newline at end of file diff --git a/modules/iptc/helpers/iptc_event.php b/modules/iptc/helpers/iptc_event.php new file mode 100644 index 00000000..c7b4a6cc --- /dev/null +++ b/modules/iptc/helpers/iptc_event.php @@ -0,0 +1,42 @@ +is_photo()) { + iptc::extract($item); + } + } + + static function item_deleted($item) { + db::build() + ->delete("iptc_records") + ->where("item_id", "=", $item->id) + ->execute(); + } + + static function admin_menu($menu, $theme) { + // Add a link to the admin page to the Settings menu. + $menu->get("settings_menu") + ->append(Menu::factory("link") + ->id("iptc") + ->label(t("IPTC Settings")) + ->url(url::site("admin/iptc"))); + } +} diff --git a/modules/iptc/helpers/iptc_installer.php b/modules/iptc/helpers/iptc_installer.php new file mode 100644 index 00000000..11a17a56 --- /dev/null +++ b/modules/iptc/helpers/iptc_installer.php @@ -0,0 +1,46 @@ +query("CREATE TABLE IF NOT EXISTS {iptc_records} ( + `id` int(9) NOT NULL auto_increment, + `item_id` INTEGER(9) NOT NULL, + `key_count` INTEGER(9) default 0, + `data` TEXT, + `dirty` BOOLEAN default 1, + PRIMARY KEY (`id`), + KEY(`item_id`)) + DEFAULT CHARSET=utf8;"); + module::set_version("iptc", 1); + } + + static function activate() { + iptc::check_index(); + } + + static function deactivate() { + site_status::clear("iptc_index_out_of_date"); + } + + static function uninstall() { + Database::instance()->query("DROP TABLE IF EXISTS {iptc_records};"); + } +} diff --git a/modules/iptc/helpers/iptc_task.php b/modules/iptc/helpers/iptc_task.php new file mode 100644 index 00000000..d4715bff --- /dev/null +++ b/modules/iptc/helpers/iptc_task.php @@ -0,0 +1,88 @@ +delete("iptc_records") + ->where("item_id", "NOT IN", + db::build()->select("id")->from("items")->where("type", "=", "photo")) + ->execute(); + + list ($remaining, $total, $percent) = iptc::stats(); + return array(Task_Definition::factory() + ->callback("iptc_task::update_index") + ->name(t("Extract Iptc data")) + ->description($remaining + ? t2("1 photo needs to be scanned", + "%count (%percent%) of your photos need to be scanned", + $remaining, array("percent" => (100 - $percent))) + : t("IPTC data is up-to-date")) + ->severity($remaining ? log::WARNING : log::SUCCESS)); + } + + static function update_index($task) { + try { + $completed = $task->get("completed", 0); + + $start = microtime(true); + foreach (ORM::factory("item") + ->join("iptc_records", "items.id", "iptc_records.item_id", "left") + ->where("type", "=", "photo") + ->and_open() + ->where("iptc_records.item_id", "IS", null) + ->or_where("iptc_records.dirty", "=", 1) + ->close() + ->find_all() as $item) { + // The query above can take a long time, so start the timer after its done + // to give ourselves a little time to actually process rows. + if (!isset($start)) { + $start = microtime(true); + } + + iptc::extract($item); + $completed++; + + if (microtime(true) - $start > 1.5) { + break; + } + } + + list ($remaining, $total, $percent) = iptc::stats(); + $task->set("completed", $completed); + if ($remaining == 0 || !($remaining + $completed)) { + $task->done = true; + $task->state = "success"; + site_status::clear("iptc_index_out_of_date"); + $task->percent_complete = 100; + } else { + $task->percent_complete = round(100 * $completed / ($remaining + $completed)); + } + $task->status = t2("one record updated, index is %percent% up-to-date", + "%count records updated, index is %percent% up-to-date", + $completed, array("percent" => $percent)); + } catch (Exception $e) { + $task->done = true; + $task->state = "error"; + $task->status = $e->getMessage(); + $task->log((string)$e); + } + } +} diff --git a/modules/iptc/lib/functions.php b/modules/iptc/lib/functions.php new file mode 100644 index 00000000..91ca129f --- /dev/null +++ b/modules/iptc/lib/functions.php @@ -0,0 +1,97 @@ + 0xD7) { + $size = fread($file, 2); + if ($size === FALSE) { + fclose($file); + return $result; + } + $sizeOfSegment = unpack("nV", $size); + $data = fread($file, $sizeOfSegment['V']-2); + if ($data === FALSE) { + fclose($file); + return $result; + } + if ($result === FALSE) + unset($result); + $result[] = array("type" => $typeOfSegment, "data" => $data); // Multiple segments can have the same type like Exif and XMP + } + } while (!feof($file)); + fclose($file); + return $result; +} + + +function getIptcBlock($jpegHeader) +{ + for ($i = 0; $i < count($jpegHeader); $i++) { + if ($jpegHeader[$i]['type'] == 0xED) { + if (strncmp($jpegHeader[$i]['data'], "Photoshop 3.0\x00", 14) == 0) { + return $jpegHeader[$i]['data']; + } + } + } + return FALSE; +} + + +function getXmpDom($jpegHeader) +{ + for ($i = 0; $i < count($jpegHeader); $i++) { + if ($jpegHeader[$i]['type'] == 0xE1) { + if (strncmp($jpegHeader[$i]['data'], "http://ns.adobe.com/xap/1.0/\x00", 29) == 0) { + $xmlstr = substr($jpegHeader[$i]['data'], 29); + $doc = new DOMDocument(); + $doc->loadXML($xmlstr); + return $doc; + } + } + } + return FALSE; +} + + +function getXmpValue($dom, $xpathQuery) +{ + if ($dom === FALSE) + return null; + $xpath = new DOMXPath($dom); + $xpath->registerNamespace('rdf', "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); + $xpath->registerNamespace('photoshop', "http://ns.adobe.com/photoshop/1.0/"); + $xpath->registerNamespace('Iptc4xmpCore', "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"); + $xpath->registerNamespace('dc', "http://purl.org/dc/elements/1.1/"); + $xpath->registerNamespace('mediapro', "http://ns.iview-multimedia.com/mediapro/1.0/"); + $nodeList = $xpath->query($xpathQuery); + $result = ""; + foreach ($nodeList as $node) { + if (!empty($result)) + $result .= ';'; + $result .= $node->nodeValue; + } + return $result; +} + diff --git a/modules/iptc/models/iptc_key.php b/modules/iptc/models/iptc_key.php new file mode 100644 index 00000000..fadcb37b --- /dev/null +++ b/modules/iptc/models/iptc_key.php @@ -0,0 +1,21 @@ + +
    +

    +
    + +
    +
    diff --git a/modules/iptc/views/iptc_block.html.php b/modules/iptc/views/iptc_block.html.php new file mode 100644 index 00000000..c446935a --- /dev/null +++ b/modules/iptc/views/iptc_block.html.php @@ -0,0 +1,9 @@ + + From b427805a69944f0c46dff96e34d3c0c0631c3a3a Mon Sep 17 00:00:00 2001 From: mamouneyya Date: Sun, 29 Aug 2010 22:03:02 +0800 Subject: [PATCH 8/8] Merge remote branch 'gallery3-contrib/master' --- themes/browny_wind/css/fix-ie.css | 23 +++++++++++++++++++++-- themes/browny_wind/css/screen.css | 26 ++++++++++++++++++++++++++ themes/browny_wind/views/page.html.php | 2 +- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/themes/browny_wind/css/fix-ie.css b/themes/browny_wind/css/fix-ie.css index f7f08486..0633ff07 100644 --- a/themes/browny_wind/css/fix-ie.css +++ b/themes/browny_wind/css/fix-ie.css @@ -1,5 +1,5 @@ /** - * Fix display in IE 6, 7 + * Fix display in IE 6, 7, and 8 */ #g-banner { @@ -7,6 +7,10 @@ zoom: 1; } +#g-sidebar { + overflow: hidden; +} + #g-photo, #g-movie { zoom: 1; @@ -22,8 +26,23 @@ input.submit { display: inline !important; } +.g-short-form input.text, +.g-short-form input.submit { + font-size: 1em; + line-height: 1em; + padding: .38em .3em; +} + +#g-search-form input#q { + width: 300px; +} + #g-add-tag-form input.textbox { - width: 110px; + width: 110px !important; +} + +#g-add-tag-form input[type='submit'] { + padding: .3em 0 !important; } #g-dialog .g-cancel { diff --git a/themes/browny_wind/css/screen.css b/themes/browny_wind/css/screen.css index 3e16f6a6..15c04991 100644 --- a/themes/browny_wind/css/screen.css +++ b/themes/browny_wind/css/screen.css @@ -329,6 +329,32 @@ td { background-color: #fff; } +/* Permissions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +#g-edit-permissions-form td { + background-image: none; +} + +#g-edit-permissions-form fieldset { + border: 1px solid #ccc; +} + +#g-permissions .g-denied { + background-color: #fcc; +} + +#g-permissions .g-allowed { + background-color: #fcf9ce; +} + +#g-permissions .g-breadcrumbs a { + border: 1px solid #fff; +} + +#g-permissions .g-active a { + border: 1px solid #ddd; + background: #eee; +} + /** ******************************************************************* * 5) Navigation and menus *********************************************************************/ diff --git a/themes/browny_wind/views/page.html.php b/themes/browny_wind/views/page.html.php index ca29a809..72df044a 100644 --- a/themes/browny_wind/views/page.html.php +++ b/themes/browny_wind/views/page.html.php @@ -29,7 +29,7 @@ css("themeroller/ui.base.css") ?> css("gallery.common.css") ?> css("screen.css") ?> -