From 86d093b019989bd1f251154f16429facc222e445 Mon Sep 17 00:00:00 2001 From: Seth Meranda <smeranda2@unl.edu> Date: Wed, 30 Jun 2010 20:55:12 +0000 Subject: [PATCH] add the latest version of tidypics --- plugins/tidypics/actions/addalbum.php | 74 + plugins/tidypics/actions/addtag.php | 104 + .../tidypics/actions/create_thumbnails.php | 61 + plugins/tidypics/actions/delete.php | 121 + plugins/tidypics/actions/deletetag.php | 57 + plugins/tidypics/actions/edit.php | 81 + plugins/tidypics/actions/edit_multi.php | 66 + .../tidypics/actions/flickrImportPhotoset.php | 340 +++ plugins/tidypics/actions/flickrSetup.php | 38 + plugins/tidypics/actions/imtest.php | 19 + plugins/tidypics/actions/settings.php | 72 + plugins/tidypics/actions/upgrade.php | 40 + plugins/tidypics/actions/upload.php | 252 ++ plugins/tidypics/contributions.txt | 364 +++ plugins/tidypics/docs/configure_server.txt | 55 + plugins/tidypics/docs/css_guide.txt | 87 + plugins/tidypics/docs/extending_tidypics.txt | 39 + .../fonts/LiberationSerif-Regular.ttf | Bin 0 -> 172964 bytes plugins/tidypics/fonts/License.txt | 13 + plugins/tidypics/graphics/empty_album.png | Bin 0 -> 1389 bytes plugins/tidypics/graphics/icons/album.gif | Bin 0 -> 1411 bytes plugins/tidypics/graphics/icons/general.jpg | Bin 0 -> 7036 bytes .../graphics/icons/river_icon_album.gif | Bin 0 -> 398 bytes .../graphics/icons/river_icon_image.gif | Bin 0 -> 945 bytes .../graphics/icons/river_icon_tag.gif | Bin 0 -> 184 bytes .../tidypics/graphics/image_error_large.png | Bin 0 -> 2208 bytes .../tidypics/graphics/image_error_small.png | Bin 0 -> 2351 bytes .../tidypics/graphics/image_error_thumb.png | Bin 0 -> 759 bytes plugins/tidypics/graphics/loader.gif | Bin 0 -> 2545 bytes plugins/tidypics/graphics/spacer.gif | Bin 0 -> 43 bytes plugins/tidypics/languages/da.php | 195 ++ plugins/tidypics/languages/de.php | 227 ++ plugins/tidypics/languages/en.php | 231 ++ plugins/tidypics/languages/es.php | 191 ++ plugins/tidypics/languages/fr.php | 159 ++ plugins/tidypics/languages/he.php | 149 ++ plugins/tidypics/languages/it.php | 113 + plugins/tidypics/languages/pl.php | 113 + plugins/tidypics/languages/ru.php | 113 + plugins/tidypics/languages/tr.php | 88 + plugins/tidypics/lib/album.php | 19 + plugins/tidypics/lib/exif.php | 109 + plugins/tidypics/lib/flickr.php | 8 + plugins/tidypics/lib/image.php | 179 ++ plugins/tidypics/lib/migrate.php | 299 +++ plugins/tidypics/lib/phpFlickr/PEAR/DB.php | 1388 +++++++++++ .../tidypics/lib/phpFlickr/PEAR/DB/common.php | 2157 +++++++++++++++++ .../tidypics/lib/phpFlickr/PEAR/DB/mysql.php | 1034 ++++++++ .../tidypics/lib/phpFlickr/PEAR/DB/pgsql.php | 1097 +++++++++ .../lib/phpFlickr/PEAR/DB/storage.php | 504 ++++ .../lib/phpFlickr/PEAR/HTTP/Request.php | 1484 ++++++++++++ .../phpFlickr/PEAR/HTTP/Request/Listener.php | 106 + .../lib/phpFlickr/PEAR/Net/Socket.php | 528 ++++ .../tidypics/lib/phpFlickr/PEAR/Net/URL.php | 410 ++++ plugins/tidypics/lib/phpFlickr/PEAR/PEAR.php | 1108 +++++++++ plugins/tidypics/lib/phpFlickr/README.txt | 215 ++ plugins/tidypics/lib/phpFlickr/auth.php | 37 + plugins/tidypics/lib/phpFlickr/example.php | 30 + plugins/tidypics/lib/phpFlickr/getToken.php | 19 + plugins/tidypics/lib/phpFlickr/phpFlickr.php | 1453 +++++++++++ plugins/tidypics/lib/resize.php | 537 ++++ plugins/tidypics/lib/tidypics.php | 295 +++ plugins/tidypics/lib/watermark.php | 193 ++ plugins/tidypics/manifest.xml | 10 + plugins/tidypics/mostvieweddashboard.php | 44 + plugins/tidypics/pages/admin.php | 24 + plugins/tidypics/pages/download.php | 52 + plugins/tidypics/pages/edit.php | 51 + plugins/tidypics/pages/edit_multiple.php | 47 + .../tidypics/pages/flickr/importPhotosets.php | 50 + plugins/tidypics/pages/flickr/setup.php | 17 + plugins/tidypics/pages/friends.php | 41 + plugins/tidypics/pages/lists/flickr.php | 60 + plugins/tidypics/pages/lists/highestrated.php | 65 + .../tidypics/pages/lists/highestvotecount.php | 50 + .../pages/lists/mostcommentedimages.php | 43 + .../lists/mostcommentedimagesthismonth.php | 50 + .../pages/lists/mostcommentedimagestoday.php | 50 + .../tidypics/pages/lists/mostrecentimages.php | 56 + .../tidypics/pages/lists/mostviewedimages.php | 86 + .../pages/lists/mostviewedimageslastmonth.php | 50 + .../pages/lists/mostviewedimagesthismonth.php | 50 + .../pages/lists/mostviewedimagesthisyear.php | 50 + .../pages/lists/mostviewedimagestoday.php | 50 + .../pages/lists/recentlycommented.php | 72 + .../tidypics/pages/lists/recentlyviewed.php | 65 + plugins/tidypics/pages/lists/recentvotes.php | 52 + plugins/tidypics/pages/newalbum.php | 32 + plugins/tidypics/pages/ownedalbums.php | 53 + plugins/tidypics/pages/server_analysis.php | 138 ++ plugins/tidypics/pages/tagged.php | 50 + plugins/tidypics/pages/thumbnail.php | 76 + plugins/tidypics/pages/upload.php | 42 + plugins/tidypics/pages/viewalbum.php | 68 + plugins/tidypics/pages/viewimage.php | 58 + plugins/tidypics/pages/world.php | 29 + plugins/tidypics/start.php | 445 ++++ plugins/tidypics/thumbnail.php | 78 + .../tidypics/vendors/PicLensLite/NoFlash.jpg | Bin 0 -> 72549 bytes .../vendors/PicLensLite/PicLensLite.swf | Bin 0 -> 251875 bytes .../vendors/PicLensLite/piclens_optimized.js | 20 + .../vendors/jquery.imgareaselect-0.7.js | 614 +++++ .../tidypics/vendors/jquery.quicksearch.js | 347 +++ .../tidypics/vendors/lytebox/images/blank.gif | Bin 0 -> 43 bytes .../vendors/lytebox/images/close_blue.png | Bin 0 -> 1788 bytes .../vendors/lytebox/images/close_gold.png | Bin 0 -> 1652 bytes .../vendors/lytebox/images/close_green.png | Bin 0 -> 1525 bytes .../vendors/lytebox/images/close_grey.png | Bin 0 -> 1715 bytes .../vendors/lytebox/images/close_red.png | Bin 0 -> 1525 bytes .../vendors/lytebox/images/loading.gif | Bin 0 -> 2767 bytes .../vendors/lytebox/images/next_blue.gif | Bin 0 -> 733 bytes .../vendors/lytebox/images/next_gold.gif | Bin 0 -> 732 bytes .../vendors/lytebox/images/next_green.gif | Bin 0 -> 732 bytes .../vendors/lytebox/images/next_grey.gif | Bin 0 -> 731 bytes .../vendors/lytebox/images/next_red.gif | Bin 0 -> 732 bytes .../vendors/lytebox/images/pause_blue.png | Bin 0 -> 1357 bytes .../vendors/lytebox/images/pause_gold.png | Bin 0 -> 1207 bytes .../vendors/lytebox/images/pause_green.png | Bin 0 -> 1149 bytes .../vendors/lytebox/images/pause_grey.png | Bin 0 -> 1282 bytes .../vendors/lytebox/images/pause_red.png | Bin 0 -> 1133 bytes .../vendors/lytebox/images/play_blue.png | Bin 0 -> 1231 bytes .../vendors/lytebox/images/play_gold.png | Bin 0 -> 1141 bytes .../vendors/lytebox/images/play_green.png | Bin 0 -> 1097 bytes .../vendors/lytebox/images/play_grey.png | Bin 0 -> 1178 bytes .../vendors/lytebox/images/play_red.png | Bin 0 -> 1079 bytes .../vendors/lytebox/images/prev_blue.gif | Bin 0 -> 748 bytes .../vendors/lytebox/images/prev_gold.gif | Bin 0 -> 748 bytes .../vendors/lytebox/images/prev_green.gif | Bin 0 -> 748 bytes .../vendors/lytebox/images/prev_grey.gif | Bin 0 -> 748 bytes .../vendors/lytebox/images/prev_red.gif | Bin 0 -> 748 bytes plugins/tidypics/vendors/lytebox/lytebox.css | 93 + plugins/tidypics/vendors/lytebox/lytebox.js | 843 +++++++ .../views/default/annotation/annotate.php | 21 + .../tidypics/views/default/object/album.php | 161 ++ .../tidypics/views/default/object/image.php | 231 ++ .../default/river/object/album/create.php | 42 + .../default/river/object/image/create.php | 29 + .../views/default/river/object/image/tag.php | 23 + .../views/default/settings/tidypics/edit.php | 12 + .../views/default/tidypics/admin/help.php | 25 + .../views/default/tidypics/admin/imagelib.php | 62 + .../views/default/tidypics/admin/settings.php | 25 + .../views/default/tidypics/admin/stats.php | 35 + .../default/tidypics/admin/thumbnails.php | 33 + .../views/default/tidypics/admin/tidypics.php | 60 + .../views/default/tidypics/albums.php | 51 + .../views/default/tidypics/breadcrumbs.php | 22 + .../default/tidypics/content_wrapper.php | 10 + .../tidypics/views/default/tidypics/css.php | 301 +++ .../tidypics/views/default/tidypics/exif.php | 14 + .../views/default/tidypics/forms/edit.php | 128 + .../default/tidypics/forms/edit_multi.php | 58 + .../views/default/tidypics/forms/settings.php | 158 ++ .../default/tidypics/forms/setupFlickr.php | 42 + .../views/default/tidypics/forms/upload.php | 99 + .../views/default/tidypics/gallery.php | 67 + .../default/tidypics/groupprofile_albums.php | 18 + .../views/default/tidypics/hover_menu.php | 12 + .../views/default/tidypics/image_menu.php | 51 + .../views/default/tidypics/js/slideshow.php | 2 + .../views/default/tidypics/js/tagging.php | 304 +++ .../views/default/tidypics/tagging.php | 89 + .../views/default/widgets/album_view/edit.php | 24 + .../views/default/widgets/album_view/view.php | 13 + .../default/widgets/latest_photos/edit.php | 15 + .../default/widgets/latest_photos/view.php | 15 + .../views/rss/extensions/tidypics/channel.php | 1 + .../views/rss/extensions/tidypics/xmlns.php | 1 + plugins/tidypics/views/rss/object/album.php | 54 + plugins/tidypics/views/rss/object/file.php | 23 + plugins/tidypics/views/rss/object/image.php | 19 + .../views/rss/pageshells/pageshell.php | 46 + .../views/rss/tidypics/content_wrapper.php | 2 + .../tidypics/views/rss/tidypics/gallery.php | 18 + 174 files changed, 23258 insertions(+) create mode 100644 plugins/tidypics/actions/addalbum.php create mode 100644 plugins/tidypics/actions/addtag.php create mode 100644 plugins/tidypics/actions/create_thumbnails.php create mode 100644 plugins/tidypics/actions/delete.php create mode 100644 plugins/tidypics/actions/deletetag.php create mode 100644 plugins/tidypics/actions/edit.php create mode 100644 plugins/tidypics/actions/edit_multi.php create mode 100644 plugins/tidypics/actions/flickrImportPhotoset.php create mode 100644 plugins/tidypics/actions/flickrSetup.php create mode 100644 plugins/tidypics/actions/imtest.php create mode 100644 plugins/tidypics/actions/settings.php create mode 100644 plugins/tidypics/actions/upgrade.php create mode 100644 plugins/tidypics/actions/upload.php create mode 100644 plugins/tidypics/contributions.txt create mode 100644 plugins/tidypics/docs/configure_server.txt create mode 100644 plugins/tidypics/docs/css_guide.txt create mode 100644 plugins/tidypics/docs/extending_tidypics.txt create mode 100644 plugins/tidypics/fonts/LiberationSerif-Regular.ttf create mode 100644 plugins/tidypics/fonts/License.txt create mode 100644 plugins/tidypics/graphics/empty_album.png create mode 100644 plugins/tidypics/graphics/icons/album.gif create mode 100644 plugins/tidypics/graphics/icons/general.jpg create mode 100644 plugins/tidypics/graphics/icons/river_icon_album.gif create mode 100644 plugins/tidypics/graphics/icons/river_icon_image.gif create mode 100644 plugins/tidypics/graphics/icons/river_icon_tag.gif create mode 100644 plugins/tidypics/graphics/image_error_large.png create mode 100644 plugins/tidypics/graphics/image_error_small.png create mode 100644 plugins/tidypics/graphics/image_error_thumb.png create mode 100644 plugins/tidypics/graphics/loader.gif create mode 100644 plugins/tidypics/graphics/spacer.gif create mode 100644 plugins/tidypics/languages/da.php create mode 100644 plugins/tidypics/languages/de.php create mode 100644 plugins/tidypics/languages/en.php create mode 100644 plugins/tidypics/languages/es.php create mode 100644 plugins/tidypics/languages/fr.php create mode 100644 plugins/tidypics/languages/he.php create mode 100644 plugins/tidypics/languages/it.php create mode 100644 plugins/tidypics/languages/pl.php create mode 100644 plugins/tidypics/languages/ru.php create mode 100644 plugins/tidypics/languages/tr.php create mode 100644 plugins/tidypics/lib/album.php create mode 100644 plugins/tidypics/lib/exif.php create mode 100644 plugins/tidypics/lib/flickr.php create mode 100644 plugins/tidypics/lib/image.php create mode 100644 plugins/tidypics/lib/migrate.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/DB.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/DB/common.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/DB/mysql.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/DB/pgsql.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/DB/storage.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request/Listener.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/Net/Socket.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/Net/URL.php create mode 100644 plugins/tidypics/lib/phpFlickr/PEAR/PEAR.php create mode 100644 plugins/tidypics/lib/phpFlickr/README.txt create mode 100644 plugins/tidypics/lib/phpFlickr/auth.php create mode 100644 plugins/tidypics/lib/phpFlickr/example.php create mode 100644 plugins/tidypics/lib/phpFlickr/getToken.php create mode 100644 plugins/tidypics/lib/phpFlickr/phpFlickr.php create mode 100644 plugins/tidypics/lib/resize.php create mode 100644 plugins/tidypics/lib/tidypics.php create mode 100644 plugins/tidypics/lib/watermark.php create mode 100644 plugins/tidypics/manifest.xml create mode 100644 plugins/tidypics/mostvieweddashboard.php create mode 100644 plugins/tidypics/pages/admin.php create mode 100644 plugins/tidypics/pages/download.php create mode 100644 plugins/tidypics/pages/edit.php create mode 100644 plugins/tidypics/pages/edit_multiple.php create mode 100644 plugins/tidypics/pages/flickr/importPhotosets.php create mode 100644 plugins/tidypics/pages/flickr/setup.php create mode 100644 plugins/tidypics/pages/friends.php create mode 100644 plugins/tidypics/pages/lists/flickr.php create mode 100644 plugins/tidypics/pages/lists/highestrated.php create mode 100644 plugins/tidypics/pages/lists/highestvotecount.php create mode 100644 plugins/tidypics/pages/lists/mostcommentedimages.php create mode 100644 plugins/tidypics/pages/lists/mostcommentedimagesthismonth.php create mode 100644 plugins/tidypics/pages/lists/mostcommentedimagestoday.php create mode 100644 plugins/tidypics/pages/lists/mostrecentimages.php create mode 100644 plugins/tidypics/pages/lists/mostviewedimages.php create mode 100644 plugins/tidypics/pages/lists/mostviewedimageslastmonth.php create mode 100644 plugins/tidypics/pages/lists/mostviewedimagesthismonth.php create mode 100644 plugins/tidypics/pages/lists/mostviewedimagesthisyear.php create mode 100644 plugins/tidypics/pages/lists/mostviewedimagestoday.php create mode 100644 plugins/tidypics/pages/lists/recentlycommented.php create mode 100644 plugins/tidypics/pages/lists/recentlyviewed.php create mode 100644 plugins/tidypics/pages/lists/recentvotes.php create mode 100644 plugins/tidypics/pages/newalbum.php create mode 100644 plugins/tidypics/pages/ownedalbums.php create mode 100644 plugins/tidypics/pages/server_analysis.php create mode 100644 plugins/tidypics/pages/tagged.php create mode 100644 plugins/tidypics/pages/thumbnail.php create mode 100644 plugins/tidypics/pages/upload.php create mode 100644 plugins/tidypics/pages/viewalbum.php create mode 100644 plugins/tidypics/pages/viewimage.php create mode 100644 plugins/tidypics/pages/world.php create mode 100644 plugins/tidypics/start.php create mode 100644 plugins/tidypics/thumbnail.php create mode 100644 plugins/tidypics/vendors/PicLensLite/NoFlash.jpg create mode 100644 plugins/tidypics/vendors/PicLensLite/PicLensLite.swf create mode 100644 plugins/tidypics/vendors/PicLensLite/piclens_optimized.js create mode 100644 plugins/tidypics/vendors/jquery.imgareaselect-0.7.js create mode 100644 plugins/tidypics/vendors/jquery.quicksearch.js create mode 100644 plugins/tidypics/vendors/lytebox/images/blank.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/close_blue.png create mode 100644 plugins/tidypics/vendors/lytebox/images/close_gold.png create mode 100644 plugins/tidypics/vendors/lytebox/images/close_green.png create mode 100644 plugins/tidypics/vendors/lytebox/images/close_grey.png create mode 100644 plugins/tidypics/vendors/lytebox/images/close_red.png create mode 100644 plugins/tidypics/vendors/lytebox/images/loading.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/next_blue.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/next_gold.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/next_green.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/next_grey.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/next_red.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/pause_blue.png create mode 100644 plugins/tidypics/vendors/lytebox/images/pause_gold.png create mode 100644 plugins/tidypics/vendors/lytebox/images/pause_green.png create mode 100644 plugins/tidypics/vendors/lytebox/images/pause_grey.png create mode 100644 plugins/tidypics/vendors/lytebox/images/pause_red.png create mode 100644 plugins/tidypics/vendors/lytebox/images/play_blue.png create mode 100644 plugins/tidypics/vendors/lytebox/images/play_gold.png create mode 100644 plugins/tidypics/vendors/lytebox/images/play_green.png create mode 100644 plugins/tidypics/vendors/lytebox/images/play_grey.png create mode 100644 plugins/tidypics/vendors/lytebox/images/play_red.png create mode 100644 plugins/tidypics/vendors/lytebox/images/prev_blue.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/prev_gold.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/prev_green.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/prev_grey.gif create mode 100644 plugins/tidypics/vendors/lytebox/images/prev_red.gif create mode 100644 plugins/tidypics/vendors/lytebox/lytebox.css create mode 100644 plugins/tidypics/vendors/lytebox/lytebox.js create mode 100644 plugins/tidypics/views/default/annotation/annotate.php create mode 100644 plugins/tidypics/views/default/object/album.php create mode 100644 plugins/tidypics/views/default/object/image.php create mode 100644 plugins/tidypics/views/default/river/object/album/create.php create mode 100644 plugins/tidypics/views/default/river/object/image/create.php create mode 100644 plugins/tidypics/views/default/river/object/image/tag.php create mode 100644 plugins/tidypics/views/default/settings/tidypics/edit.php create mode 100644 plugins/tidypics/views/default/tidypics/admin/help.php create mode 100644 plugins/tidypics/views/default/tidypics/admin/imagelib.php create mode 100644 plugins/tidypics/views/default/tidypics/admin/settings.php create mode 100644 plugins/tidypics/views/default/tidypics/admin/stats.php create mode 100644 plugins/tidypics/views/default/tidypics/admin/thumbnails.php create mode 100644 plugins/tidypics/views/default/tidypics/admin/tidypics.php create mode 100644 plugins/tidypics/views/default/tidypics/albums.php create mode 100644 plugins/tidypics/views/default/tidypics/breadcrumbs.php create mode 100644 plugins/tidypics/views/default/tidypics/content_wrapper.php create mode 100644 plugins/tidypics/views/default/tidypics/css.php create mode 100644 plugins/tidypics/views/default/tidypics/exif.php create mode 100644 plugins/tidypics/views/default/tidypics/forms/edit.php create mode 100644 plugins/tidypics/views/default/tidypics/forms/edit_multi.php create mode 100644 plugins/tidypics/views/default/tidypics/forms/settings.php create mode 100644 plugins/tidypics/views/default/tidypics/forms/setupFlickr.php create mode 100644 plugins/tidypics/views/default/tidypics/forms/upload.php create mode 100644 plugins/tidypics/views/default/tidypics/gallery.php create mode 100644 plugins/tidypics/views/default/tidypics/groupprofile_albums.php create mode 100644 plugins/tidypics/views/default/tidypics/hover_menu.php create mode 100644 plugins/tidypics/views/default/tidypics/image_menu.php create mode 100644 plugins/tidypics/views/default/tidypics/js/slideshow.php create mode 100644 plugins/tidypics/views/default/tidypics/js/tagging.php create mode 100644 plugins/tidypics/views/default/tidypics/tagging.php create mode 100644 plugins/tidypics/views/default/widgets/album_view/edit.php create mode 100644 plugins/tidypics/views/default/widgets/album_view/view.php create mode 100644 plugins/tidypics/views/default/widgets/latest_photos/edit.php create mode 100644 plugins/tidypics/views/default/widgets/latest_photos/view.php create mode 100644 plugins/tidypics/views/rss/extensions/tidypics/channel.php create mode 100644 plugins/tidypics/views/rss/extensions/tidypics/xmlns.php create mode 100644 plugins/tidypics/views/rss/object/album.php create mode 100644 plugins/tidypics/views/rss/object/file.php create mode 100644 plugins/tidypics/views/rss/object/image.php create mode 100644 plugins/tidypics/views/rss/pageshells/pageshell.php create mode 100644 plugins/tidypics/views/rss/tidypics/content_wrapper.php create mode 100644 plugins/tidypics/views/rss/tidypics/gallery.php diff --git a/plugins/tidypics/actions/addalbum.php b/plugins/tidypics/actions/addalbum.php new file mode 100644 index 00000000..8df488a9 --- /dev/null +++ b/plugins/tidypics/actions/addalbum.php @@ -0,0 +1,74 @@ +<?php + /** + * Tidypics Add New Album Action + * + */ + + // Make sure we're logged in + gatekeeper(); + + // Get input data + $title = get_input('tidypicstitle'); + $body = get_input('tidypicsbody'); + $tags = get_input('tidypicstags'); + $access = get_input('access_id'); + $container_guid = get_input('container_guid', $_SESSION['user']->getGUID()); + + // Cache to the session + $_SESSION['tidypicstitle'] = $title; + $_SESSION['tidypicsbody'] = $body; + $_SESSION['tidypicstags'] = $tags; + + // Convert string of tags into a preformatted array + $tagarray = string_to_tag_array($tags); + // Make sure the title isn't blank + if (empty($title)) { + register_error(elgg_echo("album:blank")); + forward($_SERVER['HTTP_REFERER']); //failed, so forward to previous page + // Otherwise, save the album + } else { + + // Initialise a new ElggObject + $album = new ElggObject(); + // Tell the system it's an album + $album->subtype = "album"; + + // Set its owner to the current user + $album->container_guid = $container_guid; + $album->owner_guid = $_SESSION['user']->getGUID(); + $album->access_id = $access; + // Set its title and description appropriately + $album->title = $title; + $album->description = $body; + + // we catch the adding images to new albums in the upload action and throw a river new album event + $album->new_album = TP_NEW_ALBUM; + + // Before we can set metadata, we need to save the album + if (!$album->save()) { + register_error(elgg_echo("album:error")); + forward(get_input('forward_url', $_SERVER['HTTP_REFERER'])); //failed, so forward to previous page + } + + // Now let's add tags + if (is_array($tagarray)) { + $album->tags = $tagarray; + } + + + + // Success message + system_message(elgg_echo("album:created")); + + // Remove the album post cache + unset($_SESSION['tidypicstitle']); + unset($_SESSION['tidypicsbody']); + unset($_SESSION['tidypicstags']); + + // plugins can register to be told when a new Tidypics album has been created + trigger_elgg_event('add', 'tp_album', $album); + + forward("pg/photos/upload/" . $album->guid); + } + +?> \ No newline at end of file diff --git a/plugins/tidypics/actions/addtag.php b/plugins/tidypics/actions/addtag.php new file mode 100644 index 00000000..56268783 --- /dev/null +++ b/plugins/tidypics/actions/addtag.php @@ -0,0 +1,104 @@ +<?php + /** + * Tidypics Add Photo Tag + * + */ + + gatekeeper(); + action_gatekeeper(); + + $coordinates_str = get_input('coordinates'); + + $user_id = get_input('user_id'); + $image_guid = get_input('image_guid'); + $word = get_input('word'); + + if ($image_guid == 0) { + register_error(elgg_echo("tidypics:phototagging:error")); + forward($_SERVER['HTTP_REFERER']); + } + + $image = get_entity($image_guid); + if (!$image) + { + register_error(elgg_echo("tidypics:phototagging:error")); + forward($_SERVER['HTTP_REFERER']); + } + + // test for empty tag + if ($user_id == 0 && empty($word)) { + register_error(elgg_echo("tidypics:phototagging:error")); + forward($_SERVER['HTTP_REFERER']); + } + + + $new_word_tag = false; + if ($user_id != 0) { + $relationships_type = 'user'; + $value = $user_id; + } else { + $relationships_type = 'word'; + $value = $word; + + // check to see if the photo has this tag and add if not + if (!is_array($image->tags)) { + if ($image->tags != $word) { + $new_word_tag = true; + $tagarray = $image->tags . ',' . $word; + $tagarray = string_to_tag_array($tagarray); + } + } else { + if (!in_array($word, $image->tags)) { + $new_word_tag = true; + $tagarray = $image->tags; + $tagarray[] = $word; + } + } + } + + // add new tag now so it is available in search + if ($new_word_tag) { + $image->clearMetadata('tags'); + $image->tags = $tagarray; + } + + // create string for javascript tag object + $tag->coords = $coordinates_str; + $tag->type = $relationships_type; + $tag->value = $value; + + $access_id = $image->getAccessID(); + $owner_id = get_loggedin_userid(); + $tagger = get_loggedin_user(); + + //Save annotation + if ($image->annotate('phototag', serialize($tag), $access_id, $owner_id)) { + // if tag is a user id, add relationship for searching (find all images with user x) + if ($relationships_type === 'user') { + if (!check_entity_relationship($user_id, 'phototag', $image_guid)) { + add_entity_relationship($user_id, 'phototag', $image_guid); + + // also add this to the river - subject is image, object is the tagged user + if (function_exists('add_to_river')) + add_to_river('river/object/image/tag', 'tag', $image_guid, $user_id, $access_id); + + // notify user of tagging as long as not self + if ($owner_id != $user_id) + notify_user($user_id, $owner_id, elgg_echo('tidypics:tag:subject'), + sprintf( + elgg_echo('tidypics:tag:body'), + $image->title, + $tagger->name, + $image->getURL() + ) + ); + } + } + + system_message(elgg_echo("tidypics:phototagging:success")); + } + + + forward($_SERVER['HTTP_REFERER']); + +?> diff --git a/plugins/tidypics/actions/create_thumbnails.php b/plugins/tidypics/actions/create_thumbnails.php new file mode 100644 index 00000000..09743eef --- /dev/null +++ b/plugins/tidypics/actions/create_thumbnails.php @@ -0,0 +1,61 @@ +<?php + /** + * Tidypics Thumbnail Creation Test + * + * Called through ajax + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + include dirname(dirname(__FILE__)) . "/lib/resize.php"; + + global $CONFIG; + + $guid = $_GET['guid']; + + $image = get_entity($guid); + if (!$image || !($image instanceof TidypicsImage)) { + echo "Unable to get original image"; + return; + } + + $filename = $image->getFilename(); + $container_guid = $image->container_guid; + if (!$filename || !$container_guid) { + echo "Error retrieving information about the image"; + return; + } + + $title = $image->title; + $prefix = "image/" . $container_guid . "/"; + $filestorename = substr($filename, strlen($prefix)); + + $image_lib = get_plugin_setting('image_lib', 'tidypics'); + if (!$image_lib) + $image_lib = "GD"; + + if ($image_lib == 'ImageMagick') { // ImageMagick command line + + if (tp_create_im_cmdline_thumbnails($image, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick command line', E_USER_WARNING); + echo "Failed to create thumbnails"; + } + + } else if ($image_lib == 'ImageMagickPHP') { // imagick PHP extension + + if (tp_create_imagick_thumbnails($image, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick PHP', E_USER_WARNING); + echo "Failed to create thumbnails"; + } + + } else { + + if (tp_create_gd_thumbnails($image, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - GD', E_USER_WARNING); + echo "Failed to create thumbnails"; + } + + } // end of image library selector + + echo "<img id=\"tidypics_image\" src=\"{$CONFIG->wwwroot}mod/tidypics/thumbnail.php?file_guid={$guid}&size=large\" alt=\"{$title}\" />"; + +?> diff --git a/plugins/tidypics/actions/delete.php b/plugins/tidypics/actions/delete.php new file mode 100644 index 00000000..cab996ec --- /dev/null +++ b/plugins/tidypics/actions/delete.php @@ -0,0 +1,121 @@ +<?php + + /** + * Tidypics Delete Action for Images and Albums + * + */ + + // must be logged in + gatekeeper(); + + $forward_url = 'pg/photos/world'; // by default forward to world photos + + $guid = (int) get_input('guid'); + + $entity = get_entity($guid); + if (!$entity) { // unable to get Elgg entity + register_error(elgg_echo("tidypics:deletefailed")); + forward($forward_url); + } + + if (!$entity->canEdit()) { // user doesn't have permissions + register_error(elgg_echo("tidypics:deletefailed")); + forward($forward_url); + } + + $subtype = $entity->getSubtype(); + $container = get_entity($entity->container_guid); + + if ($subtype != 'image' && $subtype != 'album') { // how did we even get here? + register_error(elgg_echo("tidypics:deletefailed")); + forward($forward_url); + } + + $owner_guid = 0; // group or user + if ($subtype == 'image') { //deleting an image + $album = get_entity($entity->container_guid); + $owner_guid = $album->container_guid; + $forward_url = $container->getURL(); //forward back to album after deleting pictures + $images = array($entity); + // plugins can register to be told when a Tidypics image has been deleted + trigger_elgg_event('delete', 'tp_image', $entity); + } else { //deleting an album + $owner_guid = $entity->container_guid; + $forward_url = 'pg/photos/owned/' . $container->username; + //get all the images from this album as long as less than 999 images + $images = get_entities("object", "image", $guid, '', 999); + // plugins can register to be told when a Tidypics album has been deleted + trigger_elgg_event('delete', 'tp_album', $entity); + } + + // make sure we decrease the repo size for the size quota + $image_repo_size_md = get_metadata_byname($owner_guid, "image_repo_size"); + $image_repo_size = (int)$image_repo_size_md->value; + + //loop through all images and delete them + foreach($images as $im) { + $thumbnail = $im->thumbnail; + $smallthumb = $im->smallthumb; + $largethumb = $im->largethumb; + + if ($thumbnail) { //delete standard thumbnail image + $delfile = new ElggFile(); + $delfile->owner_guid = $im->getOwner(); + $delfile->setFilename($thumbnail); + $delfile->delete(); + } + if ($smallthumb) { //delete small thumbnail image + $delfile = new ElggFile(); + $delfile->owner_guid = $im->getOwner(); + $delfile->setFilename($smallthumb); + $delfile->delete(); + } + if ($largethumb) { //delete large thumbnail image + $delfile = new ElggFile(); + $delfile->owner_guid = $im->getOwner(); + $delfile->setFilename($largethumb); + $delfile->delete(); + } + if ($im) { //delete actual image file + $delfile = new ElggFile($im->getGUID()); + $delfile->owner_guid = $im->getOwner(); + //$delfile->setFilename($im->originalfilename); + $image_repo_size -= $delfile->size(); + + if (!$delfile->delete()) { + if ($subtype=='image') register_error(elgg_echo("tidypics:deletefailed")); //unable to delete object + } else { + if ($subtype=='image') system_message(elgg_echo("tidypics:deleted")); //successfully deleted object + } + } //end delete actual image file + } //end looping through each image to delete it + + //now that all images have been deleted, delete the album + if ($subtype == 'album') { + //delete the album's directory manually; first create a temp file to get the directory path + $tmpfile = new ElggFile(); + $tmpfile->setFilename('image/' . $guid . '/._tmp_del_tidypics_album_'); + $tmpfile->subtype = 'image'; + $tmpfile->container_guid = $guid; + $tmpfile->open("write"); + $tmpfile->write(''); + $tmpfile->close(); + $tmpfile->save(); + $albumdir = eregi_replace('/._tmp_del_tidypics_album_', '', $tmpfile->getFilenameOnFilestore()); + $tmpfile->delete(); + if (is_dir($albumdir)) + rmdir($albumdir); + + //delete object from database + if (!$entity->delete()) { + register_error(elgg_echo("tidypics:deletefailed")); //unable to delete object + } else { + system_message(elgg_echo("tidypics:deleted")); //successfully deleted object + } + } //end of delete album + + create_metadata($owner_guid, "image_repo_size", $image_repo_size, 'integer', $owner_guid); + + forward($forward_url); + +?> \ No newline at end of file diff --git a/plugins/tidypics/actions/deletetag.php b/plugins/tidypics/actions/deletetag.php new file mode 100644 index 00000000..becf1fed --- /dev/null +++ b/plugins/tidypics/actions/deletetag.php @@ -0,0 +1,57 @@ +<?php + /** + * Tidypics Delete Photo Tag + * + */ + + gatekeeper(); + action_gatekeeper(); + + $image_guid = get_input('image_guid'); + $tags = get_input('tags'); + + + if ($image_guid == 0) { + register_error(elgg_echo("tidypics:phototagging:error")); + forward($_SERVER['HTTP_REFERER']); + } + + $image = get_entity($image_guid); + if (!$image) + { + register_error(elgg_echo("tidypics:phototagging:error")); + forward($_SERVER['HTTP_REFERER']); + } + + foreach ($tags as $id => $value) { + // delete normal tag if it exists + if (is_array($image->tags)) { + $index = array_search($value, $image->tags); + if ($index !== false) { + $tagarray = $image->tags; + unset($tagarray[$index]); + $image->clearMetadata('tags'); + $image->tags = $tagarray; + } + } else { + if ($value === $image->tags) { + $image->clearMetadata('tags'); + } + } + + // delete relationship if this tag is a user + $annotation = get_annotation($id); + $photo_tag = unserialize($annotation->value); + if ($photo_tag->type == 'user') { + remove_entity_relationship($photo_tag->value, 'phototag', $image_guid); + } + + // delete the photo tag annotation + delete_annotation($id); + } + + system_message(elgg_echo("tidypics:deletetag:success")); + + forward($_SERVER['HTTP_REFERER']); + +?> diff --git a/plugins/tidypics/actions/edit.php b/plugins/tidypics/actions/edit.php new file mode 100644 index 00000000..cdf9420b --- /dev/null +++ b/plugins/tidypics/actions/edit.php @@ -0,0 +1,81 @@ +<?php + + /** + * Tidypics edit album/image action + * + */ + + // Make sure we're logged in + gatekeeper(); + + // Get input data + $guid = (int) get_input('guid'); // guid of image or album + $title = get_input('tidypicstitle'); + $body = get_input('tidypicsbody'); + $access = get_input('access_id'); + $tags = get_input('tidypicstags'); + $subtype = get_input('subtype'); + $cover = get_input('cover'); + if (is_array($cover)) $cover = $cover[0]; + + $container_guid = get_input('container_guid'); + + // Make sure we actually have permission to edit + $entity = get_entity($guid); + if (!$entity->canEdit()) { + forward(); + } + + // Get owning user/group + $owner = get_entity($entity->getOwner()); + + // change access only if access is different from current + if ($subtype == 'album' && $entity->access_id != $access) { + $entity->access_id = $access; + + //get images from album and update access on image entities + $images = get_entities("object","image", $guid, '', 999, '', false); + foreach ($images as $im) { + $im->access_id = $access; + $im->save(); + } + } + + + // Set its title and description appropriately + $entity->title = $title; + $entity->description = $body; + + // Before we can set metadata, we need to save the entity + if (!$entity->save()) { + register_error(elgg_echo("album:error")); + $entity->delete(); + forward($_SERVER['HTTP_REFERER']); //failed, so forward to previous page + } + + // Now let's add tags + $tagarray = string_to_tag_array($tags); + $entity->clearMetadata('tags'); + if (is_array($tagarray)) { + $entity->tags = $tagarray; + } + + //if cover meta is sent from image save as metadata + if ($subtype == 'image' && $cover == elgg_echo('album:cover')) { + $album = get_entity($container_guid); + $album->cover = $entity->guid; + } + + // Success message + if ($subtype == 'album') { + system_message(elgg_echo("album:edited")); + // plugins can register to be told when a Tidypics album has been updated + trigger_elgg_event('update', 'tp_album', $entity); + } else { + system_message(elgg_echo('images:edited')); + // plugins can register to be told when a Tidypics image has been updated + trigger_elgg_event('update', 'tp_image', $entity); + } + + forward($entity->getURL()); +?> diff --git a/plugins/tidypics/actions/edit_multi.php b/plugins/tidypics/actions/edit_multi.php new file mode 100644 index 00000000..c7099e6d --- /dev/null +++ b/plugins/tidypics/actions/edit_multi.php @@ -0,0 +1,66 @@ +<?php + /** + * Elgg album: multi image edit action + * + * This is called when uploading images + */ + + // Make sure we're logged in + gatekeeper(); + + // Get input data + $title_array = get_input('title'); + $caption_array = get_input('caption'); + $tags_array = get_input('tags'); + $image_guid_array = get_input('image_guid'); + $container_guid = get_input('container_guid'); + $album_entity = get_entity($container_guid); + $cover = get_input('cover'); + $not_updated = array(); + + foreach($image_guid_array as $key => $im) { + $image = get_entity($im); + + if ($image->canEdit()) { + + // Convert string of tags into a preformatted array + $tagarray = string_to_tag_array($tags_array[$key]); + + //set title appropriately + if ($title_array[$key]) + $image->title = $title_array[$key]; + else + $image->title = substr($image->originalfilename, 0, strrpos($image->originalfilename, '.')); + + //set description appropriately + $image->description = $caption_array[$key]; + + // Before we can set metadata, we need to save the image + if (!$image->save()) { + array_push($not_updated, $image->guid); + } + + // Now let's add tags. We can pass an array directly to the object property! Easy. + $image->clearMetadata('tags'); + if (is_array($tagarray)) { + $image->tags = $tagarray; + } + + //if cover meta is sent from image save as metadata + if ($cover == $im) { + $album_entity->cover = $im; + } + } + } + + // Success message + if (count($not_updated) > 0) { + register_error(elgg_echo("images:notedited")); + } else { + system_message(elgg_echo("images:edited")); + } + + // Forward to the main album page + forward($album_entity->getURL()); + +?> \ No newline at end of file diff --git a/plugins/tidypics/actions/flickrImportPhotoset.php b/plugins/tidypics/actions/flickrImportPhotoset.php new file mode 100644 index 00000000..ec0d65b5 --- /dev/null +++ b/plugins/tidypics/actions/flickrImportPhotoset.php @@ -0,0 +1,340 @@ +<?php +/** + * Import a whole bunch of photos from flickr + */ + +// Load Elgg engine +include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + +require_once( dirname(dirname(__FILE__)) . "/lib/flickr.php" ); +require_once dirname(dirname(__FILE__)) . "/lib/phpFlickr/phpFlickr.php"; +$f = new phpFlickr("26b2abba37182aca62fe0eb2c7782050"); + +$set_id = get_input( "set_id" ); +$album_id = get_input( "album_id" ); +$page_pp = get_input( "page" ); +$return_url = get_input( "return_url" ); +$user = get_loggedin_user(); +$flickr_id = get_metadata_byname( $user->guid, "flickr_id" ); + +if( empty( $flickr_id )) { + register_error( elgg_echo( 'flickr:errorusername2' )); + forward( $return_url ); + die; //just in case +} + +// Get the friendly URL of the user's photos +$photos_url = $f->urls_getUserPhotos( $flickr_id->value ); +$photos = $f->photosets_getPhotos( $set_id, null, null, 10, $page_pp ); + +$photos_to_upload = array(); +foreach( $photos["photoset"]["photo"] as $photo ) { + + //check if we already have this image + $meta = get_metadata_byname( $user->guid, $photo["id"] ); + if( $meta->value == 1 ) { //we've downloaded this already + register_error( elgg_echo( 'flickr:errorimageimport' )); + continue; + } + //store this so we don't download the same photo multiple times + create_metadata( $user->guid, $photo["id"], "1", "text", $user->guid, ACCESS_PUBLIC ); + + $photo_info = $f->photos_getInfo( $photo["id"], $photo["secret"] ); + $tags = array(); + foreach( $photo_info["tags"]["tag"] as $tag ) { + $tags[] = $tag["raw"]; + } + $tags = implode( ", ", $tags ); + + $image_url = $f->buildPhotoURL( $photo ); + $photos_to_upload[ $photo_info["id"] . ".jpg" ] = array( "url"=> $image_url, "tags" => $tags, "title" => $photo_info["title"], "description" => $photo_info["description"], "flickr_page" => "$photos_url$photo[id]" ); + + $body .= "<div class='tidypics_album_images'>"; + $body .= "$photo_info[title]<br />Views: $photo_info[views]<br />"; + $body .= "<a href=$photos_url$photo[id]>"; + $body .= "<img border='0' alt='$photo[title]' ". + "src='$image_url' />"; + $body .= "</a>"; +} +// echo "<pre>"; var_dump( $photos_to_upload );; die; + +/** + * Elgg multi-image uploader action +* +* This will upload up to 10 images at at time to an album + */ + +global $CONFIG; +include dirname(dirname(__FILE__)) . "/lib/resize.php"; +include dirname(dirname(__FILE__)) . "/lib/exif.php"; + +// Make sure we're logged in +gatekeeper(); + +// Get common variables +$access_id = (int) get_input("access_id"); +$container_guid = (int) get_input('container_guid', 0); +$container_guid = intval ($album_id); + +$album = get_entity($container_guid); + +$maxfilesize = (float) get_plugin_setting('maxfilesize','tidypics'); +if (!$maxfilesize) + $maxfilesize = 5; // default to 5 MB if not set +$maxfilesize = 1024 * 1024 * $maxfilesize; // convert to bytes from MBs + +$quota = get_plugin_setting('quota','tidypics'); +$quota = 1024 * 1024 * $quota; +$image_repo_size_md = get_metadata_byname($album->container_guid, "image_repo_size"); +$image_repo_size = (int)$image_repo_size_md->value; + +$image_lib = get_plugin_setting('image_lib', 'tidypics'); +if (!$image_lib) + $image_lib = "GD"; + +/* +// post limit exceeded +if (count($_FILES) == 0) { + trigger_error('Tidypics warning: user exceeded post limit on image upload', E_USER_WARNING); + register_error(elgg_echo('tidypics:exceedpostlimit')); + forward(get_input('forward_url', $_SERVER['HTTP_REFERER'])); +} +*/ + +/* +// test to make sure at least 1 image was selected by user +$num_images = 0; +foreach($_FILES as $key => $sent_file) { + if (!empty($sent_file['name'])) + $num_images++; +} +*/ +if ( count( $photos_to_upload ) == 0 ) { + // have user try again + register_error(elgg_echo('tidypics:noimages')); + forward(get_input('forward_url', $_SERVER['HTTP_REFERER'])); + die; //just in case +} + +$uploaded_images = array(); +$not_uploaded = array(); +$error_msgs = array(); + +$img_river_view = get_plugin_setting('img_river_view', 'tidypics'); + +/* +$accepted_formats = array( + 'image/jpeg', + 'image/png', + 'image/gif', + 'image/pjpeg', + 'image/x-png', + ); + +*/ +//foreach($_FILES as $key => $sent_file) { +foreach( $photos_to_upload as $name => $photo ) { + +/* + // skip empty entries + if (empty($sent_file['name'])) + continue; + + $name = $sent_file['name']; + $mime = $sent_file['type']; + + if ($sent_file['error']) { + array_push($not_uploaded, $sent_file['name']); + if ($sent_file['error'] == 1) { + trigger_error('Tidypics warning: image exceed server php upload limit', E_USER_WARNING); + array_push($error_msgs, elgg_echo('tidypics:image_mem')); + } + else { + array_push($error_msgs, elgg_echo('tidypics:unk_error')); + } + continue; + } + + //make sure file is an image + if (!in_array($mime, $accepted_formats)) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:not_image')); + continue; + } + +*/ +/* I'm not going to check filesize here because flickr has already resized it for me + // check quota + if ($quota) { + if ($image_repo_size + $sent_file['size'] > $quota) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:exceed_quota')); + continue; + } + } + + // make sure file does not exceed memory limit + if ($sent_file['size'] > $maxfilesize) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:image_mem')); + continue; + } + + // make sure the in memory image size does not exceed memory available - GD only + $imginfo = getimagesize($sent_file['tmp_name']); + $mem_avail = ini_get('memory_limit'); + $mem_avail = rtrim($mem_avail, 'M'); + $mem_avail = $mem_avail * 1024 * 1024; + if ($image_lib == 'GD') { + $mem_required = ceil(5.35 * $imginfo[0] * $imginfo[1]); + + $mem_used = memory_get_usage(); + + $mem_avail = $mem_avail - $mem_used - 2097152; // 2 MB buffer + if ($mem_required > $mem_avail) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:image_pixels')); + trigger_error('Tidypics warning: image memory size too large for resizing so rejecting', E_USER_WARNING); + continue; + } + } else if ($image_lib == 'ImageMagickPHP') { + // haven't been able to determine a limit like there is for GD + } +*/ + $mime = "image/jpeg"; //not sure how to get this from the file if we aren't posting it + + //this will save to users folder in /image/ and organize by photo album + $prefix = "image/" . $container_guid . "/"; + $file = new ElggFile(); + $filestorename = strtolower(time().$name); + $file->setFilename($prefix.$filestorename . ".jpg"); //that's all flickr stores so I think this is safe + $file->setMimeType($mime); + $file->originalfilename = $name; + $file->subtype="image"; + $file->simpletype="image"; + $file->access_id = $access_id; + if ($container_guid) { + $file->container_guid = $container_guid; + } + + // get the file from flickr and save it locally + $filename = $file->getFilenameOnFilestore(); + $destination=fopen($filename,"w"); + $source=fopen($photo["url"],"r"); + + while ($a=fread($source,1024)) fwrite($destination,$a); + fclose($source); + fclose($destination); + + /* + $file->open("write"); + $file->write(); + $file->write(get_uploaded_file($key)); + $file->close(); + */ + $result = $file->save(); + + if (!$result) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:save_error')); + continue; + } + + //add tags + create_metadata( $file->guid, "tags", $photo["tags"], "text", $user->guid, ACCESS_PUBLIC ); + + //add title and description + create_object_entity( $file->guid, $photo["title"], $photo["description"] ); + + //get and store the exif data + td_get_exif($file); + + // resize photos to create thumbnails + if ($image_lib == 'ImageMagick') { // ImageMagick command line + + if (tp_create_im_cmdline_thumbnails($file, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick command line', E_USER_WARNING); + } + + } else if ($image_lib == 'ImageMagickPHP') { // imagick php extension + + if (tp_create_imagick_thumbnails($file, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick PHP', E_USER_WARNING); + } + + } else { + + if (tp_create_gd_thumbnails($file, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - GD', E_USER_WARNING); + } + + } // end of image library selector + + //keep one file handy so we can add a notice to the river if single image option selected + if(!$file_for_river) { + $file_for_river = $file; + } + + array_push($uploaded_images, $file->guid); + + // update user/group size for checking quota + $image_repo_size += $sent_file['size']; + + // successful upload so check if this is a new album and throw river event/notification if so + if ($album->new_album == TP_NEW_ALBUM) { + $album->new_album = TP_OLD_ALBUM; + + // we throw the notification manually here so users are not told about the new album until there + // is at least a few photos in it + object_notifications('create', 'object', $album); + + if (function_exists('add_to_river')) + add_to_river('river/object/album/create', 'create', $album->owner_guid, $album->guid); + } + + if ($img_river_view == "all") { + add_to_river('river/object/image/create', 'create', $file->getObjectOwnerGUID(), $file->getGUID()); + } + unset($file); // may not be needed but there seems to be a memory leak + +} //end of for loop + +if (count($not_uploaded) > 0) { + if (count($uploaded_images) > 0) + $error = sprintf(elgg_echo("tidypics:partialuploadfailure"), count($not_uploaded), count($not_uploaded) + count($uploaded_images)) . '<br />'; + else + $error = elgg_echo("tidypics:completeuploadfailure") . '<br />'; + + $num_failures = count($not_uploaded); + for ($i = 0; $i < $num_failures; $i++) { + $error .= "{$not_uploaded[$i]}: {$error_msgs[$i]} <br />"; + } + register_error($error); + + if (count($uploaded_images) == 0) + forward(get_input('forward_url', $_SERVER['HTTP_REFERER'])); //upload failed, so forward to previous page + else { + // some images did upload so we fall through + } +} else { + system_message(elgg_echo('tidypics:upl_success')); +} + +if (count($uploaded_images) && $img_river_view == "1") { + if (function_exists('add_to_river')) { + add_to_river('river/object/image/create', 'create', $file_for_river->getObjectOwnerGUID(), $file_for_river->getGUID()); + } +} + +// update image repo size +create_metadata($album->container_guid, "image_repo_size", $image_repo_size, 'integer', $album->container_guid); + +// plugins can register to be told when a Tidypics album has had images added +trigger_elgg_event('upload', 'tp_album', $album); + +//forward to multi-image edit page + +$url = $CONFIG->wwwroot . 'mod/tidypics/pages/edit_multiple.php?files=' . implode('-', $uploaded_images); +forward($url); + +?> diff --git a/plugins/tidypics/actions/flickrSetup.php b/plugins/tidypics/actions/flickrSetup.php new file mode 100644 index 00000000..fbc519b0 --- /dev/null +++ b/plugins/tidypics/actions/flickrSetup.php @@ -0,0 +1,38 @@ +<?php +/** + * Setup the user's flickr username and store it + */ +require_once dirname(dirname(__FILE__)) . "/lib/phpFlickr/phpFlickr.php"; +$f = new phpFlickr("26b2abba37182aca62fe0eb2c7782050"); + +$flickr_username = get_input( "flickr_username" ); +$album_id = get_input( "album_id" ); +$return_url = get_input( "return_url" ); +$user = get_loggedin_user(); + +if( empty( $flickr_username )) { + register_error( elgg_echo( 'flickr:enterusername' )); + forward( $return_url ); + die; //just in case +} else { + $flickr_user = $f->people_findByUsername( $flickr_username ); + if( !empty( $flickr_user["id"] )) { + create_metadata( $user->guid, "flickr_username", $flickr_username, "text", $user->guid, ACCESS_PUBLIC ); + create_metadata( $user->guid, "flickr_id", $flickr_user["id"], "text", $user->guid, ACCESS_PUBLIC ); + if( $album_id ) { + create_metadata( $user->guid, "flickr_album_id", $album_id, "text", $user->guid, ACCESS_PUBLIC ); + $album = get_entity( $album_id ); + } + + system_message( sprintf( elgg_echo( 'flickr:savedusername' ), $flickr_username )); + system_message( sprintf( elgg_echo( 'flickr:saveduserid' ), $flickr_user["id"] )); + system_message( sprintf( elgg_echo( 'flickr:savedalbum' ), $album->title )); + } else { + register_error( sprintf( elgg_echo( 'flickr:errorusername' ), $flickr_username )); + } +} + +forward($_SERVER['HTTP_REFERER']); +//echo "<pre>"; var_dump( array($flickr_username, $return_url )); echo "</pre>"; + +?> \ No newline at end of file diff --git a/plugins/tidypics/actions/imtest.php b/plugins/tidypics/actions/imtest.php new file mode 100644 index 00000000..cbe15a1c --- /dev/null +++ b/plugins/tidypics/actions/imtest.php @@ -0,0 +1,19 @@ +<?php + /** + * Tidypics ImageMagick Location Test + * + * Called through ajax + */ + + $location = $_GET['location']; + + $command = $location . "convert -version"; + + $result = system($command, $return_val); + + if ($return_val == 0) { + echo $result; + } else { + echo "Unable to run ImageMagick. Please check the path."; + } +?> diff --git a/plugins/tidypics/actions/settings.php b/plugins/tidypics/actions/settings.php new file mode 100644 index 00000000..a4f102b8 --- /dev/null +++ b/plugins/tidypics/actions/settings.php @@ -0,0 +1,72 @@ +<?php + /** + * Save settings of Tidypics + * + */ + + global $CONFIG; + + admin_gatekeeper(); + action_gatekeeper(); + + + // Params array (text boxes and drop downs) + $params = get_input('params'); + $result = false; + foreach ($params as $k => $v) { + if (!set_plugin_setting($k, $v, 'tidypics')) { + register_error(sprintf(elgg_echo('plugins:settings:save:fail'), 'tidypics')); + forward($_SERVER['HTTP_REFERER']); + } + } + + // check boxes + if (is_array(get_input('download_link'))) // this can be done due to way Elgg uses checkboxes + set_plugin_setting('download_link', 'enabled', 'tidypics'); + else + set_plugin_setting('download_link', 'disabled', 'tidypics'); + + if (is_array(get_input('tagging'))) + set_plugin_setting('tagging', 'enabled', 'tidypics'); + else + set_plugin_setting('tagging', 'disabled', 'tidypics'); + + if (is_array(get_input('photo_ratings'))) + set_plugin_setting('photo_ratings', 'enabled', 'tidypics'); + else + set_plugin_setting('photo_ratings', 'disabled', 'tidypics'); + + if (is_array(get_input('exif'))) + set_plugin_setting('exif', 'enabled', 'tidypics'); + else + set_plugin_setting('exif', 'disabled', 'tidypics'); + + if (is_array(get_input('view_count'))) + set_plugin_setting('view_count', 'enabled', 'tidypics'); + else + set_plugin_setting('view_count', 'disabled', 'tidypics'); + + if (is_array(get_input('grp_perm_override'))) + set_plugin_setting('grp_perm_override', 'enabled', 'tidypics'); + else + set_plugin_setting('grp_perm_override', 'disabled', 'tidypics'); + + + // image sizes + $image_sizes = array(); + $image_sizes['large_image_width'] = get_input('large_thumb_width'); + $image_sizes['large_image_height'] = get_input('large_thumb_height'); + $image_sizes['small_image_width'] = get_input('small_thumb_width'); + //$image_sizes['small_image_height'] = get_input('small_thumb_height'); + $image_sizes['small_image_height'] = get_input('small_thumb_width'); + $image_sizes['thumb_image_width'] = get_input('thumb_width'); + //$image_sizes['thumb_image_height'] = get_input('thumb_height'); + $image_sizes['thumb_image_height'] = get_input('thumb_width'); + set_plugin_setting('image_sizes', serialize($image_sizes), 'tidypics'); + + + + system_message(elgg_echo('tidypics:settings:save:ok')); + + forward($_SERVER['HTTP_REFERER']); +?> diff --git a/plugins/tidypics/actions/upgrade.php b/plugins/tidypics/actions/upgrade.php new file mode 100644 index 00000000..cb200380 --- /dev/null +++ b/plugins/tidypics/actions/upgrade.php @@ -0,0 +1,40 @@ +<?php + +/******************************************** + * + * Upgrade from Tidypics 1.5 to 1.6 + * + *********************************************/ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + admin_gatekeeper(); + + $result = true; + + // add image class + $id = get_subtype_id("object", "image"); + if ($id != 0) { + $table = $CONFIG->dbprefix . 'entity_subtypes'; + $result = update_data("UPDATE {$table} set class='TidypicsImage' where id={$id}"); + if (!result) { + register_error(elgg_echo('tidypics:upgrade:failed')); + forward($_SERVER['HTTP_REFERER']); + } + } + + // add album class + $id = get_subtype_id("object", "album"); + if ($id != 0) { + $table = $CONFIG->dbprefix . 'entity_subtypes'; + $result = update_data("UPDATE {$table} set class='TidypicsAlbum' where id={$id}"); + if (!result) { + register_error(elgg_echo('tidypics:upgrade:failed')); + forward($_SERVER['HTTP_REFERER']); + } + } + + system_message(elgg_echo('tidypics:upgrade:success')); + + forward($_SERVER['HTTP_REFERER']); +?> \ No newline at end of file diff --git a/plugins/tidypics/actions/upload.php b/plugins/tidypics/actions/upload.php new file mode 100644 index 00000000..b1eb4efe --- /dev/null +++ b/plugins/tidypics/actions/upload.php @@ -0,0 +1,252 @@ +<?php +/** + * Elgg multi-image uploader action + * + * This will upload up to 10 images at at time to an album + */ + +include dirname(dirname(__FILE__)) . "/lib/resize.php"; +include dirname(dirname(__FILE__)) . "/lib/exif.php"; + +// Get common variables +$access_id = (int) get_input("access_id"); +$container_guid = (int) get_input('container_guid', 0); +$album = get_entity($container_guid); +if (!$album) { + register_error(elgg_echo('tidypics:baduploadform')); + forward($_SERVER['HTTP_REFERER']); +} + +$maxfilesize = (float) get_plugin_setting('maxfilesize','tidypics'); +if (!$maxfilesize) { + $maxfilesize = 5; // default to 5 MB if not set +} +$maxfilesize = 1024 * 1024 * $maxfilesize; // convert to bytes from MBs + +$quota = get_plugin_setting('quota','tidypics'); +$quota = 1024 * 1024 * $quota; +$image_repo_size_md = get_metadata_byname($album->container_guid, "image_repo_size"); +$image_repo_size = (int)$image_repo_size_md->value; + +$image_lib = get_plugin_setting('image_lib', 'tidypics'); +if (!$image_lib) { + $image_lib = "GD"; +} + +// post limit exceeded +if (count($_FILES) == 0) { + trigger_error('Tidypics warning: user exceeded post limit on image upload', E_USER_WARNING); + register_error(elgg_echo('tidypics:exceedpostlimit')); + forward($_SERVER['HTTP_REFERER']); +} + +// test to make sure at least 1 image was selected by user +$num_images = 0; +foreach($_FILES as $key => $sent_file) { + if (!empty($sent_file['name'])) { + $num_images++; + } +} +if ($num_images == 0) { + // have user try again + register_error(elgg_echo('tidypics:noimages')); + forward($_SERVER['HTTP_REFERER']); +} + +$uploaded_images = array(); +$not_uploaded = array(); +$error_msgs = array(); + +$img_river_view = get_plugin_setting('img_river_view', 'tidypics'); + +$accepted_formats = array( + 'image/jpeg', + 'image/png', + 'image/gif', + 'image/pjpeg', + 'image/x-png', +); + + +foreach($_FILES as $key => $sent_file) { + + // skip empty entries + if (empty($sent_file['name'])) { + continue; + } + + $name = $sent_file['name']; + $mime = $sent_file['type']; + + if ($sent_file['error']) { + array_push($not_uploaded, $sent_file['name']); + if ($sent_file['error'] == 1) { + trigger_error('Tidypics warning: image exceeded server php upload limit', E_USER_WARNING); + array_push($error_msgs, elgg_echo('tidypics:image_mem')); + } else { + array_push($error_msgs, elgg_echo('tidypics:unk_error')); + } + continue; + } + + //make sure file is an image + if (!in_array($mime, $accepted_formats)) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:not_image')); + continue; + } + + // check quota + if ($quota) { + if ($image_repo_size + $sent_file['size'] > $quota) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:exceed_quota')); + continue; + } + } + + // make sure file does not exceed memory limit + if ($sent_file['size'] > $maxfilesize) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:image_mem')); + continue; + } + + // make sure the in memory image size does not exceed memory available - GD only + $imginfo = getimagesize($sent_file['tmp_name']); + $mem_avail = ini_get('memory_limit'); + $mem_avail = rtrim($mem_avail, 'M'); + $mem_avail = $mem_avail * 1024 * 1024; + if ($image_lib == 'GD') { + $mem_required = ceil(5.35 * $imginfo[0] * $imginfo[1]); + + $mem_used = memory_get_usage(); + + $mem_avail = $mem_avail - $mem_used - 2097152; // 2 MB buffer + if ($mem_required > $mem_avail) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:image_pixels')); + trigger_error('Tidypics warning: image memory size too large for resizing so rejecting', E_USER_WARNING); + continue; + } + } else if ($image_lib == 'ImageMagickPHP') { + // haven't been able to determine a limit like there is for GD + } + + //this will save to users folder in /image/ and organize by photo album + $prefix = "image/" . $container_guid . "/"; + $file = new ElggFile(); + $filestorename = strtolower(time().$name); + $file->setFilename($prefix.$filestorename); + $file->setMimeType($mime); + $file->originalfilename = $name; + $file->subtype="image"; + $file->simpletype="image"; + $file->access_id = $access_id; + if ($container_guid) { + $file->container_guid = $container_guid; + } + $file->open("write"); + $file->write(get_uploaded_file($key)); + $file->close(); + $result = $file->save(); + + if (!$result) { + array_push($not_uploaded, $sent_file['name']); + array_push($error_msgs, elgg_echo('tidypics:save_error')); + continue; + } + + //get and store the exif data + td_get_exif($file); + + + // resize photos to create thumbnails + if ($image_lib == 'ImageMagick') { // ImageMagick command line + + if (tp_create_im_cmdline_thumbnails($file, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick command line', E_USER_WARNING); + } + + } else if ($image_lib == 'ImageMagickPHP') { // imagick php extension + + if (tp_create_imagick_thumbnails($file, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick PHP', E_USER_WARNING); + } + + } else { + + if (tp_create_gd_thumbnails($file, $prefix, $filestorename) != true) { + trigger_error('Tidypics warning: failed to create thumbnails - GD', E_USER_WARNING); + } + + } // end of image library selector + + //keep one file handy so we can add a notice to the river if single image option selected + if (!$file_for_river) { + $file_for_river = $file; + } + + array_push($uploaded_images, $file->guid); + + // update user/group size for checking quota + $image_repo_size += $sent_file['size']; + + // plugins can register to be told when a new image has been uploaded + trigger_elgg_event('upload', 'tp_image', $file); + + // successful upload so check if this is a new album and throw river event/notification if so + if ($album->new_album == TP_NEW_ALBUM) { + $album->new_album = TP_OLD_ALBUM; + + // we throw the notification manually here so users are not told about the new album until there + // is at least a few photos in it + object_notifications('create', 'object', $album); + + add_to_river('river/object/album/create', 'create', $album->owner_guid, $album->guid); + } + + if ($img_river_view == "all") { + add_to_river('river/object/image/create', 'create', $file->getObjectOwnerGUID(), $file->getGUID()); + } + unset($file); // may not be needed but there seems to be a memory leak + +} //end of for loop + +if (count($not_uploaded) > 0) { + if (count($uploaded_images) > 0) { + $error = sprintf(elgg_echo("tidypics:partialuploadfailure"), count($not_uploaded), count($not_uploaded) + count($uploaded_images)) . '<br />'; + } else { + $error = elgg_echo("tidypics:completeuploadfailure") . '<br />'; + } + + $num_failures = count($not_uploaded); + for ($i = 0; $i < $num_failures; $i++) { + $error .= "{$not_uploaded[$i]}: {$error_msgs[$i]} <br />"; + } + register_error($error); + + if (count($uploaded_images) == 0) { + //upload failed, so forward to previous page + forward($_SERVER['HTTP_REFERER']); + } else { + // some images did upload so we fall through + } +} else { + system_message(elgg_echo('tidypics:upl_success')); +} + + +if (count($uploaded_images) && $img_river_view == "1") { + add_to_river('river/object/image/create', 'create', $file_for_river->getObjectOwnerGUID(), $file_for_river->getGUID()); +} + +// update image repo size +create_metadata($album->container_guid, "image_repo_size", $image_repo_size, 'integer', $album->container_guid); + +// plugins can register to be told when a Tidypics album has had images added +trigger_elgg_event('upload', 'tp_album', $album); + + +//forward to multi-image edit page +forward($CONFIG->wwwroot . 'mod/tidypics/pages/edit_multiple.php?files=' . implode('-', $uploaded_images)); diff --git a/plugins/tidypics/contributions.txt b/plugins/tidypics/contributions.txt new file mode 100644 index 00000000..3cea54bd --- /dev/null +++ b/plugins/tidypics/contributions.txt @@ -0,0 +1,364 @@ +Changelog and contributors list + + +------------------------------------------------------------------------ +Version 1.6.8 Change List +Release Date: 05/01/2010 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.8 CHANGES +------------------------------------------------------------------------ + * New language strings: tidypics:nophotosingroup, tidypics:baduploadform + tidypics:settings:heading:img_lib, tidypics:settings:heading:main, + tidypics:settings:heading:river, tidypics:settings:heading:sizes, + tidypics:settings:heading:groups + * Fixed bug in titles of albums RSS + * Added a new css element: tidypics_line_break + * Fixed layout of album covers due to long titles or other text + * Fixed some bugs with image resizing when images are wide and short + * Improved interface of admin settings +------------------------------------------------------------------------ +END VERSION 1.6.8 CHANGES +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Version 1.6.7 Change List +Release Date: 04/24/2010 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.7 CHANGES +------------------------------------------------------------------------ + * Added categories integration + * Added a better quota display message - includes percentage now + * Tweaked the css so that upload list is enumerated (#tidypics_image_upload_list) +------------------------------------------------------------------------ +END VERSION 1.6.7 CHANGES +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Version 1.6.6 Change List +Release Date: 03/06/2010 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.6 CHANGES +------------------------------------------------------------------------ + * Tweaked slideshow start code + * Fixed bug with delete tags menu item + * Fixed bug in en.php + * Better error checking for ImageMagick resizing +------------------------------------------------------------------------ +END VERSION 1.6.6 CHANGES +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Version 1.6.5 Change List +Release Date: 12/12/2009 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.5 CHANGES +------------------------------------------------------------------------ + * Bug fixes + * Better plugin hooks for adding slideshows and lightboxes + * Better display of album pages and tweaked css + * Slideshows available on more pages + * Made a change to parameters in tp_list_entities - added container + * Added Danish translation from erikernstm + * Added French translation from Fx Nion +------------------------------------------------------------------------ +END VERSION 1.6.5 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.6.4 Change List +Release Date: 10/05/2009 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.4 CHANGES +------------------------------------------------------------------------ + * Bug fixes + * Improved watermarking + * Add slideshow code by Torsten +------------------------------------------------------------------------ +END VERSION 1.6.4 CHANGES +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Version 1.6.3 Change List +Release Date: 09/13/2009 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.3 CHANGES +------------------------------------------------------------------------ + * Bug fixes + * Redo image resize if problem occurred + * Grab title from image by default + * New German language file by alfalive + * Preview of watermarking +------------------------------------------------------------------------ +END VERSION 1.6.3 CHANGES +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Version 1.6.2 Change List +Release Date: 09/03/2009 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.2 CHANGES +------------------------------------------------------------------------ + * Added widget for user's latest photos + * Added notifications to a user if that user is tagged in a photo + * Fixed some issues with tagging people in albums that belong to a closed group + * Added a test page for ImageMagick commandline + * Began restructuring the code for future capabilities + * Many more bug fixes and tweaks +------------------------------------------------------------------------ +END VERSION 1.6.2 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.6.1 Change List +Release Date: 08/04/2009 +------------------------------------------------------------------------ +BEGIN VERSION 1.6.1 CHANGES +------------------------------------------------------------------------ + * Fixed css bug that caused problems with tagging + * Added Spanish language file from mylamilagros +------------------------------------------------------------------------ +END VERSION 1.6.1 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.6.0 Change List +Final Release Date: 08/02/2009 +Beta 4 Release Date: 07/17/2009 +Beta 3 Release Date: 07/16/2009 +Beta 2 Release Date: 07/10/2009 +Beta 1 Release Date: 06/30/2009 +Contributors: + * Cash Costello + * Greg Froese + * tagging based on code by Pedro Prez + * RSS improvements by Torsten Wesolek + * language files submitted by Toto and Susan Tsairi +------------------------------------------------------------------------ +BEGIN VERSION 1.6.0 CHANGES +------------------------------------------------------------------------ + * Photo tagging + * View counter + * EXIF view + * ImageMagick support + * Extensive admin settings + * Improved CSS + * Image ratings + * Upload quotas + * Better album RSS feed + * better almost everything +------------------------------------------------------------------------ +END VERSION 1.6.0 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.5.1 Change List +Release Date: 03/29/2009 +Contributors: + * Gabriel Monge-Franco (http://gabriel.mongefranco.com) + * Cash Costello + * VeniVidiVinco (http://community.elgg.org/pg/profile/VeniVidiVinco) +------------------------------------------------------------------------ +BEGIN VERSION 1.5.1 CHANGES +------------------------------------------------------------------------ +* Updated Turkish language file +* Fixed permissions bug on all content caused by group override +* Added back the create album button to widgets +------------------------------------------------------------------------ +END VERSION 1.5.1 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.5 Change List +Release Date: 03/28/2009 +Contributors: + * Gabriel Monge-Franco (http://gabriel.mongefranco.com) + * Cash Costello + * alfalive (http://community.elgg.org/pg/profile/alfalive) + * VeniVidiVinco (http://community.elgg.org/pg/profile/VeniVidiVinco) + +Also thank you to those who tested the code in svn and provided feedback +------------------------------------------------------------------------ +BEGIN VERSION 1.5 CHANGES +------------------------------------------------------------------------ +* Fixed submenus on sidebar of album pages to make them consistent +* Fixed display issues for Elgg 1.5 +* Using default site access now +* Pushing new album creation to river +* Fixed German language file +* Added Turkish +* Added notifications for new album creation +* Rewrote most of the page handlers to make cleaner +* Fixed the access level bug on images +* Cleaned up css +* Fixed the group access bug on albums +------------------------------------------------------------------------ +END VERSION 1.5 CHANGES +------------------------------------------------------------------------ + + + +------------------------------------------------------------------------ +Version 1.08.2 Change List +Release Date: 02/13/2008 +Contributors: + * Gabriel Monge-Franco (http://gabriel.mongefranco.com) +------------------------------------------------------------------------ +BEGIN VERSION 1.08.2 CHANGES +------------------------------------------------------------------------ +* Fixed bug introduced in v1.08.1 that broke the picture upload (thanks to Karsten Schulze). +* Fixed empty variables in several files that were supposed to send the user back to the previous page, but didn't. +* Cleaned up change log (contributions.txt). +* Finally fixed the Polish language file!!! Yay!! :) + +* TODO: Work around large image (high resolution) limit when creating thumbnails (an Elgg limitation... can probably be fixed by using PHP GD functions directly or ImageMagic if available) + - The problem is with get_resized_image_from_existing_file(). Submitted a ticket to the Elgg tracking bug system. + - Edit actions/upload.php when done. There is a dirty hack in place for now that needs to be removed once the above bug is fixed. +* TODO: disable public by default (input/accessRead.php) -- add setting to admin page that lets the site admin decide whether pictures can be public or not. +* TODO: allow group members to add pictures to group photo albums +* TODO: implement photo anotations +* TODO: look into replacing individual image views with lightbox2 or jQuery lightbox album views. +* TODO: create a new widget to show pictures (in slideshow) in a user's profile. +* TODO: add settings for group albums so that the group owner can select the number of albums to show. +* TODO: implement a way to move pictures from one album to another (should be pretty easy). +* TODO: add an "Add Photos" option to the user widget similar to the one in the group widget. +* TODO: implement automagic file resizing to meet the admin's maximum resolution and file size. + +* OF NOTE: It is currently not possible to allow group members to edit an album created by another group member. This is a bug with group permissions and it will probably not be fixed until [at least] Elgg v1.5 comes out. +------------------------------------------------------------------------ +END VERSION 1.08.2 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.08.1 Change List +Release Date: 02/13/2008 +Contributors: + * Gabriel Monge-Franco (http://gabriel.mongefranco.com) + * LKLaRose (http://community.elgg.org/pg/profile/lauren) + * Webgalli (http://community.elgg.org/pg/profile/webgalli) + * Karsten Schulze (http://ks.frinx.eu) + * Cash (http://community.elgg.org/pg/profile/costelloc) +------------------------------------------------------------------------ +BEGIN VERSION 1.08.1 CHANGES +------------------------------------------------------------------------ +* Fixed bug introduced in v1.08 that caused fake files to be created during thumbnail creation (thanks to Karsten Schulze). +* Reverted to old directory structure that saves pictures to /image/ALBUMGUID/picGUID (v1.08 saved to /image/ALBUMGUID__picGUID, thus keeping everything in one folder). +* Album directory is now deleted when the album is deleted (along with every picture inside of the album). +* Reverted thumbnail and small thumbnail to use picture cropping instead of scaling, so that sites that already use Tidypics can keep a consisting look and feel. +* Completed River integration by moving album and image directories to an "object" sub-directory (thanks to LKLaRose). +* Added status messages/graphics to give the user some feedback. +* Fixed bug in profile widget whereby the selected number of albums had no effect (thanks to @Webgalli and @cheltenham). +* Fixed bug introduced in v1.06 that prevented anonymous users from viewing a user's album (thanks to Karsten Schulze). +* Fixed more language file bugs (thanks to Karsten Schulze). +* Administrators can now set a file size limit from the plugin configuration (it has to be in Kilobytes). + +* JUST PLAIN WEIRD: Fixed Polish language file (thanks to @Vazco, Ian Medlock and Brett Profitt) and saved as UTF8 without BOM. However, it still doesn't work. Can somebody try saving it on a Polish box for me? :) + +* TODO: fix Polish language file -- it seems to break the whole Elgg site! Maybe it needs to use HTML codes in place of international characters? +* TODO: Work around large image (high resolution) limit when creating thumbnails (an Elgg limitation... can probably be fixed by using PHP GD functions directly or ImageMagic if available) + - The problem is with get_resized_image_from_existing_file(). Submitted a ticket to the Elgg tracking bug system. + - Edit actions/upload.php when done. There is a dirty hack in place for now that needs to be removed once the above bug is fixed. +* TODO: disable public by default (input/accessRead.php) -- add setting to admin page that lets the site admin decide whether pictures can be public or not. +* TODO: allow group members to add pictures to group photo albums +* TODO: implement photo anotations +* TODO: look into replacing individual image views with lightbox2 or jQuery lightbox album views. +* TODO: create a new widget to show pictures (in slideshow) in a user's profile. +* TODO: add settings for group albums so that the group owner can select the number of albums to show. +* TODO: implement a way to move pictures from one album to another (should be pretty easy). + +* OF NOTE: It is currently not possible to allow group members to edit an album created by another group member. This is a bug with group permissions and it will probably not be fixed until [at least] Elgg v1.5 comes out. +------------------------------------------------------------------------ +END VERSION 1.08.1 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.08 Change List +Release Date: 02/08/2008 +Contributors: + * Gabriel Monge-Franco (http://gabriel.mongefranco.com) +------------------------------------------------------------------------ +BEGIN VERSION 1.08 CHANGES +------------------------------------------------------------------------ +* Merged most (safe) changes made by other contributors in v1.07. + - Did not include SWFuploader or JQuery due to the number of bugs reported. +* Changed ugly "new album" picture into something better looking. +* Fixed bug whereby image objects were deleted from the database, but they physical files remained on the server. + - Since deleting directories was not possible without the use of unsafe file operations, albums no longer create new directories. Instead, all pictures are saved as /image/ALBUMGUID__picturename. +* Fixed some bugs in the English, Spanish and German language files and added missing error messages. +* Thumbnails now display the default error image (same as new album) when the requested image cannot be found. +* Fixed a bug in the multi-edit form that did not allow image titles to be saved. +* Removed some customizations made to edit.php action in v1.07 since they removed the ability to add titles to images. +* Fixed bug introduced in v1.07 that prevented images from being set as album covers. +* Fixed miscellaneous bugs in group albums widget. +* Removed jQuery for now since it was making the albums too slow. In the future, we should look into replacing individual image views with lightbox2 or jQuery lightbox album views. + + +* TODO: fix Polish language file -- it seems to break the whole Elgg site! Maybe it needs to use HTML codes in place of international characters? +* TODO: Work around 0.9MB source file size limit when creating thumbnails (an Elgg limitation... can probably be fixed by using PHP GD functions directly) + - The problem is with get_resized_image_from_existing_file(). Submitted a ticket to the Elgg tracking bug system. + - Edit actions/upload.php when done. There is a dirty hack in place for now that needs to be removed once the above bug is fixed. +* TODO: disable public by default (input/accessRead.php) -- add setting to admin page that lets the site admin decide whether pictures can be public or not. +* TODO: allow group members to add pictures to group photo albums +* TODO: implement photo anotations +* TODO: look into replacing individual image views with lightbox2 or jQuery lightbox album views. + +* OF NOTE: It is currently not possible to allow group members to edit an album created by another group member. This is a bug with group permissions and it will probably not be fixed until [at least] Elgg v1.5 comes out. +------------------------------------------------------------------------ +END VERSION 1.08 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.07 Change List +Release Date: 02/03/2008 +Contributors: + * vazco (http://community.elgg.org/pg/profile/vazco) + * simophin (http://community.elgg.org/pg/profile/simophin) +------------------------------------------------------------------------ +BEGIN VERSION 1.07 CHANGES +------------------------------------------------------------------------ +* About 10 missing translations added +* Translated to polish +* When no album is present, user can add a new album straight from the widget if he has the required rights +* Added some missing <p></p> +* Changed some <? to <?php +* Unauthorized album edit taken care of +* Added jQuery Lightbox support, but commented out just in case someone won't want to use it (there may be some problems with the lightbox, since I'm not using it myself and I didn't test it) +------------------------------------------------------------------------ +END VERSION 1.07 CHANGES +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Version 1.06 Change List +Release Date: 02/03/2008 +Contributors: + * Gabriel Monge-Franco (http://gabriel.mongefranco.com) +------------------------------------------------------------------------ +BEGIN VERSION 1.06 CHANGES +------------------------------------------------------------------------ +* Forward all non-logged in users to World (public) pictures. This fixes a bug in which anonymous users would see a list of pictures titled, "'s pictures" (without a name). +* Forward requests to "owned" without an user ID to "owned/userid" when a user is logged in. This fixes a bug in which all users would see a list of pictures titled, "'s pictures" (without a name). +* Replaced several hard-coded strings to elgg_echo() functions so they can be translated. +* Re-enabled title entry in picture editing. Titles are only optional, so there is no reason to hide them, especially if some users may find them useful. Moreover, lack of image titles makes list views awkward. +* Fixed multi-picture editing bug in which editing was disabled after uploading multiple pictures. +* Fixed several tags not conforming to standard PHP opening tags. +* Fixed some bugs in the English language file. +* Added Spanish and German translations (if you speak German, please double-check the language file!!!). +* Added a download link at the bottom of each picture to download the original file. +* Updated some icons and created missing ones. + +* TODO: disable public by default (input/accessRead.php) -- add setting to admin page that lets the site admin decide whether pictures can be public or not. +* TODO: change ugly "new album" picture into something better looking. +* TODO: re-organize files to clean up the plug-in directory (e.g., move world.php to views/default) +* TODO: Fix bug whereby image objects are deleted from the database, but the physical files remain on the server. The path can be found with $file->getFilename(), but would it be safe to execute shell commands directly??? +------------------------------------------------------------------------ +END VERSION 1.06 CHANGES +------------------------------------------------------------------------ + diff --git a/plugins/tidypics/docs/configure_server.txt b/plugins/tidypics/docs/configure_server.txt new file mode 100644 index 00000000..32fb5d86 --- /dev/null +++ b/plugins/tidypics/docs/configure_server.txt @@ -0,0 +1,55 @@ +Server Configuration +----------------------------------- + +Run your server analysis located in the Tidypics Administration section and +then read through this document. + +If you are experiencing errors, please check your server error log. Tidypics +writes warnings for most upload related problems. You will see something +along these lines: "Tidypics warning: user exceeded post limit on image upload" + + + +GD: Elgg requires GD for image resizing. Tidypics uses GD by default for +resizing. There are two versions GD and GD2. It generally does not matter +which one you are using and it isn't always apparent which one you are +running anyway. + +ImageMagick: A significantly better image library than GD. There is a command-line +version that is commonly available on servers and a PHP extension call imagick that +you can install on your server (if you have control of your server). + +exec: Calls to ImageMagick command-line utilities like convert require that +exec() be available. On some servers it will be disabled for security reasons. + +Memory Available to PHP: The amount of RAM available to a single PHP +process. This can have an effect on how large an image you can resize +(especially if you are running Tidypics with GD). The best place to +change it is .htaccess. + +Memory Used to Load This Page: This gives you a baseline of how much +memory is being used to load the Elgg framework and plugins. + +Max File Upload Size: The largest file that can be uploaded. You can +adjust this in .htaccess. + +Max Post Size: The largest amount of data that can be submitted. For +Tidypics, this affects how many large images can be uploaded in a +single upload. If this is exceeded, nothing is uploaded and the +user gets an error message. It can be adjusted in .htaccess. + +Max Input Time: This is the amount of time PHP will wait for an +upload to finish. Your users may experience failures if they are +uploading large images on a poor connection or if your server +does not have a lot of bandwidth. + +Max Execution Time: The longest time a PHP script can run on your +server. If a user uploads many large images, the resize code may take +a long time to complete and will be stopped by PHP. If you are seeing +problems with this, you probably have a slow server. + +GD imagejpeg: jpeg resizing with GD + +GD imagegif: gif resizing with GD + +GD imagepng: png resizing with GD \ No newline at end of file diff --git a/plugins/tidypics/docs/css_guide.txt b/plugins/tidypics/docs/css_guide.txt new file mode 100644 index 00000000..9663cad1 --- /dev/null +++ b/plugins/tidypics/docs/css_guide.txt @@ -0,0 +1,87 @@ +Views: +----------------- +all albums view +album view +image view +upload view + + +CSS elements: +------------------------- +#tidypics_wrapper - wrapper on image view + +#tidypics_breadcrumbs - breadcrumbs on image and album views + +#tidypics_desc - description/caption in image and album views + +.tidypics_info - holds metadata about image/album like tags + +#tidypics_controls - image view controls (download, start tagging, etc.) + +.tidypics_album_images - border around images - needs work + +#tidypics_image_nav - back and next nav controls in image view + +#tidypics_image_full - not used + +#tidypics_image_wrapper - margins for image in image view + +#tidypics_image - frame + +.tidypics_album_cover - all albums view and river images + +.tidypics_album_widget_single_item + +.tidypics_album_gallery_item + + +/* ------ tidypics widget view ------ */ + +#tidypics_album_widget_container + +.tidypics_album_widget_timestamp + +/* --------- image upload/edit forms ------------ */ + +#tidpics_image_upload_list + +.tidypics_edit_image_container + +.tidypics_edit_images + +.tidypics_image_info + + +/* ---- tidypics group css ----- */ + +#group_albums_widget + + +/* --------- tidypics river items ------------ */ + +.river_object_image_create + +.river_object_album_create + +.river_object_image_comment + +.river_object_album_comment + +/* ----------- tagging ---------------- */ +#tidypics_tag_instructions + +#tidypics_tag_instruct_text + +#tidypics_tag_instruct_button_div + +#tidypics_tag_instruct_button + +#tidypics_tag_menu + +#tidypics_delete_tag_menu + +.tidypics_tag + +.tidypics_tag_text + +#tidypics_phototags_list diff --git a/plugins/tidypics/docs/extending_tidypics.txt b/plugins/tidypics/docs/extending_tidypics.txt new file mode 100644 index 00000000..55e6b5dd --- /dev/null +++ b/plugins/tidypics/docs/extending_tidypics.txt @@ -0,0 +1,39 @@ +Extending Tidypics +----------------------------------- + +*** DISPLAYING THE LATEST PHOTOS *** +In tidypics/lib/tidypics.php, there is a function tp_get_latest_photos(). +It can be used to display the site-wide latest photos or an individual +user's latest photos. The documentation explains how you could use that +function to display the latest photos on your front page if you are using +the custom front page tutorial plugin from Curverider. + + +*** MAKING TIDYPICS MATCH YOUR THEME *** +Please check the css guide found in this directory. This will list the +different css elements and where they are used. + + +*** TIDYPICS EVENTS *** +1. album created: 'add', 'tp_album' +2. album updated: 'update', 'tp_album' +3. album deleted: 'delete', 'tp_album' +4. photos uploaded: 'upload', 'tp_album' - triggered after a set have been uploaded and resized +5. photo uploaded: 'upload', 'tp_image' - triggered after each image is resized +6. photo edited: 'update', 'tp_image' +7. photo deleted: 'delete', 'tp_image' + +*** TIDYPICS PLUGIN HOOKS *** +1. album slideshow: 'tp_slideshow', 'album' - return false to not have a slideshow, otherwise return link to slideshow +2. watermark - return false to prevent default watermark + 'tp_watermark', 'gd' + 'tp_watermark', 'imagick' + 'tp_watermark', 'imagemagick' +3. image link: 'tp_image_link', 'image' - return false for no link or a url otherwise - params passed to this will porbably change in 1.7 + + +*** IMAGE MENU EXTENSIONS *** +Below an image is a div called tidypics_controls. By default it contains controls +like tagging or downloading an image. You can change what is shown there by overridding +or extending the tidypics/image_menu view. + diff --git a/plugins/tidypics/fonts/LiberationSerif-Regular.ttf b/plugins/tidypics/fonts/LiberationSerif-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1dd4aaa92b18c326a2737205ca519c5a2f11b3ea GIT binary patch literal 172964 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°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%0DO17!6s9t! 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 HV_*OP6h%5B literal 0 HcmV?d00001 diff --git a/plugins/tidypics/fonts/License.txt b/plugins/tidypics/fonts/License.txt new file mode 100644 index 00000000..e972b52d --- /dev/null +++ b/plugins/tidypics/fonts/License.txt @@ -0,0 +1,13 @@ +LICENSE AGREEMENT AND LIMITED PRODUCT WARRANTY +LIBERATION FONT SOFTWARE + +This agreement governs the use of the Software and any updates to the Software, regardless of the delivery mechanism. Subject to the following terms, Red Hat, Inc. ("Red Hat") grants to the user ("Client") a license to this work pursuant to the GNU General Public License v.2 with the exceptions set forth below and such other terms as our set forth in this End User License Agreement. + + 1.The Software and License Exception. LIBERATION font software (the "Software") consists of TrueType-OpenType formatted font software for rendering LIBERATION typefaces in sans serif, serif, and monospaced character styles. You are licensed to use, modify, copy, and distribute the Software pursuant to the GNU General Public License v.2 with the following exceptions: +(a)As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. +(b)As a further exception, any distribution of the object code of the Software in a physical product must provide you the right to access and modify the source code for the Software and to reinstall that modified version of the Software in object code form on the same physical product on which you received it. + 2.Intellectual Property Rights. The Software and each of its components, including the source code, documentation, appearance, structure and organization are owned by Red Hat and others and are protected under copyright and other laws. Title to the Software and any component, or to any copy, modification, or merged portion shall remain with the aforementioned, subject to the applicable license. The "LIBERATION" trademark is a trademark of Red Hat, Inc. in the U.S. and other countries. This agreement does not permit Client to distribute modified versions of the Software using Red Hat's trademarks. If Client makes a redistribution of a modified version of the Software, then Client must modify the files names to remove any reference to the Red Hat trademarks and must not use the Red Hat trademarks in any way to reference or promote the modified Software. + 3.Limited Warranty. To the maximum extent permitted under applicable law, the Software is provided and licensed "as is" without warranty of any kind, expressed or implied, including the implied warranties of merchantability, non-infringement or fitness for a particular purpose. Red Hat does not warrant that the functions contained in the Software will meet Client's requirements or that the operation of the Software will be entirely error free or appear precisely as described in the accompanying documentation. + 4.Limitation of Remedies and Liability. To the maximum extent permitted by applicable law, Red Hat or any Red Hat authorized dealer will not be liable to Client for any incidental or consequential damages, including lost profits or lost savings arising out of the use or inability to use the Software, even if Red Hat or such dealer has been advised of the possibility of such damages. + 5.General. If any provision of this agreement is held to be unenforceable, that shall not affect the enforceability of the remaining provisions. This agreement shall be governed by the laws of the State of North Carolina and of the United States, without regard to any conflict of laws provisions, except that the United Nations Convention on the International Sale of Goods shall not apply. +Copyright © 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark of Red Hat, Inc. diff --git a/plugins/tidypics/graphics/empty_album.png b/plugins/tidypics/graphics/empty_album.png new file mode 100644 index 0000000000000000000000000000000000000000..0c041d0a27664ebd707fceff4b8bf732ea9ad7c4 GIT binary patch literal 1389 zcmeAS@N?(olHy`uVBq!ia0y~yV3-NQEX)iH4CjhkI~f=lbV^(!N}P*Q6H7Al^Atid zb5j|D6H63~3>3Ud^AwB>3@jB4O|1+ptxPQxbPY@m3}T*G#W652u$OrHy0YJ76A|WB zUQm9(l7WGNv%n*=n1R7h0fZUFYG>YKU|?WLcl32+VA$Bt{U?!?fq}swz$e7@-@kvq ze*OCN>C@Y{Z(qH7_4Mh}4<9~!{rdIh&6{V=oVj@M;?=8H@7}%p=g*&q4<G*c@nhDr zd2$R4EFGRMjv*Dd-p=sN5b+c_o_*{{=jyqfk5sk1`A#b8bSr8oX|PBtze;4keyn%H z1lx)aW(&040-BX9CdL|A6|S;cy|ZIl%L~0Xhvu9qZE3a4`QxNw-l?;@Sg2J0_r2At z%BGzAa^o)h#aGVXXTN%NKV)y!`d@!%Z)E8Y^*p3=_7W7mHD31j#jd<q>DC)t1ke54 zWA>@@!a8-Y*?v=wad%!iCcHG(cS@Mwl(s%&ljo^<={~o1_<M&Ju4#Q?;@KCxC8zbp z)2NhNibZo4eJw7%)8k|9(5D;~c6i4M_ocP`!FyL{_zRRU);T-7MAh*>pWMYJ_J6W% z^XHHhsh$(TCMzdx<52GL$!^~GWx>RY(x<X_Tw8oerbI?cd&}W{4X+(Sq~@tz%(xz% z&K}dQba~go!nQWfjcw+hw*sVsx^6XoJU%T*arT7!CGRfJic2!QK4szK9evv^Ghz-g z^!R08-y)cIr^1p=cWGw+gExPJJEt!9vDP~ucI>|MgllUvrhNPO&3wt$>?k*(Gpmm; zT58h!m(_3g+ultXTkNjCJ@`5?TzX|(`HpVaCAB{iGpD6x&R5rcylvI#sD(2(9k`^k zmXo*Xox<s7Wsh!uPtBXWYrgF~=_?awoaMc?f?w`<(ftgkS1&%yWRRNU#XX68eS58{ z#ed%XH7dEKVrR`x=AYMfkY~An{8x9}+W4gQolXL|v$~ou1;>gRx^tTD%P_gUX3@$? zPq-qqL)uR&%(By3c3k-`!}+!5=8e}@`u^B&nEOq~|MJwSD}zqzm|gJMS~AlzXtr_V zmdvkLSZ%IueE-H(=t9We*pMx2?l0zEotS^<dffYqHoMN(FO}rka#7}@%&P^5*3Qqc zxM=;xe%<STh3;O3W*ux^tDGi@aQ|Fb5_s<_*F!^}a*^wz8LL;Y|9i`0XMBz?e=X~} zLp&E-ChGXfS9}+p_4mrF3pb8U;bHltTGFsxS)=N9Xk*M$p?l&E$JJQEtwi^yhD>1F z*6>y|BRE9!)P3%QTPlTEQthu_6K(Bk6^x%d?ax%V^?EB!|C>+P<`GzU_Cnmu;}hBv zqig41Tex<i!mJ=C)w`3HW(b|`UwdTE-b?4Z1#V@1`RG{ma2wlx*~YNxeSbF?+!kG@ zJ>{Bz5VQJZ`Ra0C>7`-MtY!XYXyo$m6mZtR@4NGc+m_=Z`D?z5*!?OnPnPy!Fj?BD znZ>7fJBj`1f6qk^ue{&5X3F+?^XCaHI(9*sd7(*x*#3`9dyV=h>i?UT|M`oJ+82>; zJDw)}y5gL<{_oM*=~LTmQ%>gBCF$tb_*&QA;^FjiHoiUYh1cwB)(=g#evNy);-K*- z-LosTKC7qwa}ha|nZx)zV8w)(dmLpuS3NT6^_%?sK+(6viVoS{nN!_jr-eOQ)87>I zzhc8{2ifQku3r<b7u0&X@4fuG?)O%uHFqEJNlm<&^>^A$-{^?I+LYLL8B?!m9y!li zbWfl2f&q8h-QRm|nm1j`{8#Qab%J4L-H~aLLR(Dl^lxOzc*DXr?a$)O`TQ$BT+b`J pD?h9J=Z~xHOCx8YpjxFZ{~7-|UW;_DF$0xv44$rjF6*2Ung9#mq<#PZ literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/icons/album.gif b/plugins/tidypics/graphics/icons/album.gif new file mode 100644 index 0000000000000000000000000000000000000000..73ce91356fea9b68b84500b5dbe46a04194a7126 GIT binary patch literal 1411 zcmZ?wbhEHbv|+GexXQrr<HrwmB~4>p)30B@D#@z6dHy*iD*Mmpzs^=3pWptvarKUc zfpv&yWL$9ShYuhA{Q0wV(aJ@$mfM&(wN&>W-h1-SwMVr@ExH;8E0=7UGks}sX7!cx z*L~eWru5GI{_)?VJI_xYJ9YN>r9C?i?by6)LdVqCPu_g`^y$%qC!5ypC@Zf1_wQdv zQ-5}1(bGqtC4?oXPnwsRmgDB&qada9_4C(XzkYrF@bTaG{}Fz1|Ns2gSJuCG`<{%H z^uIs9KfeF^|NsAY@7^i?WMKdS9S{NX69e1-1M>?!bfo%EEGasfV>SQ6iW0B2QR{E4 zDLegEO*WxDJbRHXgWAU(uNYR;^nYg9)3@#ZzCEuTnRzZ{m3pe>smqG6R#p|(H8#1X zYS~KhN{I=IsCL<DnH2Xm@iFsHQsHG2(_vd7sHC1>-CI(+XbGo^`BY&sDXG=wQYsqq zh3R$mi7~nScIsk0<}3C}ty;}%ZmuINA(~cLyD75VPFhEXhfU|zesdlknGf%Hc*P_Y zjpy{72%Bgp!fR+TC(B_&Y>xzoibjlr!vQ810YQm~#z#}_9Ln7G9&DK4ye|7apIeN= z!iTLg8pRed1rM2+Bn12nxUMgm*3YP~;?VPvPtNIoE0?U9$OWO)1_qYCIDv+srp6gH z7aFWKopI;nRuOgc*-^lFc%h5FjBD4F1|BBQqt7O6WN71)QkyYD!S&n$=eD@dRjju+ z<uhz_zc|m-JK=aA19y>5!9=EYlcMr93KVV%t$Dhkj*;C>`^KA_({%K67z|1~&N2!L z#6&FEq8~W9Ho0F_I^jdYX75NLfx=~9_-Ct|JkkAa-X3vt)A1s`*OAB47h1<vR2a0s z(vVlMSR-a#QTBSj?%ra#_m%FKruIZTya?Rep&_Lez`>9|t>V)Dd!L2n>cfulNp@In zVP@7{)8N4QcBb12X2Ch)2kP&tmd4k8dwYC-J<A%A1_sdu0{<P@P0l17sn&nPAXYr* zuGzw(Cm)|nGOm8vc8JYS)ZtbKbB96$cl}G%u=LYs-Q>D8t+t0a>y-o?;N{49a598% z#snu86@>>)+=g7OS8`p-w%=@(u6oME%^6X^$h9|ex)U2~hyWwA(FctN79P(J$=%M= zuFfy6=ag_}loW7al2?jiZ)DV+65znCbfBP-Tk_SE>vOm2mfvqRsA7H0CK7YNiT}z^ zwNsq_Qztkua;hviz$LUJVNn?0-Ab`8*FzTReAYb84m_euEIAlNI1VsyEvS0H$iSL# z!GR&-nd|eKmX$B&6kBS1dBMeLQqagz@FVROgNa5$Ba4i~hh}~=nc4pxI36!DUA{yo zSMx@~0^Ms3?7{*cm}CkK8E5jT$XsdUvwKi*fKe{w0~7O(mnxaw`t!mkaSN$<H?SE8 zd_Pic6CrvqMJ#7RJ1_f<00u6d7>30xh8at5C-Qkt2;orVIB<~N?#_;n3=BsKFLSVQ zBs6d^FNprMOZZ5^6=#l=s{(WToh~$$iIiBkYS`{S=**$1bHI`9`6`D`jG`$E-o{(0 zZkfw{W0Qh2+Z>(*)|9Rn8xA?@3%ogekbO%-Q-Lkp(?h(RJ_^ljrV+KQcPsxeFisZk z=vl|kuHtZzg@Zw3GlP7B0y7g!_8Qj5b~6~Zu;}yze7V7%^TCOk;|_xphoykQ0w#5< z{Eu>S1q~CJn0Q<!ba2&(3p6sR7Cbn_ZL?xRwfK_X3<m6m6Bc|wC_QDt!5Q`?kKVpm zY_QmaQ-C4Gk;7twaU-{3%f0u?`#<`G%Q18;U}Vx+;K0bt6!KR4k5fm`j}Qk3(VPU< ziypH4|JWUr5_;JLY8d$a7@CB?C_3`W1WxfeaFDU$gRo?alaZ6hA)#3xS~PqXa)qBb NB)01Ury~P{H2@M9Lm~hG literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/icons/general.jpg b/plugins/tidypics/graphics/icons/general.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23494eff2f351adf9030ccf372e5eb24b31b584b GIT binary patch literal 7036 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≠DTxX;q*D;VD@^x{k?YjE3f9biQSCf ztY`Dd?XPvI&)y$Pvq44B<Xfu_8w<Vp+_xb5W=Ln&_US>F*j5GPW)?c|Eq9R<UGe0a z@s^}DjOlZkiuKHvxqYg3+|ydD8F0N(>V<nt=&Zf0x$hUrrM>Kcmta-@8O$uVmzVAO zv(fYRpJm>6<nn*EmK<KBlC&`_M$w!9$gZd>ZSOvagdNZPAnPfmJN4hI1DB6D*lJx< z+5GpF{fv-qp_%`F?tdn_^SEc^6v@ikZiPp`>o+Ck8-4bA^W<=K^Tj!@TKi9YQtnvh z!Z-EICk6G}YVWSCp1$S#vdKGU_DoptsIGa1jf{K8M_G=w_xYcn-WJeSm^$;?_6q5# zGb97AKGyBOrhLZX!>ofrQx<>MoAD=WpV1HIsMy6epZ>j?8*%j8lzCDMe`=<BeiT{n z#NTmMKk{nB+7(*$5|MitObz*jY8+K2M+zoorAJ-b*r(jsy0&|6L7``Uh1qT2<+a!E z*t2fCWU(^KhC!6G=v?dl&UDVmlo*k9Ob<)gL`*9F{&*|?Pvk#?V8k^Zla{-|HTz=) ztM|1`xP9s(kBjHCY0_6(_*z}2$}RU3-85D5{HYVGGY)LKp|;TIBkNnvysrfg4n0%z z)p!b5I&<3k3oTty9QcZ1>9OSR%N~B`t6y??zu@VFqwmgs`js@Ha&2XM?#A<_KY163 zO`FpDaMcvI2F5GbFC{KoFeUJqyX%`pCO2QRRT|Hmc}mMU?Y7Du+le#GM4nAKGUX7T z=GI=330pN21TVZ;c&O{A*SoK2*S=qQw~c3&cT#Ter+Ts2`#aAbJhRpCtLUyouR0@< z#b@4`ZJ1EEK=ZO|n5eq%J>GRp*9DvteWuHs#{CHjU$d&W^;1I4)#{I)ahv8(36D+N zzxH#oYo5TohjV7io6h^=7rth7+u@lecG<Q+=B$tOpQX9x`qzCq8EX&8<k(M6eztpm z=c%t#;|uxx_-DQQr>=c1_+D4G>EHa>QrZPw(n2YpDihn=f6iGS8D8D_ss3MN#easG zr@l`4yl8R6+Ul44l1{k&?kZ}ixl#U6Gj7u=GwoA?pHuH2S@P>t#l>K-O}(N!+<Ut> zb=2G{|EOuVX=%Z`Q<jmf?|SYeJ`9^P<y6ycqbGY6Ih7~gi8|%^>!{g_6%}1)BhP+L TxydRL7<m$3_eo=c{r{T)rf&sC literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/icons/river_icon_album.gif b/plugins/tidypics/graphics/icons/river_icon_album.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1bbfedaa6bde840c4ba50238fa20483916d26e8 GIT binary patch literal 398 zcmZ?wbhEHb6k-r!xXQqA@7}$=d-t9`eR}=+_4n`J-?wky>eZ`PtXQ#Q$BxaLHy=NK ze9f9QU%!5R@ZiC$S+oBA`?qf0x^LgUegFRb;K73n7A)AXVZ*$6^M3yPxo6LwBS(%r ze*Ad)^yy2NE}cDl_LM187B61>|NnmmS^~wNEMVhxKqSad3~Z|%CKPz+NcA6L_h?dy zbC6<lIOt%+BHZAxAT(o&E3cAr27{Dj!>tnz941UGhnx&eSP~Yho&FkOCeJ4##pUl5 zEG5awAS==*%@@tXFCLx5$1cS#CojUxSRfT3$-~wl!Xhc0&l4)eATAWc)ho*+Ua7!e z?Ijo|EGHxBEX2dYkg|h6yt7)WMVK*0N+^Lpil0Ba=*q60H)Bq(-svu$BFyXSa(c-t L*PAze9T}_vHWGd) literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/icons/river_icon_image.gif b/plugins/tidypics/graphics/icons/river_icon_image.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf391898e2a56a26960713b603da44eb4c30f0a7 GIT binary patch literal 945 zcmZ?wbhEHb6k-r!XlGzpym;}F#fz6LUAlbv@)avqtX#Qr)v8siSFc{ZX7!piYu2q> zw`tR+ZQHi(+O=!fp4|rz9XfRQ$e|-g4j(>z_{fpNM~@ykdhFP-<HwI5KXLrT$&)9~ zpFe-;(xrR%?mc|?@bTlvPo6w^_Uzf)w{PFR1A$MUK7IM}<>$|zzkdDt{qxt~zkmOe z0%S+QXb4a{1QdU=FfcIuXV76_U|;~{2?mZnhC&V*j|~eBHggDTsjN73q*GW;Y1WL! z53CK{68dQy5|a};*m%WK&UidXVr~?R*%H9e(9kYn>Lnwgxq*pOh?AkmV`4%Bn;4rB z*PMoljJz!3%nJ@Eh_GMm7EhV7=SQOR<>d@qcM22~w0Ssvl~ZaGm|56mv@;$pFc50s Y5YA=fcq3r0*V0<?`PJQS0|f?a09SPhZ~y=R literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/icons/river_icon_tag.gif b/plugins/tidypics/graphics/icons/river_icon_tag.gif new file mode 100644 index 0000000000000000000000000000000000000000..510696147efd1c7eb5d4ffd4cb2fe2e984b176b1 GIT binary patch literal 184 zcmZ?wbhEHb6k-r!Xl7uTK7IP^*|QfeT)1Y<nk`$l?Ao>K$dMzbPoKVg`SQ)1Hy=HE z^z7NQmoHy_{`~pZuV4TE{ZstO!oa}rpFxL#fq?;J1_Mj#hm)SG_gcJ8;rjU?UFGa! zkK+OiIj6Z;4*9eRa8%@NZr*6oH!F{WgNKD}a={8?85U;MVDkVIwu=u;%qIwL@_r`B rJvp!N=!{CP1|f;1?x)07++N6b^yL;01)+w<I*u@@w)T!TK?Z98ZIx7X literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/image_error_large.png b/plugins/tidypics/graphics/image_error_large.png new file mode 100644 index 0000000000000000000000000000000000000000..4316f459df631b5fa2f76081d362dfa064c20d7d GIT binary patch literal 2208 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 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/image_error_small.png b/plugins/tidypics/graphics/image_error_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2f814fd81bc50a7a5539cefee325eaf4bece6c6f GIT binary patch literal 2351 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 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/image_error_thumb.png b/plugins/tidypics/graphics/image_error_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..0eeb797dc7cd2579ebd13c922e622d7fba3e0194 GIT binary patch literal 759 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU7G?$ph7*^LI5IFW=#;odlsFfqCYEI8=P86_ z=B6?PCzdD}87O#_<|!B%7+5M8nphc|S(#cY=o*+B82G=r`j~-%fxX1j*OmPyn~0F6 zl6q9N9RmXcXMsm#F$0620thpT)y}-fz`($g?&#~tz_78O`%fY(0|SFWfKQ0)zkmN; zym)c->eY)EFP=Gb=H$tf4<A1K`Sa(kTetrF`E%^pvA1vEK7IQ1>({S$@813R@#Fcd zkCF@wOhTS6jv*Dd)`nPnGdl|0n_<1kB}64b`vt#%@S4Rly;VL6esJ;bZkQXfWTUqr zi*>h2(&7nPW=)x`BDbO=Ze~36|G>VZf9BqsXP2H9+1{U@{%v;tbGMF{H~${}ddlU4 z?3TIrmNovAxUlG)h1L3R+vE06|6R1{;o|O%rKi0A9B=jx*uSN_v?FE<yP!JDhPN$j z5|+o4BT`q}XY9Jjbfa)i?W)*g``A;BGkMwA<!7W%HN1FuPT<iUTN{i{K02#%yCYvK z$%B1u5?{DRw=IwRHN)keZ`F(@tdd{7UTs%H4fBPjv!`k$)utR?XBl_-@P@qga*|DM zAI*hr*9orK-ri8zmUdt@Gmn(OoL1GdYnopkT*xfF|H9?j2UDlTf0AJNZu%z7?c9^) zYZhcJ3NL(Mc2a5itF!H)eOiSKuf43dNy&t*58JHr^m+OH#kni9!eaTRPns>5Cu<b3 z$XZ9_qI>j`<9;i)MxIP-{4a0Y%JMZu`N>A#Q!!T#Xf3O}wnx42;f^(>Rbnrf$(QJP zUNO~asbK0+z4g>-!x6icE|(wHF>lpae$eukUpw=u7v^5g-X`2@t(!k@(_;A-GRbXY z#1{4Q9C{VCp1W0ko^iP9&RpRk_PS2|to2^4*X1XL%ENjeH|XDvTYUQHpN0Ds7WzJX z*zqi%LH%(EqulzI9n}-<y_|a@Z-3LR5Yn7>aGk{6j*`=BTt7bBIb+se=2`X=qqujz Sn9RVyz~JfX=d#Wzp$PyC4_h$+ literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/loader.gif b/plugins/tidypics/graphics/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ac990cf04f2323f9723518bfd72ce102222cefa GIT binary patch literal 2545 zcmZ?wbhEHblwgox_`<;O|NsBO!otUoAOHUS`|aDemo8oU`0?ZZ{rew0cyRpq@fR;% zoI7{!_U+r>zklDfY18iAyRTorzG~Gf2BLxDe{Mh5kYH!W09PYD17=1B1_s4{QqD!G zi6yBi3gww4848J6i4{5di79%Sd1?6!ia%L6*%=rZbU;>s9Ld1CPC=nhg~2g3ijV83 z&65R_S`POFnwYiNbn~-2P7&tiI6S}Op$9`E1M|X#R+ISnUU|A09C2$o%$OKc;ofZA za9vvQ2<Lr&D_u#k_NJh$3Dc!QyqcP|m{>VES(%!7OW1hZI=XuL8e66_*G*Sq<6%uH zj-AED%E~iKvt%0EQe7pcX$+ax9(J4amItQC#%r<gbTe?R3)*PR!_&xg(B0FXm*?E+ zEi1}Y4)2}KmSwDn%?leqUN~To8pX#_DYL|2#o|JR#gBUemRwjI&b>fbQ^|S(M`1)q z+<6WcQ-cXY?QNV_J8V3R1r;|6bg;2z>k8%xa3nS;Ow>4%*|vRJN`p#(LnT{zLW@^> zhcXurD=UwEJ8vZm8*g`Sf5)W!sh#uE+vf2y@uW3QX<<>fXrEloz^3lZP>_(tkhfK7 zJp-4~j_N516-*P@vMTqOFfko;*4b>bczeEb-a?f<#}Cgx(2ms;J3yXjPyl&irpgkd z6^kcwJTC0%xqNAn>mh|pog97a1u7m6F8V8)7fK1Zx4Il|$+9R@o_QibL&Jsn*tTsm z7!~?B{FZ1K-`R3dS*UUn4-cz`1E(N+dT50fZ?<=zCJP4-4~M-sFB=OB8}G!)Q~PJk zn$y2jg}G~)5-%6iG_9FzE7_QsI=pAH^zv>EXV|oS-&~f8-u?DH?)w;4D$fmPyRfT& zR^F_P>)txOHyP%h)viDNVEQpFte#l|@{9sUY7`$^q=<^)ip7B%$&-3cT)edCy1%-T z4Bvr?iw<xcV(4aWx~5>rwOM#U;f>xDCFW*F0bYTtQej6bEDDZ(G_ka>kns(2KH$J8 z&c~Um#cb@ro9Wr5$;PG5W$!7#FDS?_(Az)JVe-`J-3u0W>#)r3S=y$|%d)haZA~Zh z2Gf-cI;+;K+`3+=!*%x7s<jMk_Uk(xcDgoiYIfMvxn{>f&D{qU?LC3r16x5JSfG(Q zOG@SNgd+?3c%6G(4Y@e2yVtd8s2iz>?H6oRWZ1_r!6jH#Mp0su@PdgKG*hD+53mb_ zxSAR~D%c@<bj1^egKkr#xEia&EObt&GA9`GrhB%RgMz=!n1`K@kDZ6NtEW$E!lWr3 z^X6yFRATOG(Bu?kFEr_1rpe4NC@7%J+?~$W%&<gRfKM=Zw@TMSr5+WoU2E*v⁡} z?M~=ke5L5TS2eF;`>wMpr#f1(r>iX>pEwAl&N5SJns97EUvEMWkFnNK+ioUC?g_$@ zT&?#{C<JuGD7hV6Iq5CSCgFsD3%YBYFJDLzH5CXusMKgQzs5dKNl}BBhh<0C#D*7B zHJMWzT1+Y`lkGV;+1WWcc-z@Jjk|mMTW8MXouXV`>BY^Lqsp7#z|79a7Z;rrZ@?MG z!_OBIZIC;Mfme`Ug{9eK0Rx*IyP!aedRP<#mmuE?mgI8`0)pF(n~$kP%-S<o6>FMW z3-U;UMCvTQC5tAku;Ozu<~rnIuuVsZMT|i`%RpjZV6#ARCks!LkA{(l?+Qj{M&V0Y z%FLn{PIQX2I`#0x_)ESN&rB#?F2LGm8!6TEv%xjY$JP^4Qt>vkwc53Jb~jF)$~&RB z)RUE+JKQU`hMAL{Jw_?MHOYY6iDTJ<<S-=xffPRWSS@cuetsoRK93p)CqY4bz5|{n zttXUu_!b1K?ANWY*;a$q2kSvTxL^YEK_b`(JOW2DIJWg{-af}uVZuQU{RZzP0xIFU z4>=74G!l&GoMjNX=*GhK_~rrIUXG0gX%141Ol<G}%9XtQ5xBVb%}EhZ;lx#)R;Sg_ z)Kb~o8?42go36>jDKI59uauRO(={$Cjx(K&)q#ndGrOE$P$Nl=om015SwN6oiG3FX zH#<iKpI|rxAD<H2o)RuW0p;V$9PCq6Lsd>EY%AHAkJS(0<OK7>8Y?~)EukYf1UB+K zFr3pd?Q>_DeuH<)ij!5R9=)7qbFRQlwIsllgXN~|!dJmHCmG(|@DR}0<aU)oYQ6mI z<Q+W?2?heD6>L>nHFXVTo$f6LCCXgvf}Cy~tUMV4f`a^g20W~+T*^#>d;-qgDZD&} zTnjvz7b&yzX>f34a<b~q<>8ymz<EG`lc|)S&y}6shm*UIg^y?R86_sp4AqS)hg593 z7`7K;^$0jQ5$6#Zh)3>zEZMPY{mT~9qbrTCoXFeFIKf@zQ^OWsu11H%j`Od}E2}f| z-Gc3yvz1vm`MBMfc$gxUc=-6(yHq)Ncw8B{`1pC8S(A7<9OrtPsBp4tR538KF0nG= zVDD#OWu3~(mCMfV$;s)nH;0X#L;098*D|-Y$|sfCX4!3W!|H=g$jJ#;RIFs{3j0{% z&F9|K!E9vog@O5XpLvsuQvdo@FI6=8Cbn#RIW@5N$DXdj0t-H#O5Pkc-kQ3GrWUiR z-f|=6EM*pMc2+kQCaxYO4t93VNvd2-OkphZIh=Xs@G`|NHA_@sUC6){$jr0K%7}?G zhJmM%fr-b}jhoYxb-LQ&3O3I5N@pjpaWhf55ZkM~qXMfpHbcD;#mAH>@npdyFP2^w zLr?>xufu7IFmIQ=ph}Uz-Z?BGuRN+;0@Rgqo-k|3@V6OmG@VwtSMcydi<0!VIU>^w zbS4!Zo;}6)*MBWYxm3?v$il|k)B<XMG)z&dovO?xz?o!US<S@B$y%-1Rm{T4t;@j7 zQM}e_nx!3cDg)0F23H;D7-KHhxg70rOxulFS)+O8@-nTN$GUIFTn09#4Z+)w)Xdnu N$zGAc8q|OSV*nH}AiMwo literal 0 HcmV?d00001 diff --git a/plugins/tidypics/graphics/spacer.gif b/plugins/tidypics/graphics/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..e565824aafafe632011b281cba976baf8b3ba89a GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY4+e@qSs1w(7#VaJ7#J8pG7L;iK8y_302gHn2><{9 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/languages/da.php b/plugins/tidypics/languages/da.php new file mode 100644 index 00000000..b2763977 --- /dev/null +++ b/plugins/tidypics/languages/da.php @@ -0,0 +1,195 @@ +<?php +/** +* Elgg tidypics plugin danish language pack +* Beta Version 0.8.1 +* +*/ + + + $danish = array( + + // Menu items and titles + + 'image' => "Billede", + 'images' => "Billeder", + 'caption' => "Beskrivelse", + 'photos' => "Fotos", + 'images:upload' => "Upload fotos", + 'images:multiupload' => "Flash Multi-Upload værktøj", + 'images:multiupload:todo' => "Vælg et eller flere billeder til upload!", + 'album' => "Fotoalbum", + 'albums' => "Fotoalbums", + 'album:slideshow' => "Se slideshow", + 'album:yours' => "Dine Fotoalbums", + 'album:yours:friends' => "Dine venners fotoalbums", + 'album:user' => "%s's Fotoalbums", + 'album:friends' => "%s's venners fotoalbum", + 'album:all' => "Alle Fotoalbums", + 'album:group' => "Gruppe-Fotoalbum", + 'item:object:image' => "Fotos", + 'item:object:album' => "Album", + 'tidypics:uploading:images' => "Billederne er uploadet", + 'tidypics:enablephotos' => 'Skift gruppealbum', + 'tidypics:editprops' => 'Rediger billede', + 'tidypics:mostcommented' => 'Mest kommenterede', + 'tidypics:mostcommentedthismonth' => 'Mest kommenterede i denne måned', + 'tidypics:mostcommentedtoday' => 'Mest kommenterede i dag', + 'tidypics:mostviewed' => 'Mest besøgte billeder', + 'tidypics:mostvieweddashboard' => 'Mest besøgte instrumentpanel', + 'tidypics:mostviewedthisyear' => 'Mest besøgte i år', + 'tidypics:mostviewedthismonth' => 'Mest besøgte i denne måned', + 'tidypics:mostviewedlastmonth' => 'Mest besøgte sidste måned', + 'tidypics:mostviewedtoday' => 'Set flest gange i dag', + 'tidypics:recentlyviewed' => 'Senest viste billeder', + 'tidypics:recentlycommented' => 'Senest kommenterede billeder', + 'tidypics:mostrecent' => 'Nyeste billeder ifællesskabet', + 'tidypics:yourmostviewed' => 'Dine mest sete', + 'tidypics:yourmostrecent' => 'Sidst uploaded', + 'tidypics:friendmostviewed' => "%s's mest sete", + 'tidypics:friendmostrecent' => "%s's seneste billeder ", + 'tidypics:highestrated' => "Højest bedømte billeder", + 'tidypics:viewsbyowner' => "Visninger: %s af %s medlemmer (ikke inklusive dig selv)", + 'tidypics:viewsbyothers' => "Visninger: %s (%s af dig)", + 'tidypics:administration' => 'Tidypics administration', + 'tidypics:stats' => 'Statistik', + + //settings + 'tidypics:settings' => 'Indstillinger', + 'tidypics:admin:instructions' => 'Dette er de centrale Tidypics indstillinger. Tilpas dem til din opsætning og klik derefter på Gem.', + 'tidypics:settings:image_lib' => "Foto arkiv: ", + 'tidypics:settings:download_link' => "Vis download-link", + 'tidypics:settings:tagging' => "Tillad fotolinks", + 'tidypics:settings:photo_ratings' => "Tillad karakterergivning af foto (kræver plugin af Miguel Montes eller andet kompatibelt plugin)", + 'tidypics:settings:exif' => "Vis EXIF data", + 'tidypics:settings:view_count' => "Vis tæller", + 'tidypics:settings:grp_perm_override' => "Giv gruppens medlemmer fuld adgang til gruppe-album", + 'tidypics:settings:maxfilesize' => "Maksimal billedstørrelse i megabytes (MB):", + 'tidypics:settings:quota' => "Tildelt plads til brugere / grupper (MB) (0 = Ingen plads)", + 'tidypics:settings:watermark' => "Indtast teksten for vandmærke - ImageMagick cmdline skal vælges for billedbiblioteket", + 'tidypics:settings:im_path' => "Angiv stien til ImageMagick kommandoer (som slutter med et Slash/)", + 'tidypics:settings:img_river_view' => "Hvor mange poster i aktivitetslisten for hvert parti af uploadede billeder", + 'tidypics:settings:album_river_view' => "Vis albumcover eller et sæt af fotos til nye album", + 'tidypics:settings:largesize' => "Størrelse på billede", + 'tidypics:settings:smallsize' => "Tumbnailstørrelse på album", + 'tidypics:settings:thumbsize' => "Thumbnailstørrelse på billede", + + + //actions + + 'album:create' => "Skab album", + 'album:add' => "Tilføj nyt album", + 'album:addpix' => "Tilføj fotos", + 'album:edit' => "Rediger album", + 'album:delete' => "Slet album", + + 'image:edit' => "Rediger billede", + 'image:delete' => "Slet billede", + 'image:download' => "Download billede", + + //forms + + 'album:title' => "Titel", + 'album:desc' => "Beskrivelse", + 'album:tags' => "Nøgleord", + 'album:cover' => "Billedet skal bruges som albumcover", + 'tidypics:quota' => "Plads:", + + //views + + 'image:total' => "Billeder i album:", + 'image:by' => "Billede tilføjet af", + 'album:by' => "Album oprettet af:", + 'album:created:on' => "Oprettet", + 'image:none' => "Ingen billeder tilføjet.", + 'image:back' => "Forrige", + 'image:next' => "Næste", + + // tagging + 'tidypics:taginstruct' => 'Vælg et område på billedet, som du ønsker at linke', + 'tidypics:deltag_title' => 'Vælg at slette links', + 'tidypics:finish_tagging' => 'Annuller', + 'tidypics:tagthisphoto' => 'Tilføj link til foto', + 'tidypics:deletetag' => 'Slet foto link', + 'tidypics:actiontag' => 'Link', + 'tidypics:actiondelete' => 'Slet', + 'tidypics:actioncancel' => 'Annuller', + 'tidypics:inthisphoto' => 'Links i billedet', + 'tidypics:usertag' => "Foto links til medlem %s", + 'tidypics:phototagging:success' => 'Foto link tilføjet', + 'tidypics:phototagging:error' => 'Uventet fejl ved linket', + 'tidypics:deletetag:success' => 'Udvalgte links er blevet fjernet', + + + //rss + 'tidypics:posted' => 'Billedet indstilles individuelt:', + + //widgets + + 'tidypics:widget:albums' => "Fotoalbum", + 'tidypics:widget:album_descr' => "Viser seneste album", + 'tidypics:widget:num_albums' => "Antal albums", + 'tidypics:widget:latest' => "Nyeste billeder", + 'tidypics:widget:latest_descr' => "Vis seneste billeder", + 'tidypics:widget:num_latest' => "Antal billeder", + 'album:more' => "Vis alle albums", + + //river + + //images + 'image:river:created' => "%s har tilføjet et billede %s i album %s", + 'image:river:item' => "et billede", + 'image:river:annotate' => "en kommentar til billedet", + + //albums + 'album:river:created' => "%s har tilføjet et nyt album", + 'album:river:group' => "i gruppen", + 'album:river:item' => "et album", + 'album:river:annotate' => "en kommentar til albummet", + + //notifications + 'tidypics:newalbum' => 'Nye Fotoalbum', + + + // Status messages + 'tidypics:upl_success' => "Billedet er uploadet med succes", + 'image:saved' => "Billedet blev gemt", + 'images:saved' => "Alle billeder er gemt", + 'image:deleted' => "Billedet blev slettet", + 'image:delete:confirm' => "Ønsker du at slette dette billede?", + + 'images:edited' => "Billedet er blevet opdateret", + 'album:edited' => "Albummet er blevet opdateret", + 'album:saved' => "Albummet blev gemt", + 'album:deleted' => "Albummet er blevet slettet", + 'album:delete:confirm' => "Ønsker du at slette dette album?", + 'album:created' => "Deres nye album er skabt", + 'tidypics:settings:save:ok' => 'Tidypics Indstillingerne er gemt', + 'tidypics:upgrade:success' => 'Tidypics blev opgraderet med succes', + + //Error messages + + 'tidypics:partialuploadfailure' => "Der opstod en fejl under uploadingen af billeder (%s af %s billeder)", + 'tidypics:completeuploadfailure' => "Upload af billede mislykkedes", + 'tidypics:exceedpostlimit' => "Alt for mange store billeder på én gang - forsøg evt. at overføre færre eller mindre billeder", + 'tidypics:noimages' => "Ingen billeder udvalgt til upload", + 'tidypics:image_mem' => "Billedet er for stort", + 'tidypics:image_pixels' => "Billedet har for mange pixels", + 'tidypics:unk_error' => "Ukendt fejl opstod under upload", + 'tidypics:save_error' => "Ukendt fejl opstod, da billedet skulle gemmes på serveren", + 'tidypics:not_image' => "Type af billede kan ikke genkendes", + 'image:deletefailed' => "Dit billede kunne ikke slettes", + 'image:downloadfailed' => "Fejl: Billedet er ikke tilgængeligt i øjeblikket", + 'tidypics:nosettings' => "Administratoren af webstedet, har ikke foretaget justeringer for fotoalbum", + 'tidypics:exceed_quota' => "Din tildelte plads er opbrugt!", + 'images:notedited' => "Ikke alle billeder er blevet opdateret", + + 'album:none' => "Ingen albums skabt endnu", + 'album:uploadfailed' => "Dit album kunne ikke gemmes", + 'album:deletefailed' => "Dit album kunne ikke slettes", + 'album:blank' => "Giv venligst dette album en titel samt beskrivelse", + + 'tidypics:upgrade:failed' => "Opgraderingen af Tidypics mislykkedes", + ); + + add_translation("da",$danish); +?> diff --git a/plugins/tidypics/languages/de.php b/plugins/tidypics/languages/de.php new file mode 100644 index 00000000..7b014bc0 --- /dev/null +++ b/plugins/tidypics/languages/de.php @@ -0,0 +1,227 @@ +<?php +/** +* Elgg tidypics plugin german language pack +* Beta Version 0.8.4 +* +*/ + + + $german = array( + // hack for core bug + 'untitled' => "Unbenannt", + + // Menu items and titles + + 'image' => "Bild", + 'images' => "Bilder", + 'caption' => "Beschreibung", + 'photos' => "Fotos", + 'images:upload' => "Fotos hochladen", + 'images:multiupload' => "Flash Multi-Upload Tool", + 'images:multiupload:todo' => "Ein oder mehrere Bilder zum Hochladen wählen!", + 'album' => "Fotoalbum", + 'albums' => "Fotoalben", + 'album:slideshow' => "Diashow ansehen", + 'album:yours' => "Deine Fotoalben", + 'album:yours:friends' => "Fotoalben deiner Freunde", + 'album:user' => "%s's Fotoalben", + 'album:friends' => "Fotoalben von %s's Freunden", + 'album:all' => "Alle Fotoalben", + 'album:group' => "Gruppen-Alben", + 'item:object:image' => "Fotos", + 'item:object:album' => "Alben", + 'tidypics:uploading:images' => "Die Bilder werden hochgeladen", + 'tidypics:enablephotos' => 'Schalte Gruppenalben frei', + 'tidypics:editprops' => 'Bild bearbeiten', + 'tidypics:mostcommented' => 'meist kommentierte', + 'tidypics:mostcommentedthismonth' => 'Meist kommentierte des Monats', + 'tidypics:mostcommentedtoday' => 'Meist kommentierte des Tages', + 'tidypics:mostviewed' => 'Meist gesehene Bilder', + 'tidypics:mostvieweddashboard' => 'Meist gesehene dashboard', + 'tidypics:mostviewedthisyear' => 'Meist gesehene des Jahres', + 'tidypics:mostviewedthismonth' => 'Meist gesehene des Monats', + 'tidypics:mostviewedlastmonth' => 'Meist gesehen im letzten Monat', + 'tidypics:mostviewedtoday' => 'Am häufigsten gezeigte des Tages', + 'tidypics:recentlyviewed' => 'Zuletzt angezeigt', + 'tidypics:recentlycommented' => 'Zuletzt kommentiert', + 'tidypics:mostrecent' => 'Community neue Bilder', + 'tidypics:yourmostviewed' => 'Deine meist gesehene', + 'tidypics:yourmostrecent' => 'Zuletzt hochgeladen', + 'tidypics:friendmostviewed' => "%s's meist gesehene", + 'tidypics:friendmostrecent' => "Zuletzt hochgeladen von %s", + 'tidypics:highestrated' => "Am höchsten bewertet", + 'tidypics:views' => "Zugriffe: %s", + 'tidypics:viewsbyowner' => "Zugriffe: %s von %s Mitglieder (du ausgeschlossen)", + 'tidypics:viewsbyothers' => "Zugriffe: %s (%s deine)", + 'tidypics:administration' => 'Tidypics Administration', + 'tidypics:stats' => 'Statitik', + + //settings + 'tidypics:settings' => 'Einstellungen', + 'tidypics:admin:instructions' => 'Das sind die Tidypics Einstellungen', + + 'tidypics:settings:image_lib' => "Image Library: ", + 'tidypics:settings:thumbnail' => "Thumbnail Creation", + 'tidypics:settings:download_link' => "Zeige Download-Link", + 'tidypics:settings:tagging' => "Erlaube Foto-Links", + 'tidypics:settings:photo_ratings' => "Erlaube Foto Bewertungen (benötigt rate plugin of Miguel Montes oder passendes)", + 'tidypics:settings:exif' => "Zeige EXIF data", + 'tidypics:settings:view_count' => "Zeige Zähler", + 'tidypics:settings:grp_perm_override' => "Erlaube den Gruppen-Mitgliedern unbeschränkten zugagn zur verwaltung von Gruppen-Alben", + 'tidypics:settings:maxfilesize' => "Maximale Bildgröße in Megabytes (MB):", + 'tidypics:settings:quota' => "Benutzer/Gruppen Speicherplatz in (MB) (0 = Kein Speicherplatz)", + 'tidypics:settings:watermark' => "Gib den Text für den Wasserzeichen ein - ImageMagick Cmdline muss ausgewählt sein für die Bildbibliothek", + + 'tidypics:settings:im_path' => "Gib den Pfad zu ImageMagick Befehle (mit abschließendem Slasch)", + 'tidypics:settings:img_river_view' => "Wie viele Einträge in der aktivitäten Liste beim Upload von mehreren Bildern", + 'tidypics:settings:album_river_view' => "Zeige Albumcover oder ein Set von Fotos für neuen Album", + 'tidypics:settings:largesize' => "Bild-Größe", + 'tidypics:settings:smallsize' => "Album-Tumbnail Bild-Größe", + 'tidypics:settings:thumbsize' => "Thumbnail Bild-Größe", + 'tidypics:settings:im_id' => "Bild ID", + + + //actions + + 'album:create' => "Album hinzufügen", + 'album:add' => "Neues Album hinzufügen", + 'album:addpix' => "Fotos hinzufügen", + 'album:edit' => "Album bearbeiten", + 'album:delete' => "Album löschen", + + 'image:edit' => "Bild bearbeiten", + 'image:delete' => "Bild löschen", + 'image:download' => "Bild herunterladen", + + //forms + + 'album:title' => "Titel", + 'album:desc' => "Beschreibung", + 'album:tags' => "Stichwörter", + 'album:cover' => "Das bild als Albumcover nutzen", + 'tidypics:quota' => "Speicherplatz:", + + //views + + 'image:total' => "Bilder im Album:", + 'image:by' => "Bild hinzugefügt von", + 'album:by' => "Album erstellt von:", + 'album:created:on' => "Erstellt", + 'image:none' => "Noch keine Bilder hinzugefügt.", + 'image:back' => "Vorheriges", + 'image:next' => "Nächstes", + + // tagging + 'tidypics:taginstruct' => 'Wähle ein Bereich auf dem Foto den du Verlinken willst', + 'tidypics:deltag_title' => 'Wähle zu löschende Links', + 'tidypics:finish_tagging' => 'Abbrechen', + 'tidypics:tagthisphoto' => 'Link zum Foto hinzufügen', + 'tidypics:deletetag' => 'Lösche Foto-Link', + 'tidypics:actiontag' => 'Link', + 'tidypics:actiondelete' => 'Löschen', + 'tidypics:actioncancel' => 'Abbrechen', + 'tidypics:inthisphoto' => 'Links in dem Foto', + 'tidypics:usertag' => "Foto verlinkt mit Mitglied %s", + 'tidypics:phototagging:success' => 'Foto-Link erfolgreich hinzugefügt', + 'tidypics:phototagging:error' => 'Unerwarteter Fehler beim verlinken', + 'tidypics:deletetag:success' => 'Ausgewählte Links wurden erfolgreich gelöscht', + + 'tidypics:tag:subject' => "Du wurdest in einem Foto verlinkt", + 'tidypics:tag:body' => "Du wurdest in diesem Foto verlinkt %s von %s. + +Das Foto kanns du hier sehen: %s", + + + //rss + 'tidypics:posted' => 'Das Bild eingestellt:', + + //widgets + + 'tidypics:widget:albums' => "Fotoalben", + 'tidypics:widget:album_descr' => "Zeige neuste Alben", + 'tidypics:widget:num_albums' => "Anzahl der Alben", + 'tidypics:widget:latest' => "Neuste Bilder", + 'tidypics:widget:latest_descr' => "Zeige neuste Bilder", + 'tidypics:widget:num_latest' => "Anzahl der Bilder", + 'album:more' => "Alle Alben ansehen", + + //river + + //images + 'image:river:created' => "%s hat ein Bild %s zum Album %s hinzugefügt", + 'image:river:item' => "ein Bild", + 'image:river:annotate' => "einen Kommentar zum Bild", + 'image:river:tagged' => "war im Foto verlinkt", + + //albums + 'album:river:created' => "%s hat ein neues Album erstellt", + 'album:river:group' => "in der Gruppe", + 'album:river:item' => "ein Album", + 'album:river:annotate' => "einen Kommentar zum Album", + + //notifications + 'tidypics:newalbum' => 'Neues Fotoalbum', + + + + // Status messages + 'tidypics:upl_success' => "Die Bilder sind erfolgreich hochgeladen", + 'image:saved' => "Das Bild wurde gespeichert", + 'images:saved' => "Alle Bilder sind gespeichert", + 'image:deleted' => "Das Bild wurde gelöscht", + 'image:delete:confirm' => "Willst du das Bild wirklich löschen?", + + 'images:edited' => "Das Bild wurde aktualisiert", + 'album:edited' => "Das Album wurde aktualisiert", + 'album:saved' => "Das Album wurde gespeichert", + 'album:deleted' => "Das Album wurde gelöscht", + 'album:delete:confirm' => "Willst du das Album wirklich löschen?", + 'album:created' => "Dein neues Album ist erstellt", + 'tidypics:settings:save:ok' => 'Tidypics Einstellungen erfolgreich gespeichert', + + + + + + + + + + + + 'tidypics:upgrade:success' => 'Upgrade von Tidypics erfolgreich', + + //Error messages + + 'tidypics:partialuploadfailure' => "Es sind Fehler beim Hochladen einiger Bilder aufgetreten (%s von %s Bildern)", + 'tidypics:completeuploadfailure' => "Bilder-Upload fehlgeschlagen", + 'tidypics:exceedpostlimit' => "Zuviele große Bilder auf einmal - versuche weniger oder kleinere Bilder hochzuladen", + + 'tidypics:noimages' => "Keine Bilder zum Upload ausgewählt", + 'tidypics:image_mem' => "Das Bild ist zu groß", + 'tidypics:image_pixels' => "Das Bild hat zuviele Pixel", + 'tidypics:unk_error' => "Unbekannte Fehler beim Upload ", + 'tidypics:save_error' => "Unbekanntes Fehler beim speichern des Bildes auf dem Server", + 'tidypics:not_image' => "Das Bild-Typ wurde nicht erkannt", + 'image:deletefailed' => "Dein Bild konnte nicht gelöscht werden", + 'image:downloadfailed' => "Fehler: Das Bild ist zur Zeit nicht verfügbar", + + + 'tidypics:nosettings' => "Admin dieser Seite hat keine Einstellungen für Fotoalben vorgenommen", + 'tidypics:exceed_quota' => "Dir zugewiesener Speicherplatz ist ausgeschöpft!", + + 'images:notedited' => "Nicht alle Bilder konnten erfolgreich upgedated werden", + + 'album:none' => "Bis jetzt keine Alben erstellt", + + 'album:uploadfailed' => "Dein Album konnte nicht gespeichert werden", + 'album:deletefailed' => "Dein Album konnte nicht gelöscht werden", + 'album:blank' => "Bitte gib diesem Album einen Titel und eine Beschreibung", + + + + 'tidypics:upgrade:failed' => "Upgrade von Tidypics gescheitert", + ); + + add_translation("de",$german); +?> diff --git a/plugins/tidypics/languages/en.php b/plugins/tidypics/languages/en.php new file mode 100644 index 00000000..934c8ae5 --- /dev/null +++ b/plugins/tidypics/languages/en.php @@ -0,0 +1,231 @@ +<?php + + $english = array( + // hack for core bug + 'untitled' => "untitled", + + // Menu items and titles + + 'image' => "Image", + 'images' => "Images", + 'caption' => "Caption", + 'photos' => "Photos", + 'images:upload' => "Upload Images", + 'images:multiupload' => "Flash Multi Upload Tool", + 'images:multiupload:todo' => "Choose one or more files for upload.", + 'album' => "Photo Album", + 'albums' => "Photo Albums", + 'album:slideshow' => "View slideshow", + 'album:yours' => "Your photo albums", + 'album:yours:friends' => "Your friends' photo albums", + 'album:user' => "%s's photo albums", + 'album:friends' => "%s's friends' photo albums", + 'album:all' => "All site photo albums", + 'album:group' => "Group albums", + 'item:object:image' => "Photos", + 'item:object:album' => "Albums", + 'tidypics:uploading:images' => "Please wait. Uploading images.", + 'tidypics:enablephotos' => 'Enable group photo albums', + 'tidypics:editprops' => 'Edit Image Properties', + 'tidypics:mostcommented' => 'Most commented images', + 'tidypics:mostcommentedthismonth' => 'Most commented this month', + 'tidypics:mostcommentedtoday' => 'Most commented today', + 'tidypics:mostviewed' => 'Most viewed images', + 'tidypics:mostvieweddashboard' => 'Most viewed dashboard', + 'tidypics:mostviewedthisyear' => 'Most viewed this year', + 'tidypics:mostviewedthismonth' => 'Most viewed this month', + 'tidypics:mostviewedlastmonth' => 'Most viewed last month', + 'tidypics:mostviewedtoday' => 'Most viewed today', + 'tidypics:recentlyviewed' => 'Recently viewed images', + 'tidypics:recentlycommented' => 'Recently commented images', + 'tidypics:mostrecent' => 'Most recent images', + 'tidypics:yourmostviewed' => 'Your most viewed images', + 'tidypics:yourmostrecent' => 'Your most recent images', + 'tidypics:friendmostviewed' => "%s's most viewed images", + 'tidypics:friendmostrecent' => "%s's most recent images", + 'tidypics:highestrated' => "Highest rated images", + 'tidypics:views' => "Views: %s", + 'tidypics:viewsbyowner' => "by %s users (not including you)", + 'tidypics:viewsbyothers' => "(%s by you)", + 'tidypics:administration' => 'Tidypics Administration', + 'tidypics:stats' => 'Stats', + 'tidypics:nophotosingroup' => 'This groups does not have any photos yet', + + 'flickr:setup' => 'Flickr Setup', + 'flickr:usernamesetup' => 'Please enter your Flickr username here:', + 'flickr:selectalbum' => 'Select album to import photos into', + 'flickr:albumdesc' => 'Album to import photos to:', + 'flickr:importmanager' => 'Photoset Import Manager', + 'flickr:desc' => 'Click on the set you wish to import into this site.<br />Copies of the photos will be made and stored on this site where they can be viewed and commented on.', + 'flickr:intro' => 'Flickr Integration allows you to import photos from your flickr account into this Elgg site. By entering your username and choosing an album to import into, you can begin the process. <br />When you have saved your username and album selection, click on the Import Flickr Photos link to the left to select which Flickr set you would like to import photos from.', + 'flickr:menusetup' => 'Flickr Setup', + 'flickr:menuimport' => 'Import Flickr Photos', + + //settings + 'tidypics:settings' => 'Settings', + 'tidypics:admin:instructions' => 'These are the core Tidypics settings. Change them for your setup and then click save.', + 'tidypics:settings:image_lib' => "Image Library", + 'tidypics:settings:thumbnail' => "Thumbnail Creation", + 'tidypics:settings:help' => "Help", + 'tidypics:settings:download_link' => "Show download link", + 'tidypics:settings:tagging' => "Enable photo tagging", + 'tidypics:settings:photo_ratings' => "Enable photo ratings (requires rate plugin of Miguel Montes or compatible)", + 'tidypics:settings:exif' => "Show EXIF data", + 'tidypics:settings:view_count' => "View counter", + 'tidypics:settings:grp_perm_override' => "Allow group members full access to group albums", + 'tidypics:settings:maxfilesize' => "Maximum image size in megabytes (MB):", + 'tidypics:settings:quota' => "User/Group Quota (MB) - 0 equals no quota", + 'tidypics:settings:watermark' => "Enter text to appear in the watermark", + 'tidypics:settings:im_path' => "Enter the path to your ImageMagick commands (with trailing slash)", + 'tidypics:settings:img_river_view' => "How many entries in activity river for each batch of uploaded images", + 'tidypics:settings:album_river_view' => "Show the album cover or a set of photos for new album", + 'tidypics:settings:largesize' => "Primary image size", + 'tidypics:settings:smallsize' => "Album view image size", + 'tidypics:settings:thumbsize' => "Thumbnail image size", + 'tidypics:settings:im_id' => "Image ID", + + 'tidypics:settings:heading:img_lib' => "Image Library Settings", + 'tidypics:settings:heading:main' => "Major Settings", + 'tidypics:settings:heading:river' => "Activity Integration Options", + 'tidypics:settings:heading:sizes' => "Thumbnail Size", + 'tidypics:settings:heading:groups' => "Group Settings", + + //actions + + 'album:create' => "Create new album", + 'album:add' => "Add Photo Album", + 'album:addpix' => "Add photos to album", + 'album:edit' => "Edit album", + 'album:delete' => "Delete album", + + 'image:edit' => "Edit image", + 'image:delete' => "Delete image", + 'image:download' => "Download image", + + //forms + + 'album:title' => "Title", + 'album:desc' => "Description", + 'album:tags' => "Tags", + 'album:cover' => "Make image album cover?", + 'tidypics:quota' => "Quota usage:", + + //views + + 'image:total' => "Images in album:", + 'image:by' => "Image added by", + 'album:by' => "Album created by", + 'album:created:on' => "Created", + 'image:none' => "No images have been added yet.", + 'image:back' => "Previous", + 'image:next' => "Next", + + // tagging + 'tidypics:taginstruct' => 'Select area that you want to tag', + 'tidypics:deltag_title' => 'Select tags to delete', + 'tidypics:finish_tagging' => 'Stop tagging', + 'tidypics:tagthisphoto' => 'Tag this photo', + 'tidypics:deletetag' => 'Delete a photo tag', + 'tidypics:actiontag' => 'Tag', + 'tidypics:actiondelete' => 'Delete', + 'tidypics:actioncancel' => 'Cancel', + 'tidypics:inthisphoto' => 'In this photo', + 'tidypics:usertag' => "Photos tagged with user %s", + 'tidypics:phototagging:success' => 'Photo tag was successfully added', + 'tidypics:phototagging:error' => 'Unexpected error occurred during tagging', + 'tidypics:deletetag:success' => 'Selected tags were successfully deleted', + + 'tidypics:tag:subject' => "You have been tagged in a photo", + 'tidypics:tag:body' => "You have been tagged in the photo %s by %s. + +The photo can be viewed here: %s", + + + //rss + 'tidypics:posted' => 'posted a photo:', + + //widgets + + 'tidypics:widget:albums' => "Photo Albums", + 'tidypics:widget:album_descr' => "Showcase your photo albums", + 'tidypics:widget:num_albums' => "Number of albums to display", + 'tidypics:widget:latest' => "Latest Photos", + 'tidypics:widget:latest_descr' => "Display your latest photos", + 'tidypics:widget:num_latest' => "Number of images to display", + 'album:more' => "View all albums", + + // river + + //images + 'image:river:created' => "%s added the photo %s to album %s", + 'image:river:item' => "an photo", + 'image:river:annotate' => "a comment on the photo", + 'image:river:tagged' => "was tagged in the photo", + + //albums + 'album:river:created' => "%s created a new photo album", + 'album:river:group' => "in the group", + 'album:river:item' => "an album", + 'album:river:annotate' => "a comment on the photo album", + + // notifications + 'tidypics:newalbum' => 'New photo album', + + + // Status messages + + 'tidypics:upl_success' => "Your images uploaded successfully.", + 'image:saved' => "Your image was successfully saved.", + 'images:saved' => "All images were successfully saved.", + 'image:deleted' => "Your image was successfully deleted.", + 'image:delete:confirm' => "Are you sure you want to delete this image?", + + 'images:edited' => "Your images were successfully updated.", + 'album:edited' => "Your album was successfully updated.", + 'album:saved' => "Your album was successfully saved.", + 'album:deleted' => "Your album was successfully deleted.", + 'album:delete:confirm' => "Are you sure you want to delete this album?", + 'album:created' => "Your new album has been created.", + 'tidypics:settings:save:ok' => 'Successfully saved the Tidypics plugin settings', + + 'tidypics:upgrade:success' => 'Upgrade of Tidypics a success', + + 'flickr:enterusername' => 'You must enter a username', + 'flickr:savedusername' => 'Successfully saved username of %s', + 'flickr:saveduserid' => 'Successfully saved userid of %s', + 'flickr:savedalbum' => 'Album saved - %s', + + //Error messages + + 'tidypics:baduploadform' => "There was an error with the upload form", + 'tidypics:partialuploadfailure' => "There were errors uploading some of the images (%s of %s images).", + 'tidypics:completeuploadfailure' => "Upload of images failed.", + 'tidypics:exceedpostlimit' => "Too many large images - try to upload fewer or smaller images.", + 'tidypics:noimages' => "No images were selected.", + 'tidypics:image_mem' => "Image is too large - too many bytes", + 'tidypics:image_pixels' => "Image has too many pixels", + 'tidypics:unk_error' => "Unknown upload error", + 'tidypics:save_error' => "Unknown error saving the image on server", + 'tidypics:not_image' => "This is not a recognized image type", + 'tidypics:deletefailed' => "Sorry. Deletion failed.", + 'tidypics:deleted' => "Successful deletion.", + 'image:downloadfailed' => "Sorry; this image is not available at this time.", + 'tidypics:nosettings' => "Admin of this site has not set photo album settings.", + 'tidypics:exceed_quota' => "You have exceeded the quota set by the administrator", + 'images:notedited' => "Not all images were successfully updated", + + 'album:none' => "No albums have been created yet.", + 'album:uploadfailed' => "Sorry; we could not save your album.", + 'album:deletefailed' => "Your album could not be deleted at this time.", + 'album:blank' => "Please give this album a title and description.", + + 'tidypics:upgrade:failed' => "The upgrade of Tidypics failed", + + 'flickr:errorusername' => 'Username %s not found on Flickr', + 'flickr:errorusername2' => 'You must enter a username', + 'flickr:errorimageimport' => 'This image has already been imported', + 'flickr:errornoalbum' => "No album selected. Please choose and save an album: %s" + ); + + add_translation("en",$english); +?> diff --git a/plugins/tidypics/languages/es.php b/plugins/tidypics/languages/es.php new file mode 100644 index 00000000..1c9b580e --- /dev/null +++ b/plugins/tidypics/languages/es.php @@ -0,0 +1,191 @@ +<?php +/**TRADUCIDO POR ALIX SILVA, CARLOS SILVA Y LA COMUNIDAD ELGG**/ + + $spanish = array( + // hack for core bug + 'untitled' => "sin titulo", + + // Menu items and titles + 'image' => "Imagen", + 'images' => "Imagenes", + 'caption' => "Título", + 'photos' => "Fotos", + 'images:upload' => "Cargar Imagenes", + 'images:multiupload' => "Herramienta MultiCarga de Flash", + 'images:multiupload:todo' => "Selecciona uno a más archivos para cargar..", + 'album' => "Álbum de Fotos", + 'albums' => "Álbumnes de Fotos", + 'album:slideshow' => "Ver presentación de fotos", + 'album:yours' => "Tu álbum de fotos", + 'album:yours:friends' => "Álbum de fotos de tus amigos", + 'album:user' => "Álbum de fotos de %s", + 'album:friends' => "Álbum de fotos de los amigos de %s", + 'album:all' => "Todos los álbumnes de fotos", + 'album:group' => "Grupo de álbumnes", + 'item:object:image' => "Fotos", + 'item:object:album' => "Álbumnes", + 'tidypics:enablephotos' => 'Habilitar Álbumnes de foto del Grupo', + 'tidypics:editprops' => 'Editar Propiedades de Imagen', + 'tidypics:mostcommented' => 'imagenes más comentadas', + 'tidypics:mostcommentedthismonth' => 'Más comentadas este mes', + 'tidypics:mostcommentedtoday' => 'Más comentadas del día de hoy', + 'tidypics:mostviewed' => 'Imagenes más vistas', + 'tidypics:mostvieweddashboard' => 'tablero m&as visto', + 'tidypics:mostviewedthisyear' => 'Más vistas este año', + 'tidypics:mostviewedthismonth' => 'Más vistas este mes', + 'tidypics:mostviewedlastmonth' => 'Más vistas el &ultimo mes', + 'tidypics:mostviewedtoday' => 'Más vistas durante el día de hoy', + 'tidypics:recentlyviewed' => 'Imagenes vistas recientemente', + 'tidypics:mostrecent' => 'Imagenes vistas más recientemente', + 'tidypics:yourmostviewed' => 'Tu imagen más vista', + 'tidypics:yourmostrecent' => 'Tu imagen más reciente', + 'tidypics:friendmostviewed' => "La imagen más vista de %s", + 'tidypics:friendmostrecent' => "La imagen más reciente de %s", + 'tidypics:highestrated' => "Imagenes mejor catalogadas", + 'tidypics:viewsbyowner' => "Vistas: %s por %s (no te incluye a ti)", + 'tidypics:viewsbyothers' => "Vistas: %s (%s por ti)", + 'tidypics:administration' => 'Administración de Tidypics', + 'tidypics:stats' => 'Estatus', + + //settings + 'tidypics:settings' => 'Configuración', + 'tidypics:admin:instructions' => 'Este es el corazón de las preferencias de Tidypics. Cambialas y luego guardalas.', + 'tidypics:settings:image_lib' => "Libreria de Imagenes: ", + 'tidypics:settings:download_link' => "Mostrar vinculo de descarga", + 'tidypics:settings:tagging' => "Habilitar etiquetas en las fotos", + 'tidypics:settings:photo_ratings' => "Habilitar ratings de fotos(requiere instalar el e plugin de Miguel Montes o compatible)", + 'tidypics:settings:exif' => "Mostrar data de EXIF", + 'tidypics:settings:view_count' => "Ver contador", + 'tidypics:settings:grp_perm_override' => "Permitir acceso completo a los miembros de este grupo al album de fotos", + 'tidypics:settings:maxfilesize' => "Tama�o máximo de la imagen en megabytes (MB):", + 'tidypics:settings:quota' => "Usuario/Grupo Cuota (MB) - 0 MB de cuota", + 'tidypics:settings:watermark' => "Introduce el texto que aparecerá en la marca de agua - ImageMagick Cmdline debe ser seleccionado para la libreria de imagenes", + 'tidypics:settings:im_path' => "Ingresa la ruta de tu ImageMagick commands (incluye el slash)", + 'tidypics:settings:img_river_view' => "�Cuántas entradas deseas para cada grupo de imágenes cargadas", + 'tidypics:settings:album_river_view' => "Muestra la portada del álbum o el set de fotos para el álbum nuevo", + 'tidypics:settings:largesize' => "Tamaño inicial de la imagen", + 'tidypics:settings:smallsize' => "Tamaño de imagen de vista del álbum", + 'tidypics:settings:thumbsize' => "Tama�o de imagen miniatura", + + //actions + + 'album:create' => "Crear nuevo álbum", + 'album:add' => "Añadir Álbum de fotos", + 'album:addpix' => "ñadir fotos al Álbum", + 'album:edit' => "Editar álbum", + 'album:delete' => "Borrar álbum", + + 'image:edit' => "Editar imagen", + 'image:delete' => "Borrar imagen", + 'image:download' => "Descargar imagen", + + //forms + + 'album:title' => "Titulo", + 'album:desc' => "Descripción", + 'album:tags' => "Etiquetas", + 'album:cover' => "�Desea hacer de esta imagen la portada del álbum?", + 'tidypics:quota' => "Cuota usada:", + + //views + + 'image:total' => "Imagenes en el álbum:", + 'image:by' => "Imagenes añadidas por", + 'album:by' => "Álbum creador por", + 'album:created:on' => "Creado", + 'image:none' => "Ninguna imagen ha sido añadida aún.", + 'image:back' => "Anterior", + 'image:next' => "Siguiente", + + // tagging + 'tidypics:taginstruct' => 'Seleccciona el área que deseas etiquetar', + 'tidypics:deltag_title' => 'Seleccionas las etiquetas a borrar', + 'tidypics:finish_tagging' => 'Detener etiquetado', + 'tidypics:tagthisphoto' => 'Etiquetar esta foto', + 'tidypics:deletetag' => 'Borrar etiqueta de la foto', + 'tidypics:actiontag' => 'Etiqueta', + 'tidypics:actiondelete' => 'Borrar', + 'tidypics:actioncancel' => 'Cancelar', + 'tidypics:inthisphoto' => 'En esta foto', + 'tidypics:usertag' => "Fotos etiquetadas con %s", + 'tidypics:phototagging:success' => 'La etiqueta de la foto fue añadida exitosamente', + 'tidypics:phototagging:error' => 'Ocurrió un error inesperado durante el etiquetado', + 'tidypics:deletetag:success' => 'Las etiquetas seleccionadas fueron borradas exitosamente', + + + //rss + 'tidypics:posted' => 'publicar una foto:', + + //widgets + + 'tidypics:widget:albums' => "Álbumnes de fotos", + 'tidypics:widget:album_descr' => "Mosrar tu último álbum de fotos", + 'tidypics:widget:num_albums' => "Número de álbumnes a mostrar", + 'tidypics:widget:latest' => "Latest Photos", + 'tidypics:widget:latest_descr' => "Display your latest photos", + 'tidypics:widget:num_latest' => "Number of images to display", + 'album:more' => "Ver todos los álbumnes", + + // river + + //images + 'image:river:created' => "%s añadio la foto %s al álbum %s", + 'image:river:item' => "una foto", + 'image:river:annotate' => "un comentario en la foto", + 'image:river:tagged' => "fue etiquetada en la foto", + + //albums + 'album:river:created' => "%s creo un nuevo álbum de fotos", + 'album:river:group' => "en el grupo", + 'album:river:item' => "un álbum", + 'album:river:annotate' => "un comentario en el álbum de fotos", + + // notifications + 'tidypics:newalbum' => 'Nuevo álbum de fotos', + + + // Status messages + + 'tidypics:upl_success' => "Tu imagen fue cargada exitosamente.", + 'image:saved' => "Tu imagen fue guardada exitosamente.", + 'images:saved' => "Todas tus imagenes fueron guardadas exitosamente.", + 'image:deleted' => "Tu imagen fue borrada exitosamente.", + 'image:delete:confirm' => "�Estás seguro de que deseas borrar esta imagen?", + 'images:edited' => "Tu imagen fue editada exitosamente.", + + 'album:edited' => "Tu álbum fue cargado exitosamente.", + 'album:saved' => "Tu álbum fue guardado exitosamente.", + 'album:deleted' => "Tu álbum fue borrado exitosamente.", + 'album:delete:confirm' => "�Estás seguro de que deseas borrar esta imagen?", + 'album:created' => "Tu nuevo álbum ha sido creado.", + 'tidypics:settings:save:ok' => 'Las preferencias del plugin de Tidypics han sido exitosamente guardadas', + + 'tidypics:upgrade:success' => 'La actualización de Tidypics ha sido un exito', + + //Error messages + + 'tidypics:partialuploadfailure' => "Ocurrieron errores mientas se cargaban algunas de las imagenes (%s de %s imagenes).", + 'tidypics:completeuploadfailure' => "Carga de imagenes fallidas.", + 'tidypics:exceedpostlimit' => "Las imagenes son muy grandes - trate de cargar imagenes m&ás pequeñas.", + 'tidypics:noimages' => "Ninguna imagen fue seleccionada.", + 'tidypics:image_mem' => "La image is muy grande - demasiados bytes", + 'tidypics:image_pixels' => "La image tiene demasiados pixeles", + 'tidypics:unk_error' => "Error de carga desconocido", + 'tidypics:save_error' => "Error desconocido guardando la imagen en el servidor", + 'tidypics:not_image' => "Este no es un tipo de imagen soportada por el sistema", + 'image:deletefailed' => "Tu imagen no pudo ser borrada en este momento.", + 'image:downloadfailed' => "Lo sentimos; esta imagen no está disponible en este momento.", + 'tidypics:nosettings' => "El Administrador de este sitio no ha configurado las preferencias de los álbumnes de fotos.", + 'tidypics:exceed_quota' => "Has excedido la cuota asignada por el administrador", + 'images:notedited' => "No todas las imagenes fueron actualizas exitosamente", + + 'album:none' => "No ha sido creado ningún álbum aún.", + 'album:uploadfailed' => "Lo sentimos; no pudimos guardar tu álbum.", + 'album:deletefailed' => "Tu álbum no pudo ser borrado en este momento.", + 'album:blank' => "Por favor, dale a este Álbum un titulo y una descripción.", + + 'tidypics:upgrade:failed' => "La actualización de Tidypics ha fallado", + ); + + add_translation("es",$spanish); +?> \ No newline at end of file diff --git a/plugins/tidypics/languages/fr.php b/plugins/tidypics/languages/fr.php new file mode 100644 index 00000000..ceca6280 --- /dev/null +++ b/plugins/tidypics/languages/fr.php @@ -0,0 +1,159 @@ +<?php + +// Generated by TranslationBrowser 20091025-06:26:52 PM + +$french = array( + 'untitled' => "Sans titre" , + 'image' => "Image" , + 'images' => "Images" , + 'caption' => "Légende" , + 'photos' => "Photos" , + 'images:upload' => "Charger des images" , + 'images:multiupload' => "Outil Flash de chargement multi fichiers" , + 'images:multiupload:todo' => "Sélectionnez un ou plusieurs fichiers à charger." , + 'album' => "Album photo" , + 'albums' => "Albums photo" , + 'album:slideshow' => "Voir diaporama" , + 'album:yours' => "Vos albums photo" , + 'album:yours:friends' => "Les albums photo de vos amis" , + 'album:user' => "Albums photo de %s" , + 'album:friends' => "Albums photo des amis de %s" , + 'album:all' => "Tout les albums photo" , + 'album:group' => "Albums de groupe" , + 'item:object:image' => "Photos" , + 'item:object:album' => "Albums" , + 'tidypics:uploading:images' => "Veuillez patientez, nous chargeons les fichiers." , + 'tidypics:enablephotos' => "Activer les albums photo pour les groupes" , + 'tidypics:editprops' => "Modifier les propriétés des images" , + 'tidypics:mostcommented' => "Images les plus commentées." , + 'tidypics:mostcommentedthismonth' => "Les plus commentés ce mois-ci" , + 'tidypics:mostcommentedtoday' => "Les plus commentés ce jour-ci" , + 'tidypics:mostviewed' => "Images les plus vues" , + 'tidypics:mostvieweddashboard' => "Tableaux de bord les plus vus" , + 'tidypics:mostviewedthisyear' => "Les plus vus cette année." , + 'tidypics:mostviewedthismonth' => "Les plus vus ce mois-ci" , + 'tidypics:mostviewedlastmonth' => "Les plus vus le mois dernier" , + 'tidypics:mostviewedtoday' => "Les plus vus aujourd'hui" , + 'tidypics:recentlyviewed' => "Images récemment vues" , + 'tidypics:recentlycommented' => "Image récemment commentées" , + 'tidypics:mostrecent' => "Images les plus récentes" , + 'tidypics:yourmostviewed' => "Vos images les plus vues" , + 'tidypics:yourmostrecent' => "Vos images les plus récentes" , + 'tidypics:friendmostviewed' => "Les images les plus vues de %s" , + 'tidypics:friendmostrecent' => "Les images les plus récentes de %s" , + 'tidypics:highestrated' => "Les images les mieux notées" , + 'tidypics:views' => "Vues: %s" , + 'tidypics:viewsbyowner' => "par % membres (vous exclus)" , + 'tidypics:viewsbyothers' => "(%s par vous)" , + 'tidypics:administration' => "Administration Tydipics" , + 'tidypics:stats' => "Stats" , + 'tidypics:settings' => "Paramétrages" , + 'tidypics:admin:instructions' => "Réglages principaux de Tydipics. Modifiez les pour votre usage et cliquez sur Sauvegarder" , + 'tidypics:settings:image_lib' => "Librairie graphique" , + 'tidypics:settings:thumbnail' => "Création des vignettes" , + 'tidypics:settings:download_link' => "Voir le lien de download" , + 'tidypics:settings:tagging' => "Activer les tags sur les photos" , + 'tidypics:settings:photo_ratings' => "Activer les notations des photos (nécessite le rate plugin de Miguel Montes ou compatible)" , + 'tidypics:settings:exif' => "Voir les données EXIF" , + 'tidypics:settings:view_count' => "Voir le compteur" , + 'tidypics:settings:grp_perm_override' => "Autoriser l'acés total aux membres du groupe" , + 'tidypics:settings:maxfilesize' => "Taille maximum des images en Mb:" , + 'tidypics:settings:quota' => "Quota Utilisateur/Groupe (Mb) - O égal pas de quota" , + 'tidypics:settings:watermark' => "Entrez le texte qui doit figure sur le WaterMark - fonction non vraiment sure." , + 'tidypics:settings:im_path' => "Chemin de l'exécutable ImageMagick, terminé par un slash" , + 'tidypics:settings:img_river_view' => "Combien d'entrées dans le river pour chaque lot de traitement des fichiers chargés" , + 'tidypics:settings:album_river_view' => "Montrer la couverture de l'album ou un ensemble de photos pour tout nouvel album" , + 'tidypics:settings:largesize' => "Taille initiale de l'image" , + 'tidypics:settings:smallsize' => "Taille de la vue de l'album" , + 'tidypics:settings:thumbsize' => "Taille des vignettes" , + 'tidypics:settings:im_id' => "Identifiant de l'image" , + 'album:create' => "Créer un nouvel album" , + 'album:add' => "Ajouter un Album photo" , + 'album:addpix' => "Ajouter des photos à l'album" , + 'album:edit' => "Modifier l'album" , + 'album:delete' => "Supprimer l'album" , + 'image:edit' => "Modifier l'image" , + 'image:delete' => "Supprimer l'image" , + 'image:download' => "Télécharger l'image" , + 'album:title' => "Titre" , + 'album:desc' => "Description" , + 'album:tags' => "Tags" , + 'album:cover' => "Faire de cette image la couverture de l'album" , + 'tidypics:quota' => "Quota utilisé:" , + 'image:total' => "Images dans l'album:" , + 'image:by' => "Image ajoutée par" , + 'album:by' => "Album créé par" , + 'album:created:on' => "Création" , + 'image:none' => "Aucune image n'a encore été ajoutée" , + 'image:back' => "Précédent" , + 'image:next' => "Suivant" , + 'tidypics:taginstruct' => "Sélectionnez la zone que vous souhaitez tagger" , + 'tidypics:deltag_title' => "Sélectionnez le tag à supprimer" , + 'tidypics:finish_tagging' => "Arrêter de tagger" , + 'tidypics:tagthisphoto' => "Tagger cette photo" , + 'tidypics:deletetag' => "Supprimer le tag d'une photo" , + 'tidypics:actiontag' => "Tag" , + 'tidypics:actiondelete' => "Supprimer" , + 'tidypics:actioncancel' => "Annuler" , + 'tidypics:inthisphoto' => "Dans cette photo" , + 'tidypics:usertag' => "Photo taggée par %s" , + 'tidypics:phototagging:success' => "La photo a été correctement taggée." , + 'tidypics:phototagging:error' => "Erreur innatendue durant le taggage" , + 'tidypics:deletetag:success' => "Les tags sélectionnés ont correctement été supprimés" , + 'tidypics:tag:subject' => "Vous avez été taggé dans une photo !!!" , + 'tidypics:tag:body' => "Vous avez été taggé dans la photo %s par %s !!! +La photo peut être consultée ici: %s" , + 'tidypics:posted' => "a posté une photo" , + 'tidypics:widget:albums' => "Albums photo" , + 'tidypics:widget:album_descr' => "Échantillon de vos albums photo" , + 'tidypics:widget:num_albums' => "Nombre de photos à montrer" , + 'tidypics:widget:latest' => "Dernières photos" , + 'tidypics:widget:latest_descr' => "Montrer les dernières photos" , + 'tidypics:widget:num_latest' => "Nombre d'images à montrer" , + 'album:more' => "Voir tout les albums" , + 'image:river:created' => "%s a ajouté la photo %s à l'album %s" , + 'image:river:item' => "une photo" , + 'image:river:annotate' => "commentaire sur la photo" , + 'image:river:tagged' => "a été taggé sur la photo" , + 'album:river:created' => "%s a créé un nouvel album photo" , + 'album:river:group' => "dans le groupe" , + 'album:river:item' => "un album" , + 'album:river:annotate' => "un commentaire sur l'album photo" , + 'tidypics:newalbum' => "Nouvel album photo" , + 'tidypics:upl_success' => "Vos images ont été correctement chargées." , + 'image:saved' => "Votre image a été correctement enregistrée" , + 'images:saved' => "Toutes les images ont été correctement enregistrées" , + 'image:deleted' => "Votre image a correctement été supprimée" , + 'image:delete:confirm' => "Confirmez-vous la suppression de cette image" , + 'images:edited' => "Vos images ont été correctement mises à jour" , + 'album:edited' => "Votre album a correctement été mis à jour" , + 'album:saved' => "Votre album a correctement été enregistré" , + 'album:deleted' => "Votre album a correctement été supprimé" , + 'album:delete:confirm' => "Confirmez-vous la suppression de cet album" , + 'album:created' => "Votre nouvel album a été créé" , + 'tidypics:settings:save:ok' => "Réglages du plugin Tydipics enregistrés" , + 'tidypics:upgrade:success' => "Mise à jour de Tydipics effectuée" , + 'tidypics:partialuploadfailure' => "Des erreurs sont survenues durant le chargement des images (%s sur %s images)" , + 'tidypics:completeuploadfailure' => "Echec du chargement des images " , + 'tidypics:exceedpostlimit' => "Trop d'images trop lourdes - essayez de charges des images plus petites" , + 'tidypics:noimages' => "Aucune image sélectionnée" , + 'tidypics:image_mem' => "Image trop large - taille trop grosse" , + 'tidypics:image_pixels' => "L'image a trop de pixels" , + 'tidypics:unk_error' => "Erreur inconnue de chargement" , + 'tidypics:save_error' => "Erreur inconnue lors de l'enregistrement de l'image sur le serveur" , + 'tidypics:not_image' => "Type d'image non reconnu" , + 'image:deletefailed' => "Votre image n'a pu être supprimée" , + 'image:downloadfailed' => "Désolé, image indisponible pour le moment" , + 'tidypics:nosettings' => "L'administrateur n'a pas effectué les reglages minimaux des albums" , + 'tidypics:exceed_quota' => "Quota fixé par l'administrateur dépassé" , + 'images:notedited' => "Toutes les images n'ont pas été correctement mises à jour" , + 'album:none' => "Aucun album encore créé" , + 'album:uploadfailed' => "Désolé, nous ne pouvons pas enregistrer l'album" , + 'album:deletefailed' => "Votre album ne peut pas être supprimé pour le moment" , + 'album:blank' => "Donnez un titre et une description à cet album" , + 'tidypics:upgrade:failed' => "Mise à jour de Tydipics infructueuse" +); + +add_translation('fr', $french); + +?> \ No newline at end of file diff --git a/plugins/tidypics/languages/he.php b/plugins/tidypics/languages/he.php new file mode 100644 index 00000000..8edee9c0 --- /dev/null +++ b/plugins/tidypics/languages/he.php @@ -0,0 +1,149 @@ +<?php + +// Generate By translationbrowser. + +$hebrew = array( + 'image' => "תמונה" , + 'images' => "תמונות" , + 'caption' => "כיתוב" , + 'photos' => "תמונות" , + 'images:upload' => "העלאת תמונות" , + 'images:multiupload' => "כלי פלאש להעלאת תמונות רבות" , + 'images:multiupload:todo' => "בחרו קובץ אחד או יותר" , + 'album' => "אלבום תמונות" , + 'albums' => "אלבומי תמונות" , + 'album:slideshow' => "צפיה כמצגת" , + 'album:yours' => "אלבומי התמונות שלך" , + 'album:yours:friends' => "אלבומי תמונות של חברים" , + 'album:user' => "אלבומי תמונות של %s" , + 'album:friends' => "אלבומי התמונות של החברים של %s " , + 'album:all' => "כל אלבומי התמונות באתר" , + 'album:group' => "אלבומים קבוצתיים" , + 'item:object:image' => "תמונות" , + 'item:object:album' => "אלבומים" , + 'tidypics:enablephotos' => "אפשר אלבומי תמונות קבוצתיים" , + 'tidypics:editprops' => "ערוך מאפייני תמונה" , + 'tidypics:mostcommented' => "תמונות עם הכי הרבה תגובות" , + 'tidypics:mostcommentedthismonth' => "הכי הרבה תגובות בחודש זה" , + 'tidypics:mostcommentedtoday' => "הכי הרבה תגובות היום" , + 'tidypics:mostviewed' => "תמונות אשר נצפו הכי הרבה" , + 'tidypics:mostvieweddashboard' => "הדף אשר נצפה הכי הרבה" , + 'tidypics:mostviewedthisyear' => "נצפה הכי הרבה השנה" , + 'tidypics:mostviewedthismonth' => "נצפה הכי הרבה החודש" , + 'tidypics:mostviewedlastmonth' => "נצפה הכי הרבה בחודש שעבר" , + 'tidypics:mostviewedtoday' => "נצפה הכי הרבה היום" , + 'tidypics:recentlyviewed' => "תמונות אשר נצפו לאחרונה" , + 'tidypics:mostrecent' => "תמונות חדשות" , + 'tidypics:yourmostviewed' => "תמונות שלך אשר נצפו הכי הרבה" , + 'tidypics:yourmostrecent' => "התמונות הכי חדשות שלך" , + 'tidypics:friendmostviewed' => "תמונות של %s אשר נצפו הכי הרבה" , + 'tidypics:friendmostrecent' => "תמונות החדשות ביותר של %s" , + 'tidypics:highestrated' => "תמונות בעלי הדירוג הגבוה ביותר" , + 'tidypics:viewsbyowner' => "צפיות: %s על ידי %s משתמשים (לא כולל אותך)" , + 'tidypics:viewsbyothers' => "צפיות: %s (%s על ידיך)" , + 'tidypics:administration' => "ניהול Tidypics" , + 'tidypics:stats' => "סטטיסטיקה" , + 'tidypics:settings' => "הגדרות" , + 'tidypics:admin:instructions' => "אלה הגדרות הליבה של Tidypics. שנה אותן לפי הצורך ולחץ על שמור" , + 'tidypics:settings:image_lib' => "ספריית תמונות:" , + 'tidypics:settings:download_link' => "הצג לינק להורדה" , + 'tidypics:settings:tagging' => "אפשר תיוג תמונות" , + 'tidypics:settings:photo_ratings' => "אפשר דירוג תמונות, דורש תוסף דירוג של Miguel Montes או דומה" , + 'tidypics:settings:exif' => "הצג נתוני EXIF" , + 'tidypics:settings:view_count' => "מונה צפיה" , + 'tidypics:settings:grp_perm_override' => "אפשר לחברי קבוצה גישה מלאה לאלבומים קבוצתיים" , + 'tidypics:settings:maxfilesize' => "גודל תמונה מירבי בMB" , + 'tidypics:settings:quota' => "מכסה בMB למשתמש/קבוצה - 0 שווה ללא מכסה" , + 'tidypics:settings:watermark' => "הזן טקסט אשר יופיע בסימן המים - יש לבחור ב ImageMagick Cmdline עבור ספריית התמונות" , + 'tidypics:settings:im_path' => "הזן את הנטיב לפקודות ImageMagick ללא לוכסן בסוף" , + 'tidypics:settings:img_river_view' => "כמה רשומות במה חדש עבור כל מקבץ תמונות אשר נוסף" , + 'tidypics:settings:album_river_view' => "הצג תמונה אחת או מקבץ תמונות עבור אלבום חדש" , + 'tidypics:settings:largesize' => "גודל תמונה בסיסי" , + 'tidypics:settings:smallsize' => "גודל תמונה בתצוגת אלבום" , + 'tidypics:settings:thumbsize' => "גודל תמונה ממוזערת" , + 'album:create' => "יצירת אלבום חדש" , + 'album:add' => "הוספת אלבום" , + 'album:addpix' => "הוספת תמונות לאלבום" , + 'album:edit' => "עריכת אלבום" , + 'album:delete' => "מחיקת אלבום" , + 'image:edit' => "עריכת תמונה" , + 'image:delete' => "מחיקת תמונה" , + 'image:download' => "הורדת תמונה" , + 'album:title' => "כותרת" , + 'album:desc' => "תאור" , + 'album:tags' => "תגים" , + 'album:cover' => "קבע תמונה זו כעטיפה " , + 'tidypics:quota' => "שימוש מכסה" , + 'image:total' => "תמונות באלבום:" , + 'image:by' => "תמונה נוספה על ידי" , + 'album:by' => "אלבום נוצר על ידי" , + 'album:created:on' => "יצר/ה" , + 'image:none' => "טרם נוספו תמונות" , + 'image:back' => "הקודם" , + 'image:next' => "הבא" , + 'tidypics:taginstruct' => "בחר אזור להוספת תג" , + 'tidypics:deltag_title' => "בחר תגים למחיקה" , + 'tidypics:finish_tagging' => "הפסק לתייג" , + 'tidypics:tagthisphoto' => "תייג תמונה זו" , + 'tidypics:deletetag' => "מחק תג תמונה" , + 'tidypics:actiontag' => "תג" , + 'tidypics:actiondelete' => "מחיקה" , + 'tidypics:actioncancel' => "ביטול" , + 'tidypics:inthisphoto' => "בתמונה זו" , + 'tidypics:usertag' => "תמונות המתוייגות במשתמש %s" , + 'tidypics:phototagging:success' => "התג נוסף בהצלחה" , + 'tidypics:phototagging:error' => "אירע שגיאה בתהליך התיוג" , + 'tidypics:deletetag:success' => "התגים נמחקו בהצלחה" , + 'tidypics:posted' => "הוסיף/ה תמונה" , + 'tidypics:widget:albums' => "אלבומי תמונות" , + 'tidypics:widget:album_descr' => "הצג את האלבומים החדשים שלך" , + 'tidypics:widget:num_albums' => "מספר האלבומים לתצוגה" , + 'tidypics:widget:latest' => "Latest Photos", + 'tidypics:widget:latest_descr' => "Display your latest photos", + 'tidypics:widget:num_latest' => "Number of images to display", + 'album:more' => "צפיה בכל האלבומים" , + 'image:river:created' => "%s הוסיף/ה את התמונה %s לאלבום %s" , + 'image:river:item' => "תמונה" , + 'image:river:annotate' => "תגובה לתמונה" , + 'album:river:created' => "%s יצר/ה אלבום תמונות חדש" , + 'album:river:group' => "בקבוצה" , + 'album:river:item' => "אלבום" , + 'album:river:annotate' => "תגובה באלבום התמונות" , + 'tidypics:newalbum' => "אלבום תמונות חדש" , + 'tidypics:upl_success' => "התמונות הועלו בהצלחה" , + 'image:saved' => "התמונה נשמרה בהצלחה" , + 'images:saved' => "כל התמונות נשמרו בהצלחה" , + 'image:deleted' => "התמונה נמחקה בהצלחה" , + 'image:delete:confirm' => "בטוח? למחוק תמונה זו?" , + 'images:edited' => "התמונות עודכנו בהצלחה" , + 'album:edited' => "האלבום עודכן בהצלחה" , + 'album:saved' => "האלבום נשמר בהצלחה" , + 'album:deleted' => "האלבום נמחק בהצלחה" , + 'album:delete:confirm' => "בטוח? למחוק אלבום זה?" , + 'album:created' => "האלבום החדש נוצר" , + 'tidypics:settings:save:ok' => "הגדרות התוסף Tidypics נשמרו בהצלחה" , + 'tidypics:upgrade:success' => "Tidypics שודרג בהצלחה" , + 'tidypics:partialuploadfailure' => "אירעו שגיאות בהעלאת חלק מהתמונות (%s מתוך %s תמונות)." , + 'tidypics:completeuploadfailure' => "העלאת התמונות נכשל" , + 'tidypics:exceedpostlimit' => "יותר מדי תמונות גדולות - נסה פחות תמונות או תמונות קטנות יותר" , + 'tidypics:noimages' => "לא נבחרו תמונות" , + 'tidypics:image_mem' => "התמונה גדולה מדי - יותר מדי ביטים" , + 'tidypics:image_pixels' => "לתמונה יותר מדי פיקסלים" , + 'tidypics:unk_error' => "שגיאה לא מוכרת בהעלאת תמונות" , + 'tidypics:save_error' => "שגיאה לא מוכרת בשמירת תמונות" , + 'tidypics:not_image' => "סוק הקובץ לא מזוהה" , + 'image:deletefailed' => "לא ניתן היה למחוק תמונה זו " , + 'image:downloadfailed' => "מצטערים התמונה אינה זמינה כרגע" , + 'tidypics:nosettings' => "מנהל הרשת טרם קבע הגדרות עבור אלבומי תמונות" , + 'tidypics:exceed_quota' => "עברת את מגבלת המכסה הנקבע על ידי מנהל הרשת" , + 'images:notedited' => "לא עודכנו כל התמונות בהצלחה" , + 'album:none' => "טרם נוצרו אלבומים" , + 'album:uploadfailed' => "מצטערים לא הצלחנו לשמור את האלבום שלך" , + 'album:deletefailed' => "לא ניתן היה למחוק את האלבום" , + 'album:blank' => "אנא קבע שם ותאור עבור אלבום זה" , + 'tidypics:upgrade:failed' => "שדרוג Tidypics נכשל" +); + +add_translation('he', $hebrew); + +?> \ No newline at end of file diff --git a/plugins/tidypics/languages/it.php b/plugins/tidypics/languages/it.php new file mode 100644 index 00000000..36863851 --- /dev/null +++ b/plugins/tidypics/languages/it.php @@ -0,0 +1,113 @@ +<?php + + $italian = array( + + // Menu items and titles + + 'image' => "Immagine", + 'images' => "Immagini", + 'caption' => "Caption", + 'photos' => "Foto", + 'images:upload' => "Carica Immagine", + 'album' => "Album fotografico", + 'albums' => "Album fotografici", + 'album:yours' => "Il tuo Album fotografico", + 'album:yours:friends' => "Album Foto degli amici", + 'album:user' => "Album foto di %s", + 'album:friends' => "Album foto degli amici di %s", + 'album:all' => "Tutti gli album di foto", + 'album:group' => "Gruppi di album", + 'item:object:image' => "Foto", + 'item:object:album' => "Album", + 'tidypics:settings:maxfilesize' => "Dimensione massima dei file in kilo bytes (KB):", + 'tidypics:enablephotos' => 'Attiva Group Photo Albums', + 'tidypics:editprops' => 'Modifica le propriet� della immagine', + + //actions + + 'album:create' => "Crea un nuovo album", + 'album:add' => "Aggiungi un foto Album", + 'album:addpix' => "Aggiungi foto all'album", + 'album:edit' => "Modifica album", + 'album:delete' => "Cancella album", + + 'image:edit' => "Modifica immagine", + 'image:delete' => "Cancella immagine", + 'image:download' => "Download immagine", + + //forms + + 'album:title' => "Titolo", + 'album:desc' => "Descrizione", + 'album:tags' => "Tags", + 'album:cover' => "Copertina dell'album?", + 'album:cover:yes' => "Si", + 'image:access:note' => "(view access is inherited from the album)", + + //views + + 'image:total' => "immagini nell'album:", + 'image:by' => "immagini aggiunte da", + 'album:by' => "Album creato da", + 'album:created:on' => "Creato", + 'image:none' => "Non sono ancora state aggiunte immagini.", + 'image:back' => "Indietro", + 'image:next' => "Avanti", + + //widgets + + 'album:widget' => "Album Fotografici", + 'album:more' => "Vedi tutti gli albums", + 'album:widget:description' => "Visualizza il tuo ultimo album fotografico", + 'album:display:number' => "Numero di album da mostrare", + 'album:num_albums' => "Numero di album da mostrare", + + // river + + //images + 'image:river:created' => "%s uploaded", + 'image:river:item' => "una immagine", + 'image:river:annotate' => "a comment on the image", + + //albums + 'album:river:created' => "%s created a new photo album: ", + 'album:river:item' => "an album", + 'album:river:annotate' => "un commento nel foto album", + + // notifications + 'tidypics:newalbum' => 'Nuovo album di foto', + + + // Status messages + + 'image:saved' => "Immagine salvata.", + 'images:saved' => "Tutte le immagini sono state salvate.", + 'image:deleted' => "Immagine cancellata.", + 'image:delete:confirm' => "Sei sicuro di volerla cancellare?", + + 'images:edited' => "Immagini modificate.", + 'album:edited' => "Album fotografico aggiornato.", + 'album:saved' => "Album fotografico salvato.", + 'album:deleted' => "L'album � stato cancellato.", + 'album:delete:confirm' => "Sei sicuro di voler cancellare questo album?", + 'album:created' => "Nuovo Album creato.", + 'tidypics:status:processing' => "Attendere ....", + + //Error messages + + 'image:none' => "Non ci sono immagini.", + 'image:uploadfailed' => "il file non � stato caricato:", + 'image:deletefailed' => "L'immagine non puo essere cancellata in questo momento.", + 'image:downloadfailed' => "Spiacente; questa immagine non � attualmente disponibile.", + + 'image:notimage' => "Sono accettate immagini jpg, gif o png delle dimensioni entro i limiti.", + 'images:notedited' => "Non tutte le immagini sono state caricate", + + 'album:none' => "Nessun album � stato ancora creato.", + 'album:uploadfailed' => "Spiacente; non � possibile salvare l'album.", + 'album:deletefailed' => "L'album non pu� essere cancellato.", + 'album:blank' => "Dai a quest'album un titolo e una descrizione." + ); + + add_translation("it",$italian); +?> \ No newline at end of file diff --git a/plugins/tidypics/languages/pl.php b/plugins/tidypics/languages/pl.php new file mode 100644 index 00000000..7f48b488 --- /dev/null +++ b/plugins/tidypics/languages/pl.php @@ -0,0 +1,113 @@ +<?php + /** + * Elgg tidypics plugin language pack + * + */ + + $polish = array( + + // Menu items and titles + + 'image' => "Obrazek", + 'images' => "Obrazki", + 'caption' => "Opis", + 'photos' => "Zdjęcia", + 'images:upload' => "Dodaj obrazki", + 'album' => "Album zdjęciowy", + 'albums' => "Albumy zdjęciowe", + 'album:yours' => "Twoje albumy", + 'album:yours:friends' => "Albumy twoich znajomych", + 'album:user' => "Albumy użytkownika %s", + 'album:friends' => "Albumy przyjaciół użytkownika %s", + 'album:all' => "Wszystkie publiczne albumy", + 'album:group' => "Albumy rejsu", + 'item:object:image' => "Zdjęcia", + 'item:object:album' => "Albumy", + 'tidypics:settings:maxfilesize' => "Maximum file size in kilo bytes (KB):", + + 'tidypics:editprops' => 'Edycja obrazu Właściwości', + + //actions + + 'album:create' => "Nowy album", + 'album:add' => "Dodaj album zdjęciowy", + 'album:addpix' => "Dodaj zdjęcia", + 'album:edit' => "Edytuj album", + 'album:delete' => "Skasuj album", + + 'image:edit' => "Edytuj obrazek", + 'image:delete' => "Skasuj obrazek", + 'image:download' => "Pobierz obrazek", + + //forms + + 'album:title' => "Tytuł albumu", + 'album:desc' => "Opis (widoczny tylko dla twórcy)", + 'album:tags' => "Tagi", + 'album:cover' => "Ustaw jako okładkę albumu?", + 'album:cover:yes' => "Tak", + 'image:access:note' => "(prawa dostępu pobierane są z ustawień albumu)", + + //views + + 'image:total' => "Obrazki w albumie:", + 'image:by' => "Obrazek dodany przez", + 'album:by' => "Album stworzony przez", + 'album:created:on' => "Stworzono", + 'image:none' => "Nie dodano jeszcze żadnych obrazków.", + 'image:back' => "Poprzednia", + 'image:next' => "Kolejna", + + //widgets + + 'album:widget' => "Albumy zdjęciowe", + 'album:more' => "Pokaż wszystkie albumy", + 'album:widget:description' => "Pokazuje twoje ostatnie albumy zdjęciowe", + 'album:display:number' => "Liczba wyświetlanych albumów", + 'album:num_albums' => "Liczba wyświetlanych albumów", + + // river + + //images + 'image:river:created' => "wgrano %s", + 'image:river:item' => "obrazek", + 'image:river:annotate' => "%s skomentował", + + //albums + 'album:river:created' => "Stworzono %s", + 'album:river:item' => "album", + 'album:river:annotate' => "%s skomentował", + + // Status messages + + 'image:saved' => "Twój obrazek został pomyślnie zapisany.", + 'images:saved' => "Wszystkie obrazki zostały pomyślnie zapisane.", + 'image:deleted' => "Twój obrazek został pomyślnie skasowany.", + 'image:delete:confirm' => "Czy jesteś pewien że chcesz skasować ten obrazek?", + + 'images:edited' => "Twoje obrazki zostały pomyślnie zapisane.", + 'album:edited' => "Twój album został pomyślnie zapisany.", + 'album:saved' => "Twój album został pomyślnie zapisany.", + 'album:deleted' => "Twój album został skasowany.", + 'album:delete:confirm' => "Na pewno chcesz skasować ten album?", + 'album:created' => "Stworzono nowy album.", + 'tidypics:status:processing' => "Please wait while we process your picture....", + + //Error messages + + 'image:none' => "Jeszcze nie dodano żadnych obrazków.", + 'image:uploadfailed' => "Pliki nie zapisane:", + 'image:deletefailed' => "Nie udało się skasować obrazka.", + 'image:downloadfailed' => "Nie udało się ściągnąć albumu.", + + 'image:notimage' => "Akceptowane formaty to tylko: jpeg, gif i png, and the allowed file size.", + 'images:notedited' => "Nie wszystkie obrazki zostały zapisane", + + 'album:none' => "Jeszcze nie dodano żadnych albumów.", + 'album:uploadfailed' => "Nie udało się zapisać twojego albumu.", + 'album:deletefailed' => "Nie udało się usunąć twojego albumu.", + 'album:blank' => "Please give this albumu a tytuł and opis." + ); + + add_translation("pl",$polish); +?> \ No newline at end of file diff --git a/plugins/tidypics/languages/ru.php b/plugins/tidypics/languages/ru.php new file mode 100644 index 00000000..2722450c --- /dev/null +++ b/plugins/tidypics/languages/ru.php @@ -0,0 +1,113 @@ +<?php + + $russian = array( + + // Menu items and titles + + 'image' => "Фотография", + 'images' => "Фотографии", + 'caption' => "Описание", + 'photos' => "Фотки", + 'images:upload' => "Загрузить Фотки", + 'album' => "Фотоальбом", + 'albums' => "Фотоальбомы", + 'album:yours' => "Ваш Альбом", + 'album:yours:friends' => "Альбомы Ваших Друзей", + 'album:user' => "%s - Фотоальбом", + 'album:friends' => "Альбомы друзей пользователя %s", + 'album:all' => "Все Альбомы Сайта", + 'album:group' => "Альбомы Группы", + 'item:object:image' => "Фотки", + 'item:object:album' => "Альбомы", + 'tidypics:settings:maxfilesize' => "Максимальный размер файла (KB):", + 'tidypics:enablephotos' => 'Включить Альбомы Группы', + 'tidypics:editprops' => 'Редактировать данные фотогографии', + + //actions + + 'album:create' => "Создать новый Альбом", + 'album:add' => "Добавить Альбом", + 'album:addpix' => "Добавить Фотки в Альбом", + 'album:edit' => "Редактировать Альбом", + 'album:delete' => "Стереть Альбом", + + 'image:edit' => "Редактировать Фотку", + 'image:delete' => "Стереть Фотку", + 'image:download' => "Скачать Фотку", + + //forms + + 'album:title' => "Заголовок", + 'album:desc' => "Описание", + 'album:tags' => "Тэги", + 'album:cover' => "Сдеалем Обложку Альбома?", + 'album:cover:yes' => "Да", + 'image:access:note' => "(ыровень доступа как и у основного Альбома)", + + //views + + 'image:total' => "Всего Фоток:", + 'image:by' => "Фотка добавлена:", + 'album:by' => "Альбом принадлежит:", + 'album:created:on' => "Создан:", + 'image:none' => "Пока Фоток не добавлено", + 'image:back' => "Назад", + 'image:next' => "Вперед", + + //widgets + + 'album:widget' => "Фотоальбомы", + 'album:more' => "Посмотреть все Альбомы", + 'album:widget:description' => "Продемонстрировать свой новый Альбом", + 'album:display:number' => "Число Альбомов для показа", + 'album:num_albums' => "Число Альбомов для показа", + + // river + + //images + 'image:river:created' => "%s загрузил", + 'image:river:item' => "фотку", + 'image:river:annotate' => "комментариы к Фотке", + + //albums + 'album:river:created' => "%s создал новый Альбом: ", + 'album:river:item' => "Альбом", + 'album:river:annotate' => "Комментарий к Альбому", + + // notifications + 'tidypics:newalbum' => 'Новый Фото Альбом', + + + // Status messages + + 'image:saved' => "Ваша фотография загружена успешно.", + 'images:saved' => "Все Фотки успешно сохранены.", + 'image:deleted' => "Ваша Фотография стерта.", + 'image:delete:confirm' => "Вы уверены, что хотите стереть эту Фотку?", + + 'images:edited' => "Ваши Фотки успешно обновленны.", + 'album:edited' => "Ваш Альбом обновлен.", + 'album:saved' => "Ваш Альбом сохранен.", + 'album:deleted' => "Ваш Альбом стерт.", + 'album:delete:confirm' => "Вы уверены, что хотите стереть этот Альбом?", + 'album:created' => "Ваш новый Альбом готов.", + 'tidypics:status:processing' => "Подозчдите пока мы загружаем фотку....", + + //Error messages + + 'image:none' => "На данный момент никаких фоток не обнаружено.", + 'image:uploadfailed' => "Файлы не загружены:", + 'image:deletefailed' => "В данный момент эту Фотку стереть невозможно.", + 'image:downloadfailed' => "На данный момент эту фотку просмотреть невозможно.", + + 'image:notimage' => "Допускаются только фотки формата jpeg, gif, или png разрешенного размера.", + 'images:notedited' => "Не все фотографии были обновленны", + + 'album:none' => "Пока никаких Альбомов не имеется.", + 'album:uploadfailed' => "Ваш Альбом сохранить не удалось.", + 'album:deletefailed' => "В данный момент ваш Альбом стереть невозможно.", + 'album:blank' => "Пожалуйста создайте заголовок и описание вашего Альбома.", + ); + + add_translation("ru",$russian); +?> \ No newline at end of file diff --git a/plugins/tidypics/languages/tr.php b/plugins/tidypics/languages/tr.php new file mode 100644 index 00000000..fff696c4 --- /dev/null +++ b/plugins/tidypics/languages/tr.php @@ -0,0 +1,88 @@ +<?php + + /** + * Elgg tidypics plugin language pack + * + * Türkçe Çeviri Orhan Can Ceylan | elggturkiye.com + */ + + +$turkish = array( + 'image' => "Resim" , + 'image:access:note' => "Görüntüleme izni albümden tevarüs edildi." , + 'images' => "Resimler" , + 'caption' => "Açıklama" , + 'photos' => "Resimler" , + 'images:upload' => "Resimleri Yükle" , + 'album' => "Fotoğraf Albümü" , + 'albums' => "Fotoğraf Albümleri" , + 'album:yours' => "Senin Fotoğraf Albümlerin" , + 'album:yours:friends' => "Arkadaşlarının Fotoğraf Albümleri" , + 'album:user' => "%s adlı üyenin fotoğraf albümleri" , + 'album:friends' => "%s adlı üyenin arkadaşlarının fotoğraf albümleri" , + 'album:all' => "Tüm sitenin fotoğraf albümleri" , + 'album:group' => "Grubun Albümleri" , + 'item:object:image' => "Fotoğraflar" , + 'item:object:album' => "Albümler" , + 'tidypics:settings:maxfilesize' => "Bir fotoğrafın maksimum büyüklüğü (kilobyte):" , + 'tidypics:enablephotos' => 'Grup Albümlerini Aktif Et', + 'tidypics:editprops' => 'Fotoğrafın özelliklerini Düzenle', + 'tidypics:newalbum' => 'Yeni Fotoğraf Albümü', + 'album:create' => "Yeni Albüm" , + 'album:add' => "Yeni Fotoğraf Albümü Ekle" , + 'album:addpix' => "Fotoğraf ekle" , + 'album:edit' => "Albümü Düzenle" , + 'album:delete' => "Albümü Sil" , + 'image:edit' => "Resmi Düzenle" , + 'image:delete' => "Resmi Sil" , + 'image:download' => "Resmi İndir" , + 'album:title' => "Başlık" , + 'album:desc' => "Tanım" , + 'album:tags' => "Tagler" , + 'album:cover' => "Bu resim albüm fotoğrafı olsun mu ?" , + 'album:cover:yes' => "Evet" , + 'image:total' => "Albümdeki fotoğraflar" , + 'image:by' => "Fotoğrafı ekleyen " , + 'album:by' => "Albümü oluşturan" , + 'album:created:on' => "Oluşturuldu" , + 'image:none' => "Şuan görünülenecek fotoğraf bulunamadı" , + 'image:back' => "Geri" , + 'image:next' => "İleri" , + 'album:widget' => "Fotoğraf Albümleri" , + 'album:more' => "Tüm albümleri gör" , + 'album:widget:description' => "Son albümleri göster" , + 'album:display:number' => "Gösterilecek albüm sayısı" , + 'album:num_albums' => "Gösterilecek albüm sayısı" , + 'image:river:created' => "%s upload edildi" , + 'image:river:item' => "resim" , + 'image:river:annotate' => "%s yorum yapıldı" , + 'album:river:created' => "%s oluşturuldu" , + 'album:river:item' => "albüm" , + 'album:river:annotate' => "%s yorum yapıldı" , + 'image:saved' => "Fotoğrafınız başarıyla kaydedildi." , + 'images:saved' => "Tüm fotoğraflarınız başarıyla kaydedildi." , + 'image:deleted' => "Fotoğrafınız başarıyla silindi." , + 'image:delete:confirm' => "Bu fotoğrafı silmek istediğinizden emin misiniz ?" , + 'images:edited' => "Fotoğraflarınız başarıyla yüklendi" , + 'album:edited' => "Albümünüz başarıyla güncellendi." , + 'album:saved' => "Albümünüz başarıyla kaydedildi." , + 'album:deleted' => "Albümünüz başarıyla silindi." , + 'album:delete:confirm' => "Albümü silmek istediğinizden emin misiniz ?" , + 'album:created' => "Yeni albümünüz oluşturuldu." , + 'image:uploadfailed' => "Fotoğraflar yüklenemedi :" , + 'image:deletefailed' => "Fotoğrafınız şuan silinemiyor." , + 'image:downloadfailed' => "Üzgünüz, bu fotoğraf şuan uygun değil." , + 'image:notimage' => "Sadece jpeg, gif veya png uzantılı fotoğraflar kabul edilir." , + 'images:notedited' => "Tüm fotoğraflar başarıyla güncellenemedi." , + 'album:none' => "Şuan herhangi bir albüm bulunamadı." , + 'album:uploadfailed' => "Üzgünüm, albümünüz kaydolmadı." , + 'album:deletefailed' => "Albümünüz silinemedi." , + 'tidypics:status:processing' => "Fotoğrafınız işlenirken lütfen bekleyiniz." , + 'album:blank' => "Lütfen albümünüze başlık ve tanım giriniz." + + +); + +add_translation('tr', $turkish); + +?> \ No newline at end of file diff --git a/plugins/tidypics/lib/album.php b/plugins/tidypics/lib/album.php new file mode 100644 index 00000000..7cd27dcd --- /dev/null +++ b/plugins/tidypics/lib/album.php @@ -0,0 +1,19 @@ +<?php +/** + * Tidypics Album class + * + * @package TidypicsAlbum + */ + + +class TidypicsAlbum extends ElggObject { + protected function initialise_attributes() { + parent::initialise_attributes(); + + $this->attributes['subtype'] = "album"; + } + + public function __construct($guid = null) { + parent::__construct($guid); + } +} diff --git a/plugins/tidypics/lib/exif.php b/plugins/tidypics/lib/exif.php new file mode 100644 index 00000000..55612a43 --- /dev/null +++ b/plugins/tidypics/lib/exif.php @@ -0,0 +1,109 @@ +<?php +/** + * Exif Processing Library + * + * @package TidypicsExif + */ + +/** + * Pull EXIF data from image file + * + * @param TidypicsImage $file + */ +function td_get_exif($file) { + + // catch for those who don't have exif module loaded + if (!is_callable('exif_read_data')) { + return; + } + + $mime = $file->mimetype; + if ($mime != 'image/jpeg' && $mime != 'image/pjpeg') { + return; + } + + $filename = $file->getFilenameOnFilestore(); + $exif = exif_read_data($filename); + create_metadata($file->getGUID(), "tp_exif", serialize($exif), "text", $file->getObjectOwnerGUID(), ACCESS_PUBLIC); +} + +/** + * Grab array of EXIF data for display + * + * @param int $file_guid GUID of TidypicsImage + * @return array|false + */ +function tp_exif_formatted($file_guid) { + + $metadata_exif = get_metadata_byname($file_guid, "tp_exif"); + if (!$metadata_exif) { + // //try to load it from the file if its not in the database + $file = new ElggFile($file_guid); + td_get_exif($file); + unset($file); + $metadata_exif = get_metadata_byname($file_guid, "tp_exif"); + } + + if (!$metadata_exif) { + return false; + } + + $exif = unserialize($metadata_exif["value"]); + + $model = $exif['Model']; + if (!$model) { + $model = "N/A"; + } + $exif_data['Model'] = $model; + + $exposure = $exif['ExposureTime']; + if (!$exposure) { + $exposure = "N/A"; + } + $exif_data['Shutter'] = $exposure; + + //got the code snippet below from http://www.zenphoto.org/support/topic.php?id=17 + //convert the raw values to understandible values + $Fnumber = explode("/", $exif['FNumber']); + if ($Fnumber[1] != 0) { + $Fnumber = $Fnumber[0] / $Fnumber[1]; + } else { + $Fnumber = 0; + } + if (!$Fnumber) { + $Fnumber = "N/A"; + } else { + $Fnumber = "f/$Fnumber"; + } + $exif_data['Aperture'] = $Fnumber; + + $iso = $exif['ISOSpeedRatings']; + if (!$iso) { + $iso = "N/A"; + } + $exif_data['ISO Speed'] = $iso; + + $Focal = explode("/", $exif['FocalLength']); + if ($Focal[1] != 0) { + $Focal = $Focal[0] / $Focal[1]; + } else { + $Focal = 0; + } + if (!$Focal || round($Focal) == "0") { + $Focal = 0; + } + if (round($Focal) == 0) { + $Focal = "N/A"; + } else { + $Focal = round($Focal) . "mm"; + } + $exif_data['Focal Length'] = $Focal; + + $captured = $exif['DateTime']; + if (!$captured) { + $captured = "N/A"; + } + $exif_data['Captured'] = $captured; + + return $exif_data; +} diff --git a/plugins/tidypics/lib/flickr.php b/plugins/tidypics/lib/flickr.php new file mode 100644 index 00000000..effd186c --- /dev/null +++ b/plugins/tidypics/lib/flickr.php @@ -0,0 +1,8 @@ +<?php + +function flickr_menu() { + add_submenu_item( elgg_echo( 'flickr:menusetup' ), "/mod/tidypics/pages/flickr/setup.php"); + add_submenu_item( elgg_echo( 'flickr:menuimport' ), "/mod/tidypics/pages/flickr/importPhotosets.php" ); +} + +?> \ No newline at end of file diff --git a/plugins/tidypics/lib/image.php b/plugins/tidypics/lib/image.php new file mode 100644 index 00000000..4100f3f7 --- /dev/null +++ b/plugins/tidypics/lib/image.php @@ -0,0 +1,179 @@ +<?php +/** + * Tidypics Image class + * + * @package TidypicsImage + */ + + +class TidypicsImage extends ElggFile { + protected function initialise_attributes() { + parent::initialise_attributes(); + + $this->attributes['subtype'] = "image"; + } + + public function __construct($guid = null) { + parent::__construct($guid); + } + + /** + * Has the photo been tagged with "in this photo" tags + * + * @return true/false + */ + public function isPhotoTagged() { + $num_tags = count_annotations($this->getGUID(), 'object', 'image', 'phototag'); + if ($num_tags > 0) { + return true; + } else { + return false; + } + } + + /** + * Get an array of photo tag information + * + * @return array of json representations of the tags and the tag link text + */ + public function getPhotoTags() { + global $CONFIG; + + // get tags as annotations + $photo_tags = get_annotations($this->getGUID(), 'object', 'image', 'phototag'); + if (!$photo_tags) { + // no tags or user doesn't have permission to tags, so return + return false; + } + + $photo_tags_json = "["; + foreach ($photo_tags as $p) { + $photo_tag = unserialize($p->value); + + // create link to page with other photos tagged with same tag + $phototag_text = $photo_tag->value; + $phototag_link = $CONFIG->wwwroot . 'search/?tag=' . $phototag_text . '&subtype=image&object=object'; + if ($photo_tag->type === 'user') { + $user = get_entity($photo_tag->value); + if ($user) { + $phototag_text = $user->name; + } else { + $phototag_text = "unknown user"; + } + + $phototag_link = $CONFIG->wwwroot . "pg/photos/tagged/" . $photo_tag->value; + } + + if (isset($photo_tag->x1)) { + // hack to handle format of Pedro Prez's tags - ugh + $photo_tag->coords = "\"x1\":\"{$photo_tag->x1}\",\"y1\":\"{$photo_tag->y1}\",\"width\":\"{$photo_tag->width}\",\"height\":\"{$photo_tag->height}\""; + $photo_tags_json .= '{' . $photo_tag->coords . ',"text":"' . $phototag_text . '","id":"' . $p->id . '"},'; + } else { + $photo_tags_json .= '{' . $photo_tag->coords . ',"text":"' . $phototag_text . '","id":"' . $p->id . '"},'; + } + + // prepare variable arrays for tagging view + $photo_tag_links[$p->id] = array('text' => $phototag_text, 'url' => $phototag_link); + } + + $photo_tags_json = rtrim($photo_tags_json,','); + $photo_tags_json .= ']'; + + $ret_data = array('json' => $photo_tags_json, 'links' => $photo_tag_links); + return $ret_data; + } + + /** + * Get the view information for this image + * + * @param $viewer_guid the guid of the viewer (0 if not logged in) + * @return array with number of views, number of unique viewers, and number of views for this viewer + */ + public function getViews($viewer_guid) { + $views = get_annotations($this->getGUID(), "object", "image", "tp_view", "", 0, 99999); + if ($views) { + $total_views = count($views); + + if ($this->owner_guid == $viewer_guid) { + // get unique number of viewers + foreach ($views as $view) { + $diff_viewers[$view->owner_guid] = 1; + } + $unique_viewers = count($diff_viewers); + } + else if ($viewer_guid) { + // get the number of times this user has viewed the photo + $my_views = 0; + foreach ($views as $view) { + if ($view->owner_guid == $viewer_guid) { + $my_views++; + } + } + } + + $view_info = array("total" => $total_views, "unique" => $unique_viewers, "mine" => $my_views); + } + else { + $view_info = array("total" => 0, "unique" => 0, "mine" => 0); + } + + return $view_info; + } + + /** + * Add a tidypics view annotation to this image + * + * @param $viewer_guid + * @return none + */ + public function addView($viewer_guid) { + if ($viewer_guid != $this->owner_guid && tp_is_person()) { + create_annotation($this->getGUID(), "tp_view", "1", "integer", $viewer_guid, ACCESS_PUBLIC); + } + } +} + +/** + * get a list of people that can be tagged in an image + * + * @param $viewer entity + * @return array of guid->name for tagging + */ +function tp_get_tag_list($viewer) { + $friends = get_user_friends($viewer->getGUID(), '', 999, 0); + $friend_list = array(); + if ($friends) { + foreach($friends as $friend) { + //error_log("friend $friend->name"); + $friend_list[$friend->guid] = $friend->name; + } + } + + // is this a group + $is_group = tp_is_group_page(); + if ($is_group) { + $group_guid = page_owner(); + $viewer_guid = $viewer->guid; + $members = get_group_members($group_guid, 999); + if (is_array($members)) { + foreach ($members as $member) { + if ($viewer_guid != $member->guid) { + $group_list[$member->guid] = $member->name; + //error_log("group $member->name"); + } + } + + // combine group and friends list + $intersect = array_intersect_key($friend_list, $group_list); + $unique_friends = array_diff_key($friend_list, $group_list); + $unique_members = array_diff_key($group_list, $friend_list); + //$friend_list = array_merge($friend_list, $group_list); + //$friend_list = array_unique($friend_list); + $friend_list = $intersect + $unique_friends + $unique_members; + } + } + + asort($friend_list); + + return $friend_list; +} diff --git a/plugins/tidypics/lib/migrate.php b/plugins/tidypics/lib/migrate.php new file mode 100644 index 00000000..f8e68a1b --- /dev/null +++ b/plugins/tidypics/lib/migrate.php @@ -0,0 +1,299 @@ +<?php +/** + * Tidypics file plugin migration + * + * Supports moving photos from the files plugin to Tidypics. All of a users + * photos end up in a single album. + */ + +// need access to ElggDiskFilestore::make_file_matrix(), which is protected. +// this is a PITA. +class tempFilestore extends ElggDiskFilestore { + public function make_file_matrix($filename) { + return parent::make_file_matrix($filename); + } + +} +$filestore = new tempFilestore(); + + + +/** + * Migrates all pics from files to tidypics. + * + */ +function tidypics_migrate_pics() { + $limit = 100; + $r = true; + + // migrate + // @todo: should this return false since there was no error? + if (!$users = tidypics_get_user_guids_with_pics_in_files(0, $limit)) { + return $r; + } + + //echo "Grabbed " . count($users) . " users\n"; + while (is_array($users) AND count($users) > 0) { + foreach ($users as $user_guid) { + // reset the query cache. + $DB_QUERY_CACHE = array(); + if (!$user = get_entity($user_guid)) { + continue; + } + + $r = tidypics_migrate_user_pics($user); + } + + //echo "Trying to grab $limit more users...\n"; + $offset = $offset + $limit; + $users = tidypics_get_user_guids_with_pics_in_files($offset, $limit); + } + + return $r; +} + + +/** + * Migrates all pictures owned by a user regardless of + * if they're group or user files. + * + * @param ElggUser $user User to migrate. + * @return bool on success + */ +function tidypics_migrate_user_pics(ElggUser $user) { + global $CONFIG, $filestore; + + $user_guid = $user->getGUID(); + + // update all entity subtypes in a single go at the end. + $updated_guids = array(); + + if (!$pics = tidypics_get_user_pics_from_files($user_guid) OR count($pics) < 1) { + return false; + } + + //echo "{$user->name} ({$user->getGUID()}) has " . count($pics) . " pics.\n"; + + // get an album to migrate into if it already exists. + // will create later on if it doesn't. + $user_album_entities = get_entities_from_metadata('migrated_from_files', true, 'object', 'album', $user->getGUID(), 1); + $user_album_guid = isset($album_entities[0]) ? $album_entities[0]->getGUID() : false; + + // a list of albums to randomly select a cover for on newly created albums. + $new_album_guids = array(); + + foreach ($pics as $pic) { + // check that it's not already in tidy pics + if (false !== strpos($pic->filename, 'image/')) { + //echo "{$pic->filename} ({$pic->getGUID()}) looks like it's already in tidy pics. Ignoring.\n"; + continue; + } + + // blank some vars + $group_pic = $group_album_guid = $group_guid = false; + + // see if we're doing a group file migration. + if ($pic->container_guid != $user->getGUID() + AND $group = get_entity($pic->container_guid) + AND $group instanceof ElggGroup + ) { + //echo "{$pic->getGUID()} is in a group!\n"; + $group_pic = true; + $group_guid = $group->getGUID(); + + // yes, this is how you get entities by container_guid. + // yes, it's wrong, wrong, wrong for this function to work this way. + $group_album_entities = get_entities('object', 'album', $group_guid); + + // get_entities_from_metadata doesn't support container_guid (or owner_guid meaning container_guid) + // do it the hard way. + if (is_array($group_album_entities)) { + foreach ($group_album_entities as $group_album) { + if ($group_album->migrated_from_files == true) { + $group_album_guid = $group_album->getGUID(); + break; + } + } + } + $album_guid = $group_album_guid; + $group_album_guids[] = $group_album_guid; + } else { + $album_guid = $user_album_guid; + } + + //echo "album_guid is $album_guid and group_pic is: $group_pic\n"; + + // create an album if we need to. + if (!$album_guid) { + //echo "Creating new album...\n"; + $album = new ElggObject(); + $album->subtype = 'album'; + $album->new_album = TP_NEW_ALBUM; + + if ($group_pic) { + $album->container_guid = $group_guid; + $album->owner_guid = $group->owner_guid; + $album->access_id = $group->group_acl; + $album->title = $group->name; + } else { + $album->container_guid = $user_guid; + $album->owner_guid = $user->getGUID(); + $album->access_id = ACCESS_DEFAULT; + $album->title = $user->name; + } + + if (!$album->save()) { + //echo "Couldn't migrate pics for {$user->name} ($user_guid)!\n"; + return false; + } + $album->migrated_from_files = true; + $album_guid = $album->getGUID(); + $new_album_guids[] = $album_guid; + + // save the album guid as the users + if (!$group_pic) { + $user_album_guid = $album_guid; + } + } + + if (!tidypics_migrate_pic_from_files($pic, $album_guid)) { + //echo "{$pic->filename} ({$pic->getGUID()}) Couldn't be migrated. Ignoring.\n"; + continue; + } + } + + // randomly pic an image to be the cover for the user gallery + //$album->cover = $pic_guids[array_rand($pic_guids)]; + foreach ($new_album_guids as $guid) { + tidypics_set_random_cover_pic($guid); + } + + return true; +} + + +/** + * Randomly pics an image from an album to be the cover. + * @return bool on success + */ +function tidypics_set_random_cover_pic($album_guid) { + global $CONFIG; + + if ($album = get_entity($album_guid) AND $album instanceof TidypicsAlbum) { + $q = "SELECT guid FROM {$CONFIG->dbprefix}entities WHERE container_guid = $album_guid ORDER BY RAND() limit 1"; + $pic = get_data($q); + + return $album->cover = $pic[0]->guid; + } + + return false; +} + +/** + * Migrates a single pic from the file repo. + * @return bool on succes. + */ +function tidypics_migrate_pic_from_files($pic, $album_guid) { + global $CONFIG, $filestore; + + // get the subtype id. + $image_subtype_id = get_subtype_id('object', 'image'); + + // hold which metadata on the files need to be changes + // also holds the images we need to move + $file_md_fields = array('filename', 'thumbnail', 'smallthumb', 'largethumb'); + + if (!$user = get_entity($pic->owner_guid)) { + return false; + } + + // figure out where to move the files. + $matrix = $filestore->make_file_matrix($user->username); + $user_fs_path = $CONFIG->dataroot . $matrix; + $album_fs_path = $CONFIG->dataroot . $matrix . "image/$album_guid/"; + if (!is_dir($album_fs_path)) { + if (!mkdir($album_fs_path, 0700, true)) { + return false; + } + } + + // change all the 'file/'s to 'image/'s in certain metadata + // these are also the files we need to move. + foreach ($file_md_fields as $md_name) { + // $pic->$md_name = str_replace('file/', 'image/', $pic->$md_name); + $old_file = $pic->$md_name; + $new_file = str_replace('file/', "image/$album_guid", $old_file); + + if (!($old_fp = fopen($user_fs_path . $old_file, 'r') + AND $new_fp = fopen($user_fs_path . $new_file, 'w'))) { + //echo "Could not move {$user_fs_path}{$old_file} to {$user_fs_path}{$new_file}\n"; + continue; + } + + while (!feof($old_fp)) { + if (!fputs($new_fp, fread($old_fp, 8192))) { + //echo "Could not move {$user_fs_path}{$old_file} to {$user_fs_path}{$new_file} (Error writing.)\n"; + break; + } + } + + $pic->$md_name = $new_file; + } + // update container. + // this doesn't work...? + //$pic->container_guid = $album_guid; + + // delete old one. + unlink($user_fs_path . $old_file); + + $q = "UPDATE {$CONFIG->dbprefix}entities SET subtype = $image_subtype_id, container_guid = $album_guid WHERE guid = {$pic->getGUID()}"; + //echo "Finished moving {$user_fs_path}{$old_file} to {$user_fs_path}{$new_file}\n"; + + return update_data($q); +} + + +/** + * Grabs all user IDs with images in the files repo. + * return mixed. False on fail, array of GUIDs on success. + */ +function tidypics_get_user_guids_with_pics_in_files($offset, $limit) { + global $CONFIG; + + //$simpletype_ms_id = add_metastring('simple_type'); + //$image_ms_id = add_metastring('image'); + + $q = "SELECT DISTINCT e.owner_guid + FROM + {$CONFIG->dbprefix}entities as e, + {$CONFIG->dbprefix}entity_subtypes as st + + WHERE st.subtype = 'file' + AND e.subtype = st.id + LIMIT $offset, $limit"; + + if (!$data = get_data($q)) { + return false; + } + + // return an array of IDs + $r = array(); + foreach ($data as $row) { + $r[] = $row->owner_guid; + } + + return $r; +} + +/** + * Gets a list of images for a single user. + * @return array of GUIDs, false on fail. + */ +function tidypics_get_user_pics_from_files($user_guid) { + if (!$user = get_entity($user_guid) AND $user instanceof ElggUser) { + return false; + } + + // @todo Might have to cycle this through with standard while + foreach. + return get_entities_from_metadata('simpletype', 'image', 'object', 'file', $user_guid, 5000); +} diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/DB.php b/plugins/tidypics/lib/phpFlickr/PEAR/DB.php new file mode 100644 index 00000000..a3eede07 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/DB.php @@ -0,0 +1,1388 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * Database independent query interface + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.0 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_0.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @author Tomas V.V.Cox <cox@idecnet.com> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: DB.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the PEAR class so it can be extended from + */ +require_once 'PEAR.php'; + + +// {{{ constants +// {{{ error codes + +/**#@+ + * One of PEAR DB's portable error codes. + * @see DB_common::errorCode(), DB::errorMessage() + * + * {@internal If you add an error code here, make sure you also add a textual + * version of it in DB::errorMessage().}} + */ + +/** + * The code returned by many methods upon success + */ +define('DB_OK', 1); + +/** + * Unkown error + */ +define('DB_ERROR', -1); + +/** + * Syntax error + */ +define('DB_ERROR_SYNTAX', -2); + +/** + * Tried to insert a duplicate value into a primary or unique index + */ +define('DB_ERROR_CONSTRAINT', -3); + +/** + * An identifier in the query refers to a non-existant object + */ +define('DB_ERROR_NOT_FOUND', -4); + +/** + * Tried to create a duplicate object + */ +define('DB_ERROR_ALREADY_EXISTS', -5); + +/** + * The current driver does not support the action you attempted + */ +define('DB_ERROR_UNSUPPORTED', -6); + +/** + * The number of parameters does not match the number of placeholders + */ +define('DB_ERROR_MISMATCH', -7); + +/** + * A literal submitted did not match the data type expected + */ +define('DB_ERROR_INVALID', -8); + +/** + * The current DBMS does not support the action you attempted + */ +define('DB_ERROR_NOT_CAPABLE', -9); + +/** + * A literal submitted was too long so the end of it was removed + */ +define('DB_ERROR_TRUNCATED', -10); + +/** + * A literal number submitted did not match the data type expected + */ +define('DB_ERROR_INVALID_NUMBER', -11); + +/** + * A literal date submitted did not match the data type expected + */ +define('DB_ERROR_INVALID_DATE', -12); + +/** + * Attempt to divide something by zero + */ +define('DB_ERROR_DIVZERO', -13); + +/** + * A database needs to be selected + */ +define('DB_ERROR_NODBSELECTED', -14); + +/** + * Could not create the object requested + */ +define('DB_ERROR_CANNOT_CREATE', -15); + +/** + * Could not drop the database requested because it does not exist + */ +define('DB_ERROR_CANNOT_DROP', -17); + +/** + * An identifier in the query refers to a non-existant table + */ +define('DB_ERROR_NOSUCHTABLE', -18); + +/** + * An identifier in the query refers to a non-existant column + */ +define('DB_ERROR_NOSUCHFIELD', -19); + +/** + * The data submitted to the method was inappropriate + */ +define('DB_ERROR_NEED_MORE_DATA', -20); + +/** + * The attempt to lock the table failed + */ +define('DB_ERROR_NOT_LOCKED', -21); + +/** + * The number of columns doesn't match the number of values + */ +define('DB_ERROR_VALUE_COUNT_ON_ROW', -22); + +/** + * The DSN submitted has problems + */ +define('DB_ERROR_INVALID_DSN', -23); + +/** + * Could not connect to the database + */ +define('DB_ERROR_CONNECT_FAILED', -24); + +/** + * The PHP extension needed for this DBMS could not be found + */ +define('DB_ERROR_EXTENSION_NOT_FOUND',-25); + +/** + * The present user has inadequate permissions to perform the task requestd + */ +define('DB_ERROR_ACCESS_VIOLATION', -26); + +/** + * The database requested does not exist + */ +define('DB_ERROR_NOSUCHDB', -27); + +/** + * Tried to insert a null value into a column that doesn't allow nulls + */ +define('DB_ERROR_CONSTRAINT_NOT_NULL',-29); +/**#@-*/ + + +// }}} +// {{{ prepared statement-related + + +/**#@+ + * Identifiers for the placeholders used in prepared statements. + * @see DB_common::prepare() + */ + +/** + * Indicates a scalar (<kbd>?</kbd>) placeholder was used + * + * Quote and escape the value as necessary. + */ +define('DB_PARAM_SCALAR', 1); + +/** + * Indicates an opaque (<kbd>&</kbd>) placeholder was used + * + * The value presented is a file name. Extract the contents of that file + * and place them in this column. + */ +define('DB_PARAM_OPAQUE', 2); + +/** + * Indicates a misc (<kbd>!</kbd>) placeholder was used + * + * The value should not be quoted or escaped. + */ +define('DB_PARAM_MISC', 3); +/**#@-*/ + + +// }}} +// {{{ binary data-related + + +/**#@+ + * The different ways of returning binary data from queries. + */ + +/** + * Sends the fetched data straight through to output + */ +define('DB_BINMODE_PASSTHRU', 1); + +/** + * Lets you return data as usual + */ +define('DB_BINMODE_RETURN', 2); + +/** + * Converts the data to hex format before returning it + * + * For example the string "123" would become "313233". + */ +define('DB_BINMODE_CONVERT', 3); +/**#@-*/ + + +// }}} +// {{{ fetch modes + + +/**#@+ + * Fetch Modes. + * @see DB_common::setFetchMode() + */ + +/** + * Indicates the current default fetch mode should be used + * @see DB_common::$fetchmode + */ +define('DB_FETCHMODE_DEFAULT', 0); + +/** + * Column data indexed by numbers, ordered from 0 and up + */ +define('DB_FETCHMODE_ORDERED', 1); + +/** + * Column data indexed by column names + */ +define('DB_FETCHMODE_ASSOC', 2); + +/** + * Column data as object properties + */ +define('DB_FETCHMODE_OBJECT', 3); + +/** + * For multi-dimensional results, make the column name the first level + * of the array and put the row number in the second level of the array + * + * This is flipped from the normal behavior, which puts the row numbers + * in the first level of the array and the column names in the second level. + */ +define('DB_FETCHMODE_FLIPPED', 4); +/**#@-*/ + +/**#@+ + * Old fetch modes. Left here for compatibility. + */ +define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); +define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); +define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED); +/**#@-*/ + + +// }}} +// {{{ tableInfo() && autoPrepare()-related + + +/**#@+ + * The type of information to return from the tableInfo() method. + * + * Bitwised constants, so they can be combined using <kbd>|</kbd> + * and removed using <kbd>^</kbd>. + * + * @see DB_common::tableInfo() + * + * {@internal Since the TABLEINFO constants are bitwised, if more of them are + * added in the future, make sure to adjust DB_TABLEINFO_FULL accordingly.}} + */ +define('DB_TABLEINFO_ORDER', 1); +define('DB_TABLEINFO_ORDERTABLE', 2); +define('DB_TABLEINFO_FULL', 3); +/**#@-*/ + + +/**#@+ + * The type of query to create with the automatic query building methods. + * @see DB_common::autoPrepare(), DB_common::autoExecute() + */ +define('DB_AUTOQUERY_INSERT', 1); +define('DB_AUTOQUERY_UPDATE', 2); +/**#@-*/ + + +// }}} +// {{{ portability modes + + +/**#@+ + * Portability Modes. + * + * Bitwised constants, so they can be combined using <kbd>|</kbd> + * and removed using <kbd>^</kbd>. + * + * @see DB_common::setOption() + * + * {@internal Since the PORTABILITY constants are bitwised, if more of them are + * added in the future, make sure to adjust DB_PORTABILITY_ALL accordingly.}} + */ + +/** + * Turn off all portability features + */ +define('DB_PORTABILITY_NONE', 0); + +/** + * Convert names of tables and fields to lower case + * when using the get*(), fetch*() and tableInfo() methods + */ +define('DB_PORTABILITY_LOWERCASE', 1); + +/** + * Right trim the data output by get*() and fetch*() + */ +define('DB_PORTABILITY_RTRIM', 2); + +/** + * Force reporting the number of rows deleted + */ +define('DB_PORTABILITY_DELETE_COUNT', 4); + +/** + * Enable hack that makes numRows() work in Oracle + */ +define('DB_PORTABILITY_NUMROWS', 8); + +/** + * Makes certain error messages in certain drivers compatible + * with those from other DBMS's + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + */ +define('DB_PORTABILITY_ERRORS', 16); + +/** + * Convert null values to empty strings in data output by + * get*() and fetch*() + */ +define('DB_PORTABILITY_NULL_TO_EMPTY', 32); + +/** + * Turn on all portability features + */ +define('DB_PORTABILITY_ALL', 63); +/**#@-*/ + +// }}} + + +// }}} +// {{{ class DB + +/** + * Database independent query interface + * + * The main "DB" class is simply a container class with some static + * methods for creating DB objects as well as some utility functions + * common to all parts of DB. + * + * The object model of DB is as follows (indentation means inheritance): + * <pre> + * DB The main DB class. This is simply a utility class + * with some "static" methods for creating DB objects as + * well as common utility functions for other DB classes. + * + * DB_common The base for each DB implementation. Provides default + * | implementations (in OO lingo virtual methods) for + * | the actual DB implementations as well as a bunch of + * | query utility functions. + * | + * +-DB_mysql The DB implementation for MySQL. Inherits DB_common. + * When calling DB::factory or DB::connect for MySQL + * connections, the object returned is an instance of this + * class. + * </pre> + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @author Tomas V.V.Cox <cox@idecnet.com> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB +{ + // {{{ &factory() + + /** + * Create a new DB object for the specified database type but don't + * connect to the database + * + * @param string $type the database type (eg "mysql") + * @param array $options an associative array of option names and values + * + * @return object a new DB object. A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function &factory($type, $options = false) + { + if (!is_array($options)) { + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/{$type}.php"; + } else { + @include_once "DB/{$type}.php"; + } + + $classname = "DB_${type}"; + + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php" + . " file for '$dsn'", + 'DB_Error', true); + return $tmp; + } + + @$obj =& new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + return $obj; + } + + // }}} + // {{{ &connect() + + /** + * Create a new DB object including a connection to the specified database + * + * Example 1. + * <code> + * require_once 'DB.php'; + * + * $dsn = 'pgsql://user:password@host/database'; + * $options = array( + * 'debug' => 2, + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * </code> + * + * @param mixed $dsn the string "data source name" or array in the + * format returned by DB::parseDSN() + * @param array $options an associative array of option names and values + * + * @return object a new DB object. A DB_Error object on failure. + * + * @uses DB_dbase::connect(), DB_fbsql::connect(), DB_ibase::connect(), + * DB_ifx::connect(), DB_msql::connect(), DB_mssql::connect(), + * DB_mysql::connect(), DB_mysqli::connect(), DB_oci8::connect(), + * DB_odbc::connect(), DB_pgsql::connect(), DB_sqlite::connect(), + * DB_sybase::connect() + * + * @uses DB::parseDSN(), DB_common::setOption(), PEAR::isError() + */ + function &connect($dsn, $options = array()) + { + $dsninfo = DB::parseDSN($dsn); + $type = $dsninfo['phptype']; + + if (!is_array($options)) { + /* + * For backwards compatibility. $options used to be boolean, + * indicating whether the connection should be persistent. + */ + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/${type}.php"; + } else { + @include_once "DB/${type}.php"; + } + + $classname = "DB_${type}"; + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php" + . " file for '$dsn'", + 'DB_Error', true); + return $tmp; + } + + @$obj =& new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + $err = $obj->connect($dsninfo, $obj->getOption('persistent')); + if (DB::isError($err)) { + $err->addUserInfo($dsn); + return $err; + } + + return $obj; + } + + // }}} + // {{{ apiVersion() + + /** + * Return the DB API version + * + * @return string the DB API version number + */ + function apiVersion() + { + return '@package_version@'; + } + + // }}} + // {{{ isError() + + /** + * Determines if a variable is a DB_Error object + * + * @param mixed $value the variable to check + * + * @return bool whether $value is DB_Error object + */ + function isError($value) + { + return is_a($value, 'DB_Error'); + } + + // }}} + // {{{ isConnection() + + /** + * Determines if a value is a DB_<driver> object + * + * @param mixed $value the value to test + * + * @return bool whether $value is a DB_<driver> object + */ + function isConnection($value) + { + return (is_object($value) && + is_subclass_of($value, 'db_common') && + method_exists($value, 'simpleQuery')); + } + + // }}} + // {{{ isManip() + + /** + * Tell whether a query is a data manipulation or data definition query + * + * Examples of data manipulation queries are INSERT, UPDATE and DELETE. + * Examples of data definition queries are CREATE, DROP, ALTER, GRANT, + * REVOKE. + * + * @param string $query the query + * + * @return boolean whether $query is a data manipulation query + */ + function isManip($query) + { + $manips = 'INSERT|UPDATE|DELETE|REPLACE|' + . 'CREATE|DROP|' + . 'LOAD DATA|SELECT .* INTO|COPY|' + . 'ALTER|GRANT|REVOKE|' + . 'LOCK|UNLOCK'; + if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) { + return true; + } + return false; + } + + // }}} + // {{{ errorMessage() + + /** + * Return a textual error message for a DB error code + * + * @param integer $value the DB error code + * + * @return string the error message or false if the error code was + * not recognized + */ + function errorMessage($value) + { + static $errorMessages; + if (!isset($errorMessages)) { + $errorMessages = array( + DB_ERROR => 'unknown error', + DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions', + DB_ERROR_ALREADY_EXISTS => 'already exists', + DB_ERROR_CANNOT_CREATE => 'can not create', + DB_ERROR_CANNOT_DROP => 'can not drop', + DB_ERROR_CONNECT_FAILED => 'connect failed', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint', + DB_ERROR_DIVZERO => 'division by zero', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'invalid date or time', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_INVALID_NUMBER => 'invalid number', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied', + DB_ERROR_NODBSELECTED => 'no database selected', + DB_ERROR_NOSUCHDB => 'no such database', + DB_ERROR_NOSUCHFIELD => 'no such field', + DB_ERROR_NOSUCHTABLE => 'no such table', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'not found', + DB_ERROR_NOT_LOCKED => 'not locked', + DB_ERROR_SYNTAX => 'syntax error', + DB_ERROR_UNSUPPORTED => 'not supported', + DB_ERROR_TRUNCATED => 'truncated', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_OK => 'no error', + ); + } + + if (DB::isError($value)) { + $value = $value->getCode(); + } + + return isset($errorMessages[$value]) ? $errorMessages[$value] + : $errorMessages[DB_ERROR]; + } + + // }}} + // {{{ parseDSN() + + /** + * Parse a data source name + * + * Additional keys can be added by appending a URI query string to the + * end of the DSN. + * + * The format of the supplied DSN is in its fullest form: + * <code> + * phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true + * </code> + * + * Most variations are allowed: + * <code> + * phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644 + * phptype://username:password@hostspec/database_name + * phptype://username:password@hostspec + * phptype://username@hostspec + * phptype://hostspec/database + * phptype://hostspec + * phptype(dbsyntax) + * phptype + * </code> + * + * @param string $dsn Data Source Name to be parsed + * + * @return array an associative array with the following keys: + * + phptype: Database backend used in PHP (mysql, odbc etc.) + * + dbsyntax: Database used with regards to SQL syntax etc. + * + protocol: Communication protocol to use (tcp, unix etc.) + * + hostspec: Host specification (hostname[:port]) + * + database: Database to use on the DBMS server + * + username: User name for login + * + password: Password for login + */ + function parseDSN($dsn) + { + $parsed = array( + 'phptype' => false, + 'dbsyntax' => false, + 'username' => false, + 'password' => false, + 'protocol' => false, + 'hostspec' => false, + 'port' => false, + 'socket' => false, + 'database' => false, + ); + + if (is_array($dsn)) { + $dsn = array_merge($parsed, $dsn); + if (!$dsn['dbsyntax']) { + $dsn['dbsyntax'] = $dsn['phptype']; + } + return $dsn; + } + + // Find phptype and dbsyntax + if (($pos = strpos($dsn, '://')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 3); + } else { + $str = $dsn; + $dsn = null; + } + + // Get phptype and dbsyntax + // $str => phptype(dbsyntax) + if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { + $parsed['phptype'] = $arr[1]; + $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2]; + } else { + $parsed['phptype'] = $str; + $parsed['dbsyntax'] = $str; + } + + if (!count($dsn)) { + return $parsed; + } + + // Get (if found): username and password + // $dsn => username:password@protocol+hostspec/database + if (($at = strrpos($dsn,'@')) !== false) { + $str = substr($dsn, 0, $at); + $dsn = substr($dsn, $at + 1); + if (($pos = strpos($str, ':')) !== false) { + $parsed['username'] = rawurldecode(substr($str, 0, $pos)); + $parsed['password'] = rawurldecode(substr($str, $pos + 1)); + } else { + $parsed['username'] = rawurldecode($str); + } + } + + // Find protocol and hostspec + + if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) { + // $dsn => proto(proto_opts)/database + $proto = $match[1]; + $proto_opts = $match[2] ? $match[2] : false; + $dsn = $match[3]; + + } else { + // $dsn => protocol+hostspec/database (old format) + if (strpos($dsn, '+') !== false) { + list($proto, $dsn) = explode('+', $dsn, 2); + } + if (strpos($dsn, '/') !== false) { + list($proto_opts, $dsn) = explode('/', $dsn, 2); + } else { + $proto_opts = $dsn; + $dsn = null; + } + } + + // process the different protocol options + $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp'; + $proto_opts = rawurldecode($proto_opts); + if ($parsed['protocol'] == 'tcp') { + if (strpos($proto_opts, ':') !== false) { + list($parsed['hostspec'], + $parsed['port']) = explode(':', $proto_opts); + } else { + $parsed['hostspec'] = $proto_opts; + } + } elseif ($parsed['protocol'] == 'unix') { + $parsed['socket'] = $proto_opts; + } + + // Get dabase if any + // $dsn => database + if ($dsn) { + if (($pos = strpos($dsn, '?')) === false) { + // /database + $parsed['database'] = rawurldecode($dsn); + } else { + // /database?param1=value1¶m2=value2 + $parsed['database'] = rawurldecode(substr($dsn, 0, $pos)); + $dsn = substr($dsn, $pos + 1); + if (strpos($dsn, '&') !== false) { + $opts = explode('&', $dsn); + } else { // database?param1=value1 + $opts = array($dsn); + } + foreach ($opts as $opt) { + list($key, $value) = explode('=', $opt); + if (!isset($parsed[$key])) { + // don't allow params overwrite + $parsed[$key] = rawurldecode($value); + } + } + } + } + + return $parsed; + } + + // }}} +} + +// }}} +// {{{ class DB_Error + +/** + * DB_Error implements a class for reporting portable database error + * messages + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_Error extends PEAR_Error +{ + // {{{ constructor + + /** + * DB_Error constructor + * + * @param mixed $code DB error code, or string with error message + * @param int $mode what "error mode" to operate in + * @param int $level what error level to use for $mode & + * PEAR_ERROR_TRIGGER + * @param mixed $debuginfo additional debug info, such as the last query + * + * @see PEAR_Error + */ + function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN, + $level = E_USER_NOTICE, $debuginfo = null) + { + if (is_int($code)) { + $this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, + $mode, $level, $debuginfo); + } else { + $this->PEAR_Error("DB Error: $code", DB_ERROR, + $mode, $level, $debuginfo); + } + } + + // }}} +} + +// }}} +// {{{ class DB_result + +/** + * This class implements a wrapper for a DB result set + * + * A new instance of this class will be returned by the DB implementation + * after processing a query that returns data. + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_result +{ + // {{{ properties + + /** + * Should results be freed automatically when there are no more rows? + * @var boolean + * @see DB_common::$options + */ + var $autofree; + + /** + * A reference to the DB_<driver> object + * @var object + */ + var $dbh; + + /** + * The current default fetch mode + * @var integer + * @see DB_common::$fetchmode + */ + var $fetchmode; + + /** + * The name of the class into which results should be fetched when + * DB_FETCHMODE_OBJECT is in effect + * + * @var string + * @see DB_common::$fetchmode_object_class + */ + var $fetchmode_object_class; + + /** + * The number of rows to fetch from a limit query + * @var integer + */ + var $limit_count = null; + + /** + * The row to start fetching from in limit queries + * @var integer + */ + var $limit_from = null; + + /** + * The execute parameters that created this result + * @var array + * @since Property available since Release 1.7.0 + */ + var $parameters; + + /** + * The query string that created this result + * + * Copied here incase it changes in $dbh, which is referenced + * + * @var string + * @since Property available since Release 1.7.0 + */ + var $query; + + /** + * The query result resource id created by PHP + * @var resource + */ + var $result; + + /** + * The present row being dealt with + * @var integer + */ + var $row_counter = null; + + /** + * The prepared statement resource id created by PHP in $dbh + * + * This resource is only available when the result set was created using + * a driver's native execute() method, not PEAR DB's emulated one. + * + * Copied here incase it changes in $dbh, which is referenced + * + * {@internal Mainly here because the InterBase/Firebird API is only + * able to retrieve data from result sets if the statemnt handle is + * still in scope.}} + * + * @var resource + * @since Property available since Release 1.7.0 + */ + var $statement; + + + // }}} + // {{{ constructor + + /** + * This constructor sets the object's properties + * + * @param object &$dbh the DB object reference + * @param resource $result the result resource id + * @param array $options an associative array with result options + * + * @return void + */ + function DB_result(&$dbh, $result, $options = array()) + { + $this->autofree = $dbh->options['autofree']; + $this->dbh = &$dbh; + $this->fetchmode = $dbh->fetchmode; + $this->fetchmode_object_class = $dbh->fetchmode_object_class; + $this->parameters = $dbh->last_parameters; + $this->query = $dbh->last_query; + $this->result = $result; + $this->statement = empty($dbh->last_stmt) ? null : $dbh->last_stmt; + foreach ($options as $key => $value) { + $this->setOption($key, $value); + } + } + + /** + * Set options for the DB_result object + * + * @param string $key the option to set + * @param mixed $value the value to set the option to + * + * @return void + */ + function setOption($key, $value = null) + { + switch ($key) { + case 'limit_from': + $this->limit_from = $value; + break; + case 'limit_count': + $this->limit_count = $value; + } + } + + // }}} + // {{{ fetchRow() + + /** + * Fetch a row of data and return it by reference into an array + * + * The type of array returned can be controlled either by setting this + * method's <var>$fetchmode</var> parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + <var>DB_PORTABILITY_LOWERCASE</var> + * convert names of fields to lower case + * + * + <var>DB_PORTABILITY_RTRIM</var> + * right trim the data + * + * @param int $fetchmode the constant indicating how to format the data + * @param int $rownum the row number to fetch (index starts at 0) + * + * @return mixed an array or object containing the row's data, + * NULL when the end of the result set is reached + * or a DB_Error object on failure. + * + * @see DB_common::setOption(), DB_common::setFetchMode() + */ + function &fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->dbh->features['limit'] === false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ($this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + $tmp = null; + return $tmp; + } + if ($this->dbh->features['limit'] === 'emulate') { + $rownum = $this->row_counter; + } + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // The default mode is specified in the + // DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = &new $object_class($arr); + } + } + return $arr; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row of data into an array which is passed by reference + * + * The type of array returned can be controlled either by setting this + * method's <var>$fetchmode</var> parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + <var>DB_PORTABILITY_LOWERCASE</var> + * convert names of fields to lower case + * + * + <var>DB_PORTABILITY_RTRIM</var> + * right trim the data + * + * @param array &$arr the variable where the data should be placed + * @param int $fetchmode the constant indicating how to format the data + * @param int $rownum the row number to fetch (index starts at 0) + * + * @return mixed DB_OK if a row is processed, NULL when the end of the + * result set is reached or a DB_Error object on failure + * + * @see DB_common::setOption(), DB_common::setFetchMode() + */ + function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->dbh->features['limit'] === false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ( + $this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + return null; + } + if ($this->dbh->features['limit'] === 'emulate') { + $rownum = $this->row_counter; + } + + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // default mode specified in the + // DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = new $object_class($arr); + } + } + return DB_OK; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ numCols() + + /** + * Get the the number of columns in a result set + * + * @return int the number of columns. A DB_Error object on failure. + */ + function numCols() + { + return $this->dbh->numCols($this->result); + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set + * + * @return int the number of rows. A DB_Error object on failure. + */ + function numRows() + { + if ($this->dbh->features['numrows'] === 'emulate' + && $this->dbh->options['portability'] & DB_PORTABILITY_NUMROWS) + { + if ($this->dbh->features['prepare']) { + $res = $this->dbh->query($this->query, $this->parameters); + } else { + $res = $this->dbh->query($this->query); + } + if (DB::isError($res)) { + return $res; + } + $i = 0; + while ($res->fetchInto($tmp, DB_FETCHMODE_ORDERED)) { + $i++; + } + return $i; + } else { + return $this->dbh->numRows($this->result); + } + } + + // }}} + // {{{ nextResult() + + /** + * Get the next result if a batch of queries was executed + * + * @return bool true if a new result is available or false if not + */ + function nextResult() + { + return $this->dbh->nextResult($this->result); + } + + // }}} + // {{{ free() + + /** + * Frees the resources allocated for this result set + * + * @return bool true on success. A DB_Error object on failure. + */ + function free() + { + $err = $this->dbh->freeResult($this->result); + if (DB::isError($err)) { + return $err; + } + $this->result = false; + $this->statement = false; + return true; + } + + // }}} + // {{{ tableInfo() + + /** + * @see DB_common::tableInfo() + * @deprecated Method deprecated some time before Release 1.2 + */ + function tableInfo($mode = null) + { + if (is_string($mode)) { + return $this->dbh->raiseError(DB_ERROR_NEED_MORE_DATA); + } + return $this->dbh->tableInfo($this, $mode); + } + + // }}} + // {{{ getQuery() + + /** + * Determine the query string that created this result + * + * @return string the query string + * + * @since Method available since Release 1.7.0 + */ + function getQuery() + { + return $this->query; + } + + // }}} + // {{{ getRowCounter() + + /** + * Tells which row number is currently being processed + * + * @return integer the current row being looked at. Starts at 1. + */ + function getRowCounter() + { + return $this->row_counter; + } + + // }}} +} + +// }}} +// {{{ class DB_row + +/** + * PEAR DB Row Object + * + * The object contains a row of data from a result set. Each column's data + * is placed in a property named for the column. + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + * @see DB_common::setFetchMode() + */ +class DB_row +{ + // {{{ constructor + + /** + * The constructor places a row's data into properties of this object + * + * @param array the array containing the row's data + * + * @return void + */ + function DB_row(&$arr) + { + foreach ($arr as $key => $value) { + $this->$key = &$arr[$key]; + } + } + + // }}} +} + +// }}} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/DB/common.php b/plugins/tidypics/lib/phpFlickr/PEAR/DB/common.php new file mode 100644 index 00000000..04e71ff5 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/DB/common.php @@ -0,0 +1,2157 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * Contains the DB_common base class + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.0 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_0.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @author Tomas V.V. Cox <cox@idecnet.com> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: common.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the PEAR class so it can be extended from + */ +require_once 'PEAR.php'; + +/** + * DB_common is the base class from which each database driver class extends + * + * All common methods are declared here. If a given DBMS driver contains + * a particular method, that method will overload the one here. + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @author Tomas V.V. Cox <cox@idecnet.com> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_common extends PEAR +{ + // {{{ properties + + /** + * The current default fetch mode + * @var integer + */ + var $fetchmode = DB_FETCHMODE_ORDERED; + + /** + * The name of the class into which results should be fetched when + * DB_FETCHMODE_OBJECT is in effect + * + * @var string + */ + var $fetchmode_object_class = 'stdClass'; + + /** + * Was a connection present when the object was serialized()? + * @var bool + * @see DB_common::__sleep(), DB_common::__wake() + */ + var $was_connected = null; + + /** + * The most recently executed query + * @var string + */ + var $last_query = ''; + + /** + * Run-time configuration options + * + * The 'optimize' option has been deprecated. Use the 'portability' + * option instead. + * + * @var array + * @see DB_common::setOption() + */ + var $options = array( + 'result_buffering' => 500, + 'persistent' => false, + 'ssl' => false, + 'debug' => 0, + 'seqname_format' => '%s_seq', + 'autofree' => false, + 'portability' => DB_PORTABILITY_NONE, + 'optimize' => 'performance', // Deprecated. Use 'portability'. + ); + + /** + * The parameters from the most recently executed query + * @var array + * @since Property available since Release 1.7.0 + */ + var $last_parameters = array(); + + /** + * The elements from each prepared statement + * @var array + */ + var $prepare_tokens = array(); + + /** + * The data types of the various elements in each prepared statement + * @var array + */ + var $prepare_types = array(); + + /** + * The prepared queries + * @var array + */ + var $prepared_queries = array(); + + + // }}} + // {{{ DB_common + + /** + * This constructor calls <kbd>$this->PEAR('DB_Error')</kbd> + * + * @return void + */ + function DB_common() + { + $this->PEAR('DB_Error'); + } + + // }}} + // {{{ __sleep() + + /** + * Automatically indicates which properties should be saved + * when PHP's serialize() function is called + * + * @return array the array of properties names that should be saved + */ + function __sleep() + { + if ($this->connection) { + // Don't disconnect(), people use serialize() for many reasons + $this->was_connected = true; + } else { + $this->was_connected = false; + } + if (isset($this->autocommit)) { + return array('autocommit', + 'dbsyntax', + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); + } else { + return array('dbsyntax', + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); + } + } + + // }}} + // {{{ __wakeup() + + /** + * Automatically reconnects to the database when PHP's unserialize() + * function is called + * + * The reconnection attempt is only performed if the object was connected + * at the time PHP's serialize() function was run. + * + * @return void + */ + function __wakeup() + { + if ($this->was_connected) { + $this->connect($this->dsn, $this->options); + } + } + + // }}} + // {{{ __toString() + + /** + * Automatic string conversion for PHP 5 + * + * @return string a string describing the current PEAR DB object + * + * @since Method available since Release 1.7.0 + */ + function __toString() + { + $info = strtolower(get_class($this)); + $info .= ': (phptype=' . $this->phptype . + ', dbsyntax=' . $this->dbsyntax . + ')'; + if ($this->connection) { + $info .= ' [connected]'; + } + return $info; + } + + // }}} + // {{{ toString() + + /** + * DEPRECATED: String conversion method + * + * @return string a string describing the current PEAR DB object + * + * @deprecated Method deprecated in Release 1.7.0 + */ + function toString() + { + return $this->__toString(); + } + + // }}} + // {{{ quoteString() + + /** + * DEPRECATED: Quotes a string so it can be safely used within string + * delimiters in a query + * + * @param string $string the string to be quoted + * + * @return string the quoted string + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Method deprecated some time before Release 1.2 + */ + function quoteString($string) + { + $string = $this->quote($string); + if ($string{0} == "'") { + return substr($string, 1, -1); + } + return $string; + } + + // }}} + // {{{ quote() + + /** + * DEPRECATED: Quotes a string so it can be safely used in a query + * + * @param string $string the string to quote + * + * @return string the quoted string or the string <samp>NULL</samp> + * if the value submitted is <kbd>null</kbd>. + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Deprecated in release 1.6.0 + */ + function quote($string = null) + { + return ($string === null) ? 'NULL' + : "'" . str_replace("'", "''", $string) . "'"; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * Delimiting style depends on which database driver is being used. + * + * NOTE: just because you CAN use delimited identifiers doesn't mean + * you SHOULD use them. In general, they end up causing way more + * problems than they solve. + * + * Portability is broken by using the following characters inside + * delimited identifiers: + * + backtick (<kbd>`</kbd>) -- due to MySQL + * + double quote (<kbd>"</kbd>) -- due to Oracle + * + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- due to Access + * + * Delimited identifiers are known to generally work correctly under + * the following drivers: + * + mssql + * + mysql + * + mysqli + * + oci8 + * + odbc(access) + * + odbc(db2) + * + pgsql + * + sqlite + * + sybase (must execute <kbd>set quoted_identifier on</kbd> sometime + * prior to use) + * + * InterBase doesn't seem to be able to use delimited identifiers + * via PHP 4. They work fine under PHP 5. + * + * @param string $str the identifier name to be quoted + * + * @return string the quoted identifier + * + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '"' . str_replace('"', '""', $str) . '"'; + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * The output depends on the PHP data type of input and the database + * type being used. + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + * <ul> + * <li> + * <kbd>input</kbd> -> <samp>returns</samp> + * </li> + * <li> + * <kbd>null</kbd> -> the string <samp>NULL</samp> + * </li> + * <li> + * <kbd>integer</kbd> or <kbd>double</kbd> -> the unquoted number + * </li> + * <li> + * <kbd>bool</kbd> -> output depends on the driver in use + * Most drivers return integers: <samp>1</samp> if + * <kbd>true</kbd> or <samp>0</samp> if + * <kbd>false</kbd>. + * Some return strings: <samp>TRUE</samp> if + * <kbd>true</kbd> or <samp>FALSE</samp> if + * <kbd>false</kbd>. + * Finally one returns strings: <samp>T</samp> if + * <kbd>true</kbd> or <samp>F</samp> if + * <kbd>false</kbd>. Here is a list of each DBMS, + * the values returned and the suggested column type: + * <ul> + * <li> + * <kbd>dbase</kbd> -> <samp>T/F</samp> + * (<kbd>Logical</kbd>) + * </li> + * <li> + * <kbd>fbase</kbd> -> <samp>TRUE/FALSE</samp> + * (<kbd>BOOLEAN</kbd>) + * </li> + * <li> + * <kbd>ibase</kbd> -> <samp>1/0</samp> + * (<kbd>SMALLINT</kbd>) [1] + * </li> + * <li> + * <kbd>ifx</kbd> -> <samp>1/0</samp> + * (<kbd>SMALLINT</kbd>) [1] + * </li> + * <li> + * <kbd>msql</kbd> -> <samp>1/0</samp> + * (<kbd>INTEGER</kbd>) + * </li> + * <li> + * <kbd>mssql</kbd> -> <samp>1/0</samp> + * (<kbd>BIT</kbd>) + * </li> + * <li> + * <kbd>mysql</kbd> -> <samp>1/0</samp> + * (<kbd>TINYINT(1)</kbd>) + * </li> + * <li> + * <kbd>mysqli</kbd> -> <samp>1/0</samp> + * (<kbd>TINYINT(1)</kbd>) + * </li> + * <li> + * <kbd>oci8</kbd> -> <samp>1/0</samp> + * (<kbd>NUMBER(1)</kbd>) + * </li> + * <li> + * <kbd>odbc</kbd> -> <samp>1/0</samp> + * (<kbd>SMALLINT</kbd>) [1] + * </li> + * <li> + * <kbd>pgsql</kbd> -> <samp>TRUE/FALSE</samp> + * (<kbd>BOOLEAN</kbd>) + * </li> + * <li> + * <kbd>sqlite</kbd> -> <samp>1/0</samp> + * (<kbd>INTEGER</kbd>) + * </li> + * <li> + * <kbd>sybase</kbd> -> <samp>1/0</samp> + * (<kbd>TINYINT(1)</kbd>) + * </li> + * </ul> + * [1] Accommodate the lowest common denominator because not all + * versions of have <kbd>BOOLEAN</kbd>. + * </li> + * <li> + * other (including strings and numeric strings) -> + * the data with single quotes escaped by preceeding + * single quotes, backslashes are escaped by preceeding + * backslashes, then the whole string is encapsulated + * between single quotes + * </li> + * </ul> + * + * @see DB_common::escapeSimple() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 1 : 0; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * In SQLite, this makes things safe for inserts/updates, but may + * cause problems when performing text comparisons against columns + * containing binary data. See the + * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + return str_replace("'", "''", $str); + } + + // }}} + // {{{ provides() + + /** + * Tells whether the present driver supports a given feature + * + * @param string $feature the feature you're curious about + * + * @return bool whether this driver supports $feature + */ + function provides($feature) + { + return $this->features[$feature]; + } + + // }}} + // {{{ setFetchMode() + + /** + * Sets the fetch mode that should be used by default for query results + * + * @param integer $fetchmode DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC + * or DB_FETCHMODE_OBJECT + * @param string $object_class the class name of the object to be returned + * by the fetch methods when the + * DB_FETCHMODE_OBJECT mode is selected. + * If no class is specified by default a cast + * to object from the assoc array row will be + * done. There is also the posibility to use + * and extend the 'DB_row' class. + * + * @see DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC, DB_FETCHMODE_OBJECT + */ + function setFetchMode($fetchmode, $object_class = 'stdClass') + { + switch ($fetchmode) { + case DB_FETCHMODE_OBJECT: + $this->fetchmode_object_class = $object_class; + case DB_FETCHMODE_ORDERED: + case DB_FETCHMODE_ASSOC: + $this->fetchmode = $fetchmode; + break; + default: + return $this->raiseError('invalid fetchmode mode'); + } + } + + // }}} + // {{{ setOption() + + /** + * Sets run-time configuration options for PEAR DB + * + * Options, their data types, default values and description: + * <ul> + * <li> + * <var>autofree</var> <kbd>boolean</kbd> = <samp>false</samp> + * <br />should results be freed automatically when there are no + * more rows? + * </li><li> + * <var>result_buffering</var> <kbd>integer</kbd> = <samp>500</samp> + * <br />how many rows of the result set should be buffered? + * <br />In mysql: mysql_unbuffered_query() is used instead of + * mysql_query() if this value is 0. (Release 1.7.0) + * <br />In oci8: this value is passed to ocisetprefetch(). + * (Release 1.7.0) + * </li><li> + * <var>debug</var> <kbd>integer</kbd> = <samp>0</samp> + * <br />debug level + * </li><li> + * <var>persistent</var> <kbd>boolean</kbd> = <samp>false</samp> + * <br />should the connection be persistent? + * </li><li> + * <var>portability</var> <kbd>integer</kbd> = <samp>DB_PORTABILITY_NONE</samp> + * <br />portability mode constant (see below) + * </li><li> + * <var>seqname_format</var> <kbd>string</kbd> = <samp>%s_seq</samp> + * <br />the sprintf() format string used on sequence names. This + * format is applied to sequence names passed to + * createSequence(), nextID() and dropSequence(). + * </li><li> + * <var>ssl</var> <kbd>boolean</kbd> = <samp>false</samp> + * <br />use ssl to connect? + * </li> + * </ul> + * + * ----------------------------------------- + * + * PORTABILITY MODES + * + * These modes are bitwised, so they can be combined using <kbd>|</kbd> + * and removed using <kbd>^</kbd>. See the examples section below on how + * to do this. + * + * <samp>DB_PORTABILITY_NONE</samp> + * turn off all portability features + * + * This mode gets automatically turned on if the deprecated + * <var>optimize</var> option gets set to <samp>performance</samp>. + * + * + * <samp>DB_PORTABILITY_LOWERCASE</samp> + * convert names of tables and fields to lower case when using + * <kbd>get*()</kbd>, <kbd>fetch*()</kbd> and <kbd>tableInfo()</kbd> + * + * This mode gets automatically turned on in the following databases + * if the deprecated option <var>optimize</var> gets set to + * <samp>portability</samp>: + * + oci8 + * + * + * <samp>DB_PORTABILITY_RTRIM</samp> + * right trim the data output by <kbd>get*()</kbd> <kbd>fetch*()</kbd> + * + * + * <samp>DB_PORTABILITY_DELETE_COUNT</samp> + * force reporting the number of rows deleted + * + * Some DBMS's don't count the number of rows deleted when performing + * simple <kbd>DELETE FROM tablename</kbd> queries. This portability + * mode tricks such DBMS's into telling the count by adding + * <samp>WHERE 1=1</samp> to the end of <kbd>DELETE</kbd> queries. + * + * This mode gets automatically turned on in the following databases + * if the deprecated option <var>optimize</var> gets set to + * <samp>portability</samp>: + * + fbsql + * + mysql + * + mysqli + * + sqlite + * + * + * <samp>DB_PORTABILITY_NUMROWS</samp> + * enable hack that makes <kbd>numRows()</kbd> work in Oracle + * + * This mode gets automatically turned on in the following databases + * if the deprecated option <var>optimize</var> gets set to + * <samp>portability</samp>: + * + oci8 + * + * + * <samp>DB_PORTABILITY_ERRORS</samp> + * makes certain error messages in certain drivers compatible + * with those from other DBMS's + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + * DB_ERROR_MISMATCH -> DB_ERROR_NOSUCHFIELD + * + * <samp>DB_PORTABILITY_NULL_TO_EMPTY</samp> + * convert null values to empty strings in data output by get*() and + * fetch*(). Needed because Oracle considers empty strings to be null, + * while most other DBMS's know the difference between empty and null. + * + * + * <samp>DB_PORTABILITY_ALL</samp> + * turn on all portability features + * + * ----------------------------------------- + * + * Example 1. Simple setOption() example + * <code> + * $db->setOption('autofree', true); + * </code> + * + * Example 2. Portability for lowercasing and trimming + * <code> + * $db->setOption('portability', + * DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM); + * </code> + * + * Example 3. All portability options except trimming + * <code> + * $db->setOption('portability', + * DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM); + * </code> + * + * @param string $option option name + * @param mixed $value value for the option + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::$options + */ + function setOption($option, $value) + { + if (isset($this->options[$option])) { + $this->options[$option] = $value; + + /* + * Backwards compatibility check for the deprecated 'optimize' + * option. Done here in case settings change after connecting. + */ + if ($option == 'optimize') { + if ($value == 'portability') { + switch ($this->phptype) { + case 'oci8': + $this->options['portability'] = + DB_PORTABILITY_LOWERCASE | + DB_PORTABILITY_NUMROWS; + break; + case 'fbsql': + case 'mysql': + case 'mysqli': + case 'sqlite': + $this->options['portability'] = + DB_PORTABILITY_DELETE_COUNT; + break; + } + } else { + $this->options['portability'] = DB_PORTABILITY_NONE; + } + } + + return DB_OK; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ getOption() + + /** + * Returns the value of an option + * + * @param string $option the option name you're curious about + * + * @return mixed the option's value + */ + function getOption($option) + { + if (isset($this->options[$option])) { + return $this->options[$option]; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute() + * + * Creates a query that can be run multiple times. Each time it is run, + * the placeholders, if any, will be replaced by the contents of + * execute()'s $data argument. + * + * Three types of placeholders can be used: + * + <kbd>?</kbd> scalar value (i.e. strings, integers). The system + * will automatically quote and escape the data. + * + <kbd>!</kbd> value is inserted 'as is' + * + <kbd>&</kbd> requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Example 1. + * <code> + * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res = $db->execute($sth, $data); + * </code> + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders: + * <pre> + * "UPDATE foo SET col=? WHERE col='over \& under'" + * </pre> + * + * With some database backends, this is emulated. + * + * {@internal ibase and oci8 have their own prepare() methods.}} + * + * @param string $query the query to be prepared + * + * @return mixed DB statement resource on success. A DB_Error object + * on failure. + * + * @see DB_common::execute() + */ + function prepare($query) + { + $tokens = preg_split('/((?<!\\\)[&?!])/', $query, -1, + PREG_SPLIT_DELIM_CAPTURE); + $token = 0; + $types = array(); + $newtokens = array(); + + foreach ($tokens as $val) { + switch ($val) { + case '?': + $types[$token++] = DB_PARAM_SCALAR; + break; + case '&': + $types[$token++] = DB_PARAM_OPAQUE; + break; + case '!': + $types[$token++] = DB_PARAM_MISC; + break; + default: + $newtokens[] = preg_replace('/\\\([&?!])/', "\\1", $val); + } + } + + $this->prepare_tokens[] = &$newtokens; + end($this->prepare_tokens); + + $k = key($this->prepare_tokens); + $this->prepare_types[$k] = $types; + $this->prepared_queries[$k] = implode(' ', $newtokens); + + return $k; + } + + // }}} + // {{{ autoPrepare() + + /** + * Automaticaly generates an insert or update query and pass it to prepare() + * + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return resource the query handle + * + * @uses DB_common::prepare(), DB_common::buildManipSQL() + */ + function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT, + $where = false) + { + $query = $this->buildManipSQL($table, $table_fields, $mode, $where); + if (DB::isError($query)) { + return $query; + } + return $this->prepare($query); + } + + // }}} + // {{{ autoExecute() + + /** + * Automaticaly generates an insert or update query and call prepare() + * and execute() with it + * + * @param string $table the table name + * @param array $fields_values the associative array where $key is a + * field name and $value its value + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * @uses DB_common::autoPrepare(), DB_common::execute() + */ + function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT, + $where = false) + { + $sth = $this->autoPrepare($table, array_keys($fields_values), $mode, + $where); + if (DB::isError($sth)) { + return $sth; + } + $ret =& $this->execute($sth, array_values($fields_values)); + $this->freePrepared($sth); + return $ret; + + } + + // }}} + // {{{ buildManipSQL() + + /** + * Produces an SQL query string for autoPrepare() + * + * Example: + * <pre> + * buildManipSQL('table_sql', array('field1', 'field2', 'field3'), + * DB_AUTOQUERY_INSERT); + * </pre> + * + * That returns + * <samp> + * INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?) + * </samp> + * + * NOTES: + * - This belongs more to a SQL Builder class, but this is a simple + * facility. + * - Be carefull! If you don't give a $where param with an UPDATE + * query, all the records of the table will be updated! + * + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return string the sql query for autoPrepare() + */ + function buildManipSQL($table, $table_fields, $mode, $where = false) + { + if (count($table_fields) == 0) { + return $this->raiseError(DB_ERROR_NEED_MORE_DATA); + } + $first = true; + switch ($mode) { + case DB_AUTOQUERY_INSERT: + $values = ''; + $names = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $names .= ','; + $values .= ','; + } + $names .= $value; + $values .= '?'; + } + return "INSERT INTO $table ($names) VALUES ($values)"; + case DB_AUTOQUERY_UPDATE: + $set = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $set .= ','; + } + $set .= "$value = ?"; + } + $sql = "UPDATE $table SET $set"; + if ($where) { + $sql .= " WHERE $where"; + } + return $sql; + default: + return $this->raiseError(DB_ERROR_SYNTAX); + } + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare() + * + * Example 1. + * <code> + * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res =& $db->execute($sth, $data); + * </code> + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * {@internal ibase and oci8 have their own execute() methods.}} + * + * @see DB_common::prepare() + */ + function &execute($stmt, $data = array()) + { + $realquery = $this->executeEmulateQuery($stmt, $data); + if (DB::isError($realquery)) { + return $realquery; + } + $result = $this->simpleQuery($realquery); + + if ($result === DB_OK || DB::isError($result)) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + + // }}} + // {{{ executeEmulateQuery() + + /** + * Emulates executing prepared statements if the DBMS not support them + * + * @param resource $stmt a DB statement resource returned from execute() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a string containing the real query run when emulating + * prepare/execute. A DB_Error object on failure. + * + * @access protected + * @see DB_common::execute() + */ + function executeEmulateQuery($stmt, $data = array()) + { + $stmt = (int)$stmt; + $data = (array)$data; + $this->last_parameters = $data; + + if (count($this->prepare_types[$stmt]) != count($data)) { + $this->last_query = $this->prepared_queries[$stmt]; + return $this->raiseError(DB_ERROR_MISMATCH); + } + + $realquery = $this->prepare_tokens[$stmt][0]; + + $i = 0; + foreach ($data as $value) { + if ($this->prepare_types[$stmt][$i] == DB_PARAM_SCALAR) { + $realquery .= $this->quoteSmart($value); + } elseif ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($value, 'rb'); + if (!$fp) { + return $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + } + $realquery .= $this->quoteSmart(fread($fp, filesize($value))); + fclose($fp); + } else { + $realquery .= $value; + } + + $realquery .= $this->prepare_tokens[$stmt][++$i]; + } + + return $realquery; + } + + // }}} + // {{{ executeMultiple() + + /** + * Performs several execute() calls on the same statement handle + * + * $data must be an array indexed numerically + * from 0, one execute call is done for every "row" in the array. + * + * If an error occurs during execute(), executeMultiple() does not + * execute the unfinished rows, but rather returns that error. + * + * @param resource $stmt query handle from prepare() + * @param array $data numeric array containing the + * data to insert into the query + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::prepare(), DB_common::execute() + */ + function executeMultiple($stmt, $data) + { + foreach ($data as $value) { + $res =& $this->execute($stmt, $value); + if (DB::isError($res)) { + return $res; + } + } + return DB_OK; + } + + // }}} + // {{{ freePrepared() + + /** + * Frees the internal resources associated with a prepared query + * + * @param resource $stmt the prepared statement's PHP resource + * @param bool $free_resource should the PHP resource be freed too? + * Use false if you need to get data + * from the result set later. + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_common::prepare() + */ + function freePrepared($stmt, $free_resource = true) + { + $stmt = (int)$stmt; + if (isset($this->prepare_tokens[$stmt])) { + unset($this->prepare_tokens[$stmt]); + unset($this->prepare_types[$stmt]); + unset($this->prepared_queries[$stmt]); + return true; + } + return false; + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * It is defined here to ensure all drivers have this method available. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + * @see DB_mysql::modifyQuery(), DB_oci8::modifyQuery(), + * DB_sqlite::modifyQuery() + */ + function modifyQuery($query) + { + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * It is defined here to assure that all implementations + * have this method defined. + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return $query; + } + + // }}} + // {{{ query() + + /** + * Sends a query to the database server + * + * The query string can be either a normal statement to be sent directly + * to the server OR if <var>$params</var> are passed the query can have + * placeholders and it will be passed through prepare() and execute(). + * + * @param string $query the SQL query or the statement to prepare + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * @see DB_result, DB_common::prepare(), DB_common::execute() + */ + function &query($query, $params = array()) + { + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $ret =& $this->execute($sth, $params); + $this->freePrepared($sth, false); + return $ret; + } else { + $this->last_parameters = array(); + $result = $this->simpleQuery($query); + if ($result === DB_OK || DB::isError($result)) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + } + + // }}} + // {{{ limitQuery() + + /** + * Generates and executes a LIMIT query + * + * @param string $query the query + * @param intr $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + */ + function &limitQuery($query, $from, $count, $params = array()) + { + $query = $this->modifyLimitQuery($query, $from, $count, $params); + if (DB::isError($query)){ + return $query; + } + $result =& $this->query($query, $params); + if (is_a($result, 'DB_result')) { + $result->setOption('limit_from', $from); + $result->setOption('limit_count', $count); + } + return $result; + } + + // }}} + // {{{ getOne() + + /** + * Fetches the first column of the first row from a query result + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed the returned value of the query. + * A DB_Error object on failure. + */ + function &getOne($query, $params = array()) + { + $params = (array)$params; + // modifyLimitQuery() would be nice here, but it causes BC issues + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, DB_FETCHMODE_ORDERED); + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row[0]; + } + + // }}} + // {{{ getRow() + + /** + * Fetches the first row of data returned from a query result + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use + * + * @return array the first row of results as an array. + * A DB_Error object on failure. + */ + function &getRow($query, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + // modifyLimitQuery() would be nice here, but it causes BC issues + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, $fetchmode); + + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row; + } + + // }}} + // {{{ getCol() + + /** + * Fetches a single column from a query result and returns it as an + * indexed array + * + * @param string $query the SQL query + * @param mixed $col which column to return (integer [column number, + * starting at 0] or string [column name]) + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return array the results as an array. A DB_Error object on failure. + * + * @see DB_common::query() + */ + function &getCol($query, $col = 0, $params = array()) + { + $params = (array)$params; + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; + + if (!is_array($row = $res->fetchRow($fetchmode))) { + $ret = array(); + } else { + if (!array_key_exists($col, $row)) { + $ret =& $this->raiseError(DB_ERROR_NOSUCHFIELD); + } else { + $ret = array($row[$col]); + while (is_array($row = $res->fetchRow($fetchmode))) { + $ret[] = $row[$col]; + } + } + } + + $res->free(); + + if (DB::isError($row)) { + $ret = $row; + } + + return $ret; + } + + // }}} + // {{{ getAssoc() + + /** + * Fetches an entire query result and returns it as an + * associative array using the first column as the key + * + * If the result set contains more than two columns, the value + * will be an array of the values from column 2-n. If the result + * set contains only two columns, the returned value will be a + * scalar with the value of the second column (unless forced to an + * array with the $force_array parameter). A DB error code is + * returned on errors. If the result set contains fewer than two + * columns, a DB_ERROR_TRUNCATED error is returned. + * + * For example, if the table "mytable" contains: + * + * <pre> + * ID TEXT DATE + * -------------------------------- + * 1 'one' 944679408 + * 2 'two' 944679408 + * 3 'three' 944679408 + * </pre> + * + * Then the call getAssoc('SELECT id,text FROM mytable') returns: + * <pre> + * array( + * '1' => 'one', + * '2' => 'two', + * '3' => 'three', + * ) + * </pre> + * + * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns: + * <pre> + * array( + * '1' => array('one', '944679408'), + * '2' => array('two', '944679408'), + * '3' => array('three', '944679408') + * ) + * </pre> + * + * If the more than one row occurs with the same value in the + * first column, the last row overwrites all previous ones by + * default. Use the $group parameter if you don't want to + * overwrite like this. Example: + * + * <pre> + * getAssoc('SELECT category,id,name FROM mytable', false, null, + * DB_FETCHMODE_ASSOC, true) returns: + * + * array( + * '1' => array(array('id' => '4', 'name' => 'number four'), + * array('id' => '6', 'name' => 'number six') + * ), + * '9' => array(array('id' => '4', 'name' => 'number four'), + * array('id' => '6', 'name' => 'number six') + * ) + * ) + * </pre> + * + * Keep in mind that database functions in PHP usually return string + * values for results regardless of the database's internal type. + * + * @param string $query the SQL query + * @param bool $force_array used only when the query returns + * exactly two columns. If true, the values + * of the returned array will be one-element + * arrays instead of scalars. + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of + * items passed must match quantity of + * placeholders in query: meaning 1 + * placeholder for non-array parameters or + * 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use + * @param bool $group if true, the values of the returned array + * is wrapped in another array. If the same + * key value (in the first column) repeats + * itself, the values will be appended to + * this array instead of overwriting the + * existing values. + * + * @return array the associative array containing the query results. + * A DB_Error object on failure. + */ + function &getAssoc($query, $force_array = false, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT, $group = false) + { + $params = (array)$params; + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + if ($fetchmode == DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + $cols = $res->numCols(); + + if ($cols < 2) { + $tmp =& $this->raiseError(DB_ERROR_TRUNCATED); + return $tmp; + } + + $results = array(); + + if ($cols > 2 || $force_array) { + // return array values + // XXX this part can be optimized + if ($fetchmode == DB_FETCHMODE_ASSOC) { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ASSOC))) { + reset($row); + $key = current($row); + unset($row[key($row)]); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } elseif ($fetchmode == DB_FETCHMODE_OBJECT) { + while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) { + $arr = get_object_vars($row); + $key = current($arr); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } else { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + // we shift away the first element to get + // indices running from 0 again + $key = array_shift($row); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } + if (DB::isError($row)) { + $results = $row; + } + } else { + // return scalar values + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + if ($group) { + $results[$row[0]][] = $row[1]; + } else { + $results[$row[0]] = $row[1]; + } + } + if (DB::isError($row)) { + $results = $row; + } + } + + $res->free(); + + return $results; + } + + // }}} + // {{{ getAll() + + /** + * Fetches all of the rows from a query result + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of + * items passed must match quantity of + * placeholders in query: meaning 1 + * placeholder for non-array parameters or + * 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use: + * + DB_FETCHMODE_ORDERED + * + DB_FETCHMODE_ASSOC + * + DB_FETCHMODE_ORDERED | DB_FETCHMODE_FLIPPED + * + DB_FETCHMODE_ASSOC | DB_FETCHMODE_FLIPPED + * + * @return array the nested array. A DB_Error object on failure. + */ + function &getAll($query, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if ($res === DB_OK || DB::isError($res)) { + return $res; + } + + $results = array(); + while (DB_OK === $res->fetchInto($row, $fetchmode)) { + if ($fetchmode & DB_FETCHMODE_FLIPPED) { + foreach ($row as $key => $val) { + $results[$key][] = $val; + } + } else { + $results[] = $row; + } + } + + $res->free(); + + if (DB::isError($row)) { + $tmp =& $this->raiseError($row); + return $tmp; + } + return $results; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numRows() + + /** + * Determines the number of rows in a query result + * + * @param resource $result the query result idenifier produced by PHP + * + * @return int the number of rows. A DB_Error object on failure. + */ + function numRows($result) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getSequenceName() + + /** + * Generates the name used inside the database for a sequence + * + * The createSequence() docblock contains notes about storing sequence + * names. + * + * @param string $sqn the sequence's public name + * + * @return string the sequence's name in the backend + * + * @access protected + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::nextID(), DB_common::setOption() + */ + function getSequenceName($sqn) + { + return sprintf($this->getOption('seqname_format'), + preg_replace('/[^a-z0-9_.]/i', '_', $sqn)); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::getSequenceName() + */ + function nextId($seq_name, $ondemand = true) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * The name of a given sequence is determined by passing the string + * provided in the <var>$seq_name</var> argument through PHP's sprintf() + * function using the value from the <var>seqname_format</var> option as + * the sprintf()'s format argument. + * + * <var>seqname_format</var> is set via setOption(). + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + */ + function createSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + */ + function dropSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ raiseError() + + /** + * Communicates an error and invoke error callbacks, etc + * + * Basically a wrapper for PEAR::raiseError without the message string. + * + * @param mixed integer error code, or a PEAR error object (all + * other parameters are ignored if this parameter is + * an object + * @param int error mode, see PEAR_Error docs + * @param mixed if error mode is PEAR_ERROR_TRIGGER, this is the + * error level (E_USER_NOTICE etc). If error mode is + * PEAR_ERROR_CALLBACK, this is the callback function, + * either as a function name, or as an array of an + * object and method name. For other error modes this + * parameter is ignored. + * @param string extra debug information. Defaults to the last + * query and native error code. + * @param mixed native error code, integer or string depending the + * backend + * + * @return object the PEAR_Error object + * + * @see PEAR_Error + */ + function &raiseError($code = DB_ERROR, $mode = null, $options = null, + $userinfo = null, $nativecode = null) + { + // The error is yet a DB error object + if (is_object($code)) { + // because we the static PEAR::raiseError, our global + // handler should be used if it is set + if ($mode === null && !empty($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + } + $tmp = PEAR::raiseError($code, null, $mode, $options, + null, null, true); + return $tmp; + } + + if ($userinfo === null) { + $userinfo = $this->last_query; + } + + if ($nativecode) { + $userinfo .= ' [nativecode=' . trim($nativecode) . ']'; + } else { + $userinfo .= ' [DB Error: ' . DB::errorMessage($code) . ']'; + } + + $tmp = PEAR::raiseError(null, $code, $mode, $options, $userinfo, + 'DB_Error', true); + return $tmp; + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return mixed the DBMS' error code. A DB_Error object on failure. + */ + function errorNative() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ errorCode() + + /** + * Maps native error codes to DB's portable ones + * + * Uses the <var>$errorcode_map</var> property defined in each driver. + * + * @param string|int $nativecode the error code returned by the DBMS + * + * @return int the portable DB error code. Return DB_ERROR if the + * current driver doesn't have a mapping for the + * $nativecode submitted. + */ + function errorCode($nativecode) + { + if (isset($this->errorcode_map[$nativecode])) { + return $this->errorcode_map[$nativecode]; + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ errorMessage() + + /** + * Maps a DB error code to a textual message + * + * @param integer $dbcode the DB error code + * + * @return string the error message corresponding to the error code + * submitted. FALSE if the error code is unknown. + * + * @see DB::errorMessage() + */ + function errorMessage($dbcode) + { + return DB::errorMessage($this->errorcode_map[$dbcode]); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * The format of the resulting array depends on which <var>$mode</var> + * you select. The sample output below is based on this query: + * <pre> + * SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId + * FROM tblFoo + * JOIN tblBar ON tblFoo.fldId = tblBar.fldId + * </pre> + * + * <ul> + * <li> + * + * <kbd>null</kbd> (default) + * <pre> + * [0] => Array ( + * [table] => tblFoo + * [name] => fldId + * [type] => int + * [len] => 11 + * [flags] => primary_key not_null + * ) + * [1] => Array ( + * [table] => tblFoo + * [name] => fldPhone + * [type] => string + * [len] => 20 + * [flags] => + * ) + * [2] => Array ( + * [table] => tblBar + * [name] => fldId + * [type] => int + * [len] => 11 + * [flags] => primary_key not_null + * ) + * </pre> + * + * </li><li> + * + * <kbd>DB_TABLEINFO_ORDER</kbd> + * + * <p>In addition to the information found in the default output, + * a notation of the number of columns is provided by the + * <samp>num_fields</samp> element while the <samp>order</samp> + * element provides an array with the column names as the keys and + * their location index number (corresponding to the keys in the + * the default output) as the values.</p> + * + * <p>If a result set has identical field names, the last one is + * used.</p> + * + * <pre> + * [num_fields] => 3 + * [order] => Array ( + * [fldId] => 2 + * [fldTrans] => 1 + * ) + * </pre> + * + * </li><li> + * + * <kbd>DB_TABLEINFO_ORDERTABLE</kbd> + * + * <p>Similar to <kbd>DB_TABLEINFO_ORDER</kbd> but adds more + * dimensions to the array in which the table names are keys and + * the field names are sub-keys. This is helpful for queries that + * join tables which have identical field names.</p> + * + * <pre> + * [num_fields] => 3 + * [ordertable] => Array ( + * [tblFoo] => Array ( + * [fldId] => 0 + * [fldPhone] => 1 + * ) + * [tblBar] => Array ( + * [fldId] => 2 + * ) + * ) + * </pre> + * + * </li> + * </ul> + * + * The <samp>flags</samp> element contains a space separated list + * of extra information about the field. This data is inconsistent + * between DBMS's due to the way each DBMS works. + * + <samp>primary_key</samp> + * + <samp>unique_key</samp> + * + <samp>multiple_key</samp> + * + <samp>not_null</samp> + * + * Most DBMS's only provide the <samp>table</samp> and <samp>flags</samp> + * elements if <var>$result</var> is a table name. The following DBMS's + * provide full information from queries: + * + fbsql + * + mysql + * + * If the 'portability' option has <samp>DB_PORTABILITY_LOWERCASE</samp> + * turned on, the names of tables and fields will be lowercased. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode either unused or one of the tableInfo modes: + * <kbd>DB_TABLEINFO_ORDERTABLE</kbd>, + * <kbd>DB_TABLEINFO_ORDER</kbd> or + * <kbd>DB_TABLEINFO_FULL</kbd> (which does both). + * These are bitwise, so the first two can be + * combined using <kbd>|</kbd>. + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function tableInfo($result, $mode = null) + { + /* + * If the DB_<driver> class has a tableInfo() method, that one + * overrides this one. But, if the driver doesn't have one, + * this method runs and tells users about that fact. + */ + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getTables() + + /** + * Lists the tables in the current database + * + * @return array the list of tables. A DB_Error object on failure. + * + * @deprecated Method deprecated some time before Release 1.2 + */ + function getTables() + { + return $this->getListOf('tables'); + } + + // }}} + // {{{ getListOf() + + /** + * Lists internal database information + * + * @param string $type type of information being sought. + * Common items being sought are: + * tables, databases, users, views, functions + * Each DBMS's has its own capabilities. + * + * @return array an array listing the items sought. + * A DB DB_Error object on failure. + */ + function getListOf($type) + { + $sql = $this->getSpecialQuery($type); + if ($sql === null) { + $this->last_query = ''; + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } elseif (is_int($sql) || DB::isError($sql)) { + // Previous error + return $this->raiseError($sql); + } elseif (is_array($sql)) { + // Already the result + return $sql; + } + // Launch this query + return $this->getCol($sql); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } + + // }}} + // {{{ _rtrimArrayValues() + + /** + * Right-trims all strings in an array + * + * @param array $array the array to be trimmed (passed by reference) + * + * @return void + * + * @access protected + */ + function _rtrimArrayValues(&$array) + { + foreach ($array as $key => $value) { + if (is_string($value)) { + $array[$key] = rtrim($value); + } + } + } + + // }}} + // {{{ _convertNullArrayValuesToEmpty() + + /** + * Converts all null values in an array to empty strings + * + * @param array $array the array to be de-nullified (passed by reference) + * + * @return void + * + * @access protected + */ + function _convertNullArrayValuesToEmpty(&$array) + { + foreach ($array as $key => $value) { + if (is_null($value)) { + $array[$key] = ''; + } + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/DB/mysql.php b/plugins/tidypics/lib/phpFlickr/PEAR/DB/mysql.php new file mode 100644 index 00000000..3ae0adf8 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/DB/mysql.php @@ -0,0 +1,1034 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * The PEAR DB driver for PHP's mysql extension + * for interacting with MySQL databases + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.0 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_0.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: mysql.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's mysql extension + * for interacting with MySQL databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Stig Bakken <ssb@php.net> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_mysql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'mysql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'mysql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => '4.2.0', + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1022 => DB_ERROR_ALREADY_EXISTS, + 1044 => DB_ERROR_ACCESS_VIOLATION, + 1046 => DB_ERROR_NODBSELECTED, + 1048 => DB_ERROR_CONSTRAINT, + 1049 => DB_ERROR_NOSUCHDB, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1061 => DB_ERROR_ALREADY_EXISTS, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1091 => DB_ERROR_NOT_FOUND, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1142 => DB_ERROR_ACCESS_VIOLATION, + 1146 => DB_ERROR_NOSUCHTABLE, + 1216 => DB_ERROR_CONSTRAINT, + 1217 => DB_ERROR_CONSTRAINT, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The database specified in the DSN + * + * It's a fix to allow calls to different databases in the same script. + * + * @var string + * @access private + */ + var $_db = ''; + + + // }}} + // {{{ constructor + + /** + * This constructor calls <kbd>$this->DB_common()</kbd> + * + * @return void + */ + function DB_mysql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's mysql driver supports the following extra DSN options: + * + new_link If set to true, causes subsequent calls to connect() + * to return a new connection link instead of the + * existing one. WARNING: this is not portable to + * other DBMS's. Available since PEAR DB 1.7.0. + * + client_flags Any combination of MYSQL_CLIENT_* constants. + * Only used if PHP is at version 4.3.0 or greater. + * Available since PEAR DB 1.7.0. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('mysql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $params = array(); + if ($dsn['protocol'] && $dsn['protocol'] == 'unix') { + $params[0] = ':' . $dsn['socket']; + } else { + $params[0] = $dsn['hostspec'] ? $dsn['hostspec'] + : 'localhost'; + if ($dsn['port']) { + $params[0] .= ':' . $dsn['port']; + } + } + $params[] = $dsn['username'] ? $dsn['username'] : null; + $params[] = $dsn['password'] ? $dsn['password'] : null; + + if (!$persistent) { + if (isset($dsn['new_link']) + && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) + { + $params[] = true; + } else { + $params[] = false; + } + } + if (version_compare(phpversion(), '4.3.0', '>=')) { + $params[] = isset($dsn['client_flags']) + ? $dsn['client_flags'] : null; + } + + $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + if (($err = @mysql_error()) != '') { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $err); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + } + + if ($dsn['database']) { + if (!@mysql_select_db($dsn['database'], $this->connection)) { + return $this->mysqlRaiseError(); + } + $this->_db = $dsn['database']; + } + + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @mysql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * Generally uses mysql_query(). If you want to use + * mysql_unbuffered_query() set the "result_buffering" option to 0 using + * setOptions(). This option was added in Release 1.7.0. + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mysql_query('SET AUTOCOMMIT=0', $this->connection); + $result = @mysql_query('BEGIN', $this->connection); + if (!$result) { + return $this->mysqlRaiseError(); + } + } + $this->transaction_opcount++; + } + if (!$this->options['result_buffering']) { + $result = @mysql_unbuffered_query($query, $this->connection); + } else { + $result = @mysql_query($query, $this->connection); + } + if (!$result) { + return $this->mysqlRaiseError(); + } + if (is_resource($result)) { + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mysql result pointer to the next available result + * + * This method has not been implemented yet. + * + * @param a valid sql result resource + * + * @return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@mysql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mysql_fetch_array($result, MYSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mysql_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @mysql_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @mysql_num_fields($result); + if (!$cols) { + return $this->mysqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @mysql_num_rows($result); + if ($rows === null) { + return $this->mysqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('COMMIT', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('ROLLBACK', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return @mysql_affected_rows($this->connection); + } else { + return 0; + } + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_mysql::createSequence(), DB_mysql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("UPDATE ${seqname} ". + 'SET id=LAST_INSERT_ID(id+1)'); + $this->popErrorHandling(); + if ($result === DB_OK) { + // COMMON CASE + $id = @mysql_insert_id($this->connection); + if ($id != 0) { + return $id; + } + // EMPTY SEQ TABLE + // Sequence table must be empty for some reason, so fill + // it and return 1 and obtain a user-level lock + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + if ($result == 0) { + // Failed to get the lock + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + // add the default value + $result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + + // Release the lock + $result = $this->getOne('SELECT RELEASE_LOCK(' + . "'${seqname}_lock')"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + // We know what the result will be, so no need to try again + return 1; + + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + // ONDEMAND TABLE CREATION + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + $repeat = 1; + } + + } elseif (DB::isError($result) && + $result->getCode() == DB_ERROR_ALREADY_EXISTS) + { + // BACKWARDS COMPAT + // see _BCsequence() comment + $result = $this->_BCsequence($seqname); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $repeat = 1; + } + } while ($repeat); + + return $this->raiseError($result); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_mysql::nextID(), DB_mysql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query('CREATE TABLE ' . $seqname + . ' (id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,' + . ' PRIMARY KEY(id))'); + if (DB::isError($res)) { + return $res; + } + // insert yields value 1, nextId call will generate ID 2 + $res = $this->query("INSERT INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($res)) { + return $res; + } + // so reset to zero + return $this->query("UPDATE ${seqname} SET id = 0"); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_mysql::nextID(), DB_mysql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ _BCsequence() + + /** + * Backwards compatibility with old sequence emulation implementation + * (clean up the dupes) + * + * @param string $seqname the sequence name to clean up + * + * @return bool true on success. A DB_Error object on failure. + * + * @access private + */ + function _BCsequence($seqname) + { + // Obtain a user-level lock... this will release any previous + // application locks, but unlike LOCK TABLES, it does not abort + // the current transaction and is much less frequently used. + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $result; + } + if ($result == 0) { + // Failed to get the lock, can't do the conversion, bail + // with a DB_ERROR_NOT_LOCKED error + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + $highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}"); + if (DB::isError($highest_id)) { + return $highest_id; + } + // This should kill all rows except the highest + // We should probably do something if $highest_id isn't + // numeric, but I'm at a loss as how to handle that... + $result = $this->query('DELETE FROM ' . $seqname + . " WHERE id <> $highest_id"); + if (DB::isError($result)) { + return $result; + } + + // If another thread has been waiting for this lock, + // it will go thru the above procedure, but will have no + // real effect + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $result; + } + return true; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * MySQL can't handle the backtick character (<kbd>`</kbd>) in + * table or column names. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @see DB_common::quoteIdentifier() + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '`' . $str . '`'; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + */ + function quote($str) + { + return $this->quoteSmart($str); + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + if (function_exists('mysql_real_escape_string')) { + return @mysql_real_escape_string($str, $this->connection); + } else { + return @mysql_escape_string($str); + } + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * This little hack lets you know how many rows were deleted + * when running a "DELETE FROM table" query. Only implemented + * if the DB_PORTABILITY_DELETE_COUNT portability option is on. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + * @see DB_common::setOption() + */ + function modifyQuery($query) + { + if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { + // "DELETE FROM table" gives 0 affected rows in MySQL. + // This little hack lets you know how many rows were deleted. + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { + $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', + 'DELETE FROM \1 WHERE 1=1', $query); + } + } + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if (DB::isManip($query)) { + return $query . " LIMIT $count"; + } else { + return $query . " LIMIT $from, $count"; + } + } + + // }}} + // {{{ mysqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_mysql::errorNative(), DB_common::errorCode() + */ + function mysqlRaiseError($errno = null) + { + if ($errno === null) { + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map[1022] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL; + $this->errorcode_map[1062] = DB_ERROR_CONSTRAINT; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS; + } + $errno = $this->errorCode(mysql_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @mysql_errno($this->connection) . ' ** ' . + @mysql_error($this->connection)); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code + */ + function errorNative() + { + return @mysql_errno($this->connection); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @mysql_list_fields($this->dsn['database'], + $result, $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mysql_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $case_func(@mysql_field_table($id, $i)), + 'name' => $case_func(@mysql_field_name($id, $i)), + 'type' => @mysql_field_type($id, $i), + 'len' => @mysql_field_len($id, $i), + 'flags' => @mysql_field_flags($id, $i), + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mysql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SHOW TABLES'; + case 'users': + return 'SELECT DISTINCT User FROM mysql.user'; + case 'databases': + return 'SHOW DATABASES'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/DB/pgsql.php b/plugins/tidypics/lib/phpFlickr/PEAR/DB/pgsql.php new file mode 100644 index 00000000..1e58f48d --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/DB/pgsql.php @@ -0,0 +1,1097 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * The PEAR DB driver for PHP's pgsql extension + * for interacting with PostgreSQL databases + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.0 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_0.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category Database + * @package DB + * @author Rui Hirokawa <hirokawa@php.net> + * @author Stig Bakken <ssb@php.net> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: pgsql.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's pgsql extension + * for interacting with PostgreSQL databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Rui Hirokawa <hirokawa@php.net> + * @author Stig Bakken <ssb@php.net> + * @author Daniel Convissor <danielc@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_pgsql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'pgsql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'pgsql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => '4.3.0', + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => true, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The number of rows affected by a data manipulation query + * @var integer + */ + var $affected = 0; + + /** + * The current row being looked at in fetchInto() + * @var array + * @access private + */ + var $row = array(); + + /** + * The number of rows in a given result set + * @var array + * @access private + */ + var $_num_rows = array(); + + + // }}} + // {{{ constructor + + /** + * This constructor calls <kbd>$this->DB_common()</kbd> + * + * @return void + */ + function DB_pgsql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's pgsql driver supports the following extra DSN options: + * + connect_timeout How many seconds to wait for a connection to + * be established. Available since PEAR DB 1.7.0. + * + new_link If set to true, causes subsequent calls to + * connect() to return a new connection link + * instead of the existing one. WARNING: this is + * not portable to other DBMS's. Available only + * if PHP is >= 4.3.0 and PEAR DB is >= 1.7.0. + * + options Command line options to be sent to the server. + * Available since PEAR DB 1.6.4. + * + service Specifies a service name in pg_service.conf that + * holds additional connection parameters. + * Available since PEAR DB 1.7.0. + * + sslmode How should SSL be used when connecting? Values: + * disable, allow, prefer or require. + * Available since PEAR DB 1.7.0. + * + tty This was used to specify where to send server + * debug output. Available since PEAR DB 1.6.4. + * + * Example of connecting to a new link via a socket: + * <code> + * require_once 'DB.php'; + * + * $dsn = 'pgsql://user:pass@unix(/tmp)/dbname?new_link=true'; + * $options = array( + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * </code> + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @link http://www.postgresql.org/docs/current/static/libpq.html#LIBPQ-CONNECT + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('pgsql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $protocol = $dsn['protocol'] ? $dsn['protocol'] : 'tcp'; + + $params = array(''); + if ($protocol == 'tcp') { + if ($dsn['hostspec']) { + $params[0] .= 'host=' . $dsn['hostspec']; + } + if ($dsn['port']) { + $params[0] .= ' port=' . $dsn['port']; + } + } elseif ($protocol == 'unix') { + // Allow for pg socket in non-standard locations. + if ($dsn['socket']) { + $params[0] .= 'host=' . $dsn['socket']; + } + if ($dsn['port']) { + $params[0] .= ' port=' . $dsn['port']; + } + } + if ($dsn['database']) { + $params[0] .= ' dbname=\'' . addslashes($dsn['database']) . '\''; + } + if ($dsn['username']) { + $params[0] .= ' user=\'' . addslashes($dsn['username']) . '\''; + } + if ($dsn['password']) { + $params[0] .= ' password=\'' . addslashes($dsn['password']) . '\''; + } + if (!empty($dsn['options'])) { + $params[0] .= ' options=' . $dsn['options']; + } + if (!empty($dsn['tty'])) { + $params[0] .= ' tty=' . $dsn['tty']; + } + if (!empty($dsn['connect_timeout'])) { + $params[0] .= ' connect_timeout=' . $dsn['connect_timeout']; + } + if (!empty($dsn['sslmode'])) { + $params[0] .= ' sslmode=' . $dsn['sslmode']; + } + if (!empty($dsn['service'])) { + $params[0] .= ' service=' . $dsn['service']; + } + + if (isset($dsn['new_link']) + && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) + { + if (version_compare(phpversion(), '4.3.0', '>=')) { + $params[] = PGSQL_CONNECT_FORCE_NEW; + } + } + + $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @pg_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @pg_exec($this->connection, 'begin;'); + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @pg_exec($this->connection, $query); + if (!$result) { + return $this->pgsqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + if ($ismanip) { + $this->affected = @pg_affected_rows($result); + return DB_OK; + } elseif (preg_match('/^\s*\(*\s*(SELECT|EXPLAIN|SHOW)\s/si', $query)) { + /* PostgreSQL commands: + ABORT, ALTER, BEGIN, CLOSE, CLUSTER, COMMIT, COPY, + CREATE, DECLARE, DELETE, DROP TABLE, EXPLAIN, FETCH, + GRANT, INSERT, LISTEN, LOAD, LOCK, MOVE, NOTIFY, RESET, + REVOKE, ROLLBACK, SELECT, SELECT INTO, SET, SHOW, + UNLISTEN, UPDATE, VACUUM + */ + $this->row[(int)$result] = 0; // reset the row counter. + $numrows = $this->numRows($result); + if (is_object($numrows)) { + return $numrows; + } + $this->_num_rows[(int)$result] = $numrows; + $this->affected = 0; + return $result; + } else { + $this->affected = 0; + return DB_OK; + } + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal pgsql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + $result_int = (int)$result; + $rownum = ($rownum !== null) ? $rownum : $this->row[$result_int]; + if ($rownum >= $this->_num_rows[$result_int]) { + return null; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @pg_fetch_array($result, $rownum, PGSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @pg_fetch_row($result, $rownum); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + $this->row[$result_int] = ++$rownum; + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + if (is_resource($result)) { + unset($this->row[(int)$result]); + unset($this->_num_rows[(int)$result]); + $this->affected = 0; + return @pg_freeresult($result); + } + return false; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($str) + { + return $this->quoteSmart($str); + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + * + null = the string <samp>NULL</samp> + * + boolean = string <samp>TRUE</samp> or <samp>FALSE</samp> + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data escaped according to MySQL's settings + * then encapsulated between single quotes + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'TRUE' : 'FALSE'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * {@internal PostgreSQL treats a backslash as an escape character, + * so they are escaped as well. + * + * Not using pg_escape_string() yet because it requires PostgreSQL + * to be at version 7.2 or greater.}} + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + return str_replace("'", "''", str_replace('\\', '\\\\', $str)); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @pg_numfields($result); + if (!$cols) { + return $this->pgsqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @pg_numrows($result); + if ($rows === null) { + return $this->pgsqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + // (disabled) hack to shut up error messages from libpq.a + //@fclose(@fopen("php://stderr", "w")); + $result = @pg_exec($this->connection, 'end;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + $result = @pg_exec($this->connection, 'abort;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + return $this->affected; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_pgsql::createSequence(), DB_pgsql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = false; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result =& $this->query("SELECT NEXTVAL('${seqname}')"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = true; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->createSequence($seq_name); + $this->popErrorHandling(); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + $result->free(); + return $arr[0]; + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_pgsql::nextID(), DB_pgsql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $result = $this->query("CREATE SEQUENCE ${seqname}"); + return $result; + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_pgsql::nextID(), DB_pgsql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP SEQUENCE ' + . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return "$query LIMIT $count OFFSET $from"; + } + + // }}} + // {{{ pgsqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_pgsql::errorNative(), DB_pgsql::errorCode() + */ + function pgsqlRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + return $this->raiseError($errno, null, null, null, $native); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error message produced by the last query + * + * {@internal Error messages are used instead of error codes + * in order to support older versions of PostgreSQL.}} + * + * @return string the DBMS' error message + */ + function errorNative() + { + return @pg_errormessage($this->connection); + } + + // }}} + // {{{ errorCode() + + /** + * Determines PEAR::DB error code from the database's text error message. + * + * @param string $errormsg error message returned from the database + * @return integer an error number from a DB error constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/(relation|sequence|table).*does not exist|class .* not found/i' + => DB_ERROR_NOSUCHTABLE, + '/index .* does not exist/' + => DB_ERROR_NOT_FOUND, + '/column .* does not exist/i' + => DB_ERROR_NOSUCHFIELD, + '/relation .* already exists/i' + => DB_ERROR_ALREADY_EXISTS, + '/(divide|division) by zero$/i' + => DB_ERROR_DIVZERO, + '/pg_atoi: error in .*: can\'t parse /i' + => DB_ERROR_INVALID_NUMBER, + '/invalid input syntax for( type)? (integer|numeric)/i' + => DB_ERROR_INVALID_NUMBER, + '/value .* is out of range for type \w*int/i' + => DB_ERROR_INVALID_NUMBER, + '/integer out of range/i' + => DB_ERROR_INVALID_NUMBER, + '/value too long for type character/i' + => DB_ERROR_INVALID, + '/attribute .* not found|relation .* does not have attribute/i' + => DB_ERROR_NOSUCHFIELD, + '/column .* specified in USING clause does not exist in (left|right) table/i' + => DB_ERROR_NOSUCHFIELD, + '/parser: parse error at or near/i' + => DB_ERROR_SYNTAX, + '/syntax error at/' + => DB_ERROR_SYNTAX, + '/column reference .* is ambiguous/i' + => DB_ERROR_SYNTAX, + '/permission denied/' + => DB_ERROR_ACCESS_VIOLATION, + '/violates not-null constraint/' + => DB_ERROR_CONSTRAINT_NOT_NULL, + '/violates [\w ]+ constraint/' + => DB_ERROR_CONSTRAINT, + '/referential integrity violation/' + => DB_ERROR_CONSTRAINT, + '/more expressions than target columns/i' + => DB_ERROR_VALUE_COUNT_ON_ROW, + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if <var>$result</var> + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @pg_exec($this->connection, "SELECT * FROM $result LIMIT 0"); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->pgsqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @pg_numfields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $got_string ? $case_func($result) : '', + 'name' => $case_func(@pg_fieldname($id, $i)), + 'type' => @pg_fieldtype($id, $i), + 'len' => @pg_fieldsize($id, $i), + 'flags' => $got_string + ? $this->_pgFieldFlags($id, $i, $result) + : '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @pg_freeresult($id); + } + return $res; + } + + // }}} + // {{{ _pgFieldFlags() + + /** + * Get a column's flags + * + * Supports "not_null", "default_value", "primary_key", "unique_key" + * and "multiple_key". The default value is passed through + * rawurlencode() in case there are spaces in it. + * + * @param int $resource the PostgreSQL result identifier + * @param int $num_field the field number + * + * @return string the flags + * + * @access private + */ + function _pgFieldFlags($resource, $num_field, $table_name) + { + $field_name = @pg_fieldname($resource, $num_field); + + $result = @pg_exec($this->connection, "SELECT f.attnotnull, f.atthasdef + FROM pg_attribute f, pg_class tab, pg_type typ + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + if (@pg_numrows($result) > 0) { + $row = @pg_fetch_row($result, 0); + $flags = ($row[0] == 't') ? 'not_null ' : ''; + + if ($row[1] == 't') { + $result = @pg_exec($this->connection, "SELECT a.adsrc + FROM pg_attribute f, pg_class tab, pg_type typ, pg_attrdef a + WHERE tab.relname = typ.typname AND typ.typrelid = f.attrelid + AND f.attrelid = a.adrelid AND f.attname = '$field_name' + AND tab.relname = '$table_name' AND f.attnum = a.adnum"); + $row = @pg_fetch_row($result, 0); + $num = preg_replace("/'(.*)'::\w+/", "\\1", $row[0]); + $flags .= 'default_' . rawurlencode($num) . ' '; + } + } else { + $flags = ''; + } + $result = @pg_exec($this->connection, "SELECT i.indisunique, i.indisprimary, i.indkey + FROM pg_attribute f, pg_class tab, pg_type typ, pg_index i + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attrelid = i.indrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + $count = @pg_numrows($result); + + for ($i = 0; $i < $count ; $i++) { + $row = @pg_fetch_row($result, $i); + $keys = explode(' ', $row[2]); + + if (in_array($num_field + 1, $keys)) { + $flags .= ($row[0] == 't' && $row[1] == 'f') ? 'unique_key ' : ''; + $flags .= ($row[1] == 't') ? 'primary_key ' : ''; + if (count($keys) > 1) + $flags .= 'multiple_key '; + } + } + + return trim($flags); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT c.relname AS "Name"' + . ' FROM pg_class c, pg_user u' + . ' WHERE c.relowner = u.usesysid' + . " AND c.relkind = 'r'" + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_views' + . ' WHERE viewname = c.relname)' + . " AND c.relname !~ '^(pg_|sql_)'" + . ' UNION' + . ' SELECT c.relname AS "Name"' + . ' FROM pg_class c' + . " WHERE c.relkind = 'r'" + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_views' + . ' WHERE viewname = c.relname)' + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_user' + . ' WHERE usesysid = c.relowner)' + . " AND c.relname !~ '^pg_'"; + case 'schema.tables': + return "SELECT schemaname || '.' || tablename" + . ' AS "Name"' + . ' FROM pg_catalog.pg_tables' + . ' WHERE schemaname NOT IN' + . " ('pg_catalog', 'information_schema', 'pg_toast')"; + case 'views': + // Table cols: viewname | viewowner | definition + return 'SELECT viewname from pg_views WHERE schemaname' + . " NOT IN ('information_schema', 'pg_catalog')"; + case 'users': + // cols: usename |usesysid|usecreatedb|usetrace|usesuper|usecatupd|passwd |valuntil + return 'SELECT usename FROM pg_user'; + case 'databases': + return 'SELECT datname FROM pg_database'; + case 'functions': + case 'procedures': + return 'SELECT proname FROM pg_proc WHERE proowner <> 1'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/DB/storage.php b/plugins/tidypics/lib/phpFlickr/PEAR/DB/storage.php new file mode 100644 index 00000000..f597b36d --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/DB/storage.php @@ -0,0 +1,504 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * Provides an object interface to a table row + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.0 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_0.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category Database + * @package DB + * @author Stig Bakken <stig@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: storage.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB class so it can be extended from + */ +require_once 'DB.php'; + +/** + * Provides an object interface to a table row + * + * It lets you add, delete and change rows using objects rather than SQL + * statements. + * + * @category Database + * @package DB + * @author Stig Bakken <stig@php.net> + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_storage extends PEAR +{ + // {{{ properties + + /** the name of the table (or view, if the backend database supports + updates in views) we hold data from */ + var $_table = null; + + /** which column(s) in the table contains primary keys, can be a + string for single-column primary keys, or an array of strings + for multiple-column primary keys */ + var $_keycolumn = null; + + /** DB connection handle used for all transactions */ + var $_dbh = null; + + /** an assoc with the names of database fields stored as properties + in this object */ + var $_properties = array(); + + /** an assoc with the names of the properties in this object that + have been changed since they were fetched from the database */ + var $_changes = array(); + + /** flag that decides if data in this object can be changed. + objects that don't have their table's key column in their + property lists will be flagged as read-only. */ + var $_readonly = false; + + /** function or method that implements a validator for fields that + are set, this validator function returns true if the field is + valid, false if not */ + var $_validator = null; + + // }}} + // {{{ constructor + + /** + * Constructor + * + * @param $table string the name of the database table + * + * @param $keycolumn mixed string with name of key column, or array of + * strings if the table has a primary key of more than one column + * + * @param $dbh object database connection object + * + * @param $validator mixed function or method used to validate + * each new value, called with three parameters: the name of the + * field/column that is changing, a reference to the new value and + * a reference to this object + * + */ + function DB_storage($table, $keycolumn, &$dbh, $validator = null) + { + $this->PEAR('DB_Error'); + $this->_table = $table; + $this->_keycolumn = $keycolumn; + $this->_dbh = $dbh; + $this->_readonly = false; + $this->_validator = $validator; + } + + // }}} + // {{{ _makeWhere() + + /** + * Utility method to build a "WHERE" clause to locate ourselves in + * the table. + * + * XXX future improvement: use rowids? + * + * @access private + */ + function _makeWhere($keyval = null) + { + if (is_array($this->_keycolumn)) { + if ($keyval === null) { + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + $keyval[] = $this->{$this->_keycolumn[$i]}; + } + } + $whereclause = ''; + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + if ($i > 0) { + $whereclause .= ' AND '; + } + $whereclause .= $this->_keycolumn[$i]; + if (is_null($keyval[$i])) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval[$i]); + } + } + } else { + if ($keyval === null) { + $keyval = @$this->{$this->_keycolumn}; + } + $whereclause = $this->_keycolumn; + if (is_null($keyval)) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval); + } + } + return $whereclause; + } + + // }}} + // {{{ setup() + + /** + * Method used to initialize a DB_storage object from the + * configured table. + * + * @param $keyval mixed the key[s] of the row to fetch (string or array) + * + * @return int DB_OK on success, a DB error if not + */ + function setup($keyval) + { + $whereclause = $this->_makeWhere($keyval); + $query = 'SELECT * FROM ' . $this->_table . ' WHERE ' . $whereclause; + $sth = $this->_dbh->query($query); + if (DB::isError($sth)) { + return $sth; + } + $row = $sth->fetchRow(DB_FETCHMODE_ASSOC); + if (DB::isError($row)) { + return $row; + } + if (!$row) { + return $this->raiseError(null, DB_ERROR_NOT_FOUND, null, null, + $query, null, true); + } + foreach ($row as $key => $value) { + $this->_properties[$key] = true; + $this->$key = $value; + } + return DB_OK; + } + + // }}} + // {{{ insert() + + /** + * Create a new (empty) row in the configured table for this + * object. + */ + function insert($newpk) + { + if (is_array($this->_keycolumn)) { + $primarykey = $this->_keycolumn; + } else { + $primarykey = array($this->_keycolumn); + } + settype($newpk, "array"); + for ($i = 0; $i < sizeof($primarykey); $i++) { + $pkvals[] = $this->_dbh->quote($newpk[$i]); + } + + $sth = $this->_dbh->query("INSERT INTO $this->_table (" . + implode(",", $primarykey) . ") VALUES(" . + implode(",", $pkvals) . ")"); + if (DB::isError($sth)) { + return $sth; + } + if (sizeof($newpk) == 1) { + $newpk = $newpk[0]; + } + $this->setup($newpk); + } + + // }}} + // {{{ toString() + + /** + * Output a simple description of this DB_storage object. + * @return string object description + */ + function toString() + { + $info = strtolower(get_class($this)); + $info .= " (table="; + $info .= $this->_table; + $info .= ", keycolumn="; + if (is_array($this->_keycolumn)) { + $info .= "(" . implode(",", $this->_keycolumn) . ")"; + } else { + $info .= $this->_keycolumn; + } + $info .= ", dbh="; + if (is_object($this->_dbh)) { + $info .= $this->_dbh->toString(); + } else { + $info .= "null"; + } + $info .= ")"; + if (sizeof($this->_properties)) { + $info .= " [loaded, key="; + $keyname = $this->_keycolumn; + if (is_array($keyname)) { + $info .= "("; + for ($i = 0; $i < sizeof($keyname); $i++) { + if ($i > 0) { + $info .= ","; + } + $info .= $this->$keyname[$i]; + } + $info .= ")"; + } else { + $info .= $this->$keyname; + } + $info .= "]"; + } + if (sizeof($this->_changes)) { + $info .= " [modified]"; + } + return $info; + } + + // }}} + // {{{ dump() + + /** + * Dump the contents of this object to "standard output". + */ + function dump() + { + foreach ($this->_properties as $prop => $foo) { + print "$prop = "; + print htmlentities($this->$prop); + print "<br />\n"; + } + } + + // }}} + // {{{ &create() + + /** + * Static method used to create new DB storage objects. + * @param $data assoc. array where the keys are the names + * of properties/columns + * @return object a new instance of DB_storage or a subclass of it + */ + function &create($table, &$data) + { + $classname = strtolower(get_class($this)); + $obj =& new $classname($table); + foreach ($data as $name => $value) { + $obj->_properties[$name] = true; + $obj->$name = &$value; + } + return $obj; + } + + // }}} + // {{{ loadFromQuery() + + /** + * Loads data into this object from the given query. If this + * object already contains table data, changes will be saved and + * the object re-initialized first. + * + * @param $query SQL query + * + * @param $params parameter list in case you want to use + * prepare/execute mode + * + * @return int DB_OK on success, DB_WARNING_READ_ONLY if the + * returned object is read-only (because the object's specified + * key column was not found among the columns returned by $query), + * or another DB error code in case of errors. + */ +// XXX commented out for now +/* + function loadFromQuery($query, $params = null) + { + if (sizeof($this->_properties)) { + if (sizeof($this->_changes)) { + $this->store(); + $this->_changes = array(); + } + $this->_properties = array(); + } + $rowdata = $this->_dbh->getRow($query, DB_FETCHMODE_ASSOC, $params); + if (DB::isError($rowdata)) { + return $rowdata; + } + reset($rowdata); + $found_keycolumn = false; + while (list($key, $value) = each($rowdata)) { + if ($key == $this->_keycolumn) { + $found_keycolumn = true; + } + $this->_properties[$key] = true; + $this->$key = &$value; + unset($value); // have to unset, or all properties will + // refer to the same value + } + if (!$found_keycolumn) { + $this->_readonly = true; + return DB_WARNING_READ_ONLY; + } + return DB_OK; + } + */ + + // }}} + // {{{ set() + + /** + * Modify an attriute value. + */ + function set($property, $newvalue) + { + // only change if $property is known and object is not + // read-only + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + if (@isset($this->_properties[$property])) { + if (empty($this->_validator)) { + $valid = true; + } else { + $valid = @call_user_func($this->_validator, + $this->_table, + $property, + $newvalue, + $this->$property, + $this); + } + if ($valid) { + $this->$property = $newvalue; + if (empty($this->_changes[$property])) { + $this->_changes[$property] = 0; + } else { + $this->_changes[$property]++; + } + } else { + return $this->raiseError(null, DB_ERROR_INVALID, null, + null, "invalid field: $property", + null, true); + } + return true; + } + return $this->raiseError(null, DB_ERROR_NOSUCHFIELD, null, + null, "unknown field: $property", + null, true); + } + + // }}} + // {{{ &get() + + /** + * Fetch an attribute value. + * + * @param string attribute name + * + * @return attribute contents, or null if the attribute name is + * unknown + */ + function &get($property) + { + // only return if $property is known + if (isset($this->_properties[$property])) { + return $this->$property; + } + $tmp = null; + return $tmp; + } + + // }}} + // {{{ _DB_storage() + + /** + * Destructor, calls DB_storage::store() if there are changes + * that are to be kept. + */ + function _DB_storage() + { + if (sizeof($this->_changes)) { + $this->store(); + } + $this->_properties = array(); + $this->_changes = array(); + $this->_table = null; + } + + // }}} + // {{{ store() + + /** + * Stores changes to this object in the database. + * + * @return DB_OK or a DB error + */ + function store() + { + foreach ($this->_changes as $name => $foo) { + $params[] = &$this->$name; + $vars[] = $name . ' = ?'; + } + if ($vars) { + $query = 'UPDATE ' . $this->_table . ' SET ' . + implode(', ', $vars) . ' WHERE ' . + $this->_makeWhere(); + $stmt = $this->_dbh->prepare($query); + $res = $this->_dbh->execute($stmt, $params); + if (DB::isError($res)) { + return $res; + } + $this->_changes = array(); + } + return DB_OK; + } + + // }}} + // {{{ remove() + + /** + * Remove the row represented by this object from the database. + * + * @return mixed DB_OK or a DB error + */ + function remove() + { + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + $query = 'DELETE FROM ' . $this->_table .' WHERE '. + $this->_makeWhere(); + $res = $this->_dbh->query($query); + if (DB::isError($res)) { + return $res; + } + foreach ($this->_properties as $prop => $foo) { + unset($this->$prop); + } + $this->_properties = array(); + $this->_changes = array(); + return DB_OK; + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request.php b/plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request.php new file mode 100644 index 00000000..55e227b3 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request.php @@ -0,0 +1,1484 @@ +<?php +/** + * Class for performing HTTP requests + * + * PHP versions 4 and 5 + * + * LICENSE: + * + * Copyright (c) 2002-2007, Richard Heyes + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * o The names of the authors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request + * @author Richard Heyes <richard@phpguru.org> + * @author Alexey Borzov <avb@php.net> + * @copyright 2002-2007 Richard Heyes + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id: Request.php 127 2008-01-17 20:21:37Z dcoulter $ + * @link http://pear.php.net/package/HTTP_Request/ + */ + +/** + * PEAR and PEAR_Error classes (for error handling) + */ +require_once 'PEAR.php'; +/** + * Socket class + */ +require_once 'Net/Socket.php'; +/** + * URL handling class + */ +require_once 'Net/URL.php'; + +/**#@+ + * Constants for HTTP request methods + */ +define('HTTP_REQUEST_METHOD_GET', 'GET', true); +define('HTTP_REQUEST_METHOD_HEAD', 'HEAD', true); +define('HTTP_REQUEST_METHOD_POST', 'POST', true); +define('HTTP_REQUEST_METHOD_PUT', 'PUT', true); +define('HTTP_REQUEST_METHOD_DELETE', 'DELETE', true); +define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true); +define('HTTP_REQUEST_METHOD_TRACE', 'TRACE', true); +/**#@-*/ + +/**#@+ + * Constants for HTTP request error codes + */ +define('HTTP_REQUEST_ERROR_FILE', 1); +define('HTTP_REQUEST_ERROR_URL', 2); +define('HTTP_REQUEST_ERROR_PROXY', 4); +define('HTTP_REQUEST_ERROR_REDIRECTS', 8); +define('HTTP_REQUEST_ERROR_RESPONSE', 16); +define('HTTP_REQUEST_ERROR_GZIP_METHOD', 32); +define('HTTP_REQUEST_ERROR_GZIP_READ', 64); +define('HTTP_REQUEST_ERROR_GZIP_DATA', 128); +define('HTTP_REQUEST_ERROR_GZIP_CRC', 256); +/**#@-*/ + +/**#@+ + * Constants for HTTP protocol versions + */ +define('HTTP_REQUEST_HTTP_VER_1_0', '1.0', true); +define('HTTP_REQUEST_HTTP_VER_1_1', '1.1', true); +/**#@-*/ + +if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { + /** + * Whether string functions are overloaded by their mbstring equivalents + */ + define('HTTP_REQUEST_MBSTRING', true); +} else { + /** + * @ignore + */ + define('HTTP_REQUEST_MBSTRING', false); +} + +/** + * Class for performing HTTP requests + * + * Simple example (fetches yahoo.com and displays it): + * <code> + * $a = &new HTTP_Request('http://www.yahoo.com/'); + * $a->sendRequest(); + * echo $a->getResponseBody(); + * </code> + * + * @category HTTP + * @package HTTP_Request + * @author Richard Heyes <richard@phpguru.org> + * @author Alexey Borzov <avb@php.net> + * @version Release: 1.4.2 + */ +class HTTP_Request +{ + /**#@+ + * @access private + */ + /** + * Instance of Net_URL + * @var Net_URL + */ + var $_url; + + /** + * Type of request + * @var string + */ + var $_method; + + /** + * HTTP Version + * @var string + */ + var $_http; + + /** + * Request headers + * @var array + */ + var $_requestHeaders; + + /** + * Basic Auth Username + * @var string + */ + var $_user; + + /** + * Basic Auth Password + * @var string + */ + var $_pass; + + /** + * Socket object + * @var Net_Socket + */ + var $_sock; + + /** + * Proxy server + * @var string + */ + var $_proxy_host; + + /** + * Proxy port + * @var integer + */ + var $_proxy_port; + + /** + * Proxy username + * @var string + */ + var $_proxy_user; + + /** + * Proxy password + * @var string + */ + var $_proxy_pass; + + /** + * Post data + * @var array + */ + var $_postData; + + /** + * Request body + * @var string + */ + var $_body; + + /** + * A list of methods that MUST NOT have a request body, per RFC 2616 + * @var array + */ + var $_bodyDisallowed = array('TRACE'); + + /** + * Files to post + * @var array + */ + var $_postFiles = array(); + + /** + * Connection timeout. + * @var float + */ + var $_timeout; + + /** + * HTTP_Response object + * @var HTTP_Response + */ + var $_response; + + /** + * Whether to allow redirects + * @var boolean + */ + var $_allowRedirects; + + /** + * Maximum redirects allowed + * @var integer + */ + var $_maxRedirects; + + /** + * Current number of redirects + * @var integer + */ + var $_redirects; + + /** + * Whether to append brackets [] to array variables + * @var bool + */ + var $_useBrackets = true; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Whether to save response body in response object property + * @var bool + */ + var $_saveBody = true; + + /** + * Timeout for reading from socket (array(seconds, microseconds)) + * @var array + */ + var $_readTimeout = null; + + /** + * Options to pass to Net_Socket::connect. See stream_context_create + * @var array + */ + var $_socketOptions = null; + /**#@-*/ + + /** + * Constructor + * + * Sets up the object + * @param string The url to fetch/access + * @param array Associative array of parameters which can have the following keys: + * <ul> + * <li>method - Method to use, GET, POST etc (string)</li> + * <li>http - HTTP Version to use, 1.0 or 1.1 (string)</li> + * <li>user - Basic Auth username (string)</li> + * <li>pass - Basic Auth password (string)</li> + * <li>proxy_host - Proxy server host (string)</li> + * <li>proxy_port - Proxy server port (integer)</li> + * <li>proxy_user - Proxy auth username (string)</li> + * <li>proxy_pass - Proxy auth password (string)</li> + * <li>timeout - Connection timeout in seconds (float)</li> + * <li>allowRedirects - Whether to follow redirects or not (bool)</li> + * <li>maxRedirects - Max number of redirects to follow (integer)</li> + * <li>useBrackets - Whether to append [] to array variable names (bool)</li> + * <li>saveBody - Whether to save response body in response object property (bool)</li> + * <li>readTimeout - Timeout for reading / writing data over the socket (array (seconds, microseconds))</li> + * <li>socketOptions - Options to pass to Net_Socket object (array)</li> + * </ul> + * @access public + */ + function HTTP_Request($url = '', $params = array()) + { + $this->_method = HTTP_REQUEST_METHOD_GET; + $this->_http = HTTP_REQUEST_HTTP_VER_1_1; + $this->_requestHeaders = array(); + $this->_postData = array(); + $this->_body = null; + + $this->_user = null; + $this->_pass = null; + + $this->_proxy_host = null; + $this->_proxy_port = null; + $this->_proxy_user = null; + $this->_proxy_pass = null; + + $this->_allowRedirects = false; + $this->_maxRedirects = 3; + $this->_redirects = 0; + + $this->_timeout = null; + $this->_response = null; + + foreach ($params as $key => $value) { + $this->{'_' . $key} = $value; + } + + if (!empty($url)) { + $this->setURL($url); + } + + // Default useragent + $this->addHeader('User-Agent', 'PEAR HTTP_Request class ( http://pear.php.net/ )'); + + // We don't do keep-alives by default + $this->addHeader('Connection', 'close'); + + // Basic authentication + if (!empty($this->_user)) { + $this->addHeader('Authorization', 'Basic ' . base64_encode($this->_user . ':' . $this->_pass)); + } + + // Proxy authentication (see bug #5913) + if (!empty($this->_proxy_user)) { + $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($this->_proxy_user . ':' . $this->_proxy_pass)); + } + + // Use gzip encoding if possible + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && extension_loaded('zlib')) { + $this->addHeader('Accept-Encoding', 'gzip'); + } + } + + /** + * Generates a Host header for HTTP/1.1 requests + * + * @access private + * @return string + */ + function _generateHostHeader() + { + if ($this->_url->port != 80 AND strcasecmp($this->_url->protocol, 'http') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port != 443 AND strcasecmp($this->_url->protocol, 'https') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port == 443 AND strcasecmp($this->_url->protocol, 'https') == 0 AND strpos($this->_url->url, ':443') !== false) { + $host = $this->_url->host . ':' . $this->_url->port; + + } else { + $host = $this->_url->host; + } + + return $host; + } + + /** + * Resets the object to its initial state (DEPRECATED). + * Takes the same parameters as the constructor. + * + * @param string $url The url to be requested + * @param array $params Associative array of parameters + * (see constructor for details) + * @access public + * @deprecated deprecated since 1.2, call the constructor if this is necessary + */ + function reset($url, $params = array()) + { + $this->HTTP_Request($url, $params); + } + + /** + * Sets the URL to be requested + * + * @param string The url to be requested + * @access public + */ + function setURL($url) + { + $this->_url = &new Net_URL($url, $this->_useBrackets); + + if (!empty($this->_url->user) || !empty($this->_url->pass)) { + $this->setBasicAuth($this->_url->user, $this->_url->pass); + } + + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http) { + $this->addHeader('Host', $this->_generateHostHeader()); + } + + // set '/' instead of empty path rather than check later (see bug #8662) + if (empty($this->_url->path)) { + $this->_url->path = '/'; + } + } + + /** + * Returns the current request URL + * + * @return string Current request URL + * @access public + */ + function getUrl() + { + return empty($this->_url)? '': $this->_url->getUrl(); + } + + /** + * Sets a proxy to be used + * + * @param string Proxy host + * @param int Proxy port + * @param string Proxy username + * @param string Proxy password + * @access public + */ + function setProxy($host, $port = 8080, $user = null, $pass = null) + { + $this->_proxy_host = $host; + $this->_proxy_port = $port; + $this->_proxy_user = $user; + $this->_proxy_pass = $pass; + + if (!empty($user)) { + $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + } + + /** + * Sets basic authentication parameters + * + * @param string Username + * @param string Password + */ + function setBasicAuth($user, $pass) + { + $this->_user = $user; + $this->_pass = $pass; + + $this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + + /** + * Sets the method to be used, GET, POST etc. + * + * @param string Method to use. Use the defined constants for this + * @access public + */ + function setMethod($method) + { + $this->_method = $method; + } + + /** + * Sets the HTTP version to use, 1.0 or 1.1 + * + * @param string Version to use. Use the defined constants for this + * @access public + */ + function setHttpVer($http) + { + $this->_http = $http; + } + + /** + * Adds a request header + * + * @param string Header name + * @param string Header value + * @access public + */ + function addHeader($name, $value) + { + $this->_requestHeaders[strtolower($name)] = $value; + } + + /** + * Removes a request header + * + * @param string Header name to remove + * @access public + */ + function removeHeader($name) + { + if (isset($this->_requestHeaders[strtolower($name)])) { + unset($this->_requestHeaders[strtolower($name)]); + } + } + + /** + * Adds a querystring parameter + * + * @param string Querystring parameter name + * @param string Querystring parameter value + * @param bool Whether the value is already urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + $this->_url->addQueryString($name, $value, $preencoded); + } + + /** + * Sets the querystring to literally what you supply + * + * @param string The querystring data. Should be of the format foo=bar&x=y etc + * @param bool Whether data is already urlencoded or not, default = already encoded + * @access public + */ + function addRawQueryString($querystring, $preencoded = true) + { + $this->_url->addRawQueryString($querystring, $preencoded); + } + + /** + * Adds postdata items + * + * @param string Post data name + * @param string Post data value + * @param bool Whether data is already urlencoded or not, default = not + * @access public + */ + function addPostData($name, $value, $preencoded = false) + { + if ($preencoded) { + $this->_postData[$name] = $value; + } else { + $this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value); + } + } + + /** + * Recursively applies the callback function to the value + * + * @param mixed Callback function + * @param mixed Value to process + * @access private + * @return mixed Processed value + */ + function _arrayMapRecursive($callback, $value) + { + if (!is_array($value)) { + return call_user_func($callback, $value); + } else { + $map = array(); + foreach ($value as $k => $v) { + $map[$k] = $this->_arrayMapRecursive($callback, $v); + } + return $map; + } + } + + /** + * Adds a file to upload + * + * This also changes content-type to 'multipart/form-data' for proper upload + * + * @access public + * @param string name of file-upload field + * @param mixed file name(s) + * @param mixed content-type(s) of file(s) being uploaded + * @return bool true on success + * @throws PEAR_Error + */ + function addFile($inputName, $fileName, $contentType = 'application/octet-stream') + { + if (!is_array($fileName) && !is_readable($fileName)) { + return PEAR::raiseError("File '{$fileName}' is not readable", HTTP_REQUEST_ERROR_FILE); + } elseif (is_array($fileName)) { + foreach ($fileName as $name) { + if (!is_readable($name)) { + return PEAR::raiseError("File '{$name}' is not readable", HTTP_REQUEST_ERROR_FILE); + } + } + } + $this->addHeader('Content-Type', 'multipart/form-data'); + $this->_postFiles[$inputName] = array( + 'name' => $fileName, + 'type' => $contentType + ); + return true; + } + + /** + * Adds raw postdata (DEPRECATED) + * + * @param string The data + * @param bool Whether data is preencoded or not, default = already encoded + * @access public + * @deprecated deprecated since 1.3.0, method setBody() should be used instead + */ + function addRawPostData($postdata, $preencoded = true) + { + $this->_body = $preencoded ? $postdata : urlencode($postdata); + } + + /** + * Sets the request body (for POST, PUT and similar requests) + * + * @param string Request body + * @access public + */ + function setBody($body) + { + $this->_body = $body; + } + + /** + * Clears any postdata that has been added (DEPRECATED). + * + * Useful for multiple request scenarios. + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearPostData() + { + $this->_postData = null; + } + + /** + * Appends a cookie to "Cookie:" header + * + * @param string $name cookie name + * @param string $value cookie value + * @access public + */ + function addCookie($name, $value) + { + $cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : ''; + $this->addHeader('Cookie', $cookies . $name . '=' . $value); + } + + /** + * Clears any cookies that have been added (DEPRECATED). + * + * Useful for multiple request scenarios + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearCookies() + { + $this->removeHeader('Cookie'); + } + + /** + * Sends the request + * + * @access public + * @param bool Whether to store response body in Response object property, + * set this to false if downloading a LARGE file and using a Listener + * @return mixed PEAR error on error, true otherwise + */ + function sendRequest($saveBody = true) + { + if (!is_a($this->_url, 'Net_URL')) { + return PEAR::raiseError('No URL given', HTTP_REQUEST_ERROR_URL); + } + + $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host; + $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port; + + // 4.3.0 supports SSL connections using OpenSSL. The function test determines + // we running on at least 4.3.0 + if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) { + if (isset($this->_proxy_host)) { + return PEAR::raiseError('HTTPS proxies are not supported', HTTP_REQUEST_ERROR_PROXY); + } + $host = 'ssl://' . $host; + } + + // magic quotes may fuck up file uploads and chunked response processing + $magicQuotes = ini_get('magic_quotes_runtime'); + ini_set('magic_quotes_runtime', false); + + // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive + // connection token to a proxy server... + if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) && + 'Keep-Alive' == $this->_requestHeaders['connection']) + { + $this->removeHeader('connection'); + } + + $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) || + (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']); + $sockets = &PEAR::getStaticProperty('HTTP_Request', 'sockets'); + $sockKey = $host . ':' . $port; + unset($this->_sock); + + // There is a connected socket in the "static" property? + if ($keepAlive && !empty($sockets[$sockKey]) && + !empty($sockets[$sockKey]->fp)) + { + $this->_sock =& $sockets[$sockKey]; + $err = null; + } else { + $this->_notify('connect'); + $this->_sock =& new Net_Socket(); + $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions); + } + PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest()); + + if (!PEAR::isError($err)) { + if (!empty($this->_readTimeout)) { + $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]); + } + + $this->_notify('sentRequest'); + + // Read the response + $this->_response = &new HTTP_Response($this->_sock, $this->_listeners); + $err = $this->_response->process( + $this->_saveBody && $saveBody, + HTTP_REQUEST_METHOD_HEAD != $this->_method + ); + + if ($keepAlive) { + $keepAlive = (isset($this->_response->_headers['content-length']) + || (isset($this->_response->_headers['transfer-encoding']) + && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked')); + if ($keepAlive) { + if (isset($this->_response->_headers['connection'])) { + $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive'; + } else { + $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol; + } + } + } + } + + ini_set('magic_quotes_runtime', $magicQuotes); + + if (PEAR::isError($err)) { + return $err; + } + + if (!$keepAlive) { + $this->disconnect(); + // Store the connected socket in "static" property + } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) { + $sockets[$sockKey] =& $this->_sock; + } + + // Check for redirection + if ( $this->_allowRedirects + AND $this->_redirects <= $this->_maxRedirects + AND $this->getResponseCode() > 300 + AND $this->getResponseCode() < 399 + AND !empty($this->_response->_headers['location'])) { + + + $redirect = $this->_response->_headers['location']; + + // Absolute URL + if (preg_match('/^https?:\/\//i', $redirect)) { + $this->_url = &new Net_URL($redirect); + $this->addHeader('Host', $this->_generateHostHeader()); + // Absolute path + } elseif ($redirect{0} == '/') { + $this->_url->path = $redirect; + + // Relative path + } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $redirect = Net_URL::resolvePath($redirect); + $this->_url->path = $redirect; + + // Filename, no path + } else { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $this->_url->path = $redirect; + } + + $this->_redirects++; + return $this->sendRequest($saveBody); + + // Too many redirects + } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) { + return PEAR::raiseError('Too many redirects', HTTP_REQUEST_ERROR_REDIRECTS); + } + + return true; + } + + /** + * Disconnect the socket, if connected. Only useful if using Keep-Alive. + * + * @access public + */ + function disconnect() + { + if (!empty($this->_sock) && !empty($this->_sock->fp)) { + $this->_notify('disconnect'); + $this->_sock->disconnect(); + } + } + + /** + * Returns the response code + * + * @access public + * @return mixed Response code, false if not set + */ + function getResponseCode() + { + return isset($this->_response->_code) ? $this->_response->_code : false; + } + + /** + * Returns either the named header or all if no name given + * + * @access public + * @param string The header name to return, do not set to get all headers + * @return mixed either the value of $headername (false if header is not present) + * or an array of all headers + */ + function getResponseHeader($headername = null) + { + if (!isset($headername)) { + return isset($this->_response->_headers)? $this->_response->_headers: array(); + } else { + $headername = strtolower($headername); + return isset($this->_response->_headers[$headername]) ? $this->_response->_headers[$headername] : false; + } + } + + /** + * Returns the body of the response + * + * @access public + * @return mixed response body, false if not set + */ + function getResponseBody() + { + return isset($this->_response->_body) ? $this->_response->_body : false; + } + + /** + * Returns cookies set in response + * + * @access public + * @return mixed array of response cookies, false if none are present + */ + function getResponseCookies() + { + return isset($this->_response->_cookies) ? $this->_response->_cookies : false; + } + + /** + * Builds the request string + * + * @access private + * @return string The request string + */ + function _buildRequest() + { + $separator = ini_get('arg_separator.output'); + ini_set('arg_separator.output', '&'); + $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; + ini_set('arg_separator.output', $separator); + + $host = isset($this->_proxy_host) ? $this->_url->protocol . '://' . $this->_url->host : ''; + $port = (isset($this->_proxy_host) AND $this->_url->port != 80) ? ':' . $this->_url->port : ''; + $path = $this->_url->path . $querystring; + $url = $host . $port . $path; + + if (!strlen($url)) { + $url = '/'; + } + + $request = $this->_method . ' ' . $url . ' HTTP/' . $this->_http . "\r\n"; + + if (in_array($this->_method, $this->_bodyDisallowed) || + (0 == strlen($this->_body) && (HTTP_REQUEST_METHOD_POST != $this->_method || + (empty($this->_postData) && empty($this->_postFiles))))) + { + $this->removeHeader('Content-Type'); + } else { + if (empty($this->_requestHeaders['content-type'])) { + // Add default content-type + $this->addHeader('Content-Type', 'application/x-www-form-urlencoded'); + } elseif ('multipart/form-data' == $this->_requestHeaders['content-type']) { + $boundary = 'HTTP_Request_' . md5(uniqid('request') . microtime()); + $this->addHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary); + } + } + + // Request Headers + if (!empty($this->_requestHeaders)) { + foreach ($this->_requestHeaders as $name => $value) { + $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); + $request .= $canonicalName . ': ' . $value . "\r\n"; + } + } + + // No post data or wrong method, so simply add a final CRLF + if (in_array($this->_method, $this->_bodyDisallowed) || + (HTTP_REQUEST_METHOD_POST != $this->_method && 0 == strlen($this->_body))) { + + $request .= "\r\n"; + + // Post data if it's an array + } elseif (HTTP_REQUEST_METHOD_POST == $this->_method && + (!empty($this->_postData) || !empty($this->_postFiles))) { + + // "normal" POST request + if (!isset($boundary)) { + $postdata = implode('&', array_map( + create_function('$a', 'return $a[0] . \'=\' . $a[1];'), + $this->_flattenArray('', $this->_postData) + )); + + // multipart request, probably with file uploads + } else { + $postdata = ''; + if (!empty($this->_postData)) { + $flatData = $this->_flattenArray('', $this->_postData); + foreach ($flatData as $item) { + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $item[0] . '"'; + $postdata .= "\r\n\r\n" . urldecode($item[1]) . "\r\n"; + } + } + foreach ($this->_postFiles as $name => $value) { + if (is_array($value['name'])) { + $varname = $name . ($this->_useBrackets? '[]': ''); + } else { + $varname = $name; + $value['name'] = array($value['name']); + } + foreach ($value['name'] as $key => $filename) { + $fp = fopen($filename, 'r'); + $data = fread($fp, filesize($filename)); + fclose($fp); + $basename = basename($filename); + $type = is_array($value['type'])? @$value['type'][$key]: $value['type']; + + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $varname . '"; filename="' . $basename . '"'; + $postdata .= "\r\nContent-Type: " . $type; + $postdata .= "\r\n\r\n" . $data . "\r\n"; + } + } + $postdata .= '--' . $boundary . "--\r\n"; + } + $request .= 'Content-Length: ' . + (HTTP_REQUEST_MBSTRING? mb_strlen($postdata, 'iso-8859-1'): strlen($postdata)) . + "\r\n\r\n"; + $request .= $postdata; + + // Explicitly set request body + } elseif (0 < strlen($this->_body)) { + + $request .= 'Content-Length: ' . + (HTTP_REQUEST_MBSTRING? mb_strlen($this->_body, 'iso-8859-1'): strlen($this->_body)) . + "\r\n\r\n"; + $request .= $this->_body; + + // Terminate headers with CRLF on POST request with no body, too + } else { + + $request .= "\r\n"; + } + + return $request; + } + + /** + * Helper function to change the (probably multidimensional) associative array + * into the simple one. + * + * @param string name for item + * @param mixed item's values + * @return array array with the following items: array('item name', 'item value'); + * @access private + */ + function _flattenArray($name, $values) + { + if (!is_array($values)) { + return array(array($name, $values)); + } else { + $ret = array(); + foreach ($values as $k => $v) { + if (empty($name)) { + $newName = $k; + } elseif ($this->_useBrackets) { + $newName = $name . '[' . $k . ']'; + } else { + $newName = $name; + } + $ret = array_merge($ret, $this->_flattenArray($newName, $v)); + } + return $ret; + } + } + + + /** + * Adds a Listener to the list of listeners that are notified of + * the object's events + * + * Events sent by HTTP_Request object + * - 'connect': on connection to server + * - 'sentRequest': after the request was sent + * - 'disconnect': on disconnection from server + * + * Events sent by HTTP_Response object + * - 'gotHeaders': after receiving response headers (headers are passed in $data) + * - 'tick': on receiving a part of response body (the part is passed in $data) + * - 'gzTick': on receiving a gzip-encoded part of response body (ditto) + * - 'gotBody': after receiving the response body (passes the decoded body in $data if it was gzipped) + * + * @param HTTP_Request_Listener listener to attach + * @return boolean whether the listener was successfully attached + * @access public + */ + function attach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener')) { + return false; + } + $this->_listeners[$listener->getId()] =& $listener; + return true; + } + + + /** + * Removes a Listener from the list of listeners + * + * @param HTTP_Request_Listener listener to detach + * @return boolean whether the listener was successfully detached + * @access public + */ + function detach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener') || + !isset($this->_listeners[$listener->getId()])) { + return false; + } + unset($this->_listeners[$listener->getId()]); + return true; + } + + + /** + * Notifies all registered listeners of an event. + * + * @param string Event name + * @param mixed Additional data + * @access private + * @see HTTP_Request::attach() + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } +} + + +/** + * Response class to complement the Request class + * + * @category HTTP + * @package HTTP_Request + * @author Richard Heyes <richard@phpguru.org> + * @author Alexey Borzov <avb@php.net> + * @version Release: 1.4.2 + */ +class HTTP_Response +{ + /** + * Socket object + * @var Net_Socket + */ + var $_sock; + + /** + * Protocol + * @var string + */ + var $_protocol; + + /** + * Return code + * @var string + */ + var $_code; + + /** + * Response headers + * @var array + */ + var $_headers; + + /** + * Cookies set in response + * @var array + */ + var $_cookies; + + /** + * Response body + * @var string + */ + var $_body = ''; + + /** + * Used by _readChunked(): remaining length of the current chunk + * @var string + */ + var $_chunkLength = 0; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Bytes left to read from message-body + * @var null|int + */ + var $_toRead; + + /** + * Constructor + * + * @param Net_Socket socket to read the response from + * @param array listeners attached to request + */ + function HTTP_Response(&$sock, &$listeners) + { + $this->_sock =& $sock; + $this->_listeners =& $listeners; + } + + + /** + * Processes a HTTP response + * + * This extracts response code, headers, cookies and decodes body if it + * was encoded in some way + * + * @access public + * @param bool Whether to store response body in object property, set + * this to false if downloading a LARGE file and using a Listener. + * This is assumed to be true if body is gzip-encoded. + * @param bool Whether the response can actually have a message-body. + * Will be set to false for HEAD requests. + * @throws PEAR_Error + * @return mixed true on success, PEAR_Error in case of malformed response + */ + function process($saveBody = true, $canHaveBody = true) + { + do { + $line = $this->_sock->readLine(); + if (sscanf($line, 'HTTP/%s %s', $http_version, $returncode) != 2) { + return PEAR::raiseError('Malformed response', HTTP_REQUEST_ERROR_RESPONSE); + } else { + $this->_protocol = 'HTTP/' . $http_version; + $this->_code = intval($returncode); + } + while ('' !== ($header = $this->_sock->readLine())) { + $this->_processHeader($header); + } + } while (100 == $this->_code); + + $this->_notify('gotHeaders', $this->_headers); + + // RFC 2616, section 4.4: + // 1. Any response message which "MUST NOT" include a message-body ... + // is always terminated by the first empty line after the header fields + // 3. ... If a message is received with both a + // Transfer-Encoding header field and a Content-Length header field, + // the latter MUST be ignored. + $canHaveBody = $canHaveBody && $this->_code >= 200 && + $this->_code != 204 && $this->_code != 304; + + // If response body is present, read it and decode + $chunked = isset($this->_headers['transfer-encoding']) && ('chunked' == $this->_headers['transfer-encoding']); + $gzipped = isset($this->_headers['content-encoding']) && ('gzip' == $this->_headers['content-encoding']); + $hasBody = false; + if ($canHaveBody && ($chunked || !isset($this->_headers['content-length']) || + 0 != $this->_headers['content-length'])) + { + if ($chunked || !isset($this->_headers['content-length'])) { + $this->_toRead = null; + } else { + $this->_toRead = $this->_headers['content-length']; + } + while (!$this->_sock->eof() && (is_null($this->_toRead) || 0 < $this->_toRead)) { + if ($chunked) { + $data = $this->_readChunked(); + } elseif (is_null($this->_toRead)) { + $data = $this->_sock->read(4096); + } else { + $data = $this->_sock->read(min(4096, $this->_toRead)); + $this->_toRead -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); + } + if ('' == $data) { + break; + } else { + $hasBody = true; + if ($saveBody || $gzipped) { + $this->_body .= $data; + } + $this->_notify($gzipped? 'gzTick': 'tick', $data); + } + } + } + + if ($hasBody) { + // Uncompress the body if needed + if ($gzipped) { + $body = $this->_decodeGzip($this->_body); + if (PEAR::isError($body)) { + return $body; + } + $this->_body = $body; + $this->_notify('gotBody', $this->_body); + } else { + $this->_notify('gotBody'); + } + } + return true; + } + + + /** + * Processes the response header + * + * @access private + * @param string HTTP header + */ + function _processHeader($header) + { + if (false === strpos($header, ':')) { + return; + } + list($headername, $headervalue) = explode(':', $header, 2); + $headername = strtolower($headername); + $headervalue = ltrim($headervalue); + + if ('set-cookie' != $headername) { + if (isset($this->_headers[$headername])) { + $this->_headers[$headername] .= ',' . $headervalue; + } else { + $this->_headers[$headername] = $headervalue; + } + } else { + $this->_parseCookie($headervalue); + } + } + + + /** + * Parse a Set-Cookie header to fill $_cookies array + * + * @access private + * @param string value of Set-Cookie header + */ + function _parseCookie($headervalue) + { + $cookie = array( + 'expires' => null, + 'domain' => null, + 'path' => null, + 'secure' => false + ); + + // Only a name=value pair + if (!strpos($headervalue, ';')) { + $pos = strpos($headervalue, '='); + $cookie['name'] = trim(substr($headervalue, 0, $pos)); + $cookie['value'] = trim(substr($headervalue, $pos + 1)); + + // Some optional parameters are supplied + } else { + $elements = explode(';', $headervalue); + $pos = strpos($elements[0], '='); + $cookie['name'] = trim(substr($elements[0], 0, $pos)); + $cookie['value'] = trim(substr($elements[0], $pos + 1)); + + for ($i = 1; $i < count($elements); $i++) { + if (false === strpos($elements[$i], '=')) { + $elName = trim($elements[$i]); + $elValue = null; + } else { + list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); + } + $elName = strtolower($elName); + if ('secure' == $elName) { + $cookie['secure'] = true; + } elseif ('expires' == $elName) { + $cookie['expires'] = str_replace('"', '', $elValue); + } elseif ('path' == $elName || 'domain' == $elName) { + $cookie[$elName] = urldecode($elValue); + } else { + $cookie[$elName] = $elValue; + } + } + } + $this->_cookies[] = $cookie; + } + + + /** + * Read a part of response body encoded with chunked Transfer-Encoding + * + * @access private + * @return string + */ + function _readChunked() + { + // at start of the next chunk? + if (0 == $this->_chunkLength) { + $line = $this->_sock->readLine(); + if (preg_match('/^([0-9a-f]+)/i', $line, $matches)) { + $this->_chunkLength = hexdec($matches[1]); + // Chunk with zero length indicates the end + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // make this an eof() + return ''; + } + } else { + return ''; + } + } + $data = $this->_sock->read($this->_chunkLength); + $this->_chunkLength -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // Trailing CRLF + } + return $data; + } + + + /** + * Notifies all registered listeners of an event. + * + * @param string Event name + * @param mixed Additional data + * @access private + * @see HTTP_Request::_notify() + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } + + + /** + * Decodes the message-body encoded by gzip + * + * The real decoding work is done by gzinflate() built-in function, this + * method only parses the header and checks data for compliance with + * RFC 1952 + * + * @access private + * @param string gzip-encoded data + * @return string decoded data + */ + function _decodeGzip($data) + { + if (HTTP_REQUEST_MBSTRING) { + $oldEncoding = mb_internal_encoding(); + mb_internal_encoding('iso-8859-1'); + } + $length = strlen($data); + // If it doesn't look like gzip-encoded data, don't bother + if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) { + return $data; + } + $method = ord(substr($data, 2, 1)); + if (8 != $method) { + return PEAR::raiseError('_decodeGzip(): unknown compression method', HTTP_REQUEST_ERROR_GZIP_METHOD); + } + $flags = ord(substr($data, 3, 1)); + if ($flags & 224) { + return PEAR::raiseError('_decodeGzip(): reserved bits are set', HTTP_REQUEST_ERROR_GZIP_DATA); + } + + // header is 10 bytes minimum. may be longer, though. + $headerLength = 10; + // extra fields, need to skip 'em + if ($flags & 4) { + if ($length - $headerLength - 2 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $extraLength = unpack('v', substr($data, 10, 2)); + if ($length - $headerLength - 2 - $extraLength[1] < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $headerLength += $extraLength[1] + 2; + } + // file name, need to skip that + if ($flags & 8) { + if ($length - $headerLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $filenameLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $headerLength += $filenameLength + 1; + } + // comment, need to skip that also + if ($flags & 16) { + if ($length - $headerLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $commentLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $headerLength += $commentLength + 1; + } + // have a CRC for header. let's check + if ($flags & 1) { + if ($length - $headerLength - 2 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); + $crcStored = unpack('v', substr($data, $headerLength, 2)); + if ($crcReal != $crcStored[1]) { + return PEAR::raiseError('_decodeGzip(): header CRC check failed', HTTP_REQUEST_ERROR_GZIP_CRC); + } + $headerLength += 2; + } + // unpacked data CRC and size at the end of encoded data + $tmp = unpack('V2', substr($data, -8)); + $dataCrc = $tmp[1]; + $dataSize = $tmp[2]; + + // finally, call the gzinflate() function + $unpacked = @gzinflate(substr($data, $headerLength, -8), $dataSize); + if (false === $unpacked) { + return PEAR::raiseError('_decodeGzip(): gzinflate() call failed', HTTP_REQUEST_ERROR_GZIP_READ); + } elseif ($dataSize != strlen($unpacked)) { + return PEAR::raiseError('_decodeGzip(): data size check failed', HTTP_REQUEST_ERROR_GZIP_READ); + } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { + return PEAR::raiseError('_decodeGzip(): data CRC check failed', HTTP_REQUEST_ERROR_GZIP_CRC); + } + if (HTTP_REQUEST_MBSTRING) { + mb_internal_encoding($oldEncoding); + } + return $unpacked; + } +} // End class HTTP_Response +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request/Listener.php b/plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request/Listener.php new file mode 100644 index 00000000..b0051420 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/HTTP/Request/Listener.php @@ -0,0 +1,106 @@ +<?php +/** + * Listener for HTTP_Request and HTTP_Response objects + * + * PHP versions 4 and 5 + * + * LICENSE: + * + * Copyright (c) 2002-2007, Richard Heyes + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * o The names of the authors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request + * @author Alexey Borzov <avb@php.net> + * @copyright 2002-2007 Richard Heyes + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id: Listener.php 127 2008-01-17 20:21:37Z dcoulter $ + * @link http://pear.php.net/package/HTTP_Request/ + */ + +/** + * Listener for HTTP_Request and HTTP_Response objects + * + * This class implements the Observer part of a Subject-Observer + * design pattern. + * + * @category HTTP + * @package HTTP_Request + * @author Alexey Borzov <avb@php.net> + * @version Release: 1.4.2 + */ +class HTTP_Request_Listener +{ + /** + * A listener's identifier + * @var string + */ + var $_id; + + /** + * Constructor, sets the object's identifier + * + * @access public + */ + function HTTP_Request_Listener() + { + $this->_id = md5(uniqid('http_request_', 1)); + } + + + /** + * Returns the listener's identifier + * + * @access public + * @return string + */ + function getId() + { + return $this->_id; + } + + + /** + * This method is called when Listener is notified of an event + * + * @access public + * @param object an object the listener is attached to + * @param string Event name + * @param mixed Additional data + * @abstract + */ + function update(&$subject, $event, $data = null) + { + echo "Notified of event: '$event'\n"; + if (null !== $data) { + echo "Additional data: "; + var_dump($data); + } + } +} +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/Net/Socket.php b/plugins/tidypics/lib/phpFlickr/PEAR/Net/Socket.php new file mode 100644 index 00000000..96f2c4bf --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/Net/Socket.php @@ -0,0 +1,528 @@ +<?php +// +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2003 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.0 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Authors: Stig Bakken <ssb@php.net> | +// | Chuck Hagenbuch <chuck@horde.org> | +// +----------------------------------------------------------------------+ +// +// $Id: Socket.php 32 2005-08-01 06:21:02Z dancoulter $ + +require_once 'PEAR.php'; + +define('NET_SOCKET_READ', 1); +define('NET_SOCKET_WRITE', 2); +define('NET_SOCKET_ERROR', 3); + +/** + * Generalized Socket class. + * + * @version 1.1 + * @author Stig Bakken <ssb@php.net> + * @author Chuck Hagenbuch <chuck@horde.org> + */ +class Net_Socket extends PEAR { + + /** + * Socket file pointer. + * @var resource $fp + */ + var $fp = null; + + /** + * Whether the socket is blocking. Defaults to true. + * @var boolean $blocking + */ + var $blocking = true; + + /** + * Whether the socket is persistent. Defaults to false. + * @var boolean $persistent + */ + var $persistent = false; + + /** + * The IP address to connect to. + * @var string $addr + */ + var $addr = ''; + + /** + * The port number to connect to. + * @var integer $port + */ + var $port = 0; + + /** + * Number of seconds to wait on socket connections before assuming + * there's no more data. Defaults to no timeout. + * @var integer $timeout + */ + var $timeout = false; + + /** + * Number of bytes to read at a time in readLine() and + * readAll(). Defaults to 2048. + * @var integer $lineLength + */ + var $lineLength = 2048; + + /** + * Connect to the specified port. If called when the socket is + * already connected, it disconnects and connects again. + * + * @param string $addr IP address or host name. + * @param integer $port TCP port number. + * @param boolean $persistent (optional) Whether the connection is + * persistent (kept open between requests + * by the web server). + * @param integer $timeout (optional) How long to wait for data. + * @param array $options See options for stream_context_create. + * + * @access public + * + * @return boolean | PEAR_Error True on success or a PEAR_Error on failure. + */ + function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null) + { + if (is_resource($this->fp)) { + @fclose($this->fp); + $this->fp = null; + } + + if (!$addr) { + return $this->raiseError('$addr cannot be empty'); + } elseif (strspn($addr, '.0123456789') == strlen($addr) || + strstr($addr, '/') !== false) { + $this->addr = $addr; + } else { + $this->addr = @gethostbyname($addr); + } + + $this->port = $port % 65536; + + if ($persistent !== null) { + $this->persistent = $persistent; + } + + if ($timeout !== null) { + $this->timeout = $timeout; + } + + $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; + $errno = 0; + $errstr = ''; + if ($options && function_exists('stream_context_create')) { + if ($this->timeout) { + $timeout = $this->timeout; + } else { + $timeout = 0; + } + $context = stream_context_create($options); + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout, $context); + } else { + if ($this->timeout) { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout); + } else { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr); + } + } + + if (!$fp) { + return $this->raiseError($errstr, $errno); + } + + $this->fp = $fp; + + return $this->setBlocking($this->blocking); + } + + /** + * Disconnects from the peer, closes the socket. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function disconnect() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + @fclose($this->fp); + $this->fp = null; + return true; + } + + /** + * Find out if the socket is in blocking mode. + * + * @access public + * @return boolean The current blocking mode. + */ + function isBlocking() + { + return $this->blocking; + } + + /** + * Sets whether the socket connection should be blocking or + * not. A read call to a non-blocking socket will return immediately + * if there is no data available, whereas it will block until there + * is data for blocking sockets. + * + * @param boolean $mode True for blocking sockets, false for nonblocking. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setBlocking($mode) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $this->blocking = $mode; + socket_set_blocking($this->fp, $this->blocking); + return true; + } + + /** + * Sets the timeout value on socket descriptor, + * expressed in the sum of seconds and microseconds + * + * @param integer $seconds Seconds. + * @param integer $microseconds Microseconds. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setTimeout($seconds, $microseconds) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_set_timeout($this->fp, $seconds, $microseconds); + } + + /** + * Returns information about an existing socket resource. + * Currently returns four entries in the result array: + * + * <p> + * timed_out (bool) - The socket timed out waiting for data<br> + * blocked (bool) - The socket was blocked<br> + * eof (bool) - Indicates EOF event<br> + * unread_bytes (int) - Number of bytes left in the socket buffer<br> + * </p> + * + * @access public + * @return mixed Array containing information about existing socket resource or an error object otherwise + */ + function getStatus() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_get_status($this->fp); + } + + /** + * Get a specified line of data + * + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function gets($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fgets($this->fp, $size); + } + + /** + * Read a specified amount of data. This is guaranteed to return, + * and has the added benefit of getting everything in one fread() + * chunk; if you know the size of the data you're getting + * beforehand, this is definitely the way to go. + * + * @param integer $size The number of bytes to read from the socket. + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function read($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fread($this->fp, $size); + } + + /** + * Write a specified amount of data. + * + * @param string $data Data to write. + * @param integer $blocksize Amount of data to write at once. + * NULL means all at once. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function write($data, $blocksize = null) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + if (is_null($blocksize) && !OS_WINDOWS) { + return fwrite($this->fp, $data); + } else { + if (is_null($blocksize)) { + $blocksize = 1024; + } + + $pos = 0; + $size = strlen($data); + while ($pos < $size) { + $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); + if ($written === false) { + return false; + } + $pos += $written; + } + + return $pos; + } + } + + /** + * Write a line of data to the socket, followed by a trailing "\r\n". + * + * @access public + * @return mixed fputs result, or an error + */ + function writeLine($data) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return fwrite($this->fp, $data . "\r\n"); + } + + /** + * Tests for end-of-file on a socket descriptor. + * + * @access public + * @return bool + */ + function eof() + { + return (is_resource($this->fp) && feof($this->fp)); + } + + /** + * Reads a byte of data + * + * @access public + * @return 1 byte of data from the socket, or a PEAR_Error if + * not connected. + */ + function readByte() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return ord(@fread($this->fp, 1)); + } + + /** + * Reads a word of data + * + * @access public + * @return 1 word of data from the socket, or a PEAR_Error if + * not connected. + */ + function readWord() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 2); + return (ord($buf[0]) + (ord($buf[1]) << 8)); + } + + /** + * Reads an int of data + * + * @access public + * @return integer 1 int of data from the socket, or a PEAR_Error if + * not connected. + */ + function readInt() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return (ord($buf[0]) + (ord($buf[1]) << 8) + + (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); + } + + /** + * Reads a zero-terminated string of data + * + * @access public + * @return string, or a PEAR_Error if + * not connected. + */ + function readString() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $string = ''; + while (($char = @fread($this->fp, 1)) != "\x00") { + $string .= $char; + } + return $string; + } + + /** + * Reads an IP Address and returns it in a dot formated string + * + * @access public + * @return Dot formated string, or a PEAR_Error if + * not connected. + */ + function readIPAddress() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return sprintf("%s.%s.%s.%s", ord($buf[0]), ord($buf[1]), + ord($buf[2]), ord($buf[3])); + } + + /** + * Read until either the end of the socket or a newline, whichever + * comes first. Strips the trailing newline from the returned data. + * + * @access public + * @return All available data up to a newline, without that + * newline, or until the end of the socket, or a PEAR_Error if + * not connected. + */ + function readLine() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $line = ''; + $timeout = time() + $this->timeout; + while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { + $line .= @fgets($this->fp, $this->lineLength); + if (substr($line, -1) == "\n") { + return rtrim($line, "\r\n"); + } + } + return $line; + } + + /** + * Read until the socket closes, or until there is no more data in + * the inner PHP buffer. If the inner buffer is empty, in blocking + * mode we wait for at least 1 byte of data. Therefore, in + * blocking mode, if there is no data at all to be read, this + * function will never exit (unless the socket is closed on the + * remote end). + * + * @access public + * + * @return string All data until the socket closes, or a PEAR_Error if + * not connected. + */ + function readAll() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $data = ''; + while (!feof($this->fp)) { + $data .= @fread($this->fp, $this->lineLength); + } + return $data; + } + + /** + * Runs the equivalent of the select() system call on the socket + * with a timeout specified by tv_sec and tv_usec. + * + * @param integer $state Which of read/write/error to check for. + * @param integer $tv_sec Number of seconds for timeout. + * @param integer $tv_usec Number of microseconds for timeout. + * + * @access public + * @return False if select fails, integer describing which of read/write/error + * are ready, or PEAR_Error if not connected. + */ + function select($state, $tv_sec, $tv_usec = 0) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $read = null; + $write = null; + $except = null; + if ($state & NET_SOCKET_READ) { + $read[] = $this->fp; + } + if ($state & NET_SOCKET_WRITE) { + $write[] = $this->fp; + } + if ($state & NET_SOCKET_ERROR) { + $except[] = $this->fp; + } + if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) { + return false; + } + + $result = 0; + if (count($read)) { + $result |= NET_SOCKET_READ; + } + if (count($write)) { + $result |= NET_SOCKET_WRITE; + } + if (count($except)) { + $result |= NET_SOCKET_ERROR; + } + return $result; + } + +} diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/Net/URL.php b/plugins/tidypics/lib/phpFlickr/PEAR/Net/URL.php new file mode 100644 index 00000000..38e26fd1 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/Net/URL.php @@ -0,0 +1,410 @@ +<?php +// +-----------------------------------------------------------------------+ +// | Copyright (c) 2002-2004, Richard Heyes | +// | All rights reserved. | +// | | +// | Redistribution and use in source and binary forms, with or without | +// | modification, are permitted provided that the following conditions | +// | are met: | +// | | +// | o Redistributions of source code must retain the above copyright | +// | notice, this list of conditions and the following disclaimer. | +// | o Redistributions in binary form must reproduce the above copyright | +// | notice, this list of conditions and the following disclaimer in the | +// | documentation and/or other materials provided with the distribution.| +// | o The names of the authors may not be used to endorse or promote | +// | products derived from this software without specific prior written | +// | permission. | +// | | +// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | +// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | +// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | +// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | +// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | +// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | +// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | +// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | +// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | +// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | +// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | +// | | +// +-----------------------------------------------------------------------+ +// | Author: Richard Heyes <richard at php net> | +// +-----------------------------------------------------------------------+ +// +// $Id: URL.php 32 2005-08-01 06:21:02Z dancoulter $ +// +// Net_URL Class + +class Net_URL +{ + /** + * Full url + * @var string + */ + var $url; + + /** + * Protocol + * @var string + */ + var $protocol; + + /** + * Username + * @var string + */ + var $username; + + /** + * Password + * @var string + */ + var $password; + + /** + * Host + * @var string + */ + var $host; + + /** + * Port + * @var integer + */ + var $port; + + /** + * Path + * @var string + */ + var $path; + + /** + * Query string + * @var array + */ + var $querystring; + + /** + * Anchor + * @var string + */ + var $anchor; + + /** + * Whether to use [] + * @var bool + */ + var $useBrackets; + + /** + * PHP4 Constructor + * + * @see __construct() + */ + function Net_URL($url = null, $useBrackets = true) + { + $this->__construct($url, $useBrackets); + } + + /** + * PHP5 Constructor + * + * Parses the given url and stores the various parts + * Defaults are used in certain cases + * + * @param string $url Optional URL + * @param bool $useBrackets Whether to use square brackets when + * multiple querystrings with the same name + * exist + */ + function __construct($url = null, $useBrackets = true) + { + $HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; + + $this->useBrackets = $useBrackets; + $this->url = $url; + $this->user = ''; + $this->pass = ''; + $this->host = ''; + $this->port = 80; + $this->path = ''; + $this->querystring = array(); + $this->anchor = ''; + + // Only use defaults if not an absolute URL given + if (!preg_match('/^[a-z0-9]+:\/\//i', $url)) { + + $this->protocol = (@$HTTP_SERVER_VARS['HTTPS'] == 'on' ? 'https' : 'http'); + + /** + * Figure out host/port + */ + if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) AND preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) { + $host = $matches[1]; + if (!empty($matches[3])) { + $port = $matches[3]; + } else { + $port = $this->getStandardPort($this->protocol); + } + } + + $this->user = ''; + $this->pass = ''; + $this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost'); + $this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol)); + $this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/'; + $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null; + $this->anchor = ''; + } + + // Parse the url and store the various parts + if (!empty($url)) { + $urlinfo = parse_url($url); + + // Default querystring + $this->querystring = array(); + + foreach ($urlinfo as $key => $value) { + switch ($key) { + case 'scheme': + $this->protocol = $value; + $this->port = $this->getStandardPort($value); + break; + + case 'user': + case 'pass': + case 'host': + case 'port': + $this->$key = $value; + break; + + case 'path': + if ($value{0} == '/') { + $this->path = $value; + } else { + $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path); + $this->path = sprintf('%s/%s', $path, $value); + } + break; + + case 'query': + $this->querystring = $this->_parseRawQueryString($value); + break; + + case 'fragment': + $this->anchor = $value; + break; + } + } + } + } + + /** + * Returns full url + * + * @return string Full url + * @access public + */ + function getURL() + { + $querystring = $this->getQueryString(); + + $this->url = $this->protocol . '://' + . $this->user . (!empty($this->pass) ? ':' : '') + . $this->pass . (!empty($this->user) ? '@' : '') + . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port) + . $this->path + . (!empty($querystring) ? '?' . $querystring : '') + . (!empty($this->anchor) ? '#' . $this->anchor : ''); + + return $this->url; + } + + /** + * Adds a querystring item + * + * @param string $name Name of item + * @param string $value Value of item + * @param bool $preencoded Whether value is urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + if ($preencoded) { + $this->querystring[$name] = $value; + } else { + $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value); + } + } + + /** + * Removes a querystring item + * + * @param string $name Name of item + * @access public + */ + function removeQueryString($name) + { + if (isset($this->querystring[$name])) { + unset($this->querystring[$name]); + } + } + + /** + * Sets the querystring to literally what you supply + * + * @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc + * @access public + */ + function addRawQueryString($querystring) + { + $this->querystring = $this->_parseRawQueryString($querystring); + } + + /** + * Returns flat querystring + * + * @return string Querystring + * @access public + */ + function getQueryString() + { + if (!empty($this->querystring)) { + foreach ($this->querystring as $name => $value) { + if (is_array($value)) { + foreach ($value as $k => $v) { + $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v); + } + } elseif (!is_null($value)) { + $querystring[] = $name . '=' . $value; + } else { + $querystring[] = $name; + } + } + $querystring = implode(ini_get('arg_separator.output'), $querystring); + } else { + $querystring = ''; + } + + return $querystring; + } + + /** + * Parses raw querystring and returns an array of it + * + * @param string $querystring The querystring to parse + * @return array An array of the querystring data + * @access private + */ + function _parseRawQuerystring($querystring) + { + $parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY); + $return = array(); + + foreach ($parts as $part) { + if (strpos($part, '=') !== false) { + $value = substr($part, strpos($part, '=') + 1); + $key = substr($part, 0, strpos($part, '=')); + } else { + $value = null; + $key = $part; + } + if (substr($key, -2) == '[]') { + $key = substr($key, 0, -2); + if (@!is_array($return[$key])) { + $return[$key] = array(); + $return[$key][] = $value; + } else { + $return[$key][] = $value; + } + } elseif (!$this->useBrackets AND !empty($return[$key])) { + $return[$key] = (array)$return[$key]; + $return[$key][] = $value; + } else { + $return[$key] = $value; + } + } + + return $return; + } + + /** + * Resolves //, ../ and ./ from a path and returns + * the result. Eg: + * + * /foo/bar/../boo.php => /foo/boo.php + * /foo/bar/../../boo.php => /boo.php + * /foo/bar/.././/boo.php => /foo/boo.php + * + * This method can also be called statically. + * + * @param string $url URL path to resolve + * @return string The result + */ + function resolvePath($path) + { + $path = explode('/', str_replace('//', '/', $path)); + + for ($i=0; $i<count($path); $i++) { + if ($path[$i] == '.') { + unset($path[$i]); + $path = array_values($path); + $i--; + + } elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != '') ) ) { + unset($path[$i]); + unset($path[$i-1]); + $path = array_values($path); + $i -= 2; + + } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') { + unset($path[$i]); + $path = array_values($path); + $i--; + + } else { + continue; + } + } + + return implode('/', $path); + } + + /** + * Returns the standard port number for a protocol + * + * @param string $scheme The protocol to lookup + * @return integer Port number or NULL if no scheme matches + * + * @author Philippe Jausions <Philippe.Jausions@11abacus.com> + */ + function getStandardPort($scheme) + { + switch (strtolower($scheme)) { + case 'http': return 80; + case 'https': return 443; + case 'ftp': return 21; + case 'imap': return 143; + case 'imaps': return 993; + case 'pop3': return 110; + case 'pop3s': return 995; + default: return null; + } + } + + /** + * Forces the URL to a particular protocol + * + * @param string $protocol Protocol to force the URL to + * @param integer $port Optional port (standard port is used by default) + */ + function setProtocol($protocol, $port = null) + { + $this->protocol = $protocol; + $this->port = is_null($port) ? $this->getStandardPort() : $port; + } + +} +?> diff --git a/plugins/tidypics/lib/phpFlickr/PEAR/PEAR.php b/plugins/tidypics/lib/phpFlickr/PEAR/PEAR.php new file mode 100644 index 00000000..e442d8c7 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/PEAR/PEAR.php @@ -0,0 +1,1108 @@ +<?php +/** + * PEAR, the PHP Extension and Application Repository + * + * PEAR class and PEAR_Error class + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.0 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_0.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category pear + * @package PEAR + * @author Sterling Hughes <sterling@php.net> + * @author Stig Bakken <ssb@php.net> + * @author Tomas V.V.Cox <cox@idecnet.com> + * @author Greg Beaver <cellog@php.net> + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: PEAR.php 127 2008-01-17 20:21:37Z dcoulter $ + * @link http://pear.php.net/package/PEAR + * @since File available since Release 0.1 + */ + +/**#@+ + * ERROR constants + */ +define('PEAR_ERROR_RETURN', 1); +define('PEAR_ERROR_PRINT', 2); +define('PEAR_ERROR_TRIGGER', 4); +define('PEAR_ERROR_DIE', 8); +define('PEAR_ERROR_CALLBACK', 16); +/** + * WARNING: obsolete + * @deprecated + */ +define('PEAR_ERROR_EXCEPTION', 32); +/**#@-*/ +define('PEAR_ZE2', (function_exists('version_compare') && + version_compare(zend_version(), "2-dev", "ge"))); + +if (substr(PHP_OS, 0, 3) == 'WIN') { + define('OS_WINDOWS', true); + define('OS_UNIX', false); + define('PEAR_OS', 'Windows'); +} else { + define('OS_WINDOWS', false); + define('OS_UNIX', true); + define('PEAR_OS', 'Unix'); // blatant assumption +} + +// instant backwards compatibility +if (!defined('PATH_SEPARATOR')) { + if (OS_WINDOWS) { + define('PATH_SEPARATOR', ';'); + } else { + define('PATH_SEPARATOR', ':'); + } +} + +$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; +$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; +$GLOBALS['_PEAR_destructor_object_list'] = array(); +$GLOBALS['_PEAR_shutdown_funcs'] = array(); +$GLOBALS['_PEAR_error_handler_stack'] = array(); + +@ini_set('track_errors', true); + +/** + * Base class for other PEAR classes. Provides rudimentary + * emulation of destructors. + * + * If you want a destructor in your class, inherit PEAR and make a + * destructor method called _yourclassname (same name as the + * constructor, but with a "_" prefix). Also, in your constructor you + * have to call the PEAR constructor: $this->PEAR();. + * The destructor method will be called without parameters. Note that + * at in some SAPI implementations (such as Apache), any output during + * the request shutdown (in which destructors are called) seems to be + * discarded. If you need to get any debug information from your + * destructor, use error_log(), syslog() or something similar. + * + * IMPORTANT! To use the emulated destructors you need to create the + * objects by reference: $obj =& new PEAR_child; + * + * @category pear + * @package PEAR + * @author Stig Bakken <ssb@php.net> + * @author Tomas V.V. Cox <cox@idecnet.com> + * @author Greg Beaver <cellog@php.net> + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.6.2 + * @link http://pear.php.net/package/PEAR + * @see PEAR_Error + * @since Class available since PHP 4.0.2 + * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear + */ +class PEAR +{ + // {{{ properties + + /** + * Whether to enable internal debug messages. + * + * @var bool + * @access private + */ + var $_debug = false; + + /** + * Default error mode for this object. + * + * @var int + * @access private + */ + var $_default_error_mode = null; + + /** + * Default error options used for this object when error mode + * is PEAR_ERROR_TRIGGER. + * + * @var int + * @access private + */ + var $_default_error_options = null; + + /** + * Default error handler (callback) for this object, if error mode is + * PEAR_ERROR_CALLBACK. + * + * @var string + * @access private + */ + var $_default_error_handler = ''; + + /** + * Which class to use for error objects. + * + * @var string + * @access private + */ + var $_error_class = 'PEAR_Error'; + + /** + * An array of expected errors. + * + * @var array + * @access private + */ + var $_expected_errors = array(); + + // }}} + + // {{{ constructor + + /** + * Constructor. Registers this object in + * $_PEAR_destructor_object_list for destructor emulation if a + * destructor object exists. + * + * @param string $error_class (optional) which class to use for + * error objects, defaults to PEAR_Error. + * @access public + * @return void + */ + function PEAR($error_class = null) + { + $classname = strtolower(get_class($this)); + if ($this->_debug) { + print "PEAR constructor called, class=$classname\n"; + } + if ($error_class !== null) { + $this->_error_class = $error_class; + } + while ($classname && strcasecmp($classname, "pear")) { + $destructor = "_$classname"; + if (method_exists($this, $destructor)) { + global $_PEAR_destructor_object_list; + $_PEAR_destructor_object_list[] = &$this; + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + break; + } else { + $classname = get_parent_class($classname); + } + } + } + + // }}} + // {{{ destructor + + /** + * Destructor (the emulated type of...). Does nothing right now, + * but is included for forward compatibility, so subclass + * destructors should always call it. + * + * See the note in the class desciption about output from + * destructors. + * + * @access public + * @return void + */ + function _PEAR() { + if ($this->_debug) { + printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); + } + } + + // }}} + // {{{ getStaticProperty() + + /** + * If you have a class that's mostly/entirely static, and you need static + * properties, you can use this method to simulate them. Eg. in your method(s) + * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); + * You MUST use a reference, or they will not persist! + * + * @access public + * @param string $class The calling classname, to prevent clashes + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + function &getStaticProperty($class, $var) + { + static $properties; + if (!isset($properties[$class])) { + $properties[$class] = array(); + } + if (!array_key_exists($var, $properties[$class])) { + $properties[$class][$var] = null; + } + return $properties[$class][$var]; + } + + // }}} + // {{{ registerShutdownFunc() + + /** + * Use this function to register a shutdown method for static + * classes. + * + * @access public + * @param mixed $func The function name (or array of class/method) to call + * @param mixed $args The arguments to pass to the function + * @return void + */ + function registerShutdownFunc($func, $args = array()) + { + // if we are called statically, there is a potential + // that no shutdown func is registered. Bug #6445 + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); + } + + // }}} + // {{{ isError() + + /** + * Tell whether a value is a PEAR error. + * + * @param mixed $data the value to test + * @param int $code if $data is an error object, return true + * only if $code is a string and + * $obj->getMessage() == $code or + * $code is an integer and $obj->getCode() == $code + * @access public + * @return bool true if parameter is an error + */ + function isError($data, $code = null) + { + if (is_a($data, 'PEAR_Error')) { + if (is_null($code)) { + return true; + } elseif (is_string($code)) { + return $data->getMessage() == $code; + } else { + return $data->getCode() == $code; + } + } + return false; + } + + // }}} + // {{{ setErrorHandling() + + /** + * Sets how errors generated by this object should be handled. + * Can be invoked both in objects and statically. If called + * statically, setErrorHandling sets the default behaviour for all + * PEAR objects. If called in an object, setErrorHandling sets + * the default behaviour for that object. + * + * @param int $mode + * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. + * + * @param mixed $options + * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one + * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * + * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is the object, and the element at index 1 is + * the name of the method to call in the object. + * + * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is + * a printf format string used when printing the error + * message. + * + * @access public + * @return void + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + * @see PEAR_ERROR_EXCEPTION + * + * @since PHP 4.0.5 + */ + + function setErrorHandling($mode = null, $options = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $setmode = &$this->_default_error_mode; + $setoptions = &$this->_default_error_options; + } else { + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + } + + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + } + + // }}} + // {{{ expectError() + + /** + * This method is used to tell which errors you expect to get. + * Expected errors are always returned with error mode + * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, + * and this method pushes a new element onto it. The list of + * expected errors are in effect until they are popped off the + * stack with the popExpect() method. + * + * Note that this method can not be called statically + * + * @param mixed $code a single error code or an array of error codes to expect + * + * @return int the new depth of the "expected errors" stack + * @access public + */ + function expectError($code = '*') + { + if (is_array($code)) { + array_push($this->_expected_errors, $code); + } else { + array_push($this->_expected_errors, array($code)); + } + return sizeof($this->_expected_errors); + } + + // }}} + // {{{ popExpect() + + /** + * This method pops one element off the expected error codes + * stack. + * + * @return array the list of error codes that were popped + */ + function popExpect() + { + return array_pop($this->_expected_errors); + } + + // }}} + // {{{ _checkDelExpect() + + /** + * This method checks unsets an error code if available + * + * @param mixed error code + * @return bool true if the error code was unset, false otherwise + * @access private + * @since PHP 4.3.0 + */ + function _checkDelExpect($error_code) + { + $deleted = false; + + foreach ($this->_expected_errors AS $key => $error_array) { + if (in_array($error_code, $error_array)) { + unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); + $deleted = true; + } + + // clean up empty arrays + if (0 == count($this->_expected_errors[$key])) { + unset($this->_expected_errors[$key]); + } + } + return $deleted; + } + + // }}} + // {{{ delExpect() + + /** + * This method deletes all occurences of the specified element from + * the expected error codes stack. + * + * @param mixed $error_code error code that should be deleted + * @return mixed list of error codes that were deleted or error + * @access public + * @since PHP 4.3.0 + */ + function delExpect($error_code) + { + $deleted = false; + + if ((is_array($error_code) && (0 != count($error_code)))) { + // $error_code is a non-empty array here; + // we walk through it trying to unset all + // values + foreach($error_code as $key => $error) { + if ($this->_checkDelExpect($error)) { + $deleted = true; + } else { + $deleted = false; + } + } + return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } elseif (!empty($error_code)) { + // $error_code comes alone, trying to unset it + if ($this->_checkDelExpect($error_code)) { + return true; + } else { + return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } + } else { + // $error_code is empty + return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME + } + } + + // }}} + // {{{ raiseError() + + /** + * This method is a wrapper that returns an instance of the + * configured error class with this object's default error + * handling applied. If the $mode and $options parameters are not + * specified, the object's defaults are used. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. + * + * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter + * specifies the PHP-internal error level (one of + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * If $mode is PEAR_ERROR_CALLBACK, this + * parameter specifies the callback function or + * method. In other error modes this parameter + * is ignored. + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @param string $error_class The returned error object will be + * instantiated from this class, if specified. + * + * @param bool $skipmsg If true, raiseError will only pass error codes, + * the error message parameter will be dropped. + * + * @access public + * @return object a PEAR error object + * @see PEAR::setErrorHandling + * @since PHP 4.0.5 + */ + function &raiseError($message = null, + $code = null, + $mode = null, + $options = null, + $userinfo = null, + $error_class = null, + $skipmsg = false) + { + // The error is yet a PEAR error object + if (is_object($message)) { + $code = $message->getCode(); + $userinfo = $message->getUserInfo(); + $error_class = $message->getType(); + $message->error_message_prefix = ''; + $message = $message->getMessage(); + } + + if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { + if ($exp[0] == "*" || + (is_int(reset($exp)) && in_array($code, $exp)) || + (is_string(reset($exp)) && in_array($message, $exp))) { + $mode = PEAR_ERROR_RETURN; + } + } + // No mode given, try global ones + if ($mode === null) { + // Class error handler + if (isset($this) && isset($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + // Global error handler + } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { + $mode = $GLOBALS['_PEAR_default_error_mode']; + $options = $GLOBALS['_PEAR_default_error_options']; + } + } + + if ($error_class !== null) { + $ec = $error_class; + } elseif (isset($this) && isset($this->_error_class)) { + $ec = $this->_error_class; + } else { + $ec = 'PEAR_Error'; + } + if ($skipmsg) { + $a = &new $ec($code, $mode, $options, $userinfo); + return $a; + } else { + $a = &new $ec($message, $code, $mode, $options, $userinfo); + return $a; + } + } + + // }}} + // {{{ throwError() + + /** + * Simpler form of raiseError with fewer options. In most cases + * message, code and userinfo are enough. + * + * @param string $message + * + */ + function &throwError($message = null, + $code = null, + $userinfo = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $a = &$this->raiseError($message, $code, null, null, $userinfo); + return $a; + } else { + $a = &PEAR::raiseError($message, $code, null, null, $userinfo); + return $a; + } + } + + // }}} + function staticPushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + $stack[] = array($def_mode, $def_options); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $def_mode = $mode; + $def_options = $options; + break; + + case PEAR_ERROR_CALLBACK: + $def_mode = $mode; + // class/object method callback + if (is_callable($options)) { + $def_options = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + $stack[] = array($mode, $options); + return true; + } + + function staticPopErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + return true; + } + + // {{{ pushErrorHandling() + + /** + * Push a new error handler on top of the error handler options stack. With this + * you can easily override the actual error handler for some code and restore + * it later with popErrorHandling. + * + * @param mixed $mode (same as setErrorHandling) + * @param mixed $options (same as setErrorHandling) + * + * @return bool Always true + * + * @see PEAR::setErrorHandling + */ + function pushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + if (isset($this) && is_a($this, 'PEAR')) { + $def_mode = &$this->_default_error_mode; + $def_options = &$this->_default_error_options; + } else { + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + } + $stack[] = array($def_mode, $def_options); + + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + $stack[] = array($mode, $options); + return true; + } + + // }}} + // {{{ popErrorHandling() + + /** + * Pop the last error handler used + * + * @return bool Always true + * + * @see PEAR::pushErrorHandling + */ + function popErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + return true; + } + + // }}} + // {{{ loadExtension() + + /** + * OS independant PHP extension load. Remember to take care + * on the correct extension name for case sensitive OSes. + * + * @param string $ext The extension name + * @return bool Success or not on the dl() call + */ + function loadExtension($ext) + { + if (!extension_loaded($ext)) { + // if either returns true dl() will produce a FATAL error, stop that + if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { + return false; + } + if (OS_WINDOWS) { + $suffix = '.dll'; + } elseif (PHP_OS == 'HP-UX') { + $suffix = '.sl'; + } elseif (PHP_OS == 'AIX') { + $suffix = '.a'; + } elseif (PHP_OS == 'OSX') { + $suffix = '.bundle'; + } else { + $suffix = '.so'; + } + return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); + } + return true; + } + + // }}} +} + +// {{{ _PEAR_call_destructors() + +function _PEAR_call_destructors() +{ + global $_PEAR_destructor_object_list; + if (is_array($_PEAR_destructor_object_list) && + sizeof($_PEAR_destructor_object_list)) + { + reset($_PEAR_destructor_object_list); + if (PEAR::getStaticProperty('PEAR', 'destructlifo')) { + $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); + } + while (list($k, $objref) = each($_PEAR_destructor_object_list)) { + $classname = get_class($objref); + while ($classname) { + $destructor = "_$classname"; + if (method_exists($objref, $destructor)) { + $objref->$destructor(); + break; + } else { + $classname = get_parent_class($classname); + } + } + } + // Empty the object list to ensure that destructors are + // not called more than once. + $_PEAR_destructor_object_list = array(); + } + + // Now call the shutdown functions + if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { + foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { + call_user_func_array($value[0], $value[1]); + } + } +} + +// }}} +/** + * Standard PEAR error class for PHP 4 + * + * This class is supserseded by {@link PEAR_Exception} in PHP 5 + * + * @category pear + * @package PEAR + * @author Stig Bakken <ssb@php.net> + * @author Tomas V.V. Cox <cox@idecnet.com> + * @author Gregory Beaver <cellog@php.net> + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.6.2 + * @link http://pear.php.net/manual/en/core.pear.pear-error.php + * @see PEAR::raiseError(), PEAR::throwError() + * @since Class available since PHP 4.0.2 + */ +class PEAR_Error +{ + // {{{ properties + + var $error_message_prefix = ''; + var $mode = PEAR_ERROR_RETURN; + var $level = E_USER_NOTICE; + var $code = -1; + var $message = ''; + var $userinfo = ''; + var $backtrace = null; + + // }}} + // {{{ constructor + + /** + * PEAR_Error constructor + * + * @param string $message message + * + * @param int $code (optional) error code + * + * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, + * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION + * + * @param mixed $options (optional) error level, _OR_ in the case of + * PEAR_ERROR_CALLBACK, the callback function or object/method + * tuple. + * + * @param string $userinfo (optional) additional user/debug info + * + * @access public + * + */ + function PEAR_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + if ($mode === null) { + $mode = PEAR_ERROR_RETURN; + } + $this->message = $message; + $this->code = $code; + $this->mode = $mode; + $this->userinfo = $userinfo; + if (!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { + $this->backtrace = debug_backtrace(); + if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) { + unset($this->backtrace[0]['object']); + } + } + if ($mode & PEAR_ERROR_CALLBACK) { + $this->level = E_USER_NOTICE; + $this->callback = $options; + } else { + if ($options === null) { + $options = E_USER_NOTICE; + } + $this->level = $options; + $this->callback = null; + } + if ($this->mode & PEAR_ERROR_PRINT) { + if (is_null($options) || is_int($options)) { + $format = "%s"; + } else { + $format = $options; + } + printf($format, $this->getMessage()); + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + trigger_error($this->getMessage(), $this->level); + } + if ($this->mode & PEAR_ERROR_DIE) { + $msg = $this->getMessage(); + if (is_null($options) || is_int($options)) { + $format = "%s"; + if (substr($msg, -1) != "\n") { + $msg .= "\n"; + } + } else { + $format = $options; + } + die(sprintf($format, $msg)); + } + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_callable($this->callback)) { + call_user_func($this->callback, $this); + } + } + if ($this->mode & PEAR_ERROR_EXCEPTION) { + trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); + eval('$e = new Exception($this->message, $this->code);throw($e);'); + } + } + + // }}} + // {{{ getMode() + + /** + * Get the error mode from an error object. + * + * @return int error mode + * @access public + */ + function getMode() { + return $this->mode; + } + + // }}} + // {{{ getCallback() + + /** + * Get the callback function/method from an error object. + * + * @return mixed callback function or object/method array + * @access public + */ + function getCallback() { + return $this->callback; + } + + // }}} + // {{{ getMessage() + + + /** + * Get the error message from an error object. + * + * @return string full error message + * @access public + */ + function getMessage() + { + return ($this->error_message_prefix . $this->message); + } + + + // }}} + // {{{ getCode() + + /** + * Get error code from an error object + * + * @return int error code + * @access public + */ + function getCode() + { + return $this->code; + } + + // }}} + // {{{ getType() + + /** + * Get the name of this error/exception. + * + * @return string error/exception name (type) + * @access public + */ + function getType() + { + return get_class($this); + } + + // }}} + // {{{ getUserInfo() + + /** + * Get additional user-supplied information. + * + * @return string user-supplied information + * @access public + */ + function getUserInfo() + { + return $this->userinfo; + } + + // }}} + // {{{ getDebugInfo() + + /** + * Get additional debug information supplied by the application. + * + * @return string debug information + * @access public + */ + function getDebugInfo() + { + return $this->getUserInfo(); + } + + // }}} + // {{{ getBacktrace() + + /** + * Get the call backtrace from where the error was generated. + * Supported with PHP 4.3.0 or newer. + * + * @param int $frame (optional) what frame to fetch + * @return array Backtrace, or NULL if not available. + * @access public + */ + function getBacktrace($frame = null) + { + if (defined('PEAR_IGNORE_BACKTRACE')) { + return null; + } + if ($frame === null) { + return $this->backtrace; + } + return $this->backtrace[$frame]; + } + + // }}} + // {{{ addUserInfo() + + function addUserInfo($info) + { + if (empty($this->userinfo)) { + $this->userinfo = $info; + } else { + $this->userinfo .= " ** $info"; + } + } + + // }}} + // {{{ toString() + + /** + * Make a string representation of this object. + * + * @return string a string with an object summary + * @access public + */ + function toString() { + $modes = array(); + $levels = array(E_USER_NOTICE => 'notice', + E_USER_WARNING => 'warning', + E_USER_ERROR => 'error'); + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_array($this->callback)) { + $callback = (is_object($this->callback[0]) ? + strtolower(get_class($this->callback[0])) : + $this->callback[0]) . '::' . + $this->callback[1]; + } else { + $callback = $this->callback; + } + return sprintf('[%s: message="%s" code=%d mode=callback '. + 'callback=%s prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + $callback, $this->error_message_prefix, + $this->userinfo); + } + if ($this->mode & PEAR_ERROR_PRINT) { + $modes[] = 'print'; + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + $modes[] = 'trigger'; + } + if ($this->mode & PEAR_ERROR_DIE) { + $modes[] = 'die'; + } + if ($this->mode & PEAR_ERROR_RETURN) { + $modes[] = 'return'; + } + return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. + 'prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + implode("|", $modes), $levels[$this->level], + $this->error_message_prefix, + $this->userinfo); + } + + // }}} +} + +/* + * Local Variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/plugins/tidypics/lib/phpFlickr/README.txt b/plugins/tidypics/lib/phpFlickr/README.txt new file mode 100644 index 00000000..df0a56d9 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/README.txt @@ -0,0 +1,215 @@ +phpFlickr Class 2.3.1 +Written by Dan Coulter (dancoulter@users.sourceforge.net) +Project Homepage: http://www.phpflickr.com/ +Google Code Project Page: http://code.google.com/p/phpflickr/ +Released under GNU Lesser General Public License (http://www.gnu.org/copyleft/lgpl.html) +For more information about the class and upcoming tools and applications using it, +visit http://www.phpflickr.com/ or http://code.google.com/p/phpflickr/ + +If you are interested in hiring me for a project (involving phpFlickr +or not), feel free to email me. + +Installation instructions: +1. Copy the files from the installation package into a folder on your + server. They need to be readible by your web server. You can put + them into an include folder defined in your php.ini file, if you + like, though it's not required. + +2. All you have to do now is include the file in your PHP scripts and + create an instance. For example: + $f = new phpFlickr(); + + The constructor has three arguments: + A. $api_key - This is the API key given to you by flickr.com. This + argument is required and you can get an API Key at: + http://www.flickr.com/services/api/key.gne + + B. $secret - The "secret" is optional because is not required to + make unauthenticated calls, but is absolutely required for the + new authentication API (see Authentication section below). You + will get one assigned alongside your api key. + + C. $die_on_error - This takes a boolean value and determines + whether the class will die (aka cease operation) if the API + returns an error statement. It defaults to false. Every method + will return false if the API returns an error. You can access + error messages using the getErrorCode() and getErrorMsg() + methods. + +3. All of the API methods have been implemented in my class. You can + see a full list and documentation here: + http://www.flickr.com/services/api/ + To call a method, remove the "flickr." part of the name and replace + any periods with underscores. For example, instead of + flickr.photos.search, you would call $f->photos_search() or instead + of flickr.photos.licenses.getInfo, you would call + $f->photos_licenses_getInfo() (yes, it is case sensitive). + + All functions have their arguments implemented in the list order on + their documentation page (a link to which is included with each + method in the phpFlickr clasS). The only exceptions to this are + photos_search(), photos_getWithoutGeodata() and + photos_getWithoutGeodata() which have so many optional arguments + that it's easier for everyone if you just have to pass an + associative array of arguments. See the comment in the + photos_search() definition in phpFlickr.php for more information. + + + +Authentication: + As of this release of the phpFlickr class there is only one authentication method + available to the API. This method is somewhat complex, but is far more secure and + allows your users to feel a little safer authenticating to your application. You'll + no longer have to ask for their username and password. + + Authentication API - http://www.flickr.com/services/api/auth.spec.html + + I know how complicated this API looks at first glance, so I've tried to + make this as transparent to the coding process. I'll go through the steps + you'll need to use this. Both the auth.php and getToken.php file will + need your API Key and Secret entered before you can use them. + + To have end users authenticate their accounts: + First, setup a callback script. I've included a callback script that + is pretty flexible. You'll find it in the package entitled "auth.php". + You'll need to go to flickr and point your api key to this file as the + callback script. Once you've done this, on any page that you want to + require the end user end user to authenticate their flickr account to + your app, just call the phpFlickr::auth() function with whatever + permission you need to use. + For example: + $f->auth("write"); + The three permissions are "read", "write" and "delete". The function + defaults to "read", if you leave it blank. + + Calling this function will send the user's browser to Flickr's page to + authenticate to your app. Once they have logged in, it will bounce + them back to your callback script which will redirect back to the + original page that you called the auth() function from after setting + a session variable to save their authentication token. If that session + variable exists, calling the auth() function will return the permissions + that the user granted your app on the Flickr page instead of redirecting + to an external page. + + To authenticate the app to your account to show your private pictures (for example) + This method will allow you to have the app authenticate to one specific + account, no matter who views your website. This is useful to display + private photos or photosets (among other things). + + *Note*: The method below is a little hard to understand, so I've setup a tool + to help you through this: http://www.phpflickr.com/tools/auth/. + + First, you'll have to setup a callback script with Flickr. Once you've + done that, edit line 12 of the included getToken.php file to reflect + which permissions you'll need for the app. Then browse to the page. + Once you've authorized the app with Flickr, it'll send you back to that + page which will give you a token which will look something like this: + 1234-567890abcdef1234 + Go to the file where you are creating an instance of phpFlickr (I suggest + an include file) and after you've created it set the token to use: + $f->setToken("<token string>"); + This token never expires, so you don't have to worry about having to + login periodically. + + +Using Caching: + Caching can be very important to a project. Just a few calls to the Flickr API + can take long enough to bore your average web user (depending on the calls you + are making). I've built in caching that will access either a database or files + in your filesystem. To enable caching, use the phpFlickr::enableCache() function. + This function requires at least two arguments. The first will be the type of + cache you're using (either "db" or "fs") + + 1. If you're using database caching, you'll need to supply a PEAR::DB connection + string. For example: + $flickr->enableCache("db", "mysql://user:password@server/database"); + The third (optional) argument is expiration of the cache in seconds (defaults + to 600). The fourth (optional) argument is the table where you want to store + the cache. This defaults to flickr_cache and will attempt to create the table + if it does not already exist. + + 2. If you're using filesystem caching, you'll need to supply a folder where the + web server has write access. For example: + $flickr->enableCache("fs", "/var/www/phpFlickrCache"); + The third (optional) argument is, the same as in the Database caching, an + expiration in seconds for the cache. + Note: filesystem caching will probably be slower than database caching. I + haven't done any tests of this, but if you get large amounts of calls, the + process of cleaning out old calls may get hard on your server. + + You may not want to allow the world to view the files that are created during + caching. If you want to hide this information, either make sure that your + permissions are set correctly, or disable the webserver from displaying + *.cache files. In Apache, you can specify this in the configuration files + or in a .htaccess file with the following directives: + + <FilesMatch "\.cache$"> + Deny from all + </FilesMatch> + + Alternatively, you can specify a directory that is outside of the web server's + document root. + +Uploading + Uploading is pretty simple. Aside from being authenticated (see Authentication + section) the very minimum that you'll have to pass is a path to an image file on + your php server. You can do either synchronous or asynchronous uploading as follows: + synchronous: sync_upload("photo.jpg"); + asynchronous: async_upload("photo.jpg"); + + The basic difference is that synchronous uploading waits around until Flickr + processes the photo and returns a PhotoID. Asynchronous just uploads the + picture and gets a "ticketid" that you can use to check on the status of your + upload. Asynchronous is much faster, though the photoid won't be instantly + available for you. You can read more about asynchronous uploading here: + http://www.flickr.com/services/api/upload.async.html + + Both of the functions take the same arguments which are: + Photo: The path of the file to upload. + Title: The title of the photo. + Description: A description of the photo. May contain some limited HTML. + Tags: A space-separated list of tags to apply to the photo. + is_public: Set to 0 for no, 1 for yes. + is_friend: Set to 0 for no, 1 for yes. + is_family: Set to 0 for no, 1 for yes. + +Replacing Photos + Flickr has released API support for uploading a replacement photo. To use this + new method, just use the "replace" function in phpFlickr. You'll be required + to pass the file name and Flickr's photo ID. You need to authenticate your script + with "write" permissions before you can replace a photo. The arguments are: + Photo: The path of the file to upload. + Photo ID: The numeric Flickr ID of the photo you want to replace. + Async (optional): Set to 0 for a synchronous call, 1 for asynchronous. + If you use the asynchronous call, it will return a ticketid instead + of photoid. + +Other Notes: + 1. Many of the methods have optional arguments. For these, I have implemented + them in the same order that the Flickr API documentation lists them. PHP + allows for optional arguments in function calls, but if you want to use the + third optional argument, you have to fill in the others to the left first. + You can use the "NULL" value (without quotes) in the place of an actual + argument. For example: + $f->groups_pools_getPhotos($group_id, NULL, NULL, 10); + This will get the first ten photos from a specific group's pool. If you look + at the documentation, you will see that there is another argument, "page". I've + left it off because it appears after "per_page". + 2. Some people will need to ues phpFlickr from behind a proxy server. I've + implemented a method that will allow you to use an HTTP proxy for all of your + traffic. Let's say that you have a proxy server on your local server running + at port 8181. This is the code you would use: + $f = new phpFlickr("[api key]"); + $f->setProxy("localhost", "8181"); + After that, all of your calls will be automatically made through your proxy server. + + +That's it! Enjoy the class. Check out the project page (listed above) for updates +and news. I plan to implement file uploads and functions to aggregate data from +several different methods for easier use in a web application. Thanks for your +interest in this project! + + Please email me if you have any questions or problems. You'll find my email + at the top of this file. + + diff --git a/plugins/tidypics/lib/phpFlickr/auth.php b/plugins/tidypics/lib/phpFlickr/auth.php new file mode 100644 index 00000000..d272d49b --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/auth.php @@ -0,0 +1,37 @@ +<?php + /* Last updated with phpFlickr 1.3.1 + * + * Edit these variables to reflect the values you need. $default_redirect + * and $permissions are only important if you are linking here instead of + * using phpFlickr::auth() from another page or if you set the remember_uri + * argument to false. + */ + $api_key = "26b2abba37182aca62fe0eb2c7782050"; + $api_secret = "475e45cc580334da"; + $default_redirect = "/"; + $permissions = "read"; + $path_to_phpFlickr_class = "./"; + + ob_start(); + require_once($path_to_phpFlickr_class . "phpFlickr.php"); + unset($_SESSION['phpFlickr_auth_token']); + + if (!empty($_GET['extra'])) { + $redirect = $_GET['extra']; + } + + $f = new phpFlickr($api_key, $api_secret); + + if (empty($_GET['frob'])) { + $f->auth($permissions, false); + } else { + $f->auth_getToken($_GET['frob']); + } + + if (empty($redirect)) { + header("Location: " . $default_redirect); + } else { + header("Location: " . $redirect); + } + +?> \ No newline at end of file diff --git a/plugins/tidypics/lib/phpFlickr/example.php b/plugins/tidypics/lib/phpFlickr/example.php new file mode 100644 index 00000000..8b409b42 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/example.php @@ -0,0 +1,30 @@ +<?php +/* Last updated with phpFlickr 1.3.2 + * + * This example file shows you how to call the 100 most recent public + * photos. It parses through them and prints out a link to each of them + * along with the owner's name. + * + * Most of the processing time in this file comes from the 100 calls to + * flickr.people.getInfo. Enabling caching will help a whole lot with + * this as there are many people who post multiple photos at once. + * + * Obviously, you'll want to replace the "<api key>" with one provided + * by Flickr: http://www.flickr.com/services/api/key.gne + */ + +require_once("phpFlickr.php"); +$f = new phpFlickr("<api key>"); + +$recent = $f->photos_getRecent(); + +foreach ($recent['photo'] as $photo) { + $owner = $f->people_getInfo($photo['owner']); + echo "<a href='http://www.flickr.com/photos/" . $photo['owner'] . "/" . $photo['id'] . "/'>"; + echo $photo['title']; + echo "</a> Owner: "; + echo "<a href='http://www.flickr.com/people/" . $photo['owner'] . "/'>"; + echo $owner['username']; + echo "</a><br>"; +} +?> diff --git a/plugins/tidypics/lib/phpFlickr/getToken.php b/plugins/tidypics/lib/phpFlickr/getToken.php new file mode 100644 index 00000000..55180ea2 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/getToken.php @@ -0,0 +1,19 @@ +<?php + /* Last updated with phpFlickr 1.4 + * + * If you need your app to always login with the same user (to see your private + * photos or photosets, for example), you can use this file to login and get a + * token assigned so that you can hard code the token to be used. To use this + * use the phpFlickr::setToken() function whenever you create an instance of + * the class. + */ + + require_once("phpFlickr.php"); + $f = new phpFlickr("26b2abba37182aca62fe0eb2c7782050", "475e45cc580334da"); + + //change this to the permissions you will need + $f->auth("read"); + + echo "Copy this token into your code: " . $_SESSION['phpFlickr_auth_token']; + +?> \ No newline at end of file diff --git a/plugins/tidypics/lib/phpFlickr/phpFlickr.php b/plugins/tidypics/lib/phpFlickr/phpFlickr.php new file mode 100644 index 00000000..8ef65c58 --- /dev/null +++ b/plugins/tidypics/lib/phpFlickr/phpFlickr.php @@ -0,0 +1,1453 @@ +<?php +/* phpFlickr Class 2.3.1 + * Written by Dan Coulter (dan@dancoulter.com) + * Project Home Page: http://phpflickr.com/ + * Released under GNU Lesser General Public License (http://www.gnu.org/copyleft/lgpl.html) + * For more information about the class and upcoming tools and toys using it, + * visit http://www.phpflickr.com/ + * + * For installation instructions, open the README.txt file packaged with this + * class. If you don't have a copy, you can see it at: + * http://www.phpflickr.com/README.txt + * + * Please submit all problems or questions to the Help Forum on my Google Code project page: + * http://code.google.com/p/phpflickr/issues/list + * + */ +if (session_id() == "") { + @session_start(); +} + +// Decides which include path delimiter to use. Windows should be using a semi-colon +// and everything else should be using a colon. If this isn't working on your system, +// comment out this if statement and manually set the correct value into $path_delimiter. +if (strpos(__FILE__, ':') !== false) { + $path_delimiter = ';'; +} else { + $path_delimiter = ':'; +} + +// This will add the packaged PEAR files into the include path for PHP, allowing you +// to use them transparently. This will prefer officially installed PEAR files if you +// have them. If you want to prefer the packaged files (there shouldn't be any reason +// to), swap the two elements around the $path_delimiter variable. If you don't have +// the PEAR packages installed, you can leave this like it is and move on. + +ini_set('include_path', ini_get('include_path') . $path_delimiter . dirname(__FILE__) . '/PEAR'); + +// If you have problems including the default PEAR install (like if your open_basedir +// setting doesn't allow you to include files outside of your web root), comment out +// the line above and uncomment the next line: + +// ini_set('include_path', dirname(__FILE__) . '/PEAR' . $path_delimiter . ini_get('include_path')); + +class phpFlickr { + var $api_key; + var $secret; + var $REST = 'http://api.flickr.com/services/rest/'; + var $Upload = 'http://api.flickr.com/services/upload/'; + var $Replace = 'http://api.flickr.com/services/replace/'; + var $req; + var $response; + var $parsed_response; + var $cache = false; + var $cache_db = null; + var $cache_table = null; + var $cache_dir = null; + var $cache_expire = null; + var $die_on_error; + var $error_code; + Var $error_msg; + var $token; + var $php_version; + + /* + * When your database cache table hits this many rows, a cleanup + * will occur to get rid of all of the old rows and cleanup the + * garbage in the table. For most personal apps, 1000 rows should + * be more than enough. If your site gets hit by a lot of traffic + * or you have a lot of disk space to spare, bump this number up. + * You should try to set it high enough that the cleanup only + * happens every once in a while, so this will depend on the growth + * of your table. + */ + var $max_cache_rows = 1000; + + function phpFlickr ($api_key, $secret = NULL, $die_on_error = false) { + //The API Key must be set before any calls can be made. You can + //get your own at http://www.flickr.com/services/api/misc.api_keys.html + $this->api_key = $api_key; + $this->secret = $secret; + $this->die_on_error = $die_on_error; + $this->service = "flickr"; + + //Find the PHP version and store it for future reference + $this->php_version = explode("-", phpversion()); + $this->php_version = explode(".", $this->php_version[0]); + + //All calls to the API are done via the POST method using the PEAR::HTTP_Request package. + require_once 'HTTP/Request.php'; + $this->req =& new HTTP_Request(); + $this->req->setMethod(HTTP_REQUEST_METHOD_POST); + } + + function enableCache ($type, $connection, $cache_expire = 600, $table = 'flickr_cache') { + // Turns on caching. $type must be either "db" (for database caching) or "fs" (for filesystem). + // When using db, $connection must be a PEAR::DB connection string. Example: + // "mysql://user:password@server/database" + // If the $table, doesn't exist, it will attempt to create it. + // When using file system, caching, the $connection is the folder that the web server has write + // access to. Use absolute paths for best results. Relative paths may have unexpected behavior + // when you include this. They'll usually work, you'll just want to test them. + if ($type == 'db') { + require_once 'DB.php'; + $db =& DB::connect($connection); + if (PEAR::isError($db)) { + die($db->getMessage()); + } + + /* + * If high performance is crucial, you can easily comment + * out this query once you've created your database table. + */ + + $db->query(" + CREATE TABLE IF NOT EXISTS `$table` ( + `request` CHAR( 35 ) NOT NULL , + `response` MEDIUMTEXT NOT NULL , + `expiration` DATETIME NOT NULL , + INDEX ( `request` ) + ) TYPE = MYISAM"); + + if ($db->getOne("SELECT COUNT(*) FROM $table") > $this->max_cache_rows) { + $db->query("DELETE FROM $table WHERE expiration < DATE_SUB(NOW(), INTERVAL $cache_expire second)"); + $db->query('OPTIMIZE TABLE ' . $this->cache_table); + } + + $this->cache = 'db'; + $this->cache_db = $db; + $this->cache_table = $table; + } elseif ($type == 'fs') { + $this->cache = 'fs'; + $connection = realpath($connection); + $this->cache_dir = $connection; + if ($dir = opendir($this->cache_dir)) { + while ($file = readdir($dir)) { + if (substr($file, -6) == '.cache' && ((filemtime($this->cache_dir . '/' . $file) + $cache_expire) < time()) ) { + unlink($this->cache_dir . '/' . $file); + } + } + } + } + $this->cache_expire = $cache_expire; + } + + function getCached ($request) { + //Checks the database or filesystem for a cached result to the request. + //If there is no cache result, it returns a value of false. If it finds one, + //it returns the unparsed XML. + $reqhash = md5(serialize($request)); + if ($this->cache == 'db') { + $result = $this->cache_db->getOne("SELECT response FROM " . $this->cache_table . " WHERE request = ? AND DATE_SUB(NOW(), INTERVAL " . (int) $this->cache_expire . " SECOND) < expiration", $reqhash); + if (!empty($result)) { + return $result; + } + } elseif ($this->cache == 'fs') { + $file = $this->cache_dir . '/' . $reqhash . '.cache'; + if (file_exists($file)) { + if ($this->php_version[0] > 4 || ($this->php_version[0] == 4 && $this->php_version[1] >= 3)) { + return file_get_contents($file); + } else { + return implode('', file($file)); + } + } + } + return false; + } + + function cache ($request, $response) { + //Caches the unparsed XML of a request. + $reqhash = md5(serialize($request)); + if ($this->cache == 'db') { + //$this->cache_db->query("DELETE FROM $this->cache_table WHERE request = '$reqhash'"); + if ($this->cache_db->getOne("SELECT COUNT(*) FROM {$this->cache_table} WHERE request = '$reqhash'")) { + $sql = "UPDATE " . $this->cache_table . " SET response = ?, expiration = ? WHERE request = ?"; + $this->cache_db->query($sql, array($response, strftime("%Y-%m-%d %H:%M:%S"), $reqhash)); + } else { + $sql = "INSERT INTO " . $this->cache_table . " (request, response, expiration) VALUES ('$reqhash', '" . str_replace("'", "''", $response) . "', '" . strftime("%Y-%m-%d %H:%M:%S") . "')"; + $this->cache_db->query($sql); + } + } elseif ($this->cache == "fs") { + $file = $this->cache_dir . "/" . $reqhash . ".cache"; + $fstream = fopen($file, "w"); + $result = fwrite($fstream,$response); + fclose($fstream); + return $result; + } + return false; + } + + function request ($command, $args = array(), $nocache = false) { + //Sends a request to Flickr's REST endpoint via POST. + $this->req->setURL($this->REST); + $this->req->clearPostData(); + if (substr($command,0,7) != "flickr.") { + $command = "flickr." . $command; + } + + //Process arguments, including method and login data. + $args = array_merge(array("method" => $command, "format" => "php_serial", "api_key" => $this->api_key), $args); + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + ksort($args); + $auth_sig = ""; + if (!($this->response = $this->getCached($args)) || $nocache) { + foreach ($args as $key => $data) { + $auth_sig .= $key . $data; + $this->req->addPostData($key, $data); + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $this->req->addPostData("api_sig", $api_sig); + } + + $this->req->addHeader("Connection", "Keep-Alive"); + + //Send Requests + if ($this->req->sendRequest()) { + $this->response = $this->req->getResponseBody(); + $this->cache($args, $this->response); + } else { + die("There has been a problem sending your command to the server."); + } + } + /* + * Uncomment this line (and comment out the next one) if you're doing large queries + * and you're concerned about time. This will, however, change the structure of + * the result, so be sure that you look at the results. + */ + //$this->parsed_response = unserialize($this->response); + $this->parsed_response = $this->clean_text_nodes(unserialize($this->response)); + if ($this->parsed_response['stat'] == 'fail') { + if ($this->die_on_error) die("The Flickr API returned the following error: #{$this->parsed_response['code']} - {$this->parsed_response['message']}"); + else { + $this->error_code = $this->parsed_response['code']; + $this->error_msg = $this->parsed_response['message']; + $this->parsed_response = false; + } + } else { + $this->error_code = false; + $this->error_msg = false; + } + return $this->response; + } + + function clean_text_nodes ($arr) { + if (!is_array($arr)) { + return $arr; + } elseif (count($arr) == 0) { + return $arr; + } elseif (count($arr) == 1 && array_key_exists('_content', $arr)) { + return $arr['_content']; + } else { + foreach ($arr as $key => $element) { + $arr[$key] = $this->clean_text_nodes($element); + } + return($arr); + } + } + + function setToken ($token) { + // Sets an authentication token to use instead of the session variable + $this->token = $token; + } + + function setProxy ($server, $port) { + // Sets the proxy for all phpFlickr calls. + $this->req->setProxy($server, $port); + } + + function getErrorCode () { + // Returns the error code of the last call. If the last call did not + // return an error. This will return a false boolean. + return $this->error_code; + } + + function getErrorMsg () { + // Returns the error message of the last call. If the last call did not + // return an error. This will return a false boolean. + return $this->error_msg; + } + + /* These functions are front ends for the flickr calls */ + + function buildPhotoURL ($photo, $size = "Medium") { + //receives an array (can use the individual photo data returned + //from an API call) and returns a URL (doesn't mean that the + //file size exists) + $sizes = array( + "square" => "_s", + "thumbnail" => "_t", + "small" => "_m", + "medium" => "", + "large" => "_b", + "original" => "_o" + ); + + $size = strtolower($size); + if (!array_key_exists($size, $sizes)) { + $size = "medium"; + } + + if ($size == "original") { + $url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['originalsecret'] . "_o" . "." . $photo['originalformat']; + } else { + $url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['secret'] . $sizes[$size] . ".jpg"; + } + return $url; + } + + function getFriendlyGeodata ($lat, $lon) { + /* I've added this method to get the friendly geodata (i.e. 'in New York, NY') that the + * website provides, but isn't available in the API. I'm providing this service as long + * as it doesn't flood my server with requests and crash it all the time. + */ + return unserialize(file_get_contents('http://phpflickr.com/geodata/?format=php&lat=' . $lat . '&lon=' . $lon)); + } + + function sync_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) { + $upload_req =& new HTTP_Request(); + $upload_req->setMethod(HTTP_REQUEST_METHOD_POST); + + + $upload_req->setURL($this->Upload); + $upload_req->clearPostData(); + + //Process arguments, including method and login data. + $args = array("api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family); + if (!empty($this->email)) { + $args = array_merge($args, array("email" => $this->email)); + } + if (!empty($this->password)) { + $args = array_merge($args, array("password" => $this->password)); + } + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + + ksort($args); + $auth_sig = ""; + foreach ($args as $key => $data) { + if ($data !== null) { + $auth_sig .= $key . $data; + $upload_req->addPostData($key, $data); + } + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $upload_req->addPostData("api_sig", $api_sig); + } + + $photo = realpath($photo); + + $result = $upload_req->addFile("photo", $photo); + + if (PEAR::isError($result)) { + die($result->getMessage()); + } + + //Send Requests + if ($upload_req->sendRequest()) { + $this->response = $upload_req->getResponseBody(); + } else { + die("There has been a problem sending your command to the server."); + } + + $rsp = explode("\n", $this->response); + foreach ($rsp as $line) { + if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) { + if ($this->die_on_error) + die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); + else { + $this->error_code = $match[1]; + $this->error_msg = $match[2]; + $this->parsed_response = false; + return false; + } + } elseif (ereg("<photoid>(.*)</photoid>", $line, $match)) { + $this->error_code = false; + $this->error_msg = false; + return $match[1]; + } + } + } + + function async_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) { + $upload_req =& new HTTP_Request(); + $upload_req->setMethod(HTTP_REQUEST_METHOD_POST); + + $upload_req->setURL($this->Upload); + $upload_req->clearPostData(); + + //Process arguments, including method and login data. + $args = array("async" => 1, "api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family); + if (!empty($this->email)) { + $args = array_merge($args, array("email" => $this->email)); + } + if (!empty($this->password)) { + $args = array_merge($args, array("password" => $this->password)); + } + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + + ksort($args); + $auth_sig = ""; + foreach ($args as $key => $data) { + if ($data !== null) { + $auth_sig .= $key . $data; + $upload_req->addPostData($key, $data); + } + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $upload_req->addPostData("api_sig", $api_sig); + } + + $photo = realpath($photo); + + $result = $upload_req->addFile("photo", $photo); + + if (PEAR::isError($result)) { + die($result->getMessage()); + } + + //Send Requests + if ($upload_req->sendRequest()) { + $this->response = $upload_req->getResponseBody(); + } else { + die("There has been a problem sending your command to the server."); + } + + $rsp = explode("\n", $this->response); + foreach ($rsp as $line) { + if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) { + if ($this->die_on_error) + die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); + else { + $this->error_code = $match[1]; + $this->error_msg = $match[2]; + $this->parsed_response = false; + return false; + } + } elseif (ereg("<ticketid>(.*)</", $line, $match)) { + $this->error_code = false; + $this->error_msg = false; + return $match[1]; + } + } + } + + // Interface for new replace API method. + function replace ($photo, $photo_id, $async = null) { + $upload_req =& new HTTP_Request(); + $upload_req->setMethod(HTTP_REQUEST_METHOD_POST); + + $upload_req->setURL($this->Replace); + $upload_req->clearPostData(); + + //Process arguments, including method and login data. + $args = array("api_key" => $this->api_key, "photo_id" => $photo_id, "async" => $async); + if (!empty($this->email)) { + $args = array_merge($args, array("email" => $this->email)); + } + if (!empty($this->password)) { + $args = array_merge($args, array("password" => $this->password)); + } + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + + ksort($args); + $auth_sig = ""; + foreach ($args as $key => $data) { + if ($data !== null) { + $auth_sig .= $key . $data; + $upload_req->addPostData($key, $data); + } + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $upload_req->addPostData("api_sig", $api_sig); + } + + $photo = realpath($photo); + + $result = $upload_req->addFile("photo", $photo); + + if (PEAR::isError($result)) { + die($result->getMessage()); + } + + //Send Requests + if ($upload_req->sendRequest()) { + $this->response = $upload_req->getResponseBody(); + } else { + die("There has been a problem sending your command to the server."); + } + if ($async == 1) + $find = 'ticketid'; + else + $find = 'photoid'; + + $rsp = explode("\n", $this->response); + foreach ($rsp as $line) { + if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) { + if ($this->die_on_error) + die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); + else { + $this->error_code = $match[1]; + $this->error_msg = $match[2]; + $this->parsed_response = false; + return false; + } + } elseif (ereg("<" . $find . ">(.*)</", $line, $match)) { + $this->error_code = false; + $this->error_msg = false; + return $match[1]; + } + } + } + + function auth ($perms = "read", $remember_uri = true) { + // Redirects to Flickr's authentication piece if there is no valid token. + // If remember_uri is set to false, the callback script (included) will + // redirect to its default page. + + if (empty($_SESSION['phpFlickr_auth_token']) && empty($this->token)) { + if ($remember_uri) { + $redirect = $_SERVER['REQUEST_URI']; + } + $api_sig = md5($this->secret . "api_key" . $this->api_key . "extra" . $redirect . "perms" . $perms); + if ($this->service == "23") { + header("Location: http://www.23hq.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); + } else { + header("Location: http://www.flickr.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); + } + exit; + } else { + $tmp = $this->die_on_error; + $this->die_on_error = false; + $rsp = $this->auth_checkToken(); + if ($this->error_code !== false) { + unset($_SESSION['phpFlickr_auth_token']); + $this->auth($perms, $remember_uri); + } + $this->die_on_error = $tmp; + return $rsp['perms']; + } + } + + /******************************* + + To use the phpFlickr::call method, pass a string containing the API method you want + to use and an associative array of arguments. For example: + $result = $f->call("flickr.photos.comments.getList", array("photo_id"=>'34952612')); + This method will allow you to make calls to arbitrary methods that haven't been + implemented in phpFlickr yet. + + *******************************/ + + function call ($method, $arguments) { + foreach ( $arguments as $key => $value ) { + if ( is_null($value) ) unset($arguments[$key]); + } + $this->request($method, $arguments); + return $this->parsed_response ? $this->parsed_response : false; + } + + /* + These functions are the direct implementations of flickr calls. + For method documentation, including arguments, visit the address + included in a comment in the function. + */ + + /* Activity methods */ + function activity_userComments ($per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.activity.userComments.html */ + $this->request('flickr.activity.userComments', array("per_page" => $per_page, "page" => $page)); + return $this->parsed_response ? $this->parsed_response['items']['item'] : false; + } + + function activity_userPhotos ($timeframe = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.activity.userPhotos.html */ + $this->request('flickr.activity.userPhotos', array("timeframe" => $timeframe, "per_page" => $per_page, "page" => $page)); + return $this->parsed_response ? $this->parsed_response['items']['item'] : false; + } + + /* Authentication methods */ + function auth_checkToken () { + /* http://www.flickr.com/services/api/flickr.auth.checkToken.html */ + $this->request('flickr.auth.checkToken'); + return $this->parsed_response ? $this->parsed_response['auth'] : false; + } + + function auth_getFrob () { + /* http://www.flickr.com/services/api/flickr.auth.getFrob.html */ + $this->request('flickr.auth.getFrob'); + return $this->parsed_response ? $this->parsed_response['frob'] : false; + } + + function auth_getFullToken ($mini_token) { + /* http://www.flickr.com/services/api/flickr.auth.getFullToken.html */ + $this->request('flickr.auth.getFullToken', array('mini_token'=>$mini_token)); + return $this->parsed_response ? $this->parsed_response['auth'] : false; + } + + function auth_getToken ($frob) { + /* http://www.flickr.com/services/api/flickr.auth.getToken.html */ + $this->request('flickr.auth.getToken', array('frob'=>$frob)); + session_register('phpFlickr_auth_token'); + $_SESSION['phpFlickr_auth_token'] = $this->parsed_response['auth']['token']; + return $this->parsed_response ? $this->parsed_response['auth'] : false; + } + + /* Blogs methods */ + function blogs_getList ($service = NULL) { + /* http://www.flickr.com/services/api/flickr.blogs.getList.html */ + $rsp = $this->call('flickr.blogs.getList', array('service' => $service)); + return $rsp['blogs']['blog']; + } + + function blogs_getServices () { + /* http://www.flickr.com/services/api/flickr.blogs.getServices.html */ + return $this->call('flickr.blogs.getServices', array()); + } + + function blogs_postPhoto ($blog_id = NULL, $photo_id, $title, $description, $blog_password = NULL, $service = NULL) { + /* http://www.flickr.com/services/api/flickr.blogs.postPhoto.html */ + return $this->call('flickr.blogs.postPhoto', array('blog_id' => $blog_id, 'photo_id' => $photo_id, 'title' => $title, 'description' => $description, 'blog_password' => $blog_password, 'service' => $service)); + } + + /* Collections Methods */ + function collections_getInfo ($collection_id) { + /* http://www.flickr.com/services/api/flickr.collections.getInfo.html */ + return $this->call('flickr.collections.getInfo', array('collection_id' => $collection_id)); + } + + function collections_getTree ($collection_id = NULL, $user_id = NULL) { + /* http://www.flickr.com/services/api/flickr.collections.getTree.html */ + return $this->call('flickr.collections.getTree', array('collection_id' => $collection_id, 'user_id' => $user_id)); + } + + /* Commons Methods */ + function commons_getInstitutions () { + /* http://www.flickr.com/services/api/flickr.commons.getInstitutions.html */ + return $this->call('flickr.commons.getInstitutions', array()); + } + + /* Contacts Methods */ + function contacts_getList ($filter = NULL, $page = NULL, $per_page = NULL) { + /* http://www.flickr.com/services/api/flickr.contacts.getList.html */ + $this->request('flickr.contacts.getList', array('filter'=>$filter, 'page'=>$page, 'per_page'=>$per_page)); + return $this->parsed_response ? $this->parsed_response['contacts'] : false; + } + + function contacts_getPublicList ($user_id, $page = NULL, $per_page = NULL) { + /* http://www.flickr.com/services/api/flickr.contacts.getPublicList.html */ + $this->request('flickr.contacts.getPublicList', array('user_id'=>$user_id, 'page'=>$page, 'per_page'=>$per_page)); + return $this->parsed_response ? $this->parsed_response['contacts'] : false; + } + + function contacts_getListRecentlyUploaded ($date_lastupload = NULL, $filter = NULL) { + /* http://www.flickr.com/services/api/flickr.contacts.getListRecentlyUploaded.html */ + return $this->call('flickr.contacts.getListRecentlyUploaded', array('date_lastupload' => $date_lastupload, 'filter' => $filter)); + } + + /* Favorites Methods */ + function favorites_add ($photo_id) { + /* http://www.flickr.com/services/api/flickr.favorites.add.html */ + $this->request('flickr.favorites.add', array('photo_id'=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function favorites_getList ($user_id = NULL, $min_fave_date = NULL, $max_fave_date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.favorites.getList.html */ + return $this->call('flickr.favorites.getList', array('user_id' => $user_id, 'min_fave_date' => $min_fave_date, 'max_fave_date' => $max_fave_date, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + function favorites_getPublicList ($user_id, $min_fave_date = NULL, $max_fave_date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.favorites.getPublicList.html */ + return $this->call('flickr.favorites.getPublicList', array('user_id' => $user_id, 'min_fave_date' => $min_fave_date, 'max_fave_date' => $max_fave_date, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + function favorites_remove ($photo_id) { + /* http://www.flickr.com/services/api/flickr.favorites.remove.html */ + $this->request("flickr.favorites.remove", array("photo_id"=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Groups Methods */ + function groups_browse ($cat_id = NULL) { + /* http://www.flickr.com/services/api/flickr.groups.browse.html */ + $this->request("flickr.groups.browse", array("cat_id"=>$cat_id)); + return $this->parsed_response ? $this->parsed_response['category'] : false; + } + + function groups_getInfo ($group_id, $lang = NULL) { + /* http://www.flickr.com/services/api/flickr.groups.getInfo.html */ + return $this->call('flickr.groups.getInfo', array('group_id' => $group_id, 'lang' => $lang)); + } + + function groups_search ($text, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.groups.search.html */ + $this->request("flickr.groups.search", array("text"=>$text,"per_page"=>$per_page,"page"=>$page)); + return $this->parsed_response ? $this->parsed_response['groups'] : false; + } + + /* Groups Members Methods */ + function groups_members_getList ($group_id, $membertypes = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.groups.members.getList.html */ + return $this->call('flickr.groups.members.getList', array('group_id' => $group_id, 'membertypes' => $membertypes, 'per_page' => $per_page, 'page' => $page)); + } + + /* Groups Pools Methods */ + function groups_pools_add ($photo_id, $group_id) { + /* http://www.flickr.com/services/api/flickr.groups.pools.add.html */ + $this->request("flickr.groups.pools.add", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE); + return $this->parsed_response ? true : false; + } + + function groups_pools_getContext ($photo_id, $group_id) { + /* http://www.flickr.com/services/api/flickr.groups.pools.getContext.html */ + $this->request("flickr.groups.pools.getContext", array("photo_id"=>$photo_id, "group_id"=>$group_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function groups_pools_getGroups ($page = NULL, $per_page = NULL) { + /* http://www.flickr.com/services/api/flickr.groups.pools.getGroups.html */ + $this->request("flickr.groups.pools.getGroups", array('page'=>$page, 'per_page'=>$per_page)); + return $this->parsed_response ? $this->parsed_response['groups'] : false; + } + + function groups_pools_getPhotos ($group_id, $tags = NULL, $user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.groups.pools.getPhotos.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.groups.pools.getPhotos", array("group_id"=>$group_id, "tags"=>$tags, "user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function groups_pools_remove ($photo_id, $group_id) { + /* http://www.flickr.com/services/api/flickr.groups.pools.remove.html */ + $this->request("flickr.groups.pools.remove", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Interestingness methods */ + function interestingness_getList ($date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.interestingness.getList.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + + $this->request("flickr.interestingness.getList", array("date"=>$date, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + /* Machine Tag methods */ + function machinetags_getNamespaces ($predicate = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.machinetags.getNamespaces.html */ + return $this->call('flickr.machinetags.getNamespaces', array('predicate' => $predicate, 'per_page' => $per_page, 'page' => $page)); + } + + function machinetags_getPairs ($namespace = NULL, $predicate = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.machinetags.getPairs.html */ + return $this->call('flickr.machinetags.getPairs', array('namespace' => $namespace, 'predicate' => $predicate, 'per_page' => $per_page, 'page' => $page)); + } + + function machinetags_getPredicates ($namespace = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.machinetags.getPredicates.html */ + return $this->call('flickr.machinetags.getPredicates', array('namespace' => $namespace, 'per_page' => $per_page, 'page' => $page)); + } + + function machinetags_getRecentValues ($namespace = NULL, $predicate = NULL, $added_since = NULL) { + /* http://www.flickr.com/services/api/flickr.machinetags.getRecentValues.html */ + return $this->call('flickr.machinetags.getRecentValues', array('namespace' => $namespace, 'predicate' => $predicate, 'added_since' => $added_since)); + } + + function machinetags_getValues ($namespace, $predicate, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.machinetags.getValues.html */ + return $this->call('flickr.machinetags.getValues', array('namespace' => $namespace, 'predicate' => $predicate, 'per_page' => $per_page, 'page' => $page)); + } + + /* Panda methods */ + function panda_getList () { + /* http://www.flickr.com/services/api/flickr.panda.getList.html */ + return $this->call('flickr.panda.getList', array()); + } + + function panda_getPhotos ($panda_name, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.panda.getPhotos.html */ + return $this->call('flickr.panda.getPhotos', array('panda_name' => $panda_name, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + /* People methods */ + function people_findByEmail ($find_email) { + /* http://www.flickr.com/services/api/flickr.people.findByEmail.html */ + $this->request("flickr.people.findByEmail", array("find_email"=>$find_email)); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + function people_findByUsername ($username) { + /* http://www.flickr.com/services/api/flickr.people.findByUsername.html */ + $this->request("flickr.people.findByUsername", array("username"=>$username)); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + function people_getInfo ($user_id) { + /* http://www.flickr.com/services/api/flickr.people.getInfo.html */ + $this->request("flickr.people.getInfo", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['person'] : false; + } + + function people_getPublicGroups ($user_id) { + /* http://www.flickr.com/services/api/flickr.people.getPublicGroups.html */ + $this->request("flickr.people.getPublicGroups", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['groups']['group'] : false; + } + + function people_getPublicPhotos ($user_id, $safe_search = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.people.getPublicPhotos.html */ + return $this->call('flickr.people.getPublicPhotos', array('user_id' => $user_id, 'safe_search' => $safe_search, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + function people_getUploadStatus () { + /* http://www.flickr.com/services/api/flickr.people.getUploadStatus.html */ + /* Requires Authentication */ + $this->request("flickr.people.getUploadStatus"); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + + /* Photos Methods */ + function photos_addTags ($photo_id, $tags) { + /* http://www.flickr.com/services/api/flickr.photos.addTags.html */ + $this->request("flickr.photos.addTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_delete ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.delete.html */ + $this->request("flickr.photos.delete", array("photo_id"=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_getAllContexts ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.getAllContexts.html */ + $this->request("flickr.photos.getAllContexts", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function photos_getContactsPhotos ($count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getContactsPhotos.html */ + $this->request("flickr.photos.getContactsPhotos", array("count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras)); + return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false; + } + + function photos_getContactsPublicPhotos ($user_id, $count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getContactsPublicPhotos.html */ + $this->request("flickr.photos.getContactsPublicPhotos", array("user_id"=>$user_id, "count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras)); + return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false; + } + + function photos_getContext ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.getContext.html */ + $this->request("flickr.photos.getContext", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function photos_getCounts ($dates = NULL, $taken_dates = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getCounts.html */ + $this->request("flickr.photos.getCounts", array("dates"=>$dates, "taken_dates"=>$taken_dates)); + return $this->parsed_response ? $this->parsed_response['photocounts']['photocount'] : false; + } + + function photos_getExif ($photo_id, $secret = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getExif.html */ + $this->request("flickr.photos.getExif", array("photo_id"=>$photo_id, "secret"=>$secret)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_getFavorites ($photo_id, $page = NULL, $per_page = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getFavorites.html */ + $this->request("flickr.photos.getFavorites", array("photo_id"=>$photo_id, "page"=>$page, "per_page"=>$per_page)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_getInfo ($photo_id, $secret = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getInfo.html */ + $this->request("flickr.photos.getInfo", array("photo_id"=>$photo_id, "secret"=>$secret)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_getNotInSet ($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $media = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getNotInSet.html */ + return $this->call('flickr.photos.getNotInSet', array('min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date, 'privacy_filter' => $privacy_filter, 'media' => $media, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + function photos_getPerms ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.getPerms.html */ + $this->request("flickr.photos.getPerms", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['perms'] : false; + } + + function photos_getRecent ($extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getRecent.html */ + + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.photos.getRecent", array("extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_getSizes ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.getSizes.html */ + $this->request("flickr.photos.getSizes", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['sizes']['size'] : false; + } + + function photos_getUntagged ($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $media = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.getUntagged.html */ + return $this->call('flickr.photos.getUntagged', array('min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date, 'privacy_filter' => $privacy_filter, 'media' => $media, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + function photos_getWithGeoData ($args = array()) { + /* See the documentation included with the photos_search() function. + * I'm using the same style of arguments for this function. The only + * difference here is that this doesn't require any arguments. The + * flickr.photos.search method requires at least one search parameter. + */ + /* http://www.flickr.com/services/api/flickr.photos.getWithGeoData.html */ + $this->request("flickr.photos.getWithGeoData", $args); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_getWithoutGeoData ($args = array()) { + /* See the documentation included with the photos_search() function. + * I'm using the same style of arguments for this function. The only + * difference here is that this doesn't require any arguments. The + * flickr.photos.search method requires at least one search parameter. + */ + /* http://www.flickr.com/services/api/flickr.photos.getWithoutGeoData.html */ + $this->request("flickr.photos.getWithoutGeoData", $args); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_recentlyUpdated ($min_date, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.recentlyUpdated.html */ + return $this->call('flickr.photos.recentlyUpdated', array('min_date' => $min_date, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + function photos_removeTag ($tag_id) { + /* http://www.flickr.com/services/api/flickr.photos.removeTag.html */ + $this->request("flickr.photos.removeTag", array("tag_id"=>$tag_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_search ($args = array()) { + /* This function strays from the method of arguments that I've + * used in the other functions for the fact that there are just + * so many arguments to this API method. What you'll need to do + * is pass an associative array to the function containing the + * arguments you want to pass to the API. For example: + * $photos = $f->photos_search(array("tags"=>"brown,cow", "tag_mode"=>"any")); + * This will return photos tagged with either "brown" or "cow" + * or both. See the API documentation (link below) for a full + * list of arguments. + */ + + /* http://www.flickr.com/services/api/flickr.photos.search.html */ + $this->request("flickr.photos.search", $args); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_setContentType ($photo_id, $content_type) { + /* http://www.flickr.com/services/api/flickr.photos.setContentType.html */ + return $this->call('flickr.photos.setContentType', array('photo_id' => $photo_id, 'content_type' => $content_type)); + } + + function photos_setDates ($photo_id, $date_posted = NULL, $date_taken = NULL, $date_taken_granularity = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.setDates.html */ + $this->request("flickr.photos.setDates", array("photo_id"=>$photo_id, "date_posted"=>$date_posted, "date_taken"=>$date_taken, "date_taken_granularity"=>$date_taken_granularity), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_setMeta ($photo_id, $title, $description) { + /* http://www.flickr.com/services/api/flickr.photos.setMeta.html */ + $this->request("flickr.photos.setMeta", array("photo_id"=>$photo_id, "title"=>$title, "description"=>$description), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_setPerms ($photo_id, $is_public, $is_friend, $is_family, $perm_comment, $perm_addmeta) { + /* http://www.flickr.com/services/api/flickr.photos.setPerms.html */ + $this->request("flickr.photos.setPerms", array("photo_id"=>$photo_id, "is_public"=>$is_public, "is_friend"=>$is_friend, "is_family"=>$is_family, "perm_comment"=>$perm_comment, "perm_addmeta"=>$perm_addmeta), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_setSafetyLevel ($photo_id, $safety_level = NULL, $hidden = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.setSafetyLevel.html */ + return $this->call('flickr.photos.setSafetyLevel', array('photo_id' => $photo_id, 'safety_level' => $safety_level, 'hidden' => $hidden)); + } + + function photos_setTags ($photo_id, $tags) { + /* http://www.flickr.com/services/api/flickr.photos.setTags.html */ + $this->request("flickr.photos.setTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Comments Methods */ + function photos_comments_addComment ($photo_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photos.comments.addComment.html */ + $this->request("flickr.photos.comments.addComment", array("photo_id" => $photo_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? $this->parsed_response['comment'] : false; + } + + function photos_comments_deleteComment ($comment_id) { + /* http://www.flickr.com/services/api/flickr.photos.comments.deleteComment.html */ + $this->request("flickr.photos.comments.deleteComment", array("comment_id" => $comment_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_comments_editComment ($comment_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photos.comments.editComment.html */ + $this->request("flickr.photos.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_comments_getList ($photo_id, $min_comment_date = NULL, $max_comment_date = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.comments.getList.html */ + return $this->call('flickr.photos.comments.getList', array('photo_id' => $photo_id, 'min_comment_date' => $min_comment_date, 'max_comment_date' => $max_comment_date)); + } + + function photos_comments_getRecentForContacts ($date_lastcomment = NULL, $contacts_filter = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.comments.getRecentForContacts.html */ + return $this->call('flickr.photos.comments.getRecentForContacts', array('date_lastcomment' => $date_lastcomment, 'contacts_filter' => $contacts_filter, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + /* Photos - Geo Methods */ + function photos_geo_batchCorrectLocation ($lat, $lon, $accuracy, $place_id = NULL, $woe_id = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.geo.batchCorrectLocation.html */ + return $this->call('flickr.photos.geo.batchCorrectLocation', array('lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy, 'place_id' => $place_id, 'woe_id' => $woe_id)); + } + + function photos_geo_correctLocation ($photo_id, $place_id = NULL, $woe_id = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.geo.correctLocation.html */ + return $this->call('flickr.photos.geo.correctLocation', array('photo_id' => $photo_id, 'place_id' => $place_id, 'woe_id' => $woe_id)); + } + + function photos_geo_getLocation ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.geo.getLocation.html */ + $this->request("flickr.photos.geo.getLocation", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_geo_getPerms ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.geo.getPerms.html */ + $this->request("flickr.photos.geo.getPerms", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['perms'] : false; + } + + function photos_geo_photosForLocation ($lat, $lon, $accuracy = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.geo.photosForLocation.html */ + return $this->call('flickr.photos.geo.photosForLocation', array('lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); + } + + function photos_geo_removeLocation ($photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.geo.removeLocation.html */ + $this->request("flickr.photos.geo.removeLocation", array("photo_id"=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_geo_setContext ($photo_id, $context) { + /* http://www.flickr.com/services/api/flickr.photos.geo.setContext.html */ + return $this->call('flickr.photos.geo.setContext', array('photo_id' => $photo_id, 'context' => $context)); + } + + function photos_geo_setLocation ($photo_id, $lat, $lon, $accuracy = NULL, $context = NULL) { + /* http://www.flickr.com/services/api/flickr.photos.geo.setLocation.html */ + return $this->call('flickr.photos.geo.setLocation', array('photo_id' => $photo_id, 'lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy, 'context' => $context)); + } + + function photos_geo_setPerms ($is_public, $is_contact, $is_friend, $is_family, $photo_id) { + /* http://www.flickr.com/services/api/flickr.photos.geo.setPerms.html */ + return $this->call('flickr.photos.geo.setPerms', array('is_public' => $is_public, 'is_contact' => $is_contact, 'is_friend' => $is_friend, 'is_family' => $is_family, 'photo_id' => $photo_id)); + } + + /* Photos - Licenses Methods */ + function photos_licenses_getInfo () { + /* http://www.flickr.com/services/api/flickr.photos.licenses.getInfo.html */ + $this->request("flickr.photos.licenses.getInfo"); + return $this->parsed_response ? $this->parsed_response['licenses']['license'] : false; + } + + function photos_licenses_setLicense ($photo_id, $license_id) { + /* http://www.flickr.com/services/api/flickr.photos.licenses.setLicense.html */ + /* Requires Authentication */ + $this->request("flickr.photos.licenses.setLicense", array("photo_id"=>$photo_id, "license_id"=>$license_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Notes Methods */ + function photos_notes_add ($photo_id, $note_x, $note_y, $note_w, $note_h, $note_text) { + /* http://www.flickr.com/services/api/flickr.photos.notes.add.html */ + $this->request("flickr.photos.notes.add", array("photo_id" => $photo_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE); + return $this->parsed_response ? $this->parsed_response['note'] : false; + } + + function photos_notes_delete ($note_id) { + /* http://www.flickr.com/services/api/flickr.photos.notes.delete.html */ + $this->request("flickr.photos.notes.delete", array("note_id" => $note_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_notes_edit ($note_id, $note_x, $note_y, $note_w, $note_h, $note_text) { + /* http://www.flickr.com/services/api/flickr.photos.notes.edit.html */ + $this->request("flickr.photos.notes.edit", array("note_id" => $note_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Transform Methods */ + function photos_transform_rotate ($photo_id, $degrees) { + /* http://www.flickr.com/services/api/flickr.photos.transform.rotate.html */ + $this->request("flickr.photos.transform.rotate", array("photo_id" => $photo_id, "degrees" => $degrees), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Upload Methods */ + function photos_upload_checkTickets ($tickets) { + /* http://www.flickr.com/services/api/flickr.photos.upload.checkTickets.html */ + if (is_array($tickets)) { + $tickets = implode(",", $tickets); + } + $this->request("flickr.photos.upload.checkTickets", array("tickets" => $tickets), TRUE); + return $this->parsed_response ? $this->parsed_response['uploader']['ticket'] : false; + } + + /* Photosets Methods */ + function photosets_addPhoto ($photoset_id, $photo_id) { + /* http://www.flickr.com/services/api/flickr.photosets.addPhoto.html */ + $this->request("flickr.photosets.addPhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_create ($title, $description, $primary_photo_id) { + /* http://www.flickr.com/services/api/flickr.photosets.create.html */ + $this->request("flickr.photosets.create", array("title" => $title, "primary_photo_id" => $primary_photo_id, "description" => $description), TRUE); + return $this->parsed_response ? $this->parsed_response['photoset'] : false; + } + + function photosets_delete ($photoset_id) { + /* http://www.flickr.com/services/api/flickr.photosets.delete.html */ + $this->request("flickr.photosets.delete", array("photoset_id" => $photoset_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_editMeta ($photoset_id, $title, $description = NULL) { + /* http://www.flickr.com/services/api/flickr.photosets.editMeta.html */ + $this->request("flickr.photosets.editMeta", array("photoset_id" => $photoset_id, "title" => $title, "description" => $description), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_editPhotos ($photoset_id, $primary_photo_id, $photo_ids) { + /* http://www.flickr.com/services/api/flickr.photosets.editPhotos.html */ + $this->request("flickr.photosets.editPhotos", array("photoset_id" => $photoset_id, "primary_photo_id" => $primary_photo_id, "photo_ids" => $photo_ids), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_getContext ($photo_id, $photoset_id) { + /* http://www.flickr.com/services/api/flickr.photosets.getContext.html */ + $this->request("flickr.photosets.getContext", array("photo_id" => $photo_id, "photoset_id" => $photoset_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function photosets_getInfo ($photoset_id) { + /* http://www.flickr.com/services/api/flickr.photosets.getInfo.html */ + $this->request("flickr.photosets.getInfo", array("photoset_id" => $photoset_id)); + return $this->parsed_response ? $this->parsed_response['photoset'] : false; + } + + function photosets_getList ($user_id = NULL) { + /* http://www.flickr.com/services/api/flickr.photosets.getList.html */ + $this->request("flickr.photosets.getList", array("user_id" => $user_id)); + return $this->parsed_response ? $this->parsed_response['photosets'] : false; + } + + function photosets_getPhotos ($photoset_id, $extras = NULL, $privacy_filter = NULL, $per_page = NULL, $page = NULL, $media = NULL) { + /* http://www.flickr.com/services/api/flickr.photosets.getPhotos.html */ + return $this->call('flickr.photosets.getPhotos', array('photoset_id' => $photoset_id, 'extras' => $extras, 'privacy_filter' => $privacy_filter, 'per_page' => $per_page, 'page' => $page, 'media' => $media)); + } + + function photosets_orderSets ($photoset_ids) { + /* http://www.flickr.com/services/api/flickr.photosets.orderSets.html */ + if (is_array($photoset_ids)) { + $photoset_ids = implode(",", $photoset_ids); + } + $this->request("flickr.photosets.orderSets", array("photoset_ids" => $photoset_ids), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_removePhoto ($photoset_id, $photo_id) { + /* http://www.flickr.com/services/api/flickr.photosets.removePhoto.html */ + $this->request("flickr.photosets.removePhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photosets Comments Methods */ + function photosets_comments_addComment ($photoset_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photosets.comments.addComment.html */ + $this->request("flickr.photosets.comments.addComment", array("photoset_id" => $photoset_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? $this->parsed_response['comment'] : false; + } + + function photosets_comments_deleteComment ($comment_id) { + /* http://www.flickr.com/services/api/flickr.photosets.comments.deleteComment.html */ + $this->request("flickr.photosets.comments.deleteComment", array("comment_id" => $comment_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_comments_editComment ($comment_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photosets.comments.editComment.html */ + $this->request("flickr.photosets.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_comments_getList ($photoset_id) { + /* http://www.flickr.com/services/api/flickr.photosets.comments.getList.html */ + $this->request("flickr.photosets.comments.getList", array("photoset_id"=>$photoset_id)); + return $this->parsed_response ? $this->parsed_response['comments'] : false; + } + + /* Places Methods */ + function places_find ($query) { + /* http://www.flickr.com/services/api/flickr.places.find.html */ + return $this->call('flickr.places.find', array('query' => $query)); + } + + function places_findByLatLon ($lat, $lon, $accuracy = NULL) { + /* http://www.flickr.com/services/api/flickr.places.findByLatLon.html */ + return $this->call('flickr.places.findByLatLon', array('lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy)); + } + + function places_getChildrenWithPhotosPublic ($place_id = NULL, $woe_id = NULL) { + /* http://www.flickr.com/services/api/flickr.places.getChildrenWithPhotosPublic.html */ + return $this->call('flickr.places.getChildrenWithPhotosPublic', array('place_id' => $place_id, 'woe_id' => $woe_id)); + } + + function places_getInfo ($place_id = NULL, $woe_id = NULL) { + /* http://www.flickr.com/services/api/flickr.places.getInfo.html */ + return $this->call('flickr.places.getInfo', array('place_id' => $place_id, 'woe_id' => $woe_id)); + } + + function places_getInfoByUrl ($url) { + /* http://www.flickr.com/services/api/flickr.places.getInfoByUrl.html */ + return $this->call('flickr.places.getInfoByUrl', array('url' => $url)); + } + + function places_getPlaceTypes () { + /* http://www.flickr.com/services/api/flickr.places.getPlaceTypes.html */ + return $this->call('flickr.places.getPlaceTypes', array()); + } + + function places_getShapeHistory ($place_id = NULL, $woe_id = NULL) { + /* http://www.flickr.com/services/api/flickr.places.getShapeHistory.html */ + return $this->call('flickr.places.getShapeHistory', array('place_id' => $place_id, 'woe_id' => $woe_id)); + } + + function places_getTopPlacesList ($place_type_id, $date = NULL, $woe_id = NULL, $place_id = NULL) { + /* http://www.flickr.com/services/api/flickr.places.getTopPlacesList.html */ + return $this->call('flickr.places.getTopPlacesList', array('place_type_id' => $place_type_id, 'date' => $date, 'woe_id' => $woe_id, 'place_id' => $place_id)); + } + + function places_placesForBoundingBox ($bbox, $place_type = NULL, $place_type_id = NULL) { + /* http://www.flickr.com/services/api/flickr.places.placesForBoundingBox.html */ + return $this->call('flickr.places.placesForBoundingBox', array('bbox' => $bbox, 'place_type' => $place_type, 'place_type_id' => $place_type_id)); + } + + function places_placesForContacts ($place_type = NULL, $place_type_id = NULL, $woe_id = NULL, $place_id = NULL, $threshold = NULL, $contacts = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { + /* http://www.flickr.com/services/api/flickr.places.placesForContacts.html */ + return $this->call('flickr.places.placesForContacts', array('place_type' => $place_type, 'place_type_id' => $place_type_id, 'woe_id' => $woe_id, 'place_id' => $place_id, 'threshold' => $threshold, 'contacts' => $contacts, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); + } + + function places_placesForTags ($place_type_id, $woe_id = NULL, $place_id = NULL, $threshold = NULL, $tags = NULL, $tag_mode = NULL, $machine_tags = NULL, $machine_tag_mode = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { + /* http://www.flickr.com/services/api/flickr.places.placesForTags.html */ + return $this->call('flickr.places.placesForTags', array('place_type_id' => $place_type_id, 'woe_id' => $woe_id, 'place_id' => $place_id, 'threshold' => $threshold, 'tags' => $tags, 'tag_mode' => $tag_mode, 'machine_tags' => $machine_tags, 'machine_tag_mode' => $machine_tag_mode, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); + } + + function places_placesForUser ($place_type_id = NULL, $place_type = NULL, $woe_id = NULL, $place_id = NULL, $threshold = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { + /* http://www.flickr.com/services/api/flickr.places.placesForUser.html */ + return $this->call('flickr.places.placesForUser', array('place_type_id' => $place_type_id, 'place_type' => $place_type, 'woe_id' => $woe_id, 'place_id' => $place_id, 'threshold' => $threshold, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); + } + + function places_resolvePlaceId ($place_id) { + /* http://www.flickr.com/services/api/flickr.places.resolvePlaceId.html */ + $rsp = $this->call('flickr.places.resolvePlaceId', array('place_id' => $place_id)); + return $rsp ? $rsp['location'] : $rsp; + } + + function places_resolvePlaceURL ($url) { + /* http://www.flickr.com/services/api/flickr.places.resolvePlaceURL.html */ + $rsp = $this->call('flickr.places.resolvePlaceURL', array('url' => $url)); + return $rsp ? $rsp['location'] : $rsp; + } + + function places_tagsForPlace ($woe_id = NULL, $place_id = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { + /* http://www.flickr.com/services/api/flickr.places.tagsForPlace.html */ + return $this->call('flickr.places.tagsForPlace', array('woe_id' => $woe_id, 'place_id' => $place_id, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); + } + + /* Prefs Methods */ + function prefs_getContentType () { + /* http://www.flickr.com/services/api/flickr.prefs.getContentType.html */ + $rsp = $this->call('flickr.prefs.getContentType', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + function prefs_getGeoPerms () { + /* http://www.flickr.com/services/api/flickr.prefs.getGeoPerms.html */ + return $this->call('flickr.prefs.getGeoPerms', array()); + } + + function prefs_getHidden () { + /* http://www.flickr.com/services/api/flickr.prefs.getHidden.html */ + $rsp = $this->call('flickr.prefs.getHidden', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + function prefs_getPrivacy () { + /* http://www.flickr.com/services/api/flickr.prefs.getPrivacy.html */ + $rsp = $this->call('flickr.prefs.getPrivacy', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + function prefs_getSafetyLevel () { + /* http://www.flickr.com/services/api/flickr.prefs.getSafetyLevel.html */ + $rsp = $this->call('flickr.prefs.getSafetyLevel', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + /* Reflection Methods */ + function reflection_getMethodInfo ($method_name) { + /* http://www.flickr.com/services/api/flickr.reflection.getMethodInfo.html */ + $this->request("flickr.reflection.getMethodInfo", array("method_name" => $method_name)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function reflection_getMethods () { + /* http://www.flickr.com/services/api/flickr.reflection.getMethods.html */ + $this->request("flickr.reflection.getMethods"); + return $this->parsed_response ? $this->parsed_response['methods']['method'] : false; + } + + /* Tags Methods */ + function tags_getClusterPhotos ($tag, $cluster_id) { + /* http://www.flickr.com/services/api/flickr.tags.getClusterPhotos.html */ + return $this->call('flickr.tags.getClusterPhotos', array('tag' => $tag, 'cluster_id' => $cluster_id)); + } + + function tags_getClusters ($tag) { + /* http://www.flickr.com/services/api/flickr.tags.getClusters.html */ + return $this->call('flickr.tags.getClusters', array('tag' => $tag)); + } + + function tags_getHotList ($period = NULL, $count = NULL) { + /* http://www.flickr.com/services/api/flickr.tags.getHotList.html */ + $this->request("flickr.tags.getHotList", array("period" => $period, "count" => $count)); + return $this->parsed_response ? $this->parsed_response['hottags'] : false; + } + + function tags_getListPhoto ($photo_id) { + /* http://www.flickr.com/services/api/flickr.tags.getListPhoto.html */ + $this->request("flickr.tags.getListPhoto", array("photo_id" => $photo_id)); + return $this->parsed_response ? $this->parsed_response['photo']['tags']['tag'] : false; + } + + function tags_getListUser ($user_id = NULL) { + /* http://www.flickr.com/services/api/flickr.tags.getListUser.html */ + $this->request("flickr.tags.getListUser", array("user_id" => $user_id)); + return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false; + } + + function tags_getListUserPopular ($user_id = NULL, $count = NULL) { + /* http://www.flickr.com/services/api/flickr.tags.getListUserPopular.html */ + $this->request("flickr.tags.getListUserPopular", array("user_id" => $user_id, "count" => $count)); + return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false; + } + + function tags_getListUserRaw ($tag = NULL) { + /* http://www.flickr.com/services/api/flickr.tags.getListUserRaw.html */ + return $this->call('flickr.tags.getListUserRaw', array('tag' => $tag)); + } + + function tags_getRelated ($tag) { + /* http://www.flickr.com/services/api/flickr.tags.getRelated.html */ + $this->request("flickr.tags.getRelated", array("tag" => $tag)); + return $this->parsed_response ? $this->parsed_response['tags'] : false; + } + + function test_echo ($args = array()) { + /* http://www.flickr.com/services/api/flickr.test.echo.html */ + $this->request("flickr.test.echo", $args); + return $this->parsed_response ? $this->parsed_response : false; + } + + function test_login () { + /* http://www.flickr.com/services/api/flickr.test.login.html */ + $this->request("flickr.test.login"); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + function urls_getGroup ($group_id) { + /* http://www.flickr.com/services/api/flickr.urls.getGroup.html */ + $this->request("flickr.urls.getGroup", array("group_id"=>$group_id)); + return $this->parsed_response ? $this->parsed_response['group']['url'] : false; + } + + function urls_getUserPhotos ($user_id = NULL) { + /* http://www.flickr.com/services/api/flickr.urls.getUserPhotos.html */ + $this->request("flickr.urls.getUserPhotos", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['user']['url'] : false; + } + + function urls_getUserProfile ($user_id = NULL) { + /* http://www.flickr.com/services/api/flickr.urls.getUserProfile.html */ + $this->request("flickr.urls.getUserProfile", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['user']['url'] : false; + } + + function urls_lookupGroup ($url) { + /* http://www.flickr.com/services/api/flickr.urls.lookupGroup.html */ + $this->request("flickr.urls.lookupGroup", array("url"=>$url)); + return $this->parsed_response ? $this->parsed_response['group'] : false; + } + + function urls_lookupUser ($url) { + /* http://www.flickr.com/services/api/flickr.photos.notes.edit.html */ + $this->request("flickr.urls.lookupUser", array("url"=>$url)); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } +} + + +?> diff --git a/plugins/tidypics/lib/resize.php b/plugins/tidypics/lib/resize.php new file mode 100644 index 00000000..857d0ba1 --- /dev/null +++ b/plugins/tidypics/lib/resize.php @@ -0,0 +1,537 @@ +<?php +/** + * Elgg tidypics library of resizing functions + * + * @package TidypicsImageResize + */ + +include dirname(__FILE__) . "/watermark.php"; + + +/** + * Create thumbnails using PHP GD Library + * + * @param ElggFile holds the image that was uploaded + * @param string folder to store thumbnail in + * @param string name of the thumbnail + * @return bool TRUE on success + */ +function tp_create_gd_thumbnails($file, $prefix, $filestorename) { + global $CONFIG; + + $image_sizes = get_plugin_setting('image_sizes', 'tidypics'); + if (!$image_sizes) { + // move this out of library + register_error(elgg_echo('tidypics:nosettings')); + forward($_SERVER['HTTP_REFERER']); + return FALSE; + } + $image_sizes = unserialize($image_sizes); + + $thumb = new ElggFile(); + $thumb->owner_guid = $file->owner_guid; + $thumb->container_guid = $file->container_guid; + + // tiny thumbail + $thumb->setFilename($prefix."thumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_gd_resize( $file->getFilenameOnFilestore(), + $thumbname, + FALSE, + $image_sizes['thumb_image_width'], + $image_sizes['thumb_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->thumbnail = $prefix."thumb".$filestorename; + + // album thumbnail + global $CONFIG; + $CONFIG->debug = 'WARNING'; + $thumb->setFilename($prefix."smallthumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_gd_resize( $file->getFilenameOnFilestore(), + $thumbname, + FALSE, + $image_sizes['small_image_width'], + $image_sizes['small_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->smallthumb = $prefix."smallthumb".$filestorename; + unset($CONFIG->debug); + + // main image + $thumb->setFilename($prefix."largethumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_gd_resize( $file->getFilenameOnFilestore(), + $thumbname, + TRUE, + $image_sizes['large_image_width'], + $image_sizes['large_image_height'], + FALSE); + if (!$rtn_code) { + return FALSE; + } + $file->largethumb = $prefix."largethumb".$filestorename; + + + unset($thumb); + + return TRUE; +} + +/** + * Writes resized version of an already uploaded image - original from Elgg filestore.php + * Saves it in the same format as uploaded + * + * @param string $input_name The name of the file on the disk + * @param string $output_name The name of the file to be written + * @param bool - watermark this image? + * @param int $maxwidth The maximum width of the resized image + * @param int $maxheight The maximum height of the resized image + * @param TRUE|FALSE $square If set to TRUE, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped. + * @return bool TRUE on success or FALSE on failure + */ +function tp_gd_resize($input_name, $output_name, $watermark, $maxwidth, $maxheight, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + + // Get the size information from the image + $imgsizearray = getimagesize($input_name); + if (!$imgsizearray) { + return FALSE; + } + + // Get width and height of image + $width = $imgsizearray[0]; + $height = $imgsizearray[1]; + + $params = tp_im_calc_resize_params($width, $height, $maxwidth, $maxheight, $square, $x1, $y1, $x2, $y2); + if (!$params) { + return FALSE; + } + + $new_width = $params['new_width']; + $new_height = $params['new_height']; + $region_width = $params['region_width']; + $region_height = $params['region_height']; + $widthoffset = $params['width_offset']; + $heightoffset = $params['height_offset']; + + $accepted_formats = array( + 'image/jpeg' => 'jpeg', + 'image/pjpeg' => 'jpeg', + 'image/png' => 'png', + 'image/x-png' => 'png', + 'image/gif' => 'gif' + ); + + // make sure the function is available + $function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']]; + if (!is_callable($function)) { + return FALSE; + } + + // load old image + $oldimage = $function($input_name); + if (!$oldimage) { + return FALSE; + } + + // allocate the new image + $newimage = imagecreatetruecolor($new_width, $new_height); + if (!$newimage) { + return FALSE; + } + + $rtn_code = imagecopyresampled( $newimage, + $oldimage, + 0, + 0, + $widthoffset, + $heightoffset, + $new_width, + $new_height, + $region_width, + $region_height); + if (!$rtn_code) { + return $rtn_code; + } + + if ($watermark) { + tp_gd_watermark($newimage); + } + + switch ($imgsizearray['mime']) { + case 'image/jpeg': + case 'image/pjpeg': + $rtn_code = imagejpeg($newimage, $output_name, 85); + break; + case 'image/png': + case 'image/x-png': + $rtn_code = imagepng($newimage, $output_name); + break; + case 'image/gif': + $rtn_code = imagegif($newimage, $output_name); + break; + } + + imagedestroy($newimage); + imagedestroy($oldimage); + + return $rtn_code; +} + + +/** + * Create thumbnails using PHP imagick extension + * + * @param ElggFile holds the image that was uploaded + * @param string folder to store thumbnail in + * @param string name of the thumbnail + * @return bool TRUE on success + */ +function tp_create_imagick_thumbnails($file, $prefix, $filestorename) { + $image_sizes = get_plugin_setting('image_sizes', 'tidypics'); + if (!$image_sizes) { + register_error(elgg_echo('tidypics:nosettings')); + return FALSE; + } + $image_sizes = unserialize($image_sizes); + + $thumb = new ElggFile(); + $thumb->owner_guid = $file->owner_guid; + $thumb->container_guid = $file->container_guid; + + // tiny thumbnail + $thumb->setFilename($prefix."thumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_imagick_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['thumb_image_width'], + $image_sizes['thumb_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->thumbnail = $prefix."thumb".$filestorename; + + // album thumbnail + $thumb->setFilename($prefix."smallthumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_imagick_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['small_image_width'], + $image_sizes['small_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->smallthumb = $prefix."smallthumb".$filestorename; + + // main image + $thumb->setFilename($prefix."largethumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_imagick_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['large_image_width'], + $image_sizes['large_image_height'], + FALSE); + if (!$rtn_code) { + return FALSE; + } + $file->largethumb = $prefix."largethumb".$filestorename; + + tp_imagick_watermark($thumbname); + + unset($thumb); + + return TRUE; +} + + +/** + * Resize using PHP imagick extension + * + * Writes resized version of an already uploaded image + * + * + * @param string $input_name The name of the file input field on the submission form + * @param string $output_name The name of the file to be written + * @param int $maxwidth The maximum width of the resized image + * @param int $maxheight The maximum height of the resized image + * @param TRUE|FALSE $square If set to TRUE, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped. + * @return bool TRUE on success + */ +function tp_imagick_resize($input_name, $output_name, $maxwidth, $maxheight, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + + // Get the size information from the image + $imgsizearray = getimagesize($input_name); + if (!$imgsizearray) { + return FALSE; + } + + // Get width and height + $width = $imgsizearray[0]; + $height = $imgsizearray[1]; + + $params = tp_im_calc_resize_params($width, $height, $maxwidth, $maxheight, $square, $x1, $y1, $x2, $y2); + if (!$params) { + return FALSE; + } + + $new_width = $params['new_width']; + $new_height = $params['new_height']; + $region_width = $params['region_width']; + $region_height = $params['region_height']; + $widthoffset = $params['width_offset']; + $heightoffset = $params['height_offset']; + + try { + $img = new Imagick($input_name); + } catch (ImagickException $e) { + return FALSE; + } + + $img->cropImage($region_width, $region_height, $widthoffset, $heightoffset); + + // use the default IM filter (windowing filter), I think 1 means default blurring or number of lobes + $img->resizeImage($new_width, $new_height, imagick::FILTER_LANCZOS, 1); + $img->setImagePage($new_width, $new_height, 0, 0); + + if ($img->writeImage($output_name) != TRUE) { + $img->destroy(); + return FALSE; + } + + $img->destroy(); + + return TRUE; +} + +/** + * Create thumbnails using ImageMagick executables + * + * @param ElggFile holds the image that was uploaded + * @param string folder to store thumbnail in + * @param string name of the thumbnail + * @return bool TRUE on success + */ +function tp_create_im_cmdline_thumbnails($file, $prefix, $filestorename) { + $image_sizes = get_plugin_setting('image_sizes', 'tidypics'); + if (!$image_sizes) { + register_error(elgg_echo('tidypics:nosettings')); + return FALSE; + } + $image_sizes = unserialize($image_sizes); + + $thumb = new ElggFile(); + $thumb->owner_guid = $file->owner_guid; + $thumb->container_guid = $file->container_guid; + + // tiny thumbnail + $thumb->setFilename($prefix."thumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_im_cmdline_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['thumb_image_width'], + $image_sizes['thumb_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->thumbnail = $prefix."thumb".$filestorename; + + + // album thumbnail + $thumb->setFilename($prefix."smallthumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_im_cmdline_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['small_image_width'], + $image_sizes['small_image_height'], + TRUE); + if (!$rtn_code) { + return FALSE; + } + $file->smallthumb = $prefix."smallthumb".$filestorename; + + // main image + $thumb->setFilename($prefix."largethumb".$filestorename); + $thumbname = $thumb->getFilenameOnFilestore(); + $rtn_code = tp_im_cmdline_resize( $file->getFilenameOnFilestore(), + $thumbname, + $image_sizes['large_image_width'], + $image_sizes['large_image_height'], + FALSE); + if (!$rtn_code) { + return FALSE; + } + $file->largethumb = $prefix."largethumb".$filestorename; + + + tp_im_cmdline_watermark($thumbname); + + unset($thumb); + + return TRUE; +} + +/** + * Gets the jpeg contents of the resized version of an already uploaded image + * (Returns FALSE if the uploaded file was not an image) + * + * @param string $input_name The name of the file input field on the submission form + * @param string $output_name The name of the file to be written + * @param int $maxwidth The maximum width of the resized image + * @param int $maxheight The maximum height of the resized image + * @param TRUE|FALSE $square If set to TRUE, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped. + * @return bool + */ +function tp_im_cmdline_resize($input_name, $output_name, $maxwidth, $maxheight, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + + + // Get the size information from the image + $imgsizearray = getimagesize($input_name); + if (!$imgsizearray) { + return FALSE; + } + + // Get width and height + $orig_width = $imgsizearray[0]; + $orig_height = $imgsizearray[1]; + + $params = tp_im_calc_resize_params($orig_width, $orig_height, $maxwidth, $maxheight, $square, $x1, $y1, $x2, $y2); + if (!$params) { + return FALSE; + } + + $newwidth = $params['new_width']; + $newheight = $params['new_height']; + + $accepted_formats = array( + 'image/jpeg' => 'jpeg', + 'image/pjpeg' => 'jpeg', + 'image/png' => 'png', + 'image/x-png' => 'png', + 'image/gif' => 'gif' + ); + + // If it's a file we can manipulate ... + if (!array_key_exists($imgsizearray['mime'],$accepted_formats)) { + return FALSE; + } + + $im_path = get_plugin_setting('im_path', 'tidypics'); + if (!$im_path) { + $im_path = "/usr/bin/"; + } + if (substr($im_path, strlen($im_path)-1, 1) != "/") { + $im_path .= "/"; + } + + // see imagemagick web site for explanation of these parameters + // the ^ in the resize means those are minimum width and height values + $command = $im_path . "convert \"$input_name\" -resize ".$newwidth."x".$newheight."^ -gravity center -extent ".$newwidth."x".$newheight." \"$output_name\""; + $output = array(); + $ret = 0; + exec($command, $output, $ret); + if ($ret == 127) { + trigger_error('Tidypics warning: Image Magick convert is not found', E_USER_WARNING); + return FALSE; + } else if ($ret > 0) { + trigger_error('Tidypics warning: Image Magick convert failed', E_USER_WARNING); + return FALSE; + } + + return TRUE; +} + +/** + * Calculate the resizing/cropping parameters + * + * @param int $orig_width + * @param int $orig_height + * @param int $new_width + * @param int $new_height + * @param bool $square + * @param int $x1 + * @param int $y1 + * @param int $x2 + * @param int $y2 + * @return array|FALSE + */ +function tp_im_calc_resize_params($orig_width, $orig_height, $new_width, $new_height, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) { + // crop image first? + $crop = TRUE; + if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 == 0) { + $crop = FALSE; + } + + // how large a section of the image has been selected + if ($crop) { + $region_width = $x2 - $x1; + $region_height = $y2 - $y1; + } else { + // everything selected if no crop parameters + $region_width = $orig_width; + $region_height = $orig_height; + } + + // determine cropping offsets + if ($square) { + // asking for a square image back + + // detect case where someone is passing crop parameters that are not for a square + if ($crop == TRUE && $region_width != $region_height) { + return FALSE; + } + + // size of the new square image + $new_width = $new_height = min($new_width, $new_height); + + // find largest square that fits within the selected region + $region_width = $region_height = min($region_width, $region_height); + + // set offsets for crop + if ($crop) { + $widthoffset = $x1; + $heightoffset = $y1; + $orig_width = $x2 - $x1; + $orig_height = $orig_width; + } else { + // place square region in the center + $widthoffset = floor(($orig_width - $region_width) / 2); + $heightoffset = floor(($orig_height - $region_height) / 2); + } + } else { + // non-square new image + + // maintain aspect ratio of original image/crop + if (($region_height / (float)$new_height) > ($region_width / (float)$new_width)) { + $new_width = floor($new_height * $region_width / (float)$region_height); + } else { + $new_height = floor($new_width * $region_height / (float)$region_width); + } + + // by default, use entire image + $widthoffset = 0; + $heightoffset = 0; + + if ($crop) { + $widthoffset = $x1; + $heightoffset = $y1; + } + } + + $resize_params = array(); + $resize_params['new_width'] = $new_width; + $resize_params['new_height'] = $new_height; + $resize_params['region_width'] = $region_width; + $resize_params['region_height'] = $region_height; + $resize_params['width_offset'] = $widthoffset; + $resize_params['height_offset'] = $heightoffset; + + return $resize_params; +} \ No newline at end of file diff --git a/plugins/tidypics/lib/tidypics.php b/plugins/tidypics/lib/tidypics.php new file mode 100644 index 00000000..539db451 --- /dev/null +++ b/plugins/tidypics/lib/tidypics.php @@ -0,0 +1,295 @@ +<?php +/** + * Elgg tidypics library of common functions + * + * @package TidypicsCommon + */ + +/** + * Get images for display on front page + * + * @param int number of images + * @param int (optional) guid of owner + * @return string of html for display + * + * To use with the custom index plugin, use something like this: + + if (is_plugin_enabled('tidypics')) { + ?> + <!-- display latest photos --> + <div class="index_box"> + <h2><a href="<?php echo $vars['url']; ?>pg/photos/world/"><?php echo elgg_echo("tidypics:mostrecent"); ?></a></h2> + <div class="contentWrapper"> + <?php + echo tp_get_latest_photos(5); + ?> + </div> + </div> + <?php + } + ?> + + * Good luck + */ +function tp_get_latest_photos($num_images, $owner_guid = 0) { + $prev_context = set_context('front'); + $image_html = tp_list_entities('object', 'image', $owner_guid, null, $num_images, false, false, false); + set_context($prev_context); + return $image_html; +} + + +/** + * Get image directory path + * + * Each album gets a subdirectory based on its container id + * + * @return string path to image directory + */ +function tp_get_img_dir() { + $file = new ElggFile(); + return $file->getFilenameOnFilestore() . 'image/'; +} + + + +/********************************************************************* + * the functions below replace broken core functions or add functions + * that could/should exist in the core + */ + +/** + * + */ +function tp_get_entities($type = "", $subtype = "", $owner_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0, $container_guid = null, $timelower = 0, $timeupper = 0) { + global $CONFIG; + + if ($subtype === false || $subtype === null || $subtype === 0) + return false; + + if ($order_by == "") $order_by = "time_created desc"; + $order_by = sanitise_string($order_by); + $limit = (int)$limit; + $offset = (int)$offset; + $site_guid = (int) $site_guid; + $timelower = (int) $timelower; + $timeupper = (int) $timeupper; + if ($site_guid == 0) + $site_guid = $CONFIG->site_guid; + + $where = array(); + + if (is_array($subtype)) { + $tempwhere = ""; + if (sizeof($subtype)) + foreach($subtype as $typekey => $subtypearray) { + foreach($subtypearray as $subtypeval) { + $typekey = sanitise_string($typekey); + if (!empty($subtypeval)) { + if (!$subtypeval = (int) get_subtype_id($typekey, $subtypeval)) + return false; + } else { + // @todo: Setting subtype to 0 when $subtype = '' returns entities with + // no subtype. This is different to the non-array behavior + // but may be required in some cases. + $subtypeval = 0; + } + if (!empty($tempwhere)) $tempwhere .= " or "; + $tempwhere .= "(type = '{$typekey}' and subtype = {$subtypeval})"; + } + } + if (!empty($tempwhere)) $where[] = "({$tempwhere})"; + + } else { + + $type = sanitise_string($type); + if ($subtype !== "" AND !$subtype = get_subtype_id($type, $subtype)) + return false; + + if ($type != "") + $where[] = "type='$type'"; + if ($subtype!=="") + $where[] = "subtype=$subtype"; + } + + if ($owner_guid != "") { + if (!is_array($owner_guid)) { + $owner_array = array($owner_guid); + $owner_guid = (int) $owner_guid; + $where[] = "owner_guid = '$owner_guid'"; + } else if (sizeof($owner_guid) > 0) { + $owner_array = array_map('sanitise_int', $owner_guid); + // Cast every element to the owner_guid array to int + $owner_guid = array_map("sanitise_int", $owner_guid); + $owner_guid = implode(",",$owner_guid); + $where[] = "owner_guid in ({$owner_guid})"; + } + } + if ($site_guid > 0) + $where[] = "site_guid = {$site_guid}"; + + if (!is_null($container_guid)) { + if (is_array($container_guid)) { + foreach($container_guid as $key => $val) $container_guid[$key] = (int) $val; + $where[] = "container_guid in (" . implode(",",$container_guid) . ")"; + } else { + $container_guid = (int) $container_guid; + $where[] = "container_guid = {$container_guid}"; + } + } + if ($timelower) + $where[] = "time_created >= {$timelower}"; + if ($timeupper) + $where[] = "time_created <= {$timeupper}"; + + if (!$count) { + $query = "SELECT * from {$CONFIG->dbprefix}entities where "; + } else { + $query = "SELECT count(guid) as total from {$CONFIG->dbprefix}entities where "; + } + foreach ($where as $w) + $query .= " $w and "; + $query .= get_access_sql_suffix(); // Add access controls + + if (!$count) { + $query .= " order by $order_by"; + if ($limit) $query .= " limit $offset, $limit"; // Add order and limit + $dt = get_data($query, "entity_row_to_elggstar"); + return $dt; + } else { + $total = get_data_row($query); + return $total->total; + } +} + +function tp_list_entities($type= "", $subtype = "", $owner_guid = 0, $container_guid = null, $limit = 10, $fullview = true, $viewtypetoggle = false, $pagination = true) { + + $offset = (int) get_input('offset'); + $count = tp_get_entities($type, $subtype, $owner_guid, "", $limit, $offset, true, 0, $container_guid); + + $entities = tp_get_entities($type, $subtype, $owner_guid, "", $limit, $offset, false, 0, $container_guid); + + return tp_view_entity_list($entities, $count, $offset, $limit, $fullview, $viewtypetoggle, $pagination); +} + +function tp_view_entity_list($entities, $count, $offset, $limit, $fullview = true, $viewtypetoggle = false, $pagination = true) { + $context = get_context(); + + $html = elgg_view('tidypics/gallery',array( + 'entities' => $entities, + 'count' => $count, + 'offset' => $offset, + 'limit' => $limit, + 'baseurl' => $_SERVER['REQUEST_URI'], + 'fullview' => $fullview, + 'context' => $context, + 'viewtypetoggle' => $viewtypetoggle, + 'viewtype' => get_input('search_viewtype','list'), + 'pagination' => $pagination + )); + + return $html; +} + +function tp_get_entities_from_annotations_calculate_x($sum = "sum", $entity_type = "", $entity_subtype = "", $name = "", $mdname = '', $mdvalue = '', $owner_guid = 0, $limit = 10, $offset = 0, $orderdir = 'desc', $count = false) { + global $CONFIG; + + $sum = sanitise_string($sum); + $entity_type = sanitise_string($entity_type); + $entity_subtype = get_subtype_id($entity_type, $entity_subtype); + $name = get_metastring_id($name); + $limit = (int) $limit; + $offset = (int) $offset; + $owner_guid = (int) $owner_guid; + if (!empty($mdname) && !empty($mdvalue)) { + $meta_n = get_metastring_id($mdname); + $meta_v = get_metastring_id($mdvalue); + } + + if (empty($name)) return 0; + + $where = array(); + + if ($entity_type!="") + $where[] = "e.type='$entity_type'"; + if ($owner_guid > 0) + $where[] = "e.owner_guid = $owner_guid"; + if ($entity_subtype) + $where[] = "e.subtype=$entity_subtype"; + if ($name!="") + $where[] = "a.name_id='$name'"; + + if (!empty($mdname) && !empty($mdvalue)) { + if ($mdname!="") + $where[] = "m.name_id='$meta_n'"; + if ($mdvalue!="") + $where[] = "m.value_id='$meta_v'"; + } + + if ($sum != "count") + $where[] = "a.value_type='integer'"; // Limit on integer types + + if (!$count) { + $query = "SELECT distinct e.*, $sum(ms.string) as sum "; + } else { + $query = "SELECT count(distinct e.guid) as num, $sum(ms.string) as sum "; + } + $query .= " from {$CONFIG->dbprefix}entities e JOIN {$CONFIG->dbprefix}annotations a on a.entity_guid = e.guid JOIN {$CONFIG->dbprefix}metastrings ms on a.value_id=ms.id "; + + if (!empty($mdname) && !empty($mdvalue)) { + $query .= " JOIN {$CONFIG->dbprefix}metadata m on m.entity_guid = e.guid "; + } + + $query .= " WHERE "; + foreach ($where as $w) + $query .= " $w and "; + $query .= get_access_sql_suffix("a"); // now add access + $query .= ' and ' . get_access_sql_suffix("e"); // now add access + if (!$count) $query .= ' group by e.guid'; + + if (!$count) { + $query .= ' order by sum ' . $orderdir; + $query .= ' limit ' . $offset . ' , ' . $limit; + return get_data($query, "entity_row_to_elggstar"); + } else { + if ($row = get_data_row($query)) { + return $row->num; + } + } + return false; +} + +/** + * Is page owner a group - convenience function + * + * @return true/false + */ +function tp_is_group_page() { + + if ($group = page_owner_entity()) { + if ($group instanceof ElggGroup) + return true; + } + + return false; +} + + +/** + * Is the request from a known browser + * + * @return true/false + */ +function tp_is_person() { + $known = array('msie', 'mozilla', 'firefox', 'safari', 'webkit', 'opera', 'netscape', 'konqueror', 'gecko'); + + $agent = strtolower($_SERVER['HTTP_USER_AGENT']); + + foreach ($known as $browser) { + if (strpos($agent, $browser) !== false) { + return true; + } + } + + return false; +} diff --git a/plugins/tidypics/lib/watermark.php b/plugins/tidypics/lib/watermark.php new file mode 100644 index 00000000..6b16f0e4 --- /dev/null +++ b/plugins/tidypics/lib/watermark.php @@ -0,0 +1,193 @@ +<?php +/** + * Watermarking functions + * + * @package TidypicsWatermark + */ + +/** + * Make replacements in watermark text + * + * @param string $text + * @param ElggUser $owner + * @return string + */ +function tp_process_watermark_text($text, $owner) { + global $CONFIG; + + $text = str_replace("%name%", $owner->name, $text); + $text = str_replace("%sitename%", $CONFIG->sitename, $text); + + return $text; +} + +/** + * Create the watermark image filename + * + * @param string $text + * @param ElggUser $owner + * @return string + */ +function tp_get_watermark_filename($text, $owner) { + + $base = strtolower($text); + $base = preg_replace("/[^\w-]+/", "-", $base); + $base = trim($base, '-'); + + $filename = tp_get_img_dir(); + $filename .= strtolower($owner->username . "_" . $base . "_stamp"); + + return $filename; +} + +/** + * Use GD to apply watermark to image + * + * @param resource $image GD image resource + */ +function tp_gd_watermark($image) { + global $CONFIG; + + $watermark_text = get_plugin_setting('watermark_text', 'tidypics'); + if (!$watermark_text) { + return; + } + + // plugins can do their own watermark and return false to prevent this function from running + if (trigger_plugin_hook('tp_watermark', 'gd', $image, true) === false) { + return; + } + + $owner = get_loggedin_user(); + + $watermark_text = tp_process_watermark_text($watermark_text, $owner); + + // transparent gray + imagealphablending($image, true); + $textcolor = imagecolorallocatealpha($image, 50, 50, 50, 60); + + // font and location + $font = $CONFIG->pluginspath . "tidypics/fonts/LiberationSerif-Regular.ttf"; + $bbox = imagettfbbox(20, 0, $font, $watermark_text); + + $text_width = $bbox[2] - $bbox[0]; + $text_height = $bbox[1] - $bbox[7]; + + $image_width = imagesx($image); + $image_height = imagesy($image); + + $left = $image_width / 2 - $text_width / 2; + $top = $image_height - 20; + + // write the text on the image + imagettftext($image, 20, 0, $left, $top, $textcolor, $font, $watermark_text); +} + +/** + * imagick watermarking + * + * @param string $filename + * @return bool + */ +function tp_imagick_watermark($filename) { + + $watermark_text = get_plugin_setting('watermark_text', 'tidypics'); + if (!$watermark_text) { + return false; + } + + // plugins can do their own watermark and return false to prevent this function from running + if (trigger_plugin_hook('tp_watermark', 'imagick', $filename, true) === false) { + return true; + } + + $owner = get_loggedin_user(); + + $watermark_text = tp_process_watermark_text($watermark_text, $owner); + + $img = new Imagick($filename); + + $img->readImage($image); + + $draw = new ImagickDraw(); + + //$draw->setFont(""); + + $draw->setFontSize(28); + + $draw->setFillOpacity(0.5); + + $draw->setGravity(Imagick::GRAVITY_SOUTH); + + $img->annotateImage($draw, 0, 0, 0, $watermark_text); + + if ($img->writeImage($filename) != true) { + $img->destroy(); + return false; + } + + $img->destroy(); + + return true; +} + +/** + * ImageMagick watermarking + * + * @param string $filename + */ +function tp_im_cmdline_watermark($filename) { + + $watermark_text = get_plugin_setting('watermark_text', 'tidypics'); + if (!$watermark_text) { + return; + } + + // plugins can do their own watermark and return false to prevent this function from running + if (trigger_plugin_hook('tp_watermark', 'imagemagick', $filename, true) === false) { + return; + } + + $im_path = get_plugin_setting('im_path', 'tidypics'); + if (!$im_path) { + $im_path = "/usr/bin/"; + } + + // make sure end of path is / + if (substr($im_path, strlen($im_path)-1, 1) != "/") { + $im_path .= "/"; + } + + + $owner = get_loggedin_user(); + + $watermark_text = tp_process_watermark_text($watermark_text, $owner); + + $ext = ".png"; + + $user_stamp_base = tp_get_watermark_filename($watermark_text, $owner); + + + if ( !file_exists( $user_stamp_base . $ext )) { + //create the watermark image if it doesn't exist + $commands = array(); + $commands[] = $im_path . 'convert -size 300x50 xc:grey30 -pointsize 20 -gravity center -draw "fill grey70 text 0,0 \''. $watermark_text . '\'" "'. $user_stamp_base . '_fgnd' . $ext . '"'; + $commands[] = $im_path . 'convert -size 300x50 xc:black -pointsize 20 -gravity center -draw "fill white text 1,1 \''. $watermark_text . '\' text 0,0 \''. $watermark_text . '\' fill black text -1,-1 \''. $watermark_text . '\'" +matte ' . $user_stamp_base . '_mask' . $ext; + $commands[] = $im_path . 'composite -compose CopyOpacity "' . $user_stamp_base . "_mask" . $ext . '" "' . $user_stamp_base . '_fgnd' . $ext . '" "' . $user_stamp_base . $ext . '"'; + $commands[] = $im_path . 'mogrify -trim +repage "' . $user_stamp_base . $ext . '"'; + $commands[] = 'rm "' . $user_stamp_base . '_mask' . $ext . '"'; + $commands[] = 'rm "' . $user_stamp_base . '_fgnd' . $ext . '"'; + + foreach( $commands as $command ) { + exec( $command ); + } + } + + //apply the watermark + $commands = array(); + $commands[] = $im_path . 'composite -gravity south -geometry +0+10 "' . $user_stamp_base . $ext . '" "' . $filename . '" "' . $filename . '_watermarked"'; + $commands[] = "mv \"$filename" . "_watermarked\" \"$filename\""; + foreach( $commands as $command ) { + exec( $command ); + } +} diff --git a/plugins/tidypics/manifest.xml b/plugins/tidypics/manifest.xml new file mode 100644 index 00000000..d630e960 --- /dev/null +++ b/plugins/tidypics/manifest.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin_manifest> + <field key="author" value="The Tidypics team" /> + <field key="version" value="1.6.8" /> + <field key="description" value="Tidypics Photo Gallery" /> + <field key="website" value="http://code.google.com/p/tidypics/" /> + <field key="copyright" value="2008-2010 Cash Costello and the Tidypics Team" /> + <field key="licence" value="GNU General Public License version 2" /> + <field key="elgg_version" value="2009022701" /> +</plugin_manifest> diff --git a/plugins/tidypics/mostvieweddashboard.php b/plugins/tidypics/mostvieweddashboard.php new file mode 100644 index 00000000..5e7dc41c --- /dev/null +++ b/plugins/tidypics/mostvieweddashboard.php @@ -0,0 +1,44 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'tp_view' + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + + $title = elgg_echo("tidypics:mostvieweddashboard"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> diff --git a/plugins/tidypics/pages/admin.php b/plugins/tidypics/pages/admin.php new file mode 100644 index 00000000..437d2f47 --- /dev/null +++ b/plugins/tidypics/pages/admin.php @@ -0,0 +1,24 @@ +<?php + /****************************************************************** + * + * Tidypics Admin Settings + * + *******************************************************************/ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + global $CONFIG; + + admin_gatekeeper(); + set_context('admin'); + set_page_owner($_SESSION['guid']); + + $tab = isset($_GET['tab']) ? $_GET['tab'] : 'settings'; + + $body = elgg_view_title(elgg_echo('tidypics:administration')); + + $body .= elgg_view("tidypics/admin/tidypics", array('tab' => $tab)); + + page_draw(elgg_echo('tidypics:administration'), elgg_view_layout("two_column_left_sidebar", '', $body)); + +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/download.php b/plugins/tidypics/pages/download.php new file mode 100644 index 00000000..e4ad2e85 --- /dev/null +++ b/plugins/tidypics/pages/download.php @@ -0,0 +1,52 @@ +<?php + /** + * Tidypics Download Photos + * + * do not call this directly - call through page handler + */ + + global $CONFIG; + + $file_guid = (int) get_input("file_guid"); + $file = get_entity($file_guid); + + $type = get_input("type"); + + if ($file) { + $filename = $file->originalfilename; + $mime = $file->mimetype; + + header("Content-Type: $mime"); + if ($type == "inline") + header("Content-Disposition: inline; filename=\"$filename\""); + else + header("Content-Disposition: attachment; filename=\"$filename\""); + + + $readfile = new ElggFile($file_guid); + $readfile->owner_guid = $file->owner_guid; + + $contents = $readfile->grabFile(); + + if (empty($contents)) { + echo file_get_contents(dirname(dirname(__FILE__)) . "/graphics/image_error_large.png" ); + } else { + + // expires every 60 days + $expires = 60 * 60*60*24; + + header("Content-Length: " . strlen($contents)); + header("Cache-Control: public", true); + header("Pragma: public", true); + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT', true); + + + echo $contents; + } + + exit; + } + else + register_error(elgg_echo("image:downloadfailed")); + +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/edit.php b/plugins/tidypics/pages/edit.php new file mode 100644 index 00000000..abf1a0fd --- /dev/null +++ b/plugins/tidypics/pages/edit.php @@ -0,0 +1,51 @@ +<?php + /** + * Tidypics Edit for Albums and Single Photos + * + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + // make sure the user is logged_in + gatekeeper(); + + set_context('photos'); + $guid = (int) get_input('guid'); + + if (!$entity = get_entity($guid)) + forward(); + + if (!$entity->canEdit()) + forward(); + + $subtype = $entity->getSubtype(); + + if ($subtype == 'album') { + $title = elgg_echo('album:edit'); + + if ($container = $entity->container_guid) + set_page_owner($container); + + } else if ($subtype == 'image') { + $title = elgg_echo('image:edit'); + + if ($container = get_entity($entity->container_guid)->container_guid) + set_page_owner($container); + + } else { + forward(); + } + + $page_owner = page_owner_entity(); + if ($page_owner instanceof ElggGroup) { + add_submenu_item( sprintf(elgg_echo('album:group'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/owned/" . $page_owner->username); + } + + + $area2 .= elgg_view_title($title); + $area2 .= elgg_view('tidypics/forms/edit', array('entity' => $entity, 'subtype' => $subtype)); + $body = elgg_view_layout('two_column_left_sidebar', $area1, $area2); + + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/edit_multiple.php b/plugins/tidypics/pages/edit_multiple.php new file mode 100644 index 00000000..49b7dd6f --- /dev/null +++ b/plugins/tidypics/pages/edit_multiple.php @@ -0,0 +1,47 @@ +<?php + /** + * Tidypics: Edit the properties of multiple images + * + * Called after upload only + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + gatekeeper(); + set_context('photos'); + + // parse out photo guids + $file_string = get_input('files'); + $file_array_sent = explode('-', $file_string); + $new_file_array = array(); + + // set owner of page based on first photo guid + $photo_guid = (int)$file_array_sent[0]; + $photo = get_entity($photo_guid); + + // set page owner based on owner of photo album + set_page_owner($photo->owner_guid); + $album = get_entity($photo->container_guid); + if ($album) { + $owner_guid = $album->container_guid; + if ($owner_guid) + set_page_owner($owner_guid); + } + + foreach ($file_array_sent as $file_guid) { + if ($entity = get_entity($file_guid)) { + if ($entity->canEdit()){ + array_push($new_file_array, $file_guid); + } + if (!$album_guid) + $album_guid = $entity->container_guid; + + } + } + + $title = elgg_echo('tidypics:editprops'); + $area2 .= elgg_view_title($title); + $area2 .= elgg_view("tidypics/forms/edit_multi", array('file_array' => $new_file_array, 'album_guid' => $album_guid)); + $body = elgg_view_layout('two_column_left_sidebar', $area1, $area2); + page_draw($title, $body); +?> diff --git a/plugins/tidypics/pages/flickr/importPhotosets.php b/plugins/tidypics/pages/flickr/importPhotosets.php new file mode 100644 index 00000000..a807a078 --- /dev/null +++ b/plugins/tidypics/pages/flickr/importPhotosets.php @@ -0,0 +1,50 @@ +<?php + + /** + * Import a set of photos from Flickr + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + $body = elgg_view_title( elgg_echo( 'flickr:importmanager' )); + $body .= "<h2>" . elgg_echo( 'flickr:desc' ) . "</h2>"; + + $viewer = get_loggedin_user(); + + require_once dirname(dirname(dirname(__FILE__))) . "/lib/phpFlickr/phpFlickr.php"; + require_once( dirname(dirname(dirname(__FILE__)))) . "/lib/flickr.php"; + $f = new phpFlickr("26b2abba37182aca62fe0eb2c7782050"); + + $viewer = get_loggedin_user(); + $flickr_username = get_metadata_byname( $viewer->guid, "flickr_username" ); + $flickr_id = get_metadata_byname( $viewer->guid, "flickr_id" ); + $album_id = get_metadata_byname( $viewer->guid, "flickr_album_id" ); + + if( intval( $album_id->value ) <= 0 ) { + register_error( sprintf( elgg_echo( 'flickr:errornoalbum' ), $album_id->value )); + forward( "/mod/tidypics/pages/flickr/setup.php" ); + } + + $photosets = $f->photosets_getList( $flickr_id->value ); + foreach( $photosets["photoset"] as $photoset ) { + $body .= "<div class='tidypics_album_images'>"; + $body .= "$photoset[title]<br />"; + + $count = 0; + $looper = 0; + //create links to import photos 10 at a time + while( $photoset["photos"] > $count ) { + $looper++; + $body .= " <a href='/mod/tidypics/actions/flickrImportPhotoset.php?set_id=$photoset[id]&page=$looper&album_id=$album_id->value'>$looper</a>"; + $count = $count + 10; + } + $body .= "<br />$photoset[photos] images"; + $body .= "</div>"; +// echo "<pre>"; var_dump( $photoset ); echo "</pre>"; die; + } + +// $body .= elgg_view("tidypics/forms/setupFlickr", array(), false, true ); + flickr_menu(); + page_draw( elgg_echo( 'flickr:importmanager' ), elgg_view_layout("two_column_left_sidebar", '', $body)); + +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/flickr/setup.php b/plugins/tidypics/pages/flickr/setup.php new file mode 100644 index 00000000..1de8c29c --- /dev/null +++ b/plugins/tidypics/pages/flickr/setup.php @@ -0,0 +1,17 @@ +<?php + + /** + * Setup a users Flickr username + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + $viewer = get_loggedin_user(); + + $body = elgg_view_title( elgg_echo( 'flickr:setup') ); + $body .= elgg_view("tidypics/forms/setupFlickr", array(), false, true ); +// echo "<pre>"; var_dump($body); echo "</pre>"; + page_draw( elgg_echo( 'flickr:setup'), elgg_view_layout("two_column_left_sidebar", '', $body)); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/friends.php b/plugins/tidypics/pages/friends.php new file mode 100644 index 00000000..03ae1300 --- /dev/null +++ b/plugins/tidypics/pages/friends.php @@ -0,0 +1,41 @@ +<?php + /** + * Tidypics Friends Albums Listing + * + * List all the albums of someone's friends + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + $username = get_input('username'); + + // if no username, redirect to world photo albums + if (!$username) { + forward('pg/photos/world'); + } + + // setup title + $user = get_user_by_username($username); + if (!$user) { + forward('pg/photos/world'); + } + if ($user->guid == get_loggedin_userid()) + $title = elgg_echo('album:yours:friends'); + else + $title = sprintf(elgg_echo('album:friends'), $user->name); + + $area2 = elgg_view_title($title); + + $albums = get_user_friends_objects($user->guid, 'album', 12); + + // get html for viewing list of photo albums + set_context('search'); + set_input('search_viewtype', 'gallery'); // need to force gallery view + $content = tp_view_entity_list($albums, count($albums), 0, 12, false, false, true); + + $area2 = elgg_view('tidypics/content_wrapper', array('title' => $title, 'content' => $content,)); + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/flickr.php b/plugins/tidypics/pages/lists/flickr.php new file mode 100644 index 00000000..b9886042 --- /dev/null +++ b/plugins/tidypics/pages/lists/flickr.php @@ -0,0 +1,60 @@ +<?php +require_once dirname(dirname(dirname(__FILE__))) . "/lib/phpFlickr/phpFlickr.php"; +$f = new phpFlickr("26b2abba37182aca62fe0eb2c7782050"); + +// Load Elgg engine +include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + +$username = get_input('username'); +if( !empty( $username )) { + $temp_user = get_user_by_username( $username ); +} else { + $temp_user = get_loggedin_user(); +} +$flickr_username = get_metadata_byname( $temp_user->guid, "flickr_username" ); +if( empty( $flickr_username )) { + register_error( "No Flickr username set"); + echo "<pre>No flickr username set: $temp_user->guid"; die; + forward( "/" ); + die; +} +$flickr_user = $f->people_findByUsername( $flickr_username->value ); + +// Get the friendly URL of the user's photos +$photos_url = $f->urls_getUserPhotos( $flickr_user["id"] ); + +if( !empty( $flickr_user )) { + $recent = $f->people_getPublicPhotos( $flickr_user['id'], NULL, NULL, 5 ); +} else { + echo "user not found"; die; +} +//echo "<pre>"; var_dump( $recent ); echo "</pre>"; + +//echo "<pre>"; var_dump( $user ); echo "</pre>"; +$body = elgg_view_title( "Flickr photos for $flickr_user[username]" ); + +$count = 0; +foreach ($recent['photos']['photo'] as $photo) { + + $photo_info = $f->photos_getInfo( $photo["id"], $photo["secret"] ); + $body .= "<div class='tidypics_album_images'>"; + $body .= "$photo_info[title]<br />Views: $photo_info[views]<br />"; + $body .= "<a href=$photos_url$photo[id]>"; + $body .= "<img border='0' alt='$photo[title]' ". + "src=" . $f->buildPhotoURL($photo, "Square") . ">"; + $body .= "</a>"; + + $tag_count = 0; + $body .= "<br /><div style='font-size: 8px;'>Tags:<br />"; + foreach( $photo_info["tags"]["tag"] as $tag ) { + if( $tag_count ) $body .= ", "; + $body .= "$tag[_content]"; + $tag_count++; + } + + $body .= "</div></div>"; + $count++; +} +page_draw( "Flickr photos for $flickr_user[username]", elgg_view_layout("two_column_left_sidebar", '', $body)); + +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/highestrated.php b/plugins/tidypics/pages/lists/highestrated.php new file mode 100644 index 00000000..e05e7a9b --- /dev/null +++ b/plugins/tidypics/pages/lists/highestrated.php @@ -0,0 +1,65 @@ +<?php + /** + * Tidypics Friends Albums Listing + * + */ + + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + //if no friends were requested, see world pictures instead, or redirect to user's friends +/* if (is_null(get_input('username')) || get_input('username')=='') { + if (!isloggedin()) { + forward('pg/photos/world'); + } else { + forward('pg/photos/friends/' . $_SESSION['user']->username); + } + }*/ + +// if (is_null(page_owner_entity()->name) || page_owner_entity()->name == '') { +// $groupname = get_input('username'); +// } else { +// $groupname = page_owner_entity()->name; +// }; +// + //there has to be a better way to do this + if(!$groupname) { + $page = get_input("page"); + list($pagename, $groupname) = split("/", $page); + } + + list($group_holder, $album_id) = split(":", $groupname); +// echo "<pre>page: $page\ngroup: $groupname\nalbum: $album_id"; die; + + $user = get_user_by_username($friendname); + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + $sql = "SELECT ent.guid, count(1) as mycount, avg(ms2.string) as average + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' AND ent.container_guid = $album_id + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'generic_rate' + INNER JOIN " . $prefix . "metastrings ms2 ON ms2.id = ann1.value_id + INNER JOIN " . $prefix . "users_entity u ON ann1.owner_guid = u.guid + GROUP BY ent.guid HAVING mycount > 1 + ORDER BY average DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + $album = get_entity($album_id); + $title = $album["title"] . ": " . elgg_echo("tidypics:highestrated"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); + +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/highestvotecount.php b/plugins/tidypics/pages/lists/highestvotecount.php new file mode 100644 index 00000000..26b90714 --- /dev/null +++ b/plugins/tidypics/pages/lists/highestvotecount.php @@ -0,0 +1,50 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + $sql = "SELECT ent.guid, u.name as owner, count( 1 ) AS mycount, avg( ms2.string ) AS average + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'generic_rate' + INNER JOIN " . $prefix . "metastrings ms2 ON ms2.id = ann1.value_id + INNER JOIN " . $prefix . "users_entity u ON ent.owner_guid = u.guid + GROUP BY ent.guid + ORDER BY mycount DESC + LIMIT $max"; + + $result = get_data($sql); + + $title = "Most voted images"; + $area2 = elgg_view_title($title); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + $full_entity = get_entity($entity->guid); + $area2 .= " <div class='tidypics_album_images'> + Owner: $entity->owner<br /> + Votes: $entity->mycount<br /> + Average: $entity->average + </div> + "; + $area2 .= elgg_view_entity($full_entity); + + } + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostcommentedimages.php b/plugins/tidypics/pages/lists/mostcommentedimages.php new file mode 100644 index 00000000..801409fd --- /dev/null +++ b/plugins/tidypics/pages/lists/mostcommentedimages.php @@ -0,0 +1,43 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'generic_comment' + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + $title = elgg_echo("tidypics:mostcommented"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostcommentedimagesthismonth.php b/plugins/tidypics/pages/lists/mostcommentedimagesthismonth.php new file mode 100644 index 00000000..d95e2aff --- /dev/null +++ b/plugins/tidypics/pages/lists/mostcommentedimagesthismonth.php @@ -0,0 +1,50 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + + //find timestamps for first and last days of this month + $time_info = new stdClass(); + $time_info->start = mktime(0,0,0, date("m"), 1, date("Y")); + $time_info->end = mktime(); + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'generic_comment' + WHERE ann1.time_created BETWEEN $time_info->start AND $time_info->end + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + $title = elgg_echo("tidypics:mostcommentedthismonth"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostcommentedimagestoday.php b/plugins/tidypics/pages/lists/mostcommentedimagestoday.php new file mode 100644 index 00000000..bd1a0cbe --- /dev/null +++ b/plugins/tidypics/pages/lists/mostcommentedimagestoday.php @@ -0,0 +1,50 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + + //find timestamps for today + $time_info = new stdClass(); + $time_info->start = mktime(0,0,0, date("m"), date("d"), date("Y")); + $time_info->end = mktime(); + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'generic_comment' + WHERE ann1.time_created BETWEEN $time_info->start AND $time_info->end + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + $title = elgg_echo("tidypics:mostcommentedtoday"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostrecentimages.php b/plugins/tidypics/pages/lists/mostrecentimages.php new file mode 100644 index 00000000..178e3c72 --- /dev/null +++ b/plugins/tidypics/pages/lists/mostrecentimages.php @@ -0,0 +1,56 @@ +<?php + + /** + * Most recently uploaded images - individual or world + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + // start with assumption this is for all site photos + $title = elgg_echo('tidypics:mostrecent'); + $user_id = 0; + + // is this all site or an individuals images + $username = get_input('username'); + if ($username) { + $user = get_user_by_username($username); + if ($user) { + $user_id = $user->guid; + + if ($user_id == get_loggedin_userid()) + $title = elgg_echo('tidypics:yourmostrecent'); + else + $title = sprintf(elgg_echo("tidypics:friendmostrecent"), $user->name); + } + } else { + // world view - set page owner to logged in user + if (isloggedin()) { + set_page_owner(get_loggedin_userid()); + } + } + + // allow other plugins to override the slideshow + $slideshow_link = trigger_plugin_hook('tp_slideshow', 'album', array(), null); + if ($slideshow_link) { + add_submenu_item(elgg_echo('album:slideshow'), + $slideshow_link, + 'photos' ); + } + + // how many do we display + $max = 12; + + // grab the html to display the images + $images = tp_list_entities("object", "image", $user_id, null, $max, false, false, true); + + + // this view takes care of the title on the main column and the content wrapper + $area2 = elgg_view('tidypics/content_wrapper', array('title' => $title, 'content' => $images,)); + if( empty( $area2 )) $area2 = $images; + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostviewedimages.php b/plugins/tidypics/pages/lists/mostviewedimages.php new file mode 100644 index 00000000..d945680f --- /dev/null +++ b/plugins/tidypics/pages/lists/mostviewedimages.php @@ -0,0 +1,86 @@ +<?php + + /** + * Most viewed images - either for a user or all site + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + $owner_guid = page_owner(); + + //$start = microtime(true); + $photos = tp_get_entities_from_annotations_calculate_x( + 'count', + 'object', + 'image', + 'tp_view', + '', + '', + $owner_guid, + $max); + //error_log("elgg query is " . (float)(microtime(true) - $start)); + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); +/* + $start = microtime(true); + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid AND ann1.owner_guid != ent.owner_guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'tp_view' + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } +*/ + //error_log("custom query is " . (float)(microtime(true) - $start)); + + // allow other plugins to override the slideshow + $slideshow_link = trigger_plugin_hook('tp_slideshow', 'album', array(), null); + if ($slideshow_link) { + add_submenu_item(elgg_echo('album:slideshow'), + $slideshow_link, + 'photos' ); + } + + if ($owner_guid) { + if ($owner_guid == get_loggedin_userid()) { + $title = elgg_echo("tidypics:yourmostviewed"); + } else { + $title = sprintf(elgg_echo("tidypics:friendmostviewed"), page_owner_entity()->name); + } + } else { + // world view - set page owner to logged in user + if (isloggedin()) { + set_page_owner(get_loggedin_userid()); + } + + $title = elgg_echo("tidypics:mostviewed"); + } + $area2 = elgg_view_title($title); + + // grab the html to display the images + $content = tp_view_entity_list($photos, $max, 0, $max, false); + + // this view takes care of the title on the main column and the content wrapper + $area2 = elgg_view('tidypics/content_wrapper', array('title' => $title, 'content' => $content,)); + if( empty( $area2 )) $area2 = $content; + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostviewedimageslastmonth.php b/plugins/tidypics/pages/lists/mostviewedimageslastmonth.php new file mode 100644 index 00000000..1ed9161f --- /dev/null +++ b/plugins/tidypics/pages/lists/mostviewedimageslastmonth.php @@ -0,0 +1,50 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + + //find timestamps for first and last days of last month + $time_info = new stdClass(); + $time_info->start = strtotime("-1 months", mktime(0,0,0, date("m"), 1, date("Y"))); + $time_info->end = mktime(0,0,0,date("m"), 0, date("Y")); + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid AND ann1.owner_guid != ent.owner_guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'tp_view' + WHERE ann1.time_created BETWEEN $time_info->start AND $time_info->end + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + $title = elgg_echo("tidypics:mostviewedlastmonth"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostviewedimagesthismonth.php b/plugins/tidypics/pages/lists/mostviewedimagesthismonth.php new file mode 100644 index 00000000..bfe08e1d --- /dev/null +++ b/plugins/tidypics/pages/lists/mostviewedimagesthismonth.php @@ -0,0 +1,50 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + + //find timestamps for first and last days of this month + $time_info = new stdClass(); + $time_info->start = mktime(0,0,0, date("m"), 1, date("Y")); + $time_info->end = mktime(); + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid AND ann1.owner_guid != ent.owner_guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'tp_view' + WHERE ann1.time_created BETWEEN $time_info->start AND $time_info->end + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + $title = elgg_echo("tidypics:mostviewedthismonth"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostviewedimagesthisyear.php b/plugins/tidypics/pages/lists/mostviewedimagesthisyear.php new file mode 100644 index 00000000..fe1a63d3 --- /dev/null +++ b/plugins/tidypics/pages/lists/mostviewedimagesthisyear.php @@ -0,0 +1,50 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + + //find timestamps for first day of the year and current date + $time_info = new stdClass(); + $time_info->start = mktime(0,0,0, 1, 1, date("Y")); + $time_info->end = mktime(); + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid AND ann1.owner_guid != ent.owner_guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'tp_view' + WHERE ann1.time_created BETWEEN $time_info->start AND $time_info->end + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + $title = elgg_echo("tidypics:mostviewedthisyear"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/mostviewedimagestoday.php b/plugins/tidypics/pages/lists/mostviewedimagestoday.php new file mode 100644 index 00000000..f8e84475 --- /dev/null +++ b/plugins/tidypics/pages/lists/mostviewedimagestoday.php @@ -0,0 +1,50 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + + //find timestamps for today + $time_info = new stdClass(); + $time_info->start = mktime(0,0,0, date("m"), date("d"), date("Y")); + $time_info->end = mktime(); + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT ent.guid, count( * ) AS views + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid AND ann1.owner_guid != ent.owner_guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'tp_view' + WHERE ann1.time_created BETWEEN $time_info->start AND $time_info->end + GROUP BY ent.guid + ORDER BY views DESC + LIMIT $max"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + } + + tidypics_mostviewed_submenus(); + $title = elgg_echo("tidypics:mostviewedtoday"); + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity_list($entities, $max, 0, $max, false); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/recentlycommented.php b/plugins/tidypics/pages/lists/recentlycommented.php new file mode 100644 index 00000000..1d5f7aea --- /dev/null +++ b/plugins/tidypics/pages/lists/recentlycommented.php @@ -0,0 +1,72 @@ +<?php + + /** + * Images recently commented on - world view only + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + // world view - set page owner to logged in user + if (isloggedin()) { + set_page_owner(get_loggedin_userid()); + } + + // allow other plugins to override the slideshow + $slideshow_link = trigger_plugin_hook('tp_slideshow', 'album', array(), null); + if ($slideshow_link) { + add_submenu_item(elgg_echo('album:slideshow'), + $slideshow_link, + 'photos' ); + } + + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max_limit = 200; //get extra because you'll have multiple views per image in the result set + $max = 16; //controls how many actually show on screen + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT distinct (ent.guid), ann1.time_created + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'generic_comment' + ORDER BY ann1.time_created DESC + LIMIT $max_limit"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + if(!$entities[$entity->guid]) { + $entities[$entity->guid] = get_entity($entity->guid); + } + if(count($entities) >= $max) break; + } + + $user = get_loggedin_user(); + if( $user->guid == 9 ) { + echo "<pre>"; + var_dump( $sql); +// var_dump( $result ); + echo "</pre>"; + } + $title = elgg_echo("tidypics:recentlycommented"); + $area2 = elgg_view_title($title); + + // grab the html to display the images + $images = tp_view_entity_list($entities, $max, 0, $max, false); + + // this view takes care of the title on the main column and the content wrapper + $area2 = elgg_view('tidypics/content_wrapper', array('title' => $title, 'content' => $images,)); + if( empty( $area2 )) $area2 = $images; + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/recentlyviewed.php b/plugins/tidypics/pages/lists/recentlyviewed.php new file mode 100644 index 00000000..16ad474d --- /dev/null +++ b/plugins/tidypics/pages/lists/recentlyviewed.php @@ -0,0 +1,65 @@ +<?php + + /** + * Most recently viewed images - world view only right now + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + // world view - set page owner to logged in user + if (isloggedin()) { + set_page_owner(get_loggedin_userid()); + } + + // allow other plugins to override the slideshow + $slideshow_link = trigger_plugin_hook('tp_slideshow', 'album', array(), null); + if ($slideshow_link) { + add_submenu_item(elgg_echo('album:slideshow'), + $slideshow_link, + 'photos' ); + } + + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max_limit = 200; //get extra because you'll have multiple views per image in the result set + $max = 16; //controls how many actually show on screen + + //this works but is wildly inefficient + //$annotations = get_annotations(0, "object", "image", "tp_view", "", "", 5000); + + $sql = "SELECT distinct ent.guid, ann1.time_created + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'tp_view' + ORDER BY ann1.id DESC + LIMIT $max_limit"; + + $result = get_data($sql); + + $entities = array(); + foreach($result as $entity) { + if(!$entities[$entity->guid]) { + $entities[$entity->guid] = get_entity($entity->guid); + } + if(count($entities) >= $max) break; + } + + $title = elgg_echo("tidypics:recentlyviewed"); + $area2 = elgg_view_title($title); + + // grab the html to display the images + $images = tp_view_entity_list($entities, $max, 0, $max, false); + + // this view takes care of the title on the main column and the content wrapper + $area2 = elgg_view('tidypics/content_wrapper', array('title' => $title, 'content' => $images,)); + if( empty( $area2 )) $area2 = $images; + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/lists/recentvotes.php b/plugins/tidypics/pages/lists/recentvotes.php new file mode 100644 index 00000000..3d8eac97 --- /dev/null +++ b/plugins/tidypics/pages/lists/recentvotes.php @@ -0,0 +1,52 @@ +<?php + + /** + * Tidypics full view of an image + * Given a GUID, this page will try and display any entity + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . "/engine/start.php"; + + global $CONFIG; + $prefix = $CONFIG->dbprefix; + $max = 24; + + $sql = "SELECT ent.guid, u2.name AS owner, u.name AS voter, ms2.string as vote + FROM " . $prefix . "entities ent + INNER JOIN " . $prefix . "entity_subtypes sub ON ent.subtype = sub.id + AND sub.subtype = 'image' + INNER JOIN " . $prefix . "annotations ann1 ON ann1.entity_guid = ent.guid + INNER JOIN " . $prefix . "metastrings ms ON ms.id = ann1.name_id + AND ms.string = 'generic_rate' + INNER JOIN " . $prefix . "metastrings ms2 ON ms2.id = ann1.value_id + INNER JOIN " . $prefix . "users_entity u ON ann1.owner_guid = u.guid + INNER JOIN " . $prefix . "users_entity u2 ON ent.owner_guid = u2.guid + ORDER BY ann1.time_created DESC + LIMIT $max"; + + $result = get_data($sql); + + $title = "Recently rated images"; + $area2 = elgg_view_title($title); + + $entities = array(); + foreach($result as $entity) { + $entities[] = get_entity($entity->guid); + $full_entity = get_entity($entity->guid); + $area2 .= " <div class='tidypics_album_images'> + Owner: $entity->owner<br /> + Voter: $entity->voter<br /> + Rating: $entity->vote + </div> + "; + $area2 .= elgg_view_entity($full_entity); + + } + + +// $area2 .= elgg_view_entity_list($entities, $max, 0, $max); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/newalbum.php b/plugins/tidypics/pages/newalbum.php new file mode 100644 index 00000000..fda886d5 --- /dev/null +++ b/plugins/tidypics/pages/newalbum.php @@ -0,0 +1,32 @@ +<?php + + /** + * Tidypics Create New Album Page + * + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + // must be logged in to create a new album + gatekeeper(); + + // Get the current page's owner + $page_owner = page_owner_entity(); + if ($page_owner === false || is_null($page_owner)) { + $page_owner = $_SESSION['user']; + set_page_owner($_SESSION['guid']); + } + + if ($page_owner instanceof ElggGroup) { + add_submenu_item( sprintf(elgg_echo('album:group'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/owned/" . $page_owner->username); + } + + $area2 = elgg_view_title(elgg_echo('album:add')); + $area2 .= elgg_view("tidypics/forms/edit"); + + // Display page + page_draw(elgg_echo('album:add'),elgg_view_layout("two_column_left_sidebar", $area1, $area2, $area3 )); + +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/ownedalbums.php b/plugins/tidypics/pages/ownedalbums.php new file mode 100644 index 00000000..d22c6d44 --- /dev/null +++ b/plugins/tidypics/pages/ownedalbums.php @@ -0,0 +1,53 @@ +<?php + /** + * tidypics photo gallery album listing page for a person/group + * + * Shows all the albums that belong to that person or group + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + // if this page belongs to a closed group, prevent anyone outside group from seeing + if (is_callable('group_gatekeeper')) group_gatekeeper(); + + //get the owner of the current page + $owner = page_owner_entity(); + + + //if page owner cannot be found, forward to world album list + if (is_null($owner->username) || empty($owner->username)) { + forward('pg/photos/world'); + } + + + // setup group menu for album index + if ($owner instanceof ElggGroup) { + add_submenu_item( sprintf(elgg_echo('album:group'),$owner->name), + $CONFIG->wwwroot . "pg/photos/owned/" . $owner->username); + if (can_write_to_container(0, $owner->guid)) { + add_submenu_item( elgg_echo('album:create'), + $CONFIG->wwwroot . 'pg/photos/new/' . $owner->username, + 'tidypics'); + } + } + + //set the title + $title = sprintf(elgg_echo('album:user'), $owner->name); + $area2 = elgg_view_title($title); + + // Get objects + set_context('search'); + set_input('search_viewtype', 'gallery'); + if ($owner instanceof ElggGroup) + $content .= tp_list_entities("object", "album", 0, $owner->guid, 12, false); + else + $content .= tp_list_entities("object", "album", $owner->guid, $owner->guid, 12, false); + + $area2 = elgg_view('tidypics/content_wrapper', array('title' => $title, 'content' => $content,)); + + set_context('photos'); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + + // Finally draw the page + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/server_analysis.php b/plugins/tidypics/pages/server_analysis.php new file mode 100644 index 00000000..ccffc163 --- /dev/null +++ b/plugins/tidypics/pages/server_analysis.php @@ -0,0 +1,138 @@ +<?php + +/******************************************************************** + * + * Tidypics System Analysis Script + * + * Helps admins configure their server + * + ********************************************************************/ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + global $CONFIG; + + admin_gatekeeper(); + + set_context('admin'); + + $title = 'TidyPics Server Analysis'; + + + function tp_readable_size($bytes) + { + if (strpos($bytes, 'M')) + return $bytes . 'B'; + + $size = $bytes / 1024; + if ($size < 1024) { + $size = number_format($size, 2); + $size .= ' KB'; + } else { + $size = $size / 1024; + if($size < 1024) { + $size = number_format($size, 2); + $size .= ' MB'; + } else { + $size = $size / 1024; + $size = number_format($size, 2); + $size .= ' GB'; + } + } + return $size; + } + + $disablefunc = explode(',', ini_get('disable_functions')); + $exec_avail = "Disabled"; + if (is_callable('exec') && !in_array('exec',$disablefunc)) + $exec_avail = "Enabled"; + + ob_start(); + + echo elgg_view_title($title); +?> +<div class="contentWrapper"> + <table width="100%"> + <tr> + <td>PHP version</td> + <td><?php echo phpversion(); ?></td> + <td></td> + </tr> + <tr> + <td>GD</td> + <td><?php echo (extension_loaded('gd')) ? 'Enabled' : 'Disabled'; ?></td> + <td>Elgg requires the GD extension to be loaded</td> + </tr> + <tr> + <td>IMagick PHP extension</td> + <td><?php echo (extension_loaded('imagick')) ? 'Enabled' : 'Disabled'; ?></td> + <td></td> + </tr> + <tr> + <td>exec()</td> + <td><?php echo $exec_avail; ?></td> + <td>Required for ImageMagick command line</td> + </tr> + <tr> + <td>Memory Available to PHP</td> + <td><?php echo tp_readable_size(ini_get('memory_limit')); ?></td> + <td>Change memory_limit to increase</td> + </tr> + <tr> + <td>Memory Used to Load This Page</td> + <td><?php if (function_exists('memory_get_peak_usage')) echo tp_readable_size(memory_get_peak_usage()); ?></td> + <td>This is approximately the minimum per page</td> + </tr> + <tr> + <td>Max File Upload Size</td> + <td><?php echo tp_readable_size(ini_get('upload_max_filesize')); ?></td> + <td>Max size of an uploaded image</td> + </tr> + <tr> + <td>Max Post Size</td> + <td><?php echo tp_readable_size(ini_get('post_max_size')); ?></td> + <td>Max post size = sum of images + html form</td> + </tr> + <tr> + <td>Max Input Time</td> + <td><?php echo ini_get('max_input_time'); ?> s</td> + <td>Time script waits for upload to finish</td> + </tr> + <tr> + <td>Max Execution Time</td> + <td><?php echo ini_get('max_execution_time'); ?> s</td> + <td>Max time a script will run</td> + </tr> + <tr> + <td>GD imagejpeg</td> + <td><?php echo (is_callable('imagejpeg')) ? 'Enabled' : 'Disabled'; ?></td> + <td></td> + </tr> + <tr> + <td>GD imagepng</td> + <td><?php echo (is_callable('imagepng')) ? 'Enabled' : 'Disabled'; ?></td> + <td></td> + </tr> + <tr> + <td>GD imagegif</td> + <td><?php echo (is_callable('imagegif')) ? 'Enabled' : 'Disabled'; ?></td> + <td></td> + </tr> + <tr> + <td>EXIF</td> + <td><?php echo (is_callable('exif_read_data')) ? 'Enabled' : 'Disabled'; ?></td> + <td></td> + </tr> + </table> + <div style="margin-top:20px;"> + <a href="<?php echo $CONFIG->url . "mod/tidypics/docs/configure_server.txt"; ?>">Server configuration doc</a> + </div> +</div> +<?php + + $content = ob_get_clean(); + + $body = elgg_view_layout('two_column_left_sidebar', '', $content); + + echo page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/tagged.php b/plugins/tidypics/pages/tagged.php new file mode 100644 index 00000000..b5a87980 --- /dev/null +++ b/plugins/tidypics/pages/tagged.php @@ -0,0 +1,50 @@ +<?php + /** + * Tidypics Tagged Listing + * + * List all photos tagged with a user + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + + // Get user guid + $guid = get_input('guid'); + + $user = get_entity($guid); + + if ($user) + $title = sprintf(elgg_echo('tidypics:usertag'), $user->name); + else + $title = "User does not exist"; + + + + // create main column + $body = elgg_view_title($title); + + set_context('search'); + set_input('search_viewtype', 'gallery'); // need to force gallery view + $body .= list_entities_from_relationship('phototag', $guid, false, 'object', 'image', 0, 10, false); + + // Set up submenus + if (isloggedin()) { + add_submenu_item( elgg_echo("album:yours"), + $CONFIG->wwwroot . "pg/photos/owned/" . $_SESSION['user']->username, + 'tidypics-b' ); + } + add_submenu_item( elgg_echo('album:all'), + $CONFIG->wwwroot . "pg/photos/world/", + 'tidypics-z'); + add_submenu_item( elgg_echo('tidypics:mostrecent'), + $CONFIG->wwwroot . 'pg/photos/mostrecent', + 'tidypics-z'); + + + + $body = elgg_view_layout('two_column_left_sidebar','',$body); + + + page_draw($title,$body); + +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/thumbnail.php b/plugins/tidypics/pages/thumbnail.php new file mode 100644 index 00000000..3aad5969 --- /dev/null +++ b/plugins/tidypics/pages/thumbnail.php @@ -0,0 +1,76 @@ +<?php + + /** + * Tidypics Thumbnail + * + */ + + // Get file GUID + $file_guid = (int) get_input('file_guid'); + + // Get file thumbnail size + $size = get_input('size'); + // only 3 possibilities + if ($size != 'small' && $size != 'thumb') { + $size = 'large'; + } + + $error_image = ''; + switch ($size) { + case 'thumb': + $error_image = "image_error_thumb.png"; + break; + case 'small': + $error_image = "image_error_small.png"; + break; + case 'large': + $error_image = "image_error_large.png"; + break; + } + + // Get file entity + $file = get_entity($file_guid); + if (!$file) + forward('mod/tidypics/graphics/' . $error_image); + + if ($file->getSubtype() != "image") + forward('mod/tidypics/graphics/' . $error_image); + + // Get filename + if ($size == "thumb") { + $thumbfile = $file->thumbnail; + } else if ($size == "small") { + $thumbfile = $file->smallthumb; + } else { + $thumbfile = $file->largethumb; + } + + if (!$thumbfile) + forward('mod/tidypics/graphics/' . $error_image); + + // create Elgg File object + $readfile = new ElggFile(); + $readfile->owner_guid = $file->owner_guid; + $readfile->setFilename($thumbfile); + $contents = $readfile->grabFile(); + + // send error image if file could not be read + if (!$contents) { + forward('mod/tidypics/graphics/' . $error_image); + } + + // expires every 14 days + $expires = 14 * 60*60*24; + + // overwrite header caused by php session code so images can be cached + $mime = $file->getMimeType(); + header("Content-Type: $mime"); + header("Content-Length: " . strlen($contents)); + header("Cache-Control: public", true); + header("Pragma: public", true); + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT', true); + + // Return the thumbnail and exit + echo $contents; + exit; + \ No newline at end of file diff --git a/plugins/tidypics/pages/upload.php b/plugins/tidypics/pages/upload.php new file mode 100644 index 00000000..84d23728 --- /dev/null +++ b/plugins/tidypics/pages/upload.php @@ -0,0 +1,42 @@ +<?php + /** + * Tidypics Upload Images Page + * + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + // must be logged in to upload images + gatekeeper(); + + $album_guid = (int) get_input('container_guid'); + if (!$album_guid) + forward(); + + $album = get_entity($album_guid); + + //if album does not exist or user does not have access + if (!$album || !$album->canEdit()) { + // throw warning and forward to previous page + forward($_SERVER['HTTP_REFERER']); + } + + // set page owner based on container (user or group) + $container = $album->container_guid; + set_page_owner($container); + + $page_owner = page_owner_entity(); + if ($page_owner instanceof ElggGroup) { + add_submenu_item( sprintf(elgg_echo('album:group'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/owned/" . $page_owner->username); + } + + set_context('photos'); + $title = elgg_echo('album:addpix') . ': ' . $album->title; + $area2 .= elgg_view_title($title); + + $area2 .= elgg_view("tidypics/forms/upload", array('album' => $album_guid ) ); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/viewalbum.php b/plugins/tidypics/pages/viewalbum.php new file mode 100644 index 00000000..050b124c --- /dev/null +++ b/plugins/tidypics/pages/viewalbum.php @@ -0,0 +1,68 @@ +<?php + + /** + * Tidypics Album View Page + * + * This displays a listing of all the photos that belong to an album + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + // if this page belongs to a closed group, prevent anyone outside group from seeing + if (is_callable('group_gatekeeper')) group_gatekeeper(); + + // get the album entity + $album_guid = (int) get_input('guid'); + $album = get_entity($album_guid); + + // panic if we can't get it + if (!$album) forward(); + + // container should always be set, but just in case + if ($album->container_guid) + set_page_owner($album->container_guid); + else + set_page_owner($album->owner_guid); + + $owner = page_owner_entity(); + + // setup group menu + if ($owner instanceof ElggGroup) { + add_submenu_item( sprintf(elgg_echo('album:group'),$owner->name), + $CONFIG->wwwroot . "pg/photos/owned/" . $owner->username); + } + + // allow other plugins to override the slideshow + $slideshow_link = trigger_plugin_hook('tp_slideshow', 'album', array('album' => $album), null); + if ($slideshow_link) { + add_submenu_item(elgg_echo('album:slideshow'), + $slideshow_link, + 'photos' ); + } + + if (can_write_to_container(0, $album->container_guid)) { + if ($owner instanceof ElggGroup) { + add_submenu_item( elgg_echo('album:create'), + $CONFIG->wwwroot . 'pg/photos/new/' . $owner->username, + 'photos'); + } + add_submenu_item( elgg_echo('album:addpix'), + $CONFIG->wwwroot . 'pg/photos/upload/' . $album_guid, + 'photos'); + add_submenu_item( elgg_echo('album:edit'), + $CONFIG->wwwroot . 'pg/photos/edit/' . $album_guid, + 'photos'); + $ts = time(); + $token = generate_action_token($ts); + add_submenu_item( elgg_echo('album:delete'), + $CONFIG->wwwroot . 'action/tidypics/delete?guid=' . $album_guid . '&__elgg_token=' . $token . '&__elgg_ts=' . $ts, + 'photos', + true); + } + + // create body + $area2 = elgg_view_entity($album, true); + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + + page_draw($album->title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/viewimage.php b/plugins/tidypics/pages/viewimage.php new file mode 100644 index 00000000..025c1ad3 --- /dev/null +++ b/plugins/tidypics/pages/viewimage.php @@ -0,0 +1,58 @@ +<?php + + /** + * Tidypics image view + * + * Display a view of a single image + */ + + // Load Elgg engine + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + // if this page belongs to a closed group, prevent anyone outside group from seeing + if (is_callable('group_gatekeeper')) group_gatekeeper(); + + // get the album entity + $photo_guid = (int) get_input('guid'); + $photo = get_entity($photo_guid); + + // panic if we can't get it + if (!$photo) forward(); + + // set page owner based on owner of photo album + set_page_owner($photo->owner_guid); + $album = get_entity($photo->container_guid); + if ($album) { + $owner_guid = $album->container_guid; + if ($owner_guid) + set_page_owner($owner_guid); + } + + + $page_owner = page_owner_entity(); + if ($page_owner instanceof ElggGroup) { + add_submenu_item( sprintf(elgg_echo('album:group'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/owned/" . $page_owner->username); + } + + if (can_write_to_container(0, $album->container_guid)) { + add_submenu_item( elgg_echo('image:edit'), + $CONFIG->wwwroot . 'pg/photos/edit/' . $photo_guid, + 'photos'); + $ts = time(); + $token = generate_action_token($ts); + add_submenu_item( elgg_echo('image:delete'), + $CONFIG->wwwroot . 'action/tidypics/delete?guid=' . $photo_guid . '&__elgg_token=' . $token . '&__elgg_ts=' . $ts, + 'photos', + true); + } + + + $title = $photo->title; + $area2 = elgg_view_title($title); + $area2 .= elgg_view_entity($photo, true); + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/pages/world.php b/plugins/tidypics/pages/world.php new file mode 100644 index 00000000..48a3345d --- /dev/null +++ b/plugins/tidypics/pages/world.php @@ -0,0 +1,29 @@ +<?php + /** + * Tidypics View All Albums on Site + * + */ + + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/engine/start.php"; + + // set page owner to logged in user + if (isloggedin()) { + set_page_owner(get_loggedin_userid()); + } + + $num_albums = 16; + + $title = elgg_echo('album:all'); + $area2 = elgg_view_title($title); + + set_context('search'); + set_input('search_viewtype', 'gallery'); + $content .= tp_list_entities('object','album', 0, null, $num_albums, false); + set_context('photos'); + + $area2 = elgg_view('tidypics/content_wrapper', array('title' => $title, 'content' => $content,)); + + $body = elgg_view_layout('two_column_left_sidebar', '', $area2); + + page_draw($title, $body); +?> \ No newline at end of file diff --git a/plugins/tidypics/start.php b/plugins/tidypics/start.php new file mode 100644 index 00000000..02f0c641 --- /dev/null +++ b/plugins/tidypics/start.php @@ -0,0 +1,445 @@ +<?php + /** + * Elgg tidypics + * + */ + + // set some simple defines + define('TP_OLD_ALBUM', 0); + define('TP_NEW_ALBUM', 1); + + // include core libraries + include dirname(__FILE__) . "/lib/tidypics.php"; + include dirname(__FILE__) . "/lib/image.php"; + include dirname(__FILE__) . "/lib/album.php"; + + /** + * tidypics plugin initialisation functions. + */ + function tidypics_init() + { + global $CONFIG; + + // Set up menu for logged in users + if (isloggedin()) + { + add_menu(elgg_echo('photos'), $CONFIG->wwwroot . "pg/photos/owned/" . $_SESSION['user']->username); + } + + // Extend CSS + extend_view('css', 'tidypics/css'); + + // Extend hover-over and profile menu + extend_view('profile/menu/links','tidypics/hover_menu'); + + //group view ** psuedo widget view for group pages** + extend_view('groups/right_column','tidypics/groupprofile_albums'); + + // rss extensions + extend_view('extensions/xmlns', 'extensions/tidypics/xmlns'); + extend_view('extensions/channel', 'extensions/tidypics/channel'); + + // Register a page handler, so we can have nice URLs + register_page_handler('photos','tidypics_page_handler'); + + // Add a new tidypics widget + add_widget_type('album_view', elgg_echo("tidypics:widget:albums"), elgg_echo("tidypics:widget:album_descr"), 'profile'); + add_widget_type('latest_photos', elgg_echo("tidypics:widget:latest"), elgg_echo("tidypics:widget:latest_descr"), 'profile'); + + // Register a URL handler for files + register_entity_url_handler('tidypics_image_url', 'object', 'image'); + register_entity_url_handler('tidypics_album_url', 'object', 'album'); + + // add the class files for image and album + add_subtype("object", "image", "TidypicsImage"); + add_subtype("object", "album", "TidypicsAlbum"); + + // Register entity type + register_entity_type('object','image'); + register_entity_type('object','album'); + + if (function_exists('add_group_tool_option')) + add_group_tool_option('photos',elgg_echo('tidypics:enablephotos'),true); + + if (get_plugin_setting('grp_perm_override', 'tidypics') != "disabled") + register_plugin_hook('permissions_check', 'object', 'tidypics_permission_override'); + + // Register for notifications + if (is_callable('register_notification_object')) { + register_notification_object('object', 'album', elgg_echo('tidypics:newalbum')); + + register_plugin_hook('notify:entity:message', 'object', 'tidypics_notify_message'); + } + + // slideshow plugin hook + register_plugin_hook('tp_slideshow', 'album', 'tidypics_slideshow'); + } + + /** + * Sets up sidebar menus for tidypics. Triggered on pagesetup. + */ + function tidypics_submenus() { + + global $CONFIG; + + $page_owner = page_owner_entity(); + + if ($page_owner instanceof ElggGroup) { + if (get_context() == "groups") { + if ($page_owner->photos_enable != "no") { + add_submenu_item( sprintf(elgg_echo('album:group'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/owned/" . $page_owner->username); + } + } + } + // context is only set to photos on individual pages, not on group pages + else if (get_context() == "photos") { + + $view_count = get_plugin_setting('view_count', 'tidypics'); + + // owner gets "your albumn", "your friends albums", "your most recent", "your most viewed" + if (get_loggedin_userid() && get_loggedin_userid() == $page_owner->guid) { + + add_submenu_item( elgg_echo('album:create'), + $CONFIG->wwwroot . "pg/photos/new/{$page_owner->username}/", + 'tidypics-a' ); + + add_submenu_item( elgg_echo("album:yours"), + $CONFIG->wwwroot . "pg/photos/owned/{$page_owner->username}/", + 'tidypics-a' ); + + add_submenu_item( elgg_echo('album:yours:friends'), + $CONFIG->wwwroot . "pg/photos/friends/{$page_owner->username}/", + 'tidypics-a'); + + add_submenu_item( elgg_echo('tidypics:yourmostrecent'), + $CONFIG->wwwroot . "pg/photos/mostrecent/{$page_owner->username}/", + 'tidypics-a'); + + if ($view_count != 'disabled') { + add_submenu_item( elgg_echo('tidypics:yourmostviewed'), + $CONFIG->wwwroot . "pg/photos/mostviewed/{$page_owner->username}/", + 'tidypics-a'); + } + + } else if (isloggedin()) { + + $user = get_loggedin_user(); + + // logged in not owner gets "page owners albums", "page owner's friends albums", "page owner's most viewed", "page owner's most recent" + // and then "your albums", "your most recent", "your most viewed" + add_submenu_item( elgg_echo("album:yours"), + $CONFIG->wwwroot . "pg/photos/owned/{$user->username}/", + 'tidypics-b' ); + + add_submenu_item( elgg_echo('tidypics:yourmostrecent'), + $CONFIG->wwwroot . "pg/photos/mostrecent/{$user->username}/", + 'tidypics-b'); + + if ($view_count != 'disabled') { + add_submenu_item( elgg_echo('tidypics:yourmostviewed'), + $CONFIG->wwwroot . "pg/photos/mostviewed/{$user->username}/", + 'tidypics-b'); + } + + if ($page_owner->name) { // check to make sure the owner set their display name + add_submenu_item( sprintf(elgg_echo("album:user"), $page_owner->name), + $CONFIG->wwwroot . "pg/photos/owned/{$page_owner->username}/", + 'tidypics-a' ); + add_submenu_item( sprintf(elgg_echo('album:friends'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/friends/{$page_owner->username}/", + 'tidypics-a'); + + if ($view_count != 'disabled') { + add_submenu_item( sprintf(elgg_echo('tidypics:friendmostviewed'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/mostviewed/{$page_owner->username}/", + 'tidypics-a'); + } + + add_submenu_item( sprintf(elgg_echo('tidypics:friendmostrecent'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/mostrecent/{$page_owner->username}/", + 'tidypics-a'); + } + } else if ($page_owner->guid) { + // non logged in user gets "page owners albums", "page owner's friends albums" + add_submenu_item( sprintf(elgg_echo("album:user"), $page_owner->name), + $CONFIG->wwwroot . "pg/photos/owned/{$page_owner->username}/", + 'tidypics-a' ); + add_submenu_item( sprintf(elgg_echo('album:friends'),$page_owner->name), + $CONFIG->wwwroot . "pg/photos/friends/{$page_owner->username}/", + 'tidypics-a'); + } + + // everyone gets world albums, most recent, most viewed, most recently viewed, recently commented + add_submenu_item( elgg_echo('album:all'), + $CONFIG->wwwroot . "pg/photos/world/", + 'tidypics-z'); + add_submenu_item( elgg_echo('tidypics:mostrecent'), + $CONFIG->wwwroot . 'pg/photos/mostrecent/', + 'tidypics-z'); + + if ($view_count != 'disabled') { + add_submenu_item( elgg_echo('tidypics:mostviewed'), + $CONFIG->wwwroot . 'pg/photos/mostviewed/', + 'tidypics-z'); + add_submenu_item( elgg_echo('tidypics:recentlyviewed'), + $CONFIG->wwwroot . 'pg/photos/recentlyviewed/', + 'tidypics-z'); + } + add_submenu_item( elgg_echo('tidypics:recentlycommented'), + $CONFIG->wwwroot . 'pg/photos/recentlycommented/', + 'tidypics-z'); +/* + add_submenu_item( 'Flickr Integration', + $CONFIG->wwwroot . 'mod/tidypics/pages/flickr/setup.php', + 'tidypics-z'); +*/ + } + + } + + /** + * Sets up tidypics admin menu. Triggered on pagesetup. + */ + function tidypics_adminmenu() + { + global $CONFIG; + if (get_context() == 'admin' && isadminloggedin()) { + add_submenu_item(elgg_echo('tidypics:administration'), $CONFIG->url . "mod/tidypics/pages/admin.php"); + } + } + + /** + * Sets up submenus for tidypics most viewed pages + */ + function tidypics_mostviewed_submenus() { + + global $CONFIG; + + add_submenu_item(elgg_echo('tidypics:mostvieweddashboard'), $CONFIG->url . "mod/tidypics/mostvieweddashboard.php"); + add_submenu_item(elgg_echo('tidypics:mostviewedthisyear'), $CONFIG->url . "mod/tidypics/pages/lists/mostviewedimagesthisyear.php"); + add_submenu_item(elgg_echo('tidypics:mostviewedthismonth'), $CONFIG->url . "mod/tidypics/pages/lists/mostviewedimagesthismonth.php"); + add_submenu_item(elgg_echo('tidypics:mostviewedlastmonth'), $CONFIG->url . "mod/tidypics/pages/lists/mostviewedimageslastmonth.php"); + add_submenu_item(elgg_echo('tidypics:mostviewedtoday'), $CONFIG->url . "mod/tidypics/pages/lists/mostviewedimagestoday.php"); + add_submenu_item(elgg_echo('tidypics:mostcommented'), $CONFIG->url . "mod/tidypics/pages/lists/mostcommentedimages.php"); + add_submenu_item(elgg_echo('tidypics:mostcommentedthismonth'), $CONFIG->url . "mod/tidypics/pages/lists/mostcommentedimagesthismonth.php"); + add_submenu_item(elgg_echo('tidypics:mostcommentedtoday'), $CONFIG->url . "mod/tidypics/pages/lists/mostcommentedimagestoday.php"); + add_submenu_item(elgg_echo('tidypics:recentlycommented'), $CONFIG->wwwroot . 'pg/photos/recentlycommented/'); + } + + /** + * tidypics page handler + * + * @param array $page Array of page elements, forwarded by the page handling mechanism + */ + function tidypics_page_handler($page) { + + global $CONFIG; + + if (isset($page[0])) + { + switch($page[0]) + { + case "owned": //view list of albums owned by container + if (isset($page[1])) set_input('username',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/ownedalbums.php"); + break; + + case "view": //view an image individually + if (isset($page[1])) set_input('guid',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/viewimage.php"); + break; + + case "album": //view an album individually + if (isset($page[1])) set_input('guid',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/viewalbum.php"); + break; + + case "new": //create new album + if (isset($page[1])) set_input('username',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/newalbum.php"); + break; + + case "upload": //upload images to album + if (isset($page[1])) set_input('container_guid',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/upload.php"); + break; + + case "edit": //edit image or album + if (isset($page[1])) set_input('guid',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/edit.php"); + break; + + case "friends": // albums of friends + if (isset($page[1])) set_input('username',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/friends.php"); + break; + + case "world": // all site albums + include($CONFIG->pluginspath . "tidypics/pages/world.php"); + break; + + case "download": // download an image + if (isset($page[1])) set_input('file_guid', $page[1]); + if (isset($page[2])) set_input('type', $page[2]); + include($CONFIG->pluginspath . "tidypics/pages/download.php"); + break; + + case "thumbnail": // tidypics thumbnail + if (isset($page[1])) set_input('file_guid', $page[1]); + if (isset($page[2])) set_input('size', $page[2]); + include($CONFIG->pluginspath . "tidypics/pages/thumbnail.php"); + break; + + case "tagged": // all photos tagged with user + if (isset($page[1])) set_input('guid',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/tagged.php"); + break; + + case "mostviewed": // images with the most views + if (isset($page[1])) set_input('username',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/lists/mostviewedimages.php"); + break; + + case "mostrecent": // images uploaded most recently + if (isset($page[1])) set_input('username',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/lists/mostrecentimages.php"); + break; + + case "recentlyviewed": // images most recently viewed + include($CONFIG->pluginspath . "tidypics/pages/lists/recentlyviewed.php"); + break; + + case "recentlycommented": // images with the most recent comments + include($CONFIG->pluginspath . "tidypics/pages/lists/recentlycommented.php"); + break; + + case "highestrated": // images with the highest average rating + include($CONFIG->pluginspath . "tidypics/pages/lists/highestrated.php"); + break; + + case "flickr": + if (isset($page[1])) set_input('username',$page[1]); + include($CONFIG->pluginspath . "tidypics/pages/flickr/setup.php"); + break; + } + } + else + { + // going to all site albums if something goes wrong with the page handler + include($CONFIG->pluginspath . "tidypics/pages/world.php"); + } + + } + + /** + * Override permissions for group albums and images + * + */ + function tidypics_permission_override($hook, $entity_type, $returnvalue, $params) + { + $entity = $params['entity']; + $user = $params['user']; + + if ($entity->subtype == get_subtype_id('object', 'album')) { + // test that the user can edit the container + return can_write_to_container(0, $entity->container_guid); + } + + if ($entity->subtype == get_subtype_id('object', 'image')) { + // test that the user can edit the container + return can_write_to_container(0, $entity->container_guid); + } + } + + + /** + * Notification message handler + */ + function tidypics_notify_message($hook, $entity_type, $returnvalue, $params) + { + $entity = $params['entity']; + $to_entity = $params['to_entity']; + $method = $params['method']; + if (($entity instanceof ElggEntity) && ($entity->getSubtype() == 'album')) + { + // block notification message when the album doesn't have any photos + if ($entity->new_album == TP_NEW_ALBUM) + return false; + + $descr = $entity->description; + $title = $entity->title; + $owner = $entity->getOwnerEntity(); + return sprintf(elgg_echo('album:river:created'), $owner->name) . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL(); + } + return null; + } + + /** + * Populates the ->getUrl() method for file objects + * Registered in the init function + * + * @param ElggEntity $entity album/image entity + * @return string File URL + */ + function tidypics_image_url($entity) { + global $CONFIG; + $title = $entity->title; + $title = friendly_title($title); + return $CONFIG->url . "pg/photos/view/" . $entity->getGUID() . "/" . $title; + } + + function tidypics_album_url($entity) { + global $CONFIG; + $title = $entity->title; + $title = friendly_title($title); + return $CONFIG->url . "pg/photos/album/" . $entity->getGUID() . "/" . $title; + } + + + /** + * Catch the plugin hook and add the default album slideshow + * + * @param $hook - 'tidypics:slideshow' + * @param $entity_type - 'album' + * @param $returnvalue - if set, return because another plugin has used the hook + * @param $params - arry containing album entity + * @return unknown_type + */ + function tidypics_slideshow($hook, $entity_type, $returnvalue, $params) { + + if ($returnvalue !== null) { + // someone has already added a slideshow or requested that the slideshow is not used + return $returnvalue; + } + + $slideshow_link = "javascript:PicLensLite.start({maxScale:0,feedUrl:location.href+'?view=rss'})"; + + // add the slideshow javascript to the header + extend_view('metatags', 'tidypics/js/slideshow'); + + return $slideshow_link; + } + + function tp_mostrecentimages($max = 8, $pagination = true) { + return list_entities("object", "image", 0, $max, false, false, $pagination); + } + + + // Make sure tidypics_init is called on initialisation + register_elgg_event_handler('init','system','tidypics_init'); + register_elgg_event_handler('pagesetup','system','tidypics_submenus'); + register_elgg_event_handler('pagesetup','system','tidypics_adminmenu'); + + // Register actions + register_action("tidypics/settings", false, $CONFIG->pluginspath . "tidypics/actions/settings.php"); + register_action("tidypics/upload", false, $CONFIG->pluginspath . "tidypics/actions/upload.php"); + register_action("tidypics/addalbum", false, $CONFIG->pluginspath. "tidypics/actions/addalbum.php"); + register_action("tidypics/edit", false, $CONFIG->pluginspath. "tidypics/actions/edit.php"); + register_action("tidypics/delete", false, $CONFIG->pluginspath. "tidypics/actions/delete.php"); + register_action("tidypics/edit_multi", false, $CONFIG->pluginspath. "tidypics/actions/edit_multi.php"); + register_action("tidypics/addtag", true, $CONFIG->pluginspath . "tidypics/actions/addtag.php"); + register_action("tidypics/deletetag", true, $CONFIG->pluginspath . "tidypics/actions/deletetag.php"); + register_action("tidypics/flickrSetup", true, $CONFIG->pluginspath . "tidypics/actions/flickrSetup.php"); + +?> \ No newline at end of file diff --git a/plugins/tidypics/thumbnail.php b/plugins/tidypics/thumbnail.php new file mode 100644 index 00000000..79d48721 --- /dev/null +++ b/plugins/tidypics/thumbnail.php @@ -0,0 +1,78 @@ +<?php + + /** + * Tidypics Thumbnail + * + */ + + include_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); + + // Get file GUID + $file_guid = (int) get_input('file_guid'); + + // Get file thumbnail size + $size = get_input('size'); + // only 3 possibilities + if ($size != 'small' && $size != 'thumb') { + $size = 'large'; + } + + $error_image = ''; + switch ($size) { + case 'thumb': + $error_image = "image_error_thumb.png"; + break; + case 'small': + $error_image = "image_error_small.png"; + break; + case 'large': + $error_image = "image_error_large.png"; + break; + } + + // Get file entity + $file = get_entity($file_guid); + if (!$file) + forward('mod/tidypics/graphics/' . $error_image); + + if ($file->getSubtype() != "image") + forward('mod/tidypics/graphics/' . $error_image); + + // Get filename + if ($size == "thumb") { + $thumbfile = $file->thumbnail; + } else if ($size == "small") { + $thumbfile = $file->smallthumb; + } else { + $thumbfile = $file->largethumb; + } + + if (!$thumbfile) + forward('mod/tidypics/graphics/' . $error_image); + + // create Elgg File object + $readfile = new ElggFile(); + $readfile->owner_guid = $file->owner_guid; + $readfile->setFilename($thumbfile); + $contents = $readfile->grabFile(); + + // send error image if file could not be read + if (!$contents) { + forward('mod/tidypics/graphics/' . $error_image); + } + + // expires every 14 days + $expires = 14 * 60*60*24; + + // overwrite header caused by php session code so images can be cached + $mime = $file->getMimeType(); + header("Content-Type: $mime"); + header("Content-Length: " . strlen($contents)); + header("Cache-Control: public", true); + header("Pragma: public", true); + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT', true); + + // Return the thumbnail and exit + echo $contents; + exit; +?> diff --git a/plugins/tidypics/vendors/PicLensLite/NoFlash.jpg b/plugins/tidypics/vendors/PicLensLite/NoFlash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94f643dc7824f1179fec635c245d852f8cfbcb03 GIT binary patch literal 72549 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%0A<h9VLf|T5!0(T_@nhxk{#fUKTjK8> zLt1FG6LdILksk>o)fX!-?w_LDXy;vNUmvB7arbDVXf~+Z2EOvt*XK`V0{7wMPlcUY zr&nmYyR7-okQu6K@wf3*{<TIw;bq?)m&f1QdwNCF0{yN#vdV{QJZ^+*wCp``y4=*~ z%yZ{G%yUjH%2eBM%~8LE_xKdcWMwz58Si|j86Tffdb*=|X$Yh0-o^%&*D}_PhZ~)z z9DARw&~<Xfs!5yX94*_kYhO(0t{9e(q6M5@ojeJiD$frZ3Dt1PyYIHRp1bE+s7s*a z#g;Y=5r$=q8sF`vxN@%46up|Kq%p@sS)XH(f}x6F_t9gkde}9aoPrrRyr*}R*M~7Q ztX>tw=<tYzQIO%CkCT%k`xF7LE`CPK_Wt@w49$_BzB@5+FnszE!2DH}L4jrWoD0m; zq8xZD-S;vmurU113uq8ve(Atp{#Akf^1B0!@BHU6l>a!Pz{04TI7yqMoFlXRrvl%G zZ71iMXX$e)rsY(&%c<oA|25`GUA>fZT3NQ5vH>&4M}u>QGfw|XK6y-G(n`a}r<sms zNVn@Std3yL$(7z+Wp1-~>9IGb&WW$_dYhB-@z;Vb*~Ck!O0I^-ie~gzPqMyye~xm| zn{-v#?BK4VlF&(uPF2=@joz&trk*D>Z|U#iEUisfyK|oy+wRHFII!M4MDJ#pW+BhE z6W=Z!yeY%|EccGYNtxEVpeaoup-a4!e_igIcA|Cd{4%enw}W0PYAlb<SU&OBPf=x^ zGmqc?p1y5uhu78FA7A9T<pu{8^@aShS+}`2Yhs1!p=)~|^B*&w9w8M`aYuH)aZKjH zDkdxKL|?^<Rq7UMvz7}re6Nw`a+KzJyEArkvdEhft4mXL_sqJrCF-rY$H~jxnk(MK zwRZoQBXnf<uZg{R$FE(zwq}>9%GRZ#aW+#^LvQ`g%Ir^g6BlR5_FX%#=F+22cY7q2 zw&k4(W?=P8c@})x;YwAH0#ne8G{MP&UE8_E5;boI^?p@bdpXo?=BM<tQ?GtdI};Hj z`g+D3pNDzBTQ+R!n)>RsSLwH)%FygdCXuDHLJW7?1*Uu3-rqgx`?e>!H5;DtzR~yF z5cJgb&XlN$pvpg~y@B!0lU^M=vrESwFMGDqx;!MdcG<0~-p4k}%EX=Bt2=kI?y=iz zcW;xqYCBb8Z@KD0_qP&8+uO8qPFrivUy{8_a?-obJmH2_VapO`Iy$Ip2!zb=-!HQ> zN#R@2)-_wFK6`n1^@>eDR+TMo-LdV-`mDX~?Sa>p`Q}aB74EmzrhRc`inPJhp6Mco zp5>ek?~Z14U}fEY@}<D48IxyB+aSRB{>Z;1*(qzYtL_??tc%K0jmlUN;oYCN`<;I9 zr&n4bC)Zvw_j<YfM(*ss_=M=HdvVSRSxaZ!IJH)IN6AwWE9a;lzYcy&pHNBf*IWC( zzFn9W9eL-a*m9Sv*^~ClYJRL;KJD<EH9loLIbVXptx|QPs;<1uj;h{c#S{BE+wDPe zbzYg})alZ}qT5+l{mtKH&DOP`<eG5z5{~@ayPSIC*d-g-_0^`{F5A}IW8M40d2!#G zDN9#fmES7*=j!>%nwK_~eLHzH>B@)idaE~IZ&@f?s<kT1^FM>$>XWZimd5wJob&ve zOw-jp-BEcdibdLId!{{mE}(Q?dZR~BV1kbWud<}koC<agKjXK)tJ4MZCElLCJ$IL$ zq{b?9f2oygH<rmMb5=8~JN)78-D{OsRLw)BUM`taGn1#6XXD;$R~uqKPM^VCe&gxP z-n}=Ail^>9+PzJf>!MK?W8Z`h#*?njmgjr&oaNTt-dJ?_@Jc7a?w3Y>Mr~btHa-kl z{b|n2H#;Ntc5UtK(>(U{<jE4dtve6Z2rW9P|8&|`@d+2)HmgtApIcHr^~TzBMyc=e z?x~fAC`QUM8cm8|Xj>p=&eFhg$i{l(lY5d$Y0I@Ybnkd}FZ|V|^?E+D?w_9XJzL_# zw7V-JcdKSbcb(W<s-+*U7wh`=+7!dnQ#VRiTWc>_&$CW_x2bXKEK|dt)yAUE>K84T zMHrR|=ms%9x#VP3zDB#SWy)jS)F_>gr@g!n|E~BYQ4_N6+>_Xy?m;2GmnNT>n>^ht zs$Obo+UkhwW=EswHROnSoi?^nPBS}|%p2<#+W&HN|Ic8MjD8cJIte%NvCf_S)3?EY zVxxU+7?w)T6j8~!ITt={&^z0&3995KEf+Q`U_5<s-h^ut8{Nu-wUa9Kq;4+gSke1i zitU)fM@CVJl61bxW0_AIXU?}1Iw7#(!HuV{9!)yOvvui&?Jg|_GY>s?Sft9xFoEUx zA-N~fQC({ed+n0>Ua=$g{dLxL<w{zmS07Ar2z+tT$M#ibdja!{ehE-*=CUH%ik(SD zAfS|~$5DMRbAR_Lq2G)RvP_>JHEsIs*kJQQraXG}cV>nv4*d^YuOIL*u!#TIwWoRu zM-St3hsW(7OHC)TF??T8csFmwhsO_iz=HQg<v)M~<9FQ+c;Cy+z`A>aAm5rT|F$od z{OqXJcy-R7(E2-Pzbf6@bm2#v<JG&~|FX6;PpLAl_2>=TA+d_#?txF{A*n}d7(3YK zGWU0bthZv97Y~02HuQnW^#c;j=NgY6&|KeOz`UUF16R?f00Z{DOrPcVXer)bkihP+ z=RZScSnMx0h7#_6zQ))Z#s-G2{|pRk{#__(P+c*rMPaVX6h$t@$d+aWjSiM$46mwJ zwr;cAvPWoPzNf*vq6tg>R-E`Oa5n8kjnKyjj3Qcb9kmrMV%kFHauGtIjXT&S(C%o* zmZ&IPBtWxadA1XW&sv+_Q2)=s6ZoIujKsIv^WWD0UVW~z@6)rb@9hmw-86q1MBIh) zYQN8&{j=tR^_j{48Du@ySMA>!^U?jC%l7hrUGi7I&uk4{0vhSK#1OiK@ujcglLkHC zD^D83Vmm6Qc;Dyb@eHfwy~Qkg@6Ow=#~KZf-AY=0LiP9Qsh0%gOO{SaZ;O~2cw&9E z&bJP3?=yZ^cStP!$YfreyJdUq(}Tj(?rnU<Bq^kjBvQf9;d7_bC8>{hqL<VYYmWSi z4|=7YmxLJp1y;#4{%3gb$V$y<-oM1(5A`IksVUz57g+o2&7&&Gf>f46-?;A!bBGx4 z@k;*BP_gfm#j+(k0=bqr-cYV(abdPRay))Ye5H)ncJ-NDo?9lZ{v=qJu>181$z$r4 zANi-q7yX!HWvTAA!f!rX@x?cs`wkzz+~ecE_fz+K<?d6b`^r{{#k4oy5UxG^pFuil zR{tsenm+A|Mt^0t$kipxeq}6pu24YWk?>C28NcTrd3e!qr7rVl*86@z&n-IJy(iyS z?tHOF<M?!E#XpD4&$*c|x9I1Kf2zLs{@-(24-TzsiulHT-;$#*zmvmzf}X!kpVT~g z%h?O(HD$%NZ$E0fE8%RRa;J-1<4!w<8I$@R$9>y4pYQJKu54ZHZ>uEqqJz7;|E_rD z^nByGA6tc{`fL|AIl#iQUH$IMnm8+cS=E0!*Z%aB)OKG8n!WMe*EwD4FUz!;7G}<f zi7$9;`JdtJm#)}jrwXQI&JDI!v#>bk`Qn4VV~%~Y?=uY<{+Y>2Y8uO!KQ$kGDj@hY z_ikU-M)etY0`d)=>W*6<@|;nulau*CiU00T9p}v|{_eW0n!A<qUiek^S(%)wKR)-T ziIrOD(KSz{=1$ojt6w`K`LW*T=g$Au@^!v6ygT3Br}ydykz;SR?{eX@tZkoE^m^T% zdBU4Do(t`kSoQB&u=HlL=R)!COM7aM_wAXdylA4~v~5{amcMztGv(>2H;eC0K5l=& z<%_?UPLTZOXOEZ36wP+ud0nQSS@?ockY@je+id|-o4P&P`tI=mJEnbclhKsrH+2sv zHq4uJn<w%6f^hGSj!z!U3up9LnYns;=3Gm>yj}IMO5&B4r{b|vr?s*e(u{mO0t`Mp z5#(6i?6mChnb2iNet3y|Ip(S~r7|^wqn7E&o+DBx*E4XeWW8xz{)k&?r{X1+sim0= zTA(b#u-bz$Yy#6-1=c7Bt}P9sWDAEdUa3yKaehnN>#eyZ$Ib3O-F4&zSBd`jr@~v! zEO~^rIz=ybY+54saFWkKh7$en5#Rb>%}u`~!@g|FKmVV84=)#;3jS%l_{rn<|N1$Y z=arjpT%O6hJmcBRNx7R(_qMK(czyqkmU?N9lZaZXsCJ^&Nde|5r<MgYSmuZ@K50;* zmM^de1#?Pb+uT*}<ezic|6DA0e&@fd{~1av&l}#0xwiNDGs|MNKdU1CGc3LNPaxuP zlHD%5U!Uh%+k5=I{!DMT;Gb8o-#WiMcE0RCgUrG0_AK{i-rPSefb)~F|DR;c<Dm4` zCZCs`2tKrmLAqauF>2z|yH6T<b}ZY{z*eXldGojR?lPb7+&9~z_gzt+s+}MEK)sUZ zq_^iZ*U&1bDUr>g4pV0M2(RwfNo`rNSuALgaeC|ugJa1Lzg34O=rb_A<C^q`OZQR* z+s3r`ZE`Gk>i?PUHQzaZPNn^Ki;{UvrCrKpHx4qS*v`1u|DQo_{>dcS^9;Fm46@q| z3LgL5w3ktT&wqw`|HFTURAWB~hWPT`v4~**&v4AW$>{OFf0|Dw3hlaa!o_x{!Nd9g z8Me76G5;1kFY+m3+3pM8Q#0e3<j+qQ<YRqv=EV}ZpkE~m{xhsP@_O5+MOsy|y9|qF zrM@}$DCmjIQ$P6^8}p_gh>o2k^7eG^45!#RvP%NKFXg#$SpTZnhL<+Xu@m|8d{P`3 zs;%}alxLo0Kbg4xfz+ERwmS;@|1&&yZ(P4DN&eM^mqHH|PwhOZU3U9uzh+r!S^PgE zdA076^A16pytl(8gng`S_Na3*uqD~~i-rrGnkX81O5AqS#&GtRB5(eDSgx7r<2}8j z;QEjK67!}Xh&{Vc=uY1CA3LTWxDme8fak#DX`C(gPn4|U8N-zt{jN*=JpM`HgT=Yz zDQD^{I$uUy%h<mD)}a#%I;N-I6DU2oOn%RilC2NaW2asH9UL{~LF~MO8HG<ztoqMz z<M5IXf@>nLyw%M$=xDpNCTjothyS>^UiYOsu8E%dR^q_F@7dGUi+_Gv|96V)wNG1Q z?j_w>pCRTxW!u%Dj&i$*8Fk+U*FTVYH$^w={o>$$-o2rgMI5me{~0=Y>lv=;X6IY6 zOSbVWs!5YS75ty!Lc8Y!#Z7nCy%%(xzldx4e};O-{|pz~Js+q?Y?m)NlYA{E)#V)9 zie>DH2b?EVT2FXs!xFMg_Hd+UW8npr--{mAuN8P67<9bu#GQMROYVHTa#KJ?G*~0l z<&nvR2dq<?cV!;&3gw*^!sZ~8)FQ6Lw~=M)OX+)O5<Ek}37T4M3(;xM_}_hJ6Pq3E zy3X8tam%de+_xuE#bQhQSbSAZ1PB`TB{DGZ1vc0_*-qHa`Y75lcgyqWrFofC-|cP^ zyyP>7QO01y3<sW&2?|$SV+3kH9k%j4sL2pkVAt<s{g6RT_Ctd(-wy|Q^WE{^IFD>^ zx><Ve+qygFh3`&#V!brdjLCfa{WA<|Mt&S36V=(}t2THoE(l97oxp!S`C0#3bM|Z9 zn_bs#kB)AQidp;4BjuW7iJwZKDn|mNW=Dd6fShB43N4pX+?4QKp1ZsKrbt~2`cj8y zI>aw^C{IuO7p+h}Yw4G>SPpdGwFPtmD!9I|WiEWupcQO3L17K6h0BE8-;$?%>aNW= zl{B#@;mUD?qZds~=N`7(-g%AbX6%YdX$DMR1sEI_Yc2IxarH1P-8|cC@;~pw<8My? z^Ko@_$T@V${#(|6hO+pTT#YYVmw!xxuqRZ%oC@bmvNhWBPbdD}>92|bNaAc4<YwO5 zFSh=>>#qqbO~LFPzc>B$2nnf5&-xR!|L*ixPAi(v`>c)cj;Xy_w?vEI)^KYb#GIh4 z3d!6xz6#scDSvzVYofOH3Fi|PHOuZL&WH}@|8V-N(yyN0633Uedn|f)=E<kY2Pqz1 zxTe#2%5C?5=Oe85{jggS9<h<(so4Dv-S3WHl}uYb*wwbzIOgx-U&%GWOQ!FhO-~sA zhvrvKOY9jrp6IauYuSF6{YvwMjE4L(?El)<-(|nj>Z#iMvH!@`-wS?CSfL<&S@A!^ zBJJ;vUlju!%-fRxGq?o5YZ7IV*EX4RaMhfLUljw~rrumIXQ|jL0Uo1O2}biKtXNo6 z(f%<}fWIn1{?E=wj2@jO9jukMC&aW)*vzq1;QUH<#g3&)Wc;fACHc*7nP!s{+h_f` zuuk$pQgoV%D^rT}>Lo``uM>V4T*AX3{B9K+pDG9QyYN#7zg}Q|8u04{<EIt1B@919 z>~=BKtdfsqsL}qb{@XL_=;oa4sx{l5yQc48%8rYfx>tqAVYi77PjmB^a{>&;)1C?l z=seTpZ0~Gw;h*kWcf^7H$?NCcxBon4aJ@dWPH*3jz5CAvFt0cI6I=VSx_-_A_PEp^ zyM90V_MgGhfp5?0kEP#_zWrC!AX_>8(d+kMeO90Kk6ynozWwJZhSF#8-Rt-1=YO8U z@cPVt@%Wm!`_DBPN3yw$n+#k}?bg0Aard;7Q;x8ldb47xGpmA9R$ydNgO7{tmmlt% z-_>uezZ+M4rhKyL`pTbu*(djFO|ySlR^K9Kaif1-|GquX{mx&qFa6oQ?nu4WuHON_ z3OC=~f7~GV{6TZGiu|V!IX{_szvRJOIDS|Qv2eU&+2hj;Ap*A!G?mtIe0=B7oVw`C z+O;QIYXozc^*^W?rq9^8l8;Y(>-HSi3;~CwQxzZjF!%&Y`ga^^^|5#o&}PWzpxI?) z=%Tc=v!wr8y9vXRx-FIqSe5VbWiWdD%_w%@a)0eSiy_E9O6CI7#9tSlHHh?In?8%- z)5KpFe$QaO1(yAOXwCtq+Fwb*3wcAnEj9T)W4ou4slcpRwP$3W99v{FareQK_qxOs z!AA3E%CCi)EeAH1eGA0m>Vsz)H09Uw?*v%^a!K_9=3f)o_e#uiPzZP=)5wtKEw*hL zqvV+e<4%R`Dv=CzdmOa772bVpRC(01^cX|m+5~D<o?KfS?0$V?RnC@An-h4-NNFeU zsrQ8yiU)ia%B?!VQvKLDsD<(R^f@P|wp}dU7c)&{?X|G%eRV5XokF73QbP>b%Um@M z$g6%_d-d(yTf3f4eR?}`)`r_M((+Yl*Sa02D6twXRnTyIv{7o^rdJn|xY`1|=A3=d z=-k3_F4wl>ZRRdXJI#H!3wLI#-7ovLTxRe7#EIKIMW%#Yd!%tUZ?4EGjxW7)xQYz9 zJrCURHtLw8l_}eO=iD9X{|vd>bK*;*BiHPxeJB)HB!0p~d3t(@itsX*U$a)O;+@F# z%b1bNv{1NX3b(><4e^r<3@Z)!gyjOCb*Ma=e~HKK`nfZe(My+<7T#Vu>&XfCDXZpw z@@aAY!|ukx{2;kh&EfH#2KB3Jh#R&ed4wfrj=<&23SLg+j)M=l<FK2Qj>GMr5BJ{_ zb*kx5{-;AA=kTsCW0)2EN`TeT-;(903-de{N$2NH(Z!n@_r5L`v3nM%Gg*p(fkEex zgAm6gF7cj@Ct5m<0eo!lUl=58oVjC)%Q6OLhL4P0lPWJ%PhfW`%e}ce?cFnd$@?;M zrFlCy#@?Cak{OtF)=^k<_hh-i{`kATo!PS5)7R@}L|={CnjIB<ZE4ivt6oNVQ!1wh zKHUBBp7m|DGm6Qor>8EN7aMVGYNpN9uaiPg&iQ5Fcj~u<lgPYIfiDfLZlR8X(@We6 z-;13+q;sP>o`1<t;rDh|^Y+i&dHfH@e$%-<Umf-DhWy%SJGbSp?fOREXSepR+<E*D z`?Jj(=dDovy=s1#?7+zI*PG7mg*a}*n>Xq&-_~&Cn_d0ud(Qqr<<B*5(pPcTy;^>? zJw4IhKl_1m<+k;&@(TYmFb;Yt=7@L4Q|4}o=ihUu;G6q~_*~tPvMWadj=2W7EGiaw zYF@)U&Ge(}?L*0rFS=bxEPT?lIO0+a=c-pbwoiPr>fFrBH*LS)var55_4T@^yMA4q zD(5FQS8LX}O&32bej4r~<$mn^h2%xN3hXXY4tyOZ4NTMdgdQ@av`(BoLH*PW_J27Z zx<?=0?NFF$o8b9EBK<UjEA_e&46_?PHrSo|CV6gB`Np$v6gHIhczyUgtK<A3Cd=S; z6E3~y*kQo%{XhcW+LJPhlOAt>Q+m2t>E3^aywbdajTJLmN;)SRHmJ!s@LDiG-FEq1 z+J`bXcir2&&t2Jj>TUiztvhSJt0ireo_k@@ET&a?!j4H=lUh6tg?^~3m-jOW&N#Cz zIR86q*xiNYo2@plO*>((FSUR3=EqHwT8fsRDz%O{aObimcU0y?rP+rB=5u=ZDoTfM zDAwMlxK+|R`sv)aeNW!&7OgO^Yg#+iis5LdM}pE)jn1q!3=Wp*_c}P<p7&^eXxGDO zv3dKvif-GE!v3xUdPcvm?wyoz{*aJa@Oqg`?-{mhaJ-WJ!TdNoa3XVm5yMKFZ9uyj z!MUvUiQR#T=qG5;H6r><Mc<9{r2jrHkbM&P_l*+9VIk7cTbM;z7~eV`zT2S2*u*f$ zxi#gx6N@-|pLX8D^!HB!{|0udEPCm@&p?4|^Sd5S&1*hgEkF5W+8Q)^0yH??@3TA? zWzQ{BFX7eyd8o-~)x8`0KP{8L*1z&U!|`ojKipXQuR1P!`N{oHPGrX(`mwI^?R@8b zQTo@9@A|XaF7*QcwC=AT{;ZZ|bo#E7a-gYPyOF{Ak>IRr=jR^xSQI9?DX{2J!{TdF zJJa0dKbMMoyqxO4RhWU{-;&5TZ+@+{N?+{PmOb0<>DEZsC0`aj{`AU0Sd=O5O~RkW z7ZU#L)V1l|v`AIyK_XuOW4DdSv=V#0K+Ds&%tLw)9E&}*SY`GSrs5fuDXcn2l2y!d zmTcXut8<b^X4y;8Fkfd4-_Ve}m7-Y>^|;Jqnr5DUH{}46pzr~cRVyw(jC4ICvUZoJ z$*KF(PS|hmiJzKge|pNhA{VJerBebl6?`g=K5U$FS4cJSl}GucUE6HK?w4=5qst%Q zYOcMd>Sow0K~@(=Qy*8ZKqd(v1~xfngDFw>*vu1_=M_$g&a~KaHLNt`^E#27yEn_% znl0y4n_9GNQ|3qEkdwEUxtxud6DpwPqAx6QOp<|tT~JVBO@UDE58jH0F>{4ZxwLt7 zJ;;>tNRsec$a~<Z0Z$7Hdj|)PdSju`p&h$SLjG)vU*A(dHMNTI)5W@d@>7!+=v12C zS@pP*skH89ZdqK3pWyb!!@+{N{~2c4l_c#=oA%@n&yQGz_dInO_Mx5ZRSX{1hZ$64 zA2tZ_ePJx|cz99$oy!NNX*KSS9W22dj0O#&EDS3YSRENCTnST>o)&vg?fP@Bjk_#g z{WumEax3Pl!HM2GYKgDT@!r$mJmbt?z#H)U2J@=}DF+moxO~_rq%%~%)c<*c@umLH z^NSg5RsS<seo5eGS7Ugjb%J?HIz!Erx6XT5?&kbt6Kl6k7Cp?h+B)fo<ix{Md6-@v ztbQt}=n?p?F^j*JA;aWJP=kZu6#=FN4d!~P$w%KvD6c(xCg<_w=G8mbSd^)iUd_6D zdWwK{yWiavogFJDI;>h2pp>RD=h=iA42um^WAt}tPJ1kVRs879+;h3vN`5))o8~>* zy6aV7$jUVrLu7S6oX`q6dr8p2(!*rNvI(6D{5rdJr^Vfjoa+0x>u&kUi`sL7g?GeE z%q`uyXu(P01&u#M!~_Jqmm0GA-v~9BA?}~5>$$1VocHL>ZkyJ1URyUFU3&P*rI6kW z4p+^^j_D>mU#c;K)3U2hWC3q>%VU1yoZT`<);{)L)AXQOX^o<RN0$tvtM50>N$F;d z3^}pyj&0Z-d+qS#w~JGwbKfPLO^&z}>KbO`m%DoI<Sl1Pdy+eQG$&Sad|-8o<5|G- zJ*V1sZ|R&HZ!0%VGf&YreJ82L5xqgZBI`!vidE{dEPXRiB^WGARtxTGWt@3}bq?c- zk8fA+i_h`d<X%3TPcvipy3IMY=Nt=^1$V5v<FL9ksYAl0bB4pRfGf+`KDb<-!?@w2 z?v%>Hqvmsa|J}KCcxLY3)AAnQtq(s)yLRj5&H1I9SJX{j6tJo(GeCh|*k`ZEt4C~m zcf6HLx%9m!GD6|9@|P>^!NR+5$*MhUex#%ndZdp>MbnB=<I94jN;6o_D?DcKI$5^w zd*98_lhSwJRK~W>UUK7Z-i*(m?0hFLbvQIBkAb00LxaVXovABrO2Z=q*4HV9uf;qk zJ;{vU_~2B)=A`i3r=<m_mUPD0Y~Nz^_Jms6DsK*nrwkK)j}@>~svf!#t^7gm{F#r+ zS`NNCE#fDZ-FPOzG-JWrPaPfS8yHV1E@7Pbe7F7Och_D%{*k3)xW}5MH2U@2t1l;| z=H(PBWis`N8+FY&rIF<ku;!VZLxaKeYU>#bCp^CK+hBWKvsT*LV+ZTE@AdRfdULyE zZt8(u1`}3J-0xI3eF;;irewRyfs-Hi&X46eoFls1X7e)(z0euAKE9rN>d2qd3oq$C z)tfo%n7Y#@bt^SNjT36ZLeeda{?p&g{dQ?v-lrS?4t<!>wN5tnV_3M!ox8f%J``RQ zb)7iljPRO<1&n8s{0}ooFdf_^@pQ7m-8sUNCuY_xPT6zk#Jwk{mjud9G}LVIzNC~S zv&VVLGR6ioyIa%qwg>BEwrFpDQ@CY4hb8k<v+TJ~UPt{h@mpXM&>v^za8gb6!+|G! zviE*SEdINL`<&^9vm0(}&UyN~<J|k}r$T%GWR_ho_nm0)<y46$qo4<ai>6M~;&L~J zjq%%NeNEXS_3z$)hQ24;!nU*MPVb&N>5;qV?K?YHFJuqaWLaYGmKCBQ(d=>J&IFeJ zl${fcPhY#U<|5loKAZ0C;mtZ51Xt<aG#B^MOKnkgSi+zx_vY|^hL|;^<Uo;#XBVGF z%C<e9-1KcVZ`;YDpvx6I<L)gx(0g~HLhvFB?T4Jb0U}E^I9u+XWawaAoyEb3xMk8T z?*6RId(D3?+Rdr9d;UB8@73ov$19DazR#cWd=Bx0jG5_e{~0Rhu~(YdS7GbXtdjVA zJSD_{X<>sX52FE(fkIEafMtn<kY8w^&=kuW1-U!}7SV=(M-=$A^{=%szL04C&v2i? zX<@L?xjOMT34GJvT(5PPj@GSuv@1;6g?TZ9;Eb+i?>cI8Y8U@gJ$PC)UtILSTl@bE zil62FGaQckCs{x3`MjG~>#pS9eJ)?*|LO7Tzm3HQe^>Hz|14eDpB47*bN^2Lp9OEY z=keb@VXwEvxbW??yz_Fm*1o#$)+4y{$q%b*)n-bIuXsF|c641IqiQ^po1kv0<|)n@ zl{`X^*aZ4bx0i){wDxD+l&UTrKK10CtGOjzw^p?lUsk>rW%S(R>u!F288fkOdWL>a zG8Tu%M(x@3@r9yi?C-m>+x#{4Ufwp|Q~LJSvF1DJPZwF&oqAZcLp^8vvZsqOXGBY! zwqRV~Bgb=uAyru8jqSuO_WC~~BX=w;T=^x>V2ZBeogI(O{?><CzWDTH)yjF#xHFPJ z+`6=9Iosn`uS1usuUfTovbOP`#mQ5*8Q;lHHrw5C@9lOob@Q#ov*&JQ`*HS-?oq9N zspuU{O9GAvm#76gY93i^$<k8sgYWC=&4*(qAGV0!vGAf>?)|OnCkgNTvo>tjD?>li z7}I6ZdoOL4IHwtNt!dq6@1T%#ix2G)O;f(b^?pl5n)PPB58HM!bDs-uzWIJlRoIze z$GbZpWy!C((>H6;@;HOb0YXcDAA8c*U%cUVxNOI<<05ZQiM_wmym)ruoT#X6uU1~v z*|Ju3snp+xH-Bh{t@#o-X>v<ks@s;+?eT9^@04qPyO^VPIi;d{^36}a?<;FdC#LyM z_BkJznO@{}VuNe)`9+$$94sy=WOZfo>qMP9+;;2sjNKAb*XDCdXNldeS{I)5<k_Wf zvzCe$1ui;yIxXjQ(BUU@ud8e7XH6^#^lvz3aQpS#yK0p?qNmTfA9{FO)q$HaU2kTn zJbJM)X3fTkjX7EzleUJwv@um<y!*hI_wDkQzN2LZ71Cl?--I4pD6?_f)}ZTiR!*DP zx6b3IiLH&EP;}tAe|klQ+eO3Y`D-r;pSCk{+J*zO(id)?UOVrk-Z?|xdwc9QteECD z$zJ2;ylA1&%L`+oIfWvuc5!J0sO){g@<*S2es%Ww^tz&Zm$tH&b93DJ&v5MC(i?ZO z46j~Wv-tHX!_sy2Y%%Y5ixu)+*>I_9x^&!D(?!?9XDgqWZ8-bw`kc=^+U4)6-KRh0 z&yO~lu;;|gCmvhbu4fm9T4`HtpSeNgC8LJ$r8P&K92I6<-rI5{S4Pa3JwM~-mW5p< z&D)-?%`5SBd$u)XbyS$8cC2L5vx5ikY%hw)^p3h$n-%2klR5iTe(s&1XU|RE3T@_D z^f)oM|IOWLZ;Q8Y_T6}S$3&B!q6Hh)O=?$6lUd2ht0=I_Nm0&w_r~o!a_54#O747| z=cKzcOf>si)LON_Z&M%G@?AXa_4JIZ%A;KpSGB6{v4=iexW-oIkiqx8v!>`hNcG55 z`(%Fby~S)Z-J7!9QP<PoRy|(swa!s<GRsuM=w&PxUs`^@IbqcI{dwVx7rCZCtNnRf zD>`C|iq;;@6S~q966cw%^3HR|+Q_OY6Hjj4XmBI);Zw<zvGd)o3N4Awj@<Pj_-16$ znw{J~%f2>0kA6NQ#oXt4k?h0U%>~ErC;tdCdz!yg(IMRS?&ng5r6PUFoDLl-GS2Ny zY>R#0&b-~n&YLEtqrD^JPVk;*Yl}ixc!s`Kowj-Mho{T7dC$GKxvczsZ1L=HsU@bR zTVC5c#UGx2^WEHC-U55e7yAZJ6^LokTHs*NSmnT6V6xMBzudQH2X;=rxz<A4U(M%u z`|j4BluLfC>071CE05oq{Ab6}8{#(d+b10VS-Nn_yYI5i&-!Kxh_8L*?l76@RF;UB z@Q1D4w{J||u4?Ynw<pdyUNTWzxTNm%XL-F;`Ck7^?2{xI6&qv{*d>^j8lPy8eKEmX zP_oBCl!tozs{}Mer#Lt<ytG~QR<iKOZPR0$1>>G3=P^v(_0Dtd;gG`(Y6~kveD<EK zaOGnR@L=HEw>eLDvSL>FH1EUJvkMsnt+*IlHoueE_ha$G1~!J>zkL4{zc?V)eeQ9j z;j?9xHG8&g-LApWct?X(*n5Z5@5g+tj1tVf=EYm4p4Q8HEq<uAy0r5ISGe}UXS3Tg z`x$+WJ}sNsJgrW!x#5y9BlB!2#fuFEj~Qar8MGuA0}e<(7qeY&bL-&k=6i3i$?TRo zA-?a?<MN`}V&!bt*<Nffxge{f>T23iB5Y|DEW*Q-z&OJ}y6kk-iH)_J?#ziV+MYW3 zxZZ}(Q5$-9yZyTNW|FF7*dsP!lgPA_GAow_Db3J~>{6SUBEb4LX42iMaT|GVU6^*m z;MnY_HT!i_zCWJ+v|D+0w245Zvcc=Kb1baV-Et4IthC^CS|HiMxKi)B%jdld?ufs* zr|VehUo<y$x^~uS#k|<C{3w}*)oEF4lBKd{#Y&}FOrMl|njzWRynge8X@9;K%Jr^$ zShppbGyRC+^w*qzFV8-B)I9Z<N|<Y*FI&R~i6aIc$2CHj8B%l2g{4k!d-gE5vNt&* z_i*m}o}xW*=kp^^sq9>`t0lK2!(pd&NwUmQEiFc210RmWB`L<tX^+cxYsD^HXMNy# zq2aU}qF>*>`kc0FZDpE!)~pv-&$}IUOABAKsN`rB|D|O?3}T@?rwvSP?;Vp~+m;*k z<CtSY(qo<t^W{#hnclrw+jFMI<mY;hADE8@z6^>qJ>ZkF%7D{_MV%q%_1?##ceKO) zJf6mL?%c)8iynlX@jQC-RoH|5@^V=ZSGRJMt0{PV2?>^Q*b~gm>2i?4^RUsG;@rU7 zd-t5wH#5I(kUIU(?t<4WJ8!M!e&TaE<K(V)l5?I~W;x|C3ja_IzVEk^u_JAJ`iy6{ zo|Z*-NtgESKO?gtYnpXONw|5w)aDr3uUqGC+iBssD#a+3DI{3dt4CytS_X66o7}(K ztgFxIao-EtXeq<4?snnFJI0kqKTZ3}xKSX$C-9}ul7@!B6~0;(2c*6|pPP1lTUPXX z%hq@A^FzE+BlhmFEa+@$V$+yuDq`s7B+Mtk9`l4d$x`iU{@YiF)@ja2^^S|wY%|^; zE4?_a<j8@#9Z!W<yxbkGwM^A-(u$=Dfrbq{iU+uUZ+#L}zHvIY+mnY8S6>~@II%Ww zU0IW%=|t{Ht1V)!i>EC}IpOwt*$Sm{6G=nER<B;G1>9BMN!z-QU5)+pJ5IDYo#(sK zft{TlcW1B84?5S}V7+|1h_rRl#T9B<85R;vis4PH8V95%^X|JP{dD)Ymrozg;<&fb zXX)ORr_Kp$#;$u>Bq?&yu!mvc6$U{Kv822wjD6o~cHPdoeR+Gh_t~Rsmt8yc##Qdl zJRKJSmj>rnFRcYrmh!qJaQoh_+FtZKuQYQ{o||jIHanl7s-w|Ok0za*p^~H#^(3jI zsNsVIb5XM22kXOfXTSB#`kZH+9Xee@_2i`UzczX74|-Y<ckkY#Rq9&3lVTptby5mk zaCwGER)hZauVQ+q-_^FgT6QnONO=FIm|2e`HqXw`3Cp=s5E>eKxb&KKGry0Q(90_U z3k{cOe`uIH`N_2fHy!RK*{-&{Q&ZY@d!LJoYl7+0#Gk%5&)Dp>Hharqdw(B)9mD?B zlcG1RzNR=kO6WG5#O3VJ=}*_p`&0C1V@h#$S`)WQnr!9fc6Of^XLl$}RcF))VK!ti zDGQ&z@x-?2YN6h%P4&ay-l(h#yEd11nh{@wOx3~2l2tQJURzADQD$^MxFUhCdPM@O zGo&EmYGb%rU6I-P!v2gvT@OYp{0;G~@U--0{9f|y6&-b-FxOJH`zW86ooLV?3>p`) zUBSfAv7GaOpu_>A#|%|m9CfF^Dlqo2Jr!hZP+)whznH-#xz%XC3ggzYk3S4I$6uY( za$Z8f{jTqYe_QHW{xdYLEtz~wpLPGg%}2gZ=e_*6;NyP=zt=z4O3q(W|6KV?`jfu+ z<R9!y>YpqARJ`$zIX724gWWo4TXb%H&xZ3KWDh1pmlZeN2@TxkFXZ8q65@KuAz5LQ zQ*ls%=2F86p`P8(cOSp=<85nN!ESAfZlP;i%QQWY?s<9i$&^^p<j|<}rNJ)})_8L* zm5t5t3|xNrk8e}m<sEGD+h^tpZi)^qJ}Cc8yqfpzInR<4ZLiYuHs0<sSF2@WOPlM! zrK&mO&z#MDM(@<DrTaH`-I}rEUhj(7rk322s*8Ks^QtaguMv6><96!m*1UktxyRO8 zUE6nh)dOAWxwp7;%5Ar~*4J;Do-Ox0<?Yj=z0pP6HE%k8oXoW1%e2GW%$YkvG`>ud z>^Y-sC_A_H&fBG%QuEFj7R(d7eNr;Ad-uwi3FW2Ja!yrk{ZJr!<dFGm_1u;FMAf}s zE`O&J-MQc5+mqa5*B?)pQOvHZ-xd~TvDxP=_spKNXJ_4Wo~Ux}Kp=zGVxu#66~0$L zV7+}~@5LiIdlz=?<$e`W<MOohcEQ)hWx1iNr+zDbvaDbFaMy;7VhbgmuXP2ktq^Zm zb8xrotz7Av+9h{+_vG)IU2*S0^)ib)dfHKXW$D@e%dE{;s;zHGH0;rwF-e%?Oo~xY zbokEl{N&&6j2#s@&V6g{E!vs)CM?y$TxPY>HNTarK1bKwzPkCs-L^g2q0@TpnYBOe zyEsEmy6&{@jdK@db?4vFsg!1`-hN&B*L&IhftyyZ=shdlv0Y(%%v_D2pk*qYJUcoh zb`<VCbv$`Z<lH~${~2y3J>Hr1CRgJamzU=4vaj>@$Qo@|xzFe7o*ni$^Q6=Lf0kNa zrsp57XV#kcZ9{p|j<;IYw(SeI&nP>)zr1wA<MnYXOQRnB{2^=JeJ7SvK)7VZijsyU z3=5W<^uEtry8g#Ei|&f;Th?2D-x%1VYH>6=phe@Mbm5wnt5ueU$EJ&h&f9)%j_lSn ztBuXMI$!f`JuB-oZFFw*J$^jfeM{oDa@mK0hIh1IeV?kg_^M;D-eTz@wY<jYB@53O z%h_>sW^#&nTbu8cINEhM{+7l5GwxjTT}5-FzphxcyzsT>IZvILo1U&KdGsi1a_{P@ zb#<55)^t18oU%@0^DMjjdO_|B<8Q0CpZVa|{IqWJic*&|e!Ihi^nF8vUp(=wtvI%h z`Jd^ZwQFSep9%kTV`lt%ci-CdSpVEtm#4n2UgkYL-O~3}bwS|yS#vCVl)m3`(T|Kz zd$af=L-x<TH#b(h2mEx~Kh0LUVAfxK&#T^7cU7tSY6V)Jxp?)^cl8B_-s;%<#-I25 z@_MCT|8hT*W!u-Uj``ZQttDZnq+eP3>K|F!cD3<p{#(v&^t&><GV#uv<(2btMepVw z+4bZ)Puqo$eNnsJQaxWb97*`da<f5ak{Y9+B)exoW48iBU)Y6reD=bdb8}8SR@iWH zt8`J&hNW7EZBKZfzdB{lt}Q2C2b(UJh%4V^zV3G2wR!B5|M=zYOYb*|X;(U>r<!-~ z;pAAk*!kvJe!WaOUyIi*3{p8ZiLp;1U_L{Ce#=dRLl58HXpPA|WZ?TW*HvTHKJm$# zC--iSy}9#bYVJOx+b`vRo;dqcSw8s(ck81643}ebJFeSJy`?h!wg#g_p@eO8P?hj! znZIi{Z8ZpA>T~Vczp!Fc+o#O4?B^}N=AmNB;A0{o<m$QaNRlICLxq2fgUuX9NfuSj z19BWK5BSvtm=YPNLwH+yB{XPy%vyU@>uq@8rYGOKRT32s-!V)vV10PZd&bn$+ZIl{ z*SM4G+7zqbT}<0DG>mkM9wl@9-oV=EB380;dfBeNF#G+H!JKF8UiKO`Xids<`8|O( zz{663KaB!crrn%YTY9$6-SM_|>9mXe3s#Bw)Lpp0+9-#6g|=Rjnwn+Ht2t@O5{Hxz zSTZm$9Kx`Q?ey)1GuJ2nX9!pSaS?s0$SLLiRB!n&yX_Bg%jCFUcfTK3ygdD-{H{Mo zuP52hjjdf#YjN}4{l_!Ro<Eo^ZEODfYBAr(=zkyPV3{R<bqRDZA!02Q^92*e7xO2# zFg{Jb*C5(o#qfQ}C58|Fc25{*CBO6i#QJj=v$;yi$(xfHKeV!RJT>KGyvsB*$p7w~ zy7vDJf4=u@<jK=I@?^?$i5<)T+*%j9ylch7<b>T$N1ngg5z|^>`sD2??NbZ2Dpt;& z@}EId|LetH`xkUx|1+nAf6DY<FG>XEC-*gen)II`maj?qQ{e@>p!nAdFSykCS+Sq; z{##<j(SP!|!%xrpb?uIVKP_I!YwCZ!@IuL6U6%Q&>c3sGEbdPpFQ{3v|GM*n4$94B z{Vusf_tV$4rM%v0e8Ckz10_XG1S~Wb_Sl|eDE`prckjr<4-(wh-+Q_Vwye6}@#uRu zujuCYj@7{}3q=n-H+d|wXMNXtBh#af{~0D6|6KEhy(v$@fPJspM1>FjmIWQ`TUna# zG$_z^p*CaK1eW7Y@*4Xd{${hkdNzTx7|$Aa#{07E);hWW88Ww;yX?H@SbO~P!3kUR z^TSSU4%y{Ur_UG=BD1Z~vb5;3ukFqAEe*H!&%XZRyX5J*a+ZVl+1&qDvlN!MGheHn z^hMq${=@sKdpYv|8C2*0XGm1}&HBqG`1|kgJ5>KO-06SDvFY{?_5Tc;-%MX{)c(ih zy#nW3{xdw;`k&#A#@S8ri)R{6{O$0L(fW~&=--^0WTo2??tlI>r0iu|@}J?c-iO0> z(*GGIUAK9&>_5Yz<ixv5vs=vBt*pFQPULOPdGenj?Rdb4l>ZFxCfqn5|9QXEw#sb` z^(Ae`s{S*~{c&~k*$vFUmzWt}|MULX+IhJR@^=+C&fEXI&NSz94#U5fyggt4GgyCI zojyB({kum_`ud;ud!ub`GuZEPPPVN-_b2P-vm1<mFG)+j{#X7u?7Z0lF*f-{?>DPn zd-3gf_C1?fPph_lnXhs4*4;I$t@1C-5ei=F(!=s(!6Q~v2O+@;9~<o4zRkaNTI^*0 zy6UYrPGA47t){VBWTx%TxvH|7*K*&^)zFd@nW*q1TY|}jpDlRCM*$O6@VZhQ`w-0H z?(kgO+x|CX{^R3li_m(7C)b7Q)L(k@pMgWCaHD*zd~M~qx$~FQz5Xm7+wrfo^xMKO zkJES8_a)q(-;~4i<^KEJ8|o*o{%2tG!m?xTGiV)}@HGbi2u9lkmah%M*BHL=$X;x) znYV$d>Hz2KFCam!s67QIOYWK!Ee_}8xg4p?>BGFBCH-*HI?#2SDGx24`dXPjb(8*4 zUH;%<kyc>k<xtn(mww;)C^}1`dYQ3Un&1_eKtYLb6aO<zu0AR1+Pm}9FTV7IhZUyR z|1*@mx2cM+`Vm(D=3D#$m;Vem?>_yTdw%)_|AdG2SHRMrFa5rM$ml;q`lf$u^54oU z>!XXGe&IWK=s&~Ce{b(qK41EMe@p7W^QnJ$?BBfm^l#hq(=TM3TmLfz|GmBE<ICFj z4<+k2->hfm|82cz|Jt3OezC(%u8Obz;T8|F`0&4T@AY5j)$D7$VG;k;{_gJca?|hq z6P*6rcKQc{{|uXVpZ;}wzW#zTKJmZ)-}647uhrlCM_K<{wf=*|{|xEn)4y)Fi+6Y< zqyKCEySvZlQP*5Y*;ZuVM56g7F%cS02wR<DzG<rF=Ki<*_x8%?^YD4+I6MehFoW>Z z#CPr$I}~(dY?!thG)~EB$~5<RB-2#1D2Q?CojHZu_E&$~cfDzQ&yjOa!kH^=RtDN@ z&gS1_a83P^o9@Z9qAAO+cb+}DUNLpv#^-z!ps9*MeGLOmnZmLCpSs`KZ%F(bbB$pt zEM+4lav0NY=fCdMDr^7Dz*SCWe+n4xzUO;xzmTEO;cml1Jt^=0Oa1*N>|d(4yjW54 zpCK*p{I|Dn<8@CL@9Ff>&)oKMgZ1f8N}U`F&w8xTy%-u`$m!*3c&<=$C707g;g;RA zwNrJRr#ySf@jU(X?*9z;Z_idTdy|-WDQUfxlfKb|YniE~d7Yu*dNJ*0`Q3My%O2Px zoZ9xpx~9wb@|M+QtJmr*$`o0>N}-;EtCYbfveC`?z4uA6{dw0teo4Lh;Uldr-v4J# zwd?War|zxQoPRaaC{(9!PL2A@V;3iHJ+|#?PU|B+xrGT^EOzY3yRx8ks_!bb2#<+r zq7p}S8mt$~JKM|5Qr(^%?K*Mm7USrw={o&t+i$L$@lCMZu<GXp^F78@f7-O4FU`34 zl2Ocy-Q&)~hZCMG;9(G8JG8N^A-!f}zMMmi*W={vxyg@>QeJ+%#JFoluCJbFgE=$P z+beS0oVc=tzqx!^Eh_BIr}SxaUT_W9a_{6fFW<_fuF)~Fo*cNY<z8gPqE+`B#l);X zPPn^v+jAXVvyeRA!aq$Pr)({G8sKOy@%h?YvAoGmj4QMjZ1)J|arW5K(^hz<?b4h_ zv%Gd~%3D9-Qr14HYs+^YDOcxh+ih`Y?s4&|v%B*Qqt01$cooj>u8b)yjR}s-o~~$p z`|ri*z@iYtDMB0XgzveXJMHVW06mZ0TW-(U|1xF?>k^@Ws5y%m6jU`kDm$bc-g;WR zUh!*vr0SomT}7uKoP3sAE_Nn=kIs7YBCRV=Ri?W<ta_pwB(%14y2rejNm+r5uCCs8 z%ly6J-kqBxZzi2(`t>7k(ZiXOOVk8X?p=Gh<?;+krgh?yCGEl@TtV|ETxrdHYrQ#3 zOFQzqKT~&{*6Z|7vnBRDeo(MsXI1&ri|&gTuc@CGzR+gpvWFLb8!pb>@w_+g=b<8= zzW4pxs%Jc2*mIw6(bA}EvyQ|tv|2Q!&*Vwabvzczx9JJrGO2QPt~-6JFI4z$Z9VvK zqn?EIUfo?<UVWCCQ&X4an#AvYI=57Rt-V2Q#JM6*ZyRBymC>^o6(mUrggTY9XdbZ< zG-P-p%)qa~*i`$W!Qym=+56&;XWyJN=6;-AEM~4M$9nOH%Bl`q-Ge9PX6PPy*_BkN z!0N@h;`<^ta|L<6dJmyi`|Q8ZEZrM+Z}tA$bBy6}<!hXIopH0-m9$4cgy(;Bs_#c$ zGYZ~pW>QAN;U{y`7s*Y(=e$REKdT#NC6^@3@%ea)j{?gf1`LAtMBi=6*sW%+SHgZ~ zoS64x_JoirH8Un1xN)Mis^PD~kGw2_=`I29&oRt8pCJ<Xdx>0}471VB2;Ds0Z=Y>K zU#rYkdLg@P#+t6o2`6{uDQK;7s{P#gOh`cgbgr;=cJ*o1>$+zzsn@lxdeG(l<(Q?d zd?2$di%87!N#)KAf(8bit3LEU@ZgWlm9tDptgWx!w_iG|%=GT|vg$(Nii?-M_pV*| z<gEE|t%gPZEK68L6@CO;dTJgJXgjkda&;2x4FT8Ab$si>4>38E>nzO`lNBz{o3$i( zjyz+_@`z2GtxgFV91_RO+mmxX@98=@`3`6K*5qlcdyk6F==bVAY?h_Hgw2Rs#4E~e zF{8+w(=I>GFzlG0nL9UI!Nce%mqhe(oy`rpJL<bE^KRZ==sSUX;cHcaq)iFQGxa$Z z+Or(UVCv4<Xj80Gwo^}2_IJo9Z{5ADB8Im)Z|yPOH*M3h!X<v3Vnqg*??^BmoV|UM zS>6HNvOlGZx-{yhddr@C{JDdHr7>t{z=MFt2b>sA8g{Fh#O}|Wa3{CS{kypN?$yS# zJ{MM;@M%_?_H?pxky)UD#g!*t{r5#MEnRlibkEjfcht-ME<IOe%YD0Ma$aeW=p40l zE{%t&bHo=b3Msa@EXeE-VVL7`lv!!hTRtnkyfs($O#1Wd!NExutBb#=zL<YU&+~Sd zK6ifIgCz@22^^WUj8XHIL4}eBGvBt{=$M5^SMHOX%zG#QdEL3=*Kcw&#{OL+z2+se zXX=60SMR)5r3-%8`?AZqpux2G+1kKemdUwQ=4K~%81c%NsCzGGFjXk<$g*JE>A>D! z!%*QMz3b(sHM%_4cG;eqw{=_e#k!>zVxkz;9n#b@JQc3QakhxQPIULvn8Bh_Bs_(o z?dH~q-`cm;uK#Hb*L}Bomzvd8wKNSISMDnPuEnifk8)eQo*FfJaaANF2r`{`#HQXH z^|3u{cJu1PX?c0=6_cxz%-i#F*NAus8%|@HyC}d%T%*%MXQ3CX<cZ5498L<~V!5~V zRDAdBd3I(K_gEz6l$|x_{F)uaR+6OgN8F)n&dDhbi*BlVDKV&toJx>jR^FBK&ANPN zjP&Dh_HEauwf*(o-KzWCN-uVMN_dyX%S-P$oVc16da&jNcNENWWn`A%Eu5SvcBkxk zP2}DSdF$V7x7OBfTAr2mVCFktJ-!Tw0}mYnrfk<uvr09M;eOE2dEn}0(2y&5+?DzS zQ}IFmDRKW9j&At3E}Ow~h685{0~Uhu>+CNHdO^|E9%{<JQ`gH2aDM8Ldm=Ocp@WQN z!=st=UZ;lLQD)q%IWbi{Z$iXv;Xsv^qb_ZM&Rkt{S~R_aIyz<?U=aMg+d?yD+M3YF z-^v-^XPx6ay|=1rW8}T?XRFWE#-9J)cJ~Hz+P2#%I^SZdt?#^<A$FqN>3Ye^(<-hf zy_mGrCSDd4mRRB`D91EQDUox=V!4TDbAB6c6`3<HJpT5#g&!jlpWb`BxLUrdczc#f z>vk#4z=}WX;-5_wORGsf^=Wa+PBrI=tFG?d8`JjW-IK*)twIYL=dMX@HF0oBaSHWx zs$sHNXLTvx^ULXq*0d|R%VR?phtItjwEj@t#y8<5IlJ?+AFY^q$}HOJym($9gW;*0 zf&oVu<rvhMKFq0J{AuOFvP0iDMfbdyKYk<Uoybj|-?F9C*M#xDH5WU|9o${X(S5;j zr-Q7(^{SNy9Lr2UeptX=T>JZ0vcX;MwX1WaIBsm(U1mSYR_skc#?RHEVd=Sh_m{C4 zsGVe$&~mvNvG`(Bs?do=OrldnrmC#!xn?M?;~#frPU_T9vw5NJQ!{;+FSQc=-uv=a zY5uvldE3s;^PFyedisXtIT=?cKVLUZCTFJLyln=P-!Isp<o0ypvf@Uzk_I=;#I>GR z59$7xxHmob@teaz_mtiwyR2BQvSPKX%V*upz=CXBozIH*ZHx}LKB}HSA(#C`c<%AA z*O@iP6@BNfeHoN+^zqWk1rIN!igG+PQ*!aDWLlJRxIuzV=S_6(>Cn*UC6PXXw|1Pk z-Mh5vQH#`+<h8mHCsTvE)(ZP;WozkA`+M+K>$mg9cbwj4d#A3?o^S1RKe047<?hXS zvYXXaeMOEmguS*5ObHSYWL&c_-~-2^LpMXdDo-|Zop4@v|CS|B?y0>l_VoVGpt3hr z>Y}$^$kwGUpF>}!UORis>TZ4I);GB`N-vgvFKiC~v9RIEi<1}UI_zEa(t%OSE2_)E zsL_yBOVh)&*Kk9TZ_f5yZ|)p(fwSR<dvuJ|*2mpm`!aTR_Xceh>2+xbT!np>m#whS z4031_wA{hC<ACgjnZH~v2Q{l-65(|`<fe0|NZ=iZgWv)AY5(qPG5(It*Z4l~w)g$- z+on1Gy1*`vQJuo7*qgJ{jLU2Ie@(PM-k*NwKSS1khFyD}&v>tv9ryXOls_rkLCzLm zuHR>V;JxJb2OXIE$ek8|wrJv5!<wQv^}f@)sbA#1o;3$;@{H@$V%#WQYT&+b@nWG8 z`D&rg6vfjFv9t5+60WZh+3sZNb~Edz;A-<;sonWktP)}b1KBxN%v!)DvW(HvCt=AX zd4^3)Yi_TdH}it+mxd>0p{)mH)b4Id*ILBm9qH1^(iV2@j`J?hPcyzUn%_ECAjcWM z!FPXn?26l$w?uPX2q@ZI&aI~FbwyBUuG>n911gUde?7j!Drl~4q}?hr?~S`##JMw1 z#dD=B9rJdj`0WgHEb*JvB5dyA(5^9Mk<%qc4W<({t9~uL_Od$YLGqpV9y{}kN|MxU zmHaM?Oj8i?_H^(_)CgkqsJ`i;z<qh|sWbD<#m?zHHF9@Mk?E8&^?AqjkTGZB9hpv% z(;Au*9$Xq~7VL^m3|k_KPJc71deiSX<Lj~YM|irl8Fr*z;$jzwXlGo$)SU5w@rQ;4 z?#XA~Jug&P^6z?rRjkm<32SxCrm->WbzWrt(sN6xP$)dG;)4OhrxwQEm1Q+sSI(X4 z`f6MB-JMkzx2kZ7SGWkrd}RnR72TAmD9LKWpk~bUL-JZkNX`kNcO{+uI(LuG2=-Ny zWR03O#fM#!;jjnK9!1IT=?o#e@Az!J)fRBw<kndc>4{>xQky(gZtrC8{Gw^*sidN? z)6vn8iz&JKp=1xE;j^b{`Bj0och<Uw@Z53jc3ac3Brr&C#e}FOQ`tgYPHD+(GJN{5 zvx#9#tWkIG&CAu@4UXEI{H9f{y}F5GTV&`}%aApX8ig5`9G&5#ZYXDafazz+oj>P3 zoP4_T?a3X6b==Iy*5<y65_BvonG*4c_k#c7fD-~f`87&1?$a2)&U=~m#xZVvxew0@ zRxOQ_vzB}L2B#=BUU50*;&)d`t<c9yUDIjT0&df8gME)XtTJ<BH{P_h6fHRTTWvbq zqg4qCu8!gzYn<jRNMtZ{;9bL5^=<ha?(*I%dnTTbQ+_gMSHam??_9Mf^0{YBJ+)$H zlG*}|%n8ex&ZIFgD>f+S?z(x}Z%WW^g;ddq*UhcDZ^A;AS9J=6FAR0zDQR@MtmzkW zWI+Ny2OGmC-I-7H>Vnzzg-W6ix4m2Ex#sGomcX>$>luwNt(*cxE)^|cX|U*!zAv(f zA?Yi1)`sI=S}uHVhFxIge+H4mzjm%+R9b**H9F(h>@SI7JHP*2r7FB?>!MRh0@hnr zeX;+tfG_6gH}|dQ?xe8pPm(zLT=b;mlFcdW#ZFHanX|<8gr*kfn%OI-Et=t!DtUZP z+xh+M5v%N_>`r&SFFSMO@Z#O38vEEKO(*MRNxZ$kd41;Vzh~b*``LQ;eR%bxMOzQO z`uF7G>8V%DHLr$-yIG#G{mjwhee?V5)sZ#Xm%?P<-@Nu{G3O<1qrgetCsze5yy?Fs zcxgvhbk3X500)l1+I$U;-;16wDQ{l)spj6K^1}@O8NSs{dNzOgYG$^6LzXw!Qx2S+ zZ*1-U)~8TmrfTqlrz;k*aW-`Luob>I-#cyd+cq}6jp`@1Rvf&?oB5Mlvf$9i!n73K zt>y+>1EQ_`mn*g|Qc8&0c}aM_1hahhhTV?&DPq6<?ACVfxFxXB!gSI5;_X_`?%g;w z*CbZw;w>+W57R7WoSJdW)H$$?VSn_t)wyf641;bbx=y&Q|1#y<CzY26J$f%n2Sf@- zw7gu&G_`|CVa_hgijeS!4wAl?4)({bn{oBklRJHR5!FZUKVDar%6avUMaFJXe@DKc zc}rw8JY{$oLk?&$2rzS&Z=Rj<_w3WducO;DQ_NfRukZG{-aYZ{x;)+Kc~8~3qFZll z6=aoCQIZvD;r49sQetAgbaGpDb)V&?-5YNTZd=)BxyO2=TKCk0VqNjqUW?0h3Wfx0 zh6W#E3ih-VW@=&VR^4E2H??z~QMK^&Y0{-jzxLhCsjl8_<GXg>qef}Vy!&fx0)jLr z`z#RQ;ACMqA~d^)ac7WmNszCQ4wFk4i^g0>%N8ynuD(KHiRwqnh7D>ZC;n*Ky-?sk z{huK(wQGIW+s78Xj-MtQHGKMgyEy3I7RHlXapnWw+1r%OuOIl&uwwG}6G*2#rGZX) zT1xzR);@>r%zr<x=lgi;A6pCNOwN%kw3!_0oMMAzvpdyJ$iXms-jDhzarH+HK#gz@ zd=n#V)y?mwJ;+_TF8!d<^c@G^t9opAHZt_m7UlY7U@&9xfxU`5AMo6%_RT-omUid# z&X!6SSH=GfHxJ0w6<fdmyY%kPOaJ&7*fZz;U}WSyvzwt^;jI3H2V5K8`ri^+sBpLY z1w#>omj5RO_UFO3q<=^5uX{yD4zK;>RP#Tle*9-pJ*Af&xBj}L;yQ72CZ<)3W~F*G zB{DEPaAGJbSK#KwJ1>xTz2}|yh5rmIgfSD{G7=KqdOP#quP3xuy6tZ?$GqcXYLxpt zYbDChO2SA9p-X6&%23S~<!}G#djF5_eo*z|PY;Jkn`gU~TfeBk`{eI8q@#Rif{yad z{4@L0%9MZ8(|<T7_jdex@%#0;k~e>qzsJv5bK_~3_o*j>3@bLy-o0s=!trg3qt)W) zNmZ_MvHdD_`pE3VdnL<y&x_POaXau!qdxpzntIs8=jRUK%SKc<<%+fe#_Ij?UtsBf z2H|{Akr0d;a}=G<h11<^r*Azz^}J5*L3F46)$sO9{mFO5-E03dOsza`e9tsA`(9nL zZ;JMm-;1*>_?x_UTlVkRsoY%`dTjZ>)aO>y7W-(&KdnnTyzP3!mM6Y`#X+-{F-d<- zj!(P)V!c}0@u-)&Ci%6;w$Itl7Rkjbym8k87nxOz2Ffi>t}CkNDzY%xU8#O3`|k6@ zId=>LPm4{O-ni!K$MuFMZ-iedUE^(48YlAkqrK(2R}!Dx7g2M~F;^P{bYBVe)-j`) z$+fz%{i(S9N3s75ubypS)kUn@qq4mrj9WKsIh}S)@2B)amVMz9BhR<oHebP2XESxq zvFSAn0{infzOD0TwBB^$UE25L*}d0Kx>d$5E&gn=<91(0`o}$gyyivC+4b)A<)<EZ zS<*Q7`6kG34dDHC@ri2L_R>G5wo2Q*tM)NVy9O()6jeBJM6%%+%Zt>k<pB>O-)?%J zEmN<+q}8>A<(w;fV^fXAr-p`4JXLQeZ(Z=<&Arp&6PHz<UA%e8(o45as>G~|E-Yl0 zttow7y;-?qrr7Eg96J^G6&)U%T>0+e`D@R{82>WUd)ve^m;YI>9LM#nKGDqV-J+}e z#pX?&T9_W6nfis_LQsGwF`1$6gzSb1zb6+lOGU5UQlY!POXhL*_75@JKb*c${X(qt z)uw;u`JYzIy?QG)>c_%!(g&NK{@L_}-(mCm(CHs{*H3jWEt?*;Pouc)L&DB_oxRK# zbY5Rg{gZe9X~5msrB~N?$voU6p%;Hz-{A|l)z`>+>Fqy5%)>KFvmdov<g;;4|8)9- zEz`NZVe!Y_{tM+DwPZB7MpM^lJ{c`mMpywUxW4&$pUk=kg{B=`qC2?)st!~r+*DDs zKju6oc+SFIyS-P(i&!46Fo@YdEv{*_@)@m0M_U~fw4c};8=rlixN)fv|9b0fChd22 z82shvy?#r^!28$YbF%xJAIz@5tnWDS_P4*g1=x3%9^`9OWbR$M@`y*J|G~&)Mi%FN zLG3@B1TP;huRACHpFvG4E9773>{I_4iXNNfzwO@9AIvYd`p<d$iB%Q7)jM~0%ssMf z%dI0E7Y&#yWVjU`uxhX@VU&5hdFwsZSH}%^Z#FA;*t&Gig;3tm@9CDu=UTfMuw0oI z%FKAlV#2`_ib8WavX)h6+?msLiNVRrsIy(s&$#!swAa@)XRhpS+FER79AbX#lhcV8 zQ!c$b?q>V&h_YX_)M>5S-LZ9AafRLQRX@#bPpK~7^(SP{W8NqGtocrSdtdrvW#uvH zlQm_s6W`u@{W0iskNKn@Z>*JX@4fzL>2ryE)sHvI+_zV+Kk9wX;GXy64R8AMzQ=b> zpOd&}`tih@a(CbD7uB~oT&dr8c$4k!yC8eoKE=z9S~D7GqbY4P-wZ%ubMnFatyk(_ zEakrnF1)6BiAUe9iCDy`7UW~WaZK}jv!I@^ika<<4-&kOt@g)dvFn|8+@Hj((3koq h_x8QZ=5G^oZ=dP0IBs~vCs9!FT~C%Yivj!pn*b<UpsWA@ literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/PicLensLite/PicLensLite.swf b/plugins/tidypics/vendors/PicLensLite/PicLensLite.swf new file mode 100644 index 0000000000000000000000000000000000000000..3bfd4ea495027027b457595699afe0a23fbe5949 GIT binary patch literal 251875 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ⅈiA#IJ@fhnL^8gq9p~$+KPh)nK>b(i*6fF7eic8L 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 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/PicLensLite/piclens_optimized.js b/plugins/tidypics/vendors/PicLensLite/piclens_optimized.js new file mode 100644 index 00000000..48cea086 --- /dev/null +++ b/plugins/tidypics/vendors/PicLensLite/piclens_optimized.js @@ -0,0 +1,20 @@ +/* PicLens Lite: version 1.3.1 (14221) + * Copyright (c) 2008 Cooliris, Inc. All Rights Reserved. + * + * The JavaScript part of PicLens Lite (i.e., this file) is BSD licensed (see: http://lite.piclens.com/bsdlicense) + * This launcher includes and interacts with SWFObject (MIT), BrowserDetect (BSD Compatible), and Lytebox (CC Attribution 3.0). + * + * There are two versions of this JS: + * http://lite.piclens.com/current/piclens.js full commented file (~39KB) + * http://lite.piclens.com/current/piclens_optimized.js lighter deployment file (~21KB) + */ +var PicLensLite={start:function(B){this.determineBrowserParams();clearTimeout(this.REMOVE_TIMER_ID);clearTimeout(this.AUTO_CLOSE_TIMER_ID);this.ARGS={};if(typeof B!=="undefined"&&B!==null){this.ARGS=B;if(B.feedUrl){this.THE_FEED_URL=B.feedUrl;if(this.checkForPluginAndLaunchIfPossible(B.feedUrl,B.guid)){return }if(B.loadFeedInFlash){this.showFlashUI("")}else{this.loadViaXHR(B.feedUrl)}}if(typeof B.feedData!=="undefined"){this.showFlashUI(B.feedData)}}else{var A=this.indexFeeds();if(A.length!==0){var C=A[0];this.THE_FEED_URL=C.url;if(this.checkForPluginAndLaunchIfPossible(C.url)){return }this.loadViaXHR(C.url)}}},isRunning:function(){return this.LITE_IS_RUNNING},hasClient:function(){return this.hasCooliris()},addCustomButton:function(C,B,A){this.CUSTOM_BUTTON={targetURL:C,labelText:B,iconImage:A}},setCallbacks:function(A){if(A.onNoPlugins){this.ON_NO_PLUGINS=A.onNoPlugins}if(A.onExit){this.ON_EXIT=A.onExit}},setLiteURLs:function(A){if(!this.LITE_URL){if(A.swf){this.LITE_URL=A.swf}else{if(A.lite){this.LITE_URL=A.lite+"PicLensLite.swf"}}}if(!this.BUTTON_URL){if(A.button){this.BUTTON_URL=A.button}else{if(A.lite){this.BUTTON_URL=A.lite+"NoFlash.jpg"}}}var B="";if(A.lbox){B=A.lbox}else{if(A.lite){B=A.lite+"../lytebox/"}}if(!this.LBOX_CSS_URL){if(A.lboxcss){this.LBOX_CSS_URL=A.lboxcss}else{if(B!=""){this.LBOX_CSS_URL=B+"lytebox.css"}}}if(!this.LBOX_JS_URL){if(A.lboxjs){this.LBOX_JS_URL=A.lboxjs}else{if(B!=""){this.LBOX_JS_URL=B+"lytebox.js"}}}},ARGS:{},DEBUG_NOCLIENT:false,DEBUG_NOFLASH:false,HPAD:60,VPAD:20,LITE_BG_DIV:null,LITE_FG_DIV:null,LITE_URL:null,BUTTON_URL:null,LBOX_CSS_URL:null,LBOX_JS_URL:null,LBOX_COUNT:0,SHOW_LBOX:false,OS_WIN:false,OS_MAC:false,BROWSER_FFX:false,BROWSER_SAF:false,BROWSER_IE:false,BROWSER_IE6:false,OLD_B_MARGIN:null,OLD_B_OVERFLOW:null,OLD_B_HEIGHT:null,OLD_H_OVERFLOW:null,OLD_H_HEIGHT:null,THE_FEED:"",THE_FEED_URL:"",LITE_IS_RUNNING:false,piclensIsRunning_:false,FLASH_ID_1:"pllflash1",FLASH_ID_2:"pllflash2",FLASH_VER:null,FLASH_URL:"http://www.adobe.com/go/getflashplayer",PL_URL:"http://download.piclens.com/partner/",PLC:null,LEARN_PL_URL:"http://affiliate.piclens.com/partner/",FONT:"font-family: Lucida Grande, Myriad Pro, Verdana, Helvetica, Arial, sans-serif;",KEY_HANDLERS:"",ON_NO_PLUGINS:null,ON_EXIT:null,AUTO_CLOSE_TIMER_ID:0,REMOVE_TIMER_ID:0,RESIZE_TIMER_IE6:null,RESIZE_HANDLER_EXISTS:false,CUSTOM_BUTTON:null,addKeyHandlers:function(){var A=this;if(typeof document.onkeydown!=="undefined"){this.KEY_HANDLERS=document.onkeydown}document.onkeydown=function(C){var B;if(typeof C==="undefined"||C===null){B=window.event.keyCode}else{B=C.which}var D=A.handleKeyPress(B);if(typeof C!="undefined"&&C!=null){C.returnValue=D}return D}},addMouseHandlers:function(){if(window.addEventListener){window.addEventListener("DOMMouseScroll",this.handleMouseWheel,false)}else{if(document.attachEvent){document.attachEvent("onmousewheel",this.handleMouseWheel)}}window.onmousewheel=document.onmousewheel=this.handleMouseWheel},appendElementsToDocument:function(){if(this.BROWSER_FFX&&this.OS_MAC){this.LITE_BG_DIV.style.display="none"}document.body.appendChild(this.LITE_BG_DIV);document.body.appendChild(this.LITE_FG_DIV)},autoResize:function(){if(!this.isRunning()){clearInterval(this.RESIZE_TIMER_IE6);return }var C=this.getPageSize();var B=this.LITE_BG_DIV;if(B){B.style.height=C.h+"px";B.style.width=C.w+"px"}if(this.LITE_FG_DIV){var A=this.LITE_FG_DIV.style;this.resizeToPaddedBox(A);this.resizeToFitPaddedBox(A,C);this.resizeFlashToFitPaddedBox()}},checkForPluginAndLaunchIfPossible:function(B,A){if(this.hasCooliris()){if(typeof (A)!="undefined"){this.PLC.launch(B,"uid",A)}else{this.PLC.launch(B,"","")}return true}return false},createBackgroundOverlay:function(){var D=document.createElement("div");this.LITE_BG_DIV=D;D.id="lite_bg_div";var E=D.style;E.position="fixed";E.width=E.height="100%";if(this.BROWSER_IE6){var A=document.body;var C=A.currentStyle;var H=document.documentElement;var G=H.currentStyle;this.OLD_B_MARGIN=C.margin;this.OLD_B_OVERFLOW=C.overflow;this.OLD_B_HEIGHT=C.height;this.OLD_H_OVERFLOW=G.overflow;this.OLD_H_HEIGHT=G.height;this.OLD_SCROLL_Y=H.scrollTop;A.style.margin="0";A.style.overflow="auto";A.style.height="100%";H.style.overflow="auto";H.style.height="100%";E.position="absolute";var F=this.getPageSize();E.height=F.h+"px";E.width=F.w+"px"}E.left=E.right=E.top=E.bottom="0";E.backgroundColor="#000";E.zIndex=1000;E.opacity="0.5";E.filter="alpha(opacity=50)";var B=this;D.onclick=function(){B.exitPicLensLite()}},createForegroundFlashComponent:function(){var B=document.createElement("div");this.LITE_FG_DIV=B;B.id="lite_fg_div";var A=B.style;A.backgroundColor="#000";A.position="fixed";A.border="2px solid #555";A.zIndex=1001;this.resizeToPaddedBox(A);if(this.BROWSER_IE6){A.position="absolute";this.resizeToFitPaddedBox(A)}},closeFlashUI:function(C){var B=document;B.onkeydown=this.KEY_HANDLERS;window.onmousewheel=B.onmousewheel="";if(window.removeEventListener){window.removeEventListener("DOMMouseScroll",this.handleMouseWheel,false)}if(B.detachEvent){B.detachEvent("onmousewheel",this.handleMouseWheel)}this.LITE_BG_DIV.style.display=this.LITE_FG_DIV.style.display="none";this.REMOVE_TIMER_ID=setTimeout(function(){PicLensLite.removeChildren()},150);if(this.BROWSER_IE6){var A=document.body;var D=document.documentElement;A.style.margin=this.OLD_B_MARGIN;A.style.overflow=this.OLD_B_OVERFLOW;A.style.height=this.OLD_B_HEIGHT;D.style.overflow=this.OLD_H_OVERFLOW;D.style.height=this.OLD_H_HEIGHT;window.scrollTo(0,this.OLD_SCROLL_Y)}if(this.ON_EXIT!==null){this.ON_EXIT(C)}this.setRunningFlag(false)},determineBrowserParams:function(){var B=BrowserDetect.OS;var A=BrowserDetect.browser;this.OS_MAC=(B=="Mac");this.OS_WIN=(B=="Windows");this.BROWSER_FFX=(A=="Firefox");this.BROWSER_SAF=(A=="Safari");this.BROWSER_IE=(A=="Explorer");this.BROWSER_IE6=(this.BROWSER_IE&&BrowserDetect.version=="6");this.FLASH_VER=swfobjlite.getFlashPlayerVersion()},exitPicLensLite:function(){var A=this.getFlash();if(A!==null&&A.fl_exitPicLensLite){A.fl_exitPicLensLite();this.AUTO_CLOSE_TIMER_ID=setTimeout(function(){if(PicLensLite.isRunning()){PicLensLite.closeFlashUI()}},500)}else{this.closeFlashUI()}},findScriptLocation:function(){var E=document.getElementsByTagName("script");for(var C=0;C!=E.length;++C){var A=E[C];var D=A.getAttribute("type");if(D=="text/javascript"){var F=A.getAttribute("src");if(F===null){continue}var B=F.indexOf("piclens.js");if(B!=-1){this.setLiteURLs({lite:F.substring(0,B)});return }else{B=F.indexOf("piclens_optimized.js");if(B!=-1){this.setLiteURLs({lite:F.substring(0,B)});return }}}}},getPageSize:function(){var J,F,G,C;var I=document;var E=I.body;var D;if(window.innerHeight&&window.scrollMaxY){J=I.scrollWidth;F=(this.isFrame?parent.innerHeight:self.innerHeight)+(this.isFrame?parent.scrollMaxY:self.scrollMaxY)}else{if(E.scrollHeight>E.offsetHeight){J=E.scrollWidth;F=E.scrollHeight}else{D=I.getElementsByTagName("html").item(0);J=D.offsetWidth;F=D.offsetHeight;J=(J<E.offsetWidth)?E.offsetWidth:J;F=(F<E.offsetHeight)?E.offsetHeight:F}}var A=I.documentElement;if(self.innerHeight){G=(this.isFrame)?parent.innerWidth:self.innerWidth;C=(this.isFrame)?parent.innerHeight:self.innerHeight}else{if(A&&A.clientHeight){G=A.clientWidth;C=A.clientHeight}else{if(E){D=I.getElementsByTagName("html").item(0);G=D.clientWidth;C=D.clientHeight;G=(G==0)?E.clientWidth:G;C=(C==0)?E.clientHeight:C}}}var B=(F<C)?C:F;var H=(J<G)?G:J;return{pw:H,ph:B,w:G,h:C}},getElementsFromXMLFeed:function(){var B;if(window.ActiveXObject){B=new ActiveXObject("Microsoft.XMLDOM");B.async=false;B.loadXML(PicLensLite.THE_FEED)}else{var C=new DOMParser();B=C.parseFromString(PicLensLite.THE_FEED,"text/xml")}var A=B.getElementsByTagName("*");return A},getBasicSlideShowHTML:function(){if(!this.LBOX_JS_URL||!this.LBOX_CSS_URL){return""}var D=document.getElementsByTagName("head").item(0);var A=document.createElement("script");A.src=this.LBOX_JS_URL;A.type="text/javascript";D.appendChild(A);var G=document.createElement("link");G.rel="stylesheet";G.href=this.LBOX_CSS_URL;G.type="text/css";G.media="screen";D.appendChild(G);var F=this.getElementsFromXMLFeed();var C;var H="";for(C=0;C<F.length;C++){if(F[C].nodeName=="media:content"){var B=F[C].getAttribute("url");if(B.indexOf(".flv")==-1){H+='<a id="lboxImage" href="'+B+'" rel="lytebox[lite]"></a> '}}}var E="<div id='lightbox_images' align='center' style='display: none; padding-top:10px; color:#FFFFFF; font-size:.8em; "+this.FONT+" color:#999999;'>";E+='( Alternatively, <a onclick="javascript:PicLensLite.invokeLytebox();return false;" href="#" style="color:#656588">click here for a basic slideshow</a>. )';E+=H;E+="</div><br/>";return E},generateAlternativeContent:function(){var J='<div id="altContent" style="text-align:center; margin: 0 0 0 0; padding: 0 0 0 0; background-color: #000; min-width:860px;">';J+='<div align="center" style="width: 100%; padding-top:60px; '+this.FONT+'">';var I=this.FLASH_VER;var G;if(I.major>0){G="update your Flash Player from version "+I.major+"."+I.minor+"."+I.release+" to version 9.0.28 or newer"}else{G="install the most recent Flash Player"}var D="";if(this.THE_FEED!==""){D=this.getBasicSlideShowHTML()}var A=this.PL_URL;var E=this.LEARN_PL_URL;var F=this.ARGS.pid;if(F){A+=F+"/";E+=F+"/"}else{var H="000000000001/";A+=H;E+=H}if(this.SHOW_LBOX){}else{var C="<span style='padding-left:25px; color:#C6C6C6; font-size:";J+="<div style='padding:10px;'>"+C+"1.5em; font-weight: bold; "+this.FONT+"'>You're clicks away from going full screen!</span><br/>"+C+".9em; padding-bottom: 15px; "+this.FONT+"'>You must get the <a href='"+A+"' style='color:#656588'>Cooliris</a> browser plugin, or "+G+".</span></div>";if(!this.BUTTON_URL){J+='<a href="'+A+'" style="color:#ACD">Get Cooliris Now!</a>'}else{var B='<area shape="rect" coords=';J+='<img src="'+this.BUTTON_URL+'" alt="" border="0" usemap="#Map"><map name="Map" id="Map">'+B+'"0,0,33,33" href="#" onclick="javascript:PicLensLite.closeFlashUI();" />'+B+'"35,35,325,325" href="'+A+'" />'+B+'"593,209,825,301" href="'+this.FLASH_URL+'" />'+B+'"327,148,448,178" href="'+E+'" /></map>'}}J+="</div>";J+=D;J+='<div align="center" style="color:#666666; font-size:11px; '+this.FONT+'">© 2008 Cooliris, Inc. All trademarks are property of their respective holders.<br/><br/><br/></div>';J+="</div>";return J},generateFlashVars:function(){var C="";var B=this.ARGS;if(typeof B.guid!=="undefined"){C+="&startItemGUID="+B.guid}if(B.loadFeedInFlash){C+="&feedURL="+encodeURIComponent(this.THE_FEED_URL)}if(B.paused){C+="&paused="+B.paused}if(B.loop){C+="&loop="+B.loop}if(B.delay){C+="&delay="+B.delay}if(B.pid){C+="&pid="+B.pid}if(typeof B.maxScale!="undefined"){C+="&maxScale="+B.maxScale}if(typeof B.overlayToolbars!="undefined"){C+="&overlayToolbars="+B.overlayToolbars}var A=this.CUSTOM_BUTTON;if(A!=null){C+="&cButtonURL="+encodeURIComponent(A.targetURL);if(A.labelText!=null){C+="&cButtonLabel="+encodeURIComponent(A.labelText)}if(A.iconImage!=null){C+="&cButtonIcon="+encodeURIComponent(A.iconImage)}}C+="&swfURL="+encodeURIComponent(this.LITE_URL);C=C.substring(1);return C},getFlash:function(){if(this.BROWSER_SAF||this.BROWSER_IE){return document.getElementById(this.FLASH_ID_1)}else{return document.getElementById(this.FLASH_ID_2)}},getWindowSize:function(){var B=document.documentElement;var D=document.body;var A=0,C=0;if(typeof (window.innerWidth)=="number"){A=window.innerWidth;C=window.innerHeight}else{if(B&&(B.clientWidth||B.clientHeight)){A=B.clientWidth;C=B.clientHeight}else{if(D&&(D.clientWidth||D.clientHeight)){A=D.clientWidth;C=D.clientHeight}}}return{w:A,h:C}},handleKeyPress:function(A){if(!this.isRunning()){return true}var B=this.getFlash();if(B!=null&&B.fl_keyPressed){B.fl_keyPressed(A)}else{if(A==27){this.closeFlashUI();return false}}if(A==9||A==13){return false}return true},handleMouseWheel:function(A){var C=0;if(!A){A=window.event}if(A.wheelDelta){C=A.wheelDelta/120;if(window.opera){C=-C}}else{if(A.detail){var B=A.detail;if(Math.abs(B)<3){C=-B}else{C=-B/3}}}if(C){PicLensLite.sendMouseScrollToFlash(C)}if(A.preventDefault){A.preventDefault()}A.returnValue=false;return false},hasPicLensClient:function(){return this.hasCooliris()},hasCooliris:function(){if(this.DEBUG_NOCLIENT){return false}var E=false;if(this.PLC){E=true}else{if(window.piclens&&window.piclens.launch){this.PLC=window.piclens;E=true}else{var B=null;if(typeof PicLensContext!="undefined"){B=new PicLensContext()}else{try{B=new ActiveXObject("PicLens.Context")}catch(D){if(navigator.mimeTypes["application/x-cooliris"]){B=document.createElement("object");B.style.height="0px";B.style.width="0px";B.type="application/x-cooliris";document.documentElement.appendChild(B)}else{B=null}}}this.PLC=B;if(this.PLC){E=true}}}if(E){if(this.BROWSER_SAF){return true}var A;try{A=this.PLC.version}catch(D){return false}var C=A.split(".");if(C[0]>1){return true}else{if(C[0]==1){if(C[1]>6){return true}else{if(C[1]==6){if(C[2]>0){return true}else{if(C[2]==0){if(C[3]>=824){return true}}}}}}}return false}else{return false}},invokeLytebox:function(){this.SHOW_LBOX=true;myLytebox.start(document.getElementById("lboxImage"),false,false);this.closeFlashUI()},showLyteboxLink:function(){myLytebox.updateLyteboxItems();myLytebox.doAnimations=false;var A=document.getElementById("lightbox_images");if(A!=null){A.style.display="block";if(this.SHOW_LBOX&&this.getFlash()==null){this.invokeLytebox()}}},startLytebox:function(){if(typeof myLytebox!="undefined"){this.showLyteboxLink()}else{if(typeof initLytebox!="undefined"){initLytebox();this.showLyteboxLink()}else{if(this.LBOX_COUNT>=4){return }setTimeout(function(){PicLensLite.startLytebox()},150);this.LBOX_COUNT++}}},injectFlashPlayer:function(){var A=this.LITE_FG_DIV;var D;var F;D=F="100%";if(this.BROWSER_IE6){D=F="0"}var E=this.generateFlashVars();var B=this.generateAlternativeContent();if(this.meetsReqs()){var C="<param name=";A.innerHTML='<object id="'+this.FLASH_ID_1+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%">'+C+'"movie" value="'+this.LITE_URL+'" />'+C+'"quality" value="high"/> '+C+'"bgcolor" value="#000000"/> '+C+'"allowScriptAccess" value="always"/> '+C+'"FlashVars" value="'+E+'"/> '+C+'"allowFullScreen" value="true"/> '+C+'"wmode" value="window"/> '+C+'"scale" value="noscale"/> <object type="application/x-shockwave-flash" data="'+this.LITE_URL+'" width="'+D+'" height="'+F+'" quality="high" bgcolor="#000000" id="'+this.FLASH_ID_2+'" quality="high" FlashVars="'+E+'" allowFullScreen="true" scale="noscale" wmode="window" allowScriptAccess="always">'+B+"</object></object>"}else{if(this.ON_NO_PLUGINS){this.ON_NO_PLUGINS()}else{A.innerHTML=B;A.style.minWidth="860px";A.style.minHeight="550px"}}if(this.BROWSER_SAF){this.resizeUI()}},indexFeeds:function(){var E=document.getElementsByTagName("link");var A=[];for(var B=0;B!=E.length;++B){var D=E[B],C=D.getAttribute("type");if(C=="application/rss+xml"||C=="text/xml"){A.push({title:D.getAttribute("title"),url:D.getAttribute("href")})}}return A},loadViaXHR:function(B){var A=this;var D=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("MSXML2.XMLHTTP.3.0");try{D.open("GET",B,true);D.onreadystatechange=function(){if(D.readyState==4){if((D.status==200||D.status==0)){if(D.responseText){A.showFlashUI(D.responseText)}}else{if(console){console.log("PicLens Lite could not load the RSS Feed: "+B)}}}};D.send("")}catch(C){this.ARGS.loadFeedInFlash=true;this.showFlashUI("")}},meetsReqs:function(){if(this.DEBUG_NOFLASH){return false}var B=(this.FLASH_VER.major==0)&&this.BROWSER_IE;var A=swfobjlite.hasFlashPlayerVersion("9.0.28");return A||B},removeChildren:function(){this.REMOVE_TIMER_ID=0;if(this.LITE_BG_DIV!==null){document.body.removeChild(this.LITE_BG_DIV);this.LITE_BG_DIV=null}if(this.LITE_FG_DIV!==null){document.body.removeChild(this.LITE_FG_DIV);this.LITE_FG_DIV=null}},resizeFlashToFitPaddedBox:function(){var B=this.getFlash();if(B){var C=this.getPageSize();var A=C.w-this.HPAD*2;var D=C.h-this.VPAD*2;B.style.width=A;B.style.height=D;B.width=A;B.height=D}},resizeToFitPaddedBox:function(B,A){if(typeof A=="undefined"){A=this.getPageSize()}B.width=(A.w-this.HPAD*2)+"px";B.height=(A.h-this.VPAD*2)+"px"},resizeToPaddedBox:function(A){A.left=A.right=this.HPAD+"px";A.top=A.bottom=this.VPAD+"px"},resizeUI:function(){if(this.LITE_FG_DIV){var A=this.LITE_FG_DIV.style;this.resizeToPaddedBox(A);this.resizeToFitPaddedBox(A);this.resizeFlashToFitPaddedBox()}},setRunningFlag:function(A){this.LITE_IS_RUNNING=A;this.piclensIsRunning_=A},setResizeHandler:function(){if(!this.RESIZE_HANDLER_EXISTS&&this.BROWSER_SAF){var A=this;window.addEventListener("resize",function(){A.resizeUI()},false);this.RESIZE_HANDLER_EXISTS=true}},setResizeTimer:function(){if(this.BROWSER_IE6){this.RESIZE_TIMER_IE6=setInterval(function(){PicLensLite.autoResize()},1000)}},showFlashUI:function(A){this.THE_FEED=A;this.findScriptLocation();this.createBackgroundOverlay();this.createForegroundFlashComponent();if(this.BROWSER_IE){this.appendElementsToDocument()}this.injectFlashPlayer();if(!this.BROWSER_IE){this.appendElementsToDocument()}this.addKeyHandlers();this.addMouseHandlers();this.setRunningFlag(true);this.setResizeTimer();this.setResizeHandler();this.startLytebox()},sendMouseScrollToFlash:function(B){if(!this.isRunning()){return }var A=this.getFlash();if(A!=null&&A.fl_mouseMoved){A.fl_mouseMoved(B)}}};var swfobjlite=function(){var UNDEF="undefined",OBJECT="object",SHOCKWAVE_FLASH="Shockwave Flash",SHOCKWAVE_FLASH_AX="ShockwaveFlash.ShockwaveFlash",win=window,doc=document,nav=navigator;var ua=function(){var w3cdom=typeof doc.getElementById!=UNDEF&&typeof doc.getElementsByTagName!=UNDEF&&typeof doc.createElement!=UNDEF&&typeof doc.appendChild!=UNDEF&&typeof doc.replaceChild!=UNDEF&&typeof doc.removeChild!=UNDEF&&typeof doc.cloneNode!=UNDEF,playerVersion=[0,0,0],d=null;if(typeof nav.plugins!=UNDEF&&typeof nav.plugins[SHOCKWAVE_FLASH]==OBJECT){d=nav.plugins[SHOCKWAVE_FLASH].description;if(d){d=d.replace(/^.*\s+(\S+\s+\S+$)/,"$1");playerVersion[0]=parseInt(d.replace(/^(.*)\..*$/,"$1"),10);playerVersion[1]=parseInt(d.replace(/^.*\.(.*)\s.*$/,"$1"),10);playerVersion[2]=/r/.test(d)?parseInt(d.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof win.ActiveXObject!=UNDEF){var a=null,fp6Crash=false;try{a=new ActiveXObject(SHOCKWAVE_FLASH_AX+".7")}catch(e){try{a=new ActiveXObject(SHOCKWAVE_FLASH_AX+".6");playerVersion=[6,0,21];a.AllowScriptAccess="always"}catch(e){if(playerVersion[0]==6){fp6Crash=true}}if(!fp6Crash){try{a=new ActiveXObject(SHOCKWAVE_FLASH_AX)}catch(e){}}}if(!fp6Crash&&a){try{d=a.GetVariable("$version");if(d){d=d.split(" ")[1].split(",");playerVersion=[parseInt(d[0],10),parseInt(d[1],10),parseInt(d[2],10)]}}catch(e){}}}}var u=nav.userAgent.toLowerCase(),p=nav.platform.toLowerCase(),webkit=/webkit/.test(u)?parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,ie=false,windows=p?/win/.test(p):/win/.test(u),mac=p?/mac/.test(p):/mac/.test(u); +/*@cc_on + ie = true; + @if (@_win32) + windows = true; + @elif (@_mac) + mac = true; + @end + @*/ +return{w3cdom:w3cdom,pv:playerVersion,webkit:webkit,ie:ie,win:windows,mac:mac}}();return{hasFlashPlayerVersion:function(rv){var pv=ua.pv,v=rv.split(".");v[0]=parseInt(v[0],10);v[1]=parseInt(v[1],10);v[2]=parseInt(v[2],10);return(pv[0]>v[0]||(pv[0]==v[0]&&pv[1]>v[1])||(pv[0]==v[0]&&pv[1]==v[1]&&pv[2]>=v[2]))?true:false},getFlashPlayerVersion:function(){return{major:ua.pv[0],minor:ua.pv[1],release:ua.pv[2]}}}}();var BrowserDetect={init:function(){this.browser=this.searchString(this.dataBrowser)||"Unknown Browser";this.version=this.searchVersion(navigator.userAgent)||this.searchVersion(navigator.appVersion)||"Unknown Version";this.OS=this.searchString(this.dataOS)||"Unknown OS"},searchString:function(D){for(var A=0;A<D.length;A++){var B=D[A].string;var C=D[A].prop;this.versionSearchString=D[A].versionSearch||D[A].identity;if(B){if(B.indexOf(D[A].subString)!=-1){return D[A].identity}}else{if(C){return D[A].identity}}}},searchVersion:function(B){var A=B.indexOf(this.versionSearchString);if(A==-1){return }return parseFloat(B.substring(A+this.versionSearchString.length+1))},dataBrowser:[{string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"},{string:navigator.vendor,subString:"Apple",identity:"Safari"},{prop:window.opera,identity:"Opera"},{string:navigator.vendor,subString:"iCab",identity:"iCab"},{string:navigator.vendor,subString:"KDE",identity:"Konqueror"},{string:navigator.userAgent,subString:"Firefox",identity:"Firefox"},{string:navigator.vendor,subString:"Camino",identity:"Camino"},{string:navigator.userAgent,subString:"Netscape",identity:"Netscape"},{string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE"},{string:navigator.userAgent,subString:"Gecko",identity:"Mozilla",versionSearch:"rv"},{string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"}],dataOS:[{string:navigator.platform,subString:"Win",identity:"Windows"},{string:navigator.platform,subString:"Mac",identity:"Mac"},{string:navigator.platform,subString:"Linux",identity:"Linux"}]};BrowserDetect.init(); \ No newline at end of file diff --git a/plugins/tidypics/vendors/jquery.imgareaselect-0.7.js b/plugins/tidypics/vendors/jquery.imgareaselect-0.7.js new file mode 100644 index 00000000..3adac1d6 --- /dev/null +++ b/plugins/tidypics/vendors/jquery.imgareaselect-0.7.js @@ -0,0 +1,614 @@ +/* + * imgAreaSelect jQuery plugin + * version 0.7 + * + * Copyright (c) 2008-2009 Michal Wojciechowski (odyniec.net) + * + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://odyniec.net/projects/imgareaselect/ + * + */ + +jQuery.imgAreaSelect = { onKeyPress: null }; + +jQuery.imgAreaSelect.init = function (img, options) { + var $img = jQuery(img), $area = jQuery('<div />'), + $border1 = jQuery('<div />'), $border2 = jQuery('<div />'), + $areaOver = jQuery('<div />'), $areaOver2, + $outLeft = jQuery('<div />'), $outTop = jQuery('<div />'), + $outRight = jQuery('<div />'), $outBottom = jQuery('<div />'), + $handles, handleWidth, handles = [ ], + left, top, imgOfs, imgWidth, imgHeight, parent, parOfs, parScroll, + zIndex = 0, position = 'absolute', $p, startX, startY, moveX, moveY, + resizeMargin = 10, resize = [ ], V = 0, H = 1, + keyDown, d, aspectRatio, x1, x2, y1, y2, x, y, adjusted, + selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 }; + + var $a = $area.add($border1).add($border2).add($areaOver); + var $o = $outLeft.add($outTop).add($outRight).add($outBottom); + + function viewX(x) + { + return x + imgOfs.left + parScroll.left - parOfs.left; + } + + function viewY(y) + { + return y + imgOfs.top + parScroll.top - parOfs.top; + } + + function selX(x) + { + return x - imgOfs.left - parScroll.left + parOfs.left; + } + + function selY(y) + { + return y - imgOfs.top - parScroll.top + parOfs.top; + } + + function evX(event) + { + return event.pageX + parScroll.left - parOfs.left; + } + + function evY(event) + { + return event.pageY + parScroll.top - parOfs.top; + } + + function getZIndex() + { + $p = $img; + + while ($p.length && !$p.is('body')) { + if (!isNaN($p.css('z-index')) && $p.css('z-index') > zIndex) + zIndex = $p.css('z-index'); + if ($p.css('position') == 'fixed') + position = 'fixed'; + + $p = $p.parent(); + } + } + + function adjust() + { + imgOfs = $img.offset(); + imgOfs.left = parseInt(imgOfs.left) + parseInt($img.css("border-left-width")) + parseInt($img.css("padding-left")); + imgOfs.top = parseInt(imgOfs.top) + parseInt($img.css("border-top-width")) + parseInt($img.css("padding-top")); + imgWidth = $img.width(); + imgHeight = $img.height(); + + if (jQuery(parent).is('body')) + parOfs = parScroll = { left: 0, top: 0 }; + else { + parOfs = jQuery(parent).offset(); + parScroll = { left: parent.scrollLeft, top: parent.scrollTop }; + } + + left = viewX(0); + top = viewY(0); + } + + function update(resetKeyPress) + { + $a.css({ + left: viewX(selection.x1) + 'px', + top: viewY(selection.y1) + 'px', + width: Math.max(selection.width - options.borderWidth * 2, 0) + 'px', + height: Math.max(selection.height - options.borderWidth * 2, 0) + 'px' + }); + $areaOver.css({ width: selection.width + 'px', height: selection.height + 'px' }); + $outLeft.css({ left: left + 'px', top: top + 'px', + width: selection.x1 + 'px', height: imgHeight + 'px' }); + $outTop.css({ left: left + selection.x1 + 'px', top: top + 'px', + width: selection.width + 'px', height: selection.y1 + 'px' }); + $outRight.css({ left: left + selection.x2 + 'px', top: top + 'px', + width: imgWidth - selection.x2 + 'px', height: imgHeight + 'px' }); + $outBottom.css({ left: left + selection.x1 + 'px', top: top + selection.y2 + 'px', + width: selection.width + 'px', height: imgHeight - selection.y2 + 'px' }); + + if ($handles) { + handles[0].css({ left: viewX(selection.x1) + 'px', + top: viewY(selection.y1) + 'px' }); + handles[1].css({ left: viewX(selection.x2 - handleWidth) + 'px', + top: viewY(selection.y1) + 'px' }); + handles[2].css({ left: viewX(selection.x1) + 'px', + top: viewY(selection.y2 - handleWidth) + 'px' }); + handles[3].css({ left: viewX(selection.x2 - handleWidth) + 'px', + top: viewY(selection.y2 - handleWidth) + 'px' }); + + if (handles.length == 8) { + handles[4].css({ left: viewX(selection.x1 + (selection.width - + handleWidth) / 2) + 'px', top: viewY(selection.y1) + 'px' }); + handles[5].css({ left: viewX(selection.x1) + 'px', top: + viewY(selection.y1 + (selection.height - handleWidth) / 2) + 'px' }); + handles[6].css({ left: viewX(selection.x1 + (selection.width - handleWidth) + / 2) + 'px', top: viewY(selection.y2 - handleWidth) + 'px' }); + handles[7].css({ left: viewX(selection.x2 - handleWidth) + 'px', top: + viewY(selection.y1 + (selection.height - handleWidth) / 2) + 'px' }); + } + + for (var i = 0; i < handles.length; i++) { + if (selX(parseInt(handles[i].css('left'))) < 0) + handles[i].css('left', viewX(0) + 'px'); + if (selX(parseInt(handles[i].css('left'))) > imgWidth - handleWidth) + handles[i].css('left', viewX(imgWidth - handleWidth) + 'px'); + if (selY(parseInt(handles[i].css('top'))) < 0) + handles[i].css('top', viewY(0) + 'px'); + if (selY(parseInt(handles[i].css('top'))) > imgHeight - handleWidth) + handles[i].css('top', viewY(imgHeight - handleWidth) + 'px'); + } + } + + if (resetKeyPress !== false) { + if (jQuery.imgAreaSelect.keyPress != docKeyPress) + jQuery(document).unbind(jQuery.imgAreaSelect.keyPress, + jQuery.imgAreaSelect.onKeyPress); + + if (options.keys) + jQuery(document).bind(jQuery.imgAreaSelect.keyPress, + jQuery.imgAreaSelect.onKeyPress = docKeyPress); + } + } + + function areaMouseMove(event) + { + if (!adjusted) { + adjust(); + adjusted = true; + + $a.one('mouseout', function () { adjusted = false; }); + } + + x = selX(evX(event)) - selection.x1; + y = selY(evY(event)) - selection.y1; + + resize = [ ]; + + if (options.resizable) { + if (y <= resizeMargin) + resize[V] = 'n'; + else if (y >= selection.height - resizeMargin) + resize[V] = 's'; + if (x <= resizeMargin) + resize[H] = 'w'; + else if (x >= selection.width - resizeMargin) + resize[H] = 'e'; + } + + $areaOver.css('cursor', resize.length ? resize.join('') + '-resize' : + options.movable ? 'move' : ''); + if ($areaOver2) + $areaOver2.toggle(); + } + + function areaMouseDown(event) + { + if (event.which != 1) return false; + + adjust(); + + if (options.resizable && resize.length > 0) { + jQuery('body').css('cursor', resize.join('') + '-resize'); + + x1 = viewX(selection[resize[H] == 'w' ? 'x2' : 'x1']); + y1 = viewY(selection[resize[V] == 'n' ? 'y2' : 'y1']); + + jQuery(document).mousemove(selectingMouseMove); + $areaOver.unbind('mousemove', areaMouseMove); + + jQuery(document).one('mouseup', function () { + resize = [ ]; + + jQuery('body').css('cursor', ''); + + if (options.autoHide || selection.width == 0 || selection.height == 0) + $a.add($o).add($handles).hide(); + + options.onSelectEnd(img, selection); + + jQuery(document).unbind('mousemove', selectingMouseMove); + $areaOver.mousemove(areaMouseMove); + }); + } + else if (options.movable) { + moveX = selection.x1 + left; + moveY = selection.y1 + top; + startX = evX(event); + startY = evY(event); + + $areaOver.unbind('mousemove', areaMouseMove); + + jQuery(document).mousemove(movingMouseMove) + .one('mouseup', function () { + options.onSelectEnd(img, selection); + + jQuery(document).unbind('mousemove', movingMouseMove); + $areaOver.mousemove(areaMouseMove); + }); + } + else + $img.mousedown(event); + + return false; + } + + function aspectRatioXY() + { + x2 = Math.max(left, Math.min(left + imgWidth, + x1 + Math.abs(y2 - y1) * aspectRatio * (x2 >= x1 ? 1 : -1))); + y2 = Math.round(Math.max(top, Math.min(top + imgHeight, + y1 + Math.abs(x2 - x1) / aspectRatio * (y2 >= y1 ? 1 : -1)))); + x2 = Math.round(x2); + } + + function aspectRatioYX() + { + y2 = Math.max(top, Math.min(top + imgHeight, + y1 + Math.abs(x2 - x1) / aspectRatio * (y2 >= y1 ? 1 : -1))); + x2 = Math.round(Math.max(left, Math.min(left + imgWidth, + x1 + Math.abs(y2 - y1) * aspectRatio * (x2 >= x1 ? 1 : -1)))); + y2 = Math.round(y2); + } + + function doResize(newX2, newY2) + { + x2 = newX2; + y2 = newY2; + + if (options.minWidth && Math.abs(x2 - x1) < options.minWidth) { + x2 = x1 - options.minWidth * (x2 < x1 ? 1 : -1); + + if (x2 < left) + x1 = left + options.minWidth; + else if (x2 > left + imgWidth) + x1 = left + imgWidth - options.minWidth; + } + + if (options.minHeight && Math.abs(y2 - y1) < options.minHeight) { + y2 = y1 - options.minHeight * (y2 < y1 ? 1 : -1); + + if (y2 < top) + y1 = top + options.minHeight; + else if (y2 > top + imgHeight) + y1 = top + imgHeight - options.minHeight; + } + + x2 = Math.max(left, Math.min(x2, left + imgWidth)); + y2 = Math.max(top, Math.min(y2, top + imgHeight)); + + if (aspectRatio) + if (Math.abs(x2 - x1) / aspectRatio > Math.abs(y2 - y1)) + aspectRatioYX(); + else + aspectRatioXY(); + + if (options.maxWidth && Math.abs(x2 - x1) > options.maxWidth) { + x2 = x1 - options.maxWidth * (x2 < x1 ? 1 : -1); + if (aspectRatio) aspectRatioYX(); + } + + if (options.maxHeight && Math.abs(y2 - y1) > options.maxHeight) { + y2 = y1 - options.maxHeight * (y2 < y1 ? 1 : -1); + if (aspectRatio) aspectRatioXY(); + } + + selection = { x1: selX(Math.min(x1, x2)), x2: selX(Math.max(x1, x2)), + y1: selY(Math.min(y1, y2)), y2: selY(Math.max(y1, y2)), + width: Math.abs(x2 - x1), height: Math.abs(y2 - y1) }; + + update(); + + options.onSelectChange(img, selection); + } + + function selectingMouseMove(event) + { + x2 = !resize.length || resize[H] || aspectRatio ? evX(event) : viewX(selection.x2); + y2 = !resize.length || resize[V] || aspectRatio ? evY(event) : viewY(selection.y2); + + doResize(x2, y2); + + return false; + } + + function doMove(newX1, newY1) + { + x2 = (x1 = newX1) + selection.width; + y2 = (y1 = newY1) + selection.height; + + selection.x1 = selX(x1); + selection.y1 = selY(y1); + selection.x2 = selX(x2); + selection.y2 = selY(y2); + + update(); + + options.onSelectChange(img, selection); + } + + function movingMouseMove(event) + { + var newX1 = Math.max(left, Math.min(moveX + evX(event) - startX, + left + imgWidth - selection.width)); + var newY1 = Math.max(top, Math.min(moveY + evY(event) - startY, + top + imgHeight - selection.height)); + + doMove(newX1, newY1); + + event.preventDefault(); + return false; + } + + function startSelection(event) + { + adjust(); + + selection = { x1: selX(x1), y1: selY(y1) }; + doResize(x1, y1); + + resize = [ ]; + + $a.add($o).add($handles).show(); + + jQuery(document).unbind('mouseup', cancelSelection) + .mousemove(selectingMouseMove); + $areaOver.unbind('mousemove', areaMouseMove); + + options.onSelectStart(img, selection); + + jQuery(document).one('mouseup', function () { + if (options.autoHide || (selection.width * selection.height == 0)) + $a.add($o).add($handles).hide(); + + options.onSelectEnd(img, selection); + + jQuery(document).unbind('mousemove', selectingMouseMove); + $areaOver.mousemove(areaMouseMove); + }); + } + + function cancelSelection() + { + jQuery(document).unbind('mousemove', startSelection); + $a.add($o).add($handles).hide(); + + selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 }; + + options.onSelectChange(img, selection); + options.onSelectEnd(img, selection); + } + + function imgMouseDown(event) + { + if (event.which != 1) return false; + + startX = x1 = evX(event); + startY = y1 = evY(event); + + jQuery(document).one('mousemove', startSelection) + .one('mouseup', cancelSelection); + + return false; + } + + function windowResize() + { + adjust(); + update(false); + x1 = viewX(selection.x1); + y1 = viewY(selection.y1); + x2 = viewX(selection.x2); + y2 = viewY(selection.y2); + } + + var docKeyPress = function(event) { + var k = options.keys, d = 10, t, + key = event.keyCode || event.which; + + if (!isNaN(k.arrows)) d = k.arrows; + if (!isNaN(k.shift) && event.shiftKey) d = k.shift; + if (!isNaN(k.ctrl) && event.ctrlKey) d = k.ctrl; + if (!isNaN(k.alt) && (event.altKey || event.originalEvent.altKey)) d = k.alt; + + if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) || + (k.ctrl == 'resize' && event.ctrlKey) || + (k.alt == 'resize' && (event.altKey || event.originalEvent.altKey))) + { + switch (key) { + case 37: + d = -d; + case 39: + t = Math.max(x1, x2); + x1 = Math.min(x1, x2); + x2 = Math.max(t + d, x1); + if (aspectRatio) aspectRatioYX(); + break; + case 38: + d = -d; + case 40: + t = Math.max(y1, y2); + y1 = Math.min(y1, y2); + y2 = Math.max(t + d, y1); + if (aspectRatio) aspectRatioXY(); + break; + default: + return; + } + + doResize(x2, y2); + } + else { + x1 = Math.min(x1, x2); + y1 = Math.min(y1, y2); + + switch (key) { + case 37: + doMove(Math.max(x1 - d, left), y1); + break; + case 38: + doMove(x1, Math.max(y1 - d, top)); + break; + case 39: + doMove(x1 + Math.min(d, imgWidth - selX(x2)), y1); + break; + case 40: + doMove(x1, y1 + Math.min(d, imgHeight - selY(y2))); + break; + default: + return; + } + } + + return false; + }; + + this.setOptions = function(newOptions) + { + options = jQuery.extend(options, newOptions); + + if (newOptions.x1 != null) { + selection = { x1: newOptions.x1, y1: newOptions.y1, + x2: newOptions.x2, y2: newOptions.y2 }; + newOptions.show = true; + } + + if (newOptions.keys) + options.keys = jQuery.extend({ shift: 1, ctrl: 'resize' }, + newOptions.keys === true ? { } : newOptions.keys); + + parent = jQuery(options.parent).get(0); + + adjust(); + + getZIndex(); + + x1 = viewX(selection.x1); + y1 = viewY(selection.y1); + x2 = viewX(selection.x2); + y2 = viewY(selection.y2); + selection.width = x2 - x1; + selection.height = y2 - y1; + + if ($handles) { + $handles.remove(); + $handles = null; + handles = [ ]; + } + + if (options.handles) { + for (var i = 0; i < (options.handles == 'corners' ? 4 : 8); i++) + $handles = $handles ? $handles.add(handles[i] = jQuery('<div />')) : + handles[i] = jQuery('<div />'); + + handleWidth = 4 + options.borderWidth; + + $handles.css({ position: position, borderWidth: options.borderWidth, + borderStyle: 'solid', borderColor: options.borderColor1, + backgroundColor: options.borderColor2, display: $area.css('display'), + width: handleWidth + 'px', height: handleWidth + 'px', + fontSize: '0px', zIndex: zIndex > 0 ? zIndex + 1 : '1' }); + $handles.addClass(options.classPrefix + '-handle'); + + handleWidth += options.borderWidth * 2; + } + + $o.addClass(options.classPrefix + '-outer'); + $area.addClass(options.classPrefix + '-selection'); + $border1.addClass(options.classPrefix + '-border1'); + $border2.addClass(options.classPrefix + '-border2'); + + $a.css({ borderWidth: options.borderWidth + 'px' }); + $area.css({ backgroundColor: options.selectionColor, opacity: options.selectionOpacity }); + $border1.css({ borderStyle: 'solid', borderColor: options.borderColor1 }); + $border2.css({ borderStyle: 'dashed', borderColor: options.borderColor2 }); + $o.css({ opacity: options.outerOpacity, backgroundColor: options.outerColor }); + + jQuery(options.parent).append($o.add($a).add($handles)); + + update(); + + if (newOptions.hide) + $a.add($o).add($handles).hide(); + else if (newOptions.show) + $a.add($o).add($handles).show(); + + aspectRatio = options.aspectRatio && (d = options.aspectRatio.split(/:/)) ? + d[0] / d[1] : null; + + if (aspectRatio) + if (options.minWidth) + options.minHeight = parseInt(options.minWidth / aspectRatio); + else if (options.minHeight) + options.minWidth = parseInt(options.minHeight * aspectRatio); + + if (options.disable || options.enable === false) { + $areaOver.unbind('mousemove', areaMouseMove).unbind('mousedown', areaMouseDown); + $img.add($o).unbind('mousedown', imgMouseDown); + jQuery(window).unbind('resize', windowResize); + } + else if (options.enable || options.disable === false) { + if (options.resizable || options.movable) + $areaOver.mousemove(areaMouseMove).mousedown(areaMouseDown); + + if (!options.persistent) + $img.add($o).mousedown(imgMouseDown); + jQuery(window).resize(windowResize); + } + + options.enable = options.disable = undefined; + }; + + if (jQuery.browser.msie) + $img.attr('unselectable', 'on'); + + jQuery.imgAreaSelect.keyPress = jQuery.browser.msie || + jQuery.browser.safari ? 'keydown' : 'keypress'; + + if (jQuery.browser.opera) + $areaOver.append($areaOver2 = jQuery('<div style="width: 100%; height: 100%;" />')); + + getZIndex(); + + $a.add($o).css({ display: 'none', position: position, + overflow: 'hidden', zIndex: zIndex > 0 ? zIndex : '0' }); + $areaOver.css({ zIndex: zIndex > 0 ? zIndex + 2 : '2' }); + $area.css({ borderStyle: 'solid' }); + + this.setOptions(options = jQuery.extend({ + borderColor1: '#000', + borderColor2: '#fff', + borderWidth: 1, + classPrefix: 'imgareaselect', + movable: true, + resizable: true, + selectionColor: '#fff', + selectionOpacity: 0.2, + outerColor: '#000', + outerOpacity: 0.2, + parent: 'body', + onSelectStart: function () {}, + onSelectChange: function () {}, + onSelectEnd: function () {} + }, options)); +}; + +jQuery.fn.imgAreaSelect = function (options) { + options = options || {}; + + this.each(function () { + if (jQuery(this).data('imgAreaSelect')) + jQuery(this).data('imgAreaSelect').setOptions(options); + else { + if (options.enable === undefined && options.disable === undefined) + options.enable = true; + + jQuery(this).data('imgAreaSelect', new jQuery.imgAreaSelect.init(this, options)); + } + }); + + return this; +}; diff --git a/plugins/tidypics/vendors/jquery.quicksearch.js b/plugins/tidypics/vendors/jquery.quicksearch.js new file mode 100644 index 00000000..700872bc --- /dev/null +++ b/plugins/tidypics/vendors/jquery.quicksearch.js @@ -0,0 +1,347 @@ +jQuery(function ($) { + $.fn.quicksearch = function (opt) { + + function is_empty(i) + { + return (i === null || i === undefined || i === false) ? true: false; + } + + function strip_html(input) + { + var regexp = new RegExp(/\<[^\<]+\>/g); + var output = input.replace(regexp, ""); + output = $.trim(output.toLowerCase().replace(/\n/, '').replace(/\s{2,}/, ' ')); + return output; + } + + function get_key() + { + var input = strip_html($('input[rel="' + options.randomElement + '"]').val()); + + if (input.indexOf(' ') === -1) + { + return input; + } + else + { + return input.split(" "); + } + } + + function test_key(k, value, type) + { + if (type === "string") + { + return test_key_string(k, value); + } + else + { + return test_key_arr(k, value); + } + } + + function test_key_string(k, value) + { + return (value.indexOf(k) > -1); + } + + function test_key_arr(k, value) + { + for (var i = 0; i < k.length; i++) { + var test = value.indexOf(k[i]); + if (test === -1) { + return false; + } + } + return true; + } + + function select_element(el) + { + if (options.hideElement === "grandparent") + { + return $(el).parent().parent(); + } + else if (options.hideElement === "parent") + { + return $(el).parent(); + } + else + { + return $(el); + } + } + + function stripe(el) + { + if (doStripe) + { + var i = 0; + select_element(el).filter(':visible').each(function () { + + for (var j = 0; j < stripeRowLength; j++) + { + if (i === j) + { + $(this).addClass(options.stripeRowClass[i]); + + } + else + { + $(this).removeClass(options.stripeRowClass[j]); + } + } + i = (i + 1) % stripeRowLength; + }); + } + } + + function fix_widths(el) + { + $(el).find('td').each(function () { + $(this).attr('width', parseInt($(this).css('width'))); + }); + } + + function loader(o) { + if (options.loaderId) + { + var l = $('input[rel="' + options.randomElement + '"]').parent().find('.loader'); + if (o === 'hide') + { + l.hide(); + } + else + { + l.show(); + } + } + } + + function place_form() { + var formPosition = options.position; + var formAttached = options.attached; + + if (formPosition === 'before') { + $(formAttached).before(make_form()); + } else if (formPosition === 'prepend') { + $(formAttached).prepend(make_form()); + } else if (formPosition === 'append') { + $(formAttached).append(make_form()); + } else { + $(formAttached).after(make_form()); + } + } + + function make_form_label() + { +/* + if (!is_empty(options.labelText)) { + return '<label for="' + options.randomElement + '" '+ + 'class="' + options.labelClass + '">' + + options.labelText + + '</label> '; + } +*/ + return ''; + } + + function make_form_input() + { + var val = (!is_empty(options.inputText)) ? options.inputText : "" + return '<input type="text" value="' + val + '" rel="' + options.randomElement + '" class="' + options.inputClass + '" id="' + options.randomElement + '" /> '; + } + + function make_form_loader() + { + if (!is_empty(options.loaderImg)) { + return '<img src="' + options.loaderImg + '" alt="Loading" id="' + options.loaderId + '" class="' + options.loaderClass + '" />'; + } else { + return '<span id="' + options.loaderId + '" class="' + options.loaderClass + '">' + options.loaderText + '</span>'; + } + } + + function make_form() + { + var f = (!options.isFieldset) ? 'form' : 'fieldset'; + /*return '<' + f + ' action="#" ' + 'id="'+ options.formId + '" ' + 'class="quicksearch">' + + make_form_label() + make_form_input() + make_form_loader() + + '</' + f + '>';*/ + return make_form_label() + make_form_input() + make_form_loader() + } + + function focus_on_load() + { + $('input[rel="' + options.randomElement + '"]').get(0).focus(); + } + + function toggle_text() { + $('input[rel="' + options.randomElement + '"]').focus(function () { + if ($(this).val() === options.inputText) { + $(this).val(''); + } + }); + $('input[rel="' + options.randomElement + '"]').blur(function () { + if ($(this).val() === "") { + $(this).val(options.inputText); + } + }); + } + + function get_cache(el) + { + return $(el).map(function(){ + return strip_html(this.innerHTML); + }); + } + + function init() + { + place_form(); + if (options.fixWidths) fix_widths(el); + if (options.focusOnLoad) focus_on_load(); + if (options.inputText != "" && options.inputText != null) toggle_text(); + + cache = get_cache(el); + + stripe(el); + loader('hide'); + } + + function qs() + { + clearTimeout(timeout); + timeout = setTimeout(function () { + + loader('show'); + + setTimeout(function () { + options.onBefore(); + + var k = get_key(); + var k_type = (typeof k); + var i = 0; + + k = options.filter(k); + + if (k != "") + { + if (typeof score[k] === "undefined") + { + score[k] = new Array(); + cache.each(function (i) { + if (test_key(k, cache[i], k_type)) + { + score[k][i] = true; + } + }); + } + + if (score[k].length === 0) + { + select_element(el).hide(); + } + else + { + /*console.log(score[k].length); + if(score[k].length==1) + { + //$(el).parents('ul').find('li:visible:eq(0) a').addClass('selected'); + } + else + { + //$(el).parents('ul').find('li:visible:eq(0) a').removeClass('selected') + }*/ + + $(el).each(function (i) { + if (score[k][i]) + { + select_element(this).show(); + } + else + { + select_element(this).hide(); + } + } + ); + + if($(el).parents('ul').find('li:visible').length==1) + $(el).parents('ul').find('li:visible:eq(0) a').addClass('selected'); + else + $(el).parents('ul').find('li:visible:eq(0) a').removeClass('selected'); + + } + } + else + { + select_element(el).show(); + } + + stripe(el); + }, options.delay/2); + + setTimeout( function () { + loader('hide'); + }, options.delay/2); + + options.onAfter(); + + }, options.delay/2); + } + + var options = $.extend({ + position: 'prepend', + attached: 'body', + formId: 'quicksearch', + labelText: 'Quick Search', + labelClass: 'qs_label', + inputText: null, + inputClass: 'qs_input', + loaderId: 'loader', + loaderClass: 'loader', + loaderImg: null, + loaderText: 'Loading...', + stripeRowClass: null, + hideElement: null, + delay: 500, + focusOnLoad: false, + onBefore: function () { }, + onAfter: function () { }, + filter: function (i) { + return i; + }, + randomElement: 'qs' + Math.floor(Math.random() * 1000000), + isFieldset: false, + fixWidths: false + }, opt); + + var timeout; + var score = {}; + var stripeRowLength = (!is_empty(options.stripeRowClass)) ? options.stripeRowClass.length : 0; + var doStripe = (stripeRowLength > 0) ? true : false; + var el = this; + var cache; + var selector = $(this).selector; + + $.fn.extend({ + reset_cache: function () { + el = $(selector); + cache = get_cache(el); + } + }); + + init(); + + $('input[rel="' + options.randomElement + '"]').keydown(function (e) { + var keycode = e.keyCode; + if (!(keycode === 9 || keycode === 13 || keycode === 16 || keycode === 17 || keycode === 18 || keycode === 38 || keycode === 40 || keycode === 224)) + { + qs(); + } + }); + + //$('#quicksearch').submit( function () { addTag()}); + + return this; + }; +}); \ No newline at end of file diff --git a/plugins/tidypics/vendors/lytebox/images/blank.gif b/plugins/tidypics/vendors/lytebox/images/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 ucmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ|~c3=BFT0wlx0#N@)rU=0A%AqP7E literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/close_blue.png b/plugins/tidypics/vendors/lytebox/images/close_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..297368c821c5cf9fa2f9ec3294a3ff4410238667 GIT binary patch literal 1788 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 I&MBb@03&)%IRF3v literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/close_gold.png b/plugins/tidypics/vendors/lytebox/images/close_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b847694285ee99bead9f76ced1fe468c92ff66 GIT binary patch literal 1652 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 RDh37y22WQ%mvv4FO#lU@`>X%} literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/close_green.png b/plugins/tidypics/vendors/lytebox/images/close_green.png new file mode 100644 index 0000000000000000000000000000000000000000..83909e2d766a2002e239a69fb0a7ed2e1dc74b9e GIT binary patch literal 1525 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 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/close_grey.png b/plugins/tidypics/vendors/lytebox/images/close_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..bc83ac55ef79ac1f8e27c8cdd8b2fba16cf2de8c GIT binary patch literal 1715 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fvyp<MwA5Sr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw z7iAYKSZvL>RKdW&AO=$ET$Gwvl9`{U5R#dj%3xrmZ)m1(V9u{A+Qz`Z#^LGW7!uL? zbVja6aK8L;`{-qth0k0uG-gTNd8B>jEYa+5GERaVs(n2@LakMz*Myp1%+(j$*R|+g z#FRz0N{%ibN-H)dOt^K8t58yLU8do!H**#jfA79A@$Rk5|L^~=Z~iWRuKV-vxa(hk z|J_$}zI1MJ$V3m7L;nr0{C~~#PsPp6t!{q5j&Mk5sOzayr<81MZM{F)+S*Rsv}uz^ zXlSTUO{B$wUAty|{8;$t@#D<Ayk*<Bo43_}dn0-F>{%5Rl?Pv|R<2tYW)Z6L>G}7D z@9*z3FS!2N)5GJ(<<rLxWNm%)wd&&QuWKSUHaRF9ICF+aS6BDVot=~K-HV$wYnA{D z<Jz#(Z{FzC?VtbVO^%hdwKz+~_jj^<?ak)-_cV^?-`_X)&Yc*BynB02{`g@bt{3wo z&(PV~*{1Rni|3>%5rKh%qN1W1CQ=M8flGGpwpR0Zb!Cl=jQsNT>&5HWw?Db%{j_vv zjEsGqOs`vW+<Nz=L5v2brmh+yk1i~9zO%cW-%-HB+nYI|u1;?L`F0i0EnBw=vOg%> zotdBSzW8E5R8*JS;)h>fUq5r^jK;~d^z>w@-}yW4=DoYK^YARwY>R>i44s{wJUl!f z9v$W0SM&4GL}hn|9ksvB;?|3AzPaX1_pX$@JU-7!8k(AlmX<$v?_6}^{Q2W~+mkon z<X~ZXQDWs9vj6`1zrVj<%-XtS*|J4p_0_j(?c_J<ByYcc^7QH7Y7Xx1>{?U1gw_2f zOq|Gg;N9Kb$&>#2G_>=}Yh|mbsWDBMJNN9>)!~&tKdJuy_EuR{m9_tP^TC9K|Ns6n zyt%d2TT-5{eWFSyue4c$fkd4a!+~wNw?za)v_xONe7WLkmXWb>^0C&#iE3(U9Bj=u z-j<y@eVQ?VpPyftgGED6FKkvk*Cw6%@CN_+c7~Rgo_TreF8PS4s;YWSI&$HH07H|) zgR<R{a&l}PlJcbo{`~o)Zz}IvS!r3ed#;1RfiGW7w8PiMl=%Aj>1D||*xK3ksd$Qr zi2N})*)Q|p`|pV=oNL2&cX<2xxlK}OI;g<V&M)t_HmvyPr&PVzT}$4uZg{}3`>tPY zt?k#ZUu~+syqNB?Awnl&ZP>Eq%RBq~<4ahX7}tbpi*>7}#l=|2xJ^r~E0Z{L_N?OR zPm^L)gdC@(9(wq}f9KcN*DqhX<mB$o{`c?SJyl=3cI~p#5#zoXr6bn8Df8)*Cx0d} z{Qdj4q_lM5<(D1({qaX$f34cJYnO(uZm*!@-m0%zE`cdIId9rIQzG3&j;iiFbH>Ld zFr}oVM9|#KtWBe9P3-QlPE}Ra!0_<nN4v!ZT_>J9=l5XtiA5SoX0unWS+iu*rXb7K zx|YU9#&dJ6+vC<B&oI&Z$?@dLlLePwZn&Al!^5M)v7zv>TT0}z-MeQ8Xe<#}7{Iaq z`szF9&z-Bg&e)_dVdBJt4<00(nG>MlQeJLeSXlVv=~K;(8k;t4I&t!3Vp0;5L*aq< zZy1}Kn{VWpZQ8U+Lq|u&&`@w|)Y%s=G-_*WD{SPhWSM$;dWwjOPMkNd?`&FfL4iPn zg`<E)#RrAAZ{N<bD(%`^{auKM?d8jtjsh%scXlx9SS;AP*LGRMp+inSYQo3+WEZbo z$vOM%v3a)D3>E+WSjyYiJ^AwTGDj1`fvwrsKm4qj;iFb#C-1j>vTpP?25!EJUtd;k z%5)114&J=t=l1;jMbFMimRQNUEe^DN6{9CUdGh2d*RB=4zNTv<$A9$bQHB{lYIFS5 z)6dU~t>9m=a;2iKZZA8(+=Xk`*cxu;EZep%%u}q?VM_m_7Z(@L@KN(o6V}z$joDe$ zy1V>6Q-XnnMg2dU=<Ru-$FfbN>}q~ATz=^yz*6?+#=(=5)f-vaZR-A11a9``OfZqs z)X+HawCLm4*WqDnqmG_9!C^PQ|Jt=Mv;2ELg@uN_y}cDSa-Tkb=44^|@wd)LP1tSm z$N80_|F#Fl$M>Ips-&vgdVaqB<y*H-E%Ti%a_?cmg&Q|Kva+;-gM*(ue_s6e*Vp_f z_CFfGtzWcop<<HRY-PUoWY2pK3tY~m6)#!1P*H84j*P(37cVqkUt9ZIw=R<NL-+=r ff9!u`|FG*Un)Ps+{_S`M1_lOCS3j3^P6<r_goYn0 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/close_red.png b/plugins/tidypics/vendors/lytebox/images/close_red.png new file mode 100644 index 0000000000000000000000000000000000000000..3d835bb305b2ebcf9a876055d53a8a0aef7623b4 GIT binary patch literal 1525 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 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/loading.gif b/plugins/tidypics/vendors/lytebox/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..f864d5fd38b7466c76b5a36dc0e3e9455c0126e2 GIT binary patch literal 2767 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 Cg1uh= literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/next_blue.gif b/plugins/tidypics/vendors/lytebox/images/next_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..4666e44d3555af0c91cf467c1a94d229fd3d5cf6 GIT binary patch literal 733 zcmZ?wbhEHbv}aIYc*el+|NsAwUw?o4`upRTUmw2w`tbSZ)7L*9zx?*_#n<Z(zg)ii z;q;A<r>=iEdF}m)tM86qd3)^go1>RrAG!GI@P$_g&%fM$;>Cs|uht)ax%S}mRr{VS z+x1}D#>Z3EKb*Ao{)E+c`&QoWS$?Z)>5Y!X*V-0dX_<eia`vr~X;<?n-^ibMF{|fH zQrFdt&QmEJ=Mvk_#J69LY&;uQdn&l<xL@U&fbt{0B?r9<_q*lovC27Ro^jkPWuIR1 zakHdt`iTd$;*Y3BA5f3nsT96PC2X5|*habF9a8>V#k@BPxv%AOUd3s@?EnA&41*ph z{$ycfXYgdu0l5?uCk*WW8$3N3T3XxMJ370%dpeqXCrq3)dCJsj(`U?_HG9t7dGi-6 zT(o$}(q+q6EVL49mA2w$SZB3)GlRN0TML`HI)m1h1JVm@EjU|bY<U<?sLGs^VPLY* zYtge{Vh}&4XM0xW)O<TTBSr>UJKkq6Iwb5Q-b%DTf4Ruvn;L_h1K-czo%%KvdmNVZ z&tIWv5W#cuL*fZ$2Htj$KM5}yjxcvf*@?KS9BYuVj}mBPU|<mxQE-@`6Vk{rk*mXJ z9ZzTq8w0CrksE`+q7&zwS(?tw5NtWHaGt%h<U&V}W<g~khK`0VjaESxj-DkJCZ?-a zD4TMvwJ>5l(4nmDwnCOM;gI0AG^>+RR?%T1Lei~VZx%2#uuR(Dz|C<pF{6C~Q|q5k lzDIX#OlD|M{$J~}bJNq)GmNwE`MeZNcWbgU=3-&61^`J+5FY>l literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/next_gold.gif b/plugins/tidypics/vendors/lytebox/images/next_gold.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5ba21f5cf44fd06e65d30739e06c3087b2c2925 GIT binary patch literal 732 zcmZ?wbhEHbv}aIYc*el+|NsA=Ki~iO@&5bw_usy~|MKPj$B*~lzrX+P-T4<U&cAxK z|HX^_&!6vq`gH%3C;J~g+W+9e{`>d$-@Uv4{{8uP?(DyNcmD0$>u=qff9=}*D_80- zUaUWVe*U?0^`}qQpEyx}^l1IDWATR$)gL+Hzkh%IzJ2j~_SEm+Z@+VA{jOd1+qcJW z+2X%`ef)+E{u?*iZ`h!}cCG#D)$!}s^RHN8zj7u2s#Oe&7u(ODZ@**-!>n2M^X4(k zoy$LKmi)A7_S2^`OrFd?X%a(kuYOMte@_oXON)GKD?@!fLuDmHaWTkW3_}4Z{$ycf zXYgRq0XY^FCk*WW8$3K1T3XxMJ370%dpeqXCrq3)dCJsj(`U?_HG9t7dGi-6T(o$} z(q+q6EHn{rl{DdESZA_%GlP;LYYVHP5`)^71Ck5OjX7GR%()p(C`g@?Vqi4ZXwfic zWDq^4VSZNX)O<@zy&E!?JPglXw2NDczZGwPwb=Hn3WKaI?~h-dx>i<E3a7UFU+EXu zs!RCr;V>gZo4rz%L5jj6Mi(C0E+Hl71AOv2EjA1v96h@D<=w<KDY$g7x~PV>DFrb* zFezCmGH^J$JYUG@n01B2=z)O${DoaN6t*n%n8?B4X5+eL(TPT8*D#q$T%l70Wm*#? zCNeB&5tLB9G>t*w;E7wCk}Y{>s%pRD=yzgi2w*69)Ny}5OB;hBOA1G$Q|<R<QD=4- gHte79*J_^6&P`8G&oItj_9equ*>RpED-(k?0KTmY!2kdN literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/next_green.gif b/plugins/tidypics/vendors/lytebox/images/next_green.gif new file mode 100644 index 0000000000000000000000000000000000000000..85a1433b83d52854dd7b968c66e05e12a7da37fd GIT binary patch literal 732 zcmZ?wbhEHbv}aIYc*el+|NsB@-`>Cf`u_cw_wPTyzyJRJ{nz*Jzr26`>G|{b&+ost zfB)_M`|s@Ee{=u-8~gWP+rR(H{{5Ht@4vWz|M~sv&#a$+ZvOn!^XH$OKmW-5`FrNq z@2#)jRbRiozJ7Ck{f7Gbwe|HY>+6@**DtQGUr-;vB0hdWy#G@F_!;r>6XNaX*!xfR zkMD`MpKkBp=WpL@Z{KNe-(s)drEgznZ(n6^Ut-VS!f#(-&tJ>WP{SafFVA1dub-mN zP|CoN&%mF`&yc|&A0f{l$Ip<&z!1&A5W>LV$H3suz~Bh-7sF5hia%Kx*%>?-bU=;; z#R&uZ{{{~ahL+a0_Kwc3?w*e3-U$;YO`bA!+VmMSXU(27ci#L33l}Y3vUJ(<6$>py zTcs?x7}i;A-prt8%G$zes>YzX<$%-z8*`2pX&WAf6Drc@q!}2^by{@H85zXR>DZi= zJ~iLg*6@amEjPon7wzJ<;%~*<UoE!(s>&d1&->$7r=FEnjKZny{!=E1YqcbNP&mTK z(B`C6Wsst<h|z^dwo8i1*?~`9x6Ov(L*j`}et9>sMFuGxtS+jdZAwba4opfGiVO^n zF3%S-I;Nc9FnS>1KYwA@8HFheJtlH6IN7+iEIQH1>>405i7Rx9pj2y^#6$*%mWiTD zm%11f4xYHRDcO>DrmFU<j$S90G9LzmM;-U~voyRh*uu=w=v4cCS=5;wh7J2C{I#0r Zvvbqa(=&{-mwm}FR(6~x$;!lF4FDZj?D_xz literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/next_grey.gif b/plugins/tidypics/vendors/lytebox/images/next_grey.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1773cd195fe982a3e7911d3ff09cc6c21885a6c GIT binary patch literal 731 zcmZ?wbhEHbv}aIYc*el+|NsB*-@kwR_U-G}uV21=`TY6w`}gnPym|BT<;!Q!p54EH z|K7cOckbM|b?erR8#k_Bzkc=V)ytPJU%Ytn!i5WG&z?PX>eSJrM-Lo0uy^m?J$v@- z+_`h>)~%a1ZCby6{hBpvR<B;YV#SIjOO`BNym;Zlg$ouem_2*;)TvV^O`0@u;=~CP zCiM39c6WDobab@0w>LF4H8wWZ)YMc}Rh5;Mm6nzk7Z(>56%`g1=H%pLWMrhJrKP5( zCMG7v$HzxSMTLil2L=XudU`rLJOBUxpJ8YM#h)yU><mr}Iw0qR;)H?ye}j_~LrZI0 zdq-zicTY!i?}UkyCQq3<ZTgIvvu4kkJ8%Aig^Lz1S-NcbiiP^Zt>XGz4D0kaZ)Q-? zVQXR2QD9KnazK26p&n<8q#-xM2|3Agk_?P`sx7K|j0_^@R1MEco|<oBqQ%4@Wy169 zMTe+~=v&eD=PwtTe^X+RHs}5MyHnFRZHdE@{`nfR+CDEf9B^!BX5cOLc#`m<;Rthw zl%2@Y#YY>YECN1MFf3s17m~G_pySfW&d=51vySKKV^#)MyCNrs4+oE*b7m<!bIb8T z!1?(L>kcTiJUrgdv2C7`)kkK=CV6$f#tB+n9X(E34IT^vOdVYU8O{t77+iECH?~=v z>Jt?`;<k{<GNPB`(DwXBIZK|WF9H`_hznaOq#eh@(DC?qzohp(pPieYo}OVGT(xB8 M#0BSim>3zX0sJBc)Bpeg literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/next_red.gif b/plugins/tidypics/vendors/lytebox/images/next_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ddff3daec5c54af69221f9c082172f5ec21f74f GIT binary patch literal 732 zcmZ?wbhEHbv}aIYc*el+|NsA=@8AD^|Nh(i_dnjh|9SuZm;3iW+`s?j{Q1}C&wtpz z|I_~c@AmJ1y?_6+{rg|;-~VL){zv=w-`~Ig?*9D`)~|mvfBwt)^PkS2e{cT$%k$?y ztFM1pUw@~*{ziTM<@)+__4Oy~>yOmeAE>Y2U0;7IKK@*M{Gs^xZSnCN;^Xi5`ycZ6 z-|g>z)878Fz5Nk;`@Qz|TkY-F+1oF-w_jjyKhxg+xW4`bef^d4@)!8|kMr|)$jfiz z=U>dvKZ~FLECa(428LY>3>z63mNPKSWnh@Xz|h6O(8$104)zzrPymWQSs2+FJQ#F9 zjs?XD1N;954-bZx*0%PJ&aUpBj^^G86DLicGIiSY88c_io-=pe`~?daEnc#8+42<& z?L=Fp?6?`$*=^p;plQL{!fK((ptI$G)B<};juvTqE`}2-(&wZZm@IW$bS;?}#Lns3 zpOro}-@(E3hKvIb!?PFd;tt|(#oJ#kcKoW!AnVBc<5#DiwRMcbsqOw#CWvdbBz#bK z!pP9(q*P^)qOge3g-5naib?qZubg(91;dBLj!u4gH?c(qDIBaWs-bO4Ld*_KN*0O? z42~|(6`5?4j=XSuAmBfLVb=+TDGNO&axggAxRxwB(a7xTCo_pFbjn1@)&Pl#3=S=V zB1)IK7!(ekxV0(Sl6R)6_A8EFC*~X<27^Z(_xCfG+%QOSKHlI|`+Zr|nH`1=`zQRh bn&-1~)6>&4jI)=0$uL%SoF~c3#9$2oPvH2I literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/pause_blue.png b/plugins/tidypics/vendors/lytebox/images/pause_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4e34f689a96db7b6911bddcaeff8aeedea1777 GIT binary patch literal 1357 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&vdGiLF(jh( z>5O`x&{B~D_TTqa%iC4h1TYG_Di|N*uMg2z-Wc`o&J|VR;N@4ZEt)oETb5Pq>8&rL z+)@|&{#ts@_w<z+U6C0_4OG;YJv;s9WD3j54ts|}k>_^59v^Hy{n+-zR?AO0-}|f2 z?R-A(`_B8t=f3}*a_!o+uy+Z8`Q=R8qqp3idthzXtbGUlpX=6dbB_*xxtW3Cm+R7n z8eFSZT`2iD<EWU>)UK>sHjK$%G8uN|IfsghxPIJxvve)5-v^0XFWwY=KK63M$An4U z%hmXg&3*Ez_*_KD!Cy-?RgShsemVd2-?@dsy?=gH?sB!a+AUK)sk_uWh+#)va7A&g z>QVRgOcO-JPhG0y+%Y-k$@^6gAIF;BRl8}Lw|fh7z;4C`nOP1NV)lZ~HyRaF?1Y?i z|Hi-3S(|)+Vb!;N&(l0YI$rKryrnPu`v0`#i}Ux)wLK(s#9&W{MBPDG9-hP5_w-L$ zdmcT>HgBE~_W}O>F~?qRV0`fPSJD|7`Q*xcgN?7vif5LK?!9}>nBn0%M!&dIGHeaM z?-fj|uj*?0`#jP_`(VkRT~BP34&7@m)tNoNLwn2ODxSj*F1r{NB;43%%&*^l=Ef6` zX=nXe6x5B+^*m-)NJ(=sHnZF`oxvnT)qyj^Y_mO!@Yd`}5Ba2(ny%me_%ut;H2B%d z=bb$n>&(nHuYWX2)gzygr|XKw=PR?%m$%*EdvHI;`^_xg*zJkebL-4vKfin%^}%d; z7e~0%Y)$*R*4(38_x!&q>C$rYUB>0iyYIAITEaI8NnVM6zWGq`G=(-6#tSP=?#0gN zIm~x+HNSDWE9=wa>whrL*!)Q0<L2&;`LRc4txa!c-jIExly~>t|L(75J=?vj@p7bz zAoKZ~*(rM;X16_DD7Dja<r0;a*?#fwR;N8;4&>=AobdHVg58axw#Uz<Jbk~Idfn&Z zxWa7p<>g9djnnm0L|^-DczayRt3NjB?4!UlGYv%6Zx<D8R#)dy)jRg^v;RwZlge2B zJ!js2yEnB#O=*eRu86NrQVfsX+#+SR)%<4<m!91zE8#SA`8>tIzXF1GHv>KIt^Quh zbfK7&VaK5oyBM3UH<BNHVqy-x@>RdZuw`w-@#Mcn92^eZW~{ez4<=_QHEo_R^<ine z$XsWa6Z#gubq6zp<0GODpL%||qu^DGWrz!le=4(byF0^!l{pSB9K|I(kJ_YlT`Wo& zF1_n}u<(foU&X7&=r@dx#}?c(W2-h~U9))A=8*V|MNdw+ik*`>Xl<G7^Y_^zt)e3B z8?_6ju?7pzFwc}|wZCfcc5716CbtU(i(AjShIUBonNivQ^UkKN?ko3QIP$~rVo3ZB z&yy3oedNV&b2c1Y_I}lk`Yq=s9siUb#LRG^DW@f8MOW9QV9qTa3T^d&nQFHD7132X zGhZnGqW+9o2VPgUpSWGs1hQ?SVT*6R?U_})a$)Pf=X$#H^{2cQGJot|ZW5fnqW9D- zw=Vwq$3>SJmj}u0)W4t4lp&b-SnmHZaS4Y9a~G`p`QXbH<|+HCWWp|+8`M6_5k9c4 zY3;Pb7p7#+)W}u+kehh$|7U|QXV1N5%&q?Z=0#|a-EO9T+B+Zr7uflj@egxD(N~+N UvCpg-7#J8lUHx3vIVCg!0EuLMmjD0& literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/pause_gold.png b/plugins/tidypics/vendors/lytebox/images/pause_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..ee529699c446ee5c2564745088bf695e8349ba5b GIT binary patch literal 1207 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&!sF@U7!uL? zbjI0i;aHLO`BOZD*KBE?A*D29hU-PK-xC`a=vjqovF`uHm3OBkrZn?k%NP5OlBEiM z<xW?Z)h&2&h-Im&(#CuRT{fS~S>74qxmOn$2e0i`oa}db$w$`-`~Du(c{Z>3yzTd$ z&+nb-&8@Aiog2Gm*8aH%?oa!$UHHd(DTxhJx7^*cbKlzB&1E_a49kUc%vP*yj9FK8 z+wE-zL)mUa&*+y;${el?Q&oC;M5=GU?X{RIboQ*{9KV%EEQJIoF40(YBQdkzO?BF| zq?nyax|=5oO8cdYPZD8uxE@~d*)1(Gk%u8LXZd2~p39mOy;^6?lDcDb@@%2G|0bb^ zwK-z;zRka?`0eKV*v(g+EU7kIcJccBwqI52U(PtG@#OPrAOCjCLZ^)^7fUZ}x%6OG z+6}HQx8D&lJ%vwBlrq@W^(b&CG1%8h{IiSSpL(b3WO&5W`%D}1=TG0ZO@QI|ckexQ zwY?=#3pX35SnaD{zaVqMNf!>5uoY`XeQ)22s$|H{KKk8%e$tMZSQe&4hCW&DnT1>o zeDc!@cP`0#_TPP*!`Ww{n{K<Bob_0-KtF!dnX^YfRQ>+>t90tjnH{PgTSXrfRLq#& zJ@Ks6UvnoNh95sS7afvT<zQpky?2lAjb~F<Uo<)KJbcFdek0qp28M!8mk&ICX*~Dd zUhc)20vs&`7B(tEiQW^kv=^-QW|XS@@<LwDX2Oj5{j;_)HT?d*TT*J1p-GCe9Dk_K zK7)fr3|#)IoU_=tx&Ie^&ogJ>b5~yOfB)c19l4T|OAak`o}Q8M;nE!)V?)Cej~=P` z`nLIR6)pI%phYLW@~4r9mg$)@KIVJ(mS^Nn^<`MQ_OFRa1!KYPrMZk#v_E^9aWjOr zE?ZVsRn-&vwPH=P+GMWz_UkvL_fNlhQ=|HORbXhx@xw7Y7R+D>*=n+5RTLwGg^beP zy<BtWI_BMfry|8WlOaU3Pj0Grk;d#j2|gR{NCuos`*^ujfMw&G1)VKT>kj|;!F%j@ z{*1RPLt5s|6Mgl{g~ie3y5jWNN1ht3Qkp({iNNj!@9*>0H!!nX73|(UV{R|wF|iA! zKjzLpS;nyHm*|bGsa#QU=O+0bx2XJN_58f}_gbZe1@G^fE?cJb<F8R}uF=US65I1U z=U9n8xxHOfh?6z6_3`oMwEf5Xn|1WlKmJrPF7rOED%`N@(CzJ9@^&t|m2)hGZyD|P zN{##4K4D!n|Ek`quUb9pn(ymJ-}+lO^WsH?jS&+2<CiU6+P^y7z4D{dk<IDHj`!TY zd+zCJ#TvVlZ^EOsH*J}sI#+JVx^)x3eXG-p<C)D+BKzp$!$~%$7*{M~+Qyu4d*$_q zjf~RI&xtbH)MV`CnQI%p#kTgB{azm1%AkAS{#2G4mgTVi(R};M-lfd8A^ug&8sW6R T+`AYU7#KWV{an^LB{Ts59=RT( literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/pause_green.png b/plugins/tidypics/vendors/lytebox/images/pause_green.png new file mode 100644 index 0000000000000000000000000000000000000000..c52f28c1c4e16760ab62c7c356fb6a38dd50b9ed GIT binary patch literal 1149 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&e96<rF(jh( z=?wo2nNXSI_QK9hx~a<-sUMx|w37Yk-3c-xtE`JTxZ2W+FE#HFmJ0c@q4+{``vuLQ z3rz+q!`4Q8Y7(&7x%t6Tv65whff*-Vcp|jYs)P7vMgDKFj+)<o^US}qWs4gHKDU<7 z`2KhA{om)_|E=49b9>j6piS+D8!j`INi|#RKDh5B8Ep0JNor;AI@#T33=DTzHI7u) z?CssX+3tRC_Mvxt2LyVj-{HF6!k8MCn7m?n$fxegJ*MkdZ>;iC{bBcF#`W{BH8#)9 zTz*FD#q+OEEdMC0?4RNP?ex5}YSlO8Z<}Oi%FRw%k(tw)eMrI7L*6I3Z)Ql{x(x-X zjYR=zZ<m^GX^u+L(BocpRqLE8`^Oy_Uq7h_yneJd?D?w`-8TQq?T#*XWw;Y6UK-JR zQhH-;;+BT8+1K8!v~K%(UedsW<rX7v^&K_``z6MEEqZ?hCD>=Fw>{!!6x?xI@8L#) zuVGssKGj!v^~iQrap{lyKc4VCFX*#mxbe8`@cG^w_hd{j^1t32nxCM|aCg#@`$7w@ zX~oHgJ)WE`6!&vw)Bab%5}E;P!wQ+VU-drnO!C4L>%I29`(Hg?cjUEoQv~zBce*=R zr8VvDH1GE0<PmWE;oVVw)wxD(gSVN>g#GsOB`oDF1sea(@crc=^}OlwtEK081pGOJ zwlA4sW!zd9b$s_L(-T!}66>Wjj*Cut%vE;t-P*bx$G!8GvahMx-Slx2qeE7F*Uv*X zH+OI5eK?;(?fq<*-LZ#j4m^3nuFkoRJ>_!gY`f})x_-Z>C9JP)yIYsC_N?c5Hh<pn znj1M^8rr!s$}=|p72Lc1SMCoko}lKQX$K7-2VZ@kdpD$_=~b1e@6``sdv`cqJ@E5_ zqm6#jVmogJhr7#_<_SjhNA&EmX!^TPmVH4S)3d<M&WD%XSf{pvZ{_SfEj_M|gmZI~ z&&~CIcGo}F$=K!Y`eU`qO$oXR)f(rz5_B6n+@`Z1x}RL#ux6TSxk~&0t@4w<3MFWp zPmW`Janv+%!)?vn1)q{x|9ANt#viHN7Wn<qqJ&>tGw+;_JyR$gY_1uvwRr!6WZ%e^ z{jG%$vJ!kFPFlUr?LNgX`lV;yk9jo(MryBB74$gv9LT<yXrEawe#4*h%MVGx!w%2Z z%z4xHNZPftF=pSkI|rAl1sNGn_MGSKtvYk&Ne><sHY4N76PGRxYTy4wIJ2|S$9GA} z!>LU%|4U=NG@o)7Dn;J5+tnDTlCNml{zO(~@s=XKN!KUN$$ffj;hSr(HyABDP;6rK zz~^>qM%yvlhj;#eHTsgq|L*R;m^Zh0Zs@)FY47r_hT$J$#gBK4hi1gqF)%PNc)I$z JtaD0e0sv<q7773W literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/pause_grey.png b/plugins/tidypics/vendors/lytebox/images/pause_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2e9e0b21e58eeecd289d94cc5ee561fb3ee16e GIT binary patch literal 1282 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&67K2Z7!uL? zbVj^KaK6NGd+Fbkbprxd%zoBs*s39^wC30XjpZpmth==?%yxVcDz51C;Amc3#l^D% zySkK=5+`zVU5d2`bo6q)=zPyah_meC{MLh&@yp8ut>0Q~zxMun^M~u--`Sl1Y*&5n z{b$?r)%Rw8`}XbIkM6{Oms$U0M*J&b{4a9$>{-@r=K1&jT-q+*K8>N_@$vp-qnQS? z&({3-urMdyj?a`aY_;g-n>{B}tS(GfULd0Luppv-!|k^kT}{_ty9Q2adhqaJVpVmu zW#OZigZ~~JWWKk*{``dt6AsGpwXa;gdhzz{;tal*JB~kIvwl6Z{jMw5uC*=FP?_vG z>Ex3}*LUY<??0Ku5}`9~k)87#fu>cfv}Vnk_2bi1?(XjHHEY%s{Qj1^YW3=`2aX<f z-B<Vb)SEXtckkY9Q@MTnHishDByPnU_wHSrFK=7rqBZr<^UsV6R%w;(mTkx}>lSEQ zwoGl+s#RWMd*?Sa?~2*R)FL2bUDk7Yx<2!R5-Uk*>BnDRU*EEA+pEUUpFeXbMnpv| z+PimdS6A14wFhr+Z{HE4w=Qlk*MX(p)4$kQTU&D|eyFh75wmU+$A+6ZGkliSf90Cd zD&V16+I%<9ox{;=_SM|^cC}8Sp*C{-Gkw~oP8D?)(o79x`c!N!!xs{I_4@P4GlCDi zd-qO%+h1X^Zr0UTyRK&GzS<n&)o<A?(Bz|b_}4EhdHXt*i5?0q58m9|Ty^2e6BQ?p zbul{+-MS^UK5p-!*I!@#D-tdE`>WK=-M!Oo@s;b>g?ZRAGcp+Jv=UNMT>AOhnpv6; zE;{;Lq#$5=vGIfH>l>y_Dt~`Zu+ybMKKA9ymk*zuoLqI`$`z6Hb8{9hTgJBj`sp7( zETpBSE#~??aR2_vdT#TSOAD5?wXrEp<mi{TPfJT{yLvU$X`w*f{`qs~$}XAm<8NJ7 zb~a<d?z^hp`l_FUo=9+9Fga_m(to~PE{BKO<eGnfW}Z6b6%x91*DfjF%M~9VvDVhs z{&F+*)%IAI8O3Pm-Y=&r!gcY|r9%%MDEQB_Ir#qj<g;lPO?c;@4-as@_{iJm*Cu~P zO;xkmYhU!M32`o&a^!L0qmMiC=FgqGbop}j_QQ>5)119LwWdD0vND)qNswmI&f*{6 z-b(YeGc&jb7VN&eX6;(W7hFH)N(Q_V(U{%PylaZH)!eki#Kv>y{POPYS$SJsU43Wu zcfI1`ViqPwy_g*bzI-uZW@auaE#0_vtE<vPhs!3nZr}b|`u*Kq<+*;BZ`@e%+^+nc zOvAc{&Q8v0)2H*6-q}(3_`ol(lY6e1H#IV7E=>%0`uOGL<sO=unVE(+m>U@`W=x6D zaZ?a@@aN~}J3EWp+xg{-{{O3Gh|v?@o_BZA#*KmT<xfrsnwgtNMnoKVSWxisk?XJD zzZ>UsRs8&v>L`1ZL*wexqJGEAiF^6X&CQG7-ZHJ7oSdB8b~?b_z1{EJ=JfOb=1*T3 yp%ZrH`=6hmHx<c5vHl7F@%q2O&)1wk`2Hk)yrONrKY)ROfx*+&&t;ucLK6UK0BNBB literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/pause_red.png b/plugins/tidypics/vendors/lytebox/images/pause_red.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee4dcf5cf5b4292a865332a6f4ee4280c42a2c8 GIT binary patch literal 1133 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&e8|(qF(jh( z>5RMCPf|pV)vvtVx9QN5Hvtj*)lLV+ioOwH`JT32^24FoTQ@)WyC?OawEir6#n19f znmC%i&0YO<-OSZ{BaU!3eLZFt>b-Q+ZpZ9sE^f)|=eFF9edRjY=b850u7E6g4(D^0 zmhUU)+dNm1eEQ+ThY7_!3oq+E*fP=TEz>{UJZ-P(Z%;d%@!aP(Cz6TbQ^TQ&J@qz? z`hCW}2MpHwmMKkr(4Cy&8OYHu8v3+u<B7*nYtuh;t-4flSMT?(b(^m^mw9&`+O^L8 z`T3gpzmFzuxff+8zjkZttRvZ-@_!9@dRX?We>^%di|J)dpP}N7?>5`CMYpXEy;u8V z!j@&Ojn+Y*%J-gYOEuI>jh@83;HGk=v4+x-sEr<X3oA0q#2VbUot?0X>4Qp#y!O;v z*L<BOF*(K8|LU8N#gOUy*z_{XgQj(xt&9)1O^M;mVc75O$$Vo&uHJ9El?w_QY!_Tq zu4MK&er~%=`^A--deLGG>u04+dG0ANU$p7sjI2o$ww!E?UcmY0IPWSi;R>ny9nUwu zv`Fz*mAn2r=Vn>-q}pHF3iD>i^!Xl7wBBLo_vo_1zng}v$0t7OXo)l8uRYGYb7AZQ z{rl<5!yY$I(V4Bb`#{7-3D&<^k#CsR&sKX<^hfB<L4oQ6dHqjzH|ig0nIe;7R8#$0 z?EVWY>y44c0!Qv^i|kmeaVJouu1|A=_#xhJ$_h4<CS)=6P8BudW@T_Ql3aK8yz#8_ z?vAU2iZZKaanCxY?X)3A@AHY$of1b>wmQsdFpPcfeEu=};RoBjSl0(UIQGZpv6G9g zL7djdBm?G6$G03Za2I-S&fF%Ez-H3;<_OF6=H0)FjxWj%3R-{tqDilPwrSi2lUWBg zrGBh4;F;X^z_C5oC3L5vYQ7{}yuaV4y_rUOE?1bsTVAYMC_l-}(twfoK|ttly;p39 z^9%F(j_%xfVqeznnD4chR&lNJV!lxrdyFac&5m~ywUTQ0$sc3BSu?LYIQY*)3x{lu zc`0lvxkghTWOu)o3NidK@A$6AAMU-;kw5b5-qcC2&hTV!^Nr)UC(<;3Rp`D;rRyZw zs`vG4tNuQ)B+=#iT~nT#^UjyQYJ8WzeA(f(;SLp5eye-VU+gv~OgR3a(7!Q6xv}BB zPB+_!K7rhCdjxbO*i26=>9d4)yV^xXJeZeRv^|FH!KEWC=DxzZ%ho&(nVNe(d2P(I zpFVBdy;bwrj<j(_tO?om%0o%Pld)M~!JMn-AKvadq`rmY$CPjV3;Qz#KUn_1+`sU= tP)$6~jK^oR9_&A~^S|?xJHj9McVwiR#TR|)V_;xl@O1TaS?83{1OWEE22=n5 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/play_blue.png b/plugins/tidypics/vendors/lytebox/images/play_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..c8cd259c46fc4574b987823d88b6507ee8a7c63e GIT binary patch literal 1231 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&qT=b|7!uL? zbb7AO)KrP%_1}xnJuFb*`&4Gt<viu2Na2<(W=mf<3qQY<=2?8WOV{9R(WYtH#ap&s zymV~N<Xbb6&xW3UCVg@df5K8pD}fl@dyiZi_H=0oxc3Hsul1Afn`80N(&hoX_3Qn2 z<>$TL_3wLa?EmLg>uk4wsIZaycl?4}2@}7RqW*z>%DOSKzmm`WnIOJkUunygIb42o zUe6b{f5K{z!Sqz{iCC?BVCC&KKX<X5&{*+(?U}p1B6Uv|Y^=TW{Jegq^5O+?*BfW< zmd<>?_i=jhy}*=rc`Eyt_)f3YYGG);=(D5L?svc0q`zrv*V(8o^k&dh-Il?;K5x$X zV9ASfa%I%=>xKWC$1rFtoe*?x$N8DJUiVnW)zb;Uatt=<XA@(#!de-{iZ+`ce z8a*r7Se_m9fXSqB8RwdfWl3)|=j^`Y{L9<)3$OnRP2c?t-y($9=lebS+q6_<|D>iV zle)N@8|oPS>g_wGOqzB2y5#=H^8bszG39*jk+HkV>hS*q%kuO58!~-mPES%|ey7>u zaM|RLkDJ`4V@dIQCf)xvcS-*0Me9;?j?MYPxj@8A^L}wi3*$<WyzSq`oitnLJlZe* zt4)2!m72-v#<@LKv2$`I=80{7e^m7g&)sJqR_cA5wl&F+`(A~eWd)<t0?x*pDMxaQ zgaq>x3ojPg%xYaTH?-#G;jIt;EV#FOLXgp;lECXmhfaQGma)0lIAv1l>c@<=vL6aV z&4awYJyH2w(9`*8)w@i?*J0`#tW3K;t>3ldMoIIYubnzR9Q<(&Y67zqbk018p2orL zshN30Oh@hc+pKR>%-ElukJ%UAu&gg|o5<C`iXZB`*yl{yGtDikNMwP3gZ{pk4_~@J zj+l{<=sj)jvcABmUB{Lm72UU?<>E(9ox}<MeIDf33q8tXpW)-SKh=Qaj#txh?H~n- zbQ{Kipp8izr#^c7l3`7(<n#C8c~f})aLWAOHhp8Ec<0B5F<HA#9%?C=5+bwm&5|u2 z1oz)CeOainGGd+yfA*5hV|Ucr7u-zwaPyAW$JL8x?vL5N(q>0vZ+0%@&s{7Nf`la3 z`D)h)8J8Y-e)Zlr{nZ5lVGlptT%Gk><KDie7xkiAOTWyvJgD&DT%*C{?Ng%9-7nno z*Qe*I&)@XfGv(9yPF>e^*wCWJYVjend;Z@}9%;{S9D08$dgq?keR^PB{k?A+XXTYm zHTm%MXkF3f$?2u{LNaExU0`ureC$GkyzJYxHaoKf)A>_hJ$fzTuyBg?f_P2yAgz1W zx1OZmpFaKEjkWd@gC@@2d*b}`*>lfCFAe|k;fVfs0firx!G@O1>&mQNynmZ?ep_hG zhUA%gdJP<3Uw^n(zCNIG-Q3D+9)0^JpKLq+IQ{7LtBn6MIUKV#_0DpRypeo3&7c1( w--<km#J|ZKi=VacVffxXVL#t}{eNuAmv_9-jG3Izz`(%Z>FVdQ&MBb@08`yd?*IS* literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/play_gold.png b/plugins/tidypics/vendors/lytebox/images/play_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..766d6513cef1102218a69434dee315866e166b3f GIT binary patch literal 1141 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&e9F_sF(jh( z>2$*!;c$uL_0NA42&o>EYg*~@ru&MT8uP}cCKl({E}J5nW-Se}PQ2nLnGwboA}(QN zFoSU#k3?IS7Do&VhoWQd$`-dHd=e8IL?x{!DYJMz5r{rm&Y5O0=Z0xnT*88||CglS zRo^dv|NH;_|9dZcwmL05@L!_s{M`f3-R^Q1yuD>8CLSyw8~>eYNzng-KR>4X`2PJE z__b8OLB;cc*5bwX1%H2S)V<ElX<(+dwm;#*p}p14d#XgE=JU7S>FM=!;$~|WGn(0+ zYUq1ffG3Kh^^ViWAP*sl-UKu89fgn0&&_)){%SFYB4dbX%1y`c>-slxoK+^*7yT}? z-x>3%c5&6YG!GS~Cq>?8&ipw2Xj9I?mtQ9OwR@^Cz5aOeq+rob)vBsLA<Zg{2N}Y& zZ{!%*%09ZXa{Y;vXD%x`xf6^u-`sqh{Qn=r?{9P6Llxz&&yI~16@GAYGs7ybP8WgD zvs2Dm&Q;F2{Y*jVBjbd#YL&mfFqQpIToV>v%ET7S63Mn%QiN4ZEX}g=lBdzn@5^jC zxff(gpWl?@7@C;tTQ634;8W40ojVP>ie}`Lbv{4eENWR>TPG$S?Bn-qNA-2?oa0YF zU9HK#$hc`u|1q}>w-08-JpA%<edV7W-=1pdIOt7RoXcluEd1bKt^6u3zT*N4&l*;0 z+OOiO{{G8gri{ztsoTP)DBilYPf_UOWUtnj@8lM44PEKG;0WW<i&t1=Wj7S3Hx@tN z_x#k<`KzwypOTw<=g%Kyz1UaJpPg0K(NU3<u<(zbo#!jaek6(U&9{8R*`ij~d(WJ= zfAsWpyJ%%?t=*=Zsw$b*de=KVs#Ezi`r6nkev5Ij8c3{)zu-2J^;6}Ijf>g)-S3;W zAC5I!pIPN+dL)T4ZhzdOoso)Dxh`H>G~xW=BQ5it+nG{#zI~hbsdB^3m>E9Pe5<uf z9R#zp4XnAfwcYyU{?2{(?)|E3+?)$C6HKDCI>a~bimG$}BYiQ0!MFM2N8_IU`H}th zl|n}zpS*A*!Y}0Vm+~%$NoIDf45v>E^g9=CZWUHfnsN56>FZY6fbN8gjOFisoO&cH zo3|#cwZi61BeT7+#g4*vi!U-v*OyPMvhv7ZU+(>S>Y@rxGm`_|;=j(lzjycahXR)s zaW@#ZmMwYF5WT%lx4YWr!!utt-^EQS`Rk{z4tM8h|0`M?UFh(ULuK*=KW`bEAIi<m zi<6EvguLH>SX`g)!-IqITeg@y{2I4l_3B@h{{>oPKHPU}jNQF2p`xPc+O=EH|2nUz wW<T;cxuh&F_quoBccvPxSO3a?1b^h?l4?35a;te30|Nttr>mdKI;Vst0O*STtpET3 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/play_green.png b/plugins/tidypics/vendors/lytebox/images/play_green.png new file mode 100644 index 0000000000000000000000000000000000000000..6e832a43872ab925516109007c12cf1de141819e GIT binary patch literal 1097 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&JkQg`F(jh( z=?wo2nN*2m^_x38*Y-+EJ8B=1&170THRbG4Ig^>J%^g#8k~T0Vs++JMbau}d^jbc} zfnQARYk=al8c|LaTZ=}eEXQ=!tZ8PY!XAnOh1&zPJKpwa7(PB#al?1h>s{89zXgcP z&p7@2`R{w*XFjh@bo*3$|9O4SiM@Ic;ugQ-l&H<0a>swC^||%cOwZPzz5KC={c^m| z{lL1r!V0b`pX%l<+}<uRSK@A2od(mA<V(+#`%kJY6S`r4V|LxwIb9__T%`+b)F$to zskzy*-r_{E(JM>SDSH<+t9`g#<F~iI>&NVm0i{!xu_wzevR*9n-qvrC^1+<6X+LgS z+`N6W>Hm2rAAuvHjjwmjh@Y8S_OniM@pXl*lbm7%XP4E6=^xpj5hN<OfU!a(;DF!l zl6}`sex1L*Jxf=HQBFgb%WZ#SMX15gQz{h-myRZVZk?gfQOPJ5aX-=`+i#|Sy`TCn z?XHiVj1J$zrhUFYPhHYms9GoNZ@|hMuErPGWE!qYuYMza>-e3mI}glq(q6E|ac897 zjZd!4?hBYU?N9O4UG8Bw_eg2%nx0U>WWE_s@}3#!No6=KHoesKu_^HP1Ga4(8Ej>Y z{)eJ2OYK$O>vR5UT;D>`2Y+5AtiRE*p7q#qwu%WayhQ#eiX_zKHL)M_X1h2|<5~LD zO@1ZnFRB;ue-55}rHE^<zk6nImVC^rhTi3@FPQ4rpMSWW&-l|jkE>rUa7Dz#s?-^s z`*1UHlYQDuA3ve$JsM{PtQ~4JB`UHQo+h%sU2yEtE2Wt+%aqPpq&%?FTg$ul#owxe zTtO|)3^u98{alJc&R<#YO4KlK;JfQ(zAUUF`xWEXJMsohhs1Vlj}?hL7`H93OnU?0 zGgsk{Z5rL7-&b$o+ql>8$=srX+@&lz3j8__kKgzD%$=F^;X%UHF9j?W3g#!L_D+wB zNM<>r$|%<p{kSLk@$9nfbB8X<JYoNLamDd#b(~HwIT-FRT~e^u*!<<8(A(X&vzN7p zIh>W$*E;aygog3zSgljaTq|2e+=bl@<L}R^F7!00sgigt&Am4M_PyGrHv$gS9{7GB z^hM>e_SSMSr==jx=0PC`I{E#k+@Ad4&$9;hTc4w5dcVGY;rxpk#%ZdIw*wEbF?uVk z^^ozDOH4{pN-=tH-SUz8W4rT@-dk)rJb$On=C^+exPI^-KA!IXT<+5H%UkS2s_*^h zo%H_tcm9do;ra$Qf@@E+FMP+jBl^nU=O6Aq%0DpMz@YPpY7zqj1B0ilpUXO@geCyl CwdoxI literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/play_grey.png b/plugins/tidypics/vendors/lytebox/images/play_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..8e18760be80a81e21a4864b48f3452e3de7c4057 GIT binary patch literal 1178 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&{NB^WF(jh( z=?q_ul6;9{^~Dm0XLLj+ESwo&B6(9`apX@8rKF`MW?t9A%%=3_@N9DOoIID6TZQYS z!AW;JHJuKjAc@Z6a|!p3-u6*jKlAYJivO4YuL^#C=X|a0^L^`!=RSWaGxhxQ&mZmE zKCI{dalNC0v8}y*=gyr!4ecMXTG-eu*|%@r(xpq~KPtyDI0{tM*DqhZxcTD6i}{}y zPgN-`FK0hzD#h!zc;cc(N<D7M438f_o-=>`<(oGp%huhy7dLD6Y)@Zb-Xku7DG3P; zSFVK2nmzmQF?*+_K?^TtTzFa1)6?^yZ1>C8uY)g%Ex5oqNkvdx+}+cYGcq#r&D*zz zMn;GJ{<UR@TQBZ8>Cm~&d-tAw{8%|VJKOQ&jT;eb!nD=Z)pPRm*&i7j8{62~1qB9v zEM;zLP~cdyWJ!XF)Xf_=7OY&^dHZ&>>RL^4hvk<8qoTZ=otaBZOFbqXdG<_gK@7w6 z)2%9=Z{EE5@adC~N!rGU3t3ywoIT4}P+org*DtHI%`>-b*`ohEWM#;T5Und&rk<Xj zGknza^z}1ya*n($YhUZRkztb#`#Mu8-bpGSfBoWW&^evRx?}h5!*9zb&!69a{BdG_ z{`+7*Utiwq*RP*BckWSvg#e4<lgsV*nK+snqSm^t4HFg@cP}e5yLj>9mMvR0?Aj$Y zX?+Ak|M9~gKN|WipS*IVri$mG95d!qG8;B*Xi)JC2@6|v`Q?oH^Z!qoJbilm!Gwgm zx_O5WJFf}TK6&!wLTQ1P2IfEQVXKd(7$q7=WaQ_k7ZiNR-q-YRV(QGxmxHUSswCv( zp1pd-HT$evRh1RP`t|D_`F;vdn?C*I*|V<euLp;O9C`UtQ(Rnp{-;%|SAVRqadCAG zjEa)lwyl5tf#c2sEcfo+t25WExw~vptb>Rv51Vs>s@Y5*$H$v=l)D~H|1))}=)3pt zJ$-zRye*qNWlD=i*O@bCE?m1NHf8qY$;}#FDJdxnu4Wy+_AH(yIVp*0<M!?5-@bpZ ztgA~)NN9NU=#l=<E|v+YGiS`0;otlF;nyl>tAxTr!N_Sd=gmv2s<IM@kB&Z^wpmbK z{{PFmxb@+lnGB7l3=bYYY`l9nR!B&wz(VH5*IyH2j`DF_U2vaKSXkJxaPv(cFE6g> z=;$lgu3fryOG+X-BH}>a_Qxewn)>?xul=<<w4cqz)wQs&@ZiCNjIFJ$H{O=H)*R*I z`0Db9PeNLnyX$t2*}Qr4CZx{Xv}x0Vjh{XhwY9a)m^0^(%7Jp32lrX~`uZ%atq-Sd zX62L>+sEM^9zOki(#9XFR;{YhoBsNCjVs@e^~%P^lmGquw;}r3`~{zWD*bLh@$8uz qD=Vx0Gxt3V_1zu+W&TC~VX~^6|ET1*YzqSe1B0ilpUXO@geCwTcqH%u literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/play_red.png b/plugins/tidypics/vendors/lytebox/images/play_red.png new file mode 100644 index 0000000000000000000000000000000000000000..887d6449648072b7f85bc494c838323cf2c093e1 GIT binary patch literal 1079 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU=ZP8V_;ygEwi>~U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)4Va7{$>;5n>Fo>17MwB=gr6!hS=I1GdWag$a7#Qgrn&}&u^XrPX zF)%R5gH#0Pr<If^7Ns)yCMFl<=ccA)CMvjP7NwTw7iAYKSZvL>RKdW&+~euu7!uL? zbcTP1NV>$a`pwIx{n7l{645j3T}02ZCf_Vk{YAUCJXpCy+|mE$0ue9%a|gY>4hHJ) zwA?Au)!s9`p{hXnQdKcqi^kf_w3R}^|9uuMQ@v{CoU-iV)sGWy?$~W;Eo^&ZDSu6S z?ep4i)%Vlqe{YS{<Y;R6Zz%MBS3`O4Eb#}+@5Raa`|L5?|BQ9R`k05mzrH>>-|ny5 zpIPDxik>X3O!jZ?pFeu<-qO#HReC)x{n^;^piJ#>PvRMSdH<yn6PHAYM>##{@0)gX zo;BYzfu7|-8y_v5&`_0-D^Rd*eZTzWml35Rg5C`B6%&0f6+PkLoyk+r%RAA3`OK}k z4D;G717}<-owq~pyXjh;eLfsvtF-E8t6kn@C%=EOhD~AYwU8&_W)m20HTXB|NxX3V zUZ1t4<npZ*Oce~9&bY7g+P!XbUIGLE4tcTP`G)FDlXux2KmAn0!tdtht6hh>Qzp$` z#nq61`^IuV#a+8I-@J<YV!iak9`-dX+Zg%t?>>rfXP-P>-~F1%ZN|+@RTMuoI{m1e zmcd@J?d+7yOPB7R?RotvU2nU>^4QB2Hiid%LsL~|FTHT*%&ve5S-dI@PakG7*)dDi z%-=WHdZ*w<nPlsPV}&!!c;3CTTD+=@y=KNqhGHfc%LJdx9~yX9bxrXp`fIu^ZtBSk zTe8LXXG?wenQZ2|&~cjbYj1<+4UaOJwlT>%9_Xz7ZBhRrAv90LCgIek9TWVDS1xaF z-*)ynGxHjbwUX&9c`vMVtG`{)IKAd<+RRNl|5iq{G0YATy<VzmV!qiiP$}E{Ll%oy zKZ}j_vyjLOr4!8!(%(-z=U3LU|JJOowKAqm$-DYq?>e#R4D;ayann9F-Z$yh_nIc> zkge6qzvjiOq@4m2w|ed=au8&FAfB*nUEks6=A1jb%LD6l7;O{;k{lnqy7V5%*zu?B z_ixE}@8|c&pMQGep~ar~i!0oJo?F>=NtNRRhXk8c>w^lr^X$2~p+7gu2CQAMi1|!c z>r|hm0-Mh4$lUbzf@0b9Gkcf5=K1=?VA|=6GtcV1+!rL`o*-Eu{X_Ie$!W2D`^t31 z?6)y5V)@W8zh6$byPoq$Uo(5ox{OW6v!Bjcl#p?YiE-Mi29^ZI<Vi=u+4(m7esXd~ zj>3vUo@JL0ZWpKtkC*>b`0UK2pBrU9#J7pCoLIZIrueH?ui)o>9Q(KZ7uZ?+O-DZb p=BL0Fm5leqO#fT`*;c`M&(*T!@{^V485kHCJYD@<);T3K0RWZ=?0EnH literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/prev_blue.gif b/plugins/tidypics/vendors/lytebox/images/prev_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..beba13ef5e1748d02b4cfb88f2ead310fdf06405 GIT binary patch literal 748 zcmZ?wbhEHbv}aIYc*el+|Ns9_Uw?o6^83T*Ur%2Dc=-IwjYnUuKm2m_{-?`#KU}>1 z?(~h1r>=iEdF}m)tM86qd3)^go1>RrAG!GI@P$_g&%fMt>eaU6&o>=@y!PPpH3y!p z+V^DT-pBK{KAN@Z-n5O6r>uWCY3=<9tMB%$yxp_>R_F5jT}y9tEWXyZ@Jh@4OEq)v zRL;ItKJ|S5<Qq8?uO+sfiEqCg({drQ@oZS_snDuJ!BxloD$n?q9CR-}>Q%VkrRcOv z{$aPgJytoV9CP;DW*;$5Jz|!!PcQkne&PY6#9dnPN3>)2s6`*pj@qIgxl<{8k6iE$ zg`iDR{##}I){A*>6mnn7=e&y3e%b&3{}~1cQ2fcl$j%VNpaXIaC{7sI|2Hr+HMg|3 zwRd!OwFL!r_fMGE-#2OMwCOWu&YC@E?!5U67A{)6Wa+ZyD^|{STw|ld-6Xfh(MFT8 ziF@;AZWTwiW;REaMJ|@|S}rau4Dv2o^7<~iO*}68@;BsJ*v~beU|-~B&?Moez@Xs9 z+hpq2#QUtx)V|r?bg`#llc=X6gQBMlgTMpl4h8nVJcS;U7#-SFWZX1&esnm@tIEO9 zF+*c<hY)X*oQC8|mtzWys*EQBloCWHPxqOSBVf|h$*16B#nW`4<yeQHG5gMhLzh`K z)oqnr6haPpwy=1xyA}jJn!u{=JSRfo>yb7^VSg0{hHR$^E$XTKx|N%jh=|CvdHOlb zWJowLQH_<sr=oh%`_4U0VGfajTBrD&H5LU3lqjC!VGvp5F>g=AgeDEHkj#5$Dla@a cA86Gr=eujm%gZZ*SHE+~G+pG@$iQF?06Tjhwg3PC literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/prev_gold.gif b/plugins/tidypics/vendors/lytebox/images/prev_gold.gif new file mode 100644 index 0000000000000000000000000000000000000000..b481932586c7b5324160b79bd3f18bc2a1b26962 GIT binary patch literal 748 zcmZ?wbhEHbv}aIYc*el+|NsAAzuy1+`Toa`_us$2|MKPjyLb2Bzd!%(-T7Cq&cAxK z|HX^*FJA0_{(S$_r{|wO-T&mt{zs4YKX|bJ{{8*;@2|gmcmJI``)}S{f9ux#8#m@( zyEgyw<@Hyt%)fG_{?euXix=z9ovS~8KL5;_{?n)HPn@Vfbt?Yo(fVV@;tw6FKXSx> z|Ni<td+HAy@ZY(!e%CJh&71SLZL{CF(SE}Q{|y`T*RHi+zg~X*dj1tF>{qQ~Shh@m z=~DS6OZb;8VOY3OfBt;?dGq{d&9a|8TYug>{(18lX3dhHHqCy<4E`B27^X~-pFEj= z(j<n?PWhf5hW2*;)>ekbM*fBdhRRBY;$o1;83qAR{K>+|&JfI?19A%}P8it#H!w6c zx3spkcXW2O1qXNcPng)>H)-m$=`&`|nmuRky!i_jE?T@~>9XZ3R?fCqW2VW~B)i7K zOqH>TYx8C<MGN+3b_>NtHm36GHa4sb@;2)7dNw*uJT`jrH{@A4&NZLlSmbQbB;l;U zpy15gWbE9;`>f5_y4l)zvAbcDh`Ta_vb!9Ezyjxv1?+!$DlH~4I<zUvxoMtcbaduZ z<z$#J!{cy=5O0%$hUChYV+$Bn87~AFC5TL(?lY-CAf?HZU&+UXr|ZCzHcnw<_LB*R zg4s0H9aTIOS`Kx#uzIk27BoG&z^d*sCq{wwXuG0lfEokCYNrb<8mauIjhB{$h$ysq zhPkX{XgDxQosA)+V)vr=U3;41Tq*;-yab(fmqZ9`aXiJ(AhyI~-kyjF%$j^5nfK0A fUU+go$f{e;ch{DemsbR@e&>>Dy2!1Ofx#L8bkiX4 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/prev_green.gif b/plugins/tidypics/vendors/lytebox/images/prev_green.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d4e14e5230de53ac80a9c0a874b584f1ca0020b GIT binary patch literal 748 zcmZ?wbhEHbv}aIYc*el+|NsB@-`>Cf{{H>f_wT>FzyI$3{TKJoKRbW^>G|^y&!4}4 z{`~Fp`|s`Fe|!J_JNx(F+`s?E{{7eX@4vEt|K<JrFYMocasT=Y>(`%Jzy8Sj`6uVk zKQ@2<k@@ov&F|maU%$7$e|vxZuKN1z_4S+U>o?TrZ_Te?TVKDbzJ7Uq{gV3n1@-Z3 z<KtJv`!Ds+pONpsz~6qly?>v-{bYOlUVHmad;1o9{Vsj~T7Ua$d-*nb{d#@-GJE|h zefvUt{uX}uDtY}9eg1NO`2u-{8V3GCe)%kUhEfLpY<`A(2L3dD`FMGT3<icI2L331 zh8PC^5PpVG28I9z22TbCCy>V(1_4m~$->Ca5X_(hatkO<7})<eFf=u{w6?W(bau4` z2Y2^RnAqPpY3j7;GiJ`3J!kH``3n{<TD)ZGvgIpQ&URX3tHaYIx5mj<i>Zlc^JX3u zC-!D`CzVC677E&~uB;3SuG$Lvu6j*;uKEf$6j(XVHJ{*E<Zjp`>8{A2=+4_@>fXfr ztj*M+*}-(Nmr;|LmlA`LmmCAfgXE3{?0<Pm0~Rqhu&K(r>7Havbna8-Wayb;arnd} z-X;Yd$(<?37BH$Zo{2C@2$?+HcS3<c$fA>d3chwcT^Cy1I)#kc4`v(^W?QLlui~MQ z@~D%A)q~x$BI(hER&|$oF$%0t+ZGB3s4*~9J6&MWNaZ(dJhUW4M7GT{z-1*vgM*Md z8$(D%_agnSJxx(AnSowh{LY$70t8wdyLcHymUztD6LEn_lRG5y-kHh^PtFHfb<6qg W+Vb-9is04nTry1;xivB{SOWlX&i<bO literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/prev_grey.gif b/plugins/tidypics/vendors/lytebox/images/prev_grey.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7f2260a56877db4e24dae5e09072dbc7e2c75b2 GIT binary patch literal 748 zcmZ?wbhEHbv}aIYc*el+|NsB*-@kwR_U-G}uV21=dH3$!ix)4RKY#x0*|SHF9^Jox z|K7cOckbM|b?erR8#k_Bzkc=V)ytPJU%Ytn!i5W`PMtb&;>6LTM~@sia`^D!0|yT5 z+qZAeo;^Ev?%c6s$JVV|H*MOqVZ(;?>({SYvu5?`)hkx4Sh8fv;>C*>E?hW!_Usum zW=xwlZQ{g<6DCaP?d|RE?(XX9>gecbZ*OmGY^<xRtF5iAsi~>1uCA)8Dl021EiElB zE-or6Dl9C_%gf8j$;r;n&dA6}O-+rDkB^Ry4i66x2?+@d4D|H$bar<B|NlS3pa+US zSs2+FJQ;LAE(OI21N;95hNkA0*0%PJ&aO63&+h&S6Z`unO`SG<#>`o>=ggfqf5E~< zi<c~2wtU6P*+y#&RJfWX*BBWnFg9^*-pnOy#NNzqB)iC5Us}oBoRvY^TuEBPT&;=Q zTtoVXG%Lrs<`W!?thAa$tYjEutazGqt(thAwdtBQo9QmL(`gd2lVgyxlVT7sP;Otq z_LnE~Lm;CAtGtvO>%@l#ntBvC8ER&{SmZ9i-6X>zDS71R0!CHF9UMjpQzlGzYDf?e zaq{SubvnmcrJ&;0Az;kDR^U)EtEQ5Lf`fud69)^c2fL$!(IWv?CHsy5h14Z&ib8Hm z3=G~*0W8X?{Je%nORfmYw0U~TOk`+in4rYQ;8791D8F-0Q;>{jAQvaUv-$)dff7be xUIyU_9`pA6keyVz$|(Du&Wn!c=jT~=%lYow^78VE;MMP3GEEn`H8L<*0|45V23G(8 literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/images/prev_red.gif b/plugins/tidypics/vendors/lytebox/images/prev_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..f702e6333684923a099633f2d8af55cfd928bc6b GIT binary patch literal 748 zcmZ?wbhEHbv}aIYc*el+|NsAA@8AD?|NhVW_ut>Y|8f8R`}_C5oj?EO{P}n1&%Zu@ z{^|MiANKG6w15A*{rg|<-~V#|{%8C5Kit3n$^QNK_wT>EfB*CK>+h~#e`Wppr}O7O znm_;U{Q0-$&%fK>f2F_wS$+M(`uaQd^*8G4FV)wdt*<{>Uw@>&et&)auKN1N`T5)P z^B=^=--?gF<L`gX-+#Bi{{nyi%l7uC?d^})+wZZr-(qjS%-(*!z5NV(`{Vlh+w}F< z>FY1o*FP;Uze`?zg}nR%dHD<c{QdIs`}p~{@$;|d=U>Fnf0lt^0zdx|28MQi{#^_V z8yOguF)++wV3^Fn(8<8iz`#%j_Bg{J0E$0Z7}*(u8FWBy0mTUe`~L=prskH`w)T$B zuD0Od?*0iA`}-zMoi=^O%vrPN%$+xX!NNt0mn>bje8tMy?rR)%d7I?dxI1byH}P)X z%&Y0n-puZ<xyaL2LC4dRl|jK%N5RljuZhRgP~nCGE62I!6C8`YjhZCA6&V!0`I;=f zoA{o!Svog6TQ2r7ZW8lRVo>stW8iqu+_8ZDFHdR0BE|+bHCZ>)i;RiQeQKNxJu^HO zdranSQZSLc*>X&QQI+vRhEl?m$<zIM3ItpZo$QnMv*GD_u!N0M$e4X^!J*HrE7fh( zd=x?+on&G4VE3&EdUT;x-C<sg0_)K>Md1Jy28L{>2`n0^{ECfDOG2hdw|V-xEM#bC z5Kv`f2&kxD^uBXXQ;17opcfaPv&NDTffh$D9tP1R9`p7@Twv1V4#~WCrt-p*^FdbK Ya=yE^yu7?3c=bD%Ow&bfjSLLd05^pTsQ>@~ literal 0 HcmV?d00001 diff --git a/plugins/tidypics/vendors/lytebox/lytebox.css b/plugins/tidypics/vendors/lytebox/lytebox.css new file mode 100644 index 00000000..5303fac1 --- /dev/null +++ b/plugins/tidypics/vendors/lytebox/lytebox.css @@ -0,0 +1,93 @@ +#lbOverlay { position: fixed; top: 0; left: 0; z-index: 99998; width: 100%; height: 500px; } + #lbOverlay.grey { background-color: #000000; } + #lbOverlay.red { background-color: #330000; } + #lbOverlay.green { background-color: #003300; } + #lbOverlay.blue { background-color: #011D50; } + #lbOverlay.gold { background-color: #666600; } + +#lbMain { position: absolute; left: 0; width: 100%; z-index: 99999; text-align: center; line-height: 0; } +#lbMain a img { border: none; } + +#lbOuterContainer { position: relative; background-color: #fff; width: 200px; height: 200px; margin: 0 auto; } + #lbOuterContainer.grey { border: 3px solid #888888; } + #lbOuterContainer.red { border: 3px solid #DD0000; } + #lbOuterContainer.green { border: 3px solid #00B000; } + #lbOuterContainer.blue { border: 3px solid #5F89D8; } + #lbOuterContainer.gold { border: 3px solid #B0B000; } + +#lbDetailsContainer { font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; width: 100%; line-height: 1.4em; overflow: auto; margin: 0 auto; } + #lbDetailsContainer.grey { border: 3px solid #888888; border-top: none; } + #lbDetailsContainer.red { border: 3px solid #DD0000; border-top: none; } + #lbDetailsContainer.green { border: 3px solid #00B000; border-top: none; } + #lbDetailsContainer.blue { border: 3px solid #5F89D8; border-top: none; } + #lbDetailsContainer.gold { border: 3px solid #B0B000; border-top: none; } + +#lbImageContainer, #lbIframeContainer { padding: 10px; } +#lbLoading { + position: absolute; top: 45%; left: 0%; height: 32px; width: 100%; text-align: center; line-height: 0; background: url(images/loading.gif) center no-repeat; +} + +#lbHoverNav { position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; } +#lbImageContainer>#lbHoverNav { left: 0; } +#lbHoverNav a { outline: none; } + +#lbPrev { width: 49%; height: 100%; background: transparent url(images/blank.gif) no-repeat; display: block; left: 0; float: left; } + #lbPrev.grey:hover, #lbPrev.grey:visited:hover { background: url(images/prev_grey.gif) left 15% no-repeat; } + #lbPrev.red:hover, #lbPrev.red:visited:hover { background: url(images/prev_red.gif) left 15% no-repeat; } + #lbPrev.green:hover, #lbPrev.green:visited:hover { background: url(images/prev_green.gif) left 15% no-repeat; } + #lbPrev.blue:hover, #lbPrev.blue:visited:hover { background: url(images/prev_blue.gif) left 15% no-repeat; } + #lbPrev.gold:hover, #lbPrev.gold:visited:hover { background: url(images/prev_gold.gif) left 15% no-repeat; } + +#lbNext { width: 49%; height: 100%; background: transparent url(images/blank.gif) no-repeat; display: block; right: 0; float: right; } + #lbNext.grey:hover, #lbNext.grey:visited:hover { background: url(images/next_grey.gif) right 15% no-repeat; } + #lbNext.red:hover, #lbNext.red:visited:hover { background: url(images/next_red.gif) right 15% no-repeat; } + #lbNext.green:hover, #lbNext.green:visited:hover { background: url(images/next_green.gif) right 15% no-repeat; } + #lbNext.blue:hover, #lbNext.blue:visited:hover { background: url(images/next_blue.gif) right 15% no-repeat; } + #lbNext.gold:hover, #lbNext.gold:visited:hover { background: url(images/next_gold.gif) right 15% no-repeat; } + +#lbPrev2, #lbNext2 { text-decoration: none; font-weight: bold; } + #lbPrev2.grey, #lbNext2.grey, #lbSpacer.grey { color: #333333; } + #lbPrev2.red, #lbNext2.red, #lbSpacer.red { color: #620000; } + #lbPrev2.green, #lbNext2.green, #lbSpacer.green { color: #003300; } + #lbPrev2.blue, #lbNext2.blue, #lbSpacer.blue { color: #01379E; } + #lbPrev2.gold, #lbNext2.gold, #lbSpacer.gold { color: #666600; } + +#lbPrev2_Off, #lbNext2_Off { font-weight: bold; } + #lbPrev2_Off.grey, #lbNext2_Off.grey { color: #CCCCCC; } + #lbPrev2_Off.red, #lbNext2_Off.red { color: #FFCCCC; } + #lbPrev2_Off.green, #lbNext2_Off.green { color: #82FF82; } + #lbPrev2_Off.blue, #lbNext2_Off.blue { color: #B7CAEE; } + #lbPrev2_Off.gold, #lbNext2_Off.gold { color: #E1E100; } + +#lbDetailsData { padding: 0 10px; } + #lbDetailsData.grey { color: #333333; } + #lbDetailsData.red { color: #620000; } + #lbDetailsData.green { color: #003300; } + #lbDetailsData.blue { color: #01379E; } + #lbDetailsData.gold { color: #666600; } + +#lbDetails { width: 60%; float: left; text-align: left; } +#lbCaption { display: block; font-weight: bold; } +#lbNumberDisplay { float: left; display: block; padding-bottom: 1.0em; } +#lbNavDisplay { float: left; display: block; padding-bottom: 1.0em; } + +#lbClose { width: 64px; height: 28px; float: right; margin-bottom: 1px; } + #lbClose.grey { background: url(images/close_grey.png) no-repeat; } + #lbClose.red { background: url(images/close_red.png) no-repeat; } + #lbClose.green { background: url(images/close_green.png) no-repeat; } + #lbClose.blue { background: url(images/close_blue.png) no-repeat; } + #lbClose.gold { background: url(images/close_gold.png) no-repeat; } + +#lbPlay { width: 64px; height: 28px; float: right; margin-bottom: 1px; } + #lbPlay.grey { background: url(images/play_grey.png) no-repeat; } + #lbPlay.red { background: url(images/play_red.png) no-repeat; } + #lbPlay.green { background: url(images/play_green.png) no-repeat; } + #lbPlay.blue { background: url(images/play_blue.png) no-repeat; } + #lbPlay.gold { background: url(images/play_gold.png) no-repeat; } + +#lbPause { width: 64px; height: 28px; float: right; margin-bottom: 1px; } + #lbPause.grey { background: url(images/pause_grey.png) no-repeat; } + #lbPause.red { background: url(images/pause_red.png) no-repeat; } + #lbPause.green { background: url(images/pause_green.png) no-repeat; } + #lbPause.blue { background: url(images/pause_blue.png) no-repeat; } + #lbPause.gold { background: url(images/pause_gold.png) no-repeat; } \ No newline at end of file diff --git a/plugins/tidypics/vendors/lytebox/lytebox.js b/plugins/tidypics/vendors/lytebox/lytebox.js new file mode 100644 index 00000000..1cf7210d --- /dev/null +++ b/plugins/tidypics/vendors/lytebox/lytebox.js @@ -0,0 +1,843 @@ +//***********************************************************************************************************************************/ +// LyteBox v3.22 +// +// Author: Markus F. Hay +// Website: http://www.dolem.com/lytebox +// Date: October 2, 2007 +// License: Creative Commons Attribution 3.0 License (http://creativecommons.org/licenses/by/3.0/) +// Browsers: Tested successfully on WinXP with the following browsers (using no DOCTYPE and Strict/Transitional/Loose DOCTYPES): +// * Firefox: 2.0.0.7, 1.5.0.12 +// * Internet Explorer: 7.0, 6.0 SP2, 5.5 SP2 +// * Opera: 9.23 +// +// Releases: For up-to-date and complete release information, visit http://www.dolem.com/forum/showthread.php?tid=62 +// * v3.22 (10/02/07) +// * v3.21 (09/30/07) +// * v3.20 (07/12/07) +// * v3.10 (05/28/07) +// * v3.00 (05/15/07) +// * v2.02 (11/13/06) +// +// Credit: LyteBox was originally derived from the Lightbox class (v2.02) that was written by Lokesh Dhakar. For more +// information please visit http://huddletogether.com/projects/lightbox2/ +//***********************************************************************************************************************************/ +Array.prototype.removeDuplicates = function () { for (var i = 1; i < this.length; i++) { if (this[i][0] == this[i-1][0]) { this.splice(i,1); } } } +Array.prototype.empty = function () { for (var i = 0; i <= this.length; i++) { this.shift(); } } +String.prototype.trim = function () { return this.replace(/^\s+|\s+$/g, ''); } + +function LyteBox() { + /*** Start Global Configuration ***/ + this.theme = 'grey'; // themes: grey (default), red, green, blue, gold + this.hideFlash = true; // controls whether or not Flash objects should be hidden + this.outerBorder = true; // controls whether to show the outer grey (or theme) border + this.resizeSpeed = 8; // controls the speed of the image resizing (1=slowest and 10=fastest) + this.maxOpacity = 80; // higher opacity = darker overlay, lower opacity = lighter overlay + this.navType = 1; // 1 = "Prev/Next" buttons on top left and left (default), 2 = "<< prev | next >>" links next to image number + this.autoResize = true; // controls whether or not images should be resized if larger than the browser window dimensions + this.doAnimations = true; // controls whether or not "animate" Lytebox, i.e. resize transition between images, fade in/out effects, etc. + + this.borderSize = 12; // if you adjust the padding in the CSS, you will need to update this variable -- otherwise, leave this alone... + /*** End Global Configuration ***/ + + /*** Configure Slideshow Options ***/ + this.slideInterval = 4000; // Change value (milliseconds) to increase/decrease the time between "slides" (10000 = 10 seconds) + this.showNavigation = true; // true to display Next/Prev buttons/text during slideshow, false to hide + this.showClose = true; // true to display the Close button, false to hide + this.showDetails = true; // true to display image details (caption, count), false to hide + this.showPlayPause = true; // true to display pause/play buttons next to close button, false to hide + this.autoEnd = true; // true to automatically close Lytebox after the last image is reached, false to keep open + this.pauseOnNextClick = false; // true to pause the slideshow when the "Next" button is clicked + this.pauseOnPrevClick = true; // true to pause the slideshow when the "Prev" button is clicked + /*** End Slideshow Configuration ***/ + + if(this.resizeSpeed > 10) { this.resizeSpeed = 10; } + if(this.resizeSpeed < 1) { resizeSpeed = 1; } + this.resizeDuration = (11 - this.resizeSpeed) * 0.15; + this.resizeWTimerArray = new Array(); + this.resizeWTimerCount = 0; + this.resizeHTimerArray = new Array(); + this.resizeHTimerCount = 0; + this.showContentTimerArray = new Array(); + this.showContentTimerCount = 0; + this.overlayTimerArray = new Array(); + this.overlayTimerCount = 0; + this.imageTimerArray = new Array(); + this.imageTimerCount = 0; + this.timerIDArray = new Array(); + this.timerIDCount = 0; + this.slideshowIDArray = new Array(); + this.slideshowIDCount = 0; + this.imageArray = new Array(); + this.activeImage = null; + this.slideArray = new Array(); + this.activeSlide = null; + this.frameArray = new Array(); + this.activeFrame = null; + this.checkFrame(); + this.isSlideshow = false; + this.isLyteframe = false; + /*@cc_on + /*@if (@_jscript) + this.ie = (document.all && !window.opera) ? true : false; + /*@else @*/ + this.ie = false; + /*@end + @*/ + this.ie7 = (this.ie && window.XMLHttpRequest); + this.initialize(); +} +LyteBox.prototype.initialize = function() { + this.updateLyteboxItems(); + var objBody = this.doc.getElementsByTagName("body").item(0); + if (this.doc.getElementById('lbOverlay')) { + objBody.removeChild(this.doc.getElementById("lbOverlay")); + objBody.removeChild(this.doc.getElementById("lbMain")); + } + var objOverlay = this.doc.createElement("div"); + objOverlay.setAttribute('id','lbOverlay'); + objOverlay.setAttribute((this.ie ? 'className' : 'class'), this.theme); + if ((this.ie && !this.ie7) || (this.ie7 && this.doc.compatMode == 'BackCompat')) { + objOverlay.style.position = 'absolute'; + } + objOverlay.style.display = 'none'; + objBody.appendChild(objOverlay); + var objLytebox = this.doc.createElement("div"); + objLytebox.setAttribute('id','lbMain'); + objLytebox.style.display = 'none'; + objBody.appendChild(objLytebox); + var objOuterContainer = this.doc.createElement("div"); + objOuterContainer.setAttribute('id','lbOuterContainer'); + objOuterContainer.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objLytebox.appendChild(objOuterContainer); + var objIframeContainer = this.doc.createElement("div"); + objIframeContainer.setAttribute('id','lbIframeContainer'); + objIframeContainer.style.display = 'none'; + objOuterContainer.appendChild(objIframeContainer); + var objIframe = this.doc.createElement("iframe"); + objIframe.setAttribute('id','lbIframe'); + objIframe.setAttribute('name','lbIframe'); + objIframe.style.display = 'none'; + objIframeContainer.appendChild(objIframe); + var objImageContainer = this.doc.createElement("div"); + objImageContainer.setAttribute('id','lbImageContainer'); + objOuterContainer.appendChild(objImageContainer); + var objLyteboxImage = this.doc.createElement("img"); + objLyteboxImage.setAttribute('id','lbImage'); + objImageContainer.appendChild(objLyteboxImage); + var objLoading = this.doc.createElement("div"); + objLoading.setAttribute('id','lbLoading'); + objOuterContainer.appendChild(objLoading); + var objDetailsContainer = this.doc.createElement("div"); + objDetailsContainer.setAttribute('id','lbDetailsContainer'); + objDetailsContainer.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objLytebox.appendChild(objDetailsContainer); + var objDetailsData =this.doc.createElement("div"); + objDetailsData.setAttribute('id','lbDetailsData'); + objDetailsData.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objDetailsContainer.appendChild(objDetailsData); + var objDetails = this.doc.createElement("div"); + objDetails.setAttribute('id','lbDetails'); + objDetailsData.appendChild(objDetails); + var objCaption = this.doc.createElement("span"); + objCaption.setAttribute('id','lbCaption'); + objDetails.appendChild(objCaption); + var objHoverNav = this.doc.createElement("div"); + objHoverNav.setAttribute('id','lbHoverNav'); + objImageContainer.appendChild(objHoverNav); + var objBottomNav = this.doc.createElement("div"); + objBottomNav.setAttribute('id','lbBottomNav'); + objDetailsData.appendChild(objBottomNav); + var objPrev = this.doc.createElement("a"); + objPrev.setAttribute('id','lbPrev'); + objPrev.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objPrev.setAttribute('href','#'); + objHoverNav.appendChild(objPrev); + var objNext = this.doc.createElement("a"); + objNext.setAttribute('id','lbNext'); + objNext.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objNext.setAttribute('href','#'); + objHoverNav.appendChild(objNext); + var objNumberDisplay = this.doc.createElement("span"); + objNumberDisplay.setAttribute('id','lbNumberDisplay'); + objDetails.appendChild(objNumberDisplay); + var objNavDisplay = this.doc.createElement("span"); + objNavDisplay.setAttribute('id','lbNavDisplay'); + objNavDisplay.style.display = 'none'; + objDetails.appendChild(objNavDisplay); + var objClose = this.doc.createElement("a"); + objClose.setAttribute('id','lbClose'); + objClose.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objClose.setAttribute('href','#'); + objBottomNav.appendChild(objClose); + var objPause = this.doc.createElement("a"); + objPause.setAttribute('id','lbPause'); + objPause.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objPause.setAttribute('href','#'); + objPause.style.display = 'none'; + objBottomNav.appendChild(objPause); + var objPlay = this.doc.createElement("a"); + objPlay.setAttribute('id','lbPlay'); + objPlay.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objPlay.setAttribute('href','#'); + objPlay.style.display = 'none'; + objBottomNav.appendChild(objPlay); +}; +LyteBox.prototype.updateLyteboxItems = function() { + var anchors = (this.isFrame) ? window.parent.frames[window.name].document.getElementsByTagName('a') : document.getElementsByTagName('a'); + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + var relAttribute = String(anchor.getAttribute('rel')); + if (anchor.getAttribute('href')) { + if (relAttribute.toLowerCase().match('lytebox')) { + anchor.onclick = function () { myLytebox.start(this, false, false); return false; } + } else if (relAttribute.toLowerCase().match('lyteshow')) { + anchor.onclick = function () { myLytebox.start(this, true, false); return false; } + } else if (relAttribute.toLowerCase().match('lyteframe')) { + anchor.onclick = function () { myLytebox.start(this, false, true); return false; } + } + } + } +}; +LyteBox.prototype.start = function(imageLink, doSlide, doFrame) { + if (this.ie && !this.ie7) { this.toggleSelects('hide'); } + if (this.hideFlash) { this.toggleFlash('hide'); } + this.isLyteframe = (doFrame ? true : false); + var pageSize = this.getPageSize(); + var objOverlay = this.doc.getElementById('lbOverlay'); + var objBody = this.doc.getElementsByTagName("body").item(0); + objOverlay.style.height = pageSize[1] + "px"; + objOverlay.style.display = ''; + this.appear('lbOverlay', (this.doAnimations ? 0 : this.maxOpacity)); + var anchors = (this.isFrame) ? window.parent.frames[window.name].document.getElementsByTagName('a') : document.getElementsByTagName('a'); + if (this.isLyteframe) { + this.frameArray = []; + this.frameNum = 0; + if ((imageLink.getAttribute('rel') == 'lyteframe')) { + var rev = imageLink.getAttribute('rev'); + this.frameArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'), (rev == null || rev == '' ? 'width: 400px; height: 400px; scrolling: auto;' : rev))); + } else { + if (imageLink.getAttribute('rel').indexOf('lyteframe') != -1) { + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { + var rev = anchor.getAttribute('rev'); + this.frameArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'), (rev == null || rev == '' ? 'width: 400px; height: 400px; scrolling: auto;' : rev))); + } + } + this.frameArray.removeDuplicates(); + while(this.frameArray[this.frameNum][0] != imageLink.getAttribute('href')) { this.frameNum++; } + } + } + } else { + this.imageArray = []; + this.imageNum = 0; + this.slideArray = []; + this.slideNum = 0; + if ((imageLink.getAttribute('rel') == 'lytebox')) { + this.imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'))); + } else { + if (imageLink.getAttribute('rel').indexOf('lytebox') != -1) { + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { + this.imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'))); + } + } + this.imageArray.removeDuplicates(); + while(this.imageArray[this.imageNum][0] != imageLink.getAttribute('href')) { this.imageNum++; } + } + if (imageLink.getAttribute('rel').indexOf('lyteshow') != -1) { + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { + this.slideArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'))); + } + } + this.slideArray.removeDuplicates(); + while(this.slideArray[this.slideNum][0] != imageLink.getAttribute('href')) { this.slideNum++; } + } + } + } + var object = this.doc.getElementById('lbMain'); + object.style.top = (this.getPageScroll() + (pageSize[3] / 15)) + "px"; + object.style.display = ''; + if (!this.outerBorder) { + this.doc.getElementById('lbOuterContainer').style.border = 'none'; + this.doc.getElementById('lbDetailsContainer').style.border = 'none'; + } else { + this.doc.getElementById('lbOuterContainer').style.borderBottom = ''; + this.doc.getElementById('lbOuterContainer').setAttribute((this.ie ? 'className' : 'class'), this.theme); + } + this.doc.getElementById('lbOverlay').onclick = function() { myLytebox.end(); return false; } + this.doc.getElementById('lbMain').onclick = function(e) { + var e = e; + if (!e) { + if (window.parent.frames[window.name] && (parent.document.getElementsByTagName('frameset').length <= 0)) { + e = window.parent.window.event; + } else { + e = window.event; + } + } + var id = (e.target ? e.target.id : e.srcElement.id); + if (id == 'lbMain') { myLytebox.end(); return false; } + } + this.doc.getElementById('lbClose').onclick = function() { myLytebox.end(); return false; } + this.doc.getElementById('lbPause').onclick = function() { myLytebox.togglePlayPause("lbPause", "lbPlay"); return false; } + this.doc.getElementById('lbPlay').onclick = function() { myLytebox.togglePlayPause("lbPlay", "lbPause"); return false; } + this.isSlideshow = doSlide; + this.isPaused = (this.slideNum != 0 ? true : false); + if (this.isSlideshow && this.showPlayPause && this.isPaused) { + this.doc.getElementById('lbPlay').style.display = ''; + this.doc.getElementById('lbPause').style.display = 'none'; + } + if (this.isLyteframe) { + this.changeContent(this.frameNum); + } else { + if (this.isSlideshow) { + this.changeContent(this.slideNum); + } else { + this.changeContent(this.imageNum); + } + } +}; +LyteBox.prototype.changeContent = function(imageNum) { + if (this.isSlideshow) { + for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } + } + this.activeImage = this.activeSlide = this.activeFrame = imageNum; + if (!this.outerBorder) { + this.doc.getElementById('lbOuterContainer').style.border = 'none'; + this.doc.getElementById('lbDetailsContainer').style.border = 'none'; + } else { + this.doc.getElementById('lbOuterContainer').style.borderBottom = ''; + this.doc.getElementById('lbOuterContainer').setAttribute((this.ie ? 'className' : 'class'), this.theme); + } + this.doc.getElementById('lbLoading').style.display = ''; + this.doc.getElementById('lbImage').style.display = 'none'; + this.doc.getElementById('lbIframe').style.display = 'none'; + this.doc.getElementById('lbPrev').style.display = 'none'; + this.doc.getElementById('lbNext').style.display = 'none'; + this.doc.getElementById('lbIframeContainer').style.display = 'none'; + this.doc.getElementById('lbDetailsContainer').style.display = 'none'; + this.doc.getElementById('lbNumberDisplay').style.display = 'none'; + if (this.navType == 2 || this.isLyteframe) { + object = this.doc.getElementById('lbNavDisplay'); + object.innerHTML = ' <span id="lbPrev2_Off" style="display: none;" class="' + this.theme + '">« prev</span><a href="#" id="lbPrev2" class="' + this.theme + '" style="display: none;">« prev</a> <b id="lbSpacer" class="' + this.theme + '">||</b> <span id="lbNext2_Off" style="display: none;" class="' + this.theme + '">next »</span><a href="#" id="lbNext2" class="' + this.theme + '" style="display: none;">next »</a>'; + object.style.display = 'none'; + } + if (this.isLyteframe) { + var iframe = myLytebox.doc.getElementById('lbIframe'); + var styles = this.frameArray[this.activeFrame][2]; + var aStyles = styles.split(';'); + for (var i = 0; i < aStyles.length; i++) { + if (aStyles[i].indexOf('width:') >= 0) { + var w = aStyles[i].replace('width:', ''); + iframe.width = w.trim(); + } else if (aStyles[i].indexOf('height:') >= 0) { + var h = aStyles[i].replace('height:', ''); + iframe.height = h.trim(); + } else if (aStyles[i].indexOf('scrolling:') >= 0) { + var s = aStyles[i].replace('scrolling:', ''); + iframe.scrolling = s.trim(); + } else if (aStyles[i].indexOf('border:') >= 0) { + // Not implemented yet, as there are cross-platform issues with setting the border (from a GUI standpoint) + //var b = aStyles[i].replace('border:', ''); + //iframe.style.border = b.trim(); + } + } + this.resizeContainer(parseInt(iframe.width), parseInt(iframe.height)); + } else { + imgPreloader = new Image(); + imgPreloader.onload = function() { + var imageWidth = imgPreloader.width; + var imageHeight = imgPreloader.height; + if (myLytebox.autoResize) { + var pagesize = myLytebox.getPageSize(); + var x = pagesize[2] - 150; + var y = pagesize[3] - 150; + if (imageWidth > x) { + imageHeight = Math.round(imageHeight * (x / imageWidth)); + imageWidth = x; + if (imageHeight > y) { + imageWidth = Math.round(imageWidth * (y / imageHeight)); + imageHeight = y; + } + } else if (imageHeight > y) { + imageWidth = Math.round(imageWidth * (y / imageHeight)); + imageHeight = y; + if (imageWidth > x) { + imageHeight = Math.round(imageHeight * (x / imageWidth)); + imageWidth = x; + } + } + } + var lbImage = myLytebox.doc.getElementById('lbImage') + lbImage.src = (myLytebox.isSlideshow ? myLytebox.slideArray[myLytebox.activeSlide][0] : myLytebox.imageArray[myLytebox.activeImage][0]); + lbImage.width = imageWidth; + lbImage.height = imageHeight; + myLytebox.resizeContainer(imageWidth, imageHeight); + imgPreloader.onload = function() {}; + } + imgPreloader.src = (this.isSlideshow ? this.slideArray[this.activeSlide][0] : this.imageArray[this.activeImage][0]); + } +}; +LyteBox.prototype.resizeContainer = function(imgWidth, imgHeight) { + this.wCur = this.doc.getElementById('lbOuterContainer').offsetWidth; + this.hCur = this.doc.getElementById('lbOuterContainer').offsetHeight; + this.xScale = ((imgWidth + (this.borderSize * 2)) / this.wCur) * 100; + this.yScale = ((imgHeight + (this.borderSize * 2)) / this.hCur) * 100; + var wDiff = (this.wCur - this.borderSize * 2) - imgWidth; + var hDiff = (this.hCur - this.borderSize * 2) - imgHeight; + if (!(hDiff == 0)) { + this.hDone = false; + this.resizeH('lbOuterContainer', this.hCur, imgHeight + this.borderSize*2, this.getPixelRate(this.hCur, imgHeight)); + } else { + this.hDone = true; + } + if (!(wDiff == 0)) { + this.wDone = false; + this.resizeW('lbOuterContainer', this.wCur, imgWidth + this.borderSize*2, this.getPixelRate(this.wCur, imgWidth)); + } else { + this.wDone = true; + } + if ((hDiff == 0) && (wDiff == 0)) { + if (this.ie){ this.pause(250); } else { this.pause(100); } + } + this.doc.getElementById('lbPrev').style.height = imgHeight + "px"; + this.doc.getElementById('lbNext').style.height = imgHeight + "px"; + this.doc.getElementById('lbDetailsContainer').style.width = (imgWidth + (this.borderSize * 2) + (this.ie && this.doc.compatMode == "BackCompat" && this.outerBorder ? 2 : 0)) + "px"; + this.showContent(); +}; +LyteBox.prototype.showContent = function() { + if (this.wDone && this.hDone) { + for (var i = 0; i < this.showContentTimerCount; i++) { window.clearTimeout(this.showContentTimerArray[i]); } + if (this.outerBorder) { + this.doc.getElementById('lbOuterContainer').style.borderBottom = 'none'; + } + this.doc.getElementById('lbLoading').style.display = 'none'; + if (this.isLyteframe) { + this.doc.getElementById('lbIframe').style.display = ''; + this.appear('lbIframe', (this.doAnimations ? 0 : 100)); + } else { + this.doc.getElementById('lbImage').style.display = ''; + this.appear('lbImage', (this.doAnimations ? 0 : 100)); + this.preloadNeighborImages(); + } + if (this.isSlideshow) { + if(this.activeSlide == (this.slideArray.length - 1)) { + if (this.autoEnd) { + this.slideshowIDArray[this.slideshowIDCount++] = setTimeout("myLytebox.end('slideshow')", this.slideInterval); + } + } else { + if (!this.isPaused) { + this.slideshowIDArray[this.slideshowIDCount++] = setTimeout("myLytebox.changeContent("+(this.activeSlide+1)+")", this.slideInterval); + } + } + this.doc.getElementById('lbHoverNav').style.display = (this.showNavigation && this.navType == 1 ? '' : 'none'); + this.doc.getElementById('lbClose').style.display = (this.showClose ? '' : 'none'); + this.doc.getElementById('lbDetails').style.display = (this.showDetails ? '' : 'none'); + this.doc.getElementById('lbPause').style.display = (this.showPlayPause && !this.isPaused ? '' : 'none'); + this.doc.getElementById('lbPlay').style.display = (this.showPlayPause && !this.isPaused ? 'none' : ''); + this.doc.getElementById('lbNavDisplay').style.display = (this.showNavigation && this.navType == 2 ? '' : 'none'); + } else { + this.doc.getElementById('lbHoverNav').style.display = (this.navType == 1 && !this.isLyteframe ? '' : 'none'); + if ((this.navType == 2 && !this.isLyteframe && this.imageArray.length > 1) || (this.frameArray.length > 1 && this.isLyteframe)) { + this.doc.getElementById('lbNavDisplay').style.display = ''; + } else { + this.doc.getElementById('lbNavDisplay').style.display = 'none'; + } + this.doc.getElementById('lbClose').style.display = ''; + this.doc.getElementById('lbDetails').style.display = ''; + this.doc.getElementById('lbPause').style.display = 'none'; + this.doc.getElementById('lbPlay').style.display = 'none'; + } + this.doc.getElementById('lbImageContainer').style.display = (this.isLyteframe ? 'none' : ''); + this.doc.getElementById('lbIframeContainer').style.display = (this.isLyteframe ? '' : 'none'); + try { + this.doc.getElementById('lbIframe').src = this.frameArray[this.activeFrame][0]; + } catch(e) { } + } else { + this.showContentTimerArray[this.showContentTimerCount++] = setTimeout("myLytebox.showContent()", 200); + } +}; +LyteBox.prototype.updateDetails = function() { + var object = this.doc.getElementById('lbCaption'); + var sTitle = (this.isSlideshow ? this.slideArray[this.activeSlide][1] : (this.isLyteframe ? this.frameArray[this.activeFrame][1] : this.imageArray[this.activeImage][1])); + object.style.display = ''; + object.innerHTML = (sTitle == null ? '' : sTitle); + this.updateNav(); + this.doc.getElementById('lbDetailsContainer').style.display = ''; + object = this.doc.getElementById('lbNumberDisplay'); + if (this.isSlideshow && this.slideArray.length > 1) { + object.style.display = ''; + object.innerHTML = "Image " + eval(this.activeSlide + 1) + " of " + this.slideArray.length; + this.doc.getElementById('lbNavDisplay').style.display = (this.navType == 2 && this.showNavigation ? '' : 'none'); + } else if (this.imageArray.length > 1 && !this.isLyteframe) { + object.style.display = ''; + object.innerHTML = "Image " + eval(this.activeImage + 1) + " of " + this.imageArray.length; + this.doc.getElementById('lbNavDisplay').style.display = (this.navType == 2 ? '' : 'none'); + } else if (this.frameArray.length > 1 && this.isLyteframe) { + object.style.display = ''; + object.innerHTML = "Page " + eval(this.activeFrame + 1) + " of " + this.frameArray.length; + this.doc.getElementById('lbNavDisplay').style.display = ''; + } else { + this.doc.getElementById('lbNavDisplay').style.display = 'none'; + } + this.appear('lbDetailsContainer', (this.doAnimations ? 0 : 100)); +}; +LyteBox.prototype.updateNav = function() { + if (this.isSlideshow) { + if (this.activeSlide != 0) { + var object = (this.navType == 2 ? this.doc.getElementById('lbPrev2') : this.doc.getElementById('lbPrev')); + object.style.display = ''; + object.onclick = function() { + if (myLytebox.pauseOnPrevClick) { myLytebox.togglePlayPause("lbPause", "lbPlay"); } + myLytebox.changeContent(myLytebox.activeSlide - 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbPrev2_Off').style.display = ''; } + } + if (this.activeSlide != (this.slideArray.length - 1)) { + var object = (this.navType == 2 ? this.doc.getElementById('lbNext2') : this.doc.getElementById('lbNext')); + object.style.display = ''; + object.onclick = function() { + if (myLytebox.pauseOnNextClick) { myLytebox.togglePlayPause("lbPause", "lbPlay"); } + myLytebox.changeContent(myLytebox.activeSlide + 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbNext2_Off').style.display = ''; } + } + } else if (this.isLyteframe) { + if(this.activeFrame != 0) { + var object = this.doc.getElementById('lbPrev2'); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeFrame - 1); return false; + } + } else { + this.doc.getElementById('lbPrev2_Off').style.display = ''; + } + if(this.activeFrame != (this.frameArray.length - 1)) { + var object = this.doc.getElementById('lbNext2'); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeFrame + 1); return false; + } + } else { + this.doc.getElementById('lbNext2_Off').style.display = ''; + } + } else { + if(this.activeImage != 0) { + var object = (this.navType == 2 ? this.doc.getElementById('lbPrev2') : this.doc.getElementById('lbPrev')); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeImage - 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbPrev2_Off').style.display = ''; } + } + if(this.activeImage != (this.imageArray.length - 1)) { + var object = (this.navType == 2 ? this.doc.getElementById('lbNext2') : this.doc.getElementById('lbNext')); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeImage + 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbNext2_Off').style.display = ''; } + } + } + this.enableKeyboardNav(); +}; +LyteBox.prototype.enableKeyboardNav = function() { document.onkeydown = this.keyboardAction; }; +LyteBox.prototype.disableKeyboardNav = function() { document.onkeydown = ''; }; +LyteBox.prototype.keyboardAction = function(e) { + var keycode = key = escape = null; + keycode = (e == null) ? event.keyCode : e.which; + key = String.fromCharCode(keycode).toLowerCase(); + escape = (e == null) ? 27 : e.DOM_VK_ESCAPE; + if ((key == 'x') || (key == 'c') || (keycode == escape)) { + myLytebox.end(); + } else if ((key == 'p') || (keycode == 37)) { + if (myLytebox.isSlideshow) { + if(myLytebox.activeSlide != 0) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeSlide - 1); + } + } else if (myLytebox.isLyteframe) { + if(myLytebox.activeFrame != 0) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeFrame - 1); + } + } else { + if(myLytebox.activeImage != 0) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeImage - 1); + } + } + } else if ((key == 'n') || (keycode == 39)) { + if (myLytebox.isSlideshow) { + if(myLytebox.activeSlide != (myLytebox.slideArray.length - 1)) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeSlide + 1); + } + } else if (myLytebox.isLyteframe) { + if(myLytebox.activeFrame != (myLytebox.frameArray.length - 1)) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeFrame + 1); + } + } else { + if(myLytebox.activeImage != (myLytebox.imageArray.length - 1)) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeImage + 1); + } + } + } +}; +LyteBox.prototype.preloadNeighborImages = function() { + if (this.isSlideshow) { + if ((this.slideArray.length - 1) > this.activeSlide) { + preloadNextImage = new Image(); + preloadNextImage.src = this.slideArray[this.activeSlide + 1][0]; + } + if(this.activeSlide > 0) { + preloadPrevImage = new Image(); + preloadPrevImage.src = this.slideArray[this.activeSlide - 1][0]; + } + } else { + if ((this.imageArray.length - 1) > this.activeImage) { + preloadNextImage = new Image(); + preloadNextImage.src = this.imageArray[this.activeImage + 1][0]; + } + if(this.activeImage > 0) { + preloadPrevImage = new Image(); + preloadPrevImage.src = this.imageArray[this.activeImage - 1][0]; + } + } +}; +LyteBox.prototype.togglePlayPause = function(hideID, showID) { + if (this.isSlideshow && hideID == "lbPause") { + for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } + } + this.doc.getElementById(hideID).style.display = 'none'; + this.doc.getElementById(showID).style.display = ''; + if (hideID == "lbPlay") { + this.isPaused = false; + if (this.activeSlide == (this.slideArray.length - 1)) { + this.end(); + } else { + this.changeContent(this.activeSlide + 1); + } + } else { + this.isPaused = true; + } +}; +LyteBox.prototype.end = function(caller) { + var closeClick = (caller == 'slideshow' ? false : true); + if (this.isSlideshow && this.isPaused && !closeClick) { return; } + this.disableKeyboardNav(); + this.doc.getElementById('lbMain').style.display = 'none'; + this.fade('lbOverlay', (this.doAnimations ? this.maxOpacity : 0)); + this.toggleSelects('visible'); + if (this.hideFlash) { this.toggleFlash('visible'); } + if (this.isSlideshow) { + for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } + } + if (this.isLyteframe) { + this.initialize(); + } +}; +LyteBox.prototype.checkFrame = function() { + if (window.parent.frames[window.name] && (parent.document.getElementsByTagName('frameset').length <= 0)) { + this.isFrame = true; + this.lytebox = "window.parent." + window.name + ".myLytebox"; + this.doc = parent.document; + } else { + this.isFrame = false; + this.lytebox = "myLytebox"; + this.doc = document; + } +}; +LyteBox.prototype.getPixelRate = function(cur, img) { + var diff = (img > cur) ? img - cur : cur - img; + if (diff >= 0 && diff <= 100) { return 10; } + if (diff > 100 && diff <= 200) { return 15; } + if (diff > 200 && diff <= 300) { return 20; } + if (diff > 300 && diff <= 400) { return 25; } + if (diff > 400 && diff <= 500) { return 30; } + if (diff > 500 && diff <= 600) { return 35; } + if (diff > 600 && diff <= 700) { return 40; } + if (diff > 700) { return 45; } +}; +LyteBox.prototype.appear = function(id, opacity) { + var object = this.doc.getElementById(id).style; + object.opacity = (opacity / 100); + object.MozOpacity = (opacity / 100); + object.KhtmlOpacity = (opacity / 100); + object.filter = "alpha(opacity=" + (opacity + 10) + ")"; + if (opacity == 100 && (id == 'lbImage' || id == 'lbIframe')) { + try { object.removeAttribute("filter"); } catch(e) {} /* Fix added for IE Alpha Opacity Filter bug. */ + this.updateDetails(); + } else if (opacity >= this.maxOpacity && id == 'lbOverlay') { + for (var i = 0; i < this.overlayTimerCount; i++) { window.clearTimeout(this.overlayTimerArray[i]); } + return; + } else if (opacity >= 100 && id == 'lbDetailsContainer') { + try { object.removeAttribute("filter"); } catch(e) {} /* Fix added for IE Alpha Opacity Filter bug. */ + for (var i = 0; i < this.imageTimerCount; i++) { window.clearTimeout(this.imageTimerArray[i]); } + this.doc.getElementById('lbOverlay').style.height = this.getPageSize()[1] + "px"; + } else { + if (id == 'lbOverlay') { + this.overlayTimerArray[this.overlayTimerCount++] = setTimeout("myLytebox.appear('" + id + "', " + (opacity+20) + ")", 1); + } else { + this.imageTimerArray[this.imageTimerCount++] = setTimeout("myLytebox.appear('" + id + "', " + (opacity+10) + ")", 1); + } + } +}; +LyteBox.prototype.fade = function(id, opacity) { + var object = this.doc.getElementById(id).style; + object.opacity = (opacity / 100); + object.MozOpacity = (opacity / 100); + object.KhtmlOpacity = (opacity / 100); + object.filter = "alpha(opacity=" + opacity + ")"; + if (opacity <= 0) { + try { + object.display = 'none'; + } catch(err) { } + } else if (id == 'lbOverlay') { + this.overlayTimerArray[this.overlayTimerCount++] = setTimeout("myLytebox.fade('" + id + "', " + (opacity-20) + ")", 1); + } else { + this.timerIDArray[this.timerIDCount++] = setTimeout("myLytebox.fade('" + id + "', " + (opacity-10) + ")", 1); + } +}; +LyteBox.prototype.resizeW = function(id, curW, maxW, pixelrate, speed) { + if (!this.hDone) { + this.resizeWTimerArray[this.resizeWTimerCount++] = setTimeout("myLytebox.resizeW('" + id + "', " + curW + ", " + maxW + ", " + pixelrate + ")", 100); + return; + } + var object = this.doc.getElementById(id); + var timer = speed ? speed : (this.resizeDuration/2); + var newW = (this.doAnimations ? curW : maxW); + object.style.width = (newW) + "px"; + if (newW < maxW) { + newW += (newW + pixelrate >= maxW) ? (maxW - newW) : pixelrate; + } else if (newW > maxW) { + newW -= (newW - pixelrate <= maxW) ? (newW - maxW) : pixelrate; + } + this.resizeWTimerArray[this.resizeWTimerCount++] = setTimeout("myLytebox.resizeW('" + id + "', " + newW + ", " + maxW + ", " + pixelrate + ", " + (timer+0.02) + ")", timer+0.02); + if (parseInt(object.style.width) == maxW) { + this.wDone = true; + for (var i = 0; i < this.resizeWTimerCount; i++) { window.clearTimeout(this.resizeWTimerArray[i]); } + } +}; +LyteBox.prototype.resizeH = function(id, curH, maxH, pixelrate, speed) { + var timer = speed ? speed : (this.resizeDuration/2); + var object = this.doc.getElementById(id); + var newH = (this.doAnimations ? curH : maxH); + object.style.height = (newH) + "px"; + if (newH < maxH) { + newH += (newH + pixelrate >= maxH) ? (maxH - newH) : pixelrate; + } else if (newH > maxH) { + newH -= (newH - pixelrate <= maxH) ? (newH - maxH) : pixelrate; + } + this.resizeHTimerArray[this.resizeHTimerCount++] = setTimeout("myLytebox.resizeH('" + id + "', " + newH + ", " + maxH + ", " + pixelrate + ", " + (timer+.02) + ")", timer+.02); + if (parseInt(object.style.height) == maxH) { + this.hDone = true; + for (var i = 0; i < this.resizeHTimerCount; i++) { window.clearTimeout(this.resizeHTimerArray[i]); } + } +}; +LyteBox.prototype.getPageScroll = function() { + if (self.pageYOffset) { + return this.isFrame ? parent.pageYOffset : self.pageYOffset; + } else if (this.doc.documentElement && this.doc.documentElement.scrollTop){ + return this.doc.documentElement.scrollTop; + } else if (document.body) { + return this.doc.body.scrollTop; + } +}; +LyteBox.prototype.getPageSize = function() { + var xScroll, yScroll, windowWidth, windowHeight; + if (window.innerHeight && window.scrollMaxY) { + xScroll = this.doc.scrollWidth; + yScroll = (this.isFrame ? parent.innerHeight : self.innerHeight) + (this.isFrame ? parent.scrollMaxY : self.scrollMaxY); + } else if (this.doc.body.scrollHeight > this.doc.body.offsetHeight){ + xScroll = this.doc.body.scrollWidth; + yScroll = this.doc.body.scrollHeight; + } else { + xScroll = this.doc.getElementsByTagName("html").item(0).offsetWidth; + yScroll = this.doc.getElementsByTagName("html").item(0).offsetHeight; + xScroll = (xScroll < this.doc.body.offsetWidth) ? this.doc.body.offsetWidth : xScroll; + yScroll = (yScroll < this.doc.body.offsetHeight) ? this.doc.body.offsetHeight : yScroll; + } + if (self.innerHeight) { + windowWidth = (this.isFrame) ? parent.innerWidth : self.innerWidth; + windowHeight = (this.isFrame) ? parent.innerHeight : self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { + windowWidth = this.doc.documentElement.clientWidth; + windowHeight = this.doc.documentElement.clientHeight; + } else if (document.body) { + windowWidth = this.doc.getElementsByTagName("html").item(0).clientWidth; + windowHeight = this.doc.getElementsByTagName("html").item(0).clientHeight; + windowWidth = (windowWidth == 0) ? this.doc.body.clientWidth : windowWidth; + windowHeight = (windowHeight == 0) ? this.doc.body.clientHeight : windowHeight; + } + var pageHeight = (yScroll < windowHeight) ? windowHeight : yScroll; + var pageWidth = (xScroll < windowWidth) ? windowWidth : xScroll; + return new Array(pageWidth, pageHeight, windowWidth, windowHeight); +}; +LyteBox.prototype.toggleFlash = function(state) { + var objects = this.doc.getElementsByTagName("object"); + for (var i = 0; i < objects.length; i++) { + objects[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + var embeds = this.doc.getElementsByTagName("embed"); + for (var i = 0; i < embeds.length; i++) { + embeds[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + if (this.isFrame) { + for (var i = 0; i < parent.frames.length; i++) { + try { + objects = parent.frames[i].window.document.getElementsByTagName("object"); + for (var j = 0; j < objects.length; j++) { + objects[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + } catch(e) { } + try { + embeds = parent.frames[i].window.document.getElementsByTagName("embed"); + for (var j = 0; j < embeds.length; j++) { + embeds[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + } catch(e) { } + } + } +}; +LyteBox.prototype.toggleSelects = function(state) { + var selects = this.doc.getElementsByTagName("select"); + for (var i = 0; i < selects.length; i++ ) { + selects[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + if (this.isFrame) { + for (var i = 0; i < parent.frames.length; i++) { + try { + selects = parent.frames[i].window.document.getElementsByTagName("select"); + for (var j = 0; j < selects.length; j++) { + selects[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + } catch(e) { } + } + } +}; +LyteBox.prototype.pause = function(numberMillis) { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) { return; } + } +}; +if (window.addEventListener) { + window.addEventListener("load",initLytebox,false); +} else if (window.attachEvent) { + window.attachEvent("onload",initLytebox); +} else { + window.onload = function() {initLytebox();} +} +function initLytebox() { myLytebox = new LyteBox(); } \ No newline at end of file diff --git a/plugins/tidypics/views/default/annotation/annotate.php b/plugins/tidypics/views/default/annotation/annotate.php new file mode 100644 index 00000000..8156a4bb --- /dev/null +++ b/plugins/tidypics/views/default/annotation/annotate.php @@ -0,0 +1,21 @@ +<?php + + /* + * Overriding core view to work around bug dealing with empty titles + */ + + $performed_by = get_entity($vars['item']->subject_guid); + $object = get_entity($vars['item']->object_guid); + $url = $object->getURL(); + $subtype = get_subtype_from_id($object->subtype); + $title = $object->title; + if (!$title) + $title = elgg_echo('untitled'); + + $url = "<a href=\"{$performed_by->getURL()}\">{$performed_by->name}</a>"; + $string = sprintf(elgg_echo("river:posted:generic"),$url) . " "; + $string .= elgg_echo("{$subtype}:river:annotate") . " <a href=\"" . $object->getURL() . "\">" . $title . "</a>"; + +?> + +<?php echo $string; ?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/object/album.php b/plugins/tidypics/views/default/object/album.php new file mode 100644 index 00000000..85dd69ac --- /dev/null +++ b/plugins/tidypics/views/default/object/album.php @@ -0,0 +1,161 @@ +<?php + /** + * Tidypics Album Gallery View + */ + + global $CONFIG; + + $album = $vars['entity']; + $album_guid = $album->getGUID(); + $owner = $album->getOwnerEntity(); + $tags = $album->tags; + $title = $album->title; + $desc = $album->description; + $friendlytime = friendly_time($album->time_created); + $mime = $album->mimetype; + + if (get_context() == "search") { + + if (get_input('search_viewtype') == "gallery") { + +/****************************************************************************** + * + * Gallery view of an album object + * + * This is called when looking at page of albums + * + * + *****************************************************************************/ + + //get album cover if one was set + if ($album->cover) + $album_cover = '<img src="' . $vars['url'] . 'pg/photos/thumbnail/' . $album->cover . '/small/" class="tidypics_album_cover" alt="' . $title . '"/>'; + else + $album_cover = '<img src="' . $vars['url'] . 'mod/tidypics/graphics/empty_album.png" class="tidypics_album_cover" alt="new album">'; + +?> +<div class="tidypics_album_gallery_item"> + <div class="tidypics_gallery_title"> + <a href="<?php echo $album->getURL();?>"><?php echo $title;?></a> + </div> + <a href="<?php echo $album->getURL();?>"><?php echo $album_cover;?></a><br> + <small><a href="<?php echo $vars['url'];?>pg/profile/<?php echo $owner->username;?>"><?php echo $owner->name;?></a> + <br /><?php echo $friendlytime;?><br /> +<?php + //get the number of comments + $numcomments = elgg_count_comments($album); + if ($numcomments) + echo "<a href=\"{$album->getURL()}\">" . sprintf(elgg_echo("comments")) . " (" . $numcomments . ")</a>"; +?> + </small> +</div> +<?php + } else { +/****************************************************************************** + * + * List view of an album object + * + * This is called when an album object is returned in a search. + * + * + *****************************************************************************/ + + $info = '<p><a href="' . $album->getURL() . '">' . $title . '</a></p>'; + $info .= "<p class=\"owner_timestamp\"><a href=\"{$vars['url']}pg/profile/{$owner->username}\">{$owner->name}</a> {$friendlytime}"; + $numcomments = elgg_count_comments($album); + if ($numcomments) + $info .= ", <a href=\"{$album->getURL()}\">" . sprintf(elgg_echo("comments")) . " (" . $numcomments . ")</a>"; + $info .= "</p>"; + + //get album cover if one was set + if ($album->cover) + $icon = "<a href=\"{$album->getURL()}\">" . '<img src="' . $vars['url'] . 'mod/tidypics/thumbnail.php?file_guid=' . $album->cover . '&size=thumb" alt="thumbnail" /></a>'; + else + $icon = "<a href=\"{$album->getURL()}\">" . '<img src="' . $vars['url'] . 'mod/tidypics/graphics/image_error_thumb.png" alt="new album"></a>'; + + echo elgg_view_listing($icon, $info); + } + } else { + +/****************************************************************************** + * + * Individual view of an album object + * + * This is called when getting a listing of the photos in an album + * + * + *****************************************************************************/ + + $page = get_input("page"); + list($album_placeholder, $album_id, $album_title) = split("/", $page); + + $photo_ratings = get_plugin_setting('photo_ratings', 'tidypics'); + if ($photo_ratings == "enabled") + add_submenu_item( elgg_echo("tidypics:highestrated"), + $CONFIG->wwwroot . "pg/photos/highestrated/group:" . $album_id, + 'photos'); + + echo elgg_view_title($title); +?> +<div class="contentWrapper"> + <div id="tidypics_breadcrumbs"> + <?php echo elgg_view('tidypics/breadcrumbs', array() ); ?> + </div> +<?php + echo '<div id="tidypics_desc">' . autop($desc) . '</div>'; + + $images = get_entities("object", "image", $album_guid, '', 999); + + //build array for back | next links + $_SESSION['image_sort'] = array(); + + if (is_array($images)) { + foreach ($images as $image) { + array_push($_SESSION['image_sort'], $image->guid); + } + + // display the simple image views. Uses 'object/image' view + echo list_entities("object", "image", $album_guid, 24, false); + + $num_images = count($images); + } else { + echo '<div class="tidypics_info">' . elgg_echo('image:none') . '</div>'; + $num_images = 0; + } + +?> + <div class="clearfloat"></div> + <div class="tidypics_info"> +<?php + + if (!is_null($tags)) { +?> + <div class="object_tag_string"><?php echo elgg_view('output/tags',array('value' => $tags));?></div> +<?php + } +?> + <?php echo elgg_echo('album:by');?> <b><a href="<?php echo $vars['url'] ;?>pg/profile/<?php echo $owner->username; ?>"><?php echo $owner->name; ?></a></b> <?php echo $friendlytime; ?><br> + <?php echo elgg_echo('image:total');?> <b><?php echo $num_images; ?></b><br> +<?php + $categories = elgg_view('categories/view',$vars); + if (!empty($categories)) { +?> + <br /> +<b><?php echo elgg_echo('categories'); ?>:</b> + <?php + + echo $categories; + + } +?> + </div> + +<?php + + if ($vars['full']) { + echo elgg_view_comments($album); + } + + echo '</div>'; + } // end of individual album view +?> diff --git a/plugins/tidypics/views/default/object/image.php b/plugins/tidypics/views/default/object/image.php new file mode 100644 index 00000000..ee81d800 --- /dev/null +++ b/plugins/tidypics/views/default/object/image.php @@ -0,0 +1,231 @@ +<?php + /** + * + * Tidypics image object views + */ + + global $CONFIG; + include_once dirname(dirname(dirname(dirname(__FILE__)))) . "/lib/exif.php"; + + $image = $vars['entity']; + $image_guid = $image->getGUID(); + $tags = $image->tags; + $title = $image->title; + $desc = $image->description; + $owner = $image->getOwnerEntity(); + $friendlytime = friendly_time($image->time_created); + + +/******************************************************************** + * + * search view of an image + * + ********************************************************************/ + if (get_context() == "search") { + + // gallery view is a matrix view showing just the image - size: small + if (get_input('search_viewtype') == "gallery") { + ?> + <div class="tidypics_album_images"> + <a href="<?php echo $image->getURL();?>"><img src="<?php echo $vars['url'];?>mod/tidypics/thumbnail.php?file_guid=<?php echo $image_guid;?>&size=small" alt="thumbnail"/></a> + </div> + <?php + } + else{ + // list view displays a thumbnail icon of the image, its title, and the number of comments + $info = '<p><a href="' .$image->getURL(). '">'.$title.'</a></p>'; + $info .= "<p class=\"owner_timestamp\"><a href=\"{$vars['url']}pg/profile/{$owner->username}\">{$owner->name}</a> {$friendlytime}"; + $numcomments = elgg_count_comments($image); + if ($numcomments) + $info .= ", <a href=\"{$image->getURL()}\">" . sprintf(elgg_echo("comments")) . " (" . $numcomments . ")</a>"; + $info .= "</p>"; + $icon = "<a href=\"{$image->getURL()}\">" . '<img src="' . $vars['url'] . 'mod/tidypics/thumbnail.php?file_guid=' . $image_guid . '&size=thumb" alt="' . $title . '" /></a>'; + + echo elgg_view_listing($icon, $info); + } + +/*************************************************************** + * + * front page view + * + ****************************************************************/ + } else if (get_context() == "front") { + // the front page view is a clikcable thumbnail of the image +?> +<a href="<?php echo $image->getURL(); ?>"> +<img src="<?php echo $vars['url'];?>mod/tidypics/thumbnail.php?file_guid=<?php echo $image_guid;?>&size=thumb" class="tidypics_album_cover" alt="<?php echo $title; ?>" title="<?php echo $title; ?>" /> +</a> +<?php + } else { + +/******************************************************************** + * + * listing of photos in an album + * + *********************************************************************/ + if (!$vars['full']) { + +?> +<?php + // plugins can override the image link to add lightbox code here + $image_html = false; + $image_html = trigger_plugin_hook('tp_thumbnail_link', 'album', array('image' => $image), $image_html); + + if ($image_html) { + echo $image_html; + } else { + // default link to image if no one overrides +?> + <div class="tidypics_album_images"> + <a href="<?php echo $image->getURL();?>"><img src="<?php echo $vars['url'];?>pg/photos/thumbnail/<?php echo $image_guid;?>/small/" alt="<?php echo $image->title; ?>"/></a> + </div> +<?php + } +?> +<?php + } else { + +/******************************************************************** + * + * tidypics individual image display + * + *********************************************************************/ + + + $viewer = get_loggedin_user(); + + + // Build back and next links + $back = ''; + $next = ''; + + $album = get_entity($image->container_guid); + + $current = array_search($image_guid, $_SESSION['image_sort']); + + if (!$current) { // means we are no longer using the correct album array + + //rebuild the array + $count = get_entities("object","image", $album->guid, '', 999); + $_SESSION['image_sort'] = array(); + + foreach ($count as $img) { + array_push($_SESSION['image_sort'], $img->guid); + } + + if ($_SESSION['image_sort']) + $current = array_search($image_guid, $_SESSION['image_sort']); + } + + if ($current != 0) + $back = '<a href="' .$vars['url'] . 'pg/photos/view/' . $_SESSION['image_sort'][$current-1] . '">« ' . elgg_echo('image:back') . '</a>'; + + if (sizeof($_SESSION['image_sort']) > $current + 1) + $next = '<a href="' . $vars['url'] . 'pg/photos/view/' . $_SESSION['image_sort'][$current+1] . '">' . elgg_echo('image:next') . ' »</a>'; + + +?> +<div class="contentWrapper"> + <div id="tidypics_wrapper"> + + <div id="tidypics_breadcrumbs"> + <?php echo elgg_view('tidypics/breadcrumbs', array('album' => $album,) ); ?> <br /> + <?php + if (get_plugin_setting('view_count', 'tidypics') != "disabled") { + + $image->addView($viewer->guid); + $views = $image->getViews($viewer->guid); + if (is_array($views)) { + echo sprintf(elgg_echo("tidypics:views"), $views['total']); + if ($owner->guid == $viewer->guid) { + echo ' ' . sprintf(elgg_echo("tidypics:viewsbyowner"), $views['unique']); + } + else { + if ($views['mine']) + echo ' ' . sprintf(elgg_echo("tidypics:viewsbyothers"), $views['mine']); + } + } + } + ?> + </div> + + <div id="tidypics_desc"> + <?php echo autop($desc); ?> + </div> + <div id="tidypics_image_nav"> + <ul> + <li><?php echo $back; ?></li> + <li><?php echo $next; ?></li> + </ul> + </div> + <div id="tidypics_image_wrapper"> + <?php + // this code controls whether the photo is a hyperlink or not and what it links to + if (get_plugin_setting('download_link', 'tidypics') != "disabled") { + // admin allows downloads so default to inline download link + $image_html = "<a href=\"{$vars['url']}pg/photos/download/{$image_guid}/inline/\" title=\"{$title}\" >"; + $image_html .= "<img id=\"tidypics_image\" src=\"{$vars['url']}pg/photos/thumbnail/{$image_guid}/large/\" alt=\"{$title}\" />"; + $image_html .= "</a>"; + } else { + $image_html = "<img id=\"tidypics_image\" src=\"{$vars['url']}pg/photos/thumbnail/{$image_guid}/large/\" alt=\"{$title}\" />"; + } + // does any plugin want to override the link + $image_html = trigger_plugin_hook('tp_thumbnail_link', 'image', array('image' => $image), $image_html); + echo $image_html; + ?> + <div class="clearfloat"></div> + </div> +<?php + // image menu (start tagging, download, etc.) + + echo '<div id="tidypics_controls"><ul>'; + echo elgg_view('tidypics/image_menu', array('image_guid' => $image_guid, + 'viewer' => $viewer, + 'owner' => $owner, + 'anytags' => $image->isPhotoTagged(), + 'album' => $album, ) ); + echo '</ul></div>'; + + // tagging code - photo tags on images, photo tag listing and hidden divs used in tagging + if (get_plugin_setting('tagging', 'tidypics') != "disabled") { + echo elgg_view('tidypics/tagging', array( 'image' => $image, + 'viewer' => $viewer, + 'owner' => $owner, ) ); + } + + + if (get_plugin_setting('exif', 'tidypics') == "enabled") { +?> + <?php echo elgg_view('tidypics/exif', array('guid'=> $image_guid)); ?> +<?php } ?> + <div class="tidypics_info"> +<?php if (!is_null($tags)) { ?> + <div class="object_tag_string"><?php echo elgg_view('output/tags',array('value' => $tags));?></div> +<?php } + if (get_plugin_setting('photo_ratings', 'tidypics') == "enabled") { +?> + <div id="rate_container"> + <?php echo elgg_view('rate/rate', array('entity'=> $vars['entity'])); ?> +</div> +<?php + } + + echo elgg_echo('image:by');?> <b><a href="<?php echo $vars['url']; ?>pg/profile/<?php echo $owner->username; ?>"><?php echo $owner->name; ?></a></b> <?php echo $friendlytime; +?> + </div> + </div> <!-- tidypics wrapper--> +<?php + + echo elgg_view_comments($image); + + echo '<div class="clearfloat"></div>'; + + echo '</div>'; // content wrapper + + } // end of individual image display + + } + +?> + + diff --git a/plugins/tidypics/views/default/river/object/album/create.php b/plugins/tidypics/views/default/river/object/album/create.php new file mode 100644 index 00000000..20f9293d --- /dev/null +++ b/plugins/tidypics/views/default/river/object/album/create.php @@ -0,0 +1,42 @@ +<?php + + $performed_by = get_entity($vars['item']->subject_guid); + $album = get_entity($vars['item']->object_guid); + + $group_album = ($album->owner_guid != $album->container_guid); + if ($group_album) { + $group = get_entity($album->container_guid); + $group_name = $group->name; + $group_link = $group->getURL(); + } + + $url = "<a href=\"{$performed_by->getURL()}\">{$performed_by->name}</a>"; + $string = sprintf(elgg_echo("album:river:created"),$url) . " "; + $string .= "<a href=\"" . $album->getURL() . "\">" . $album->title . "</a>"; + if ($group_album) + $string .= ' ' . elgg_echo('album:river:group') . ' ' . "<a href=\"{$group_link}\" >{$group_name}</a>"; + + $album_river_view = get_plugin_setting('album_river_view', 'tidypics'); + + if ($album_river_view == "cover") { + if ($album->cover) { + $string .= "<div class=\"river_content\"> <img src=\"" . $CONFIG->wwwroot . 'mod/tidypics/thumbnail.php?file_guid=' . $album->cover . '&size=thumb" class="tidypics_album_cover" alt="thumbnail"/>' . "</div>"; + } + } else { + + $string .= "<div class=\"river_content\">"; + + $images = get_entities("object", "image", $album->guid, 'time_created desc', 7); + + if (count($images)) { + foreach($images as $image){ + $string .= "<a href=\"" . $image->getURL() . "\"> <img src=\"" . $CONFIG->wwwroot . 'mod/tidypics/thumbnail.php?file_guid=' . $image->guid . '&size=thumb" class="tidypics_album_cover" alt="thumbnail"/> </a>'; + } + } + + $string .= "</div>"; + } + +echo $string; + +?> diff --git a/plugins/tidypics/views/default/river/object/image/create.php b/plugins/tidypics/views/default/river/object/image/create.php new file mode 100644 index 00000000..2f1777f6 --- /dev/null +++ b/plugins/tidypics/views/default/river/object/image/create.php @@ -0,0 +1,29 @@ +<?php + + $performed_by = get_entity($vars['item']->subject_guid); + $image = get_entity($vars['item']->object_guid); + if($image->title) { + $title = $image->title; + } else { + $title = "untitled"; + } + + $url = "<a href=\"{$performed_by->getURL()}\">{$performed_by->name}</a>"; + $album = get_entity($image->container_guid); + + $album_link = "<a href='". $album->getURL() . "'>" . $album->title . "</a>"; + $image_link = "<a href=\"" . $image->getURL() . "\">" . $title . "</a>"; + + $string = sprintf(elgg_echo("image:river:created"),$performed_by->name, $image_link, $album_link); + + $string .= "<div class=\"river_content\">"; + +/* // this adds the album cover to the river display + $string .= "<a href=\"" . $album->getURL() . "\"> <img src=\"" . $CONFIG->wwwroot . 'mod/tidypics/thumbnail.php?file_guid=' . $album->cover . '&size=thumb" class="tidypics_album_cover" alt="thumbnail"/> </a>'; +*/ + $string .= "<a href=\"" . $image->getURL() . "\"> <img src=\"" . $CONFIG->wwwroot . 'mod/tidypics/thumbnail.php?file_guid=' . $image->guid . '&size=thumb" class="tidypics_album_cover" alt="thumbnail"/> </a>'; + $string .= "</div>"; + + echo $string; + +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/river/object/image/tag.php b/plugins/tidypics/views/default/river/object/image/tag.php new file mode 100644 index 00000000..1b3589af --- /dev/null +++ b/plugins/tidypics/views/default/river/object/image/tag.php @@ -0,0 +1,23 @@ +<?php + + $image = get_entity($vars['item']->subject_guid); + $person_tagged = get_entity($vars['item']->object_guid); + if($image->title) { + $title = $image->title; + } else { + $title = "untitled"; + } + + // viewer may not have permission to view image + if (!$image) + return; + + + $image_url = "<a href=\"{$image->getURL()}\">{$title}</a>"; + $person_url = "<a href=\"{$person_tagged->getURL()}\">{$person_tagged->name}</a>"; + + $string = $person_url . ' ' . elgg_echo('image:river:tagged') . ' ' . $image_url; + + echo $string; + +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/settings/tidypics/edit.php b/plugins/tidypics/views/default/settings/tidypics/edit.php new file mode 100644 index 00000000..eb391c8b --- /dev/null +++ b/plugins/tidypics/views/default/settings/tidypics/edit.php @@ -0,0 +1,12 @@ +<?php + global $CONFIG; + $system_url = $CONFIG->wwwroot . 'mod/tidypics/pages/server_analysis.php'; + $settings_url = $CONFIG->wwwroot . 'mod/tidypics/pages/admin.php'; +?> + +<p> +<a href="<?php echo $system_url; ?>">Run Server Analysis</a> +</p> +<p> +<a href="<?php echo $settings_url; ?>">Change Tidypics Settings</a> +</p> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/admin/help.php b/plugins/tidypics/views/default/tidypics/admin/help.php new file mode 100644 index 00000000..7f871598 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/admin/help.php @@ -0,0 +1,25 @@ +<br /> +<h3>White screen when uploading images</h3> +<p> +Tidypics tries to calculate the maximum size of an image that your server will support. If it +guesses incorrectly and someone uploads a photo that is too large, the script may crash when +resizing the image if you are using GD. The easiest way to test this is to set display_errors +to 1 in your .htaccess file and upload large images. If this causes a problem, a php memory error +should display on the screen. You can increased your php memory limit (see the docs directory). +A better option is to use ImageMagick if your server supports it (again see the docs directory). +</p><p> +If it is not a memory issue, you should see some other error appear. Once you have fixed the error, +change display_error back to 0. +</p> +<h3>Question mark images appear</h3> +<p> +If you see question mark images when you look at your albums, this means the resizing of the images +failed. This could be due to the memory limits as described above. There are other causes. Tidypics +tries to detect these problems and write the cause to the error log. You should check your server +error log right after an upload that results in a question mark for these error messages. The messages +will begin with "Tidypics warning:". It is possible if you have turned off php warnings that you will +not see these warnings. +</p><p> +Another possible cause is using ImageMagick when your server does not support it or specifying +the wrong path to the ImageMagick executables. +</p> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/admin/imagelib.php b/plugins/tidypics/views/default/tidypics/admin/imagelib.php new file mode 100644 index 00000000..b4656afe --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/admin/imagelib.php @@ -0,0 +1,62 @@ +<?php + + $img_type = get_subtype_id('object', 'image'); + $query = "SELECT count(guid) as total from {$CONFIG->dbprefix}entities where subtype={$img_type}"; + $total = get_data_row($query); + $num_images = $total->total; + + $img_type = get_subtype_id('object', 'album'); + $query = "SELECT count(guid) as total from {$CONFIG->dbprefix}entities where subtype={$img_type}"; + $total = get_data_row($query); + $num_albums = $total->total; + + $num_comments_photos = count_annotations(0, 'object', 'image', 'generic_comment'); + $num_comments_albums = count_annotations(0, 'object', 'album', 'generic_comment'); + + $num_views = count_annotations(0, 'object', 'image', 'tp_view'); + + if (get_plugin_setting('tagging', 'tidypics') != "disabled") + $num_tags = count_annotations(0, 'object', 'image', 'phototag'); +?> +<br /> +<h3>Overview</h3> +<p> +An image library is required by Tidypics to perform various manipulations: resizing on upload, watermarking, rotation, and cropping. +There are three image library options with Tidypics: PHP extension <a href="http://www.php.net/manual/en/book.image.php">GD</a>, +<a href="http://www.imagemagick.org/">ImageMagick</a> called via a system call, and the PHP extension +<a href="http://pecl.php.net/package/imagick/">imagick</a>. GD is the most common of the three on hosted servers but suffers +from serious memory usage problems when resizing photos. If you have access to ImageMagick (whether through system calls or the +PHP extension), we recommend that you use that. +</p> +<h3>Testing ImageMagick Commandline</h3> +<p> +To use the ImageMagick executables, PHP must be configured to allow calls to exec(). You can check our +<a href="<?php echo $CONFIG->wwwroot . 'mod/tidypics/pages/server_analysis.php'; ?>">server analysis page</a> to find out the +configuration of your server. Next, you need to determine the path to ImageMagick on your server. Your hosting service should +be able to provide this to you. You can test if the location is correct below. If successful, it should display the version of +ImageMagick installed on your server. +</p> +<br /> +<p> +<?php echo elgg_echo('tidypics:settings:im_path'); ?><br /> +<input name="im_location" type="text" /> +<input type="submit" value="Submit" onclick="TestImageMagickLocation();" /> +</p> +<div id="im_results"></div> + +<script type="text/javascript"> +function TestImageMagickLocation() +{ + var loc = $('input[name=im_location]').val(); + $("#im_results").html(""); + $.ajax({ + type: "GET", + url: "<?php echo $CONFIG->wwwroot . 'mod/tidypics/actions/imtest.php'; ?>", + data: {location: loc}, + cache: false, + success: function(html){ + $("#im_results").html(html); + } + }); +} +</script> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/admin/settings.php b/plugins/tidypics/views/default/tidypics/admin/settings.php new file mode 100644 index 00000000..ff7d330e --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/admin/settings.php @@ -0,0 +1,25 @@ +<?php + + echo elgg_view('output/longtext', array('value' => elgg_echo("tidypics:admin:instructions"))); + + global $CONFIG; + $system_url = $CONFIG->wwwroot . 'mod/tidypics/pages/server_analysis.php'; + $upgrade_url = $CONFIG->wwwroot . 'mod/tidypics/actions/upgrade.php'; + + $upgrade = false; + if (!get_subtype_class('object', 'image') || !get_subtype_class('object', 'album')) + $upgrade = true; +?> +<p> +<?php + if ($upgrade) { +?> +<a href="<?php echo $upgrade_url; ?>">Upgrade</a><br /> +<?php + } +?> +<a href="<?php echo $system_url; ?>">Run Server Analysis</a> +</p> +<?php + echo elgg_view("tidypics/forms/settings"); +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/admin/stats.php b/plugins/tidypics/views/default/tidypics/admin/stats.php new file mode 100644 index 00000000..aea5e75b --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/admin/stats.php @@ -0,0 +1,35 @@ +<?php + + $img_type = get_subtype_id('object', 'image'); + $query = "SELECT count(guid) as total from {$CONFIG->dbprefix}entities where subtype={$img_type}"; + $total = get_data_row($query); + $num_images = $total->total; + + $img_type = get_subtype_id('object', 'album'); + $query = "SELECT count(guid) as total from {$CONFIG->dbprefix}entities where subtype={$img_type}"; + $total = get_data_row($query); + $num_albums = $total->total; + + $num_comments_photos = count_annotations(0, 'object', 'image', 'generic_comment'); + $num_comments_albums = count_annotations(0, 'object', 'album', 'generic_comment'); + + $num_views = count_annotations(0, 'object', 'image', 'tp_view'); + + if (get_plugin_setting('tagging', 'tidypics') != "disabled") + $num_tags = count_annotations(0, 'object', 'image', 'phototag'); +?> +<p> +<br /> +Photos: <?php echo $num_images; ?><br /> +Albums: <?php echo $num_albums; ?><br /> +Comments on photos: <?php echo $num_comments_photos; ?><br /> +Comments on albums: <?php echo $num_comments_albums; ?><br /> +Total views: <?php echo $num_views; ?><br /> +<?php + if ($num_tags) { +?> +Photo tags: <?php echo $num_tags; ?><br /> +<?php + } +?> +</p> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/admin/thumbnails.php b/plugins/tidypics/views/default/tidypics/admin/thumbnails.php new file mode 100644 index 00000000..ccd88400 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/admin/thumbnails.php @@ -0,0 +1,33 @@ +<br /> +<h3>Overview</h3> +<p> +This page allows you to create thumbnails for images when the thumbnail creation failed during upload. +You may experience problems with thumbnail creation if your image library in not configured properly or +if there is not enough memory for the GD library to load and resize an image. If your users have +experienced problems with thumbnail creation and you have modified your setup, you can try to redo the +thumbnails. Find the unique identifier of the photo (it is the number near the end of the url when viewing +a photo) and enter it below. +</p> +<h3>Thumbnail Creation</h3> +<p> +<b><?php echo elgg_echo('tidypics:settings:im_id'); ?></b>: +<input name="image_id" type="text" /> +<input type="submit" value="Submit" onclick="TestThumbnailCreation();" /> +</p> +<div id="im_results"></div> +<script type="text/javascript"> +function TestThumbnailCreation() +{ + var image_id = $('input[name=image_id]').val(); + $("#im_results").html(""); + $.ajax({ + type: "GET", + url: "<?php echo $CONFIG->wwwroot . 'mod/tidypics/actions/create_thumbnails.php'; ?>", + data: {guid: image_id}, + cache: false, + success: function(html){ + $("#im_results").html(html); + } + }); +} +</script> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/admin/tidypics.php b/plugins/tidypics/views/default/tidypics/admin/tidypics.php new file mode 100644 index 00000000..fa518156 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/admin/tidypics.php @@ -0,0 +1,60 @@ +<?php + + global $CONFIG; + + $tab = $vars['tab']; + + $settingsselect = ''; + $statsselect = ''; + $imagelibselect = ''; + $thumbnailselect = ''; + $helpselect = ''; + switch($tab) { + case 'settings': + $settingsselect = 'class="selected"'; + break; + case 'stats': + $statsselect = 'class="selected"'; + break; + case 'imagelib': + $imagelibselect = 'class="selected"'; + break; + case 'thumbnail': + $thumbnailselect = 'class="selected"'; + break; + case 'help': + $helpselect = 'class="selected"'; + break; + } + +?> +<div class="contentWrapper"> + <div id="elgg_horizontal_tabbed_nav"> + <ul> + <li <?php echo $settingsselect; ?>><a href="<?php echo $CONFIG->wwwroot . 'mod/tidypics/pages/admin.php?tab=settings'; ?>"><?php echo elgg_echo('tidypics:settings'); ?></a></li> + <li <?php echo $statsselect; ?>><a href="<?php echo $CONFIG->wwwroot . 'mod/tidypics/pages/admin.php?tab=stats'; ?>"><?php echo elgg_echo('tidypics:stats'); ?></a></li> + <li <?php echo $imagelibselect; ?>><a href="<?php echo $CONFIG->wwwroot . 'mod/tidypics/pages/admin.php?tab=imagelib'; ?>"><?php echo elgg_echo('tidypics:settings:image_lib'); ?></a></li> + <li <?php echo $thumbnailselect; ?>><a href="<?php echo $CONFIG->wwwroot . 'mod/tidypics/pages/admin.php?tab=thumbnail'; ?>"><?php echo elgg_echo('tidypics:settings:thumbnail'); ?></a></li> + <li <?php echo $helpselect; ?>><a href="<?php echo $CONFIG->wwwroot . 'mod/tidypics/pages/admin.php?tab=help'; ?>"><?php echo elgg_echo('tidypics:settings:help'); ?></a></li> + </ul> + </div> +<?php + switch($tab) { + case 'settings': + echo elgg_view("tidypics/admin/settings"); + break; + case 'stats': + echo elgg_view("tidypics/admin/stats"); + break; + case 'imagelib': + echo elgg_view("tidypics/admin/imagelib"); + break; + case 'thumbnail': + echo elgg_view("tidypics/admin/thumbnails"); + break; + case 'help': + echo elgg_view("tidypics/admin/help"); + break; + } +?> +</div> diff --git a/plugins/tidypics/views/default/tidypics/albums.php b/plugins/tidypics/views/default/tidypics/albums.php new file mode 100644 index 00000000..42ac15af --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/albums.php @@ -0,0 +1,51 @@ +<?php + + //the number of albums to display + $number = (int)$vars['num_albums']; + if (!$number) + $number = 5; + + $owner = page_owner_entity(); + $owner_albums = get_entities("object", "album", page_owner(), "", $number, 0, false); + + echo '<div id="tidypics_album_widget_container">'; + + if ($owner_albums) { + foreach($owner_albums as $album) { + + if($album->cover) + $album_cover = '<img src="'.$vars['url'].'mod/tidypics/thumbnail.php?file_guid='.$album->cover.'&size=small" class="tidypics_album_cover" alt="' . $album->title . '"/>'; + else + $album_cover = '<img src="'.$vars['url'].'mod/tidypics/graphics/empty_album.png" class="tidypics_album_cover" alt="' . $album->title . '">'; +?> + <div class="tidypics_album_widget_single_item"> + <div class="tidypics_album_widget_title"><a href="<?php echo $album->getURL();?>"><?php echo $album->title;?></a></div> + <div class="tidypics_album_widget_timestamp"> <?php echo elgg_echo("album:created:on") . ' ' . friendly_time($album->time_created);?></div> +<?php + //get the number of comments + $numcomments = elgg_count_comments($album); + if ($numcomments) + echo "<a href=\"{$album->getURL()}\">" . sprintf(elgg_echo("comments")) . " (" . $numcomments . ")</a><br>"; +?> + <a href="<?php echo $album->getURL();?>"><?php echo $album_cover;?></a> + </div> +<?php + } //end of foreach loop + + // bottom link to all group/user albums + if (is_null($owner->username) || empty($owner->username)) { + echo '<p class="profile_info_edit_buttons"><a href="' . $vars['url'] . 'pg/photos/world">' . elgg_echo('album:all') . '</a></p>'; + } else { + echo '<p class="tidypics_download"><a href="' . $vars['url'] . 'pg/photos/owned/' . $owner->username . '">' . elgg_echo('album:more') . '</a></p>'; + } + + } + + if (can_write_to_container(0, $owner->guid)) { + echo '<p class="tidypics_download"><a href=' . $CONFIG->wwwroot .'pg/photos/new/' . $owner->username . '>' . elgg_echo("album:create") . '</a></p>'; + } + + + //close album_widget_container div + echo "</div>"; +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/breadcrumbs.php b/plugins/tidypics/views/default/tidypics/breadcrumbs.php new file mode 100644 index 00000000..c4d347e6 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/breadcrumbs.php @@ -0,0 +1,22 @@ +<?php + $file_guid = $vars['file_guid']; + $page_owner = page_owner_entity(); + + $first_level_text = ''; + $first_level_link = $CONFIG->wwwroot . "pg/photos/owned/" . $page_owner->username; + if (get_loggedin_userid() == $page_owner->guid) + $first_level_text = elgg_echo('album:yours'); + else + $first_level_text = sprintf(elgg_echo('album:user'), $page_owner->name); +?> +<a href="<?php echo $first_level_link; ?>"><?php echo $first_level_text; ?></a> +<?php + $second_level_text = ''; + if (isset($vars['album'])) { + $second_level_text = $vars['album']->title; + $second_level_link = $vars['album']->getURL(); +?> +>> <a href="<?php echo $second_level_link; ?>"><?php echo $second_level_text; ?></a> +<?php + } +?> diff --git a/plugins/tidypics/views/default/tidypics/content_wrapper.php b/plugins/tidypics/views/default/tidypics/content_wrapper.php new file mode 100644 index 00000000..757d069b --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/content_wrapper.php @@ -0,0 +1,10 @@ +<?php + echo elgg_view_title($vars['title']); +?> +<div class="contentWrapper"> +<div class="clearfloat"></div> +<?php + echo $vars['content']; +?> +<div class="clearfloat"></div> +</div> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/css.php b/plugins/tidypics/views/default/tidypics/css.php new file mode 100644 index 00000000..9d904a7f --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/css.php @@ -0,0 +1,301 @@ +<?php + /** + * tidypics CSS extender + */ +?> +/* ---- tidypics object views ---- */ + +#tidypics_wrapper { +} + +#tidypics_breadcrumbs { +margin:5px 0 15px 0; +font-size:80%; +} + +#tidypics_desc { +padding:0 20px; +font-style:italic; +} + +#tidypics_image_nav { +text-align:center; +} + +#tidypics_image_wrapper { +margin:10px 0 10px 0; +text-align:center; +} + +#tidypics_image { +border:1px solid #dedede; +padding:5px; +} + +#tidypics_image_nav ul li { +display:inline; +margin-right:15px; +} + +#tidypics_controls { +text-align:center; +margin-bottom:10px; +} + +#tidypics_controls a { +margin:10px; +} + +#tidypics_controls ul { +list-style:none; +margin:0px; +padding:8px; +} + +#tidypics_controls ul li { +padding:2px 10px 2px 22px; +margin:2px 0px; +display:inline; +} + +.tidypics_info { +padding:20px; +} + +#tidypics_exif { +padding-left:20px; +font-size:80%; +} + +.tidypics_album_images { +float:left; +width:153px; +height:153px; +margin:3px; +padding:4px; +border:1px solid #dedede; +text-align:center; +} + +.tidypics_album_cover { +padding:2px; +border:1px solid #dedede; +margin:5px 0; +} + +.tidypics_album_widget_single_item { +margin-bottom:8px; +} + +.tidypics_album_gallery_item { +float:left; +margin-bottom:20px; +padding: 4px; +text-align:center; +width: 160px; +} + +.tidypics_line_break { +width: 100%; +clear: both; +} + +.tidypics_gallery_title { +font-weight:bold; +} + +.tidypics_popup { +border:1px solid #3B5999; +width:200px; +position:absolute; +z-index:10000; +display:none; +background:#ffffff; +padding:10px; +font-size:12px; +text-align:left; +} + +/* ------ tidypics widget view ------ */ + +#tidypics_album_widget_container { +text-align:center; +} + +.tidypics_album_widget_timestamp { +color:#333333; +} + +.tidypics_widget_latest { +margin: 0 auto; +width: 208px; +} + +/* --------- image upload/edit forms ------------ */ + +#tidpics_image_upload_list li { +margin:3px 0; +} + +.tidypics_edit_image_container { +padding:5px; +margin:5px 0; +overflow:auto; +} + +.tidypics_edit_images { +float:right; +width:160px; +height:160px; +margin:4px; +padding:5px; +border:1px solid #dedede; +text-align:center; +} + +.tidypics_image_info { +float:left; +width:60%; +} + +.tidypics_image_info label { +font-size:1em; +} + +.tidypics_caption_input { + width:98%; + height:100px; +} + +/* ---- tidypics group css ----- */ + +#tidypics_group_profile { +-webkit-border-radius: 8px; +-moz-border-radius: 8px; +background:white none repeat scroll 0 0; +margin:0 0 20px; +padding:0 0 5px; +} + + +/* --------- tidypics river items ------------ */ + +.river_object_image_create { + background: url(<?php echo $vars['url']; ?>mod/tidypics/graphics/icons/river_icon_image.gif) no-repeat left -1px; +} +.river_object_album_create { + background: url(<?php echo $vars['url']; ?>mod/tidypics/graphics/icons/river_icon_album.gif) no-repeat left -1px; +} +.river_object_image_comment { + background: url(<?php echo $vars['url']; ?>_graphics/river_icons/river_icon_comment.gif) no-repeat left -1px; +} +.river_object_album_comment { + background: url(<?php echo $vars['url']; ?>_graphics/river_icons/river_icon_comment.gif) no-repeat left -1px; +} +.river_user_tag { + background: url(<?php echo $vars['url']; ?>mod/tidypics/graphics/icons/river_icon_tag.gif) no-repeat left -1px; +} + +/* ----------- tagging ---------------- */ +#tidypics_tag_instructions { +background:#BBDAF7; +border:1px solid #4690D6; +padding:10px; +height:25px; +min-width:360px; +display:none; +overflow:hidden; +position:absolute; +z-index:10000; +-webkit-border-radius: 8px; +-moz-border-radius: 8px; +} + +#tidypics_tag_instruct_text { +padding-top: 3px; +float: left; +} + +#tidypics_tag_instruct_button_div { +float: left; +margin-left: 15px; +} + +#tidypics_tag_instruct_button { +margin:0; +} + +#tidypics_tag_menu { +width:240px; +max-height:400px; +overflow:hidden; +-webkit-border-radius: 8px; +-moz-border-radius: 8px; +} + +.tidypics_popup_header { +width:100%; +margin-bottom:10px; +} + + +#tidypics_tagmenu_left { +width:175px; +float:left; +} + +#tidypics_tagmenu_right { +float:left; +} + +#tidypics_tagmenu_right .submit_button { +margin-top:2px; +} + +#tidypics_delete_tag_menu { +-webkit-border-radius: 8px; +-moz-border-radius: 8px; +overflow:hidden; +} + +.tidypics_tag { +display:none; +background:url(<?php echo $vars['url']; ?>mod/tidypics/graphics/spacer.gif); +border:2px solid #ffffff; +overflow:hidden; +position:absolute; +z-index:0; +} + +.tidypics_tag_text { +display:none; +overflow:hidden; +position:absolute; +z-index:0; +text-align:center; +background:#BBDAF7; +border:1px solid #3B5999; +-webkit-border-radius:3px; +-moz-border-radius:3px; +padding:1px; +} + +#tidypics_phototags_list { +padding:0 20px 0 20px; +} + +#tidypics_phototags_list ul { +list-style:none; +margin:0px; +padding:8px; +} + +#tidypics_phototags_list ul li { +padding-right:10px; +margin:2px 0px; +display:inline; +} + +#tidypics_image_upload_list { +list-style: none; +} \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/exif.php b/plugins/tidypics/views/default/tidypics/exif.php new file mode 100644 index 00000000..0100ac57 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/exif.php @@ -0,0 +1,14 @@ +<?php + + $guid = $vars['guid']; + + $exif = tp_exif_formatted($guid); + if ($exif) { + echo '<div id="tidypics_exif">'; + foreach ($exif as $name => $value) { + echo $name . ': ' . $value . '<br />'; + } + echo '</div>'; + } + +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/forms/edit.php b/plugins/tidypics/views/default/tidypics/forms/edit.php new file mode 100644 index 00000000..1758d14f --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/forms/edit.php @@ -0,0 +1,128 @@ +<?php + /** + * Tidypics images edit/add form + * This form is used to: + * - create albums + * - edit albums + * - edit images + */ + + //set stuff if we are editing existing album or image + if (isset($vars['entity'])) { + $action = "tidypics/edit"; + $title = $vars['entity']->title; + $body = $vars['entity']->description; + $tags = $vars['entity']->tags; + $access_id = $vars['entity']->access_id; + $subtype = $vars['subtype']; + + // if nothing is sent, create new, but only new albums are sent here + // new images are sent to upload.php + } else { + $action = "tidypics/addalbum"; + $tags = ""; + $title = ""; + $body = ""; + if (defined('ACCESS_DEFAULT')) + $access_id = ACCESS_DEFAULT; + else + $access_id = 1; // logged_in by default + $subtype = 'album'; + + $title = $_SESSION['tidypicstitle']; + $body = $_SESSION['tidypicsbody']; + $tags = $_SESSION['tidypicstags']; + + unset($_SESSION['tidypicstitle']); + unset($_SESSION['tidypicsbody']); + unset($_SESSION['tidypicstags']); + } + + // group or individual + $container_guid = page_owner(); + +?> +<div class="contentWrapper"> + <form action="<?php echo $vars['url']; ?>action/<?php echo $action; ?>" method="post"> + <p> + <label><?php echo elgg_echo('album:title'); ?></label> + <?php echo elgg_view("input/text", array("internalname" => "tidypicstitle", "value" => $title,)); ?> + </p> +<?php + if ($subtype == 'album') { +?> + <p> + <label><?php echo elgg_echo('album:desc'); ?></label> + <?php echo elgg_view("input/longtext",array("internalname" => "tidypicsbody","value" => $body,)); ?> + </p> +<?php + } else { +?> + <p> + <label><?php echo elgg_echo('caption'); ?></label> + <?php echo elgg_view("input/longtext",array("internalname" => "tidypicsbody","value" => $body,"class" => 'tidypics_caption_input')); ?> + </p> +<?php + } +?> + <p> + <label><?php echo elgg_echo("tags"); ?></label> + <?php echo elgg_view("input/tags", array( "internalname" => "tidypicstags","value" => $tags,)); ?> + </p> + +<?php + if ($subtype == 'image') { + $container_guid = $vars['entity']->container_guid; + + // should this image be the cover for the album - only ask for non-cover photos + // determine if it is already the cover + $img_guid = $vars['entity']->guid; + $album = get_entity($container_guid); + $cover_guid = $album->cover; + + if ($cover_guid != $img_guid) { + +?> + <p> +<?php echo elgg_view('input/checkboxes', array('internalname' => "cover", + 'options' => array(elgg_echo("album:cover")), + )); +?> + </p> +<?php + } + + } else { + // album so display access control + + $categories = elgg_view('categories',$vars); + if (!empty($categories)) { +?> + <p> + <?php echo $categories; ?> + </p> + +<?php + } +?> + <p> + <label><?php echo elgg_echo('access'); ?></label> + <?php echo elgg_view('input/access', array('internalname' => 'access_id','value' => $access_id)); ?> + </p> + +<?php + } + + if (isset($vars['entity'])) { +?> + <input type="hidden" name="guid" value="<?php echo $vars['entity']->getGUID(); ?>" /> +<?php + } + + echo elgg_view('input/securitytoken'); +?> + <input type="hidden" name="container_guid" value="<?php echo $container_guid; ?>" /> + <input type="hidden" name="subtype" value="<?php echo $subtype; ?>" /> + <p><input type="submit" name="submit" value="<?php echo elgg_echo('save'); ?>" /></p> + </form> +</div> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/forms/edit_multi.php b/plugins/tidypics/views/default/tidypics/forms/edit_multi.php new file mode 100644 index 00000000..4031b796 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/forms/edit_multi.php @@ -0,0 +1,58 @@ +<?php + /** + * form for mass editing all uploaded images + */ +?> +<div class="contentWrapper"> +<form action="<?php echo $vars['url']; ?>action/tidypics/edit_multi" method="post"> +<?php + + $file_array = $vars['file_array']; + + // make sure one of the images becomes the cover if there isn't one already + $album_entity = get_entity($vars['album_guid']); + if (!$album_entity->cover) $no_cover = true; + + foreach ($file_array as $key => $file_guid){ + $entity = get_entity($file_guid); + $guid = $entity->guid; + $body = $entity->description; + $title = $entity->title; + $tags = $entity->tags; + $container_guid = $entity->container_guid; + + // first one is default cover if there isn't one already + if ($no_cover) { + $val = $guid; + $no_cover = false; + } + + echo '<div class="tidypics_edit_image_container">'; + echo '<img src="' . $vars['url'] . 'mod/tidypics/thumbnail.php?file_guid=' . $guid . '&size=small" class="tidypics_edit_images" alt="' . $title . '"/>'; + echo '<div class="tidypics_image_info">'; + echo '<p><label>' . elgg_echo('album:title') . '</label>'; + echo elgg_view("input/text", array("internalname" => "title[$key]", "value" => $title,)) . "\n"; + echo '</p>'; + echo '<p><label>' . elgg_echo('caption') . "</label>"; + echo elgg_view("input/longtext",array("internalname" => "caption[$key]", "value" => $body, "class" => 'tidypics_caption_input',)) . "\n"; + echo "</p>"; + echo '<p><label>' . elgg_echo("tags") . "</label>\n"; + echo elgg_view("input/tags", array( "internalname" => "tags[$key]","value" => $tags)) . "\n"; + echo '</p>'; + echo '<input type="hidden" name="image_guid[' .$key. ']" value="'. $guid .'">' . "\n"; + echo elgg_view('input/securitytoken'); + + echo elgg_view("input/radio", array("internalname" => "cover", + "value" => $val, + 'options' => array( elgg_echo('album:cover') => $guid, + ), + )); + echo '</div>'; + echo '</div>'; + } + +?> +<input type="hidden" name="container_guid" value="<?php echo $container_guid; ?>" /> +<p><input type="submit" name="submit" value="<?php echo elgg_echo('save'); ?>" /></p> +</form> +</div> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/forms/settings.php b/plugins/tidypics/views/default/tidypics/forms/settings.php new file mode 100644 index 00000000..0729b536 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/forms/settings.php @@ -0,0 +1,158 @@ +<?php + /** + * Tidypics admin settings form + */ + + + + $action = $vars['url'] . 'action/tidypics/settings'; + + $plugin = find_plugin_settings('tidypics'); + + + // bootstrap the plugin version here for now + if (!$plugin->version) { + set_plugin_setting('version', 1.62, 'tidypics'); + } + + + // Main settings + $form_body = '<h3>' . elgg_echo('tidypics:settings:heading:main') . '</h3>'; + + // Tagging + $tagging = $plugin->tagging; + if(!$tagging) $tagging = "enabled"; + $form_body .= '<p class="admin_debug">' . elgg_view("input/checkboxes", array('options' => array(elgg_echo('tidypics:settings:tagging') => 'enabled'), 'internalname' => 'tagging', 'value' => $tagging )) . "</p>"; + + // Download Link + $download_link = $plugin->download_link; + if(!$download_link) $download_link = "enabled"; + $form_body .= '<p class="admin_debug">' . elgg_view("input/checkboxes", array('options' => array(elgg_echo('tidypics:settings:download_link') => 'enabled'), 'internalname' => 'download_link', 'value' => $download_link )) . "</p>"; + + // Ratings + $photo_ratings = $plugin->photo_ratings; + if(!$photo_ratings) $photo_ratings = "disabled"; + $form_body .= '<p class="admin_debug">' . elgg_view("input/checkboxes", array('options' => array(elgg_echo('tidypics:settings:photo_ratings') => 'enabled'), 'internalname' => 'photo_ratings', 'value' => $photo_ratings )) . "</p>"; + + // Show EXIF + $exif = $plugin->exif; + if(!$exif) $exif = "disabled"; + $form_body .= '<p class="admin_debug">' . elgg_view("input/checkboxes", array('options' => array(elgg_echo('tidypics:settings:exif') => 'enabled'), 'internalname' => 'exif', 'value' => $exif )) . "</p>"; + + // Show View count + $view_count = $plugin->view_count; + if(!$view_count) $view_count = "enabled"; + $form_body .= '<p class="admin_debug">' . elgg_view("input/checkboxes", array('options' => array(elgg_echo('tidypics:settings:view_count') => 'enabled'), 'internalname' => 'view_count', 'value' => $view_count )) . "</p>"; + + // Watermark Text + $form_body .= "<p>" . elgg_echo('tidypics:settings:watermark') . "<br />"; + $form_body .= elgg_view("input/text",array('internalname' => 'params[watermark_text]', 'value' => $plugin->watermark_text)) . "</p>"; + + // Max Image Size + $maxfilesize = $plugin->maxfilesize; + if (!$maxfilesize) $maxfilesize = (int)5; // 5 MB + $form_body .= "<p>" . elgg_echo('tidypics:settings:maxfilesize') . "<br />"; + $form_body .= elgg_view("input/text",array('internalname' => 'params[maxfilesize]', 'value' => $maxfilesize)) . "</p>"; + + // Quota Size + $quota = $plugin->quota; + if (!$quota) $quota = 0; + $form_body .= "<p>" . elgg_echo('tidypics:settings:quota') . "<br />"; + $form_body .= elgg_view("input/text",array('internalname' => 'params[quota]', 'value' => $quota)) . "</p>"; + + // Image Library + if (extension_loaded('imagick')) { + $img_lib_options['ImageMagickPHP'] = 'imagick PHP extension'; + } + + $disablefunc = explode(',', ini_get('disable_functions')); + if (is_callable('exec') && !in_array('exec',$disablefunc)) { + $img_lib_options['ImageMagick'] = 'ImageMagick Cmdline'; + } + + $img_lib_options['GD'] = 'GD'; + + $form_body .= '<h3>' . elgg_echo('tidypics:settings:heading:img_lib') . '</h3>'; + $image_lib = $plugin->image_lib; + if (!$image_lib) $image_lib = 'GD'; + $form_body .= '<p>' . elgg_echo('tidypics:settings:image_lib') . ': '; + $form_body .= elgg_view('input/pulldown', array( + 'internalname' => 'params[image_lib]', + 'options_values' => $img_lib_options, + 'value' => $image_lib + )); + $form_body .= '<br/>Note: If you want to select ImageMagick Command Line, first confirm that it is installed on your server.</p>'; + + if (is_callable('exec') && !in_array('exec',$disablefunc)) { + // Image Magick Path + $im_path = $plugin->im_path; + if(!$im_path) $im_path = "/usr/bin/"; + $form_body .= "<p>" . elgg_echo('tidypics:settings:im_path') . "<br />"; + $form_body .= elgg_view("input/text",array('internalname' => 'params[im_path]', 'value' => $im_path)) . "</p>"; + } + + + // River Image options + $form_body .= '<h3>' . elgg_echo('tidypics:settings:heading:river') . '</h3>'; + $img_river_view = $plugin->img_river_view; + if (!$img_river_view) $img_river_view = '1'; + $form_body .= '<p>' . elgg_echo('tidypics:settings:img_river_view'); + $form_body .= elgg_view('input/pulldown', array( + 'internalname' => 'params[img_river_view]', + 'options_values' => array( + 'all' => 'all', + '1' => '1', + 'none' => 'none', + ), + 'value' => $img_river_view + )); + $form_body .= '</p>'; + + // River Album options + $album_river_view = $plugin->album_river_view; + if (!$album_river_view) $album_river_view = 'set'; + $form_body .= '<p>' . elgg_echo('tidypics:settings:album_river_view'); + $form_body .= elgg_view('input/pulldown', array( + 'internalname' => 'params[album_river_view]', + 'options_values' => array( + 'cover' => 'cover', + 'set' => 'set', + ), + 'value' => $album_river_view + )); + $form_body .= '</p>'; + + // Thumbnail sizes + $form_body .= '<h3>' . elgg_echo('tidypics:settings:heading:sizes') . '</h3>'; + $form_body .= "<h6>You must edit the css if you change the default sizes</h6>"; + $image_sizes = $plugin->image_sizes; + if(!$image_sizes) { + $image_sizes = array(); // set default values + $image_sizes['large_image_width'] = $image_sizes['large_image_height'] = 600; + $image_sizes['small_image_width'] = $image_sizes['small_image_height'] = 153; + $image_sizes['thumb_image_width'] = $image_sizes['thumb_image_height'] = 60; + } else { + $image_sizes = unserialize($image_sizes); + } + $form_body .= "<p>" . elgg_echo('tidypics:settings:largesize') . "<br />"; + $form_body .= 'width: <input style="width: 20%;" type="text" name="large_thumb_width" value=' . "\"{$image_sizes['large_image_width']}\"" . ' class="input-text" /> '; + $form_body .= 'height: <input style="width: 20%;" type="text" name="large_thumb_height" value=' . "\"{$image_sizes['large_image_height']}\"" . ' class="input-text" /></p>'; + + $form_body .= "<p>" . elgg_echo('tidypics:settings:smallsize') . "<br />"; + $form_body .= 'width and height: <input style="width: 20%;" type="text" name="small_thumb_width" value=' . "\"{$image_sizes['small_image_width']}\"" . ' class="input-text" /> '; + //$form_body .= 'height: <input style="width: 20%;" type="text" name="small_thumb_height" value=' . "\"{$image_sizes['small_image_height']}\"" . ' class="input-text" /></p>'; + + $form_body .= "<p>" . elgg_echo('tidypics:settings:thumbsize') . "<br />"; + $form_body .= 'width and height: <input style="width: 20%;" type="text" name="thumb_width" value=' . "\"{$image_sizes['thumb_image_width']}\"" . ' class="input-text" /> '; + //$form_body .= 'height: <input style="width: 20%;" type="text" name="thumb_height" value=' . "\"{$image_sizes['thumb_image_height']}\"" . ' class="input-text" /></p>'; + + + // Group permission override + $form_body .= '<h3>' . elgg_echo('tidypics:settings:heading:groups') . '</h3>'; + $grp_perm_override = $plugin->grp_perm_override; + if(!$grp_perm_override) $grp_perm_override = "enabled"; + $form_body .= '<p class="admin_debug">' . elgg_view("input/checkboxes", array('options' => array(elgg_echo('tidypics:settings:grp_perm_override') => 'enabled'), 'internalname' => 'grp_perm_override', 'value' => $grp_perm_override )) . "</p>"; + + $form_body .= elgg_view('input/submit', array('value' => elgg_echo("save"))); + + echo elgg_view('input/form', array('action' => $action, 'body' => $form_body)); diff --git a/plugins/tidypics/views/default/tidypics/forms/setupFlickr.php b/plugins/tidypics/views/default/tidypics/forms/setupFlickr.php new file mode 100644 index 00000000..8c31d088 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/forms/setupFlickr.php @@ -0,0 +1,42 @@ +<?php +require_once( dirname(dirname(dirname(dirname(dirname(__FILE__)))))) . "/lib/flickr.php"; + +$user = get_loggedin_user(); +$flickr_username = get_metadata_byname( $user->guid, "flickr_username" ); +$flickr_album_id = get_metadata_byname( $user->guid, "flickr_album_id" ); + +$action = $vars['url'] . 'action/tidypics/flickrSetup'; + +$form_body = "<p>". elgg_echo( 'flickr:intro' ) . "</p><p>"; +$form_body .= elgg_echo( 'flickr:usernamesetup') . " <input style='width: 20%;' type='text' name='flickr_username' value='$flickr_username->value' ' class='input-text' /> <br />"; +$form_body .= "<input type='hidden' name='return_url' value='$_SERVER[REQUEST_URI]' />"; + +$albums = get_entities( "object", "album", $user->guid ); +$options = array( 0 => elgg_echo( 'flickr:selectalbum' )); +foreach( $albums as $album ) { + $title = $album->title; + switch( $album->access_id ) { + case ACCESS_PRIVATE: + $title .= " (" . elgg_echo( 'private' ) . ")"; + break; + case ACCESS_PUBLIC: + $title .= " (" . elgg_echo( 'public' ) . ")"; + break; + default: + $title .= " (no known permission set)"; + break; + } + $options[$album->guid] = $title; +} + +$form_body .= "<br />" . elgg_echo( 'flickr:albumdesc' ); +$form_body .= elgg_view('input/pulldown', array('internalname' => 'album_id', + 'options_values' => $options, + 'value' => $flickr_album_id->value )); +$form_body .= "<br />"; +$form_body .= elgg_view('input/submit', array('value' => elgg_echo("save"))); + +flickr_menu(); + +echo elgg_view('input/form', array('action' => $action, 'body' => $form_body)); +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/forms/upload.php b/plugins/tidypics/views/default/tidypics/forms/upload.php new file mode 100644 index 00000000..6e755612 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/forms/upload.php @@ -0,0 +1,99 @@ +<?php + global $CONFIG; + + //this is for image uploads only. Image edits are handled by edit.php form + + $container_guid = get_input('container_guid'); + $album = get_entity($vars['album']); + $access_id = $album->access_id; + + $maxfilesize = (float) get_plugin_setting('maxfilesize','tidypics'); + if (!$maxfilesize) + $maxfilesize = 5; + + $quota = get_plugin_setting('quota','tidypics'); + if ($quota) { + $image_repo_size_md = get_metadata_byname($album->container_guid, "image_repo_size"); + $image_repo_size = (int)$image_repo_size_md->value; + $image_repo_size = $image_repo_size / 1024 / 1024; + $quote_percentage = round(100 * ($image_repo_size / $quota)); + // for small quotas, so one decimal place + if ($quota < 10) { + $image_repo_size = sprintf('%.1f', $image_repo_size); + } else { + $image_repo_size = round($image_repo_size); + } + if ($image_repo_size > $quota) { + $image_repo_size = $quota; + } + } + +?> +<div id="tidypics_ref"></div> +<div class="contentWrapper"> +<?php + ob_start(); +?> +<p style="line-height:1.6em;"> + <label><?php echo elgg_echo("images:upload"); ?></label><br /> + <i><?php echo elgg_echo("tidypics:settings:maxfilesize") . ' ' . $maxfilesize; ?></i><br /> +<?php + if ($quota) { +?> + <i><?php echo elgg_echo("tidypics:quota") . ' ' . $image_repo_size . '/' . $quota . " MB ({$quote_percentage}%)"; ?></i><br /> +<?php + } +?> + <div class="tidypics_popup"> + <?php echo elgg_echo("tidypics:uploading:images"); ?><br /> + <div style="margin:20px 0px 20px 80px;"><img id="progress" alt="..." border="0" src="<?php echo $vars['url'].'mod/tidypics/graphics/loader.gif' ?>" /></div> + </div> + <ol id="tidypics_image_upload_list"> +<?php + for ($x = 0; $x < 10; $x++) { + echo '<li>' . elgg_view("input/file",array('internalname' => "upload_$x")) . '</li>'; + } +?> + </ol> +</p> +<p> +<?php + if ($container_guid) + echo '<input type="hidden" name="container_guid" value="' . $container_guid . '" />'; + if ($access_id) + echo '<input type="hidden" name="access_id" value="' . $access_id . '" />'; +?> + <input type="submit" value="<?php echo elgg_echo("save"); ?>" onclick="displayProgress();" /> +</p> +<?php + $form_body = ob_get_clean(); + + echo elgg_view('input/form', array( 'action' => "{$vars['url']}action/tidypics/upload", + 'body' => $form_body, + 'internalid' => 'tidypicsUpload', + 'enctype' => 'multipart/form-data', + 'method' => 'post',)); +?> +</div> +<script type="text/javascript"> + + function displayProgress() + { + offsetY = 60; + offsetX = 120; + + divWidth = $('#tidypics_ref').width(); + imgOffset = $('#tidypics_ref').offset(); + imgWidth = $('#tidypics_ref').width(); + + _top = imgOffset.top + offsetY; + _left = imgOffset.left + offsetX; + + $('.tidypics_popup').show().css({ + "top": _top + "px", + "left": _left + "px" + }); + + setTimeout('document.images["progress"].src = "<?php echo $vars['url'].'mod/tidypics/graphics/loader.gif' ?>"', 200); + } +</script> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/gallery.php b/plugins/tidypics/views/default/tidypics/gallery.php new file mode 100644 index 00000000..74aa3450 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/gallery.php @@ -0,0 +1,67 @@ +<?php +/** + * view a gallery of photos or albums + * + */ + +// four albums across +$num_wide = 4; + +$context = $vars['context']; +$offset = $vars['offset']; +$entities = $vars['entities']; +$limit = $vars['limit']; +$count = $vars['count']; +$baseurl = $vars['baseurl']; +$context = $vars['context']; +$viewtype = $vars['viewtype']; +$pagination = $vars['pagination']; +$fullview = $vars['fullview']; + +$html = ""; +$nav = ""; + +if (isset($vars['viewtypetoggle'])) { + $viewtypetoggle = $vars['viewtypetoggle']; +} else { + $viewtypetoggle = true; +} + +if ($context == "search" && $count > 0 && $viewtypetoggle) { + $nav .= elgg_view('navigation/viewtype', array( + 'baseurl' => $baseurl, + 'offset' => $offset, + 'count' => $count, + 'viewtype' => $viewtype, + )); +} + +if ($pagination) { + $nav .= elgg_view('navigation/pagination',array( + 'baseurl' => $baseurl, + 'offset' => $offset, + 'count' => $count, + 'limit' => $limit, + )); +} + +$html .= $nav; + +if (is_array($entities) && sizeof($entities) > 0) { + $counter = 0; + foreach($entities as $entity) { + if ($counter % $num_wide == 0) { + $html .= "<div class=\"tidypics_line_break\"></div>"; + } + $html .= elgg_view_entity($entity, $fullview); + $counter++; + } +} + +$html .= '<div class="clearfloat"></div>'; + +if ($count) { + $html .= $nav; +} + +echo $html; \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/groupprofile_albums.php b/plugins/tidypics/views/default/tidypics/groupprofile_albums.php new file mode 100644 index 00000000..7cb89bf1 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/groupprofile_albums.php @@ -0,0 +1,18 @@ +<?php + +/*********************************************** + * + * This is used on the group profile page + * + ***********************************************/ + +if ($vars['entity']->photos_enable != 'no') { + echo '<div id="tidypics_group_profile">'; +?> + <h2><a href="<?php echo $CONFIG->wwwroot . "pg/photos/owned/group:" . $vars['entity']->guid; ?>">Group albums</a></h2> +<?php + //echo '<h2>' . elgg_echo('album:group') . '</h2>'; + echo elgg_view('tidypics/albums', array('num_albums' => 5)); + echo '</div>'; +} +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/hover_menu.php b/plugins/tidypics/views/default/tidypics/hover_menu.php new file mode 100644 index 00000000..240891f5 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/hover_menu.php @@ -0,0 +1,12 @@ +<?php + + /** + * Elgg hoverover extender for tidypics + * + */ + +?> + + <p class="user_menu_file <?php if(get_context() == 'photos') echo 'profile_select';?>"> + <a href="<?php echo $vars['url']; ?>pg/photos/owned/<?php echo $vars['entity']->username; ?>"><?php echo elgg_echo("albums"); ?></a> + </p> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/image_menu.php b/plugins/tidypics/views/default/tidypics/image_menu.php new file mode 100644 index 00000000..498cfe72 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/image_menu.php @@ -0,0 +1,51 @@ +<?php + + /************************************************************************** + * + * Tidypics Image Menu + * + * This is the menu that appears below an image. Admins can override the + * menu with a different view to provide a look and feel that matches + * their themes. The view can be extended to provide additional controls. + * + **************************************************************************/ + + $image_guid = $vars['image_guid']; + $viewer = $vars['viewer']; + $owner = $vars['owner']; + $anytags = $vars['anytags']; + $album = $vars['album']; + + if (get_plugin_setting('tagging', 'tidypics') != "disabled") { + + $can_tag = false; + + $container = get_entity($album->container_guid); + if ($container instanceof ElggGroup) { + $can_tag = $viewer && $container->isMember($viewer); + } else { + $can_tag = $viewer && $viewer->guid == $owner->guid || user_is_friend($owner->guid, $viewer->guid); + } + + // only owner and friends of owner can tag + if ($can_tag) { +?> +<li id="start_tagging"><a id="tidypics_tag_control" href="javascript:void(0)" onclick="startTagging()"><?php echo elgg_echo('tidypics:tagthisphoto'); ?></a></li> +<?php + } + + // only owner can delete tags + if ($anytags && $viewer && $viewer->guid == $owner->guid) { +?> +<li id="delete_tags"><a href="javascript:void(0)" onclick="deleteTags()"><?php echo elgg_echo('tidypics:deletetag'); ?></a></li> +<?php + } + } + + if (get_plugin_setting('download_link', 'tidypics') != "disabled") { + $download_url = $vars['url'] . "pg/photos/download/{$image_guid}/"; +?> +<li id="download_image"><a href="<?php echo $download_url; ?>"><?php echo elgg_echo("image:download"); ?></a></li> +<?php + } +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/tidypics/js/slideshow.php b/plugins/tidypics/views/default/tidypics/js/slideshow.php new file mode 100644 index 00000000..d134ca80 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/js/slideshow.php @@ -0,0 +1,2 @@ + +<script type="text/javascript" src="<?php echo $vars['url']; ?>mod/tidypics/vendors/PicLensLite/piclens_optimized.js"></script> diff --git a/plugins/tidypics/views/default/tidypics/js/tagging.php b/plugins/tidypics/views/default/tidypics/js/tagging.php new file mode 100644 index 00000000..3ffa20cf --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/js/tagging.php @@ -0,0 +1,304 @@ +<?php + $photo_tags_json = $vars['photo_tags_json']; +?> + +<script type="text/javascript" src="<?php echo $vars['url'] ?>mod/tidypics/vendors/jquery.imgareaselect-0.7.js"></script> +<script type="text/javascript" src="<?php echo $vars['url'] ?>mod/tidypics/vendors/jquery.quicksearch.js"></script> + +<script type="text/javascript"> + + var coordinates = ""; + var user_id = 0; + var tagging = 0; + + // add to DOM as soon as ready + $(document).ready(function () { + $('ul#tidypics_phototag_list li').quicksearch({ + position: 'before', + attached: 'ul#tidypics_phototag_list', + loaderText: '', + inputClass: 'input-filter', + delay: 100 + }); + + $('#quicksearch').submit( function () { addTag() } ); + } + ); + + // images are loaded so process tags + $(window).load(function () { + $('#tidypics_image').setupTags(); + } + ); + + // get tags over image ready for mouseover + // based on code by Tarique Sani tarique at sanisoft.com - MIT and GPL licenses + $.fn.setupTags = function() + { + + image = this; + + imgOffset = $(image).offset(); + imgOffset.left = parseInt(imgOffset.left) + parseInt($(image).css("border-left-width")) + parseInt($(image).css("padding-left")); + imgOffset.top = parseInt(imgOffset.top) + parseInt($(image).css("border-top-width")) + parseInt($(image).css("padding-top")); + + tags = <?php echo $photo_tags_json; ?>; + + $(tags).each(function(){ + appendTag(imgOffset, this); + }); + + $(image).hover( + function(){ + $('.tidypics_tag').show(); + }, + function(){ + $('.tidypics_tag').hide(); + } + ); + + addTagEvents(); + + $('.tidypics_phototag_links').hover( + function(){ + code = this.id.substr(7); // cut off taglink to get unique id + $('#tag'+code).show(); + }, + function(){ + code = this.id.substr(7); + $('#tag'+code).hide(); + } + ); + + // make sure we catch and handle when the browser is resized + $(window).resize(function () { + $('.tidypics_tag').remove(); + + imgOffset = $(image).offset(); + + $(tags).each(function(){ + appendTag(imgOffset, this); + }); + + addTagEvents(); + }); + } + + function appendTag(offset, tag) + { + // catch for IE when no tags available + if (tag.id == undefined) + return; + + tag_top = parseInt(imgOffset.top) + parseInt(tag.y1); + tag_left = parseInt(imgOffset.left) + parseInt(tag.x1); + + tag_div = $('<div class="tidypics_tag" id="tag'+tag.id+'"></div>').css({ left: tag_left + 'px', top: tag_top + 'px', width: tag.width + 'px', height: tag.height + 'px' }); + + text_top = parseInt(tag_top) + parseInt(tag.height) + 5; + + tag_text_div = $('<div class="tidypics_tag_text">'+tag.text+'</div>').css({ left: tag_left + 'px', top: text_top + 'px', width: '120px'}); + + $('body').append(tag_div); + $('body').append(tag_text_div); + } + + function addTagEvents() + { + $('.tidypics_tag').hover( + function(){ + $('.tidypics_tag').show(); + $(this).next('.tidypics_tag_text').show(); + $(this).next('.tidypics_tag_text').css("z-index", 10000); + }, + function(){ + $('.tidypics_tag').show(); + $(this).next('.tidypics_tag_text').hide(); + $(this).next('.tidypics_tag_text').css("z-index", 0); + } + ); + } + + + function selectUser(id, name) + { + user_id = id; + $("input.input-filter").val(name); + } + + function startTagging() + { + if (tagging != 0) + { + stopTagging(); + return; + } + + tagging = 1; + + $('#tidypics_tag_control').text("<?php echo elgg_echo('tidypics:finish_tagging'); ?>"); + + showTagInstruct(); + $('#tidypics_delete_tag_menu').hide(); + + $('#tidypics_image').hover( + function(){ + $('.tidypics_tag').hide(); + }, + function(){ + $('.tidypics_tag').hide(); + } + ); + + $('img#tidypics_image').imgAreaSelect( { + borderWidth: 2, + borderColor1: 'white', + borderColor2: 'white', + disable: false, + hide: false, + onSelectEnd: showTagMenu, + onSelectStart: hideTagMenu + } + ); + + $('img#tidypics_image').css({"cursor" : "crosshair"}); + } + + function stopTagging() + { + tagging = 0; + + hideTagInstruct(); + hideTagMenu(); + + $('img#tidypics_image').imgAreaSelect( {hide: true, disable: true} ); + + $('#tidypics_tag_control').text("<?php echo elgg_echo('tidypics:tagthisphoto'); ?>"); + + // restart tag hovering + $('#tidypics_image').hover( + function(){ + $('.tidypics_tag').show(); + }, + function(){ + $('.tidypics_tag').hide(); + } + ); + + $('img#tidypics_image').css({"cursor" : "pointer"}); + } + + function showTagMenu(oObject, oCoordenates) + { + offsetX = 6; + offsetY = 10; + + imgOffset = $('#tidypics_image').offset(); + + // show the list of friends + if (oCoordenates.width != 0 && oCoordenates.height != 0) { + coordinates = oCoordenates; + + _top = imgOffset.top + oCoordenates.y2 + offsetY; + _left = imgOffset.left + oCoordenates.x1 + offsetX; + + $('#tidypics_tag_menu').show().css({ + "top": _top + "px", + "left": _left + "px" + }); + + $(".input-filter").focus(); + } + } + + + function hideTagMenu() + { + $('#tidypics_tag_menu').hide(); + } + + function showTagInstruct() + { + offsetY = -60; + + divWidth = $('#tidypics_tag_instructions').width(); + imgOffset = $('#tidypics_image').offset(); + imgWidth = $('#tidypics_image').width(); + offsetX = parseInt((imgWidth - divWidth)/2); + + _top = imgOffset.top + offsetY; + _left = imgOffset.left + offsetX; + + $('#tidypics_tag_instructions').show().css({ + "top": _top + "px", + "left": _left + "px" + }); + } + + function hideTagInstruct() + { + $('#tidypics_tag_instructions').hide(); + } + + function addTag() + { + // do I need a catch for no tag? + + $("input#user_id").val(user_id); + $("input#word").val( $("input.input-filter").val() ); + + coord_string = '"x1":"' + coordinates.x1 + '",'; + coord_string += '"y1":"' + coordinates.y1 + '",'; + coord_string += '"width":"' + coordinates.width + '",'; + coord_string += '"height":"' + coordinates.height + '"'; + + $("input#coordinates").val(coord_string); + + //Show loading + //$("#tag_menu").replaceWith('<div align="center" class="ajax_loader"></div>'); + } + + function deleteTags() + { + offsetY = 60; + + stopTagging(); + + divWidth = $('#delete_tag_menu').width(); + imgOffset = $('#tidypics_image').offset(); + imgWidth = $('#tidypics_image').width(); + offsetX = parseInt((imgWidth - divWidth)/2); + + _top = imgOffset.top + offsetY; + _left = imgOffset.left + offsetX; + + $('#tidypics_delete_tag_menu').show().css({ + "top": _top + "px", + "left": _left + "px" + }); + + $('#tidypics_image').hover( + function(){ + $('.tidypics_tag').hide(); + }, + function(){ + $('.tidypics_tag').hide(); + } + ); + } + + function hideDeleteMenu() + { + $('#tidypics_delete_tag_menu').hide(); + + // restart tag hovering + $('#tidypics_image').hover( + function(){ + $('.tidypics_tag').show(); + }, + function(){ + $('.tidypics_tag').hide(); + } + ); + } +</script> diff --git a/plugins/tidypics/views/default/tidypics/tagging.php b/plugins/tidypics/views/default/tidypics/tagging.php new file mode 100644 index 00000000..251534b8 --- /dev/null +++ b/plugins/tidypics/views/default/tidypics/tagging.php @@ -0,0 +1,89 @@ +<?php + + $image = $vars['image']; + $viewer = $vars['viewer']; + $owner = $vars['owner']; + + // get photo tags + $tag_info = $image->getPhotoTags(); + + // defining json text as "" makes sure the tagging javascript code doesn't throw errors if no tags + $photo_tags_json = "\"\""; + if ($tag_info) { + $photo_tags_json = $tag_info['json']; + } + + if ($tag_info) { +?> +<div id="tidypics_phototags_list"> + <h3><?php echo elgg_echo('tidypics:inthisphoto') ?></h3> + <ul> +<?php + foreach ($tag_info['links'] as $id=>$link) { + echo "<li><a class='tidypics_phototag_links' id='taglink{$id}' href='{$link['url']}'>{$link['text']}</a></li>"; + } +?> + </ul> +</div> +<?php + } +?> +<div id='tidypics_tag_instructions'> + <div id='tidypics_tag_instruct_text'><?php echo elgg_echo('tidypics:taginstruct'); ?></div> + <div id='tidypics_tag_instruct_button_div'><button class='submit_button' id='tidypics_tag_instruct_button' onclick='stopTagging()'><?php echo elgg_echo('tidypics:finish_tagging'); ?></button></div> +</div> +<div id="tidypics_tag_menu" class="tidypics_popup"> + <div class='tidypics_popup_header'><h3><?php echo elgg_echo('tidypics:tagthisphoto'); ?></h3></div> +<?php + + if ($viewer) { + + $people_list = tp_get_tag_list($viewer); + + $content = "<div id='tidypics_tagmenu_left'>"; + $content .= "<input type='hidden' name='image_guid' value='{$image->guid}' />"; + $content .= "<input type='hidden' name='coordinates' id='coordinates' value='' />"; + $content .= "<input type='hidden' name='user_id' id='user_id' value='' />"; + $content .= "<input type='hidden' name='word' id='word' value='' />"; + + $content .= "<ul id='tidypics_phototag_list'>"; + $content .= "<li><a href='javascript:void(0)' onclick='selectUser({$viewer->getGUID()},\"{$viewer->name}\")'> {$viewer->name} (" . elgg_echo('me') . ")</a></li>"; + + if ($people_list) { + foreach($people_list as $friend_guid => $friend_name) { + $content .= "<li><a href='javascript:void(0)' onclick='selectUser({$friend_guid}, \"{$friend_name}\")'>{$friend_name}</a></li>"; + } + } + + $content .= "</ul></div>"; + + $content .= "<div id='tidypics_tagmenu_right'><input type='submit' value='" . elgg_echo('tidypics:actiontag') . "' class='submit_button' /></div>"; + + echo elgg_view('input/form', array('internalid' => 'quicksearch', 'internalname' => 'tidypics_phototag_form', 'class' => 'quicksearch', 'action' => "{$vars['url']}action/tidypics/addtag", 'method' => 'post', 'body' => $content)); + } + +?> +<div class="clearfloat"></div> +</div> +<div id="tidypics_delete_tag_menu" class="tidypics_popup"> + <div class='tidypics_popup_header'><h3><?php echo elgg_echo('tidypics:deltag_title'); ?></h3></div> + +<?php + if ($tag_info) { + $content = "<input type='hidden' name='image_guid' value='{$image->guid}' />"; + foreach ($tag_info['links'] as $id => $link) { + $text = htmlentities($link['text'], ENT_QUOTES, 'UTF-8'); + $content .= "<label><input type=\"checkbox\" class=\"input-checkboxes\" name=\"tags[{$id}]\" value=\"{$text}\" />{$text}</label><br />"; + } + + $content .= "<input type='submit' value='" . elgg_echo('tidypics:actiondelete') . "' class='submit_button' />"; + $content .= "<input type='button' value='" . elgg_echo('cancel') . "' class='cancel_button' onclick='hideDeleteMenu();' />"; + + echo elgg_view('input/form', array('internalname' => 'phototag_deletetag_form', 'action' => "{$vars['url']}action/tidypics/deletetag", 'method' => 'post', 'body' => $content)); + + } +?> +</div> +<?php + echo elgg_view('tidypics/js/tagging', array('photo_tags_json' => $photo_tags_json,) ); +?> \ No newline at end of file diff --git a/plugins/tidypics/views/default/widgets/album_view/edit.php b/plugins/tidypics/views/default/widgets/album_view/edit.php new file mode 100644 index 00000000..992699cb --- /dev/null +++ b/plugins/tidypics/views/default/widgets/album_view/edit.php @@ -0,0 +1,24 @@ +<p> +<?php + + echo elgg_echo("tidypics:widget:num_albums") . ": "; + + + if($vars['entity']->num_display == '') $vars['entity']->num_display = 5; + +?> + <select name="params[num_display]"> + <option value="1" <?php if($vars['entity']->num_display == 1) echo "SELECTED"; ?>>1</option> + <option value="2" <?php if($vars['entity']->num_display == 2) echo "SELECTED"; ?>>2</option> + <option value="3" <?php if($vars['entity']->num_display == 3) echo "SELECTED"; ?>>3</option> + <option value="4" <?php if($vars['entity']->num_display == 4) echo "SELECTED"; ?>>4</option> + <option value="5" <?php if($vars['entity']->num_display == 5) echo "SELECTED"; ?>>5</option> + <option value="6" <?php if($vars['entity']->num_display == 6) echo "SELECTED"; ?>>6</option> + <option value="7" <?php if($vars['entity']->num_display == 7) echo "SELECTED"; ?>>7</option> + <option value="8" <?php if($vars['entity']->num_display == 8) echo "SELECTED"; ?>>8</option> + <option value="9" <?php if($vars['entity']->num_display == 9) echo "SELECTED"; ?>>9</option> + <option value="10" <?php if($vars['entity']->num_display == 10) echo "SELECTED"; ?>>10</option> + <option value="15" <?php if($vars['entity']->num_display == 15) echo "SELECTED"; ?>>15</option> + <option value="20" <?php if($vars['entity']->num_display == 20) echo "SELECTED"; ?>>20</option> + </select> +</p> \ No newline at end of file diff --git a/plugins/tidypics/views/default/widgets/album_view/view.php b/plugins/tidypics/views/default/widgets/album_view/view.php new file mode 100644 index 00000000..b4248df3 --- /dev/null +++ b/plugins/tidypics/views/default/widgets/album_view/view.php @@ -0,0 +1,13 @@ +<div class="contentWrapper"> +<?php + + //the number of files to display + $number = (int) $vars['entity']->num_display; + //if no number has been set, default to 5 + if (!$number) + $number = 5; + + echo elgg_view('tidypics/albums', array('num_albums' => $number)); + +?> +</div> \ No newline at end of file diff --git a/plugins/tidypics/views/default/widgets/latest_photos/edit.php b/plugins/tidypics/views/default/widgets/latest_photos/edit.php new file mode 100644 index 00000000..3b334d72 --- /dev/null +++ b/plugins/tidypics/views/default/widgets/latest_photos/edit.php @@ -0,0 +1,15 @@ +<p> +<?php + echo elgg_echo("tidypics:widget:num_latest") . ": "; + + if($vars['entity']->num_display == '') $vars['entity']->num_display = 6; + +?> + <select name="params[num_display]"> + <option value="6" <?php if($vars['entity']->num_display == 6) echo "SELECTED"; ?>>6</option> + <option value="9" <?php if($vars['entity']->num_display == 9) echo "SELECTED"; ?>>9</option> + <option value="12" <?php if($vars['entity']->num_display == 12) echo "SELECTED"; ?>>12</option> + <option value="15" <?php if($vars['entity']->num_display == 15) echo "SELECTED"; ?>>15</option> + <option value="18" <?php if($vars['entity']->num_display == 18) echo "SELECTED"; ?>>18</option> + </select> +</p> \ No newline at end of file diff --git a/plugins/tidypics/views/default/widgets/latest_photos/view.php b/plugins/tidypics/views/default/widgets/latest_photos/view.php new file mode 100644 index 00000000..0c319390 --- /dev/null +++ b/plugins/tidypics/views/default/widgets/latest_photos/view.php @@ -0,0 +1,15 @@ +<div class="contentWrapper"> +<?php + + //the number of files to display + $number = (int) $vars['entity']->num_display; + //if no number has been set, default to 6 + if (!$number) + $number = 6; + + echo '<div class="tidypics_widget_latest">'; + echo tp_get_latest_photos($number, page_owner()); + echo '</div>'; + +?> +</div> \ No newline at end of file diff --git a/plugins/tidypics/views/rss/extensions/tidypics/channel.php b/plugins/tidypics/views/rss/extensions/tidypics/channel.php new file mode 100644 index 00000000..8b620d15 --- /dev/null +++ b/plugins/tidypics/views/rss/extensions/tidypics/channel.php @@ -0,0 +1 @@ +<description /> \ No newline at end of file diff --git a/plugins/tidypics/views/rss/extensions/tidypics/xmlns.php b/plugins/tidypics/views/rss/extensions/tidypics/xmlns.php new file mode 100644 index 00000000..cb9646dc --- /dev/null +++ b/plugins/tidypics/views/rss/extensions/tidypics/xmlns.php @@ -0,0 +1 @@ + xmlns:media="http://search.yahoo.com/mrss/" \ No newline at end of file diff --git a/plugins/tidypics/views/rss/object/album.php b/plugins/tidypics/views/rss/object/album.php new file mode 100644 index 00000000..8542b95f --- /dev/null +++ b/plugins/tidypics/views/rss/object/album.php @@ -0,0 +1,54 @@ +<?php + /** + * Tidypics Album RSS View + */ + +// for now catch the albums view and ignore it +if (get_context() == "search" && get_input('search_viewtype') == "gallery") { +?> + <item> + <guid isPermaLink='true'><?php echo $vars['entity']->getURL(); ?></guid> + <pubDate><?php echo date("r",$vars['entity']->time_created) ?></pubDate> + <link><?php echo $vars['entity']->getURL(); ?></link> + <title><![CDATA[<?php echo $vars['entity']->title; ?>]]></title> + <description><![CDATA[<?php echo (autop($vars['entity']->description)); ?>]]></description> + </item> + +<?php +} else { + + $album = $vars['entity']; + + // use fullsize image + $base_url_fullsize = $vars['url'] . 'pg/photos/download/'; + + // insert cover image if it exists image + if ($album->cover) { + // Set title + $vars['title'] = $album->title; + if (empty($vars['title'])) { + $title = $vars['config']->sitename; + } else if (empty($vars['config']->sitename)) { + $title = $vars['title']; + } else { + $title = $vars['config']->sitename . ": " . $vars['title']; + } + $album_cover_url = $vars['url'] . 'mod/tidypics/thumbnail.php?file_guid=' . $album->cover . '&size=thumb'; +?> <image> + <url><?php echo $album_cover_url; ?></url> + <title><![CDATA[<?php echo $title; ?>]]></title> + <link><?php echo $album->getURL() . '?view=rss'; ?></link> + </image> +<?php + } + + + $images = get_entities("object", "image", 0, "", 0, 0, false, 0, $album->guid); + + + foreach ($images as $image) { + echo elgg_view_entity($image); + } + +} +?> \ No newline at end of file diff --git a/plugins/tidypics/views/rss/object/file.php b/plugins/tidypics/views/rss/object/file.php new file mode 100644 index 00000000..36740f00 --- /dev/null +++ b/plugins/tidypics/views/rss/object/file.php @@ -0,0 +1,23 @@ +<?php + + /** + * Tidypics RSS file object view - need to look into removing download link based on settings + */ + + $title = $vars['entity']->title; + if (empty($title)) { + $title = substr($vars['entity']->description,0,32); + if (strlen($vars['entity']->description) > 32) + $title .= " ..."; + } + +?> + + <item> + <guid isPermaLink='true'><?php echo $vars['entity']->getURL(); ?></guid> + <pubDate><?php echo date("r",$vars['entity']->time_created) ?></pubDate> + <link><?php echo $vars['entity']->getURL(); ?></link> + <title><![CDATA[<?php echo $title; ?>]]></title> + <description><![CDATA[<?php echo (autop($vars['entity']->description)); ?>]]></description> + <enclosure url="<?php echo $vars['url']; ?>pg/photos/download/<?php echo $vars['entity']->getGUID(); ?>/" length="<?php echo $vars['entity']->size(); ?>" type="<?php echo $vars['entity']->getMimeType(); ?>" /> + </item> diff --git a/plugins/tidypics/views/rss/object/image.php b/plugins/tidypics/views/rss/object/image.php new file mode 100644 index 00000000..b9359208 --- /dev/null +++ b/plugins/tidypics/views/rss/object/image.php @@ -0,0 +1,19 @@ +<?php + +$title = $vars['entity']->title; +$descr = $vars['entity']->description; +$download = $vars['url'] . 'pg/photos/download/' . $vars['entity']->guid . '/inline/'; +$base_url = $vars['url'] . 'mod/tidypics/thumbnail.php?file_guid='; +?> + + <item> + <title><?php echo $title; ?></title> + <link><?php echo $base_url . $vars['entity']->guid . '&size=large'; ?></link> + <description><?php echo htmlentities($descr, ENT_QUOTES); ?></description> + <pubDate><?php echo date("r", $vars['entity']->time_created); ?></pubDate> + <guid isPermaLink="true"><?php echo $vars['entity']->getURL(); ?></guid> + <media:content url="<?php echo $download; ?>" medium="image" type="<?php echo $vars['entity']->getMimeType(); ?>" /> + <media:title><?php echo $title; ?></media:title> + <media:description><?php echo htmlentities($descr); ?></media:description> + <media:thumbnail url="<?php echo $base_url . $vars['entity']->guid . '&size=thumb'; ?>"></media:thumbnail> + </item> \ No newline at end of file diff --git a/plugins/tidypics/views/rss/pageshells/pageshell.php b/plugins/tidypics/views/rss/pageshells/pageshell.php new file mode 100644 index 00000000..2dfc8917 --- /dev/null +++ b/plugins/tidypics/views/rss/pageshells/pageshell.php @@ -0,0 +1,46 @@ +<?php + + /** + * Elgg RSS output pageshell + * + * @package Elgg + * @subpackage Core + * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 + * @copyright Curverider Ltd 2008-2009 + * @link http://elgg.org/ + * + */ + + header("Content-Type: text/xml"); + + echo "<?xml version='1.0'?>\n"; + + + + // Set title + if (empty($vars['title'])) { + $title = $vars['config']->sitename; + } else if (empty($vars['config']->sitename)) { + $title = $vars['title']; + } else { + $title = $vars['config']->sitename . ": " . $vars['title']; + } + + // Remove RSS from URL + $url = str_replace('?view=rss','',full_url()); + $url = str_replace('&view=rss','',full_url()); + +?> + +<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:georss="http://www.georss.org/georss" <?php echo elgg_view('extensions/xmlns'); ?> > + <channel> + <title><![CDATA[<?php echo $title; ?>]]></title> + <link><?php echo htmlentities($url); ?></link> + <?php echo elgg_view('extensions/channel'); ?> + <?php + + echo $vars['body']; + + ?> + </channel> +</rss> \ No newline at end of file diff --git a/plugins/tidypics/views/rss/tidypics/content_wrapper.php b/plugins/tidypics/views/rss/tidypics/content_wrapper.php new file mode 100644 index 00000000..0b16f235 --- /dev/null +++ b/plugins/tidypics/views/rss/tidypics/content_wrapper.php @@ -0,0 +1,2 @@ +<?php +echo $vars['content']; diff --git a/plugins/tidypics/views/rss/tidypics/gallery.php b/plugins/tidypics/views/rss/tidypics/gallery.php new file mode 100644 index 00000000..2c285fca --- /dev/null +++ b/plugins/tidypics/views/rss/tidypics/gallery.php @@ -0,0 +1,18 @@ +<?php + /** + * Tidypics Listing RSS View + */ + +$context = $vars['context']; +$entities = $vars['entities']; +$count = $vars['count']; +$baseurl = $vars['baseurl']; + + +if (is_array($entities) && sizeof($entities) > 0) { + foreach($entities as $entity) { + echo elgg_view_entity($entity); + } +} + +?> \ No newline at end of file -- GitLab