NextGEN Gallery – WordPress Gallery Plugin - Version 2.0.0

Version Description

Download this release

Release Info

Developer photocrati
Plugin Icon 128x128 NextGEN Gallery – WordPress Gallery Plugin
Version 2.0.0
Comparing to
See all releases

Code changes from version 2.0.40 to 2.0.0

Files changed (260) hide show
  1. changelog.txt +0 -188
  2. nggallery.php +17 -205
  3. non_pope/class.nextgen_settings.php +8 -12
  4. non_pope/class.nextgen_shortcode_manager.php +0 -125
  5. non_pope/class.nextgen_style_manager.php +0 -288
  6. non_pope/class.photocrati_cache.php +12 -53
  7. non_pope/class.photocrati_installer.php +10 -97
  8. non_pope/class.photocrati_resource_manager.php +0 -199
  9. non_pope/class.photocrati_settings_manager.php +5 -53
  10. pope/lib/autoload.php +1 -1
  11. pope/lib/class.base_module.php +1 -1
  12. pope/lib/class.base_product.php +2 -2
  13. pope/lib/class.component_factory.php +2 -2
  14. pope/lib/class.extensibleobject.php +4 -42
  15. products/photocrati_nextgen/modules/ajax/class.ajax_controller.php +7 -7
  16. products/photocrati_nextgen/modules/ajax/class.ajax_installer.php +22 -5
  17. products/photocrati_nextgen/modules/ajax/class.ajax_option_handler.php +0 -29
  18. products/photocrati_nextgen/modules/ajax/module.ajax.php +9 -16
  19. products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php +3 -3
  20. products/photocrati_nextgen/modules/attach_to_post/adapter.gallery_storage_frame_event.php +6 -14
  21. products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php +10 -83
  22. products/photocrati_nextgen/modules/attach_to_post/class.attach_to_post_installer.php +26 -5
  23. products/photocrati_nextgen/modules/attach_to_post/class.attach_to_post_option_handler.php +0 -28
  24. products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php +3 -16
  25. products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php +80 -57
  26. products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.js +21 -19
  27. products/photocrati_nextgen/modules/attach_to_post/static/iframely.js +10 -50
  28. products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js +1 -0
  29. products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php +3 -38
  30. products/photocrati_nextgen/modules/cache/class.cache.php +2 -2
  31. products/photocrati_nextgen/modules/cache/module.cache.php +1 -1
  32. products/photocrati_nextgen/modules/datamapper/class.custompost_datamapper_driver.php +12 -25
  33. products/photocrati_nextgen/modules/datamapper/class.customtable_datamapper_driver.php +56 -45
  34. products/photocrati_nextgen/modules/datamapper/class.datamapper_driver_base.php +12 -127
  35. products/photocrati_nextgen/modules/datamapper/class.datamapper_installer.php +1 -1
  36. products/photocrati_nextgen/modules/datamapper/class.datamapper_model.php +10 -8
  37. products/photocrati_nextgen/modules/datamapper/module.datamapper.php +13 -30
  38. products/photocrati_nextgen/modules/dynamic_stylesheet/class.dynamic_stylesheet_controller.php +3 -3
  39. products/photocrati_nextgen/modules/dynamic_stylesheet/class.dynamic_stylesheet_installer.php +1 -1
  40. products/photocrati_nextgen/modules/dynamic_stylesheet/module.dynamic_stylesheet.php +1 -1
  41. products/photocrati_nextgen/modules/dynamic_thumbnails/adapter.dynamic_thumbnails_storage_driver.php +3 -10
  42. products/photocrati_nextgen/modules/dynamic_thumbnails/class.dynamic_thumbnails_installer.php +1 -1
  43. products/photocrati_nextgen/modules/dynamic_thumbnails/class.dynamic_thumbnails_manager.php +1 -1
  44. products/photocrati_nextgen/modules/dynamic_thumbnails/module.dynamic_thumbnails.php +1 -1
  45. products/photocrati_nextgen/modules/frame_communication/class.frame_communication_installer.php +1 -1
  46. products/photocrati_nextgen/modules/frame_communication/class.frame_event_publisher.php +2 -10
  47. products/photocrati_nextgen/modules/frame_communication/module.frame_communication.php +3 -5
  48. products/photocrati_nextgen/modules/fs/class.fs.php +10 -41
  49. products/photocrati_nextgen/modules/fs/module.fs.php +1 -1
  50. products/photocrati_nextgen/modules/lightbox/adapter.lightbox_factory.php +4 -4
  51. products/photocrati_nextgen/modules/lightbox/class.lightbox_installer.php +3 -12
  52. products/photocrati_nextgen/modules/lightbox/class.lightbox_library.php +1 -12
  53. products/photocrati_nextgen/modules/lightbox/module.lightbox.php +7 -160
  54. products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.css +1 -3
  55. products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.js +7 -13
  56. products/photocrati_nextgen/modules/lightbox/static/highslide/nextgen_highslide_init.js +20 -41
  57. products/photocrati_nextgen/modules/lightbox/static/jquery.lightbox/nextgen_lightbox_init.js +11 -21
  58. products/photocrati_nextgen/modules/lightbox/static/lightbox_context.js +0 -27
  59. products/photocrati_nextgen/modules/lightbox/static/shutter/nextgen_shutter.js +7 -8
  60. products/photocrati_nextgen/modules/lightbox/static/shutter_reloaded/nextgen_shutter_reloaded.js +8 -9
  61. products/photocrati_nextgen/modules/lightbox/static/thickbox/nextgen_thickbox_init.js +2 -7
  62. products/photocrati_nextgen/modules/mediarss/class.mediarss_controller.php +2 -2
  63. products/photocrati_nextgen/modules/mediarss/module.mediarss.php +1 -1
  64. products/photocrati_nextgen/modules/mediarss/templates/mediarss_feed.php +6 -6
  65. products/photocrati_nextgen/modules/mediarss/templates/playlist_feed.php +3 -3
  66. products/photocrati_nextgen/modules/mvc/adapter.mvc_fs.php +1 -1
  67. products/photocrati_nextgen/modules/mvc/adapter.mvc_router.php +1 -1
  68. products/photocrati_nextgen/modules/mvc/class.mvc_controller.php +2 -2
  69. products/photocrati_nextgen/modules/mvc/class.mvc_installer.php +3 -2
  70. products/photocrati_nextgen/modules/mvc/class.mvc_option_handler.php +0 -9
  71. products/photocrati_nextgen/modules/mvc/class.mvc_view.php +3 -3
  72. products/photocrati_nextgen/modules/mvc/module.mvc.php +2 -7
  73. products/photocrati_nextgen/modules/mvc/template_helper.php +2 -20
  74. products/photocrati_nextgen/modules/mvc/templates/index.php +1 -1
  75. products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php +19 -24
  76. products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_forms.php +9 -7
  77. products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php +4 -8
  78. products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php +1 -1
  79. products/photocrati_nextgen/modules/nextgen_addgallery_page/static/jquery.filetree/connectors/jqueryFileTree.php +36 -0
  80. products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php +5 -6
  81. products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php +26 -47
  82. products/photocrati_nextgen/modules/nextgen_admin/class.form.php +14 -28
  83. products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_installer.php +16 -19
  84. products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_option_handler.php +0 -29
  85. products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php +4 -16
  86. products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php +2 -9
  87. products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.js +8 -2
  88. products/photocrati_nextgen/modules/nextgen_admin/templates/field_generator/nextgen_settings_field_color.php +2 -1
  89. products/photocrati_nextgen/modules/nextgen_admin/templates/nextgen_admin_page.php +1 -1
  90. products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_album_controller.php +36 -76
  91. products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_album_mapper.php +1 -13
  92. products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_album_routes.php +9 -10
  93. products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_compact_album_form.php +1 -27
  94. products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_extended_album_form.php +0 -26
  95. products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php +1 -0
  96. products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php +18 -22
  97. products/photocrati_nextgen/modules/nextgen_basic_album/static/compact_settings.js +0 -7
  98. products/photocrati_nextgen/modules/nextgen_basic_album/static/extended_settings.js +0 -7
  99. products/photocrati_nextgen/modules/nextgen_basic_album/static/init.js +7 -5
  100. products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.css +12 -37
  101. products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact.php +8 -15
  102. products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended.php +5 -5
  103. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.ajax_pagination_actions.php +1 -2
  104. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_gallery_mapper.php +6 -10
  105. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_gallery_routes.php +7 -7
  106. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_gallery_urls.php +1 -2
  107. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_controller.php +9 -7
  108. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php +1 -5
  109. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php +1 -17
  110. products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnails_controller.php +19 -48
  111. products/photocrati_nextgen/modules/nextgen_basic_gallery/hook.nextgen_basic_gallery_integration.php +3 -9
  112. products/photocrati_nextgen/modules/nextgen_basic_gallery/mixin.nextgen_basic_gallery_controller.php +2 -2
  113. products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php +27 -31
  114. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/nextgen_basic_slideshow.css +1 -2
  115. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/nextgen_basic_slideshow.js +0 -1
  116. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/ajax_pagination.js +2 -6
  117. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css +0 -6
  118. products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/index.php +20 -15
  119. products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/index.php +17 -21
  120. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_controller.php +8 -12
  121. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_form.php +1 -4
  122. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_mapper.php +1 -1
  123. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_routes.php +2 -2
  124. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/hook.nextgen_basic_imagebrowser_alt_urls.php +0 -45
  125. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php +15 -17
  126. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.css +0 -1
  127. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php +4 -17
  128. products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_controller.php +8 -37
  129. products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_mapper.php +1 -1
  130. products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php +15 -16
  131. products/photocrati_nextgen/modules/nextgen_basic_singlepic/static/nextgen_basic_singlepic.css +0 -1
  132. products/photocrati_nextgen/modules/nextgen_basic_singlepic/templates/nextgen_basic_singlepic.php +3 -11
  133. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_controller.php +4 -3
  134. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php +0 -1
  135. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_mapper.php +1 -1
  136. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_routes.php +2 -2
  137. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_urls.php +1 -1
  138. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/class.taxonomy_controller.php +0 -127
  139. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/interface.taxonomy_controller.php +0 -8
  140. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php +16 -32
  141. products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php +16 -23
  142. products/photocrati_nextgen/modules/nextgen_basic_templates/class.legacy_template_locator.php +5 -6
  143. products/photocrati_nextgen/modules/nextgen_basic_templates/module.nextgen_basic_templates.php +1 -1
  144. products/photocrati_nextgen/modules/nextgen_data/adapter.nextgen_data_factory.php +5 -10
  145. products/photocrati_nextgen/modules/nextgen_data/class.album.php +9 -10
  146. products/photocrati_nextgen/modules/nextgen_data/class.album_mapper.php +45 -21
  147. products/photocrati_nextgen/modules/nextgen_data/class.gallery.php +6 -15
  148. products/photocrati_nextgen/modules/nextgen_data/class.gallery_mapper.php +4 -15
  149. products/photocrati_nextgen/modules/nextgen_data/class.gallery_storage.php +1 -1
  150. products/photocrati_nextgen/modules/nextgen_data/class.gallerystorage_driver_base.php +47 -169
  151. products/photocrati_nextgen/modules/nextgen_data/class.image.php +2 -3
  152. products/photocrati_nextgen/modules/nextgen_data/class.image_mapper.php +26 -30
  153. products/photocrati_nextgen/modules/nextgen_data/class.image_wrapper.php +23 -42
  154. products/photocrati_nextgen/modules/nextgen_data/class.nextgen_data_installer.php +14 -21
  155. products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php +2 -2
  156. products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php +38 -60
  157. products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_thumbnail.php +4 -14
  158. products/photocrati_nextgen/modules/nextgen_data/class.wordpress_gallerystorage_driver.php +1 -1
  159. products/photocrati_nextgen/modules/nextgen_data/mixin.nextgen_table_extras.php +0 -195
  160. products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php +1 -20
  161. products/photocrati_nextgen/modules/nextgen_gallery_display/adapter.displayed_gallery_related_element.php +114 -0
  162. products/photocrati_nextgen/modules/nextgen_gallery_display/adapter.gallery_display_ajax.php +0 -24
  163. products/photocrati_nextgen/modules/nextgen_gallery_display/adapter.gallery_display_factory.php +6 -6
  164. products/photocrati_nextgen/modules/nextgen_gallery_display/class.display_type.php +2 -2
  165. products/photocrati_nextgen/modules/nextgen_gallery_display/class.display_type_controller.php +3 -15
  166. products/photocrati_nextgen/modules/nextgen_gallery_display/class.display_type_mapper.php +4 -11
  167. products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery.php +68 -120
  168. products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_mapper.php +2 -3
  169. products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_renderer.php +25 -88
  170. products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source.php +2 -2
  171. products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source_mapper.php +2 -4
  172. products/photocrati_nextgen/modules/nextgen_gallery_display/class.gallery_display_installer.php +3 -7
  173. products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php +27 -155
  174. products/photocrati_nextgen/modules/nextgen_gallery_display/static/common.js +1 -85
  175. products/photocrati_nextgen/modules/nextgen_gallery_display/static/nextgen_gallery_related_images.css +0 -22
  176. products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php +27 -31
  177. products/photocrati_nextgen/modules/nextgen_other_options/adapter.lightbox_manager_form.php +16 -24
  178. products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php +10 -13
  179. products/photocrati_nextgen/modules/nextgen_other_options/adapter.other_options_forms.php +2 -14
  180. products/photocrati_nextgen/modules/nextgen_other_options/adapter.reset_form.php +5 -24
  181. products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php +103 -5
  182. products/photocrati_nextgen/modules/nextgen_other_options/adapter.stylesheet_ajax_actions.php +18 -9
  183. products/photocrati_nextgen/modules/nextgen_other_options/class.settings_model.php +1 -1
  184. products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php +1 -1
  185. products/photocrati_nextgen/modules/nextgen_other_options/static/nextgen_settings_page.js +2 -2
  186. products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php +34 -47
  187. products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php +2 -20
  188. products/photocrati_nextgen/modules/nextgen_other_options/templates/misc_tab.php +29 -2
  189. products/photocrati_nextgen/modules/nextgen_other_options/templates/reset_tab.php +0 -2
  190. products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php +7 -7
  191. products/photocrati_nextgen/modules/nextgen_pagination/mixin.nextgen_basic_pagination.php +1 -19
  192. products/photocrati_nextgen/modules/nextgen_settings/class.nextgen_settings_installer.php +20 -49
  193. products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php +1 -1
  194. products/photocrati_nextgen/modules/nextgen_xmlrpc/module.nextgen_xmlrpc.php +0 -632
  195. products/photocrati_nextgen/modules/ngglegacy/admin/admin.php +2 -2
  196. products/photocrati_nextgen/modules/ngglegacy/admin/album.php +69 -78
  197. products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php +3 -3
  198. products/photocrati_nextgen/modules/ngglegacy/admin/functions.php +2 -2
  199. products/photocrati_nextgen/modules/ngglegacy/admin/install.php +171 -8
  200. products/photocrati_nextgen/modules/ngglegacy/admin/js/ngg.ajax.js +2 -2
  201. products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php +4 -4
  202. products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php +3 -3
  203. products/photocrati_nextgen/modules/ngglegacy/admin/manage.php +5 -15
  204. products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php +6 -20
  205. products/photocrati_nextgen/modules/ngglegacy/admin/overview.php +292 -16
  206. products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php +1 -1
  207. products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php +5 -5
  208. products/photocrati_nextgen/modules/ngglegacy/changelog.txt +718 -0
  209. products/photocrati_nextgen/modules/ngglegacy/class.ngglegacy_installer.php +1 -91
  210. products/photocrati_nextgen/modules/ngglegacy/css/nggallery.css +7 -7
  211. products/photocrati_nextgen/modules/ngglegacy/lang/nggallery.pot +2 -2
  212. products/photocrati_nextgen/modules/ngglegacy/lib/media-rss.php +2 -2
  213. products/photocrati_nextgen/modules/ngglegacy/lib/meta.php +15 -29
  214. products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php +3 -3
  215. products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php +2 -2
  216. products/photocrati_nextgen/modules/ngglegacy/lib/shortcodes.php +2 -6
  217. products/photocrati_nextgen/modules/ngglegacy/lib/sitemap.php +5 -5
  218. products/photocrati_nextgen/modules/ngglegacy/lib/xmlrpc.php +882 -0
  219. products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php +1 -1
  220. products/photocrati_nextgen/modules/ngglegacy/nggallery.php +101 -5
  221. products/photocrati_nextgen/modules/ngglegacy/nggfunctions.php +0 -54
  222. products/photocrati_nextgen/modules/ngglegacy/view/album-compact.php +3 -15
  223. products/photocrati_nextgen/modules/ngglegacy/view/album-extend.php +3 -3
  224. products/photocrati_nextgen/modules/ngglegacy/view/gallery-caption.php +6 -13
  225. products/photocrati_nextgen/modules/ngglegacy/view/gallery-carousel.php +7 -7
  226. products/photocrati_nextgen/modules/ngglegacy/view/gallery.php +4 -11
  227. products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php +3 -3
  228. products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php +2 -2
  229. products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php +4 -4
  230. products/photocrati_nextgen/modules/ngglegacy/view/singlepic.php +4 -14
  231. products/photocrati_nextgen/modules/resource_minifier/adapter.resource_minifier_routes.php +14 -0
  232. products/photocrati_nextgen/modules/resource_minifier/class.resource_manager_controller.php +264 -0
  233. products/photocrati_nextgen/modules/resource_minifier/class.resource_minifier_installer.php +15 -0
  234. products/photocrati_nextgen/modules/resource_minifier/interface.resource_manager.php +5 -0
  235. products/photocrati_nextgen/modules/resource_minifier/module.resource_minifier.php +472 -0
  236. products/photocrati_nextgen/modules/resource_minifier/static/lazy_resources.js +28 -0
  237. products/photocrati_nextgen/modules/resource_minifier/static/sidjs-0.1.js +171 -0
  238. products/photocrati_nextgen/modules/resource_minifier/templates/script.php +24 -0
  239. products/photocrati_nextgen/modules/router/class.router.php +6 -12
  240. products/photocrati_nextgen/modules/router/class.router_installer.php +2 -2
  241. products/photocrati_nextgen/modules/router/class.routing_app.php +18 -22
  242. products/photocrati_nextgen/modules/router/mixin.url_manipulation.php +4 -11
  243. products/photocrati_nextgen/modules/router/module.router.php +1 -1
  244. products/photocrati_nextgen/modules/security/class.wordpress_security_actor.php +0 -13
  245. products/photocrati_nextgen/modules/security/class.wordpress_security_manager.php +0 -13
  246. products/photocrati_nextgen/modules/security/module.security.php +1 -5
  247. products/photocrati_nextgen/modules/simplehtmldom/module.simple_html_dom.php +1 -1
  248. products/photocrati_nextgen/modules/simplehtmldom/simplehtmldom/simple_html_dom.php +1302 -1652
  249. products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php +0 -117
  250. products/photocrati_nextgen/modules/widget/class.widget.php +6 -0
  251. products/photocrati_nextgen/modules/widget/class.widget_gallery.php +48 -64
  252. products/photocrati_nextgen/modules/widget/class.widget_slideshow.php +2 -7
  253. products/photocrati_nextgen/modules/widget/module.widget.php +1 -1
  254. products/photocrati_nextgen/modules/widget/templates/display_gallery.php +2 -2
  255. products/photocrati_nextgen/modules/wordpress_routing/adapter.wordpress_router.php +11 -34
  256. products/photocrati_nextgen/modules/wordpress_routing/adapter.wordpress_routing_app.php +3 -17
  257. products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php +1 -13
  258. products/photocrati_nextgen/product.photocrati_nextgen.php +12 -12
  259. readme.txt +4 -191
  260. wordpress_helpers.php +68 -0
changelog.txt CHANGED
@@ -1,194 +1,6 @@
1
  NextGEN Gallery
2
  by Photocrati Media
3
 
4
- = V2.0.40 - 11.26.2013 =
5
- * NEW: Added the ability to apply lightbox effects to non-NGG images
6
- * NEW: Added NGG_HIDE_STRICT_ERRORS constant. Define and set to TRUE to hide strict errors
7
- * NEW: Added NEXTGEN_GALLERY_IMPORT_ROOT constant. Define and set to TRUE to browse from a custom directory
8
- * NEW: Added NGG_DEBUG constant. Define and set to TRUE to display helpful messages for debugging
9
- * NEW: Each custom table record will have an associated custom post record for expansion
10
- * NEW: Display helpful error messages when there's a problem uploading images
11
- * NEW: Add data-(src|thumbnail|image-id|title|description) attribute to gallery image anchors
12
- * NEW: Variant support for displayed gallery sources. Random images is limited to 5 variations
13
- * Fixed: Excessive creation of transients for random galleries
14
- * Fixed: Many issues prohibiting the ability to upload images
15
- * Fixed: Compatibility with NextGEN Gallery Export Plugin for Adobe Lightroom (thanks Vladimir!)
16
- * Fixed: Sorting in the Attach to Post interface
17
- * Fixed: HTML allowed in gallery/album descriptions
18
- * Fixed: Requests for galleries within albums that have numeric names are broken
19
- * Fixed: Call to a non-member function get() on WP_Query
20
- * Fixed: Ability to sort by Image ID in the Attach to Post interface
21
- * Fixed: Isolate the Attach to Post from implicit third-party script inclusion
22
- * Fixed: Check for the existance of thumbnails when generating urls, and if missing, generate new ones
23
- * Fixed: Compatibility with NextGEN Facebook OpenGraph+ plugin
24
- * Fixed: Various XML-RPC issues
25
- * Fixed: Widgets stylesheet not included
26
- * Fixed: Issue with color not being pre-selected when previewing Watermark
27
- * Fixed: E_NOTICE emitted when cleaning up cached image files
28
- * Fixed: E_NOTICE emitted when viewing display type settings
29
- * Fixed: Typo adjusting pcre.backtrack_limit for shortcodes
30
- * Fixed: Content within the tabs of the Attach to Post interface cut-off
31
- * Fixed: Routing problem which would cause conflicts with different display types on the same page
32
- * Fixed: Broken Dynamic CSS links on GoDaddy
33
- * Fixed: Ability to use HTML in gallery/album descriptions
34
- * Fixed: Sub-album requests conflicting with paginated galleries on the same page
35
- * Merged: Pull request from andreasE (https://bitbucket.org/photocrati/nextgen-gallery/pull-request/6/)
36
-
37
- = V2.0.33 - 10.21.2013 =
38
- * NEW: Requests /ngg_tag/[tagname] will create a displayed gallery
39
- * NEW: Option added to "Import Gallery" tab to use original images
40
- * Fixed: Links are broken on the ngg_tags-sitemap.xml file by WordPress SEO
41
- * Fixed: PHP notice: Attempt to assign property of non-object
42
- * Fixed: Undefined property warnings when using NextGEN Basic Thumbnails
43
- * Fixed: Detect if an applying a transient to a displayed gallery was successful
44
- * Fixed: Compatibility issues with BJ-Lazy-Load and Colorbox
45
- * Fixed: Pagination conflicts for multiple Imagebrowsers on the same page
46
- * Fixed: Ability to display previous exception with debug mode
47
- * Fixed: Tagclouds not working in multisite instances
48
- * Fixed: Load widgets.css when a widget is being used
49
- * Fixed: Installer should remove all instances of the component factory
50
- * Fixed: Widget settings interface not intuitive
51
- * Fixed: Inability to upload images in some Windows host environments
52
- * Fixed: Sorting images/galleries using the Attach To Post interface
53
- * Fixed: Fix detection of HTTPS (pull request by Leonhardt Wille)
54
- * Fixed: Compilation errors of regular expressions
55
- * Fixed: Pro galleries wouldn't display in environments using PHP 5.3.3 or less
56
- * Fixed: Scanning of router slug is now limited to the uri, not the url
57
- * Fixed: Show slideshow link isn't required for thumbnail/imagebrowser integration
58
- * Fixed: WordPress media-upload with 'singlepic' image size
59
- * Fixed: Use target=_blank when the link setting is provided for NextGEN Basic Singlepic
60
- * Fixed: Only display rendering errors if WP_DEBUG is enabled
61
-
62
-
63
- = V2.0.31 - 10.03.2013 =
64
- * NEW: Restored AJAX pagination for NextGEN Basic ImageBrowser display type
65
- * Fixed: Compatibility with WordPress Local SEO by Yoast
66
- * Fixed: Inability to upload images if image_slug field was missing in database
67
- * Fixed: Integration of NextGEN Basic Thumbnail and NextGEN Basic Slideshow display types
68
- * Fixed: Photocrati Resource Manager further adjusted to be third-party friendly
69
- * Fixed: Added the ability to find legacy templates in both the child/parent theme directories
70
- * Fixed: JavaScript errors in Attach to Post interface
71
- * Fixed: Router can handle port numbers in urls
72
- * Fixed: Carousel template was linking to NextGEN Basic ImageBrowser view
73
- * Fixed: SQL query generated for displayed galleries using tags as source
74
- * Fixed: 3rd party compat: raise & never lower pcre.backtrack_limit
75
-
76
- = V2.0.30 - 09.25.2013 =
77
- * NEW: Restored the ability to use imagebrowser display type instead of a lightbox effect
78
- * Changed: Displayed galleries are no longer rendered in RSS feeds
79
- * Changed: Removed "Plugin Check" widget from overview page
80
- * Fixed: Silence PHP warnings/errors in an output buffer for AJAX actions
81
- * Fixed: Compatibility issue with WordPress SEO and broken site maps (and large error_logs)
82
- * Fixed: Compatibility issue with AJAX Event Calendar (and possibly others)
83
- * Fixed: Adjusted Photocrati Resource Manager to be third-party friendly
84
- * Fixed: Fixed empty result set for displayed galleries selecting 'All' tags
85
- * Fixed: URL generation for imagebrowser pagination links
86
- * Fixed: Ensure that image meta is imported on creation
87
- * Fixed: Ensure that transients are removed when an external object cache is used
88
- * Fixed: Don't load pluggable.php. This will fix plugin conflicts
89
- * Fixed: In Attach to Post interface, galleries created in one tab weren't showing in another
90
- * Fixed: Don't output frame events cookie for XML-RPC requests
91
-
92
- = V2.0.27 - 09.18.2013 =
93
- * Fixed: Reduce performance impact of purging displayed gallery transients
94
-
95
- = V2.0.25 - 09.18.2013 =
96
- * Changed: Reverting to the 2.0.21 codebase, due to major performance issues in 2.0.23 and 2.0.24
97
-
98
- = V2.0.24 - 09.18.2013 =
99
- * WARNING: Broken release. Uses wp_clear_scheduled_hooks() to purge cron records
100
-
101
- = V2.0.23 - 09.12.2013 =
102
- * WARNING: Broken release. Major bug creates redundant cron jobs
103
- * NEW: WP-Cron job to periodically clean-up displayed gallery transients
104
- * NEW: Added "excluded_container_ids" as parameter for ngg_images shortcode
105
- * Fixed: Lightbox effect is honoured by all display types
106
- * Fixed: Highslide displays images from the correct displayed galleries
107
- * Fixed: Ensure that sub-albums display correctly when the word "album" is part of a slug
108
- * Fixed: Ensure that sub-albums display correctly when numerical slugs are used
109
- * Fixed: Related images heading only added when Related Images functionality is enabled
110
- * Fixed: PHP Warning about undefined index when viewing basic albums
111
- * Fixed: AJAX handling is third-party compatible
112
- * Fixed: Image date is no longer overwritten when an image is modified
113
- * Fixed: Fixed issue with displayed galleries using source='tags'
114
- * Fixed: Problem with transient cache not getting flushed properly from Other Options page
115
- * Fixed: Use correct gallery/transient ID when ajax pagination is used
116
-
117
- = V2.0.21 - 09.09.2013 =
118
- * NEW: Multisite support
119
- * Changed: Default image quality set to 100 for generated images
120
- * Changed: Removed dependence on simplehtmldom library
121
- * Fixed: Related images functionality works as it did in 1.9.x
122
- * Fixed: Don't compress inline JavaScript in post/page content
123
- * Fixed: Click-to-advance slideshow behavior for slideshows
124
- * Fixed: Security warnings from VaultPress
125
- * Fixed: View as Slideshow link works with AJAX pagination
126
- * Fixed: Broken links on Overview page
127
- * Fixed: Backup images option
128
- * Fixed: Stylesheet url generated correctly for Windows hosts
129
- * Fixed: Compatibility with NextGen Custom Fields plugin
130
- * Fixed: Compatibility with Adsense Explosion plugin
131
- * Fixed: Suppress wp_footer notices unless WP_DEBUG is set to TRUE
132
-
133
- = V2.0.17 - 08.30.2013 =
134
- Fixed: Match legacy behaviour when changing gallery path, i.e. don't move files
135
-
136
- = V2.0.14 - 08.27.2013 =
137
- * NEW: Added the ability to override thumbnail settings for NextGEN Basic Albums
138
- * NEW: Shortcode Manager API, which ensures that shortcodes are outputted as intended
139
- * Changed: Re-added the ability to select the original image size for widgets
140
- * Fixed: Ensure that stylesheet url returned is correct for Windows hosts
141
- * Fixed: Broken links and lightbox effects with AJAX pagination
142
- * Fixed: Try to ensure that third party plugins don't add content to our dynamic JS
143
- * Fixed: Improved reliability of iframely.js
144
- * Fixed: Ensure that urls are generated correctly in HTTPs environments
145
- * Fixed: Datamapper works correctly in environments where temporary tables aren't supported
146
- * Fixed: Fixed an issue with thickbox loading animation when home url differs from site url
147
-
148
- = V2.0.11 - 08.19.2013 =
149
- * NEW: Added "run_ngg_resource_manager" hook to by-pass our resource manager
150
- * Changed: Removed "Reset & Uninstall" tab, for now
151
- * Fixed: Compatibility with W3 Total Cache. Please flush cache after updating.
152
- * Fixed: Conflicts with Photocrati Theme Galleries
153
- * Fixed: Blank Attach to Post interface window
154
- * Fixed: Fixed ability to change Lightbox Effect settings
155
- * Fixed: Implemented techniques to ensure WP_Query variables aren't overwritten
156
- * Fixed: Enqueuing AJAX JS libraries twice in wp-admin
157
- * Fixed: Encoding issues
158
- * Fixed: PHP warnings caused by accessing unserialized data as array
159
- * Fixed: Fixed installer issues
160
-
161
- = V2.0.7 - 08.09.2013 =
162
- * NEW: New resource manager that fixes many plugin and theme incompatibilities
163
- * NEW: Styles (custom stylesheets) should reside in wp-content/ngg_styles
164
- * NEW: Added option to "Other Options -> Misc" to control maximum images returned
165
- * Secured: Removed default connector for jQuery FileTree library
166
- * Changed: Updated the simplehtmldom library to version 1.5
167
- * Changed: jQuery is now enqueued at the beginning of every request
168
- * Fixed: Incompatibilities with BuddyPress
169
- * Fixed: Incompatibilities with Events+, bbPress, Custom Permalinks, and many other plugins
170
- * Fixed: Incompcatibilities with Member Access, AMember, Magic Fields, and More Fields
171
- * Fixed: Incompatibilities with Elegant Themes, Oxygen, Responsive, and many other themes
172
- * Fixed: Ensure that gallery images don't have a border by default
173
- * Fixed: Conflict between imagebrowser and album urls
174
- * Fixed: Reverted default gallerypath to wp-content/gallery/
175
- * Fixed: Upgrade-safe way of overriding Styles
176
- * Fixed: Generation of AJAX url is now based on slug
177
- * Fixed: Restore nggShowGallery and nggShowSlideshow as wrappers to new API
178
- * Fixed: Always use domain as specified by WordPress Site URL
179
- * Fixed: Use WordPress Home URL over Site URL when appropriate
180
- * Fixed: Numerous pagination issues
181
- * Fixed: Adjusted our forms to comply with WordPress Firewalls
182
- * Fixed: Correct use of select2 DOM selector for maximum compatibility
183
- * Fixed: Path and URL calculations for Windows and UNIX environments
184
- * Fixed: Ensure that pluggable.php is loaded at the start of every request
185
- * Fixed: Fancybox: adjust CSS for further box-sizing protection from themes
186
- * Fixed: Use PHP 5.2.1 compatible named pattern matching syntax
187
- * Fixed: Remove usage of __DIR__ constant not supported by PHP 5.2.x
188
- * Fixed: Removed dependency on mb_string PHP module
189
- * Fixed: Allow "No Lightbox" as an option for Lightbox Effects
190
- * Fixed: Warning: "Invalid CRT parameters detected" for Windows environments
191
-
192
  = V2.0 - 07.30.2013 =
193
  * NEW: Improved user experience throughout the plugin, settings and usage.
194
  * NEW: Plupload queue uploader that allows for bulk and zip uploads within the same interface.
1
  NextGEN Gallery
2
  by Photocrati Media
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  = V2.0 - 07.30.2013 =
5
  * NEW: Improved user experience throughout the plugin, settings and usage.
6
  * NEW: Plupload queue uploader that allows for bulk and zip uploads within the same interface.
nggallery.php CHANGED
@@ -4,7 +4,7 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
4
  /**
5
  * Plugin Name: NextGEN Gallery by Photocrati
6
  * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 7 million downloads.
7
- * Version: 2.0.40
8
  * Author: Photocrati Media
9
  * Plugin URI: http://www.nextgen-gallery.com
10
  * Author URI: http://www.photocrati.com
@@ -12,49 +12,6 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
12
  */
13
 
14
  if (!class_exists('E_Clean_Exit')) { class E_Clean_Exit extends RuntimeException {} }
15
- if (!class_exists('E_NggErrorException')) { class E_NggErrorException extends RuntimeException {} }
16
-
17
- // This is a temporary function to replace the use of WP's esc_url which strips spaces away from URLs
18
- if (!function_exists('nextgen_esc_url')) {
19
- function nextgen_esc_url( $url, $protocols = null, $_context = 'display' ) {
20
- $original_url = $url;
21
-
22
- if ( '' == $url )
23
- return $url;
24
- $url = preg_replace('|[^a-z0-9 \\-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url);
25
- $strip = array('%0d', '%0a', '%0D', '%0A');
26
- $url = _deep_replace($strip, $url);
27
- $url = str_replace(';//', '://', $url);
28
- /* If the URL doesn't appear to contain a scheme, we
29
- * presume it needs http:// appended (unless a relative
30
- * link starting with /, # or ? or a php file).
31
- */
32
-
33
- if ( strpos($url, ':') === false && ! in_array( $url[0], array( '/', '#', '?' ) ) &&
34
- ! preg_match('/^[a-z0-9-]+?\.php/i', $url) )
35
- $url = 'http://' . $url;
36
-
37
- // Replace ampersands and single quotes only when displaying.
38
- if ( 'display' == $_context ) {
39
- $url = wp_kses_normalize_entities( $url );
40
- $url = str_replace( ' ', '%20', $url );
41
- $url = str_replace( '&', '&', $url );
42
- $url = str_replace( "'", ''', $url );
43
- }
44
-
45
- if ( '/' === $url[0] ) {
46
- $good_protocol_url = $url;
47
- } else {
48
- if ( ! is_array( $protocols ) )
49
- $protocols = wp_allowed_protocols();
50
- $good_protocol_url = wp_kses_bad_protocol( $url, $protocols );
51
- if ( strtolower( $good_protocol_url ) != strtolower( $url ) )
52
- return '';
53
- }
54
-
55
- return apply_filters('clean_url', $good_protocol_url, $original_url, $_context);
56
- }
57
- }
58
 
59
  /**
60
  * NextGEN Gallery is built on top of the Photocrati Pope Framework:
@@ -95,42 +52,15 @@ class C_NextGEN_Bootstrap
95
  $klass = get_class($exception);
96
  echo "<h1>{$klass} thrown</h1>";
97
  echo "<p>{$exception->getMessage()}</p>";
98
- if (self::$debug OR (defined('NGG_DEBUG') AND NGG_DEBUG == TRUE)) {
99
  echo "<h3>Where:</h3>";
100
  echo "<p>On line <strong>{$exception->getLine()}</strong> of <strong>{$exception->getFile()}</strong></p>";
101
  echo "<h3>Trace:</h3>";
102
  echo "<pre>{$exception->getTraceAsString()}</pre>";
103
- if (method_exists($exception, 'getPrevious')) {
104
- if (($previous = $exception->getPrevious())) {
105
- self::print_exception($previous);
106
- }
107
- }
108
- }
109
- }
110
-
111
- static function get_backtrace($objects=FALSE, $remove_dynamic_calls=TRUE)
112
- {
113
- $trace = debug_backtrace($objects);
114
- if ($remove_dynamic_calls) {
115
- $skip_methods = array(
116
- '_exec_cached_method',
117
- '__call',
118
- 'get_method_property',
119
- 'set_method_property',
120
- 'call_method'
121
- );
122
- foreach ($trace as $key => &$value) {
123
- if (isset($value['class']) && isset($value['function'])) {
124
- if ($value['class'] == 'ReflectionMethod' && $value['function'] == 'invokeArgs')
125
- unset($trace[$key]);
126
-
127
- else if ($value['class'] == 'ExtensibleObject' && in_array($value['function'], $skip_methods))
128
- unset($trace[$key]);
129
- }
130
  }
131
  }
132
-
133
- return $trace;
134
  }
135
 
136
  function __construct()
@@ -149,24 +79,17 @@ class C_NextGEN_Bootstrap
149
  {
150
  // Load caching component
151
  include_once('non_pope/class.photocrati_cache.php');
152
- C_Photocrati_Cache::get_instance();
153
- C_Photocrati_Cache::get_instance('displayed_galleries');
154
- C_Photocrati_Cache::get_instance('displayed_gallery_rendering');
155
- C_Photocrati_Cache::$enabled = PHOTOCRATI_CACHE;
156
 
157
  if (isset($_REQUEST['ngg_flush'])) {
158
  C_Photocrati_Cache::flush('all');
159
- die("Flushed all caches");
160
  }
161
  elseif (isset($_REQUEST['ngg_force_update'])) {
162
  C_Photocrati_Cache::$do_not_lookup = TRUE;
163
  C_Photocrati_Cache::$force_update = TRUE;
164
  $_SERVER['QUERY_STRING'] = str_replace('ngg_force_update=1', '', $_SERVER['QUERY_STRING']);
165
  }
166
- elseif (isset($_REQUEST['ngg_flush_expired'])) {
167
- C_Photocrati_Cache::flush('all', TRUE);
168
- die("Flushed all expired items from the cache");
169
- }
170
 
171
  // Load Settings Manager
172
  include_once('non_pope/class.photocrati_settings_manager.php');
@@ -176,16 +99,6 @@ class C_NextGEN_Bootstrap
176
 
177
  // Load the installer
178
  include_once('non_pope/class.photocrati_installer.php');
179
-
180
- // Load the resource manager
181
- include_once('non_pope/class.photocrati_resource_manager.php');
182
- C_Photocrati_Resource_Manager::init();
183
-
184
- // Load the style manager
185
- include_once('non_pope/class.nextgen_style_manager.php');
186
-
187
- // Load the shortcode manager
188
- include_once('non_pope/class.nextgen_shortcode_manager.php');
189
  }
190
 
191
  /**
@@ -197,14 +110,17 @@ class C_NextGEN_Bootstrap
197
  if ($this->_pope_loaded) return;
198
 
199
  // Pope requires a a higher limit
200
- $tmp = ini_get('xdebug.max_nesting_level');
201
- if ($tmp && (int)$tmp <= 300) @ini_set('xdebug.max_nesting_level', 300);
202
 
203
  // Include pope framework
204
  require_once(path_join(NEXTGEN_GALLERY_PLUGIN_DIR, implode(
205
  DIRECTORY_SEPARATOR, array('pope','lib','autoload.php')
206
  )));
207
 
 
 
 
208
  // Get the component registry
209
  $this->_registry = C_Component_Registry::get_instance();
210
 
@@ -216,9 +132,9 @@ class C_NextGEN_Bootstrap
216
  $this->_registry->add_module_path(NEXTGEN_GALLERY_PRODUCT_DIR, true, false);
217
  $this->_registry->load_all_products();
218
 
219
- // Give third-party plugins that opportunity to include their own products
220
- // and modules
221
- do_action('load_nextgen_gallery_modules', $this->_registry);
222
 
223
  // Initializes all loaded modules
224
  $this->_registry->initialize_all_modules();
@@ -256,32 +172,11 @@ class C_NextGEN_Bootstrap
256
  add_filter('pre_update_option_'.$this->_settings_option_name, array(&$this, 'persist_settings'));
257
  add_filter('pre_update_site_option_'.$this->_settings_option_name, array(&$this, 'persist_settings'));
258
 
259
- // This plugin uses jQuery extensively
260
- add_action('init', array(&$this, 'enqueue_jquery'), 1);
261
- add_action('wp_print_scripts', array(&$this, 'fix_jquery'));
262
- add_action('admin_print_scripts', array(&$this, 'fix_jquery'));
263
-
264
- // If the selected stylesheet is using an unsafe path, then notify the user
265
- if (C_NextGen_Style_Manager::get_instance()->is_directory_unsafe()) {
266
- add_action('all_admin_notices', array(&$this, 'display_stylesheet_notice'));
267
- }
268
-
269
- // Delete displayed gallery transients periodically
270
- add_action('ngg_delete_expired_transients', array(&$this, 'delete_expired_transients'));
271
- if (!wp_next_scheduled('ngg_delete_expired_transients')) {
272
- wp_schedule_event(time(), 'hourly', 'ngg_delete_expired_transients');
273
- }
274
-
275
  // Update modules
276
- add_action('init', array(&$this, 'update'), PHP_INT_MAX-1);
277
 
278
  // Start the plugin!
279
- add_action('init', array(&$this, 'route'), 11);
280
- }
281
-
282
- function delete_expired_transients()
283
- {
284
- C_Photocrati_Cache::flush('displayed_galleries', TRUE);
285
  }
286
 
287
  /**
@@ -297,61 +192,9 @@ class C_NextGEN_Bootstrap
297
  return $settings;
298
  }
299
 
300
- /**
301
- * Enqueues jQuery
302
- */
303
- function enqueue_jquery()
304
- {
305
- wp_enqueue_script('jquery');
306
- }
307
-
308
- /**
309
- * Ensures that the latest version of jQuery bundled with WordPress is used
310
- */
311
- function fix_jquery()
312
- {
313
- global $wp_scripts;
314
-
315
- if (isset($wp_scripts->registered['jquery'])) {
316
- $jquery = $wp_scripts->registered['jquery'];
317
- if (!isset($jquery->ver) OR version_compare('1.8', $jquery->ver) == 1) {
318
- ob_start();
319
- wp_deregister_script('jquery');
320
- ob_end_clean();
321
- wp_register_script('jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.10.0' );
322
- }
323
- }
324
- else wp_register_script( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.10.0' );
325
-
326
- wp_enqueue_script('jquery');
327
- }
328
-
329
- /**
330
- * Displays a notice to the user that the current stylesheet location is unsafe
331
- */
332
- function display_stylesheet_notice()
333
- {
334
- $styles = C_NextGen_Style_Manager::get_instance();
335
- $filename = $styles->get_selected_stylesheet();
336
- $abspath = $styles->find_selected_stylesheet_abspath();
337
- $newpath = $styles->new_dir;
338
-
339
- echo "<div class='updated error'>
340
- <h3>WARNING: NextGEN Gallery Stylesheet NOT Upgrade-safe</h3>
341
- <p>
342
- <strong>{$filename}</strong> is currently stored in <strong>{$abspath}</strong>, which isn't upgrade-safe. Please move the stylesheet to
343
- <strong>{$newpath}</strong> to ensure that your customizations persist after updates.
344
- </p></div>";
345
- }
346
-
347
- /**
348
- * Updates all modules
349
- */
350
  function update()
351
  {
352
  $this->_load_pope();
353
-
354
- // Try updating all modules
355
  C_Photocrati_Installer::update();
356
  }
357
 
@@ -402,38 +245,7 @@ class C_NextGEN_Bootstrap
402
  define('NEXTGEN_GALLERY_MODULE_URL', path_join(NEXTGEN_GALLERY_PRODUCT_URL, 'photocrati_nextgen/modules'));
403
  define('NEXTGEN_GALLERY_PLUGIN_CLASS', path_join(NEXTGEN_GALLERY_PLUGIN_DIR, 'module.NEXTGEN_GALLERY_PLUGIN.php'));
404
  define('NEXTGEN_GALLERY_PLUGIN_STARTED_AT', microtime());
405
- define('NEXTGEN_GALLERY_PLUGIN_VERSION', '2.0.40');
406
-
407
- if (!defined('NGG_HIDE_STRICT_ERRORS')) {
408
- define('NGG_HIDE_STRICT_ERRORS', TRUE);
409
- }
410
-
411
- // Should we display E_STRICT errors?
412
- if (NGG_HIDE_STRICT_ERRORS) {
413
- $level = error_reporting();
414
- if ($level != 0) error_reporting($level & ~E_STRICT);
415
- }
416
-
417
- // Should we display NGG debugging information?
418
- if (!defined('NGG_DEBUG')) {
419
- define('NGG_DEBUG', FALSE);
420
- }
421
- self::$debug = NGG_DEBUG;
422
-
423
- // User definable constants
424
- if (!defined('NEXTGEN_GALLERY_IMPORT_ROOT')) {
425
- $path = WP_CONTENT_DIR;
426
- if (is_multisite()) {
427
- $uploads = wp_upload_dir();
428
- $path = $uploads['path'];
429
- }
430
- define('NEXTGEN_GALLERY_IMPORT_ROOT', $path);
431
- }
432
-
433
- // Should the Photocrati cache be enabled
434
- if (!defined('PHOTOCRATI_CACHE')) {
435
- define('PHOTOCRATI_CACHE', TRUE);
436
- }
437
  }
438
 
439
 
4
  /**
5
  * Plugin Name: NextGEN Gallery by Photocrati
6
  * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 7 million downloads.
7
+ * Version: 2.0
8
  * Author: Photocrati Media
9
  * Plugin URI: http://www.nextgen-gallery.com
10
  * Author URI: http://www.photocrati.com
12
  */
13
 
14
  if (!class_exists('E_Clean_Exit')) { class E_Clean_Exit extends RuntimeException {} }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  /**
17
  * NextGEN Gallery is built on top of the Photocrati Pope Framework:
52
  $klass = get_class($exception);
53
  echo "<h1>{$klass} thrown</h1>";
54
  echo "<p>{$exception->getMessage()}</p>";
55
+ if (self::$debug OR (defined('NEXTGEN_GALLERY_DEBUG') AND NEXTGEN_GALLERY_DEBUG == TRUE)) {
56
  echo "<h3>Where:</h3>";
57
  echo "<p>On line <strong>{$exception->getLine()}</strong> of <strong>{$exception->getFile()}</strong></p>";
58
  echo "<h3>Trace:</h3>";
59
  echo "<pre>{$exception->getTraceAsString()}</pre>";
60
+ while (($previous = $exception->getPrevious())) {
61
+ self::print_exception($previous);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  }
63
  }
 
 
64
  }
65
 
66
  function __construct()
79
  {
80
  // Load caching component
81
  include_once('non_pope/class.photocrati_cache.php');
82
+ C_Photocrati_Cache::$enabled = TRUE;
 
 
 
83
 
84
  if (isset($_REQUEST['ngg_flush'])) {
85
  C_Photocrati_Cache::flush('all');
86
+ $_SERVER['QUERY_STRING'] = str_replace('ngg_flush=1', '', $_SERVER['QUERY_STRING']);
87
  }
88
  elseif (isset($_REQUEST['ngg_force_update'])) {
89
  C_Photocrati_Cache::$do_not_lookup = TRUE;
90
  C_Photocrati_Cache::$force_update = TRUE;
91
  $_SERVER['QUERY_STRING'] = str_replace('ngg_force_update=1', '', $_SERVER['QUERY_STRING']);
92
  }
 
 
 
 
93
 
94
  // Load Settings Manager
95
  include_once('non_pope/class.photocrati_settings_manager.php');
99
 
100
  // Load the installer
101
  include_once('non_pope/class.photocrati_installer.php');
 
 
 
 
 
 
 
 
 
 
102
  }
103
 
104
  /**
110
  if ($this->_pope_loaded) return;
111
 
112
  // Pope requires a a higher limit
113
+ $tmp = ini_get('xdebug.max_nesting_level');
114
+ if ($tmp && (int)$tmp <= 300) @ini_set('xdebug.max_nesting_level', 300);
115
 
116
  // Include pope framework
117
  require_once(path_join(NEXTGEN_GALLERY_PLUGIN_DIR, implode(
118
  DIRECTORY_SEPARATOR, array('pope','lib','autoload.php')
119
  )));
120
 
121
+ // Include some extra helpers
122
+ require_once(path_join(NEXTGEN_GALLERY_PLUGIN_DIR, 'wordpress_helpers.php'));
123
+
124
  // Get the component registry
125
  $this->_registry = C_Component_Registry::get_instance();
126
 
132
  $this->_registry->add_module_path(NEXTGEN_GALLERY_PRODUCT_DIR, true, false);
133
  $this->_registry->load_all_products();
134
 
135
+ // Give third-party plugins that opportunity to include their own products
136
+ // and modules
137
+ do_action('load_nextgen_gallery_modules', $this->_registry);
138
 
139
  // Initializes all loaded modules
140
  $this->_registry->initialize_all_modules();
172
  add_filter('pre_update_option_'.$this->_settings_option_name, array(&$this, 'persist_settings'));
173
  add_filter('pre_update_site_option_'.$this->_settings_option_name, array(&$this, 'persist_settings'));
174
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  // Update modules
176
+ add_action('init', array(&$this, 'update'), PHP_INT_MAX);
177
 
178
  // Start the plugin!
179
+ add_action('init', array(&$this, 'route'), PHP_INT_MAX);
 
 
 
 
 
180
  }
181
 
182
  /**
192
  return $settings;
193
  }
194
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  function update()
196
  {
197
  $this->_load_pope();
 
 
198
  C_Photocrati_Installer::update();
199
  }
200
 
245
  define('NEXTGEN_GALLERY_MODULE_URL', path_join(NEXTGEN_GALLERY_PRODUCT_URL, 'photocrati_nextgen/modules'));
246
  define('NEXTGEN_GALLERY_PLUGIN_CLASS', path_join(NEXTGEN_GALLERY_PLUGIN_DIR, 'module.NEXTGEN_GALLERY_PLUGIN.php'));
247
  define('NEXTGEN_GALLERY_PLUGIN_STARTED_AT', microtime());
248
+ define('NEXTGEN_GALLERY_PLUGIN_VERSION', '2.0');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  }
250
 
251
 
non_pope/class.nextgen_settings.php CHANGED
@@ -5,25 +5,21 @@ if (!class_exists('C_NextGen_Settings')) {
5
  class C_NextGen_Settings {
6
  static function get_instance()
7
  {
8
- return C_Photocrati_Settings_Manager::get_instance();
9
- }
10
-
11
- static function add_option_handler($klass, $options=array())
12
- {
13
- $instance = self::get_instance();
14
- return $instance->add_option_handler($klass, $options);
15
  }
16
  }
17
  }
18
 
19
  if (!class_exists('C_NextGen_Global_Settings')) {
20
- class C_NextGen_Global_Settings extends C_NextGen_Settings {
21
  static function get_instance()
22
  {
23
- if (is_multisite())
24
- return C_Photocrati_Global_Settings_Manager::get_instance();
25
- else
26
- return C_Photocrati_Settings_Manager::get_instance();
 
 
27
  }
28
  }
29
  }
5
  class C_NextGen_Settings {
6
  static function get_instance()
7
  {
8
+ return C_Photocrati_Settings_Manager::get_instance();
 
 
 
 
 
 
9
  }
10
  }
11
  }
12
 
13
  if (!class_exists('C_NextGen_Global_Settings')) {
14
+ class C_NextGen_Global_Settings {
15
  static function get_instance()
16
  {
17
+ if (is_multisite()) {
18
+ return C_Photocrati_Global_Settings_Manager::get_instance();
19
+ }
20
+ else {
21
+ return C_Photocrati_Settings_Manager::get_instance();
22
+ }
23
  }
24
  }
25
  }
non_pope/class.nextgen_shortcode_manager.php DELETED
@@ -1,125 +0,0 @@
1
- <?php
2
-
3
- class C_NextGen_Shortcode_Manager
4
- {
5
- private static $_instance = NULL;
6
- private $_shortcodes = array();
7
-
8
- /**
9
- * Gets an instance of the class
10
- * @return C_NextGen_Shortcode_Manager
11
- */
12
- static function get_instance()
13
- {
14
- if (is_null(self::$_instance)) {
15
- $klass = get_class();
16
- self::$_instance = new $klass;
17
- }
18
- return self::$_instance;
19
- }
20
-
21
- /**
22
- * Adds a shortcode
23
- * @param $name
24
- * @param $callback
25
- */
26
- static function add($name, $callback)
27
- {
28
- $manager = self::get_instance();
29
- $manager->add_shortcode($name, $callback);
30
- }
31
-
32
- /**
33
- * Removes a previously added shortcode
34
- * @param $name
35
- */
36
- static function remove($name)
37
- {
38
- $manager = self::get_instance();
39
- $manager->remove_shortcode($name);
40
- }
41
-
42
- /**
43
- * Constructor
44
- */
45
- private function __construct()
46
- {
47
- add_filter('the_content', array(&$this, 'deactivate_all'), 1);
48
- add_filter('the_content', array(&$this, 'parse_content'), PHP_INT_MAX-1);
49
- }
50
-
51
- /**
52
- * Deactivates all shortcodes
53
- */
54
- function deactivate_all($content)
55
- {
56
- foreach (array_keys($this->_shortcodes) as $shortcode) {
57
- $this->deactivate($shortcode);
58
- }
59
-
60
- return $content;
61
- }
62
-
63
- /**
64
- * Activates all registered shortcodes
65
- */
66
- function activate_all()
67
- {
68
- foreach (array_keys($this->_shortcodes) as $shortcode) {
69
- $this->activate($shortcode);
70
- }
71
- }
72
-
73
- /**
74
- * Parses the content for shortcodes and returns the substituted content
75
- * @param $content
76
- * @return string
77
- */
78
- function parse_content($content)
79
- {
80
- $this->activate_all();
81
- return do_shortcode($content);
82
- }
83
-
84
- /**
85
- * Adds a shortcode
86
- * @param $name
87
- * @param $callback
88
- */
89
- function add_shortcode($name, $callback)
90
- {
91
- $this->_shortcodes[$name] = $callback;
92
- $this->activate($name);
93
- }
94
-
95
- /**
96
- * Activates a particular shortcode
97
- * @param $shortcode
98
- */
99
- function activate($shortcode)
100
- {
101
- if (isset($this->_shortcodes[$shortcode])) {
102
- add_shortcode($shortcode, $this->_shortcodes[$shortcode]);
103
- }
104
- }
105
-
106
- /**
107
- * Removes a shortcode
108
- * @param $name
109
- */
110
- function remove_shortcode($name)
111
- {
112
- unset($this->_shortcodes[$name]);
113
- $this->deactivate($name);
114
- }
115
-
116
- /**
117
- * De-activates a shortcode
118
- * @param $shortcode
119
- */
120
- function deactivate($shortcode)
121
- {
122
- if (isset($this->_shortcodes[$shortcode]))
123
- remove_shortcode($shortcode);
124
- }
125
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
non_pope/class.nextgen_style_manager.php DELETED
@@ -1,288 +0,0 @@
1
- <?php
2
-
3
- class C_NextGen_Style_Manager
4
- {
5
- static $_instance = NULL;
6
- var $directories = array();
7
- var $unsafe_directories = array();
8
- var $default_dir = '';
9
- var $new_dir = '';
10
-
11
- function __construct()
12
- {
13
- $this->default_dir = realpath((implode(DIRECTORY_SEPARATOR, array(
14
- untrailingslashit(dirname(__FILE__)),
15
- '..',
16
- 'products',
17
- 'photocrati_nextgen',
18
- 'modules',
19
- 'ngglegacy',
20
- 'css'
21
- ))));
22
-
23
- $this->new_dir = implode(DIRECTORY_SEPARATOR, array(
24
- untrailingslashit(WP_CONTENT_DIR),
25
- 'ngg_styles'
26
- ));
27
-
28
- // The last place we look for a stylesheet is in ngglegacy
29
- $this->add_directory($this->default_dir);
30
-
31
- // This is where all stylesheets should be stored
32
- $this->add_directory($this->new_dir);
33
-
34
- // We check the parent theme directory. Needed for child themes
35
- $this->add_directory(implode(DIRECTORY_SEPARATOR, array(
36
- untrailingslashit(get_template_directory()),
37
- )), TRUE);
38
-
39
- // We also check parent_theme/nggallery
40
- $this->add_directory(implode(DIRECTORY_SEPARATOR, array(
41
- untrailingslashit(get_template_directory()),
42
- 'nggallery'
43
- )), TRUE);
44
-
45
- // We also check parent_theme/ngg_styles
46
- $this->add_directory(implode(DIRECTORY_SEPARATOR, array(
47
- untrailingslashit(get_template_directory()),
48
- 'ngg_styles'
49
- )), TRUE);
50
-
51
- // We check the root directory of the theme. Users shouldn't store here,
52
- // but they might
53
- $this->add_directory(implode(DIRECTORY_SEPARATOR, array(
54
- untrailingslashit(get_stylesheet_directory()),
55
- )), TRUE);
56
-
57
- // We also check the theme/nggallery directory
58
- $this->add_directory(implode(DIRECTORY_SEPARATOR, array(
59
- untrailingslashit(get_stylesheet_directory()),
60
- 'nggallery'
61
- )), TRUE);
62
-
63
- // We also check the theme/ngg_styles directory
64
- $this->add_directory(implode(DIRECTORY_SEPARATOR, array(
65
- untrailingslashit(get_stylesheet_directory()),
66
- 'ngg_styles'
67
- )), TRUE);
68
- }
69
-
70
- /**
71
- * Add a directory to search for stylesheets
72
- * @param $dir
73
- * @param bool $unsafe
74
- */
75
- function add_directory($dir, $unsafe=FALSE)
76
- {
77
- array_unshift($this->directories, $dir);
78
- if ($unsafe) {
79
- $this->unsafe_directories[] = $dir;
80
- }
81
- }
82
-
83
- /**
84
- * Determines if a directory is upgrade-safe or not
85
- * @param $dir
86
- * @return bool
87
- */
88
- function is_directory_unsafe($dir=FALSE)
89
- {
90
- if (!$dir) $dir = dirname($this->find_selected_stylesheet_abspath());
91
-
92
- return in_array($dir, $this->unsafe_directories);
93
- }
94
-
95
- /**
96
- * Determines if the directory is the default ngglegacy path
97
- * @param $dir
98
- * @return bool
99
- */
100
- function is_default_dir($dir)
101
- {
102
- return untrailingslashit($dir) == $this->default_dir;
103
- }
104
-
105
- function get_new_dir($filename)
106
- {
107
- return implode(DIRECTORY_SEPARATOR, array(
108
- untrailingslashit($this->new_dir),
109
- $filename
110
- ));
111
- }
112
-
113
- /**
114
- * Gets the location where the selected stylesheet will be saved to
115
- * @param bool|string $selected
116
- * @return string
117
- */
118
- function get_selected_stylesheet_saved_abspath($selected=FALSE)
119
- {
120
- if (!$selected) $selected = $this->get_selected_stylesheet();
121
-
122
- $abspath = $this->find_selected_stylesheet_abspath($selected);
123
- if ($this->is_default_dir(dirname($abspath))) {
124
- $abspath = $this->get_new_dir(basename($abspath));
125
- }
126
-
127
- return $abspath;
128
- }
129
-
130
- function save($contents, $selected=FALSE)
131
- {
132
- $retval = FALSE;
133
-
134
- if (!$selected) $selected = $this->get_selected_stylesheet();
135
- $abspath = $this->get_selected_stylesheet_saved_abspath($selected);
136
-
137
- wp_mkdir_p(dirname($abspath));
138
- if (is_writable($abspath) OR (!@file_exists($abspath) && is_writable(dirname($abspath)))) {
139
- $retval = file_put_contents($abspath, $contents);
140
- }
141
- return $retval;
142
- }
143
-
144
- /**
145
- * Gets the selected stylesheet from the user
146
- * @return mixed
147
- */
148
- function get_selected_stylesheet()
149
- {
150
- $settings = C_NextGen_Settings::get_instance();
151
-
152
- // use the same css resource for all subsites when wpmuStyle=true
153
- if (!is_multisite() || (is_multisite() && $settings->get('wpmuStyle')))
154
- return $settings->get('CSSfile', 'nggallery.css');
155
- else
156
- return C_Nextgen_Global_Settings::get_instance()->get('wpmuCSSfile');
157
-
158
- }
159
-
160
- /**
161
- * Finds the location of the selected stylesheet
162
- */
163
- function find_selected_stylesheet_abspath($selected=FALSE)
164
- {
165
- if (!$selected) $selected = $this->get_selected_stylesheet();
166
-
167
- $retval = implode(DIRECTORY_SEPARATOR, array(
168
- untrailingslashit($this->default_dir),
169
- $selected
170
- ));
171
-
172
- foreach ($this->directories as $dir) {
173
- $path = implode(DIRECTORY_SEPARATOR, array(
174
- untrailingslashit($dir),
175
- $selected
176
- ));
177
-
178
- if (@file_exists($path)) {
179
- $retval = $path;
180
- break;
181
- }
182
- }
183
-
184
- return $retval;
185
- }
186
-
187
- /**
188
- * Returns the url to the selected stylesheet
189
- * @return mixed
190
- */
191
- function get_selected_stylesheet_url($selected=FALSE)
192
- {
193
- if (!$selected) $selected = $this->get_selected_stylesheet();
194
-
195
- $retval = str_replace(
196
- trailingslashit(ABSPATH),
197
- trailingslashit(site_url()),
198
- $this->find_selected_stylesheet_abspath($selected)
199
- );
200
-
201
- return str_replace('\\', '/', $retval);
202
- }
203
-
204
-
205
- function find_all_stylesheets($dir = FALSE)
206
- {
207
- $retval = array();
208
- if (!$dir)
209
- $dir = $this->directories;
210
-
211
- foreach (array_reverse($dir) as $dir) {
212
- $path = implode(DIRECTORY_SEPARATOR, array(
213
- untrailingslashit($dir),
214
- '*.css'
215
- ));
216
- $files = glob($path);
217
- if (is_array($files)) foreach ($files as $abspath) {
218
- if (($meta = $this->get_stylesheet_metadata($abspath))) {
219
- $filename = $meta['filename'];
220
- $retval[$filename] = $meta;
221
- }
222
- }
223
- }
224
-
225
- return $retval;
226
- }
227
-
228
- /**
229
- * Gets the metadata for a particular stylesheet
230
- * @param $abspath
231
- * @return array
232
- */
233
- function get_stylesheet_metadata($abspath)
234
- {
235
- $retval = array();
236
- $contents = file_get_contents($abspath);
237
- $name = '';
238
- $desc = '';
239
- $version = '';
240
- $author = '';
241
-
242
- // Find the name of the stylesheet
243
- if (preg_match("/CSS Name:(.*)/i", $contents, $match)) {
244
- $name = trim($match[1]);
245
- }
246
-
247
- // Find the description of the stylesheet
248
- if (preg_match("/Description:(.*)/", $contents, $match)) {
249
- $desc = trim($match[1]);
250
- }
251
-
252
- // Find the author of the stylesheet
253
- if (preg_match("/Author:(.*)/", $contents, $match)) {
254
- $author = trim($match[1]);
255
- }
256
-
257
- // Find the version of the stylesheet
258
- if (preg_match("/Version:(.*)/", $contents, $match)) {
259
- $version = trim($match[1]);
260
- }
261
-
262
- if ($name) {
263
- $retval = array(
264
- 'filename' => basename($abspath),
265
- 'abspath' => $abspath,
266
- 'name' => $name,
267
- 'description' => $desc,
268
- 'author' => $author,
269
- 'version' => $version
270
- );
271
- }
272
-
273
- return $retval;
274
- }
275
-
276
- /**
277
- * Gets an instance of the class
278
- * @return C_NextGen_Style_Manager
279
- */
280
- static function get_instance()
281
- {
282
- if (is_null(self::$_instance)){
283
- $klass = get_class();
284
- self::$_instance = new $klass();
285
- }
286
- return self::$_instance;
287
- }
288
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
non_pope/class.photocrati_cache.php CHANGED
@@ -85,7 +85,7 @@ class C_Photocrati_Cache
85
  /**
86
  * Flush the entire cache
87
  */
88
- static function flush($group=NULL, $expired_only=FALSE)
89
  {
90
  $retval = 0;
91
 
@@ -94,77 +94,36 @@ class C_Photocrati_Cache
94
  // Delete all caches
95
  if ($group == 'all') {
96
  foreach (self::$_instances as $cache) {
97
- $retval += self::flush($cache->group, $expired_only);
98
  }
99
  }
100
 
101
  // Delete items from a single cache in particular
102
  else {
103
- $cache = self::get_instance($group);
104
-
105
- // Determine if the object cache is external, and not stored in the DB
106
- // If it's external, we have to delete each transient, one by one
107
- global $_wp_using_ext_object_cache, $wpdb;
108
- if ($_wp_using_ext_object_cache) {
109
- $keys = ($expired_only ? self::get_expired_key_list($group) : self::get_key_list($group));
110
- foreach ($keys as $key) $cache->delete($key, FALSE);
111
- $sql = $wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", "%%{$cache->group}%%");
112
- if ($expired_only) $sql .= " AND option_value < ".time();
113
- $retval = $wpdb->query($sql);
114
  }
115
 
116
- // Transients are stored in the database
117
- else {
118
- $keys = ($expired_only ? self::get_expired_key_list($group) : self::get_key_list($group));
119
- if ($keys) {
120
- $all_keys = array();
121
- foreach ($keys as $value) {
122
- $all_keys[] = "'{$cache->group}{$value}'";
123
- $all_keys[] = "'_transient_timeout_{$value}'";
124
- $all_keys[] = "'_transient_{$value}'";
125
- }
126
- unset($keys);
127
- $all_keys = implode(',', $all_keys);
128
- $sql = "DELETE FROM {$wpdb->options} WHERE option_name IN (". $all_keys. ')';
129
- $retval = $wpdb->query($sql);
130
- }
131
- }
132
  }
133
  }
134
 
135
  return $retval;
136
  }
137
 
138
- static function get_key_list($group=NULL, $strip_group_name=TRUE, $expired_only=FALSE)
139
  {
140
  global $wpdb;
141
 
142
  $cache = self::get_instance($group);
143
-
144
- $sql = '';
145
- if ($strip_group_name) {
146
- $sql = $wpdb->prepare(
147
- "SELECT REPLACE(option_name, %s, '') FROM {$wpdb->options} WHERE option_name LIKE %s",
148
- $cache->group, '%'.$cache->group.'%'
149
- );
150
- }
151
- else {
152
- $sql = $wpdb->prepare(
153
- "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s",
154
- '%'.$cache->group.'%'
155
- );
156
- }
157
-
158
- if ($expired_only) $sql .= " AND option_value < ".time();
159
-
160
  return $wpdb->get_col($sql);
161
  }
162
 
163
- static function get_expired_key_list($group=NULL, $strip_group_name=TRUE)
164
- {
165
- return self::get_key_list($group, $strip_group_name, TRUE);
166
- }
167
-
168
 
169
  /**
170
  * Gets an item using a particular key
@@ -197,7 +156,7 @@ class C_Photocrati_Cache
197
  if (is_array($key)) $key = self::generate_key($key);
198
  if (self::$force_update OR $this->lookup($key, FALSE) === FALSE) {
199
  set_transient($key, $value, $ttl);
200
- update_option($this->group.$key, time()+$ttl);
201
  $retval = $key;
202
  }
203
  }
85
  /**
86
  * Flush the entire cache
87
  */
88
+ static function flush($group=NULL)
89
  {
90
  $retval = 0;
91
 
94
  // Delete all caches
95
  if ($group == 'all') {
96
  foreach (self::$_instances as $cache) {
97
+ $retval += self::flush($cache->group);
98
  }
99
  }
100
 
101
  // Delete items from a single cache in particular
102
  else {
103
+ foreach (self::get_key_list($group) as $key) {
104
+ self::delete($key, FALSE, $group);
 
 
 
 
 
 
 
 
 
105
  }
106
 
107
+ // Delete list of cached items
108
+ global $wpdb;
109
+ $cache = self::get_instance($group);
110
+ $sql = $wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", '%'.$cache->group.'%');
111
+ $retval = $wpdb->query($sql);
 
 
 
 
 
 
 
 
 
 
 
112
  }
113
  }
114
 
115
  return $retval;
116
  }
117
 
118
+ static function get_key_list($group=NULL)
119
  {
120
  global $wpdb;
121
 
122
  $cache = self::get_instance($group);
123
+ $sql = $wpdb->prepare("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s", '%'.$cache->group.'%');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  return $wpdb->get_col($sql);
125
  }
126
 
 
 
 
 
 
127
 
128
  /**
129
  * Gets an item using a particular key
156
  if (is_array($key)) $key = self::generate_key($key);
157
  if (self::$force_update OR $this->lookup($key, FALSE) === FALSE) {
158
  set_transient($key, $value, $ttl);
159
+ update_option($this->group.$key, 1);
160
  $retval = $key;
161
  }
162
  }
non_pope/class.photocrati_installer.php CHANGED
@@ -54,103 +54,35 @@ if (!class_exists('C_Photocrati_Installer'))
54
  if (method_exists($handler, 'uninstall')) return $handler->uninstall($hard);
55
 
56
  if ($hard) {
 
57
  C_NextGen_Settings::get_instance()->destroy();
58
- C_NextGen_Global_Settings::get_instance()->destroy();
59
  }
60
  }
61
 
62
  static function update($reset=FALSE)
63
  {
64
- $local_settings = C_NextGen_Settings::get_instance();
65
- $global_settings = C_NextGen_Global_Settings::get_instance();
 
 
66
 
67
- // This is a specific hack/work-around/fix and can probably be removed sometime after 2.0.20's release
68
- //
69
- // NextGen 2x was not multisite compatible until 2.0.18. Users that upgraded before this
70
- // will have nearly all of their settings stored globally (network wide) in wp_sitemeta. If
71
- // pope_module_list (which should always be a local setting) exists site-wide we wipe the current
72
- // global ngg_options and restore from defaults. This should only ever run once.
73
- if (is_multisite() && isset($global_settings->pope_module_list))
74
- {
75
- // Setting this to TRUE will wipe current settings for display types, but also
76
- // allows the display type installer to run correctly
77
- $reset = TRUE;
78
 
79
- $settings_installer = new C_NextGen_Settings_Installer();
80
- $global_defaults = $settings_installer->get_global_defaults();
81
 
82
- // Preserve the network options we honor by restoring them after calling $global_settings->reset()
83
- $global_settings_to_keep = array();
84
- foreach ($global_defaults as $key => $val) {
85
- $global_settings_to_keep[$key] = $global_settings->$key;
86
- }
87
-
88
- // Resets internal options to an empty array
89
- $global_settings->reset();
90
-
91
- // Restore the defaults, then our saved values. This must be done again later because
92
- // we've set $reset to TRUE.
93
- $settings_installer->install_global_settings();
94
- foreach ($global_settings_to_keep as $key => $val) {
95
- $global_settings->$key = $val;
96
- }
97
- }
98
-
99
- $last_module_list = $reset ? array() : $local_settings->get('pope_module_list', array());
100
- $current_module_list = self::_generate_module_info();
101
-
102
- if (count(($modules = array_diff($current_module_list, $last_module_list))) > 0)
103
- {
104
  // The cache should be flushed
105
  C_Photocrati_Cache::flush();
106
 
107
- // Remove all NGG created cron jobs
108
- self::refresh_cron();
109
-
110
- // Delete auto-update cache
111
- update_option('photocrati_auto_update_admin_update_list', null);
112
- update_option('photocrati_auto_update_admin_check_date', '');
113
-
114
- // Other Pope applications might be loaded, and therefore
115
- // all singletons should be destroyed, so that they can be
116
- // adapted as necessary. For now, we'll just assume that the factory
117
- // is the only singleton that will be used by other Pope applications
118
- C_Component_Factory::$_instances = array();
119
-
120
  foreach ($modules as $module_name) {
121
  if (($handler = self::get_handler_instance(array_shift(explode('|', $module_name))))) {
122
- if (method_exists($handler, 'install'))
123
- $handler->install($reset);
124
  }
125
  }
126
 
127
- // Update the module list
128
- $local_settings->set('pope_module_list', $current_module_list);
129
-
130
- // NOTE & TODO: if the above section that declares $global_settings_to_keep is removed this should also
131
- // Since a hard-reset of the settings was forced we must again re-apply our previously saved values
132
- if (isset($global_settings_to_keep)) {
133
- foreach ($global_settings_to_keep as $key => $val) {
134
- $global_settings->$key = $val;
135
- }
136
- }
137
-
138
  // Save any changes settings
139
  $global_settings->save();
140
  $local_settings->save();
141
- }
142
-
143
- // Another workaround to an issue caused by NextGen's lack of multisite compatibility. It's possible
144
- // the string substitation wasn't performed, so if a '%' symbol exists in gallerypath we reset it. It's
145
- // another db call, but again this should only ever run once.
146
- //
147
- // Remove this when removing the above reset-global-settings code
148
- if (strpos($local_settings->gallerypath, '%'))
149
- {
150
- $settings_installer = new C_NextGen_Settings_Installer();
151
- $local_settings->gallerypath = $settings_installer->gallerypath_replace($global_settings->gallerypath);
152
- $local_settings->save();
153
- }
154
  }
155
 
156
  static function _generate_module_info()
@@ -159,28 +91,9 @@ if (!class_exists('C_Photocrati_Installer'))
159
  $registry = C_Component_Registry::get_instance();
160
  foreach ($registry->get_module_list() as $module_id) {
161
  $module_version = $registry->get_module($module_id)->module_version;
162
- $retval[$module_id] = "{$module_id}|{$module_version}";
163
  }
164
  return $retval;
165
  }
166
-
167
- static function refresh_cron()
168
- {
169
- @ini_set('memory_limit', -1);
170
-
171
- // Remove all cron jobs created by NextGEN Gallery
172
- $cron = _get_cron_array();
173
- if (is_array($cron)) {
174
- foreach ($cron as $timestamp => $job) {
175
- if (is_array($job)) {
176
- unset($cron[$timestamp]['ngg_delete_expired_transients']);
177
- if (empty($cron[$timestamp])) {
178
- unset($cron[$timestamp]);
179
- }
180
- }
181
- }
182
- }
183
- _set_cron_array($cron);
184
- }
185
  }
186
  }
54
  if (method_exists($handler, 'uninstall')) return $handler->uninstall($hard);
55
 
56
  if ($hard) {
57
+ C_NextGen_Global_Settings::get_instance()->destroy();
58
  C_NextGen_Settings::get_instance()->destroy();
 
59
  }
60
  }
61
 
62
  static function update($reset=FALSE)
63
  {
64
+ $global_settings = C_NextGen_Global_Settings::get_instance();
65
+ $local_settings = C_NextGen_Settings::get_instance();
66
+ $last_module_list = $reset ? array() : $global_settings->get('pope_module_list', array());
67
+ $current_module_list = self::_generate_module_info();
68
 
69
+ $global_settings->set('pope_module_list', $current_module_list);
 
 
 
 
 
 
 
 
 
 
70
 
71
+ if (count(($modules = array_diff($current_module_list, $last_module_list)))>0) {
 
72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  // The cache should be flushed
74
  C_Photocrati_Cache::flush();
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  foreach ($modules as $module_name) {
77
  if (($handler = self::get_handler_instance(array_shift(explode('|', $module_name))))) {
78
+ if (method_exists($handler, 'install')) $handler->install($reset);
 
79
  }
80
  }
81
 
 
 
 
 
 
 
 
 
 
 
 
82
  // Save any changes settings
83
  $global_settings->save();
84
  $local_settings->save();
85
+ }
 
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
 
88
  static function _generate_module_info()
91
  $registry = C_Component_Registry::get_instance();
92
  foreach ($registry->get_module_list() as $module_id) {
93
  $module_version = $registry->get_module($module_id)->module_version;
94
+ $retval[] = "{$module_id}|{$module_version}";
95
  }
96
  return $retval;
97
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  }
99
  }
non_pope/class.photocrati_resource_manager.php DELETED
@@ -1,199 +0,0 @@
1
- <?php
2
-
3
- class C_Photocrati_Resource_Manager
4
- {
5
- static $instance = NULL;
6
-
7
- var $buffer = '';
8
- var $styles = '';
9
- var $scripts = '';
10
- var $other_output = '';
11
- var $wrote_footer = FALSE;
12
- var $run_shutdown = FALSE;
13
- var $valid_request = TRUE;
14
-
15
- /**
16
- * Start buffering all generated output. We'll then do two things with the buffer
17
- * 1) Find stylesheets lately enqueued and move them to the header
18
- * 2) Ensure that wp_print_footer_scripts() is called
19
- */
20
- function __construct()
21
- {
22
- // Validate the request
23
- $this->validate_request();
24
-
25
- add_action('init',array(&$this, 'start_buffer'), 1);
26
- }
27
-
28
- /**
29
- * Determines if the resource manager should perform it's routines for this request
30
- * @return bool
31
- */
32
- function validate_request()
33
- {
34
- $retval = TRUE;
35
-
36
- if (is_admin()) {
37
- if (isset($_REQUEST['page']) && !preg_match("#^(ngg|nextgen)#", $_REQUEST['page'])) $retval = FALSE;
38
- }
39
-
40
- if (strpos($_SERVER['REQUEST_URI'], 'wp-admin/update') !== FALSE) $retval = FALSE;
41
- else if (isset($_GET['display_gallery_iframe'])) $retval = FALSE;
42
- else if (defined('WP_ADMIN') && WP_ADMIN && defined('DOING_AJAX') && DOING_AJAX) $retval = FALSE;
43
- else if (preg_match("/(js|css|xsl|xml|kml)$/", $_SERVER['REQUEST_URI'])) $retval = FALSE;
44
- elseif (preg_match("/\\.(\\w{3,4})$/", $_SERVER['REQUEST_URI'], $match)) {
45
- if (!in_array($match[1], array('htm', 'html', 'php'))) {
46
- $retval = FALSE;
47
- }
48
- }
49
-
50
- $this->valid_request = $retval;
51
- }
52
-
53
- /**
54
- * Start the output buffers
55
- */
56
- function start_buffer()
57
- {
58
- if (apply_filters('run_ngg_resource_manager', $this->valid_request)) {
59
- ob_start(array(&$this, 'output_buffer_handler'));
60
- ob_start(array(&$this, 'get_buffer'));
61
-
62
- add_action('wp_print_footer_scripts', array(&$this, 'get_resources'), 1);
63
- add_action('admin_print_footer_scripts', array(&$this, 'get_resources'), 1);
64
- add_action('shutdown', array(&$this, 'shutdown'));
65
- }
66
- }
67
-
68
- /**
69
- *
70
- **/
71
- function get_resources()
72
- {
73
- ob_start();
74
- wp_print_styles();
75
- print_admin_styles();
76
- $this->styles = ob_get_clean();
77
-
78
- if (!is_admin()) {
79
- ob_start();
80
- wp_print_scripts();
81
- $this->scripts = ob_get_clean();
82
- }
83
-
84
- $this->wrote_footer = TRUE;
85
- }
86
-
87
- /**
88
- * Output the buffer after PHP execution has ended (but before shutdown)
89
- * @param $content
90
- * @return string
91
- */
92
- function output_buffer_handler($content)
93
- {
94
- return $this->output_buffer();
95
- }
96
-
97
- /**
98
- * Removes the closing </html> tag from the output buffer. We'll then write our own closing tag
99
- * in the shutdown function after running wp_print_footer_scripts()
100
- * @param $content
101
- * @return mixed
102
- */
103
- function get_buffer($content)
104
- {
105
- $this->buffer = $content;
106
- return '';
107
- }
108
-
109
- /**
110
- * Moves resources to their appropriate place
111
- */
112
- function move_resources()
113
- {
114
- if ($this->valid_request) {
115
- // Move stylesheets to head
116
- if ($this->styles) {
117
- $this->buffer = str_ireplace('</head>', $this->styles.'</head>', $this->buffer);
118
- }
119
-
120
- // Move the scripts to the bottom of the page
121
- if ($this->scripts) {
122
- $this->buffer = str_ireplace('</body>', $this->scripts.'</body>', $this->buffer);
123
- }
124
-
125
- if ($this->other_output) {
126
- $this->buffer = str_replace('</body>', $this->other_output.'</body>', $this->buffer);
127
- }
128
- }
129
- }
130
-
131
- /**
132
- * When PHP has finished, we output the footer scripts and closing tags
133
- */
134
- function output_buffer($in_shutdown=FALSE)
135
- {
136
- // If the footer scripts haven't been outputted, then
137
- // we need to take action - as they're required
138
- if (!$this->wrote_footer) {
139
-
140
- // If W3TC is installed and activated, we can't output the
141
- // scripts and manipulate the buffer, so we can only provide a warning
142
- if (defined('W3TC') && defined('WP_DEBUG') && WP_DEBUG) {
143
- if (defined('DONOTCACHEPAGE')) define('DONOTCACHEPAGE', TRUE);
144
- if (!did_action('wp_footer')) {
145
- error_log("We're sorry, but your theme's page template didn't make a call to wp_footer(), which is required by NextGEN Gallery. Please add this call to your page templates.");
146
- }
147
- else {
148
- error_log("We're sorry, but your theme's page template didn't make a call to wp_print_footer_scripts(), which is required by NextGEN Gallery. Please add this call to your page templates.");
149
- }
150
- }
151
-
152
- // We don't want to manipulate the buffer if it doesn't contain HTML
153
- elseif (strpos($this->buffer, '</body>') === FALSE) {
154
- $this->valid_request = FALSE;
155
- }
156
-
157
- // The output_buffer() function has been called in the PHP shutdown callback
158
- // This will allow us to print the scripts ourselves and manipulate the buffer
159
- if ($in_shutdown === TRUE) {
160
- ob_start();
161
- if (!did_action('wp_footer')) {
162
- wp_footer();
163
- }
164
- else {
165
- wp_print_footer_scripts();
166
- }
167
- $this->other_output = ob_get_clean();
168
-
169
- }
170
-
171
- // W3TC isn't activated and we're not in the shutdown callback.
172
- // We'll therefore add a shutdown callback to print the scripts
173
- else {
174
- $this->run_shutdown = TRUE;
175
- return '';
176
- }
177
- }
178
-
179
- // Once we have the footer scripts, we can modify the buffer and
180
- // move the resources around
181
- if ($this->wrote_footer) $this->move_resources();
182
-
183
- return $this->buffer;
184
- }
185
-
186
- /**
187
- * PHP shutdown callback. Manipulate and output the buffer
188
- */
189
- function shutdown()
190
- {
191
- if ($this->run_shutdown) echo $this->output_buffer(TRUE);
192
- }
193
-
194
- static function init()
195
- {
196
- $klass = get_class();
197
- return self::$instance = new $klass;
198
- }
199
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
non_pope/class.photocrati_settings_manager.php CHANGED
@@ -7,10 +7,9 @@ if (!class_exists('C_Photocrati_Settings_Manager_Base')) {
7
  */
8
  abstract class C_Photocrati_Settings_Manager_Base implements ArrayAccess
9
  {
10
- static $option_name = 'pope_settings';
11
- protected $_options = array();
12
- protected $_defaults = array();
13
- protected $_option_handlers = array();
14
 
15
  abstract function save();
16
  abstract function destroy();
@@ -21,39 +20,6 @@ if (!class_exists('C_Photocrati_Settings_Manager_Base')) {
21
  $this->load();
22
  }
23
 
24
- /**
25
- * Adds a class to handle dynamic options
26
- * @param string $klass
27
- * @param array $options
28
- */
29
- function add_option_handler($klass, $options=array())
30
- {
31
- if (!is_array($options)) $options = array($options);
32
- foreach ($options as $option_name) {
33
- $this->_option_handlers[$option_name] = $klass;
34
- }
35
- }
36
-
37
- /**
38
- * Gets a handler used to provide a dynamic option
39
- * @param string $option_name
40
- * @return null|mixed
41
- */
42
- protected function _get_option_handler($option_name, $method='get')
43
- {
44
- $retval = NULL;
45
-
46
- if (isset($this->_option_handlers[$option_name])) {
47
- if (!is_object($this->_option_handlers[$option_name])) {
48
- $klass = $this->_option_handlers[$option_name];
49
- $this->_option_handlers[$option_name] = new $klass;
50
- }
51
- $retval = $this->_option_handlers[$option_name];
52
- if (!method_exists($retval, $method)) $retval = NULL;
53
- }
54
- return $retval;
55
- }
56
-
57
  /**
58
  * Gets the value of a particular setting
59
  * @param $key
@@ -66,9 +32,6 @@ if (!class_exists('C_Photocrati_Settings_Manager_Base')) {
66
 
67
  if (isset($this->_options[$key]))
68
  $retval = $this->_options[$key];
69
- elseif (($handler = $this->_get_option_handler($key, 'get'))) {
70
- $retval = $handler->get($key, $default);
71
- }
72
 
73
  // In case a stdObject has been passed in as a value, we
74
  // want to only return scalar values or arrays
@@ -83,16 +46,13 @@ if (!class_exists('C_Photocrati_Settings_Manager_Base')) {
83
  * @param mixed $value
84
  * @return mixed
85
  */
86
- function set($key, $value=NULL, $skip_handlers=FALSE)
87
  {
88
  if (is_object($value)) $value = (array) $value;
89
 
90
  if (is_array($key)) {
91
  foreach ($key as $k=>$v) $this->set($k, $v);
92
  }
93
- elseif (!$skip_handlers && ($handler = $this->_get_option_handler($key, 'set'))) {
94
- $handler->set($key, $value);
95
- }
96
  else $this->_options[$key] = $value;
97
 
98
  return $this;
@@ -104,12 +64,7 @@ if (!class_exists('C_Photocrati_Settings_Manager_Base')) {
104
  */
105
  function delete($key)
106
  {
107
- if (($handler = $this->_get_option_handler($key, 'delete'))) {
108
- $handler->delete($key);
109
- }
110
- else {
111
- unset($this->_options[$key]);
112
- }
113
  }
114
 
115
  /**
@@ -242,7 +197,6 @@ if (!class_exists('C_Photocrati_Global_Settings_Manager')) {
242
  {
243
  $this->_options = get_site_option(self::$option_name, $this->to_array());
244
  if (!$this->_options) $this->_options = array();
245
- else if (is_string($this->_options)) $this->_options = unserialize($this->_options);
246
  }
247
 
248
  function destroy()
@@ -284,8 +238,6 @@ if (!class_exists('C_Photocrati_Settings_Manager')) {
284
  function load()
285
  {
286
  $this->_options = get_option(self::$option_name, array());
287
- if (!$this->_options) $this->_options = array();
288
- else if (is_string($this->_options)) $this->_options = unserialize($this->_options);
289
  }
290
 
291
  function destroy()
7
  */
8
  abstract class C_Photocrati_Settings_Manager_Base implements ArrayAccess
9
  {
10
+ static $option_name = 'pope_settings';
11
+ protected $_options = array();
12
+ protected $_defaults = array();
 
13
 
14
  abstract function save();
15
  abstract function destroy();
20
  $this->load();
21
  }
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  /**
24
  * Gets the value of a particular setting
25
  * @param $key
32
 
33
  if (isset($this->_options[$key]))
34
  $retval = $this->_options[$key];
 
 
 
35
 
36
  // In case a stdObject has been passed in as a value, we
37
  // want to only return scalar values or arrays
46
  * @param mixed $value
47
  * @return mixed
48
  */
49
+ function set($key, $value=NULL)
50
  {
51
  if (is_object($value)) $value = (array) $value;
52
 
53
  if (is_array($key)) {
54
  foreach ($key as $k=>$v) $this->set($k, $v);
55
  }
 
 
 
56
  else $this->_options[$key] = $value;
57
 
58
  return $this;
64
  */
65
  function delete($key)
66
  {
67
+ unset($this->_options[$key]);
 
 
 
 
 
68
  }
69
 
70
  /**
197
  {
198
  $this->_options = get_site_option(self::$option_name, $this->to_array());
199
  if (!$this->_options) $this->_options = array();
 
200
  }
201
 
202
  function destroy()
238
  function load()
239
  {
240
  $this->_options = get_option(self::$option_name, array());
 
 
241
  }
242
 
243
  function destroy()
pope/lib/autoload.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
 
3
  if (!defined('POPE_VERSION')) {
4
- define('POPE_VERSION', '0.4');
5
  require_once('class.extensibleobject.php');
6
  require_once('interface.component.php');
7
  require_once('class.component.php');
1
  <?php
2
 
3
  if (!defined('POPE_VERSION')) {
4
+ define('POPE_VERSION', '0.1');
5
  require_once('class.extensibleobject.php');
6
  require_once('interface.component.php');
7
  require_once('class.component.php');
pope/lib/class.base_module.php CHANGED
@@ -33,7 +33,7 @@ abstract class C_Base_Module extends C_Component
33
  /**
34
  * Defines the module
35
  */
36
- function define($id='pope-module', $name='Pope Module', $description='', $version='', $uri='', $author='', $author_uri='', $context=FALSE)
37
  {
38
  parent::define($context);
39
  $this->implement('I_Pope_Module');
33
  /**
34
  * Defines the module
35
  */
36
+ function define($id, $name, $description='', $version='', $uri='', $author='', $author_uri='', $context=FALSE)
37
  {
38
  parent::define($context);
39
  $this->implement('I_Pope_Module');
pope/lib/class.base_product.php CHANGED
@@ -12,9 +12,9 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
12
  */
13
  abstract class C_Base_Product extends C_Base_Module
14
  {
15
- function define($id='pope-product', $name='Pope Product', $description='', $version='', $uri='', $author='', $author_uri='', $context=FALSE)
16
  {
17
- parent::define($id, $name, $description, $version, $uri, $author, $author_uri, $context);
18
 
19
  $this->get_registry()->add_product($this->module_id, $this);
20
  }
12
  */
13
  abstract class C_Base_Product extends C_Base_Module
14
  {
15
+ function define($id, $name, $description='', $version='', $uri='', $author='', $author_uri='')
16
  {
17
+ parent::define($id, $name, $description, $version, $uri, $author, $author_uri);
18
 
19
  $this->get_registry()->add_product($this->module_id, $this);
20
  }
pope/lib/class.component_factory.php CHANGED
@@ -7,9 +7,9 @@ class C_Component_Factory extends C_Component
7
  {
8
  static $_instances = array();
9
 
10
- function define($context=FALSE)
11
  {
12
- parent::define($context);
13
  $this->implement('I_Component_Factory');
14
  }
15
 
7
  {
8
  static $_instances = array();
9
 
10
+ function define()
11
  {
12
+ parent::define();
13
  $this->implement('I_Component_Factory');
14
  }
15
 
pope/lib/class.extensibleobject.php CHANGED
@@ -750,7 +750,7 @@ class ExtensibleObject extends PopeHelpers
750
  */
751
  function __call($method, $args)
752
  {
753
- $this->reset_method_properties($method, $args);
754
 
755
  // Run pre hooks?
756
  if ($this->are_pre_hooks_enabled($method) && $this->get_method_property($method, self::METHOD_PROPERTY_RUN_PRE_HOOKS)) {
@@ -833,10 +833,7 @@ class ExtensibleObject extends PopeHelpers
833
  }
834
  }
835
 
836
- // Get return value, clear all method properties, and then return
837
- $retval = $this->get_method_property($method, self::METHOD_PROPERTY_RETURN_VALUE);
838
- $this->remove_method_properties($method);
839
- return $retval;
840
  }
841
 
842
 
@@ -1184,7 +1181,7 @@ class ExtensibleObject extends PopeHelpers
1184
  * before every method call (before pre-hooks)
1185
  * @param string $method
1186
  */
1187
- function reset_method_properties($method, $args=array())
1188
  {
1189
  $this->_method_properties[$method] = array(
1190
  'run' => TRUE,
@@ -1194,35 +1191,6 @@ class ExtensibleObject extends PopeHelpers
1194
  );
1195
  }
1196
 
1197
- /**
1198
- * Removes the cache of the method properties
1199
- * @param $method
1200
- */
1201
- function remove_method_properties($method)
1202
- {
1203
- unset($this->_method_properties[$method]);
1204
- }
1205
-
1206
- /**
1207
- * Gets all method properties
1208
- * @return array
1209
- */
1210
- function get_method_properties($method)
1211
- {
1212
- return $this->_method_properties[$method];
1213
- }
1214
-
1215
- /**
1216
- * Sets all method properties
1217
- * @param $method
1218
- * @param $props
1219
- */
1220
- function set_method_properties($method, $props)
1221
- {
1222
- foreach ($props as $key => $value) {
1223
- $this->set_method_property($method, $key, $value);
1224
- }
1225
- }
1226
 
1227
  /**
1228
  * Returns TRUE if the ExtensibleObject has decided to implement a
@@ -1323,9 +1291,6 @@ class Mixin extends PopeHelpers
1323
  $backtrace = debug_backtrace();
1324
  $klass = get_class($backtrace[0]['object']);
1325
 
1326
- // Get the method properties. We'll store this afterwards.
1327
- $props = $this->object->get_method_properties($method);
1328
-
1329
  // Perform the routine described above...
1330
  $this->object->disable_pre_hooks($method);
1331
  $this->object->disable_post_hooks($method);
@@ -1343,9 +1308,6 @@ class Mixin extends PopeHelpers
1343
  $this->object->enable_post_hooks($method);
1344
  $this->object->enable_mixin($method, $klass);
1345
 
1346
- // Re-set all method properties
1347
- $this->object->set_method_properties($method, $props);
1348
-
1349
  return $retval;
1350
  }
1351
 
@@ -1404,7 +1366,7 @@ class Hook extends Mixin
1404
  * Provides an alias for call_anchor, as there's no parent
1405
  * to call in the context of a hook.
1406
  */
1407
- function call_parent($method)
1408
  {
1409
  $args = func_get_args();
1410
  return call_user_func_array(
750
  */
751
  function __call($method, $args)
752
  {
753
+ $this->clear_method_properties($method, $args);
754
 
755
  // Run pre hooks?
756
  if ($this->are_pre_hooks_enabled($method) && $this->get_method_property($method, self::METHOD_PROPERTY_RUN_PRE_HOOKS)) {
833
  }
834
  }
835
 
836
+ return $this->get_method_property($method, self::METHOD_PROPERTY_RETURN_VALUE);
 
 
 
837
  }
838
 
839
 
1181
  * before every method call (before pre-hooks)
1182
  * @param string $method
1183
  */
1184
+ function clear_method_properties($method, $args=array())
1185
  {
1186
  $this->_method_properties[$method] = array(
1187
  'run' => TRUE,
1191
  );
1192
  }
1193
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1194
 
1195
  /**
1196
  * Returns TRUE if the ExtensibleObject has decided to implement a
1291
  $backtrace = debug_backtrace();
1292
  $klass = get_class($backtrace[0]['object']);
1293
 
 
 
 
1294
  // Perform the routine described above...
1295
  $this->object->disable_pre_hooks($method);
1296
  $this->object->disable_post_hooks($method);
1308
  $this->object->enable_post_hooks($method);
1309
  $this->object->enable_mixin($method, $klass);
1310
 
 
 
 
1311
  return $retval;
1312
  }
1313
 
1366
  * Provides an alias for call_anchor, as there's no parent
1367
  * to call in the context of a hook.
1368
  */
1369
+ function call_parent()
1370
  {
1371
  $args = func_get_args();
1372
  return call_user_func_array(
products/photocrati_nextgen/modules/ajax/class.ajax_controller.php CHANGED
@@ -12,8 +12,10 @@ class C_Ajax_Controller extends C_MVC_Controller
12
 
13
  function index_action()
14
  {
15
- // Start an output buffer to avoid displaying any PHP warnings/errors
16
- ob_start();
 
 
17
 
18
  // Inform the MVC framework what type of content we're returning
19
  $this->set_content_type('json');
@@ -30,13 +32,11 @@ class C_Ajax_Controller extends C_MVC_Controller
30
  if (!$retval)
31
  $retval = array('error' => 'Not a valid AJAX action');
32
 
33
- // Flush the buffer
34
- while (ob_get_level() > 0) {
35
- ob_end_clean();
36
- }
37
-
38
  // Return the JSON to the browser
39
  echo json_encode($retval);
 
 
 
40
  }
41
 
42
  /**
12
 
13
  function index_action()
14
  {
15
+ $retval = FALSE;
16
+ $error_reporting = error_reporting(
17
+ E_CORE_ERROR|E_CORE_WARNING|E_COMPILE_ERROR|E_ERROR|E_PARSE|E_USER_ERROR|E_USER_WARNING|E_RECOVERABLE_ERROR
18
+ );
19
 
20
  // Inform the MVC framework what type of content we're returning
21
  $this->set_content_type('json');
32
  if (!$retval)
33
  $retval = array('error' => 'Not a valid AJAX action');
34
 
 
 
 
 
 
35
  // Return the JSON to the browser
36
  echo json_encode($retval);
37
+
38
+ // reset the reporting level
39
+ error_reporting($error_reporting);
40
  }
41
 
42
  /**
products/photocrati_nextgen/modules/ajax/class.ajax_installer.php CHANGED
@@ -2,12 +2,29 @@
2
 
3
  class C_Ajax_Installer
4
  {
 
 
 
 
 
 
 
 
 
 
5
  function install()
6
  {
7
- // Delete cached values. Needed for 2.0.7 and less
8
- $settings = C_NextGen_Settings::get_instance();
9
- $settings->delete('ajax_url');
10
- $settings->delete('ajax_slug');
11
- $settings->delete('ajax_js_url');
 
 
 
 
 
 
 
12
  }
13
  }
2
 
3
  class C_Ajax_Installer
4
  {
5
+ function __construct()
6
+ {
7
+ $this->settings = C_NextGen_Global_Settings::get_instance();
8
+ }
9
+
10
+ function get_registry()
11
+ {
12
+ return C_Component_Registry::get_instance();
13
+ }
14
+
15
  function install()
16
  {
17
+ $slug = 'photocrati_ajax';
18
+ $router = $this->get_registry()->get_utility('I_Router');
19
+
20
+ $this->settings->set_default_value('ajax_slug', $slug);
21
+ $this->settings->set_default_value('ajax_url', $router->get_url($slug, FALSE));
22
+ $this->settings->set_default_value('ajax_js_url', $router->get_url($slug . '/js', FALSE));
23
+ }
24
+
25
+ function uninstall($hard=FALSE)
26
+ {
27
+ if ($hard) foreach (array('ajax_slug', 'ajax_url', 'ajax_js_url') as $key)
28
+ $this->settings->delete($key);
29
  }
30
  }
products/photocrati_nextgen/modules/ajax/class.ajax_option_handler.php DELETED
@@ -1,29 +0,0 @@
1
- <?php
2
-
3
- class C_Ajax_Option_Handler
4
- {
5
- private $slug = 'photocrati_ajax';
6
-
7
- function get_router()
8
- {
9
- return C_Component_Registry::get_instance()->get_utility('I_Router');
10
- }
11
-
12
- function get($key, $default=NULL)
13
- {
14
- $retval = $default;
15
-
16
- switch($key) {
17
- case 'ajax_slug':
18
- $retval = $this->slug;
19
- break;
20
- case 'ajax_url':
21
- $retval = $this->get_router()->get_url($this->slug, FALSE);
22
- break;
23
- case 'ajax_js_url':
24
- $retval = $this->get_router()->get_static_url('photocrati-ajax#ajax.js');
25
- break;
26
- }
27
- return $retval;
28
- }
29
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/ajax/module.ajax.php CHANGED
@@ -14,19 +14,12 @@ class M_Ajax extends C_Base_Module
14
  'photocrati-ajax',
15
  'AJAX',
16
  'Provides AJAX functionality',
17
- '0.5',
18
  'http://www.photocrati.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
21
  );
22
 
23
- include_once('class.ajax_option_handler.php');
24
- C_NextGen_Settings::add_option_handler('C_Ajax_Option_Handler', array(
25
- 'ajax_slug',
26
- 'ajax_url',
27
- 'ajax_js_url'
28
- ));
29
-
30
  include_once('class.ajax_installer.php');
31
  C_Photocrati_Installer::add_handler($this->module_id, 'C_Ajax_Installer');
32
  }
@@ -47,7 +40,8 @@ class M_Ajax extends C_Base_Module
47
  */
48
  function _register_hooks()
49
  {
50
- add_action('init', array(&$this, 'enqueue_scripts'), 9);
 
51
  }
52
 
53
 
@@ -56,19 +50,18 @@ class M_Ajax extends C_Base_Module
56
  */
57
  function enqueue_scripts()
58
  {
59
- $settings = C_NextGen_Settings::get_instance();
60
  $router = $this->get_registry()->get_utility('I_Router');
61
 
62
- $site_url = $router->get_base_url(TRUE);
63
- $home_url = $router->get_base_url();
64
 
65
- wp_register_script('photocrati_ajax', $settings->ajax_js_url);
66
  wp_enqueue_script('photocrati_ajax');
67
 
68
  $vars = array(
69
- 'url' => $router->get_url($settings->ajax_slug, FALSE),
70
- 'wp_site_url' => $home_url,
71
- 'wp_site_static_url' => str_replace('/index.php', '', str_replace('/index.php', '', $site_url))
72
  );
73
  wp_localize_script('photocrati_ajax', 'photocrati_ajax', $vars);
74
  }
14
  'photocrati-ajax',
15
  'AJAX',
16
  'Provides AJAX functionality',
17
+ '0.1',
18
  'http://www.photocrati.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
21
  );
22
 
 
 
 
 
 
 
 
23
  include_once('class.ajax_installer.php');
24
  C_Photocrati_Installer::add_handler($this->module_id, 'C_Ajax_Installer');
25
  }
40
  */
41
  function _register_hooks()
42
  {
43
+ add_action('init', array(&$this, 'enqueue_scripts'));
44
+ add_action('admin_init', array(&$this, 'enqueue_scripts'));
45
  }
46
 
47
 
50
  */
51
  function enqueue_scripts()
52
  {
53
+ $settings = C_NextGen_Global_Settings::get_instance();
54
  $router = $this->get_registry()->get_utility('I_Router');
55
 
56
+ $site_url = $router->get_base_url();
 
57
 
58
+ wp_register_script('photocrati_ajax', $router->get_static_url('photocrati-ajax#ajax.js'));
59
  wp_enqueue_script('photocrati_ajax');
60
 
61
  $vars = array(
62
+ 'url' => $settings->ajax_url,
63
+ 'wp_site_url' => $site_url,
64
+ 'wp_site_static_url' => str_replace('/index.php', '', $site_url)
65
  );
66
  wp_localize_script('photocrati_ajax', 'photocrati_ajax', $vars);
67
  }
products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php CHANGED
@@ -167,7 +167,7 @@ class A_Attach_To_Post_Ajax extends Mixin
167
  }
168
 
169
  // Get the thumbnail
170
- $entity->thumb_url = $storage->get_image_url($image, 'thumb', TRUE);
171
  $entity->thumb_html = $storage->get_image_html($image, 'thumb');
172
  $entity->max_width = $settings->thumbwidth;
173
  $entity->max_height = $settings->thumbheight;
@@ -189,7 +189,7 @@ class A_Attach_To_Post_Ajax extends Mixin
189
  $mapper = $this->object->get_registry()->get_utility('I_Displayed_Gallery_Mapper');
190
 
191
  // Do we have fields to work with?
192
- if ($this->object->validate_ajax_request(true) && ($params = json_decode($this->object->param('displayed_gallery')))) {
193
 
194
  // Existing displayed gallery ?
195
  if (($id = $this->object->param('id'))) {
@@ -200,7 +200,7 @@ class A_Attach_To_Post_Ajax extends Mixin
200
  }
201
  else {
202
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
203
- $displayed_gallery = $factory->create('displayed_gallery', $params, $mapper);
204
  }
205
 
206
  // Save the changes
167
  }
168
 
169
  // Get the thumbnail
170
+ $entity->thumb_url = $storage->get_image_url($image, 'thumb');
171
  $entity->thumb_html = $storage->get_image_html($image, 'thumb');
172
  $entity->max_width = $settings->thumbwidth;
173
  $entity->max_height = $settings->thumbheight;
189
  $mapper = $this->object->get_registry()->get_utility('I_Displayed_Gallery_Mapper');
190
 
191
  // Do we have fields to work with?
192
+ if ($this->object->validate_ajax_request(true) && ($params = $this->object->param('displayed_gallery'))) {
193
 
194
  // Existing displayed gallery ?
195
  if (($id = $this->object->param('id'))) {
200
  }
201
  else {
202
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
203
+ $displayed_gallery = $factory->create('displayed_gallery', $mapper, $params);
204
  }
205
 
206
  // Save the changes
products/photocrati_nextgen/modules/attach_to_post/adapter.gallery_storage_frame_event.php CHANGED
@@ -29,19 +29,11 @@ class A_Gallery_Storage_Frame_Event extends Mixin
29
  $storage->get_thumb_url($image)
30
  );
31
 
32
- if (is_admin()) {
33
-
34
- $event = new stdClass();
35
- $event->pid = $image->{$image->id_field};
36
- $event->id_field = $image->id_field;
37
- $event->thumb_url = $image->thumb_url;
38
-
39
- $events->add_event(
40
- array(
41
- 'event' => 'thumbnail_modified',
42
- 'image' => $event,
43
- )
44
- );
45
- }
46
  }
47
  }
29
  $storage->get_thumb_url($image)
30
  );
31
 
32
+ $events->add_event(
33
+ array(
34
+ 'event' => 'thumbnail_modified',
35
+ 'image' => $image,
36
+ )
37
+ );
 
 
 
 
 
 
 
 
38
  }
39
  }
products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php CHANGED
@@ -4,8 +4,6 @@ class C_Attach_Controller extends C_NextGen_Admin_Page_Controller
4
  {
5
  static $_instances = array();
6
  var $_displayed_gallery;
7
- var $_marked_scripts;
8
- var $_is_rendering;
9
 
10
  static function &get_instance($context)
11
  {
@@ -30,56 +28,6 @@ class C_Attach_Controller extends C_NextGen_Admin_Page_Controller
30
  {
31
  parent::initialize();
32
  $this->_load_displayed_gallery();
33
-
34
- $this->_marked_scripts = array();
35
-
36
- if (did_action('wp_print_scripts')) {
37
- $this->_handle_scripts();
38
- }
39
- else {
40
- add_action('wp_print_scripts', array($this, '_handle_scripts'), 9999);
41
- }
42
- }
43
-
44
- function _handle_scripts()
45
- {
46
- if (is_admin() && $this->_is_rendering)
47
- {
48
- global $wp_scripts;
49
-
50
- $queue = $wp_scripts->queue;
51
- $marked = $this->_marked_scripts;
52
-
53
- foreach ($marked as $tag => $value) {
54
- $this->_handle_script($tag, $queue);
55
- }
56
-
57
- foreach ($queue as $extra) {
58
- wp_dequeue_script($extra);
59
- }
60
- }
61
- }
62
-
63
- function _handle_script($tag, &$queue)
64
- {
65
- global $wp_scripts;
66
-
67
- $registered = $wp_scripts->registered;
68
-
69
- $idx = array_search($tag, $queue);
70
- if ($idx !== false) {
71
- unset($queue[$idx]);
72
- }
73
-
74
- if (isset($registered[$tag])) {
75
- $script = $registered[$tag];
76
-
77
- if ($script->deps) {
78
- foreach ($script->deps as $dep) {
79
- $this->_handle_script($dep, $queue);
80
- }
81
- }
82
- }
83
  }
84
  }
85
 
@@ -92,37 +40,30 @@ class Mixin_Attach_To_Post extends Mixin
92
  $this->object->_displayed_gallery = $mapper->create();
93
  }
94
  }
95
-
96
- function mark_script($script_tag)
97
- {
98
- $this->object->_marked_scripts[$script_tag] = true;
99
- }
100
 
101
  function enqueue_backend_resources()
102
  {
103
  $this->call_parent('enqueue_backend_resources');
 
 
 
 
 
104
  // Enqueue frame event publishing
105
  wp_enqueue_script('frame_event_publisher');
106
- $this->object->mark_script('frame_event_publisher');
107
 
108
  // Enqueue JQuery UI libraries
109
  wp_enqueue_script('jquery-ui-tabs');
110
  wp_enqueue_script('jquery-ui-sortable');
111
- wp_enqueue_script('jquery-ui-tooltip');
112
  wp_enqueue_script('ngg_tabs', $this->get_static_url('photocrati-attach_to_post#ngg_tabs.js'));
113
- $this->object->mark_script('jquery-ui-tabs');
114
- $this->object->mark_script('jquery-ui-sortable');
115
- $this->object->mark_script('jquery-ui-tooltip');
116
- $this->object->mark_script('ngg_tabs');
117
 
118
  // Ensure select2
119
  wp_enqueue_style('select2');
120
  wp_enqueue_script('select2');
121
- $this->object->mark_script('select2');
122
 
123
  // Ensure that the Photocrati AJAX library is loaded
124
  wp_enqueue_script('photocrati_ajax');
125
- $this->object->mark_script('photocrati_ajax');
126
 
127
  // Enqueue logic for the Attach to Post interface as a whole
128
  wp_enqueue_script(
@@ -131,11 +72,9 @@ class Mixin_Attach_To_Post extends Mixin
131
  wp_enqueue_style(
132
  'ngg_attach_to_post', $this->get_static_url('photocrati-attach_to_post#attach_to_post.css')
133
  );
134
- $this->object->mark_script('ngg_attach_to_post');
135
 
136
  // Enqueue backbone.js library, required by the Attach to Post display tab
137
  wp_enqueue_script('backbone'); // provided by WP
138
- $this->object->mark_script('backbone');
139
 
140
  // Ensure underscore sting, a helper utility
141
  wp_enqueue_script(
@@ -144,10 +83,9 @@ class Mixin_Attach_To_Post extends Mixin
144
  array('underscore'),
145
  '2.3.0'
146
  );
147
- $this->object->mark_script('underscore.string');
148
 
149
  // Enqueue the backbone app for the display tab
150
- $settings = C_NextGen_Settings::get_instance();
151
  $preview_url = $settings->gallery_preview_url;
152
  $display_tab_js_url = $settings->attach_to_post_display_tab_js_url;
153
  if ($this->object->_displayed_gallery->id()) {
@@ -164,15 +102,6 @@ class Mixin_Attach_To_Post extends Mixin
164
  'ngg_displayed_gallery_preview_url',
165
  $settings->gallery_preview_url
166
  );
167
- $this->object->mark_script('ngg_display_tab');
168
-
169
- // TODO: for now mark Pro scripts to ensure they are enqueued properly, remove this after Pro upgrade with tagging added
170
- $display_types = array('photocrati-nextgen_pro_slideshow', 'photocrati-nextgen_pro_horizontal_filmstrip', 'photocrati-nextgen_pro_thumbnail_grid', 'photocrati-nextgen_pro_blog_gallery', 'photocrati-nextgen_pro_film');
171
- foreach ($display_types as $display_type) {
172
- $this->object->mark_script($display_type . '-js');
173
- }
174
-
175
- $this->object->mark_script('nextgen_pro_albums_settings_script');
176
  }
177
 
178
  /**
@@ -181,9 +110,7 @@ class Mixin_Attach_To_Post extends Mixin
181
  function index_action($return=FALSE)
182
  {
183
  if ($this->object->_displayed_gallery->is_new()) $this->object->expires("+2 hour");
184
-
185
- $this->object->_is_rendering = true;
186
-
187
  // Enqueue resources
188
  return $this->object->render_view('photocrati-attach_to_post#attach_to_post', array(
189
  'page_title' => $this->object->_get_page_title(),
@@ -308,8 +235,8 @@ class Mixin_Attach_To_Post extends Mixin
308
  */
309
  function _render_ngg_page_in_frame($page, $tab_id = null)
310
  {
311
- $frame_url = admin_url("/admin.php?page={$page}&attach_to_post");
312
- $frame_url = nextgen_esc_url($frame_url);
313
 
314
  if ($tab_id) {
315
  $tab_id = " id='ngg-iframe-{$tab_id}'";
4
  {
5
  static $_instances = array();
6
  var $_displayed_gallery;
 
 
7
 
8
  static function &get_instance($context)
9
  {
28
  {
29
  parent::initialize();
30
  $this->_load_displayed_gallery();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  }
32
  }
33
 
40
  $this->object->_displayed_gallery = $mapper->create();
41
  }
42
  }
 
 
 
 
 
43
 
44
  function enqueue_backend_resources()
45
  {
46
  $this->call_parent('enqueue_backend_resources');
47
+
48
+ // wp_auth_check_load invokes functions not defined yet
49
+ remove_action('admin_enqueue_scripts', 'wp_auth_check_load');
50
+ do_action('admin_enqueue_scripts');
51
+
52
  // Enqueue frame event publishing
53
  wp_enqueue_script('frame_event_publisher');
 
54
 
55
  // Enqueue JQuery UI libraries
56
  wp_enqueue_script('jquery-ui-tabs');
57
  wp_enqueue_script('jquery-ui-sortable');
58
+ wp_enqueue_script('jquery-ui-tooltip');
59
  wp_enqueue_script('ngg_tabs', $this->get_static_url('photocrati-attach_to_post#ngg_tabs.js'));
 
 
 
 
60
 
61
  // Ensure select2
62
  wp_enqueue_style('select2');
63
  wp_enqueue_script('select2');
 
64
 
65
  // Ensure that the Photocrati AJAX library is loaded
66
  wp_enqueue_script('photocrati_ajax');
 
67
 
68
  // Enqueue logic for the Attach to Post interface as a whole
69
  wp_enqueue_script(
72
  wp_enqueue_style(
73
  'ngg_attach_to_post', $this->get_static_url('photocrati-attach_to_post#attach_to_post.css')
74
  );
 
75
 
76
  // Enqueue backbone.js library, required by the Attach to Post display tab
77
  wp_enqueue_script('backbone'); // provided by WP
 
78
 
79
  // Ensure underscore sting, a helper utility
80
  wp_enqueue_script(
83
  array('underscore'),
84
  '2.3.0'
85
  );
 
86
 
87
  // Enqueue the backbone app for the display tab
88
+ $settings = C_NextGen_Global_Settings::get_instance();
89
  $preview_url = $settings->gallery_preview_url;
90
  $display_tab_js_url = $settings->attach_to_post_display_tab_js_url;
91
  if ($this->object->_displayed_gallery->id()) {
102
  'ngg_displayed_gallery_preview_url',
103
  $settings->gallery_preview_url
104
  );
 
 
 
 
 
 
 
 
 
105
  }
106
 
107
  /**
110
  function index_action($return=FALSE)
111
  {
112
  if ($this->object->_displayed_gallery->is_new()) $this->object->expires("+2 hour");
113
+
 
 
114
  // Enqueue resources
115
  return $this->object->render_view('photocrati-attach_to_post#attach_to_post', array(
116
  'page_title' => $this->object->_get_page_title(),
235
  */
236
  function _render_ngg_page_in_frame($page, $tab_id = null)
237
  {
238
+ $frame_url = real_site_url("/wp-admin/admin.php?page={$page}&attach_to_post");
239
+ $frame_url = esc_url($frame_url);
240
 
241
  if ($tab_id) {
242
  $tab_id = " id='ngg-iframe-{$tab_id}'";
products/photocrati_nextgen/modules/attach_to_post/class.attach_to_post_installer.php CHANGED
@@ -2,12 +2,33 @@
2
 
3
  class C_Attach_To_Post_Installer
4
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  function install()
6
  {
7
- // Delete cached values. Needed for 2.0.7 and less
8
- $settings = C_NextGen_Settings::get_instance();
9
- $settings->delete('attach_to_post_url');
10
- $settings->delete('gallery_preview_url');
11
- $settings->delete('attach_to_post_display_tab_js_url');
 
 
 
 
12
  }
13
  }
2
 
3
  class C_Attach_To_Post_Installer
4
  {
5
+ function get_registry()
6
+ {
7
+ return C_Component_Registry::get_instance();
8
+ }
9
+
10
+ function __construct()
11
+ {
12
+ $this->settings = C_NextGen_Global_Settings::get_instance();
13
+
14
+ $router = $this->get_registry()->get_utility('I_Router');
15
+ $this->defaults = array(
16
+ 'attach_to_post_url' => $router->get_url('/nextgen-attach_to_post', FALSE),
17
+ 'gallery_preview_url' => $router->get_url('/nextgen-attach_to_post/preview', FALSE),
18
+ 'attach_to_post_display_tab_js_url' => $router->get_url('/nextgen-attach_to_post/display_tab_js', FALSE)
19
+ );
20
+ }
21
+
22
  function install()
23
  {
24
+ foreach ($this->defaults as $key => $val) {
25
+ $this->settings->set_default_value($key, $val);
26
+ }
27
+ }
28
+
29
+ function uninstall($hard=FALSE)
30
+ {
31
+ if ($hard) foreach (array_keys($this->defaults) as $key)
32
+ $this->settings->delete($key);
33
  }
34
  }
products/photocrati_nextgen/modules/attach_to_post/class.attach_to_post_option_handler.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
-
3
- class C_Attach_To_Post_Option_Handler
4
- {
5
- function get_router()
6
- {
7
- return C_Component_Registry::get_instance()->get_utility('I_Router');
8
- }
9
-
10
- function get($key, $default=NULL)
11
- {
12
- $retval = $default;
13
-
14
- switch ($key) {
15
- case 'attach_to_post_url':
16
- $retval = $this->get_router()->get_url('/nextgen-attach_to_post', FALSE);
17
- break;
18
- case 'gallery_preview_url':
19
- $retval = $this->get_router()->get_url('/nextgen-attach_to_post/preview', FALSE);
20
- break;
21
- case 'attach_to_post_display_tab_js_url':
22
- $retval = $this->get_router()->get_url('/nextgen-attach_to_post/display_tab_js', FALSE);
23
- break;
24
- }
25
-
26
- return $retval;
27
- }
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php CHANGED
@@ -15,16 +15,11 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin
15
 
16
  // Ensure that JS is returned
17
  $this->object->set_content_type('javascript');
18
-
19
- while (ob_get_level() > 0) {
20
- ob_end_clean();
21
- }
22
 
23
  // Get all entities used by the display tab
24
  $context = 'attach_to_post';
25
  $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper', $context);
26
  $album_mapper = $this->get_registry()->get_utility('I_Album_Mapper', $context);
27
- $image_mapper = $this->get_registry()->get_utility('I_Image_Mapper', $context);
28
  $display_type_mapper= $this->get_registry()->get_utility('I_Display_Type_Mapper', $context);
29
  $source_mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Source_Mapper', $context);
30
  $security = $this->get_registry()->get_utility('I_Security_Manager');
@@ -46,7 +41,7 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin
46
 
47
  usort($display_types, array($this->object, '_display_type_list_sort'));
48
 
49
- $output = $this->object->render_view('photocrati-attach_to_post#display_tab_js', array(
50
  'displayed_gallery' => json_encode($this->object->_displayed_gallery->get_entity()),
51
  'sources' => json_encode($source_mapper->select()->order_by('title')->run_query()),
52
  'gallery_primary_key' => $gallery_mapper->get_primary_key_column(),
@@ -54,11 +49,8 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin
54
  'albums' => json_encode($album_mapper->find_all()),
55
  'tags' => json_encode($tags),
56
  'display_types' => json_encode($display_types),
57
- 'sec_token' => $security->get_request_token('nextgen_edit_displayed_gallery')->get_json(),
58
- 'image_primary_key' => $image_mapper->get_primary_key_column()
59
  ), $return);
60
-
61
- return $output;
62
  }
63
 
64
  function _display_type_list_sort($type_1, $type_2)
@@ -91,11 +83,6 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin
91
  */
92
  function _get_display_tabs()
93
  {
94
- // The ATP requires more memmory than some applications, somewhere around 60MB.
95
- // Because it's such an important feature of NextGEN Gallery, we temporarily disable
96
- // any memory limits
97
- @ini_set('memory_limit', -1);
98
-
99
  return array(
100
  $this->object->_render_display_types_tab(),
101
  $this->object->_render_display_source_tab(),
@@ -207,7 +194,7 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin
207
  $retval = array();
208
 
209
  // Get all display setting forms
210
- $form_manager = C_Form_Manager::get_instance();
211
  $forms = $form_manager->get_forms(
212
  NEXTGEN_DISPLAY_SETTINGS_SLUG, TRUE
213
  );
15
 
16
  // Ensure that JS is returned
17
  $this->object->set_content_type('javascript');
 
 
 
 
18
 
19
  // Get all entities used by the display tab
20
  $context = 'attach_to_post';
21
  $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper', $context);
22
  $album_mapper = $this->get_registry()->get_utility('I_Album_Mapper', $context);
 
23
  $display_type_mapper= $this->get_registry()->get_utility('I_Display_Type_Mapper', $context);
24
  $source_mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Source_Mapper', $context);
25
  $security = $this->get_registry()->get_utility('I_Security_Manager');
41
 
42
  usort($display_types, array($this->object, '_display_type_list_sort'));
43
 
44
+ return $this->object->render_view('photocrati-attach_to_post#display_tab_js', array(
45
  'displayed_gallery' => json_encode($this->object->_displayed_gallery->get_entity()),
46
  'sources' => json_encode($source_mapper->select()->order_by('title')->run_query()),
47
  'gallery_primary_key' => $gallery_mapper->get_primary_key_column(),
49
  'albums' => json_encode($album_mapper->find_all()),
50
  'tags' => json_encode($tags),
51
  'display_types' => json_encode($display_types),
52
+ 'sec_token' => $security->get_request_token('nextgen_edit_displayed_gallery')->get_json()
 
53
  ), $return);
 
 
54
  }
55
 
56
  function _display_type_list_sort($type_1, $type_2)
83
  */
84
  function _get_display_tabs()
85
  {
 
 
 
 
 
86
  return array(
87
  $this->object->_render_display_types_tab(),
88
  $this->object->_render_display_source_tab(),
194
  $retval = array();
195
 
196
  // Get all display setting forms
197
+ $form_manager = $this->get_registry()->get_utility('I_Form_Manager');
198
  $forms = $form_manager->get_forms(
199
  NEXTGEN_DISPLAY_SETTINGS_SLUG, TRUE
200
  );
products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php CHANGED
@@ -23,28 +23,15 @@ class M_Attach_To_Post extends C_Base_Module
23
  'photocrati-attach_to_post',
24
  'Attach To Post',
25
  'Provides the "Attach to Post" interface for displaying galleries and albums',
26
- '0.8',
27
  'http://www.nextgen-gallery.com',
28
  'Photocrati Media',
29
  'http://www.photocrati.com',
30
  $context
31
  );
32
 
33
- include_once('class.attach_to_post_option_handler.php');
34
- C_NextGen_Settings::add_option_handler('C_Attach_To_Post_Option_Handler', array(
35
- 'attach_to_post_url',
36
- 'gallery_preview_url',
37
- 'attach_to_post_display_tab_js_url'
38
- ));
39
-
40
  include_once('class.attach_to_post_installer.php');
41
  C_Photocrati_Installer::add_handler($this->module_id, 'C_Attach_To_Post_Installer');
42
-
43
- $uri = strtolower($_SERVER['REQUEST_URI']);
44
-
45
- if (strpos($uri, '/nextgen-attach_to_post') !== false) {
46
- define('WP_ADMIN', true);
47
- }
48
  }
49
 
50
  /**
@@ -120,7 +107,7 @@ class M_Attach_To_Post extends C_Base_Module
120
  add_action('after_delete_post', array(&$this, 'cleanup_displayed_galleries'));
121
 
122
  // Add hook to subsitute displayed gallery placeholders
123
- add_filter('the_content', array(&$this, 'substitute_placeholder_imgs'), PHP_INT_MAX, 1);
124
 
125
  // Emit frame communication events
126
  add_action('ngg_created_new_gallery', array(&$this, 'new_gallery_event'));
@@ -136,42 +123,72 @@ class M_Attach_To_Post extends C_Base_Module
136
  */
137
  function substitute_placeholder_imgs($content)
138
  {
139
- // Get some utilities
140
- $mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Mapper');
141
- $router = $this->get_registry()->get_utility('I_Router');
142
-
143
- // To match ATP entries we compare the stored url against a generic path
144
- // We must check HTTP and HTTPS as well as permalink and non-permalink forms
145
- $preview_url = parse_url($router->join_paths(
146
- $router->remove_url_segment('index.php', $router->get_base_url()),
147
- '/nextgen-attach_to_post/preview'
148
- ));
149
- $preview_url = preg_quote($preview_url['host'] . $preview_url['path'], '#');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
 
151
- $alt_preview_url = parse_url($router->join_paths(
152
- $router->remove_url_segment('index.php', $router->get_base_url()),
153
- 'index.php/nextgen-attach_to_post/preview'
154
- ));
155
- $alt_preview_url = preg_quote($alt_preview_url['host'] . $alt_preview_url['path'], '#');
156
 
157
- // The placeholder MUST have a gallery instance id
158
- if (preg_match_all("#<img.*http(s)?://({$preview_url}|{$alt_preview_url})/id--(\\d+).*\\/>#mi", $content, $matches, PREG_SET_ORDER)) {
159
- foreach ($matches as $match) {
160
- // Find the displayed gallery
161
- $displayed_gallery_id = $match[3];
162
- $displayed_gallery = $mapper->find($displayed_gallery_id, TRUE);
163
-
164
- // Get the content for the displayed gallery
165
- $retval = '<p>'._('Invalid Displayed Gallery').'</p>';
166
- if ($displayed_gallery) {
167
- $renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
168
- $retval = $renderer->render($displayed_gallery, TRUE);
169
- }
170
- $content = str_replace($match[0], $retval, $content);
171
- }
172
- }
173
-
174
- return $content;
175
  }
176
 
177
  /**
@@ -184,6 +201,13 @@ class M_Attach_To_Post extends C_Base_Module
184
  // Enqueue resources needed at post/page level
185
  if (preg_match("/\/wp-admin\/(post|post-new)\.php$/", $_SERVER['SCRIPT_NAME'])) {
186
  $this->_enqueue_tinymce_resources();
 
 
 
 
 
 
 
187
  wp_enqueue_style(
188
  'ngg_attach_to_post_dialog', $router->get_static_url('photocrati-attach_to_post#attach_to_post_dialog.css')
189
  );
@@ -205,7 +229,7 @@ class M_Attach_To_Post extends C_Base_Module
205
  wp_localize_script(
206
  'media-editor',
207
  'nextgen_gallery_attach_to_post_url',
208
- C_NextGen_Settings::get_instance()->attach_to_post_url
209
  );
210
 
211
  // Registers our tinymce button and plugin for attaching galleries
@@ -303,13 +327,12 @@ class M_Attach_To_Post extends C_Base_Module
303
  function new_gallery_event($gallery_id)
304
  {
305
  $gallery = $this->get_registry()->get_utility('I_Gallery_Mapper')->find($gallery_id);
306
- if ($gallery) {
307
- $this->_get_frame_event_publisher()->add_event(array(
308
- 'event' => 'new_gallery',
309
- 'gallery_id'=> intval($gallery_id),
310
- 'gallery_title' => $gallery->title
311
- ));
312
- }
313
  }
314
 
315
  /**
23
  'photocrati-attach_to_post',
24
  'Attach To Post',
25
  'Provides the "Attach to Post" interface for displaying galleries and albums',
26
+ '0.3',
27
  'http://www.nextgen-gallery.com',
28
  'Photocrati Media',
29
  'http://www.photocrati.com',
30
  $context
31
  );
32
 
 
 
 
 
 
 
 
33
  include_once('class.attach_to_post_installer.php');
34
  C_Photocrati_Installer::add_handler($this->module_id, 'C_Attach_To_Post_Installer');
 
 
 
 
 
 
35
  }
36
 
37
  /**
107
  add_action('after_delete_post', array(&$this, 'cleanup_displayed_galleries'));
108
 
109
  // Add hook to subsitute displayed gallery placeholders
110
+ add_filter('the_content', array(&$this, 'substitute_placeholder_imgs'), 1000, 1);
111
 
112
  // Emit frame communication events
113
  add_action('ngg_created_new_gallery', array(&$this, 'new_gallery_event'));
123
  */
124
  function substitute_placeholder_imgs($content)
125
  {
126
+ // Load html into parser
127
+ $doc = new simple_html_dom();
128
+ if ($content) {
129
+ $doc->load($content);
130
+
131
+ // Find all placeholder images
132
+ $imgs = $doc->find("img[class='ngg_displayed_gallery']");
133
+ if ($imgs) {
134
+
135
+ // Get some utilities
136
+ $mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Mapper');
137
+ $router = $this->get_registry()->get_utility('I_Router');
138
+
139
+ // To match ATP entries we compare the stored url against a generic path
140
+ // We must check HTTP and HTTPS as well as permalink and non-permalink forms
141
+ $preview_url = parse_url($router->join_paths(
142
+ $router->remove_url_segment('index.php', $router->get_base_url()),
143
+ '/nextgen-attach_to_post/preview'
144
+ ));
145
+ $preview_url = preg_quote($preview_url['host'] . $preview_url['path'], '#');
146
+
147
+ $alt_preview_url = parse_url($router->join_paths(
148
+ $router->remove_url_segment('index.php', $router->get_base_url()),
149
+ 'index.php/nextgen-attach_to_post/preview'
150
+ ));
151
+ $alt_preview_url = preg_quote($alt_preview_url['host'] . $alt_preview_url['path'], '#');
152
+
153
+ // Substitute each image for the gallery type frontent content
154
+ foreach ($imgs as $img) {
155
+
156
+ // The placeholder MUST have a gallery instance id
157
+ if (preg_match("#http(s)?://({$preview_url}|{$alt_preview_url})/id--(\d+)#", $img->src, $match)) {
158
+
159
+ // Find the displayed gallery
160
+ $displayed_gallery_id = $match[3];
161
+ $displayed_gallery = $mapper->find($displayed_gallery_id, TRUE);
162
+
163
+ // Get the content for the displayed gallery
164
+ $content = '<p>'._('Invalid Displayed Gallery').'</p>';
165
+ if ($displayed_gallery) {
166
+ $renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
167
+ $content = $renderer->render($displayed_gallery, TRUE);
168
+ }
169
+
170
+ // Replace the placeholder with the displayed gallery content
171
+ $img->outertext = $this->compress_html($content);
172
+ }
173
+ }
174
+ $content = (string)$doc->save();
175
+ }
176
+ return $content;
177
+ }
178
+ }
179
 
 
 
 
 
 
180
 
181
+ /**
182
+ * Removes any un-nessessary whitespace from the HTML
183
+ * @param string $html
184
+ * @return string
185
+ */
186
+ function compress_html($html)
187
+ {
188
+ $html = preg_replace("/>\s+/", ">", $html);
189
+ $html = preg_replace("/\s+</", "<", $html);
190
+ $html = preg_replace("/<!--(?:(?!-->).)*-->/m", "", $html);
191
+ return $html;
 
 
 
 
 
 
 
192
  }
193
 
194
  /**
201
  // Enqueue resources needed at post/page level
202
  if (preg_match("/\/wp-admin\/(post|post-new)\.php$/", $_SERVER['SCRIPT_NAME'])) {
203
  $this->_enqueue_tinymce_resources();
204
+
205
+ # wp_enqueue_style(
206
+ # 'ngg_custom_scrollbar', $this->get_static_url('jquery.mCustomScrollbar.css')
207
+ # );
208
+ # wp_enqueue_script(
209
+ # 'ngg_custom_scrollbar', $this->get_static_url('jquery.mCustomScrollbar.concat.min.js'), array('jquery')
210
+ # );
211
  wp_enqueue_style(
212
  'ngg_attach_to_post_dialog', $router->get_static_url('photocrati-attach_to_post#attach_to_post_dialog.css')
213
  );
229
  wp_localize_script(
230
  'media-editor',
231
  'nextgen_gallery_attach_to_post_url',
232
+ C_NextGen_Global_Settings::get_instance()->attach_to_post_url
233
  );
234
 
235
  // Registers our tinymce button and plugin for attaching galleries
327
  function new_gallery_event($gallery_id)
328
  {
329
  $gallery = $this->get_registry()->get_utility('I_Gallery_Mapper')->find($gallery_id);
330
+
331
+ $this->_get_frame_event_publisher()->add_event(array(
332
+ 'event' => 'new_gallery',
333
+ 'gallery_id'=> intval($gallery_id),
334
+ 'gallery_title' => $gallery->title
335
+ ));
 
336
  }
337
 
338
  /**
products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.js CHANGED
@@ -6,33 +6,35 @@ function close_attach_to_post_window()
6
 
7
  // Adjusts the height of a frame on the page, and then executes
8
  // the specified callback
9
- function adjust_height_for_frame(parent_window, current_window, callback)
10
  {
11
  // Adjust height of the frame
12
- var $frame = jQuery(current_window.frameElement);
13
- var new_height = $frame.contents().height()/3;
14
- var new_height_body = $frame.contents().find('#wpbody').height();
15
- var parent_height = jQuery(parent_window.document).height();
16
  var current_height = $frame.height();
17
 
18
- if (new_height < new_height_body) new_height = new_height_body;
 
19
  if (new_height < parent_height) new_height = parent_height;
20
 
21
- if (current_height < new_height) {
22
- $frame.height(new_height);
23
-
24
- var frame_id = $frame.attr('id');
25
- if (frame_id && frame_id.indexOf('ngg-iframe-') == 0) {
26
- var tab_id = frame_id.substr(11);
27
-
28
- if (tab_id) {
29
- jQuery('#' + tab_id).height(new_height);
30
- }
31
- }
32
- }
 
 
33
 
34
  if (callback != undefined)
35
- return callback(parent_window, current_window, new_height);
36
  else
37
  return true;
38
  }
6
 
7
  // Adjusts the height of a frame on the page, and then executes
8
  // the specified callback
9
+ function adjust_height_for_frame(frame, callback)
10
  {
11
  // Adjust height of the frame
12
+ var $frame = jQuery(frame);
13
+ var new_height = $frame.contents().find('#wpbody').height();
14
+ var parent_height = jQuery(parent.document).height();
 
15
  var current_height = $frame.height();
16
 
17
+ // If the height is less than the parent window height, then use
18
+ // the parent window height instead
19
  if (new_height < parent_height) new_height = parent_height;
20
 
21
+ // If the height has changed, then use the new height
22
+ if (current_height != new_height) {
23
+ var frame_id = $frame.attr('id');
24
+
25
+ $frame.height(new_height);
26
+
27
+ if (frame_id && frame_id.indexOf('ngg-iframe-') == 0) {
28
+ var tab_id = frame_id.substr(11);
29
+
30
+ if (tab_id) {
31
+ jQuery('#' + tab_id).height(new_height);
32
+ }
33
+ }
34
+ }
35
 
36
  if (callback != undefined)
37
+ return callback.call(frame, new_height);
38
  else
39
  return true;
40
  }
products/photocrati_nextgen/modules/attach_to_post/static/iframely.js CHANGED
@@ -1,6 +1,7 @@
1
  if (window.frameElement) {
2
  document.getElementsByTagName('html')[0].id = 'iframely';
3
  jQuery(function($){
 
4
  $('#wpwrap').html($('#wpbody').html($('#wpbody-content').html($('#ngg_page_content'))));
5
 
6
  // We need to ensure that any POST operation includes the "attach_to_post"
@@ -9,55 +10,14 @@ if (window.frameElement) {
9
  $(this).append("<input type='hidden' name='attach_to_post' value='1'/>");
10
  });
11
 
12
- var parent = window.parent;
13
-
14
- if (parent == null || typeof(parent.adjust_height_for_frame) == "undefined") {
15
- if (window != null && typeof(window.adjust_height_for_frame) != "undefined") {
16
- parent = window;
17
- }
18
- }
19
-
20
- // Adjust the height of the frame
21
- var recursive_check = true;
22
- if (recursive_check) {
23
- if (typeof(parent.adjust_height_for_frame) != "undefined") {
24
- parent.adjust_height_for_frame(parent, window, iframely_callback);
25
- }
26
- }
27
- else {
28
- if (typeof(parent.adjust_height_for_frame) != "undefined") {
29
- // Adjust the height of the frame
30
- parent.adjust_height_for_frame(parent, window, function(){
31
- $('#iframely').css({
32
- position: 'static',
33
- visibility: 'visible'
34
- }).animate({
35
- opacity: 1.0
36
- });
37
- });
38
- }
39
- }
40
  });
41
  }
42
-
43
- function iframely_callback(parent_window, current_window, new_height)
44
- {
45
- var $current_window = jQuery(current_window);
46
-
47
- if (typeof($current_window.data('iframely')) == 'undefined') $current_window.data('iframely', {attempts: 1});
48
- var iframely = $current_window.data('iframely');
49
-
50
- // After we've attempted to resize the frame 3 times, give up
51
- if (iframely.attempts == 3) {
52
- jQuery('#iframely').css({
53
- position: 'static',
54
- visibility: 'visible'
55
- }).animate({ opacity: 1.0 });
56
- }
57
- else {
58
- iframely.attempts += 1;
59
- setTimeout(function(){
60
- parent_window.adjust_height_for_frame(parent_window, current_window, iframely_callback);
61
- }, 400);
62
- }
63
- }
1
  if (window.frameElement) {
2
  document.getElementsByTagName('html')[0].id = 'iframely';
3
  jQuery(function($){
4
+ // Concentrate only on the content of the page
5
  $('#wpwrap').html($('#wpbody').html($('#wpbody-content').html($('#ngg_page_content'))));
6
 
7
  // We need to ensure that any POST operation includes the "attach_to_post"
10
  $(this).append("<input type='hidden' name='attach_to_post' value='1'/>");
11
  });
12
 
13
+ // Adjust the height of the frame
14
+ parent.adjust_height_for_frame(window.frameElement, function(){
15
+ $('#iframely').css({
16
+ position: 'static',
17
+ visibility: 'visible'
18
+ }).animate({
19
+ opacity: 1.0
20
+ });
21
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  });
23
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js CHANGED
@@ -75,6 +75,7 @@
75
  }
76
  clearTimeout(click_timer);
77
  drag_in_progress = false;
 
78
  });
79
  },
80
 
75
  }
76
  clearTimeout(click_timer);
77
  drag_in_progress = false;
78
+ return false;
79
  });
80
  },
81
 
products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php CHANGED
@@ -260,7 +260,7 @@ jQuery(function($){
260
  * A collection that can fetch it's entities from the server
261
  **/
262
  Ngg.Models.Remote_Collection = Ngg.Models.SelectableItems.extend({
263
- fetch_limit: 5000,
264
  in_progress: false,
265
  fetch_url: photocrati_ajax.url,
266
  action: '',
@@ -808,9 +808,6 @@ jQuery(function($){
808
  this.entities.remove(model, {silent: true});
809
  this.entities.add(model, {at: model.changed.sortorder, silent: true});
810
  this.displayed_gallery.set('sortorder', this.entities.entity_ids());
811
- if (typeof(console) != 'undefined' && typeof(console.log) != 'undefined') {
812
- console.log(this.entities.entity_ids());
813
- }
814
  this.displayed_gallery.set('order_by', 'sortorder');
815
  }, this);
816
 
@@ -1017,8 +1014,6 @@ jQuery(function($){
1017
  }
1018
  ]);
1019
  this.sortdirection_options.on('change:selected', this.sortdirection_changed, this);
1020
- this.displayed_gallery.on('change:order_by', this.displayed_gallery_order_changed, this);
1021
- this.displayed_gallery.on('change.order_direction', this.displayed_gallery_order_dir_changed, this);
1022
  },
1023
 
1024
  populate_sorting_fields: function(){
@@ -1043,7 +1038,6 @@ jQuery(function($){
1043
 
1044
  fill_image_sortorder_options: function(){
1045
  this.sortorder_options.reset();
1046
- this.sortorder_options.push(this.create_sortorder_option('', 'None'));
1047
  this.sortorder_options.push(this.create_sortorder_option('sortorder', 'Custom'));
1048
  this.sortorder_options.push(this.create_sortorder_option(Ngg.DisplayTab.instance.image_key, 'Image ID'));
1049
  this.sortorder_options.push(this.create_sortorder_option('filename', 'Filename'));
@@ -1053,38 +1047,16 @@ jQuery(function($){
1053
 
1054
  fill_gallery_sortorder_options: function(){
1055
  this.sortorder_options.reset();
1056
- this.sortorder_options.push(this.create_sortorder_option('', 'None'));
1057
  this.sortorder_options.push(this.create_sortorder_option('sortorder' ,'Custom'));
1058
  this.sortorder_options.push(this.create_sortorder_option('name', 'Name'));
1059
  this.sortorder_options.push(this.create_sortorder_option('galdesc', 'Description'));
1060
  },
1061
 
1062
- displayed_gallery_order_changed: function(e){
1063
- this.sortorder_options.findWhere({value: e.get('order_by')}).set('selected', true);
1064
- },
1065
-
1066
-
1067
- displayed_gallery_order_dir_changed: function(e){
1068
- this.sortdirection_options.findWhere({value: e.get('order_direction')}).set('selected', true);
1069
- },
1070
-
1071
  sortoption_changed: function(model){
1072
  this.sortorder_options.each(function(item){
1073
  item.set('selected', model.get('value') == item.get('value') ? true : false, {silent: true});
1074
  });
1075
-
1076
- this.displayed_gallery.set('sortorder', []);
1077
-
1078
- var sort_by = model.get('value');
1079
-
1080
- // If "None" was selected, then clear the "sortorder" property
1081
- if (model.get('value').length == 0) {
1082
- sort_by = 'sortorder';
1083
- }
1084
-
1085
- // Change the "sort by" parameter
1086
- this.displayed_gallery.set('order_by', sort_by);
1087
-
1088
  this.entities.reset();
1089
  this.$el.find('a.sortorder').each(function(){
1090
  var $item = $(this);
@@ -1096,7 +1068,6 @@ jQuery(function($){
1096
  },
1097
 
1098
  sortdirection_changed: function(model){
1099
-
1100
  this.sortdirection_options.each(function(item){
1101
  item.set('selected', model.get('value') == item.get('value') ? true : false, {silent: true});
1102
  });
@@ -1176,15 +1147,10 @@ jQuery(function($){
1176
  this[key] = value;
1177
  }, this);
1178
  this.model.on('change', this.render, this);
1179
- if (this.model.get('sortorder') == 0) {
1180
- this.model.set('sortorder', -1, {silent: true});
1181
- }
1182
  this.id = this.model.get('id_field')+'_'+this.model.entity_id()
1183
  },
1184
 
1185
  item_dropped: function(e, index){
1186
- Ngg.DisplayTab.instance.displayed_gallery.set('order_by', 'sortorder');
1187
- //Ngg.DisplayTab.instance.displayed_gallery.set('order_direction', 'ASC');
1188
  this.model.set('sortorder', index);
1189
  },
1190
 
@@ -1394,7 +1360,7 @@ jQuery(function($){
1394
  var request = <?php echo $sec_token?>;
1395
  request = _.extend(request, {
1396
  action: 'save_displayed_gallery',
1397
- displayed_gallery: JSON.stringify(this.displayed_gallery.toJSON())
1398
  });
1399
 
1400
  var self = this;
@@ -1495,7 +1461,6 @@ jQuery(function($){
1495
  this.display_type_order_step = <?php echo NEXTGEN_DISPLAY_PRIORITY_STEP; ?>;
1496
  this.entities = new Ngg.DisplayTab.Models.Entity_Collection();
1497
  this.entities.extra_data.displayed_gallery = this.displayed_gallery;
1498
- this.image_key = "<?php echo $image_primary_key ?>";
1499
 
1500
  // Pre-select current displayed gallery values
1501
  if (this.displayed_gallery.get('source')) {
260
  * A collection that can fetch it's entities from the server
261
  **/
262
  Ngg.Models.Remote_Collection = Ngg.Models.SelectableItems.extend({
263
+ fetch_limit: 50,
264
  in_progress: false,
265
  fetch_url: photocrati_ajax.url,
266
  action: '',
808
  this.entities.remove(model, {silent: true});
809
  this.entities.add(model, {at: model.changed.sortorder, silent: true});
810
  this.displayed_gallery.set('sortorder', this.entities.entity_ids());
 
 
 
811
  this.displayed_gallery.set('order_by', 'sortorder');
812
  }, this);
813
 
1014
  }
1015
  ]);
1016
  this.sortdirection_options.on('change:selected', this.sortdirection_changed, this);
 
 
1017
  },
1018
 
1019
  populate_sorting_fields: function(){
1038
 
1039
  fill_image_sortorder_options: function(){
1040
  this.sortorder_options.reset();
 
1041
  this.sortorder_options.push(this.create_sortorder_option('sortorder', 'Custom'));
1042
  this.sortorder_options.push(this.create_sortorder_option(Ngg.DisplayTab.instance.image_key, 'Image ID'));
1043
  this.sortorder_options.push(this.create_sortorder_option('filename', 'Filename'));
1047
 
1048
  fill_gallery_sortorder_options: function(){
1049
  this.sortorder_options.reset();
 
1050
  this.sortorder_options.push(this.create_sortorder_option('sortorder' ,'Custom'));
1051
  this.sortorder_options.push(this.create_sortorder_option('name', 'Name'));
1052
  this.sortorder_options.push(this.create_sortorder_option('galdesc', 'Description'));
1053
  },
1054
 
 
 
 
 
 
 
 
 
 
1055
  sortoption_changed: function(model){
1056
  this.sortorder_options.each(function(item){
1057
  item.set('selected', model.get('value') == item.get('value') ? true : false, {silent: true});
1058
  });
1059
+ this.displayed_gallery.set('order_by', model.get('value'));
 
 
 
 
 
 
 
 
 
 
 
 
1060
  this.entities.reset();
1061
  this.$el.find('a.sortorder').each(function(){
1062
  var $item = $(this);
1068
  },
1069
 
1070
  sortdirection_changed: function(model){
 
1071
  this.sortdirection_options.each(function(item){
1072
  item.set('selected', model.get('value') == item.get('value') ? true : false, {silent: true});
1073
  });
1147
  this[key] = value;
1148
  }, this);
1149
  this.model.on('change', this.render, this);
 
 
 
1150
  this.id = this.model.get('id_field')+'_'+this.model.entity_id()
1151
  },
1152
 
1153
  item_dropped: function(e, index){
 
 
1154
  this.model.set('sortorder', index);
1155
  },
1156
 
1360
  var request = <?php echo $sec_token?>;
1361
  request = _.extend(request, {
1362
  action: 'save_displayed_gallery',
1363
+ displayed_gallery: this.displayed_gallery.toJSON()
1364
  });
1365
 
1366
  var self = this;
1461
  this.display_type_order_step = <?php echo NEXTGEN_DISPLAY_PRIORITY_STEP; ?>;
1462
  this.entities = new Ngg.DisplayTab.Models.Entity_Collection();
1463
  this.entities.extra_data.displayed_gallery = this.displayed_gallery;
 
1464
 
1465
  // Pre-select current displayed gallery values
1466
  if (this.displayed_gallery.get('source')) {
products/photocrati_nextgen/modules/cache/class.cache.php CHANGED
@@ -59,10 +59,10 @@ class Mixin_Cache extends Mixin
59
 
60
  foreach ($iterator as $file) {
61
  if ($file->isFile() || $file->isLink()) {
62
- @unlink($file->getPathname());
63
  }
64
  elseif ($file->isDir() && !$file->isDot() && $recursive) {
65
- @rmdir($file->getPathname());
66
  }
67
  }
68
  }
59
 
60
  foreach ($iterator as $file) {
61
  if ($file->isFile() || $file->isLink()) {
62
+ unlink($file->getPathname());
63
  }
64
  elseif ($file->isDir() && !$file->isDot() && $recursive) {
65
+ rmdir($file->getPathname());
66
  }
67
  }
68
  }
products/photocrati_nextgen/modules/cache/module.cache.php CHANGED
@@ -15,7 +15,7 @@ class M_Cache extends C_Base_Module
15
  'photocrati-cache',
16
  'Cache',
17
  'Handles clearing of NextGen caches',
18
- '0.2',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
15
  'photocrati-cache',
16
  'Cache',
17
  'Handles clearing of NextGen caches',
18
+ '0.1',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/datamapper/class.custompost_datamapper_driver.php CHANGED
@@ -30,7 +30,6 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin
30
  'is_select' => TRUE,
31
  'is_delete' => FALSE
32
  );
33
-
34
  return $this->object;
35
  }
36
 
@@ -253,6 +252,7 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin
253
  */
254
  function convert_post_to_entity($post, $model=FALSE)
255
  {
 
256
  $entity = new stdClass();
257
  foreach ($post as $key => $value) {
258
  if ($key == 'post_content') {
@@ -335,14 +335,7 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin
335
  /* @var $wpdb wpdb */
336
  global $wpdb;
337
  if (!is_array($omit)) $omit = array($omit);
338
-
339
- // By default, we omit creating meta values for columns in the posts table
340
- $omit = array_merge($omit, $this->object->_table_columns);
341
-
342
- // Delete the existing meta values
343
  $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->postmeta} WHERE post_id = %s", $post_id));
344
-
345
- // Create query for new meta values
346
  $sql_parts = array();
347
  foreach($entity as $key => $value) {
348
  if (in_array($key, $omit)) continue;
@@ -430,27 +423,17 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin
430
  }
431
 
432
  // Execute the query
433
- $query = new WP_Query();
434
- $query->query_vars = $this->object->_query_args;
435
- add_action('pre_get_posts', array(&$this, 'set_query_args'), PHP_INT_MAX-1, 1);
436
  foreach ($query->get_posts() as $row) {
437
- $retval[] = $this->object->convert_post_to_entity($this->scrub_result($row), $model);
 
 
 
438
  }
439
- remove_action('pre_get_posts', array(&$this, 'set_query_args'), PHP_INT_MAX-1, 1);
440
 
441
  return $retval;
442
  }
443
 
444
- /**
445
- * Ensure that the query args are set. We need to do this in case a third-party
446
- * plugin overrides our query
447
- * @param $query
448
- */
449
- function set_query_args($query)
450
- {
451
- if ($query->get('datamapper')) $query->query_vars = $this->object->_query_args;
452
- }
453
-
454
  /**
455
  * Fetches the last row
456
  * @param array $conditions
@@ -526,13 +509,17 @@ class C_CustomPost_DataMapper_Driver extends C_DataMapper_Driver_Base
526
 
527
  function define($object_name, $context=FALSE)
528
  {
529
- if (strlen($object_name) > 20) throw new Exception("The custom post name can be no longer than 20 characters long");
530
-
531
  parent::define($object_name, $context);
532
  $this->add_mixin('Mixin_CustomPost_DataMapper_Driver');
533
  $this->implement('I_CustomPost_DataMapper');
534
  }
535
 
 
 
 
 
 
 
536
 
537
  /**
538
  * Gets the name of the table
30
  'is_select' => TRUE,
31
  'is_delete' => FALSE
32
  );
 
33
  return $this->object;
34
  }
35
 
252
  */
253
  function convert_post_to_entity($post, $model=FALSE)
254
  {
255
+
256
  $entity = new stdClass();
257
  foreach ($post as $key => $value) {
258
  if ($key == 'post_content') {
335
  /* @var $wpdb wpdb */
336
  global $wpdb;
337
  if (!is_array($omit)) $omit = array($omit);
 
 
 
 
 
338
  $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->postmeta} WHERE post_id = %s", $post_id));
 
 
339
  $sql_parts = array();
340
  foreach($entity as $key => $value) {
341
  if (in_array($key, $omit)) continue;
423
  }
424
 
425
  // Execute the query
426
+ $query = new WP_Query($this->object->_query_args);
 
 
427
  foreach ($query->get_posts() as $row) {
428
+ $row = $this->object->convert_post_to_entity($this->scrub_result($row), $model);
429
+ if (!$model)
430
+ $row->id_field = $this->object->get_primary_key_column();
431
+ $retval[] = $row;
432
  }
 
433
 
434
  return $retval;
435
  }
436
 
 
 
 
 
 
 
 
 
 
 
437
  /**
438
  * Fetches the last row
439
  * @param array $conditions
509
 
510
  function define($object_name, $context=FALSE)
511
  {
 
 
512
  parent::define($object_name, $context);
513
  $this->add_mixin('Mixin_CustomPost_DataMapper_Driver');
514
  $this->implement('I_CustomPost_DataMapper');
515
  }
516
 
517
+ function initialize($object_name)
518
+ {
519
+ if (strlen($object_name) > 20) throw new Exception("The custom post name can be no longer than 20 characters long");
520
+ parent::initialize($object_name);
521
+ }
522
+
523
 
524
  /**
525
  * Gets the name of the table
products/photocrati_nextgen/modules/datamapper/class.customtable_datamapper_driver.php CHANGED
@@ -18,11 +18,10 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin
18
  * specify DB columns
19
  * @param string $fields
20
  */
21
- function select($fields=NULL)
22
  {
23
  // Create a fresh slate
24
  $this->object->_init();
25
- if (!$fields OR $fields == '*') $fields = $this->get_table_name().'.*';
26
  $this->object->_select_clause = "SELECT {$fields}";
27
 
28
  return $this->object;
@@ -183,8 +182,8 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin
183
  if ($where_clauses) $sql[] = 'WHERE '.implode(' AND ', $where_clauses);
184
 
185
  if ($this->object->is_select_statement()) {
186
- if ($this->object->_group_by_columns) $sql[] = 'GROUP BY '.implode(', ', $this->object->_group_by_columns);
187
  if ($this->object->_order_clauses) $sql[] = 'ORDER BY '.implode(', ', $this->object->_order_clauses);
 
188
  if ($this->object->_limit_clause) $sql[] = $this->object->_limit_clause;
189
  }
190
  return implode(' ', $sql);
@@ -207,9 +206,8 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin
207
  // If we have a SQL statement to execute, then heck, execute it!
208
  if ($sql)
209
  {
210
- if ($this->object->debug) {
211
- var_dump($sql);
212
- }
213
 
214
  $this->_wpdb()->query($sql);
215
 
@@ -222,19 +220,11 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin
222
  $retval = $this->_wpdb()->last_result;
223
  }
224
  else {
225
- $id_field = $this->get_primary_key_column();
226
  foreach ($this->_wpdb()->last_result as $row) {
227
- if ($row) {
228
- if (isset($row->$id_field)) {
229
- $retval[] = $this->object->_convert_to_entity($this->scrub_result($row));
230
- }
231
- }
232
  }
233
  }
234
  }
235
- elseif ($this->object->debug) {
236
- var_dump("No entities returned from query");
237
- }
238
  }
239
 
240
  return $retval;
@@ -250,7 +240,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin
250
 
251
  unset($entity->id_field);
252
  $primary_key = $this->object->get_primary_key_column();
253
- if (isset($entity->$primary_key) && $entity->$primary_key > 0) {
254
  if($this->object->_update($entity)) $retval = intval($entity->$primary_key);
255
  }
256
  else {
@@ -369,50 +359,70 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin
369
  return $retval;
370
  }
371
 
372
- function _add_column($column_name, $datatype, $default_value=NULL)
 
 
 
 
373
  {
374
- $sql = "ALTER TABLE `{$this->get_table_name()}` ADD COLUMN `{$column_name}` {$datatype}";
375
- if ($default_value) {
376
- if (is_string($default_value)) $default_value = str_replace("'", "\\'", $default_value);
377
- $sql .= " NOT NULL DEFAULT " . (is_string($default_value) ? "'{$default_value}" : "{$default_value}");
378
  }
379
- $this->object->_wpdb()->query($sql);
380
  }
381
 
382
- function _remove_column($column_name)
 
 
 
 
 
383
  {
384
- $sql = "ALTER TABLE `{$this->get_table_name()}` DROP COLUMN `{$column_name}`";
385
- $this->object->_wpdb()->query($sql);
386
  }
387
 
388
  /**
389
- * Migrates the schema of the database
 
 
390
  */
391
- function migrate($lookup=TRUE)
392
  {
393
- if (!$this->object->_columns) {
394
- throw new E_ColumnsNotDefinedException("Columns not defined for {$this->get_table_name()}");
395
- }
396
-
397
- if ($lookup) $this->lookup_columns();
398
 
399
- // Add any missing columns
400
- foreach ($this->object->_columns as $key => $properties) {
401
- if (!in_array($key, $this->object->_table_columns)) {
402
- $this->object->_add_column($key, $properties['type'], $properties['default_value']);
403
- }
404
  }
405
 
406
- // Remove any columns not defined
407
- foreach ($this->object->_table_columns as $key) {
408
- if (!isset($this->object->_columns[$key])) {
409
- //$this->object->_remove_column($key);
410
- }
411
  }
412
 
413
  $this->object->lookup_columns();
414
  }
415
 
 
 
 
 
 
 
 
 
 
 
 
 
 
416
 
417
  function _init()
418
  {
@@ -436,20 +446,21 @@ class C_CustomTable_DataMapper_Driver extends C_DataMapper_Driver_Base
436
  var $_limit_clause = '';
437
  var $_select_clause = '';
438
  var $_delete_clause = '';
 
 
439
 
440
  function define($object_name, $context=FALSE)
441
  {
442
- parent::define($object_name, $context);
443
  $this->add_mixin('C_CustomTable_DataMapper_Driver_Mixin');
444
  $this->implement('I_CustomTable_DataMapper');
445
  }
446
 
447
- function initialize($object_name=FALSE)
448
  {
449
  parent::initialize($object_name);
450
  if (!isset($this->_primary_key_column))
451
  $this->_primary_key_column = $this->_lookup_primary_key_column();
452
- $this->migrate(FALSE);
453
  }
454
 
455
  /**
18
  * specify DB columns
19
  * @param string $fields
20
  */
21
+ function select($fields='*')
22
  {
23
  // Create a fresh slate
24
  $this->object->_init();
 
25
  $this->object->_select_clause = "SELECT {$fields}";
26
 
27
  return $this->object;
182
  if ($where_clauses) $sql[] = 'WHERE '.implode(' AND ', $where_clauses);
183
 
184
  if ($this->object->is_select_statement()) {
 
185
  if ($this->object->_order_clauses) $sql[] = 'ORDER BY '.implode(', ', $this->object->_order_clauses);
186
+ if ($this->object->_group_by_columns) $sql[] = 'GROUP BY '.implode(', ', $this->object->_group_by_columns);
187
  if ($this->object->_limit_clause) $sql[] = $this->object->_limit_clause;
188
  }
189
  return implode(' ', $sql);
206
  // If we have a SQL statement to execute, then heck, execute it!
207
  if ($sql)
208
  {
209
+ if ($this->object->debug)
210
+ var_dump($sql);
 
211
 
212
  $this->_wpdb()->query($sql);
213
 
220
  $retval = $this->_wpdb()->last_result;
221
  }
222
  else {
 
223
  foreach ($this->_wpdb()->last_result as $row) {
224
+ $retval[] = $this->_convert_to_entity($this->scrub_result($row));
 
 
 
 
225
  }
226
  }
227
  }
 
 
 
228
  }
229
 
230
  return $retval;
240
 
241
  unset($entity->id_field);
242
  $primary_key = $this->object->get_primary_key_column();
243
+ if (isset($entity->$primary_key)) {
244
  if($this->object->_update($entity)) $retval = intval($entity->$primary_key);
245
  }
246
  else {
359
  return $retval;
360
  }
361
 
362
+
363
+ /**
364
+ * Looks up using SQL the columns existing in the database
365
+ */
366
+ function lookup_columns()
367
  {
368
+ $this->object->_columns = array();
369
+ $sql = "SHOW COLUMNS FROM `{$this->object->get_table_name()}`";
370
+ foreach ($this->object->run_query($sql, TRUE) as $row) {
371
+ $this->object->_columns[] = $row->Field;
372
  }
373
+ return $this->object->_columns;
374
  }
375
 
376
+ /**
377
+ * Determines whether a column is present for the table
378
+ * @param string $column_name
379
+ * @return string
380
+ */
381
+ function has_column($column_name)
382
  {
383
+ if (empty($this->object->_columns)) $this->object->lookup_columns();
384
+ return array_search($column_name, $this->object->_columns);
385
  }
386
 
387
  /**
388
+ * Defines a column for this table
389
+ * @param string $column_name
390
+ * @param string $datatype
391
  */
392
+ function define_column($column_name, $datatype)
393
  {
394
+ $this->object->_defined_columns[$column_name] = $datatype;
395
+ }
 
 
 
396
 
397
+ function add_column($column_name, $datatype=FALSE)
398
+ {
399
+ // If no datatype was specified, perhaps the column was already defined
400
+ if (!$datatype && isset($this->object->_defined_columns[$column_name])) {
401
+ $datatype = $this->object->_defined_columns[$column_name];
402
  }
403
 
404
+ // Ensure that we have a datatype before continuing...
405
+ if ($datatype) {
406
+ $sql = "ALTER TABLE `{$this->get_table_name()}` ADD COLUMN ``{$column_name}` {$datatype}";
407
+ $this->object->run_query($sql);
 
408
  }
409
 
410
  $this->object->lookup_columns();
411
  }
412
 
413
+ /**
414
+ * Migrates the schema of the database
415
+ */
416
+ function migrate()
417
+ {
418
+ if (empty($this->object->_columns)) $this->object->lookup_columns();
419
+ foreach ($this->object->_columns as $column_name) {
420
+ if (!$this->object->has_column($column_name)) {
421
+ $this->object->add_column($column_name);
422
+ }
423
+ }
424
+ }
425
+
426
 
427
  function _init()
428
  {
446
  var $_limit_clause = '';
447
  var $_select_clause = '';
448
  var $_delete_clause = '';
449
+ var $_columns = array();
450
+ var $_defined_columns = array();
451
 
452
  function define($object_name, $context=FALSE)
453
  {
454
+ parent::define($context);
455
  $this->add_mixin('C_CustomTable_DataMapper_Driver_Mixin');
456
  $this->implement('I_CustomTable_DataMapper');
457
  }
458
 
459
+ function initialize($object_name)
460
  {
461
  parent::initialize($object_name);
462
  if (!isset($this->_primary_key_column))
463
  $this->_primary_key_column = $this->_lookup_primary_key_column();
 
464
  }
465
 
466
  /**
products/photocrati_nextgen/modules/datamapper/class.datamapper_driver_base.php CHANGED
@@ -3,13 +3,7 @@
3
  /**
4
  * Thrown when an entity does not exist
5
  */
6
- class E_EntityNotFoundException extends E_NggErrorException
7
- {
8
-
9
- }
10
-
11
-
12
- class E_ColumnsNotDefinedException extends E_NggErrorException
13
  {
14
 
15
  }
@@ -19,7 +13,7 @@ class E_ColumnsNotDefinedException extends E_NggErrorException
19
  * array which is not yet supported due to a problem with references and the
20
  * call_user_func_array() function.
21
  */
22
- class E_InvalidEntityException extends E_NggErrorException
23
  {
24
  function __construct($message_or_previous=FALSE, $code=0, $previous=NULL)
25
  {
@@ -62,24 +56,6 @@ class Mixin_DataMapper_Driver_Base extends Mixin
62
  );
63
  }
64
 
65
- /**
66
- * Notes that a particular columns is serialized, and should be unserialized when converted to an entity
67
- * @param $column
68
- */
69
- function add_serialized_column($column)
70
- {
71
- $this->object->_serialized_columns[] = $column;
72
- }
73
-
74
- function unserialize_columns($object)
75
- {
76
- foreach ($this->object->_serialized_columns as $column) {
77
- if (isset($object->$column) && is_string($object->$column)) {
78
- $object->$column = $this->unserialize($object->$column);
79
- }
80
- }
81
- }
82
-
83
  /**
84
  * Serializes the data
85
  * @param mixed $value
@@ -100,7 +76,6 @@ class Mixin_DataMapper_Driver_Base extends Mixin
100
  function unserialize($value)
101
  {
102
  $retval = NULL;
103
-
104
  if (is_string($value))
105
  {
106
  $retval = stripcslashes($value);
@@ -292,10 +267,9 @@ class Mixin_DataMapper_Driver_Base extends Mixin
292
  // A bind could be an array, used for the 'IN' operator
293
  // or a simple scalar value. We need to convert arrays
294
  // into scalar values
295
- if (is_object($bind))
296
- $bind = (array)$bind;
297
-
298
- if (is_array($bind) && !empty($bind)) {
299
  foreach ($bind as &$val) {
300
  if (!is_numeric($val)) {
301
  $val = '"'.addslashes($val).'"';
@@ -304,12 +278,7 @@ class Mixin_DataMapper_Driver_Base extends Mixin
304
  }
305
  $bind = implode(',', $bind);
306
  }
307
- else if (is_array($bind) && empty($bind)) {
308
- $bind = 'NULL';
309
- }
310
- else if(!is_numeric($bind)) {
311
- $numeric = FALSE;
312
- }
313
  }
314
  $condition = $wpdb->prepare($condition, $binds);
315
 
@@ -368,12 +337,9 @@ class Mixin_DataMapper_Driver_Base extends Mixin
368
  // Add name of the id_field to the entity, and convert
369
  // the ID to an integer
370
  $stdObject->id_field = $key = $this->object->get_primary_key_column();
371
-
372
- // Cast columns to their appropriate data type
373
- $this->cast_columns($stdObject);
374
-
375
- // Unserialize columns
376
- $this->unserialize_columns($stdObject);
377
 
378
  // Set defaults for this entity
379
  $this->object->set_defaults($stdObject);
@@ -414,7 +380,7 @@ class Mixin_DataMapper_Driver_Base extends Mixin
414
  $entity = new stdClass;
415
  foreach ($properties as $k=>$v) $entity->$k = $v;
416
  }
417
- return $factory->create($this->object->get_model_factory_method(), $entity, $this->object, $context);
418
  }
419
 
420
 
@@ -557,79 +523,24 @@ class Mixin_DataMapper_Driver_Base extends Mixin
557
  return stripslashes($result);
558
  }
559
  }
560
-
561
- function define_column($name, $type, $default_value=NULL)
562
- {
563
- $this->object->_columns[$name] = array(
564
- 'type' => $type,
565
- 'default_value' => $default_value
566
- );
567
- }
568
-
569
- function has_defined_column($name)
570
- {
571
- $columns = $this->object->_columns;
572
- return isset($columns[$name]);
573
- }
574
-
575
- function cast_columns($entity)
576
- {
577
- foreach ($this->object->_columns as $key => $properties) {
578
- $value = isset($entity->$key) ? $entity->$key : NULL;
579
- $default_value = $properties['default_value'];
580
- if ($value && $value != $default_value) {
581
- $column_type = $this->object->_columns[$key]['type'];
582
- if (preg_match("/varchar|text/i", $column_type)) {
583
- if (!is_array($value) && !is_object($value))
584
- $entity->$key = strval($value);
585
- }
586
- else if (preg_match("/decimal|numeric|double/i", $column_type)) {
587
- $entity->$key = doubleval($value);
588
- }
589
- else if (preg_match("/float/i", $column_type)) {
590
- $entity->$key = floatval($value);
591
- }
592
- else if (preg_match("/int/i", $column_type)) {
593
- $entity->$key = intval($value);
594
- }
595
- else if (preg_match("/bool/i", $column_type)) {
596
- $entity->$key = ($value ? TRUE : FALSE);
597
- }
598
- }
599
-
600
- // Add property and default value
601
- else {
602
- $entity->$key = $default_value;
603
- }
604
- }
605
- return $entity;
606
- }
607
  }
608
 
609
  class C_DataMapper_Driver_Base extends C_Component
610
  {
611
  var $_object_name;
612
  var $_model_factory_method = FALSE;
613
- var $_columns = array();
614
- var $_table_columns = array();
615
- var $_serialized_columns = array();
616
 
617
  function define($object_name, $context=FALSE)
618
  {
619
  parent::define($context);
620
  $this->add_mixin('Mixin_DataMapper_Driver_Base');
621
  $this->implement('I_DataMapper_Driver');
622
- $this->_object_name = $object_name;
623
-
624
- if ($this->has_method('define_columns')) {
625
- $this->define_columns();
626
- }
627
  }
628
 
629
- function initialize()
630
  {
631
  parent::initialize();
632
- $this->lookup_columns();
633
  }
634
 
635
  /**
@@ -652,32 +563,6 @@ class C_DataMapper_Driver_Base extends C_Component
652
  return $table_prefix.$this->_object_name;
653
  }
654
 
655
-
656
- /**
657
- * Looks up using SQL the columns existing in the database
658
- */
659
- function lookup_columns()
660
- {
661
- global $wpdb;
662
- $this->_table_columns = array();
663
- $sql = "SHOW COLUMNS FROM `{$this->get_table_name()}`";
664
- foreach ($wpdb->get_results($sql) as $row) {
665
- $this->_table_columns[] = $row->Field;
666
- }
667
- return $this->_table_columns;
668
- }
669
-
670
- /**
671
- * Determines whether a column is present for the table
672
- * @param string $column_name
673
- * @return string
674
- */
675
- function has_column($column_name)
676
- {
677
- if (empty($this->object->_table_columns)) $this->object->lookup_columns();
678
- return array_search($column_name, $this->object->_table_columns) !== FALSE;
679
- }
680
-
681
  /**
682
  * Sets the name of the factory method used to create a model for this entity
683
  * @param string $method_name
3
  /**
4
  * Thrown when an entity does not exist
5
  */
6
+ class E_EntityNotFoundException extends RuntimeException
 
 
 
 
 
 
7
  {
8
 
9
  }
13
  * array which is not yet supported due to a problem with references and the
14
  * call_user_func_array() function.
15
  */
16
+ class E_InvalidEntityException extends RuntimeException
17
  {
18
  function __construct($message_or_previous=FALSE, $code=0, $previous=NULL)
19
  {
56
  );
57
  }
58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  /**
60
  * Serializes the data
61
  * @param mixed $value
76
  function unserialize($value)
77
  {
78
  $retval = NULL;
 
79
  if (is_string($value))
80
  {
81
  $retval = stripcslashes($value);
267
  // A bind could be an array, used for the 'IN' operator
268
  // or a simple scalar value. We need to convert arrays
269
  // into scalar values
270
+ if (is_object($bind)) $bind = (array)$bind;
271
+ if (is_array($bind)) {
272
+ if (empty($bind)) return FALSE;
 
273
  foreach ($bind as &$val) {
274
  if (!is_numeric($val)) {
275
  $val = '"'.addslashes($val).'"';
278
  }
279
  $bind = implode(',', $bind);
280
  }
281
+ elseif(!is_numeric($bind)) $numeric = FALSE;
 
 
 
 
 
282
  }
283
  $condition = $wpdb->prepare($condition, $binds);
284
 
337
  // Add name of the id_field to the entity, and convert
338
  // the ID to an integer
339
  $stdObject->id_field = $key = $this->object->get_primary_key_column();
340
+ if (isset($stdObject->$key)) {
341
+ $stdObject->$key = (int) $stdObject->$key;
342
+ }
 
 
 
343
 
344
  // Set defaults for this entity
345
  $this->object->set_defaults($stdObject);
380
  $entity = new stdClass;
381
  foreach ($properties as $k=>$v) $entity->$k = $v;
382
  }
383
+ return $factory->create($this->object->get_model_factory_method(), $this->object, $entity, $context);
384
  }
385
 
386
 
523
  return stripslashes($result);
524
  }
525
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526
  }
527
 
528
  class C_DataMapper_Driver_Base extends C_Component
529
  {
530
  var $_object_name;
531
  var $_model_factory_method = FALSE;
 
 
 
532
 
533
  function define($object_name, $context=FALSE)
534
  {
535
  parent::define($context);
536
  $this->add_mixin('Mixin_DataMapper_Driver_Base');
537
  $this->implement('I_DataMapper_Driver');
 
 
 
 
 
538
  }
539
 
540
+ function initialize($object_name)
541
  {
542
  parent::initialize();
543
+ $this->_object_name = $object_name;
544
  }
545
 
546
  /**
563
  return $table_prefix.$this->_object_name;
564
  }
565
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
566
  /**
567
  * Sets the name of the factory method used to create a model for this entity
568
  * @param string $method_name
products/photocrati_nextgen/modules/datamapper/class.datamapper_installer.php CHANGED
@@ -4,7 +4,7 @@ class C_DataMapper_Installer
4
  {
5
  function __construct()
6
  {
7
- $this->settings = C_NextGen_Settings::get_instance();
8
  }
9
 
10
  function install()
4
  {
5
  function __construct()
6
  {
7
+ $this->settings = C_NextGen_Global_Settings::get_instance();
8
  }
9
 
10
  function install()
products/photocrati_nextgen/modules/datamapper/class.datamapper_model.php CHANGED
@@ -8,7 +8,7 @@ class C_DataMapper_Model extends C_Component
8
  /**
9
  * Define the model
10
  */
11
- function define($mapper=NULL, $properties=array(), $context=FALSE)
12
  {
13
  parent::define($context);
14
  $this->add_mixin('Mixin_Validation');
@@ -23,7 +23,7 @@ class C_DataMapper_Model extends C_Component
23
  * @param array|stdClass $properties
24
  * @param string $context
25
  */
26
- function initialize($mapper=NULL, $properties=FALSE)
27
  {
28
  $this->_mapper = $mapper;
29
  $this->_stdObject = $properties ? (object)$properties : new stdClass();
@@ -105,7 +105,7 @@ class C_DataMapper_Model extends C_Component
105
  */
106
  function destroy()
107
  {
108
- return $this->get_mapper()->destroy($this->_stdObject);
109
  }
110
 
111
 
@@ -121,14 +121,16 @@ class C_DataMapper_Model extends C_Component
121
  /**
122
  * Gets/sets the primary key
123
  */
124
- function id($value=NULL)
125
  {
126
  $key = $this->get_mapper()->get_primary_key_column();
127
- if ($value) {
128
- $this->__set($key, $value);
129
-
 
 
 
130
  }
131
- return $this->__get($key);
132
  }
133
  }
134
 
8
  /**
9
  * Define the model
10
  */
11
+ function define($mapper, $properties, $context=FALSE)
12
  {
13
  parent::define($context);
14
  $this->add_mixin('Mixin_Validation');
23
  * @param array|stdClass $properties
24
  * @param string $context
25
  */
26
+ function initialize($mapper, $properties=FALSE)
27
  {
28
  $this->_mapper = $mapper;
29
  $this->_stdObject = $properties ? (object)$properties : new stdClass();
105
  */
106
  function destroy()
107
  {
108
+ $this->get_mapper()->destroy($this->_stdObject);
109
  }
110
 
111
 
121
  /**
122
  * Gets/sets the primary key
123
  */
124
+ function id()
125
  {
126
  $key = $this->get_mapper()->get_primary_key_column();
127
+ $args = func_get_args();
128
+ if ($args) {
129
+ return $this->__set($key, $args[0]);
130
+ }
131
+ else {
132
+ return $this->__get($key);
133
  }
 
134
  }
135
  }
136
 
products/photocrati_nextgen/modules/datamapper/module.datamapper.php CHANGED
@@ -14,7 +14,7 @@ class M_DataMapper extends C_Base_Module
14
  'photocrati-datamapper',
15
  'DataMapper',
16
  'Provides a database abstraction layer following the DataMapper pattern',
17
- '0.4',
18
  'http://www.photocrati.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
@@ -48,17 +48,14 @@ class M_DataMapper extends C_Base_Module
48
  */
49
  function set_custom_wp_query($sql, &$wp_query)
50
  {
51
- if ($wp_query->get('datamapper')) {
52
-
53
- // Set the custom query
54
- if (($custom_sql = $wp_query->get('custom_sql'))) {
55
- $sql = $custom_sql;
56
- }
57
 
58
- // Perhaps we're to initiate a delete query instead?
59
- elseif ($wp_query->get('is_delete')) {
60
- $sql = preg_replace("/^SELECT.*FROM/i", "DELETE FROM", $sql);
61
- }
62
  }
63
 
64
  return $sql;
@@ -72,13 +69,8 @@ class M_DataMapper extends C_Base_Module
72
  */
73
  function set_custom_wp_query_fields($fields, &$wp_query)
74
  {
75
- if ($wp_query->get('datmapper')) {
76
- if (($custom_fields = $wp_query->get('fields'))) {
77
- $fields = $custom_fields;
78
- }
79
- }
80
-
81
- return $fields;
82
  }
83
 
84
 
@@ -90,11 +82,8 @@ class M_DataMapper extends C_Base_Module
90
  */
91
  function set_custom_wp_query_where($where, &$wp_query)
92
  {
93
- if ($wp_query->get('datamapper')) {
94
- $this->add_post_title_where_clauses($where, $wp_query);
95
- $this->add_post_name_where_clauses($where, $wp_query);
96
- }
97
-
98
  return $where;
99
  }
100
 
@@ -117,12 +106,6 @@ class M_DataMapper extends C_Base_Module
117
  }
118
  $retval = "GROUP BY ".implode(', ', $group_by_columns);
119
  }
120
- // Not all mysql servers allow access to create temporary tables which are used when doing GROUP BY
121
- // statements; this can potentially ruin basic queries. If no group_by_columns is set AND the query originates
122
- // within the datamapper we strip the "GROUP BY" clause entirely in this filter.
123
- else if ($wp_query->get('datamapper')) {
124
- $retval = '';
125
- }
126
  return $retval;
127
  }
128
 
@@ -195,7 +178,7 @@ class M_DataMapper extends C_Base_Module
195
  return array(
196
  'A_Datamapper_Factory' => 'adapter.datamapper_factory.php',
197
  'C_Datamapper_Installer' => 'class.datamapper_installer.php',
198
- 'C_Datamapper' => 'class.datamapper.php',
199
  'C_Custompost_Datamapper_Driver' => 'class.custompost_datamapper_driver.php',
200
  'C_Customtable_Datamapper_Driver' => 'class.customtable_datamapper_driver.php',
201
  'C_Datamapper_Driver_Base' => 'class.datamapper_driver_base.php',
14
  'photocrati-datamapper',
15
  'DataMapper',
16
  'Provides a database abstraction layer following the DataMapper pattern',
17
+ '0.1',
18
  'http://www.photocrati.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
48
  */
49
  function set_custom_wp_query($sql, &$wp_query)
50
  {
51
+ // Set the custom query
52
+ if (($custom_sql = $wp_query->get('custom_sql'))) {
53
+ $sql = $custom_sql;
54
+ }
 
 
55
 
56
+ // Perhaps we're to initiate a delete query instead?
57
+ elseif ($wp_query->get('is_delete')) {
58
+ $sql = preg_replace("/^SELECT.*FROM/i", "DELETE FROM", $sql);
 
59
  }
60
 
61
  return $sql;
69
  */
70
  function set_custom_wp_query_fields($fields, &$wp_query)
71
  {
72
+ $custom_fields = $wp_query->get('fields');
73
+ return $custom_fields ? $custom_fields : $fields;
 
 
 
 
 
74
  }
75
 
76
 
82
  */
83
  function set_custom_wp_query_where($where, &$wp_query)
84
  {
85
+ $this->add_post_title_where_clauses($where, $wp_query);
86
+ $this->add_post_name_where_clauses($where, $wp_query);
 
 
 
87
  return $where;
88
  }
89
 
106
  }
107
  $retval = "GROUP BY ".implode(', ', $group_by_columns);
108
  }
 
 
 
 
 
 
109
  return $retval;
110
  }
111
 
178
  return array(
179
  'A_Datamapper_Factory' => 'adapter.datamapper_factory.php',
180
  'C_Datamapper_Installer' => 'class.datamapper_installer.php',
181
+ 'C_Datamapper' => 'class.datamapper.php',
182
  'C_Custompost_Datamapper_Driver' => 'class.custompost_datamapper_driver.php',
183
  'C_Customtable_Datamapper_Driver' => 'class.customtable_datamapper_driver.php',
184
  'C_Datamapper_Driver_Base' => 'class.datamapper_driver_base.php',
products/photocrati_nextgen/modules/dynamic_stylesheet/class.dynamic_stylesheet_controller.php CHANGED
@@ -17,7 +17,7 @@ class C_Dynamic_Stylesheet_Controller extends C_MVC_Controller
17
  function initialize()
18
  {
19
  parent::initialize();
20
- $this->_app = C_NextGen_Settings::get_instance()->dynamic_stylesheet_slug;
21
  }
22
 
23
  static function &get_instance($context=FALSE)
@@ -75,8 +75,8 @@ class Mixin_Dynamic_Stylesheet_Instance_Methods extends Mixin
75
  $data = $data->get_entity();
76
  $data = $this->object->encode($data);
77
  wp_enqueue_style(
78
- 'dyncss-' . $index . $data . '@dynamic',
79
- $this->object->get_router()->get_url("/{$this->object->_app}", FALSE) . "?index={$index}&data={$data}"
80
  );
81
  }
82
  }
17
  function initialize()
18
  {
19
  parent::initialize();
20
+ $this->_app = C_NextGen_Global_Settings::get_instance()->dynamic_stylesheet_slug;
21
  }
22
 
23
  static function &get_instance($context=FALSE)
75
  $data = $data->get_entity();
76
  $data = $this->object->encode($data);
77
  wp_enqueue_style(
78
+ 'dyncss-' . $index . '@dynamic',
79
+ $this->object->get_router()->get_url("/{$this->object->_app}", FALSE) . "/{$index}/{$data}"
80
  );
81
  }
82
  }
products/photocrati_nextgen/modules/dynamic_stylesheet/class.dynamic_stylesheet_installer.php CHANGED
@@ -4,7 +4,7 @@ class C_Dynamic_Stylesheet_Installer
4
  {
5
  function __construct()
6
  {
7
- $this->settings = C_NextGen_Settings::get_instance();
8
  }
9
 
10
  function install()
4
  {
5
  function __construct()
6
  {
7
+ $this->settings = C_NextGen_Global_Settings::get_instance();
8
  }
9
 
10
  function install()
products/photocrati_nextgen/modules/dynamic_stylesheet/module.dynamic_stylesheet.php CHANGED
@@ -14,7 +14,7 @@ class M_Dynamic_Stylesheet extends C_Base_Module
14
  'photocrati-dynamic_stylesheet',
15
  'Dynamic Stylesheet',
16
  'Provides the ability to generate and enqueue a dynamic stylesheet',
17
- '0.3',
18
  'http://www.nextgen-gallery.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com',
14
  'photocrati-dynamic_stylesheet',
15
  'Dynamic Stylesheet',
16
  'Provides the ability to generate and enqueue a dynamic stylesheet',
17
+ '0.2',
18
  'http://www.nextgen-gallery.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com',
products/photocrati_nextgen/modules/dynamic_thumbnails/adapter.dynamic_thumbnails_storage_driver.php CHANGED
@@ -26,7 +26,7 @@ class A_Dynamic_Thumbnails_Storage_Driver extends Mixin
26
 
27
  if ($check_existance)
28
  {
29
- if (@file_exists($image_path))
30
  {
31
  $retval = $image_path;
32
  }
@@ -45,7 +45,7 @@ class A_Dynamic_Thumbnails_Storage_Driver extends Mixin
45
  return $retval;
46
  }
47
 
48
- function get_image_url($image, $size='full', $check_existance=FALSE)
49
  {
50
  $retval = NULL;
51
  $dynthumbs = $this->object->get_registry()->get_utility('I_Dynamic_Thumbnails_Manager');
@@ -61,14 +61,7 @@ class A_Dynamic_Thumbnails_Storage_Driver extends Mixin
61
  }
62
 
63
  if ($retval == null) {
64
- $retval = $this->call_parent('get_image_url', $image, $size, $check_existance);
65
- }
66
-
67
- // Try generating the thumbnail
68
- if ($retval == null) {
69
- $params = array('watermark' => false, 'reflection' => false, 'crop' => true);
70
- $result = $this->generate_thumbnail($image, $params);
71
- if ($result) $retval = $this->call_parent('get_image_url', $image, $size, $check_existance);
72
  }
73
 
74
  return $retval;
26
 
27
  if ($check_existance)
28
  {
29
+ if (file_exists($image_path))
30
  {
31
  $retval = $image_path;
32
  }
45
  return $retval;
46
  }
47
 
48
+ function get_image_url($image, $size='full')
49
  {
50
  $retval = NULL;
51
  $dynthumbs = $this->object->get_registry()->get_utility('I_Dynamic_Thumbnails_Manager');
61
  }
62
 
63
  if ($retval == null) {
64
+ $retval = $this->call_parent('get_image_url', $image, $size);
 
 
 
 
 
 
 
65
  }
66
 
67
  return $retval;
products/photocrati_nextgen/modules/dynamic_thumbnails/class.dynamic_thumbnails_installer.php CHANGED
@@ -4,7 +4,7 @@ class C_Dynamic_Thumbnails_Installer
4
  {
5
  function __construct()
6
  {
7
- $this->settings = C_NextGen_Settings::get_instance();
8
  }
9
 
10
  function install()
4
  {
5
  function __construct()
6
  {
7
+ $this->settings = C_NextGen_Global_Settings::get_instance();
8
  }
9
 
10
  function install()
products/photocrati_nextgen/modules/dynamic_thumbnails/class.dynamic_thumbnails_manager.php CHANGED
@@ -4,7 +4,7 @@ class Mixin_Dynamic_Thumbnails_Manager extends Mixin
4
  {
5
  function get_route_name()
6
  {
7
- return C_NextGen_Settings::get_instance()->get('dynamic_thumbnail_slug');
8
  }
9
 
10
  function _get_params_sanitized($params)
4
  {
5
  function get_route_name()
6
  {
7
+ return C_NextGen_Global_Settings::get_instance()->get('dynamic_thumbnail_slug');
8
  }
9
 
10
  function _get_params_sanitized($params)
products/photocrati_nextgen/modules/dynamic_thumbnails/module.dynamic_thumbnails.php CHANGED
@@ -13,7 +13,7 @@ class M_Dynamic_Thumbnails extends C_Base_Module
13
  'photocrati-dynamic_thumbnails',
14
  'Dynamic Thumbnails',
15
  'Adds support for dynamic thumbnails',
16
- '0.4',
17
  'http://www.nextgen-gallery.com',
18
  'Photocrati Media',
19
  'http://www.photocrati.com'
13
  'photocrati-dynamic_thumbnails',
14
  'Dynamic Thumbnails',
15
  'Adds support for dynamic thumbnails',
16
+ '0.1',
17
  'http://www.nextgen-gallery.com',
18
  'Photocrati Media',
19
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/frame_communication/class.frame_communication_installer.php CHANGED
@@ -4,7 +4,7 @@ class C_Frame_Communication_Installer
4
  {
5
  function __construct()
6
  {
7
- $this->settings = C_NextGen_Settings::get_instance();
8
  }
9
 
10
  function install()
4
  {
5
  function __construct()
6
  {
7
+ $this->settings = C_NextGen_Global_Settings::get_instance();
8
  }
9
 
10
  function install()
products/photocrati_nextgen/modules/frame_communication/class.frame_event_publisher.php CHANGED
@@ -15,7 +15,7 @@ class C_Frame_Event_Publisher extends C_Component
15
  function initialize()
16
  {
17
  parent::initialize();
18
- $this->setting_name = C_NextGen_Settings::get_instance()->frame_communication_option_name;
19
  }
20
 
21
  /**
@@ -64,15 +64,7 @@ class Mixin_Frame_Event_Publisher extends Mixin
64
  {
65
  $id = md5(serialize($data));
66
  $data['context'] = $this->object->context;
67
-
68
- $write_cookie = TRUE;
69
- if (defined('XMLRPC_REQUEST')) {
70
- $write_cookie = XMLRPC_REQUEST == FALSE;
71
- }
72
-
73
- if ($write_cookie) {
74
- setrawcookie($this->object->setting_name.'_'.$id,$this->object->_encode($data));
75
- }
76
 
77
  return $data;
78
  }
15
  function initialize()
16
  {
17
  parent::initialize();
18
+ $this->setting_name = C_NextGen_Global_Settings::get_instance()->frame_communication_option_name;
19
  }
20
 
21
  /**
64
  {
65
  $id = md5(serialize($data));
66
  $data['context'] = $this->object->context;
67
+ setrawcookie($this->object->setting_name.'_'.$id,$this->object->_encode($data));
 
 
 
 
 
 
 
 
68
 
69
  return $data;
70
  }
products/photocrati_nextgen/modules/frame_communication/module.frame_communication.php CHANGED
@@ -15,7 +15,7 @@ class M_Frame_Communication extends C_Base_Module
15
  'photocrati-frame_communication',
16
  'Frame/iFrame Inter-Communication',
17
  'Provides a means for HTML frames to share server-side events with each other',
18
- '0.3',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com',
@@ -35,7 +35,7 @@ class M_Frame_Communication extends C_Base_Module
35
 
36
  function _register_hooks()
37
  {
38
- add_action('init', array($this, 'enqueue_admin_scripts'));
39
 
40
  }
41
 
@@ -48,9 +48,7 @@ class M_Frame_Communication extends C_Base_Module
48
  $router->get_static_url('photocrati-frame_communication#frame_event_publisher.js'),
49
  array('jquery')
50
  );
51
-
52
- if (is_admin())
53
- wp_enqueue_script('frame_event_publisher');
54
  }
55
 
56
  function get_type_list()
15
  'photocrati-frame_communication',
16
  'Frame/iFrame Inter-Communication',
17
  'Provides a means for HTML frames to share server-side events with each other',
18
+ '0.1',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com',
35
 
36
  function _register_hooks()
37
  {
38
+ add_action('admin_enqueue_scripts', array(&$this, 'enqueue_admin_scripts'));
39
 
40
  }
41
 
48
  $router->get_static_url('photocrati-frame_communication#frame_event_publisher.js'),
49
  array('jquery')
50
  );
51
+ wp_enqueue_script('frame_event_publisher');
 
 
52
  }
53
 
54
  function get_type_list()
products/photocrati_nextgen/modules/fs/class.fs.php CHANGED
@@ -129,7 +129,7 @@ class Mixin_Fs_Instance_Methods extends Mixin
129
  if (!$module)
130
  list($path, $module) = $this->object->parse_formatted_path($path);
131
 
132
- if (@file_exists($path))
133
  {
134
  $retval = $path;
135
  }
@@ -141,7 +141,7 @@ class Mixin_Fs_Instance_Methods extends Mixin
141
 
142
  // See if the file is located under one of the search paths directly
143
  foreach ($search_paths as $dir) {
144
- if (@file_exists($this->join_paths($dir, $path))) {
145
  $retval = $this->join_paths($dir, $path);
146
  break;
147
  }
@@ -218,7 +218,7 @@ class Mixin_Fs_Instance_Methods extends Mixin
218
  {
219
  $retval = NULL;
220
 
221
- $results = @file_exists($this->join_paths($base_path, $file));
222
 
223
  // Must be located in a sub-directory
224
  if (!$results)
@@ -272,52 +272,21 @@ class Mixin_Fs_Instance_Methods extends Mixin
272
  {
273
  $segments = array();
274
  $retval = array();
275
- $protocol = NULL;
276
  $params = func_get_args();
277
  $this->_flatten_array($params, $segments);
278
 
279
- // if a protocol exists strip it from the string and store it for later
280
- $pattern = "#^[a-zA-Z].+://#i";
281
- preg_match($pattern, $segments[0], $matches);
282
- if (!empty($matches)) {
283
- $protocol = reset($matches);
284
- $segments[0] = preg_replace($pattern, '', $segments[0], 1);
285
- }
286
-
287
  foreach ($segments as $segment) {
288
  $segment = trim($segment, '/\\');
289
- $pieces = array_values(preg_split('/[\/\\\\]/', $segment));
290
-
291
- // determine if each piece should be appended to $retval
292
- foreach ($pieces as $ndx => $val) {
293
- if ($val === '') continue;
294
- $one = array_search($val, $retval);
295
- $two = array_search($val, $pieces);
296
- $one = (FALSE === $one ? 0 : count($one) + 1);
297
- $two = (FALSE === $two ? 0 : count($two) + 1);
298
- if (!empty($protocol)) {
299
- $existing_val = isset($retval[$ndx]) ? $retval[$ndx] : NULL;
300
- if ($existing_val !== $val || $two >= $one)
301
- $retval[] = $val;
302
- }
303
- else {
304
- $existing_val = isset($retval[$ndx]) ? $retval[$ndx] : NULL;
305
- if ($existing_val !== $val && $two >= $one)
306
- $retval[] = $val;
307
- }
308
- }
309
-
310
  }
311
 
312
- $retval = $protocol . implode('/', $retval);
313
 
314
- if ((empty($protocol) && 'WINNT' !== PHP_OS)
315
  && strpos($retval, '/') !== 0
316
- && is_null($protocol)
317
- && !@file_exists($retval))
318
- {
319
  $retval = '/' . $retval;
320
- }
321
 
322
  return $retval;
323
  }
@@ -362,7 +331,7 @@ class Mixin_Fs_Instance_Methods extends Mixin
362
  */
363
  function set_document_root($value)
364
  {
365
- // IMPORTANT: Even for Windows, we construct the path to be C:/Windows instead of C:\Windows
366
- return ($this->_document_root = str_replace("\\", '/', rtrim($value, "/\\")));
367
  }
368
  }
129
  if (!$module)
130
  list($path, $module) = $this->object->parse_formatted_path($path);
131
 
132
+ if (file_exists($path))
133
  {
134
  $retval = $path;
135
  }
141
 
142
  // See if the file is located under one of the search paths directly
143
  foreach ($search_paths as $dir) {
144
+ if (file_exists($this->join_paths($dir, $path))) {
145
  $retval = $this->join_paths($dir, $path);
146
  break;
147
  }
218
  {
219
  $retval = NULL;
220
 
221
+ $results = file_exists($this->join_paths($base_path, $file));
222
 
223
  // Must be located in a sub-directory
224
  if (!$results)
272
  {
273
  $segments = array();
274
  $retval = array();
 
275
  $params = func_get_args();
276
  $this->_flatten_array($params, $segments);
277
 
 
 
 
 
 
 
 
 
278
  foreach ($segments as $segment) {
279
  $segment = trim($segment, '/\\');
280
+ if (!empty($segment))
281
+ $retval = array_unique(array_merge($retval, preg_split('/[\/\\\]/', $segment)));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
  }
283
 
284
+ $retval = implode('/', $retval);
285
 
286
+ if ('WINNT' !== PHP_OS
287
  && strpos($retval, '/') !== 0
288
+ && !preg_match("#^http(s)?://#", $retval) && !file_exists($retval))
 
 
289
  $retval = '/' . $retval;
 
290
 
291
  return $retval;
292
  }
331
  */
332
  function set_document_root($value)
333
  {
334
+ // Even for windows hosts we force '/' as the path separator
335
+ return $this->_document_root = untrailingslashit(str_replace('\\', '/', $value));
336
  }
337
  }
products/photocrati_nextgen/modules/fs/module.fs.php CHANGED
@@ -12,7 +12,7 @@ class M_Fs extends C_Base_Module
12
  'photocrati-fs',
13
  'Filesystem',
14
  'Provides a filesystem abstraction layer for Pope modules',
15
- '0.2',
16
  'http://www.photocrati.com',
17
  'Photocrati Media',
18
  'http://www.photocrati.com'
12
  'photocrati-fs',
13
  'Filesystem',
14
  'Provides a filesystem abstraction layer for Pope modules',
15
+ '0.1',
16
  'http://www.photocrati.com',
17
  'Photocrati Media',
18
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/lightbox/adapter.lightbox_factory.php CHANGED
@@ -2,13 +2,13 @@
2
 
3
  class A_Lightbox_Factory extends Mixin
4
  {
5
- function lightbox_library($properties=array(), $mapper=FALSE, $context=FALSE)
6
  {
7
- return new C_Lightbox_Library($properties, $mapper, $context);
8
  }
9
 
10
- function lightbox($properties=array(), $mapper=FALSE, $context=FALSE)
11
  {
12
- return $this->object->lightbox_library($properties, $mapper, $context);
13
  }
14
  }
2
 
3
  class A_Lightbox_Factory extends Mixin
4
  {
5
+ function lightbox_library($mapper=FALSE, $properties=array(), $context=FALSE)
6
  {
7
+ return new C_Lightbox_Library($mapper, $properties, $context);
8
  }
9
 
10
+ function lightbox($mapper=FALSE, $properties=array(), $context=FALSE)
11
  {
12
+ return $this->object->lightbox_library($mapper, $properties, $context);
13
  }
14
  }
products/photocrati_nextgen/modules/lightbox/class.lightbox_installer.php CHANGED
@@ -75,15 +75,6 @@ class C_Lightbox_Installer
75
  */
76
  function install()
77
  {
78
- // Install "None" option
79
- $this->install_lightbox(
80
- 'none',
81
- 'No lightbox',
82
- '',
83
- array(),
84
- array()
85
- );
86
-
87
  $this->install_lightbox(
88
  'lightbox',
89
  'Lightbox',
@@ -128,7 +119,7 @@ class C_Lightbox_Installer
128
  $this->install_lightbox(
129
  'highslide',
130
  'Highslide',
131
- 'class="highslide" onclick="return hs.expand(this, {slideshowGroup: ' . "'%GALLERY_NAME%'" . '});"',
132
  array('photocrati-lightbox#highslide/highslide.css'),
133
  array('photocrati-lightbox#highslide/highslide-full.packed.js', 'photocrati-lightbox#highslide/nextgen_highslide_init.js'),
134
  array('nextgen_highslide_graphics_dir' => $this->router->get_static_url('photocrati-lightbox#highslide/graphics'))
@@ -171,6 +162,6 @@ class C_Lightbox_Installer
171
  */
172
  function uninstall($hard = FALSE)
173
  {
174
- $this->mapper->delete()->run_query();
175
  }
176
- }
75
  */
76
  function install()
77
  {
 
 
 
 
 
 
 
 
 
78
  $this->install_lightbox(
79
  'lightbox',
80
  'Lightbox',
119
  $this->install_lightbox(
120
  'highslide',
121
  'Highslide',
122
+ 'class="highslide" onclick="return hs.expand(this, galleryOptions);"',
123
  array('photocrati-lightbox#highslide/highslide.css'),
124
  array('photocrati-lightbox#highslide/highslide-full.packed.js', 'photocrati-lightbox#highslide/nextgen_highslide_init.js'),
125
  array('nextgen_highslide_graphics_dir' => $this->router->get_static_url('photocrati-lightbox#highslide/graphics'))
162
  */
163
  function uninstall($hard = FALSE)
164
  {
165
+ if ($hard) $this->mapper->delete()->run_query();
166
  }
167
+ }
products/photocrati_nextgen/modules/lightbox/class.lightbox_library.php CHANGED
@@ -11,23 +11,12 @@
11
  */
12
  class C_Lightbox_Library extends C_DataMapper_Model
13
  {
14
- function define($properties=array(), $mapper=FALSE, $context=FALSE)
15
  {
16
  parent::define($mapper, $properties, $context);
17
  $this->add_mixin('Mixin_Lightbox_Library_Validation');
18
  $this->implement('I_Lightbox_Library');
19
  }
20
-
21
- function initialize($properties=array(), $mapper=FALSE, $context=FALSE)
22
- {
23
- // Get the mapper is not specified
24
- if (!$mapper) {
25
- $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
26
- }
27
-
28
- // Initialize
29
- parent::initialize($mapper, $properties);
30
- }
31
  }
32
 
33
  class Mixin_Lightbox_Library_Validation extends Mixin
11
  */
12
  class C_Lightbox_Library extends C_DataMapper_Model
13
  {
14
+ function define($mapper, $properties, $context=FALSE)
15
  {
16
  parent::define($mapper, $properties, $context);
17
  $this->add_mixin('Mixin_Lightbox_Library_Validation');
18
  $this->implement('I_Lightbox_Library');
19
  }
 
 
 
 
 
 
 
 
 
 
 
20
  }
21
 
22
  class Mixin_Lightbox_Library_Validation extends Mixin
products/photocrati_nextgen/modules/lightbox/module.lightbox.php CHANGED
@@ -12,15 +12,13 @@ define('NEXTGEN_LIGHTBOX_ADVANCED_OPTIONS_SLUG', 'ngg_lightbox_advanced_options'
12
 
13
  class M_Lightbox extends C_Base_Module
14
  {
15
- var $_registered_lightboxes;
16
-
17
  function define()
18
  {
19
  parent::define(
20
  'photocrati-lightbox',
21
  'Lightbox',
22
  _("Provides integration with JQuery's lightbox plugin"),
23
- '0.5',
24
  'http://leandrovieira.com/projects/jquery/lightbox/',
25
  'Photocrati Media',
26
  'http://www.photocrati.com'
@@ -33,19 +31,14 @@ class M_Lightbox extends C_Base_Module
33
  function initialize()
34
  {
35
  parent::initialize();
36
- if (is_admin()) {
37
- add_action('admin_init', array(&$this, 'add_all_lightbox_forms'));
38
- }
39
- }
40
 
41
- /**
42
- * Adds a configuration form to each library
43
- */
44
- function add_all_lightbox_forms()
45
- {
46
  foreach ($this->get_registry()->get_utility('I_Lightbox_Library_Mapper')->find_all() as $lib) {
47
- $this->get_registry()->add_adapter('I_Form', 'A_Lightbox_Library_Form', $lib->name);
48
- C_Form_Manager::get_instance()->add_form(NEXTGEN_LIGHTBOX_ADVANCED_OPTIONS_SLUG, $lib->name);
 
 
 
49
  }
50
  }
51
 
@@ -66,152 +59,6 @@ class M_Lightbox extends C_Base_Module
66
  // Provides an installer for lightbox libraries
67
  $this->get_registry()->add_adapter('I_Installer', 'A_Lightbox_Installer');
68
  }
69
-
70
- /**
71
- * Registers hooks for the WordPress framework
72
- */
73
- function _register_hooks()
74
- {
75
- add_action('wp_enqueue_scripts', array($this, '_register_resources'));
76
- add_action('wp_footer', array($this, '_enqueue_resources'), 3);
77
- add_action('init', array(&$this, '_register_custom_post_type'));
78
- }
79
-
80
- /**
81
- * Registers the custom post type saved for lightbox libraries
82
- */
83
- function _register_custom_post_type()
84
- {
85
- register_post_type('lightbox_library', array(
86
- 'label' => 'Lightbox Library',
87
- 'publicly_queryable' => FALSE,
88
- 'exclude_from_search' => TRUE,
89
- ));
90
- }
91
-
92
- /**
93
- * Registers our static settings resources so the ATP module can find them later
94
- */
95
- function _register_resources()
96
- {
97
- $router = $this->get_registry()->get_utility('I_Router');
98
- $settings = C_NextGen_Settings::get_instance();
99
- $thumbEffectContext = isset($settings->thumbEffectContext) ? $settings->thumbEffectContext : '';
100
-
101
- wp_register_script(
102
- 'nextgen_lightbox_context',
103
- $router->get_static_url('photocrati-lightbox#lightbox_context.js')
104
- );
105
- wp_enqueue_script('nextgen_lightbox_context');
106
-
107
- if ($thumbEffectContext != null && $thumbEffectContext != 'nextgen_images') {
108
- $mapper = $this->object->get_registry()->get_utility('I_Lightbox_Library_Mapper');
109
- $library = $mapper->find_by_name($settings->thumbEffect);
110
-
111
- // Make the path to the static resources available for libraries
112
- // Shutter-Reloaded in particular depends on this
113
- $this->_add_script_data(
114
- 'ngg_common',
115
- 'nextgen_lightbox_settings',
116
- array('static_path' => $this->get_registry()->get_utility('I_Fs')->find_static_abspath('', 'photocrati-lightbox'), 'context' => $thumbEffectContext),
117
- TRUE,
118
- true
119
- );
120
-
121
- global $wp_scripts;
122
-
123
- $i=0;
124
- foreach (explode("\n", $library->scripts) as $script) {
125
- wp_register_script(
126
-
127
- $library->name.'-'.$i,
128
- $script, array('ngg_common')
129
- );
130
- $this->_registered_lightboxes[] = $library->name.'-'.$i;
131
- if ($i == 0 AND isset($library->values)) {
132
- foreach ($library->values as $name => $value) {
133
- $this->_add_script_data(
134
- $library->name . '-0',
135
- $name,
136
- $value,
137
- FALSE
138
- );
139
- }
140
- }
141
- $i+=1;
142
- }
143
- $i=0;
144
- foreach (explode("\n", $library->css_stylesheets) as $style) {
145
- wp_enqueue_style(
146
- $library->name.'-'.$i,
147
- $style
148
- );
149
- $i+=1;
150
- }
151
- }
152
- }
153
-
154
- function _enqueue_resources()
155
- {
156
- foreach (((array)$this->_registered_lightboxes) as $library) {
157
- wp_enqueue_script($library);
158
- }
159
- }
160
-
161
- /**
162
- * Adds data to the DOM which is then accessible by a script -- borrowed from display type controller class
163
- * @param string $handle
164
- * @param string $object_name
165
- * @param mixed $object_value
166
- * @param bool $define
167
- */
168
- function _add_script_data($handle, $object_name, $object_value, $define=TRUE, $override=FALSE)
169
- {
170
- $retval = FALSE;
171
-
172
- // wp_localize_script allows you to add data to the DOM, associated
173
- // with a particular script. You can even call wp_localize_script
174
- // multiple times to add multiple objects to the DOM. However, there
175
- // are a few problems with wp_localize_script:
176
- //
177
- // - If you call it with the same object_name more than once, you're
178
- // overwritting the first call.
179
- // - You cannot namespace your objects due to the "var" keyword always
180
- // - being used.
181
- //
182
- // To circumvent the above issues, we're going to use the WP_Scripts
183
- // object to workaround the above issues
184
- global $wp_scripts;
185
-
186
- // Has the script been registered or enqueued yet?
187
- if (isset($wp_scripts->registered[$handle])) {
188
-
189
- // Get the associated data with this script
190
- $script = &$wp_scripts->registered[$handle];
191
- $data = isset($script->extra['data']) ? $script->extra['data'] : '';
192
-
193
- // Construct the addition
194
- $addition = $define ? "\nvar {$object_name} = " . json_encode($object_value) . ';' :
195
- "\n{$object_name} = " . json_encode($object_value) . ';';
196
-
197
- // Add the addition
198
- if ($override) {
199
- $data .= $addition;
200
- $retval = TRUE;
201
- }
202
- else if (strpos($data, $object_name) === FALSE) {
203
- $data .= $addition;
204
- $retval = TRUE;
205
- }
206
-
207
- $script->extra['data'] = $data;
208
-
209
- unset($script);
210
- }
211
-
212
- return $retval;
213
- }
214
-
215
 
216
  function get_type_list()
217
  {
12
 
13
  class M_Lightbox extends C_Base_Module
14
  {
 
 
15
  function define()
16
  {
17
  parent::define(
18
  'photocrati-lightbox',
19
  'Lightbox',
20
  _("Provides integration with JQuery's lightbox plugin"),
21
+ '0.1',
22
  'http://leandrovieira.com/projects/jquery/lightbox/',
23
  'Photocrati Media',
24
  'http://www.photocrati.com'
31
  function initialize()
32
  {
33
  parent::initialize();
 
 
 
 
34
 
35
+ // Add a configuration form to each library
 
 
 
 
36
  foreach ($this->get_registry()->get_utility('I_Lightbox_Library_Mapper')->find_all() as $lib) {
37
+ $this->get_registry()
38
+ ->add_adapter('I_Form', 'A_Lightbox_Library_Form', $lib->name);
39
+ $this->get_registry()
40
+ ->get_utility('I_Form_Manager')
41
+ ->add_form(NEXTGEN_LIGHTBOX_ADVANCED_OPTIONS_SLUG, $lib->name);
42
  }
43
  }
44
 
59
  // Provides an installer for lightbox libraries
60
  $this->get_registry()->add_adapter('I_Installer', 'A_Lightbox_Installer');
61
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
  function get_type_list()
64
  {
products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.css CHANGED
@@ -359,8 +359,6 @@
359
  .fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); }
360
 
361
  /* Note: Prevents issues with "style resets" or themes that apply 'box-sizing: border-box' to everything */
362
- #fancybox-wrap, #fancybox-content, #fancybox-outer {
363
  box-sizing: content-box;
364
- -moz-box-sizing: content-box;
365
- -webkit-box-sizing: content-box;
366
  }
359
  .fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); }
360
 
361
  /* Note: Prevents issues with "style resets" or themes that apply 'box-sizing: border-box' to everything */
362
+ #fancybox-wrap, #fancybox-content {
363
  box-sizing: content-box;
 
 
364
  }
products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.js CHANGED
@@ -1,15 +1,9 @@
1
  jQuery(function($) {
2
- var nextgen_fancybox_init = function() {
3
- var selector = nextgen_lightbox_filter_selector($, $(".ngg-fancybox"));
4
-
5
- selector.fancybox({
6
- titlePosition: 'inside',
7
- // Needed for twenty eleven
8
- onComplete: function() {
9
- $('#fancybox-wrap').css('z-index', 10000);
10
- }
11
- });
12
- };
13
- $(this).bind('refreshed', nextgen_fancybox_init);
14
- nextgen_fancybox_init();
15
  });
1
  jQuery(function($) {
2
+ $(".ngg-fancybox").fancybox({
3
+ titlePosition: 'inside',
4
+ // Needed for twenty eleven
5
+ onComplete: function(){
6
+ $('#fancybox-wrap').css('z-index', 10000);
7
+ }
8
+ });
 
 
 
 
 
 
9
  });
products/photocrati_nextgen/modules/lightbox/static/highslide/nextgen_highslide_init.js CHANGED
@@ -1,45 +1,24 @@
1
- // Apply default settings
2
  var galleryOptions = {
3
- align: 'center',
4
- dimmingOpacity: 0.8,
5
- fadeInOut: true,
6
- marginBottom: 80,
7
- marginLeft: 100,
8
- numberPosition: 'caption',
9
- slideshowGroup: 'gallery',
10
- transitions: ['expand', 'crossfade'],
11
- wrapperClassName: 'dark borderless floating-caption',
12
- graphicsDir: nextgen_highslide_graphics_dir + '/'
13
  };
14
 
15
- hs.align = galleryOptions['align'];
16
- hs.dimmingOpacity = galleryOptions['dimmingOpacity'];
17
- hs.fadeInOut = galleryOptions['fadeInOut'];
18
- hs.marginBottom = galleryOptions['marginBottom'];
19
- hs.marginLeft = galleryOptions['marginLeft'];
20
- hs.numberPosition = galleryOptions['numberPosition'];
21
- hs.transitions = galleryOptions['transitions'];
22
- hs.showCredits = galleryOptions['showCredits'];
23
- hs.graphicsDir = galleryOptions['graphicsDir'];
24
- hs.wrapperClassName = galleryOptions['wrapperClassName'];
25
-
26
- jQuery(function($) {
27
- var selector = nextgen_lightbox_filter_selector($, $([]));
28
- selector.addClass('highslide');
29
- selector.click(function () { return hs.expand(this) });
30
-
31
- hs.updateAnchors();
32
-
33
- // Enable slideshows
34
- hs.addSlideshow({
35
- fixedControls: true,
36
- interval: 5000,
37
- overlayOptions: {
38
- hideOnMouseOut: true,
39
- opacity: .6,
40
- position: 'top center'
41
- },
42
- repeat: true,
43
- useControls: true
44
- });
45
  });
 
1
  var galleryOptions = {
2
+ align: 'center',
3
+ dimmingOpacity: 0.8,
4
+ fadeInOut: true,
5
+ marginBottom: 80,
6
+ marginLeft: 100,
7
+ numberPosition: 'caption',
8
+ slideshowGroup: 'gallery',
9
+ transitions: ['expand', 'crossfade'],
10
+ wrapperClassName: 'dark borderless floating-caption'
 
11
  };
12
 
13
+ hs.graphicsDir = nextgen_highslide_graphics_dir + '/';
14
+ hs.addSlideshow({
15
+ fixedControls: true,
16
+ interval: 5000,
17
+ overlayOptions: {
18
+ hideOnMouseOut: true,
19
+ opacity: .6,
20
+ position: 'top center'
21
+ },
22
+ repeat: true,
23
+ useControls: true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  });
products/photocrati_nextgen/modules/lightbox/static/jquery.lightbox/nextgen_lightbox_init.js CHANGED
@@ -5,19 +5,16 @@ jQuery(function($) {
5
  */
6
  function insert_code_in_another_methods_scope(scope, method_name, callback)
7
  {
8
- var do_that_name = 'e' + '' + ('v');
9
- do_that_name += 'a' + 'l';
10
- var do_that = window[do_that_name];
11
- var scope_code = do_that(scope).toString();
12
  var callback_code = callback.toString().replace(/[^\{]*{/, '').replace(/\}$/, '');
13
- var regex = new RegExp('(fu' + 'nc' + '' + 'tion '+method_name+'\\([^\\)]*\\)){');
14
  scope_code = scope_code.replace(regex, function(str, match){
15
  return str+callback_code;
16
  }).replace(/\$([\s\.\(=])/g, function(str, match){
17
  return 'jQuery'+match;
18
  });
19
- do_that(scope+" = "+scope_code);
20
- return do_that(scope);
21
  };
22
 
23
  // Adjusts the _resize_container_image_box() function to take into
@@ -45,18 +42,11 @@ jQuery(function($) {
45
  });
46
  });
47
 
48
- var nextgen_jquery_lightbox_init = function() {
49
- var selector = nextgen_lightbox_filter_selector($, $(".ngg_lightbox"));
50
-
51
- selector.lightBox({
52
- imageLoading: nextgen_lightbox_loading_img_url,
53
- imageBtnClose: nextgen_lightbox_close_btn_url,
54
- imageBtnPrev: nextgen_lightbox_btn_prev_url,
55
- imageBtnNext: nextgen_lightbox_btn_next_url,
56
- imageBlank: nextgen_lightbox_blank_img_url
57
- });
58
- };
59
- $(this).bind('refreshed', nextgen_jquery_lightbox_init);
60
- nextgen_jquery_lightbox_init();
61
-
62
  });
5
  */
6
  function insert_code_in_another_methods_scope(scope, method_name, callback)
7
  {
8
+ var scope_code = eval(scope).toString();
 
 
 
9
  var callback_code = callback.toString().replace(/[^\{]*{/, '').replace(/\}$/, '');
10
+ var regex = new RegExp('(function '+method_name+'\\([^\\)]*\\)){');
11
  scope_code = scope_code.replace(regex, function(str, match){
12
  return str+callback_code;
13
  }).replace(/\$([\s\.\(=])/g, function(str, match){
14
  return 'jQuery'+match;
15
  });
16
+ window.eval(scope+" = "+scope_code);
17
+ return eval(scope);
18
  };
19
 
20
  // Adjusts the _resize_container_image_box() function to take into
42
  });
43
  });
44
 
45
+ $('.ngg_lightbox').lightBox({
46
+ imageLoading: nextgen_lightbox_loading_img_url,
47
+ imageBtnClose: nextgen_lightbox_close_btn_url,
48
+ imageBtnPrev: nextgen_lightbox_btn_prev_url,
49
+ imageBtnNext: nextgen_lightbox_btn_next_url,
50
+ imageBlank: nextgen_lightbox_blank_img_url
51
+ });
 
 
 
 
 
 
 
52
  });
products/photocrati_nextgen/modules/lightbox/static/lightbox_context.js DELETED
@@ -1,27 +0,0 @@
1
- function nextgen_lightbox_filter_selector($, selector)
2
- {
3
- if (nextgen_lightbox_settings && nextgen_lightbox_settings.context) {
4
- var context = nextgen_lightbox_settings.context;
5
-
6
- if (context == 'all_images') {
7
- selector = selector.add($('a > img').parent());
8
- }
9
- else if (context == 'all_images_direct') {
10
- selector = selector.add($('a[href] > img').parent()
11
- .filter(function() {
12
- var href = $(this).attr('href').toLowerCase();
13
- var ext = href.substring(href.length - 3);
14
- var ext2 = href.substring(href.length - 4);
15
-
16
- return (ext == 'jpg' || ext == 'gif' || ext == 'png' || ext2 == 'tiff' || ext2 == 'jpeg');
17
- }));
18
- }
19
- else if (context == 'nextgen_and_wp_images') {
20
- selector = selector.add($('a > img[class*="wp-image-"]').parent());
21
- }
22
-
23
- selector = selector.not('.gallery_link');
24
- }
25
-
26
- return selector;
27
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/lightbox/static/shutter/nextgen_shutter.js CHANGED
@@ -1,16 +1,15 @@
1
  jQuery(function($){
2
  var callback = function(){
3
- var selector = nextgen_lightbox_filter_selector($, $([]));
4
- selector.addClass('shutterset');
5
-
6
  var shutterLinks = {}, shutterSets = {}; shutterReloaded.init();
7
  };
8
  $(this).bind('refreshed', callback);
9
 
10
- var flag = 'shutter';
11
- if (typeof($(window).data(flag)) == 'undefined')
12
- $(window).data(flag, true);
13
- else return;
 
14
 
15
- callback();
 
16
  });
1
  jQuery(function($){
2
  var callback = function(){
 
 
 
3
  var shutterLinks = {}, shutterSets = {}; shutterReloaded.init();
4
  };
5
  $(this).bind('refreshed', callback);
6
 
7
+ $(document).on('lazy_resources_loaded', function(){
8
+ var flag = 'shutter';
9
+ if (typeof($(window).data(flag)) == 'undefined')
10
+ $(window).data(flag, true);
11
+ else return;
12
 
13
+ callback();
14
+ });
15
  });
products/photocrati_nextgen/modules/lightbox/static/shutter_reloaded/nextgen_shutter_reloaded.js CHANGED
@@ -1,16 +1,15 @@
1
  jQuery(function($){
2
  var callback = function(){
3
- var selector = nextgen_lightbox_filter_selector($, $([]));
4
- selector.addClass('shutterset');
5
-
6
  var shutterLinks = {}, shutterSets = {}; shutterReloaded.Init();
7
  };
8
  $(this).bind('refreshed', callback);
9
 
10
- var flag = 'shutterReloaded';
11
- if (typeof($(window).data(flag)) == 'undefined')
12
- $(window).data(flag, true);
13
- else return;
 
14
 
15
- callback();
16
- });
 
1
  jQuery(function($){
2
  var callback = function(){
 
 
 
3
  var shutterLinks = {}, shutterSets = {}; shutterReloaded.Init();
4
  };
5
  $(this).bind('refreshed', callback);
6
 
7
+ $(document).on('lazy_resources_loaded', function(){
8
+ var flag = 'shutterReloaded';
9
+ if (typeof($(window).data(flag)) == 'undefined')
10
+ $(window).data(flag, true);
11
+ else return;
12
 
13
+ callback();
14
+ });
15
+ });
products/photocrati_nextgen/modules/lightbox/static/thickbox/nextgen_thickbox_init.js CHANGED
@@ -1,6 +1,6 @@
1
  var thickboxL10n = {
2
- loadingAnimation: photocrati_ajax.wp_site_static_url + '/wp-includes/js/thickbox/loadingAnimation.gif',
3
- closeImage: photocrati_ajax.wp_site_static_url + '/wp-includes/js/thickbox/tb-close.png',
4
  next: 'Next &gt;',
5
  prev: '&lt; Prev',
6
  image: 'Image',
@@ -8,8 +8,3 @@ var thickboxL10n = {
8
  close: 'Close',
9
  noiframes: 'This feature requires inline frames. You have iframes disabled or your browser does not support them.'
10
  };
11
-
12
- jQuery(function($) {
13
- var selector = nextgen_lightbox_filter_selector($, $([]));
14
- selector.addClass('thickbox');
15
- });
1
  var thickboxL10n = {
2
+ loadingAnimation: photocrati_ajax.wp_site_url + '/wp-includes/js/thickbox/loadingAnimation.gif',
3
+ closeImage: photocrati_ajax.wp_site_url + '/wp-includes/js/thickbox/tb-close.png',
4
  next: 'Next &gt;',
5
  prev: '&lt; Prev',
6
  image: 'Image',
8
  close: 'Close',
9
  noiframes: 'This feature requires inline frames. You have iframes disabled or your browser does not support them.'
10
  };
 
 
 
 
 
products/photocrati_nextgen/modules/mediarss/class.mediarss_controller.php CHANGED
@@ -50,7 +50,7 @@ class Mixin_MediaRSS_Controller extends Mixin
50
  {
51
  // retrieve by transient id
52
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
53
- $displayed_gallery = $factory->create('displayed_gallery', NULL, $mapper);
54
  $displayed_gallery->apply_transient($transient_id);
55
  }
56
  elseif (($params = $this->object->param('params')))
@@ -58,7 +58,7 @@ class Mixin_MediaRSS_Controller extends Mixin
58
  // Create the displayed gallery based on the URL parameters
59
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
60
  $displayed_gallery = $factory->create(
61
- 'displayed_gallery', json_decode($params), $mapper
62
  );
63
  }
64
 
50
  {
51
  // retrieve by transient id
52
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
53
+ $displayed_gallery = $factory->create('displayed_gallery', $mapper);
54
  $displayed_gallery->apply_transient($transient_id);
55
  }
56
  elseif (($params = $this->object->param('params')))
58
  // Create the displayed gallery based on the URL parameters
59
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
60
  $displayed_gallery = $factory->create(
61
+ 'displayed_gallery', $mapper, json_decode($params)
62
  );
63
  }
64
 
products/photocrati_nextgen/modules/mediarss/module.mediarss.php CHANGED
@@ -13,7 +13,7 @@ class M_MediaRss extends C_Base_Module
13
  'photocrati-mediarss',
14
  'MediaRss',
15
  'Generates MediaRSS feeds of image collections',
16
- '0.2',
17
  'http://www.nextgen-gallery.com',
18
  'Photocrati Media',
19
  'http://www.photocrati.com'
13
  'photocrati-mediarss',
14
  'MediaRss',
15
  'Generates MediaRSS feeds of image collections',
16
+ '0.1',
17
  'http://www.nextgen-gallery.com',
18
  'Photocrati Media',
19
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/mediarss/templates/mediarss_feed.php CHANGED
@@ -4,11 +4,11 @@
4
  <generator><![CDATA[<?php echo_h($generator)?>]]></generator>
5
  <title><?php echo_h($feed_title) ?></title>
6
  <description><?php echo_h($feed_description) ?></description>
7
- <link><![CDATA[<?php echo nextgen_esc_url($feed_link)?>]]></link>
8
  <?php foreach($images as $image): ?>
9
  <?php
10
- $image_url = $storage->get_image_url($image, 'full', TRUE);
11
- $thumb_url = $storage->get_thumb_url($image, TRUE);
12
  $thumb_size = $storage->get_thumb_dimensions($image);
13
  $width = $thumb_size['width'];
14
  $height = $thumb_size['height'];
@@ -16,14 +16,14 @@
16
  <item>
17
  <title><![CDATA[<?php echo_h($image->alttext)?>]]></title>
18
  <description><![CDATA[<?php echo_h($image->description)?>]]></description>
19
- <link><![CDATA[<?php echo nextgen_esc_url($image_url)?>]]></link>
20
  <guid>image-id:<?php echo_h($image->id_field)?></guid>
21
- <media:content url="<?php echo nextgen_esc_url($image_url)?>" medium="image" />
22
  <media:title><![CDATA[<?php echo_h($image->alttext)?>]]></media:title>
23
  <?php if (isset($description)): ?>
24
  <media:description><![CDDATA[<?php echo_h($image->description)?>]]></media:description>
25
  <?php endif ?>
26
- <media:thumbnail width="<?php echo esc_attr($width)?>" height="<?php echo esc_attr($height)?>" url="<?php echo nextgen_esc_url($thumb_url) ?>"/>
27
  <?php if (isset($tagnames)): ?>
28
  <media:keywords><![CDATA[<?php echo_h($tagnames)?>]]></media:keywords>
29
  <?php endif ?>
4
  <generator><![CDATA[<?php echo_h($generator)?>]]></generator>
5
  <title><?php echo_h($feed_title) ?></title>
6
  <description><?php echo_h($feed_description) ?></description>
7
+ <link><![CDATA[<?php echo esc_url($feed_link)?>]]></link>
8
  <?php foreach($images as $image): ?>
9
  <?php
10
+ $image_url = $storage->get_image_url($image);
11
+ $thumb_url = $storage->get_thumb_url($image);
12
  $thumb_size = $storage->get_thumb_dimensions($image);
13
  $width = $thumb_size['width'];
14
  $height = $thumb_size['height'];
16
  <item>
17
  <title><![CDATA[<?php echo_h($image->alttext)?>]]></title>
18
  <description><![CDATA[<?php echo_h($image->description)?>]]></description>
19
+ <link><![CDATA[<?php echo esc_url($image_url)?>]]></link>
20
  <guid>image-id:<?php echo_h($image->id_field)?></guid>
21
+ <media:content url="<?php echo esc_url($image_url)?>" medium="image" />
22
  <media:title><![CDATA[<?php echo_h($image->alttext)?>]]></media:title>
23
  <?php if (isset($description)): ?>
24
  <media:description><![CDDATA[<?php echo_h($image->description)?>]]></media:description>
25
  <?php endif ?>
26
+ <media:thumbnail width="<?php echo esc_attr($width)?>" height="<?php echo esc_attr($height)?>" url="<?php echo esc_url($thumb_url) ?>"/>
27
  <?php if (isset($tagnames)): ?>
28
  <media:keywords><![CDATA[<?php echo_h($tagnames)?>]]></media:keywords>
29
  <?php endif ?>
products/photocrati_nextgen/modules/mediarss/templates/playlist_feed.php CHANGED
@@ -2,8 +2,8 @@
2
  <trackList>
3
  <?php foreach($images as $image): ?>
4
  <?php
5
- $image_url = $storage->get_image_url($image, 'full', TRUE);
6
- $thumb_url = $storage->get_thumb_url($image, TRUE);
7
  $thumb_size = $storage->get_thumb_dimensions($image);
8
  $width = $thumb_size['width'];
9
  $height = $thumb_size['height'];
@@ -18,7 +18,7 @@
18
  ?>
19
  <track>
20
  <title><![CDATA[<?php echo_h($image_title)?>]]></title>
21
- <location><![CDATA[<?php echo nextgen_esc_url($image_url)?>]]></location>
22
  </track>
23
  <?php endforeach ?>
24
  </trackList>
2
  <trackList>
3
  <?php foreach($images as $image): ?>
4
  <?php
5
+ $image_url = $storage->get_image_url($image);
6
+ $thumb_url = $storage->get_thumb_url($image);
7
  $thumb_size = $storage->get_thumb_dimensions($image);
8
  $width = $thumb_size['width'];
9
  $height = $thumb_size['height'];
18
  ?>
19
  <track>
20
  <title><![CDATA[<?php echo_h($image_title)?>]]></title>
21
+ <location><![CDATA[<?php echo esc_url($image_url)?>]]></location>
22
  </track>
23
  <?php endforeach ?>
24
  </trackList>
products/photocrati_nextgen/modules/mvc/adapter.mvc_fs.php CHANGED
@@ -20,7 +20,7 @@ class A_MVC_Fs extends Mixin
20
  // Create the absolute path to the file
21
  $path = $fs->join_paths(
22
  $mod_dir,
23
- C_NextGen_Settings::get_instance()->get('mvc_static_dirname'),
24
  $path
25
  );
26
 
20
  // Create the absolute path to the file
21
  $path = $fs->join_paths(
22
  $mod_dir,
23
+ C_NextGen_Global_Settings::get_instance()->get('mvc_static_dirname'),
24
  $path
25
  );
26
 
products/photocrati_nextgen/modules/mvc/adapter.mvc_router.php CHANGED
@@ -11,7 +11,7 @@ class A_MVC_Router extends Mixin
11
  function get_static_url($path, $module=FALSE)
12
  {
13
  // Determine the base url
14
- $base_url = $this->object->get_base_url(TRUE);
15
  $base_url = $this->object->remove_url_segment('/index.php', $base_url);
16
 
17
  // Find the module directory
11
  function get_static_url($path, $module=FALSE)
12
  {
13
  // Determine the base url
14
+ $base_url = $this->object->get_base_url();
15
  $base_url = $this->object->remove_url_segment('/index.php', $base_url);
16
 
17
  // Find the module directory
products/photocrati_nextgen/modules/mvc/class.mvc_controller.php CHANGED
@@ -97,7 +97,7 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin
97
  {
98
  $time = strtotime($time);
99
  if (!headers_sent()) {
100
- header('Expires: '.strftime("%a, %d %b %Y %H:%M:%S %Z", $time));
101
  }
102
  }
103
 
@@ -247,7 +247,7 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin
247
  */
248
  function render()
249
  {
250
- if (!headers_sent()) header('Content-Type: ' . $this->object->_content_type . '; charset=' . get_option('blog_charset'), true );
251
  }
252
 
253
 
97
  {
98
  $time = strtotime($time);
99
  if (!headers_sent()) {
100
+ header('Expires: '.strftime("%a, %d %b %Y %T %Z", $time));
101
  }
102
  }
103
 
247
  */
248
  function render()
249
  {
250
+ if (!headers_sent()) header('Content-Type: '.$this->object->_content_type);
251
  }
252
 
253
 
products/photocrati_nextgen/modules/mvc/class.mvc_installer.php CHANGED
@@ -4,12 +4,13 @@ class C_MVC_Installer
4
  {
5
  function __construct()
6
  {
7
- $this->settings = C_NextGen_Settings::get_instance();
8
  }
9
 
10
  function install()
11
  {
12
- $this->settings->delete('mvc_template_dir');
 
13
  $this->settings->set_default_value('mvc_template_dirname', '/templates');
14
  $this->settings->set_default_value('mvc_static_dirname', '/static');
15
  }
4
  {
5
  function __construct()
6
  {
7
+ $this->settings = C_NextGen_Global_Settings::get_instance();
8
  }
9
 
10
  function install()
11
  {
12
+ $this->settings->set_default_value('mvc_module_dir', dirname(__FILE__));
13
+ $this->settings->set_default_value('mvc_template_dir', path_join($this->settings->get('mvc_module_dir'), 'templates'));
14
  $this->settings->set_default_value('mvc_template_dirname', '/templates');
15
  $this->settings->set_default_value('mvc_static_dirname', '/static');
16
  }
products/photocrati_nextgen/modules/mvc/class.mvc_option_handler.php DELETED
@@ -1,9 +0,0 @@
1
- <?php
2
-
3
- class C_Mvc_Option_Handler
4
- {
5
- function get($option, $default=NULL)
6
- {
7
- return path_join(dirname(__FILE__), 'templates');
8
- }
9
- }
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/mvc/class.mvc_view.php CHANGED
@@ -59,7 +59,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin
59
  {
60
  if (!$value) $value = $this->object->_template;
61
 
62
- if ($value[0] == '/' && @file_exists($value)) {
63
  // key is already abspath
64
  }
65
  else $value = $this->object->find_template_abspath($value);
@@ -230,7 +230,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin
230
  function find_template_abspath($path, $module=FALSE)
231
  {
232
  $fs = $this->get_registry()->get_utility('I_Fs');
233
- $settings = C_NextGen_Settings::get_instance();
234
 
235
  // We also accept module_name#path, which needs parsing.
236
  if (!$module)
@@ -246,7 +246,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin
246
  $path
247
  );
248
 
249
- if (!@file_exists($retval))
250
  throw new RuntimeException("{$retval} is not a valid MVC template");
251
 
252
  return $retval;
59
  {
60
  if (!$value) $value = $this->object->_template;
61
 
62
+ if ($value[0] == '/' && file_exists($value)) {
63
  // key is already abspath
64
  }
65
  else $value = $this->object->find_template_abspath($value);
230
  function find_template_abspath($path, $module=FALSE)
231
  {
232
  $fs = $this->get_registry()->get_utility('I_Fs');
233
+ $settings = C_NextGen_Global_Settings::get_instance();
234
 
235
  // We also accept module_name#path, which needs parsing.
236
  if (!$module)
246
  $path
247
  );
248
 
249
+ if (!file_exists($retval))
250
  throw new RuntimeException("{$retval} is not a valid MVC template");
251
 
252
  return $retval;
products/photocrati_nextgen/modules/mvc/module.mvc.php CHANGED
@@ -3,7 +3,7 @@
3
  /***
4
  {
5
  Module: photocrati-mvc,
6
- Depends: { photocrati-router, photocrati-nextgen_settings }
7
  }
8
  ***/
9
 
@@ -21,7 +21,7 @@ class M_MVC extends C_Base_Module
21
  "photocrati-mvc",
22
  "MVC Framework",
23
  "Provides an MVC architecture for the plugin to use",
24
- "0.4",
25
  "http://www.photocrati.com",
26
  "Photocrati Media",
27
  "http://www.photocrati.com"
@@ -29,11 +29,6 @@ class M_MVC extends C_Base_Module
29
 
30
  include_once('class.mvc_installer.php');
31
  C_Photocrati_Installer::add_handler($this->module_id, 'C_Mvc_Installer');
32
-
33
- include_once('class.mvc_option_handler.php');
34
- C_NextGen_Settings::add_option_handler('C_Mvc_Option_Handler', array(
35
- 'mvc_template_dir'
36
- ));
37
  }
38
 
39
  function _register_utilities()
3
  /***
4
  {
5
  Module: photocrati-mvc,
6
+ Depends: { photocrati-router }
7
  }
8
  ***/
9
 
21
  "photocrati-mvc",
22
  "MVC Framework",
23
  "Provides an MVC architecture for the plugin to use",
24
+ "0.1",
25
  "http://www.photocrati.com",
26
  "Photocrati Media",
27
  "http://www.photocrati.com"
29
 
30
  include_once('class.mvc_installer.php');
31
  C_Photocrati_Installer::add_handler($this->module_id, 'C_Mvc_Installer');
 
 
 
 
 
32
  }
33
 
34
  function _register_utilities()
products/photocrati_nextgen/modules/mvc/template_helper.php CHANGED
@@ -8,12 +8,7 @@ if (strpos($_SERVER['REQUEST_URI'], 'adminer') === FALSE) {
8
  if (!function_exists('h')) {
9
  function h($str)
10
  {
11
- if (defined('ENT_HTML401')) {
12
- return str_replace("'", "&#39;", htmlentities($str, ENT_COMPAT | ENT_HTML401, 'UTF-8'));
13
- }
14
- else {
15
- return str_replace("'", "&#39;", htmlentities($str, ENT_COMPAT, 'UTF-8'));
16
- }
17
  }
18
  }
19
 
@@ -23,17 +18,4 @@ if (strpos($_SERVER['REQUEST_URI'], 'adminer') === FALSE) {
23
  echo h($str);
24
  }
25
  }
26
-
27
- if (!function_exists('echo_safe_html')) {
28
- function echo_safe_html($html, $extra_tags = null)
29
- {
30
- $tags = array('<a>', '<abbr>', '<acronym>', '<address>', '<b>', '<base>', '<basefont>', '<big>', '<blockquote>', '<br>', '<br/>', '<caption>', '<center>', '<cite>', '<code>', '<col>', '<colgroup>', '<dd>', '<del>', '<dfn>', '<dir>', '<div>', '<dl>', '<dt>', '<em>', '<fieldset>', '<font>', '<h1>', '<h2>', '<h3>', '<h4>', '<h5>', '<h6>', '<hr>', '<i>', '<ins>', '<label>', '<legend>', '<li>', '<menu>', '<noframes>', '<noscript>', '<ol>', '<optgroup>', '<option>', '<p>', '<pre>', '<q>', '<s>', '<samp>', '<select>', '<small>', '<span>', '<strike>', '<strong>', '<sub>', '<sup>', '<table>', '<tbody>', '<td>', '<tfoot>', '<th>', '<thead>', '<tr>', '<tt>', '<u>', '<ul>');
31
-
32
- $html = preg_replace('/\\s+on\\w+=(["\']).*?\\1/i', '', $html);
33
- $html = preg_replace('/(<\/[^>]+?>)(<[^>\/][^>]*?>)/', '$1 $2', $html);
34
- $html = strip_tags($html, implode('', $tags));
35
-
36
- echo $html;
37
- }
38
- }
39
- }
8
  if (!function_exists('h')) {
9
  function h($str)
10
  {
11
+ return str_replace("'", "&#39;", htmlentities($str));
 
 
 
 
 
12
  }
13
  }
14
 
18
  echo h($str);
19
  }
20
  }
21
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/mvc/templates/index.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- $settings = C_NextGen_Settings::get_instance();
3
  $obj = method_exists($this, 'get_class_definition_dir') ? $this : $this->object;
4
  $template_dir = path_join($obj->get_class_definition_dir(), 'templates');
5
  $default_template_dir = $settings->mvc_template_dir;
1
  <?php
2
+ $settings = C_NextGen_Global_Settings::get_instance();
3
  $obj = method_exists($this, 'get_class_definition_dir') ? $this : $this->object;
4
  $template_dir = path_join($obj->get_class_definition_dir(), 'templates');
5
  $default_template_dir = $settings->mvc_template_dir;
products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php CHANGED
@@ -58,7 +58,7 @@ class A_NextGen_AddGallery_Ajax extends Mixin
58
  $error = TRUE;
59
  }
60
  }
61
- catch (E_NggErrorException $ex) {
62
  $retval['error'] = $ex->getMessage();
63
  $error = TRUE;
64
  }
@@ -68,14 +68,14 @@ class A_NextGen_AddGallery_Ajax extends Mixin
68
  $error = TRUE;
69
  }
70
  }
71
- }
72
- else {
73
- $retval['error'] = "No permissions to upload images. Try refreshing the page or ensuring that your user account has sufficient roles/privileges.";
74
  $error = TRUE;
75
- }
76
 
77
- if ($error) return $retval;
78
- else $retval['gallery_name'] = esc_html($gallery_name);
79
 
80
  return $retval;
81
  }
@@ -90,18 +90,18 @@ class A_NextGen_AddGallery_Ajax extends Mixin
90
  {
91
  if (($dir = urldecode($this->param('dir')))) {
92
  $fs = $this->get_registry()->get_utility('I_Fs');
93
- $root = NEXTGEN_GALLERY_IMPORT_ROOT;
94
 
95
  $browse_path = $fs->join_paths($root, $dir);
96
- if (@file_exists($browse_path)) {
97
  $files = scandir($browse_path);
98
  natcasesort($files);
99
  if( count($files) > 2 ) { /* The 2 accounts for . and .. */
100
  $html[] = "<ul class=\"jqueryFileTree\" style=\"display: none;\">";
101
  foreach( $files as $file ) {
102
  $file_path = path_join($browse_path, $file);
103
- $rel_file_path = str_replace($root, '', $file_path);
104
- if(@file_exists($file_path) && $file != '.' && $file != '..' && is_dir($file_path) ) {
105
  $html[] = "<li class=\"directory collapsed\"><a href=\"#\" rel=\"" . htmlentities($rel_file_path) . "/\">" . htmlentities($file) . "</a></li>";
106
  }
107
  }
@@ -118,7 +118,7 @@ class A_NextGen_AddGallery_Ajax extends Mixin
118
  }
119
  }
120
  else {
121
- $retval['error'] = "No permissions to browse folders. Try refreshing the page or ensuring that your user account has sufficient roles/privileges.";
122
  }
123
 
124
  return $retval;
@@ -132,27 +132,22 @@ class A_NextGen_AddGallery_Ajax extends Mixin
132
  if ($this->validate_ajax_request('nextgen_upload_image'))
133
  {
134
  if (($folder = $this->param('folder'))) {
135
- $storage = C_Gallery_Storage::get_instance();
136
- $fs = C_Fs::get_instance();
137
  try {
138
- $keep_files = $this->param('keep_location') == 'on';
139
- $retval = $storage->import_gallery_from_fs($fs->join_paths(NEXTGEN_GALLERY_IMPORT_ROOT, $folder), false, !$keep_files);
140
  if (!$retval) $retval = array('error' => "Could not import folder. No images found.");
141
  }
142
- catch (E_NggErrorException $ex) {
143
- $retval['error'] = $ex->getMessage();
144
- }
145
- catch (Exception $ex) {
146
- $retval['error'] = "An unexpected error occured.";
147
- $retval['error_details'] = $ex->getMessage();
148
- }
149
  }
150
  else {
151
  $retval['error'] = "No folder specified";
152
  }
153
  }
154
  else {
155
- $retval['error'] = "No permissions to import folders. Try refreshing the page or ensuring that your user account has sufficient roles/privileges.";
156
  }
157
 
158
  return $retval;
58
  $error = TRUE;
59
  }
60
  }
61
+ catch (E_InsufficientWriteAccessException $ex) {
62
  $retval['error'] = $ex->getMessage();
63
  $error = TRUE;
64
  }
68
  $error = TRUE;
69
  }
70
  }
71
+ }
72
+ else {
73
+ $retval['error'] = "No permissions to upload images. Try refreshing the page.";
74
  $error = TRUE;
75
+ }
76
 
77
+ if ($error) header('HTTP/1.1 400 Bad Request');
78
+ else $retval['gallery_name'] = $gallery_name;
79
 
80
  return $retval;
81
  }
90
  {
91
  if (($dir = urldecode($this->param('dir')))) {
92
  $fs = $this->get_registry()->get_utility('I_Fs');
93
+ $root = path_join($fs->get_document_root(), 'wp-content');
94
 
95
  $browse_path = $fs->join_paths($root, $dir);
96
+ if (file_exists($browse_path)) {
97
  $files = scandir($browse_path);
98
  natcasesort($files);
99
  if( count($files) > 2 ) { /* The 2 accounts for . and .. */
100
  $html[] = "<ul class=\"jqueryFileTree\" style=\"display: none;\">";
101
  foreach( $files as $file ) {
102
  $file_path = path_join($browse_path, $file);
103
+ $rel_file_path = str_replace(WP_CONTENT_DIR, '', $file_path);
104
+ if( file_exists($file_path) && $file != '.' && $file != '..' && is_dir($file_path) ) {
105
  $html[] = "<li class=\"directory collapsed\"><a href=\"#\" rel=\"" . htmlentities($rel_file_path) . "/\">" . htmlentities($file) . "</a></li>";
106
  }
107
  }
118
  }
119
  }
120
  else {
121
+ $retval['error'] = "No permissions to browse folders. Try refreshing the page.";
122
  }
123
 
124
  return $retval;
132
  if ($this->validate_ajax_request('nextgen_upload_image'))
133
  {
134
  if (($folder = $this->param('folder'))) {
135
+ $storage = $this->get_registry()->get_utility('I_Gallery_Storage');
136
+ $fs = $this->get_registry()->get_utility('I_Fs');
137
  try {
138
+ $retval = $storage->import_gallery_from_fs($fs->join_paths($fs->get_document_root(), 'wp-content', $folder));
 
139
  if (!$retval) $retval = array('error' => "Could not import folder. No images found.");
140
  }
141
+ catch (Exception $ex) {
142
+ $retval['error'] = $ex->getMessage();
143
+ }
 
 
 
 
144
  }
145
  else {
146
  $retval['error'] = "No folder specified";
147
  }
148
  }
149
  else {
150
+ $retval['error'] = "No permissions to import folders. Try refreshing the page.";
151
  }
152
 
153
  return $retval;
products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_forms.php CHANGED
@@ -4,16 +4,18 @@ class A_NextGen_AddGallery_Forms extends Mixin
4
  {
5
  function initialize()
6
  {
7
- $settings = C_NextGen_Settings::get_instance();
8
- $registry = $this->object->get_registry();
9
-
10
- $forms = array('upload_images' => 'A_Upload_Images_Form');
11
- if (!is_multisite() || (is_multisite() && $settings->get('wpmuImportFolder')))
12
- $forms['import_folder'] = 'A_Import_Folder_Form';
13
 
 
14
  foreach ($forms as $form => $adapter) {
15
  $registry->add_adapter('I_Form', $adapter, $form);
16
- $this->object->add_form(NEXTGEN_ADD_GALLERY_SLUG, $form);
 
 
 
17
  }
18
  }
19
  }
4
  {
5
  function initialize()
6
  {
7
+ $forms = array(
8
+ 'upload_images' => 'A_Upload_Images_Form',
9
+ 'import_folder' => 'A_Import_Folder_Form'
10
+ );
 
 
11
 
12
+ $registry = $this->object->get_registry();
13
  foreach ($forms as $form => $adapter) {
14
  $registry->add_adapter('I_Form', $adapter, $form);
15
+ $this->object->add_form(
16
+ NEXTGEN_ADD_GALLERY_SLUG,
17
+ $form
18
+ );
19
  }
20
  }
21
  }
products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php CHANGED
@@ -47,14 +47,10 @@ class A_Upload_Images_Form extends Mixin
47
  $imgs->extensions = "jpg,jpeg,gif,png,JPG,JPEG,GIF,PNG";
48
  $retval[] = $imgs;
49
 
50
- $settings = C_NextGen_Settings::get_instance();
51
- if (!is_multisite() || (is_multisite() && $settings->get('wpmuZipUpload')))
52
- {
53
- $zips = new stdClass;
54
- $zips->title = "Zip files";
55
- $zips->extensions = "zip,ZIP";
56
- $retval[] = $zips;
57
- }
58
 
59
  return $retval;
60
  }
47
  $imgs->extensions = "jpg,jpeg,gif,png,JPG,JPEG,GIF,PNG";
48
  $retval[] = $imgs;
49
 
50
+ $zips = new stdClass;
51
+ $zips->title = "Zip files";
52
+ $zips->extensions = "zip,ZIP";
53
+ $retval[] = $zips;
 
 
 
 
54
 
55
  return $retval;
56
  }
products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php CHANGED
@@ -15,7 +15,7 @@ class M_NextGen_AddGallery_Page extends C_Base_Module
15
  'photocrati-nextgen_addgallery_page',
16
  'NextGEN Add Gallery Page',
17
  'Provides admin page for adding a gallery and uploading images',
18
- '0.3',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
15
  'photocrati-nextgen_addgallery_page',
16
  'NextGEN Add Gallery Page',
17
  'Provides admin page for adding a gallery and uploading images',
18
+ '0.1',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/nextgen_addgallery_page/static/jquery.filetree/connectors/jqueryFileTree.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ //
3
+ // jQuery File Tree PHP Connector
4
+ //
5
+ // Version 1.01
6
+ //
7
+ // Cory S.N. LaViska
8
+ // A Beautiful Site (http://abeautifulsite.net/)
9
+ // 24 March 2008
10
+ //
11
+ // History:
12
+ //
13
+ // 1.01 - updated to work with foreign characters in directory/file names (12 April 2008)
14
+ // 1.00 - released (24 March 2008)
15
+ //
16
+ // Output a list of files for jQuery File Tree
17
+ //
18
+
19
+ $_POST['dir'] = urldecode($_POST['dir']);
20
+
21
+ if( file_exists($root . $_POST['dir']) ) {
22
+ $files = scandir($root . $_POST['dir']);
23
+ natcasesort($files);
24
+ if( count($files) > 2 ) { /* The 2 accounts for . and .. */
25
+ echo "<ul class=\"jqueryFileTree\" style=\"display: none;\">";
26
+ // All dirs
27
+ foreach( $files as $file ) {
28
+ if( file_exists($root . $_POST['dir'] . $file) && $file != '.' && $file != '..' && is_dir($root . $_POST['dir'] . $file) ) {
29
+ echo "<li class=\"directory collapsed\"><a href=\"#\" rel=\"" . htmlentities($_POST['dir'] . $file) . "/\">" . htmlentities($file) . "</a></li>";
30
+ }
31
+ }
32
+ echo "</ul>";
33
+ }
34
+ }
35
+
36
+ ?>
products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php CHANGED
@@ -2,7 +2,6 @@
2
  <div id="file_browser">
3
  </div>
4
  <p>
5
- <input type="checkbox" id="import_keep_location" name="keep_location" value="on" /> <label for="import_keep_location"> <?php esc_html_e('Keep images in original location.', 'nggallery'); ?> <span style="font-size: 85%"><?php esc_html_e('Caution: If you keep images in the original folder and later delete the gallery, the images in that folder might be deleted depending on your settings.', 'nggallery'); ?></span></label><br/><br/>
6
  <input type="button" id="import_button" name="import_folder" value="Import Folder" class="button-primary"/>
7
  </p>
8
  <script type="text/javascript">
@@ -44,19 +43,19 @@
44
  // Start importing process
45
  var post_params = {
46
  action: 'import_folder',
47
- folder: selected_folder,
48
- keep_location: $('#import_keep_location').is(":checked") ? 'on' : 'off'
49
  };
50
  $.post(photocrati_ajax.url, post_params, function(response){
51
  if (typeof(response) != 'object') response = JSON.parse(response);
52
  if (typeof(response.error) == 'string') {
53
- progress_bar.set(response.error);
 
54
  }
55
  else {
56
  progress_bar.set('Done! Successfully imported '+response.image_ids.length+' images.');
57
  }
58
- progress_bar.close(2000);
59
  });
60
  })
61
  });
62
- </script>
2
  <div id="file_browser">
3
  </div>
4
  <p>
 
5
  <input type="button" id="import_button" name="import_folder" value="Import Folder" class="button-primary"/>
6
  </p>
7
  <script type="text/javascript">
43
  // Start importing process
44
  var post_params = {
45
  action: 'import_folder',
46
+ folder: selected_folder
 
47
  };
48
  $.post(photocrati_ajax.url, post_params, function(response){
49
  if (typeof(response) != 'object') response = JSON.parse(response);
50
  if (typeof(response.error) == 'string') {
51
+ progress_bar.set("Error occurred");
52
+ alert(response.error);
53
  }
54
  else {
55
  progress_bar.set('Done! Successfully imported '+response.image_ids.length+' images.');
56
  }
57
+ progress_bar.close();
58
  });
59
  })
60
  });
61
+ </script>
products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php CHANGED
@@ -24,8 +24,8 @@
24
  });
25
  }
26
 
27
-
28
- $(function(){
29
  // Show the page content
30
  $('#ngg_page_content').css('visibility', 'visible');
31
 
@@ -159,21 +159,11 @@
159
 
160
  // Display message/notification
161
  if (up.state == plupload.STOPPED) {
162
- if (typeof(up.error_msg) != 'undefined') {
163
- $.gritter.add({
164
- title: up.error_msg,
165
- text: msg,
166
- sticky: true
167
- });
168
- }
169
- else {
170
- $.gritter.add({
171
- title: "Upload complete",
172
- text: msg,
173
- sticky: true
174
- });
175
- }
176
-
177
  setTimeout(function(){
178
  reinit_plupload(up);
179
  }, 3000);
@@ -197,40 +187,28 @@
197
  return;
198
  }
199
  }
200
- if(typeof(response.error) != 'undefined') {
201
- up.trigger('Error', {
202
- code: plupload.IO_ERROR,
203
- msg: response.error,
204
- details: response,
205
- file: file
 
 
 
 
 
 
 
 
 
 
206
  });
207
- }
208
- else {
209
- window.uploaded_image_ids = window.uploaded_image_ids.concat(response.image_ids);
210
- up.settings.url = window.set_plupload_url(response.gallery_id, $gallery_name.val());
211
-
212
- // If we created a new gallery, ensure it's now in the drop-down list, and select it
213
- if ($gallery_id.find('option[value="'+response.gallery_id+'"]').length == 0) {
214
- var option = $('<option/>').attr('value', response.gallery_id).text(response.gallery_name);
215
- $gallery_id.append(option);
216
- $gallery_id.val(response.gallery_id);
217
- option.attr('selected', 'selected');
218
- }
219
-
220
- // our Frame-Event-Publisher hooks onto the jQuery ajaxComplete action which plupload
221
- // of course does not honor. Tie them together here..
222
- if (window.Frame_Event_Publisher) {
223
- $.post(photocrati_ajax.url, {'action': 'cookie_dump'}, function(){
224
- window.Frame_Event_Publisher.find_parent(window).broadcast();
225
- });
226
- }
227
- }
228
  },
229
 
230
  Error: function(up, args){
231
- if (typeof(up.error_msg) == 'undefined') {
232
- up.error_msg = args.msg;
233
- }{}
234
  }
235
  };
236
  $("#uploader").pluploadQueue(plupload_options);
@@ -241,5 +219,6 @@
241
 
242
  window.init_plupload();
243
  });
 
244
  })(jQuery);
245
  </script>
24
  });
25
  }
26
 
27
+ $(window).on('lazy_resources_loaded', function(){
28
+ $(function(){
29
  // Show the page content
30
  $('#ngg_page_content').css('visibility', 'visible');
31
 
159
 
160
  // Display message/notification
161
  if (up.state == plupload.STOPPED) {
162
+ $.gritter.add({
163
+ title: "Upload complete",
164
+ text: msg,
165
+ sticky: true
166
+ });
 
 
 
 
 
 
 
 
 
 
167
  setTimeout(function(){
168
  reinit_plupload(up);
169
  }, 3000);
187
  return;
188
  }
189
  }
190
+ window.uploaded_image_ids = window.uploaded_image_ids.concat(response.image_ids);
191
+ up.settings.url = window.set_plupload_url(response.gallery_id, $gallery_name.val());
192
+
193
+ // If we created a new gallery, ensure it's now in the drop-down list, and select it
194
+ if ($gallery_id.find('option[value="'+response.gallery_id+'"]').length == 0) {
195
+ var option = $('<option/>').attr('value', response.gallery_id).text(response.gallery_name);
196
+ $gallery_id.append(option);
197
+ $gallery_id.val(response.gallery_id);
198
+ option.attr('selected', 'selected');
199
+ }
200
+
201
+ // our Frame-Event-Publisher hooks onto the jQuery ajaxComplete action which plupload
202
+ // of course does not honor. Tie them together here..
203
+ if (window.Frame_Event_Publisher) {
204
+ $.post(photocrati_ajax.url, {'action': 'cookie_dump'}, function(){
205
+ window.Frame_Event_Publisher.find_parent(window).broadcast();
206
  });
207
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
  },
209
 
210
  Error: function(up, args){
211
+ if (typeof(window.console) != 'undefined') console.log(args);
 
 
212
  }
213
  };
214
  $("#uploader").pluploadQueue(plupload_options);
219
 
220
  window.init_plupload();
221
  });
222
+ });
223
  })(jQuery);
224
  </script>
products/photocrati_nextgen/modules/nextgen_admin/class.form.php CHANGED
@@ -210,26 +210,14 @@ class Mixin_Form_Field_Generators extends Mixin
210
  True
211
  );
212
  }
213
-
214
- function _render_ajax_pagination_field($display_type)
215
- {
216
- return $this->object->_render_radio_field(
217
- $display_type,
218
- 'ajax_pagination',
219
- _('Enable AJAX pagination'),
220
- isset($display_type->settings['ajax_pagination']) ? $display_type->settings['ajax_pagination'] : FALSE
221
- );
222
- }
223
 
224
  function _render_thumbnail_override_settings_field($display_type)
225
  {
226
- $hidden = !(isset($display_type->settings['override_thumbnail_settings']) ? $display_type->settings['override_thumbnail_settings'] : FALSE);
227
-
228
  $override_field = $this->_render_radio_field(
229
  $display_type,
230
  'override_thumbnail_settings',
231
  'Override thumbnail settings',
232
- isset($display_type->settings['override_thumbnail_settings']) ? $display_type->settings['override_thumbnail_settings'] : FALSE,
233
  "This does not affect existing thumbnails; overriding the thumbnail settings will create an additional set of thumbnails. To change the size of existing thumbnails please visit 'Manage Galleries' and choose 'Create new thumbnails' for all images in the gallery."
234
  );
235
 
@@ -239,9 +227,9 @@ class Mixin_Form_Field_Generators extends Mixin
239
  'display_type_name' => $display_type->name,
240
  'name' => 'thumbnail_dimensions',
241
  'label'=> _('Thumbnail dimensions'),
242
- 'thumbnail_width' => isset($display_type->settings['thumbnail_width']) ? $display_type->settings['thumbnail_width'] : 0,
243
- 'thumbnail_height'=> isset($display_type->settings['thumbnail_height']) ? $display_type->settings['thumbnail_height'] : 0,
244
- 'hidden' => $hidden ? 'hidden' : '',
245
  'text' => ''
246
  ),
247
  TRUE
@@ -254,27 +242,27 @@ class Mixin_Form_Field_Generators extends Mixin
254
  'thumbnail_quality',
255
  'Thumbnail quality',
256
  $qualities,
257
- isset($display_type->settings['thumbnail_quality']) ? $display_type->settings['thumbnail_quality'] : 100,
258
  '',
259
- $hidden
260
  );
261
 
262
  $crop_field = $this->_render_radio_field(
263
  $display_type,
264
  'thumbnail_crop',
265
  'Thumbnail crop',
266
- isset($display_type->settings['thumbnail_crop']) ? $display_type->settings['thumbnail_crop'] : FALSE,
267
  '',
268
- $hidden
269
  );
270
 
271
  $watermark_field = $this->_render_radio_field(
272
  $display_type,
273
  'thumbnail_watermark',
274
  'Thumbnail watermark',
275
- isset($display_type->settings['thumbnail_watermark']) ? $display_type->settings['thumbnail_watermark'] : FALSE,
276
  '',
277
- $hidden
278
  );
279
 
280
  $everything = $override_field . $dimensions_field . $quality_field . $crop_field . $watermark_field;
@@ -291,13 +279,11 @@ class Mixin_Form_Field_Generators extends Mixin
291
  */
292
  function _render_image_override_settings_field($display_type)
293
  {
294
- $hidden = !(isset($display_type->settings['override_image_settings']) ? $display_type->settings['override_image_settings'] : FALSE);
295
-
296
  $override_field = $this->_render_radio_field(
297
  $display_type,
298
  'override_image_settings',
299
  'Override image settings',
300
- isset($display_type->settings['override_image_settings']) ? $display_type->settings['override_image_settings'] : 0,
301
  'Overriding the image settings will create an additional set of images'
302
  );
303
 
@@ -310,7 +296,7 @@ class Mixin_Form_Field_Generators extends Mixin
310
  $qualities,
311
  $display_type->settings['image_quality'],
312
  '',
313
- $hidden
314
  );
315
 
316
  $crop_field = $this->_render_radio_field(
@@ -319,7 +305,7 @@ class Mixin_Form_Field_Generators extends Mixin
319
  'Image crop',
320
  $display_type->settings['image_crop'],
321
  '',
322
- $hidden
323
  );
324
 
325
  $watermark_field = $this->_render_radio_field(
@@ -328,7 +314,7 @@ class Mixin_Form_Field_Generators extends Mixin
328
  'Image watermark',
329
  $display_type->settings['image_watermark'],
330
  '',
331
- $hidden
332
  );
333
 
334
  $everything = $override_field . $quality_field . $crop_field . $watermark_field;
210
  True
211
  );
212
  }
 
 
 
 
 
 
 
 
 
 
213
 
214
  function _render_thumbnail_override_settings_field($display_type)
215
  {
 
 
216
  $override_field = $this->_render_radio_field(
217
  $display_type,
218
  'override_thumbnail_settings',
219
  'Override thumbnail settings',
220
+ $display_type->settings['override_thumbnail_settings'],
221
  "This does not affect existing thumbnails; overriding the thumbnail settings will create an additional set of thumbnails. To change the size of existing thumbnails please visit 'Manage Galleries' and choose 'Create new thumbnails' for all images in the gallery."
222
  );
223
 
227
  'display_type_name' => $display_type->name,
228
  'name' => 'thumbnail_dimensions',
229
  'label'=> _('Thumbnail dimensions'),
230
+ 'thumbnail_width' => $display_type->settings['thumbnail_width'],
231
+ 'thumbnail_height'=> $display_type->settings['thumbnail_height'],
232
+ 'hidden' => empty($display_type->settings['override_thumbnail_settings']) ? 'hidden' : '',
233
  'text' => ''
234
  ),
235
  TRUE
242
  'thumbnail_quality',
243
  'Thumbnail quality',
244
  $qualities,
245
+ $display_type->settings['thumbnail_quality'],
246
  '',
247
+ empty($display_type->settings['override_thumbnail_settings']) ? TRUE : FALSE
248
  );
249
 
250
  $crop_field = $this->_render_radio_field(
251
  $display_type,
252
  'thumbnail_crop',
253
  'Thumbnail crop',
254
+ $display_type->settings['thumbnail_crop'],
255
  '',
256
+ empty($display_type->settings['override_thumbnail_settings']) ? TRUE : FALSE
257
  );
258
 
259
  $watermark_field = $this->_render_radio_field(
260
  $display_type,
261
  'thumbnail_watermark',
262
  'Thumbnail watermark',
263
+ $display_type->settings['thumbnail_watermark'],
264
  '',
265
+ empty($display_type->settings['override_thumbnail_settings']) ? TRUE : FALSE
266
  );
267
 
268
  $everything = $override_field . $dimensions_field . $quality_field . $crop_field . $watermark_field;
279
  */
280
  function _render_image_override_settings_field($display_type)
281
  {
 
 
282
  $override_field = $this->_render_radio_field(
283
  $display_type,
284
  'override_image_settings',
285
  'Override image settings',
286
+ $display_type->settings['override_image_settings'],
287
  'Overriding the image settings will create an additional set of images'
288
  );
289
 
296
  $qualities,
297
  $display_type->settings['image_quality'],
298
  '',
299
+ empty($display_type->settings['override_image_settings']) ? TRUE : FALSE
300
  );
301
 
302
  $crop_field = $this->_render_radio_field(
305
  'Image crop',
306
  $display_type->settings['image_crop'],
307
  '',
308
+ empty($display_type->settings['override_image_settings']) ? TRUE : FALSE
309
  );
310
 
311
  $watermark_field = $this->_render_radio_field(
314
  'Image watermark',
315
  $display_type->settings['image_watermark'],
316
  '',
317
+ empty($display_type->settings['override_image_settings']) ? TRUE : FALSE
318
  );
319
 
320
  $everything = $override_field . $quality_field . $crop_field . $watermark_field;
products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_installer.php CHANGED
@@ -2,26 +2,23 @@
2
 
3
  class C_NextGen_Admin_Installer
4
  {
 
 
 
 
 
5
  function install()
6
  {
7
- // In version 0.2 of this module and earlier, the following values
8
- // were statically set rather than dynamically using a handler. Therefore, we need
9
- // to delete those static values
10
- $module_name = 'photocrati-nextgen_admin';
11
- $settings = C_NextGen_Settings::get_instance();
12
- $modules = $settings->pope_module_list;
13
- $cleanup = FALSE;
14
- if (!isset($modules[$module_name])) $cleanup = FALSE;
15
- elseif (floatval(str_replace($module_name, '|', $modules[$module_name])) < '0.3') {
16
- $cleanup = TRUE;
17
- }
18
- if ($cleanup) {
19
- $keys = array(
20
- 'jquery_ui_theme',
21
- 'jquery_ui_theme_version',
22
- 'jquery_ui_theme_url'
23
- );
24
- foreach ($keys as $key) $settings->delete($key);
25
- }
26
  }
27
  }
2
 
3
  class C_NextGen_Admin_Installer
4
  {
5
+ function __construct()
6
+ {
7
+ $this->settings = C_NextGen_Global_Settings::get_instance();
8
+ }
9
+
10
  function install()
11
  {
12
+ $registry = C_Component_Registry::get_instance();
13
+ $router = $registry->get_utility('I_Router');
14
+ $theme_url = $router->get_static_url('photocrati-nextgen_admin#jquery-ui/jquery-ui-1.9.1.custom.css');
15
+
16
+ $defaults = array(
17
+ 'jquery_ui_theme' => 'jquery-ui-nextgen',
18
+ 'jquery_ui_theme_version' => 1.8,
19
+ 'jquery_ui_theme_url' => $theme_url
20
+ );
21
+
22
+ foreach ($defaults as $k=>$v) $this->settings->set_default_value($k, $v);
 
 
 
 
 
 
 
 
23
  }
24
  }
products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_option_handler.php DELETED
@@ -1,29 +0,0 @@
1
- <?php
2
-
3
- class C_NextGen_Admin_Option_Handler
4
- {
5
- function get_router()
6
- {
7
- return C_Component_Registry::get_instance()->get_utility('I_Router');
8
- }
9
-
10
-
11
- function get($key, $default=NULL)
12
- {
13
- $retval = $default;
14
-
15
- switch ($key) {
16
- case 'jquery_ui_theme':
17
- $retval = 'jquery-ui-nextgen';
18
- break;
19
- case 'jquery_ui_theme_version':
20
- $retval = '1.8';
21
- break;
22
- case 'jquery_ui_theme_url':
23
- $retval = $this->get_router()->get_static_url('photocrati-nextgen_admin#jquery-ui/jquery-ui-1.9.1.custom.css');
24
- break;
25
- }
26
-
27
- return $retval;
28
- }
29
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php CHANGED
@@ -82,9 +82,6 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin
82
  */
83
  function enqueue_backend_resources()
84
  {
85
- $atp = $this->object->get_registry()->get_utility('I_Attach_To_Post_Controller');
86
-
87
- wp_enqueue_script('jquery');
88
  $this->object->enqueue_jquery_ui_theme();
89
  wp_enqueue_script('jquery-ui-accordion');
90
  wp_enqueue_script(
@@ -94,8 +91,8 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin
94
  '2.0.7',
95
  TRUE
96
  );
97
- wp_register_script('iris', $this->get_router()->get_url('/wp-admin/js/iris.min.js', FALSE, TRUE), array('jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch'));
98
- wp_register_script('wp-color-picker', $this->get_router()->get_url('/wp-admin/js/color-picker.js', FALSE, TRUE), array('iris'));
99
  wp_localize_script('wp-color-picker', 'wpColorPickerL10n', array(
100
  'clear' => __( 'Clear' ),
101
  'defaultString' => __( 'Default' ),
@@ -116,20 +113,11 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin
116
  // Ensure select2
117
  wp_enqueue_style('select2');
118
  wp_enqueue_script('select2');
119
-
120
- if ($atp != null) {
121
- $atp->mark_script('jquery-ui-accordion');
122
- $atp->mark_script('nextgen_display_settings_page_placeholder_stub');
123
- $atp->mark_script('iris');
124
- $atp->mark_script('wp-color-picker');
125
- $atp->mark_script('nextgen_admin_page');
126
- $atp->mark_script('select2');
127
- }
128
  }
129
 
130
  function enqueue_jquery_ui_theme()
131
  {
132
- $settings = C_NextGen_Settings::get_instance();
133
  wp_enqueue_style(
134
  $settings->jquery_ui_theme,
135
  is_ssl() ?
@@ -195,7 +183,7 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin
195
  function get_forms()
196
  {
197
  $forms = array();
198
- $form_manager = C_Form_Manager::get_instance();
199
  foreach ($form_manager->get_forms($this->object->get_form_type()) as $form) {
200
  $forms[] = $this->get_registry()->get_utility('I_Form', $form);
201
  }
82
  */
83
  function enqueue_backend_resources()
84
  {
 
 
 
85
  $this->object->enqueue_jquery_ui_theme();
86
  wp_enqueue_script('jquery-ui-accordion');
87
  wp_enqueue_script(
91
  '2.0.7',
92
  TRUE
93
  );
94
+ wp_register_script('iris', $this->get_router()->get_url('/wp-admin/js/iris.min.js', FALSE), array('jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch'));
95
+ wp_register_script('wp-color-picker', $this->get_router()->get_url('/wp-admin/js/color-picker.js', FALSE), array('iris'));
96
  wp_localize_script('wp-color-picker', 'wpColorPickerL10n', array(
97
  'clear' => __( 'Clear' ),
98
  'defaultString' => __( 'Default' ),
113
  // Ensure select2
114
  wp_enqueue_style('select2');
115
  wp_enqueue_script('select2');
 
 
 
 
 
 
 
 
 
116
  }
117
 
118
  function enqueue_jquery_ui_theme()
119
  {
120
+ $settings = C_NextGen_Global_Settings::get_instance();
121
  wp_enqueue_style(
122
  $settings->jquery_ui_theme,
123
  is_ssl() ?
183
  function get_forms()
184
  {
185
  $forms = array();
186
+ $form_manager = $this->get_registry()->get_utility('I_Form_Manager');
187
  foreach ($form_manager->get_forms($this->object->get_form_type()) as $form) {
188
  $forms[] = $this->get_registry()->get_utility('I_Form', $form);
189
  }
products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php CHANGED
@@ -19,7 +19,7 @@ class M_NextGen_Admin extends C_Base_Module
19
  'photocrati-nextgen_admin',
20
  'NextGEN Administration',
21
  'Provides a framework for adding Administration pages',
22
- '0.5',
23
  'http://www.nextgen-gallery.com',
24
  'Photocrati Media',
25
  'http://www.photocrati.com'
@@ -27,13 +27,6 @@ class M_NextGen_Admin extends C_Base_Module
27
 
28
  include_once('class.nextgen_admin_installer.php');
29
  C_Photocrati_Installer::add_handler($this->module_id, 'C_NextGen_Admin_Installer');
30
-
31
- include_once('class.nextgen_admin_option_handler.php');
32
- C_NextGen_Settings::add_option_handler('C_NextGen_Admin_Option_Handler', array(
33
- 'jquery_ui_theme',
34
- 'jquery_ui_theme_version',
35
- 'jquery_ui_theme_url'
36
- ));
37
  }
38
 
39
  /**
@@ -92,7 +85,7 @@ class M_NextGen_Admin extends C_Base_Module
92
  function _register_hooks()
93
  {
94
  // Register scripts
95
- add_action('init', array(&$this, 'register_scripts'), 9);
96
 
97
  // Provides menu options for managing NextGEN Settings
98
  add_action('admin_menu', array(&$this, 'add_menu_pages'), 999);
19
  'photocrati-nextgen_admin',
20
  'NextGEN Administration',
21
  'Provides a framework for adding Administration pages',
22
+ '0.1',
23
  'http://www.nextgen-gallery.com',
24
  'Photocrati Media',
25
  'http://www.photocrati.com'
27
 
28
  include_once('class.nextgen_admin_installer.php');
29
  C_Photocrati_Installer::add_handler($this->module_id, 'C_NextGen_Admin_Installer');
 
 
 
 
 
 
 
30
  }
31
 
32
  /**
85
  function _register_hooks()
86
  {
87
  // Register scripts
88
+ add_action('init', array(&$this, 'register_scripts'));
89
 
90
  // Provides menu options for managing NextGEN Settings
91
  add_action('admin_menu', array(&$this, 'add_menu_pages'), 999);
products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.js CHANGED
@@ -63,5 +63,11 @@ jQuery(function($){
63
  });
64
 
65
  $('input.nextgen_settings_field_colorpicker').wpColorPicker();
66
- $('#ngg_page_content').css('visibility', 'visible');
67
- });
 
 
 
 
 
 
63
  });
64
 
65
  $('input.nextgen_settings_field_colorpicker').wpColorPicker();
66
+ });
67
+
68
+ (function($){
69
+ $(window).on('lazy_resources_loaded', function(){
70
+ $('#ngg_page_content').css('visibility', 'visible');
71
+ });
72
+
73
+ })(jQuery);
products/photocrati_nextgen/modules/nextgen_admin/templates/field_generator/nextgen_settings_field_color.php CHANGED
@@ -11,6 +11,7 @@
11
  id='<?php print esc_attr("{$display_type_name}_{$name}"); ?>'
12
  name='<?php print esc_attr("{$display_type_name}[{$name}]"); ?>'
13
  class='<?php print esc_attr("{$display_type_name}_{$name}"); ?> nextgen_settings_field_colorpicker'
14
- value='<?php print esc_attr($value); ?>'/>
 
15
  </td>
16
  </tr>
11
  id='<?php print esc_attr("{$display_type_name}_{$name}"); ?>'
12
  name='<?php print esc_attr("{$display_type_name}[{$name}]"); ?>'
13
  class='<?php print esc_attr("{$display_type_name}_{$name}"); ?> nextgen_settings_field_colorpicker'
14
+ value='<?php print esc_attr($value); ?>'
15
+ data-default-color='<?php print esc_attr($value); ?>'/>
16
  </td>
17
  </tr>
products/photocrati_nextgen/modules/nextgen_admin/templates/nextgen_admin_page.php CHANGED
@@ -10,7 +10,7 @@
10
  <p><?php echo_h($success);?></p>
11
  </div>
12
  <?php endif ?>
13
- <form method="POST" action="<?php echo nextgen_esc_url($_SERVER['REQUEST_URI'])?>">
14
  <?php if (isset($form_header)): ?>
15
  <?php echo $form_header."\n"; ?>
16
  <?php endif ?>
10
  <p><?php echo_h($success);?></p>
11
  </div>
12
  <?php endif ?>
13
+ <form method="POST" action="<?php echo esc_url($_SERVER['REQUEST_URI'])?>">
14
  <?php if (isset($form_header)): ?>
15
  <?php echo $form_header."\n"; ?>
16
  <?php endif ?>
products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_album_controller.php CHANGED
@@ -27,21 +27,19 @@ class A_NextGen_Basic_Album_Controller extends Mixin
27
  // /nggallery/album--id/gallery--id
28
 
29
  // Are we to display a gallery?
30
- if (($gallery = $gallery_slug = $this->param('gallery')))
31
  {
32
  // basic albums only support one per post
33
  if (isset($GLOBALS['nggShowGallery']))
34
  return;
35
  $GLOBALS['nggShowGallery'] = TRUE;
36
 
37
- // Try finding the gallery by slug first. If nothing is found, we assume that
38
- // the user passed in a gallery id instead
39
- $mapper = $this->object->get_registry()->get_utility('I_Gallery_Mapper');
40
- $result = reset($mapper->select()->where(array('slug = %s', $gallery))->limit(1)->run_query());
41
- if ($result) {
42
- $gallery = $result->{$result->id_field};
43
- }
44
-
45
 
46
  $renderer = $this->object->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
47
  return $renderer->display_images(
@@ -59,14 +57,11 @@ class A_NextGen_Basic_Album_Controller extends Mixin
59
  else if (($album = $this->param('album'))) {
60
 
61
  // Are we to display a sub-album?
 
62
  {
63
  $mapper = $this->object->get_registry()->get_utility('I_Album_Mapper');
64
  $result = array_pop($mapper->select()->where(array('slug = %s', $album))->limit(1)->run_query());
65
- $album_sub = $result ? $result->{$result->id_field} : null;
66
-
67
- if ($album_sub != null) {
68
- $album = $album_sub;
69
- }
70
  }
71
  $displayed_gallery->entity_ids = array();
72
  $displayed_gallery->sortorder = array();
@@ -102,13 +97,12 @@ class A_NextGen_Basic_Album_Controller extends Mixin
102
 
103
  // Render legacy template
104
  $this->object->add_mixin('Mixin_NextGen_Basic_Templates');
105
- $display_settings = $this->prepare_legacy_album_params($displayed_gallery->get_entity(), $display_settings);
106
  return $this->object->legacy_render($display_settings['template'], $display_settings, $return, 'album');
107
  }
108
  else {
109
  $params = $display_settings;
110
- $albums = $this->prepare_legacy_album_params($displayed_gallery->get_entity(), array('entities' => $entities));;
111
- $params['image_gen_params'] = $albums['image_gen_params'];
112
  $params['galleries'] = $albums['galleries'];
113
  $params['displayed_gallery'] = $displayed_gallery;
114
  $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
@@ -126,7 +120,7 @@ class A_NextGen_Basic_Album_Controller extends Mixin
126
  }
127
  }
128
  else {
129
- return $this->object->render_partial('photocrati-nextgen_gallery_display#no_images_found', array(), $return);
130
  }
131
  }
132
 
@@ -150,59 +144,38 @@ class A_NextGen_Basic_Album_Controller extends Mixin
150
  }
151
 
152
 
153
- function prepare_legacy_album_params($displayed_gallery, $params)
154
  {
155
  $image_mapper = $this->object->get_registry()->get_utility('I_Image_Mapper');
156
  $storage = $this->object->get_registry()->get_utility('I_Gallery_Storage');
157
  $image_gen = $this->object->get_registry()->get_utility('I_Dynamic_Thumbnails_Manager');
158
 
159
- if (empty($displayed_gallery->display_settings['override_thumbnail_settings']))
160
- {
161
- // legacy templates expect these dimensions
162
- $image_gen_params = array(
163
- 'width' => 91,
164
- 'height' => 68,
165
- 'crop' => TRUE
166
- );
167
- }
168
- else {
169
- // use settings requested by user
170
- $image_gen_params = array(
171
- 'width' => $displayed_gallery->display_settings['thumbnail_width'],
172
- 'height' => $displayed_gallery->display_settings['thumbnail_height'],
173
- 'quality' => $displayed_gallery->display_settings['thumbnail_quality'],
174
- 'crop' => $displayed_gallery->display_settings['thumbnail_crop'],
175
- 'watermark' => $displayed_gallery->display_settings['thumbnail_watermark']
176
- );
177
- }
178
-
179
- // so user templates can know how big the images are expected to be
180
- $params['image_gen_params'] = $image_gen_params;
181
 
182
  // Transform entities
183
- $params['galleries'] = $params['entities'];
184
  unset($params['entities']);
185
-
186
  foreach ($params['galleries'] as &$gallery) {
187
 
188
  // Get the preview image url
189
- $gallery->previewurl = '';
190
- if ($gallery->previewpic && $gallery->previewpic > 0)
191
- {
192
- if (($image = $image_mapper->find(intval($gallery->previewpic))))
193
- {
194
- $gallery->previewurl = $storage->get_image_url($image, $image_gen->get_size_name($image_gen_params), TRUE);
195
- $gallery->previewname = $gallery->name;
196
  }
197
  }
198
 
199
  // Get the page link. If the entity is an album, then the url will
200
  // look like /nggallery/album--slug.
201
  $id_field = $gallery->id_field;
202
- if ($gallery->is_album)
203
- {
204
- if ($gallery->pageid > 0)
205
- $gallery->pagelink = get_post_permalink($gallery->pageid);
206
  else {
207
  $gallery->pagelink = $this->object->set_param_for(
208
  $this->object->get_routed_url(TRUE),
@@ -215,10 +188,8 @@ class A_NextGen_Basic_Album_Controller extends Mixin
215
  // Otherwise, if it's a gallery then it will look like
216
  // /nggallery/album--slug/gallery--slug
217
  else {
218
- if ($gallery->pageid > 0) {
219
- $gallery->pagelink = @get_post_permalink($gallery->pageid);
220
- }
221
- if (empty($gallery->pagelink)) {
222
  $pagelink = $this->object->get_routed_url(TRUE);
223
  $parent_album = $this->object->get_parent_album_for($gallery->$id_field);
224
  if ($parent_album) {
@@ -228,14 +199,6 @@ class A_NextGen_Basic_Album_Controller extends Mixin
228
  $parent_album->slug
229
  );
230
  }
231
- // Legacy compat: use an album slug of 'all' if we're missing a container_id
232
- else if($displayed_gallery->container_ids === array('0')
233
- || $displayed_gallery->container_ids === array('')) {
234
- $pagelink = $this->object->set_param_for($pagelink, 'album', 'all');
235
- }
236
- else {
237
- $pagelink = $this->object->set_param_for($pagelink, 'album', 'album');
238
- }
239
  $gallery->pagelink = $this->object->set_param_for(
240
  $pagelink,
241
  'gallery',
@@ -247,8 +210,7 @@ class A_NextGen_Basic_Album_Controller extends Mixin
247
  // The router by default will generate param segments that look like,
248
  // /gallery--foobar. We need to convert these to the admittingly
249
  // nicer links that ngglegacy uses
250
- if ($gallery->pageid <= 0)
251
- $gallery->pagelink = $this->object->prettify_pagelink($gallery->pagelink);
252
 
253
  // Let plugins modify the gallery
254
  $gallery = apply_filters('ngg_album_galleryobject', $gallery);
@@ -266,19 +228,16 @@ class A_NextGen_Basic_Album_Controller extends Mixin
266
 
267
  function prettify_pagelink($pagelink)
268
  {
269
- $param_separator = C_NextGen_Settings::get_instance()->get('router_param_separator');
270
-
271
  $regex = implode('', array(
272
  '#',
273
  '/(gallery|album)',
274
- preg_quote($param_separator, '#'),
275
  '([^/?]+)',
276
  '#'
277
  ));
278
-
279
- $pagelink = preg_replace($regex, '/\2', $pagelink);
280
-
281
- return $pagelink;
282
  }
283
 
284
 
@@ -299,7 +258,8 @@ class A_NextGen_Basic_Album_Controller extends Mixin
299
  wp_enqueue_style('nextgen_basic_album_style', $this->object->get_static_url('photocrati-nextgen_basic_album#nextgen_basic_album.css'));
300
  wp_enqueue_script('jquery.dotdotdot', $this->object->get_static_url('photocrati-nextgen_basic_album#jquery.dotdotdot-1.5.7-packed.js'), array('jquery'));
301
 
302
- $this->enqueue_ngg_styles();
 
303
 
304
  }
305
 
27
  // /nggallery/album--id/gallery--id
28
 
29
  // Are we to display a gallery?
30
+ if (($gallery = $this->param('gallery')))
31
  {
32
  // basic albums only support one per post
33
  if (isset($GLOBALS['nggShowGallery']))
34
  return;
35
  $GLOBALS['nggShowGallery'] = TRUE;
36
 
37
+ if (!is_numeric($gallery))
38
+ {
39
+ $mapper = $this->object->get_registry()->get_utility('I_Gallery_Mapper');
40
+ $result = reset($mapper->select()->where(array('slug = %s', $gallery))->limit(1)->run_query());
41
+ $gallery = $result->{$result->id_field};
42
+ }
 
 
43
 
44
  $renderer = $this->object->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
45
  return $renderer->display_images(
57
  else if (($album = $this->param('album'))) {
58
 
59
  // Are we to display a sub-album?
60
+ if (!is_numeric($album))
61
  {
62
  $mapper = $this->object->get_registry()->get_utility('I_Album_Mapper');
63
  $result = array_pop($mapper->select()->where(array('slug = %s', $album))->limit(1)->run_query());
64
+ $album = $result->{$result->id_field};
 
 
 
 
65
  }
66
  $displayed_gallery->entity_ids = array();
67
  $displayed_gallery->sortorder = array();
97
 
98
  // Render legacy template
99
  $this->object->add_mixin('Mixin_NextGen_Basic_Templates');
100
+ $display_settings = $this->prepare_legacy_album_params($display_settings);
101
  return $this->object->legacy_render($display_settings['template'], $display_settings, $return, 'album');
102
  }
103
  else {
104
  $params = $display_settings;
105
+ $albums = $this->prepare_legacy_album_params(array('entities' => $entities));;
 
106
  $params['galleries'] = $albums['galleries'];
107
  $params['displayed_gallery'] = $displayed_gallery;
108
  $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
120
  }
121
  }
122
  else {
123
+ return $this->object->render_partial('photocrati-nextgen_gallery_display#no_images_found');
124
  }
125
  }
126
 
144
  }
145
 
146
 
147
+ function prepare_legacy_album_params($params)
148
  {
149
  $image_mapper = $this->object->get_registry()->get_utility('I_Image_Mapper');
150
  $storage = $this->object->get_registry()->get_utility('I_Gallery_Storage');
151
  $image_gen = $this->object->get_registry()->get_utility('I_Dynamic_Thumbnails_Manager');
152
 
153
+ // legacy templates expect these dimensions
154
+ $image_gen_params = array(
155
+ 'width' => 91,
156
+ 'height' => 68,
157
+ 'crop' => TRUE
158
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
  // Transform entities
161
+ $params['galleries'] = $params['entities'];
162
  unset($params['entities']);
 
163
  foreach ($params['galleries'] as &$gallery) {
164
 
165
  // Get the preview image url
166
+ $gallery->previewurl = '';
167
+ if ($gallery->previewpic && $gallery->previewpic > 0) {
168
+ if (($image = $image_mapper->find(intval($gallery->previewpic)))) {
169
+ $gallery->previewurl = $storage->get_image_url($image, $image_gen->get_size_name($image_gen_params));
170
+ $gallery->previewname = $gallery->name;
 
 
171
  }
172
  }
173
 
174
  // Get the page link. If the entity is an album, then the url will
175
  // look like /nggallery/album--slug.
176
  $id_field = $gallery->id_field;
177
+ if ($gallery->is_album) {
178
+ if ($gallery->pageid > 0) $gallery->pagelink = get_post_permalink($gallery->pageid);
 
 
179
  else {
180
  $gallery->pagelink = $this->object->set_param_for(
181
  $this->object->get_routed_url(TRUE),
188
  // Otherwise, if it's a gallery then it will look like
189
  // /nggallery/album--slug/gallery--slug
190
  else {
191
+ if ($gallery->pageid > 0) $gallery->pagelink = get_post_permalink($gallery->pageid);
192
+ else {
 
 
193
  $pagelink = $this->object->get_routed_url(TRUE);
194
  $parent_album = $this->object->get_parent_album_for($gallery->$id_field);
195
  if ($parent_album) {
199
  $parent_album->slug
200
  );
201
  }
 
 
 
 
 
 
 
 
202
  $gallery->pagelink = $this->object->set_param_for(
203
  $pagelink,
204
  'gallery',
210
  // The router by default will generate param segments that look like,
211
  // /gallery--foobar. We need to convert these to the admittingly
212
  // nicer links that ngglegacy uses
213
+ if ($gallery->pageid <= 0) $gallery->pagelink = $this->object->prettify_pagelink($gallery->pagelink);
 
214
 
215
  // Let plugins modify the gallery
216
  $gallery = apply_filters('ngg_album_galleryobject', $gallery);
228
 
229
  function prettify_pagelink($pagelink)
230
  {
231
+ $param_separator = C_NextGen_Global_Settings::get_instance()->get('router_param_separator');
 
232
  $regex = implode('', array(
233
  '#',
234
  '/(gallery|album)',
235
+ preg_quote($param_separator),
236
  '([^/?]+)',
237
  '#'
238
  ));
239
+
240
+ return preg_replace($regex, '/\2', $pagelink);
 
 
241
  }
242
 
243
 
258
  wp_enqueue_style('nextgen_basic_album_style', $this->object->get_static_url('photocrati-nextgen_basic_album#nextgen_basic_album.css'));
259
  wp_enqueue_script('jquery.dotdotdot', $this->object->get_static_url('photocrati-nextgen_basic_album#jquery.dotdotdot-1.5.7-packed.js'), array('jquery'));
260
 
261
+ $cssfile = C_NextGen_Settings::get_instance()->get('CSSFile');
262
+ wp_enqueue_style('nggallery', NEXTGEN_GALLERY_NGGLEGACY_MOD_URL.'/css/'.$cssfile);
263
 
264
  }
265
 
products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_album_mapper.php CHANGED
@@ -21,7 +21,7 @@ class Hook_NextGen_Basic_Album_Defaults extends Hook
21
  {
22
  function set_defaults($entity)
23
  {
24
- if (isset($entity->name) && in_array($entity->name, array(
25
  NEXTGEN_GALLERY_NEXTGEN_BASIC_COMPACT_ALBUM,
26
  NEXTGEN_GALLERY_NEXTGEN_BASIC_EXTENDED_ALBUM))) {
27
 
@@ -30,18 +30,6 @@ class Hook_NextGen_Basic_Album_Defaults extends Hook
30
  $this->object->_set_default_value($entity, 'settings', 'galleries_per_page', $settings->galPagedGalleries);
31
  $this->object->_set_default_value($entity, 'settings', 'disable_pagination', 0);
32
  $this->object->_set_default_value($entity, 'settings', 'template', '');
33
-
34
- // Thumbnail dimensions -- only used by extended albums
35
- if ($entity->name == NEXTGEN_GALLERY_NEXTGEN_BASIC_EXTENDED_ALBUM)
36
- {
37
- $this->_set_default_value($entity, 'settings', 'override_thumbnail_settings', 0);
38
- $this->_set_default_value($entity, 'settings', 'thumbnail_width', $settings->thumbwidth);
39
- $this->_set_default_value($entity, 'settings', 'thumbnail_height', $settings->thumbheight);
40
- $this->_set_default_value($entity, 'settings', 'thumbnail_quality', $settings->thumbquality);
41
- $this->_set_default_value($entity, 'settings', 'thumbnail_crop', $settings->thumbfix);
42
- $this->_set_default_value($entity, 'settings', 'thumbnail_watermark', 0);
43
- }
44
-
45
  if (defined('NEXTGEN_GALLERY_BASIC_THUMBNAILS'))
46
  $this->object->_set_default_value($entity, 'settings', 'gallery_display_type', NEXTGEN_GALLERY_BASIC_THUMBNAILS);
47
  }
21
  {
22
  function set_defaults($entity)
23
  {
24
+ if (in_array($entity->name, array(
25
  NEXTGEN_GALLERY_NEXTGEN_BASIC_COMPACT_ALBUM,
26
  NEXTGEN_GALLERY_NEXTGEN_BASIC_EXTENDED_ALBUM))) {
27
 
30
  $this->object->_set_default_value($entity, 'settings', 'galleries_per_page', $settings->galPagedGalleries);
31
  $this->object->_set_default_value($entity, 'settings', 'disable_pagination', 0);
32
  $this->object->_set_default_value($entity, 'settings', 'template', '');
 
 
 
 
 
 
 
 
 
 
 
 
33
  if (defined('NEXTGEN_GALLERY_BASIC_THUMBNAILS'))
34
  $this->object->_set_default_value($entity, 'settings', 'gallery_display_type', NEXTGEN_GALLERY_BASIC_THUMBNAILS);
35
  }
products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_album_routes.php CHANGED
@@ -22,21 +22,20 @@ class A_NextGen_Basic_Album_Routes extends Mixin
22
  // Get router
23
  $router = $this->get_registry()->get_utility('I_Router');
24
  $app = $router->get_routed_app();
25
- $slug = '/'.C_NextGen_Settings::get_instance()->router_param_slug;
26
 
27
  // If we're viewing an album, rewrite the urls
28
- $regex = "/photocrati-nextgen_basic_\\w+_album/";
29
  if (preg_match($regex, $display_type)) {
30
- $app->rewrite("{*}{$slug}/page/{\\d}{*}", "{1}{$slug}/page--{2}{3}", FALSE, TRUE);
31
- $app->rewrite("{*}{$slug}/pid--{*}", "{1}{$slug}/pid--{2}", FALSE, TRUE); // avoid conflicts with imagebrowser
32
- $app->rewrite("{*}{$slug}/{\\w}", "{1}{$slug}/album--{2}");
33
- $app->rewrite("{*}{$slug}/{\\w}/{\\w}", "{1}{$slug}/album--{2}/gallery--{3}");
34
- $app->rewrite("{*}{$slug}/{\\w}/{\\w}/{\\w}{*}", "{1}{$slug}/album--{2}/gallery--{3}/{4}{5}");
35
  }
36
  elseif (preg_match($regex, $original_display_type)) {
37
- $app->rewrite("{*}{$slug}/album--{\\w}", "{1}{$slug}/{2}");
38
- $app->rewrite("{*}{$slug}/album--{\\w}/gallery--{\\w}", "{1}{$slug}/{2}/{3}");
39
- $app->rewrite("{*}{$slug}/album--{\\w}/gallery--{\\w}/{*}", "{1}{$slug}/{2}/{3}/{4}");
40
  }
41
 
42
  // Perform rewrites
22
  // Get router
23
  $router = $this->get_registry()->get_utility('I_Router');
24
  $app = $router->get_routed_app();
25
+ $slug = C_NextGen_Global_Settings::get_instance()->router_param_slug;
26
 
27
  // If we're viewing an album, rewrite the urls
28
+ $regex = "/photocrati-nextgen_basic_\w+_album/";
29
  if (preg_match($regex, $display_type)) {
30
+ // $app->rewrite("{$slug}{*}/page/{\\d}", "{$slug}{1}/page--{2}", FALSE, TRUE);
31
+ $app->rewrite("{$slug}/{\\w}", "{$slug}/album--{1}");
32
+ $app->rewrite("{$slug}/{\\w}/{\\w}", "{$slug}/album--{1}/gallery--{2}");
33
+ $app->rewrite("{$slug}/{\\w}/{\\w}/{\\w}{*}", "{$slug}/album--{1}/gallery--{2}/{3}{4}");
 
34
  }
35
  elseif (preg_match($regex, $original_display_type)) {
36
+ $app->rewrite("{$slug}/album--{\\w}", "{$slug}/{1}");
37
+ $app->rewrite("{$slug}/album--{\\w}/gallery--{\\w}", "{$slug}/{1}/{2}");
38
+ $app->rewrite("{$slug}/album--{\\w}/gallery--{\\w}/{*}", "{$slug}/{1}/{2}/{3}");
39
  }
40
 
41
  // Perform rewrites
products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_compact_album_form.php CHANGED
@@ -6,30 +6,4 @@ class A_NextGen_Basic_Compact_Album_Form extends Mixin_NextGen_Basic_Album_Form
6
  {
7
  return NEXTGEN_GALLERY_NEXTGEN_BASIC_COMPACT_ALBUM;
8
  }
9
-
10
- /**
11
- * Returns a list of fields to render on the settings page
12
- */
13
- function _get_field_names()
14
- {
15
- $fields = parent::_get_field_names();
16
- $fields[] = 'thumbnail_override_settings';
17
- return $fields;
18
- }
19
-
20
- /**
21
- * Enqueues static resources required by this form
22
- */
23
- function enqueue_static_resources()
24
- {
25
- wp_enqueue_script(
26
- 'nextgen_basic_compact_albums_settings_script',
27
- $this->object->get_static_url('photocrati-nextgen_basic_album#compact_settings.js'),
28
- array('jquery.nextgen_radio_toggle')
29
- );
30
-
31
-
32
- if ($atp != null) {
33
- $atp->mark_script('nextgen_basic_compact_albums_settings_script');
34
- }
35
- }
6
  {
7
  return NEXTGEN_GALLERY_NEXTGEN_BASIC_COMPACT_ALBUM;
8
  }
9
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_basic_album/adapter.nextgen_basic_extended_album_form.php CHANGED
@@ -6,30 +6,4 @@ class A_NextGen_Basic_Extended_Album_Form extends Mixin_NextGen_Basic_Album_Form
6
  {
7
  return NEXTGEN_GALLERY_NEXTGEN_BASIC_EXTENDED_ALBUM;
8
  }
9
-
10
- /**
11
- * Returns a list of fields to render on the settings page
12
- */
13
- function _get_field_names()
14
- {
15
- $fields = parent::_get_field_names();
16
- $fields[] = 'thumbnail_override_settings';
17
- return $fields;
18
- }
19
-
20
- /**
21
- * Enqueues static resources required by this form
22
- */
23
- function enqueue_static_resources()
24
- {
25
- wp_enqueue_script(
26
- 'nextgen_basic_extended_albums_settings_script',
27
- $this->object->get_static_url('photocrati-nextgen_basic_album#extended_settings.js'),
28
- array('jquery.nextgen_radio_toggle')
29
- );
30
-
31
-
32
- if ($atp != null) {
33
- $atp->mark_script('nextgen_basic_extended_albums_settings_script');
34
- }
35
  }
6
  {
7
  return NEXTGEN_GALLERY_NEXTGEN_BASIC_EXTENDED_ALBUM;
8
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php CHANGED
@@ -6,6 +6,7 @@ class Mixin_NextGen_Basic_Album_Form extends Mixin_Display_Type_Form
6
  {
7
  return array(
8
  'nextgen_basic_album_gallery_display_type',
 
9
  'nextgen_basic_templates_template',
10
  );
11
  }
6
  {
7
  return array(
8
  'nextgen_basic_album_gallery_display_type',
9
+ // 'nextgen_basic_album_galleries_per_page',
10
  'nextgen_basic_templates_template',
11
  );
12
  }
products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php CHANGED
@@ -18,7 +18,7 @@ class M_NextGen_Basic_Album extends C_Base_Module
18
  'photocrati-nextgen_basic_album',
19
  'NextGEN Basic Album',
20
  "Provides support for NextGEN's Basic Album",
21
- '0.5',
22
  'http://nextgen-gallery.com',
23
  'Photocrati Media',
24
  'http://www.photocrati.com'
@@ -60,19 +60,17 @@ class M_NextGen_Basic_Album extends C_Base_Module
60
  'A_NextGen_Basic_Album_Routes'
61
  );
62
 
63
- if (is_admin()) {
64
- // Add a display settings form for each display type
65
- $this->get_registry()->add_adapter(
66
- 'I_Form',
67
- 'A_NextGen_Basic_Compact_Album_Form',
68
- NEXTGEN_GALLERY_NEXTGEN_BASIC_COMPACT_ALBUM
69
- );
70
- $this->get_registry()->add_adapter(
71
- 'I_Form',
72
- 'A_NextGen_Basic_Extended_Album_Form',
73
- NEXTGEN_GALLERY_NEXTGEN_BASIC_EXTENDED_ALBUM
74
- );
75
- }
76
 
77
  // Creates special parameter segments
78
  $this->get_registry()->add_adapter(
@@ -80,18 +78,16 @@ class M_NextGen_Basic_Album extends C_Base_Module
80
  'A_NextGen_Basic_Album_Urls'
81
  );
82
 
83
- if (is_admin()) {
84
- $this->get_registry()->add_adapter(
85
- 'I_Form_Manager',
86
- 'A_NextGen_Basic_Album_Forms'
87
- );
88
- }
89
  }
90
 
91
  function _register_hooks()
92
  {
93
- C_NextGen_Shortcode_Manager::add('album', array(&$this, 'ngglegacy_shortcode'));
94
- C_NextGen_Shortcode_Manager::add('nggalbum', array(&$this, 'ngglegacy_shortcode'));
95
  }
96
 
97
  /**
18
  'photocrati-nextgen_basic_album',
19
  'NextGEN Basic Album',
20
  "Provides support for NextGEN's Basic Album",
21
+ '0.1',
22
  'http://nextgen-gallery.com',
23
  'Photocrati Media',
24
  'http://www.photocrati.com'
60
  'A_NextGen_Basic_Album_Routes'
61
  );
62
 
63
+ // Add a display settings form for each display type
64
+ $this->get_registry()->add_adapter(
65
+ 'I_Form',
66
+ 'A_NextGen_Basic_Compact_Album_Form',
67
+ NEXTGEN_GALLERY_NEXTGEN_BASIC_COMPACT_ALBUM
68
+ );
69
+ $this->get_registry()->add_adapter(
70
+ 'I_Form',
71
+ 'A_NextGen_Basic_Extended_Album_Form',
72
+ NEXTGEN_GALLERY_NEXTGEN_BASIC_EXTENDED_ALBUM
73
+ );
 
 
74
 
75
  // Creates special parameter segments
76
  $this->get_registry()->add_adapter(
78
  'A_NextGen_Basic_Album_Urls'
79
  );
80
 
81
+ $this->get_registry()->add_adapter(
82
+ 'I_Form_Manager',
83
+ 'A_NextGen_Basic_Album_Forms'
84
+ );
 
 
85
  }
86
 
87
  function _register_hooks()
88
  {
89
+ add_shortcode('album', array(&$this, 'ngglegacy_shortcode'));
90
+ add_shortcode('nggalbum', array(&$this, 'ngglegacy_shortcode'));
91
  }
92
 
93
  /**
products/photocrati_nextgen/modules/nextgen_basic_album/static/compact_settings.js DELETED
@@ -1,7 +0,0 @@
1
- jQuery(function($){
2
- $('input[name="photocrati-nextgen_basic_compact_album[override_thumbnail_settings]"]')
3
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_compact_album_thumbnail_dimensions'))
4
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_compact_album_thumbnail_quality'))
5
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_compact_album_thumbnail_crop'))
6
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_compact_album_thumbnail_watermark'));
7
- });
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_basic_album/static/extended_settings.js DELETED
@@ -1,7 +0,0 @@
1
- jQuery(function($){
2
- $('input[name="photocrati-nextgen_basic_extended_album[override_thumbnail_settings]"]')
3
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_extended_album_thumbnail_dimensions'))
4
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_extended_album_thumbnail_quality'))
5
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_extended_album_thumbnail_crop'))
6
- .nextgen_radio_toggle_tr('1', $('#tr_photocrati-nextgen_basic_extended_album_thumbnail_watermark'));
7
- });
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_basic_album/static/init.js CHANGED
@@ -1,6 +1,8 @@
1
- jQuery(function($){
2
- $('.ngg-album-desc').dotdotdot();
3
- $('.ngg-albumoverview').each(function(){
4
- $(this).css('opacity', 1.0);
 
 
5
  });
6
- });
1
+ (function($){
2
+ $(document).on('lazy_resources_loaded', function(){
3
+ $('.ngg-album-desc').dotdotdot();
4
+ $('.ngg-albumoverview').each(function(){
5
+ $(this).css('opacity', 1.0);
6
+ });
7
  });
8
+ })(jQuery);
products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.css CHANGED
@@ -49,61 +49,36 @@
49
 
50
  .ngg-album-compact {
51
  float: left;
52
- padding: 0 12px 4px 0 !important;
 
53
  margin: 0px !important;
54
  text-align: left;
55
- }
56
-
57
- .ngg-album-compact a {
58
- border: none;
59
  }
60
 
61
  .ngg-album-compactbox {
62
- margin: 0 !important;
63
- padding: 8px !important;
 
 
 
64
  box-sizing: border-box;
65
  -moz-box-sizing: border-box;
66
- position: relative;
67
- border: 1px solid gray;
68
- border-radius: 6px;
69
- z-index: 1;
70
- }
71
-
72
- .ngg-album-compactbox:before {
73
- content: ' ';
74
- position: absolute;
75
- top: 0;
76
- left: 0;
77
- right: 0;
78
- bottom: -7px;
79
- border-bottom: 1px solid gray;
80
- border-radius: 6px;
81
- z-index: -1;
82
- }
83
-
84
- .ngg-album-compactbox:after {
85
- content: ' ';
86
- position: absolute;
87
- top: 0;
88
- left: 0;
89
- right: 0;
90
- bottom: -4px;
91
- border-bottom: 1px solid gray;
92
- border-radius: 6px;
93
- z-index: -1;
94
  }
95
 
96
  .ngg-album-compactbox .Thumb {
97
  margin: 0px !important;
98
  padding: 0px 0 0 0 !important;
99
- border: 1px solid black !important;
 
 
100
  }
101
 
102
  .ngg-album-compact h4 {
103
  font-size: 15px;
104
  font-weight: bold;
 
105
  margin: 0;
106
- margin-top: 10px;
107
  }
108
 
109
  .ngg-album-compact h4 .ngg-album-desc {
49
 
50
  .ngg-album-compact {
51
  float: left;
52
+ height: 180px;
53
+ padding: 0 6px 4px 0 !important;
54
  margin: 0px !important;
55
  text-align: left;
56
+ width: 120px;
 
 
 
57
  }
58
 
59
  .ngg-album-compactbox {
60
+ background: transparent url(albumset.gif) no-repeat scroll 0%;
61
+ height: 88px;
62
+ margin: 0pt 0pt 6px !important;
63
+ padding: 8px 0pt 0pt 8px !important;
64
+ width: 120px;
65
  box-sizing: border-box;
66
  -moz-box-sizing: border-box;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  }
68
 
69
  .ngg-album-compactbox .Thumb {
70
  margin: 0px !important;
71
  padding: 0px 0 0 0 !important;
72
+ width: 91px;
73
+ height: 68px;
74
+ border: none;
75
  }
76
 
77
  .ngg-album-compact h4 {
78
  font-size: 15px;
79
  font-weight: bold;
80
+ width: 110px;
81
  margin: 0;
 
82
  }
83
 
84
  .ngg-album-compact h4 .ngg-album-desc {
products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact.php CHANGED
@@ -4,31 +4,24 @@
4
  <div class="ngg-album-compact">
5
  <div class="ngg-album-compactbox">
6
  <div class="ngg-album-link">
7
- <a class="Link gallery_link" href="<?php echo nextgen_esc_url($gallery->pagelink); ?>">
8
  <img class="Thumb"
9
- alt="<?php echo esc_attr($gallery->title); ?>"
10
- src="<?php echo nextgen_esc_url($gallery->previewurl); ?>"/>
11
  </a>
12
  </div>
13
  </div>
14
- <?php if (!empty($image_gen_params)) {
15
- $max_width = 'style="max-width: ' . ($image_gen_params['width'] + 20) . 'px"';
16
- } else {
17
- $max_width = '';
18
- } ?>
19
  <h4>
20
  <a class="ngg-album-desc"
21
- title="<?php echo esc_attr($gallery->title); ?>"
22
- href="<?php echo nextgen_esc_url($gallery->pagelink); ?>"
23
- <?php echo $max_width; ?>>
24
- <?php echo_safe_html($gallery->title); ?>
25
- </a>
26
  </h4>
27
- <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?>
28
  <p><strong><?php echo $gallery->counter; ?></strong>&nbsp;<?php _e('Photos', 'nggallery'); ?></p>
29
  <?php } ?>
30
  </div>
31
  <?php } ?>
32
  <br class="ngg-clear"/>
33
  </div>
34
- <?php $this->end_element(); ?>
4
  <div class="ngg-album-compact">
5
  <div class="ngg-album-compactbox">
6
  <div class="ngg-album-link">
7
+ <a class="Link" href="<?php echo $gallery->pagelink; ?>">
8
  <img class="Thumb"
9
+ alt="<?php echo $gallery->title; ?>"
10
+ src="<?php echo $gallery->previewurl; ?>"/>
11
  </a>
12
  </div>
13
  </div>
 
 
 
 
 
14
  <h4>
15
  <a class="ngg-album-desc"
16
+ title="<?php echo $gallery->title; ?>"
17
+ href="<?php echo $gallery->pagelink; ?>"
18
+ ><?php echo $gallery->title; ?></a>
 
 
19
  </h4>
20
+ <?php if ($gallery->counter > 0) { ?>
21
  <p><strong><?php echo $gallery->counter; ?></strong>&nbsp;<?php _e('Photos', 'nggallery'); ?></p>
22
  <?php } ?>
23
  </div>
24
  <?php } ?>
25
  <br class="ngg-clear"/>
26
  </div>
27
+ <?php $this->end_element(); ?>
products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended.php CHANGED
@@ -3,15 +3,15 @@
3
  <?php foreach ($galleries as $gallery) { ?>
4
  <div class="ngg-album">
5
  <div class="ngg-albumtitle">
6
- <a href="<?php echo nextgen_esc_url($gallery->pagelink); ?>"><?php echo_safe_html($gallery->title); ?></a>
7
  </div>
8
  <div class="ngg-albumcontent">
9
  <div class="ngg-thumbnail">
10
- <a class="gallery_link" href="<?php echo nextgen_esc_url($gallery->pagelink); ?>"><img class="Thumb" alt="<?php echo esc_attr($gallery->title); ?>" src="<?php echo nextgen_esc_url($gallery->previewurl); ?>"/></a>
11
  </div>
12
  <div class="ngg-description">
13
- <p><?php echo_safe_html($gallery->galdesc); ?></p>
14
- <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?>
15
  <p><strong><?php echo $gallery->counter; ?></strong>&nbsp;<?php _e('Photos', 'nggallery'); ?></p>
16
  <?php } ?>
17
  </div>
@@ -19,4 +19,4 @@
19
  </div>
20
  <?php } ?>
21
  </div>
22
- <?php $this->end_element(); ?>
3
  <?php foreach ($galleries as $gallery) { ?>
4
  <div class="ngg-album">
5
  <div class="ngg-albumtitle">
6
+ <a href="<?php echo $gallery->pagelink; ?>"><?php echo $gallery->title; ?></a>
7
  </div>
8
  <div class="ngg-albumcontent">
9
  <div class="ngg-thumbnail">
10
+ <a href="<?php echo $gallery->pagelink; ?>"><img class="Thumb" alt="<?php echo $gallery->title; ?>" src="<?php echo $gallery->previewurl; ?>"/></a>
11
  </div>
12
  <div class="ngg-description">
13
+ <p><?php echo $gallery->galdesc; ?></p>
14
+ <?php if ($gallery->counter > 0) { ?>
15
  <p><strong><?php echo $gallery->counter; ?></strong>&nbsp;<?php _e('Photos', 'nggallery'); ?></p>
16
  <?php } ?>
17
  </div>
19
  </div>
20
  <?php } ?>
21
  </div>
22
+ <?php $this->end_element(); ?>
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.ajax_pagination_actions.php CHANGED
@@ -11,9 +11,8 @@ class A_Ajax_Pagination_Actions extends Mixin
11
  {
12
  // retrieve by transient id
13
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
14
- $displayed_gallery = $factory->create('displayed_gallery', NULL, $mapper);
15
  $displayed_gallery->apply_transient($id);
16
- $displayed_gallery->transient_id = $id;
17
 
18
  // render the displayed gallery
19
  $this->renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
11
  {
12
  // retrieve by transient id
13
  $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
14
+ $displayed_gallery = $factory->create('displayed_gallery', $mapper);
15
  $displayed_gallery->apply_transient($id);
 
16
 
17
  // render the displayed gallery
18
  $this->renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_gallery_mapper.php CHANGED
@@ -19,13 +19,11 @@ class Hook_NextGen_Basic_Gallery_Defaults extends Hook
19
  {
20
  function set_defaults($entity)
21
  {
22
- if (isset($entity->name)) {
23
- if ($entity->name == NEXTGEN_GALLERY_BASIC_SLIDESHOW)
24
- $this->set_slideshow_defaults($entity);
25
-
26
- else if ($entity->name == NEXTGEN_GALLERY_BASIC_THUMBNAILS)
27
- $this->set_thumbnail_defaults($entity);
28
- }
29
  }
30
 
31
  function set_slideshow_defaults($entity)
@@ -73,9 +71,7 @@ class Hook_NextGen_Basic_Gallery_Defaults extends Hook
73
  $this->object->_set_default_value($entity, 'settings', 'thumbnail_height', $settings->thumbheight);
74
  $this->object->_set_default_value($entity, 'settings', 'show_all_in_lightbox', $settings->galHiddenImg);
75
  $this->object->_set_default_value($entity, 'settings', 'ajax_pagination', $settings->galAjaxNav);
76
- $this->object->_set_default_value($entity, 'settings', 'use_imagebrowser_effect', $settings->galImgBrowser);
77
  $this->object->_set_default_value($entity, 'settings', 'template', '');
78
- $this->object->_set_default_value($entity, 'settings', 'display_no_images_error', 1);
79
 
80
  // TODO: Should this be called enable pagination?
81
  $this->object->_set_default_value($entity, 'settings', 'disable_pagination', 0);
@@ -101,4 +97,4 @@ class Hook_NextGen_Basic_Gallery_Defaults extends Hook
101
  // Part of the pro-modules
102
  $this->object->_set_default_value($entity, 'settings', 'ngg_triggers_display', 'never');
103
  }
104
- }
19
  {
20
  function set_defaults($entity)
21
  {
22
+ if ($entity->name == NEXTGEN_GALLERY_BASIC_SLIDESHOW)
23
+ $this->set_slideshow_defaults($entity);
24
+
25
+ else if ($entity->name == NEXTGEN_GALLERY_BASIC_THUMBNAILS)
26
+ $this->set_thumbnail_defaults($entity);
 
 
27
  }
28
 
29
  function set_slideshow_defaults($entity)
71
  $this->object->_set_default_value($entity, 'settings', 'thumbnail_height', $settings->thumbheight);
72
  $this->object->_set_default_value($entity, 'settings', 'show_all_in_lightbox', $settings->galHiddenImg);
73
  $this->object->_set_default_value($entity, 'settings', 'ajax_pagination', $settings->galAjaxNav);
 
74
  $this->object->_set_default_value($entity, 'settings', 'template', '');
 
75
 
76
  // TODO: Should this be called enable pagination?
77
  $this->object->_set_default_value($entity, 'settings', 'disable_pagination', 0);
97
  // Part of the pro-modules
98
  $this->object->_set_default_value($entity, 'settings', 'ngg_triggers_display', 'never');
99
  }
100
+ }
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_gallery_routes.php CHANGED
@@ -14,12 +14,12 @@ class A_NextGen_Basic_Gallery_Routes extends Mixin
14
 
15
  function add_nextgen_basic_gallery_routes()
16
  {
17
- $slug = '/'.C_NextGen_Settings::get_instance()->router_param_slug;
18
- $this->object->rewrite("{*}{$slug}{*}/image/{*}", "{1}{$slug}{2}/pid--{3}");
19
- $this->object->rewrite("{*}{$slug}{*}/slideshow/{*}", "{1}{$slug}{2}/show--" . NEXTGEN_GALLERY_BASIC_SLIDESHOW . "{3}");
20
- $this->object->rewrite("{*}{$slug}{*}/thumbnails/{*}", "{1}{$slug}{2}/show--". NEXTGEN_GALLERY_BASIC_THUMBNAILS . "{3}");
21
- $this->object->rewrite("{*}{$slug}{*}/show--slide/{*}", "{1}{$slug}{2}/show--" . NEXTGEN_GALLERY_BASIC_SLIDESHOW . "/{3}");
22
- $this->object->rewrite("{*}{$slug}{*}/show--gallery/{*}", "{1}{$slug}{2}/show--" . NEXTGEN_GALLERY_BASIC_THUMBNAILS . "/{3}");
23
- $this->object->rewrite("{*}{$slug}{*}/page/{\\d}{*}", "{1}{$slug}{2}/page--{3}{4}");
24
  }
25
  }
14
 
15
  function add_nextgen_basic_gallery_routes()
16
  {
17
+ $slug = C_NextGen_Global_Settings::get_instance()->router_param_slug;
18
+ $this->object->rewrite("{$slug}{*}/image/{*}", "{$slug}{1}/pid--{2}");
19
+ $this->object->rewrite("{$slug}{*}/slideshow/{*}", "{$slug}{1}/show--" . NEXTGEN_GALLERY_BASIC_SLIDESHOW . "{2}");
20
+ $this->object->rewrite("{$slug}{*}/thumbnails/{*}", "{$slug}{1}/show--". NEXTGEN_GALLERY_BASIC_THUMBNAILS . "{2}");
21
+ $this->object->rewrite("{$slug}{*}/show--slide/{*}", "{$slug}{1}/show--" . NEXTGEN_GALLERY_BASIC_SLIDESHOW . "/{2}");
22
+ $this->object->rewrite("{$slug}{*}/show--gallery/{*}", "{$slug}{1}/show--" . NEXTGEN_GALLERY_BASIC_THUMBNAILS . "/{2}");
23
+ $this->object->rewrite("{$slug}{*}/page/{\\d}{*}", "{$slug}{1}/page--{2}{3}");
24
  }
25
  }
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_gallery_urls.php CHANGED
@@ -25,7 +25,6 @@ class A_NextGen_Basic_Gallery_Urls extends Mixin
25
  if ($key == 'show') {
26
  if ($value == NEXTGEN_GALLERY_BASIC_SLIDESHOW) $value = 'slideshow';
27
  elseif ($value == NEXTGEN_GALLERY_BASIC_THUMBNAILS) $value = 'thumbnails';
28
- elseif ($value == NEXTGEN_GALLERY_NEXTGEN_BASIC_IMAGEBROWSER) $value = 'imagebrowser';
29
  return '/'.$value;
30
  }
31
  elseif ($key == 'page') {
@@ -58,7 +57,7 @@ class A_NextGen_Basic_Gallery_Urls extends Mixin
58
  );
59
 
60
  // Get the settings manager
61
- $settings = C_NextGen_Settings::get_instance();
62
 
63
  // Create the regex pattern
64
  $sep = preg_quote($settings->router_param_separator, '#');
25
  if ($key == 'show') {
26
  if ($value == NEXTGEN_GALLERY_BASIC_SLIDESHOW) $value = 'slideshow';
27
  elseif ($value == NEXTGEN_GALLERY_BASIC_THUMBNAILS) $value = 'thumbnails';
 
28
  return '/'.$value;
29
  }
30
  elseif ($key == 'page') {
57
  );
58
 
59
  // Get the settings manager
60
+ $settings = C_NextGen_Global_Settings::get_instance();
61
 
62
  // Create the regex pattern
63
  $sep = preg_quote($settings->router_param_separator, '#');
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_controller.php CHANGED
@@ -12,7 +12,6 @@ class A_NextGen_Basic_Slideshow_Controller extends Mixin_NextGen_Basic_Gallery_C
12
  // Get the images to be displayed
13
  $current_page = (int)$this->param('page', 1);
14
 
15
- // TODO: Shouldn't we be using maximum_entity_count instead?
16
  $limit = FALSE;
17
  if (in_array($displayed_gallery->source, array('random_images', 'recent_images')))
18
  $limit = $displayed_gallery->display_settings['images_per_page'];
@@ -40,7 +39,7 @@ class A_NextGen_Basic_Slideshow_Controller extends Mixin_NextGen_Basic_Gallery_C
40
  if ($displayed_gallery->display_settings['flash_enabled'])
41
  {
42
  include_once(path_join(NGGALLERY_ABSPATH, implode(DIRECTORY_SEPARATOR, array('lib', 'swfobject.php'))));
43
- $transient_id = $displayed_gallery->transient_id;
44
  $params['mediarss_link'] = $this->get_router()->get_url(
45
  '/nextgen-mediarss?template=playlist_feed&source=displayed_gallery&transient_id=' . $transient_id, false
46
  );
@@ -53,7 +52,7 @@ class A_NextGen_Basic_Slideshow_Controller extends Mixin_NextGen_Basic_Gallery_C
53
  );
54
  }
55
 
56
- $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
57
 
58
  $retval = $this->object->render_partial('photocrati-nextgen_basic_gallery#slideshow/index', $params, $return);
59
  }
@@ -77,14 +76,17 @@ class A_NextGen_Basic_Slideshow_Controller extends Mixin_NextGen_Basic_Gallery_C
77
  }
78
  else {
79
  $resource = defined('SCRIPT_DEBUG') ? 'jquery.cycle.all.min.js' : "jquery.cycle.all.js";
80
- wp_register_script('jquery-cycle', $this->get_static_url("photocrati-nextgen_basic_gallery#slideshow/{$resource}"), array('jquery'));
81
- wp_enqueue_script('jquery-cycle');
82
  }
83
 
84
  wp_enqueue_style('nextgen_basic_slideshow_style', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow.css'));
85
- wp_enqueue_script('waitforimages', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/jquery.waitforimages.js'), array('jquery'));
 
 
 
 
86
  $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
87
- $this->enqueue_ngg_styles();
88
  }
89
 
90
  function is_flash_enabled($displayed_gallery)
12
  // Get the images to be displayed
13
  $current_page = (int)$this->param('page', 1);
14
 
 
15
  $limit = FALSE;
16
  if (in_array($displayed_gallery->source, array('random_images', 'recent_images')))
17
  $limit = $displayed_gallery->display_settings['images_per_page'];
39
  if ($displayed_gallery->display_settings['flash_enabled'])
40
  {
41
  include_once(path_join(NGGALLERY_ABSPATH, implode(DIRECTORY_SEPARATOR, array('lib', 'swfobject.php'))));
42
+ $transient_id = $displayed_gallery->to_transient();
43
  $params['mediarss_link'] = $this->get_router()->get_url(
44
  '/nextgen-mediarss?template=playlist_feed&source=displayed_gallery&transient_id=' . $transient_id, false
45
  );
52
  );
53
  }
54
 
55
+ $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
56
 
57
  $retval = $this->object->render_partial('photocrati-nextgen_basic_gallery#slideshow/index', $params, $return);
58
  }
76
  }
77
  else {
78
  $resource = defined('SCRIPT_DEBUG') ? 'jquery.cycle.all.min.js' : "jquery.cycle.all.js";
79
+ wp_register_script('jquery.cycle', $this->get_static_url("photocrati-nextgen_basic_gallery#slideshow/{$resource}"));
80
+ wp_enqueue_script('jquery.cycle'); // registered in module file
81
  }
82
 
83
  wp_enqueue_style('nextgen_basic_slideshow_style', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow.css'));
84
+ wp_enqueue_script('waitforimages', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/jquery.waitforimages.js'));
85
+
86
+ $cssfile = C_NextGen_Settings::get_instance()->CSSfile;
87
+ wp_enqueue_style('nggallery', NEXTGEN_GALLERY_NGGLEGACY_MOD_URL.'/css/'.$cssfile);
88
+
89
  $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
 
90
  }
91
 
92
  function is_flash_enabled($displayed_gallery)
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php CHANGED
@@ -17,10 +17,6 @@ class A_NextGen_Basic_Slideshow_Form extends Mixin_Display_Type_Form
17
  $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow_settings.js'),
18
  array('jquery.nextgen_radio_toggle')
19
  );
20
-
21
-
22
- if ($atp != null) {
23
- $atp->mark_script('nextgen_basic_slideshow_settings-js');
24
  }
25
 
26
  /**
@@ -107,7 +103,7 @@ class A_NextGen_Basic_Slideshow_Form extends Mixin_Display_Type_Form
107
  {
108
  return $this->render_partial('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow_settings_gallery_dimensions', array(
109
  'display_type_name' => $display_type->name,
110
- 'gallery_dimensions_label' => _('Maximum dimensions'),
111
  'gallery_width' => $display_type->settings['gallery_width'],
112
  'gallery_height' => $display_type->settings['gallery_height'],
113
  ), True);
17
  $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow_settings.js'),
18
  array('jquery.nextgen_radio_toggle')
19
  );
 
 
 
 
20
  }
21
 
22
  /**
103
  {
104
  return $this->render_partial('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow_settings_gallery_dimensions', array(
105
  'display_type_name' => $display_type->name,
106
+ 'gallery_dimensions_label' => _('Maximum Dimensions'),
107
  'gallery_width' => $display_type->settings['gallery_width'],
108
  'gallery_height' => $display_type->settings['gallery_height'],
109
  ), True);
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php CHANGED
@@ -23,10 +23,6 @@ class A_NextGen_Basic_Thumbnail_Form extends Mixin_Display_Type_Form
23
  $this->object->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails_settings.js'),
24
  array('jquery.nextgen_radio_toggle')
25
  );
26
-
27
-
28
- if ($atp != null) {
29
- $atp->mark_script('nextgen_basic_thumbnails_settings');
30
  }
31
 
32
  /**
@@ -40,7 +36,6 @@ class A_NextGen_Basic_Thumbnail_Form extends Mixin_Display_Type_Form
40
  'nextgen_basic_thumbnails_number_of_columns',
41
  'nextgen_basic_thumbnails_ajax_pagination',
42
  'nextgen_basic_thumbnails_hidden',
43
- 'nextgen_basic_thumbnails_imagebrowser_effect',
44
  'nextgen_basic_thumbnails_show_piclens_link',
45
  'nextgen_basic_thumbnails_piclens_link_text',
46
  'nextgen_basic_thumbnails_show_slideshow_link',
@@ -140,17 +135,6 @@ class A_NextGen_Basic_Thumbnail_Form extends Mixin_Display_Type_Form
140
  );
141
  }
142
 
143
- function _render_nextgen_basic_thumbnails_imagebrowser_effect_field($display_type)
144
- {
145
- return $this->_render_radio_field(
146
- $display_type,
147
- 'use_imagebrowser_effect',
148
- 'Use imagebrowser effect',
149
- $display_type->settings['use_imagebrowser_effect'],
150
- 'When active each image in the gallery will link to an imagebrowser display and lightbox effects will not be applied.'
151
- );
152
- }
153
-
154
  /**
155
  * Renders the show_piclens_link settings field
156
  *
@@ -162,7 +146,7 @@ class A_NextGen_Basic_Thumbnail_Form extends Mixin_Display_Type_Form
162
  return $this->_render_radio_field(
163
  $display_type,
164
  'ajax_pagination',
165
- 'Enable AJAX pagination',
166
  $display_type->settings['ajax_pagination'],
167
  'Browse images without reloading the page.'
168
  );
23
  $this->object->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails_settings.js'),
24
  array('jquery.nextgen_radio_toggle')
25
  );
 
 
 
 
26
  }
27
 
28
  /**
36
  'nextgen_basic_thumbnails_number_of_columns',
37
  'nextgen_basic_thumbnails_ajax_pagination',
38
  'nextgen_basic_thumbnails_hidden',
 
39
  'nextgen_basic_thumbnails_show_piclens_link',
40
  'nextgen_basic_thumbnails_piclens_link_text',
41
  'nextgen_basic_thumbnails_show_slideshow_link',
135
  );
136
  }
137
 
 
 
 
 
 
 
 
 
 
 
 
138
  /**
139
  * Renders the show_piclens_link settings field
140
  *
146
  return $this->_render_radio_field(
147
  $display_type,
148
  'ajax_pagination',
149
+ 'Enable Ajax pagination',
150
  $display_type->settings['ajax_pagination'],
151
  'Browse images without reloading the page.'
152
  );
products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnails_controller.php CHANGED
@@ -19,21 +19,11 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin_NextGen_Basic_Gallery_
19
  function index_action($displayed_gallery, $return=FALSE)
20
  {
21
  $display_settings = $displayed_gallery->display_settings;
22
- $gallery_id = $displayed_gallery->id();
23
- $transient_id = $displayed_gallery->transient_id;
24
-
25
- // If these options are on we must use the transient_id to identify the gallery
26
- if ($display_settings['show_piclens_link'] || $display_settings['ajax_pagination'])
27
- $gallery_id = $transient_id;
28
-
29
- if (!$display_settings['disable_pagination'])
30
- $current_page = (int)$this->param('page', $gallery_id, 1);
31
- else
32
- $current_page = 1;
33
-
34
  $offset = $display_settings['images_per_page'] * ($current_page - 1);
35
  $storage = $this->object->get_registry()->get_utility('I_Gallery_Storage');
36
  $total = $displayed_gallery->get_entity_count();
 
37
 
38
  // Get the images to be displayed
39
  if ($display_settings['images_per_page'] > 0 && $display_settings['show_all_in_lightbox'])
@@ -81,6 +71,9 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin_NextGen_Basic_Gallery_
81
  list($pagination_prev, $pagination_next, $pagination) = array(NULL, NULL, NULL);
82
  }
83
 
 
 
 
84
  $thumbnail_size_name = 'thumbnail';
85
 
86
  if ($display_settings['override_thumbnail_settings'])
@@ -116,29 +109,10 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin_NextGen_Basic_Gallery_
116
 
117
  // Generate a slideshow link
118
  $slideshow_link = '';
119
- if ($display_settings['show_slideshow_link'])
120
- {
121
- // origin_url is necessary for ajax operations. slideshow_link_origin will NOT always exist.
122
- $origin_url = $this->object->param('ajax_pagination_referrer');
123
  $slideshow_link = $this->object->get_url_for_alternate_display_type(
124
- $displayed_gallery, NEXTGEN_GALLERY_BASIC_SLIDESHOW, $origin_url
125
- );
126
- }
127
-
128
- // This setting 1) points all images to an imagebrowser display & 2) disables the lightbox effect
129
- if ($display_settings['use_imagebrowser_effect'])
130
- {
131
- // this hook *MUST* be removed later; it should not apply to galleries that may come after this one!
132
- $storage->add_post_hook(
133
- 'get_image_url',
134
- 'imagebrowser alternate url replacer',
135
- 'Hook_NextGen_Basic_Imagebrowser_Alt_URLs',
136
- 'get_image_url'
137
  );
138
- $effect_code = '';
139
- }
140
- else {
141
- $effect_code = $this->object->get_effect_code($displayed_gallery);
142
  }
143
 
144
  // The render functions require different processing
@@ -153,11 +127,13 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin_NextGen_Basic_Gallery_
153
  'next' => (empty($pagination_next)) ? FALSE : $pagination_next,
154
  'prev' => (empty($pagination_prev)) ? FALSE : $pagination_prev,
155
  'pagination' => $pagination,
156
- 'piclens_link' => $piclens_link,
157
- 'slideshow_link' => $slideshow_link
 
 
158
  )
159
  );
160
- $output = $this->object->legacy_render($display_settings['template'], $params, $return, 'gallery');
161
  }
162
  else {
163
  $params = $display_settings;
@@ -167,23 +143,17 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin_NextGen_Basic_Gallery_
167
  $params['transient_id'] = $displayed_gallery->transient_id;
168
  $params['current_page'] = $current_page;
169
  $params['piclens_link'] = $piclens_link;
170
- $params['effect_code'] = $effect_code;
171
  $params['pagination'] = $pagination;
172
  $params['thumbnail_size_name'] = $thumbnail_size_name;
173
  $params['slideshow_link'] = $slideshow_link;
174
 
175
  $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
176
 
177
- $output = $this->object->render_view('photocrati-nextgen_basic_gallery#thumbnails/index', $params, $return);
178
  }
179
-
180
- if ($display_settings['use_imagebrowser_effect'])
181
- $storage->del_post_hook('get_image_url', 'imagebrowser alternate url replacer');
182
-
183
- return $output;
184
-
185
  }
186
- else if ($display_settings['display_no_images_error']) {
187
  return $this->object->render_partial("photocrati-nextgen_gallery_display#no_images_found", array(), $return);
188
  }
189
  }
@@ -194,8 +164,6 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin_NextGen_Basic_Gallery_
194
  */
195
  function enqueue_frontend_resources($displayed_gallery)
196
  {
197
- $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
198
-
199
  wp_enqueue_style('nextgen_basic_thumbnails_style', $this->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.css'));
200
 
201
  if ($displayed_gallery->display_settings['show_piclens_link'])
@@ -206,7 +174,10 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin_NextGen_Basic_Gallery_
206
 
207
  wp_enqueue_style('nextgen_pagination_style', $this->get_static_url('photocrati-nextgen_pagination#style.css'));
208
 
209
- $this->enqueue_ngg_styles();
 
 
 
210
  }
211
 
212
  /**
19
  function index_action($displayed_gallery, $return=FALSE)
20
  {
21
  $display_settings = $displayed_gallery->display_settings;
22
+ $current_page = (int)$this->param('page', $displayed_gallery->id(), 1);
 
 
 
 
 
 
 
 
 
 
 
23
  $offset = $display_settings['images_per_page'] * ($current_page - 1);
24
  $storage = $this->object->get_registry()->get_utility('I_Gallery_Storage');
25
  $total = $displayed_gallery->get_entity_count();
26
+ $gallery_id = $displayed_gallery->id();
27
 
28
  // Get the images to be displayed
29
  if ($display_settings['images_per_page'] > 0 && $display_settings['show_all_in_lightbox'])
71
  list($pagination_prev, $pagination_next, $pagination) = array(NULL, NULL, NULL);
72
  }
73
 
74
+ if ($display_settings['show_piclens_link'] || $display_settings['ajax_pagination'])
75
+ $gallery_id = $displayed_gallery->to_transient();
76
+
77
  $thumbnail_size_name = 'thumbnail';
78
 
79
  if ($display_settings['override_thumbnail_settings'])
109
 
110
  // Generate a slideshow link
111
  $slideshow_link = '';
112
+ if ($display_settings['show_slideshow_link']) {
 
 
 
113
  $slideshow_link = $this->object->get_url_for_alternate_display_type(
114
+ $displayed_gallery, NEXTGEN_GALLERY_BASIC_SLIDESHOW
 
 
 
 
 
 
 
 
 
 
 
 
115
  );
 
 
 
 
116
  }
117
 
118
  // The render functions require different processing
127
  'next' => (empty($pagination_next)) ? FALSE : $pagination_next,
128
  'prev' => (empty($pagination_prev)) ? FALSE : $pagination_prev,
129
  'pagination' => $pagination,
130
+ 'piclens_link' => @$piclens_link,
131
+ 'show_slideshow_link' => @$display_settings['show_slideshow_link'],
132
+ 'slideshow_link' => @$display_settings['slideshow_link'],
133
+ 'slideshow_link_text' => @$display_settings['slideshow_link_text']
134
  )
135
  );
136
+ return $this->object->legacy_render($display_settings['template'], $params, $return, 'gallery');
137
  }
138
  else {
139
  $params = $display_settings;
143
  $params['transient_id'] = $displayed_gallery->transient_id;
144
  $params['current_page'] = $current_page;
145
  $params['piclens_link'] = $piclens_link;
146
+ $params['effect_code'] = $this->object->get_effect_code($displayed_gallery);
147
  $params['pagination'] = $pagination;
148
  $params['thumbnail_size_name'] = $thumbnail_size_name;
149
  $params['slideshow_link'] = $slideshow_link;
150
 
151
  $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
152
 
153
+ return $this->object->render_view('photocrati-nextgen_basic_gallery#thumbnails/index', $params, $return);
154
  }
 
 
 
 
 
 
155
  }
156
+ else {
157
  return $this->object->render_partial("photocrati-nextgen_gallery_display#no_images_found", array(), $return);
158
  }
159
  }
164
  */
165
  function enqueue_frontend_resources($displayed_gallery)
166
  {
 
 
167
  wp_enqueue_style('nextgen_basic_thumbnails_style', $this->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.css'));
168
 
169
  if ($displayed_gallery->display_settings['show_piclens_link'])
174
 
175
  wp_enqueue_style('nextgen_pagination_style', $this->get_static_url('photocrati-nextgen_pagination#style.css'));
176
 
177
+ $cssfile = C_NextGen_Settings::get_instance()->CSSfile;
178
+ wp_enqueue_style('nggallery', NEXTGEN_GALLERY_NGGLEGACY_MOD_URL.'/css/'.$cssfile);
179
+
180
+ $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
181
  }
182
 
183
  /**
products/photocrati_nextgen/modules/nextgen_basic_gallery/hook.nextgen_basic_gallery_integration.php CHANGED
@@ -4,19 +4,13 @@ class Hook_NextGen_Basic_Gallery_Integration extends Hook
4
  {
5
  function index_action($displayed_gallery, $return=FALSE)
6
  {
7
- $show = $this->object->param('show');
8
- $pid = $this->object->param('pid');
9
-
10
- if (!empty($pid) && isset($displayed_gallery->display_settings['use_imagebrowser_effect']) && intval($displayed_gallery->display_settings['use_imagebrowser_effect']))
11
- $show = NEXTGEN_GALLERY_NEXTGEN_BASIC_IMAGEBROWSER;
12
-
13
  // Are we to display a different display type?
14
- if (!empty($show))
15
  {
16
  $params = (array)$displayed_gallery->get_entity();
17
  $ds = $params['display_settings'];
18
 
19
- if ((!empty($ds['show_slideshow_link']) || !empty($ds['show_thumbnail_link']) || !empty($ds['use_imagebrowser_effect']))
20
  && $show != $this->object->context)
21
  {
22
  // We've got an alternate request. We'll use a different display
@@ -47,4 +41,4 @@ class Hook_NextGen_Basic_Gallery_Integration extends Hook
47
  }
48
  }
49
  }
50
- }
4
  {
5
  function index_action($displayed_gallery, $return=FALSE)
6
  {
 
 
 
 
 
 
7
  // Are we to display a different display type?
8
+ if (($show = $this->object->param('show')))
9
  {
10
  $params = (array)$displayed_gallery->get_entity();
11
  $ds = $params['display_settings'];
12
 
13
+ if ((!empty($ds['show_slideshow_link']) || !empty($ds['show_thumbnail_link']))
14
  && $show != $this->object->context)
15
  {
16
  // We've got an alternate request. We'll use a different display
41
  }
42
  }
43
  }
44
+ }
products/photocrati_nextgen/modules/nextgen_basic_gallery/mixin.nextgen_basic_gallery_controller.php CHANGED
@@ -19,9 +19,9 @@ class Mixin_NextGen_Basic_Gallery_Controller extends Mixin
19
  * @param string $display_type
20
  * @return string
21
  */
22
- function get_url_for_alternate_display_type($displayed_gallery, $display_type, $origin_url = FALSE)
23
  {
24
- $url = ($origin_url ? $origin_url : $this->object->get_routed_url(TRUE));
25
  $url = $this->object->remove_param_for($url, 'show', $displayed_gallery->id());
26
  $url = $this->object->set_param_for($url, 'show', $display_type, $displayed_gallery->id());
27
 
19
  * @param string $display_type
20
  * @return string
21
  */
22
+ function get_url_for_alternate_display_type($displayed_gallery, $display_type)
23
  {
24
+ $url = $this->object->get_routed_url(TRUE);
25
  $url = $this->object->remove_param_for($url, 'show', $displayed_gallery->id());
26
  $url = $this->object->set_param_for($url, 'show', $display_type, $displayed_gallery->id());
27
 
products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php CHANGED
@@ -25,7 +25,7 @@ class M_NextGen_Basic_Gallery extends C_Base_Module
25
  'photocrati-nextgen_basic_gallery',
26
  'NextGEN Basic Gallery',
27
  "Provides NextGEN Gallery's basic thumbnail/slideshow integrated gallery",
28
- '0.7',
29
  'http://www.nextgen-gallery.com',
30
  'Photocrati Media',
31
  'http://www.photocrati.com'
@@ -57,19 +57,17 @@ class M_NextGen_Basic_Gallery extends C_Base_Module
57
 
58
  function _register_adapters()
59
  {
60
- if (is_admin()) {
61
- // Provides the display type forms
62
- $this->get_registry()->add_adapter(
63
- 'I_Form',
64
- 'A_NextGen_Basic_Slideshow_Form',
65
- NEXTGEN_GALLERY_BASIC_SLIDESHOW
66
- );
67
- $this->get_registry()->add_adapter(
68
- 'I_Form',
69
- 'A_NextGen_Basic_Thumbnail_Form',
70
- NEXTGEN_GALLERY_BASIC_THUMBNAILS
71
- );
72
- }
73
 
74
  // Provides the controllers for the display types
75
  $this->get_registry()->add_adapter(
@@ -114,24 +112,22 @@ class M_NextGen_Basic_Gallery extends C_Base_Module
114
  'A_Ajax_Pagination_Actions'
115
  );
116
 
117
- if (is_admin()) {
118
- // Adds the settings forms
119
- $this->get_registry()->add_adapter(
120
- 'I_Form_Manager',
121
- 'A_NextGen_Basic_Gallery_Forms'
122
- );
123
- }
124
  }
125
 
126
  function _register_hooks()
127
  {
128
- C_NextGen_Shortcode_Manager::add('nggallery', array(&$this, 'render'));
129
- C_NextGen_Shortcode_Manager::add('nggtags', array(&$this, 'render_based_on_tags'));
130
- C_NextGen_Shortcode_Manager::add('random', array(&$this, 'render_random_images'));
131
- C_NextGen_Shortcode_Manager::add('recent', array(&$this, 'render_recent_images'));
132
- C_NextGen_Shortcode_Manager::add('thumb', array(&$this, 'render_thumb_shortcode'));
133
- C_NextGen_Shortcode_Manager::add('slideshow', array(&$this, 'render_slideshow'));
134
- C_NextGen_Shortcode_Manager::add('nggslideshow', array(&$this, 'render_slideshow'));
135
  }
136
 
137
  /**
@@ -205,7 +201,7 @@ class M_NextGen_Basic_Gallery extends C_Base_Module
205
  $params['source'] = $this->_get_param('source', 'recent', $params);
206
  $params['images_per_page'] = $this->_get_param('max', NULL, $params);
207
  $params['disable_pagination'] = $this->_get_param('disable_pagination', TRUE, $params);
208
- $params['display_type'] = $this->_get_param('display_type', NEXTGEN_GALLERY_BASIC_THUMBNAILS, $params);
209
 
210
  if (isset($params['id']))
211
  {
@@ -223,7 +219,7 @@ class M_NextGen_Basic_Gallery extends C_Base_Module
223
  {
224
  $params['entity_ids'] = $this->_get_param('id', NULL, $params);
225
  $params['source'] = $this->_get_param('source', 'galleries', $params);
226
- $params['display_type'] = $this->_get_param('display_type', NEXTGEN_GALLERY_BASIC_THUMBNAILS, $params);
227
  unset($params['id']);
228
 
229
  $renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
@@ -233,7 +229,7 @@ class M_NextGen_Basic_Gallery extends C_Base_Module
233
  function render_slideshow($params, $inner_content=NULL)
234
  {
235
  $params['gallery_ids'] = $this->_get_param('id', NULL, $params);
236
- $params['display_type'] = $this->_get_param('display_type', NEXTGEN_GALLERY_BASIC_SLIDESHOW, $params);
237
  $params['gallery_width'] = $this->_get_param('w', NULL, $params);
238
  $params['gallery_height'] = $this->_get_param('h', NULL, $params);
239
  unset($params['id'], $params['w'], $params['h']);
25
  'photocrati-nextgen_basic_gallery',
26
  'NextGEN Basic Gallery',
27
  "Provides NextGEN Gallery's basic thumbnail/slideshow integrated gallery",
28
+ '0.2',
29
  'http://www.nextgen-gallery.com',
30
  'Photocrati Media',
31
  'http://www.photocrati.com'
57
 
58
  function _register_adapters()
59
  {
60
+ // Provides the display type forms
61
+ $this->get_registry()->add_adapter(
62
+ 'I_Form',
63
+ 'A_NextGen_Basic_Slideshow_Form',
64
+ NEXTGEN_GALLERY_BASIC_SLIDESHOW
65
+ );
66
+ $this->get_registry()->add_adapter(
67
+ 'I_Form',
68
+ 'A_NextGen_Basic_Thumbnail_Form',
69
+ NEXTGEN_GALLERY_BASIC_THUMBNAILS
70
+ );
 
 
71
 
72
  // Provides the controllers for the display types
73
  $this->get_registry()->add_adapter(
112
  'A_Ajax_Pagination_Actions'
113
  );
114
 
115
+ // Adds the settings forms
116
+ $this->get_registry()->add_adapter(
117
+ 'I_Form_Manager',
118
+ 'A_NextGen_Basic_Gallery_Forms'
119
+ );
 
 
120
  }
121
 
122
  function _register_hooks()
123
  {
124
+ add_shortcode('nggallery', array(&$this, 'render'));
125
+ add_shortcode('nggtags', array(&$this, 'render_based_on_tags'));
126
+ add_shortcode('random', array(&$this, 'render_random_images'));
127
+ add_shortcode('recent', array(&$this, 'render_recent_images'));
128
+ add_shortcode('thumb', array(&$this, 'render_thumb_shortcode'));
129
+ add_shortcode('slideshow', array(&$this, 'render_slideshow'));
130
+ add_shortcode('nggslideshow', array(&$this, 'render_slideshow'));
131
  }
132
 
133
  /**
201
  $params['source'] = $this->_get_param('source', 'recent', $params);
202
  $params['images_per_page'] = $this->_get_param('max', NULL, $params);
203
  $params['disable_pagination'] = $this->_get_param('disable_pagination', TRUE, $params);
204
+ $params['display_type'] = $this->_get_param('display_type', 'photocrati-nextgen_basic_thumbnails', $params);
205
 
206
  if (isset($params['id']))
207
  {
219
  {
220
  $params['entity_ids'] = $this->_get_param('id', NULL, $params);
221
  $params['source'] = $this->_get_param('source', 'galleries', $params);
222
+ $params['display_type'] = $this->_get_param('display_type', 'photocrati-nextgen_basic_thumbnails', $params);
223
  unset($params['id']);
224
 
225
  $renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
229
  function render_slideshow($params, $inner_content=NULL)
230
  {
231
  $params['gallery_ids'] = $this->_get_param('id', NULL, $params);
232
+ $params['display_type'] = $this->_get_param('display_type', 'photocrati-nextgen_basic_slideshow', $params);
233
  $params['gallery_width'] = $this->_get_param('w', NULL, $params);
234
  $params['gallery_height'] = $this->_get_param('h', NULL, $params);
235
  unset($params['id'], $params['w'], $params['h']);
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/nextgen_basic_slideshow.css CHANGED
@@ -35,10 +35,9 @@ body {
35
 
36
  .ngg-slideshow img {
37
  max-width: 100% !important;
38
- max-height: 100%;
39
  width: auto;
40
  height: auto;
41
- border: none;
42
  }
43
 
44
  .ngg-slideshow .ngg-gallery-slideshow-image {
35
 
36
  .ngg-slideshow img {
37
  max-width: 100% !important;
38
+ max-height: 100%;
39
  width: auto;
40
  height: auto;
 
41
  }
42
 
43
  .ngg-slideshow .ngg-gallery-slideshow-image {
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/nextgen_basic_slideshow.js CHANGED
@@ -40,7 +40,6 @@ jQuery.fn.nggShowSlideshow = function(args) {
40
  containerResize: false,
41
  fit: 1,
42
  timeout: s.timeout,
43
- next: self, // advance to next image when clicked
44
  after: function(currSlideElement, nextSlideElement, options, forwardFlag) {
45
  // update the pro-lightbox triggers should they exist
46
  jQuery(nextSlideElement).parent().siblings('div.ngg-trigger-buttons').each(function() {
40
  containerResize: false,
41
  fit: 1,
42
  timeout: s.timeout,
 
43
  after: function(currSlideElement, nextSlideElement, options, forwardFlag) {
44
  // update the pro-lightbox triggers should they exist
45
  jQuery(nextSlideElement).parent().siblings('div.ngg-trigger-buttons').each(function() {
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/ajax_pagination.js CHANGED
@@ -8,14 +8,10 @@ jQuery(function($){
8
  init: function(){
9
  var self = this;
10
  jQuery('body').on('click', 'a.page-numbers, a.prev, a.next', function(e){
 
11
  var $this = $(this);
12
  var $gallery = $this.parents('.ngg-galleryoverview:first');
13
  var gallery_id= $gallery.attr('id').replace('ngg-gallery-','').replace(/-\d+$/, '');
14
-
15
- if ($gallery.hasClass('ngg-ajax-pagination-none'))
16
- return;
17
-
18
- e.preventDefault();
19
 
20
  self.toggle_busy(true);
21
 
@@ -38,7 +34,7 @@ jQuery(function($){
38
  $(document).trigger('refreshed');
39
  }).always(function() {
40
  self.toggle_busy(false);
41
- });
42
 
43
  });
44
  },
8
  init: function(){
9
  var self = this;
10
  jQuery('body').on('click', 'a.page-numbers, a.prev, a.next', function(e){
11
+ e.preventDefault();
12
  var $this = $(this);
13
  var $gallery = $this.parents('.ngg-galleryoverview:first');
14
  var gallery_id= $gallery.attr('id').replace('ngg-gallery-','').replace(/-\d+$/, '');
 
 
 
 
 
15
 
16
  self.toggle_busy(true);
17
 
34
  $(document).trigger('refreshed');
35
  }).always(function() {
36
  self.toggle_busy(false);
37
+ });;
38
 
39
  });
40
  },
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css CHANGED
@@ -19,10 +19,6 @@
19
  margin-right: 5px;
20
  }
21
 
22
- .ngg-template-caption .ngg-gallery-thumbnail-box {
23
- margin-right: 0px;
24
- }
25
-
26
  .ngg-gallery-thumbnail {
27
  float: left;
28
  text-align: center;
@@ -62,8 +58,6 @@
62
 
63
  .ngg-galleryoverview div.pic img {
64
  width: 100%;
65
- border: 0px;
66
- border-radius: 0px;
67
  }
68
 
69
  .ngg-gallery-list li {
19
  margin-right: 5px;
20
  }
21
 
 
 
 
 
22
  .ngg-gallery-thumbnail {
23
  float: left;
24
  text-align: center;
58
 
59
  .ngg-galleryoverview div.pic img {
60
  width: 100%;
 
 
61
  }
62
 
63
  .ngg-gallery-list li {
products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/index.php CHANGED
@@ -76,9 +76,11 @@
76
  <?php if ($flash_xhtml_validation): ?>
77
  <!--
78
  <?php endif ?>
79
- jQuery(function($){
80
- <?php echo $swfobject->javascript(); ?>
81
- });
 
 
82
  <?php if ($flash_xhtml_validation): ?>
83
  -->
84
  <?php endif ?>
@@ -143,7 +145,7 @@
143
  <img data-image-id='<?php echo esc_attr($image->pid); ?>'
144
  title="<?php echo esc_attr($image->description)?>"
145
  alt="<?php echo esc_attr($image->alttext)?>"
146
- src="<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE))?>"
147
  width="<?php echo esc_attr($image_size['width'])?>"
148
  height="<?php echo esc_attr($image_size['height'])?>"
149
  />
@@ -171,7 +173,7 @@
171
  <div
172
  class="ngg-galleryoverview ngg-slideshow"
173
  id="<?php echo_h($anchor)?>"
174
- data-placeholder="<?php echo nextgen_esc_url($placeholder)?>"
175
  style="max-width:<?php echo_h($gallery_width) ?>px; max-height:<?php echo_h($gallery_height) ?>px;">
176
 
177
  <div
@@ -188,16 +190,19 @@
188
  ?>
189
  <script type="text/javascript">
190
  jQuery('#<?php echo_h($anchor)?>-image-list').hide().removeClass('ngg-slideshow-nojs');
191
- jQuery(function($){
192
- jQuery('#<?php echo_h($anchor); ?>').nggShowSlideshow({
193
- id: '<?php echo_h($displayed_gallery_id); ?>',
194
- fx: '<?php echo_h($cycle_effect); ?>',
195
- width: <?php echo_h($gallery_width); ?>,
196
- height: <?php echo_h($gallery_height); ?>,
197
- domain: '<?php echo_h(trailingslashit(home_url())); ?>',
198
- timeout: <?php echo_h(intval($cycle_interval) * 1000); ?>
199
- });
200
- });
 
 
 
201
  </script>
202
  <?php endif ?>
203
  <?php $this->end_element(); ?>
76
  <?php if ($flash_xhtml_validation): ?>
77
  <!--
78
  <?php endif ?>
79
+ (function($){
80
+ $(document).on('lazy_resources_loaded', function(){
81
+ <?php echo $swfobject->javascript(); ?>
82
+ });
83
+ })(jQuery);
84
  <?php if ($flash_xhtml_validation): ?>
85
  -->
86
  <?php endif ?>
145
  <img data-image-id='<?php echo esc_attr($image->pid); ?>'
146
  title="<?php echo esc_attr($image->description)?>"
147
  alt="<?php echo esc_attr($image->alttext)?>"
148
+ src="<?php echo esc_attr($storage->get_image_url($image))?>"
149
  width="<?php echo esc_attr($image_size['width'])?>"
150
  height="<?php echo esc_attr($image_size['height'])?>"
151
  />
173
  <div
174
  class="ngg-galleryoverview ngg-slideshow"
175
  id="<?php echo_h($anchor)?>"
176
+ data-placeholder="<?php echo esc_url($placeholder)?>"
177
  style="max-width:<?php echo_h($gallery_width) ?>px; max-height:<?php echo_h($gallery_height) ?>px;">
178
 
179
  <div
190
  ?>
191
  <script type="text/javascript">
192
  jQuery('#<?php echo_h($anchor)?>-image-list').hide().removeClass('ngg-slideshow-nojs');
193
+
194
+ (function($){
195
+ $(document).on('lazy_resources_loaded', function(){
196
+ jQuery('#<?php echo_h($anchor); ?>').nggShowSlideshow({
197
+ id: '<?php echo_h($displayed_gallery_id); ?>',
198
+ fx: '<?php echo_h($cycle_effect); ?>',
199
+ width: <?php echo_h($gallery_width); ?>,
200
+ height: <?php echo_h($gallery_height); ?>,
201
+ domain: '<?php echo_h(trailingslashit(home_url())); ?>',
202
+ timeout: <?php echo_h(intval($cycle_interval) * 1000); ?>
203
+ });
204
+ });
205
+ })(jQuery);
206
  </script>
207
  <?php endif ?>
208
  <?php $this->end_element(); ?>
products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/index.php CHANGED
@@ -4,7 +4,7 @@ $this->start_element('nextgen_gallery.gallery_container', 'container', $displaye
4
 
5
  ?>
6
  <div
7
- class="ngg-galleryoverview<?php if (!intval($ajax_pagination)) echo ' ngg-ajax-pagination-none'; ?>"
8
  id="ngg-gallery-<?php echo_h($displayed_gallery_id)?>-<?php echo_h($current_page)?>">
9
 
10
  <?php if (!empty($slideshow_link)): ?>
@@ -28,40 +28,36 @@ $this->start_element('nextgen_gallery.gallery_container', 'container', $displaye
28
 
29
  ?>
30
  <!-- Thumbnails -->
31
- <?php for ($i=0; $i<count($images); $i++):
32
- $image = $images[$i];
33
- $thumb_size = $storage->get_image_dimensions($image, $thumbnail_size_name);
34
- $style = isset($image->style) ? $image->style : null;
 
 
 
 
 
35
 
36
- if (isset($image->hidden) && $image->hidden) {
37
- $style = 'style="display: none;"';
38
- }
39
- else {
40
- $style = null;
41
- }
42
 
43
- $this->start_element('nextgen_gallery.image_panel', 'item', $image);
44
 
45
  ?>
46
- <div id="<?php echo_h('ngg-image-' . $i) ?>" class="ngg-gallery-thumbnail-box" <?php if ($style) echo $style; ?>>
47
  <?php
48
 
49
  $this->start_element('nextgen_gallery.image', 'item', $image);
50
 
51
  ?>
52
  <div class="ngg-gallery-thumbnail">
53
- <a href="<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE))?>"
54
  title="<?php echo esc_attr($image->description)?>"
55
- data-src="<?php echo esc_attr($storage->get_image_url($image)); ?>"
56
- data-thumbnail="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>"
57
- data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>"
58
- data-title="<?php echo esc_attr($image->alttext); ?>"
59
- data-description="<?php echo esc_attr(stripslashes($image->description)); ?>"
60
  <?php echo $effect_code ?>>
61
  <img
62
  title="<?php echo esc_attr($image->alttext)?>"
63
  alt="<?php echo esc_attr($image->alttext)?>"
64
- src="<?php echo esc_attr($storage->get_image_url($image, $thumbnail_size_name, TRUE))?>"
65
  width="<?php echo esc_attr($thumb_size['width'])?>"
66
  height="<?php echo esc_attr($thumb_size['height'])?>"
67
  style="max-width:none;"
@@ -100,4 +96,4 @@ $this->start_element('nextgen_gallery.gallery_container', 'container', $displaye
100
  <div class="ngg-clear"></div>
101
  <?php endif ?>
102
  </div>
103
- <?php $this->end_element(); ?>
4
 
5
  ?>
6
  <div
7
+ class="ngg-galleryoverview"
8
  id="ngg-gallery-<?php echo_h($displayed_gallery_id)?>-<?php echo_h($current_page)?>">
9
 
10
  <?php if (!empty($slideshow_link)): ?>
28
 
29
  ?>
30
  <!-- Thumbnails -->
31
+ <?php for ($i=0; $i<count($images); $i++): ?>
32
+ <?php $image = $images[$i]; ?>
33
+ <?php $thumb_size = $storage->get_image_dimensions($image, $thumbnail_size_name); ?>
34
+
35
+ <?php if (isset($image->hidden) && $image->hidden): ?>
36
+ <?php $image->style = 'style="display: none;"'?>
37
+ <?php else: ?>
38
+ <?php $image->style = ''; ?>
39
+ <?php endif; ?>
40
 
41
+ <?php
 
 
 
 
 
42
 
43
+ $this->start_element('nextgen_gallery.image_panel', 'item', $image);
44
 
45
  ?>
46
+ <div id="<?php echo_h('ngg-image-' . $i) ?>" class="ngg-gallery-thumbnail-box" <?php if (isset($image->style)) echo $image->style; ?>>
47
  <?php
48
 
49
  $this->start_element('nextgen_gallery.image', 'item', $image);
50
 
51
  ?>
52
  <div class="ngg-gallery-thumbnail">
53
+ <a href="<?php echo esc_attr($storage->get_image_url($image))?>"
54
  title="<?php echo esc_attr($image->description)?>"
55
+ data-image-id='<?php echo esc_attr($image->pid); ?>'
 
 
 
 
56
  <?php echo $effect_code ?>>
57
  <img
58
  title="<?php echo esc_attr($image->alttext)?>"
59
  alt="<?php echo esc_attr($image->alttext)?>"
60
+ src="<?php echo esc_attr($storage->get_image_url($image, $thumbnail_size_name))?>"
61
  width="<?php echo esc_attr($thumb_size['width'])?>"
62
  height="<?php echo esc_attr($thumb_size['height'])?>"
63
  style="max-width:none;"
96
  <div class="ngg-clear"></div>
97
  <?php endif ?>
98
  </div>
99
+ <?php $this->end_element(); ?>
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_controller.php CHANGED
@@ -3,7 +3,7 @@
3
  /**
4
  * Provides rendering logic for the NextGen Basic ImageBrowser
5
  */
6
- class A_NextGen_Basic_ImageBrowser_Controller extends Mixin_NextGen_Basic_Gallery_Controller
7
  {
8
  /**
9
  * Renders the front-end display for the imagebrowser display type
@@ -98,21 +98,17 @@ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin_NextGen_Basic_Galler
98
  $picture_list_pos = $key + 1;
99
 
100
  // our image to display
101
- $picture = new C_Image_Wrapper($imap->find($numeric_pid), $displayed_gallery, TRUE);
102
  $picture = apply_filters('ngg_image_object', $picture, $numeric_pid);
103
 
104
  // determine URI to the next & previous images
105
  $back_pid = ($key >= 1) ? $picture_array[$key - 1] : end($picture_array);
106
 
107
- // 'show' is set when using the imagebrowser as an alternate view to a thumbnail or slideshow
108
- // for which the basic-gallery module will rewrite the show parameter into existence as long as 'image'
109
- // is set. We remove 'show' here so navigation appears fluid.
110
  $prev_image_link = $this->object->set_param_for(
111
  $application->get_routed_url(TRUE),
112
  'pid',
113
  $picture_list[$back_pid]->image_slug
114
  );
115
- $prev_image_link = trailingslashit($this->object->remove_param_for($prev_image_link, 'show', $displayed_gallery->id()));
116
 
117
  $next_pid = ($key < ($total - 1)) ? $picture_array[$key + 1] : reset($picture_array);
118
  $next_image_link = $this->object->set_param_for(
@@ -120,10 +116,9 @@ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin_NextGen_Basic_Galler
120
  'pid',
121
  $picture_list[$next_pid]->image_slug
122
  );
123
- $next_image_link = trailingslashit($this->object->remove_param_for($next_image_link, 'show', $displayed_gallery->id()));
124
 
125
  // css class
126
- $anchor = 'ngg-imagebrowser-' . $displayed_gallery->id() . '-' . (get_the_ID() == false ? 0 : get_the_ID());
127
 
128
  // try to read EXIF data, but fallback to the db presets
129
  $meta = new C_NextGen_Metadata($picture);
@@ -193,13 +188,14 @@ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin_NextGen_Basic_Galler
193
  */
194
  function enqueue_frontend_resources($displayed_gallery)
195
  {
196
- $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
197
-
198
- wp_enqueue_style(
199
  'nextgen_basic_imagebrowser_style',
200
  $this->get_static_url('photocrati-nextgen_basic_imagebrowser#style.css')
201
  );
202
 
203
- $this->enqueue_ngg_styles();
 
 
 
204
  }
205
  }
3
  /**
4
  * Provides rendering logic for the NextGen Basic ImageBrowser
5
  */
6
+ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin
7
  {
8
  /**
9
  * Renders the front-end display for the imagebrowser display type
98
  $picture_list_pos = $key + 1;
99
 
100
  // our image to display
101
+ $picture = new C_Image_Wrapper($imap->find($numeric_pid), NULL, TRUE);
102
  $picture = apply_filters('ngg_image_object', $picture, $numeric_pid);
103
 
104
  // determine URI to the next & previous images
105
  $back_pid = ($key >= 1) ? $picture_array[$key - 1] : end($picture_array);
106
 
 
 
 
107
  $prev_image_link = $this->object->set_param_for(
108
  $application->get_routed_url(TRUE),
109
  'pid',
110
  $picture_list[$back_pid]->image_slug
111
  );
 
112
 
113
  $next_pid = ($key < ($total - 1)) ? $picture_array[$key + 1] : reset($picture_array);
114
  $next_image_link = $this->object->set_param_for(
116
  'pid',
117
  $picture_list[$next_pid]->image_slug
118
  );
 
119
 
120
  // css class
121
+ $anchor = 'ngg-imagebrowser-' . $picture->galleryid . '-' . (get_the_ID() == false ? 0 : get_the_ID());
122
 
123
  // try to read EXIF data, but fallback to the db presets
124
  $meta = new C_NextGen_Metadata($picture);
188
  */
189
  function enqueue_frontend_resources($displayed_gallery)
190
  {
191
+ wp_enqueue_style(
 
 
192
  'nextgen_basic_imagebrowser_style',
193
  $this->get_static_url('photocrati-nextgen_basic_imagebrowser#style.css')
194
  );
195
 
196
+ $cssfile = C_NextGen_Settings::get_instance()->CSSfile;
197
+ wp_enqueue_style('nggallery', NEXTGEN_GALLERY_NGGLEGACY_MOD_URL.'/css/'.$cssfile);
198
+
199
+ $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
200
  }
201
  }
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_form.php CHANGED
@@ -12,9 +12,6 @@ class A_NextGen_Basic_ImageBrowser_Form extends Mixin_Display_Type_Form
12
  */
13
  function _get_field_names()
14
  {
15
- return array(
16
- 'ajax_pagination',
17
- 'nextgen_basic_templates_template',
18
- );
19
  }
20
  }
12
  */
13
  function _get_field_names()
14
  {
15
+ return array('nextgen_basic_templates_template');
 
 
 
16
  }
17
  }
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_mapper.php CHANGED
@@ -23,7 +23,7 @@ class Hook_NextGen_Basic_ImageBrowser_Defaults extends Hook
23
  {
24
  function set_defaults($entity)
25
  {
26
- if (isset($entity->name) && $entity->name == NEXTGEN_GALLERY_NEXTGEN_BASIC_IMAGEBROWSER)
27
  {
28
  $this->object->_set_default_value($entity, 'settings', 'template', '');
29
 
23
  {
24
  function set_defaults($entity)
25
  {
26
+ if ($entity->name == NEXTGEN_GALLERY_NEXTGEN_BASIC_IMAGEBROWSER)
27
  {
28
  $this->object->_set_default_value($entity, 'settings', 'template', '');
29
 
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/adapter.nextgen_basic_imagebrowser_routes.php CHANGED
@@ -14,7 +14,7 @@ class A_NextGen_Basic_ImageBrowser_Routes extends Mixin
14
 
15
  function _add_nextgen_basic_imagebrowser_routes()
16
  {
17
- $slug = '/'.C_NextGen_Settings::get_instance()->router_param_slug;
18
- $this->object->rewrite("{*}{$slug}{*}/image/{\\w}", "{1}{$slug}{2}/pid--{3}");
19
  }
20
  }
14
 
15
  function _add_nextgen_basic_imagebrowser_routes()
16
  {
17
+ $slug = C_NextGen_Global_Settings::get_instance()->router_param_slug;
18
+ $this->object->rewrite("{$slug}{*}/image/{\\w}", "{$slug}{1}/pid--{2}");
19
  }
20
  }
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/hook.nextgen_basic_imagebrowser_alt_urls.php DELETED
@@ -1,45 +0,0 @@
1
- <?php
2
-
3
- class Hook_NextGen_Basic_Imagebrowser_Alt_URLs extends Hook {
4
- /**
5
- * Replaces the full-size image url with a path to the current url + a pid (image) parameter. This causes
6
- * basic thumbnail displays to render a basic imagebrowser.
7
- *
8
- * @param $image
9
- * @param string $size
10
- * @return null
11
- */
12
- function get_image_url($image, $size='full', $check_existance=FALSE)
13
- {
14
- // Get the method to be returned
15
- $retval = $this->object->get_method_property(
16
- $this->method_called,
17
- ExtensibleObject::METHOD_PROPERTY_RETURN_VALUE
18
- );
19
-
20
- if ($size == 'full')
21
- {
22
- $router = $this->object->get_registry()->get_utility('I_Router');
23
- $controller = $this->object->get_registry()->get_utility('I_Display_Type_Controller');
24
- $application = $router->get_routed_app();
25
-
26
- if ($router->param('ajax_pagination_referrer'))
27
- $url = $router->param('ajax_pagination_referrer');
28
- else
29
- $url = $application->get_routed_url(TRUE);
30
-
31
- $url = $controller->set_param_for($url, 'pid', $image->image_slug);
32
- $url = $controller->remove_param_for($url, 'show');
33
-
34
- $retval = $url;
35
-
36
- $this->object->set_method_property(
37
- $this->method_called,
38
- ExtensibleObject::METHOD_PROPERTY_RETURN_VALUE,
39
- $retval
40
- );
41
- }
42
-
43
- return $retval;
44
- }
45
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php CHANGED
@@ -19,7 +19,7 @@ class M_NextGen_Basic_ImageBrowser extends C_Base_Module
19
  'photocrati-nextgen_basic_imagebrowser',
20
  'NextGEN Basic ImageBrowser',
21
  'Provides the NextGEN Basic ImageBrowser Display Type',
22
- '0.5',
23
  'http://www.nextgen-gallery.com',
24
  'Photocrati Media',
25
  'http://www.photocrati.com'
@@ -59,24 +59,23 @@ class M_NextGen_Basic_ImageBrowser extends C_Base_Module
59
  'I_Routing_App', 'A_NextGen_Basic_ImageBrowser_Urls'
60
  );
61
 
62
- if (is_admin()) {
63
- // Provide the imagebrowser form
64
- $this->get_registry()->add_adapter(
65
- 'I_Form',
66
- 'A_NextGen_Basic_ImageBrowser_Form',
67
- $this->module_id
68
- );
69
- // Provides the setting forms
70
- $this->get_registry()->add_adapter(
71
- 'I_Form_Manager',
72
- 'A_NextGen_Basic_ImageBrowser_Forms'
73
- );
74
- }
75
  }
76
 
77
  function _register_hooks()
78
  {
79
- C_NextGen_Shortcode_Manager::add('imagebrowser', array(&$this, 'render_shortcode'));
80
  }
81
 
82
  /**
@@ -114,8 +113,7 @@ class M_NextGen_Basic_ImageBrowser extends C_Base_Module
114
  'C_Nextgen_Basic_Imagebrowser_Installer' => 'class.nextgen_basic_imagebrowser_installer.php',
115
  'A_Nextgen_Basic_Imagebrowser_Mapper' => 'adapter.nextgen_basic_imagebrowser_mapper.php',
116
  'A_Nextgen_Basic_Imagebrowser_Routes' => 'adapter.nextgen_basic_imagebrowser_routes.php',
117
- 'A_Nextgen_Basic_Imagebrowser_Urls' => 'adapter.nextgen_basic_imagebrowser_urls.php',
118
- 'Hook_NextGen_Basic_Imagebrowser_Alt_URLs' => 'hook.nextgen_basic_imagebrowser_alt_urls.php'
119
  );
120
  }
121
  }
19
  'photocrati-nextgen_basic_imagebrowser',
20
  'NextGEN Basic ImageBrowser',
21
  'Provides the NextGEN Basic ImageBrowser Display Type',
22
+ '0.1',
23
  'http://www.nextgen-gallery.com',
24
  'Photocrati Media',
25
  'http://www.photocrati.com'
59
  'I_Routing_App', 'A_NextGen_Basic_ImageBrowser_Urls'
60
  );
61
 
62
+ // Provide the imagebrowser form
63
+ $this->get_registry()->add_adapter(
64
+ 'I_Form',
65
+ 'A_NextGen_Basic_ImageBrowser_Form',
66
+ $this->module_id
67
+ );
68
+
69
+ // Provides the setting forms
70
+ $this->get_registry()->add_adapter(
71
+ 'I_Form_Manager',
72
+ 'A_NextGen_Basic_ImageBrowser_Forms'
73
+ );
 
74
  }
75
 
76
  function _register_hooks()
77
  {
78
+ add_shortcode('imagebrowser', array(&$this, 'render_shortcode'));
79
  }
80
 
81
  /**
113
  'C_Nextgen_Basic_Imagebrowser_Installer' => 'class.nextgen_basic_imagebrowser_installer.php',
114
  'A_Nextgen_Basic_Imagebrowser_Mapper' => 'adapter.nextgen_basic_imagebrowser_mapper.php',
115
  'A_Nextgen_Basic_Imagebrowser_Routes' => 'adapter.nextgen_basic_imagebrowser_routes.php',
116
+ 'A_Nextgen_Basic_Imagebrowser_Urls' => 'adapter.nextgen_basic_imagebrowser_urls.php'
 
117
  );
118
  }
119
  }
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.css CHANGED
@@ -21,7 +21,6 @@
21
  display: block !important;
22
  font-size: 0px;
23
  margin: 5px;
24
- text-align: center;
25
  }
26
 
27
  .ngg-imagebrowser img {
21
  display: block !important;
22
  font-size: 0px;
23
  margin: 5px;
 
24
  }
25
 
26
  .ngg-imagebrowser img {
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php CHANGED
@@ -14,17 +14,13 @@
14
  $this->include_template('photocrati-nextgen_gallery_display#image/before', $template_params);
15
 
16
  ?>
17
- <a href='<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE)); ?>'
18
  title='<?php echo esc_attr($image->description); ?>'
19
- data-src="<?php echo esc_attr($storage->get_image_url($image)); ?>"
20
- data-thumbnail="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>"
21
- data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>"
22
- data-title="<?php echo esc_attr($image->alttext); ?>"
23
- data-description="<?php echo esc_attr(stripslashes($image->description)); ?>"
24
  <?php echo $effect_code ?>>
25
  <img title='<?php echo esc_attr($image->alttext); ?>'
26
  alt='<?php echo esc_attr($image->alttext); ?>'
27
- src='<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE)); ?>'/>
28
  </a>
29
  <?php
30
 
@@ -64,13 +60,4 @@
64
  </div>
65
 
66
  </div>
67
- <?php $this->end_element(); ?>
68
- <script type='text/javascript'>
69
- jQuery(function($){
70
- new NggPaginatedGallery(
71
- '<?php echo $displayed_gallery->id() ?>',
72
- $('#<?php echo $anchor ?>'),
73
- $('#<?php echo $anchor ?> .ngg-browser-prev, #<?php echo $anchor ?> .ngg-browser-next')
74
- )
75
- });
76
- </script>
14
  $this->include_template('photocrati-nextgen_gallery_display#image/before', $template_params);
15
 
16
  ?>
17
+ <a href='<?php echo esc_attr($storage->get_image_url($image)); ?>'
18
  title='<?php echo esc_attr($image->description); ?>'
19
+ data-image-id='<?php echo esc_attr($image->pid); ?>'
 
 
 
 
20
  <?php echo $effect_code ?>>
21
  <img title='<?php echo esc_attr($image->alttext); ?>'
22
  alt='<?php echo esc_attr($image->alttext); ?>'
23
+ src='<?php echo esc_attr($storage->get_image_url($image)); ?>'/>
24
  </a>
25
  <?php
26
 
60
  </div>
61
 
62
  </div>
63
+ <?php $this->end_element(); ?>
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_controller.php CHANGED
@@ -32,19 +32,8 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin
32
  break;
33
  }
34
 
35
- $params = array();
36
-
37
- if (!empty($display_settings['link']))
38
- {
39
- $target = '_blank';
40
- $effect_code = '';
41
- }
42
- else {
43
- $display_settings['link'] = $storage->get_image_url($image, 'full', TRUE);
44
- $target = '_self';
45
- $effect_code = $this->object->get_effect_code($displayed_gallery);
46
- }
47
- $params['target'] = $target;
48
 
49
  // mode is a legacy parameter
50
  if (!is_array($display_settings['mode']))
@@ -99,28 +88,17 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin
99
  $params['image']->container[0]->_cache_overrides['classname'] = 'ngg-singlepic ' . $display_settings['float'];
100
  $params['image']->container[0]->_cache_overrides['imageURL'] = $display_settings['link'];
101
  $params['image']->container[0]->_cache_overrides['thumbnailURL'] = $thumbnail_url;
102
- $params['target'] = $target;
103
-
104
- // if a link is present we temporarily must filter out the effect code
105
- if (empty($effect_code))
106
- add_filter('ngg_get_thumbcode', array(&$this, 'strip_thumbcode'), 10);
107
-
108
- $retval = $this->object->legacy_render($display_settings['template'], $params, $return, 'singlepic');
109
-
110
- if (empty($effect_code))
111
- remove_filter('ngg_get_thumbcode', array(&$this, 'strip_thumbcode'), 10);
112
 
113
- return $retval;
114
  }
115
  else {
116
  $params = $display_settings;
117
  $params['storage'] = &$storage;
118
  $params['image'] = &$image;
119
- $params['effect_code'] = $effect_code;
120
  $params['inner_content'] = $displayed_gallery->inner_content;
121
  $params['settings'] = $display_settings;
122
  $params['thumbnail_url'] = $thumbnail_url;
123
- $params['target'] = $target;
124
 
125
  $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
126
 
@@ -128,14 +106,6 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin
128
  }
129
  }
130
 
131
- /**
132
- * Intentionally disable the application of the effect code
133
- */
134
- function strip_thumbcode($thumbcode)
135
- {
136
- return '';
137
- }
138
-
139
  /**
140
  * Enqueues all static resources required by this display type
141
  *
@@ -143,11 +113,12 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin
143
  */
144
  function enqueue_frontend_resources($displayed_gallery)
145
  {
146
- $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
147
-
148
  wp_enqueue_style('nextgen_basic_singlepic_style', $this->get_static_url('photocrati-nextgen_basic_singlepic#nextgen_basic_singlepic.css'));
149
 
150
- $this->enqueue_ngg_styles();
 
 
 
151
  }
152
 
153
  }
32
  break;
33
  }
34
 
35
+ // validate and/or clean our passed settings
36
+ $display_settings['link'] = (!empty($display_settings['link'])) ? $display_settings['link'] : $storage->get_image_url($image);
 
 
 
 
 
 
 
 
 
 
 
37
 
38
  // mode is a legacy parameter
39
  if (!is_array($display_settings['mode']))
88
  $params['image']->container[0]->_cache_overrides['classname'] = 'ngg-singlepic ' . $display_settings['float'];
89
  $params['image']->container[0]->_cache_overrides['imageURL'] = $display_settings['link'];
90
  $params['image']->container[0]->_cache_overrides['thumbnailURL'] = $thumbnail_url;
 
 
 
 
 
 
 
 
 
 
91
 
92
+ return $this->object->legacy_render($display_settings['template'], $params, $return, 'singlepic');
93
  }
94
  else {
95
  $params = $display_settings;
96
  $params['storage'] = &$storage;
97
  $params['image'] = &$image;
98
+ $params['effect_code'] = $this->object->get_effect_code($displayed_gallery);
99
  $params['inner_content'] = $displayed_gallery->inner_content;
100
  $params['settings'] = $display_settings;
101
  $params['thumbnail_url'] = $thumbnail_url;
 
102
 
103
  $params = $this->object->prepare_display_parameters($displayed_gallery, $params);
104
 
106
  }
107
  }
108
 
 
 
 
 
 
 
 
 
109
  /**
110
  * Enqueues all static resources required by this display type
111
  *
113
  */
114
  function enqueue_frontend_resources($displayed_gallery)
115
  {
 
 
116
  wp_enqueue_style('nextgen_basic_singlepic_style', $this->get_static_url('photocrati-nextgen_basic_singlepic#nextgen_basic_singlepic.css'));
117
 
118
+ $cssfile = C_NextGen_Settings::get_instance()->CSSfile;
119
+ wp_enqueue_style('nggallery', NEXTGEN_GALLERY_NGGLEGACY_MOD_URL.'/css/'.$cssfile);
120
+
121
+ $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
122
  }
123
 
124
  }
products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_mapper.php CHANGED
@@ -58,7 +58,7 @@ class A_NextGen_Basic_SinglePic_Mapper extends Mixin
58
  */
59
  function _set_singlepic_defaults($entity)
60
  {
61
- if (isset($entity->name) && $entity->name == NEXTGEN_BASIC_SINGLEPIC_MODULE_NAME) {
62
  $this->object->_set_default_value($entity, 'settings', 'width', '');
63
  $this->object->_set_default_value($entity, 'settings', 'height', '');
64
  $this->object->_set_default_value($entity, 'settings', 'mode', '');
58
  */
59
  function _set_singlepic_defaults($entity)
60
  {
61
+ if ($entity->name == NEXTGEN_BASIC_SINGLEPIC_MODULE_NAME) {
62
  $this->object->_set_default_value($entity, 'settings', 'width', '');
63
  $this->object->_set_default_value($entity, 'settings', 'height', '');
64
  $this->object->_set_default_value($entity, 'settings', 'mode', '');
products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php CHANGED
@@ -17,7 +17,7 @@ class M_NextGen_Basic_Singlepic extends C_Base_Module
17
  NEXTGEN_BASIC_SINGLEPIC_MODULE_NAME,
18
  'NextGen Basic Singlepic',
19
  'Provides a singlepic gallery for NextGEN Gallery',
20
- '0.5',
21
  'http://www.photocrati.com',
22
  'Photocrati Media',
23
  'http://www.photocrati.com'
@@ -43,24 +43,23 @@ class M_NextGen_Basic_Singlepic extends C_Base_Module
43
  'A_NextGen_Basic_Singlepic_Mapper'
44
  );
45
 
46
- if (is_admin()) {
47
- // Provides the display settings form for the SinglePic display type
48
- $this->get_registry()->add_adapter(
49
- 'I_Form',
50
- 'A_NextGen_Basic_SinglePic_Form',
51
- $this->module_id
52
- );
53
- // Adds the setting forms
54
- $this->get_registry()->add_adapter(
55
- 'I_Form_Manager',
56
- 'A_NextGen_Basic_SinglePic_Forms'
57
- );
58
- }
59
  }
60
 
61
  function _register_hooks()
62
  {
63
- C_NextGen_Shortcode_Manager::add('singlepic', array(&$this, 'render_singlepic'));
64
  }
65
 
66
  /**
@@ -78,7 +77,7 @@ class M_NextGen_Basic_Singlepic extends C_Base_Module
78
 
79
  function render_singlepic($params, $inner_content=NULL)
80
  {
81
- $params['display_type'] = $this->_get_param('display_type', NEXTGEN_BASIC_SINGLEPIC_MODULE_NAME, $params);
82
  $params['image_ids'] = $this->_get_param('id', NULL, $params);
83
  unset($params['id']);
84
 
17
  NEXTGEN_BASIC_SINGLEPIC_MODULE_NAME,
18
  'NextGen Basic Singlepic',
19
  'Provides a singlepic gallery for NextGEN Gallery',
20
+ '1.9.6',
21
  'http://www.photocrati.com',
22
  'Photocrati Media',
23
  'http://www.photocrati.com'
43
  'A_NextGen_Basic_Singlepic_Mapper'
44
  );
45
 
46
+ // Provides the display settings form for the SinglePic display type
47
+ $this->get_registry()->add_adapter(
48
+ 'I_Form',
49
+ 'A_NextGen_Basic_SinglePic_Form',
50
+ $this->module_id
51
+ );
52
+
53
+ // Adds the setting forms
54
+ $this->get_registry()->add_adapter(
55
+ 'I_Form_Manager',
56
+ 'A_NextGen_Basic_SinglePic_Forms'
57
+ );
 
58
  }
59
 
60
  function _register_hooks()
61
  {
62
+ add_shortcode('singlepic', array(&$this, 'render_singlepic'));
63
  }
64
 
65
  /**
77
 
78
  function render_singlepic($params, $inner_content=NULL)
79
  {
80
+ $params['display_type'] = $this->_get_param('display_type', 'photocrati-nextgen_basic_singlepic', $params);
81
  $params['image_ids'] = $this->_get_param('id', NULL, $params);
82
  unset($params['id']);
83
 
products/photocrati_nextgen/modules/nextgen_basic_singlepic/static/nextgen_basic_singlepic.css CHANGED
@@ -9,7 +9,6 @@ max-width: 100%;
9
  .ngg-gallery-singlepic-image img {
10
  margin: 0;
11
  max-width: 100%;
12
- border: none;
13
  }
14
 
15
  .ngg-singlepic {
9
  .ngg-gallery-singlepic-image img {
10
  margin: 0;
11
  max-width: 100%;
 
12
  }
13
 
14
  .ngg-singlepic {
products/photocrati_nextgen/modules/nextgen_basic_singlepic/templates/nextgen_basic_singlepic.php CHANGED
@@ -14,9 +14,6 @@
14
 
15
  $width = isset($settings['width']) ? $settings['width'] : null;
16
  $height = isset($settings['height']) ? $settings['height'] : null;
17
-
18
- $width = intval($width);
19
- $height = intval($height);
20
 
21
  if ($width != null && $height != null)
22
  {
@@ -64,14 +61,9 @@
64
  ?>
65
  <a href="<?php echo esc_attr($settings['link']); ?>"
66
  title="<?php echo esc_attr($image->description)?>"
67
- data-src="<?php echo esc_attr($storage->get_image_url($image)); ?>"
68
- data-thumbnail="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>"
69
- data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>"
70
- data-title="<?php echo esc_attr($image->alttext); ?>"
71
- data-description="<?php echo esc_attr(stripslashes($image->description)); ?>"
72
- target='<?php echo esc_attr($target); ?>'
73
- <?php echo $effect_code ?>>
74
- <img class="ngg-singlepic"
75
  src="<?php echo $thumbnail_url; ?>"
76
  alt="<?php echo esc_attr($image->alttext); ?>"
77
  title="<?php echo esc_attr($image->alttext); ?>"
14
 
15
  $width = isset($settings['width']) ? $settings['width'] : null;
16
  $height = isset($settings['height']) ? $settings['height'] : null;
 
 
 
17
 
18
  if ($width != null && $height != null)
19
  {
61
  ?>
62
  <a href="<?php echo esc_attr($settings['link']); ?>"
63
  title="<?php echo esc_attr($image->description)?>"
64
+ data-image-id='<?php echo esc_attr($image->pid); ?>'
65
+ <?php echo $effect_code ?>>
66
+ <img class="ngg-singlepic"
 
 
 
 
 
67
  src="<?php echo $thumbnail_url; ?>"
68
  alt="<?php echo esc_attr($image->alttext); ?>"
69
  title="<?php echo esc_attr($image->alttext); ?>"
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_controller.php CHANGED
@@ -68,11 +68,12 @@ class A_NextGen_Basic_Tagcloud_Controller extends Mixin
68
  */
69
  function enqueue_frontend_resources($displayed_gallery)
70
  {
71
- $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
72
-
73
  wp_enqueue_style('photocrati-nextgen_basic_tagcloud-style', $this->get_static_url('photocrati-nextgen_basic_tagcloud#nextgen_basic_tagcloud.css'));
74
 
75
- $this->enqueue_ngg_styles();
 
 
 
76
  }
77
 
78
  }
68
  */
69
  function enqueue_frontend_resources($displayed_gallery)
70
  {
 
 
71
  wp_enqueue_style('photocrati-nextgen_basic_tagcloud-style', $this->get_static_url('photocrati-nextgen_basic_tagcloud#nextgen_basic_tagcloud.css'));
72
 
73
+ $cssfile = C_NextGen_Settings::get_instance()->CSSfile;
74
+ wp_enqueue_style('nggallery', NEXTGEN_GALLERY_NGGLEGACY_MOD_URL.'/css/'.$cssfile);
75
+
76
+ $this->call_parent('enqueue_frontend_resources', $displayed_gallery);
77
  }
78
 
79
  }
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php CHANGED
@@ -25,7 +25,6 @@ class A_NextGen_Basic_Tagcloud_Form extends Mixin_Display_Type_Form
25
  $mapper = $this->object->get_registry()->get_utility('I_Display_Type_Mapper');
26
  $display_types = $mapper->find_all();
27
  foreach ($display_types as $dt) {
28
- if (!isset($dt->name)) die(var_dump($dt));
29
  if (in_array($dt->name, $skip_types)) continue;
30
  $types[$dt->name] = str_replace('NextGEN Basic ', '', $dt->title);
31
  }
25
  $mapper = $this->object->get_registry()->get_utility('I_Display_Type_Mapper');
26
  $display_types = $mapper->find_all();
27
  foreach ($display_types as $dt) {
 
28
  if (in_array($dt->name, $skip_types)) continue;
29
  $types[$dt->name] = str_replace('NextGEN Basic ', '', $dt->title);
30
  }
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_mapper.php CHANGED
@@ -16,7 +16,7 @@ class Hook_NextGen_Basic_TagCloud_Defaults extends Hook
16
  {
17
  function set_defaults($entity)
18
  {
19
- if (isset($entity->name) && $entity->name == NEXTGEN_BASIC_TAG_CLOUD_MODULE_NAME) {
20
  $this->object->_set_default_value(
21
  $entity,
22
  'settings',
16
  {
17
  function set_defaults($entity)
18
  {
19
+ if ($entity->name == NEXTGEN_BASIC_TAG_CLOUD_MODULE_NAME) {
20
  $this->object->_set_default_value(
21
  $entity,
22
  'settings',
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_routes.php CHANGED
@@ -14,7 +14,7 @@ class A_NextGen_Basic_TagCloud_Routes extends Mixin
14
 
15
  function _add_nextgen_basic_tagcloud_routes()
16
  {
17
- $slug = '/'.C_NextGen_Settings::get_instance()->router_param_slug;
18
- $this->object->rewrite("{*}{$slug}{*}/tags/{\\w}{*}", "{1}{$slug}{2}/gallerytag--{3}{4}");
19
  }
20
  }
14
 
15
  function _add_nextgen_basic_tagcloud_routes()
16
  {
17
+ $slug = C_NextGen_Global_Settings::get_instance()->router_param_slug;
18
+ $this->object->rewrite("{$slug}{*}/tags/{\\w}{*}", "{$slug}{1}/gallerytag--{2}{3}");
19
  }
20
  }
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_urls.php CHANGED
@@ -48,7 +48,7 @@ class A_NextGen_Basic_TagCloud_Urls extends Mixin
48
  );
49
 
50
  // Get the settings manager
51
- $settings = C_NextGen_Settings::get_instance();
52
 
53
  // Create the regex pattern
54
  $sep = preg_quote($settings->router_param_separator, '#');
48
  );
49
 
50
  // Get the settings manager
51
+ $settings = C_NextGen_Global_Settings::get_instance();
52
 
53
  // Create the regex pattern
54
  $sep = preg_quote($settings->router_param_separator, '#');
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/class.taxonomy_controller.php DELETED
@@ -1,127 +0,0 @@
1
- <?php
2
-
3
- class C_Taxonomy_Controller extends C_MVC_Controller
4
- {
5
- static $_instances = array();
6
- protected $ngg_tag_detection_has_run = FALSE;
7
-
8
- /**
9
- * Returns an instance of this class
10
- *
11
- * @param string $context
12
- * @return C_Taxonomy_Controller
13
- */
14
- static function get_instance($context = FALSE)
15
- {
16
- if (!isset(self::$_instances[$context]))
17
- {
18
- $klass = get_class();
19
- self::$_instances[$context] = new $klass($context);
20
- }
21
- return self::$_instances[$context];
22
- }
23
-
24
- function define($context = FALSE)
25
- {
26
- parent::define($context);
27
- $this->implement('I_Taxonomy_Controller');
28
- }
29
-
30
- /**
31
- * Returns the rendered HTML of a gallery based on the provided tag
32
- *
33
- * @param string $tag
34
- * @return string
35
- */
36
- function index_action($tag)
37
- {
38
- $renderer = $this->object->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
39
- $output = $renderer->display_images(array(
40
- 'source' => 'tags',
41
- 'container_ids' => $tag,
42
- 'slug' => $tag,
43
- 'display_type' => NEXTGEN_GALLERY_BASIC_THUMBNAILS
44
- ));
45
-
46
- // This strips extra whitespace and strips newlines. For some reason this is especially
47
- // necessary on Wordpress taxonomy pages.
48
- return trim(preg_replace("/\s\s+/", " ", $output));
49
- }
50
-
51
- /**
52
- * Determines if the current page is /ngg_tag/{*}
53
- *
54
- * @param $posts Wordpress post objects
55
- * @return array Wordpress post objects
56
- */
57
- function detect_ngg_tag($posts, $wp_query_local)
58
- {
59
- global $wp;
60
- global $wp_query;
61
- $wp_query_orig = false;
62
-
63
- if ($wp_query_local != null && $wp_query_local != $wp_query) {
64
- $wp_query_orig = $wp_query;
65
- $wp_query = $wp_query_local;
66
- }
67
-
68
- // This appears to be necessary for multisite installations, but I can't imagine why. More hackery..
69
- $tag = (get_query_var('ngg_tag') ? get_query_var('ngg_tag') : get_query_var('name'));
70
-
71
- if (!$this->ngg_tag_detection_has_run // don't run more than once; necessary for certain themes
72
- && !is_admin() // will destroy 'view all posts' page without this
73
- && !empty($tag) // only run when a tag has been given to wordpress
74
- && (stripos($wp->request, 'ngg_tag') === 0 // make sure the query begins with /ngg_tag
75
- || (isset($wp_query->query_vars['page_id'])
76
- && $wp_query->query_vars['page_id'] === 'ngg_tag')
77
- )
78
- )
79
- {
80
- $this->ngg_tag_detection_has_run = TRUE;
81
-
82
- // Wordpress somewhat-correctly generates several notices, so silence them as they're really unnecessary
83
- if (!defined('WP_DEBUG') || !WP_DEBUG)
84
- error_reporting(0);
85
-
86
- // create in-code a fake post; we feed it back to Wordpress as the sole result of the "the_posts" filter
87
- $posts = NULL;
88
- $posts[] = $this->create_ngg_tag_post($tag);
89
-
90
- $wp_query->is_404 = FALSE;
91
- $wp_query->is_page = TRUE;
92
- $wp_query->is_singular = TRUE;
93
- $wp_query->is_home = FALSE;
94
- $wp_query->is_archive = FALSE;
95
- $wp_query->is_category = FALSE;
96
-
97
- unset($wp_query->query['error']);
98
- $wp_query->query_vars['error'] = '';
99
- }
100
-
101
- if ($wp_query_orig !== false) {
102
- $wp_query = $wp_query_orig;
103
- }
104
-
105
- return $posts;
106
- }
107
-
108
- function create_ngg_tag_post($tag)
109
- {
110
- $post = new stdClass;
111
- $post->post_author = FALSE;
112
- $post->post_name = 'ngg_tag';
113
- $post->guid = get_bloginfo('wpurl') . '/' . 'ngg_tag';
114
- $post->post_title = "Images tagged &quot;{$tag}&quot;";
115
- $post->post_content = $this->index_action($tag);
116
- $post->ID = FALSE;
117
- $post->post_type = 'page';
118
- $post->post_status = 'static';
119
- $post->comment_status = 'closed';
120
- $post->ping_status = 'closed';
121
- $post->comment_count = 0;
122
- $post->post_date = current_time('mysql');
123
- $post->post_date_gmt = current_time('mysql', 1);
124
-
125
- return($post);
126
- }
127
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/interface.taxonomy_controller.php DELETED
@@ -1,8 +0,0 @@
1
- <?php
2
-
3
- interface I_Taxonomy_Controller extends I_MVC_Controller
4
- {
5
- function index_action($tag);
6
- function detect_ngg_tag($posts);
7
- function create_ngg_tag_post($tag);
8
- }
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php CHANGED
@@ -17,7 +17,7 @@ class M_NextGen_Basic_Tagcloud extends C_Base_Module
17
  NEXTGEN_BASIC_TAG_CLOUD_MODULE_NAME,
18
  'NextGen Basic Tagcloud',
19
  'Provides a tagcloud for NextGEN Gallery',
20
- '0.5',
21
  'http://www.photocrati.com',
22
  'Photocrati Media',
23
  'http://www.photocrati.com'
@@ -27,10 +27,6 @@ class M_NextGen_Basic_Tagcloud extends C_Base_Module
27
  C_Photocrati_Installer::add_handler($this->module_id, 'C_NextGen_Basic_Tagcloud_Installer');
28
  }
29
 
30
- function _register_utilities()
31
- {
32
- $this->get_registry()->add_utility('I_Taxonomy_Controller', 'C_Taxonomy_Controller');
33
- }
34
 
35
  function _register_adapters()
36
  {
@@ -65,33 +61,23 @@ class M_NextGen_Basic_Tagcloud extends C_Base_Module
65
  'A_NextGen_Basic_TagCloud_Urls'
66
  );
67
 
68
- if (is_admin()) {
69
- // Adds a display settings form
70
- $this->get_registry()->add_adapter(
71
- 'I_Form',
72
- 'A_NextGen_Basic_TagCloud_Form',
73
- $this->module_id
74
- );
75
- // Provides the forms for the settings
76
- $this->get_registry()->add_adapter(
77
- 'I_Form_Manager',
78
- 'A_NextGen_Basic_TagCloud_Forms'
79
- );
80
- }
81
  }
82
 
83
  function _register_hooks()
84
  {
85
- C_NextGen_Shortcode_Manager::add('tagcloud', array(&$this, 'render_shortcode'));
86
-
87
- add_filter(
88
- 'the_posts',
89
- array(
90
- $this->get_registry()->get_utility('I_Taxonomy_Controller'),
91
- 'detect_ngg_tag'),
92
- -10,
93
- 2
94
- );
95
  }
96
 
97
  /**
@@ -117,7 +103,7 @@ class M_NextGen_Basic_Tagcloud extends C_Base_Module
117
  {
118
  $params['tagcloud'] = $this->_get_param('tagcloud', 'yes', $params);
119
  $params['source'] = $this->_get_param('source', 'tags', $params);
120
- $params['display_type'] = $this->_get_param('display_type', NEXTGEN_BASIC_TAG_CLOUD_MODULE_NAME, $params);
121
 
122
  $renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
123
  return $renderer->display_images($params, $inner_content);
@@ -133,9 +119,7 @@ class M_NextGen_Basic_Tagcloud extends C_Base_Module
133
  'C_NextGen_Basic_Tagcloud_Installer' => 'class.nextgen_basic_tagcloud_installer.php',
134
  'A_Nextgen_Basic_Tagcloud_Mapper' => 'adapter.nextgen_basic_tagcloud_mapper.php',
135
  'A_Nextgen_Basic_Tagcloud_Routes' => 'adapter.nextgen_basic_tagcloud_routes.php',
136
- 'A_Nextgen_Basic_Tagcloud_Urls' => 'adapter.nextgen_basic_tagcloud_urls.php',
137
- 'I_Taxonomy_Controller' => 'interface.taxonomy_controller.php',
138
- 'C_Taxonomy_Controller' => 'class.taxonomy_controller.php'
139
  );
140
  }
141
  }
17
  NEXTGEN_BASIC_TAG_CLOUD_MODULE_NAME,
18
  'NextGen Basic Tagcloud',
19
  'Provides a tagcloud for NextGEN Gallery',
20
+ '1.9.6',
21
  'http://www.photocrati.com',
22
  'Photocrati Media',
23
  'http://www.photocrati.com'
27
  C_Photocrati_Installer::add_handler($this->module_id, 'C_NextGen_Basic_Tagcloud_Installer');
28
  }
29
 
 
 
 
 
30
 
31
  function _register_adapters()
32
  {
61
  'A_NextGen_Basic_TagCloud_Urls'
62
  );
63
 
64
+ // Adds a display settings form
65
+ $this->get_registry()->add_adapter(
66
+ 'I_Form',
67
+ 'A_NextGen_Basic_TagCloud_Form',
68
+ $this->module_id
69
+ );
70
+
71
+ // Provides the forms for the settings
72
+ $this->get_registry()->add_adapter(
73
+ 'I_Form_Manager',
74
+ 'A_NextGen_Basic_TagCloud_Forms'
75
+ );
 
76
  }
77
 
78
  function _register_hooks()
79
  {
80
+ add_shortcode('tagcloud', array(&$this, 'render_shortcode'));
 
 
 
 
 
 
 
 
 
81
  }
82
 
83
  /**
103
  {
104
  $params['tagcloud'] = $this->_get_param('tagcloud', 'yes', $params);
105
  $params['source'] = $this->_get_param('source', 'tags', $params);
106
+ $params['display_type'] = $this->_get_param('display_type', 'photocrati-nextgen_basic_tagcloud', $params);
107
 
108
  $renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
109
  return $renderer->display_images($params, $inner_content);
119
  'C_NextGen_Basic_Tagcloud_Installer' => 'class.nextgen_basic_tagcloud_installer.php',
120
  'A_Nextgen_Basic_Tagcloud_Mapper' => 'adapter.nextgen_basic_tagcloud_mapper.php',
121
  'A_Nextgen_Basic_Tagcloud_Routes' => 'adapter.nextgen_basic_tagcloud_routes.php',
122
+ 'A_Nextgen_Basic_Tagcloud_Urls' => 'adapter.nextgen_basic_tagcloud_urls.php'
 
 
123
  );
124
  }
125
  }
products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php CHANGED
@@ -133,35 +133,32 @@ class A_NextGen_Basic_Template_Form extends Mixin
133
 
134
  // create the 'gallery' object
135
  $gallery = new stdclass;
136
- $gallery->ID = $displayed_gallery->id();
 
 
137
  $gallery->name = stripslashes($orig_gallery->name);
138
  $gallery->title = stripslashes($orig_gallery->title);
139
  $gallery->description = html_entity_decode(stripslashes($orig_gallery->galdesc));
140
  $gallery->pageid = $orig_gallery->pageid;
141
-
142
- if ($displayed_gallery->display_settings['ajax_pagination'])
143
- $gallery_id = $displayed_gallery->transient_id;
144
- else
145
- $gallery_id = $displayed_gallery->id();
146
-
147
- $gallery->anchor = 'ngg-gallery-' . $gallery_id . '-' . $current_page;
148
  $gallery->displayed_gallery = &$displayed_gallery;
149
  $gallery->columns = @intval($displayed_gallery->display_settings['number_of_columns']);
150
  $gallery->imagewidth = ($gallery->columns > 0) ? 'style="width:' . floor(100 / $gallery->columns) . '%;"' : '';
151
 
152
- if (!empty($displayed_gallery->display_settings['show_slideshow_link'])) {
153
- $gallery->show_slideshow = TRUE;
154
- $gallery->slideshow_link = $params['slideshow_link'];
155
- $gallery->slideshow_link_text = $displayed_gallery->display_settings['slideshow_link_text'];
156
- }
157
- else $gallery->show_slideshow = FALSE;
 
158
 
159
- if (!empty($displayed_gallery->display_settings['show_piclens_link'])) {
160
- $gallery->show_piclens = true;
161
- $gallery->piclens_link = $params['piclens_link'];
162
- $gallery->piclens_link_text = $displayed_gallery->display_settings['piclens_link_text'];
 
163
  }
164
- else $gallery->show_piclens = FALSE;
165
 
166
  $gallery = apply_filters('ngg_gallery_object', $gallery, 4);
167
 
@@ -210,9 +207,5 @@ class A_NextGen_Basic_Template_Form extends Mixin
210
  $this->module_version,
211
  TRUE
212
  );
213
-
214
-
215
- if ($atp != null) {
216
- $atp->mark_script('ngg_template_settings');
217
  }
218
  }
133
 
134
  // create the 'gallery' object
135
  $gallery = new stdclass;
136
+ $gallery->ID = $orig_gallery->$gallery_key;
137
+ $gallery->show_slideshow = FALSE;
138
+ $gallery->show_piclens = FALSE;
139
  $gallery->name = stripslashes($orig_gallery->name);
140
  $gallery->title = stripslashes($orig_gallery->title);
141
  $gallery->description = html_entity_decode(stripslashes($orig_gallery->galdesc));
142
  $gallery->pageid = $orig_gallery->pageid;
143
+ $gallery->anchor = 'ngg-gallery-' . $orig_gallery->$gallery_key . '-' . $current_page;
 
 
 
 
 
 
144
  $gallery->displayed_gallery = &$displayed_gallery;
145
  $gallery->columns = @intval($displayed_gallery->display_settings['number_of_columns']);
146
  $gallery->imagewidth = ($gallery->columns > 0) ? 'style="width:' . floor(100 / $gallery->columns) . '%;"' : '';
147
 
148
+ if (is_integer($gallery->ID))
149
+ {
150
+ if (!empty($displayed_gallery->display_settings['alternative_view'])) {
151
+ $gallery->show_slideshow = TRUE;
152
+ $gallery->slideshow_link = $params['alternative_view_link_url'];
153
+ $gallery->slideshow_link_text = $displayed_gallery->display_settings['alternative_view_link_text'];
154
+ }
155
 
156
+ if (!empty($displayed_gallery->display_settings['show_piclens_link'])) {
157
+ $gallery->show_piclens = true;
158
+ $gallery->piclens_link = $params['piclens_link'];
159
+ $gallery->piclens_link_text = $displayed_gallery->display_settings['piclens_link_text'];
160
+ }
161
  }
 
162
 
163
  $gallery = apply_filters('ngg_gallery_object', $gallery, 4);
164
 
207
  $this->module_version,
208
  TRUE
209
  );
 
 
 
 
210
  }
211
  }
products/photocrati_nextgen/modules/nextgen_basic_templates/class.legacy_template_locator.php CHANGED
@@ -38,8 +38,7 @@ class Mixin_Legacy_Template_Locator extends Mixin
38
  function get_template_directories()
39
  {
40
  return array(
41
- 'Child Theme' => get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'nggallery' . DIRECTORY_SEPARATOR,
42
- 'Parent Theme' => get_template_directory() . DIRECTORY_SEPARATOR . 'nggallery' . DIRECTORY_SEPARATOR,
43
  'NextGEN' => NGGALLERY_ABSPATH . 'view' . DIRECTORY_SEPARATOR
44
  );
45
  }
@@ -91,7 +90,7 @@ class Mixin_Legacy_Template_Locator extends Mixin
91
  }
92
  elseif (is_string($prefix))
93
  {
94
- $regex_iterator = new RegexIterator($iterator, "#(.*)[/\\\]{$prefix}\-?.*\.php$#i", RecursiveRegexIterator::GET_MATCH);
95
  }
96
  else {
97
  $regex_iterator = new RegexIterator($iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);
@@ -125,19 +124,19 @@ class Mixin_Legacy_Template_Locator extends Mixin
125
  $custom_template .= '.php';
126
 
127
  // Find the abspath of the template to render
128
- if (!@file_exists($custom_template))
129
  {
130
  foreach ($this->object->get_template_directories() as $dir) {
131
  if ($template_abspath)
132
  break;
133
  $filename = path_join($dir, $custom_template);
134
- if (@file_exists($filename))
135
  {
136
  $template_abspath = $filename;
137
  }
138
  elseif (strpos($custom_template, '-template') === FALSE) {
139
  $filename = path_join($dir, str_replace('.php', '', $custom_template) . '-template.php');
140
- if (@file_exists($filename))
141
  $template_abspath = $filename;
142
  }
143
  }
38
  function get_template_directories()
39
  {
40
  return array(
41
+ 'Overrides' => STYLESHEETPATH . DIRECTORY_SEPARATOR . 'nggallery' . DIRECTORY_SEPARATOR,
 
42
  'NextGEN' => NGGALLERY_ABSPATH . 'view' . DIRECTORY_SEPARATOR
43
  );
44
  }
90
  }
91
  elseif (is_string($prefix))
92
  {
93
+ $regex_iterator = new RegexIterator($iterator, "#(.*)/{$prefix}\-?.*\.php$#i", RecursiveRegexIterator::GET_MATCH);
94
  }
95
  else {
96
  $regex_iterator = new RegexIterator($iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);
124
  $custom_template .= '.php';
125
 
126
  // Find the abspath of the template to render
127
+ if (!file_exists($custom_template))
128
  {
129
  foreach ($this->object->get_template_directories() as $dir) {
130
  if ($template_abspath)
131
  break;
132
  $filename = path_join($dir, $custom_template);
133
+ if (file_exists($filename))
134
  {
135
  $template_abspath = $filename;
136
  }
137
  elseif (strpos($custom_template, '-template') === FALSE) {
138
  $filename = path_join($dir, str_replace('.php', '', $custom_template) . '-template.php');
139
+ if (file_exists($filename))
140
  $template_abspath = $filename;
141
  }
142
  }
products/photocrati_nextgen/modules/nextgen_basic_templates/module.nextgen_basic_templates.php CHANGED
@@ -15,7 +15,7 @@ class M_NextGen_Basic_Templates extends C_Base_Module
15
  'photocrati-nextgen_basic_templates',
16
  'NextGen Basic Templates',
17
  'Provides a NextGen-Legacy compatible thumbnail gallery for NextGEN Gallery',
18
- '0.2',
19
  'http://www.photocrati.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
15
  'photocrati-nextgen_basic_templates',
16
  'NextGen Basic Templates',
17
  'Provides a NextGen-Legacy compatible thumbnail gallery for NextGEN Gallery',
18
+ '0.1',
19
  'http://www.photocrati.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/nextgen_data/adapter.nextgen_data_factory.php CHANGED
@@ -2,27 +2,27 @@
2
 
3
  class A_NextGen_Data_Factory extends Mixin
4
  {
5
- function gallery($properties=array(), $mapper=FALSE, $context=FALSE)
6
  {
7
  return new C_Gallery($properties, $mapper, $context);
8
  }
9
 
10
 
11
- function gallery_image($properties=array(), $mapper=FALSE, $context=FALSE)
12
  {
13
  return new C_Image($properties, $mapper, $context);
14
  }
15
 
16
 
17
- function image($properties=array(), $mapper=FALSE, $context=FALSE)
18
  {
19
  return new C_Image($properties, $mapper, $context);
20
  }
21
 
22
 
23
- function album($properties=array(), $mapper=FALSE, $context=FALSE)
24
  {
25
- return new C_Album($properties, $mapper, $context);
26
  }
27
 
28
 
@@ -43,11 +43,6 @@ class A_NextGen_Data_Factory extends Mixin
43
  return new C_Gallery_Storage($context);
44
  }
45
 
46
- function extra_fields($properties=array(), $mapper=FALSE, $context=FALSE)
47
- {
48
- return new C_Datamapper_Model($mapper, $properties, $context);
49
- }
50
-
51
 
52
  function gallerystorage($context=FALSE)
53
  {
2
 
3
  class A_NextGen_Data_Factory extends Mixin
4
  {
5
+ function gallery($mapper=FALSE, $properties=array(), $context=FALSE)
6
  {
7
  return new C_Gallery($properties, $mapper, $context);
8
  }
9
 
10
 
11
+ function gallery_image($mapper=FALSE, $properties=array(), $context=FALSE)
12
  {
13
  return new C_Image($properties, $mapper, $context);
14
  }
15
 
16
 
17
+ function image($mapper=FALSE, $properties=array(), $context=FALSE)
18
  {
19
  return new C_Image($properties, $mapper, $context);
20
  }
21
 
22
 
23
+ function album($mapper=FALSE, $properties=array(), $context=FALSE)
24
  {
25
+ return new C_Album($mapper, $properties, $context);
26
  }
27
 
28
 
43
  return new C_Gallery_Storage($context);
44
  }
45
 
 
 
 
 
 
46
 
47
  function gallerystorage($context=FALSE)
48
  {
products/photocrati_nextgen/modules/nextgen_data/class.album.php CHANGED
@@ -5,7 +5,7 @@ class C_Album extends C_DataMapper_Model
5
  var $_mapper_interface = 'I_Album_Mapper';
6
 
7
 
8
- function define($properties=array(), $mapper=FALSE, $context=FALSE)
9
  {
10
  parent::define($mapper, $properties, $context);
11
  $this->add_mixin('Mixin_NextGen_Album_Instance_Methods');
@@ -18,17 +18,16 @@ class C_Album extends C_DataMapper_Model
18
  * @param bool|\C_DataMapper|\FALSE $mapper
19
  * @param array $properties
20
  */
21
- function initialize($properties=array(), $mapper=FALSE, $context=FALSE)
22
- {
23
 
24
- // Get the mapper is not specified
25
- if (!$mapper) {
26
- $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
27
- }
28
 
29
- // Initialize
30
- parent::initialize($mapper, $properties);
31
- }
32
  }
33
 
34
  /**
5
  var $_mapper_interface = 'I_Album_Mapper';
6
 
7
 
8
+ function define($mapper=FALSE, $properties=FALSE, $context=FALSE)
9
  {
10
  parent::define($mapper, $properties, $context);
11
  $this->add_mixin('Mixin_NextGen_Album_Instance_Methods');
18
  * @param bool|\C_DataMapper|\FALSE $mapper
19
  * @param array $properties
20
  */
21
+ function initialize($mapper=FALSE, $properties=array()) {
 
22
 
23
+ // Get the mapper is not specified
24
+ if (!$mapper) {
25
+ $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
26
+ }
27
 
28
+ // Initialize
29
+ parent::initialize($mapper, $properties);
30
+ }
31
  }
32
 
33
  /**
products/photocrati_nextgen/modules/nextgen_data/class.album_mapper.php CHANGED
@@ -4,38 +4,31 @@ class C_Album_Mapper extends C_CustomTable_DataMapper_Driver
4
  {
5
  static $_instances = array();
6
 
7
- function initialize($object_name=FALSE)
8
  {
9
- parent::initialize('ngg_album');
10
- }
11
-
12
- function define($context=FALSE, $not_used=FALSE)
13
- {
14
- // Define the context
15
  if (!is_array($context)) $context = array($context);
16
  array_push($context, 'album');
 
17
  $this->_primary_key_column = 'id';
18
 
19
- // Define the mapper
20
  parent::define('ngg_album', $context);
21
- $this->add_mixin('Mixin_NextGen_Table_Extras');
22
  $this->add_mixin('Mixin_Album_Mapper');
23
  $this->implement('I_Album_Mapper');
24
  $this->set_model_factory_method('album');
 
 
 
 
 
 
 
25
 
26
- // Define the columns
27
- $this->define_column('id', 'BIGINT', 0);
28
- $this->define_column('name', 'VARCHAR(255)');
29
- $this->define_column('slug', 'VARCHAR(255');
30
- $this->define_column('previewpic', 'BIGINT', 0);
31
- $this->define_column('albumdesc', 'TEXT');
32
- $this->define_column('sortorder', 'TEXT');
33
- $this->define_column('pageid', 'BIGINT', 0);
34
-
35
- // Mark the columns which should be unserialized
36
- $this->add_serialized_column('sortorder');
37
  }
38
 
 
39
  /**
40
  * Returns an instance of the album datamapper
41
  * @param bool|mixed $context
@@ -51,6 +44,19 @@ class C_Album_Mapper extends C_CustomTable_DataMapper_Driver
51
  }
52
  }
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
  /**
56
  * Provides album-specific methods for the datamapper
@@ -67,11 +73,29 @@ class Mixin_Album_Mapper extends Mixin
67
  return $entity->name;
68
  }
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  function _save_entity($entity)
71
  {
72
  $retval = $this->call_parent('_save_entity', $entity);
73
  if ($retval) {
74
- C_Photocrati_Cache::flush('displayed_gallery_rendering');
75
  }
76
  return $retval;
77
  }
4
  {
5
  static $_instances = array();
6
 
7
+ function define($context=FALSE)
8
  {
 
 
 
 
 
 
9
  if (!is_array($context)) $context = array($context);
10
  array_push($context, 'album');
11
+
12
  $this->_primary_key_column = 'id';
13
 
 
14
  parent::define('ngg_album', $context);
 
15
  $this->add_mixin('Mixin_Album_Mapper');
16
  $this->implement('I_Album_Mapper');
17
  $this->set_model_factory_method('album');
18
+ $this->add_post_hook(
19
+ '_convert_to_entity',
20
+ 'Unserialize Galleries',
21
+ 'Hook_Unserialize_Album_Galleries',
22
+ 'unserialize_galleries'
23
+ );
24
+ }
25
 
26
+ function initialize()
27
+ {
28
+ parent::initialize('ngg_album');
 
 
 
 
 
 
 
 
29
  }
30
 
31
+
32
  /**
33
  * Returns an instance of the album datamapper
34
  * @param bool|mixed $context
44
  }
45
  }
46
 
47
+ /**
48
+ * NextGEN stores all gallery ids for the album in a property called sortorder
49
+ */
50
+ class Hook_Unserialize_Album_Galleries extends Hook
51
+ {
52
+ function unserialize_galleries($entity)
53
+ {
54
+ if (isset($entity->sortorder) && is_string($entity->sortorder)) {
55
+ $entity->sortorder = $this->object->unserialize($entity->sortorder);
56
+ }
57
+ }
58
+ }
59
+
60
 
61
  /**
62
  * Provides album-specific methods for the datamapper
73
  return $entity->name;
74
  }
75
 
76
+ /**
77
+ * Override the save method to avoid trying to save the 'exclude' property
78
+ * to the database, which will fail since the column doesn't exist in the
79
+ * database.
80
+ * TODO: This is just a workaround and should be removed when we implement
81
+ * https://www.wrike.com/open.htm?id=8250095
82
+ * @param stdClass|C_DataMapper_Model $entity
83
+ * @return boolean
84
+ */
85
+ function _convert_to_table_data($entity)
86
+ {
87
+ $exclude = $entity->exclude;
88
+ unset($entity->exclude);
89
+ $retval = $this->call_parent('_convert_to_table_data', $entity);
90
+ $entity->exclude = $exclude;
91
+ return $retval;
92
+ }
93
+
94
  function _save_entity($entity)
95
  {
96
  $retval = $this->call_parent('_save_entity', $entity);
97
  if ($retval) {
98
+ C_Photocrati_Cache::flush();
99
  }
100
  return $retval;
101
  }
products/photocrati_nextgen/modules/nextgen_data/class.gallery.php CHANGED
@@ -8,22 +8,22 @@ class Mixin_NextGen_Gallery_Validation
8
  function validation()
9
  {
10
  // If a title is present, we can auto-populate some other properties
11
- if (($this->object->title)) {
12
 
13
  // If no name is present, use the title to generate one
14
- if (!($this->object->name)) {
15
  $this->object->name = sanitize_file_name( sanitize_title($this->object->title));
16
  $this->object->name = apply_filters('ngg_gallery_name', $this->object->name);
17
  }
18
 
19
  // If no slug is set, use the title to generate one
20
- if (!($this->object->slug)) {
21
  $this->object->slug = nggdb::get_unique_slug( sanitize_title($this->object->title), 'gallery' );
22
  }
23
  }
24
 
25
  // Set what will be the path to the gallery
26
- if (!($this->object->path))
27
  {
28
  $storage = $this->object->get_registry()->get_utility('I_Gallery_Storage');
29
  $this->object->path = $storage->get_upload_relpath($this->object);
@@ -50,7 +50,7 @@ class C_Gallery extends C_DataMapper_Model
50
  * Defines the interfaces and methods (through extensions and hooks)
51
  * that this class provides
52
  */
53
- function define($properties, $mapper=FALSE, $context=FALSE)
54
  {
55
  parent::define($mapper, $properties, $context);
56
  $this->add_mixin('Mixin_NextGen_Gallery_Validation');
@@ -63,21 +63,12 @@ class C_Gallery extends C_DataMapper_Model
63
  * @param C_DataMapper $mapper
64
  * @param string $context
65
  */
66
- function initialize($properties=array(), $mapper=FALSE, $context=FALSE)
67
- {
68
 
69
  // Get the mapper is not specified
70
  if (!$mapper) {
71
  $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
72
  }
73
-
74
- // Initialize
75
  parent::initialize($mapper, $properties);
76
  }
77
-
78
- function get_images()
79
- {
80
- $mapper = C_Image_Mapper::get_instance();
81
- return $mapper->select()->where(array('galleryid = %d', $this->gid))->order_by('sortorder')->run_query();
82
- }
83
  }
8
  function validation()
9
  {
10
  // If a title is present, we can auto-populate some other properties
11
+ if (isset($this->object->title)) {
12
 
13
  // If no name is present, use the title to generate one
14
+ if (!isset($this->object->name)) {
15
  $this->object->name = sanitize_file_name( sanitize_title($this->object->title));
16
  $this->object->name = apply_filters('ngg_gallery_name', $this->object->name);
17
  }
18
 
19
  // If no slug is set, use the title to generate one
20
+ if (!isset($this->object->slug)) {
21
  $this->object->slug = nggdb::get_unique_slug( sanitize_title($this->object->title), 'gallery' );
22
  }
23
  }
24
 
25
  // Set what will be the path to the gallery
26
+ if (empty($this->object->path))
27
  {
28
  $storage = $this->object->get_registry()->get_utility('I_Gallery_Storage');
29
  $this->object->path = $storage->get_upload_relpath($this->object);
50
  * Defines the interfaces and methods (through extensions and hooks)
51
  * that this class provides
52
  */
53
+ function define($properties, $mapper, $context=FALSE)
54
  {
55
  parent::define($mapper, $properties, $context);
56
  $this->add_mixin('Mixin_NextGen_Gallery_Validation');
63
  * @param C_DataMapper $mapper
64
  * @param string $context
65
  */
66
+ function initialize($properties = FALSE, $mapper=FALSE) {
 
67
 
68
  // Get the mapper is not specified
69
  if (!$mapper) {
70
  $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
71
  }
 
 
72
  parent::initialize($mapper, $properties);
73
  }
 
 
 
 
 
 
74
  }
products/photocrati_nextgen/modules/nextgen_data/class.gallery_mapper.php CHANGED
@@ -11,7 +11,7 @@ class C_Gallery_Mapper extends C_CustomTable_DataMapper_Driver
11
  * Define the object
12
  * @param string $context
13
  */
14
- function define($context=FALSE, $not_used=FALSE)
15
  {
16
  // Add 'gallery' context
17
  if (!is_array($context)) $context = array($context);
@@ -22,22 +22,11 @@ class C_Gallery_Mapper extends C_CustomTable_DataMapper_Driver
22
  // Continue defining the object
23
  parent::define('ngg_gallery', $context);
24
  $this->set_model_factory_method('gallery');
25
- $this->add_mixin('Mixin_NextGen_Table_Extras');
26
  $this->add_mixin('Mixin_Gallery_Mapper');
27
  $this->implement('I_Gallery_Mapper');
28
-
29
- // Define the columns
30
- $this->define_column('gid', 'BIGINT', 0);
31
- $this->define_column('name', 'VARCHAR(255)');
32
- $this->define_column('slug', 'VARCHAR(255');
33
- $this->define_column('path', 'TEXT');
34
- $this->define_column('title', 'TEXT');
35
- $this->define_column('pageid', 'INT', 0);
36
- $this->define_column('previewpic', 'INT', 0);
37
- $this->define_column('author', 'INT', 0);
38
  }
39
 
40
- function initialize($object_name=FALSE)
41
  {
42
  parent::initialize('ngg_gallery');
43
  }
@@ -75,7 +64,7 @@ class Mixin_Gallery_Mapper extends Mixin
75
 
76
  if ($retval) {
77
  do_action('ngg_created_new_gallery', $entity->{$entity->id_field});
78
- C_Photocrati_Cache::flush('displayed_gallery_rendering');
79
  }
80
 
81
  return $retval;
@@ -84,7 +73,7 @@ class Mixin_Gallery_Mapper extends Mixin
84
  function destroy($image)
85
  {
86
  $retval = $this->call_parent('destroy',$image);
87
- C_Photocrati_Cache::flush('displayed_gallery_rendering');
88
  return $retval;
89
  }
90
 
11
  * Define the object
12
  * @param string $context
13
  */
14
+ function define($context=FALSE)
15
  {
16
  // Add 'gallery' context
17
  if (!is_array($context)) $context = array($context);
22
  // Continue defining the object
23
  parent::define('ngg_gallery', $context);
24
  $this->set_model_factory_method('gallery');
 
25
  $this->add_mixin('Mixin_Gallery_Mapper');
26
  $this->implement('I_Gallery_Mapper');
 
 
 
 
 
 
 
 
 
 
27
  }
28
 
29
+ function initialize()
30
  {
31
  parent::initialize('ngg_gallery');
32
  }
64
 
65
  if ($retval) {
66
  do_action('ngg_created_new_gallery', $entity->{$entity->id_field});
67
+ C_Photocrati_Cache::flush();
68
  }
69
 
70
  return $retval;
73
  function destroy($image)
74
  {
75
  $retval = $this->call_parent('destroy',$image);
76
+ C_Photocrati_Cache::flush();
77
  return $retval;
78
  }
79
 
products/photocrati_nextgen/modules/nextgen_data/class.gallery_storage.php CHANGED
@@ -24,7 +24,7 @@ class Mixin_GalleryStorage extends Mixin
24
  if (!defined('GALLERYSTORAGE_DRIVER')) {
25
 
26
  // Get the datamapper configured in the database
27
- $factory_method = C_NextGen_Settings::get_instance()->gallerystorage_driver;
28
 
29
  // Define a constant and use this as the global gallerystorage driver,
30
  // unless running in a SimpleTest Environment
24
  if (!defined('GALLERYSTORAGE_DRIVER')) {
25
 
26
  // Get the datamapper configured in the database
27
+ $factory_method = C_NextGen_Global_Settings::get_instance()->gallerystorage_driver;
28
 
29
  // Define a constant and use this as the global gallerystorage driver,
30
  // unless running in a SimpleTest Environment
products/photocrati_nextgen/modules/nextgen_data/class.gallerystorage_driver_base.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- class E_UploadException extends E_NggErrorException
4
  {
5
  function __construct($message='', $code=NULL, $previous=NULL)
6
  {
@@ -9,20 +9,17 @@ class E_UploadException extends E_NggErrorException
9
  }
10
  }
11
 
12
- class E_InsufficientWriteAccessException extends E_NggErrorException
13
  {
14
  function __construct($message=FALSE, $filename=NULL, $code=NULL, $previous=NULL)
15
  {
16
  if (!$message) $message = "Could not write to file. Please check filesystem permissions.";
17
  if ($filename) $message .= " Filename: {$filename}";
18
- if (PHP_VERSION_ID >= 50300)
19
- parent::__construct($message, $code, $previous);
20
- else
21
- parent::__construct($message, $code);
22
  }
23
  }
24
 
25
- class E_NoSpaceAvailableException extends E_NggErrorException
26
  {
27
  function __construct($message='', $code=NULL, $previous=NULL)
28
  {
@@ -30,16 +27,6 @@ class E_NoSpaceAvailableException extends E_NggErrorException
30
  parent::__construct($message, $code, $previous);
31
  }
32
  }
33
-
34
- class E_No_Image_Library_Exception extends E_NggErrorException
35
- {
36
- function __construct($message='', $code=NULL, $previous=NULL)
37
- {
38
- if (!$message) $message = "The site does not support the GD Image library. Please ask your hosting provider to enable it.";
39
- parent::__construct($message, $code, $previous);
40
- }
41
- }
42
-
43
 
44
  class Mixin_GalleryStorage_Driver_Base extends Mixin
45
  {
@@ -109,7 +96,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
109
  {
110
  $retval = FALSE;
111
 
112
- if (@file_exists($abspath)) {
113
  $files = scandir($abspath);
114
  array_shift($files);
115
  array_shift($files);
@@ -119,7 +106,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
119
  else unlink($file_abspath);
120
  }
121
  rmdir($abspath);
122
- $retval = @file_exists($abspath);
123
  }
124
 
125
  return $retval;
@@ -268,9 +255,9 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
268
  * @param int|stdClass|C_Image $image
269
  * @return string
270
  */
271
- function get_full_url($image, $check_existance=FALSE)
272
  {
273
- return $this->object->get_image_url($image, 'full', $check_existance);
274
  }
275
 
276
  /**
@@ -316,7 +303,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
316
 
317
  $abspath = $this->object->get_image_abspath($image, $size);
318
 
319
- if (@file_exists($abspath))
320
  {
321
  $dims = getimagesize($abspath);
322
 
@@ -387,9 +374,9 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
387
  * An alias for get_full_abspath()
388
  * @param int|object $image
389
  */
390
- function get_original_abspath($image, $check_existance=FALSE)
391
  {
392
- return $this->object->get_image_abspath($image, 'full', $check_existance);
393
  }
394
 
395
  /**
@@ -417,9 +404,9 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
417
  * @param int|stdClass|C_Image $image
418
  * @return string
419
  */
420
- function get_original_url($image, $check_existance=FALSE)
421
  {
422
- return $this->object->get_image_url($image, 'full', $check_existance);
423
  }
424
 
425
  /**
@@ -500,19 +487,6 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
500
  return $retval;
501
  }
502
 
503
- function is_current_user_over_quota()
504
- {
505
- $retval = FALSE;
506
- $settings = C_NextGen_Settings::get_instance();
507
-
508
- if ((is_multisite()) && $settings->get('wpmuQuotaCheck')) {
509
- require_once(ABSPATH . 'wp-admin/includes/ms.php');
510
- $retval = upload_is_user_over_quota(FALSE);
511
- }
512
-
513
- return $retval;
514
- }
515
-
516
 
517
  /**
518
  * Uploads base64 file to a gallery
@@ -521,7 +495,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
521
  * @param type $filename specifies the name of the file
522
  * @return C_Image
523
  */
524
- function upload_base64_image($gallery, $data, $filename=FALSE, $image_id=FALSE)
525
  {
526
  $settings = C_NextGen_Settings::get_instance();
527
  $memory_limit = intval(ini_get('memory_limit'));
@@ -530,9 +504,11 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
530
  $retval = NULL;
531
  if (($gallery_id = $this->object->_get_gallery_id($gallery))) {
532
 
533
- if ($this->object->is_current_user_over_quota()) {
534
- $message = sprintf(__('Sorry, you have used your space allocation. Please delete some files to upload more files.', 'nggallery'));
535
- throw new E_NoSpaceAvailableException($message);
 
 
536
  }
537
 
538
  // Get path information. The use of get_upload_abspath() might
@@ -542,36 +518,28 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
542
  $upload_dir = $this->object->get_upload_abspath($gallery);
543
 
544
  // Perhaps a filename was given instead of base64 data?
545
- if ($data[0] == '/' && @file_exists($data)) {
546
  if (!$filename) $filename = basename($data);
547
  $data = file_get_contents($data);
548
  }
549
 
550
  // Determine filenames
551
  $filename = $filename ? sanitize_title_with_dashes($filename) : uniqid('nextgen-gallery');
552
- if (preg_match("/\-(png|jpg|gif|jpeg)$/i", $filename, $match)) {
553
- $filename = str_replace($match[0], '.'.$match[1], $filename);
554
- }
555
  $abs_filename = path_join($upload_dir, $filename);
556
 
557
- // Create or retrieve the image object
558
- $image = NULL;
559
- if ($image_id) {
560
- $image = $this->object->_image_mapper->find($image_id, TRUE);
561
- unset($image->meta_data['saved']);
562
- }
563
- if (!$image) $image = $this->object->_image_mapper->create();
564
- $retval = $image;
565
-
566
- // Create or update the database record
567
- $image->alttext = sanitize_title_with_dashes(basename($filename, '.' . pathinfo($filename, PATHINFO_EXTENSION)));
568
  $image->galleryid = $this->object->_get_gallery_id($gallery);
569
  $image->filename = $filename;
570
- $image->image_slug = nggdb::get_unique_slug( sanitize_title_with_dashes( $image->alttext ), 'image' );
571
  $image_key = $this->object->_image_mapper->get_primary_key_column();
572
 
573
  // If we can't write to the directory, then there's no point in continuing
574
- if (!@file_exists($upload_dir)) @wp_mkdir_p($upload_dir);
575
  if (!is_writable($upload_dir)) {
576
  throw new E_InsufficientWriteAccessException(
577
  FALSE, $upload_dir, FALSE
@@ -582,6 +550,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
582
  if (($image_id = $this->object->_image_mapper->save($image))) {
583
  try {
584
  // Try writing the image
 
585
  $fp = fopen($abs_filename, 'w');
586
  fwrite($fp, $data);
587
  fclose($fp);
@@ -627,12 +596,6 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
627
  array($image->$image_key)
628
  );
629
  }
630
- catch(E_No_Image_Library_Exception $ex) {
631
- throw $ex;
632
- }
633
- catch(E_Clean_Exit $ex) {
634
- // pass
635
- }
636
  catch(Exception $ex) {
637
  throw new E_InsufficientWriteAccessException(
638
  FALSE, $abs_filename, FALSE, $ex
@@ -648,24 +611,15 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
648
  return $retval;
649
  }
650
 
651
- function import_gallery_from_fs($abspath, $gallery_id=FALSE, $move_files=TRUE)
652
  {
653
  $retval = FALSE;
654
- if (@file_exists($abspath)) {
655
 
656
  // Ensure that this folder has images
657
- $files_all = scandir($abspath);
658
- $files = array();
659
-
660
- // first perform some filtering on file list
661
- foreach ($files_all as $file)
662
- {
663
- if ($file == '.' || $file == '..')
664
- continue;
665
-
666
- $files[] = $file;
667
- }
668
-
669
  if (!empty($files)) {
670
 
671
  // Get needed utilities
@@ -674,7 +628,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
674
 
675
  // Sometimes users try importing a directory, which actually has all images under another directory
676
  $first_file_abspath = $fs->join_paths($abspath, $files[0]);
677
- if (is_dir($first_file_abspath) && count($files) == 1) return $this->import_gallery_from_fs($first_file_abspath, $gallery_id, $move_files);
678
 
679
  // If no gallery has been specified, then use the directory name as the gallery name
680
  if (!$gallery_id) {
@@ -682,10 +636,6 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
682
  $gallery = $gallery_mapper->create(array(
683
  'title' => basename($abspath),
684
  ));
685
-
686
- if (!$move_files) {
687
- $gallery->path = str_ireplace(ABSPATH, '', $abspath);
688
- }
689
 
690
  // Save the gallery
691
  if ($gallery->save()) $gallery_id = $gallery->id();
@@ -697,82 +647,15 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
697
  foreach ($files as $file) {
698
  if (!preg_match("/\.(jpg|jpeg|gif|png)/i", $file)) continue;
699
  $file_abspath = $fs->join_paths($abspath, $file);
700
- $image = null;
701
-
702
- if ($move_files) {
703
- $image = $this->object->upload_base64_image(
704
- $gallery_id,
705
- file_get_contents($file_abspath),
706
- str_replace(' ', '_', $file)
707
- );
708
- }
709
- else {
710
- // Create the database record ... TODO cleanup, some duplication here from upload_base64_image
711
- $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
712
- $image = $factory->create('image');
713
- $image->alttext = sanitize_title_with_dashes(basename($file_abspath, '.' . pathinfo($file_abspath, PATHINFO_EXTENSION)));
714
- $image->galleryid = $this->object->_get_gallery_id($gallery_id);
715
- $image->filename = basename($file_abspath);
716
- $image->image_slug = nggdb::get_unique_slug( sanitize_title_with_dashes( $image->alttext ), 'image' );
717
- $image_key = $this->object->_image_mapper->get_primary_key_column();
718
- $abs_filename = $file_abspath;
719
-
720
- if (($image_id = $this->object->_image_mapper->save($image))) {
721
- try {
722
- // backup and image resizing should have already been performed, better to avoid
723
- # if ($settings->imgBackup)
724
- # $this->object->backup_image($image);
725
-
726
- # if ($settings->imgAutoResize)
727
- # $this->object->generate_image_clone(
728
- # $abs_filename,
729
- # $abs_filename,
730
- # $this->object->get_image_size_params($image_id, 'full')
731
- # );
732
-
733
- // Ensure that fullsize dimensions are added to metadata array
734
- $dimensions = getimagesize($abs_filename);
735
- $full_meta = array(
736
- 'width' => $dimensions[0],
737
- 'height' => $dimensions[1]
738
- );
739
- if (!isset($image->meta_data) OR (is_string($image->meta_data) && strlen($image->meta_data) == 0)) {
740
- $image->meta_data = array();
741
- }
742
- $image->meta_data = array_merge($image->meta_data, $full_meta);
743
- $image->meta_data['full'] = $full_meta;
744
-
745
- // Generate a thumbnail for the image
746
- $this->object->generate_thumbnail($image);
747
-
748
- // Set gallery preview image if missing
749
- $this->object->get_registry()->get_utility('I_Gallery_Mapper')->set_preview_image($gallery, $image_id, TRUE);
750
-
751
- // Notify other plugins that an image has been added
752
- do_action('ngg_added_new_image', $image);
753
-
754
- // delete dirsize after adding new images
755
- delete_transient( 'dirsize_cache' );
756
-
757
- // Seems redundant to above hook. Maintaining for legacy purposes
758
- do_action(
759
- 'ngg_after_new_images_added',
760
- $gallery_id,
761
- array($image->$image_key)
762
- );
763
- }
764
- catch(Exception $ex) {
765
- throw new E_InsufficientWriteAccessException(
766
- FALSE, $abs_filename, FALSE, $ex
767
- );
768
- }
769
- }
770
- else throw new E_InvalidEntityException();
771
- }
772
-
773
- $retval['image_ids'][] = $image->{$image->id_field};
774
  }
775
 
 
776
  // Add the gallery name to the result
777
  $gallery = $gallery_mapper->find($gallery_id);
778
  $retval['gallery_name'] = $gallery->title;
@@ -812,7 +695,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
812
  $result = NULL;
813
 
814
  // Ensure we have a valid image
815
- if ($image_path && @file_exists($image_path))
816
  {
817
  // Ensure target directory exists, but only create 1 subdirectory
818
  $image_dir = dirname($image_path);
@@ -1158,11 +1041,6 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
1158
  $crop_frame = isset($params['crop_frame']) ? $params['crop_frame'] : NULL;
1159
  $destpath = NULL;
1160
  $thumbnail = NULL;
1161
- $quality = 100;
1162
-
1163
- // Do this before anything else can modify the original -- $detailed_size
1164
- // may hold IPTC metadata we need to write to our clone
1165
- $size = getimagesize($image_path, $detailed_size);
1166
 
1167
  $result = $this->object->calculate_image_clone_result($image_path, $clone_path, $params);
1168
 
@@ -1170,7 +1048,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
1170
  $settings = C_NextGen_Settings::get_instance();
1171
 
1172
  // Ensure we have a valid image
1173
- if ($image_path && @file_exists($image_path) && $result != null && !isset($result['error']))
1174
  {
1175
  $image_dir = dirname($image_path);
1176
  $clone_path = $result['clone_path'];
@@ -1180,7 +1058,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
1180
  $format_list = $this->object->get_image_format_list();
1181
 
1182
  // Ensure target directory exists, but only create 1 subdirectory
1183
- if (!@file_exists($clone_dir))
1184
  {
1185
  if (strtolower(realpath($image_dir)) != strtolower(realpath($clone_dir)))
1186
  {
@@ -1231,7 +1109,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
1231
  }
1232
 
1233
  // We successfully generated the thumbnail
1234
- if (is_string($destpath) && (@file_exists($destpath) || $thumbnail != null))
1235
  {
1236
  if ($clone_format != null)
1237
  {
@@ -1260,7 +1138,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
1260
  $destpath_basename = $destpath_info['filename'];
1261
  $destpath_new = $destpath_dir . DIRECTORY_SEPARATOR . $destpath_basename . $clone_format_extension_str;
1262
 
1263
- if ((@file_exists($destpath) && rename($destpath, $destpath_new)) || $thumbnail != null)
1264
  {
1265
  $destpath = $destpath_new;
1266
  }
1
  <?php
2
 
3
+ class E_UploadException extends RuntimeException
4
  {
5
  function __construct($message='', $code=NULL, $previous=NULL)
6
  {
9
  }
10
  }
11
 
12
+ class E_InsufficientWriteAccessException extends RuntimeException
13
  {
14
  function __construct($message=FALSE, $filename=NULL, $code=NULL, $previous=NULL)
15
  {
16
  if (!$message) $message = "Could not write to file. Please check filesystem permissions.";
17
  if ($filename) $message .= " Filename: {$filename}";
18
+ parent::__construct($message, $code, $previous);
 
 
 
19
  }
20
  }
21
 
22
+ class E_NoSpaceAvailableException extends RuntimeException
23
  {
24
  function __construct($message='', $code=NULL, $previous=NULL)
25
  {
27
  parent::__construct($message, $code, $previous);
28
  }
29
  }
 
 
 
 
 
 
 
 
 
 
30
 
31
  class Mixin_GalleryStorage_Driver_Base extends Mixin
32
  {
96
  {
97
  $retval = FALSE;
98
 
99
+ if (file_exists($abspath)) {
100
  $files = scandir($abspath);
101
  array_shift($files);
102
  array_shift($files);
106
  else unlink($file_abspath);
107
  }
108
  rmdir($abspath);
109
+ $retval = file_exists($abspath);
110
  }
111
 
112
  return $retval;
255
  * @param int|stdClass|C_Image $image
256
  * @return string
257
  */
258
+ function get_full_url($image)
259
  {
260
+ return $this->object->get_image_url($image, 'full');
261
  }
262
 
263
  /**
303
 
304
  $abspath = $this->object->get_image_abspath($image, $size);
305
 
306
+ if (file_exists($abspath))
307
  {
308
  $dims = getimagesize($abspath);
309
 
374
  * An alias for get_full_abspath()
375
  * @param int|object $image
376
  */
377
+ function get_original_abspath($image)
378
  {
379
+ return $this->object->get_image_abspath($image, 'full');
380
  }
381
 
382
  /**
404
  * @param int|stdClass|C_Image $image
405
  * @return string
406
  */
407
+ function get_original_url($image)
408
  {
409
+ return $this->object->get_image_url($image, 'full');
410
  }
411
 
412
  /**
487
  return $retval;
488
  }
489
 
 
 
 
 
 
 
 
 
 
 
 
 
 
490
 
491
  /**
492
  * Uploads base64 file to a gallery
495
  * @param type $filename specifies the name of the file
496
  * @return C_Image
497
  */
498
+ function upload_base64_image($gallery, $data, $filename=FALSE)
499
  {
500
  $settings = C_NextGen_Settings::get_instance();
501
  $memory_limit = intval(ini_get('memory_limit'));
504
  $retval = NULL;
505
  if (($gallery_id = $this->object->_get_gallery_id($gallery))) {
506
 
507
+ // Ensure that there is capacity available
508
+ if ( (is_multisite()) && nggWPMU::wpmu_enable_function('wpmuQuotaCheck')) {
509
+ if (upload_is_user_over_quota(FALSE)) {
510
+ throw new E_NoSpaceAvailableException();
511
+ }
512
  }
513
 
514
  // Get path information. The use of get_upload_abspath() might
518
  $upload_dir = $this->object->get_upload_abspath($gallery);
519
 
520
  // Perhaps a filename was given instead of base64 data?
521
+ if ($data[0] == '/' && file_exists($data)) {
522
  if (!$filename) $filename = basename($data);
523
  $data = file_get_contents($data);
524
  }
525
 
526
  // Determine filenames
527
  $filename = $filename ? sanitize_title_with_dashes($filename) : uniqid('nextgen-gallery');
528
+ if (preg_match("/\-(png|jpg|gif|jpeg)$/i", $filename, $match)) {
529
+ $filename = str_replace($match[0], '.'.$match[1], $filename);
530
+ }
531
  $abs_filename = path_join($upload_dir, $filename);
532
 
533
+ // Create the database record
534
+ $factory = $this->object->get_registry()->get_utility('I_Component_Factory');
535
+ $retval = $image = $factory->create('image');
536
+ $image->alttext = sanitize_title_with_dashes($filename);
 
 
 
 
 
 
 
537
  $image->galleryid = $this->object->_get_gallery_id($gallery);
538
  $image->filename = $filename;
 
539
  $image_key = $this->object->_image_mapper->get_primary_key_column();
540
 
541
  // If we can't write to the directory, then there's no point in continuing
542
+ if (!file_exists($upload_dir)) @wp_mkdir_p($upload_dir);
543
  if (!is_writable($upload_dir)) {
544
  throw new E_InsufficientWriteAccessException(
545
  FALSE, $upload_dir, FALSE
550
  if (($image_id = $this->object->_image_mapper->save($image))) {
551
  try {
552
  // Try writing the image
553
+ if (!file_exists($upload_dir)) wp_mkdir_p($upload_dir);
554
  $fp = fopen($abs_filename, 'w');
555
  fwrite($fp, $data);
556
  fclose($fp);
596
  array($image->$image_key)
597
  );
598
  }
 
 
 
 
 
 
599
  catch(Exception $ex) {
600
  throw new E_InsufficientWriteAccessException(
601
  FALSE, $abs_filename, FALSE, $ex
611
  return $retval;
612
  }
613
 
614
+ function import_gallery_from_fs($abspath, $gallery_id=FALSE)
615
  {
616
  $retval = FALSE;
617
+ if (file_exists($abspath)) {
618
 
619
  // Ensure that this folder has images
620
+ $files = scandir($abspath);
621
+ array_shift($files);
622
+ array_shift($files);
 
 
 
 
 
 
 
 
 
623
  if (!empty($files)) {
624
 
625
  // Get needed utilities
628
 
629
  // Sometimes users try importing a directory, which actually has all images under another directory
630
  $first_file_abspath = $fs->join_paths($abspath, $files[0]);
631
+ if (is_dir($first_file_abspath)) return $this->import_gallery_from_fs($first_file_abspath, $gallery_id);
632
 
633
  // If no gallery has been specified, then use the directory name as the gallery name
634
  if (!$gallery_id) {
636
  $gallery = $gallery_mapper->create(array(
637
  'title' => basename($abspath),
638
  ));
 
 
 
 
639
 
640
  // Save the gallery
641
  if ($gallery->save()) $gallery_id = $gallery->id();
647
  foreach ($files as $file) {
648
  if (!preg_match("/\.(jpg|jpeg|gif|png)/i", $file)) continue;
649
  $file_abspath = $fs->join_paths($abspath, $file);
650
+ $image = $this->object->upload_base64_image(
651
+ $gallery_id,
652
+ file_get_contents($file_abspath),
653
+ str_replace(' ', '_', $file)
654
+ );
655
+ $retval['image_ids'][] = $image->{$image->id_field};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
656
  }
657
 
658
+
659
  // Add the gallery name to the result
660
  $gallery = $gallery_mapper->find($gallery_id);
661
  $retval['gallery_name'] = $gallery->title;
695
  $result = NULL;
696
 
697
  // Ensure we have a valid image
698
+ if ($image_path && file_exists($image_path))
699
  {
700
  // Ensure target directory exists, but only create 1 subdirectory
701
  $image_dir = dirname($image_path);
1041
  $crop_frame = isset($params['crop_frame']) ? $params['crop_frame'] : NULL;
1042
  $destpath = NULL;
1043
  $thumbnail = NULL;
 
 
 
 
 
1044
 
1045
  $result = $this->object->calculate_image_clone_result($image_path, $clone_path, $params);
1046
 
1048
  $settings = C_NextGen_Settings::get_instance();
1049
 
1050
  // Ensure we have a valid image
1051
+ if ($image_path && file_exists($image_path) && $result != null && !isset($result['error']))
1052
  {
1053
  $image_dir = dirname($image_path);
1054
  $clone_path = $result['clone_path'];
1058
  $format_list = $this->object->get_image_format_list();
1059
 
1060
  // Ensure target directory exists, but only create 1 subdirectory
1061
+ if (!file_exists($clone_dir))
1062
  {
1063
  if (strtolower(realpath($image_dir)) != strtolower(realpath($clone_dir)))
1064
  {
1109
  }
1110
 
1111
  // We successfully generated the thumbnail
1112
+ if (is_string($destpath) && (file_exists($destpath) || $thumbnail != null))
1113
  {
1114
  if ($clone_format != null)
1115
  {
1138
  $destpath_basename = $destpath_info['filename'];
1139
  $destpath_new = $destpath_dir . DIRECTORY_SEPARATOR . $destpath_basename . $clone_format_extension_str;
1140
 
1141
+ if ((file_exists($destpath) && rename($destpath, $destpath_new)) || $thumbnail != null)
1142
  {
1143
  $destpath = $destpath_new;
1144
  }
products/photocrati_nextgen/modules/nextgen_data/class.image.php CHANGED
@@ -21,7 +21,7 @@ class C_Image extends C_DataMapper_Model
21
  {
22
  var $_mapper_interface = 'I_Image_Mapper';
23
 
24
- function define($properties=array(), $mapper=FALSE, $context=FALSE)
25
  {
26
  parent::define($mapper, $properties, $context);
27
  $this->add_mixin('Mixin_NextGen_Gallery_Image_Validation');
@@ -34,8 +34,7 @@ class C_Image extends C_DataMapper_Model
34
  * @param C_DataMapper $mapper
35
  * @param string $context
36
  */
37
- function initialize($properties=array(), $mapper=FALSE, $context=FALSE)
38
- {
39
 
40
  // Get the mapper is not specified
41
  if (!$mapper) {
21
  {
22
  var $_mapper_interface = 'I_Image_Mapper';
23
 
24
+ function define($properties=FALSE, $mapper=FALSE, $context=FALSE)
25
  {
26
  parent::define($mapper, $properties, $context);
27
  $this->add_mixin('Mixin_NextGen_Gallery_Image_Validation');
34
  * @param C_DataMapper $mapper
35
  * @param string $context
36
  */
37
+ function initialize($properties = FALSE, $mapper=FALSE, $context=FALSE) {
 
38
 
39
  // Get the mapper is not specified
40
  if (!$mapper) {
products/photocrati_nextgen/modules/nextgen_data/class.image_mapper.php CHANGED
@@ -8,38 +8,27 @@ class C_Image_Mapper extends C_CustomTable_DataMapper_Driver
8
  * Defines the gallery image mapper
9
  * @param type $context
10
  */
11
- function define($context=FALSE, $not_used=FALSE)
12
  {
13
  // Add 'attachment' context
14
  if (!is_array($context)) $context = array($context);
15
  array_push($context, 'attachment');
16
 
17
- // Define the mapper
18
- $this->_primary_key_column = 'pid';
19
  parent::define('ngg_pictures', $context);
20
- $this->add_mixin('Mixin_NextGen_Table_Extras');
21
  $this->add_mixin('Mixin_Gallery_Image_Mapper');
 
 
 
 
 
 
22
  $this->implement('I_Image_Mapper');
23
  $this->set_model_factory_method('image');
24
-
25
- // Define the columns
26
- $this->define_column('pid', 'BIGINT', 0);
27
- $this->define_column('image_slug', 'VARCHAR(255)');
28
- $this->define_column('post_id', 'BIGINT', 0);
29
- $this->define_column('galleryid', 'BIGINT', 0);
30
- $this->define_column('filename', 'VARCHAR(255)');
31
- $this->define_column('description', 'TEXT');
32
- $this->define_column('alttext', 'TEXT');
33
- $this->define_column('imagedate', 'DATETIME');
34
- $this->define_column('exclude', 'INT', 0);
35
- $this->define_column('sortorder', 'BIGINT', 0);
36
- $this->define_column('meta_data', 'TEXT');
37
-
38
- // Mark the columns which should be unserialized
39
- $this->add_serialized_column('meta_data');
40
  }
41
 
42
- function initialize($object_name=FALSE)
43
  {
44
  parent::initialize('ngg_pictures');
45
  }
@@ -73,11 +62,9 @@ class Mixin_Gallery_Image_Mapper extends Mixin
73
  $retval = $this->call_parent('_save_entity', $entity);
74
  if ($retval) {
75
  include_once(NGGALLERY_ABSPATH.'/admin/functions.php');
76
- $image_id = $this->get_id($entity);
77
- if (!isset($entity->meta_data['saved'])) {
78
- nggAdmin::import_MetaData($image_id);
79
- }
80
- C_Photocrati_Cache::flush('displayed_gallery_rendering');
81
  }
82
  return $retval;
83
  }
@@ -122,7 +109,7 @@ class Mixin_Gallery_Image_Mapper extends Mixin
122
  {
123
  // If not set already, we'll add an exclude property. This is used
124
  // by NextGEN Gallery itself, as well as the Attach to Post module
125
- $this->object->_set_default_value($entity, 'exclude', 0);
126
 
127
  // Ensure that the object has a description attribute
128
  $this->object->_set_default_value($entity, 'description', '');
@@ -152,9 +139,18 @@ class Mixin_Gallery_Image_Mapper extends Mixin
152
  // Ensure that the exclude parameter is an integer or boolean-evaluated
153
  // value
154
  if (is_string($entity->exclude)) $entity->exclude = intval($entity->exclude);
 
 
155
 
156
- // Trim alttext and description
157
- $entity->description = trim($entity->description);
158
- $entity->alttext = trim($entity->alttext);
 
 
 
 
 
 
 
159
  }
160
  }
8
  * Defines the gallery image mapper
9
  * @param type $context
10
  */
11
+ function define($context=FALSE)
12
  {
13
  // Add 'attachment' context
14
  if (!is_array($context)) $context = array($context);
15
  array_push($context, 'attachment');
16
 
17
+ $this->primary_key_column = 'pid';
18
+
19
  parent::define('ngg_pictures', $context);
 
20
  $this->add_mixin('Mixin_Gallery_Image_Mapper');
21
+ $this->add_post_hook(
22
+ '_convert_to_entity',
23
+ 'Unserialize Metadata',
24
+ 'Hook_Unserialize_Image_Metadata',
25
+ 'unserialize_metadata'
26
+ );
27
  $this->implement('I_Image_Mapper');
28
  $this->set_model_factory_method('image');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  }
30
 
31
+ function initialize()
32
  {
33
  parent::initialize('ngg_pictures');
34
  }
62
  $retval = $this->call_parent('_save_entity', $entity);
63
  if ($retval) {
64
  include_once(NGGALLERY_ABSPATH.'/admin/functions.php');
65
+ $image_id = $this->get_id($entity);;
66
+ nggAdmin::import_MetaData($image_id);
67
+ C_Photocrati_Cache::flush();
 
 
68
  }
69
  return $retval;
70
  }
109
  {
110
  // If not set already, we'll add an exclude property. This is used
111
  // by NextGEN Gallery itself, as well as the Attach to Post module
112
+ $this->object->_set_default_value($entity, 'exclude', FALSE);
113
 
114
  // Ensure that the object has a description attribute
115
  $this->object->_set_default_value($entity, 'description', '');
139
  // Ensure that the exclude parameter is an integer or boolean-evaluated
140
  // value
141
  if (is_string($entity->exclude)) $entity->exclude = intval($entity->exclude);
142
+ }
143
+ }
144
 
145
+ /**
146
+ * Unserializes the metadata when fetched from the database
147
+ */
148
+ class Hook_Unserialize_Image_Metadata extends Hook
149
+ {
150
+ function unserialize_metadata($entity)
151
+ {
152
+ if (isset($entity->meta_data) && is_string($entity->meta_data)) {
153
+ $entity->meta_data = $this->object->unserialize($entity->meta_data);
154
+ }
155
  }
156
  }
products/photocrati_nextgen/modules/nextgen_data/class.image_wrapper.php CHANGED
@@ -13,20 +13,19 @@ class C_Image_Wrapper
13
  public $_orig_image_id; // original image ID
14
  public $_cache_overrides; // allow for forcing variable values
15
  public $_legacy = FALSE;
16
- public $_displayed_gallery; // cached object
17
 
18
  /**
19
  * Constructor. Converts the image class into an array and fills from defaults any missing values
20
  *
21
  * @param object $gallery Individual result from displayed_gallery->get_entities()
22
- * @param object $displayed_gallery Displayed gallery -- MAY BE NULL
23
  * @param bool $legacy Whether the image source is from NextGen Legacy or NextGen
24
  * @return void
25
  */
26
- public function __construct($image, $displayed_gallery=NULL, $legacy = FALSE)
27
  {
28
  // for clarity
29
- if ($displayed_gallery && isset($displayed_gallery->display_settings['number_of_columns']))
30
  {
31
  $columns = $displayed_gallery->display_settings['number_of_columns'];
32
  }
@@ -83,11 +82,11 @@ class C_Image_Wrapper
83
 
84
  // cache the results
85
  ksort($image);
 
86
  $id_field = (!empty($image['id_field']) ? $image['id_field'] : 'pid');
87
- $this->_cache = (array) apply_filters('ngg_image_object', (object) $image, $image[$id_field]);
88
  $this->_orig_image_id = $image[$id_field];
 
89
  $this->_legacy = $legacy;
90
- $this->_displayed_gallery = $displayed_gallery;
91
  }
92
 
93
  public function __set($name, $value)
@@ -269,18 +268,8 @@ class C_Image_Wrapper
269
  return $this->_cache['previewpic'];
270
 
271
  case 'size':
272
- if (is_string($this->_orig_image->meta_data)) {
273
- $this->_orig_image = C_Image_Mapper::get_instance()->unserialize(
274
- $this->_orig_image->meta_data
275
- );
276
- }
277
- if (!isset($this->_orig_image->meta_data['thumbnail'])) {
278
- $storage = $this->get_storage();
279
- $storage->generate_thumbnail($this->_orig_image);
280
- }
281
- $w = $this->_orig_image->meta_data['thumbnail']['width'];
282
- $h = $this->_orig_image->meta_data['thumbnail']['height'];
283
-
284
  return "width='{$w}' height='{$h}'";
285
 
286
  case 'slug':
@@ -408,35 +397,27 @@ class C_Image_Wrapper
408
  */
409
  function get_thumbcode($gallery_name = '')
410
  {
411
- if (empty($this->_displayed_gallery))
 
 
 
 
 
 
412
  {
413
- $effect_code = C_NextGen_Settings::get_instance()->thumbCode;
414
- $effect_code = str_replace('%GALLERY_ID%', $gallery_name, $effect_code);
415
- $effect_code = str_replace('%GALLERY_NAME%', $gallery_name, $effect_code);
416
- $retval = $effect_code;
417
  }
418
- else {
419
- $controller = C_Component_Registry::get_instance()->get_utility('I_Display_Type_Controller');
420
- $retval = $controller->get_effect_code($this->_displayed_gallery);
421
 
422
- // This setting requires that we disable the effect code
423
- $ds = $this->_displayed_gallery->display_settings;
424
- if (isset($ds['use_imagebrowser_effect']) && $ds['use_imagebrowser_effect'])
425
- $retval = '';
 
 
 
426
  }
427
 
428
- $retval = apply_filters('ngg_get_thumbcode', $retval, $this);
429
-
430
- // ensure some additional data- fields are added; provides Pro-Lightbox compatibility
431
- $retval .= ' data-image-id="' . $this->__get('id') . '"';
432
- $retval .= ' data-src="' . $this->__get('imageURL') . '"';
433
- $retval .= ' data-thumbnail="' . $this->__get('thumbnailURL') . '"';
434
- $retval .= ' data-image-id="' . $this->__get('pid') . '"';
435
- $retval .= ' data-title="' . $this->__get('alttext') . '"';
436
- $retval .= ' data-description="' . $this->__get('description') . '"';
437
-
438
- $this->_cache['thumbcode'] = $retval;
439
- return $retval;
440
  }
441
 
442
  /**
13
  public $_orig_image_id; // original image ID
14
  public $_cache_overrides; // allow for forcing variable values
15
  public $_legacy = FALSE;
 
16
 
17
  /**
18
  * Constructor. Converts the image class into an array and fills from defaults any missing values
19
  *
20
  * @param object $gallery Individual result from displayed_gallery->get_entities()
21
+ * @param object $displayed_gallery Displayed gallery
22
  * @param bool $legacy Whether the image source is from NextGen Legacy or NextGen
23
  * @return void
24
  */
25
+ public function __construct($image, $displayed_gallery, $legacy = FALSE)
26
  {
27
  // for clarity
28
+ if (isset($displayed_gallery->display_settings['number_of_columns']))
29
  {
30
  $columns = $displayed_gallery->display_settings['number_of_columns'];
31
  }
82
 
83
  // cache the results
84
  ksort($image);
85
+ $this->_cache = $image;
86
  $id_field = (!empty($image['id_field']) ? $image['id_field'] : 'pid');
 
87
  $this->_orig_image_id = $image[$id_field];
88
+
89
  $this->_legacy = $legacy;
 
90
  }
91
 
92
  public function __set($name, $value)
268
  return $this->_cache['previewpic'];
269
 
270
  case 'size':
271
+ $w = $this->_orig_image->meta_data['thumbnail']['width'];
272
+ $h = $this->_orig_image->meta_data['thumbnail']['height'];
 
 
 
 
 
 
 
 
 
 
273
  return "width='{$w}' height='{$h}'";
274
 
275
  case 'slug':
397
  */
398
  function get_thumbcode($gallery_name = '')
399
  {
400
+ $settings = $this->get_settings();
401
+
402
+ // clean up the name
403
+ $gallery_name = sanitize_title($gallery_name);
404
+
405
+ // get the effect code
406
+ if ('none' != $settings->get('thumbEffect'))
407
  {
408
+ $this->_cache['thumbcode'] = stripslashes($settings->get('thumbCode'));
 
 
 
409
  }
 
 
 
410
 
411
+ // for highslide to a different approach
412
+ if ('highslide' == $settings->get('thumbEffect'))
413
+ {
414
+ $this->_cache['thumbcode'] = str_replace('%GALLERY_NAME%', "'{$gallery_name}'", $this->_cache['thumbcode']);
415
+ }
416
+ else {
417
+ $this->_cache['thumbcode'] = str_replace('%GALLERY_NAME%', $gallery_name, $this->_cache['thumbcode']);
418
  }
419
 
420
+ return apply_filters('ngg_get_thumbcode', $this->_cache['thumbcode'], $this);
 
 
 
 
 
 
 
 
 
 
 
421
  }
422
 
423
  /**
products/photocrati_nextgen/modules/nextgen_data/class.nextgen_data_installer.php CHANGED
@@ -1,36 +1,29 @@
1
  <?php
2
 
3
- class C_NextGen_Data_Installer extends C_NggLegacy_Installer
4
  {
5
  function get_registry()
6
  {
7
  return C_Component_Registry::get_instance();
8
  }
9
 
10
- function install()
11
- {
12
- }
13
-
14
  function uninstall($hard = FALSE)
15
  {
16
  if ($hard) {
17
- /* Yes: this is commented twice.
18
- // TODO for now never delete galleries/albums/content
19
- # $mappers = array(
20
- # $this->get_registry()->get_utility('I_Album_Mapper'),
21
- # $this->get_registry()->get_utility('I_Gallery_Mapper'),
22
- # $this->get_registry()->get_utility('I_Image_Mapper'),
23
- # );
24
 
25
- # foreach ($mappers as $mapper) {
26
- # $mapper->delete()->run_query();
27
- # }
28
 
29
- # // Remove ngg tags
30
- # global $wpdb;
31
- # $wpdb->query("DELETE FROM {$wpdb->terms} WHERE term_id IN (SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='ngg_tag')");
32
- # $wpdb->query("DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy='ngg_tag'");
33
- */
34
  }
35
  }
36
- }
1
  <?php
2
 
3
+ class C_NextGen_Data_Installer
4
  {
5
  function get_registry()
6
  {
7
  return C_Component_Registry::get_instance();
8
  }
9
 
 
 
 
 
10
  function uninstall($hard = FALSE)
11
  {
12
  if ($hard) {
13
+ $mappers = array(
14
+ $this->get_registry()->get_utility('I_Album_Mapper'),
15
+ $this->get_registry()->get_utility('I_Gallery_Mapper'),
16
+ $this->get_registry()->get_utility('I_Image_Mapper'),
17
+ );
 
 
18
 
19
+ foreach ($mappers as $mapper) {
20
+ $mapper->delete()->run_query();
21
+ }
22
 
23
+ // Remove ngg tags
24
+ global $wpdb;
25
+ $wpdb->query("DELETE FROM {$wpdb->terms} WHERE term_id IN (SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='ngg_tag')");
26
+ $wpdb->query("DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy='ngg_tag'");
 
27
  }
28
  }
29
+ }
products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php CHANGED
@@ -35,7 +35,7 @@ class C_NextGen_Metadata extends C_Component
35
 
36
  $this->file_path = $this->get_registry()->get_utility('I_Gallery_Storage')->get_image_abspath($this->image);
37
 
38
- if (!@file_exists($this->file_path))
39
  {
40
  return FALSE;
41
  }
@@ -85,7 +85,7 @@ class C_NextGen_Metadata extends C_Component
85
  $meta = $this->image->meta_data;
86
 
87
  // check if we already import the meta data to the database
88
- if (!is_array($meta) || !isset($meta['saved']) OR ($meta['saved'] != TRUE))
89
  {
90
  return FALSE;
91
  }
35
 
36
  $this->file_path = $this->get_registry()->get_utility('I_Gallery_Storage')->get_image_abspath($this->image);
37
 
38
+ if (!file_exists($this->file_path))
39
  {
40
  return FALSE;
41
  }
85
  $meta = $this->image->meta_data;
86
 
87
  // check if we already import the meta data to the database
88
+ if (!is_array($meta) || ($meta['saved'] != TRUE))
89
  {
90
  return FALSE;
91
  }
products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php CHANGED
@@ -16,32 +16,24 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
16
  {
17
  // Base upload path
18
  $retval = C_NextGen_Settings::get_instance()->gallerypath;
19
- $fs = $this->get_registry()->get_utility('I_Fs');
20
 
21
  // If a gallery has been specified, then we'll
22
  // append the slug
23
  if ($gallery) {
24
- if (!is_object($gallery)) {
 
 
 
25
  $gallery = $this->object->_get_gallery_id($gallery);
26
  $gallery = $this->object->_gallery_mapper->find($gallery);
27
- }
28
-
29
- if ($gallery) {
30
- $path = $gallery->path;
31
- $base = basename($path);
32
- $slug = $gallery->slug;
33
-
34
- if ($base == null) {
35
- $base = $slug;
36
- }
37
-
38
- $retval = $fs->join_paths($retval, $base);
39
  }
40
  }
41
 
42
  // We need to make this an absolute path
43
  if (strpos($retval, $fs->get_document_root()) === FALSE)
44
- $retval = $fs->join_paths($fs->get_document_root(), $retval);
45
 
46
  return $retval;
47
  }
@@ -65,7 +57,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
65
 
66
  // If a path was stored in the entity, then use that
67
  if ($gallery && isset($gallery->path)) {
68
- $retval = $fs->join_paths($fs->get_document_root(), $gallery->path);
69
  }
70
  elseif ($gallery) {
71
  // fallback to the upload abspath
@@ -84,7 +76,6 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
84
  function get_image_abspath($image, $size='full', $check_existance=FALSE)
85
  {
86
  $retval = NULL;
87
- $fs = $this->get_registry()->get_utility('I_Fs');
88
 
89
  // Ensure that we have a size
90
  if (!$size) {
@@ -107,7 +98,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
107
  case 'full':
108
  case 'original':
109
  case 'image':
110
- $retval = $fs->join_paths($gallery_path, $image->filename);
111
  break;
112
 
113
  case 'thumbnails':
@@ -123,13 +114,13 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
123
  //subdirectory of the same name within the gallery folder
124
  // gallery folder, but with the size appended to the filename
125
  default:
126
- $image_path = $fs->join_paths($gallery_path, $folder);
127
 
128
  // NGG 2.0 stores relative filenames in the meta data of
129
  // an image. It does this because it uses filenames
130
  // that follow conventional WordPress naming scheme.
131
  if (isset($image->meta_data) && isset($image->meta_data[$size]) && isset($image->meta_data[$size]['filename'])) {
132
- $image_path = $fs->join_paths($image_path, $image->meta_data[$size]['filename']);
133
  }
134
 
135
  // NGG Legacy does not store relative filenames in the
@@ -138,11 +129,11 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
138
  // WordPress conventions, NGG legacy does follow it's
139
  // own naming schema consistently so we can guess the path
140
  else {
141
- $image_path = $fs->join_paths($image_path, "{$prefix}_{$image->filename}");
142
  }
143
 
144
  // Should we check whether the image actually exists?
145
- if ($check_existance && @file_exists($image_path)) {
146
  $retval = $image_path;
147
  }
148
  elseif (!$check_existance) $retval = $image_path;
@@ -161,33 +152,16 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
161
  * @param string $size
162
  * @returns array
163
  */
164
- function get_image_url($image, $size='full', $check_existance=FALSE)
165
  {
166
- $retval = NULL;
167
- $fs = $this->get_registry()->get_utility('I_Fs');
168
- $router = $this->get_registry()->get_utility('I_Router');
169
- $abspath = $this->object->get_image_abspath($image, $size, $check_existance);
170
- if ($abspath) {
171
- $doc_root = $fs->get_document_root();
172
-
173
- if ($doc_root != null) {
174
- $doc_root = trailingslashit($doc_root);
175
- }
176
-
177
- $request_uri = str_replace(
178
- $doc_root,
179
- '',
180
- $abspath
181
- );
182
-
183
- if ($request_uri != null && $request_uri[0] != '/') {
184
- $request_uri = '/' . $request_uri;
185
- }
186
-
187
- $retval = $router->remove_url_segment('/index.php', $router->get_url($request_uri, FALSE, TRUE));
188
- }
189
-
190
- return $retval;
191
  }
192
 
193
  /**
@@ -406,7 +380,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
406
  // XXX change this? 'full' should be the resized path and 'original' the _backup path
407
  $backup_path = $this->object->get_backup_abspath($image);
408
 
409
- if (!@file_exists($backup_path))
410
  {
411
  @copy($filename, $backup_path);
412
  }
@@ -417,7 +391,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
417
  $existing_image_dir = dirname($existing_image_abpath);
418
 
419
  // removing the old thumbnail is actually not needed as generate_image_clone() will replace it, leaving commented in as reminder in case there are issues in the future
420
- if (@file_exists($existing_image_abpath)) {
421
  //unlink($existing_image_abpath);
422
  }
423
 
@@ -566,7 +540,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
566
  if ($size)
567
  {
568
  $abspath = $this->object->get_image_abspath($image, $size);
569
- if ($abspath && @file_exists($abspath))
570
  unlink($abspath);
571
  if (isset($image->meta_data) && isset($image->meta_data[$size]))
572
  {
@@ -591,7 +565,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
591
 
592
  // Delete each image
593
  foreach ($abspaths as $abspath) {
594
- if ($abspath && @file_exists($abspath))
595
  {
596
  unlink($abspath);
597
  }
@@ -622,7 +596,6 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
622
  $new_image_pids = array();
623
 
624
  $settings = C_NextGen_Settings::get_instance();
625
- $fs = $this->get_registry()->get_utility('I_Fs');
626
 
627
  // move_images() is a wrapper to this function so we implement both features here
628
  $func = $move ? 'rename' : 'copy';
@@ -655,10 +628,15 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
655
  }
656
 
657
  foreach ($images as $image) {
658
- if ($this->object->is_current_user_over_quota()) {
659
- $message = sprintf(__('Sorry, you have used your space allocation. Please delete some files to upload more files.', 'nggallery'));
660
- throw new E_NoSpaceAvailableException($message);
661
- }
 
 
 
 
 
662
 
663
  // Copy the db entry
664
  if (is_numeric($image))
@@ -699,12 +677,12 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
699
 
700
  $prefix = '';
701
  $prefix_count = 0;
702
- while (@file_exists($gallery->path . DIRECTORY_SEPARATOR . $new_path))
703
  {
704
  $prefix = 'copy_' . ($prefix_count++) . '_';
705
  $new_path = $prefix . $new_path;
706
  }
707
- $new_path = $fs->join_paths($gallery->path, $new_path);
708
 
709
  // Copy files
710
  if (!@$func($orig_path, $new_path))
@@ -773,7 +751,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin
773
  return ' <strong>' . esc_html($image->filename) . __(' is not writeable', 'nggallery') . '</strong>';
774
  }
775
 
776
- if (!@file_exists($path . '_backup'))
777
  {
778
  return ' <strong>' . __('Backup file does not exist', 'nggallery') . '</strong>';
779
  }
16
  {
17
  // Base upload path
18
  $retval = C_NextGen_Settings::get_instance()->gallerypath;
19
+ $fs = $this->get_registry()->get_utility('I_Fs');
20
 
21
  // If a gallery has been specified, then we'll
22
  // append the slug
23
  if ($gallery) {
24
+ if (is_object($gallery) && isset($gallery->slug)) {
25
+ $retval = path_join($retval, $gallery->slug);
26
+ }
27
+ else {
28
  $gallery = $this->object->_get_gallery_id($gallery);
29
  $gallery = $this->object->_gallery_mapper->find($gallery);
30
+ if ($gallery) $retval = path_join($retval, $gallery->slug);
 
 
 
 
 
 
 
 
 
 
 
31
  }
32
  }
33
 
34
  // We need to make this an absolute path
35
  if (strpos($retval, $fs->get_document_root()) === FALSE)
36
+ $retval = path_join($fs->get_document_root(), $retval);
37
 
38
  return $retval;
39
  }
57
 
58
  // If a path was stored in the entity, then use that
59
  if ($gallery && isset($gallery->path)) {
60
+ $retval = path_join($fs->get_document_root(), $gallery->path);
61
  }
62
  elseif ($gallery) {
63
  // fallback to the upload abspath
76
  function get_image_abspath($image, $size='full', $check_existance=FALSE)
77
  {
78
  $retval = NULL;
 
79
 
80
  // Ensure that we have a size
81
  if (!$size) {
98
  case 'full':
99
  case 'original':
100
  case 'image':
101
+ $retval = path_join($gallery_path, $image->filename);
102
  break;
103
 
104
  case 'thumbnails':
114
  //subdirectory of the same name within the gallery folder
115
  // gallery folder, but with the size appended to the filename
116
  default:
117
+ $image_path = path_join($gallery_path, $folder);
118
 
119
  // NGG 2.0 stores relative filenames in the meta data of
120
  // an image. It does this because it uses filenames
121
  // that follow conventional WordPress naming scheme.
122
  if (isset($image->meta_data) && isset($image->meta_data[$size]) && isset($image->meta_data[$size]['filename'])) {
123
+ $image_path = path_join($image_path, $image->meta_data[$size]['filename']);
124
  }
125
 
126
  // NGG Legacy does not store relative filenames in the
129
  // WordPress conventions, NGG legacy does follow it's
130
  // own naming schema consistently so we can guess the path
131
  else {
132
+ $image_path = path_join($image_path, "{$prefix}_{$image->filename}");
133
  }
134
 
135
  // Should we check whether the image actually exists?
136
+ if ($check_existance && file_exists($image_path)) {
137
  $retval = $image_path;
138
  }
139
  elseif (!$check_existance) $retval = $image_path;
152
  * @param string $size
153
  * @returns array
154
  */
155
+ function get_image_url($image, $size='full')
156
  {
157
+ $fs = $this->get_registry()->get_utility('I_Fs');
158
+ $router = $this->get_registry()->get_utility('I_Router');
159
+ $request_uri = str_replace(
160
+ trailingslashit($fs->get_document_root()),
161
+ '',
162
+ $this->object->get_image_abspath($image, $size)
163
+ );
164
+ return $router->get_url($request_uri, FALSE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  }
166
 
167
  /**
380
  // XXX change this? 'full' should be the resized path and 'original' the _backup path
381
  $backup_path = $this->object->get_backup_abspath($image);
382
 
383
+ if (!file_exists($backup_path))
384
  {
385
  @copy($filename, $backup_path);
386
  }
391
  $existing_image_dir = dirname($existing_image_abpath);
392
 
393
  // removing the old thumbnail is actually not needed as generate_image_clone() will replace it, leaving commented in as reminder in case there are issues in the future
394
+ if (file_exists($existing_image_abpath)) {
395
  //unlink($existing_image_abpath);
396
  }
397
 
540
  if ($size)
541
  {
542
  $abspath = $this->object->get_image_abspath($image, $size);
543
+ if ($abspath && file_exists($abspath))
544
  unlink($abspath);
545
  if (isset($image->meta_data) && isset($image->meta_data[$size]))
546
  {
565
 
566
  // Delete each image
567
  foreach ($abspaths as $abspath) {
568
+ if ($abspath && file_exists($abspath))
569
  {
570
  unlink($abspath);
571
  }
596
  $new_image_pids = array();
597
 
598
  $settings = C_NextGen_Settings::get_instance();
 
599
 
600
  // move_images() is a wrapper to this function so we implement both features here
601
  $func = $move ? 'rename' : 'copy';
628
  }
629
 
630
  foreach ($images as $image) {
631
+
632
+ // Ensure that there is capacity available
633
+ if ((is_multisite()) && $settings->get('wpmuQuotaCheck'))
634
+ {
635
+ if (upload_is_user_over_quota(FALSE)) {
636
+ $message .= sprintf(__('Sorry, you have used your space allocation. Please delete some files to upload more files.', 'nggallery'));
637
+ throw new E_NoSpaceAvailableException();
638
+ }
639
+ }
640
 
641
  // Copy the db entry
642
  if (is_numeric($image))
677
 
678
  $prefix = '';
679
  $prefix_count = 0;
680
+ while (file_exists($gallery->path . DIRECTORY_SEPARATOR . $new_path))
681
  {
682
  $prefix = 'copy_' . ($prefix_count++) . '_';
683
  $new_path = $prefix . $new_path;
684
  }
685
+ $new_path = path_join($gallery->path, $new_path);
686
 
687
  // Copy files
688
  if (!@$func($orig_path, $new_path))
751
  return ' <strong>' . esc_html($image->filename) . __(' is not writeable', 'nggallery') . '</strong>';
752
  }
753
 
754
+ if (!file_exists($path . '_backup'))
755
  {
756
  return ' <strong>' . __('Backup file does not exist', 'nggallery') . '</strong>';
757
  }
products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_thumbnail.php CHANGED
@@ -117,7 +117,7 @@ class C_NggLegacy_Thumbnail {
117
  if(!function_exists("gd_info")) {
118
  echo 'You do not have the GD Library installed. This class requires the GD library to function properly.' . "\n";
119
  echo 'visit http://us2.php.net/manual/en/ref.image.php for more information';
120
- throw new E_No_Image_Library_Exception();
121
  }
122
  //initialize variables
123
  $this->errmsg = '';
@@ -132,7 +132,7 @@ class C_NggLegacy_Thumbnail {
132
  $this->watermarkText = '';
133
 
134
  //check to see if file exists
135
- if(!@file_exists($this->fileName)) {
136
  $this->errmsg = 'File not found';
137
  $this->error = true;
138
  }
@@ -161,7 +161,7 @@ class C_NggLegacy_Thumbnail {
161
  }
162
 
163
  // increase memory-limit if possible, GD needs this for large images
164
- @ini_set('memory_limit', '512M');
165
 
166
  if($this->error == false) {
167
  // Check memory consumption if file exists
@@ -865,17 +865,7 @@ class C_NggLegacy_Thumbnail {
865
 
866
  // attempt adding a new word until the width is too large; then start a new line and start again
867
  foreach ($words as $word) {
868
- // sanitize the text being input; imagettftext() can be sensitive
869
- $TextSize = $this->ImageTTFBBoxDimensions(
870
- $wmSize,
871
- 0,
872
- $wmFontPath,
873
- $line . preg_replace(
874
- '~^(&([a-zA-Z0-9]);)~',
875
- htmlentities('${1}'),
876
- mb_convert_encoding($word, "HTML-ENTITIES", "UTF-8")
877
- )
878
- );
879
 
880
  if ($watermark_image_width == 0)
881
  $watermark_image_width = $TextSize['width'];
117
  if(!function_exists("gd_info")) {
118
  echo 'You do not have the GD Library installed. This class requires the GD library to function properly.' . "\n";
119
  echo 'visit http://us2.php.net/manual/en/ref.image.php for more information';
120
+ C_NextGEN_Bootstrap::shutdown();
121
  }
122
  //initialize variables
123
  $this->errmsg = '';
132
  $this->watermarkText = '';
133
 
134
  //check to see if file exists
135
+ if(!file_exists($this->fileName)) {
136
  $this->errmsg = 'File not found';
137
  $this->error = true;
138
  }
161
  }
162
 
163
  // increase memory-limit if possible, GD needs this for large images
164
+ // @ini_set('memory_limit', '128M');
165
 
166
  if($this->error == false) {
167
  // Check memory consumption if file exists
865
 
866
  // attempt adding a new word until the width is too large; then start a new line and start again
867
  foreach ($words as $word) {
868
+ $TextSize = $this->ImageTTFBBoxDimensions($wmSize, 0, $wmFontPath, $line . $word);
 
 
 
 
 
 
 
 
 
 
869
 
870
  if ($watermark_image_width == 0)
871
  $watermark_image_width = $TextSize['width'];
products/photocrati_nextgen/modules/nextgen_data/class.wordpress_gallerystorage_driver.php CHANGED
@@ -55,7 +55,7 @@ class Mixin_WordPress_GalleryStorage_Driver extends Mixin
55
  function get_image_abspath($image, $size='full')
56
  {
57
  return str_replace(
58
- $this->get_registry()->get_utility('I_Router')->get_base_url(TRUE),
59
  ABSPATH,
60
  $this->object->get_image_abspath($image, $size)
61
  );
55
  function get_image_abspath($image, $size='full')
56
  {
57
  return str_replace(
58
+ $this->get_registry()->get_utility('I_Router')->get_base_url(),
59
  ABSPATH,
60
  $this->object->get_image_abspath($image, $size)
61
  );
products/photocrati_nextgen/modules/nextgen_data/mixin.nextgen_table_extras.php DELETED
@@ -1,195 +0,0 @@
1
- <?php
2
-
3
- class Mixin_NextGen_Table_Extras extends Mixin
4
- {
5
- const CUSTOM_POST_NAME = __CLASS__;
6
-
7
- function initialize()
8
- {
9
- // Each record in a NextGEN Gallery table has an associated custom post in the wp_posts table
10
- $this->object->_custom_post_mapper = new C_CustomPost_DataMapper_Driver($this->object->get_object_name());
11
- $this->object->_custom_post_mapper->set_model_factory_method('extra_fields');
12
- }
13
-
14
- /**
15
- * Defines a column for the mapper
16
- * @param $name
17
- * @param $data_type
18
- * @param null $default_value
19
- * @param bool $extra
20
- */
21
- function define_column($name, $data_type, $default_value=NULL, $extra=FALSE)
22
- {
23
- $this->call_parent('define_column', $name, $data_type, $default_value);
24
- if ($extra) {
25
- $this->object->_columns[$name]['extra'] = TRUE;
26
- }
27
- else $this->object->_columns[$name]['extra'] = FALSE;
28
- }
29
-
30
- /**
31
- * Gets a list of all the extra columns defined for this table
32
- * @return array
33
- */
34
- function get_extra_columns()
35
- {
36
- $retval = array();
37
-
38
- foreach ($this->object->_columns as $key => $properties) {
39
- if ($properties['extra']) $retval[] = $key;
40
- }
41
-
42
- return $retval;
43
- }
44
-
45
- /**
46
- * Adds a column to the database
47
- * @param $column_name
48
- * @param $datatype
49
- * @param null $default_value
50
- */
51
- function _add_column($column_name, $datatype, $default_value=NULL)
52
- {
53
- $skip = FALSE;
54
- if (isset($this->object->_columns[$column_name]) and $this->object->_columns[$column_name]['extra']) {
55
- $skip = TRUE;
56
- }
57
- if (!$skip) $this->call_parent('_add_column', $column_name, $datatype, $default_value);
58
- }
59
-
60
- function create_custom_post_entity($entity)
61
- {
62
- $custom_post_entity = new stdClass;
63
-
64
- // If the custom post entity already exists then it needs
65
- // an ID
66
- if (isset($entity->custom_post_id)) $custom_post_entity->ID = $entity->custom_post_id;
67
-
68
- // If a property isn't a column for the table, then
69
- // it belongs to the custom post record
70
- foreach (get_object_vars($entity) as $key => $value) {
71
- if (!$this->object->has_column($key)) {
72
- unset($entity->$key);
73
- if ($this->object->has_defined_column($key) && $key != $this->object->get_primary_key_column())
74
- $custom_post_entity->$key = $value;
75
- }
76
- }
77
-
78
- // Used to help find these type of records
79
- $custom_post_entity->post_name = self::CUSTOM_POST_NAME;
80
-
81
- return $custom_post_entity;
82
- }
83
-
84
- /**
85
- * Gets the name of the WordPress option that holds the ID of the associated custom post ID record
86
- * @param $entity
87
- * @return string
88
- */
89
- function _get_option_name($entity)
90
- {
91
- $primary_key = $this->object->get_primary_key_column();
92
- return $this->get_table_name().'_'.$entity->$primary_key;
93
- }
94
-
95
- /**
96
- * Creates a new record in the custom table, as well as a custom post record
97
- * @param $entity
98
- */
99
- function _create($entity)
100
- {
101
- $retval = FALSE;
102
- $custom_post_entity = $this->create_custom_post_entity($entity);
103
-
104
- // Try persisting the custom post type record first
105
- if (($custom_post_id = $this->object->_custom_post_mapper->save($custom_post_entity))) {
106
-
107
- // Try saving the custom table record. If that fails, then destroy the previously
108
- // created custom post type record
109
- if (!($retval = $this->call_parent('_create', $entity))) {
110
- $this->object->_custom_post_mapper->destroy($custom_post_id);
111
- }
112
-
113
- // Add the custom post id property
114
- else {
115
- $option_name = $this->_get_option_name($entity);
116
- update_option($option_name, $custom_post_id);
117
- $entity->custom_post_id = $custom_post_id;
118
- }
119
- }
120
-
121
- return $retval;
122
- }
123
-
124
- // Updates a custom table record and it's associated custom post type record in the database
125
- function _update($entity)
126
- {
127
- $retval = FALSE;
128
- $custom_post_entity = $this->create_custom_post_entity($entity);
129
- $custom_post_id = $this->object->_custom_post_mapper->save($custom_post_entity);
130
- $retval = $this->call_parent('_update', $entity);
131
- $entity->custom_post_id = $custom_post_id;
132
- update_option($this->_get_option_name($entity), $custom_post_id);
133
- foreach ($this->get_extra_columns() as $key) {
134
- if (isset($custom_post_entity->$key)) $entity->$key = $custom_post_entity->$key;
135
- }
136
-
137
- return $retval;
138
- }
139
-
140
- function destroy($entity)
141
- {
142
- if (isset($entity->custom_post_id)) {
143
- wp_delete_post($entity->custom_post_id, TRUE);
144
- delete_option($this->_get_option_name($entity));
145
- }
146
-
147
- return $this->call_parent('destroy', $entity);
148
- }
149
-
150
- /**
151
- * Gets the generated query
152
- */
153
- function get_generated_query()
154
- {
155
- // Add extras column
156
- if ($this->object->is_select_statement()) {
157
- global $wpdb;
158
- $table_name = $this->object->get_table_name();
159
- $primary_key = "{$table_name}.{$this->object->get_primary_key_column()}";
160
- $this->object->group_by($primary_key);
161
- $sql = $this->call_parent('get_generated_query');
162
- $from = 'FROM `'.$this->object->get_table_name().'`';
163
- $sql = str_replace('FROM', ", `{$wpdb->options}`.`option_value` AS 'custom_post_id', GROUP_CONCAT(CONCAT_WS('@@', meta_key, meta_value)) AS 'extras' FROM", $sql);
164
- $sql = str_replace($from, "{$from} LEFT OUTER JOIN `{$wpdb->options}` ON `{$wpdb->options}`.option_name = CONCAT('{$table_name}_', {$primary_key}) LEFT OUTER JOIN `{$wpdb->postmeta}` ON `{$wpdb->postmeta}`.`post_id` = `{$wpdb->options}`.`option_value` ", $sql);
165
- }
166
- else $sql = $this->call_parent('get_generated_query');
167
-
168
- return $sql;
169
- }
170
-
171
- function _convert_to_entity($entity)
172
- {
173
- // Add extra columns to entity
174
- if (isset($entity->extras)) {
175
- $extras = $entity->extras;
176
- unset($entity->extras);
177
- foreach (explode(',', $extras) as $extra) {
178
- if ($extra) {
179
- list($key, $value) = explode('@@', $extra);
180
- if ($this->object->has_defined_column($key) && !isset($entity->key)) $entity->$key = $value;
181
- }
182
- }
183
- }
184
-
185
- // Cast custom_post_id as integer
186
- if (isset($entity->custom_post_id)) {
187
- $entity->custom_post_id = intval($entity->custom_post_id);
188
- }
189
- else $entity->custom_post_id = 0;
190
-
191
- $retval = $this->call_parent('_convert_to_entity', $entity);
192
-
193
- return $entity;
194
- }
195
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php CHANGED
@@ -15,7 +15,7 @@ class M_NextGen_Data extends C_Base_Module
15
  'photocrati-nextgen-data',
16
  'NextGEN Data Tier',
17
  "Provides a data tier for NextGEN gallery based on the DataMapper module",
18
- '0.4',
19
  'http://www.photocrati.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
@@ -61,7 +61,6 @@ class M_NextGen_Data extends C_Base_Module
61
  'C_Image_Wrapper' => 'class.image_wrapper.php',
62
  'C_Image_Wrapper_Collection' => 'class.image_wrapper_collection.php',
63
  'C_Nextgen_Metadata' => 'class.nextgen_metadata.php',
64
- 'Mixin_NextGen_Table_Extras' => 'mixin.nextgen_table_extras.php',
65
  'C_Ngglegacy_Gallerystorage_Driver' => 'class.ngglegacy_gallerystorage_driver.php',
66
  'C_Ngglegacy_Thumbnail' => 'class.ngglegacy_thumbnail.php',
67
  'C_Wordpress_Gallerystorage_Driver' => 'class.wordpress_gallerystorage_driver.php',
@@ -81,26 +80,8 @@ class M_NextGen_Data extends C_Base_Module
81
 
82
  function _register_hooks()
83
  {
84
- add_action('init', array(&$this, 'register_custom_post_types'));
85
  add_filter('posts_orderby', array($this, 'wp_query_order_by'), 10, 2);
86
  }
87
-
88
- function register_custom_post_types()
89
- {
90
- $types = array(
91
- 'ngg_album' => 'NextGEN Gallery - Album',
92
- 'ngg_gallery' => 'NexTGEN Gallery - Gallery',
93
- 'ngg_pictures' => 'NextGEN Gallery - Image',
94
- );
95
-
96
- foreach ($types as $type => $label) {
97
- register_post_type($type, array(
98
- 'label' => $label,
99
- 'publicly_queryable' => FALSE,
100
- 'exclude_from_search' => TRUE,
101
- ));
102
- }
103
- }
104
 
105
  function wp_query_order_by($order_by, $wp_query)
106
  {
15
  'photocrati-nextgen-data',
16
  'NextGEN Data Tier',
17
  "Provides a data tier for NextGEN gallery based on the DataMapper module",
18
+ '0.1',
19
  'http://www.photocrati.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
61
  'C_Image_Wrapper' => 'class.image_wrapper.php',
62
  'C_Image_Wrapper_Collection' => 'class.image_wrapper_collection.php',
63
  'C_Nextgen_Metadata' => 'class.nextgen_metadata.php',
 
64
  'C_Ngglegacy_Gallerystorage_Driver' => 'class.ngglegacy_gallerystorage_driver.php',
65
  'C_Ngglegacy_Thumbnail' => 'class.ngglegacy_thumbnail.php',
66
  'C_Wordpress_Gallerystorage_Driver' => 'class.wordpress_gallerystorage_driver.php',
80
 
81
  function _register_hooks()
82
  {
 
83
  add_filter('posts_orderby', array($this, 'wp_query_order_by'), 10, 2);
84
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
  function wp_query_order_by($order_by, $wp_query)
87
  {
products/photocrati_nextgen/modules/nextgen_gallery_display/adapter.displayed_gallery_related_element.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class A_Displayed_Gallery_Related_Element extends Mixin
4
+ {
5
+ function initialize()
6
+ {
7
+ $this->object->add_post_hook(
8
+ 'render_object',
9
+ 'Renders "related" link for the gallery',
10
+ get_class(),
11
+ 'render_related'
12
+ );
13
+ }
14
+
15
+ function _check_rendering($displayed_gallery, $template_id, $root_element)
16
+ {
17
+ $ret = $this->object->_check_addition_rendering($displayed_gallery, $template_id, $root_element, 'layout');
18
+
19
+ switch ($template_id)
20
+ {
21
+ case 'photocrati-nextgen_basic_album#compact':
22
+ case 'photocrati-nextgen_basic_album#extended':
23
+ case 'photocrati-nextgen_basic_tagcloud#nextgen_basic_tagcloud':
24
+ {
25
+ $ret = false;
26
+
27
+ break;
28
+ }
29
+ }
30
+
31
+ return $ret;
32
+ }
33
+
34
+ function render_related()
35
+ {
36
+ if (!C_NextGen_Settings::get_instance()->get('activateTags')) return;
37
+
38
+ $root_element = $this->object->get_method_property(
39
+ $this->method_called,
40
+ ExtensibleObject::METHOD_PROPERTY_RETURN_VALUE
41
+ );
42
+
43
+ $displayed_type = $this->object->get_param('display_type_rendering');
44
+ $displayed_gallery = $this->object->get_param('displayed_gallery');
45
+ $template_id = $root_element->get_id();
46
+
47
+ if (!$this->object->_check_rendering($displayed_gallery, $template_id, $root_element))
48
+ return;
49
+
50
+ if ($displayed_type && $displayed_gallery != null)
51
+ {
52
+ $list = $root_element->find('nextgen_gallery.gallery_container', TRUE);
53
+ foreach ($list as $container_element) {
54
+ $container_element->append($this->object->render_related_string());
55
+ }
56
+ }
57
+
58
+ return $root_element;
59
+ }
60
+
61
+ function render_related_string()
62
+ {
63
+ $settings = C_NextGen_Settings::get_instance();
64
+ $type = $settings->appendType;
65
+ $maxImages = $settings->maxImages;
66
+ $sluglist = array();
67
+
68
+ switch ($type) {
69
+ case 'tags':
70
+ if (function_exists('get_the_tags'))
71
+ {
72
+ $taglist = get_the_tags();
73
+ if (is_array($taglist)) {
74
+ foreach ($taglist as $tag) {
75
+ $sluglist[] = $tag->slug;
76
+ }
77
+ }
78
+ }
79
+ break;
80
+ case 'category':
81
+ $catlist = get_the_category();
82
+ if (is_array($catlist))
83
+ {
84
+ foreach ($catlist as $cat) {
85
+ $sluglist[] = $cat->category_nicename;
86
+ }
87
+ }
88
+ break;
89
+ }
90
+
91
+ $taglist = implode(',', $sluglist);
92
+
93
+ if ($taglist === 'uncategorized' || empty($taglist))
94
+ return;
95
+
96
+ $renderer = C_Component_Registry::get_instance()->get_utility('I_Displayed_Gallery_Renderer');
97
+ $view = C_Component_Registry::get_instance()->get_utility('I_Component_Factory')
98
+ ->create('mvc_view', '');
99
+ $retval = $renderer->display_images(array(
100
+ 'source' => 'tags',
101
+ 'container_ids' => $taglist,
102
+ 'display_type' => NEXTGEN_GALLERY_BASIC_THUMBNAILS,
103
+ 'images_per_page' => $maxImages,
104
+ 'maximum_entity_count' => $maxImages,
105
+ 'template' => $view->get_template_abspath('photocrati-nextgen_gallery_display#related'),
106
+ 'show_all_in_lightbox' => FALSE,
107
+ 'show_slideshow_link' => FALSE,
108
+ 'disable_pagination' => TRUE
109
+ ));
110
+
111
+ return apply_filters('ngg_show_related_gallery_content', $retval, $taglist);
112
+ }
113
+
114
+ }
products/photocrati_nextgen/modules/nextgen_gallery_display/adapter.gallery_display_ajax.php DELETED
@@ -1,24 +0,0 @@
1
- <?php
2
-
3
- class A_Gallery_Display_Ajax extends Mixin
4
- {
5
- function render_displayed_gallery_action()
6
- {
7
- $retval = array();
8
-
9
- if (isset($_POST['ajax_referrer'])) {
10
- $_SERVER['REQUEST_URI'] = $_POST['ajax_referrer'];
11
- C_Router::get_instance()->serve_request();
12
- }
13
-
14
- if (isset($_POST['displayed_gallery_id'])) {
15
- $displayed_gallery = new C_Displayed_Gallery();
16
- $displayed_gallery->apply_transient($_POST['displayed_gallery_id']);
17
- $renderer = C_Displayed_Gallery_Renderer::get_instance();
18
- $retval['html'] = $renderer->render($displayed_gallery, TRUE);
19
- }
20
-
21
- return $retval;
22
- }
23
- }
24
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_gallery_display/adapter.gallery_display_factory.php CHANGED
@@ -8,9 +8,9 @@ class A_Gallery_Display_Factory extends Mixin
8
  * @param array|stdClass|C_DataMapper_Model $properties
9
  * @param string|array|FALSE $context
10
  */
11
- function display_type($properties=array(), $mapper=FALSE, $context=FALSE)
12
  {
13
- return new C_Display_Type($properties, $mapper, $context);
14
  }
15
 
16
  /**
@@ -19,9 +19,9 @@ class A_Gallery_Display_Factory extends Mixin
19
  * @param array|stdClass|C_DataMapper_Model $properties
20
  * @param string|array|FALSE $context
21
  */
22
- function displayed_gallery($properties=array(), $mapper=FALSE, $context=FALSE)
23
  {
24
- return new C_Displayed_Gallery($properties, $mapper, $context);
25
  }
26
 
27
  /**
@@ -31,8 +31,8 @@ class A_Gallery_Display_Factory extends Mixin
31
  * @param string|array|FALSE $context
32
  * @return C_Displayed_Gallery_Source
33
  */
34
- function displayed_gallery_source($properties=array(), $mapper=FALSE, $context=FALSE)
35
  {
36
- return new C_Displayed_Gallery_Source($properties, $mapper, $context);
37
  }
38
  }
8
  * @param array|stdClass|C_DataMapper_Model $properties
9
  * @param string|array|FALSE $context
10
  */
11
+ function display_type($mapper=FALSE, $properties=array(), $context=FALSE)
12
  {
13
+ return new C_Display_Type($mapper, $properties, $context);
14
  }
15
 
16
  /**
19
  * @param array|stdClass|C_DataMapper_Model $properties
20
  * @param string|array|FALSE $context
21
  */
22
+ function displayed_gallery($mapper=FALSE, $properties=array(), $context=FALSE)
23
  {
24
+ return new C_Displayed_Gallery($mapper, $properties, $context);
25
  }
26
 
27
  /**
31
  * @param string|array|FALSE $context
32
  * @return C_Displayed_Gallery_Source
33
  */
34
+ function displayed_gallery_source($mapper=FALSE, $properties=array(), $context=FALSE)
35
  {
36
+ return new C_Displayed_Gallery_Source($mapper, $properties, $context);
37
  }
38
  }
products/photocrati_nextgen/modules/nextgen_gallery_display/class.display_type.php CHANGED
@@ -13,7 +13,7 @@ class C_Display_Type extends C_DataMapper_Model
13
  {
14
  var $_mapper_interface = 'I_Display_Type_Mapper';
15
 
16
- function define($properties=array(), $mapper=FALSE, $context=FALSE)
17
  {
18
  parent::define($mapper, $properties, $context);
19
  $this->add_mixin('Mixin_Display_Type_Validation');
@@ -27,7 +27,7 @@ class C_Display_Type extends C_DataMapper_Model
27
  * @param array|stdClass|C_Display_Type $properties
28
  * @param FALSE|string|array $context
29
  */
30
- function initialize($properties=array(), $mapper=FALSE, $context=FALSE)
31
  {
32
  // If no mapper was specified, then get the mapper
33
  if (!$mapper) $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
13
  {
14
  var $_mapper_interface = 'I_Display_Type_Mapper';
15
 
16
+ function define($mapper, $properties, $context=FALSE)
17
  {
18
  parent::define($mapper, $properties, $context);
19
  $this->add_mixin('Mixin_Display_Type_Validation');
27
  * @param array|stdClass|C_Display_Type $properties
28
  * @param FALSE|string|array $context
29
  */
30
+ function initialize($mapper=FALSE, $properties=array())
31
  {
32
  // If no mapper was specified, then get the mapper
33
  if (!$mapper) $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
products/photocrati_nextgen/modules/nextgen_gallery_display/class.display_type_controller.php CHANGED
@@ -7,7 +7,6 @@
7
  class C_Display_Type_Controller extends C_MVC_Controller
8
  {
9
  static $_instances = array();
10
- var $cachable = TRUE;
11
 
12
  function define($context=FALSE)
13
  {
@@ -70,16 +69,15 @@ class Mixin_Display_Type_Controller extends Mixin
70
  $settings = C_NextGen_Settings::get_instance();
71
  $mapper = $this->object->get_registry()->get_utility('I_Lightbox_Library_Mapper');
72
  $library = $mapper->find_by_name($settings->thumbEffect);
73
- $thumbEffectContext = isset($settings->thumbEffectContext) ? $settings->thumbEffectContext : '';
74
 
75
  // Make the path to the static resources available for libraries
76
  // Shutter-Reloaded in particular depends on this
77
  $this->object->_add_script_data(
78
  'ngg_common',
79
  'nextgen_lightbox_settings',
80
- array('static_path' => $this->object->get_static_relpath('', 'photocrati-lightbox'), 'context' => $thumbEffectContext),
81
  TRUE,
82
- true
83
  );
84
 
85
  {
@@ -144,14 +142,6 @@ class Mixin_Display_Type_Controller extends Mixin
144
 
145
  $this->object->enqueue_lightbox_resources($displayed_gallery);
146
  }
147
-
148
- function enqueue_ngg_styles()
149
- {
150
- wp_enqueue_style(
151
- 'nggallery',
152
- C_NextGen_Style_Manager::get_instance()->get_selected_stylesheet_url()
153
- );
154
- }
155
 
156
  function get_render_mode()
157
  {
@@ -245,7 +235,7 @@ class Mixin_Display_Type_Controller extends Mixin
245
 
246
  // Get the associated data with this script
247
  $script = &$wp_scripts->registered[$handle];
248
- $data = isset($script->extra['data']) ? $script->extra['data'] : '';
249
 
250
  // Construct the addition
251
  $addition = $define ? "\nvar {$object_name} = " . json_encode($object_value) . ';' :
@@ -262,8 +252,6 @@ class Mixin_Display_Type_Controller extends Mixin
262
  }
263
 
264
  $script->extra['data'] = $data;
265
-
266
- unset($script);
267
  }
268
 
269
  return $retval;
7
  class C_Display_Type_Controller extends C_MVC_Controller
8
  {
9
  static $_instances = array();
 
10
 
11
  function define($context=FALSE)
12
  {
69
  $settings = C_NextGen_Settings::get_instance();
70
  $mapper = $this->object->get_registry()->get_utility('I_Lightbox_Library_Mapper');
71
  $library = $mapper->find_by_name($settings->thumbEffect);
 
72
 
73
  // Make the path to the static resources available for libraries
74
  // Shutter-Reloaded in particular depends on this
75
  $this->object->_add_script_data(
76
  'ngg_common',
77
  'nextgen_lightbox_settings',
78
+ array('static_path' => $this->object->get_static_relpath('', 'lightbox')),
79
  TRUE,
80
+ FALSE
81
  );
82
 
83
  {
142
 
143
  $this->object->enqueue_lightbox_resources($displayed_gallery);
144
  }
 
 
 
 
 
 
 
 
145
 
146
  function get_render_mode()
147
  {
235
 
236
  // Get the associated data with this script
237
  $script = &$wp_scripts->registered[$handle];
238
+ $data = &$script->extra['data'];
239
 
240
  // Construct the addition
241
  $addition = $define ? "\nvar {$object_name} = " . json_encode($object_value) . ';' :
252
  }
253
 
254
  $script->extra['data'] = $data;
 
 
255
  }
256
 
257
  return $retval;
products/photocrati_nextgen/modules/nextgen_gallery_display/class.display_type_mapper.php CHANGED
@@ -7,19 +7,12 @@ class C_Display_Type_Mapper extends C_CustomPost_DataMapper_Driver
7
  {
8
  public static $_instances = array();
9
 
10
- function define($context=FALSE, $not_used=FALSE)
11
  {
12
- $object_name = 'display_type';
13
-
14
- // Add the object name to the context of the object as well
15
- // This allows us to adapt the driver itself, if required
16
- if (!is_array($context)) $context = array($context);
17
- array_push($context, $object_name);
18
- parent::define($object_name, $context);
19
-
20
  $this->add_mixin('Mixin_Display_Type_Mapper');
21
  $this->implement('I_Display_Type_Mapper');
22
- $this->set_model_factory_method($object_name);
23
  }
24
 
25
  function initialize($context=FALSE)
@@ -75,7 +68,7 @@ class Mixin_Display_Type_Mapper extends Mixin
75
  $retval = NULL;
76
  foreach ($this->object->find_all($model) as $display_type) {
77
  foreach ($find_entity_types as $entity_type) {
78
- if (isset($display_type->entity_types) && in_array($entity_type, $display_type->entity_types)) {
79
  $retval[] = $display_type;
80
  break;
81
  }
7
  {
8
  public static $_instances = array();
9
 
10
+ function define($context=FALSE)
11
  {
12
+ parent::define(NULL, array($context, 'display_type'));
 
 
 
 
 
 
 
13
  $this->add_mixin('Mixin_Display_Type_Mapper');
14
  $this->implement('I_Display_Type_Mapper');
15
+ $this->set_model_factory_method('display_type');
16
  }
17
 
18
  function initialize($context=FALSE)
68
  $retval = NULL;
69
  foreach ($this->object->find_all($model) as $display_type) {
70
  foreach ($find_entity_types as $entity_type) {
71
+ if (in_array($entity_type, $display_type->entity_types)) {
72
  $retval[] = $display_type;
73
  break;
74
  }
products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery.php CHANGED
@@ -17,7 +17,7 @@ class C_Displayed_Gallery extends C_DataMapper_Model
17
  {
18
  var $_mapper_interface = 'I_Displayed_Gallery_Mapper';
19
 
20
- function define($properties=array(), $mapper=FALSE, $context=FALSE)
21
  {
22
  parent::define($mapper, $properties, $context);
23
  $this->add_mixin('Mixin_Displayed_Gallery_Validation');
@@ -33,12 +33,10 @@ class C_Displayed_Gallery extends C_DataMapper_Model
33
  * @param array|stdClass|C_Displayed_Gallery $properties
34
  * @param FALSE|string|array $context
35
  */
36
- function initialize($properties=array(), $mapper=FALSE, $context=FALSE)
37
  {
38
  if (!$mapper) $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
39
  parent::initialize($mapper, $properties);
40
-
41
- $this->select_random_variation();
42
  }
43
  }
44
 
@@ -78,7 +76,7 @@ class Mixin_Displayed_Gallery_Validation extends Mixin
78
 
79
  // If no maximum_entity_count has been given, then set a maximum
80
  if (!isset($this->object->maximum_entity_count)) {
81
- $this->object->maximum_entity_count = C_Photocrati_Settings_Manager::get('maximum_entity_count', 500);
82
  }
83
 
84
  }
@@ -92,28 +90,6 @@ class Mixin_Displayed_Gallery_Validation extends Mixin
92
 
93
  class Mixin_Displayed_Gallery_Queries extends Mixin
94
  {
95
- function select_random_variation()
96
- {
97
- $retval = FALSE;
98
-
99
- $source_obj = $this->object->get_source();
100
- if ($source_obj && $source_obj->has_variations) {
101
- $max = 0;
102
- if (!defined('NGG_MAX_VARIATIONS')) {
103
- $settings = C_Photocrati_Global_Settings_Manager::get_instance();
104
- $max = $settings->get('max_variations', 5);
105
- define('NGG_MAX_VARIATIONS', $max);
106
- }
107
- else $max = NGG_MAX_VARIATIONS;
108
-
109
- $this->object->variation = floor(rand(1, $max));
110
-
111
- $retval = $this->object->variation;
112
- }
113
-
114
- return $retval;
115
- }
116
-
117
  function get_entities($limit=FALSE, $offset=FALSE, $id_only=FALSE, $returns='included')
118
  {
119
  $retval = array();
@@ -158,7 +134,7 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
158
  // Find a way to minimalize or segment
159
  $mapper = $this->get_registry()->get_utility('I_Image_Mapper');
160
  $image_key = $mapper->get_primary_key_column();
161
- $select = $id_only ? $image_key : $mapper->get_table_name().'.*';
162
  $sort_direction = $this->object->order_direction;
163
  $sort_by = $this->object->order_by;
164
 
@@ -192,14 +168,13 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
192
  $select,
193
  $image_key,
194
  $sortorder_set,
195
- 'new_sortorder',
196
  TRUE
197
  );
198
  // A user might want to sort the results by the order of
199
  // images that they specified to be included. For that,
200
  // we need some trickery by reversing the order direction
201
  $sort_direction = $this->object->order_direction == 'ASC' ? 'DESC' : 'ASC';
202
- $sort_by = 'new_sortorder';
203
  }
204
 
205
  // Add exclude column
@@ -229,11 +204,10 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
229
  $select,
230
  $image_key,
231
  $this->object->sortorder,
232
- 'new_sortorder',
233
  TRUE
234
  );
235
  $sort_direction = $this->object->order_direction == 'ASC' ? 'DESC' : 'ASC';
236
- $sort_by = 'new_sortorder';
237
  }
238
  $mapper->select($select);
239
 
@@ -265,11 +239,10 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
265
  $select,
266
  $image_key,
267
  $this->object->sortorder,
268
- 'new_sortorder',
269
  TRUE
270
  );
271
  $sort_direction = $this->object->order_direction == 'ASC' ? 'DESC' : 'ASC';
272
- $sort_by = 'new_sortorder';
273
  }
274
 
275
  // Mark each result as excluded
@@ -308,7 +281,9 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
308
  // Container ids are tags
309
  if ($source_obj->name == 'tags') {
310
  $term_ids = $this->object->get_term_ids_for_tags($this->object->container_ids);
311
- $mapper->where(array("{$image_key} IN %s",get_objects_in_term($term_ids, 'ngg_tag')));
 
 
312
  }
313
 
314
  // Container ids are gallery ids
@@ -317,21 +292,6 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
317
  }
318
  }
319
 
320
- // Filter based on excluded container ids
321
- if ($this->object->excluded_container_ids) {
322
-
323
- // Container ids are tags
324
- if ($source_obj->name == 'tags') {
325
- $term_ids = $this->object->get_term_ids_for_tags($this->object->excluded_container_ids);
326
- $mapper->where(array("{$image_key} NOT IN %s",get_objects_in_term($term_ids, 'ngg_tag')));
327
- }
328
-
329
- // Container ids are gallery ids
330
- else {
331
- $mapper->where(array("galleryid NOT IN %s", $this->object->excluded_container_ids));
332
- }
333
- }
334
-
335
  // Adjust the query more based on what source was selected
336
  if ($this->object->source == 'recent_images') {
337
  $sort_direction = 'DESC';
@@ -344,7 +304,7 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
344
  }
345
 
346
  // Apply a sorting order
347
- if ($sort_by) $mapper->order_by($sort_by, $sort_direction);
348
 
349
  // Apply a limit
350
  if ($limit) {
@@ -352,9 +312,7 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
352
  else $mapper->limit($limit);
353
  }
354
 
355
- $results = $mapper->run_query();
356
-
357
- return $results;
358
  }
359
 
360
  /**
@@ -376,7 +334,7 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
376
  $album_key = $album_mapper->get_primary_key_column();
377
  $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper');
378
  $gallery_key = $gallery_mapper->get_primary_key_column();
379
- $select = $id_only ? $album_key.", sortorder" : $album_mapper->get_table_name().'.*';
380
  $retval = array();
381
 
382
  // If no exclusions are specified, are entity_ids are specified,
@@ -395,27 +353,20 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
395
  // Start the query
396
  $album_mapper->select($select);
397
 
398
- // Fetch the albums, and find the entity ids of the sub-albums and galleries
399
- $entity_ids = array();
400
- $excluded_ids = array();
401
-
402
- // Filter by container ids. If container_ids === '0' we retrieve all existing gallery_ids and use
403
- // them as the available entity_ids for comparability with 1.9x
404
- $container_ids = $this->object->container_ids;
405
- if ($container_ids)
406
- {
407
- if ($container_ids !== array('0') && $container_ids !== array(''))
408
- {
409
- $album_mapper->where(array("{$album_key} IN %s", $container_ids));
410
- foreach ($album_mapper->run_query() as $album) {
411
- $entity_ids = array_merge($entity_ids, (array) $album->sortorder);
412
- }
413
- }
414
- else if ($container_ids === array('0') || $container_ids === array('')) {
415
- foreach ($gallery_mapper->select($gallery_key)->run_query() as $gallery) {
416
- $entity_ids[] = $gallery->$gallery_key;
417
- }
418
- }
419
  }
420
 
421
  // Break the list of entities into two groups, included entities
@@ -431,8 +382,8 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
431
  // always take precedence
432
  $included_ids = $this->object->entity_ids;
433
  foreach ($this->object->exclusions as $excluded_id) {
434
- if (($index = array_search($excluded_id, $included_ids)) !== FALSE) {
435
- unset($included_ids[$index]);
436
  }
437
  }
438
  $excluded_ids = array_diff($entity_ids, $included_ids);
@@ -510,8 +461,8 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
510
  $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper');
511
  $image_mapper = $this->object->get_registry()->get_utility('I_Image_Mapper');
512
  $gallery_key = $gallery_mapper->get_primary_key_column();
513
- $album_select = ($id_only ? $album_key : $album_mapper->get_table_name().'.*').", 1 AS is_album, 0 AS is_gallery, name AS title, albumdesc AS galdesc";
514
- $gallery_select = ($id_only ? $gallery_key : $gallery_mapper->get_table_name().'.*').", 1 AS is_gallery, 0 AS is_album";
515
 
516
  // Modify the sort order of the entities
517
  if ($this->object->sortorder) {
@@ -607,7 +558,7 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
607
  unset($counts[$id]);
608
  }
609
  }
610
-
611
  $retval[] = $gallery;
612
  }
613
  }
@@ -752,30 +703,23 @@ class Mixin_Displayed_Gallery_Queries extends Mixin
752
  {
753
  global $wpdb;
754
 
 
 
 
 
755
  // If no tags were provided, get them from the container_ids
756
  if (!$tags) $tags = $this->object->container_ids;
757
 
758
  // Convert container ids to a string suitable for WHERE IN
759
  $container_ids = array();
760
- if (!in_array('all', array_map('strtolower', $tags))) {
761
- foreach ($tags as $container) {
762
- $container_ids[]= "'{$container}'";
763
- }
764
- $container_ids = implode(',', $container_ids);
765
  }
766
-
767
- // Construct query
768
- $query = "SELECT {$wpdb->term_taxonomy}.term_id FROM {$wpdb->term_taxonomy}
769
- INNER JOIN {$wpdb->terms} ON {$wpdb->term_taxonomy}.term_id = {$wpdb->terms}.term_id
770
- WHERE {$wpdb->term_taxonomy}.term_id = {$wpdb->terms}.term_id
771
- AND {$wpdb->term_taxonomy}.taxonomy = %s";
772
- if (!empty($container_ids))
773
- $query .= " AND ({$wpdb->terms}.slug IN ({$container_ids}) OR {$wpdb->terms}.name IN ({$container_ids}))";
774
- $query .= " ORDER BY {$wpdb->terms}.term_id";
775
- $query = $wpdb->prepare($query, 'ngg_tag');
776
 
777
  // Get all term_ids for each image tag slug
778
  $term_ids = array();
 
779
  foreach ($wpdb->get_results($query) as $row) {
780
  $term_ids[] = $row->term_id;
781
  }
@@ -846,13 +790,9 @@ class Mixin_Displayed_Gallery_Instance_Methods extends Mixin
846
  */
847
  function get_source()
848
  {
849
- $retval = NULL;
850
  $sources = $this->object->_get_source_map();
851
- if (isset($sources[$this->object->source])) {
852
- $mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Source_Mapper');
853
- $retval = $mapper->find_by_name($sources[$this->object->source], TRUE);
854
- }
855
-
856
  return $retval;
857
  }
858
 
@@ -903,14 +843,32 @@ class Mixin_Displayed_Gallery_Instance_Methods extends Mixin
903
  */
904
  function to_transient()
905
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
906
  $group = 'displayed_galleries';
907
  $key = C_Photocrati_Cache::generate_key($this->object->get_entity(), $group);
908
- if (is_null(C_Photocrati_Cache::get($key, NULL, $group))) {
909
- C_Photocrati_Cache::set($key, $this->object->get_entity(), $group, 1800);
910
- }
911
-
912
- $this->object->transient_id = $key;
913
- if (!$this->object->id()) $this->object->id($key);
914
 
915
  return $key;
916
  }
@@ -920,19 +878,9 @@ class Mixin_Displayed_Gallery_Instance_Methods extends Mixin
920
  * Applies the values of a transient to this object
921
  * @param string $transient_id
922
  */
923
- function apply_transient($transient_id=NULL)
924
  {
925
- $retval = FALSE;
926
-
927
- if (!$transient_id && isset($this->object->transient_id)) $transient_id = $this->object->transient_id;
928
-
929
- if ($transient_id && ($transient = C_Photocrati_Cache::get($transient_id, FALSE, 'displayed_galleries'))) {
930
  $this->object->_stdObject = $transient;
931
- $this->object->transient_id = $transient_id;
932
- if (!$this->object->id()) $this->object->id($transient_id);
933
- $retval = TRUE;
934
- }
935
-
936
- return $retval;
937
  }
938
  }
17
  {
18
  var $_mapper_interface = 'I_Displayed_Gallery_Mapper';
19
 
20
+ function define($mapper=FALSE, $properties=FALSE, $context=FALSE)
21
  {
22
  parent::define($mapper, $properties, $context);
23
  $this->add_mixin('Mixin_Displayed_Gallery_Validation');
33
  * @param array|stdClass|C_Displayed_Gallery $properties
34
  * @param FALSE|string|array $context
35
  */
36
+ function initialize($mapper=FALSE, $properties=array())
37
  {
38
  if (!$mapper) $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
39
  parent::initialize($mapper, $properties);
 
 
40
  }
41
  }
42
 
76
 
77
  // If no maximum_entity_count has been given, then set a maximum
78
  if (!isset($this->object->maximum_entity_count)) {
79
+ $this->object->maximum_entity_count = C_Photocrati_Global_Settings_Manager::get('maximum_entity_count', 500);
80
  }
81
 
82
  }
90
 
91
  class Mixin_Displayed_Gallery_Queries extends Mixin
92
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  function get_entities($limit=FALSE, $offset=FALSE, $id_only=FALSE, $returns='included')
94
  {
95
  $retval = array();
134
  // Find a way to minimalize or segment
135
  $mapper = $this->get_registry()->get_utility('I_Image_Mapper');
136
  $image_key = $mapper->get_primary_key_column();
137
+ $select = $id_only ? $image_key : '*';
138
  $sort_direction = $this->object->order_direction;
139
  $sort_by = $this->object->order_by;
140
 
168
  $select,
169
  $image_key,
170
  $sortorder_set,
171
+ 'sortorder',
172
  TRUE
173
  );
174
  // A user might want to sort the results by the order of
175
  // images that they specified to be included. For that,
176
  // we need some trickery by reversing the order direction
177
  $sort_direction = $this->object->order_direction == 'ASC' ? 'DESC' : 'ASC';
 
178
  }
179
 
180
  // Add exclude column
204
  $select,
205
  $image_key,
206
  $this->object->sortorder,
207
+ 'sortorder',
208
  TRUE
209
  );
210
  $sort_direction = $this->object->order_direction == 'ASC' ? 'DESC' : 'ASC';
 
211
  }
212
  $mapper->select($select);
213
 
239
  $select,
240
  $image_key,
241
  $this->object->sortorder,
242
+ 'sortorder',
243
  TRUE
244
  );
245
  $sort_direction = $this->object->order_direction == 'ASC' ? 'DESC' : 'ASC';
 
246
  }
247
 
248
  // Mark each result as excluded
281
  // Container ids are tags
282
  if ($source_obj->name == 'tags') {
283
  $term_ids = $this->object->get_term_ids_for_tags($this->object->container_ids);
284
+ if ($term_ids) {
285
+ $mapper->where(array("{$image_key} IN %s",get_objects_in_term($term_ids, 'ngg_tag')));
286
+ }
287
  }
288
 
289
  // Container ids are gallery ids
292
  }
293
  }
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  // Adjust the query more based on what source was selected
296
  if ($this->object->source == 'recent_images') {
297
  $sort_direction = 'DESC';
304
  }
305
 
306
  // Apply a sorting order
307
+ if ($sort_by) $mapper->order_by($sort_by, $sort_direction);
308
 
309
  // Apply a limit
310
  if ($limit) {
312
  else $mapper->limit($limit);
313
  }
314
 
315
+ return $mapper->run_query();
 
 
316
  }
317
 
318
  /**
334
  $album_key = $album_mapper->get_primary_key_column();
335
  $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper');
336
  $gallery_key = $gallery_mapper->get_primary_key_column();
337
+ $select = $id_only ? $album_key.", sortorder" : '*';
338
  $retval = array();
339
 
340
  // If no exclusions are specified, are entity_ids are specified,
353
  // Start the query
354
  $album_mapper->select($select);
355
 
356
+ // Filter by container ids
357
+ if ($this->object->container_ids) {
358
+ $album_mapper->where(
359
+ array("{$album_key} IN %s", $this->object->container_ids)
360
+ );
361
+ }
362
+
363
+ // Fetch the albums, and find the entity ids of the sub-albums
364
+ // and galleries
365
+ $entity_ids = array();
366
+ $included_ids = array();
367
+ $excluded_ids = array();
368
+ foreach ($album_mapper->run_query() as $album) {
369
+ $entity_ids = array_merge($entity_ids, (array) $album->sortorder);
 
 
 
 
 
 
 
370
  }
371
 
372
  // Break the list of entities into two groups, included entities
382
  // always take precedence
383
  $included_ids = $this->object->entity_ids;
384
  foreach ($this->object->exclusions as $excluded_id) {
385
+ if (($index = array_search($excluded_id, $included_entity_ids)) !== FALSE) {
386
+ unset($included_entity_ids[$index]);
387
  }
388
  }
389
  $excluded_ids = array_diff($entity_ids, $included_ids);
461
  $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper');
462
  $image_mapper = $this->object->get_registry()->get_utility('I_Image_Mapper');
463
  $gallery_key = $gallery_mapper->get_primary_key_column();
464
+ $album_select = ($id_only ? $album_key : '*').", 1 AS is_album, 0 AS is_gallery, name AS title, albumdesc AS galdesc";
465
+ $gallery_select = ($id_only ? $gallery_key : '*').", 1 AS is_gallery, 0 AS is_album";
466
 
467
  // Modify the sort order of the entities
468
  if ($this->object->sortorder) {
558
  unset($counts[$id]);
559
  }
560
  }
561
+
562
  $retval[] = $gallery;
563
  }
564
  }
703
  {
704
  global $wpdb;
705
 
706
+ // don't run for galleries without a container-id, like the tagcloud
707
+ if (!$tags && empty($this->object->container_ids))
708
+ return array();
709
+
710
  // If no tags were provided, get them from the container_ids
711
  if (!$tags) $tags = $this->object->container_ids;
712
 
713
  // Convert container ids to a string suitable for WHERE IN
714
  $container_ids = array();
715
+ foreach ($tags as $container) {
716
+ $container_ids[]= "'{$container}'";
 
 
 
717
  }
718
+ $container_ids = implode(',', $container_ids);
 
 
 
 
 
 
 
 
 
719
 
720
  // Get all term_ids for each image tag slug
721
  $term_ids = array();
722
+ $query = $wpdb->prepare("SELECT term_id FROM $wpdb->terms WHERE slug IN ({$container_ids}) ORDER BY term_id ASC ", NULL);
723
  foreach ($wpdb->get_results($query) as $row) {
724
  $term_ids[] = $row->term_id;
725
  }
790
  */
791
  function get_source()
792
  {
 
793
  $sources = $this->object->_get_source_map();
794
+ $mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Source_Mapper');
795
+ $retval = $mapper->find_by_name($sources[$this->object->source], TRUE);
 
 
 
796
  return $retval;
797
  }
798
 
843
  */
844
  function to_transient()
845
  {
846
+ // TODO: put this someplace more appropriate
847
+ // If the source is random do a separate image id lookup and fill those values into the gallery entity_ids
848
+ // This is necessary for compat w/Pro Lightbox so it can retrieve (through it's iframe request) the same images
849
+ // the viewer was previously looking at.
850
+ if (in_array($this->object->source, array('random', 'random_images')) && empty($this->object->entity_ids))
851
+ {
852
+ global $wpdb;
853
+
854
+ $image_ids = array();
855
+ $limit = (!empty($this->object->display_settings['images_per_page']) ? $this->object->display_settings['images_per_page'] : $this->object->maximum_entity_count);
856
+
857
+ $sql = "SELECT `pid` FROM `{$wpdb->nggpictures}` WHERE `exclude` = 0";
858
+ if (!empty($this->object->exclusions))
859
+ $sql .= sprintf(" AND `pid` NOT IN (%s)", implode(',', $this->object->exclusions));
860
+ $sql .= " ORDER BY RAND() LIMIT {$limit}";
861
+
862
+ foreach ($wpdb->get_results($sql, ARRAY_N) as $res) {
863
+ $image_ids[] = reset($res);
864
+ }
865
+
866
+ $this->object->entity_ids = $image_ids;
867
+ }
868
+
869
  $group = 'displayed_galleries';
870
  $key = C_Photocrati_Cache::generate_key($this->object->get_entity(), $group);
871
+ C_Photocrati_Cache::set($key, $this->object->get_entity(), $group);
 
 
 
 
 
872
 
873
  return $key;
874
  }
878
  * Applies the values of a transient to this object
879
  * @param string $transient_id
880
  */
881
+ function apply_transient($transient_id)
882
  {
883
+ if (($transient = C_Photocrati_Cache::get($transient_id, 'displayed_galleries')))
 
 
 
 
884
  $this->object->_stdObject = $transient;
 
 
 
 
 
 
885
  }
886
  }
products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_mapper.php CHANGED
@@ -4,9 +4,9 @@ class C_Displayed_Gallery_Mapper extends C_CustomPost_DataMapper_Driver
4
  {
5
  static $_instances = array();
6
 
7
- function define($context=FALSE, $not_used=FALSE)
8
  {
9
- parent::define('displayed_gallery', array($context, 'displayed_gallery', 'display_gallery'));
10
  $this->add_mixin('Mixin_Displayed_Gallery_Defaults');
11
  $this->implement('I_Displayed_Gallery_Mapper');
12
  $this->set_model_factory_method('displayed_gallery');
@@ -90,7 +90,6 @@ class Mixin_Displayed_Gallery_Defaults extends Mixin
90
 
91
  // Ensure other properties exist
92
  $this->object->_set_default_value($entity, 'container_ids', array());
93
- $this->object->_set_default_value($entity, 'excluded_container_ids', array());
94
  $this->object->_seT_default_value($entity, 'sortorder', array());
95
  $this->object->_set_default_value($entity, 'entity_ids', array());
96
  $this->object->_set_default_value($entity, 'returns', 'included');
4
  {
5
  static $_instances = array();
6
 
7
+ function define($context=FALSE)
8
  {
9
+ parent::define(NULL, array($context, 'display_gallery'));
10
  $this->add_mixin('Mixin_Displayed_Gallery_Defaults');
11
  $this->implement('I_Displayed_Gallery_Mapper');
12
  $this->set_model_factory_method('displayed_gallery');
90
 
91
  // Ensure other properties exist
92
  $this->object->_set_default_value($entity, 'container_ids', array());
 
93
  $this->object->_seT_default_value($entity, 'sortorder', array());
94
  $this->object->_set_default_value($entity, 'entity_ids', array());
95
  $this->object->_set_default_value($entity, 'returns', 'included');
products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_renderer.php CHANGED
@@ -95,7 +95,7 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
95
 
96
  // Configure the arguments
97
  $defaults = array(
98
- 'id' => NULL,
99
  'source' => '',
100
  'container_ids' => array(),
101
  'gallery_ids' => array(),
@@ -142,7 +142,7 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
142
  }
143
 
144
  // Albums ?
145
- elseif ($args['album_ids'] || $args['album_ids'] === '0') {
146
  $args['source'] = 'albums';
147
  $args['container_ids'] = $args['album_ids'];
148
  unset($args['albums_ids']);
@@ -186,7 +186,7 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
186
 
187
  // Create the displayed gallery
188
  $factory = $this->get_registry()->get_utility('I_Component_Factory');
189
- $displayed_gallery = $factory->create('displayed_gallery', $args, $mapper);
190
 
191
  unset($factory);
192
  }
@@ -198,15 +198,11 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
198
  // Set a temporary id
199
  $displayed_gallery->id($displayed_gallery->to_transient());
200
 
 
201
  // Display!
202
  return $this->object->render($displayed_gallery, TRUE, $mode);
203
  }
204
- else {
205
- if (C_NextGEN_Bootstrap::$debug)
206
- $retval = "Invalid Displayed Gallery" . var_dump($displayed_gallery->get_errors());
207
- else
208
- $retval = "Gallery not found. Please <strong>check your settings</strong>.";
209
- }
210
  }
211
  else {
212
  $retval = "Invalid Displayed Gallery";
@@ -214,26 +210,6 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
214
  return $retval;
215
  }
216
 
217
- function debug_msg($msg, $print_r=FALSE)
218
- {
219
- $retval = '';
220
-
221
- if (C_NextGEN_Bootstrap::$debug) {
222
- ob_start();
223
- if ($print_r) {
224
- echo '<pre>';
225
- print_r($msg);
226
- echo '</pre>';
227
- }
228
- else
229
- var_dump($msg);
230
-
231
- $retval = ob_get_clean();
232
- }
233
-
234
- return $retval;
235
- }
236
-
237
 
238
  /**
239
  * Renders a displayed gallery on the frontend
@@ -241,58 +217,36 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
241
  */
242
  function render($displayed_gallery, $return=FALSE, $mode = null)
243
  {
244
- $retval = '';
245
- $lookup = TRUE;
246
- $cache = C_Photocrati_Cache::get_instance('displayed_gallery_rendering');
247
-
248
- // Simply throwing our rendered gallery into a feed will most likely not work correctly.
249
- // The MediaRSS option in NextGEN is available as an alternative.
250
- if(is_feed())
251
- return '';
252
-
253
- if ($mode == null)
254
- {
255
- $mode = 'normal';
256
- }
257
-
258
- // Save the displayed gallery as a transient if it hasn't already. Allows for ajax operations
259
- // to add or modify the gallery without losing a retrievable ID
260
- if (!$displayed_gallery->apply_transient()) {
261
- $displayed_gallery->to_transient();
262
- }
263
 
264
  // Get the display type controller
265
  $controller = $this->get_registry()->get_utility(
266
  'I_Display_Type_Controller', $displayed_gallery->display_type
267
  );
268
 
 
 
 
269
  // Get routing info
270
  $router = $url = C_Router::get_instance();
271
  $url = $router->get_url($router->get_request_uri(), TRUE);
272
 
273
  // Should we lookup in cache?
274
- if (is_array($displayed_gallery->container_ids) && in_array('All', $displayed_gallery->container_ids)) $lookup = FALSE;
 
 
275
  elseif ($displayed_gallery->source == 'albums' && ($controller->param('gallery')) OR $controller->param('album')) $lookup = FALSE;
276
- elseif ($controller->param('show')) $lookup = FALSE;
277
- elseif ($controller->cachable === FALSE) $lookup = FALSE;
278
-
279
- // Enqueue any necessary static resources
280
- $controller->enqueue_frontend_resources($displayed_gallery);
281
 
282
  // Try cache lookup, if we're to do so
283
- $key = null;
284
  $html = FALSE;
285
  if ($lookup) {
286
-
287
- // The display type may need to output some things
288
- // even when serving from the cache
289
- if ($controller->has_method('cache_action')) {
290
- $retval = $controller->cache_action($displayed_gallery);
291
- }
292
-
293
- // Output debug message
294
- $retval .= $this->debug_msg("Lookup!");
295
-
296
  // Some settings affect display types
297
  $settings = C_NextGen_Settings::get_instance();
298
  $key_params = apply_filters('ngg_displayed_gallery_cache_params', array(
@@ -309,43 +263,26 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
309
  ));
310
 
311
  // Try getting the rendered HTML from the cache
312
- $key = $cache->generate_key($key_params);
313
- $html = $cache->lookup($key, FALSE);
314
-
315
- // Output debug messages
316
- if ($html) $retval .= $this->debug_msg("HIT!");
317
- else $retval .= $this->debug_msg("MISS!");
318
-
319
 
320
  // TODO: This is hack. We need to figure out a more uniform way of detecting dynamic image urls
321
- if (strpos($html, C_Photocrati_Settings_Manager::get_instance()->dynamic_thumbnail_slug.'/') !== FALSE) {
322
  $html = FALSE; // forces the cache to be re-generated
323
  }
324
  }
325
- else $retval .= $this->debug_msg("Not looking up in cache as per rules");
326
-
327
- // If we're displaying a variant, I want to know it
328
- if (isset($displayed_gallery->variation) && is_numeric($displayed_gallery->variation) && $displayed_gallery->variation > 0) {
329
- $retval .= $this->debug_msg("Using variation #{$displayed_gallery->variation}!");
330
- }
331
 
332
  // If a cached version doesn't exist, then create the cache
333
  if (!$html) {
334
-
335
- $retval .= $this->debug_msg("Rendering displayed gallery");
336
-
337
  $current_mode = $controller->get_render_mode();
338
  $controller->set_render_mode($mode);
339
  $html = $controller->index_action($displayed_gallery, TRUE);
340
- if ($key != null) $cache->update($key, $html);
341
  $controller->set_render_mode($current_mode);
342
  }
343
 
344
- $retval .= $html;
345
-
346
-
347
- if (!$return) echo $retval;
348
 
349
- return $retval;
350
  }
351
  }
95
 
96
  // Configure the arguments
97
  $defaults = array(
98
+ 'id' => NULL,
99
  'source' => '',
100
  'container_ids' => array(),
101
  'gallery_ids' => array(),
142
  }
143
 
144
  // Albums ?
145
+ elseif ($args['album_ids']) {
146
  $args['source'] = 'albums';
147
  $args['container_ids'] = $args['album_ids'];
148
  unset($args['albums_ids']);
186
 
187
  // Create the displayed gallery
188
  $factory = $this->get_registry()->get_utility('I_Component_Factory');
189
+ $displayed_gallery = $factory->create('displayed_gallery', $mapper, $args);
190
 
191
  unset($factory);
192
  }
198
  // Set a temporary id
199
  $displayed_gallery->id($displayed_gallery->to_transient());
200
 
201
+
202
  // Display!
203
  return $this->object->render($displayed_gallery, TRUE, $mode);
204
  }
205
+ else $retval = "Invalid Displayed Gallery".var_dump($displayed_gallery->get_errors());
 
 
 
 
 
206
  }
207
  else {
208
  $retval = "Invalid Displayed Gallery";
210
  return $retval;
211
  }
212
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
 
214
  /**
215
  * Renders a displayed gallery on the frontend
217
  */
218
  function render($displayed_gallery, $return=FALSE, $mode = null)
219
  {
220
+ if ($mode == null)
221
+ {
222
+ $mode = 'normal';
223
+ }
224
+
225
+ // Save the displayed gallery as a transient
226
+ $displayed_gallery->transient_id = $displayed_gallery->to_transient();
 
 
 
 
 
 
 
 
 
 
 
 
227
 
228
  // Get the display type controller
229
  $controller = $this->get_registry()->get_utility(
230
  'I_Display_Type_Controller', $displayed_gallery->display_type
231
  );
232
 
233
+ // Enqueue any necessary static resources
234
+ $controller->enqueue_frontend_resources($displayed_gallery);
235
+
236
  // Get routing info
237
  $router = $url = C_Router::get_instance();
238
  $url = $router->get_url($router->get_request_uri(), TRUE);
239
 
240
  // Should we lookup in cache?
241
+ $lookup = TRUE;
242
+ if ($displayed_gallery->source == 'random_images') $lookup = FALSE;
243
+ elseif (is_array($displayed_gallery->container_ids) && in_array('All', $displayed_gallery->container_ids)) $lookup = FALSE;
244
  elseif ($displayed_gallery->source == 'albums' && ($controller->param('gallery')) OR $controller->param('album')) $lookup = FALSE;
245
+ elseif (!$controller->cachable) $lookup = FALSE;
 
 
 
 
246
 
247
  // Try cache lookup, if we're to do so
 
248
  $html = FALSE;
249
  if ($lookup) {
 
 
 
 
 
 
 
 
 
 
250
  // Some settings affect display types
251
  $settings = C_NextGen_Settings::get_instance();
252
  $key_params = apply_filters('ngg_displayed_gallery_cache_params', array(
263
  ));
264
 
265
  // Try getting the rendered HTML from the cache
266
+ $key = C_Photocrati_Cache::generate_key($key_params);
267
+ $html = C_Photocrati_Cache::get($key, FALSE);
 
 
 
 
 
268
 
269
  // TODO: This is hack. We need to figure out a more uniform way of detecting dynamic image urls
270
+ if (strpos($html, C_Photocrati_Settings_Manager::get_instance()->dynamic_thumbnail_slug) !== FALSE) {
271
  $html = FALSE; // forces the cache to be re-generated
272
  }
273
  }
 
 
 
 
 
 
274
 
275
  // If a cached version doesn't exist, then create the cache
276
  if (!$html) {
 
 
 
277
  $current_mode = $controller->get_render_mode();
278
  $controller->set_render_mode($mode);
279
  $html = $controller->index_action($displayed_gallery, TRUE);
280
+ C_Photocrati_Cache::set($key, $html);
281
  $controller->set_render_mode($current_mode);
282
  }
283
 
284
+ if (!$return) echo $html;
 
 
 
285
 
286
+ return $html;
287
  }
288
  }
products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source.php CHANGED
@@ -9,7 +9,7 @@ class C_Displayed_Gallery_Source extends C_DataMapper_Model
9
  {
10
  var $_mapper_interface = 'I_Displayed_Gallery_Source_Mapper';
11
 
12
- function define($properties=array(), $mapper=FALSE, $context=FALSE)
13
  {
14
  parent::define($mapper, $properties, $context);
15
  $this->add_mixin('Mixin_Displayed_Gallery_Source');
@@ -22,7 +22,7 @@ class C_Displayed_Gallery_Source extends C_DataMapper_Model
22
  * @param type $mapper
23
  * @param type $properties
24
  */
25
- function initialize($properties=array(), $mapper=FALSE, $context=FALSE)
26
  {
27
  // If no mapper was specified, then get the mapper
28
  if (!$mapper) $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
9
  {
10
  var $_mapper_interface = 'I_Displayed_Gallery_Source_Mapper';
11
 
12
+ function define($mapper, $properties, $context=FALSE)
13
  {
14
  parent::define($mapper, $properties, $context);
15
  $this->add_mixin('Mixin_Displayed_Gallery_Source');
22
  * @param type $mapper
23
  * @param type $properties
24
  */
25
+ function initialize($mapper=FALSE, $properties=array())
26
  {
27
  // If no mapper was specified, then get the mapper
28
  if (!$mapper) $mapper = $this->get_registry()->get_utility($this->_mapper_interface);
products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source_mapper.php CHANGED
@@ -25,7 +25,7 @@ class C_Displayed_Gallery_Source_Mapper extends C_CustomPost_DataMapper_Driver
25
  * Define the mapper
26
  * @param string|array|bool $context
27
  */
28
- function define($context=FALSE, $not_used=FALSE)
29
  {
30
  $object_name = 'gal_display_source';
31
 
@@ -35,7 +35,7 @@ class C_Displayed_Gallery_Source_Mapper extends C_CustomPost_DataMapper_Driver
35
  array_push($context, $object_name);
36
 
37
  // Define the driver
38
- parent::define($object_name, $context);
39
 
40
  // Add the mixin of instance methods
41
  $this->add_mixin('Mixin_Displayed_Gallery_Source_Mapper');
@@ -85,7 +85,5 @@ class Mixin_Displayed_Gallery_Source_Mapper extends Mixin
85
  function set_defaults($entity)
86
  {
87
  if (!isset($entity->aliases)) $entity->aliases = array();
88
- $this->object->_set_default_value($entity, 'has_variations', FALSE);
89
- $this->object->_set_default_value($entity, 'variation', 0);
90
  }
91
  }
25
  * Define the mapper
26
  * @param string|array|bool $context
27
  */
28
+ function define($context=FALSE)
29
  {
30
  $object_name = 'gal_display_source';
31
 
35
  array_push($context, $object_name);
36
 
37
  // Define the driver
38
+ parent::define(NULL, $context);
39
 
40
  // Add the mixin of instance methods
41
  $this->add_mixin('Mixin_Displayed_Gallery_Source_Mapper');
85
  function set_defaults($entity)
86
  {
87
  if (!isset($entity->aliases)) $entity->aliases = array();
 
 
88
  }
89
  }
products/photocrati_nextgen/modules/nextgen_gallery_display/class.gallery_display_installer.php CHANGED
@@ -94,8 +94,7 @@ class C_Gallery_Display_Installer
94
  $this->install_displayed_gallery_source('random_images', array(
95
  'title' => 'Random Images',
96
  'returns' => array('image'),
97
- 'aliases' => array('random', 'random_image'),
98
- 'has_variations' => TRUE
99
  ));
100
 
101
  $this->install_displayed_gallery_source('recent_images', array(
@@ -122,14 +121,11 @@ class C_Gallery_Display_Installer
122
  // Flush displayed gallery cache
123
  C_Photocrati_Cache::flush();
124
  C_Photocrati_Cache::flush('displayed_galleries');
125
- C_Photocrati_Cache::flush('displayed_gallery_rendering');
126
 
127
  $this->uninstall_display_types();
128
  $this->uninstall_displayed_gallery_sources();
129
-
130
- // TODO temporary Don't remove galleries on uninstall
131
- //if ($hard) $this->uninstall_displayed_galleries();
132
  }
133
 
134
 
135
- }
94
  $this->install_displayed_gallery_source('random_images', array(
95
  'title' => 'Random Images',
96
  'returns' => array('image'),
97
+ 'aliases' => array('random', 'random_image')
 
98
  ));
99
 
100
  $this->install_displayed_gallery_source('recent_images', array(
121
  // Flush displayed gallery cache
122
  C_Photocrati_Cache::flush();
123
  C_Photocrati_Cache::flush('displayed_galleries');
 
124
 
125
  $this->uninstall_display_types();
126
  $this->uninstall_displayed_gallery_sources();
127
+ if ($hard) $this->uninstall_displayed_galleries();
 
 
128
  }
129
 
130
 
131
+ }
products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php CHANGED
@@ -19,7 +19,7 @@ class M_Gallery_Display extends C_Base_Module
19
  'photocrati-nextgen_gallery_display',
20
  'Gallery Display',
21
  'Provides the ability to display gallery of images',
22
- '0.7',
23
  'http://www.photocrati.com',
24
  'Photocrati Media',
25
  'http://www.photocrati.com'
@@ -82,19 +82,13 @@ class M_Gallery_Display extends C_Base_Module
82
  'I_Component_Factory', 'A_Gallery_Display_Factory'
83
  );
84
 
85
- if (is_admin()) {
86
- $this->get_registry()->add_adapter(
87
- 'I_Page_Manager',
88
- 'A_Display_Settings_Page'
89
- );
90
- }
91
-
92
- $this->_get_registry()->add_adapter(
93
- 'I_Ajax_Controller',
94
- 'A_Gallery_Display_Ajax'
95
  );
96
 
97
  $this->get_registry()->add_adapter('I_MVC_View', 'A_Gallery_Display_View');
 
98
  }
99
 
100
  /**
@@ -103,111 +97,9 @@ class M_Gallery_Display extends C_Base_Module
103
  function _register_hooks()
104
  {
105
  // Add a shortcode for displaying galleries
106
- C_NextGen_Shortcode_Manager::add('ngg_images', array(&$this, 'display_images'));
107
  add_action('init', array(&$this, '_register_resources'));
108
  add_action('admin_bar_menu', array(&$this, 'add_admin_bar_menu'), 100);
109
- add_filter('the_content', array($this, '_render_related_images'));
110
- add_action('wp_enqueue_scripts', array(&$this, 'no_resources_mode'), PHP_INT_MAX-1);
111
- add_filter('run_ngg_resource_manager', array(&$this, 'no_resources_mode'));
112
- }
113
-
114
-
115
- function no_resources_mode($valid_request=TRUE)
116
- {
117
- if (isset($_REQUEST['ngg_no_resources'])) {
118
- global $wp_scripts, $wp_styles;
119
-
120
- // Don't enqueue any stylesheets
121
- if ($wp_scripts)
122
- $wp_scripts->queue = $wp_styles->queue = array();
123
-
124
- // Don't do any actions that we don't have to
125
- // remove_all_actions('wp_loaded');
126
- // remove_all_actions('get_header');
127
- // remove_all_actions('wp_head');
128
- // remove_all_actions('get_search_form');
129
- // remove_all_actions('loop_end');
130
- // remove_all_actions('pre_get_comments');
131
- // remove_all_actions('wp_meta');
132
- // remove_all_actions('get_footer');
133
- // remove_all_actions('wp_footer');
134
- // remove_all_actions('wp_print_footer_scripts');
135
-
136
- // Don't run the resource manager
137
- $valid_request = FALSE;
138
- }
139
-
140
- return $valid_request;
141
- }
142
-
143
- function _render_related_string()
144
- {
145
- $settings = C_NextGen_Settings::get_instance();
146
- $type = $settings->appendType;
147
- $maxImages = $settings->maxImages;
148
- $sluglist = array();
149
-
150
- switch ($type) {
151
- case 'tags':
152
- if (function_exists('get_the_tags'))
153
- {
154
- $taglist = get_the_tags();
155
- if (is_array($taglist)) {
156
- foreach ($taglist as $tag) {
157
- $sluglist[] = $tag->slug;
158
- }
159
- }
160
- }
161
- break;
162
- case 'category':
163
- $catlist = get_the_category();
164
- if (is_array($catlist))
165
- {
166
- foreach ($catlist as $cat) {
167
- $sluglist[] = $cat->category_nicename;
168
- }
169
- }
170
- break;
171
- }
172
-
173
- $taglist = implode(',', $sluglist);
174
-
175
- if ($taglist === 'uncategorized' || empty($taglist))
176
- return;
177
-
178
- $renderer = C_Component_Registry::get_instance()->get_utility('I_Displayed_Gallery_Renderer');
179
- $view = C_Component_Registry::get_instance()->get_utility('I_Component_Factory')
180
- ->create('mvc_view', '');
181
- $retval = $renderer->display_images(array(
182
- 'source' => 'tags',
183
- 'container_ids' => $taglist,
184
- 'display_type' => NEXTGEN_GALLERY_BASIC_THUMBNAILS,
185
- 'images_per_page' => $maxImages,
186
- 'maximum_entity_count' => $maxImages,
187
- 'template' => $view->get_template_abspath('photocrati-nextgen_gallery_display#related'),
188
- 'show_all_in_lightbox' => FALSE,
189
- 'show_slideshow_link' => FALSE,
190
- 'disable_pagination' => TRUE,
191
- 'display_no_images_error' => FALSE
192
- ));
193
-
194
- return apply_filters('ngg_show_related_gallery_content', $retval, $taglist);
195
- }
196
-
197
- function _render_related_images($content)
198
- {
199
- $settings = C_NextGen_Settings::get_instance();
200
-
201
- if ($settings->get('activateTags')) {
202
- $related = $this->_render_related_string();
203
-
204
- if ($related != null) {
205
- $heading = $settings->relatedHeading;
206
- $content .= $heading . $related;
207
- }
208
- }
209
-
210
- return $content;
211
  }
212
 
213
  /**
@@ -232,21 +124,7 @@ class M_Gallery_Display extends C_Base_Module
232
  */
233
  function _register_resources()
234
  {
235
- // Register custom post types for compatibility
236
- $types = array(
237
- 'displayed_gallery' => 'NextGEN Gallery - Displayed Gallery',
238
- 'display_type' => 'NextGEN Gallery - Display Type',
239
- 'gal_display_source' => 'NextGEN Gallery - Displayed Gallery Source'
240
- );
241
- foreach ($types as $type => $label) {
242
- register_post_type($type, array(
243
- 'label' => $label,
244
- 'publicly_queryable' => FALSE,
245
- 'exclude_from_search' => TRUE,
246
- ));
247
- }
248
-
249
- $router = $this->get_registry()->get_utility('I_Router');
250
 
251
  wp_register_script(
252
  'nextgen_gallery_display_settings',
@@ -259,12 +137,6 @@ class M_Gallery_Display extends C_Base_Module
259
  $router->get_static_url('photocrati-nextgen_gallery_display#nextgen_gallery_display_settings.css')
260
  );
261
 
262
- wp_register_style(
263
- 'nextgen_gallery_related_images',
264
- $router->get_static_url('photocrati-nextgen_gallery_display#nextgen_gallery_related_images.css')
265
- );
266
- wp_enqueue_style('nextgen_gallery_related_images');
267
-
268
  wp_register_script(
269
  'jquery.nextgen_radio_toggle',
270
  $router->get_static_url('photocrati-nextgen_gallery_display#jquery.nextgen_radio_toggle.js'),
@@ -318,31 +190,31 @@ class M_Gallery_Display extends C_Base_Module
318
  function get_type_list()
319
  {
320
  return array(
321
- 'A_Gallery_Display_Ajax' => 'adapter.gallery_display_ajax.php',
322
  'A_Display_Settings_Controller' => 'adapter.display_settings_controller.php',
323
- 'A_Display_Settings_Page' => 'adapter.display_settings_page.php',
324
- 'A_Gallery_Display_Factory' => 'adapter.gallery_display_factory.php',
325
- 'C_Gallery_Display_Installer' => 'class.gallery_display_installer.php',
326
- 'A_Gallery_Display_View' => 'adapter.gallery_display_view.php',
327
- 'C_Displayed_Gallery' => 'class.displayed_gallery.php',
328
- 'C_Displayed_Gallery_Mapper' => 'class.displayed_gallery_mapper.php',
329
- 'C_Displayed_Gallery_Renderer' => 'class.displayed_gallery_renderer.php',
330
- 'C_Displayed_Gallery_Source' => 'class.displayed_gallery_source.php',
 
331
  'C_Displayed_Gallery_Source_Mapper' => 'class.displayed_gallery_source_mapper.php',
332
- 'C_Display_Type' => 'class.display_type.php',
333
- 'C_Display_Type_Controller' => 'class.display_type_controller.php',
334
- 'C_Display_Type_Mapper' => 'class.display_type_mapper.php',
335
  'Hook_Propagate_Thumbnail_Dimensions_To_Settings' => 'hook.propagate_thumbnail_dimensions_to_settings.php',
336
- 'I_Displayed_Gallery' => 'interface.displayed_gallery.php',
337
- 'I_Displayed_Gallery_Mapper' => 'interface.displayed_gallery_mapper.php',
338
- 'I_Displayed_Gallery_Renderer' => 'interface.displayed_gallery_renderer.php',
339
- 'I_Displayed_Gallery_Source' => 'interface.displayed_gallery_source.php',
340
  'I_Displayed_Gallery_Source_Mapper' => 'interface.displayed_gallery_source_mapper.php',
341
  'I_Display_Settings_Controller' => 'interface.display_settings_controller.php',
342
- 'I_Display_Type' => 'interface.display_type.php',
343
- 'I_Display_Type_Controller' => 'interface.display_type_controller.php',
344
- 'I_Display_Type_Mapper' => 'interface.display_type_mapper.php',
345
- 'Mixin_Display_Type_Form' => 'mixin.display_type_form.php'
346
  );
347
  }
348
  }
19
  'photocrati-nextgen_gallery_display',
20
  'Gallery Display',
21
  'Provides the ability to display gallery of images',
22
+ '0.1',
23
  'http://www.photocrati.com',
24
  'Photocrati Media',
25
  'http://www.photocrati.com'
82
  'I_Component_Factory', 'A_Gallery_Display_Factory'
83
  );
84
 
85
+ $this->get_registry()->add_adapter(
86
+ 'I_Page_Manager',
87
+ 'A_Display_Settings_Page'
 
 
 
 
 
 
 
88
  );
89
 
90
  $this->get_registry()->add_adapter('I_MVC_View', 'A_Gallery_Display_View');
91
+ $this->get_registry()->add_adapter('I_MVC_View', 'A_Displayed_Gallery_Related_Element');
92
  }
93
 
94
  /**
97
  function _register_hooks()
98
  {
99
  // Add a shortcode for displaying galleries
100
+ add_shortcode('ngg_images', array(&$this, 'display_images'));
101
  add_action('init', array(&$this, '_register_resources'));
102
  add_action('admin_bar_menu', array(&$this, 'add_admin_bar_menu'), 100);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  }
104
 
105
  /**
124
  */
125
  function _register_resources()
126
  {
127
+ $router = $this->get_registry()->get_utility('I_Router');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
 
129
  wp_register_script(
130
  'nextgen_gallery_display_settings',
137
  $router->get_static_url('photocrati-nextgen_gallery_display#nextgen_gallery_display_settings.css')
138
  );
139
 
 
 
 
 
 
 
140
  wp_register_script(
141
  'jquery.nextgen_radio_toggle',
142
  $router->get_static_url('photocrati-nextgen_gallery_display#jquery.nextgen_radio_toggle.js'),
190
  function get_type_list()
191
  {
192
  return array(
 
193
  'A_Display_Settings_Controller' => 'adapter.display_settings_controller.php',
194
+ 'A_Display_Settings_Page' => 'adapter.display_settings_page.php',
195
+ 'A_Displayed_Gallery_Related_Element' => 'adapter.displayed_gallery_related_element.php',
196
+ 'A_Gallery_Display_Factory' => 'adapter.gallery_display_factory.php',
197
+ 'C_Gallery_Display_Installer' => 'class.gallery_display_installer.php',
198
+ 'A_Gallery_Display_View' => 'adapter.gallery_display_view.php',
199
+ 'C_Displayed_Gallery' => 'class.displayed_gallery.php',
200
+ 'C_Displayed_Gallery_Mapper' => 'class.displayed_gallery_mapper.php',
201
+ 'C_Displayed_Gallery_Renderer' => 'class.displayed_gallery_renderer.php',
202
+ 'C_Displayed_Gallery_Source' => 'class.displayed_gallery_source.php',
203
  'C_Displayed_Gallery_Source_Mapper' => 'class.displayed_gallery_source_mapper.php',
204
+ 'C_Display_Type' => 'class.display_type.php',
205
+ 'C_Display_Type_Controller' => 'class.display_type_controller.php',
206
+ 'C_Display_Type_Mapper' => 'class.display_type_mapper.php',
207
  'Hook_Propagate_Thumbnail_Dimensions_To_Settings' => 'hook.propagate_thumbnail_dimensions_to_settings.php',
208
+ 'I_Displayed_Gallery' => 'interface.displayed_gallery.php',
209
+ 'I_Displayed_Gallery_Mapper' => 'interface.displayed_gallery_mapper.php',
210
+ 'I_Displayed_Gallery_Renderer' => 'interface.displayed_gallery_renderer.php',
211
+ 'I_Displayed_Gallery_Source' => 'interface.displayed_gallery_source.php',
212
  'I_Displayed_Gallery_Source_Mapper' => 'interface.displayed_gallery_source_mapper.php',
213
  'I_Display_Settings_Controller' => 'interface.display_settings_controller.php',
214
+ 'I_Display_Type' => 'interface.display_type.php',
215
+ 'I_Display_Type_Controller' => 'interface.display_type_controller.php',
216
+ 'I_Display_Type_Mapper' => 'interface.display_type_mapper.php',
217
+ 'Mixin_Display_Type_Form' => 'mixin.display_type_form.php'
218
  );
219
  }
220
  }
products/photocrati_nextgen/modules/nextgen_gallery_display/static/common.js CHANGED
@@ -1,85 +1 @@
1
- (function($){
2
- window.NggPaginatedGallery = function(displayed_gallery_id, container, links) {
3
- this.displayed_gallery_id = displayed_gallery_id;
4
- this.links = links;
5
- this.container = container;
6
-
7
- this.get_displayed_gallery_obj = function(){
8
- var index = 'gallery_'+this.displayed_gallery_id;
9
- if (typeof(window.galleries[index]) == 'undefined')
10
- return false;
11
- else
12
- return window.galleries[index];
13
- };
14
-
15
-
16
- this.enable_ajax_pagination = function(){
17
- var transient_id = this.get_displayed_gallery_obj().transient_id;
18
- var obj = this;
19
-
20
- // Attach a click event handler for each pagination link to
21
- // adjust the request to be sent via XHR
22
- this.links.each(function(){
23
- var $link = $(this);
24
- $link.click(function(e){
25
- e.preventDefault();
26
-
27
- // Describe AJAX request
28
- var request = {
29
- action: 'render_displayed_gallery',
30
- displayed_gallery_id: transient_id,
31
- ajax_referrer: $link.attr('href')
32
- }
33
-
34
- // Notify the user that we're busy
35
- obj.do_ajax(request);
36
- });
37
- });
38
- };
39
-
40
- this.do_ajax = function(request){
41
-
42
- var container = this.container;
43
-
44
- // Adjust the user notification
45
- window['ngg_ajax_operaton_count']++;
46
- $('body, a').css('cursor', 'wait');
47
-
48
- // Send the AJAX request
49
- $.post(photocrati_ajax.url, request, function(response){
50
-
51
- // Adjust the user notification
52
- window['ngg_ajax_operaton_count']--;
53
- if (window['ngg_ajax_operaton_count'] <= 0) {
54
- window['ngg_ajax_operaton_count'] = 0;
55
- $('body, a').css('cursor', 'auto');
56
- }
57
-
58
- // Ensure that the server returned JSON
59
- if (typeof(response) != 'object') response = JSON.parse(response);
60
- if (response) {
61
- container.replaceWith(response.html);
62
-
63
- // Let the user know that we've refreshed the content
64
- $(document).trigger('refreshed');
65
- }
66
- });
67
- };
68
-
69
- // Initialize
70
- var displayed_gallery = this.get_displayed_gallery_obj();
71
- if (displayed_gallery) {
72
- if (typeof(displayed_gallery.display_settings['ajax_pagination']) != 'undefined') {
73
- if (parseInt(displayed_gallery.display_settings['ajax_pagination'])) {
74
- this.enable_ajax_pagination();
75
- }
76
- }
77
- }
78
-
79
- // We maintain a count of all the current AJAX actions initiated
80
- if (typeof(window['ngg_ajax_operation_count']) == 'undefined') {
81
- window['ngg_ajax_operaton_count'] = 0;
82
- }
83
- };
84
-
85
- })(jQuery);
1
+ // common.js is intentionally empty
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_gallery_display/static/nextgen_gallery_related_images.css DELETED
@@ -1,22 +0,0 @@
1
-
2
- /* ----------- Related images -------------*/
3
- .ngg-related-gallery {
4
- background:#F9F9F9;
5
- border:1px solid #E0E0E0;
6
- overflow:hidden;
7
- margin-bottom:1em;
8
- margin-top:1em;
9
- padding:5px;
10
- }
11
- .ngg-related-gallery img {
12
- border: 1px solid #DDDDDD;
13
- float: left;
14
- margin: 0pt 3px;
15
- padding: 2px;
16
- height: 50px;
17
- width: 50px;
18
- }
19
-
20
- .ngg-related-gallery img:hover {
21
- border: 1px solid #000000;
22
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php CHANGED
@@ -64,9 +64,9 @@ class A_Image_Options_Form extends Mixin
64
  if (!$gallerypath) $gallerypath = $this->object->get_model()->get('gallerypath');
65
  $fs = $this->get_registry()->get_utility('I_Fs');
66
  $gallerypath = $fs->get_abspath($gallerypath);
67
- if (!@file_exists($gallerypath)) {
68
  @mkdir($gallerypath);
69
- $retval = @file_exists($gallerypath);
70
  }
71
 
72
  return $retval;
@@ -90,7 +90,7 @@ class A_Image_Options_Form extends Mixin
90
  'delete_image_files_help' => _('When enabled, image files will be removed after a Gallery has been deleted'),
91
  'delete_image_files' => $settings->deleteImg,
92
  'show_related_images_label' => _('Show Related Images on Posts?'),
93
- 'show_related_images_help' => _('When enabled, related images will be appended to each post by matching the posts tags/categories to image tags'),
94
  'show_related_images' => $settings->activateTags,
95
  'related_images_hidden_label' => _('(Show Customization Settings)'),
96
  'related_images_active_label' => _('(Hide Customization Settings)'),
@@ -99,8 +99,6 @@ class A_Image_Options_Form extends Mixin
99
  'match_related_image_options' => $this->object->_get_related_image_match_options(),
100
  'max_related_images_label' => _('Maximum # of related images to display'),
101
  'max_related_images' => $settings->maxImages,
102
- 'related_images_heading_label' => _('Heading for related images'),
103
- 'related_images_heading' => $settings->relatedHeading,
104
  'sorting_order_label' => _("What's the default sorting method?"),
105
  'sorting_order_options' => $this->object->_get_image_sorting_options(),
106
  'sorting_order' => $settings->galSort,
@@ -136,32 +134,30 @@ class A_Image_Options_Form extends Mixin
136
  $fs = $this->get_registry()->get_utility('I_Fs');
137
  $original_dir = $fs->get_abspath($this->object->get_model()->get('gallerypath'));
138
  $new_dir = $fs->get_abspath($image_options['gallerypath']);
139
- $image_options['gallerypath'] = $fs->add_trailing_slash($image_options['gallerypath']);
140
-
141
- // Note: the below file move is disabled because it's quite unreliable as it doesn't perform any checks
142
- // For instance changing gallery path from /wp-content to /wp-content/gallery would attempt a recursive copy and then delete ALL files under wp-content, which would be disastreus
143
- # // If the gallery path has changed...
144
- # if ($original_dir != $new_dir) {
145
-
146
- # // Try creating the new directory
147
- # if ($this->object->_create_gallery_storage_dir($new_dir) AND is_writable($new_dir)) {
148
-
149
- # // Try moving files
150
- # $this->object->recursive_copy($original_dir, $new_dir);
151
- # $this->object->recursive_delete($original_dir);
152
-
153
- # // Update gallery paths
154
- # $mapper = $this->get_registry()->get_utility('I_Gallery_Mapper');
155
- # foreach ($mapper->find_all() as $gallery) {
156
- # $gallery->path = $image_options['gallerypath'] . $gallery->name;
157
- # $mapper->save($gallery);
158
- # }
159
- # }
160
- # else {
161
- # $this->get_model()->add_error("Unable to change gallery path. Insufficient filesystem permissions");
162
- # $save = FALSE;
163
- # }
164
- # }
165
  }
166
  elseif (isset($image_options['gallerypath'])) {
167
  unset($image_options['gallerypath']);
64
  if (!$gallerypath) $gallerypath = $this->object->get_model()->get('gallerypath');
65
  $fs = $this->get_registry()->get_utility('I_Fs');
66
  $gallerypath = $fs->get_abspath($gallerypath);
67
+ if (!file_exists($gallerypath)) {
68
  @mkdir($gallerypath);
69
+ $retval = file_exists($gallerypath);
70
  }
71
 
72
  return $retval;
90
  'delete_image_files_help' => _('When enabled, image files will be removed after a Gallery has been deleted'),
91
  'delete_image_files' => $settings->deleteImg,
92
  'show_related_images_label' => _('Show Related Images on Posts?'),
93
+ 'show_related_images_help' => _('When enabled, related images will be appended to each post'),
94
  'show_related_images' => $settings->activateTags,
95
  'related_images_hidden_label' => _('(Show Customization Settings)'),
96
  'related_images_active_label' => _('(Hide Customization Settings)'),
99
  'match_related_image_options' => $this->object->_get_related_image_match_options(),
100
  'max_related_images_label' => _('Maximum # of related images to display'),
101
  'max_related_images' => $settings->maxImages,
 
 
102
  'sorting_order_label' => _("What's the default sorting method?"),
103
  'sorting_order_options' => $this->object->_get_image_sorting_options(),
104
  'sorting_order' => $settings->galSort,
134
  $fs = $this->get_registry()->get_utility('I_Fs');
135
  $original_dir = $fs->get_abspath($this->object->get_model()->get('gallerypath'));
136
  $new_dir = $fs->get_abspath($image_options['gallerypath']);
137
+ $image_options['gallerypath'] = $fs->add_trailing_slash($image_options['gallerypath']);
138
+
139
+ // If the gallery path has changed...
140
+ if ($original_dir != $new_dir) {
141
+
142
+ // Try creating the new directory
143
+ if ($this->object->_create_gallery_storage_dir($new_dir) AND is_writable($new_dir)) {
144
+
145
+ // Try moving files
146
+ $this->object->recursive_copy($original_dir, $new_dir);
147
+ $this->object->recursive_delete($original_dir);
148
+
149
+ // Update gallery paths
150
+ $mapper = $this->get_registry()->get_utility('I_Gallery_Mapper');
151
+ foreach ($mapper->find_all() as $gallery) {
152
+ $gallery->path = $image_options['gallerypath'] . $gallery->name;
153
+ $mapper->save($gallery);
154
+ }
155
+ }
156
+ else {
157
+ $this->get_model()->add_error("Unable to change gallery path. Insufficient filesystem permissions");
158
+ $save = FALSE;
159
+ }
160
+ }
 
 
161
  }
162
  elseif (isset($image_options['gallerypath'])) {
163
  unset($image_options['gallerypath']);
products/photocrati_nextgen/modules/nextgen_other_options/adapter.lightbox_manager_form.php CHANGED
@@ -14,7 +14,7 @@ class A_Lightbox_Manager_Form extends Mixin
14
 
15
  function render()
16
  {
17
- $form_manager = C_Form_Manager::get_instance();
18
  $mapper = $this->object->get_registry()->get_utility('I_Lightbox_Library_Mapper');
19
 
20
  // retrieve and render the settings forms for each library
@@ -40,8 +40,7 @@ class A_Lightbox_Manager_Form extends Mixin
40
  'id_field' => $mapper->get_primary_key_column(),
41
  'selected' => $this->object->get_model()->thumbEffect,
42
  'sub_fields' => $sub_fields,
43
- 'adv_fields' => $advanced_fields,
44
- 'lightbox_global' => $this->object->get_model()->thumbEffectContext,
45
  ),
46
  TRUE
47
  );
@@ -60,23 +59,21 @@ class A_Lightbox_Manager_Form extends Mixin
60
 
61
  // If a valid library, we have updated settings from the user, then
62
  // try saving the changes
63
- if ($library)
64
  {
65
- if (($params = $this->object->param($library->name))) {
66
- // bind our new values, use display_settings if it isn't a part of the core library
67
- foreach ($params as $k => $v) {
68
- if (isset($library->$k)) {
69
- $library->$k = $v;
70
- }
71
- else {
72
- $library->display_settings[$k] = $v;
73
- }
 
 
 
74
 
75
- }
76
-
77
- $mapper->save($library);
78
- }
79
-
80
  // If the requested changes weren't valid, add the validation
81
  // errors to the C_NextGen_Settings object
82
  if ($settings->is_invalid())
@@ -95,10 +92,5 @@ class A_Lightbox_Manager_Form extends Mixin
95
  }
96
  }
97
  }
98
-
99
- if (($thumbEffectContext = $this->object->param('thumbEffectContext'))) {
100
- $settings->thumbEffectContext = $thumbEffectContext;
101
- $settings->save();
102
- }
103
  }
104
- }
14
 
15
  function render()
16
  {
17
+ $form_manager = $this->object->get_registry()->get_utility('I_Form_Manager');
18
  $mapper = $this->object->get_registry()->get_utility('I_Lightbox_Library_Mapper');
19
 
20
  // retrieve and render the settings forms for each library
40
  'id_field' => $mapper->get_primary_key_column(),
41
  'selected' => $this->object->get_model()->thumbEffect,
42
  'sub_fields' => $sub_fields,
43
+ 'adv_fields' => $advanced_fields
 
44
  ),
45
  TRUE
46
  );
59
 
60
  // If a valid library, we have updated settings from the user, then
61
  // try saving the changes
62
+ if ($library && (($params = $this->object->param($library->name))))
63
  {
64
+ // bind our new values, use display_settings if it isn't a part of the core library
65
+ foreach ($params as $k => $v) {
66
+ if (isset($library->$k))
67
+ {
68
+ $library->$k = $v;
69
+ }
70
+ else {
71
+ $library->display_settings[$k] = $v;
72
+ }
73
+
74
+ }
75
+ $mapper->save($library);
76
 
 
 
 
 
 
77
  // If the requested changes weren't valid, add the validation
78
  // errors to the C_NextGen_Settings object
79
  if ($settings->is_invalid())
92
  }
93
  }
94
  }
 
 
 
 
 
95
  }
96
+ }
products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php CHANGED
@@ -23,6 +23,12 @@ class A_Miscellaneous_Form extends Mixin
23
  'mediarss_activated_no' => _('No'),
24
  'mediarss_activated_yes' => _('Yes'),
25
 
 
 
 
 
 
 
26
  'cache_label' => _('Clear image cache'),
27
  'cache_confirmation' => _("Completely clear the NextGEN cache of all image modifications?\n\nChoose [Cancel] to Stop, [OK] to proceed."),
28
 
@@ -31,18 +37,7 @@ class A_Miscellaneous_Form extends Mixin
31
  'router_param_slug',
32
  'Permalink slug',
33
  $this->object->get_model()->router_param_slug
34
- ),
35
-
36
- 'maximum_entity_count_field' => $this->_render_number_field(
37
- (object)array('name' => 'misc_settings'),
38
- 'maximum_entity_count',
39
- 'Maximum image count',
40
- $this->object->get_model()->maximum_entity_count,
41
- 'This is the maximum limit of images that NextGEN will restrict itself to querying',
42
- FALSE,
43
- '',
44
- 1
45
- )
46
  ),
47
  TRUE
48
  );
@@ -51,10 +46,12 @@ class A_Miscellaneous_Form extends Mixin
51
  function cache_action()
52
  {
53
  $cache = $this->get_registry()->get_utility('I_Cache');
 
 
54
  $cache->flush_galleries();
 
55
  C_Photocrati_Cache::flush();
56
  C_Photocrati_Cache::flush('displayed_galleries');
57
- C_Photocrati_Cache::flush('displayed_gallery_rendering');
58
  }
59
 
60
  function save_action()
23
  'mediarss_activated_no' => _('No'),
24
  'mediarss_activated_yes' => _('Yes'),
25
 
26
+ 'minifier_activated' => $this->object->get_model()->resource_minifier,
27
+ 'minifier_activated_label' => _('Enable the resource minifier?'),
28
+ 'minifier_activated_help' => _('Combines available Javascript and CSS resources into one file for faster load times'),
29
+ 'minifier_activated_no' => _('No'),
30
+ 'minifier_activated_yes' => _('Yes'),
31
+
32
  'cache_label' => _('Clear image cache'),
33
  'cache_confirmation' => _("Completely clear the NextGEN cache of all image modifications?\n\nChoose [Cancel] to Stop, [OK] to proceed."),
34
 
37
  'router_param_slug',
38
  'Permalink slug',
39
  $this->object->get_model()->router_param_slug
40
+ )
 
 
 
 
 
 
 
 
 
 
 
41
  ),
42
  TRUE
43
  );
46
  function cache_action()
47
  {
48
  $cache = $this->get_registry()->get_utility('I_Cache');
49
+ $manager = $this->get_registry()->get_utility('I_Resource_Manager');
50
+
51
  $cache->flush_galleries();
52
+ $manager->flush_cache();
53
  C_Photocrati_Cache::flush();
54
  C_Photocrati_Cache::flush('displayed_galleries');
 
55
  }
56
 
57
  function save_action()
products/photocrati_nextgen/modules/nextgen_other_options/adapter.other_options_forms.php CHANGED
@@ -5,26 +5,14 @@ class A_Other_Options_Forms extends Mixin
5
  function initialize()
6
  {
7
  $forms = array(
8
- 'image_options' => 'A_Image_Options_Form',
9
- 'thumbnail_options' => 'A_Thumbnail_Options_Form',
10
- 'lightbox_effects' => 'A_Lightbox_Manager_Form',
11
- 'watermarks' => 'A_Watermarks_Form'
12
- );
13
-
14
- if (!is_multisite() || (is_multisite() && C_NextGen_Settings::get_instance()->get('wpmuStyle')))
15
- $forms['styles'] = 'A_Styles_Form';
16
-
17
- if (is_super_admin() && (!is_multisite() || (is_multisite() && C_NextGen_Settings::get_instance()->get('wpmuRoles'))))
18
- $forms['roles_and_capabilities'] = 'A_Roles_Form';
19
-
20
- $forms += array(
21
  'image_options' => 'A_Image_Options_Form',
22
  'thumbnail_options' => 'A_Thumbnail_Options_Form',
23
  'lightbox_effects' => 'A_Lightbox_Manager_Form',
24
  'watermarks' => 'A_Watermarks_Form',
25
  'styles' => 'A_Styles_Form',
26
  'roles_and_capabilities'=> 'A_Roles_Form',
27
- 'miscellaneous' => 'A_Miscellaneous_Form'
 
28
  );
29
 
30
  $registry = $this->object->get_registry();
5
  function initialize()
6
  {
7
  $forms = array(
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  'image_options' => 'A_Image_Options_Form',
9
  'thumbnail_options' => 'A_Thumbnail_Options_Form',
10
  'lightbox_effects' => 'A_Lightbox_Manager_Form',
11
  'watermarks' => 'A_Watermarks_Form',
12
  'styles' => 'A_Styles_Form',
13
  'roles_and_capabilities'=> 'A_Roles_Form',
14
+ 'miscellaneous' => 'A_Miscellaneous_Form',
15
+ 'reset_and_uninstall' => 'A_Reset_Form',
16
  );
17
 
18
  $registry = $this->object->get_registry();
products/photocrati_nextgen/modules/nextgen_other_options/adapter.reset_form.php CHANGED
@@ -4,7 +4,7 @@ class A_Reset_Form extends Mixin
4
  {
5
  function get_title()
6
  {
7
- return 'Reset Options';
8
  }
9
 
10
  function render()
@@ -15,9 +15,9 @@ class A_Reset_Form extends Mixin
15
  'reset_value' => _('Reset all options to default settings'),
16
  'reset_warning' => _('Replace all existing options and gallery options with their default settings'),
17
  'reset_label' => _('Reset settings'),
18
- 'reset_confirmation' => _("Reset all options to default settings?\n\nChoose [Cancel] to Stop, [OK] to proceed.")
19
- // 'uninstall_label' => _('Deactivate & Uninstall'),
20
- // 'uninstall_confirmation'=>_("Completely uninstall NextGEN Gallery (will reset settings and de-activate)?\n\nChoose [Cancel] to Stop, [OK] to proceed."),
21
  ),
22
  TRUE
23
  );
@@ -25,29 +25,11 @@ class A_Reset_Form extends Mixin
25
 
26
  function reset_action()
27
  {
28
- global $wpdb;
29
-
30
  $installer = C_Photocrati_Installer::get_instance();
31
- $settings = C_NextGen_Settings::get_instance();
32
-
33
- // removes lightbox, display type, and source settings
34
  $installer->uninstall(NEXTGEN_GALLERY_PLUGIN_BASENAME);
35
-
36
- // removes ngg_options entry in wp_options
37
- $settings->destroy();
38
- $settings->save();
39
-
40
- // TODO: remove this sometime after 2.0.21
41
- //
42
- // Some installations of NextGen that upgraded from 1.9x to 2.0x have duplicate display types installed,
43
- // so for now (as of 2.0.21) we explicitly remove all display types from the db as a way of fixing this
44
- $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->posts} WHERE post_type = %s", 'display_type'));
45
-
46
- // trigger the install routine
47
  $installer->update(TRUE);
48
  }
49
 
50
- /*
51
  function uninstall_action()
52
  {
53
  $installer = C_Photocrati_Installer::get_instance();
@@ -55,5 +37,4 @@ class A_Reset_Form extends Mixin
55
  deactivate_plugins(NEXTGEN_GALLERY_PLUGIN_BASENAME);
56
  wp_redirect(admin_url('/plugins.php'));
57
  }
58
- */
59
- }
4
  {
5
  function get_title()
6
  {
7
+ return 'Reset & Uninstall';
8
  }
9
 
10
  function render()
15
  'reset_value' => _('Reset all options to default settings'),
16
  'reset_warning' => _('Replace all existing options and gallery options with their default settings'),
17
  'reset_label' => _('Reset settings'),
18
+ 'reset_confirmation' => _("Reset all options to default settings?\n\nChoose [Cancel] to Stop, [OK] to proceed."),
19
+ 'uninstall_label' => _('Deactivate & Uninstall'),
20
+ 'uninstall_confirmation'=>_("Completely remove NextGEN Gallery (delete galleries, tables, etc)?\n\nChoose [Cancel] to Stop, [OK] to proceed."),
21
  ),
22
  TRUE
23
  );
25
 
26
  function reset_action()
27
  {
 
 
28
  $installer = C_Photocrati_Installer::get_instance();
 
 
 
29
  $installer->uninstall(NEXTGEN_GALLERY_PLUGIN_BASENAME);
 
 
 
 
 
 
 
 
 
 
 
 
30
  $installer->update(TRUE);
31
  }
32
 
 
33
  function uninstall_action()
34
  {
35
  $installer = C_Photocrati_Installer::get_instance();
37
  deactivate_plugins(NEXTGEN_GALLERY_PLUGIN_BASENAME);
38
  wp_redirect(admin_url('/plugins.php'));
39
  }
40
+ }
 
products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php CHANGED
@@ -12,16 +12,96 @@ class A_Styles_Form extends Mixin
12
  return 'Styles';
13
  }
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  function render()
16
  {
17
  return $this->object->render_partial('photocrati-nextgen_other_options#styling_tab', array(
 
18
  'select_stylesheet_label' => 'What stylesheet would you like to use?',
19
- 'stylesheets' => C_NextGen_Style_Manager::get_instance()->find_all_stylesheets(),
20
  'activated_stylesheet' => $this->object->get_model()->CSSfile,
21
  'hidden_label' => _('(Show Customization Options)'),
22
  'active_label' => _('(Hide Customization Options)'),
23
  'cssfile_contents_label' => _('File Content:'),
24
- 'writable_label' => _('Changes you make to the contents will be saved to'),
25
  'readonly_label' => _('You could edit this file if it were writable')
26
  ), TRUE);
27
  }
@@ -37,9 +117,27 @@ class A_Styles_Form extends Mixin
37
 
38
  // Find filename
39
  $css_file = $settings['CSSfile'];
40
- $styles = C_NextGen_Style_Manager::get_instance();
41
- $styles->save($contents, $css_file);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
  }
44
  }
45
- }
12
  return 'Styles';
13
  }
14
 
15
+ function get_stylesheet_directory()
16
+ {
17
+ return NGGALLERY_ABSPATH . "css";
18
+ }
19
+
20
+ function get_cssfiles()
21
+ {
22
+ /** THIS FUNCTION WAS TAKEN FROM NGGLEGACY **/
23
+ $cssfiles = array ();
24
+
25
+ // Files in nggallery/css directory
26
+ $plugin_root = $this->object->get_stylesheet_directory();
27
+
28
+ $plugins_dir = @ dir($plugin_root);
29
+ if ($plugins_dir) {
30
+ while (($file = $plugins_dir->read()) !== false) {
31
+ if (preg_match('|^\.+$|', $file))
32
+ continue;
33
+ if (is_dir($plugin_root.'/'.$file)) {
34
+ $plugins_subdir = @ dir($plugin_root.'/'.$file);
35
+ if ($plugins_subdir) {
36
+ while (($subfile = $plugins_subdir->read()) !== false) {
37
+ if (preg_match('|^\.+$|', $subfile))
38
+ continue;
39
+ if (preg_match('|\.css$|', $subfile))
40
+ $plugin_files[] = "$file/$subfile";
41
+ }
42
+ }
43
+ } else {
44
+ if (preg_match('|\.css$|', $file))
45
+ $plugin_files[] = $file;
46
+ }
47
+ }
48
+ }
49
+
50
+ if ( !$plugins_dir || !$plugin_files )
51
+ return $cssfiles;
52
+
53
+ foreach ( $plugin_files as $plugin_file ) {
54
+ if ( !is_readable("$plugin_root/$plugin_file"))
55
+ continue;
56
+
57
+ $plugin_data = $this->object->_get_cssfiles_data("$plugin_root/$plugin_file");
58
+
59
+ if ( empty ($plugin_data['Name']) )
60
+ continue;
61
+
62
+ $cssfiles[plugin_basename($plugin_file)] = $plugin_data;
63
+ }
64
+
65
+ uasort($cssfiles, create_function('$a, $b', 'return strnatcasecmp($a["Name"], $b["Name"]);'));
66
+
67
+ return $cssfiles;
68
+ }
69
+
70
+ /**
71
+ * Parses the CSS header
72
+ * @param string $plugin_file
73
+ * @return array
74
+ */
75
+ function _get_cssfiles_data($plugin_file)
76
+ {
77
+ $plugin_data = implode('', file($plugin_file));
78
+ preg_match("|CSS Name:(.*)|i", $plugin_data, $plugin_name);
79
+ preg_match("|Description:(.*)|i", $plugin_data, $description);
80
+ preg_match("|Author:(.*)|i", $plugin_data, $author_name);
81
+ if (preg_match("|Version:(.*)|i", $plugin_data, $version))
82
+ $version = trim($version[1]);
83
+ else
84
+ $version = '';
85
+
86
+ $description = wptexturize(trim($description[1]));
87
+
88
+ $name = trim($plugin_name[1]);
89
+ $author = trim($author_name[1]);
90
+
91
+ return array ('Name' => $name, 'Description' => $description, 'Author' => $author, 'Version' => $version );
92
+ }
93
+
94
  function render()
95
  {
96
  return $this->object->render_partial('photocrati-nextgen_other_options#styling_tab', array(
97
+ 'stylesheet_directory' => $this->object->get_stylesheet_directory(),
98
  'select_stylesheet_label' => 'What stylesheet would you like to use?',
99
+ 'stylesheets' => $this->object->get_cssfiles(),
100
  'activated_stylesheet' => $this->object->get_model()->CSSfile,
101
  'hidden_label' => _('(Show Customization Options)'),
102
  'active_label' => _('(Hide Customization Options)'),
103
  'cssfile_contents_label' => _('File Content:'),
104
+ 'writable_label' => _('Changes you make to the contents will be saved'),
105
  'readonly_label' => _('You could edit this file if it were writable')
106
  ), TRUE);
107
  }
117
 
118
  // Find filename
119
  $css_file = $settings['CSSfile'];
120
+ $filename = path_join(TEMPLATEPATH, $css_file);
121
+ $alt_filename = path_join(
122
+ NGGALLERY_ABSPATH,
123
+ implode(DIRECTORY_SEPARATOR, array('css', $css_file))
124
+ );
125
+ $found = FALSE;
126
+ if (file_exists($filename)) {
127
+ if (is_writable($filename)) $found = $filename;
128
+ }
129
+ elseif (file_exists($alt_filename)) {
130
+ if (is_writable($alt_filename)) $found = $alt_filename;
131
+ }
132
+
133
+ // Write file contents
134
+ if ($found)
135
+ {
136
+ $fp = fopen($found, 'w');
137
+ fwrite($fp, $contents);
138
+ fclose($fp);
139
+ }
140
  }
141
  }
142
  }
143
+ }
products/photocrati_nextgen/modules/nextgen_other_options/adapter.stylesheet_ajax_actions.php CHANGED
@@ -15,16 +15,25 @@ class A_Stylesheet_Ajax_Actions extends Mixin
15
 
16
  if ($this->object->_authorized_for_stylesheet_action()) {
17
 
18
- $styles = C_NextGen_Style_Manager::get_instance();
19
- $abspath = $styles->find_selected_stylesheet_abspath($this->object->param('cssfile'));
20
- $writepath = $styles->get_selected_stylesheet_saved_abspath($this->object->param('cssfile'));
21
- if (is_readable($abspath)) {
22
- $retval['contents'] = file_get_contents($abspath);
23
- $retval['writable'] = is_writable($abspath);
24
- $retval['abspath'] = $abspath;
25
- $retval['writepath']= $writepath;
 
 
26
  }
27
- else $retval['error'] = "Could not find stylesheet";
 
 
 
 
 
 
 
28
  }
29
  else {
30
  $retval['error'] = 'Unauthorized';
15
 
16
  if ($this->object->_authorized_for_stylesheet_action()) {
17
 
18
+ // Ensure we have a CSS file to open
19
+ $found = FALSE;
20
+ if (($cssfile = $this->object->param('cssfile'))) {
21
+ $alt_filename = path_join(TEMPLATEPATH, $cssfile);
22
+ $filename = path_join(
23
+ NGGALLERY_ABSPATH,
24
+ implode(DIRECTORY_SEPARATOR, array('css', $cssfile))
25
+ );
26
+ if (file_exists($alt_filename)) $found = $alt_filename;
27
+ elseif (file_exists($filename)) $found = $filename;
28
  }
29
+
30
+ // Did we find the CSS stylesheet?
31
+ if ($found != FALSE) {
32
+ $retval['contents'] = file_get_contents($found);
33
+ $retval['writable'] = is_writable($found);
34
+ }
35
+ else $retval['error'] = "Could not find CSS stylesheet";
36
+
37
  }
38
  else {
39
  $retval['error'] = 'Unauthorized';
products/photocrati_nextgen/modules/nextgen_other_options/class.settings_model.php CHANGED
@@ -22,7 +22,7 @@ class C_Settings_Model extends C_Component
22
  parent::define($context);
23
  $this->add_mixin('Mixin_Validation');
24
  if ($this->has_context('global') OR $this->has_context('site')) {
25
- $this->wrapper = C_NextGen_Settings::get_instance();
26
  }
27
  else $this->wrapper = C_NextGen_Settings::get_instance();
28
  }
22
  parent::define($context);
23
  $this->add_mixin('Mixin_Validation');
24
  if ($this->has_context('global') OR $this->has_context('site')) {
25
+ $this->wrapper = C_NextGen_Global_Settings::get_instance();
26
  }
27
  else $this->wrapper = C_NextGen_Settings::get_instance();
28
  }
products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php CHANGED
@@ -16,7 +16,7 @@ class M_NextGen_Other_Options extends C_Base_Module
16
  'photocrati-nextgen_other_options',
17
  'Other Options',
18
  'NextGEN Gallery Others Options Page',
19
- '0.5',
20
  'http://www.nextgen-gallery.com',
21
  'Photocrati Media',
22
  'http://www.photocrati.com'
16
  'photocrati-nextgen_other_options',
17
  'Other Options',
18
  'NextGEN Gallery Others Options Page',
19
+ '0.2',
20
  'http://www.nextgen-gallery.com',
21
  'Photocrati Media',
22
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/nextgen_other_options/static/nextgen_settings_page.js CHANGED
@@ -1,6 +1,6 @@
1
  jQuery(function($){
2
 
3
- $('select.select2').select2();
4
  $('label.tooltip, span.tooltip').tooltip();
5
 
6
  /**** LIGHTBOX EFFECT TAB ****/
@@ -113,7 +113,7 @@ jQuery(function($){
113
  if (typeof res !== 'object') res = JSON.parse(res);
114
  $('#cssfile_contents').val(res.error ? res.error : res.contents);
115
  var status = $('#writable_identicator');
116
- if (res.writable) status.text(status.attr('writable_label')+' '+res.writepath);
117
  else status.text(status.attr('readonly_label'));
118
  });
119
  }).change();
1
  jQuery(function($){
2
 
3
+ $('.select2').select2();
4
  $('label.tooltip, span.tooltip').tooltip();
5
 
6
  /**** LIGHTBOX EFFECT TAB ****/
113
  if (typeof res !== 'object') res = JSON.parse(res);
114
  $('#cssfile_contents').val(res.error ? res.error : res.contents);
115
  var status = $('#writable_identicator');
116
+ if (res.writable) status.text(status.attr('writable_label'));
117
  else status.text(status.attr('readonly_label'));
118
  });
119
  }).change();
products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php CHANGED
@@ -129,10 +129,10 @@
129
  </label>
130
  <input
131
  id="backup_images_yes"
132
- name="image_options[imgBackup]"
133
  value="1"
134
  type="radio"
135
- <?php checked(1, $backup_images ? 1 : 0)?>
136
  />
137
  &nbsp;
138
  <label for="backup_images_no">
@@ -140,10 +140,10 @@
140
  </label>
141
  <input
142
  id="backup_images_no"
143
- name="image_options[imgBackup]"
144
  value="0"
145
  type="radio"
146
- <?php checked(0, $backup_images ? 1 : 0)?>
147
  />
148
  </td>
149
  </tr>
@@ -212,47 +212,34 @@
212
  ><?php echo_h($related_images_hidden_label) ?></a>
213
  </td>
214
  </tr>
215
- <tbody id="related_images_advanced_form" class="hidden">
216
- <tr>
217
- <td>
218
- <label for="match_related_images">
219
- <?php echo_h($match_related_images_label) ?>
220
- </label>
221
- </td>
222
- <td>
223
- <select id="match_related_images" name="image_options[appendType]">
224
- <?php foreach ($match_related_image_options as $label => $value): ?>
225
- <option
226
- value="<?php echo esc_attr($value)?>"
227
- <?php selected($value, $match_related_images)?>
228
- >
229
- <?php echo_h($label) ?>
230
- </option>
231
- <?php endforeach ?>
232
- </select>
233
- </td>
234
- <td class="column3">
235
- <label for="max_related_images">
236
- <?php echo_h($max_related_images_label)?>
237
- </label>
238
- <input
239
- id="max_related_images"
240
- type="text"
241
- name="image_options[maxImages]"
242
- value="<?php echo esc_attr($max_related_images)?>"
243
- />
244
- </td>
245
- </tr>
246
- <tr>
247
- <td>
248
- <label for="related_images_heading">
249
- <?php echo_h($related_images_heading_label) ?>
250
- </label>
251
- </td>
252
- <td>
253
- <input id="related_images_heading" type="text" name="image_options[relatedHeading]"
254
- value="<?php echo esc_attr($related_images_heading)?>"/>
255
- </td>
256
- </tr>
257
- </tbody>
258
  </table>
129
  </label>
130
  <input
131
  id="backup_images_yes"
132
+ name="image_options[backup_images]"
133
  value="1"
134
  type="radio"
135
+ <?php checked(1, $backup_images)?>
136
  />
137
  &nbsp;
138
  <label for="backup_images_no">
140
  </label>
141
  <input
142
  id="backup_images_no"
143
+ name="image_options[backup_images]"
144
  value="0"
145
  type="radio"
146
+ <?php checked(0, $backup_images)?>
147
  />
148
  </td>
149
  </tr>
212
  ><?php echo_h($related_images_hidden_label) ?></a>
213
  </td>
214
  </tr>
215
+ <tr id="related_images_advanced_form" class="hidden">
216
+ <td>
217
+ <label for="match_related_images">
218
+ <?php echo_h($match_related_images_label) ?>
219
+ </label>
220
+ </td>
221
+ <td>
222
+ <select id="match_related_images" name="image_options[appendType]">
223
+ <?php foreach ($match_related_image_options as $label => $value): ?>
224
+ <option
225
+ value="<?php echo esc_attr($value)?>"
226
+ <?php selected($value, $match_related_images)?>
227
+ >
228
+ <?php echo_h($label) ?>
229
+ </option>
230
+ <?php endforeach ?>
231
+ </select>
232
+ </td>
233
+ <td class="column3">
234
+ <label for="max_related_images">
235
+ <?php echo_h($max_related_images_label)?>
236
+ </label>
237
+ <input
238
+ id="max_related_images"
239
+ type="text"
240
+ name="image_options[maxImages]"
241
+ value="<?php echo esc_attr($max_related_images)?>"
242
+ />
243
+ </td>
244
+ </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
245
  </table>
products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php CHANGED
@@ -44,24 +44,6 @@
44
  <?php echo $form; ?>
45
  </tbody>
46
  <?php } ?>
47
- <tr>
48
- <td>&nbsp;
49
- </td>
50
- <td>&nbsp;
51
- </td>
52
- </tr>
53
- <tr>
54
- <td class="column1">
55
- <label for="lightbox_global"><?php esc_html_e('What must the lightbox be applied to?', 'nggallery')?></label>
56
- </td>
57
- <td>
58
- <select name="thumbEffectContext" id="lightbox_global">
59
- <option value="nextgen_images" <?php selected('nextgen_images', $lightbox_global, TRUE)?>><?php esc_html_e('Only apply to NextGEN images', 'nggallery'); ?></option>
60
- <option value="nextgen_and_wp_images" <?php selected('nextgen_and_wp_images', $lightbox_global, TRUE)?>><?php esc_html_e('Only apply to NextGEN and WordPress images', 'nggallery'); ?></option>
61
- <option value="all_images" <?php selected('all_images', $lightbox_global, TRUE)?>><?php esc_html_e('Try to apply to all images', 'nggallery'); ?></option>
62
- <option value="all_images_direct" <?php selected('all_images_direct', $lightbox_global, TRUE)?>><?php esc_html_e('Try to apply to all images that link to image files', 'nggallery'); ?></option>
63
- </select>
64
- </td>
65
- </tr>
66
  </tbody>
67
- </table>
44
  <?php echo $form; ?>
45
  </tbody>
46
  <?php } ?>
47
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  </tbody>
49
+ </table>
products/photocrati_nextgen/modules/nextgen_other_options/templates/misc_tab.php CHANGED
@@ -32,6 +32,35 @@
32
  </p>
33
  </td>
34
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  <tr>
36
  <td class='column1'>
37
  <?php echo $cache_label; ?>
@@ -48,6 +77,4 @@
48
  </tr>
49
 
50
  <?php print $slug_field; ?>
51
-
52
- <?php print $maximum_entity_count_field; ?>
53
  </table>
32
  </p>
33
  </td>
34
  </tr>
35
+ <tr>
36
+ <td class="column1">
37
+ <label for="minifier_activated">
38
+ <?php echo_h($minifier_activated_label)?>
39
+ </label>
40
+ </td>
41
+ <td>
42
+ <label for="minifier_activated">
43
+ <?php echo_h($minifier_activated_yes) ?>
44
+ </label>
45
+ <input id='minifier_activated'
46
+ type="radio"
47
+ name="misc_settings[resource_minifier]"
48
+ value="1"
49
+ <?php checked(TRUE, $minifier_activated ? TRUE : FALSE); ?>/>
50
+ &nbsp;
51
+ <label for="minifier_activated_no">
52
+ <?php echo_h($minifier_activated_no) ?>
53
+ </label>
54
+ <input id='minifier_activated_no'
55
+ type="radio"
56
+ name="misc_settings[resource_minifier]"
57
+ value="0"
58
+ <?php checked(FALSE, $minifier_activated ? TRUE : FALSE); ?>/>
59
+ <p class="description">
60
+ <?php echo_h($minifier_activated_help)?>
61
+ </p>
62
+ </td>
63
+ </tr>
64
  <tr>
65
  <td class='column1'>
66
  <?php echo $cache_label; ?>
77
  </tr>
78
 
79
  <?php print $slug_field; ?>
 
 
80
  </table>
products/photocrati_nextgen/modules/nextgen_other_options/templates/reset_tab.php CHANGED
@@ -15,7 +15,6 @@
15
  />
16
  </td>
17
  </tr>
18
- <?php /*
19
  <tr>
20
  <td class='column1'>
21
  <?php echo $uninstall_label; ?>
@@ -30,5 +29,4 @@
30
  />
31
  </td>
32
  </tr>
33
- */ ?>
34
  </table>
15
  />
16
  </td>
17
  </tr>
 
18
  <tr>
19
  <td class='column1'>
20
  <?php echo $uninstall_label; ?>
29
  />
30
  </td>
31
  </tr>
 
32
  </table>
products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php CHANGED
@@ -10,15 +10,16 @@
10
  <?php foreach ($stylesheets as $value => $p): ?>
11
  <option
12
  value="<?php echo esc_attr($value)?>"
13
- description="<?php echo esc_attr($p['description'])?>"
14
- author="<?php echo esc_attr($p['author'])?>"
15
- version="<?php echo esc_attr($p['version'])?>"
16
  <?php selected($value, $activated_stylesheet)?>
17
- ><?php echo_h($p['name'])?></option>
18
  <?php endforeach ?>
19
  </select>
20
  <p class="description">
21
- Place any custom stylesheets in <strong>wp-content/ngg_styles</strong><br/>
 
22
  All stylesheets must contain a <a href='#' onclick='javascript:alert("/*\nCSS Name: Example\nDescription: This is an example stylesheet\nAuthor: John Smith\nVersion: 1.0\n*/");'>file header</a>
23
  </p>
24
  </td>
@@ -45,8 +46,7 @@
45
  class="description"
46
  writable_label="<?php echo esc_attr($writable_label)?>"
47
  readonly_label="<?php echo esc_attr($readonly_label)?>"
48
- id="writable_identicator">
49
- </p>
50
  <textarea id="cssfile_contents" name="cssfile_contents"></textarea>
51
  </td>
52
  </tr>
10
  <?php foreach ($stylesheets as $value => $p): ?>
11
  <option
12
  value="<?php echo esc_attr($value)?>"
13
+ description="<?php echo esc_attr($p['Description'])?>"
14
+ author="<?php echo esc_attr($p['Author'])?>"
15
+ version="<?php echo esc_attr($p['Version'])?>"
16
  <?php selected($value, $activated_stylesheet)?>
17
+ ><?php echo_h($p['Name'])?></option>
18
  <?php endforeach ?>
19
  </select>
20
  <p class="description">
21
+ The appearance of your galleries can be customized through the use of stylesheets, found in:<br/>
22
+ <strong><?php echo_h($stylesheet_directory) ?></strong><br/>
23
  All stylesheets must contain a <a href='#' onclick='javascript:alert("/*\nCSS Name: Example\nDescription: This is an example stylesheet\nAuthor: John Smith\nVersion: 1.0\n*/");'>file header</a>
24
  </p>
25
  </td>
46
  class="description"
47
  writable_label="<?php echo esc_attr($writable_label)?>"
48
  readonly_label="<?php echo esc_attr($readonly_label)?>"
49
+ id="writable_identicator"></p>
 
50
  <textarea id="cssfile_contents" name="cssfile_contents"></textarea>
51
  </td>
52
  </tr>
products/photocrati_nextgen/modules/nextgen_pagination/mixin.nextgen_basic_pagination.php CHANGED
@@ -20,26 +20,8 @@ class Mixin_NextGen_Basic_Pagination extends Mixin
20
  $next_symbol = apply_filters('ngg_next_symbol', '&#9658;');
21
 
22
  if (empty($current_url))
23
- {
24
  $current_url = $this->object->get_routed_url(TRUE);
25
 
26
- if (is_archive())
27
- {
28
- $id = get_the_ID();
29
-
30
- if ($id == null)
31
- {
32
- global $post;
33
- $id = $post ? $post->ID : null;
34
- }
35
-
36
- if ($id != null && in_the_loop())
37
- {
38
- $current_url = get_permalink($id);
39
- }
40
- }
41
- }
42
-
43
  $return = array('prev' => '', 'next' => '', 'output' => '');
44
 
45
  if ($maxElement <= 0)
@@ -93,4 +75,4 @@ class Mixin_NextGen_Basic_Pagination extends Mixin
93
 
94
  return $return;
95
  }
96
- }
20
  $next_symbol = apply_filters('ngg_next_symbol', '&#9658;');
21
 
22
  if (empty($current_url))
 
23
  $current_url = $this->object->get_routed_url(TRUE);
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  $return = array('prev' => '', 'next' => '', 'output' => '');
26
 
27
  if ($maxElement <= 0)
75
 
76
  return $return;
77
  }
78
+ }
products/photocrati_nextgen/modules/nextgen_settings/class.nextgen_settings_installer.php CHANGED
@@ -7,24 +7,22 @@ class C_NextGen_Settings_Installer
7
 
8
  function __construct()
9
  {
10
- $this->blog_settings = C_NextGen_Settings::get_instance();
11
  $this->site_settings = C_NextGen_Global_Settings::get_instance();
 
12
 
13
- $this->_global_settings = array(
14
  'gallerypath' => 'wp-content/blogs.dir/%BLOG_ID%/files/',
15
  'wpmuCSSfile' => 'nggallery.css',
16
- 'wpmuStyle' => FALSE,
17
- 'wpmuRoles' => FALSE,
18
- 'wpmuImportFolder' => FALSE,
19
- 'wpmuZipUpload' => FALSE,
20
  'datamapper_driver' => 'custom_table_datamapper',
21
  'gallerystorage_driver' => 'ngglegacy_gallery_storage',
22
  'maximum_entity_count' => 500,
23
- 'router_param_slug' => 'nggallery'
 
24
  );
25
 
26
  $this->_local_settings = array(
27
- 'gallerypath' => 'wp-content/gallery/',
28
  'deleteImg' => True, // delete Images
29
  'swfUpload' => True, // activate the batch upload
30
  'usePermalinks' => False, // use permalinks for parameters
@@ -38,7 +36,6 @@ class C_NextGen_Settings_Installer
38
  'activateTags' => 0, // append related images
39
  'appendType' => 'tags', // look for category or tags
40
  'maxImages' => 7, // number of images toshow
41
- 'relatedHeading' => __('<h3>Related Images:</h3>', 'nggallery'), // subheading for related images
42
 
43
  // Thumbnail Settings
44
  'thumbwidth' => 120, // Thumb Width
@@ -49,7 +46,7 @@ class C_NextGen_Settings_Installer
49
  // Image Settings
50
  'imgWidth' => 800, // Image Width
51
  'imgHeight' => 600, // Image height
52
- 'imgQuality' => 100, // Image Quality
53
  'imgBackup' => True, // Create a backup
54
  'imgAutoResize' => False, // Resize after upload
55
 
@@ -58,8 +55,8 @@ class C_NextGen_Settings_Installer
58
  'galPagedGalleries' => 0, // Number of galleries per page (in a album)
59
  'galColumns' => 0, // Number of columns for the gallery
60
  'galShowSlide' => True, // Show slideshow
61
- 'galTextSlide' => __('[Show slideshow]', 'nggallery'), // Text for slideshow
62
- 'galTextGallery' => __('[Show thumbnails]', 'nggallery'), // Text for gallery
63
  'galShowOrder' => 'gallery', // Show order
64
  'galSort' => 'sortorder', // Sort order
65
  'galSortDir' => 'ASC', // Sort direction
@@ -71,7 +68,6 @@ class C_NextGen_Settings_Installer
71
  // Thumbnail Effect
72
  'thumbEffect' => 'fancybox', // select effect
73
  'thumbCode' => 'class="ngg-fancybox" rel="%GALLERY_NAME%"',
74
- 'thumbEffectContext' => 'nextgen_images', // select effect
75
 
76
  // Watermark settings
77
  'wmPos' => 'botRight', // Postion
@@ -115,7 +111,7 @@ class C_NextGen_Settings_Installer
115
 
116
  function install_global_settings($reset=FALSE)
117
  {
118
- foreach ($this->_global_settings as $key => $value) {
119
  if ($reset) $this->site_settings->set($key, NULL);
120
  $this->site_settings->set_default_value($key, $value);
121
  }
@@ -123,27 +119,19 @@ class C_NextGen_Settings_Installer
123
 
124
  function install_local_settings($reset=FALSE)
125
  {
 
 
 
 
 
 
 
 
 
126
  foreach ($this->_local_settings as $key => $value) {
127
  if ($reset) $this->blog_settings->set($key, NULL);
128
  $this->blog_settings->set_default_value($key, $value);
129
  }
130
-
131
- if (is_multisite())
132
- {
133
- // If this is already network activated we just need to use the existing setting
134
- // Note: attempting to use C_NextGen_Global_Settings here may result in an infinite loop,
135
- // so get_site_option() is used to check
136
- if ($options = get_site_option('ngg_options'))
137
- $gallerypath = $options['gallerypath'];
138
- else
139
- $gallerypath = $this->_global_settings['gallerypath'];
140
-
141
- $gallerypath = $this->gallerypath_replace($gallerypath);
142
-
143
- // a gallerypath setting has already been set, so we explicitly set a default AND set a new value
144
- $this->blog_settings->set_default_value('gallerypath', $gallerypath);
145
- $this->blog_settings->set('gallerypath', $gallerypath);
146
- }
147
  }
148
 
149
  function install($reset=FALSE)
@@ -151,21 +139,4 @@ class C_NextGen_Settings_Installer
151
  $this->install_global_settings($reset);
152
  $this->install_local_settings($reset);
153
  }
154
-
155
- function get_global_defaults()
156
- {
157
- return $this->_global_settings;
158
- }
159
-
160
- function get_local_defaults()
161
- {
162
- return $this->_local_settings;
163
- }
164
-
165
- function gallerypath_replace($gallerypath)
166
- {
167
- $gallerypath = str_replace('%BLOG_NAME%', get_bloginfo('name'), $gallerypath);
168
- $gallerypath = str_replace('%BLOG_ID%', get_current_blog_id(), $gallerypath);
169
- return $gallerypath;
170
- }
171
- }
7
 
8
  function __construct()
9
  {
 
10
  $this->site_settings = C_NextGen_Global_Settings::get_instance();
11
+ $this->blog_settings = C_NextGen_Settings::get_instance();
12
 
13
+ $this->_global_defaults = array(
14
  'gallerypath' => 'wp-content/blogs.dir/%BLOG_ID%/files/',
15
  'wpmuCSSfile' => 'nggallery.css',
16
+ 'wpmuStyle' => TRUE,
 
 
 
17
  'datamapper_driver' => 'custom_table_datamapper',
18
  'gallerystorage_driver' => 'ngglegacy_gallery_storage',
19
  'maximum_entity_count' => 500,
20
+ 'router_param_slug' => 'nggallery',
21
+ 'resource_minifier' => FALSE
22
  );
23
 
24
  $this->_local_settings = array(
25
+ 'gallerypath' => 'wp-content/galleries',
26
  'deleteImg' => True, // delete Images
27
  'swfUpload' => True, // activate the batch upload
28
  'usePermalinks' => False, // use permalinks for parameters
36
  'activateTags' => 0, // append related images
37
  'appendType' => 'tags', // look for category or tags
38
  'maxImages' => 7, // number of images toshow
 
39
 
40
  // Thumbnail Settings
41
  'thumbwidth' => 120, // Thumb Width
46
  // Image Settings
47
  'imgWidth' => 800, // Image Width
48
  'imgHeight' => 600, // Image height
49
+ 'imgQuality' => 85, // Image Quality
50
  'imgBackup' => True, // Create a backup
51
  'imgAutoResize' => False, // Resize after upload
52
 
55
  'galPagedGalleries' => 0, // Number of galleries per page (in a album)
56
  'galColumns' => 0, // Number of columns for the gallery
57
  'galShowSlide' => True, // Show slideshow
58
+ 'galTextSlide' => __('[Show as slideshow]', 'nggallery'), // Text for slideshow
59
+ 'galTextGallery' => __('[Show picture list]', 'nggallery'), // Text for gallery
60
  'galShowOrder' => 'gallery', // Show order
61
  'galSort' => 'sortorder', // Sort order
62
  'galSortDir' => 'ASC', // Sort direction
68
  // Thumbnail Effect
69
  'thumbEffect' => 'fancybox', // select effect
70
  'thumbCode' => 'class="ngg-fancybox" rel="%GALLERY_NAME%"',
 
71
 
72
  // Watermark settings
73
  'wmPos' => 'botRight', // Postion
111
 
112
  function install_global_settings($reset=FALSE)
113
  {
114
+ foreach ($this->_global_defaults as $key => $value) {
115
  if ($reset) $this->site_settings->set($key, NULL);
116
  $this->site_settings->set_default_value($key, $value);
117
  }
119
 
120
  function install_local_settings($reset=FALSE)
121
  {
122
+ if (is_multisite()) {
123
+ $gallerypath = str_replace(
124
+ array('%BLOG_ID%', get_current_blog_id()),
125
+ array('%BLOG_NAME%', get_bloginfo('name')),
126
+ $this->_global_defaults['gallerypath']
127
+ );
128
+ $this->_local_settings['gallerypath'] = $gallerypath;
129
+ }
130
+
131
  foreach ($this->_local_settings as $key => $value) {
132
  if ($reset) $this->blog_settings->set($key, NULL);
133
  $this->blog_settings->set_default_value($key, $value);
134
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  }
136
 
137
  function install($reset=FALSE)
139
  $this->install_global_settings($reset);
140
  $this->install_local_settings($reset);
141
  }
142
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php CHANGED
@@ -17,7 +17,7 @@ class M_NextGen_Settings extends C_Base_Module
17
  'photocrati-nextgen_settings',
18
  'NextGEN Gallery Settings',
19
  'Provides central management for NextGEN Gallery settings',
20
- '0.3',
21
  'http://www.nextgen-gallery.com',
22
  'Photocrati Media',
23
  'http://www.photocrati.com'
17
  'photocrati-nextgen_settings',
18
  'NextGEN Gallery Settings',
19
  'Provides central management for NextGEN Gallery settings',
20
+ '0.1',
21
  'http://www.nextgen-gallery.com',
22
  'Photocrati Media',
23
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/nextgen_xmlrpc/module.nextgen_xmlrpc.php DELETED
@@ -1,632 +0,0 @@
1
- <?php
2
-
3
- /***
4
- {
5
- Module: photocrati-nextgen_xmlrpc
6
- }
7
- ***/
8
- class M_NextGen_XmlRpc extends C_Base_Module
9
- {
10
- function define()
11
- {
12
- parent::define(
13
- 'photocrati-nextgen_xmlrpc',
14
- 'NextGEN Gallery XML-RPC',
15
- 'Provides an XML-RPC API for NextGEN Gallery',
16
- '0.2',
17
- 'http://www.nextgen-gallery.com',
18
- 'Photocrati Media',
19
- 'http://www.photocrati.com'
20
- );
21
- }
22
-
23
- function _register_hooks()
24
- {
25
- add_filter('xmlrpc_methods', array(&$this, 'add_methods') );
26
- }
27
-
28
- function add_methods($methods)
29
- {
30
- $methods['ngg.installed'] = array(&$this, 'get_version');
31
- // Image methods
32
- $methods['ngg.getImage'] = array(&$this, 'get_image');
33
- $methods['ngg.getImages'] = array(&$this, 'get_images');
34
- $methods['ngg.uploadImage'] = array(&$this, 'upload_image');
35
- $methods['ngg.editImage'] = array(&$this, 'edit_image');
36
- $methods['ngg.deleteImage'] = array(&$this, 'delete_image');
37
- // Gallery methods
38
- $methods['ngg.getGallery'] = array(&$this, 'get_gallery');
39
- $methods['ngg.getGalleries'] = array(&$this, 'get_galleries');
40
- $methods['ngg.newGallery'] = array(&$this, 'create_gallery');
41
- $methods['ngg.editGallery'] = array(&$this, 'edit_gallery');
42
- $methods['ngg.deleteGallery'] = array(&$this, 'delete_gallery');
43
-
44
- // Album methods
45
- $methods['ngg.getAlbum'] = array(&$this, 'get_album');
46
- $methods['ngg.getAlbums'] = array(&$this, 'get_albums');
47
- $methods['ngg.newAlbum'] = array(&$this, 'create_album');
48
- $methods['ngg.editAlbum'] = array(&$this, 'edit_album');
49
- $methods['ngg.deleteAlbum'] = array(&$this, 'delete_album');
50
-
51
- return $methods;
52
- }
53
-
54
- /**
55
- * Gets the version of NextGEN Gallery installed
56
- * @return string
57
- */
58
- function get_version()
59
- {
60
- return array('version' => NEXTGEN_GALLERY_PLUGIN_VERSION);
61
- }
62
-
63
- /**
64
- * Login a user
65
- * @param $username
66
- * @param $password
67
- * @return bool|WP_Error|WP_User
68
- */
69
- function _login($username, $password, $blog_id=1)
70
- {
71
- $retval = FALSE;
72
-
73
- if (!is_a(($user_obj = wp_authenticate($username, $password)), 'WP_Error')) {
74
- wp_set_current_user($user_obj->ID);
75
- $retval = $user_obj;
76
-
77
- if (is_multisite()) switch_to_blog($blog_id);
78
- }
79
-
80
- return $retval;
81
- }
82
-
83
- function _can_manage_gallery($gallery_id_or_obj, $check_upload_capability=FALSE)
84
- {
85
- $retval = FALSE;
86
-
87
- // Get the gallery object, if we don't have it already
88
- $gallery = NULL;
89
- if (is_int($gallery_id_or_obj)) {
90
- $gallery_mapper = C_Gallery_Mapper::get_instance();
91
- $gallery = $gallery_mapper->find($gallery_id_or_obj);
92
- }
93
- else $gallery = $gallery_id_or_obj;
94
-
95
- if ($gallery) {
96
- $security = $this->get_registry()->get_utility('I_Security_Manager');
97
- $actor = $security->get_current_actor();
98
- if ($actor->get_entity_id() == $gallery->author) $retval = TRUE;
99
- elseif ($actor->is_allowed('nextgen_edit_gallery_unowned')) $retval = TRUE;
100
-
101
- // Optionally, check if the user can upload to this gallery
102
- if ($retval && $check_upload_capability) {
103
- $retval = $actor->is_allowed('nextgen_upload_image');
104
- }
105
- }
106
-
107
- return $retval;
108
- }
109
-
110
- function _add_gallery_properties($gallery)
111
- {
112
- if (is_object($gallery)) {
113
-
114
- $image_mapper = C_Image_Mapper::get_instance();
115
- $storage = C_Gallery_Storage::get_instance();
116
-
117
- // Vladimir's Lightroom plugins requires the 'id' to be a string
118
- // Ask if he can accept integers as well. Currently, integers break
119
- // his plugin
120
- $gallery->gid = (string) $gallery->gid;
121
-
122
- // Set other gallery properties
123
- $image_counter = array_pop($image_mapper->select('DISTINCT COUNT(*) as counter')->where(array("galleryid = %d", $gallery->gid))->run_query(FALSE, TRUE));
124
- $gallery->counter = $image_counter->counter;
125
- $gallery->abspath = $storage->get_gallery_abspath($gallery);
126
- }
127
- else return FALSE;
128
-
129
- return TRUE;
130
- }
131
-
132
- /**
133
- * Returns a single image object
134
- * @param $args (blog_id, username, password, pid)
135
- */
136
- function get_image($args, $return_model=FALSE)
137
- {
138
- $retval = new IXR_Error(403, 'Invalid username or password');
139
- $blog_id = intval($args[0]);
140
- $username = strval($args[1]);
141
- $password = strval($args[2]);
142
- $image_id = intval($args[3]);
143
-
144
- // Authenticate the user
145
- if ($this->_login($username, $password, $blog_id)) {
146
-
147
- // Try to find the image
148
- $image_mapper = C_Image_Mapper::get_instance();
149
- if (($image = $image_mapper->find($image_id, TRUE))) {
150
-
151
- // Try to find the gallery that the image belongs to
152
- $gallery_mapper = C_Gallery_Mapper::get_instance();
153
- if (($gallery = $gallery_mapper->find($image->galleryid))) {
154
-
155
- // Does the user have sufficient capabilities?
156
- if ($this->_can_manage_gallery($gallery)) {
157
- $storage = C_Gallery_Storage::get_instance();
158
- $image->imageURL = $storage->get_image_url($image,'full', TRUE);
159
- $image->thumbURL = $storage->get_thumb_url($image, TRUE);
160
- $image->imagePath = $storage->get_image_abspath($image);
161
- $image->thumbPath = $storage->get_thumb_abspath($image);
162
- $retval = $return_model ? $image : $image->get_entity();
163
- }
164
-
165
- else {
166
- $retval = new IXR_Error(403, "You don't have permission to manage gallery #{$image->galleryid}");
167
- }
168
- }
169
-
170
- // No gallery found
171
- else {
172
- $retval = new IXR_Error(404, "Gallery not found (with id #{$image->gallerid}");
173
- }
174
- }
175
-
176
- // No image found
177
- else $retval = FALSE;
178
- }
179
-
180
- return $retval;
181
- }
182
-
183
- /**
184
- * Returns a collection of images
185
- * @param $args (blog_id, username, password, gallery_id
186
- */
187
- function get_images($args)
188
- {
189
- $retval = new IXR_Error(403, 'Invalid username or password');
190
- $blog_id = intval($args[0]);
191
- $username = strval($args[1]);
192
- $password = strval($args[2]);
193
- $gallery_id = intval($args[3]);
194
-
195
- // Authenticate the user
196
- if ($this->_login($username, $password, $blog_id)) {
197
-
198
- // Try to find the gallery
199
- $mapper = C_Gallery_Mapper::get_instance();
200
- if (($gallery = $mapper->find($gallery_id, TRUE))) {
201
-
202
- // Does the user have sufficient capabilities?
203
- if ($this->_can_manage_gallery($gallery)) {
204
- $retval = $gallery->get_images();
205
- }
206
- else {
207
- $retval = new IXR_Error(403, "You don't have permission to manage gallery #{$image->galleryid}");
208
- }
209
- }
210
-
211
- // No gallery found
212
- else {
213
- $retval = new IXR_Error(404, "Gallery not found (with id #{$image->gallerid}");
214
- }
215
- }
216
-
217
- return $retval;
218
- }
219
-
220
- /**
221
- * Uploads an image to a particular gallery
222
- * @param $args (blog_id, username, password, data)
223
- *
224
- * Data is an assoc array:
225
- * o string name
226
- * o string type (optional)
227
- * o base64 bits
228
- * o bool overwrite (optional)
229
- * o int gallery
230
- * o int image_id (optional)
231
- * @return image
232
- */
233
- function upload_image($args)
234
- {
235
- $retval = new IXR_Error(403, 'Invalid username or password');
236
- $blog_id = intval($args[0]);
237
- $username = strval($args[1]);
238
- $password = strval($args[2]);
239
- $data = $args[3];
240
- $gallery_id = isset($data['gallery_id']) ? $data['gallery_id'] : $data['gallery'];
241
-
242
- // Authenticate the user
243
- if ($this->_login($username, $password, $blog_id)) {
244
-
245
- // Try to find the gallery
246
- $mapper = C_Gallery_Mapper::get_instance();
247
- if (($gallery = $mapper->find($gallery_id, TRUE))) {
248
-
249
- // Does the user have sufficient capabilities?
250
- if ($this->_can_manage_gallery($gallery, TRUE)) {
251
-
252
- // Upload the image
253
- $storage = C_Gallery_Storage::get_instance();
254
- $image = $storage->upload_base64_image($gallery, $data['bits'], $data['name'], $data['image_id']);
255
- if ($image) {
256
- $storage = C_Gallery_Storage::get_instance();
257
- $image->imageURL = $storage->get_image_url($image);
258
- $image->thumbURL = $storage->get_thumb_url($image);
259
- $image->imagePath = $storage->get_image_abspath($image);
260
- $image->thumbPath = $storage->get_thumb_abspath($image);
261
- $retval = $image->get_entity();
262
- }
263
- else
264
- $retval = new IXR_Error(500, "Could not upload image");
265
- }
266
- else {
267
- $retval = new IXR_Error(403, "You don't have permission to upload to gallery #{$image->galleryid}");
268
- }
269
- }
270
-
271
- // No gallery found
272
- else {
273
- $retval = new IXR_Error(404, "Gallery not found (with id #{$image->gallerid}");
274
- }
275
- }
276
-
277
- return $retval;
278
- }
279
-
280
- /**
281
- * Edits an image object
282
- * @param $args (blog_id, username, password, image_id, alttext, description, exclude, other_properties
283
- */
284
- function edit_image($args)
285
- {
286
- $alttext = strval($args[4]);
287
- $description = strval($args[5]);
288
- $exclude = intval($args[6]);
289
- $properties = isset($args[7]) ? (array)$args[7] : array();
290
-
291
- $retval = $this->get_image($args, TRUE);
292
- if (!($retval instanceof IXR_Error)) {
293
- $retval->alttext = $alttext;
294
- $retval->description = $description;
295
- $retval->exclude = $exclude;
296
-
297
- // Other properties can be specified using an associative array
298
- foreach ($properties as $key => $value) {
299
- $retval->$key = $value;
300
- }
301
-
302
- // Unset any dynamic properties not part of the schema
303
- foreach (array('imageURL', 'thumbURL', 'imagePath', 'thumbPath') as $key) {
304
- unset($retval->$key);
305
- }
306
-
307
- $retval = $retval->save();
308
- }
309
-
310
- return $retval;
311
- }
312
-
313
- /**
314
- * Deletes an existing image from a gallery
315
- * @param $args (blog_id, username, password, image_id)
316
- */
317
- function delete_image($args)
318
- {
319
- $retval = $this->get_image($args, TRUE);
320
- if (!($retval instanceof IXR_Error)) {
321
- $retval = $retval->destroy();
322
- }
323
- return $retval;
324
- }
325
-
326
- /**
327
- * Creates a new gallery
328
- * @param $args (blog_id, username, password, title)
329
- */
330
- function create_gallery($args)
331
- {
332
- $retval = new IXR_Error(403, 'Invalid username or password');
333
- $blog_id = intval($args[0]);
334
- $username = strval($args[1]);
335
- $password = strval($args[2]);
336
- $title = strval($args[3]);
337
-
338
- // Authenticate the user
339
- if ($this->_login($username, $password, $blog_id)) {
340
-
341
- $security = $this->get_registry()->get_utility('I_Security_Manager');
342
- if ($security->is_allowed('nextgen_edit_gallery')) {
343
- $mapper = C_Gallery_Mapper::get_instance();
344
- if (($gallery = $mapper->create(array('title' => $title))) && $gallery->save()) {
345
- $retval = $gallery->id();
346
- }
347
- else $retval = new IXR_Error(500, "Unable to create gallery");
348
-
349
- }
350
- else $retval = new IXR_Error(403, "Sorry, but you must be able to manage galleries. Check your roles/capabilities.");
351
- }
352
-
353
- return $retval;
354
- }
355
-
356
- /**
357
- * Edits an existing gallery
358
- * @param $args (blog_id, username, password, gallery_id, name, title, description, preview_pic_id)
359
- */
360
- function edit_gallery($args)
361
- {
362
- $retval = new IXR_Error(403, 'Invalid username or password');
363
- $blog_id = intval($args[0]);
364
- $username = strval($args[1]);
365
- $password = strval($args[2]);
366
- $gallery_id = intval($args[3]);
367
- $name = strval($args[4]);
368
- $title = strval($args[5]);
369
- $galdesc = strval($args[6]);
370
- $image_id = intval($args[7]);
371
- $properties = isset($args[8]) ? (array) $args[7] : array();
372
-
373
- // Authenticate the user
374
- if ($this->_login($username, $password, $blog_id)) {
375
-
376
- $mapper = C_Gallery_Mapper::get_instance();
377
- if (($gallery = $mapper->find($gallery_id, TRUE))) {
378
- if ($this->_can_manage_gallery($gallery)) {
379
- $gallery->name = $name;
380
- $gallery->title = $title;
381
- $gallery->galdesc = $galdesc;
382
- $gallery->previewpic = $image_id;
383
- foreach ($properties as $key => $value) {
384
- $gallery->$key = $value;
385
- }
386
-
387
- // Unset dynamic properties not part of the schema
388
- unset($gallery->counter);
389
- unset($gallery->abspath);
390
-
391
- $retval = $gallery->save();
392
- }
393
- else $retval = new IXR_Error(403, "You don't have permission to modify this gallery");
394
- }
395
- else $retval = new IXR_Error(404, "Gallery #{$gallery_id} doesn't exist");
396
- }
397
-
398
- return $retval;
399
- }
400
-
401
- /**
402
- * Returns all galleries
403
- * @param $args (blog_id, username, password)
404
- */
405
- function get_galleries($args)
406
- {
407
- $retval = new IXR_Error(403, 'Invalid username or password');
408
- $blog_id = intval($args[0]);
409
- $username = strval($args[1]);
410
- $password = strval($args[2]);
411
-
412
- // Authenticate the user
413
- if ($this->_login($username, $password, $blog_id)) {
414
-
415
- // Do we have permission?
416
- $security = $this->get_registry()->get_utility('I_Security_Manager');
417
- if ($security->is_allowed('nextgen_edit_gallery')) {
418
- $mapper = C_Gallery_Mapper::get_instance();
419
- $retval = array();
420
- foreach ($mapper->find_all() as $gallery) {
421
- $this->_add_gallery_properties($gallery);
422
- $retval[$gallery->{$gallery->id_field}] = (array)$gallery;
423
- }
424
- }
425
- else $retval = new IXR_Error( 401, __( 'Sorry, you must be able to manage galleries' ) );
426
- }
427
-
428
- return $retval;
429
- }
430
-
431
- /**
432
- * Gets a single gallery instance
433
- * @param $args (blog_id, username, password, gallery_id)
434
- */
435
- function get_gallery($args, $return_model=FALSE)
436
- {
437
- $retval = new IXR_Error(403, 'Invalid username or password');
438
- $blog_id = intval($args[0]);
439
- $username = strval($args[1]);
440
- $password = strval($args[2]);
441
- $gallery_id = intval($args[3]);
442
-
443
- // Authenticate the user
444
- if ($this->_login($username, $password, $blog_id)) {
445
- $mapper = C_Gallery_Mapper::get_instance();
446
- if (($gallery = $mapper->find($gallery_id, TRUE))) {
447
- if ($this->_can_manage_gallery($gallery)) {
448
- $this->_add_gallery_properties($gallery);
449
- $retval = $return_model ? $gallery : $gallery->get_entity();
450
- }
451
- else $retval = new IXR_Error(403, "Sorry, but you don't have permission to manage gallery #{$gallery->gid}");
452
- }
453
- else $retval = FALSE;
454
- }
455
-
456
- return $retval;
457
- }
458
-
459
- /**
460
- * Deletes a gallery
461
- * @param $args (blog_id, username, password, gallery_id)
462
- */
463
- function delete_gallery($args)
464
- {
465
- $retval = $this->get_gallery($args, TRUE);
466
-
467
- if (!($retval instanceof IXR_Error)) {
468
- $retval = $retval->destroy();
469
- }
470
-
471
- return $retval;
472
- }
473
-
474
- /**
475
- * Creates a new album
476
- * @param $args (blog_id, username, password, title, previewpic, description, galleries
477
- */
478
- function create_album($args)
479
- {
480
- $retval = new IXR_Error(403, 'Invalid username or password');
481
- $blog_id = intval($args[0]);
482
- $username = strval($args[1]);
483
- $password = strval($args[2]);
484
- $title = strval($args[3]);
485
- $previewpic = isset($args[4]) ? intval($args[4]): 0;
486
- $desc = isset($args[5]) ? strval($args[5]) : '';
487
- $sortorder = isset($args[6]) ? $args[6] : '';
488
- $page_id = isset($args[7]) ? intval($args[7]) : 0;
489
-
490
- // Authenticate the user
491
- if ($this->_login($username, $password, $blog_id)) {
492
-
493
- // Is request allowed?
494
- $security = $this->get_registry()->get_utility('I_Security_Manager');
495
- if ($security->is_allowed('nextgen_edit_album')) {
496
-
497
- $mapper = C_Album_Mapper::get_instance();
498
- $album = $mapper->create(array(
499
- 'name' => $title,
500
- 'previewpic' => $previewpic,
501
- 'albumdesc' => $desc,
502
- 'sortorder' => $sortorder,
503
- 'pageid' => $page_id
504
- ));
505
-
506
- if ($album->save()) $retval = $album->id();
507
- else $retval = new IXR_Error(500, "Unable to create album");
508
- }
509
- }
510
-
511
- return $retval;
512
- }
513
-
514
-
515
- /**
516
- * Returns all albums
517
- * @param $args (blog_id, username, password)
518
- * @return IXR_Error
519
- */
520
- function get_albums($args)
521
- {
522
- $retval = new IXR_Error(403, 'Invalid username or password');
523
- $blog_id = intval($args[0]);
524
- $username = strval($args[1]);
525
- $password = strval($args[2]);
526
-
527
- // Authenticate the user
528
- if ($this->_login($username, $password, $blog_id)) {
529
-
530
- // Are we allowed?
531
- $security = $this->get_registry()->get_utility('I_Security_Manager');
532
- if ($security->is_allowed('nextgen_edit_album')) {
533
-
534
- // Fetch all albums
535
- $mapper = C_Album_Mapper::get_instance();
536
- $retval = array();
537
- foreach ($mapper->find_all() as $album) {
538
- // Vladimir's Lightroom plugins requires the 'id' to be a string
539
- // Ask if he can accept integers as well. Currently, integers break
540
- // his plugin
541
- $album->id = (string) $album->id;
542
- $album->galleries = $album->sortorder;
543
-
544
- $retval[$album->{$album->id_field}] = (array) $album;
545
- }
546
- }
547
- else $retval = new IXR_Error(403, "Sorry, you must be able to manage albums");
548
-
549
-
550
- }
551
-
552
- return $retval;
553
- }
554
-
555
- /**
556
- * Gets a single album
557
- * @param $args (blog_id, username, password, album_id)
558
- */
559
- function get_album($args, $return_model=FALSE)
560
- {
561
- $retval = new IXR_Error(403, 'Invalid username or password');
562
- $blog_id = intval($args[0]);
563
- $username = strval($args[1]);
564
- $password = strval($args[2]);
565
- $album_id = intval($args[3]);
566
-
567
- // Authenticate the user
568
- if ($this->_login($username, $password, $blog_id)) {
569
-
570
- // Are we allowed?
571
- $security = $this->get_registry()->get_utility('I_Security_Manager');
572
- if ($security->is_allowed('nextgen_edit_album')) {
573
- $mapper = C_Album_Mapper::get_instance();
574
- if (($album = $mapper->find($album_id, TRUE))) {
575
- // Vladimir's Lightroom plugins requires the 'id' to be a string
576
- // Ask if he can accept integers as well. Currently, integers break
577
- // his plugin
578
- $album->id = (string) $album->id;
579
- $album->galleries = $album->sortorder;
580
-
581
- $retval = $return_model ? $album : $album->get_entity();
582
- }
583
- else $retval = FALSE;
584
-
585
- }
586
- else $retval = new IXR_Error(403, "Sorry, you must be able to manage albums");
587
- }
588
-
589
- return $retval;
590
- }
591
-
592
- /**
593
- * Deletes an existing album
594
- * @param $args (blog_id, username, password, album_id)
595
- */
596
- function delete_album($args)
597
- {
598
- $retval = $this->get_album($args, TRUE);
599
-
600
- if (!($retval instanceof IXR_Error)) {
601
- $retval = $retval->destroy();
602
- }
603
-
604
- return $retval;
605
- }
606
-
607
- /**
608
- * Edit an existing album
609
- * @param $args (blog_id, username, password, album_id, name, preview pic id, description, galleries)
610
- */
611
- function edit_album($args)
612
- {
613
- $retval = $this->get_album($args, TRUE);
614
-
615
- if (!($retval instanceof IXR_Error)) {
616
- $retval->name = strval($args[4]);
617
- $retval->previewpic = intval($args[5]);
618
- $retval->albumdesc = strval($args[6]);
619
- $retval->sortorder = $args[7];
620
-
621
- $properties = isset($args[8]) ? $args[8] : array();
622
- foreach ($properties as $key => $value) $retval->$key = $value;
623
- unset($retval->galleries);
624
-
625
- $retval = $retval->save();
626
- }
627
-
628
- return $retval;
629
- }
630
- }
631
-
632
- new M_NextGen_XmlRpc;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/ngglegacy/admin/admin.php CHANGED
@@ -172,7 +172,7 @@ class nggAdminPanel{
172
 
173
  add_menu_page( _n( 'Gallery', 'Galleries', 1, 'nggallery' ), _n( 'Gallery', 'Galleries', 1, 'nggallery' ), 'nggallery-wpmu', NGGFOLDER, array (&$this, 'show_network_settings'), path_join(NGGALLERY_URLPATH, 'admin/images/nextgen_16_color.png') );
174
  add_submenu_page( NGGFOLDER , __('Network settings', 'nggallery'), __('Network settings', 'nggallery'), 'nggallery-wpmu', NGGFOLDER, array (&$this, 'show_network_settings'));
175
- // add_submenu_page( NGGFOLDER , __('Reset / Uninstall', 'nggallery'), __('Reset / Uninstall', 'nggallery'), 'activate_plugins', 'nggallery-setup', array (&$this, 'show_menu'));
176
  }
177
 
178
  /**
@@ -392,7 +392,7 @@ class nggAdminPanel{
392
 
393
  function enqueue_jquery_ui_theme()
394
  {
395
- $settings = C_NextGen_Settings::get_instance();
396
  wp_enqueue_style(
397
  $settings->jquery_ui_theme,
398
  $settings->jquery_ui_theme_url,
172
 
173
  add_menu_page( _n( 'Gallery', 'Galleries', 1, 'nggallery' ), _n( 'Gallery', 'Galleries', 1, 'nggallery' ), 'nggallery-wpmu', NGGFOLDER, array (&$this, 'show_network_settings'), path_join(NGGALLERY_URLPATH, 'admin/images/nextgen_16_color.png') );
174
  add_submenu_page( NGGFOLDER , __('Network settings', 'nggallery'), __('Network settings', 'nggallery'), 'nggallery-wpmu', NGGFOLDER, array (&$this, 'show_network_settings'));
175
+ add_submenu_page( NGGFOLDER , __('Reset / Uninstall', 'nggallery'), __('Reset / Uninstall', 'nggallery'), 'activate_plugins', 'nggallery-setup', array (&$this, 'show_menu'));
176
  }
177
 
178
  /**
392
 
393
  function enqueue_jquery_ui_theme()
394
  {
395
+ $settings = C_NextGen_Global_Settings::get_instance();
396
  wp_enqueue_style(
397
  $settings->jquery_ui_theme,
398
  $settings->jquery_ui_theme_url,
products/photocrati_nextgen/modules/ngglegacy/admin/album.php CHANGED
@@ -70,6 +70,19 @@ class nggManageAlbum {
70
  return $this->_registry;
71
  }
72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  /**
74
  * Init the album output
75
  *
@@ -79,6 +92,9 @@ class nggManageAlbum {
79
  }
80
 
81
  function controller() {
 
 
 
82
 
83
  if (isset ($_POST['update']) || isset( $_POST['delete'] ) || isset( $_POST['add'] ) )
84
  $this->processor();
@@ -87,43 +103,12 @@ class nggManageAlbum {
87
  $this->update_album();
88
 
89
  // get first all galleries & albums
90
- $this->albums = array();
91
- foreach (C_Album_Mapper::get_instance()->find_all() as $album) {
92
- $this->albums[$album->{$album->id_field}] = $album;
93
- }
94
-
95
- $this->galleries = array();
96
- foreach (C_Gallery_Mapper::get_instance()->find_all() as $gallery) {
97
- $this->galleries[$gallery->{$gallery->id_field}] = $gallery;
98
- }
99
  $this->num_albums = count( $this->albums );
100
  $this->num_galleries = count( $this->galleries );
101
-
102
  $this->output();
103
- }
104
-
105
- function _get_album($id)
106
- {
107
- $retval = NULL;
108
-
109
- if (isset($this->albums[$id])) {
110
- $retval = $this->albums[$id];
111
- }
112
- else $retval = C_Album_Mapper::get_instance()->find($id);
113
-
114
- return $retval;
115
- }
116
-
117
- function _get_gallery($id)
118
- {
119
- $retval = NULL;
120
-
121
- if (isset($this->galleries[$id])) {
122
- $retval = $this->galleries[$id];
123
- }
124
- else $retval = C_Gallery_Mapper::get_instance()->find($id);
125
 
126
- return $retval;
127
  }
128
 
129
  /**
@@ -134,23 +119,27 @@ class nggManageAlbum {
134
  */
135
  function _set_album_preview_pic($album)
136
  {
137
- $sortorder = array_merge($album->sortorder);
 
138
 
139
  while(!$album->previewpic) {
140
  // If the album is missing a preview pic, set one!
141
- if (($first_entity = array_pop($sortorder))) {
142
 
143
  // Is the first entity a gallery or album
144
  if (substr($first_entity, 0, 1) == 'a') {
145
- $subalbum = $this->_get_album(substr($first_entity, 1));
146
  if ($subalbum->previewpic) {
147
  $album->previewpic = $subalbum->previewpic;
 
148
  }
149
  }
150
  else {
151
- $gallery = $this->_get_gallery($first_entity);
152
- if ($gallery && $gallery->previewpic) {
 
153
  $album->previewpic = $gallery->previewpic;
 
154
  }
155
  }
156
  }
@@ -173,23 +162,23 @@ class nggManageAlbum {
173
 
174
  $album = new stdClass();
175
  $album->name = $_POST['newalbum'];
176
- if (C_Album_Mapper::get_instance()->save($album)) {
177
- $this->currentID = $_REQUEST['act_album'] = $album->{$album->id_field};
178
- $this->albums[$this->currentID] = $album;
179
- do_action('ngg_add_album', $this->currentID);
180
- nggGallery::show_message(__('Update Successfully','nggallery'));
181
- }
182
- else {
183
- $this->currentID = $_REQUEST['act_album'] = 0;
184
- }
185
  }
186
 
187
- else if ( isset($_POST['update']) && isset($_REQUEST['act_album']) && $this->currentID = intval($_REQUEST['act_album']) ) {
188
 
189
  $gid = array();
190
 
191
  // Get the current album being updated
192
- $album = $this->_get_album($this->currentID);
193
 
194
  // Get the list of galleries/sub-albums to be added to this album
195
  parse_str($_REQUEST['sortorder']);
@@ -201,7 +190,7 @@ class nggManageAlbum {
201
  $this->_set_album_preview_pic($album);
202
 
203
  // Save the changes
204
- C_Album_Mapper::get_instance()->save($album);
205
 
206
  //hook for other plugins
207
  do_action('ngg_update_album_sortorder', $this->currentID);
@@ -215,36 +204,34 @@ class nggManageAlbum {
215
  if (!nggGallery::current_user_can( 'NextGEN Add/Delete album' ))
216
  wp_die(__('Cheatin&#8217; uh?'));
217
 
218
- $this->currentID = $_REQUEST['act_album'];
219
 
220
- if (C_Album_Mapper::get_instance()->destroy($this->currentID)) {
221
- //hook for other plugins
222
- do_action('ngg_delete_album', $this->currentID);
223
 
224
- // jump back to main selection
225
- $this->currentID = $_REQUEST['act_album'] = 0;
226
 
 
227
  nggGallery::show_message(__('Album deleted','nggallery'));
228
- }
229
-
230
  }
231
 
232
  }
233
 
234
  function update_album() {
 
235
 
236
  check_admin_referer('ngg_thickbox_form');
237
 
238
  if (!nggGallery::current_user_can( 'NextGEN Edit album settings' ))
239
  wp_die(__('Cheatin&#8217; uh?'));
240
 
241
- $this->currentID = $_REQUEST['act_album'];
242
- $album = $this->_get_album($this->currentID);
243
  $album->name = stripslashes($_POST['album_name']);
244
  $album->albumdesc = stripslashes($_POST['album_desc']);
245
  $album->previewpic = (int)$_POST['previewpic'];
246
  $album->pageid = (int)$_POST['pageid'];
247
- $result = C_Album_Mapper::get_instance()->save($album);
248
 
249
  //hook for other plugin to update the fields
250
  do_action('ngg_update_album', $this->currentID, $_POST);
@@ -257,12 +244,11 @@ class nggManageAlbum {
257
 
258
  global $wpdb, $nggdb;
259
 
260
- if (isset($_REQUEST['act_album'])) $this->currentID = intval($_REQUEST['act_album']);
261
 
262
  //TODO:Code MUST be optimized, how to flag a used gallery better ?
263
  $used_list = $this->get_used_galleries();
264
 
265
- $album = $this->_get_album($this->currentID);
266
  ?>
267
 
268
  <script type="text/javascript">
@@ -412,14 +398,14 @@ function showDialog() {
412
  <option value="0" ><?php esc_html_e('No album selected', 'nggallery') ?></option>
413
  <?php
414
  if( is_array($this->albums) ) {
415
- foreach($this->albums as $a) {
416
- $selected = ($this->currentID == $a->id) ? 'selected="selected" ' : '';
417
- echo '<option value="' . $a->id . '" ' . $selected . '>' . $a->id . ' - ' . esc_attr( $a->name ) . '</option>'."\n";
418
  }
419
  }
420
  ?>
421
  </select>
422
- <?php if ($album && $this->currentID){ ?>
423
  <input class="button-primary" type="submit" name="update" value="<?php esc_attr_e('Update', 'nggallery'); ?>"/>
424
  <?php if(nggGallery::current_user_can( 'NextGEN Edit album settings' )) { ?>
425
  <input class="button-secondary" type="submit" name="showThickbox" value="<?php esc_attr_e( 'Edit album', 'nggallery'); ?>" onclick="showDialog(); return false;" />
@@ -461,8 +447,8 @@ function showDialog() {
461
  <div id="albumContainer" class="widget-holder">
462
  <?php
463
  if( is_array( $this->albums ) ) {
464
- foreach($this->albums as $a) {
465
- $this->get_container('a' . $a->id);
466
  }
467
  }
468
  ?>
@@ -479,7 +465,7 @@ function showDialog() {
479
 
480
  if( is_array( $this->galleries ) ) {
481
  //get the array of galleries
482
- $sort_array = $album ? $album->sortorder : array();
483
  foreach($this->galleries as $gallery) {
484
  if (!in_array($gallery->gid, $sort_array)) {
485
  if (in_array($gallery->gid,$used_list))
@@ -495,13 +481,17 @@ function showDialog() {
495
 
496
  <!-- /#target-album -->
497
  <div class="widget target-album widget-left">
498
- <?php if ($album && $this->currentID){ ?>
 
 
 
 
499
  <div class="widget-top">
500
  <h3><?php esc_html_e('Album ID', 'nggallery'); ?> <?php echo $album->id . ' : ' . esc_html( $album->name ); ?> </h3>
501
  </div>
502
  <div id="galleryContainer" class="widget-holder target">
503
  <?php
504
- $sort_array = $album->sortorder;
505
  foreach($sort_array as $galleryid) {
506
  $this->get_container($galleryid, false);
507
  }
@@ -522,7 +512,7 @@ function showDialog() {
522
  </div><!-- /#container -->
523
  </div><!-- /#wrap -->
524
 
525
- <?php if ($album && $this->currentID): ?>
526
  <!-- #editalbum -->
527
  <div id="editalbum" style="display: none;" >
528
  <form id="form-edit-album" method="POST" accept-charset="utf-8">
@@ -611,7 +601,7 @@ function showDialog() {
611
  // if the id started with a 'a', then it's a sub album
612
  if (substr( $id, 0, 1) == 'a') {
613
 
614
- if ( !$album = $this->_get_album(substr( $id, 1)))
615
  return;
616
 
617
  $obj['id'] = $album->id;
@@ -630,7 +620,7 @@ function showDialog() {
630
  $image = $nggdb->find_image( $album->previewpic );
631
  if ($image) $thumbURL = @add_query_arg('timestamp', time(), $image->thumbURL);
632
  }
633
- $preview_image = $thumbURL ? '<div class="inlinepicture"><img rel="'.$album->previewpic.'" src="' . nextgen_esc_url( $thumbURL ). '" /></div>' : '';
634
  }
635
 
636
  // this indicates that we have a album container
@@ -657,7 +647,7 @@ function showDialog() {
657
  $image = $nggdb->find_image( $gallery->previewpic );
658
  $thumbURL = @add_query_arg('timestamp', time(), $image->thumbURL);
659
  }
660
- $preview_image = ( !is_null($thumbURL) ) ? '<div class="inlinepicture"><img rel="'.$gallery->previewpic.'" src="' . nextgen_esc_url( $thumbURL ). '" /></div>' : '';
661
  }
662
 
663
  $prefix = '';
@@ -693,8 +683,9 @@ function showDialog() {
693
  $used = array();
694
 
695
  if ($this->albums) {
696
- foreach($this->albums as $album) {
697
- foreach($album->sortorder as $galleryid) {
 
698
  if (!in_array($galleryid, $used))
699
  $used[] = $galleryid;
700
  }
70
  return $this->_registry;
71
  }
72
 
73
+ /**
74
+ * Gets the album mapper
75
+ * @return C_Album_Mapper
76
+ */
77
+ function get_album_mapper()
78
+ {
79
+ if (!isset($this->_album_mapper)) {
80
+ $this->_album_mapper = $this->get_registry()->get_utility('I_Album_Mapper');
81
+ }
82
+
83
+ return $this->_album_mapper;
84
+ }
85
+
86
  /**
87
  * Init the album output
88
  *
92
  }
93
 
94
  function controller() {
95
+ global $nggdb;
96
+
97
+ $this->currentID = isset($_REQUEST['act_album']) ? (int) $_REQUEST['act_album'] : 0 ;
98
 
99
  if (isset ($_POST['update']) || isset( $_POST['delete'] ) || isset( $_POST['add'] ) )
100
  $this->processor();
103
  $this->update_album();
104
 
105
  // get first all galleries & albums
106
+ $this->albums = $nggdb->find_all_album();
107
+ $this->galleries = $nggdb->find_all_galleries();
 
 
 
 
 
 
 
108
  $this->num_albums = count( $this->albums );
109
  $this->num_galleries = count( $this->galleries );
 
110
  $this->output();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
 
112
  }
113
 
114
  /**
119
  */
120
  function _set_album_preview_pic($album)
121
  {
122
+ $set_previewpic = FALSE;
123
+ $sortorder = $album->sortorder;
124
 
125
  while(!$album->previewpic) {
126
  // If the album is missing a preview pic, set one!
127
+ if (($first_entity = array_shift($sortorder))) {
128
 
129
  // Is the first entity a gallery or album
130
  if (substr($first_entity, 0, 1) == 'a') {
131
+ $subalbum = $this->get_album_mapper()->find(substr($first_entity, 1));
132
  if ($subalbum->previewpic) {
133
  $album->previewpic = $subalbum->previewpic;
134
+ $set_previewpic = TRUE;
135
  }
136
  }
137
  else {
138
+ $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper');
139
+ $gallery = $gallery_mapper->find($first_entity);
140
+ if ($gallery->previewpic) {
141
  $album->previewpic = $gallery->previewpic;
142
+ $set_previewpic = TRUE;
143
  }
144
  }
145
  }
162
 
163
  $album = new stdClass();
164
  $album->name = $_POST['newalbum'];
165
+ $result = $this->get_album_mapper()->save($album);
166
+ $this->currentID = $album->{$album->id_field};
167
+ if (!$this->currentID) $this->currentID = 0;
168
+
169
+ //hook for other plugins
170
+ do_action('ngg_add_album', $this->currentID);
171
+
172
+ if ($result)
173
+ nggGallery::show_message(__('Update Successfully','nggallery'));
174
  }
175
 
176
+ if ( isset($_POST['update']) && ($this->currentID > 0) ) {
177
 
178
  $gid = array();
179
 
180
  // Get the current album being updated
181
+ $album = $this->get_album_mapper()->find($this->currentID);
182
 
183
  // Get the list of galleries/sub-albums to be added to this album
184
  parse_str($_REQUEST['sortorder']);
190
  $this->_set_album_preview_pic($album);
191
 
192
  // Save the changes
193
+ $this->get_album_mapper()->save($album);
194
 
195
  //hook for other plugins
196
  do_action('ngg_update_album_sortorder', $this->currentID);
204
  if (!nggGallery::current_user_can( 'NextGEN Add/Delete album' ))
205
  wp_die(__('Cheatin&#8217; uh?'));
206
 
207
+ $result = nggdb::delete_album( $this->currentID );
208
 
209
+ //hook for other plugins
210
+ do_action('ngg_delete_album', $this->currentID);
 
211
 
212
+ // jump back to main selection
213
+ $this->currentID = 0;
214
 
215
+ if ($result)
216
  nggGallery::show_message(__('Album deleted','nggallery'));
 
 
217
  }
218
 
219
  }
220
 
221
  function update_album() {
222
+ global $wpdb, $nggdb;
223
 
224
  check_admin_referer('ngg_thickbox_form');
225
 
226
  if (!nggGallery::current_user_can( 'NextGEN Edit album settings' ))
227
  wp_die(__('Cheatin&#8217; uh?'));
228
 
229
+ $album = $this->get_album_mapper()->find($this->currentID, TRUE);
 
230
  $album->name = stripslashes($_POST['album_name']);
231
  $album->albumdesc = stripslashes($_POST['album_desc']);
232
  $album->previewpic = (int)$_POST['previewpic'];
233
  $album->pageid = (int)$_POST['pageid'];
234
+ $result = $album->save();
235
 
236
  //hook for other plugin to update the fields
237
  do_action('ngg_update_album', $this->currentID, $_POST);
244
 
245
  global $wpdb, $nggdb;
246
 
247
+ $this->currentID = isset($_REQUEST['act_album']) ? (int) $_REQUEST['act_album'] : 0 ;
248
 
249
  //TODO:Code MUST be optimized, how to flag a used gallery better ?
250
  $used_list = $this->get_used_galleries();
251
 
 
252
  ?>
253
 
254
  <script type="text/javascript">
398
  <option value="0" ><?php esc_html_e('No album selected', 'nggallery') ?></option>
399
  <?php
400
  if( is_array($this->albums) ) {
401
+ foreach($this->albums as $album) {
402
+ $selected = ($this->currentID == $album->id) ? 'selected="selected" ' : '';
403
+ echo '<option value="' . $album->id . '" ' . $selected . '>' . $album->id . ' - ' . esc_attr( $album->name ) . '</option>'."\n";
404
  }
405
  }
406
  ?>
407
  </select>
408
+ <?php if ($this->currentID > 0){ ?>
409
  <input class="button-primary" type="submit" name="update" value="<?php esc_attr_e('Update', 'nggallery'); ?>"/>
410
  <?php if(nggGallery::current_user_can( 'NextGEN Edit album settings' )) { ?>
411
  <input class="button-secondary" type="submit" name="showThickbox" value="<?php esc_attr_e( 'Edit album', 'nggallery'); ?>" onclick="showDialog(); return false;" />
447
  <div id="albumContainer" class="widget-holder">
448
  <?php
449
  if( is_array( $this->albums ) ) {
450
+ foreach($this->albums as $album) {
451
+ $this->get_container('a' . $album->id);
452
  }
453
  }
454
  ?>
465
 
466
  if( is_array( $this->galleries ) ) {
467
  //get the array of galleries
468
+ $sort_array = $this->currentID > 0 ? (array) $this->albums[$this->currentID]->galleries : array() ;
469
  foreach($this->galleries as $gallery) {
470
  if (!in_array($gallery->gid, $sort_array)) {
471
  if (in_array($gallery->gid,$used_list))
481
 
482
  <!-- /#target-album -->
483
  <div class="widget target-album widget-left">
484
+
485
+ <?php
486
+ if ($this->currentID > 0){
487
+ $album = $this->albums[$this->currentID];
488
+ ?>
489
  <div class="widget-top">
490
  <h3><?php esc_html_e('Album ID', 'nggallery'); ?> <?php echo $album->id . ' : ' . esc_html( $album->name ); ?> </h3>
491
  </div>
492
  <div id="galleryContainer" class="widget-holder target">
493
  <?php
494
+ $sort_array = (array) $this->albums[$this->currentID]->galleries;
495
  foreach($sort_array as $galleryid) {
496
  $this->get_container($galleryid, false);
497
  }
512
  </div><!-- /#container -->
513
  </div><!-- /#wrap -->
514
 
515
+ <?php if ($this->currentID > 0) : ?>
516
  <!-- #editalbum -->
517
  <div id="editalbum" style="display: none;" >
518
  <form id="form-edit-album" method="POST" accept-charset="utf-8">
601
  // if the id started with a 'a', then it's a sub album
602
  if (substr( $id, 0, 1) == 'a') {
603
 
604
+ if ( !$album = $this->albums[ substr( $id, 1) ] )
605
  return;
606
 
607
  $obj['id'] = $album->id;
620
  $image = $nggdb->find_image( $album->previewpic );
621
  if ($image) $thumbURL = @add_query_arg('timestamp', time(), $image->thumbURL);
622
  }
623
+ $preview_image = $thumbURL ? '<div class="inlinepicture"><img rel="'.$album->previewpic.'" src="' . esc_url( $thumbURL ). '" /></div>' : '';
624
  }
625
 
626
  // this indicates that we have a album container
647
  $image = $nggdb->find_image( $gallery->previewpic );
648
  $thumbURL = @add_query_arg('timestamp', time(), $image->thumbURL);
649
  }
650
+ $preview_image = ( !is_null($thumbURL) ) ? '<div class="inlinepicture"><img rel="'.$gallery->previewpic.'" src="' . esc_url( $thumbURL ). '" /></div>' : '';
651
  }
652
 
653
  $prefix = '';
683
  $used = array();
684
 
685
  if ($this->albums) {
686
+ foreach($this->albums as $key => $value) {
687
+ $sort_array = $this->albums[$key]->galleries;
688
+ foreach($sort_array as $galleryid) {
689
  if (!in_array($galleryid, $used))
690
  $used[] = $galleryid;
691
  }
products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php CHANGED
@@ -145,7 +145,7 @@ if ($thumbnail_crop_frame != null)
145
  <table width="98%" align="center" style="border:1px solid #DADADA">
146
  <tr>
147
  <td rowspan="3" valign="middle" align="center" width="350" style="background-color:#DADADA;">
148
- <img src="<?php echo nextgen_esc_url( $preview_image ); ?>" alt="" id="imageToEdit" />
149
  </td>
150
  <td width="300" style="background-color : #DADADA;">
151
  <small style="margin-left:6px; display:block;"><?php esc_html_e('Select the area for the thumbnail from the picture on the left.', 'nggallery'); ?></small>
@@ -154,10 +154,10 @@ if ($thumbnail_crop_frame != null)
154
  <tr>
155
  <td align="center" width="300" height="320">
156
  <div id="previewNewThumb" style="display:none;width:<?php echo $WidthHtmlPrev; ?>px;height:<?php echo $HeightHtmlPrev; ?>px;overflow:hidden; margin-left:5px;">
157
- <img src="<?php echo nextgen_esc_url( $preview_image ); ?>" id="imageToEditPreview" />
158
  </div>
159
  <div id="actualThumb">
160
- <img src="<?php echo nextgen_esc_url( $picture->thumbURL ); ?>?<?php echo time()?>" />
161
  </div>
162
  </td>
163
  </tr>
145
  <table width="98%" align="center" style="border:1px solid #DADADA">
146
  <tr>
147
  <td rowspan="3" valign="middle" align="center" width="350" style="background-color:#DADADA;">
148
+ <img src="<?php echo esc_url( $preview_image ); ?>" alt="" id="imageToEdit" />
149
  </td>
150
  <td width="300" style="background-color : #DADADA;">
151
  <small style="margin-left:6px; display:block;"><?php esc_html_e('Select the area for the thumbnail from the picture on the left.', 'nggallery'); ?></small>
154
  <tr>
155
  <td align="center" width="300" height="320">
156
  <div id="previewNewThumb" style="display:none;width:<?php echo $WidthHtmlPrev; ?>px;height:<?php echo $HeightHtmlPrev; ?>px;overflow:hidden; margin-left:5px;">
157
+ <img src="<?php echo esc_url( $preview_image ); ?>" id="imageToEditPreview" />
158
  </div>
159
  <div id="actualThumb">
160
+ <img src="<?php echo esc_url( $picture->thumbURL ); ?>?<?php echo time()?>" />
161
  </div>
162
  </td>
163
  </tr>
products/photocrati_nextgen/modules/ngglegacy/admin/functions.php CHANGED
@@ -578,7 +578,7 @@ class nggAdmin{
578
  * @param array|int $imagesIds
579
  * @return string result code
580
  */
581
- static function import_MetaData($imagesIds) {
582
 
583
  global $wpdb;
584
 
@@ -813,7 +813,7 @@ class nggAdmin{
813
  if ( $galleryID == '0' ) {
814
  //cleanup and take the zipfile name as folder name
815
  $foldername = sanitize_title(strtok ($filename, '.'));
816
- $foldername = rtrim($defaultpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . ltrim($foldername, DIRECTORY_SEPARATOR);
817
  } else {
818
  // get foldername if selected
819
  $foldername = $wpdb->get_var("SELECT path FROM $wpdb->nggallery WHERE gid = '$galleryID' ");
578
  * @param array|int $imagesIds
579
  * @return string result code
580
  */
581
+ function import_MetaData($imagesIds) {
582
 
583
  global $wpdb;
584
 
813
  if ( $galleryID == '0' ) {
814
  //cleanup and take the zipfile name as folder name
815
  $foldername = sanitize_title(strtok ($filename, '.'));
816
+ $foldername = $defaultpath . $foldername;
817
  } else {
818
  // get foldername if selected
819
  $foldername = $wpdb->get_var("SELECT path FROM $wpdb->nggallery WHERE gid = '$galleryID' ");
products/photocrati_nextgen/modules/ngglegacy/admin/install.php CHANGED
@@ -8,8 +8,7 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
8
  * @access internal
9
  * @return void
10
  */
11
- function nggallery_install($installer)
12
- {
13
 
14
  global $wpdb , $wp_roles, $wp_version;
15
 
@@ -36,6 +35,19 @@ function nggallery_install($installer)
36
  $role->add_cap('NextGEN Change options');
37
  $role->add_cap('NextGEN Attach Interface');
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  $nggpictures = $wpdb->prefix . 'ngg_pictures';
40
  $nggallery = $wpdb->prefix . 'ngg_gallery';
41
  $nggalbum = $wpdb->prefix . 'ngg_album';
@@ -55,8 +67,8 @@ function nggallery_install($installer)
55
  meta_data LONGTEXT,
56
  PRIMARY KEY (pid),
57
  KEY post_id (post_id)
58
- );";
59
- $installer->upgrade_schema($sql);
60
 
61
  // Create gallery table
62
  $sql = "CREATE TABLE " . $nggallery . " (
@@ -70,8 +82,8 @@ function nggallery_install($installer)
70
  previewpic BIGINT(20) DEFAULT '0' NOT NULL ,
71
  author BIGINT(20) DEFAULT '0' NOT NULL ,
72
  PRIMARY KEY (gid)
73
- )";
74
- $installer->upgrade_schema($sql);
75
 
76
  // Create albums table
77
  $sql = "CREATE TABLE " . $nggalbum . " (
@@ -83,8 +95,8 @@ function nggallery_install($installer)
83
  sortorder LONGTEXT NOT NULL,
84
  pageid BIGINT(20) DEFAULT '0' NOT NULL,
85
  PRIMARY KEY (id)
86
- )";
87
- $installer->upgrade_schema($sql);
88
 
89
  // check one table again, to be sure
90
  if( !$wpdb->get_var( "SHOW TABLES LIKE '$nggpictures'" ) ) {
@@ -93,12 +105,131 @@ function nggallery_install($installer)
93
  }
94
 
95
  $options = get_option('ngg_options');
 
 
 
96
 
97
  // if all is passed , save the DBVERSION
98
  add_option("ngg_db_version", NGG_DBVERSION);
99
 
100
  }
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  /**
103
  * Deregister a capability from all classic roles
104
  *
@@ -117,3 +248,35 @@ function ngg_remove_capability($capability){
117
  }
118
 
119
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  * @access internal
9
  * @return void
10
  */
11
+ function nggallery_install () {
 
12
 
13
  global $wpdb , $wp_roles, $wp_version;
14
 
35
  $role->add_cap('NextGEN Change options');
36
  $role->add_cap('NextGEN Attach Interface');
37
 
38
+ // upgrade function changed in WordPress 2.3
39
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
40
+
41
+ // add charset & collate like wp core
42
+ $charset_collate = '';
43
+
44
+ if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') ) {
45
+ if ( ! empty($wpdb->charset) )
46
+ $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
47
+ if ( ! empty($wpdb->collate) )
48
+ $charset_collate .= " COLLATE $wpdb->collate";
49
+ }
50
+
51
  $nggpictures = $wpdb->prefix . 'ngg_pictures';
52
  $nggallery = $wpdb->prefix . 'ngg_gallery';
53
  $nggalbum = $wpdb->prefix . 'ngg_album';
67
  meta_data LONGTEXT,
68
  PRIMARY KEY (pid),
69
  KEY post_id (post_id)
70
+ ) $charset_collate;";
71
+ dbDelta($sql);
72
 
73
  // Create gallery table
74
  $sql = "CREATE TABLE " . $nggallery . " (
82
  previewpic BIGINT(20) DEFAULT '0' NOT NULL ,
83
  author BIGINT(20) DEFAULT '0' NOT NULL ,
84
  PRIMARY KEY (gid)
85
+ ) $charset_collate;";
86
+ dbDelta($sql);
87
 
88
  // Create albums table
89
  $sql = "CREATE TABLE " . $nggalbum . " (
95
  sortorder LONGTEXT NOT NULL,
96
  pageid BIGINT(20) DEFAULT '0' NOT NULL,
97
  PRIMARY KEY (id)
98
+ ) $charset_collate;";
99
+ dbDelta($sql);
100
 
101
  // check one table again, to be sure
102
  if( !$wpdb->get_var( "SHOW TABLES LIKE '$nggpictures'" ) ) {
105
  }
106
 
107
  $options = get_option('ngg_options');
108
+ // set the default settings, if we didn't upgrade
109
+ if ( empty( $options ) )
110
+ ngg_default_options();
111
 
112
  // if all is passed , save the DBVERSION
113
  add_option("ngg_db_version", NGG_DBVERSION);
114
 
115
  }
116
 
117
+ /**
118
+ * Setup the default option array for the gallery
119
+ *
120
+ * @access internal
121
+ * @since version 0.33
122
+ * @return void
123
+ */
124
+ function ngg_default_options() {
125
+
126
+ global $blog_id, $ngg;
127
+
128
+ $ngg_options['gallerypath'] = 'wp-content/gallery/'; // set default path to the gallery
129
+ $ngg_options['deleteImg'] = true; // delete Images
130
+ $ngg_options['swfUpload'] = true; // activate the batch upload
131
+ $ngg_options['usePermalinks'] = false; // use permalinks for parameters
132
+ $ngg_options['permalinkSlug'] = 'nggallery'; // the default slug for permalinks
133
+ $ngg_options['graphicLibrary'] = 'gd'; // default graphic library
134
+ $ngg_options['imageMagickDir'] = '/usr/local/bin/'; // default path to ImageMagick
135
+ $ngg_options['useMediaRSS'] = false; // activate the global Media RSS file
136
+ $ngg_options['usePicLens'] = false; // activate the PicLens Link for galleries
137
+
138
+ // Tags / categories
139
+ $ngg_options['activateTags'] = false; // append related images
140
+ $ngg_options['appendType'] = 'tags'; // look for category or tags
141
+ $ngg_options['maxImages'] = 7; // number of images toshow
142
+
143
+ // Thumbnail Settings
144
+ $ngg_options['thumbwidth'] = 120; // Thumb Width
145
+ $ngg_options['thumbheight'] = 90; // Thumb height
146
+ $ngg_options['thumbfix'] = true; // Fix the dimension
147
+ $ngg_options['thumbquality'] = 100; // Thumb Quality
148
+
149
+ // Image Settings
150
+ $ngg_options['imgWidth'] = 800; // Image Width
151
+ $ngg_options['imgHeight'] = 600; // Image height
152
+ $ngg_options['imgQuality'] = 85; // Image Quality
153
+ $ngg_options['imgBackup'] = true; // Create a backup
154
+ $ngg_options['imgAutoResize'] = false; // Resize after upload
155
+
156
+ // Gallery Settings
157
+ $ngg_options['galImages'] = '20'; // Number of images per page
158
+ $ngg_options['galPagedGalleries'] = 0; // Number of galleries per page (in a album)
159
+ $ngg_options['galColumns'] = 0; // Number of columns for the gallery
160
+ $ngg_options['galShowSlide'] = true; // Show slideshow
161
+ $ngg_options['galTextSlide'] = __('[Show as slideshow]','nggallery'); // Text for slideshow
162
+ $ngg_options['galTextGallery'] = __('[Show picture list]','nggallery'); // Text for gallery
163
+ $ngg_options['galShowOrder'] = 'gallery'; // Show order
164
+ $ngg_options['galSort'] = 'sortorder'; // Sort order
165
+ $ngg_options['galSortDir'] = 'ASC'; // Sort direction
166
+ $ngg_options['galNoPages'] = true; // use no subpages for gallery
167
+ $ngg_options['galImgBrowser'] = false; // Show ImageBrowser, instead effect
168
+ $ngg_options['galHiddenImg'] = false; // For paged galleries we can hide image
169
+ $ngg_options['galAjaxNav'] = false; // AJAX Navigation for Shutter effect
170
+
171
+ // Thumbnail Effect
172
+ $ngg_options['thumbEffect'] = 'shutter'; // select effect
173
+ $ngg_options['thumbCode'] = 'class="shutterset_%GALLERY_NAME%"';
174
+
175
+ // Watermark settings
176
+ $ngg_options['wmPos'] = 'botRight'; // Postion
177
+ $ngg_options['wmXpos'] = 5; // X Pos
178
+ $ngg_options['wmYpos'] = 5; // Y Pos
179
+ $ngg_options['wmType'] = 'text'; // Type : 'image' / 'text'
180
+ $ngg_options['wmPath'] = ''; // Path to image
181
+ $ngg_options['wmFont'] = 'arial.ttf'; // Font type
182
+ $ngg_options['wmSize'] = 10; // Font Size
183
+ $ngg_options['wmText'] = get_option('blogname'); // Text
184
+ $ngg_options['wmColor'] = '000000'; // Font Color
185
+ $ngg_options['wmOpaque'] = '100'; // Font Opaque
186
+
187
+ // Image Rotator settings
188
+ $ngg_options['enableIR'] = false;
189
+ $ngg_options['slideFx'] = 'fade';
190
+ $ngg_options['irURL'] = path_join(NGGALLERY_URLPATH, 'imagerotator.swf');
191
+ $ngg_options['irXHTMLvalid'] = false;
192
+ $ngg_options['irAudio'] = '';
193
+ $ngg_options['irWidth'] = 600;
194
+ $ngg_options['irHeight'] = 400;
195
+ $ngg_options['irShuffle'] = true;
196
+ $ngg_options['irLinkfromdisplay'] = true;
197
+ $ngg_options['irShownavigation'] = false;
198
+ $ngg_options['irShowicons'] = false;
199
+ $ngg_options['irWatermark'] = false;
200
+ $ngg_options['irOverstretch'] = 'true';
201
+ $ngg_options['irRotatetime'] = 10;
202
+ $ngg_options['irTransition'] = 'random';
203
+ $ngg_options['irKenburns'] = false;
204
+ $ngg_options['irBackcolor'] = '000000';
205
+ $ngg_options['irFrontcolor'] = 'FFFFFF';
206
+ $ngg_options['irLightcolor'] = 'CC0000';
207
+ $ngg_options['irScreencolor'] = '000000';
208
+
209
+ // CSS Style
210
+ $ngg_options['activateCSS'] = true; // activate the CSS file
211
+ $ngg_options['CSSfile'] = 'nggallery.css'; // set default css filename
212
+
213
+ // special overrides for WPMU
214
+ if (is_multisite()) {
215
+ // get the site options
216
+ $ngg_wpmu_options = get_site_option('ngg_options');
217
+
218
+ // get the default value during first installation
219
+ if (!is_array($ngg_wpmu_options)) {
220
+ $ngg_wpmu_options['gallerypath'] = 'wp-content/blogs.dir/%BLOG_ID%/files/';
221
+ $ngg_wpmu_options['wpmuCSSfile'] = 'nggallery.css';
222
+ update_site_option('ngg_options', $ngg_wpmu_options);
223
+ }
224
+
225
+ $ngg_options['gallerypath'] = str_replace("%BLOG_ID%", $blog_id , $ngg_wpmu_options['gallerypath']);
226
+ $ngg_options['CSSfile'] = $ngg_wpmu_options['wpmuCSSfile'];
227
+ }
228
+
229
+ update_option('ngg_options', $ngg_options);
230
+
231
+ }
232
+
233
  /**
234
  * Deregister a capability from all classic roles
235
  *
248
  }
249
 
250
  }
251
+
252
+ /**
253
+ * Uninstall all settings and tables
254
+ * Called via Setup and register_unstall hook
255
+ *
256
+ * @access internal
257
+ * @return void
258
+ */
259
+ function nggallery_uninstall() {
260
+ global $wpdb;
261
+
262
+ // first remove all tables
263
+ $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}ngg_pictures");
264
+ $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}ngg_gallery");
265
+ $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}ngg_album");
266
+
267
+ // then remove all options
268
+ delete_option( 'ngg_options' );
269
+ delete_option( 'ngg_db_version' );
270
+ delete_option( 'ngg_update_exists' );
271
+ delete_option( 'ngg_next_update' );
272
+
273
+ // now remove the capability
274
+ ngg_remove_capability("NextGEN Gallery overview");
275
+ ngg_remove_capability("NextGEN Use TinyMCE");
276
+ ngg_remove_capability("NextGEN Upload images");
277
+ ngg_remove_capability("NextGEN Manage gallery");
278
+ ngg_remove_capability("NextGEN Edit album");
279
+ ngg_remove_capability("NextGEN Change style");
280
+ ngg_remove_capability("NextGEN Change options");
281
+ ngg_remove_capability("NextGEN Attach Interface");
282
+ }
products/photocrati_nextgen/modules/ngglegacy/admin/js/ngg.ajax.js CHANGED
@@ -26,7 +26,7 @@ nggAjax = {
26
  url: s.url,
27
  data:"action=" + s.action + "&operation=" + s.operation + "&_wpnonce=" + s.nonce + "&image=" + s.ids[index],
28
  cache: false,
29
- timeout: 30000,
30
  success: function(msg){
31
  switch ( parseInt(msg) ) {
32
  case -1:
@@ -73,7 +73,7 @@ nggAjax = {
73
  data:"action=" + s.action + "&operation=" + s.operation + "&_wpnonce=" + s.nonce + "&image=" + s.ids[index],
74
  dataType: "json",
75
  cache: false,
76
- timeout: 30000,
77
  success: function(msg){
78
  // join the array
79
  imageIDS = imageIDS.concat(msg);
26
  url: s.url,
27
  data:"action=" + s.action + "&operation=" + s.operation + "&_wpnonce=" + s.nonce + "&image=" + s.ids[index],
28
  cache: false,
29
+ timeout: 10000,
30
  success: function(msg){
31
  switch ( parseInt(msg) ) {
32
  case -1:
73
  data:"action=" + s.action + "&operation=" + s.operation + "&_wpnonce=" + s.nonce + "&image=" + s.ids[index],
74
  dataType: "json",
75
  cache: false,
76
+ timeout: 10000,
77
  success: function(msg){
78
  // join the array
79
  imageIDS = imageIDS.concat(msg);
products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php CHANGED
@@ -470,7 +470,7 @@ if($picturelist) {
470
  $attributes = 'class="title column-filename column-title"' . $style;
471
  ?>
472
  <td <?php echo $attributes ?>>
473
- <strong><a href="<?php echo nextgen_esc_url( $picture->imageURL ); ?>" class="thickbox" title="<?php echo esc_attr ($picture->filename); ?>">
474
  <?php echo ( empty($picture->alttext) ) ? esc_html( $picture->filename ) : esc_html( stripslashes(nggGallery::i18n($picture->alttext)) ); ?>
475
  </a></strong>
476
  <br /><?php echo $date; ?>
@@ -481,7 +481,7 @@ if($picturelist) {
481
  <p>
482
  <?php
483
  $actions = array();
484
- $actions['view'] = '<a class="shutter" href="' . nextgen_esc_url( $picture->imageURL ) . '" title="' . esc_attr( sprintf(__('View "%s"'), sanitize_title ($picture->filename) )) . '">' . __('View', 'nggallery') . '</a>';
485
  $actions['meta'] = '<a class="ngg-dialog" href="' . NGGALLERY_URLPATH . 'admin/showmeta.php?id=' . $pid . '" title="' . __('Show Meta data','nggallery') . '">' . __('Meta', 'nggallery') . '</a>';
486
  $actions['custom_thumb'] = '<a class="ngg-dialog" href="' . NGGALLERY_URLPATH . 'admin/edit-thumbnail.php?id=' . $pid . '" title="' . __('Customize thumbnail','nggallery') . '">' . __('Edit thumb', 'nggallery') . '</a>';
487
  $actions['rotate'] = '<a class="ngg-dialog" href="' . NGGALLERY_URLPATH . 'admin/rotate.php?id=' . $pid . '" title="' . __('Rotate','nggallery') . '">' . __('Rotate', 'nggallery') . '</a>';
@@ -506,8 +506,8 @@ if($picturelist) {
506
  case 'thumbnail' :
507
  $attributes = 'class="id column-thumbnail media-icon"' . $style;
508
  ?>
509
- <td <?php echo $attributes ?>><a href="<?php echo nextgen_esc_url ( add_query_arg('i', mt_rand(), $picture->imageURL) ); ?>" class="shutter" title="<?php echo $picture->filename ?>">
510
- <img class="thumb" src="<?php echo nextgen_esc_url ( add_query_arg('i', mt_rand(), $picture->thumbURL) ); ?>" id="thumb<?php echo $pid ?>" />
511
  </a>
512
  </td>
513
  <?php
470
  $attributes = 'class="title column-filename column-title"' . $style;
471
  ?>
472
  <td <?php echo $attributes ?>>
473
+ <strong><a href="<?php echo esc_url( $picture->imageURL ); ?>" class="thickbox" title="<?php echo esc_attr ($picture->filename); ?>">
474
  <?php echo ( empty($picture->alttext) ) ? esc_html( $picture->filename ) : esc_html( stripslashes(nggGallery::i18n($picture->alttext)) ); ?>
475
  </a></strong>
476
  <br /><?php echo $date; ?>
481
  <p>
482
  <?php
483
  $actions = array();
484
+ $actions['view'] = '<a class="shutter" href="' . esc_url( $picture->imageURL ) . '" title="' . esc_attr( sprintf(__('View "%s"'), sanitize_title ($picture->filename) )) . '">' . __('View', 'nggallery') . '</a>';
485
  $actions['meta'] = '<a class="ngg-dialog" href="' . NGGALLERY_URLPATH . 'admin/showmeta.php?id=' . $pid . '" title="' . __('Show Meta data','nggallery') . '">' . __('Meta', 'nggallery') . '</a>';
486
  $actions['custom_thumb'] = '<a class="ngg-dialog" href="' . NGGALLERY_URLPATH . 'admin/edit-thumbnail.php?id=' . $pid . '" title="' . __('Customize thumbnail','nggallery') . '">' . __('Edit thumb', 'nggallery') . '</a>';
487
  $actions['rotate'] = '<a class="ngg-dialog" href="' . NGGALLERY_URLPATH . 'admin/rotate.php?id=' . $pid . '" title="' . __('Rotate','nggallery') . '">' . __('Rotate', 'nggallery') . '</a>';
506
  case 'thumbnail' :
507
  $attributes = 'class="id column-thumbnail media-icon"' . $style;
508
  ?>
509
+ <td <?php echo $attributes ?>><a href="<?php echo esc_url ( add_query_arg('i', mt_rand(), $picture->imageURL) ); ?>" class="shutter" title="<?php echo $picture->filename ?>">
510
+ <img class="thumb" src="<?php echo esc_url ( add_query_arg('i', mt_rand(), $picture->thumbURL) ); ?>" id="thumb<?php echo $pid ?>" />
511
  </a>
512
  </td>
513
  <?php
products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php CHANGED
@@ -28,7 +28,7 @@ function nggallery_sortorder($galleryID = 0){
28
  $sortindex++;
29
  }
30
 
31
- C_Photocrati_Cache::flush('displayed_gallery_rendering');
32
 
33
  do_action('ngg_gallery_sort', $galleryID);
34
 
@@ -101,7 +101,7 @@ function nggallery_sortorder($galleryID = 0){
101
  <input class="button-primary action" type="submit" name="updateSortorder" onclick="saveImageOrder()" value="<?php _e('Update Sort Order', 'nggallery') ?>" />
102
  </div>
103
  <div class="alignright actions">
104
- <a href="<?php echo nextgen_esc_url( $back_url ); ?>" class="button"><?php _e('Back to gallery', 'nggallery'); ?></a>
105
  </div>
106
  </div>
107
  <input name="sortorder" type="hidden" />
@@ -123,7 +123,7 @@ function nggallery_sortorder($galleryID = 0){
123
  foreach($picturelist as $picture) {
124
  ?>
125
  <div class="imageBox" id="pid-<?php echo $picture->pid ?>">
126
- <div class="imageBox_theImage" style="background-image:url('<?php echo nextgen_esc_url( $picture->thumbURL ); ?>')"></div>
127
  <div class="imageBox_label"><span><?php echo esc_html( stripslashes($picture->alttext) ); ?></span></div>
128
  </div>
129
  <?php
28
  $sortindex++;
29
  }
30
 
31
+ C_Photocrati_Cache::flush();
32
 
33
  do_action('ngg_gallery_sort', $galleryID);
34
 
101
  <input class="button-primary action" type="submit" name="updateSortorder" onclick="saveImageOrder()" value="<?php _e('Update Sort Order', 'nggallery') ?>" />
102
  </div>
103
  <div class="alignright actions">
104
+ <a href="<?php echo esc_url( $back_url ); ?>" class="button"><?php _e('Back to gallery', 'nggallery'); ?></a>
105
  </div>
106
  </div>
107
  <input name="sortorder" type="hidden" />
123
  foreach($picturelist as $picture) {
124
  ?>
125
  <div class="imageBox" id="pid-<?php echo $picture->pid ?>">
126
+ <div class="imageBox_theImage" style="background-image:url('<?php echo esc_url( $picture->thumbURL ); ?>')"></div>
127
  <div class="imageBox_label"><span><?php echo esc_html( stripslashes($picture->alttext) ); ?></span></div>
128
  </div>
129
  <?php
products/photocrati_nextgen/modules/ngglegacy/admin/manage.php CHANGED
@@ -78,7 +78,7 @@ class nggManageGallery {
78
  @unlink($image->imagePath . '_backup' );
79
  }
80
  $mapper = C_Image_Mapper::get_instance();
81
- $result = $mapper->destroy($this->pid);
82
  do_action('ngg_delete_picture', $this->pid);
83
 
84
  if ($result)
@@ -376,16 +376,6 @@ class nggManageGallery {
376
  check_admin_referer('ngg_updategallery');
377
 
378
  if ( nggGallery::current_user_can( 'NextGEN Edit gallery options' ) && !isset ($_GET['s']) ) {
379
- $tags = array('<a>', '<abbr>', '<acronym>', '<address>', '<b>', '<base>', '<basefont>', '<big>', '<blockquote>', '<br>', '<br/>', '<caption>', '<center>', '<cite>', '<code>', '<col>', '<colgroup>', '<dd>', '<del>', '<dfn>', '<dir>', '<div>', '<dl>', '<dt>', '<em>', '<fieldset>', '<font>', '<h1>', '<h2>', '<h3>', '<h4>', '<h5>', '<h6>', '<hr>', '<i>', '<ins>', '<label>', '<legend>', '<li>', '<menu>', '<noframes>', '<noscript>', '<ol>', '<optgroup>', '<option>', '<p>', '<pre>', '<q>', '<s>', '<samp>', '<select>', '<small>', '<span>', '<strike>', '<strong>', '<sub>', '<sup>', '<table>', '<tbody>', '<td>', '<tfoot>', '<th>', '<thead>', '<tr>', '<tt>', '<u>', '<ul>');
380
- $fields = array('title', 'gallerydesc');
381
-
382
- foreach ($fields as $field) {
383
- $html = $_POST[$field];
384
- $html = preg_replace('/\\s+on\\w+=(["\']).*?\\1/i', '', $html);
385
- $html = preg_replace('/(<\/[^>]+?>)(<[^>\/][^>]*?>)/', '$1 $2', $html);
386
- $html = strip_tags($html, implode('', $tags));
387
- $_POST[$field] = $html;
388
- }
389
 
390
  if ( nggGallery::current_user_can( 'NextGEN Edit gallery title' )) {
391
  // don't forget to update the slug
@@ -616,14 +606,14 @@ class nggManageGallery {
616
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
617
  'first-page' . $disable_first,
618
  esc_attr__( 'Go to the first page' ),
619
- nextgen_esc_url( remove_query_arg( 'paged', $current_url ) ),
620
  '&laquo;'
621
  );
622
 
623
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
624
  'prev-page' . $disable_first,
625
  esc_attr__( 'Go to the previous page' ),
626
- nextgen_esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),
627
  '&lsaquo;'
628
  );
629
 
@@ -643,14 +633,14 @@ class nggManageGallery {
643
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
644
  'next-page' . $disable_last,
645
  esc_attr__( 'Go to the next page' ),
646
- nextgen_esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),
647
  '&rsaquo;'
648
  );
649
 
650
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
651
  'last-page' . $disable_last,
652
  esc_attr__( 'Go to the last page' ),
653
- nextgen_esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
654
  '&raquo;'
655
  );
656
 
78
  @unlink($image->imagePath . '_backup' );
79
  }
80
  $mapper = C_Image_Mapper::get_instance();
81
+ $mapper->destroy($this->pid);
82
  do_action('ngg_delete_picture', $this->pid);
83
 
84
  if ($result)
376
  check_admin_referer('ngg_updategallery');
377
 
378
  if ( nggGallery::current_user_can( 'NextGEN Edit gallery options' ) && !isset ($_GET['s']) ) {
 
 
 
 
 
 
 
 
 
 
379
 
380
  if ( nggGallery::current_user_can( 'NextGEN Edit gallery title' )) {
381
  // don't forget to update the slug
606
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
607
  'first-page' . $disable_first,
608
  esc_attr__( 'Go to the first page' ),
609
+ esc_url( remove_query_arg( 'paged', $current_url ) ),
610
  '&laquo;'
611
  );
612
 
613
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
614
  'prev-page' . $disable_first,
615
  esc_attr__( 'Go to the previous page' ),
616
+ esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),
617
  '&lsaquo;'
618
  );
619
 
633
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
634
  'next-page' . $disable_last,
635
  esc_attr__( 'Go to the next page' ),
636
+ esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),
637
  '&rsaquo;'
638
  );
639
 
640
  $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
641
  'last-page' . $disable_last,
642
  esc_attr__( 'Go to the last page' ),
643
+ esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
644
  '&raquo;'
645
  );
646
 
products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php CHANGED
@@ -33,32 +33,18 @@ function media_upload_nextgen() {
33
  $img = nggdb::find_image($send_id);
34
  $thumbcode = $img->get_thumbcode();
35
  $class="ngg-singlepic ngg-{$image['align']}";
36
-
37
- // Create a shell displayed-gallery so we can inspect its settings
38
- $registry = C_Component_Registry::get_instance();
39
- $mapper = $registry->get_utility('I_Displayed_Gallery_Mapper');
40
- $factory = $registry->get_utility('I_Component_Factory');
41
- $args = array(
42
- 'display_type' => NEXTGEN_BASIC_SINGLEPIC_MODULE_NAME
43
- );
44
- $displayed_gallery = $factory->create('displayed_gallery', $args, $mapper);
45
- $width = $displayed_gallery->display_settings['width'];
46
- $height = $displayed_gallery->display_settings['height'];
47
-
48
  // Build output
49
  if ($image['size'] == "thumbnail")
50
- $html = "<img src='{$image['thumb']}' alt='{$alttext}' class='{$class}' />";
51
- else
52
- $html = '';
53
-
54
- // Wrap the link to the fullsize image around
55
- $html = "<a {$thumbcode} href='{$image['url']}' title='{$clean_description}'>{$html}</a>";
56
 
57
  if ($image['size'] == "full")
58
- $html = "<img src='{$image['url']}' alt='{$alttext}' class='{$class}' />";
59
 
60
  if ($image['size'] == "singlepic")
61
- $html = "[singlepic id={$send_id} w={$width} h={$height} float={$image['align']}]";
62
 
63
  media_upload_nextgen_save_image();
64
 
33
  $img = nggdb::find_image($send_id);
34
  $thumbcode = $img->get_thumbcode();
35
  $class="ngg-singlepic ngg-{$image['align']}";
36
+
 
 
 
 
 
 
 
 
 
 
 
37
  // Build output
38
  if ($image['size'] == "thumbnail")
39
+ $html = "<img src='{$image['thumb']}' alt='$alttext' class='$class' />";
40
+ // Wrap the link to the fullsize image around
41
+ $html = "<a $thumbcode href='{$image['url']}' title='$clean_description'>$html</a>";
 
 
 
42
 
43
  if ($image['size'] == "full")
44
+ $html = "<img src='{$image['url']}' alt='$alttext' class='$class' />";
45
 
46
  if ($image['size'] == "singlepic")
47
+ $html = "[singlepic id=$send_id w=320 h=240 float={$image['align']}]";
48
 
49
  media_upload_nextgen_save_image();
50
 
products/photocrati_nextgen/modules/ngglegacy/admin/overview.php CHANGED
@@ -90,7 +90,9 @@ if ( !(get_locale() == 'en_US') )
90
  add_meta_box('ngg_about_meta_box', __('About', 'nggallery'), 'ngg_AboutMetaBox', 'ngg_overview', 'left', 'core');
91
  //add_meta_box('ngg_lastdonators', __('Recent donators', 'nggallery'), 'ngg_widget_overview_donators', 'ngg_overview', 'right', 'core');
92
  if ( !is_multisite() || is_super_admin() ) {
 
93
  add_meta_box('ngg_server', __('Server Settings', 'nggallery'), 'ngg_overview_server', 'ngg_overview', 'right', 'core');
 
94
  }
95
 
96
  function ngg_AboutMetaBox()
@@ -110,12 +112,7 @@ function ngg_likeThisMetaBox() {
110
  echo sprintf(__('This plugin is primarily developed, maintained, supported and documented by <a href="%s" target="_blank">Photocrati Media</a> with a lot of love & effort. Any kind of contribution would be highly appreciated. Thanks!', 'nggallery'), 'http://www.photocrati.com/');
111
  echo '</p><ul>';
112
 
113
- $url = 'http://wordpress.org/plugins/nextgen-gallery/' ;
114
- echo "<li style='padding-left: 38px; background:transparent url(" . NGGALLERY_URLPATH . "admin/images/icon-rating.png ) no-repeat scroll center left; background-position: 16px 50%; text-decoration: none;'><a href='{$url}' target='_blank'>";
115
- _e('Please click "Works" on WordPress.org', 'nggallery');
116
- echo "</a></li>";
117
-
118
- $url = 'http://wordpress.org/plugins/nextgen-gallery/' ;
119
  echo "<li style='padding-left: 38px; background:transparent url(" . NGGALLERY_URLPATH . "admin/images/icon-rating.png ) no-repeat scroll center left; background-position: 16px 50%; text-decoration: none;'><a href='{$url}' target='_blank'>";
120
  _e('Give it a good rating on WordPress.org', 'nggallery');
121
  echo "</a></li>";
@@ -136,6 +133,210 @@ function ngg_likeThisMetaBox() {
136
  <div class="social" style="text-align:center;margin:15px 0 10px 0;"><span class="social" style="margin-right:5px;"><a target="_blank" href="http://twitter.com/NextGENGallery"><img title="Follow NextGEN on Twitter" alt="Twitter" src="' . NGGALLERY_URLPATH . 'admin/images/twitter.png"></a></span><span class="social" style="margin-right:5px;"><a target="_blank" href="http://www.facebook.com/NextGENGallery"><img title="Like NextGEN on Facebook" alt="Facebook" src="' . NGGALLERY_URLPATH . 'admin/images/facebook.png"></a></span><span class="social"><a target="_blank" href="http://plus.google.com/101643895780935290171"><img title="Add NextGEN to your circles" alt="GooglePlus" src="' . NGGALLERY_URLPATH . 'admin/images/googleplus.png"></a></span></div>';
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  /**
140
  * Show the server settings in a dashboard widget
141
  *
@@ -235,7 +436,7 @@ function ngg_overview_news(){
235
  $link = $item->get_link();
236
  while ( stristr($link, 'http') != $link )
237
  $link = substr($link, 1);
238
- $link = nextgen_esc_url(strip_tags($link));
239
  $title = esc_attr(strip_tags($item->get_title()));
240
  if ( empty($title) )
241
  $title = __('Untitled');
@@ -292,8 +493,8 @@ function ngg_overview_right_now() {
292
  <table>
293
  <tbody>
294
  <tr class="first">
295
- <td class="first b"><a href="admin.php?page=ngg_addgallery"><?php echo $images; ?></a></td>
296
- <td class="t"><a href="admin.php?page=ngg_addgallery"><?php echo _n( 'Image', 'Images', $images, 'nggallery' ); ?></a></td>
297
  <td class="b"></td>
298
  <td class="last"></td>
299
  </tr>
@@ -345,7 +546,7 @@ function ngg_dashboard_quota() {
345
  <div class="table table_content musubtable">
346
  <table>
347
  <tr class="first">
348
- <td class="first b b-posts"><?php printf( __( '<a href="%1$s" title="Manage Uploads" class="musublink">%2$sMB</a>' ), nextgen_esc_url( admin_url( 'admin.php?page=nggallery-manage-gallery' ) ), $quota ); ?></td>
349
  <td class="t posts"><?php _e( 'Space Allowed' ); ?></td>
350
  </tr>
351
  </table>
@@ -353,7 +554,7 @@ function ngg_dashboard_quota() {
353
  <div class="table table_discussion musubtable">
354
  <table>
355
  <tr class="first">
356
- <td class="b b-comments"><?php printf( __( '<a href="%1$s" title="Manage Uploads" class="musublink">%2$sMB (%3$s%%)</a>' ), nextgen_esc_url( admin_url( 'admin.php?page=nggallery-manage-gallery' ) ), $used, $percentused ); ?></td>
357
  <td class="last t comments <?php echo $used_color;?>"><?php _e( 'Space Used' );?></td>
358
  </tr>
359
  </table>
@@ -385,7 +586,7 @@ function ngg_widget_locale() {
385
  ?>
386
  <p class="hint"><?php _e('Translation file successful updated. Please reload page.', 'nggallery'); ?></p>
387
  <p class="textright">
388
- <a class="button" href="<?php echo nextgen_esc_url(strip_tags($overview_url)); ?>"><?php _e('Reload page', 'nggallery'); ?></a>
389
  </p>
390
  <?php
391
  } else {
@@ -416,7 +617,7 @@ function ngg_locale() {
416
  if ( !is_wp_error($locale->response) && $locale->response['response']['code'] == '200') {
417
  ?>
418
  <p class="textright">
419
- <a class="button" href="<?php echo nextgen_esc_url( strip_tags($update_url) ); ?>"><?php _e('Update', 'nggallery'); ?></a>
420
  </p>
421
  <?php
422
  }
@@ -427,7 +628,7 @@ function ngg_locale() {
427
  ?>
428
  <p><strong>Download now your language file !</strong></p>
429
  <p class="textright">
430
- <a class="button" href="<?php echo nextgen_esc_url( strip_tags($update_url) ); ?>"><?php _e('Download', 'nggallery'); ?></a>
431
  </p>
432
  <?php
433
  }
@@ -496,8 +697,7 @@ function ngg_get_serverinfo() {
496
  if(ini_get('allow_url_fopen')) $allow_url_fopen = __('On', 'nggallery');
497
  else $allow_url_fopen = __('Off', 'nggallery');
498
  // Get PHP Max Upload Size
499
- if (function_exists('wp_max_upload_size')) $upload_max = strval(round( (int) wp_max_upload_size() / (1024 * 1024) )) . 'M';
500
- else if(ini_get('upload_max_filesize')) $upload_max = ini_get('upload_max_filesize');
501
  else $upload_max = __('N/A', 'nggallery');
502
  // Get PHP Output buffer Size
503
  if(ini_get('pcre.backtrack_limit')) $backtrack_limit = ini_get('pcre.backtrack_limit');
@@ -582,6 +782,82 @@ function ngg_get_phpinfo() {
582
  return $phpinfo;
583
  }
584
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
585
  function ngg_list_contributors() {
586
  /* The list of my contributors. Thanks to all of them !*/
587
 
90
  add_meta_box('ngg_about_meta_box', __('About', 'nggallery'), 'ngg_AboutMetaBox', 'ngg_overview', 'left', 'core');
91
  //add_meta_box('ngg_lastdonators', __('Recent donators', 'nggallery'), 'ngg_widget_overview_donators', 'ngg_overview', 'right', 'core');
92
  if ( !is_multisite() || is_super_admin() ) {
93
+ add_meta_box('ngg_plugin_check', __('Plugin Check', 'nggallery'), 'ngg_plugin_check', 'ngg_overview', 'right', 'core');
94
  add_meta_box('ngg_server', __('Server Settings', 'nggallery'), 'ngg_overview_server', 'ngg_overview', 'right', 'core');
95
+ add_meta_box('dashboard_plugins', __('Related plugins', 'nggallery'), 'ngg_widget_related_plugins', 'ngg_overview', 'left', 'core');
96
  }
97
 
98
  function ngg_AboutMetaBox()
112
  echo sprintf(__('This plugin is primarily developed, maintained, supported and documented by <a href="%s" target="_blank">Photocrati Media</a> with a lot of love & effort. Any kind of contribution would be highly appreciated. Thanks!', 'nggallery'), 'http://www.photocrati.com/');
113
  echo '</p><ul>';
114
 
115
+ $url = 'http://wordpress.org/extend/plugins/nextgen-gallery/' ;
 
 
 
 
 
116
  echo "<li style='padding-left: 38px; background:transparent url(" . NGGALLERY_URLPATH . "admin/images/icon-rating.png ) no-repeat scroll center left; background-position: 16px 50%; text-decoration: none;'><a href='{$url}' target='_blank'>";
117
  _e('Give it a good rating on WordPress.org', 'nggallery');
118
  echo "</a></li>";
133
  <div class="social" style="text-align:center;margin:15px 0 10px 0;"><span class="social" style="margin-right:5px;"><a target="_blank" href="http://twitter.com/NextGENGallery"><img title="Follow NextGEN on Twitter" alt="Twitter" src="' . NGGALLERY_URLPATH . 'admin/images/twitter.png"></a></span><span class="social" style="margin-right:5px;"><a target="_blank" href="http://www.facebook.com/NextGENGallery"><img title="Like NextGEN on Facebook" alt="Facebook" src="' . NGGALLERY_URLPATH . 'admin/images/facebook.png"></a></span><span class="social"><a target="_blank" href="http://plus.google.com/101643895780935290171"><img title="Add NextGEN to your circles" alt="GooglePlus" src="' . NGGALLERY_URLPATH . 'admin/images/googleplus.png"></a></span></div>';
134
  }
135
 
136
+ /**
137
+ * Ajax Check for conflict with other plugins/themes
138
+ *
139
+ * @return void
140
+ */
141
+ function ngg_plugin_check() {
142
+
143
+ global $ngg;
144
+ ?>
145
+ <script type="text/javascript">
146
+ (function($) {
147
+ nggPluginCheck = {
148
+
149
+ settings: {
150
+ img_run: '<img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="icon" alt="started"/>',
151
+ img_ok: '<img src="<?php echo esc_url( admin_url( 'images/yes.png' ) ); ?>" class="icon" alt="ok"/>',
152
+ img_fail: '<img src="<?php echo esc_url( admin_url( 'images/no.png' ) ); ?>" class="icon" alt="failed" />',
153
+ domain: '<?php echo esc_url( home_url('index.php', is_ssl() ? 'https' : 'http') ); ?>'
154
+ },
155
+
156
+ run: function( index, state ) {
157
+ ul = $('#plugin_check');
158
+ s = this.settings;
159
+ var step = 1;
160
+ switch ( index ) {
161
+ case 1:
162
+ this.check1();
163
+ break;
164
+ case 2:
165
+ this.check2( step );
166
+ break;
167
+ case 3:
168
+ this.check3();
169
+ break;
170
+ }
171
+ },
172
+
173
+ // this function check if the json API will work with your theme & plugins
174
+ check1 : function() {
175
+ this.start(1);
176
+ var req = $.ajax({
177
+ dataType: 'json',
178
+ url: s.domain,
179
+ data:'callback=json&format=json&method=version',
180
+ cache: false,
181
+ timeout: 10000,
182
+ success: function(msg){
183
+ if (msg.version == '<?php echo $ngg->version; ?>')
184
+ nggPluginCheck.success(1);
185
+ else
186
+ nggPluginCheck.failed(1);
187
+ },
188
+ error: function (msg) {
189
+ nggPluginCheck.failed(1);
190
+ },
191
+ complete: function () {
192
+ nggPluginCheck.run(2);
193
+ }
194
+ });
195
+
196
+ },
197
+
198
+ // this function check if GD lib can create images & thumbnails
199
+ check2 : function( step ) {
200
+ if (step == 1) this.start(2);
201
+ var stop = false;
202
+ var req = $.ajax({
203
+ type: "POST",
204
+ url: ajaxurl,
205
+ data:"action=ngg_image_check&step=" + step,
206
+ cache: false,
207
+ timeout: 10000,
208
+ success: function(msg){
209
+ if (msg.stat == 'ok') {
210
+ nggPluginCheck.success(2, msg.message);
211
+ } else {
212
+ if (step == 1)
213
+ nggPluginCheck.failed(2);
214
+ stop = true;
215
+ }
216
+
217
+ },
218
+ error: function (msg) {
219
+ if (step == 1)
220
+ nggPluginCheck.failed(2);
221
+ stop = true;
222
+ },
223
+ complete: function () {
224
+ step++;
225
+ if (step <= 11 && stop == false)
226
+ nggPluginCheck.check2(step);
227
+ else
228
+ nggPluginCheck.run(3);
229
+ }
230
+ });
231
+ },
232
+
233
+ // this function check if wp_head / wp_footer is avaiable
234
+ check3 : function() {
235
+ this.start(3);
236
+ var req = $.ajax({
237
+ type: "POST",
238
+ url: ajaxurl,
239
+ data:"action=ngg_test_head_footer",
240
+ cache: false,
241
+ timeout: 10000,
242
+ success: function(msg){
243
+ if (msg == 'success')
244
+ nggPluginCheck.success(3);
245
+ else
246
+ nggPluginCheck.failed(3, msg);
247
+ },
248
+ error: function (msg) {
249
+ nggPluginCheck.failed(3);
250
+ }
251
+ });
252
+ },
253
+
254
+ start: function( id ) {
255
+
256
+ s = this.settings;
257
+ var field = "#check" + id;
258
+
259
+ if ( ul.find(field + " img").length == 0)
260
+ $(field).prepend( s.img_run );
261
+ else
262
+ $(field + " img").replaceWith( s.img_run );
263
+
264
+ $(field + " .success").hide();
265
+ $(field + " .failed").hide();
266
+ $(field + " .default").replaceWith('<p class="default message"><?php echo esc_js( __('Running...', 'nggallery') ); ?></p> ');
267
+ },
268
+
269
+ success: function( id, msg ) {
270
+
271
+ s = this.settings;
272
+ var field = "#check" + id;
273
+
274
+ if ( ul.find(field + " img").length == 0)
275
+ $(field).prepend( s.img_ok );
276
+ else
277
+ $(field + " img").replaceWith( s.img_ok );
278
+
279
+ $(field + " .default").hide();
280
+ if (msg)
281
+ $(field + " .success").replaceWith('<p class="success message">' + msg +' </p> ');
282
+ else
283
+ $(field + " .success").show();
284
+
285
+ },
286
+
287
+ failed: function( id, msg ) {
288
+
289
+ s = this.settings;
290
+ var field = "#check" + id;
291
+
292
+ if ( ul.find(field + " img").length == 0)
293
+ $(field).prepend( s.img_fail );
294
+ else
295
+ $(field + " img").replaceWith( s.img_fail );
296
+
297
+ $(field + " .default").hide();
298
+ if (msg)
299
+ $(field + " .failed").replaceWith('<p class="failed message">' + msg +' </p> ');
300
+ else
301
+ $(field + " .failed").show();
302
+
303
+ }
304
+
305
+ };
306
+ })(jQuery);
307
+ </script>
308
+ <div class="dashboard-widget-holder wp_dashboard_empty">
309
+ <div class="ngg-dashboard-widget">
310
+ <div class="dashboard-widget-content">
311
+ <ul id="plugin_check" class="settings">
312
+ <li id="check1">
313
+ <strong><?php _e('Check plugin/theme conflict', 'nggallery'); ?></strong>
314
+ <p class="default message"><?php _e('Not tested', 'nggallery'); ?></p>
315
+ <p class="success message" style="display: none;"><?php _e('No conflict could be detected', 'nggallery'); ?></p>
316
+ <p class="failed message" style="display: none;"><?php _e('Test failed, disable other plugins & switch to default theme', 'nggallery'); ?></p>
317
+ </li>
318
+ <li id="check2">
319
+ <strong><?php _e('Test image function', 'nggallery'); ?></strong>
320
+ <p class="default message"><?php _e('Not tested', 'nggallery'); ?></p>
321
+ <p class="success message" style="display: none;"><?php _e('The plugin could create images', 'nggallery'); ?></p>
322
+ <p class="failed message" style="display: none;"><?php _e('Couldn\'t create image, check your memory limit', 'nggallery'); ?></p>
323
+ </li>
324
+ <li id="check3">
325
+ <strong><?php _e('Check theme compatibility', 'nggallery'); ?></strong>
326
+ <p class="default message"><?php _e('Not tested', 'nggallery'); ?></p>
327
+ <p class="success message" style="display: none;"><?php _e('Your theme should work fine with NextGEN Gallery', 'nggallery'); ?></p>
328
+ <p class="failed message" style="display: none;"><?php _e('wp_head()/wp_footer() is missing, contact the theme author', 'nggallery'); ?></p>
329
+ </li>
330
+ </ul>
331
+ <p class="textright">
332
+ <input type="button" name="update" value="<?php _e('Check plugin', 'nggallery'); ?>" onclick="nggPluginCheck.run(1);" class="button-secondary" />
333
+ </p>
334
+ </div>
335
+ </div>
336
+ </div>
337
+ <?php
338
+ }
339
+
340
  /**
341
  * Show the server settings in a dashboard widget
342
  *
436
  $link = $item->get_link();
437
  while ( stristr($link, 'http') != $link )
438
  $link = substr($link, 1);
439
+ $link = esc_url(strip_tags($link));
440
  $title = esc_attr(strip_tags($item->get_title()));
441
  if ( empty($title) )
442
  $title = __('Untitled');
493
  <table>
494
  <tbody>
495
  <tr class="first">
496
+ <td class="first b"><a href="admin.php?page=nggallery-add-gallery"><?php echo $images; ?></a></td>
497
+ <td class="t"><a href="admin.php?page=nggallery-add-gallery"><?php echo _n( 'Image', 'Images', $images, 'nggallery' ); ?></a></td>
498
  <td class="b"></td>
499
  <td class="last"></td>
500
  </tr>
546
  <div class="table table_content musubtable">
547
  <table>
548
  <tr class="first">
549
+ <td class="first b b-posts"><?php printf( __( '<a href="%1$s" title="Manage Uploads" class="musublink">%2$sMB</a>' ), esc_url( admin_url( 'admin.php?page=nggallery-manage-gallery' ) ), $quota ); ?></td>
550
  <td class="t posts"><?php _e( 'Space Allowed' ); ?></td>
551
  </tr>
552
  </table>
554
  <div class="table table_discussion musubtable">
555
  <table>
556
  <tr class="first">
557
+ <td class="b b-comments"><?php printf( __( '<a href="%1$s" title="Manage Uploads" class="musublink">%2$sMB (%3$s%%)</a>' ), esc_url( admin_url( 'admin.php?page=nggallery-manage-gallery' ) ), $used, $percentused ); ?></td>
558
  <td class="last t comments <?php echo $used_color;?>"><?php _e( 'Space Used' );?></td>
559
  </tr>
560
  </table>
586
  ?>
587
  <p class="hint"><?php _e('Translation file successful updated. Please reload page.', 'nggallery'); ?></p>
588
  <p class="textright">
589
+ <a class="button" href="<?php echo esc_url(strip_tags($overview_url)); ?>"><?php _e('Reload page', 'nggallery'); ?></a>
590
  </p>
591
  <?php
592
  } else {
617
  if ( !is_wp_error($locale->response) && $locale->response['response']['code'] == '200') {
618
  ?>
619
  <p class="textright">
620
+ <a class="button" href="<?php echo esc_url( strip_tags($update_url) ); ?>"><?php _e('Update', 'nggallery'); ?></a>
621
  </p>
622
  <?php
623
  }
628
  ?>
629
  <p><strong>Download now your language file !</strong></p>
630
  <p class="textright">
631
+ <a class="button" href="<?php echo esc_url( strip_tags($update_url) ); ?>"><?php _e('Download', 'nggallery'); ?></a>
632
  </p>
633
  <?php
634
  }
697
  if(ini_get('allow_url_fopen')) $allow_url_fopen = __('On', 'nggallery');
698
  else $allow_url_fopen = __('Off', 'nggallery');
699
  // Get PHP Max Upload Size
700
+ if(ini_get('upload_max_filesize')) $upload_max = ini_get('upload_max_filesize');
 
701
  else $upload_max = __('N/A', 'nggallery');
702
  // Get PHP Output buffer Size
703
  if(ini_get('pcre.backtrack_limit')) $backtrack_limit = ini_get('pcre.backtrack_limit');
782
  return $phpinfo;
783
  }
784
 
785
+ /**
786
+ * Show NextGEN Gallery related plugins. Fetch plugins from wp.org which have added 'nextgen-gallery' as tag in readme.txt
787
+ *
788
+ * @return postbox output
789
+ */
790
+ function ngg_widget_related_plugins() {
791
+ echo '<p class="widget-loading hide-if-no-js">' . __( 'Loading&#8230;' ) . '</p><p class="describe hide-if-js">' . __('This widget requires JavaScript.') . '</p>';
792
+ }
793
+ function ngg_related_plugins() {
794
+ include(ABSPATH . 'wp-admin/includes/plugin-install.php');
795
+
796
+ if ( false === ( $api = get_transient( 'ngg_related_plugins' ) ) ) {
797
+ // this api sucks , tags will not be used in the correct way : nextgen-gallery cannot be searched
798
+ $api = plugins_api('query_plugins', array('search' => 'nextgen') );
799
+
800
+ if ( is_wp_error($api) )
801
+ return;
802
+
803
+ set_transient( 'ngg_related_plugins', $api, 60*60*24 );
804
+ }
805
+
806
+ echo '<div style="margin-bottom:10px;padding:8px;font-size:110%;background:#eebbaa;"><b>Note</b>: these plugins are provided by third parties and are <b>NOT</b> supported by Photocrati Media in any way</div>';
807
+
808
+ // don't show my own plugin :-) and some other plugins, which come up with the search result
809
+ $blacklist = array(
810
+ 'nextgen-gallery',
811
+ 'galleria-wp',
812
+ 'photosmash-galleries',
813
+ 'flash-album-gallery',
814
+ 'events-calendar',
815
+ 'widgets',
816
+ 'side-content',
817
+ 'featurific-for-wordpress',
818
+ 'smooth-gallery-replacement',
819
+ 'livesig',
820
+ 'wordpress-gallery-slideshow',
821
+ 'nkmimagefield',
822
+ 'nextgen-ajax',
823
+ 'projectmanager'
824
+ );
825
+
826
+ $i = 0;
827
+ while ( $i < 4 ) {
828
+
829
+ // pick them randomly
830
+ if ( 0 == count($api->plugins) )
831
+ return;
832
+
833
+ $key = array_rand($api->plugins);
834
+ $plugin = $api->plugins[$key];
835
+
836
+ // don't forget to remove them
837
+ unset($api->plugins[$key]);
838
+
839
+ if ( !isset($plugin->name) )
840
+ continue;
841
+
842
+ if ( in_array($plugin->slug , $blacklist ) )
843
+ continue;
844
+
845
+ $link = esc_url( $plugin->homepage );
846
+ $title = esc_html( $plugin->name );
847
+
848
+ $description = esc_html( strip_tags(@html_entity_decode($plugin->short_description, ENT_QUOTES, get_option('blog_charset'))) );
849
+
850
+ $ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $plugin->slug, 'install-plugin_' . $plugin->slug) .
851
+ '&amp;TB_iframe=true&amp;width=600&amp;height=800';
852
+
853
+ echo "<h5><a href='{$link}' target='_blank'>{$title}</a></h5>&nbsp;<span>(<a href='$ilink' class='thickbox' title='$title'>" . __( 'Install' ) . "</a>)</span>\n";
854
+ echo "<p>$description<strong> " . __( 'Author' ) . " : </strong>$plugin->author</p>\n";
855
+
856
+ $i++;
857
+ }
858
+
859
+ }
860
+
861
  function ngg_list_contributors() {
862
  /* The list of my contributors. Thanks to all of them !*/
863
 
products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php CHANGED
@@ -79,7 +79,7 @@ $preview_image = trailingslashit( home_url() ) . 'index.php?callback=image&amp;
79
  <table width="98%" align="center" style="border:1px solid #DADADA">
80
  <tr style="height : 360px;">
81
  <td valign="middle" align="center" style="background-color:#DADADA; width : 370px;">
82
- <img src="<?php echo nextgen_esc_url( $preview_image ); ?>" alt="" id="imageToEdit" />
83
  </td>
84
  <td>
85
  <input type="radio" name="ra" value="cw" /><?php esc_html_e('90&deg; clockwise', 'nggallery'); ?><br />
79
  <table width="98%" align="center" style="border:1px solid #DADADA">
80
  <tr style="height : 360px;">
81
  <td valign="middle" align="center" style="background-color:#DADADA; width : 370px;">
82
+ <img src="<?php echo esc_url( $preview_image ); ?>" alt="" id="imageToEdit" />
83
  </td>
84
  <td>
85
  <input type="radio" name="ra" value="cw" /><?php esc_html_e('90&deg; clockwise', 'nggallery'); ?><br />
products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php CHANGED
@@ -92,16 +92,16 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
92
  <td>
93
  <select name="wpmuCSSfile">
94
  <?php
95
- // $csslist = ngg_get_cssfiles();
96
- $csslist = C_NextGen_Style_Manager::get_instance()->find_all_stylesheets();
97
- foreach ($csslist as $key => $a_cssfile) {
98
- $css_name = $a_cssfile['name'];
99
  if ($key == $ngg_options['wpmuCSSfile']) {
 
100
  $selected = " selected='selected'";
101
  }
102
  else $selected = '';
103
  $css_name = esc_attr($css_name);
104
- echo "\n\t<option value=\"{$key}\" {$selected}>{$css_name}</option>";
105
  }
106
  ?>
107
  </select><br />
92
  <td>
93
  <select name="wpmuCSSfile">
94
  <?php
95
+ $csslist = ngg_get_cssfiles();
96
+ foreach ($csslist as $key =>$a_cssfile) {
97
+ $css_name = $a_cssfile['Name'];
 
98
  if ($key == $ngg_options['wpmuCSSfile']) {
99
+ $file_show = $key;
100
  $selected = " selected='selected'";
101
  }
102
  else $selected = '';
103
  $css_name = esc_attr($css_name);
104
+ echo "\n\t<option value=\"$key\" $selected>$css_name</option>";
105
  }
106
  ?>
107
  </select><br />
products/photocrati_nextgen/modules/ngglegacy/changelog.txt ADDED
@@ -0,0 +1,718 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ NextGEN Gallery
2
+ by Photocrati Media
3
+
4
+ = V1.9.5 - 05.07.2012 =
5
+ * Changed: Branding changes following Photocrati acquisition (removed donation messages and updated links)
6
+ * Secured: Use WordPress-bundled JavaScript libraries for swfobject and swfupload instead of bundling our own
7
+ * Bugfix: Adjusted thickbox effect styling to ensure that the lightbox is always displayed in the foreground
8
+ * Bugfix: Fixed compatibility issues with Contact Form 7 and other plugins by following WordPress Plugin conventions
9
+ * Bugfix: Fixed network-wide activation in WordPress 3.4
10
+ * Bugfix: Plugin is no longer dependent on it's folder name
11
+
12
+ = V1.9.3 - 26.02.2012 =
13
+ * Bugfix : Ensure to set the slug for "all" albums
14
+ * Bugfix : Updated german translation ( THX to Roger Hunziker )
15
+ * Bugfix : Ensure error checking on IPTC array (THX to Kristian Edlund)
16
+ * Bugfix : Handle IE8 cached images better in slideshow
17
+ * Bugfix : Show album preview image if selected (THX to Kristian Edlund)
18
+
19
+ = V1.9.2 - 17.01.2012 =
20
+ * NEW : Added more XMLRPC commands (THX to Vladimir Vinogradsky)
21
+ * Changed : Rework Post-thumbnail function (THX to Kristian Edlund)
22
+ * Bugfix : Check first for valid images on unzip (only Mac OS zip-files)
23
+ * Bugfix : Increase z-index for twenty eleven theme
24
+ * Bugfix : Support non latin chars in tagcloud
25
+ * Bugfix : Allow other tinymce intance
26
+ * Bugfix : Better support for WPML translation
27
+
28
+ = V1.9.1 - 10.12.2011 =
29
+ * Bugfix : Security hardness for untrusted filenames/meta data (THX to Brian St. Pierre)
30
+ * Bugfix : Fixed security vulnerability (TXH to Jon Cave)
31
+ * Bugfix : Load piclens script via other function
32
+ * Bugfix : IE7 script fix for add gallery
33
+ * Bugfix : IE7/IE8 width set correctly for edit album autocomplete field
34
+
35
+ = V1.9.0 - 27.11.2011 =
36
+ * NEW : Keep images transparency for PNG and GIF format
37
+ * NEW : Switch to Plupload, support now HTML5 Upload (only with WordPress 3.3)
38
+ * NEW : Added client side resize feature (only with WordPress 3.3)
39
+ * NEW : Support for gallery templates in album shortcodes [ album id=x template="name" gallery="templatename" ]
40
+ * NEW : Added new hook ngg_delete_picture
41
+ * Changed : Updated to jQuery Cycle Version 2.9995
42
+ * Changed : Always cache the single pictures, remove option
43
+ * Bugfix : Couldn't use bulk operation for search results
44
+ * Bugfix : Bugfix for Edit thumbnails under IE 8 + 9
45
+ * Bugfix : Allow empty altext in ngg.editImage
46
+ * Bugfix : Various PHP notice fixes
47
+ * Bugfix : Resize fix for Shutter effect and mobile Browser
48
+ * Bugfix : FTP Import missing slug field into database
49
+ * Bugfix : Check also EXIF field "DateTimeOriginal" for timestamp
50
+
51
+ = V1.8.4 - 26.10.2011 =
52
+ * Bugfix : Fixed security vulnerability (TXH to Alain Schneider)
53
+
54
+ = V1.8.3 - 07.08.2011 =
55
+ * Changed : Support for simple custom permalink structures (i.e. /%category%/%postname%/)
56
+ * Bugfix : Sub-Albums in Albums didn't create the correct link
57
+ * Bugfix : AJAX Pagination didn't work anymore
58
+ * Bugfix : Adding index.php to home_url()
59
+ * Bugfix : Preview picture lost on backend gallery page 2 or higher
60
+
61
+ = V1.8.2 - 12.07.2011 =
62
+ * Bugfix : Set pagination variables for search result, otherwise update failed
63
+ * Bugfix : Update failed for paged galleries since WordPress 3.2
64
+
65
+ = V1.8.1 - 18.06.2011 =
66
+ * Bugfix : Special case for pagination, instead of showing page-1, we show the clean url
67
+ * Bugfix : Various PHP notice fixes
68
+ * Bugfix : Typo in rewrite rules
69
+ * Bugfix : Flush rewrite rules during upgrade later
70
+
71
+ = V1.8.0 - 12.06.2011 =
72
+ * NEW : Full rework of permalink url structure
73
+ * NEW : Adding Google Sitemaps for Images (require WordPress SEO plugin by YOAST )
74
+ * NEW : Support for WPML ( WordPress Multilingual Plugin )
75
+ * NEW : Adding support for arrow key in shutter effect (THX to Flyvans)
76
+ * NEW : Adding sort operation for galleries overview page
77
+ * Changed : Updated pagination to new WP3.1 style
78
+ * Bugfix : Create unique slug in a better way
79
+ * Bugfix : Rework screen options filter for gallery and image table
80
+ * Bugfix : Empty values in XMLRPC update calls are ignored
81
+ * Bugfix : Create gallery failed when safe-mode on
82
+ * Bugfix : Permalink didn't work in combination with album & imagebrowser
83
+
84
+ = V1.7.4 - 15.02.2011 =
85
+ * Bugfix : Disallow direct call of ajax file to avoid path disclosure (THX to High-Tech Bridge SA)
86
+ * Bugfix : Rework jQuery Cycle slideshow for IE compat reason (THX to Justin Dickenson)
87
+ * Bugfix : Resize only larger images in slideshow
88
+ * Bugfix : Improved image format detection in gd.thumbnail class (THX to Kupar.b)
89
+
90
+ = V1.7.3 - 20.01.2011 =
91
+ * NEW : Introduce plugin health check for conflicts with other plugins/themes
92
+ * NEW : Adding new XMLRPC method ngg.deleteImage
93
+ * NEW : Adding new XMLRPC method ngg.editImage
94
+ * Changed : Rework register script for autocomplete feature
95
+ * Bugfix : Bugfix for Multisite setup and flash upload
96
+ * Bugfix : WP3.1 compat issue, show site admin page only on Multisite installation
97
+
98
+ = V1.7.2 - 13.12.2010 =
99
+ * Bugfix : Adding images to database require slug
100
+
101
+ = V1.7.1 - 13.12.2010 =
102
+ * Changed : Disable upgrade for PHP4 user
103
+ * Changed : Disable colorpicker for option page
104
+ * Bugfix : Compat fix for upgrade
105
+
106
+ = V1.7.0 - 11.12.2010 =
107
+ * NEW : Publish a new post direct from the gallery admin page
108
+ * NEW : Added filter hook 'ngg_get_image_metadata' to add more exif/iptc information
109
+ * NEW : Adding Autocomplete field to TinyMCE Popup and Album page
110
+ * NEW : More methods for XMLRPC interface
111
+ * Changed : New hooks for gallery table (THX to Alexander Schneider)
112
+ * Changed : Introduce jQuery dialog as new UI element
113
+ * Changed : Call TinyMCE window via admin-ajax
114
+ * Bugfix : Better support for SSL blogs
115
+ * Bugfix : Install/Upgrade failed when table prefix contain captial letters
116
+ * Bugfix : Fix validation issues in Media-RSS
117
+ * Bugfix : Empty tags in XMP Meta causes PHP error
118
+ * Bugfix : Rework load mechanism for slideshow
119
+ * Bugfix : Copy meta data when image is copied
120
+ * Bugfix : Icon Support for Ozh' Admin Drop Down Menu
121
+ * Bugfix : Use correct sort order in slideshow
122
+
123
+ = V1.6.2 - 19.09.2010 =
124
+ * NEW : Added constant NGG_SKIP_LOAD_SCRIPTS to avoid script load
125
+ * Bugfix : Load Tags library with core files
126
+ * Bugfix : Slideshow script failed in IE7, load script now in header
127
+ * Bugfix : Load slideshow widget always
128
+ * Changed : New admin notice for database upgrade
129
+ * Changed : Rework crop feature for featured images
130
+ * Changed : Use site_url() instead get_option ('siteurl'), required for SSL support
131
+
132
+ = V1.6.1 - 08.09.2010 =
133
+ * Bugfix : Script load of swfobject.js failed
134
+ * Bugfix : Show sideshow also with 1 or 2 images
135
+ * Bugfix : Rework null byte check in zip upload
136
+
137
+ = V1.6.0 - 07.09.2010 =
138
+ * NEW : Wordpress 3.0 Network (Multi-Site) support
139
+ * NEW : Integrate jQuery Cycle as NON-Flash slideshow
140
+ * NEW : Adding jQuery File Tree for import folder (THX to Sergey Pasyuk )
141
+ * NEW : Added action hook 'ngg_show_imagebrowser_first' on custom request
142
+ * NEW : Added filter hook 'ngg_slideshow_size' to resize sildeshow for mobile browser plugins
143
+ * Changed : Reorder tabs for upload
144
+ * Changed : New menu icon and screen icon (THX to Ben Dunkle)
145
+ * Changed : Load frontend libs always
146
+ * Changed : Rework of overview page
147
+ * Bugfix : Security bugfix for Zip-Upload (THX to Dominic Szablewski)
148
+ * Bugfix : Allow JPG, PNG, GIF extension
149
+ * Bugfix : New German translation (THX to Martin Kramarz)
150
+ * Bugfix : Copy/Move also backup file
151
+ * Bugfix : Calculate correct ratio for fix thumbnail size (THX to Alekz Keck)
152
+
153
+ = V1.5.5 - 14.06.2010 =
154
+ * Bugfix : Compat issue for post thumbnails with WP2.9
155
+ * NEW : Adding more hooks for custom fields plugin
156
+
157
+ = V1.5.4 - 14.06.2010 =
158
+ * Bugfix : No resize of smaller images
159
+ * Bugfix : Compat issues for Post Thumbnails under WP3.0
160
+ * Bugfix : Esc_URL in Media RSS
161
+
162
+ = V1.5.3 - 11.04.2010 =
163
+ * New : Adding pagination to footer
164
+ * Changed : Prepare new filter to replace slideshow
165
+ * Bugfix : Remove non-breaking space from navigation
166
+ * Bugfix : Pagination of galleries
167
+ * Bugfix : Fixed brackets position for old shortcode query
168
+ * Bugfix : Slideshow option 'Show next image on click" has wrong default value
169
+
170
+ = V1.5.2 - 25.03.2010 =
171
+ * Bugfix : XSS security vulnerability (THX to Core Security Advisories Team , Pedro Varangot)
172
+ * Bugfix : Missing $wpdb in shortcodes.php
173
+
174
+ = V1.5.1 - 23.03.2010 =
175
+ * Bugfix : PHP4 compat issue for Add gallery & options page
176
+ * Bugfix : Gallery widget can now have a empty title
177
+ * Bugfix : Adding correct stripslash for gallery title
178
+
179
+ = V1.5.0 - 18.03.2010 =
180
+ * NEW : Support for Post thumbnail feature
181
+ * NEW : Backup and Recover function for images (THX to Simone Fumagalli)
182
+ * NEW : Resize images after upload (THX to Simone Fumagalli)
183
+ * NEW : Added a JSON class for fetching galleries in a RESTful way (see xml/json.php)
184
+ * NEW : Adding various new capabilities for user roles
185
+ * NEW : Auto downloader for translation file
186
+ * Changed : Rename query var from slideshow to callback for compat reason with other plugin
187
+ * Changed : Convert widget function to new WP structure
188
+ * Changed : Include lookup for tags into the backend search
189
+ * Changed : Restructure addgallery and settings page to enable custom tabs
190
+ * Bugfix : Select album preview from gallery preview pics instead random list
191
+ * Bugfix : Keep fix dimension in edit thumbnail operation
192
+ * Bugfix : Import meta data didn't work correct for existing images
193
+ * Bugfix : Fix onload bug for Chrome 4 in Shutter script
194
+ * Bugfix : Remove various PHP notices for a better world
195
+ * Removed : Canonical link is now part of Wordpress 2.9
196
+
197
+ = V1.4.3 - 16.11.2009 =
198
+ * Bugfix : Urlencode XML file path for sildeshow
199
+
200
+ = V1.4.2 - 16.11.2009 =
201
+ * Changed : Load sildeshow XML not longer via relative path
202
+ * Bugfix : No imagebrowser in carousel mode
203
+ * Bugfix : JS Effect navigation based on wrong array structure
204
+ * Bugfix : Remove whitespaces from meta import
205
+ * Bugfix : Capability check for upgrade notice
206
+ * Removed : Hide "more settings" for now, causes problems with IE and jQuery UI tabs
207
+
208
+ = V1.4.1 - 10.11.2009 =
209
+ * Bugfix : Capabilites could not be saved
210
+ * Bugfix : Ajax pagination option not saved
211
+ * Bugfix : echo nggSlideshowWidget() for compat reason
212
+
213
+ = V1.4.0 - 08.11.2009 =
214
+ * NEW : Automatic rotate images during upload or via manage gallery page (THX to Simone Fumagalli)
215
+ * NEW : Include Bulkupdate for gallery overview, require PHP 5.2
216
+ * NEW : XMLRPC support with 4 new methods : see xmlrpc.php for more information
217
+ * NEW : Recent and random images can be taken from a specific gallery using the id=x parameter in the shortcode (THX to Prollius)
218
+ * NEW : Recent images can be recent by exif date (instead of database id) by using the mode=recentdate parameter in the shortcode (THX to Prollius)
219
+ * NEW : Introduce the WP_Object_cache and meta_data
220
+ * NEW : Various new hooks and filters
221
+ * Added : Better support for role manager plugin (THX to Mattias Buelens)
222
+ * Added : New option to add hidden images. Needed to show all images in a modal window (Thickbox, Lightbox et.)
223
+ * Added : New link parameter for the singlepic shortcode : [singlepic id=x w=x h=x link="http://google.com"]
224
+ * Added : New template gallery-carousel
225
+ * Added : New id parameter for recent and random shortcodes : [random max="7" template="filename" id="2"] takes only pictures from the gallery with id=2
226
+ * Added : New mode parameter for recent shortcode : [recent max="7" template="filename" id="3" mode="date" /] where mode can be one of (id, date, sort). Recent pictures are delivered by addition to database (id), exif date (date) or user sort order (sort).
227
+ * Added : Enable/Disable Ajax navigation via settings
228
+ * Added : New filter hook 'ngg_render_template' to render templates with a other plugin
229
+ * Changed : Added option to link an album with a page id
230
+ * Changed : Support templates for child themes, use STYLESHEETPATH instead TEMPLATEPATH (THX to Prollius)
231
+ * Changed : Rework of Media RSS Widget
232
+ * Bugfix : Check capability to create a new page
233
+ * Bugfix : Fix double call of filter name , changed to ngg_picturelist_object (THX to Prollius)
234
+ * Bugfix : Check for a deleted gallery in a album
235
+
236
+ = V1.3.6 - 20.09.2009 =
237
+ * Changed : Just change the feed link
238
+
239
+ = V1.3.5 - 17.07.2009 =
240
+ * Bugfix : Fixed XSS issue for Page title
241
+
242
+ = V1.3.4 - 07.07.2009 =
243
+ * Added : New filter ngg_gallery_object and ngg_image_object
244
+ * Bugfix : Fix double rendering of a gallery if two album shortcodes are used
245
+ * Bugfix : Fix for custom field ngg_gal_sort
246
+ * Bugfix : Changed capability check for upload
247
+ * Bugfix : Check for correct version OR memory limit
248
+
249
+ = V1.3.3 - 11.06.2009 =
250
+ * Changed : Load Thickbox images via wp_footer()
251
+ * Bugfix : Widget setting couldnot be saved
252
+
253
+ = V1.3.2 - 10.06.2009 =
254
+ * Changed : Resize maximum to 1280 x 1280 with nggshow (THX to onezero)
255
+ * Bugfix : Bugfix for Multifile upload
256
+ * Bugfix : Bugfix for sortorder under jQuery 1.3
257
+ * Bugfix : Workaround for more albums per page, need more rework
258
+ * Bugfix : AJAX reload didn't work if slideshow is shown by default
259
+ * Bugfix : Redirect links didn't work if permalinks are deactivates
260
+ * Bugfix : Add new gallery in manage-overview didn't use defaultpath
261
+
262
+ = V1.3.1 - 07.06.2009 =
263
+ * Bugfix : Fixed ZIP upload, wrong variable used
264
+ * Bugfix : Check for array before foreach in album missing
265
+
266
+ = V1.3.0 - 07.06.2009 =
267
+ * NEW : Subalbum support
268
+ * NEW : Search for images in the admin tab
269
+ * NEW : Add new gallery also in manage tab
270
+ * NEW : AJAX support for Imagebrowser and gallery navigation (THX to Anty)
271
+ * NEW : Added zip upload via URL (THX to Juan Jose Galvez)
272
+ * Added : jQuery Multiple File Upload Plugin v1.44
273
+ * Added : SWFUpload V2.2.0
274
+ * Changed : Remove extension for Alttext during first import
275
+ * Changed : Meta tag added via wp_head hook (THX to Viper)
276
+ * Bugfix : Correct various PHP notice messages
277
+ * Bugfix : Typo fix in custom fields for ngg_gal_ImageBrowser
278
+ * Bugfix : Avoid upload of images in gallery without correct capability
279
+
280
+ = V1.2.1 - 22.03.2009 =
281
+ * NEW : Support for IE8 Web Slices in widgets
282
+ * NEW : Add filter ngg_image_object
283
+ * Changed : Descending order in add gallery menu
284
+ * Bugfix : Exclude option didnT work for multi pages
285
+ * Bugfix : Check for correct capability in manage gallery
286
+
287
+ = V1.2.0 - 09.03.2009 =
288
+ * NEW : Support for image tag cloud with shortcode [tagcloud]
289
+ * NEW : Adding shortcode [recent max="7" template="filename" /] & [random max="7" template="filename" /] to show the most recent/random pictures (THX to Bernhard)
290
+ * NEW : Crop thumbnails manually (THX to Simone Fumagalli)
291
+ * NEW : Support for i18n with polyglot or qtrans plugin (THX to Boris Glumpler)
292
+ * NEW : Canonical meta link support
293
+ * Added : SWFUpload V2.2.0 B5
294
+ * Added : New memory limit check in upload screen
295
+ * Bugfix : Language typo fixes
296
+ * Bugfix : Admin Pagination fix
297
+ * Bugfix : Typo fix in widgets
298
+ * Bugfix : Init column script after document is ready
299
+ * Bugfix : htmlspecialchars() instead htmlentities() for links in the a href title description
300
+ * Bugfix : Upgrade routine didn't add sortorder to correct table (THX to Uwe)
301
+ * Bugfix : Correct shotcode in media upload tab
302
+
303
+ = V1.1.0 - 26.01.2009 =
304
+ * NEW : Pagination for album page via custom fields ('ngg_paged_Galleries')
305
+ * NEW : Support for fixed number of columns inside the gallery
306
+ * NEW : Added pagination for galleries and images in admin section
307
+ * NEW : New action hook after image is added to database, called 'ngg_added_new_image'
308
+ * NEW : New template for caption below images, called via [nggallery id=x template=caption]
309
+ * Added : SWFUpload V2.2.0 B4
310
+ * Changed : Rework of Manage image tables
311
+ * Changed : Move imagerotator.swf to wp-content/uploads
312
+ * Changed : Added a URL field to setup the path to the Imagerotator
313
+ * Changed : Add additional parameter to gallery object
314
+ * Changed : Load donators list external
315
+ * Bugfix : Style fixes for tables in IE7
316
+ * Bugfix : All albums code couldn't use the slideshow, query is empty for 0
317
+ * Bugfix : Htmlentities() for links in the a href title description
318
+ * Bugfix : Clean up mode for singlepic
319
+ * Bugfix : Typo in widget settings
320
+
321
+ = V1.0.2 - 19.12.2008 =
322
+ * Added : Option to enable/disable the MediaRSS Feed
323
+ * Added : For flash under FF3/WIN we should use outline: none;
324
+ * Added : Use sort order also for Media RSS
325
+ * Changed : Descending order for TinyMCE Editor
326
+ * Changed : Added screencolor flashvar as bgcolor for the flash slideshow
327
+ * Changed : Remove link to gallery in sidebar widget
328
+ * Bugfix : Check for empty gallery title and show name instead
329
+ * Bugfix : Album id=all / Album id=0 didn't show content
330
+ * Bugfix : Check for a empty description and alttext
331
+ * Bugfix : Remove HTML tags from slideshow
332
+ * Bugfix : Load SWFobject always when the imagerotator exist
333
+ * Bugfix : Zip-Upload in existing gallery failed
334
+ * Bugifx : Typo in functions.php (THX to David Horat)
335
+
336
+ = V1.0.1 - 11.12.2008 =
337
+ * Bugfix : Change upgrade routine, import_date_time could cause a memory problem
338
+ * Bugfix : Help pages will not show up in non-english enviroment
339
+ * Bugfix : Show gallery name if title is empty
340
+
341
+ = V1.0.0 - 11.12.2008 =
342
+ * NEW : Adding some rewrite rules for the Blog title for a better SEO (Will be continued...)
343
+ * NEW : Added ImageMagick support (currently a bit experimental) (THX to Frederic de Ranter)
344
+ * NEW : Automatic unistall via register_uninstall_hook()
345
+ * NEW : Added a presort option to sort easier the images
346
+ * NEW : Lookup for a nggallery.css in the theme folder
347
+ * NEW : Added Date/Time field to database and import it from EXIF, new sort option
348
+ * NEW : Multi Widgets to show links to Media RSS feeds (THX to Vincent Prat)
349
+ * NEW : PicLens support for galleries (THX to Vincent Prat)
350
+ * NEW : Copy/Move images between galleries (THX to Vincent Prat)
351
+ * NEW : Media RSS feeds (either for galleries, albums or global) (THX to Vincent Prat)
352
+ * NEW : Image tag management (THX to Vincent Prat)
353
+ * NEW : Convert all shortcodes to WP shortcodes API
354
+ * NEW : AJAX based thumbnail generator
355
+ * NEW : Create output via template files, more flexible and support for multiple templates
356
+ * NEW : Extended role system. Each gallery has now a author
357
+ * NEW : [thumb id="4,5,12,..."] shortcode. You can now insert thumbnails for one or more images (that are not necessarly inside the same gallery).
358
+ * Changed : Add swfupload 2.2.0. Support for Adobe Flash 10 upload
359
+ * Changed : Update all Admin pages for Wordpress 2.7 Admin UI
360
+ * Changed : New icon for TinyMCE and WP2.7 Menue from http://www.pinvoke.com/
361
+ * Changed : Move update message to admin.php
362
+ * Changed : Widgets are now core and doesn't need to be activate, rework as Multi Widgets
363
+ * Changed : Improved the gallery management page.
364
+ * Changed : Rename the filter 'ngg_create_gallery_thumbcode' to 'ngg_get_thumbcode'.
365
+ * Changed : Convert tags to WP-Taxonomy tables, no more need for ngg_tags, ngg_pic2tags
366
+ * Changed : Arrange manage fields in a new way
367
+ * Changed : Support now SSL
368
+ * Changed : Use JQuery UI instead of interface lib
369
+ * Changed : Updated to swfobject 2.1
370
+ * Changed : Rework of database queries and new central nggdb class
371
+ * Bugfix : Changed CSS for singlepic padding to margin
372
+ * Bugfix : Check for zero in Exif Focal Length
373
+ * Bugfix : Round instead inval for square thumbnails
374
+ * Removed : Do not longer check for myGallery folders
375
+ * Removed : Use now PclZip from WP Core
376
+ * Removed : Wordpress 2.1 - 2.3 files deleted
377
+
378
+ = V0.99 - 27.09.2008 =
379
+ * Changed : Included swfobject version 2.1
380
+ * Bugfix : Recognize the zip better
381
+ * Bugfix : Limit the length of the title in the media-upload
382
+ * Bugfix : Round instead inval for square thumbnails
383
+
384
+ = V0.98 - 15.07.2008 =
385
+ * Bugfix : Removed all whitespaces at EOF
386
+
387
+ = V0.97 - 10.07.2008 =
388
+ * Changed : Get new path contstant from WP2.6
389
+ * Changed : Minor updates for WP2.6
390
+ * Changed : Added new filters (THX to Vincent Prat)
391
+ * Removed : Revert singlepic wrapper, breaks validation
392
+
393
+ = V0.96 - 18.05.2008 =
394
+ * Changed : Use postbox for gallery settings
395
+ * Added : New filter function to add custom columns
396
+ * Bugfix : Fixed width for Thickbox in Manage gallery
397
+ * Bugfix : fixed width for media upload select box
398
+ * Bugfix : Remove <p> tag in singlepic regex
399
+ * Bugfix : Correct format of shutter speed
400
+ * Bugfix : Album name in Short code not useable
401
+
402
+ = V0.95 - 25.04.2008 =
403
+ * Bugfix : Correction in media-upload to fit with Wordpress 2.5.1
404
+ * Bugfix : Attribute_escape all objects in media-upload
405
+ * Bugfix : Correct sortorder for albums
406
+ * Bugfix : Typo correction (THX to Momo-I)
407
+
408
+ = V0.94 - 20.04.2008 =
409
+ * Added : New filter option ngg_create_gallery_link
410
+ * Changed : Reduce amount of DB queries in albums (Big THX to Alexandr Kindras)
411
+ * Changed : Revert wpautop priority change. Doesn't good for other plugins
412
+
413
+ = V0.93 - 12.04.2008 =
414
+ * Added : Select Full-Size or Singlepic in Media Upload
415
+ * Added : Check for minimum 8 MB Memory
416
+ * Changed : Priority from wpautop must be before gallery
417
+ * Bugfix : Added Screencolor to Widgets
418
+ * Bugfix : Clean CSS class in setup.php
419
+ * Bugfix : Change PHP short tag (Thx to Archedition)
420
+ * Bugfix : Remove tab.png from CSS (Thx to Frisco)
421
+ * Bugfix : Remove newline and encode quotes in Media-Upload (THX to Trip Mellinger)
422
+
423
+ = V0.92 - 30.03.2008 =
424
+ * Changed : Higher priority for filter in WP2.5 final
425
+ * Changed : Do not increase memory_limit with ini_set
426
+ * Added : Read EXIF field ImageDescription
427
+
428
+ = V0.91 - 24.03.2008 =
429
+ * Changed : Resample mode back to 3
430
+ * Changed : Add DIV "ngg-singlepic-wrapper" for SingelPic (THX to Travel-Junkie)
431
+ * Changed : Increase Tweakfactor for Memory Check
432
+ * Bugfix : Use admin.css only on NextGEN pages (THX tp Oliver)
433
+ * Bugfix : Updates widgets (V1.21) for ImageRotator 3.15
434
+ * Bugfix : Change order of rewrite rules for WP 2.5
435
+ * Bugfix : Include Dashboard CSS also for page "nextgen-gallery"
436
+
437
+ = V0.90 - 18.03.2008 =
438
+ * NEW : Sort order for images
439
+ * NEW : Updated style for Wp 2.5
440
+ * NEW : Media upload tab integration for WP 2.5
441
+ * Added : Change wp shortcode filter
442
+ * Added : TinyMCE V3 Button for WordPress 2.5
443
+ * Added : Singlepic center class
444
+ * Changed : New default parameter for ImageRotator 3.15
445
+ * Changed : By default enable metadata import
446
+ * Changed : Moved disable/enable flash setting to add gallery
447
+ * Changed : wpdb->escape gallerytag in nggfunctions
448
+ * Changed : Sort files after scan folder
449
+ * Changed : Check for filename during upload
450
+ * Changed : Remove jQuery plugin for navigation
451
+ * Changed : Remove myGallery import
452
+ * Changed : Resample mode default set to 5, causes problems at PHP 4.4.8 /PHP 5.2.4
453
+ * Bugfix : nggextractXML missing stripslashes
454
+ * Bugfix : P tags not closed in manage.php
455
+ * Bugfix : Remove " from singlepic class
456
+ * Bugfix : Rewrite rule for ImageBrowser added
457
+
458
+ = V0.83 - 14.02.2008 =
459
+ * Changed : New Interfaces.js from WP Core 2.5, for sortable bug under IE7
460
+ * Changed : Update to jQuery V1.2.2, deregister older version from WP
461
+ * Changed : Add ini_set 128MB for memory-limit
462
+ * Bugfix : SWFUpload Cookie Post_Params are overwritten , no upload possible
463
+ * Bugfix : WPMU options are not saved after installation
464
+ * Bugfix : Remove Flush rewrite rules during install
465
+
466
+ = V0.82 - 09.02.2008 =
467
+ * Bugfix : add_filter (searchnggallerytags) not proper included for some other plugins
468
+
469
+ = V0.81 - 04.02.2008 =
470
+ * Changed : Use stristr first to reduce CPU cycles (THX to Alakhnor)
471
+ * Changed : Flush Rewrites rules after option update
472
+ * Changed : Rework for folder check under Safe-Mode
473
+ * Bugfix : Check for array in get_option() (THX to Alessandro)
474
+ * Bugfix : Add Cookie to SWFUpload, show Error code included
475
+ * Bugfix : galShowOrder = Sildeshow at first didn't work
476
+ * Bugfix : Remove reference from ngg_getOnlyImages
477
+
478
+ = V0.80 - 02.02.2008 =
479
+ * NEW : SWFUpload integrated : Show upload progress and select multiple files in the file browser dialog.
480
+ * NEW : Progress bar for resize, watermark and thumbnail operation
481
+ * NEW : Import Meta data from images
482
+ * NEW : Show Meta data information
483
+ * NEW : Cache option for SinglePic
484
+ * NEW : Permalink support
485
+ * NEW : Custom fields support - Change the settings for each post/page
486
+ * Changed : Up to 10 Widgets, exclude galleries from random/recent images.
487
+ * Changed : Refactor permission check for Safe-Mode Check and mkdir/chmod
488
+ * Changed : Admin CSS in new folder/file for better structure
489
+ * Changed : Clean up folder structure
490
+ * Changed : Clean up code in manage.php, functions.php
491
+ * Changed : Moved several functions into nggAdmin Class (functions.php)
492
+ * Changed : Update to jQuery V1.1.4 (v1.2.1 causes problems with interface.js)
493
+ * Changed : Hide used galleries in album admin page
494
+ * Changed : Remove float in singlepic code and added class ngg-left , ngg-right (THX to Nathan Sylvain)
495
+ * Changed : Edit style setting (added new class .desc , THX to Sebastian)
496
+ * Changed : Check for galleryfolder instead name (THX to Luke Poland)
497
+ * Changed : Delete images per default
498
+ * Changed : Change CSS (ngg-album-compact) , remove width & height setting from code
499
+ * Bugfix : Fixed static front page problem
500
+ * Bugfix : Missing stripslashes & html_entity_decode
501
+ * Bugfix : Change Album CSS (THX to Thomas-DK)
502
+ * Bugfix : Watermark for GIF not correct supported
503
+ * Bugfix : Missing wp_nonce at setup page
504
+ * Bugfix : Add DIV in Slideshow link (for Safari & Opera)
505
+ * Added : Screencolor flashvar for JW Image Rotator 3.13 or higher
506
+ * Added : Set WP-CHARSET / COLLATE during installation
507
+ * Added : Updated to Pclzip.lib.php v2.6
508
+ * Added : CSS ID field for gallery & images
509
+ * WPMU : New site admin page (wpmu.php)
510
+ * WPMU : Integrated quota check
511
+ * WPMU : No update check
512
+ * WPMU : Remove edit style (THX to Kristin)
513
+ * WPMU : Remove uninstall button
514
+ * WPMU : Remove server settings
515
+ * WPMU : Gallery path set to blog.dir
516
+ * Added : Support for WPMU
517
+
518
+ = V0.74 - 01.12.2007 =
519
+ * NEW : Added meta reader class, first step to integrated meta data import
520
+
521
+ = V0.73 - 20.10.2007 =
522
+ * Added : Support for Shutter Reloaded
523
+ * Update to jQuery Tabs 2.7.4
524
+ * Changed : Remove $_SERVER['REQUEST_URI'] for IIS compatibility
525
+ * Bugfix : Option Sildeshow didn't jump to overview
526
+
527
+ = V0.72 - 13.09.2007 =
528
+ * Added : Missing overflow:hidden in ngg-album.css
529
+ * Added : New experimental stylesheet hovereffect.css
530
+ * Changed : Better check for memory limit in zip-files
531
+ * Bugfix : Missing stripslashes for alttext (THX to Lawrence)
532
+ * Bugfix : Navigation didn't highlight page 1 (THX to Brot)
533
+ * Bugfix : Albums automatic minimize if more than 4 galleries
534
+ * Bugfix : Missing check_admin_referer in style (THX again to Christopher)
535
+
536
+ = V0.71 - 07.09.2007 =
537
+ * Added : Add defer="defer" to Slideshow to avoid IE crash (THX to Simbo)
538
+ * Bugfix : Bugfix for slideshow to show all pictures
539
+ * Bugfix : Wrong check_admin_referer in albums (THX to Christopher)
540
+ * Bugfix : No exclude check in counter and widgets (THX to Christopher)
541
+ * Bugfix : Check for existing role (THX to Lost in Network)
542
+ * Bugfix : Label in roles are wrong (THX to Joern)
543
+
544
+ = V0.70 - 06.09.2007 =
545
+ * NEW : Add role manager page and capabilities
546
+ * NEW : Show gallery with [tags=list of tags]
547
+ * NEW : Show album with [albumtags=list of tags]
548
+ * NEW : Tag system for all images
549
+ * NEW : Option for append related images
550
+ * NEW : Option to show description below thumbnail
551
+ * NEW : Option to show ImageBrowser instead JS effect
552
+ * Added : Add Full size link to thickbox
553
+ * Added : Check for page/postid in tag processing
554
+ * Added : Sildeshow widget can now contain all images
555
+ * Added : Minimize/Maximize option for albums
556
+ * Added : Deregister jQuery V1.1.2 for WP2.2 (to use V1.1.3.1)
557
+ * Added : Integrate wp_nonce_field at all admin pages
558
+ * Changed : Update to Thickbox 3.1 + mods for NextGEN gallery
559
+ * Changed : Moved "clear:both" into class "ngg-clear" (THX to Gero)
560
+ * Changed : Switched from jQuery Interface to jQuery Tabs from Klaus Hartl
561
+ * Remove : Remove option for singlepic link
562
+ * Remove : Remove options for imagebrowser
563
+ * Bugfix : Most Recent image in Widget are wrong
564
+ * Bugfix : More XHTML valid , htmlspecialchars() after add_query_arg()
565
+ * Bugfix : Sanitize file name before upload
566
+ * Bugfix : Sanitize folder name (THX to Tom Fowler)
567
+ * Bugfix : Show title/alt in jQuery plugin (THX to Gregory Green)
568
+ * Bugfix : i18n support for Gallery tab
569
+ * Bugfix : Reduce memory-needs for plugin
570
+ * Bugfix : Typo/spelling correction
571
+ * Bugfix : Removed myGallery author from contribute list
572
+
573
+ = V0.64 - 31.07.2007 =
574
+ * Bugfix : Remove arrows in image browser text
575
+ * Bugfix : Include nggadmintab.php with dirname
576
+ * Bugfix : Zip-Upload under Mac > look for basename
577
+
578
+ = V0.63 - 10.07.2007 =
579
+ * NEW : You can now upload a zip file into a existing gallery
580
+ * Added : Remove subfolder in Zip-files
581
+ * Added : Show required memory for thumbnail creation
582
+ * Added : Updated to jQuery.multifile 1.22
583
+ * Added : Install-Upgrade for WordPress 2.3
584
+ * Bugfix : Supress unlink error message for thumbs
585
+ * Bugfix : Support upload of zip files from MAC
586
+ * Bugfix : Add Stripslash for image description
587
+ * Bugfix : Use for Singlepic not rel="Gallery name"
588
+ * Bugfix : Moved RSS/Snoopy includes into function
589
+
590
+ = V0.62 - 06.07.2007 =
591
+ * NEW : Import for myGallery
592
+ * Added : Updated to jQuery 1.1.3.1
593
+ * Bugfix : Check for memory_limit setting, otherwise pass the test
594
+ * Bugfix : Thumbcode not insert for nggDisplayRandomImages and nggDisplayRecentImages
595
+
596
+ = V0.61 - 29.06.2007 =
597
+ * Added : Forgot the file jquery.nextgen.pack.js and jquery.nextgen.js
598
+
599
+ = V0.60 - 27.06.2007 =
600
+ * NEW : Select a image from the Upload Tab
601
+ * NEW : Tag [imagebrowser=id] for a Inline Gallery Browser
602
+ * NEW : Show gallery without Subpages
603
+ * NEW : Manage gallery : Function "Add a new page"
604
+ * NEW : Manage gallery : Show/Hide thumbnails
605
+ * Added : Slideshow option : Watermark / Background music
606
+ * Added : Check for memory limit
607
+ * Added : Show actual memory usage in overview
608
+ * Added : Include function check in widget
609
+ * Added : Latest Sidebar widget from KeViN
610
+ * Added : Check for capability during installation
611
+ * Changed : Remove P Tag around gallery tags ( THX to the work from John Godley )
612
+ * Bugfix : Delete picture, check for pid
613
+ * Bugfix : admin/settings.php line #172: typos corrected (this=these,maxium=maximum). (THX to Helene D.)
614
+ * Bugfix : admin/settings.php line #311: missing </td> added. (THX to Helene D.)
615
+
616
+ = V0.52 - 31.05.2007 =
617
+ * Changed : Create better thubmnails in square mode (THX to Kees de Bruin)
618
+ * Changed : Again , fixed ratio create better thumbnails (Also for widescreen photos)
619
+ * Removed : Option "Resize image before cropping" removed and included in Create square thumbnail
620
+ * Bugfix : Scan folder for new picture didn't set exclude = 0
621
+ * Bugfix : If no option is checked in thumbnails, resize failed (THK to Joern Kretzschmar)
622
+
623
+ = V0.51 - 28.05.2007 =
624
+ * Bugfix : Thumbnail permission not set correct
625
+ * Bugfix : Folder permission check wrong
626
+ * Bugfix : Remove echo in album (THX to Lazy)
627
+
628
+ = V0.50 - 28.05.2007 =
629
+ * NEW : Select multiple files for upload (THX to Diego A., http://www.fyneworks.com)
630
+ * NEW : Sidebar widget contain now Slideshow, recent images and random images
631
+ * Added : New Option for Imagerotator 3.8 (Slow zoom effect)
632
+ * Added : Option for CDATA wrapper (not working proper)
633
+ * Added : Option for Thickbox Loading Image
634
+ * Added : CSS file for dKret2 (THK to Joern)
635
+ * Added : Better file permission check
636
+ * Changed : Fixed ratio create better thumbnails in portrait mode
637
+ * Changed : All jQuery scripts are now in "No Conflict" mode
638
+ * Changed : Script loading now via wp_enqueue_script
639
+ * Changed : Add constant values for folder/file permission
640
+ * Changed : Use description in <A href title>
641
+ * Bugfix : Remove wrong DIV tag in slideshow
642
+ * Bugfix : Tag [Slideshow=id,width,height] didn't work proper
643
+ * Bugfix : Name conflict in Album script (serialize) (THX to Die-Andis)
644
+ * Bugfix : Changed check for CSS activation
645
+ * Bugfix : Changed check for safe-mode (Don't ask)
646
+
647
+ = V0.43 - 20.05.2007 =
648
+ * Changed : Rename Thumbnail class to avoid php name collision
649
+ * Bugfix : Missing translation flag in setup
650
+ * Bugfix : Changed check for safe-mode
651
+ * Bugfix : Changed check for Zip-File
652
+
653
+ = V0.42 - 17.05.2007 =
654
+ * Bugfix : Float function for singlepic not integrated, sorry !
655
+ * Bugfix : Remove clear:both in widget
656
+
657
+ = V0.41 - 17.05.2007 =
658
+ * NEW : Sidebar widget from KeViN
659
+ * Update : Better album management for more galleries
660
+ * Update : Thickbox v3 integrated
661
+ * Added : Float selection for singlepic
662
+ * Added : CSS class for widget
663
+ * Added : CSS file for K2 theme
664
+ * Added : German translation (THX to Lazy)
665
+ * Added : Better check for safe-mode
666
+ * Added : CSS Class for single-pic : class="ngg-singlepic"
667
+ * Added : Option to resize image before cropping it (Setting reset of prior versions needed! Setup -> Reset Settings)
668
+ * Changed : Image quality by default 85% (THX to ArizonaGroovejet)
669
+ * Bugfix : Update wrong file when select other style
670
+ * Bugfix : Fixed Permalink in album (THX to Helene D.)
671
+ * Bugfix : Scan folder in empty gallery
672
+ * Bugfix : Swfobjects only added with Thickbox effect
673
+ * Bugfix : Umlauts are now handled correctly
674
+
675
+ = V0.40 - 29.04.2007 =
676
+ * NEW : TinyMCE Button integration
677
+ * Removed : CSS Style : remove width/height in album
678
+
679
+ = V0.39 - 28.04.2007 =
680
+ * Added : Set ORDER BY for gallery
681
+ * Bugfix : check now for Exclude != 1
682
+ * Bugfix : DB Query in function wrong
683
+ * Bugfix : DB exlude = DEFAULT '0'
684
+ * Bugfix : Scan folder in empty gallery
685
+
686
+ = V0.38 - 28.04.2007 =
687
+ * Bugfix : One time more remove get_settings :-)
688
+ * Bugfix : $_GET in Manage gallery
689
+ * Bugfix : exclude option
690
+
691
+ = V0.37 - 28.04.2007 =
692
+ * Bugfix : $_GET in Manage gallery
693
+ * Bugfix : update DB installation routine
694
+
695
+ = V0.36 - 26.04.2007 =
696
+ * Bugfix : Stupid PHP beginner failure in album management
697
+
698
+ = V0.35 - 26.04.2007 =
699
+ * Rework : Folder name can be flexible
700
+ * New option : Fullsize pic for Singlepic mode
701
+ * New option : Select show order
702
+ * Added : Check for WP2.1
703
+ * Added : Check for permission for default folder
704
+ * Bugfix : Remove get_settings
705
+ * Bugfix : Correction for Safe-Mode ON
706
+ * Bugfix : Set Default '0' for table album.sortorder
707
+ * Bugfix : Update sort order
708
+
709
+ = V0.34 - 24.04.2007 =
710
+ * Added : Add fix ration setting
711
+ * Added : Add language file file
712
+ * Bugfix : Change link in Album to get_bloginfo('wpurl')
713
+ * Bugfix : Album CSS file not loaded
714
+
715
+ = V0.33 - 23.04.2007 =
716
+ * NEW : Overview Page
717
+ * NEW : Core function
718
+ * NEW : Slideshow
products/photocrati_nextgen/modules/ngglegacy/class.ngglegacy_installer.php CHANGED
@@ -4,103 +4,13 @@ class C_NggLegacy_Installer
4
  {
5
  function install()
6
  {
7
- global $wpdb;
8
  include_once('admin/install.php');
9
-
10
- $this->remove_transients();
11
-
12
- if (is_multisite()) {
13
- $network=isset($_SERVER['SCRIPT_NAME'])?$_SERVER['SCRIPT_NAME']:"";
14
- $activate=isset($_GET['action'])?$_GET['action']:"";
15
- $isNetwork=($network=='/wp-admin/network/plugins.php')?true:false;
16
- $isActivation=($activate=='deactivate')?false:true;
17
-
18
- if ($isNetwork and $isActivation){
19
- $old_blog = $wpdb->blogid;
20
- $blogids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM $wpdb->blogs", NULL));
21
- foreach ($blogids as $blog_id) {
22
- switch_to_blog($blog_id);
23
- nggallery_install($this);
24
- }
25
- switch_to_blog($old_blog);
26
- return;
27
- }
28
- }
29
- // remove the update message
30
- delete_option( 'ngg_update_exists' );
31
- nggallery_install($this);
32
  }
33
 
34
  function uninstall($hard=FALSE)
35
  {
36
  delete_option('ngg_init_check');
37
  delete_option('ngg_update_exists');
38
- delete_option( 'ngg_options' );
39
- delete_option( 'ngg_db_version' );
40
- delete_option( 'ngg_update_exists' );
41
- delete_option( 'ngg_next_update' );
42
-
43
- // now remove the capability
44
- ngg_remove_capability("NextGEN Gallery overview");
45
- ngg_remove_capability("NextGEN Use TinyMCE");
46
- ngg_remove_capability("NextGEN Upload images");
47
- ngg_remove_capability("NextGEN Manage gallery");
48
- ngg_remove_capability("NextGEN Edit album");
49
- ngg_remove_capability("NextGEN Change style");
50
- ngg_remove_capability("NextGEN Change options");
51
- ngg_remove_capability("NextGEN Attach Interface");
52
-
53
- $this->remove_transients();
54
- }
55
-
56
- function remove_transients()
57
- {
58
- global $wpdb, $_wp_using_ext_object_cache;
59
-
60
- // Fetch all transients
61
- $query = "
62
- SELECT option_name FROM {$wpdb->options}
63
- WHERE option_name LIKE '%ngg_request%'
64
- ";
65
- $transient_names = $wpdb->get_col($query);;
66
-
67
- // Delete all transients in the database
68
- $query = "
69
- DELETE FROM {$wpdb->options}
70
- WHERE option_name LIKE '%ngg_request%'
71
- ";
72
- $wpdb->query($query);
73
-
74
- // If using an external caching mechanism, delete the cached items
75
- if ($_wp_using_ext_object_cache) {
76
- foreach ($transient_names as $transient) {
77
- wp_cache_delete($transient, 'transient');
78
- wp_cache_delete(substr($transient, 11), 'transient');
79
- }
80
- }
81
- }
82
-
83
- function upgrade_schema($sql)
84
- {
85
- global $wpdb;
86
-
87
- // upgrade function changed in WordPress 2.3
88
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
89
-
90
- // add charset & collate like wp core
91
- $charset_collate = '';
92
-
93
- if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') ) {
94
- if ( ! empty($wpdb->charset) )
95
- $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
96
- if ( ! empty($wpdb->collate) )
97
- $charset_collate .= " COLLATE $wpdb->collate";
98
- }
99
-
100
- // Add charset to table creation query
101
- $sql = str_replace($charset_collate, '', str_replace(';', '', $sql));
102
-
103
- // Execute the query
104
- dbDelta($sql. ' '. $charset_collate. ';');
105
  }
106
  }
4
  {
5
  function install()
6
  {
 
7
  include_once('admin/install.php');
8
+ nggallery_install();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
  function uninstall($hard=FALSE)
12
  {
13
  delete_option('ngg_init_check');
14
  delete_option('ngg_update_exists');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  }
16
  }
products/photocrati_nextgen/modules/ngglegacy/css/nggallery.css CHANGED
@@ -1,8 +1,8 @@
1
- /*
2
- CSS Name: Default Styles
3
- Description: NextGEN Default Gallery Stylesheet
4
- Author: Photocrati Media
5
- Version: 2.12
6
-
7
- This stylesheet is provided to allow users the ability of overriding the default styles for all display types
8
  */
1
+ /*
2
+ CSS Name: Default Styles
3
+ Description: NextGEN Default Gallery Stylesheet
4
+ Author: Photocrati Media
5
+ Version: 2.12
6
+
7
+ This stylesheet is provided to allow users the ability of overriding the default styles for all display types
8
  */
products/photocrati_nextgen/modules/ngglegacy/lang/nggallery.pot CHANGED
@@ -1128,11 +1128,11 @@ msgid "NextGEN Gallery : Tables could not created, please check your database se
1128
  msgstr ""
1129
 
1130
  #: ../admin/install.php:170
1131
- msgid "[Show slideshow]"
1132
  msgstr ""
1133
 
1134
  #: ../admin/install.php:171
1135
- msgid "[Show thumbnails]"
1136
  msgstr ""
1137
 
1138
  #: ../admin/manage-galleries.php:69
1128
  msgstr ""
1129
 
1130
  #: ../admin/install.php:170
1131
+ msgid "[Show as slideshow]"
1132
  msgstr ""
1133
 
1134
  #: ../admin/install.php:171
1135
+ msgid "[Show picture list]"
1136
  msgstr ""
1137
 
1138
  #: ../admin/manage-galleries.php:69
products/photocrati_nextgen/modules/ngglegacy/lib/media-rss.php CHANGED
@@ -221,10 +221,10 @@ class nggMediaRss {
221
  $out .= $indent . "\t<description><![CDATA[" . nggGallery::i18n($desc, 'pic_' . $image->pid . '_description') . "]]></description>\n";
222
  $out .= $indent . "\t<link><![CDATA[" . $image->get_permalink() . "]]></link>\n";
223
  $out .= $indent . "\t<guid>image-id:" . $image->pid . "</guid>\n";
224
- $out .= $indent . "\t<media:content url='" . nextgen_esc_url($image->imageURL) . "' medium='image' />\n";
225
  $out .= $indent . "\t<media:title><![CDATA[" . nggGallery::i18n($title, 'pic_' . $image->pid . '_alttext') . "]]></media:title>\n";
226
  $out .= $indent . "\t<media:description><![CDATA[" . nggGallery::i18n($desc, 'pic_' . $image->pid . '_description') . "]]></media:description>\n";
227
- $out .= $indent . "\t<media:thumbnail url='" . nextgen_esc_url($image->thumbURL) . "' width='" . $thumbwidth . "' height='" . $thumbheight . "' />\n";
228
  $out .= $indent . "\t<media:keywords><![CDATA[" . nggGallery::i18n($tag_names) . "]]></media:keywords>\n";
229
  $out .= $indent . "\t<media:copyright><![CDATA[Copyright (c) " . get_option("blogname") . " (" . site_url() . ")]]></media:copyright>\n";
230
  $out .= $indent . "</item>\n";
221
  $out .= $indent . "\t<description><![CDATA[" . nggGallery::i18n($desc, 'pic_' . $image->pid . '_description') . "]]></description>\n";
222
  $out .= $indent . "\t<link><![CDATA[" . $image->get_permalink() . "]]></link>\n";
223
  $out .= $indent . "\t<guid>image-id:" . $image->pid . "</guid>\n";
224
+ $out .= $indent . "\t<media:content url='" . esc_url($image->imageURL) . "' medium='image' />\n";
225
  $out .= $indent . "\t<media:title><![CDATA[" . nggGallery::i18n($title, 'pic_' . $image->pid . '_alttext') . "]]></media:title>\n";
226
  $out .= $indent . "\t<media:description><![CDATA[" . nggGallery::i18n($desc, 'pic_' . $image->pid . '_description') . "]]></media:description>\n";
227
+ $out .= $indent . "\t<media:thumbnail url='" . esc_url($image->thumbURL) . "' width='" . $thumbwidth . "' height='" . $thumbheight . "' />\n";
228
  $out .= $indent . "\t<media:keywords><![CDATA[" . nggGallery::i18n($tag_names) . "]]></media:keywords>\n";
229
  $out .= $indent . "\t<media:copyright><![CDATA[Copyright (c) " . get_option("blogname") . " (" . site_url() . ")]]></media:copyright>\n";
230
  $out .= $indent . "</item>\n";
products/photocrati_nextgen/modules/ngglegacy/lib/meta.php CHANGED
@@ -129,8 +129,6 @@ class nggMeta{
129
  $meta['created_timestamp'] = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $this->exif_date2ts($exif['DateTimeDigitized']));
130
  else if (!empty($exif['DateTimeOriginal']))
131
  $meta['created_timestamp'] = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $this->exif_date2ts($exif['DateTimeOriginal']));
132
- else if (!empty($exif['FileDateTime']))
133
- $meta['created_timestamp'] = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $this->exif_date2ts($exif['FileDateTime']));
134
  if (!empty($exif['FocalLength']))
135
  $meta['focal_length'] = $this->exif_frac2dec( $exif['FocalLength'] ) . __(' mm','nggallery');
136
  if (!empty($exif['ISOSpeedRatings']))
@@ -500,37 +498,25 @@ class nggMeta{
500
  */
501
  function get_date_time() {
502
 
503
- $date = time();
504
 
505
- // Try XMP first
506
- if (isset($this->xmp_array['created_timestamp'])) {
507
- $date = @strtotime($this->xmp_array['created_timestamp']);
508
- }
509
 
510
- // Then EXIF
511
- else if (isset($this->exif_array['created_timestamp'])) {
512
- $date = @strtotime($this->exif_array['created_timestamp']);
513
- }
514
-
515
- // Then IPTC
516
- else if (isset($this->iptc_array['created_date'])) {
517
- $date = $this->iptc_array['created_date'];
518
- if (isset($this->iptc_array['created_time'])) {
519
- $date .= " {$this->iptc_array['created_time']}";
520
- }
521
- $date = @strtotime($date);
522
- }
523
-
524
- // If all else fails, use the file creation time
525
- else if ($this->image->imagePath) {
526
- $date = @filectime($this->image->imagePath);
527
- }
528
-
529
- // Failback
530
- if (!$date) $date = time();
531
 
532
  // Return the MySQL format
533
- $date_time = date( 'Y-m-d H:i:s', $date);
534
 
535
  return $date_time;
536
  }
129
  $meta['created_timestamp'] = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $this->exif_date2ts($exif['DateTimeDigitized']));
130
  else if (!empty($exif['DateTimeOriginal']))
131
  $meta['created_timestamp'] = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $this->exif_date2ts($exif['DateTimeOriginal']));
 
 
132
  if (!empty($exif['FocalLength']))
133
  $meta['focal_length'] = $this->exif_frac2dec( $exif['FocalLength'] ) . __(' mm','nggallery');
134
  if (!empty($exif['ISOSpeedRatings']))
498
  */
499
  function get_date_time() {
500
 
501
+ $date_time = time();
502
 
503
+ // get exif - data
504
+ if ( isset( $this->exif_data['EXIF']) ) {
 
 
505
 
506
+ // try to read the date / time from the exif
507
+ foreach (array('DateTimeDigitized', 'DateTimeOriginal', 'FileDateTime') as $key) {
508
+ if (isset($this->exif_data['EXIF'][$key])) {
509
+ $date_time = strtotime($this->exif_data['EXIF'][$key]);
510
+ break;
511
+ }
512
+ }
513
+ } else {
514
+ // if no other date available, get the filetime
515
+ $date_time = @filectime($this->image->imagePath );
516
+ }
 
 
 
 
 
 
 
 
 
 
517
 
518
  // Return the MySQL format
519
+ $date_time = date( 'Y-m-d H:i:s', $date_time );
520
 
521
  return $date_time;
522
  }
products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php CHANGED
@@ -540,7 +540,7 @@ class nggdb {
540
  * @param int|string The image ID or Slug
541
  * @return object A nggImage object representing the image (false if not found)
542
  */
543
- static function find_image( $id ) {
544
  global $wpdb;
545
 
546
  if( is_numeric($id) ) {
@@ -1040,7 +1040,7 @@ class nggdb {
1040
  * @param array $values An array with existing or new values
1041
  * @return bool result of query
1042
  */
1043
- static function update_image_meta( $id, $new_values ) {
1044
  global $wpdb;
1045
 
1046
  // XXX nggdb is used statically, cannot inherit from Ngg_Serializable
@@ -1070,7 +1070,7 @@ class nggdb {
1070
  * @param int (optional) $id of the object, so that it's not checked against itself
1071
  * @return string unique slug for the object, based on $slug (with a -1, -2, etc. suffix)
1072
  */
1073
- static function get_unique_slug( $slug, $type, $id = 0 ) {
1074
 
1075
  global $wpdb;
1076
 
540
  * @param int|string The image ID or Slug
541
  * @return object A nggImage object representing the image (false if not found)
542
  */
543
+ function find_image( $id ) {
544
  global $wpdb;
545
 
546
  if( is_numeric($id) ) {
1040
  * @param array $values An array with existing or new values
1041
  * @return bool result of query
1042
  */
1043
+ function update_image_meta( $id, $new_values ) {
1044
  global $wpdb;
1045
 
1046
  // XXX nggdb is used statically, cannot inherit from Ngg_Serializable
1070
  * @param int (optional) $id of the object, so that it's not checked against itself
1071
  * @return string unique slug for the object, based on $slug (with a -1, -2, etc. suffix)
1072
  */
1073
+ function get_unique_slug( $slug, $type, $id = 0 ) {
1074
 
1075
  global $wpdb;
1076
 
products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php CHANGED
@@ -65,7 +65,7 @@ class nggPostThumbnail {
65
  $iframe_src = add_query_arg('chromeless', '1', $iframe_src);
66
  $iframe_src = add_query_arg('TB_iframe', '1', $iframe_src);
67
 
68
- $set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set NextGEN featured image' ) . '" href="' . nextgen_esc_url( $iframe_src ) . '" id="set-ngg-post-thumbnail" class="thickbox">%s</a></p>';
69
 
70
  $content .= sprintf($set_thumbnail_link, esc_html__( 'Set NextGEN featured image' ));
71
  }
@@ -325,7 +325,7 @@ class nggPostThumbnail {
325
 
326
  global $_wp_additional_image_sizes, $post_ID;
327
 
328
- $set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set featured image' ) . '" href="' . nextgen_esc_url( get_upload_iframe_src('image') ) . '" id="set-post-thumbnail" class="thickbox">%s</a></p>';
329
  $content = sprintf($set_thumbnail_link, esc_html__( 'Set featured image' ));
330
 
331
  $image = nggdb::find_image($thumbnail_id);
65
  $iframe_src = add_query_arg('chromeless', '1', $iframe_src);
66
  $iframe_src = add_query_arg('TB_iframe', '1', $iframe_src);
67
 
68
+ $set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set NextGEN featured image' ) . '" href="' . esc_url( $iframe_src ) . '" id="set-ngg-post-thumbnail" class="thickbox">%s</a></p>';
69
 
70
  $content .= sprintf($set_thumbnail_link, esc_html__( 'Set NextGEN featured image' ));
71
  }
325
 
326
  global $_wp_additional_image_sizes, $post_ID;
327
 
328
+ $set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set featured image' ) . '" href="' . esc_url( get_upload_iframe_src('image') ) . '" id="set-post-thumbnail" class="thickbox">%s</a></p>';
329
  $content = sprintf($set_thumbnail_link, esc_html__( 'Set featured image' ));
330
 
331
  $image = nggdb::find_image($thumbnail_id);
products/photocrati_nextgen/modules/ngglegacy/lib/shortcodes.php CHANGED
@@ -13,12 +13,8 @@ class NextGEN_shortcodes {
13
  // register the new shortcodes
14
  function NextGEN_shortcodes() {
15
 
16
- // Long posts should require a higher limit, see http://core.trac.wordpress.org/ticket/8553
17
- $pcre_limit = 500000;
18
- if ((int)ini_get('pcre.backtrack_limit') < $pcre_limit) {
19
- @ini_set('pcre.backtrack_limit', $pcre_limit);
20
- }
21
-
22
 
23
  // convert the old shortcode
24
  add_filter('the_content', array(&$this, 'convert_shortcode'));
13
  // register the new shortcodes
14
  function NextGEN_shortcodes() {
15
 
16
+ //Long posts should require a higher limit, see http://core.trac.wordpress.org/ticket/8553
17
+ @ini_set('pcre.backtrack_limit', 500000);
 
 
 
 
18
 
19
  // convert the old shortcode
20
  add_filter('the_content', array(&$this, 'convert_shortcode'));
products/photocrati_nextgen/modules/ngglegacy/lib/sitemap.php CHANGED
@@ -44,11 +44,11 @@ class nggSitemaps {
44
  remove_all_shortcodes();
45
 
46
  // We cannot parse at this point a album, just galleries & single images
47
- C_NextGen_Shortcode_Manager::add( 'singlepic', array(&$this, 'add_images' ) );
48
- C_NextGen_Shortcode_Manager::add( 'thumb', array(&$this, 'add_images' ) );
49
- C_NextGen_Shortcode_Manager::add( 'nggallery', array(&$this, 'add_gallery') );
50
- C_NextGen_Shortcode_Manager::add( 'imagebrowser', array(&$this, 'add_gallery' ) );
51
- C_NextGen_Shortcode_Manager::add( 'slideshow', array(&$this, 'add_gallery' ) );
52
 
53
  // Search now for shortcodes
54
  do_shortcode( $p->post_content );
44
  remove_all_shortcodes();
45
 
46
  // We cannot parse at this point a album, just galleries & single images
47
+ add_shortcode( 'singlepic', array(&$this, 'add_images' ) );
48
+ add_shortcode( 'thumb', array(&$this, 'add_images' ) );
49
+ add_shortcode( 'nggallery', array(&$this, 'add_gallery') );
50
+ add_shortcode( 'imagebrowser', array(&$this, 'add_gallery' ) );
51
+ add_shortcode( 'slideshow', array(&$this, 'add_gallery' ) );
52
 
53
  // Search now for shortcodes
54
  do_shortcode( $p->post_content );
products/photocrati_nextgen/modules/ngglegacy/lib/xmlrpc.php ADDED
@@ -0,0 +1,882 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * XML-RPC protocol support for NextGEN Gallery
4
+ *
5
+ * @package NextGEN Gallery
6
+ * @author Alex Rabe
7
+ *
8
+ */
9
+ class nggXMLRPC{
10
+
11
+ /**
12
+ * Init the methods for the XMLRPC hook
13
+ *
14
+ */
15
+ function __construct() {
16
+
17
+ add_filter('xmlrpc_methods', array(&$this, 'add_methods') );
18
+ }
19
+
20
+ function add_methods($methods) {
21
+
22
+ $methods['ngg.installed'] = array(&$this, 'nggInstalled');
23
+ // Image methods
24
+ $methods['ngg.getImage'] = array(&$this, 'getImage');
25
+ $methods['ngg.getImages'] = array(&$this, 'getImages');
26
+ $methods['ngg.uploadImage'] = array(&$this, 'uploadImage');
27
+ $methods['ngg.editImage'] = array(&$this, 'editImage');
28
+ $methods['ngg.deleteImage'] = array(&$this, 'deleteImage');
29
+ // Gallery methods
30
+ $methods['ngg.getGallery'] = array(&$this, 'getGallery');
31
+ $methods['ngg.getGalleries'] = array(&$this, 'getGalleries');
32
+ $methods['ngg.newGallery'] = array(&$this, 'newGallery');
33
+ $methods['ngg.editGallery'] = array(&$this, 'editGallery');
34
+ $methods['ngg.deleteGallery'] = array(&$this, 'deleteGallery');
35
+ // Album methods
36
+ $methods['ngg.getAlbum'] = array(&$this, 'getAlbum');
37
+ $methods['ngg.getAlbums'] = array(&$this, 'getAlbums');
38
+ $methods['ngg.newAlbum'] = array(&$this, 'newAlbum');
39
+ $methods['ngg.editAlbum'] = array(&$this, 'editAlbum');
40
+ $methods['ngg.deleteAlbum'] = array(&$this, 'deleteAlbum');
41
+
42
+ return $methods;
43
+ }
44
+
45
+ /**
46
+ * Check if it's an csv string, then serialize it.
47
+ *
48
+ * @since 1.9.2
49
+ * @param string $data
50
+ * @return serialized string
51
+ */
52
+ function is_serialized( $data ) {
53
+
54
+ // if it isn't a string, we don't serialize it.
55
+ if ( ! is_string( $data ) )
56
+ return false;
57
+
58
+ if ($data && !strpos( $data , '{')) {
59
+ $items = explode(',', $data);
60
+ return serialize($items);
61
+ }
62
+
63
+ return $data;
64
+ }
65
+
66
+ /**
67
+ * Check if NextGEN Gallery is installed
68
+ *
69
+ * @since 1.4
70
+ *
71
+ * @param none
72
+ * @return string version number
73
+ */
74
+ function nggInstalled($args) {
75
+ global $ngg;
76
+ return array( 'version' => $ngg->version );
77
+ }
78
+
79
+ /**
80
+ * Log user in.
81
+ *
82
+ * @since 2.8
83
+ *
84
+ * @param string $username User's username.
85
+ * @param string $password User's password.
86
+ * @return mixed WP_User object if authentication passed, false otherwise
87
+ */
88
+ function login($username, $password) {
89
+ global $wp_version;
90
+
91
+ if (version_compare($wp_version,"3.5","<")) {
92
+ if ( !get_option( 'enable_xmlrpc' ) ) {
93
+ $this->error = new IXR_Error( 405, sprintf( __('XML-RPC services are disabled on this blog. An admin user can enable them at %s'), admin_url('options-writing.php') ) );
94
+ return false;
95
+ }
96
+ }
97
+
98
+ $user = wp_authenticate($username, $password);
99
+
100
+ if (is_wp_error($user)) {
101
+ $this->error = new IXR_Error(403, __('Bad login/pass combination.'));
102
+ return false;
103
+ }
104
+
105
+ set_current_user( $user->ID );
106
+ return $user;
107
+ }
108
+
109
+ /**
110
+ * Method "ngg.uploadImage"
111
+ * Uploads a image to a gallery
112
+ *
113
+ * @since 1.4
114
+ *
115
+ * @copyright addapted from WP Core
116
+ * @param array $args Method parameters.
117
+ * - int blog_id
118
+ * - string username
119
+ * - string password
120
+ * - struct data
121
+ * o string name
122
+ * o string type (optional)
123
+ * o base64 bits
124
+ * o bool overwrite (optional)
125
+ * o int gallery
126
+ * o int image_id (optional)
127
+ * @return array with image meta data
128
+ */
129
+ function uploadImage($args) {
130
+ global $wpdb;
131
+
132
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
133
+ require_once ( 'meta.php' ); // meta data import
134
+
135
+ $blog_ID = (int) $args[0];
136
+ $username = $wpdb->escape($args[1]);
137
+ $password = $wpdb->escape($args[2]);
138
+ $data = $args[3];
139
+
140
+ $name = $data['name'];
141
+ $type = $data['type'];
142
+ $bits = $data['bits'];
143
+
144
+ // gallery & image id
145
+ $gid = (int) $data['gallery']; // required field
146
+ $pid = (int) $data['image_id']; // optional but more foolproof of overwrite
147
+ $image = false; // container for the image object
148
+
149
+ logIO('O', '(NGG) Received '.strlen($bits).' bytes');
150
+
151
+ if ( !$user = $this->login($username, $password) )
152
+ return $this->error;
153
+
154
+ // Check if you have the correct capability for upload
155
+ if ( !current_user_can('NextGEN Upload images') ) {
156
+ logIO('O', '(NGG) User does not have upload_files capability');
157
+ $this->error = new IXR_Error(401, __('You are not allowed to upload files to this site.'));
158
+ return $this->error;
159
+ }
160
+
161
+ // Look for the gallery , could we find it ?
162
+ if ( !$gallery = nggdb::find_gallery($gid) )
163
+ return new IXR_Error(404, __('Could not find gallery ' . $gid ));
164
+
165
+ // Now check if you have the correct capability for this gallery
166
+ if ( !nggAdmin::can_manage_this_gallery($gallery->author) ) {
167
+ logIO('O', '(NGG) User does not have upload_files capability');
168
+ $this->error = new IXR_Error(401, __('You are not allowed to upload files to this gallery.'));
169
+ return $this->error;
170
+ }
171
+
172
+ //clean filename and extract extension
173
+ $filepart = nggGallery::fileinfo( $name );
174
+ $name = $filepart['basename'];
175
+
176
+ // check for allowed extension and if it's an image file
177
+ $ext = array('jpg', 'png', 'gif');
178
+ if ( !in_array($filepart['extension'], $ext) ){
179
+ logIO('O', '(NGG) Not allowed file type');
180
+ $this->error = new IXR_Error(401, __('This is no valid image file.','nggallery'));
181
+ return $this->error;
182
+ }
183
+
184
+ // in the case you would overwrite the image, let's delete the old one first
185
+ if(!empty($data["overwrite"]) && ($data["overwrite"] == true)) {
186
+
187
+ // search for the image based on the filename, if it's not already provided
188
+ if ($pid == 0)
189
+ $pid = $wpdb->get_col(" SELECT pid FROM {$wpdb->nggpictures} WHERE filename = '{$name}' AND galleryid = '{$gid}' ");
190
+
191
+ if ( !$image = nggdb::find_image( $pid ) )
192
+ return new IXR_Error(404, __('Could not find image id ' . $pid ));
193
+
194
+ // sync the gallery<->image parameter, otherwise we may copy it to the wrong gallery
195
+ $gallery = $image;
196
+
197
+ // delete now the image
198
+ if ( !@unlink( $image->imagePath ) ) {
199
+ $errorString = sprintf(__('Failed to delete image %1$s ','nggallery'), $image->imagePath);
200
+ logIO('O', '(NGG) ' . $errorString);
201
+ return new IXR_Error(500, $errorString);
202
+ }
203
+ }
204
+
205
+ // upload routine from wp core, load first the image to the upload folder, $upload['file'] contain the path
206
+ $upload = wp_upload_bits($name, $type, $bits);
207
+ if ( ! empty($upload['error']) ) {
208
+ $errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']);
209
+ logIO('O', '(NGG) ' . $errorString);
210
+ return new IXR_Error(500, $errorString);
211
+ }
212
+
213
+ // this is the dir to the gallery
214
+ $path = WINABSPATH . $gallery->path;
215
+
216
+ // check if the filename already exist, if not add a counter index
217
+ $filename = wp_unique_filename( $path, $name );
218
+ $destination = $path . '/'. $filename;
219
+
220
+ // Move files to gallery folder
221
+ if ( !@rename($upload['file'], $destination ) ) {
222
+ $errorString = sprintf(__('Failed to move image %1$s to %2$s','nggallery'), '<strong>' . $upload['file'] . '</strong>', $destination);
223
+ logIO('O', '(NGG) ' . $errorString);
224
+ return new IXR_Error(500, $errorString);
225
+ }
226
+
227
+ //add to database if it's a new image
228
+ if(empty($data["overwrite"]) || ($data["overwrite"] == false)) {
229
+ $pid_array = nggAdmin::add_Images( $gallery->gid, array( $filename ) );
230
+ // the first element is our new image id
231
+ if (count($pid_array) == 1)
232
+ $pid = $pid_array[0];
233
+ }
234
+
235
+ //get all information about the image, in the case it's a new one
236
+ if (!$image)
237
+ $image = nggdb::find_image( $pid );
238
+
239
+ // create again the thumbnail, should return a '1'
240
+ nggAdmin::create_thumbnail( $image );
241
+
242
+ return apply_filters( 'ngg_upload_image', $image );
243
+
244
+ }
245
+
246
+ /**
247
+ * Method "ngg.deleteImage"
248
+ * Delete a Image from the database and gallery
249
+ *
250
+ * @since 1.7.3
251
+ *
252
+ * @param array $args Method parameters.
253
+ * - int blog_id
254
+ * - string username
255
+ * - string password
256
+ * - int image_id
257
+ * @return true
258
+ */
259
+ function deleteImage($args) {
260
+
261
+ global $nggdb, $ngg;
262
+
263
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
264
+
265
+ $this->escape($args);
266
+ $blog_ID = (int) $args[0];
267
+ $username = $args[1];
268
+ $password = $args[2];
269
+ $id = (int) $args[3];
270
+
271
+ if ( !$user = $this->login($username, $password) )
272
+ return $this->error;
273
+
274
+ if ( !$image = nggdb::find_image($id) )
275
+ return(new IXR_Error(404, __("Invalid image ID")));
276
+
277
+ if ( !current_user_can( 'NextGEN Manage gallery' ) && !nggAdmin::can_manage_this_gallery($image->author) )
278
+ return new IXR_Error( 401, __( 'Sorry, you must be able to edit this image' ) );
279
+
280
+ if ($ngg->options['deleteImg']) {
281
+ @unlink($image->imagePath);
282
+ @unlink($image->thumbPath);
283
+ @unlink($image->imagePath . "_backup" );
284
+ }
285
+
286
+ nggdb::delete_image ( $id );
287
+
288
+ return true;
289
+
290
+ }
291
+
292
+ /**
293
+ * Method "ngg.editImage"
294
+ * Edit a existing Image
295
+ *
296
+ * @since 1.7.3
297
+ *
298
+ * @param array $args Method parameters.
299
+ * - int blog_id
300
+ * - string username
301
+ * - string password
302
+ * - int Image ID
303
+ * - string alt/title text
304
+ * - string description
305
+ * - int exclude from gallery (0 or 1)
306
+ * @return true if success
307
+ */
308
+ function editImage($args) {
309
+
310
+ global $ngg;
311
+
312
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
313
+
314
+ $this->escape($args);
315
+ $blog_ID = (int) $args[0];
316
+ $username = $args[1];
317
+ $password = $args[2];
318
+ $id = (int) $args[3];
319
+ $alttext = $args[4];
320
+ $description= $args[5];
321
+ $exclude = (int) $args[6];
322
+
323
+ if ( !$user = $this->login($username, $password) )
324
+ return $this->error;
325
+
326
+ if ( !$image = nggdb::find_image($id) )
327
+ return(new IXR_Error(404, __( 'Invalid image ID' )));
328
+
329
+ if ( !current_user_can( 'NextGEN Manage gallery' ) && !nggAdmin::can_manage_this_gallery($image->author) )
330
+ return new IXR_Error( 401, __( 'Sorry, you must be able to edit this image' ) );
331
+
332
+ if ( !empty( $id ) )
333
+ $result = nggdb::update_image($id, false, false, $description, $alttext, $exclude);
334
+
335
+ if ( !$result )
336
+ return new IXR_Error(500, __('Sorry, could not update the image'));
337
+
338
+ return true;
339
+
340
+ }
341
+
342
+ /**
343
+ * Method "ngg.newGallery"
344
+ * Create a new gallery
345
+ *
346
+ * @since 1.4
347
+ *
348
+ * @param array $args Method parameters.
349
+ * - int blog_id
350
+ * - string username
351
+ * - string password
352
+ * - string new gallery name
353
+ * @return int with new gallery ID
354
+ */
355
+ function newGallery($args) {
356
+
357
+ global $ngg;
358
+
359
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
360
+
361
+ $this->escape($args);
362
+ $blog_ID = (int) $args[0];
363
+ $username = $args[1];
364
+ $password = $args[2];
365
+ $name = $args[3];
366
+ $id = false;
367
+
368
+ if ( !$user = $this->login($username, $password) )
369
+ return $this->error;
370
+
371
+ if( !current_user_can( 'NextGEN Manage gallery' ) )
372
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage galleries' ) );
373
+
374
+ if ( !empty( $name ) )
375
+ $id = nggAdmin::create_gallery($name, $ngg->options['gallerypath'], false);
376
+
377
+ if ( !$id )
378
+ return new IXR_Error(500, __('Sorry, could not create the gallery'));
379
+
380
+ return($id);
381
+
382
+ }
383
+
384
+ /**
385
+ * Method "ngg.editGallery"
386
+ * Edit a existing gallery
387
+ *
388
+ * @since 1.7.0
389
+ *
390
+ * @param array $args Method parameters.
391
+ * - int blog_id
392
+ * - string username
393
+ * - string password
394
+ * - int gallery ID
395
+ * - string gallery name
396
+ * - string title
397
+ * - string description
398
+ * - int ID of the preview picture
399
+ * @return true if success
400
+ */
401
+ function editGallery($args) {
402
+
403
+ global $ngg;
404
+
405
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
406
+
407
+ $this->escape($args);
408
+ $blog_ID = (int) $args[0];
409
+ $username = $args[1];
410
+ $password = $args[2];
411
+ $id = (int) $args[3];
412
+ $name = $args[4];
413
+ $title = $args[5];
414
+ $description= $args[6];
415
+ $previewpic = (int) $args[7];
416
+
417
+ if ( !$user = $this->login($username, $password) )
418
+ return $this->error;
419
+
420
+ if ( !$gallery = nggdb::find_gallery($id) )
421
+ return(new IXR_Error(404, __("Invalid gallery ID")));
422
+
423
+ if ( !current_user_can( 'NextGEN Manage gallery' ) && !nggAdmin::can_manage_this_gallery($gallery->author) )
424
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage this gallery' ) );
425
+
426
+ if ( !empty( $name ) )
427
+ $result = nggdb::update_gallery($id, $name, false, $title, $description, false, $previewpic);
428
+
429
+ if ( !$result )
430
+ return new IXR_Error(500, __('Sorry, could not update the gallery'));
431
+
432
+ return true;
433
+
434
+ }
435
+
436
+ /**
437
+ * Method "ngg.newAlbum"
438
+ * Create a new album
439
+ *
440
+ * @since 1.7.0
441
+ *
442
+ * @param array $args Method parameters.
443
+ * - int blog_id
444
+ * - string username
445
+ * - string password
446
+ * - string new album name
447
+ * - int id of preview image
448
+ * - string description
449
+ * - string serialized array of galleries or a comma-separated string of gallery IDs
450
+ * @return int with new album ID
451
+ */
452
+ function newAlbum($args) {
453
+
454
+ global $ngg;
455
+
456
+ $this->escape($args);
457
+ $blog_ID = (int) $args[0];
458
+ $username = $args[1];
459
+ $password = $args[2];
460
+ $name = $args[3];
461
+ $preview = (int) $args[4];
462
+ $description= $args[5];
463
+ $galleries = $this->is_serialized($args[6]);
464
+ $id = false;
465
+
466
+ if ( !$user = $this->login($username, $password) )
467
+ return $this->error;
468
+
469
+ if( !current_user_can( 'NextGEN Edit album' ) || !nggGallery::current_user_can( 'NextGEN Add/Delete album' ) )
470
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage albums' ) );
471
+
472
+ if ( !empty( $name ) )
473
+ $id = $result = nggdb::add_album( $name, $preview, $description, $galleries );
474
+
475
+ if ( !$id )
476
+ return new IXR_Error(500, __('Sorry, could not create the album'));
477
+
478
+ return($id);
479
+
480
+ }
481
+
482
+ /**
483
+ * Method "ngg.editAlbum"
484
+ * Edit a existing Album
485
+ *
486
+ * @since 1.7.0
487
+ *
488
+ * @param array $args Method parameters.
489
+ * - int blog_id
490
+ * - string username
491
+ * - string password
492
+ * - int album ID
493
+ * - string album name
494
+ * - int id of preview image
495
+ * - string description
496
+ * - string serialized array of galleries or a comma-separated string of gallery IDs
497
+ * @return true if success
498
+ */
499
+ function editAlbum($args) {
500
+
501
+ global $ngg;
502
+
503
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
504
+
505
+ $this->escape($args);
506
+ $blog_ID = (int) $args[0];
507
+ $username = $args[1];
508
+ $password = $args[2];
509
+ $id = (int) $args[3];
510
+ $name = $args[4];
511
+ $preview = (int) $args[5];
512
+ $description= $args[6];
513
+ $galleries = $this->is_serialized($args[7]);
514
+
515
+ if ( !$user = $this->login($username, $password) )
516
+ return $this->error;
517
+
518
+ if ( !$album = nggdb::find_album($id) )
519
+ return(new IXR_Error(404, __("Invalid album ID")));
520
+
521
+ if( !current_user_can( 'NextGEN Edit album' ) )
522
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage albums' ) );
523
+
524
+ if ( !empty( $name ) )
525
+ $result = nggdb::update_album($id, $name, $preview, $description, $galleries);
526
+
527
+ if ( !$result )
528
+ return new IXR_Error(500, __('Sorry, could not update the album'));
529
+
530
+ return true;
531
+
532
+ }
533
+
534
+ /**
535
+ * Method "ngg.deleteAlbum"
536
+ * Delete a album from the database
537
+ *
538
+ * @since 1.7.0
539
+ *
540
+ * @param array $args Method parameters.
541
+ * - int blog_id
542
+ * - string username
543
+ * - string password
544
+ * - int album id
545
+ * @return true
546
+ */
547
+ function deleteAlbum($args) {
548
+
549
+ global $nggdb;
550
+
551
+ $this->escape($args);
552
+ $blog_ID = (int) $args[0];
553
+ $username = $args[1];
554
+ $password = $args[2];
555
+ $id = (int) $args[3];
556
+
557
+ if ( !$user = $this->login($username, $password) )
558
+ return $this->error;
559
+
560
+ if ( !$album = nggdb::find_album($id) )
561
+ return(new IXR_Error(404, __("Invalid album ID")));
562
+
563
+ if( !current_user_can( 'NextGEN Edit album' ) && !nggGallery::current_user_can( 'NextGEN Add/Delete album' ) )
564
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage albums' ) );
565
+
566
+ $nggdb->delete_album($id);
567
+
568
+ return true;
569
+
570
+ }
571
+
572
+ /**
573
+ * Method "ngg.deleteGallery"
574
+ * Delete a gallery from the database, including all images
575
+ *
576
+ * @since 1.7.0
577
+ *
578
+ * @param array $args Method parameters.
579
+ * - int blog_id
580
+ * - string username
581
+ * - string password
582
+ * - int gallery_id
583
+ * @return true
584
+ */
585
+ function deleteGallery($args) {
586
+
587
+ global $nggdb;
588
+
589
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
590
+
591
+ $this->escape($args);
592
+ $blog_ID = (int) $args[0];
593
+ $username = $args[1];
594
+ $password = $args[2];
595
+ $id = (int) $args[3];
596
+
597
+ if ( !$user = $this->login($username, $password) )
598
+ return $this->error;
599
+
600
+ if ( !$gallery = nggdb::find_gallery($id) )
601
+ return(new IXR_Error(404, __("Invalid gallery ID")));
602
+
603
+ if ( !current_user_can( 'NextGEN Manage gallery' ) && !nggAdmin::can_manage_this_gallery($gallery->author) )
604
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage galleries' ) );
605
+
606
+ $nggdb->delete_gallery($id);
607
+
608
+ return true;
609
+
610
+ }
611
+
612
+ /**
613
+ * Method "ngg.getAlbums"
614
+ * Return the list of all albums
615
+ *
616
+ * @since 1.7.0
617
+ *
618
+ * @param array $args Method parameters.
619
+ * - int blog_id
620
+ * - string username
621
+ * - string password
622
+ * @return array with all galleries
623
+ */
624
+ function getAlbums($args) {
625
+
626
+ global $nggdb;
627
+
628
+ $this->escape($args);
629
+ $blog_ID = (int) $args[0];
630
+ $username = $args[1];
631
+ $password = $args[2];
632
+
633
+ if ( !$user = $this->login($username, $password) )
634
+ return $this->error;
635
+
636
+ if( !current_user_can( 'NextGEN Edit album' ) )
637
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage albums' ) );
638
+
639
+ $album_list = $nggdb->find_all_album('id', 'ASC', 0, 0 );
640
+
641
+ return($album_list);
642
+
643
+ }
644
+
645
+ /**
646
+ * Method "ngg.getAlbum"
647
+ * Return the specified album
648
+ *
649
+ * @since 1.9.2
650
+ *
651
+ * @param array $args Method parameters.
652
+ * - int blog_id
653
+ * - string username
654
+ * - string password
655
+ * - int album_id
656
+ * @return array with the album object
657
+ */
658
+ function getAlbum($args) {
659
+
660
+ global $nggdb;
661
+
662
+ $this->escape($args);
663
+ $blog_ID = (int) $args[0];
664
+ $username = $args[1];
665
+ $password = $args[2];
666
+ $id = (int) $args[3];
667
+
668
+ if ( !$user = $this->login($username, $password) )
669
+ return $this->error;
670
+
671
+ if( !current_user_can( 'NextGEN Edit album' ) )
672
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage albums' ) );
673
+
674
+ $album = $nggdb->find_album( $id );
675
+
676
+ return($album);
677
+
678
+ }
679
+
680
+ /**
681
+ * Method "ngg.getGalleries"
682
+ * Return the list of all galleries
683
+ *
684
+ * @since 1.4
685
+ *
686
+ * @param array $args Method parameters.
687
+ * - int blog_id
688
+ * - string username
689
+ * - string password
690
+ * @return array with all galleries
691
+ */
692
+ function getGalleries($args) {
693
+
694
+ global $nggdb;
695
+
696
+ $this->escape($args);
697
+ $blog_ID = (int) $args[0];
698
+ $username = $args[1];
699
+ $password = $args[2];
700
+
701
+ if ( !$user = $this->login($username, $password) )
702
+ return $this->error;
703
+
704
+ if( !current_user_can( 'NextGEN Manage gallery' ) )
705
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage galleries' ) );
706
+
707
+ $gallery_list = $nggdb->find_all_galleries('gid', 'asc', true, 0, 0, false);
708
+
709
+ return($gallery_list);
710
+
711
+ }
712
+
713
+ /**
714
+ * Method "ngg.getGallery"
715
+ * Return the specified gallery
716
+ *
717
+ * @since 1.9.2
718
+ *
719
+ * @param array $args Method parameters.
720
+ * - int blog_id
721
+ * - string username
722
+ * - string password
723
+ * - int gallery_id
724
+ * @return array with the gallery object
725
+ */
726
+ function getGallery($args) {
727
+
728
+ global $nggdb;
729
+
730
+ $this->escape($args);
731
+ $blog_ID = (int) $args[0];
732
+ $username = $args[1];
733
+ $password = $args[2];
734
+ $gid = (int) $args[3];
735
+
736
+ if ( !$user = $this->login($username, $password) )
737
+ return $this->error;
738
+
739
+ if( !current_user_can( 'NextGEN Manage gallery' ) )
740
+ return new IXR_Error( 401, __( 'Sorry, you must be able to manage galleries' ) );
741
+
742
+ $gallery = $nggdb->find_gallery($gid);
743
+
744
+ return($gallery);
745
+
746
+ }
747
+
748
+ /**
749
+ * Method "ngg.getImages"
750
+ * Return the list of all images inside a gallery
751
+ *
752
+ * @since 1.4
753
+ *
754
+ * @param array $args Method parameters.
755
+ * - int blog_id
756
+ * - string username
757
+ * - string password
758
+ * - int gallery_id
759
+ * @return array with all images
760
+ */
761
+ function getImages($args) {
762
+
763
+ global $nggdb;
764
+
765
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
766
+
767
+ $this->escape($args);
768
+ $blog_ID = (int) $args[0];
769
+ $username = $args[1];
770
+ $password = $args[2];
771
+ $gid = (int) $args[3];
772
+
773
+ if ( !$user = $this->login($username, $password) )
774
+ return $this->error;
775
+
776
+ // Look for the gallery , could we find it ?
777
+ if ( !$gallery = nggdb::find_gallery( $gid ) )
778
+ return new IXR_Error(404, __('Could not find gallery ' . $gid ));
779
+
780
+ // Now check if you have the correct capability for this gallery
781
+ if ( !nggAdmin::can_manage_this_gallery($gallery->author) ) {
782
+ logIO('O', '(NGG) User does not have upload_files capability');
783
+ $this->error = new IXR_Error(401, __('You are not allowed to upload files to this gallery.'));
784
+ return $this->error;
785
+ }
786
+
787
+ // get picture values
788
+ $picture_list = $nggdb->get_gallery( $gid, 'pid', 'ASC', false );
789
+
790
+ return($picture_list);
791
+
792
+ }
793
+
794
+ /**
795
+ * Method "ngg.getImage"
796
+ * Return a single image inside a gallery
797
+ *
798
+ * @since 1.9.2
799
+ *
800
+ * @param array $args Method parameters.
801
+ * - int blog_id
802
+ * - string username
803
+ * - string password
804
+ * - int picture_id
805
+ * @return array with image properties
806
+ */
807
+ function getImage($args) {
808
+
809
+ global $nggdb;
810
+
811
+ require_once ( dirname ( dirname( __FILE__ ) ). '/admin/functions.php' ); // admin functions
812
+
813
+ $this->escape($args);
814
+ $blog_ID = (int) $args[0];
815
+ $username = $args[1];
816
+ $password = $args[2];
817
+ $pid = (int) $args[3];
818
+
819
+ if ( !$user = $this->login($username, $password) )
820
+ return $this->error;
821
+
822
+ // get picture
823
+ $image = $nggdb->find_image( $pid );
824
+
825
+ if ($image) {
826
+ $gid = $image->galleryid;
827
+
828
+ // Look for the gallery , could we find it ?
829
+ if ( !$gallery = nggdb::find_gallery( $gid ) )
830
+ return new IXR_Error(404, __('Could not find gallery ' . $gid ));
831
+
832
+ // Now check if you have the correct capability for this gallery
833
+ if ( !nggAdmin::can_manage_this_gallery($gallery->author) ) {
834
+ logIO('O', '(NGG) User does not have upload_files capability');
835
+ $this->error = new IXR_Error(401, __('You are not allowed to upload files to this gallery.'));
836
+ return $this->error;
837
+ }
838
+ }
839
+
840
+ return($image);
841
+
842
+ }
843
+
844
+ /**
845
+ * Sanitize string or array of strings for database.
846
+ *
847
+ * @since 1.7.0
848
+ * @author WordPress Core
849
+ * @filesource inludes/class-wp-xmlrpc-server.php
850
+ *
851
+ * @param string|array $array Sanitize single string or array of strings.
852
+ * @return string|array Type matches $array and sanitized for the database.
853
+ */
854
+ function escape(&$array) {
855
+ global $wpdb;
856
+
857
+ if (!is_array($array)) {
858
+ return($wpdb->escape($array));
859
+ } else {
860
+ foreach ( (array) $array as $k => $v ) {
861
+ if ( is_array($v) ) {
862
+ $this->escape($array[$k]);
863
+ } else if ( is_object($v) ) {
864
+ //skip
865
+ } else {
866
+ $array[$k] = $wpdb->escape($v);
867
+ }
868
+ }
869
+ }
870
+ }
871
+
872
+ /**
873
+ * PHP5 style destructor and will run when database object is destroyed.
874
+ *
875
+ * @return bool Always true
876
+ */
877
+ function __destruct() {
878
+
879
+ }
880
+ }
881
+
882
+ $nggxmlrpc = new nggXMLRPC();
products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php CHANGED
@@ -24,7 +24,7 @@ class M_NggLegacy extends C_Base_Module
24
  'photocrati-nextgen-legacy',
25
  'NextGEN Legacy',
26
  'Embeds the original version of NextGEN 1.9.3 by Alex Rabe',
27
- '0.3',
28
  'http://www.nextgen-gallery.com',
29
  'Photocrati Media',
30
  'http://www.photocrati.com'
24
  'photocrati-nextgen-legacy',
25
  'NextGEN Legacy',
26
  'Embeds the original version of NextGEN 1.9.3 by Alex Rabe',
27
+ '0.1',
28
  'http://www.nextgen-gallery.com',
29
  'Photocrati Media',
30
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/ngglegacy/nggallery.php CHANGED
@@ -11,7 +11,7 @@ if (!class_exists('nggLoader')) {
11
 
12
  var $version = NEXTGEN_GALLERY_PLUGIN_VERSION;
13
  var $dbversion = '1.8.1';
14
- var $minimum_WP = '3.6.1';
15
  var $donators = 'http://www.nextgen-gallery.com/donators.php';
16
  var $options = '';
17
  var $manage_page;
@@ -36,6 +36,13 @@ if (!class_exists('nggLoader')) {
36
  $this->load_dependencies();
37
  $this->start_rewrite_module();
38
 
 
 
 
 
 
 
 
39
  // Start this plugin once all other plugins are fully loaded
40
  add_action( 'plugins_loaded', array(&$this, 'start_plugin') );
41
 
@@ -112,8 +119,6 @@ if (!class_exists('nggLoader')) {
112
  case 'image':
113
  require_once (dirname (__FILE__) . '/nggshow.php');
114
  break;
115
- default:
116
- return;
117
  }
118
  C_NextGEN_Bootstrap::shutdown();
119
  }
@@ -257,6 +262,10 @@ if (!class_exists('nggLoader')) {
257
  require_once (dirname (__FILE__) . '/nggfunctions.php'); // n.a.
258
  require_once (dirname (__FILE__) . '/lib/shortcodes.php'); // 92.664
259
 
 
 
 
 
260
  // We didn't need all stuff during a AJAX operation
261
  if ( defined('DOING_AJAX') )
262
  require_once (dirname (__FILE__) . '/admin/ajax.php');
@@ -307,12 +316,99 @@ if (!class_exists('nggLoader')) {
307
  if (is_plugin_active_for_network( $this->plugin_name )) {
308
  $current_blog = $wpdb->blogid;
309
  switch_to_blog($blog_id);
310
- $installer = new C_NggLegacy_Installer;
311
- nggallery_install($installer);
312
  switch_to_blog($current_blog);
313
  }
314
  }
315
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  function disable_upgrade($option){
317
 
318
  // PHP5.2 is required for NGG V1.4.0
11
 
12
  var $version = NEXTGEN_GALLERY_PLUGIN_VERSION;
13
  var $dbversion = '1.8.1';
14
+ var $minimum_WP = '3.5.2';
15
  var $donators = 'http://www.nextgen-gallery.com/donators.php';
16
  var $options = '';
17
  var $manage_page;
36
  $this->load_dependencies();
37
  $this->start_rewrite_module();
38
 
39
+ // Init options & tables during activation & deregister init option
40
+ register_activation_hook( $this->plugin_name, array(&$this, 'activate') );
41
+ register_deactivation_hook( $this->plugin_name, array(&$this, 'deactivate') );
42
+
43
+ // Register a uninstall hook to remove all tables & option automatic
44
+ register_uninstall_hook( $this->plugin_name, array(__CLASS__, 'uninstall') );
45
+
46
  // Start this plugin once all other plugins are fully loaded
47
  add_action( 'plugins_loaded', array(&$this, 'start_plugin') );
48
 
119
  case 'image':
120
  require_once (dirname (__FILE__) . '/nggshow.php');
121
  break;
 
 
122
  }
123
  C_NextGEN_Bootstrap::shutdown();
124
  }
262
  require_once (dirname (__FILE__) . '/nggfunctions.php'); // n.a.
263
  require_once (dirname (__FILE__) . '/lib/shortcodes.php'); // 92.664
264
 
265
+ //Just needed if you access remote to WordPress
266
+ if ( defined('XMLRPC_REQUEST') )
267
+ require_once (dirname (__FILE__) . '/lib/xmlrpc.php');
268
+
269
  // We didn't need all stuff during a AJAX operation
270
  if ( defined('DOING_AJAX') )
271
  require_once (dirname (__FILE__) . '/admin/ajax.php');
316
  if (is_plugin_active_for_network( $this->plugin_name )) {
317
  $current_blog = $wpdb->blogid;
318
  switch_to_blog($blog_id);
319
+ nggallery_install();
 
320
  switch_to_blog($current_blog);
321
  }
322
  }
323
 
324
+ /**
325
+ * Removes all transients created by NextGEN. Called during activation
326
+ * and deactivation routines
327
+ */
328
+ static function remove_transients()
329
+ {
330
+ global $wpdb, $_wp_using_ext_object_cache;
331
+
332
+ // Fetch all transients
333
+ $query = "
334
+ SELECT option_name FROM {$wpdb->options}
335
+ WHERE option_name LIKE '%ngg_request%'
336
+ ";
337
+ $transient_names = $wpdb->get_col($query);;
338
+
339
+ // Delete all transients in the database
340
+ $query = "
341
+ DELETE FROM {$wpdb->options}
342
+ WHERE option_name LIKE '%ngg_request%'
343
+ ";
344
+ $wpdb->query($query);
345
+
346
+ // If using an external caching mechanism, delete the cached items
347
+ if ($_wp_using_ext_object_cache) {
348
+ foreach ($transient_names as $transient) {
349
+ wp_cache_delete($transient, 'transient');
350
+ wp_cache_delete(substr($transient, 11), 'transient');
351
+ }
352
+ }
353
+ }
354
+
355
+ function activate() {
356
+ global $wpdb;
357
+ //Starting from version 1.8.0 it's works only with PHP5.2
358
+ if (version_compare(PHP_VERSION, '5.2.0', '<')) {
359
+ deactivate_plugins($this->plugin_name); // Deactivate ourself
360
+ wp_die("Sorry, but you can't run this plugin, it requires PHP 5.2 or higher.");
361
+ return;
362
+ }
363
+
364
+ // Clean up transients
365
+ self::remove_transients();
366
+
367
+ include_once (dirname (__FILE__) . '/admin/install.php');
368
+
369
+ if (is_multisite()) {
370
+ $network=isset($_SERVER['SCRIPT_NAME'])?$_SERVER['SCRIPT_NAME']:"";
371
+ $activate=isset($_GET['action'])?$_GET['action']:"";
372
+ $isNetwork=($network=='/wp-admin/network/plugins.php')?true:false;
373
+ $isActivation=($activate=='deactivate')?false:true;
374
+
375
+ if ($isNetwork and $isActivation){
376
+ $old_blog = $wpdb->blogid;
377
+ $blogids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM $wpdb->blogs", NULL));
378
+ foreach ($blogids as $blog_id) {
379
+ switch_to_blog($blog_id);
380
+ nggallery_install();
381
+ }
382
+ switch_to_blog($old_blog);
383
+ return;
384
+ }
385
+ }
386
+
387
+ // check for tables
388
+ nggallery_install();
389
+ // remove the update message
390
+ delete_option( 'ngg_update_exists' );
391
+
392
+ }
393
+
394
+ function deactivate() {
395
+
396
+ // remove & reset the init check option
397
+ delete_option( 'ngg_init_check' );
398
+ delete_option( 'ngg_update_exists' );
399
+
400
+ // Clean up transients
401
+ self::remove_transients();
402
+ }
403
+
404
+ function uninstall() {
405
+ // Clean up transients
406
+ self::remove_transients();
407
+
408
+ include_once (dirname (__FILE__) . '/admin/install.php');
409
+ nggallery_uninstall();
410
+ }
411
+
412
  function disable_upgrade($option){
413
 
414
  // PHP5.2 is required for NGG V1.4.0
products/photocrati_nextgen/modules/ngglegacy/nggfunctions.php CHANGED
@@ -232,57 +232,3 @@ function nggShowRelatedImages($type = '', $maxImages = 0) {
232
  function the_related_images($type = 'tags', $maxNumbers = 7) {
233
  echo nggShowRelatedImages($type, $maxNumbers);
234
  }
235
-
236
- /**
237
- * Wrapper to I_Displayed_Gallery_Renderer->display_images(); this will display
238
- * a basic thumbnails gallery
239
- *
240
- * @param int $galleryID Gallery ID
241
- * @param string $template Path to template file
242
- * @param bool $images_per_page Basic thumbnails setting
243
- */
244
- function nggShowGallery($galleryID, $template = '', $images_per_page = FALSE)
245
- {
246
- $args = array(
247
- 'source' => 'galleries',
248
- 'container_ids' => $galleryID
249
- );
250
-
251
- if (apply_filters('ngg_show_imagebrowser_first', FALSE, $galleryID))
252
- $args['display_type'] = NEXTGEN_GALLERY_NEXTGEN_BASIC_IMAGEBROWSER;
253
- else
254
- $args['display_type'] = NEXTGEN_GALLERY_BASIC_THUMBNAILS;
255
-
256
- if (!empty($template))
257
- $args['template'] = $template;
258
- if (!empty($images_per_page))
259
- $args['images_per_page'] = $images_per_page;
260
-
261
- echo C_Component_Registry::get_instance()
262
- ->get_utility('I_Displayed_Gallery_Renderer')
263
- ->display_images($args);
264
- }
265
-
266
-
267
- /**
268
- * Wrapper to I_Displayed_Gallery_Renderer->display_images(); this will display
269
- * a basic slideshow gallery
270
- *
271
- * @param int $galleryID Gallery ID
272
- * @param int $width Gallery width
273
- * @param int $height Gallery height
274
- */
275
- function nggShowSlideshow($galleryID, $width, $height)
276
- {
277
- $args = array(
278
- 'source' => 'galleries',
279
- 'container_ids' => $galleryID,
280
- 'gallery_width' => $width,
281
- 'gallery_height' => $height,
282
- 'display_type' => NEXTGEN_GALLERY_BASIC_SLIDESHOW
283
- );
284
-
285
- echo C_Component_Registry::get_instance()
286
- ->get_utility('I_Displayed_Gallery_Renderer')
287
- ->display_images($args);
288
- }
232
  function the_related_images($type = 'tags', $maxNumbers = 7) {
233
  echo nggShowRelatedImages($type, $maxNumbers);
234
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/ngglegacy/view/album-compact.php CHANGED
@@ -22,24 +22,12 @@ Follow variables are useable :
22
  <div class="ngg-album-compact">
23
  <div class="ngg-album-compactbox">
24
  <div class="ngg-album-link">
25
- <a class="Link" href="<?php echo nextgen_esc_url($gallery->pagelink) ?>">
26
- <img class="Thumb" alt="<?php echo esc_attr($gallery->title) ?>" src="<?php echo nextgen_esc_url($gallery->previewurl) ?>"/>
27
  </a>
28
  </div>
29
  </div>
30
- <?php if (!empty($image_gen_params)) {
31
- $max_width = 'style="max-width: ' . ($image_gen_params['width'] + 20) . 'px"';
32
- } else {
33
- $max_width = '';
34
- } ?>
35
- <h4>
36
- <a class="ngg-album-desc"
37
- title="<?php echo esc_attr($gallery->title) ?>"
38
- href="<?php echo nextgen_esc_url($gallery->pagelink) ?>"
39
- <?php echo $max_width; ?>>
40
- <?php echo $gallery->title ?>
41
- </a>
42
- </h4>
43
  <?php if (@$gallery->counter > 0) : ?>
44
  <p><strong><?php echo $gallery->counter ?></strong>&nbsp;<?php _e('Photos', 'nggallery') ?></p>
45
  <?php endif; ?>
22
  <div class="ngg-album-compact">
23
  <div class="ngg-album-compactbox">
24
  <div class="ngg-album-link">
25
+ <a class="Link" href="<?php echo $gallery->pagelink ?>">
26
+ <img class="Thumb" alt="<?php echo $gallery->title ?>" src="<?php echo $gallery->previewurl ?>"/>
27
  </a>
28
  </div>
29
  </div>
30
+ <h4><a class="ngg-album-desc" title="<?php echo $gallery->title ?>" href="<?php echo $gallery->pagelink ?>" ><?php echo $gallery->title ?></a></h4>
 
 
 
 
 
 
 
 
 
 
 
 
31
  <?php if (@$gallery->counter > 0) : ?>
32
  <p><strong><?php echo $gallery->counter ?></strong>&nbsp;<?php _e('Photos', 'nggallery') ?></p>
33
  <?php endif; ?>
products/photocrati_nextgen/modules/ngglegacy/view/album-extend.php CHANGED
@@ -19,10 +19,10 @@ Follow variables are useable :
19
  <?php foreach ($galleries as $gallery) : ?>
20
 
21
  <div class="ngg-album">
22
- <div class="ngg-albumtitle"><a href="<?php echo nextgen_esc_url($gallery->pagelink) ?>"><?php echo $gallery->title ?></a></div>
23
  <div class="ngg-albumcontent">
24
  <div class="ngg-thumbnail">
25
- <a href="<?php echo nextgen_esc_url($gallery->pagelink) ?>"><img class="Thumb" alt="<?php echo esc_attr($gallery->title) ?>" src="<?php echo nextgen_esc_url($gallery->previewurl) ?>"/></a>
26
  </div>
27
  <div class="ngg-description">
28
  <p><?php echo $gallery->galdesc ?></p>
@@ -40,4 +40,4 @@ Follow variables are useable :
40
 
41
  </div>
42
 
43
- <?php endif; ?>
19
  <?php foreach ($galleries as $gallery) : ?>
20
 
21
  <div class="ngg-album">
22
+ <div class="ngg-albumtitle"><a href="<?php echo $gallery->pagelink ?>"><?php echo $gallery->title ?></a></div>
23
  <div class="ngg-albumcontent">
24
  <div class="ngg-thumbnail">
25
+ <a href="<?php echo $gallery->pagelink ?>"><img class="Thumb" alt="<?php echo $gallery->title ?>" src="<?php echo $gallery->previewurl ?>"/></a>
26
  </div>
27
  <div class="ngg-description">
28
  <p><?php echo $gallery->galdesc ?></p>
40
 
41
  </div>
42
 
43
+ <?php endif; ?>
products/photocrati_nextgen/modules/ngglegacy/view/gallery-caption.php CHANGED
@@ -14,12 +14,12 @@ Follow variables are useable :
14
  ?>
15
  <?php if (!defined ('ABSPATH')) die ('No direct access allowed'); ?><?php if (!empty ($gallery)) : ?>
16
 
17
- <div class="ngg-galleryoverview ngg-template-caption" id="<?php echo $gallery->anchor ?>">
18
 
19
  <?php if ($gallery->show_slideshow) { ?>
20
  <!-- Slideshow link -->
21
  <div class="slideshowlink">
22
- <a class="slideshowlink" href="<?php echo nextgen_esc_url($gallery->slideshow_link) ?>">
23
  <?php echo $gallery->slideshow_link_text ?>
24
  </a>
25
  </div>
@@ -28,7 +28,7 @@ Follow variables are useable :
28
  <?php if ($gallery->show_piclens) { ?>
29
  <!-- Piclense link -->
30
  <div class="piclenselink">
31
- <a class="piclenselink" href="<?php echo nextgen_esc_url($gallery->piclens_link) ?>">
32
  <?php _e('[View with PicLens]','nggallery'); ?>
33
  </a>
34
  </div>
@@ -40,16 +40,9 @@ Follow variables are useable :
40
 
41
  <div id="ngg-image-<?php echo $image->pid ?>" class="ngg-gallery-thumbnail-box" <?php echo $image->style ?> >
42
  <div class="ngg-gallery-thumbnail" >
43
- <a href="<?php echo nextgen_esc_url($image->imageURL) ?>"
44
- title="<?php echo esc_attr($image->description) ?>"
45
- data-src="<?php echo nextgen_esc_url($image->imageURL) ?>"
46
- data-thumbnail="<?php echo nextgen_esc_url($image->thumbnailURL); ?>"
47
- data-image-id="<?php echo esc_attr($image->pid); ?>"
48
- data-title="<?php echo esc_attr($image->alttext); ?>"
49
- data-description="<?php echo esc_attr($image->description); ?>"
50
- <?php echo $image->thumbcode ?> >
51
  <?php if ( !$image->hidden ) { ?>
52
- <img title="<?php echo esc_attr($image->alttext) ?>" alt="<?php echo esc_attr($image->alttext) ?>" src="<?php echo nextgen_esc_url($image->thumbnailURL) ?>" <?php echo $image->size ?> />
53
  <?php } ?>
54
  </a>
55
  <span><?php echo $image->caption ?></span>
@@ -66,4 +59,4 @@ Follow variables are useable :
66
 
67
  </div>
68
 
69
- <?php endif; ?>
14
  ?>
15
  <?php if (!defined ('ABSPATH')) die ('No direct access allowed'); ?><?php if (!empty ($gallery)) : ?>
16
 
17
+ <div class="ngg-galleryoverview" id="<?php echo $gallery->anchor ?>">
18
 
19
  <?php if ($gallery->show_slideshow) { ?>
20
  <!-- Slideshow link -->
21
  <div class="slideshowlink">
22
+ <a class="slideshowlink" href="<?php echo $gallery->slideshow_link ?>">
23
  <?php echo $gallery->slideshow_link_text ?>
24
  </a>
25
  </div>
28
  <?php if ($gallery->show_piclens) { ?>
29
  <!-- Piclense link -->
30
  <div class="piclenselink">
31
+ <a class="piclenselink" href="<?php echo $gallery->piclens_link ?>">
32
  <?php _e('[View with PicLens]','nggallery'); ?>
33
  </a>
34
  </div>
40
 
41
  <div id="ngg-image-<?php echo $image->pid ?>" class="ngg-gallery-thumbnail-box" <?php echo $image->style ?> >
42
  <div class="ngg-gallery-thumbnail" >
43
+ <a href="<?php echo $image->imageURL ?>" title="<?php echo $image->description ?>" <?php echo $image->thumbcode ?> >
 
 
 
 
 
 
 
44
  <?php if ( !$image->hidden ) { ?>
45
+ <img title="<?php echo $image->alttext ?>" alt="<?php echo $image->alttext ?>" src="<?php echo $image->thumbnailURL ?>" <?php echo $image->size ?> />
46
  <?php } ?>
47
  </a>
48
  <span><?php echo $image->caption ?></span>
59
 
60
  </div>
61
 
62
+ <?php endif; ?>
products/photocrati_nextgen/modules/ngglegacy/view/gallery-carousel.php CHANGED
@@ -19,14 +19,14 @@ Follow variables are useable :
19
 
20
  <div class="ngg-galleryoverview">
21
 
22
- <div class="pic"><img title="<?php echo esc_attr($current->alttext) ?>" alt="<?php echo esc_attr($current->alttext) ?>" src="<?php echo nextgen_esc_url($current->url); ?>" /></div>
23
 
24
  <ul class="ngg-gallery-list">
25
 
26
  <!-- PREV LINK -->
27
  <?php if ($prev) : ?>
28
  <li class="ngg-prev">
29
- <a class="prev" href="<?php echo nextgen_esc_url($prev) ?>">&#9668;</a>
30
  </li>
31
  <?php endif; ?>
32
 
@@ -34,9 +34,9 @@ Follow variables are useable :
34
  <?php foreach ( $images as $image ) : ?>
35
  <?php if ( $image->hidden ) continue; ?>
36
 
37
- <li id="ngg-image-<?php echo esc_attr($image->pid) ?>" class="ngg-thumbnail-list <?php if ($image->pid == $current->pid) echo 'selected' ?>" >
38
- <a href="<?php echo nextgen_esc_url($image->pidlink) ?>" title="<?php echo esc_attr($image->description) ?>" >
39
- <img title="<?php echo esc_attr($image->alttext) ?>" alt="<?php echo esc_attr($image->alttext) ?>" src="<?php echo nextgen_esc_url($image->thumbnailURL) ?>" <?php echo $image->size ?> />
40
  </a>
41
  </li>
42
 
@@ -45,7 +45,7 @@ Follow variables are useable :
45
  <!-- NEXT LINK -->
46
  <?php if ($next) : ?>
47
  <li class="ngg-next">
48
- <a class="next" href="<?php echo nextgen_esc_url($next) ?>">&#9658;</a>
49
  </li>
50
  <?php endif; ?>
51
 
@@ -53,4 +53,4 @@ Follow variables are useable :
53
 
54
  </div>
55
 
56
- <?php endif; ?>
19
 
20
  <div class="ngg-galleryoverview">
21
 
22
+ <div class="pic"><img title="<?php echo $current->alttext ?>" alt="<?php echo $current->alttext ?>" src="<?php echo $current->url; ?>" /></div>
23
 
24
  <ul class="ngg-gallery-list">
25
 
26
  <!-- PREV LINK -->
27
  <?php if ($prev) : ?>
28
  <li class="ngg-prev">
29
+ <a class="prev" href="<?php echo $prev ?>">&#9668;</a>
30
  </li>
31
  <?php endif; ?>
32
 
34
  <?php foreach ( $images as $image ) : ?>
35
  <?php if ( $image->hidden ) continue; ?>
36
 
37
+ <li id="ngg-image-<?php echo $image->pid ?>" class="ngg-thumbnail-list <?php if ($image->pid == $current->pid) echo 'selected' ?>" >
38
+ <a href="<?php echo $image->pidlink ?>" title="<?php echo $image->description ?>" >
39
+ <img title="<?php echo $image->alttext ?>" alt="<?php echo $image->alttext ?>" src="<?php echo $image->thumbnailURL ?>" <?php echo $image->size ?> />
40
  </a>
41
  </li>
42
 
45
  <!-- NEXT LINK -->
46
  <?php if ($next) : ?>
47
  <li class="ngg-next">
48
+ <a class="next" href="<?php echo $next ?>">&#9658;</a>
49
  </li>
50
  <?php endif; ?>
51
 
53
 
54
  </div>
55
 
56
+ <?php endif; ?>
products/photocrati_nextgen/modules/ngglegacy/view/gallery.php CHANGED
@@ -19,7 +19,7 @@ Follow variables are useable :
19
  <?php if ($gallery->show_slideshow) { ?>
20
  <!-- Slideshow link -->
21
  <div class="slideshowlink">
22
- <a class="slideshowlink" href="<?php echo nextgen_esc_url($gallery->slideshow_link) ?>">
23
  <?php echo $gallery->slideshow_link_text ?>
24
  </a>
25
  </div>
@@ -28,7 +28,7 @@ Follow variables are useable :
28
  <?php if ($gallery->show_piclens) { ?>
29
  <!-- Piclense link -->
30
  <div class="piclenselink">
31
- <a class="piclenselink" href="<?php echo nextgen_esc_url($gallery->piclens_link) ?>">
32
  <?php _e('[View with PicLens]','nggallery'); ?>
33
  </a>
34
  </div>
@@ -40,16 +40,9 @@ Follow variables are useable :
40
 
41
  <div id="ngg-image-<?php echo $image->pid ?>" class="ngg-gallery-thumbnail-box" <?php echo $image->style ?> >
42
  <div class="ngg-gallery-thumbnail" >
43
- <a href="<?php echo nextgen_esc_url($image->imageURL) ?>"
44
- title="<?php echo esc_attr($image->description) ?>"
45
- data-src="<?php echo nextgen_esc_url($image->imageURL); ?>"
46
- data-thumbnail="<?php echo nextgen_esc_url($image->thumbnailURL); ?>"
47
- data-image-id="<?php echo esc_attr($image->pid); ?>"
48
- data-title="<?php echo esc_attr($image->alttext); ?>"
49
- data-description="<?php echo esc_attr($image->description); ?>"
50
- <?php echo $image->thumbcode ?> >
51
  <?php if ( !$image->hidden ) { ?>
52
- <img title="<?php echo esc_attr($image->alttext) ?>" alt="<?php echo esc_attr($image->alttext) ?>" src="<?php echo nextgen_esc_url($image->thumbnailURL) ?>" <?php echo $image->size ?> />
53
  <?php } ?>
54
  </a>
55
  </div>
19
  <?php if ($gallery->show_slideshow) { ?>
20
  <!-- Slideshow link -->
21
  <div class="slideshowlink">
22
+ <a class="slideshowlink" href="<?php echo $gallery->slideshow_link ?>">
23
  <?php echo $gallery->slideshow_link_text ?>
24
  </a>
25
  </div>
28
  <?php if ($gallery->show_piclens) { ?>
29
  <!-- Piclense link -->
30
  <div class="piclenselink">
31
+ <a class="piclenselink" href="<?php echo $gallery->piclens_link ?>">
32
  <?php _e('[View with PicLens]','nggallery'); ?>
33
  </a>
34
  </div>
40
 
41
  <div id="ngg-image-<?php echo $image->pid ?>" class="ngg-gallery-thumbnail-box" <?php echo $image->style ?> >
42
  <div class="ngg-gallery-thumbnail" >
43
+ <a href="<?php echo $image->imageURL ?>" title="<?php echo $image->description ?>" <?php echo $image->thumbcode ?> >
 
 
 
 
 
 
 
44
  <?php if ( !$image->hidden ) { ?>
45
+ <img title="<?php echo $image->alttext ?>" alt="<?php echo $image->alttext ?>" src="<?php echo $image->thumbnailURL ?>" <?php echo $image->size ?> />
46
  <?php } ?>
47
  </a>
48
  </div>
products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php CHANGED
@@ -23,10 +23,10 @@ Follow variables are useable :
23
  <div class="pic"><?php echo $image->href_link ?></div>
24
  <div class="ngg-imagebrowser-nav">
25
  <div class="back">
26
- <a class="ngg-browser-prev" id="ngg-prev-<?php echo $image->previous_pid ?>" href="<?php echo nextgen_esc_url($image->previous_image_link) ?>">&#9668; <?php _e('Back', 'nggallery') ?></a>
27
  </div>
28
  <div class="next">
29
- <a class="ngg-browser-next" id="ngg-next-<?php echo $image->next_pid ?>" href="<?php echo nextgen_esc_url($image->next_image_link) ?>"><?php _e('Next', 'nggallery') ?> &#9658;</a>
30
  </div>
31
  <div class="counter"><?php _e('Picture', 'nggallery') ?> <?php echo $image->number ?> <?php _e('of', 'nggallery')?> <?php echo $image->total ?></div>
32
  <div class="ngg-imagebrowser-desc"><p><?php echo $image->description ?></p></div>
@@ -34,4 +34,4 @@ Follow variables are useable :
34
 
35
  </div>
36
 
37
- <?php endif; ?>
23
  <div class="pic"><?php echo $image->href_link ?></div>
24
  <div class="ngg-imagebrowser-nav">
25
  <div class="back">
26
+ <a class="ngg-browser-prev" id="ngg-prev-<?php echo $image->previous_pid ?>" href="<?php echo $image->previous_image_link ?>">&#9668; <?php _e('Back', 'nggallery') ?></a>
27
  </div>
28
  <div class="next">
29
+ <a class="ngg-browser-next" id="ngg-next-<?php echo $image->next_pid ?>" href="<?php echo $image->next_image_link ?>"><?php _e('Next', 'nggallery') ?> &#9658;</a>
30
  </div>
31
  <div class="counter"><?php _e('Picture', 'nggallery') ?> <?php echo $image->number ?> <?php _e('of', 'nggallery')?> <?php echo $image->total ?></div>
32
  <div class="ngg-imagebrowser-desc"><p><?php echo $image->description ?></p></div>
34
 
35
  </div>
36
 
37
+ <?php endif; ?>
products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php CHANGED
@@ -27,10 +27,10 @@ Please note : A Image resize or watermarking operation will remove all meta info
27
  <div class="pic"><?php echo $image->href_link ?></div>
28
  <div class="ngg-imagebrowser-nav">
29
  <div class="back">
30
- <a class="ngg-browser-prev" id="ngg-prev-<?php echo $image->previous_pid ?>" href="<?php echo nextgen_esc_url($image->previous_image_link) ?>">&#9668; <?php _e('Back', 'nggallery') ?></a>
31
  </div>
32
  <div class="next">
33
- <a class="ngg-browser-next" id="ngg-next-<?php echo $image->next_pid ?>" href="<?php echo nextgen_esc_url($image->next_image_link) ?>"><?php _e('Next', 'nggallery') ?> &#9658;</a>
34
  </div>
35
  <div class="counter"><?php _e('Picture', 'nggallery') ?> <?php echo $image->number ?> <?php _e('of', 'nggallery')?> <?php echo $image->total ?></div>
36
  <div class="ngg-imagebrowser-desc"><p><?php echo $image->description ?></p></div>
27
  <div class="pic"><?php echo $image->href_link ?></div>
28
  <div class="ngg-imagebrowser-nav">
29
  <div class="back">
30
+ <a class="ngg-browser-prev" id="ngg-prev-<?php echo $image->previous_pid ?>" href="<?php echo $image->previous_image_link ?>">&#9668; <?php _e('Back', 'nggallery') ?></a>
31
  </div>
32
  <div class="next">
33
+ <a class="ngg-browser-next" id="ngg-next-<?php echo $image->next_pid ?>" href="<?php echo $image->next_image_link ?>"><?php _e('Next', 'nggallery') ?> &#9658;</a>
34
  </div>
35
  <div class="counter"><?php _e('Picture', 'nggallery') ?> <?php echo $image->number ?> <?php _e('of', 'nggallery')?> <?php echo $image->total ?></div>
36
  <div class="ngg-imagebrowser-desc"><p><?php echo $image->description ?></p></div>
products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php CHANGED
@@ -20,13 +20,13 @@ Follow variables are useable :
20
 
21
  <h3><?php echo $image->alttext ?></h3>
22
 
23
- <div class="pic"><?php echo nextgen_esc_url($image->href_link) ?></div>
24
  <div class="ngg-imagebrowser-nav">
25
  <div class="back">
26
- <a class="ngg-browser-prev" id="ngg-prev-<?php echo $image->previous_pid ?>" href="<?php echo nextgen_esc_url($image->previous_image_link) ?>">&#9668; <?php _e('Back', 'nggallery') ?></a>
27
  </div>
28
  <div class="next">
29
- <a class="ngg-browser-next" id="ngg-next-<?php echo $image->next_pid ?>" href="<?php echo nextgen_esc_url($image->next_image_link) ?>"><?php _e('Next', 'nggallery') ?> &#9658;</a>
30
  </div>
31
  <div class="counter"><?php _e('Picture', 'nggallery') ?> <?php echo $image->number ?> <?php _e('of', 'nggallery')?> <?php echo $image->total ?></div>
32
  <div class="ngg-imagebrowser-desc"><p><?php echo $image->description ?></p></div>
@@ -34,4 +34,4 @@ Follow variables are useable :
34
 
35
  </div>
36
 
37
- <?php endif; ?>
20
 
21
  <h3><?php echo $image->alttext ?></h3>
22
 
23
+ <div class="pic"><?php echo $image->href_link ?></div>
24
  <div class="ngg-imagebrowser-nav">
25
  <div class="back">
26
+ <a class="ngg-browser-prev" id="ngg-prev-<?php echo $image->previous_pid ?>" href="<?php echo $image->previous_image_link ?>">&#9668; <?php _e('Back', 'nggallery') ?></a>
27
  </div>
28
  <div class="next">
29
+ <a class="ngg-browser-next" id="ngg-next-<?php echo $image->next_pid ?>" href="<?php echo $image->next_image_link ?>"><?php _e('Next', 'nggallery') ?> &#9658;</a>
30
  </div>
31
  <div class="counter"><?php _e('Picture', 'nggallery') ?> <?php echo $image->number ?> <?php _e('of', 'nggallery')?> <?php echo $image->total ?></div>
32
  <div class="ngg-imagebrowser-desc"><p><?php echo $image->description ?></p></div>
34
 
35
  </div>
36
 
37
+ <?php endif; ?>
products/photocrati_nextgen/modules/ngglegacy/view/singlepic.php CHANGED
@@ -18,19 +18,9 @@ Please note : A Image resize or watermarking operation will remove all meta info
18
  **/
19
  ?>
20
  <?php if (!defined ('ABSPATH')) die ('No direct access allowed'); ?><?php if (!empty ($image)) : ?>
21
- <a href="<?php echo nextgen_esc_url($image->imageURL); ?>"
22
- title="<?php echo esc_attr($image->linktitle); ?>"
23
- data-src="<?php echo nextgen_esc_url($image->imageURL); ?>"
24
- data-thumbnail="<?php echo nextgen_esc_url($image->thumbnailURL); ?>"
25
- data-image-id="<?php echo esc_attr($image->pid); ?>"
26
- data-title="<?php echo esc_attr($image->alttext); ?>"
27
- data-description="<?php echo esc_attr($image->description); ?>"
28
- <?php if(!empty($target)) { ?>target="<?php echo esc_attr($target); ?>"<?php } ?>
29
- <?php echo $image->thumbcode; ?>>
30
- <img class="<?php echo $image->classname; ?>"
31
- src="<?php echo nextgen_esc_url($image->thumbnailURL); ?>"
32
- alt="<?php echo esc_attr($image->alttext); ?>"
33
- title="<?php echo esc_attr($image->alttext); ?>"/>
34
  </a>
35
  <?php if (!empty ($image->caption)) : ?><span><?php echo $image->caption ?></span><?php endif; ?>
36
- <?php endif; ?>
18
  **/
19
  ?>
20
  <?php if (!defined ('ABSPATH')) die ('No direct access allowed'); ?><?php if (!empty ($image)) : ?>
21
+
22
+ <a href="<?php echo $image->imageURL ?>" title="<?php echo $image->linktitle ?>" <?php echo $image->thumbcode ?> >
23
+ <img class="<?php echo $image->classname ?>" src="<?php echo $image->thumbnailURL ?>" alt="<?php echo $image->alttext ?>" title="<?php echo $image->alttext ?>" />
 
 
 
 
 
 
 
 
 
 
24
  </a>
25
  <?php if (!empty ($image->caption)) : ?><span><?php echo $image->caption ?></span><?php endif; ?>
26
+ <?php endif; ?>
products/photocrati_nextgen/modules/resource_minifier/adapter.resource_minifier_routes.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class A_Resource_Minifier_Routes extends Mixin
4
+ {
5
+ function initialize()
6
+ {
7
+ $app = $this->create_app('/nextgen-static');
8
+ $app->route('scripts', 'I_Resource_Manager#static_scripts');
9
+ $app->route('styles', 'I_Resource_Manager#static_styles');
10
+ $app = $this->create_app('/nextgen-dynamic');
11
+ $app->route('scripts', 'I_Resource_Manager#dynamic_scripts');
12
+ $app->route('styles', 'I_Resource_Manager#dynamic_styles');
13
+ }
14
+ }
products/photocrati_nextgen/modules/resource_minifier/class.resource_manager_controller.php ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class C_Resource_Manager_Controller extends C_MVC_Controller
3
+ {
4
+ var $_fs = NULL;
5
+ var $_document_root = NULL;
6
+ var $_resource_map = NULL;
7
+
8
+ /**
9
+ * Gets an instance of the controller
10
+ * @var array
11
+ * @return C_Resource_Manager_Controller
12
+ */
13
+ static $_instances = array();
14
+ static function get_instance($context)
15
+ {
16
+ if (!isset(self::$_instances[$context])) {
17
+ $klass = get_class();
18
+ self::$_instances[$context] = new $klass($context);
19
+ }
20
+ return self::$_instances[$context];
21
+ }
22
+
23
+
24
+ /**
25
+ * Defines the object
26
+ * @param bool $context
27
+ */
28
+ function define($context=FALSE)
29
+ {
30
+ parent::define($context);
31
+ $this->implement('I_Resource_Manager');
32
+ }
33
+
34
+ /**
35
+ * Gets the FS utility
36
+ * @return C_Component|null
37
+ */
38
+ function _get_fs_utility()
39
+ {
40
+ if (is_null($this->_fs))
41
+ $this->_fs = $this->get_registry()->get_utility('I_Fs');
42
+
43
+ return $this->_fs;
44
+ }
45
+
46
+ /**
47
+ * Gets a cached map association between handles and urls
48
+ * @param $resource_type
49
+ * @return mixed|void
50
+ */
51
+ function _get_resource_map($resource_type)
52
+ {
53
+ if (is_null($this->_resource_map))
54
+ $this->_resource_map = get_option('ngg_'.$resource_type.'_map');
55
+
56
+ return $this->_resource_map;
57
+ }
58
+
59
+ /**
60
+ * Gets the url associated with a script/stylesheet handle
61
+ * @param $handle
62
+ * @param $resource_type: 'scripts' or 'styles'
63
+ * @return string|FALSE
64
+ */
65
+ function _get_handle_url($handle, $resource_type)
66
+ {
67
+ global $wp_scripts, $wp_styles;
68
+ $register = $resource_type == 'scripts' ? $wp_scripts : $wp_styles;
69
+ $retval = FALSE;
70
+
71
+ // First, look for the handle in the list of
72
+ // registered scripts
73
+ if (isset($register->registered[$handle])) {
74
+ $retval = $register->registered[$handle]->src;
75
+ }
76
+
77
+ // If not available, we'll look up the url from our
78
+ // cache
79
+ else {
80
+ $map = $this->_get_resource_map($resource_type);
81
+ if (isset($map[$handle])) $retval = $map[$handle];
82
+ }
83
+
84
+ return $retval;
85
+ }
86
+
87
+ /**
88
+ * Remote request which checks for status code
89
+ */
90
+ function _remote_fopen($uri)
91
+ {
92
+ $options = array();
93
+ $options['timeout'] = 10;
94
+
95
+ $response = wp_remote_get($uri, $options);
96
+
97
+ if (!is_wp_error($response))
98
+ {
99
+ $code = wp_remote_retrieve_response_code($response);
100
+
101
+ if ($code >= 200 && $code < 300)
102
+ {
103
+ return wp_remote_retrieve_body($response);
104
+ }
105
+ }
106
+
107
+ return null;
108
+ }
109
+
110
+ /**
111
+ * Gets the source of a script/stylesheet
112
+ * @param $url
113
+ * @return string
114
+ */
115
+ function _get_source($url, $resource_type)
116
+ {
117
+ $retval = "/* {$url } */\n";
118
+ $fs = $this->_get_fs_utility();
119
+ $docroot = $fs->get_document_root();
120
+ $http_site = $this->get_router()->get_base_url();
121
+ $https_site = str_replace('http://', 'https://', $http_site);
122
+ $path = FALSE;
123
+
124
+ // Is this a local file?
125
+ if (strpos($url, '/') === 0) {
126
+ $path = $fs->join_paths($docroot, $url);
127
+ }
128
+
129
+ // This is a real url. Is it local?
130
+ elseif (strpos($url, $http_site) !== FALSE) {
131
+ $path = str_replace($http_site, '', $url);
132
+ $path = $fs->join_paths($docroot, $path);
133
+ }
134
+
135
+ // This is a real url. Is it local and using HTTPS?
136
+ elseif (strpos($url, $https_site) !== FALSE) {
137
+ $path = str_replace($https_site, '', $url);
138
+ $path = $fs->join_paths($docroot, $path);
139
+ }
140
+
141
+ // This is a real url and it's not local. We'll have to fetch it
142
+ else {
143
+ $retval .= $this->_remote_fopen($url);
144
+ }
145
+
146
+ // ensure there's no url parameters (strip ? and on) and no newlines in our potential filename
147
+ $path = str_replace(array("\r", "\n"), '', substr($path, 0, strpos($path, "?")));
148
+
149
+ // If a path has been set, and it's exists on the filesystem
150
+ if ($path && file_exists($path)) {
151
+ $retval .= file_get_contents($path);
152
+ }
153
+
154
+ // This a local but dynamically generated resource. We need
155
+ // to fetch it using HTTP
156
+ else {
157
+ if (strpos($url, '/') === 0) {
158
+ $url = $this->get_router()->get_url($url, FALSE);
159
+ }
160
+ $retval .= $this->_remote_fopen($url);
161
+ }
162
+
163
+ // Now that we have the content, we have to adjust any links within CSS
164
+ $dir = trailingslashit(dirname($url));
165
+ if ($resource_type == 'styles' && preg_match_all("/url\\((['\"])?([^'\"\\)]*)(['\"])?\\)/", $retval, $matches, PREG_SET_ORDER)) {
166
+ foreach ($matches as $match) {
167
+ $original_url = $match[2];
168
+
169
+ // If the original url isn't absolute, then we need to make it so
170
+ if (strpos($original_url, 'http') !== 0) {
171
+ $new_url = $original_url;
172
+ if (strpos($new_url, '/') === 0) $new_url = substr($new_url, 1);
173
+ if (strpos($dir, '/') === 0 && strpos($dir, $http_site) !== 0) {
174
+ $dir = untrailingslashit($http_site).$dir;
175
+ }
176
+ $new_url = $dir.$new_url;
177
+ $original_match = $match[0];
178
+ $new_match = str_replace($original_url, $new_url, $original_match);
179
+ $retval = str_replace($original_match, $new_match, $retval);
180
+ }
181
+ }
182
+ }
183
+
184
+ return $retval;
185
+ }
186
+
187
+ /**
188
+ * Determines whether the cache should be refreshed or not
189
+ * @return bool
190
+ */
191
+ function _do_refresh_cache()
192
+ {
193
+ return ((defined('SCRIPT_DEBUG') && SCRIPT_DEBUG == TRUE) OR $this->param('refresh'));
194
+ }
195
+
196
+ /**
197
+ * Concatenates the resources requested
198
+ * @param $resource_type
199
+ * @return string
200
+ */
201
+ function _concatenate_resources($resource_type)
202
+ {
203
+ $retval = '';
204
+
205
+ if (($handles = $this->param('load'))) {
206
+
207
+ $cache_name = md5('ngg_resources_' . $resource_type . $handles);
208
+ $retval = $this->_do_refresh_cache() ? FALSE : wp_cache_get($cache_name, 'photocrati-nextgen');
209
+
210
+ // Generate the results and cache
211
+ if (!$retval) {
212
+ $retval = array();
213
+ foreach (explode(';', $handles) as $handle) {
214
+ if (($src = $this->_get_handle_url($handle, $resource_type))) {
215
+ $retval[] = $this->_get_source($src, $resource_type);
216
+ }
217
+ else $retval[]= "// {$handle} was not found";
218
+ }
219
+
220
+ $retval = implode("\n", $retval);
221
+ wp_cache_set($cache_name, $retval, 'photocrati-nextgen', 3600);
222
+ }
223
+ }
224
+
225
+ return $retval;
226
+ }
227
+
228
+ function flush_cache()
229
+ {
230
+ return wp_cache_flush();
231
+ }
232
+
233
+ function static_scripts_action()
234
+ {
235
+ $this->set_content_type('javascript');
236
+ if (!$this->_do_refresh_cache()) $this->expires("+1 hour");
237
+ $this->render();
238
+ echo $this->_concatenate_resources('scripts');
239
+ }
240
+
241
+ function dynamic_scripts_action()
242
+ {
243
+ $this->set_content_type('javascript');
244
+ $this->do_not_cache();
245
+ $this->render();
246
+ echo $this->_concatenate_resources('scripts');
247
+ }
248
+
249
+ function static_styles_action()
250
+ {
251
+ $this->set_content_type('css');
252
+ if (!$this->_do_refresh_cache()) $this->expires("+1 hour");
253
+ $this->render();
254
+ echo $this->_concatenate_resources('styles');
255
+ }
256
+
257
+ function dynamic_styles_action()
258
+ {
259
+ $this->set_content_type('css');
260
+ $this->do_not_cache();
261
+ $this->render();
262
+ echo $this->_concatenate_resources('styles');
263
+ }
264
+ }
products/photocrati_nextgen/modules/resource_minifier/class.resource_minifier_installer.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class C_Resource_Minifier_Installer
4
+ {
5
+ function get_registry()
6
+ {
7
+ return C_Component_Registry::get_instance();
8
+ }
9
+
10
+ function uninstall($hard=FALSE)
11
+ {
12
+ $manager = $this->get_registry()->get_utility('I_Resource_Manager');
13
+ $manager->flush_cache();
14
+ }
15
+ }
products/photocrati_nextgen/modules/resource_minifier/interface.resource_manager.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ interface I_Resource_Manager
4
+ {
5
+ }
products/photocrati_nextgen/modules/resource_minifier/module.resource_minifier.php ADDED
@@ -0,0 +1,472 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ {
4
+ Module: photocrati-resource_minifier,
5
+ Depends: { photocrati-nextgen_settings }
6
+ }
7
+ */
8
+
9
+ class M_Resource_Minifier extends C_Base_Module
10
+ {
11
+ var $minifier_enabled = TRUE;
12
+ var $resources = array();
13
+
14
+ function define()
15
+ {
16
+ parent::define(
17
+ 'photocrati-resource_minifier',
18
+ 'Resource Minifier',
19
+ 'Minifies and concatenates static resources',
20
+ '0.1',
21
+ 'http://www.nextgen-gallery.com',
22
+ 'Photocrati Media',
23
+ 'http://www.photocrati.com'
24
+ );
25
+
26
+ include_once('class.resource_minifier_installer.php');
27
+ C_Photocrati_Installer::add_handler($this->module, 'C_Resource_Minifier_Installer');
28
+ }
29
+
30
+ /**
31
+ * Registers necessary hooks for WordPress
32
+ */
33
+ function _register_hooks()
34
+ {
35
+ add_action('init', array($this, 'start_buffering'));
36
+ add_action('wp_print_footer_scripts', array(&$this, 'start_lazy_loading'), PHP_INT_MAX);
37
+ add_action('admin_print_footer_scripts', array(&$this, 'start_lazy_loading'), PHP_INT_MAX);
38
+ add_action('wp_enqueue_scripts', array(&$this, 'write_tags'), PHP_INT_MAX);
39
+ add_action('wp_print_footer_scripts', array($this, 'move_resource_tags'), 1);
40
+ add_action('wp_print_footer_scripts', array($this, 'write_footer_tags'), 2);
41
+ add_action('admin_print_footer_scripts', array($this, 'move_resource_tags'), 1);
42
+ add_action('admin_print_footer_scripts', array($this, 'write_footer_tags'), 2);
43
+ add_filter('script_loader_src', array(&$this, 'append_script'), PHP_INT_MAX, 2);
44
+ }
45
+
46
+ function _register_utilities()
47
+ {
48
+ $this->get_registry()->add_utility('I_Resource_Manager', 'C_Resource_Manager_Controller');
49
+ }
50
+
51
+ function _register_adapters()
52
+ {
53
+ $this->get_registry()->add_adapter('I_Router', 'A_Resource_Minifier_Routes');
54
+ }
55
+
56
+ function start_buffering()
57
+ {
58
+ ob_start();
59
+
60
+ $this->register_lazy_resources();
61
+ }
62
+
63
+ function move_resource_tags()
64
+ {
65
+ // Get the buffer of the page thus far
66
+ $contents = ob_get_clean();
67
+ $tags = null;
68
+
69
+ // Get the style tags
70
+ ob_start();
71
+ $this->write_resource_tags('styles');
72
+ $tags = ob_get_clean();
73
+
74
+ // Move the style tags to the head element
75
+ echo str_ireplace("</head>", $tags."</head>", $contents);
76
+ }
77
+
78
+ function register_lazy_resources()
79
+ {
80
+ // Register SidJS: http://www.diveintojavascript.com/projects/sidjs-load-javascript-and-stylesheets-on-demand
81
+ $router = $this->get_registry()->get_utility('I_Router');
82
+ wp_register_script(
83
+ 'sidjs',
84
+ $router->get_static_url('photocrati-resource_minifier#sidjs-0.1.js'),
85
+ array('jquery'),
86
+ '0.1'
87
+ );
88
+
89
+ wp_register_script(
90
+ 'lazy_resources',
91
+ $router->get_static_url('photocrati-resource_minifier#lazy_resources.js'),
92
+ array('sidjs')
93
+ );
94
+
95
+ wp_enqueue_script('lazy_resources');
96
+ }
97
+
98
+ /**
99
+ * Writes the HTML tags in the footer
100
+ */
101
+ function write_footer_tags()
102
+ {
103
+ $this->write_tags(TRUE);
104
+ }
105
+
106
+ /**
107
+ * Writes the resource tags to the browser
108
+ */
109
+ function write_tags($in_footer=FALSE)
110
+ {
111
+ $this->write_resource_tags('styles', $in_footer);
112
+ $this->write_resource_tags('scripts', $in_footer);
113
+ }
114
+
115
+ /**
116
+ * Gets the resouce map for a particular type
117
+ * @param $resource_type
118
+ * @return mixed|void
119
+ */
120
+ function get_resource_map($resource_type)
121
+ {
122
+ return get_option('ngg_'.$resource_type.'_map');
123
+ }
124
+
125
+
126
+ function initialize_resources()
127
+ {
128
+ $this->resources = array(
129
+ 'scripts' => array(
130
+ 'static' => array(),
131
+ 'dynamic' => array(),
132
+ 'map' => $this->get_resource_map('scripts')
133
+ ),
134
+ 'styles' => array(
135
+ 'static' => array(),
136
+ 'dynamic' => array(),
137
+ 'map' => $this->get_resource_map('styles')
138
+ )
139
+ );
140
+
141
+ // Determine if the minifier should be enabled or not
142
+ if (defined('CONCATENATE_SCRIPTS') && CONCATENATE_SCRIPTS == FALSE)
143
+ $this->minifier_enabled = FALSE;
144
+ else {
145
+ $this->minifier_enabled = C_NextGen_Settings::get_instance()->resource_minifier;
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Gets the list of scripts that should be minified
151
+ */
152
+ function write_resource_tags($resource_type, $in_footer=FALSE)
153
+ {
154
+ // Initialize this portion
155
+ $router = NULL;
156
+ $tagname = $resource_type == 'scripts' ? 'script' : 'link';
157
+ $output_func = $resource_type == 'scripts' ? 'wp_print_scripts' : 'wp_print_styles';
158
+ $this->initialize_resources();
159
+
160
+ // If the minifier is enabled, we'll concatenate all scripts and styles. If the
161
+ // minifier is disabled, but we're writing styles in the footer, then we'll
162
+ // continue with the routine and let $this->write_tags() decide what to do
163
+ if ($this->minifier_enabled OR ($in_footer AND $resource_type == 'styles')) {
164
+
165
+ // Parse scripts for inclusion
166
+ ob_start();
167
+ $output_func();
168
+ $html = ob_get_contents();
169
+ ob_end_clean();
170
+
171
+ // Populate styles
172
+ if ($resource_type == 'styles') echo $this->extract_enqueued_styles($html);
173
+
174
+ // Strip out any scripts be loading by url, and outputs the rest. We
175
+ // need to this for wp_localize_script() calls
176
+ else echo $this->strip_tags_with_urls($tagname, $html);
177
+
178
+ // Store the map
179
+ update_option('ngg_'.$resource_type.'_map', $this->resources[$resource_type]['map']);
180
+
181
+ // Load the static scripts. These scripts will be concatenated and the final result will be
182
+ // cached and never regenerated
183
+ $this->write_tag($resource_type, 'static', $in_footer);
184
+
185
+ // Load the dynamic scripts. These scripts will be concatenated but not cached,
186
+ // as their content is known to change
187
+ $this->write_tag($resource_type, 'dynamic', $in_footer);
188
+ }
189
+
190
+ // Otherwise we'll just output the html
191
+ else {
192
+ $output_func();
193
+ }
194
+
195
+ }
196
+
197
+ /**
198
+ * Writes the HTML tag for a resource tag of a particular group
199
+ * @param $resource_type
200
+ * @param $group
201
+ */
202
+ function write_tag($resource_type, $group, $in_footer=FALSE)
203
+ {
204
+ if (isset($this->resources[$resource_type])) {
205
+ if (isset($this->resources[$resource_type][$group])) {
206
+ if (empty($this->resources[$resource_type][$group])) return;
207
+ $router = $this->get_registry()->get_utility('I_Router');
208
+ $handles = $this->get_enqueued($resource_type, $group);
209
+
210
+ // Are we enqueuing scripts?
211
+ if ($resource_type == 'scripts') {
212
+
213
+ // Use the concatenated url if the minifier is enabled
214
+ if ($this->minifier_enabled) {
215
+ $url = $router->get_url("/nextgen-{$group}/{$resource_type}", FALSE).'?load='.$handles;
216
+ echo "<script type='text/javascript' src='{$url}'></script>\n";
217
+ }
218
+
219
+ // If the minifier is disabled, then just out the scripts as normal
220
+ else {
221
+ foreach ($this->resources[$resource_type][$group] as $handle) {
222
+ $url = $this->resources[$resource_type]['map'][$handle];
223
+ $handle = esc_attr($handle);
224
+ echo "<script name='{$handle}' type='text/javascript' src='{$url}'></script>\n";
225
+ }
226
+ }
227
+ }
228
+
229
+ // If we're enqueuing stylesheets
230
+ else {
231
+
232
+ // If we're in the footer, we need to lazy load the stylesheet
233
+ if ($in_footer) {
234
+
235
+ // Use the concatenated url if the minifier is enabled
236
+ if ($this->minifier_enabled) {
237
+ $url = $router->get_url("/nextgen-{$group}/{$resource_type}", FALSE).'?load='.$handles;
238
+ echo '<script type="text/javascript">Lazy_Resources.enqueue("'.$url.'")</script>';
239
+ echo "\n";
240
+ }
241
+
242
+ // If the minifier is disabled, we still need to lazy load the stylesheets
243
+ else {
244
+ foreach ($this->resources[$resource_type][$group] as $handle) {
245
+ $url = $this->resources[$resource_type]['map'][$handle];
246
+ echo '<script type="text/javascript">Lazy_Resources.enqueue("'.$url.'")</script>';
247
+ echo "\n";
248
+ }
249
+ }
250
+ }
251
+
252
+ // We're not in the footer, meaning we don't have to lazy load
253
+ else {
254
+ if ($this->minifier_enabled) {
255
+ $url = $router->get_url("/nextgen-{$group}/{$resource_type}", FALSE).'?load='.$handles;
256
+ echo "<link href='{$url}' rel='stylesheet' type='text/css'/>\n";
257
+ }
258
+ else {
259
+ foreach ($this->resources[$resource_type][$group] as $handle) {
260
+ $url = $this->resources[$resource_type]['map'][$handle];
261
+ echo "<link href='{$url}' rel='stylesheet' type='text/css' name='{$handle}-css'/>\n";
262
+ }
263
+ }
264
+ }
265
+
266
+ }
267
+
268
+ $resources = &$this->resources[$resource_type];
269
+ unset($resources[$group]);
270
+ }
271
+ }
272
+ }
273
+
274
+
275
+ /**
276
+ * Gets a list of enqueued resources
277
+ * @param string $resource_type
278
+ * @param string $group
279
+ * @return string
280
+ */
281
+ function get_enqueued($resource_type='scripts', $group='static')
282
+ {
283
+ return implode(";", $this->resources[$resource_type][$group]);
284
+ }
285
+
286
+ /**
287
+ * Strips HTML tags from the given HTML content if a url is present
288
+ * @param $tagname
289
+ * @param $content
290
+ * @return mixed
291
+ */
292
+ function strip_tags_with_urls($tagname, $content)
293
+ {
294
+ if (preg_match_all("/\\s*<{$tagname}.*(src|href)=['\"]([^'\"]+).*(<\\/{$tagname}>|\\/>)\\s*/mi", $content, $matches, PREG_SET_ORDER)) {
295
+ foreach ($matches as $match) {
296
+ $tag = $match[0];
297
+ $url = $match[2];
298
+ if (!$this->is_resource_external($url)) {
299
+ $content = str_replace($tag, '', $content);
300
+ }
301
+ }
302
+ }
303
+ return $content;
304
+ }
305
+
306
+ function extract_enqueued_styles($content)
307
+ {
308
+ global $wp_styles;
309
+ $this->resources['styles']['static'] = array();
310
+ $this->resources['styles']['dynamic'] = array();
311
+
312
+ // Find stylesheet handle ids and urls
313
+ if (preg_match_all("/id=['\"]([^'\"]+)['\"].*href=['\"]([^'\"]+)/m", $content, $matches, PREG_SET_ORDER)) {
314
+ foreach ($matches as $match) {
315
+ $handle = substr($match[1], 0, -4);
316
+ $url = $match[2];
317
+ $handle_parts = explode('@', $handle);
318
+ $group = 'static';
319
+ if (isset($handle_parts[1])) $group = $handle_parts[1];
320
+ if (!isset($wp_styles->registered[$handle]->extra['conditional']) AND !$this->is_resource_external($url)) {
321
+ if (preg_match("/\\s*<link.*{$handle}.*\\/>/m", $content, $link_match)) {
322
+ $content = str_replace($link_match[0], '', $content);
323
+ }
324
+ $this->resources['styles'][$group][] = $handle;
325
+ $this->resources['styles']['map'][$handle] = $url;
326
+ }
327
+ }
328
+ }
329
+
330
+ return $content;
331
+ }
332
+
333
+ /**
334
+ * check if resource is provided by external site
335
+ * @param $src
336
+ * @param $match_count - minimum amount of components to match eg comp1.comp2.comp3.ext
337
+ */
338
+ function is_resource_external($src, $match_count = 2)
339
+ {
340
+ $host = parse_url(site_url(), PHP_URL_HOST);
341
+ $host_src = parse_url($src, PHP_URL_HOST);
342
+
343
+ $parts = explode('.', $host);
344
+ $parts_src = explode('.', $host_src);
345
+
346
+ $count = count($parts);
347
+ $count_src = count($parts_src);
348
+
349
+ $max = min($count, $count_src);
350
+ $max = min($match_count, $max);
351
+ $external = false;
352
+
353
+ for ($i = 0; $i < $max; $i++) {
354
+ $l = $i + 1;
355
+ $comp = $parts[$count - $l];
356
+ $comp_src = $parts_src[$count_src - $l];
357
+
358
+ if (strtolower($comp) != strtolower($comp_src)) {
359
+ $external = true;
360
+
361
+ break;
362
+ }
363
+ }
364
+
365
+ return $external;
366
+ }
367
+
368
+ /**
369
+ * Appends a script to the queue of resources to load
370
+ * @param $src
371
+ * @param $handle
372
+ */
373
+ function append_script($src, $handle)
374
+ {
375
+ // Both the src passed in and the src registered aren't reliable, and
376
+ // I'm not 100% sure why - it looks to be related to the esc_url() function.
377
+ // It sucks, but we'll have to live with it for now.
378
+ if (!preg_match("#^http(s)?://#", $src) && substr($src, 0, 2) != '//') {
379
+ global $wp_scripts;
380
+ $src = $wp_scripts->registered[$handle]->src;
381
+ }
382
+
383
+ if (!preg_match("#^http(s)?://#", $src) && substr($src, 0, 2) != '//') {
384
+ $src = site_url() . '/' . ltrim($src, '/');
385
+ }
386
+
387
+ if (!$this->is_resource_external($src)) {
388
+ $this->append_resource('scripts', $handle, $src);
389
+ }
390
+
391
+ return $src;
392
+ }
393
+
394
+
395
+ /**
396
+ * Appends a stylesheet to the resource queue
397
+ * @param $tag
398
+ * @param $handle
399
+ * @return mixed
400
+ */
401
+ function append_stylesheet($src, $handle)
402
+ {
403
+ global $wp_styles;
404
+
405
+ // Conditions will be output as usual, and not concatenated
406
+ if (!isset($wp_styles->registered[$handle]->extra['conditional'])) {
407
+
408
+ // Both the src passed in and the src registered aren't reliable, and
409
+ // I'm not 100% sure why - it looks to be related to the esc_url() function.
410
+ // It sucks, but we'll have to live with it for now.
411
+ if (!preg_match("#^http(s)?://#", $src) && substr($src, 0, 2) != '//') {
412
+ $src = $wp_styles->registered[$handle]->src;
413
+ }
414
+
415
+ if (!preg_match("#^http(s)?://#", $src) && substr($src, 0, 2) != '//') {
416
+ $src = site_url() . '/' . ltrim($src, '/');
417
+ }
418
+
419
+ // if (!$this->is_resource_external($src)) {
420
+ $this->append_resource('styles', $handle, $src);
421
+ // }
422
+ }
423
+
424
+ return $src;
425
+ }
426
+
427
+ /**
428
+ * Appends a resource to the queue
429
+ * @param $resource_type
430
+ * @param $handle
431
+ */
432
+ function append_resource($resource_type, $handle, $url)
433
+ {
434
+ // Add the handle to the appropriate group
435
+ $resources = &$this->resources[$resource_type];
436
+ $group = 'static';
437
+
438
+ // Store the association between the handle and the url. Not all
439
+ // resources are registered before they are enqueued so we need
440
+ // to store this information
441
+ $resources['map'][$handle] = $url;
442
+
443
+ // Ensure that the group hasn't been embedded in
444
+ // the name of the handle
445
+ if (strpos($handle, '@') !== FALSE) {
446
+ $parts = explode('@', $handle);
447
+ $group = $parts[1];
448
+ }
449
+
450
+ // Add the handle to the appropriate group
451
+ $resources[$group][] = $handle;
452
+ }
453
+
454
+
455
+ function start_lazy_loading()
456
+ {
457
+ echo '<script type="text/javascript">jQuery(function(){Lazy_Resources.load()});</script>';
458
+ }
459
+
460
+ function get_type_list()
461
+ {
462
+ return array(
463
+ 'C_Resource_Minifier_Installer' => 'class.resource_minifier_installer.php',
464
+ 'A_Resource_Minifier_Routes' => 'adapter.resource_minifier_routes.php',
465
+ 'C_Resource_Manager_Controller' => 'class.resource_manager_controller.php',
466
+ 'I_Resource_Manager' => 'interface.resource_manager.php',
467
+ 'M_Resource_Minifier' => 'module.resource_minifier.php'
468
+ );
469
+ }
470
+ }
471
+
472
+ new M_Resource_Minifier;
products/photocrati_nextgen/modules/resource_minifier/static/lazy_resources.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($){
2
+
3
+ window.Lazy_Resources = {
4
+ urls: [],
5
+
6
+ enqueue: function(url){
7
+ this.urls.push(url);
8
+ },
9
+
10
+ load: function() {
11
+ if (this.urls.length == 0) {
12
+ // it's possible there's nothing to load, but NextGEN galleries act on this trigger being
13
+ // emitted as their "is the page loaded yet" check-emit this event manually to be certain.
14
+ $(document).trigger('lazy_resources_loaded');
15
+ } else {
16
+ Sid.css(this.urls, function(){
17
+ var $window = $(document);
18
+ if (typeof($window.data('lazy_resources_loaded')) == 'undefined') {
19
+ $window.data('lazy_resources_loaded', true);
20
+ var urls = Lazy_Resources.urls;
21
+ $window.trigger('lazy_resources_loaded', urls);
22
+ }
23
+ });
24
+ }
25
+ }
26
+ };
27
+
28
+ })(jQuery);
products/photocrati_nextgen/modules/resource_minifier/static/sidjs-0.1.js ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ SidJS - JavaScript And CSS Lazy Loader 0.1
3
+
4
+ Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
5
+ All rights reserved.
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are met:
9
+ * Redistributions of source code must retain the above copyright
10
+ notice, this list of conditions and the following disclaimer.
11
+ * Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in the
13
+ documentation and/or other materials provided with the distribution.
14
+ * Neither the name of SidJS nor the names of its contributors may be
15
+ used to endorse or promote products derived from this software without
16
+ specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
22
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+
29
+
30
+ Sniffing by Boris Popoff <http://gueschla.com/> (see http://dean.edwards.name/weblog/2007/03/sniff/)
31
+
32
+ So why sniff? Well, the state of the browser is pretty fucked up:
33
+ Opera:
34
+ - script:
35
+ - detects load
36
+ - triggers load, readystatechange
37
+ - link:
38
+ - detects load
39
+ - triggers load
40
+ Safari, Chrome, Firefox:
41
+ - script:
42
+ - detects load
43
+ - triggers load
44
+ - link:
45
+ - detects load (WebKit)
46
+ - triggers NONE
47
+ IE8:
48
+ - script:
49
+ - detects readystatechange
50
+ - triggers readystatechange
51
+ - link:
52
+ - detects load, readystatechange
53
+ - triggers load, readystatechange
54
+ Assume all versions of IE support readystatechange
55
+ */
56
+ jQuery(function(){
57
+
58
+ (function() {
59
+ var win = window,
60
+ doc = document,
61
+ proto = 'prototype',
62
+ head = doc.getElementsByTagName('head')[0],
63
+ body = doc.getElementsByTagName('body')[0],
64
+ sniff = /*@cc_on!@*/1 + /(?:Gecko|AppleWebKit)\/(\S*)/.test(navigator.userAgent); // 0 - IE, 1 - O, 2 - GK/WK
65
+
66
+ var createNode = function(tag, attrs) {
67
+ var attr, node = doc.createElement(tag);
68
+ for (attr in attrs) {
69
+ if (attrs.hasOwnProperty(attr)) {
70
+ node.setAttribute(attr, attrs[attr]);
71
+ }
72
+ }
73
+ return node;
74
+ };
75
+
76
+ var append = function(scope, node, url, attribute, main){
77
+ if (this == win) {
78
+ return new append(scope, node, url, attribute, main);
79
+ }
80
+ var container = node.tagName == 'SCRIPT' ? document.scripts : document.styleSheets;
81
+ var perform = true;
82
+ for (var i=0; i<container.length; i++) {
83
+ if (url == container[i][attribute]) {
84
+ perform = false;
85
+ break;
86
+ }
87
+ }
88
+
89
+ if (perform)
90
+ scope.appendChild(node);
91
+ else if (main)
92
+ main.count -= 1;
93
+ };
94
+
95
+ var load = function(type, urls, callback, scope) {
96
+ if (this == win) {
97
+ return new load(type, urls, callback, scope);
98
+ }
99
+
100
+ urls = (typeof urls == 'string' ? [urls] : urls);
101
+ scope = (scope ? (scope == 'body' ? body : head) : (type == 'js' ? body : head));
102
+
103
+ this.callback = callback || function() {};
104
+ this.queue = [];
105
+ this.count = urls.length;
106
+
107
+ var node, i = len = 0, that = this;
108
+
109
+ for (i = 0, len = urls.length; i < len; i++) {
110
+ this.queue[i] = 1;
111
+ var url = urls[i];
112
+ if (type == 'css') {
113
+ node = createNode('link', { type: 'text/css', rel: 'stylesheet', href: url });
114
+ append(scope, node, url, 'href', this);
115
+ }
116
+ else {
117
+ node = createNode('script', { type: 'text/javascript', src: url });
118
+ append(scope, node, url, 'src', this);
119
+ }
120
+
121
+ if (sniff) {
122
+ if (type == 'css' && sniff == 2) {
123
+ var intervalID = setInterval(function() {
124
+ try {
125
+ node.sheet.cssRules;
126
+ clearInterval(intervalID);
127
+ that.__callback();
128
+ }
129
+ catch (ex) {
130
+ this.count--;
131
+ }
132
+ }, 100);
133
+ }
134
+ else {
135
+ node.onload = function() {
136
+ that.__callback();
137
+ }
138
+ }
139
+ }
140
+ else {
141
+ node.onreadystatechange = function() {
142
+ if (/^loaded|complete$/.test(this.readyState)) {
143
+ this.onreadystatechange = null;
144
+ that.__callback();
145
+ }
146
+ };
147
+ }
148
+ }
149
+
150
+ return this;
151
+ };
152
+ load[proto].__callback = function() {
153
+ this.queue.pop();
154
+ this.count -= 1;
155
+ if (this.count <= 0) { this.callback(); }
156
+ };
157
+
158
+ window.Sid = {
159
+ css: function(urls, callback, scope) {
160
+ return load('css', urls, callback, scope);
161
+ },
162
+ js: function(urls, callback, scope) {
163
+ return load('js', urls, callback, scope);
164
+ },
165
+ load: function(type, urls, callback, scope) {
166
+ return load(type, urls, callback, scope);
167
+ }
168
+ };
169
+ })();
170
+
171
+ });
products/photocrati_nextgen/modules/resource_minifier/templates/script.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/javascript">
2
+ (function($){
3
+ var data = {
4
+ urls: <?php echo json_encode($urls); ?>,
5
+ action: "minify",
6
+ resource: 'scripts'
7
+ };
8
+ $.post(photocrati_ajax.url, data, function(response) {
9
+ if (typeof(response) != 'object') response = JSON.parse(response);
10
+ if (typeof(response.js) == 'string') {
11
+ var script = document.createElement("script");
12
+ script.type = 'text/javascript';
13
+ script.innerHTML = response.js;
14
+ try {
15
+ $('body').append(script);
16
+ }
17
+ catch (err) {
18
+ if (typeof(console) != 'undefined') console.log(err.message);
19
+ }
20
+ }
21
+ else alert(response.error);
22
+ });
23
+ })(jQuery);
24
+ </script>
products/photocrati_nextgen/modules/router/class.router.php CHANGED
@@ -57,10 +57,10 @@ class Mixin_Router extends Mixin
57
  * @param string $uri
58
  * @return string
59
  */
60
- function get_url($uri='/', $with_qs=TRUE, $site_url = FALSE)
61
  {
62
  $retval = $this->object->join_paths(
63
- $this->object->get_base_url($site_url),
64
  $uri
65
  );
66
  if ($with_qs) {
@@ -102,7 +102,7 @@ class Mixin_Router extends Mixin
102
  $fs = $this->get_registry()->get_utility('I_Fs');
103
  $path = $fs->find_abspath($path, $module);
104
 
105
- $base_url = $this->object->get_base_url(TRUE);
106
  $base_url = $this->object->remove_url_segment('/index.php', $base_url);
107
 
108
  $path = str_replace(
@@ -134,11 +134,9 @@ class Mixin_Router extends Mixin
134
 
135
  /**
136
  * Gets the base url for the router
137
- *
138
- * @param bool $site_url Unused
139
  * @return string
140
  */
141
- function get_base_url($site_url = FALSE)
142
  {
143
  $protocol = $this->object->is_https()? 'https://' : 'http://';
144
  $retval = "{$protocol}{$_SERVER['SERVER_NAME']}{$this->object->context}";
@@ -150,11 +148,7 @@ class Mixin_Router extends Mixin
150
  */
151
  function is_https()
152
  {
153
- return (
154
- (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') ||
155
- (!empty($_SERVER['HTTP_USESSL']) && strtolower($_SERVER['HTTP_USESSL']) !== 'off') ||
156
- (!empty($_SERVER['REDIRECT_HTTPS']) && strtolower($_SERVER['REDIRECT_HTTPS']) !== 'off') ||
157
- $_SERVER['SERVER_PORT'] == 443);
158
  }
159
 
160
 
@@ -182,7 +176,7 @@ class Mixin_Router extends Mixin
182
  */
183
  function get_querystring()
184
  {
185
- return isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : null ;
186
  }
187
 
188
 
57
  * @param string $uri
58
  * @return string
59
  */
60
+ function get_url($uri='/', $with_qs=TRUE)
61
  {
62
  $retval = $this->object->join_paths(
63
+ $this->object->get_base_url(),
64
  $uri
65
  );
66
  if ($with_qs) {
102
  $fs = $this->get_registry()->get_utility('I_Fs');
103
  $path = $fs->find_abspath($path, $module);
104
 
105
+ $base_url = $this->object->get_base_url();
106
  $base_url = $this->object->remove_url_segment('/index.php', $base_url);
107
 
108
  $path = str_replace(
134
 
135
  /**
136
  * Gets the base url for the router
 
 
137
  * @return string
138
  */
139
+ function get_base_url()
140
  {
141
  $protocol = $this->object->is_https()? 'https://' : 'http://';
142
  $retval = "{$protocol}{$_SERVER['SERVER_NAME']}{$this->object->context}";
148
  */
149
  function is_https()
150
  {
151
+ return isset($_SERVER['HTTPS']);
 
 
 
 
152
  }
153
 
154
 
176
  */
177
  function get_querystring()
178
  {
179
+ return $_SERVER['QUERY_STRING'];
180
  }
181
 
182
 
products/photocrati_nextgen/modules/router/class.router_installer.php CHANGED
@@ -4,9 +4,9 @@ class C_Router_Installer
4
  {
5
  function install()
6
  {
7
- $settings = C_NextGen_Settings::get_instance();
8
  $settings->set_default_value('router_param_separator', '--');
9
  $settings->set_default_value('router_param_prefix', '');
10
- $settings->set_default_value('router_param_slug', 'nggallery');
11
  }
12
  }
4
  {
5
  function install()
6
  {
7
+ $settings = C_NextGen_Global_Settings::get_instance();
8
  $settings->set_default_value('router_param_separator', '--');
9
  $settings->set_default_value('router_param_prefix', '');
10
+ $settings->set_default_value('router_param_slug', 'params');
11
  }
12
  }
products/photocrati_nextgen/modules/router/class.routing_app.php CHANGED
@@ -50,11 +50,11 @@ class Mixin_Routing_App extends Mixin
50
  );
51
 
52
  // We treat wildcards much differently then normal rewrites
53
- if (preg_match("/\\{[\\.\\\\*]/", $src)) {
54
  $pattern = str_replace('{*}', '(.*?)', $src);
55
  $pattern = str_replace('{.*}', '(.*?)', $pattern);
56
- $pattern = str_replace('{\\w}', '([\\w-_]*)', $pattern);
57
- $pattern = str_replace('{\\d}', '(\\d*)', $pattern);
58
  $src = '#'.(strpos($src, '/') === 0 ? '^':'').$pattern.'/?$#';
59
  $definition['wildcards'] = TRUE;
60
  }
@@ -168,7 +168,6 @@ class Mixin_Routing_App extends Mixin
168
  function do_rewrites($request_uri=FALSE)
169
  {
170
  $redirect = FALSE;
171
- static $stop_processing = FALSE;
172
 
173
  // Get the request uri if not provided
174
  if (!$request_uri) $request_uri = $this->object->get_app_request_uri();
@@ -179,7 +178,7 @@ class Mixin_Routing_App extends Mixin
179
 
180
  // Process each rewrite rule
181
  // start rewriting urls
182
- if (!$stop_processing) foreach ($this->object->_rewrite_patterns as $pattern => $details) {
183
 
184
  // Remove this pattern from future processing for this request
185
  unset($this->object->_rewrite_patterns[$pattern]);
@@ -190,8 +189,9 @@ class Mixin_Routing_App extends Mixin
190
  foreach ($matches as $index => $match) {
191
  if ($index == 0) {
192
  $request_uri = str_replace($match, $details['dst'], $request_uri);
 
193
  }
194
- if ($index > 0) $request_uri = str_replace(
195
  "{{$index}}", $match, $request_uri
196
  );
197
  }
@@ -204,10 +204,7 @@ class Mixin_Routing_App extends Mixin
204
  }
205
 
206
  // Stop processing rewrite patterns?
207
- if ($details['stop']) {
208
- $stop_processing = TRUE;
209
-
210
- }
211
  }
212
  }
213
 
@@ -236,8 +233,6 @@ class Mixin_Routing_App extends Mixin
236
 
237
  }
238
  }
239
-
240
- if ($stop_processing) break;
241
  }
242
 
243
  // Cache all known data about the application request
@@ -450,7 +445,7 @@ class Mixin_Routing_App extends Mixin
450
  $route_regex = '#' . $route_regex . '/?$#i';
451
 
452
  // convert placeholders to regex as well
453
- return preg_replace('/~([^~]+)~/i', ($param_slug ? '('.preg_quote($param_slug,'#').'\K)?' : '').'(?P<\1>[^/]+)/?', $route_regex);
454
  }
455
 
456
  /**
@@ -481,7 +476,7 @@ class Mixin_Routing_App extends Mixin
481
  $id = $id ? preg_quote($id,'#') : "[^/]+";
482
  $param_prefix = preg_quote($settings->router_param_prefix,'#');
483
  $param_sep = preg_quote($settings->router_param_separator,'#');
484
- $param_regex = "#/((?P<id>{$id}){$param_sep})?({$param_prefix}[-_]?)?{$quoted_key}{$param_sep}(?P<value>[^/\?]+)/?#i";
485
  $found = FALSE;
486
  $sources = $url ? array('custom' => $url) : $this->object->get_parameter_sources();
487
 
@@ -524,7 +519,8 @@ class Mixin_Routing_App extends Mixin
524
  if (!isset($parts['path'])) $parts['path'] = '';
525
  $parts['path'] = $this->object->join_paths(
526
  $parts['path'],
527
- $param_slug && strpos($parts['path'], $param_slug) === FALSE ? $param_slug : '',
 
528
  $this->object->create_parameter_segment($key, $value, $id, $use_prefix)
529
  );
530
  $retval = $this->object->construct_url_from_parts($parts);
@@ -539,7 +535,7 @@ class Mixin_Routing_App extends Mixin
539
  $retval = $this->object->get_routed_url();
540
  }
541
 
542
- return trailingslashit($retval);
543
  }
544
 
545
  /**
@@ -569,7 +565,7 @@ class Mixin_Routing_App extends Mixin
569
  $param_slug = $settings->router_param_slug ? preg_quote($settings->router_param_slug, '#') : FALSE;
570
 
571
  // Is the parameter already part of the request? If so, modify that
572
- // parameter
573
  if (($segment = $this->object->get_parameter_segment($key, $id, $url))) {
574
  extract($segment);
575
 
@@ -618,7 +614,7 @@ class Mixin_Routing_App extends Mixin
618
  {
619
  $settings = $this->object->_settings;
620
  $param_slug = $settings->router_param_slug;
621
-
622
  $uri = $this->object->get_app_request_uri();
623
  $parts = array($uri);
624
  if ($param_slug && strpos($uri, $param_slug) === FALSE) $parts[] = $param_slug;
@@ -702,7 +698,7 @@ class Mixin_Routing_App extends Mixin
702
  return array(
703
  'querystring' => $this->object->get_formatted_querystring(),
704
  'request_uri' => $this->object->get_app_request_uri(),
705
- //'postdata' => $this->object->get_postdata()
706
  );
707
  }
708
 
@@ -801,16 +797,16 @@ class C_Routing_App extends C_Component
801
  $this->add_mixin('Mixin_Routing_App');
802
  $this->implement('I_Routing_App');
803
  }
804
-
805
  function initialize()
806
  {
807
  parent::initialize();
808
  $this->_settings = $this->object->get_routing_settings();
809
  }
810
-
811
  function get_routing_settings()
812
  {
813
- $settings = C_NextGen_Settings::get_instance();
814
  $object = new stdClass();
815
  $object->router_param_separator = $settings->router_param_separator;
816
  $object->router_param_slug = $settings->router_param_slug;
50
  );
51
 
52
  // We treat wildcards much differently then normal rewrites
53
+ if (preg_match("/\{[\.\\\*]/", $src)) {
54
  $pattern = str_replace('{*}', '(.*?)', $src);
55
  $pattern = str_replace('{.*}', '(.*?)', $pattern);
56
+ $pattern = str_replace('{\w}', '([\w-_]*)', $pattern);
57
+ $pattern = str_replace('{\d}', '(\d*)', $pattern);
58
  $src = '#'.(strpos($src, '/') === 0 ? '^':'').$pattern.'/?$#';
59
  $definition['wildcards'] = TRUE;
60
  }
168
  function do_rewrites($request_uri=FALSE)
169
  {
170
  $redirect = FALSE;
 
171
 
172
  // Get the request uri if not provided
173
  if (!$request_uri) $request_uri = $this->object->get_app_request_uri();
178
 
179
  // Process each rewrite rule
180
  // start rewriting urls
181
+ foreach ($this->object->_rewrite_patterns as $pattern => $details) {
182
 
183
  // Remove this pattern from future processing for this request
184
  unset($this->object->_rewrite_patterns[$pattern]);
189
  foreach ($matches as $index => $match) {
190
  if ($index == 0) {
191
  $request_uri = str_replace($match, $details['dst'], $request_uri);
192
+ continue;
193
  }
194
+ $request_uri = str_replace(
195
  "{{$index}}", $match, $request_uri
196
  );
197
  }
204
  }
205
 
206
  // Stop processing rewrite patterns?
207
+ if ($details['stop']) break;
 
 
 
208
  }
209
  }
210
 
233
 
234
  }
235
  }
 
 
236
  }
237
 
238
  // Cache all known data about the application request
445
  $route_regex = '#' . $route_regex . '/?$#i';
446
 
447
  // convert placeholders to regex as well
448
+ return preg_replace('/~([^~]+)~/i', ($param_slug ? '('.preg_quote($param_slug,'#').'\K)?' : '').'(?<\1>[^/]+)/?', $route_regex);
449
  }
450
 
451
  /**
476
  $id = $id ? preg_quote($id,'#') : "[^/]+";
477
  $param_prefix = preg_quote($settings->router_param_prefix,'#');
478
  $param_sep = preg_quote($settings->router_param_separator,'#');
479
+ $param_regex = "#/((?<id>{$id}){$param_sep})?({$param_prefix}[-_]?)?{$quoted_key}{$param_sep}(?<value>[^/\?]+)/?#i";
480
  $found = FALSE;
481
  $sources = $url ? array('custom' => $url) : $this->object->get_parameter_sources();
482
 
519
  if (!isset($parts['path'])) $parts['path'] = '';
520
  $parts['path'] = $this->object->join_paths(
521
  $parts['path'],
522
+ $param_slug && strpos($retval, $param_slug) === FALSE ?
523
+ $param_slug : '',
524
  $this->object->create_parameter_segment($key, $value, $id, $use_prefix)
525
  );
526
  $retval = $this->object->construct_url_from_parts($parts);
535
  $retval = $this->object->get_routed_url();
536
  }
537
 
538
+ return $retval;
539
  }
540
 
541
  /**
565
  $param_slug = $settings->router_param_slug ? preg_quote($settings->router_param_slug, '#') : FALSE;
566
 
567
  // Is the parameter already part of the request? If so, modify that
568
+ // parmaeter
569
  if (($segment = $this->object->get_parameter_segment($key, $id, $url))) {
570
  extract($segment);
571
 
614
  {
615
  $settings = $this->object->_settings;
616
  $param_slug = $settings->router_param_slug;
617
+
618
  $uri = $this->object->get_app_request_uri();
619
  $parts = array($uri);
620
  if ($param_slug && strpos($uri, $param_slug) === FALSE) $parts[] = $param_slug;
698
  return array(
699
  'querystring' => $this->object->get_formatted_querystring(),
700
  'request_uri' => $this->object->get_app_request_uri(),
701
+ 'postdata' => $this->object->get_postdata()
702
  );
703
  }
704
 
797
  $this->add_mixin('Mixin_Routing_App');
798
  $this->implement('I_Routing_App');
799
  }
800
+
801
  function initialize()
802
  {
803
  parent::initialize();
804
  $this->_settings = $this->object->get_routing_settings();
805
  }
806
+
807
  function get_routing_settings()
808
  {
809
+ $settings = C_NextGen_Global_Settings::get_instance();
810
  $object = new stdClass();
811
  $object->router_param_separator = $settings->router_param_separator;
812
  $object->router_param_slug = $settings->router_param_slug;
products/photocrati_nextgen/modules/router/mixin.url_manipulation.php CHANGED
@@ -121,16 +121,9 @@ class Mixin_Url_Manipulation extends Mixin
121
  */
122
  function construct_url_from_parts($parts)
123
  {
124
- // let relative paths be relative, and full paths full
125
- $prefix = '';
126
- if (!empty($parts['scheme']) && !empty($parts['host'])) {
127
- $prefix = $parts['scheme'] . '://' . $parts['host'];
128
- if (!empty($parts['port']))
129
- $prefix .= ':' . $parts['port'];
130
- }
131
-
132
  $retval = $this->object->join_paths(
133
- $prefix,
 
134
  isset($parts['path']) ? $parts['path'] : ''
135
  );
136
  if (isset($parts['query']) && $parts['query']) $retval .= "?{$parts['query']}";
@@ -151,9 +144,9 @@ class Mixin_Url_Manipulation extends Mixin
151
  function strip_param_segments($request_uri, $remove_slug=TRUE)
152
  {
153
  $retval = $request_uri ? $request_uri : '/';
154
- $settings = C_NextGen_Settings::get_instance();
155
  $sep = preg_quote($settings->router_param_separator, '#');
156
- $param_regex = "#((?P<id>\w+){$sep})?(?<key>\w+){$sep}(?P<value>.+)/?$#";
157
  $slug = $settings->router_param_slug && $remove_slug ? '/' . preg_quote($settings->router_param_slug,'#') : '';
158
  $slug_regex = '#'.$slug.'/?$#';
159
 
121
  */
122
  function construct_url_from_parts($parts)
123
  {
 
 
 
 
 
 
 
 
124
  $retval = $this->object->join_paths(
125
+ isset($parts['scheme']) && $parts['host'] ?
126
+ "{$parts['scheme']}://{$parts['host']}" : '',
127
  isset($parts['path']) ? $parts['path'] : ''
128
  );
129
  if (isset($parts['query']) && $parts['query']) $retval .= "?{$parts['query']}";
144
  function strip_param_segments($request_uri, $remove_slug=TRUE)
145
  {
146
  $retval = $request_uri ? $request_uri : '/';
147
+ $settings = C_NextGen_Global_Settings::get_instance();
148
  $sep = preg_quote($settings->router_param_separator, '#');
149
+ $param_regex = "#((?<id>\w+){$sep})?(?<key>\w+){$sep}(?<value>.+)/?$#";
150
  $slug = $settings->router_param_slug && $remove_slug ? '/' . preg_quote($settings->router_param_slug,'#') : '';
151
  $slug_regex = '#'.$slug.'/?$#';
152
 
products/photocrati_nextgen/modules/router/module.router.php CHANGED
@@ -13,7 +13,7 @@ class M_Router extends C_Base_Module
13
  'photocrati-router',
14
  'Router for Pope',
15
  'Provides routing capabilities for Pope modules',
16
- '0.4',
17
  'http://www.photocrati.com',
18
  'Photocrati Media',
19
  'http://www.photocrati.com'
13
  'photocrati-router',
14
  'Router for Pope',
15
  'Provides routing capabilities for Pope modules',
16
+ '0.2',
17
  'http://www.photocrati.com',
18
  'Photocrati Media',
19
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/security/class.wordpress_security_actor.php CHANGED
@@ -105,19 +105,6 @@ class Mixin_WordPress_Security_Action_Converter extends Mixin
105
  {
106
  $capability_name = 'NextGEN Upload images';
107
 
108
- break;
109
- }
110
- case 'nextgen_edit_album_settings':
111
- {
112
- $capability_name = 'NextGEN Edit album settings';
113
-
114
- break;
115
- }
116
-
117
- case 'nextgen_edit_album':
118
- {
119
- $capability_name = 'NextGEN Edit album';
120
-
121
  break;
122
  }
123
  }
105
  {
106
  $capability_name = 'NextGEN Upload images';
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  break;
109
  }
110
  }
products/photocrati_nextgen/modules/security/class.wordpress_security_manager.php CHANGED
@@ -59,19 +59,6 @@ class Mixin_WordPress_Security_Manager extends Mixin
59
 
60
  function get_current_actor()
61
  {
62
- // If the current_user has an id of 0, then perhaps something went wrong
63
- // with trying to parse the cookie. In that case, we'll force WordPress to try
64
- // again
65
- global $current_user;
66
- if ($current_user->ID == 0) {
67
- if (isset($GLOBALS['HTTP_COOKIE_VARS']) && isset($GLOBALS['_COOKIE']))
68
- $current_user = NULL;
69
- foreach ($GLOBALS['HTTP_COOKIE_VARS'] as $key => $value)
70
- if (!isset($_COOKIE[$key])) {
71
- $_COOKIE[$key] = $value;
72
- }
73
- }
74
-
75
  return $this->object->get_actor(get_current_user_id(), 'user');
76
  }
77
 
59
 
60
  function get_current_actor()
61
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  return $this->object->get_actor(get_current_user_id(), 'user');
63
  }
64
 
products/photocrati_nextgen/modules/security/module.security.php CHANGED
@@ -14,15 +14,11 @@ class M_Security extends C_Base_Module
14
  'photocrati-security',
15
  'Security',
16
  'Provides utilities to check for credentials and security',
17
- '0.2',
18
  'http://www.nextgen-gallery.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
21
  );
22
-
23
- if (isset($GLOBALS['_COOKIE_NG_COPY'])) {
24
- $_COOKIE = $GLOBALS['_COOKIE_NG_COPY'];
25
- }
26
  }
27
 
28
  function _register_adapters()
14
  'photocrati-security',
15
  'Security',
16
  'Provides utilities to check for credentials and security',
17
+ '0.1',
18
  'http://www.nextgen-gallery.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
21
  );
 
 
 
 
22
  }
23
 
24
  function _register_adapters()
products/photocrati_nextgen/modules/simplehtmldom/module.simple_html_dom.php CHANGED
@@ -16,7 +16,7 @@ class M_Simple_Html_Dom extends C_Base_Module
16
  'photocrati-simple_html_dom',
17
  'Simple HTML Dom',
18
  'Provides the simple_html_dom utility for other modules to use',
19
- '1.5',
20
  'http://www.photocrati.com',
21
  'Photocrati Media',
22
  'http://www.photocrati.com'
16
  'photocrati-simple_html_dom',
17
  'Simple HTML Dom',
18
  'Provides the simple_html_dom utility for other modules to use',
19
+ '0.1',
20
  'http://www.photocrati.com',
21
  'Photocrati Media',
22
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/simplehtmldom/simplehtmldom/simple_html_dom.php CHANGED
@@ -1,12 +1,11 @@
1
  <?php
2
  /**
3
  * Website: http://sourceforge.net/projects/simplehtmldom/
4
- * Additional projects that may be used: http://sourceforge.net/projects/debugobject/
5
  * Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/)
6
  * Contributions by:
7
- * Yousuke Kumakura (Attribute filters)
8
- * Vadim Voituk (Negative indexes supports of "find" method)
9
- * Antcs (Constructor with automatically load contents either text or file/url)
10
  *
11
  * all affected sections have comments starting with "PaperG"
12
  *
@@ -25,16 +24,13 @@
25
  * NOTE: If the user's system has a routine called get_last_retrieve_url_contents_content_type availalbe, we will assume it's returning the content-type header from the
26
  * last transfer or curl_exec, and we will parse that and use it in preference to any other method of charset detection.
27
  *
28
- * Found infinite loop in the case of broken html in restore_noise. Rewrote to protect from that.
29
- * PaperG (John Schlick) Added get_display_size for "IMG" tags.
30
- *
31
  * Licensed under The MIT License
32
  * Redistributions of files must retain the above copyright notice.
33
  *
34
  * @author S.C. Chen <me578022@gmail.com>
35
  * @author John Schlick
36
  * @author Rus Carroll
37
- * @version 1.5 ($Rev: 208 $)
38
  * @package PlaceLocalInclude
39
  * @subpackage simple_html_dom
40
  */
@@ -45,66 +41,63 @@
45
  */
46
  define('HDOM_TYPE_ELEMENT', 1);
47
  define('HDOM_TYPE_COMMENT', 2);
48
- define('HDOM_TYPE_TEXT', 3);
49
  define('HDOM_TYPE_ENDTAG', 4);
50
- define('HDOM_TYPE_ROOT', 5);
51
  define('HDOM_TYPE_UNKNOWN', 6);
52
  define('HDOM_QUOTE_DOUBLE', 0);
53
  define('HDOM_QUOTE_SINGLE', 1);
54
- define('HDOM_QUOTE_NO', 3);
55
  define('HDOM_INFO_BEGIN', 0);
56
- define('HDOM_INFO_END', 1);
57
  define('HDOM_INFO_QUOTE', 2);
58
  define('HDOM_INFO_SPACE', 3);
59
- define('HDOM_INFO_TEXT', 4);
60
  define('HDOM_INFO_INNER', 5);
61
  define('HDOM_INFO_OUTER', 6);
62
  define('HDOM_INFO_ENDSPACE',7);
63
  define('DEFAULT_TARGET_CHARSET', 'UTF-8');
64
  define('DEFAULT_BR_TEXT', "\r\n");
65
- define('DEFAULT_SPAN_TEXT', " ");
66
- define('MAX_FILE_SIZE', 600000);
67
  // helper functions
68
  // -----------------------------------------------------------------------------
69
  // get html dom from file
70
  // $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1.
71
- function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
72
  {
73
- // We DO force the tags to be terminated.
74
- $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
75
- // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
76
- $contents = file_get_contents($url, $use_include_path, $context, $offset);
77
- // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
78
- //$contents = retrieve_url_contents($url);
79
- if (empty($contents) || strlen($contents) > MAX_FILE_SIZE)
80
- {
81
- return false;
82
- }
83
- // The second parameter can force the selectors to all be lowercase.
84
- $dom->load($contents, $lowercase, $stripRN);
85
- return $dom;
86
  }
87
 
88
  // get html dom from string
89
- function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
90
  {
91
- $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
92
- if (empty($str) || strlen($str) > MAX_FILE_SIZE)
93
- {
94
- $dom->clear();
95
- return false;
96
- }
97
- $dom->load($str, $lowercase, $stripRN);
98
- return $dom;
99
  }
100
 
101
  // dump html dom tree
102
  function dump_html_tree($node, $show_attr=true, $deep=0)
103
  {
104
- $node->dump($node);
105
  }
106
 
107
-
108
  /**
109
  * simple html dom node
110
  * PaperG - added ability for "find" routine to lowercase the value of the selector.
@@ -112,868 +105,646 @@ function dump_html_tree($node, $show_attr=true, $deep=0)
112
  *
113
  * @package PlaceLocalInclude
114
  */
115
- class simple_html_dom_node
116
- {
117
- public $nodetype = HDOM_TYPE_TEXT;
118
- public $tag = 'text';
119
- public $attr = array();
120
- public $children = array();
121
- public $nodes = array();
122
- public $parent = null;
123
- // The "info" array - see HDOM_INFO_... for what each element contains.
124
- public $_ = array();
125
- public $tag_start = 0;
126
- private $dom = null;
127
-
128
- function __construct($dom)
129
- {
130
- $this->dom = $dom;
131
- $dom->nodes[] = $this;
132
- }
133
-
134
- function __destruct()
135
- {
136
- $this->clear();
137
- }
138
-
139
- function __toString()
140
- {
141
- return $this->outertext();
142
- }
143
-
144
- // clean up memory due to php5 circular references memory leak...
145
- function clear()
146
- {
147
- $this->dom = null;
148
- $this->nodes = null;
149
- $this->parent = null;
150
- $this->children = null;
151
- }
152
-
153
- // dump node's tree
154
- function dump($show_attr=true, $deep=0)
155
- {
156
- $lead = str_repeat(' ', $deep);
157
-
158
- echo $lead.$this->tag;
159
- if ($show_attr && count($this->attr)>0)
160
- {
161
- echo '(';
162
- foreach ($this->attr as $k=>$v)
163
- echo "[$k]=>\"".$this->$k.'", ';
164
- echo ')';
165
- }
166
- echo "\n";
167
-
168
- if ($this->nodes)
169
- {
170
- foreach ($this->nodes as $c)
171
- {
172
- $c->dump($show_attr, $deep+1);
173
- }
174
- }
175
- }
176
-
177
-
178
- // Debugging function to dump a single dom node with a bunch of information about it.
179
- function dump_node($echo=true)
180
- {
181
-
182
- $string = $this->tag;
183
- if (count($this->attr)>0)
184
- {
185
- $string .= '(';
186
- foreach ($this->attr as $k=>$v)
187
- {
188
- $string .= "[$k]=>\"".$this->$k.'", ';
189
- }
190
- $string .= ')';
191
- }
192
- if (count($this->_)>0)
193
- {
194
- $string .= ' $_ (';
195
- foreach ($this->_ as $k=>$v)
196
- {
197
- if (is_array($v))
198
- {
199
- $string .= "[$k]=>(";
200
- foreach ($v as $k2=>$v2)
201
- {
202
- $string .= "[$k2]=>\"".$v2.'", ';
203
- }
204
- $string .= ")";
205
- } else {
206
- $string .= "[$k]=>\"".$v.'", ';
207
- }
208
- }
209
- $string .= ")";
210
- }
211
-
212
- if (isset($this->text))
213
- {
214
- $string .= " text: (" . $this->text . ")";
215
- }
216
-
217
- $string .= " HDOM_INNER_INFO: '";
218
- if (isset($node->_[HDOM_INFO_INNER]))
219
- {
220
- $string .= $node->_[HDOM_INFO_INNER] . "'";
221
- }
222
- else
223
- {
224
- $string .= ' NULL ';
225
- }
226
-
227
- $string .= " children: " . count($this->children);
228
- $string .= " nodes: " . count($this->nodes);
229
- $string .= " tag_start: " . $this->tag_start;
230
- $string .= "\n";
231
-
232
- if ($echo)
233
- {
234
- echo $string;
235
- return;
236
- }
237
- else
238
- {
239
- return $string;
240
- }
241
- }
242
-
243
- // returns the parent of node
244
- // If a node is passed in, it will reset the parent of the current node to that one.
245
- function parent($parent=null)
246
- {
247
- // I am SURE that this doesn't work properly.
248
- // It fails to unset the current node from it's current parents nodes or children list first.
249
- if ($parent !== null)
250
- {
251
- $this->parent = $parent;
252
- $this->parent->nodes[] = $this;
253
- $this->parent->children[] = $this;
254
- }
255
-
256
- return $this->parent;
257
- }
258
-
259
- // verify that node has children
260
- function has_child()
261
- {
262
- return !empty($this->children);
263
- }
264
-
265
- // returns children of node
266
- function children($idx=-1)
267
- {
268
- if ($idx===-1)
269
- {
270
- return $this->children;
271
- }
272
- if (isset($this->children[$idx]))
273
- {
274
- return $this->children[$idx];
275
- }
276
- return null;
277
- }
278
-
279
- // returns the first child of node
280
- function first_child()
281
- {
282
- if (count($this->children)>0)
283
- {
284
- return $this->children[0];
285
- }
286
- return null;
287
- }
288
-
289
- // returns the last child of node
290
- function last_child()
291
- {
292
- if (($count=count($this->children))>0)
293
- {
294
- return $this->children[$count-1];
295
- }
296
- return null;
297
- }
298
-
299
- // returns the next sibling of node
300
- function next_sibling()
301
- {
302
- if ($this->parent===null)
303
- {
304
- return null;
305
- }
306
-
307
- $idx = 0;
308
- $count = count($this->parent->children);
309
- while ($idx<$count && $this!==$this->parent->children[$idx])
310
- {
311
- ++$idx;
312
- }
313
- if (++$idx>=$count)
314
- {
315
- return null;
316
- }
317
- return $this->parent->children[$idx];
318
- }
319
-
320
- // returns the previous sibling of node
321
- function prev_sibling()
322
- {
323
- if ($this->parent===null) return null;
324
- $idx = 0;
325
- $count = count($this->parent->children);
326
- while ($idx<$count && $this!==$this->parent->children[$idx])
327
- ++$idx;
328
- if (--$idx<0) return null;
329
- return $this->parent->children[$idx];
330
- }
331
-
332
- // function to locate a specific ancestor tag in the path to the root.
333
- function find_ancestor_tag($tag)
334
- {
335
- global $debug_object;
336
- if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
337
-
338
- // Start by including ourselves in the comparison.
339
- $returnDom = $this;
340
-
341
- while (!is_null($returnDom))
342
- {
343
- if (is_object($debug_object)) { $debug_object->debug_log(2, "Current tag is: " . $returnDom->tag); }
344
-
345
- if ($returnDom->tag == $tag)
346
- {
347
- break;
348
- }
349
- $returnDom = $returnDom->parent;
350
- }
351
- return $returnDom;
352
- }
353
-
354
- // get dom node's inner html
355
- function innertext()
356
- {
357
- if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
358
- if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
359
-
360
- $ret = '';
361
- foreach ($this->nodes as $n)
362
- $ret .= $n->outertext();
363
- return $ret;
364
- }
365
-
366
- // get dom node's outer text (with tag)
367
- function outertext()
368
- {
369
- global $debug_object;
370
- if (is_object($debug_object))
371
- {
372
- $text = '';
373
- if ($this->tag == 'text')
374
- {
375
- if (!empty($this->text))
376
- {
377
- $text = " with text: " . $this->text;
378
- }
379
- }
380
- $debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text);
381
- }
382
-
383
- if ($this->tag==='root') return $this->innertext();
384
-
385
- // trigger callback
386
- if ($this->dom && $this->dom->callback!==null)
387
- {
388
- call_user_func_array($this->dom->callback, array($this));
389
- }
390
-
391
- if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER];
392
- if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
393
-
394
- // render begin tag
395
- if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]])
396
- {
397
- $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();
398
- } else {
399
- $ret = "";
400
- }
401
-
402
- // render inner text
403
- if (isset($this->_[HDOM_INFO_INNER]))
404
- {
405
- // If it's a br tag... don't return the HDOM_INNER_INFO that we may or may not have added.
406
- if ($this->tag != "br")
407
- {
408
- $ret .= $this->_[HDOM_INFO_INNER];
409
- }
410
- } else {
411
- if ($this->nodes)
412
- {
413
- foreach ($this->nodes as $n)
414
- {
415
- $ret .= $this->convert_text($n->outertext());
416
- }
417
- }
418
- }
419
-
420
- // render end tag
421
- if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)
422
- $ret .= '</'.$this->tag.'>';
423
- return $ret;
424
- }
425
-
426
- // get dom node's plain text
427
- function text()
428
- {
429
- if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
430
- switch ($this->nodetype)
431
- {
432
- case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
433
- case HDOM_TYPE_COMMENT: return '';
434
- case HDOM_TYPE_UNKNOWN: return '';
435
- }
436
- if (strcasecmp($this->tag, 'script')===0) return '';
437
- if (strcasecmp($this->tag, 'style')===0) return '';
438
-
439
- $ret = '';
440
- // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed for some span tags, and some p tags) $this->nodes is set to NULL.
441
- // NOTE: This indicates that there is a problem where it's set to NULL without a clear happening.
442
- // WHY is this happening?
443
- if (!is_null($this->nodes))
444
- {
445
- foreach ($this->nodes as $n)
446
- {
447
- $ret .= $this->convert_text($n->text());
448
- }
449
-
450
- // If this node is a span... add a space at the end of it so multiple spans don't run into each other. This is plaintext after all.
451
- if ($this->tag == "span")
452
- {
453
- $ret .= $this->dom->default_span_text;
454
- }
455
-
456
-
457
- }
458
- return $ret;
459
- }
460
-
461
- function xmltext()
462
- {
463
- $ret = $this->innertext();
464
- $ret = str_ireplace('<![CDATA[', '', $ret);
465
- $ret = str_replace(']]>', '', $ret);
466
- return $ret;
467
- }
468
-
469
- // build node's text with tag
470
- function makeup()
471
- {
472
- // text, comment, unknown
473
- if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
474
-
475
- $ret = '<'.$this->tag;
476
- $i = -1;
477
-
478
- foreach ($this->attr as $key=>$val)
479
- {
480
- ++$i;
481
-
482
- // skip removed attribute
483
- if ($val===null || $val===false)
484
- continue;
485
-
486
- $ret .= $this->_[HDOM_INFO_SPACE][$i][0];
487
- //no value attr: nowrap, checked selected...
488
- if ($val===true)
489
- $ret .= $key;
490
- else {
491
- switch ($this->_[HDOM_INFO_QUOTE][$i])
492
- {
493
- case HDOM_QUOTE_DOUBLE: $quote = '"'; break;
494
- case HDOM_QUOTE_SINGLE: $quote = '\''; break;
495
- default: $quote = '';
496
- }
497
- $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;
498
- }
499
- }
500
- $ret = $this->dom->restore_noise($ret);
501
- return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';
502
- }
503
-
504
- // find elements by css selector
505
- //PaperG - added ability for find to lowercase the value of the selector.
506
- function find($selector, $idx=null, $lowercase=false)
507
- {
508
- $selectors = $this->parse_selector($selector);
509
- if (($count=count($selectors))===0) return array();
510
- $found_keys = array();
511
-
512
- // find each selector
513
- for ($c=0; $c<$count; ++$c)
514
- {
515
- // The change on the below line was documented on the sourceforge code tracker id 2788009
516
- // used to be: if (($levle=count($selectors[0]))===0) return array();
517
- if (($levle=count($selectors[$c]))===0) return array();
518
- if (!isset($this->_[HDOM_INFO_BEGIN])) return array();
519
-
520
- $head = array($this->_[HDOM_INFO_BEGIN]=>1);
521
-
522
- // handle descendant selectors, no recursive!
523
- for ($l=0; $l<$levle; ++$l)
524
- {
525
- $ret = array();
526
- foreach ($head as $k=>$v)
527
- {
528
- $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k];
529
- //PaperG - Pass this optional parameter on to the seek function.
530
- $n->seek($selectors[$c][$l], $ret, $lowercase);
531
- }
532
- $head = $ret;
533
- }
534
-
535
- foreach ($head as $k=>$v)
536
- {
537
- if (!isset($found_keys[$k]))
538
- {
539
- $found_keys[$k] = 1;
540
- }
541
- }
542
- }
543
-
544
- // sort keys
545
- ksort($found_keys);
546
-
547
- $found = array();
548
- foreach ($found_keys as $k=>$v)
549
- $found[] = $this->dom->nodes[$k];
550
-
551
- // return nth-element or array
552
- if (is_null($idx)) return $found;
553
- else if ($idx<0) $idx = count($found) + $idx;
554
- return (isset($found[$idx])) ? $found[$idx] : null;
555
- }
556
-
557
- // seek for given conditions
558
- // PaperG - added parameter to allow for case insensitive testing of the value of a selector.
559
- protected function seek($selector, &$ret, $lowercase=false)
560
- {
561
- global $debug_object;
562
- if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
563
-
564
- list($tag, $key, $val, $exp, $no_key) = $selector;
565
-
566
- // xpath index
567
- if ($tag && $key && is_numeric($key))
568
- {
569
- $count = 0;
570
- foreach ($this->children as $c)
571
- {
572
- if ($tag==='*' || $tag===$c->tag) {
573
- if (++$count==$key) {
574
- $ret[$c->_[HDOM_INFO_BEGIN]] = 1;
575
- return;
576
- }
577
- }
578
- }
579
- return;
580
- }
581
-
582
- $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
583
- if ($end==0) {
584
- $parent = $this->parent;
585
- while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) {
586
- $end -= 1;
587
- $parent = $parent->parent;
588
- }
589
- $end += $parent->_[HDOM_INFO_END];
590
- }
591
-
592
- for ($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) {
593
- $node = $this->dom->nodes[$i];
594
-
595
- $pass = true;
596
-
597
- if ($tag==='*' && !$key) {
598
- if (in_array($node, $this->children, true))
599
- $ret[$i] = 1;
600
- continue;
601
- }
602
-
603
- // compare tag
604
- if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;}
605
- // compare key
606
- if ($pass && $key) {
607
- if ($no_key) {
608
- if (isset($node->attr[$key])) $pass=false;
609
- } else {
610
- if (($key != "plaintext") && !isset($node->attr[$key])) $pass=false;
611
- }
612
- }
613
- // compare value
614
- if ($pass && $key && $val && $val!=='*') {
615
- // If they have told us that this is a "plaintext" search then we want the plaintext of the node - right?
616
- if ($key == "plaintext") {
617
- // $node->plaintext actually returns $node->text();
618
- $nodeKeyValue = $node->text();
619
- } else {
620
- // this is a normal search, we want the value of that attribute of the tag.
621
- $nodeKeyValue = $node->attr[$key];
622
- }
623
- if (is_object($debug_object)) {$debug_object->debug_log(2, "testing node: " . $node->tag . " for attribute: " . $key . $exp . $val . " where nodes value is: " . $nodeKeyValue);}
624
-
625
- //PaperG - If lowercase is set, do a case insensitive test of the value of the selector.
626
- if ($lowercase) {
627
- $check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue));
628
- } else {
629
- $check = $this->match($exp, $val, $nodeKeyValue);
630
- }
631
- if (is_object($debug_object)) {$debug_object->debug_log(2, "after match: " . ($check ? "true" : "false"));}
632
-
633
- // handle multiple class
634
- if (!$check && strcasecmp($key, 'class')===0) {
635
- foreach (explode(' ',$node->attr[$key]) as $k) {
636
- // Without this, there were cases where leading, trailing, or double spaces lead to our comparing blanks - bad form.
637
- if (!empty($k)) {
638
- if ($lowercase) {
639
- $check = $this->match($exp, strtolower($val), strtolower($k));
640
- } else {
641
- $check = $this->match($exp, $val, $k);
642
- }
643
- if ($check) break;
644
- }
645
- }
646
- }
647
- if (!$check) $pass = false;
648
- }
649
- if ($pass) $ret[$i] = 1;
650
- unset($node);
651
- }
652
- // It's passed by reference so this is actually what this function returns.
653
- if (is_object($debug_object)) {$debug_object->debug_log(1, "EXIT - ret: ", $ret);}
654
- }
655
-
656
- protected function match($exp, $pattern, $value) {
657
- global $debug_object;
658
- if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
659
-
660
- switch ($exp) {
661
- case '=':
662
- return ($value===$pattern);
663
- case '!=':
664
- return ($value!==$pattern);
665
- case '^=':
666
- return preg_match("/^".preg_quote($pattern,'/')."/", $value);
667
- case '$=':
668
- return preg_match("/".preg_quote($pattern,'/')."$/", $value);
669
- case '*=':
670
- if ($pattern[0]=='/') {
671
- return preg_match($pattern, $value);
672
- }
673
- return preg_match("/".$pattern."/i", $value);
674
- }
675
- return false;
676
- }
677
-
678
- protected function parse_selector($selector_string) {
679
- global $debug_object;
680
- if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
681
-
682
- // pattern of CSS selectors, modified from mootools
683
- // Paperg: Add the colon to the attrbute, so that it properly finds <tag attr:ibute="something" > like google does.
684
- // Note: if you try to look at this attribute, yo MUST use getAttribute since $dom->x:y will fail the php syntax check.
685
  // Notice the \[ starting the attbute? and the @? following? This implies that an attribute can begin with an @ sign that is not captured.
686
  // This implies that an html attribute specifier may start with an @ sign that is NOT captured by the expression.
687
  // farther study is required to determine of this should be documented or removed.
688
- // $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
689
- $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-:]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
690
- preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER);
691
- if (is_object($debug_object)) {$debug_object->debug_log(2, "Matches Array: ", $matches);}
692
-
693
- $selectors = array();
694
- $result = array();
695
- //print_r($matches);
696
-
697
- foreach ($matches as $m) {
698
- $m[0] = trim($m[0]);
699
- if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue;
700
- // for browser generated xpath
701
- if ($m[1]==='tbody') continue;
702
-
703
- list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false);
704
- if (!empty($m[2])) {$key='id'; $val=$m[2];}
705
- if (!empty($m[3])) {$key='class'; $val=$m[3];}
706
- if (!empty($m[4])) {$key=$m[4];}
707
- if (!empty($m[5])) {$exp=$m[5];}
708
- if (!empty($m[6])) {$val=$m[6];}
709
-
710
- // convert to lowercase
711
- if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);}
712
- //elements that do NOT have the specified attribute
713
- if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;}
714
-
715
- $result[] = array($tag, $key, $val, $exp, $no_key);
716
- if (trim($m[7])===',') {
717
- $selectors[] = $result;
718
- $result = array();
719
- }
720
- }
721
- if (count($result)>0)
722
- $selectors[] = $result;
723
- return $selectors;
724
- }
725
-
726
- function __get($name)
727
- {
728
- if (isset($this->attr[$name]))
729
- {
730
- return $this->convert_text($this->attr[$name]);
731
- }
732
- switch ($name)
733
- {
734
- case 'outertext': return $this->outertext();
735
- case 'innertext': return $this->innertext();
736
- case 'plaintext': return $this->text();
737
- case 'xmltext': return $this->xmltext();
738
- default: return array_key_exists($name, $this->attr);
739
- }
740
- }
741
-
742
- function __set($name, $value)
743
- {
744
- global $debug_object;
745
- if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
746
-
747
- switch ($name)
748
- {
749
- case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value;
750
- case 'innertext':
751
- if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value;
752
- return $this->_[HDOM_INFO_INNER] = $value;
753
- }
754
- if (!isset($this->attr[$name]))
755
- {
756
- $this->_[HDOM_INFO_SPACE][] = array(' ', '', '');
757
- $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
758
- }
759
- $this->attr[$name] = $value;
760
- }
761
-
762
- function __isset($name)
763
- {
764
- switch ($name)
765
- {
766
- case 'outertext': return true;
767
- case 'innertext': return true;
768
- case 'plaintext': return true;
769
- }
770
- //no value attr: nowrap, checked selected...
771
- return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]);
772
- }
773
-
774
- function __unset($name) {
775
- if (isset($this->attr[$name]))
776
- unset($this->attr[$name]);
777
- }
778
-
779
- // PaperG - Function to convert the text from one character set to another if the two sets are not the same.
780
- function convert_text($text)
781
- {
782
- global $debug_object;
783
- if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
784
-
785
- $converted_text = $text;
786
-
787
- $sourceCharset = "";
788
- $targetCharset = "";
789
-
790
- if ($this->dom)
791
- {
792
- $sourceCharset = strtoupper($this->dom->_charset);
793
- $targetCharset = strtoupper($this->dom->_target_charset);
794
- }
795
- if (is_object($debug_object)) {$debug_object->debug_log(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);}
796
-
797
- if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0))
798
- {
799
- // Check if the reported encoding could have been incorrect and the text is actually already UTF-8
800
- if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text)))
801
- {
802
- $converted_text = $text;
803
- }
804
- else
805
- {
806
- $converted_text = iconv($sourceCharset, $targetCharset, $text);
807
- }
808
- }
809
-
810
- // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output.
811
- if ($targetCharset == 'UTF-8')
812
- {
813
- if (substr($converted_text, 0, 3) == "\xef\xbb\xbf")
814
- {
815
- $converted_text = substr($converted_text, 3);
816
- }
817
- if (substr($converted_text, -3) == "\xef\xbb\xbf")
818
- {
819
- $converted_text = substr($converted_text, 0, -3);
820
- }
821
- }
822
-
823
- return $converted_text;
824
- }
825
-
826
- /**
827
- * Returns true if $string is valid UTF-8 and false otherwise.
828
- *
829
- * @param mixed $str String to be tested
830
- * @return boolean
831
- */
832
- static function is_utf8($str)
833
- {
834
- $c=0; $b=0;
835
- $bits=0;
836
- $len=strlen($str);
837
- for($i=0; $i<$len; $i++)
838
- {
839
- $c=ord($str[$i]);
840
- if($c > 128)
841
- {
842
- if(($c >= 254)) return false;
843
- elseif($c >= 252) $bits=6;
844
- elseif($c >= 248) $bits=5;
845
- elseif($c >= 240) $bits=4;
846
- elseif($c >= 224) $bits=3;
847
- elseif($c >= 192) $bits=2;
848
- else return false;
849
- if(($i+$bits) > $len) return false;
850
- while($bits > 1)
851
- {
852
- $i++;
853
- $b=ord($str[$i]);
854
- if($b < 128 || $b > 191) return false;
855
- $bits--;
856
- }
857
- }
858
- }
859
- return true;
860
- }
861
- /*
862
- function is_utf8($string)
863
- {
864
- //this is buggy
865
- return (utf8_encode(utf8_decode($string)) == $string);
866
- }
867
- */
868
-
869
- /**
870
- * Function to try a few tricks to determine the displayed size of an img on the page.
871
- * NOTE: This will ONLY work on an IMG tag. Returns FALSE on all other tag types.
872
- *
873
- * @author John Schlick
874
- * @version April 19 2012
875
- * @return array an array containing the 'height' and 'width' of the image on the page or -1 if we can't figure it out.
876
- */
877
- function get_display_size()
878
- {
879
- global $debug_object;
880
-
881
- $width = -1;
882
- $height = -1;
883
-
884
- if ($this->tag !== 'img')
885
- {
886
- return false;
887
- }
888
-
889
- // See if there is aheight or width attribute in the tag itself.
890
- if (isset($this->attr['width']))
891
- {
892
- $width = $this->attr['width'];
893
- }
894
-
895
- if (isset($this->attr['height']))
896
- {
897
- $height = $this->attr['height'];
898
- }
899
-
900
- // Now look for an inline style.
901
- if (isset($this->attr['style']))
902
- {
903
- // Thanks to user gnarf from stackoverflow for this regular expression.
904
- $attributes = array();
905
- preg_match_all("/([\w-]+)\s*:\s*([^;]+)\s*;?/", $this->attr['style'], $matches, PREG_SET_ORDER);
906
- foreach ($matches as $match) {
907
- $attributes[$match[1]] = $match[2];
908
- }
909
-
910
- // If there is a width in the style attributes:
911
- if (isset($attributes['width']) && $width == -1)
912
- {
913
- // check that the last two characters are px (pixels)
914
- if (strtolower(substr($attributes['width'], -2)) == 'px')
915
- {
916
- $proposed_width = substr($attributes['width'], 0, -2);
917
- // Now make sure that it's an integer and not something stupid.
918
- if (filter_var($proposed_width, FILTER_VALIDATE_INT))
919
- {
920
- $width = $proposed_width;
921
- }
922
- }
923
- }
924
-
925
- // If there is a width in the style attributes:
926
- if (isset($attributes['height']) && $height == -1)
927
- {
928
- // check that the last two characters are px (pixels)
929
- if (strtolower(substr($attributes['height'], -2)) == 'px')
930
- {
931
- $proposed_height = substr($attributes['height'], 0, -2);
932
- // Now make sure that it's an integer and not something stupid.
933
- if (filter_var($proposed_height, FILTER_VALIDATE_INT))
934
- {
935
- $height = $proposed_height;
936
- }
937
- }
938
- }
939
-
940
- }
941
-
942
- // Future enhancement:
943
- // Look in the tag to see if there is a class or id specified that has a height or width attribute to it.
944
-
945
- // Far future enhancement
946
- // Look at all the parent tags of this image to see if they specify a class or id that has an img selector that specifies a height or width
947
- // Note that in this case, the class or id will have the img subselector for it to apply to the image.
948
-
949
- // ridiculously far future development
950
- // If the class or id is specified in a SEPARATE css file thats not on the page, go get it and do what we were just doing for the ones on the page.
951
-
952
- $result = array('height' => $height,
953
- 'width' => $width);
954
- return $result;
955
- }
956
-
957
- // camel naming conventions
958
- function getAllAttributes() {return $this->attr;}
959
- function getAttribute($name) {return $this->__get($name);}
960
- function setAttribute($name, $value) {$this->__set($name, $value);}
961
- function hasAttribute($name) {return $this->__isset($name);}
962
- function removeAttribute($name) {$this->__set($name, null);}
963
- function getElementById($id) {return $this->find("#$id", 0);}
964
- function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
965
- function getElementByTagName($name) {return $this->find($name, 0);}
966
- function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);}
967
- function parentNode() {return $this->parent();}
968
- function childNodes($idx=-1) {return $this->children($idx);}
969
- function firstChild() {return $this->first_child();}
970
- function lastChild() {return $this->last_child();}
971
- function nextSibling() {return $this->next_sibling();}
972
- function previousSibling() {return $this->prev_sibling();}
973
- function hasChildNodes() {return $this->has_child();}
974
- function nodeName() {return $this->tag;}
975
- function appendChild($node) {$node->parent($this); return $node;}
976
-
977
  }
978
 
979
  /**
@@ -984,759 +755,638 @@ class simple_html_dom_node
984
  *
985
  * @package PlaceLocalInclude
986
  */
987
- class simple_html_dom
988
- {
989
- public $root = null;
990
- public $nodes = array();
991
- public $callback = null;
992
- public $lowercase = false;
993
- // Used to keep track of how large the text was when we started.
994
- public $original_size;
995
- public $size;
996
- protected $pos;
997
- protected $doc;
998
- protected $char;
999
- protected $cursor;
1000
- protected $parent;
1001
- protected $noise = array();
1002
- protected $token_blank = " \t\r\n";
1003
- protected $token_equal = ' =/>';
1004
- protected $token_slash = " />\r\n\t";
1005
- protected $token_attr = ' >';
1006
- // Note that this is referenced by a child node, and so it needs to be public for that node to see this information.
1007
- public $_charset = '';
1008
- public $_target_charset = '';
1009
- protected $default_br_text = "";
1010
- public $default_span_text = "";
1011
-
1012
- // use isset instead of in_array, performance boost about 30%...
1013
- protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1);
1014
- protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1);
1015
- // Known sourceforge issue #2977341
1016
- // B tags that are not closed cause us to return everything to the end of the document.
1017
- protected $optional_closing_tags = array(
1018
- 'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1),
1019
- 'th'=>array('th'=>1),
1020
- 'td'=>array('td'=>1),
1021
- 'li'=>array('li'=>1),
1022
- 'dt'=>array('dt'=>1, 'dd'=>1),
1023
- 'dd'=>array('dd'=>1, 'dt'=>1),
1024
- 'dl'=>array('dd'=>1, 'dt'=>1),
1025
- 'p'=>array('p'=>1),
1026
- 'nobr'=>array('nobr'=>1),
1027
- 'b'=>array('b'=>1),
1028
- 'option'=>array('option'=>1),
1029
- );
1030
-
1031
- function __construct($str=null, $lowercase=true, $forceTagsClosed=true, $target_charset=DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
1032
- {
1033
- if ($str)
1034
- {
1035
- if (preg_match("/^http:\/\//i",$str) || is_file($str))
1036
- {
1037
- $this->load_file($str);
1038
- }
1039
- else
1040
- {
1041
- $this->load($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText);
1042
- }
1043
- }
1044
- // Forcing tags to be closed implies that we don't trust the html, but it can lead to parsing errors if we SHOULD trust the html.
1045
- if (!$forceTagsClosed) {
1046
- $this->optional_closing_array=array();
1047
- }
1048
- $this->_target_charset = $target_charset;
1049
- }
1050
-
1051
- function __destruct()
1052
- {
1053
- $this->clear();
1054
- }
1055
-
1056
- // load html from string
1057
- function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
1058
- {
1059
- global $debug_object;
1060
-
1061
- // prepare
1062
- $this->prepare($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText);
1063
- // strip out cdata
1064
- $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true);
1065
- // strip out comments
1066
- $this->remove_noise("'<!--(.*?)-->'is");
1067
- // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037
1068
- // Script tags removal now preceeds style tag removal.
1069
- // strip out <script> tags
1070
- $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");
1071
- $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");
1072
- // strip out <style> tags
1073
- $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is");
1074
- $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is");
1075
- // strip out preformatted tags
1076
- $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is");
1077
- // strip out server side scripts
1078
- $this->remove_noise("'(<\?)(.*?)(\?>)'s", true);
1079
- // strip smarty scripts
1080
- $this->remove_noise("'(\{\w)(.*?)(\})'s", true);
1081
-
1082
- // parsing
1083
- while ($this->parse());
1084
- // end
1085
- $this->root->_[HDOM_INFO_END] = $this->cursor;
1086
- $this->parse_charset();
1087
-
1088
- // make load function chainable
1089
- return $this;
1090
-
1091
- }
1092
-
1093
- // load html from file
1094
- function load_file()
1095
- {
1096
- $args = func_get_args();
1097
- $this->load(call_user_func_array('file_get_contents', $args), true);
1098
- // Throw an error if we can't properly load the dom.
1099
- if (($error=error_get_last())!==null) {
1100
- $this->clear();
1101
- return false;
1102
- }
1103
- }
1104
-
1105
- // set callback function
1106
- function set_callback($function_name)
1107
- {
1108
- $this->callback = $function_name;
1109
- }
1110
-
1111
- // remove callback function
1112
- function remove_callback()
1113
- {
1114
- $this->callback = null;
1115
- }
1116
-
1117
- // save dom as string
1118
- function save($filepath='')
1119
- {
1120
- $ret = $this->root->innertext();
1121
- if ($filepath!=='') file_put_contents($filepath, $ret, LOCK_EX);
1122
- return $ret;
1123
- }
1124
-
1125
- // find dom node by css selector
1126
- // Paperg - allow us to specify that we want case insensitive testing of the value of the selector.
1127
- function find($selector, $idx=null, $lowercase=false)
1128
- {
1129
- return $this->root->find($selector, $idx, $lowercase);
1130
- }
1131
-
1132
- // clean up memory due to php5 circular references memory leak...
1133
- function clear()
1134
- {
1135
- foreach ($this->nodes as $n) {$n->clear(); $n = null;}
1136
- // This add next line is documented in the sourceforge repository. 2977248 as a fix for ongoing memory leaks that occur even with the use of clear.
1137
- if (isset($this->children)) foreach ($this->children as $n) {$n->clear(); $n = null;}
1138
- if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);}
1139
- if (isset($this->root)) {$this->root->clear(); unset($this->root);}
1140
- unset($this->doc);
1141
- unset($this->noise);
1142
- }
1143
-
1144
- function dump($show_attr=true)
1145
- {
1146
- $this->root->dump($show_attr);
1147
- }
1148
-
1149
- // prepare HTML data and init everything
1150
- protected function prepare($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
1151
- {
1152
- $this->clear();
1153
-
1154
- // set the length of content before we do anything to it.
1155
- $this->size = strlen($str);
1156
- // Save the original size of the html that we got in. It might be useful to someone.
1157
- $this->original_size = $this->size;
1158
-
1159
- //before we save the string as the doc... strip out the \r \n's if we are told to.
1160
- if ($stripRN) {
1161
- $str = str_replace("\r", " ", $str);
1162
- $str = str_replace("\n", " ", $str);
1163
-
1164
- // set the length of content since we have changed it.
1165
- $this->size = strlen($str);
1166
- }
1167
-
1168
- $this->doc = $str;
1169
- $this->pos = 0;
1170
- $this->cursor = 1;
1171
- $this->noise = array();
1172
- $this->nodes = array();
1173
- $this->lowercase = $lowercase;
1174
- $this->default_br_text = $defaultBRText;
1175
- $this->default_span_text = $defaultSpanText;
1176
- $this->root = new simple_html_dom_node($this);
1177
- $this->root->tag = 'root';
1178
- $this->root->_[HDOM_INFO_BEGIN] = -1;
1179
- $this->root->nodetype = HDOM_TYPE_ROOT;
1180
- $this->parent = $this->root;
1181
- if ($this->size>0) $this->char = $this->doc[0];
1182
- }
1183
-
1184
- // parse html content
1185
- protected function parse()
1186
- {
1187
- if (($s = $this->copy_until_char('<'))==='')
1188
- {
1189
- return $this->read_tag();
1190
- }
1191
-
1192
- // text
1193
- $node = new simple_html_dom_node($this);
1194
- ++$this->cursor;
1195
- $node->_[HDOM_INFO_TEXT] = $s;
1196
- $this->link_nodes($node, false);
1197
- return true;
1198
- }
1199
-
1200
- // PAPERG - dkchou - added this to try to identify the character set of the page we have just parsed so we know better how to spit it out later.
1201
- // NOTE: IF you provide a routine called get_last_retrieve_url_contents_content_type which returns the CURLINFO_CONTENT_TYPE from the last curl_exec
1202
- // (or the content_type header from the last transfer), we will parse THAT, and if a charset is specified, we will use it over any other mechanism.
1203
- protected function parse_charset()
1204
- {
1205
- global $debug_object;
1206
-
1207
- $charset = null;
1208
-
1209
- if (function_exists('get_last_retrieve_url_contents_content_type'))
1210
- {
1211
- $contentTypeHeader = get_last_retrieve_url_contents_content_type();
1212
- $success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches);
1213
- if ($success)
1214
- {
1215
- $charset = $matches[1];
1216
- if (is_object($debug_object)) {$debug_object->debug_log(2, 'header content-type found charset of: ' . $charset);}
1217
- }
1218
-
1219
- }
1220
-
1221
- if (empty($charset))
1222
- {
1223
- $el = $this->root->find('meta[http-equiv=Content-Type]',0);
1224
- if (!empty($el))
1225
- {
1226
- $fullvalue = $el->content;
1227
- if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag found' . $fullvalue);}
1228
-
1229
- if (!empty($fullvalue))
1230
- {
1231
- $success = preg_match('/charset=(.+)/', $fullvalue, $matches);
1232
- if ($success)
1233
- {
1234
- $charset = $matches[1];
1235
- }
1236
- else
1237
- {
1238
- // If there is a meta tag, and they don't specify the character set, research says that it's typically ISO-8859-1
1239
- if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag couldn\'t be parsed. using iso-8859 default.');}
1240
- $charset = 'ISO-8859-1';
1241
- }
1242
- }
1243
- }
1244
- }
1245
-
1246
- // If we couldn't find a charset above, then lets try to detect one based on the text we got...
1247
- if (empty($charset))
1248
- {
1249
- // Use this in case mb_detect_charset isn't installed/loaded on this machine.
1250
- $charset = false;
1251
- if (function_exists('mb_detect_encoding'))
1252
- {
1253
- // Have php try to detect the encoding from the text given to us.
1254
- $charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) );
1255
- if (is_object($debug_object)) {$debug_object->debug_log(2, 'mb_detect found: ' . $charset);}
1256
- }
1257
-
1258
- // and if this doesn't work... then we need to just wrongheadedly assume it's UTF-8 so that we can move on - cause this will usually give us most of what we need...
1259
- if ($charset === false)
1260
- {
1261
- if (is_object($debug_object)) {$debug_object->debug_log(2, 'since mb_detect failed - using default of utf-8');}
1262
- $charset = 'UTF-8';
1263
- }
1264
- }
1265
-
1266
- // Since CP1252 is a superset, if we get one of it's subsets, we want it instead.
1267
- if ((strtolower($charset) == strtolower('ISO-8859-1')) || (strtolower($charset) == strtolower('Latin1')) || (strtolower($charset) == strtolower('Latin-1')))
1268
- {
1269
- if (is_object($debug_object)) {$debug_object->debug_log(2, 'replacing ' . $charset . ' with CP1252 as its a superset');}
1270
- $charset = 'CP1252';
1271
- }
1272
-
1273
- if (is_object($debug_object)) {$debug_object->debug_log(1, 'EXIT - ' . $charset);}
1274
-
1275
- return $this->_charset = $charset;
1276
- }
1277
-
1278
- // read tag info
1279
- protected function read_tag()
1280
- {
1281
- if ($this->char!=='<')
1282
- {
1283
- $this->root->_[HDOM_INFO_END] = $this->cursor;
1284
- return false;
1285
- }
1286
- $begin_tag_pos = $this->pos;
1287
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1288
-
1289
- // end tag
1290
- if ($this->char==='/')
1291
- {
1292
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1293
- // This represents the change in the simple_html_dom trunk from revision 180 to 181.
1294
- // $this->skip($this->token_blank_t);
1295
- $this->skip($this->token_blank);
1296
- $tag = $this->copy_until_char('>');
1297
-
1298
- // skip attributes in end tag
1299
- if (($pos = strpos($tag, ' '))!==false)
1300
- $tag = substr($tag, 0, $pos);
1301
-
1302
- $parent_lower = strtolower($this->parent->tag);
1303
- $tag_lower = strtolower($tag);
1304
-
1305
- if ($parent_lower!==$tag_lower)
1306
- {
1307
- if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower]))
1308
- {
1309
- $this->parent->_[HDOM_INFO_END] = 0;
1310
- $org_parent = $this->parent;
1311
-
1312
- while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
1313
- $this->parent = $this->parent->parent;
1314
-
1315
- if (strtolower($this->parent->tag)!==$tag_lower) {
1316
- $this->parent = $org_parent; // restore origonal parent
1317
- if ($this->parent->parent) $this->parent = $this->parent->parent;
1318
- $this->parent->_[HDOM_INFO_END] = $this->cursor;
1319
- return $this->as_text_node($tag);
1320
- }
1321
- }
1322
- else if (($this->parent->parent) && isset($this->block_tags[$tag_lower]))
1323
- {
1324
- $this->parent->_[HDOM_INFO_END] = 0;
1325
- $org_parent = $this->parent;
1326
-
1327
- while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
1328
- $this->parent = $this->parent->parent;
1329
-
1330
- if (strtolower($this->parent->tag)!==$tag_lower)
1331
- {
1332
- $this->parent = $org_parent; // restore origonal parent
1333
- $this->parent->_[HDOM_INFO_END] = $this->cursor;
1334
- return $this->as_text_node($tag);
1335
- }
1336
- }
1337
- else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower)
1338
- {
1339
- $this->parent->_[HDOM_INFO_END] = 0;
1340
- $this->parent = $this->parent->parent;
1341
- }
1342
- else
1343
- return $this->as_text_node($tag);
1344
- }
1345
-
1346
- $this->parent->_[HDOM_INFO_END] = $this->cursor;
1347
- if ($this->parent->parent) $this->parent = $this->parent->parent;
1348
-
1349
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1350
- return true;
1351
- }
1352
-
1353
- $node = new simple_html_dom_node($this);
1354
- $node->_[HDOM_INFO_BEGIN] = $this->cursor;
1355
- ++$this->cursor;
1356
- $tag = $this->copy_until($this->token_slash);
1357
- $node->tag_start = $begin_tag_pos;
1358
-
1359
- // doctype, cdata & comments...
1360
- if (isset($tag[0]) && $tag[0]==='!') {
1361
- $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>');
1362
-
1363
- if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') {
1364
- $node->nodetype = HDOM_TYPE_COMMENT;
1365
- $node->tag = 'comment';
1366
- } else {
1367
- $node->nodetype = HDOM_TYPE_UNKNOWN;
1368
- $node->tag = 'unknown';
1369
- }
1370
- if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
1371
- $this->link_nodes($node, true);
1372
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1373
- return true;
1374
- }
1375
-
1376
- // text
1377
- if ($pos=strpos($tag, '<')!==false) {
1378
- $tag = '<' . substr($tag, 0, -1);
1379
- $node->_[HDOM_INFO_TEXT] = $tag;
1380
- $this->link_nodes($node, false);
1381
- $this->char = $this->doc[--$this->pos]; // prev
1382
- return true;
1383
- }
1384
-
1385
- if (!preg_match("/^[\w-:]+$/", $tag)) {
1386
- $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>');
1387
- if ($this->char==='<') {
1388
- $this->link_nodes($node, false);
1389
- return true;
1390
- }
1391
-
1392
- if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
1393
- $this->link_nodes($node, false);
1394
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1395
- return true;
1396
- }
1397
-
1398
- // begin tag
1399
- $node->nodetype = HDOM_TYPE_ELEMENT;
1400
- $tag_lower = strtolower($tag);
1401
- $node->tag = ($this->lowercase) ? $tag_lower : $tag;
1402
-
1403
- // handle optional closing tags
1404
- if (isset($this->optional_closing_tags[$tag_lower]) )
1405
- {
1406
- while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)]))
1407
- {
1408
- $this->parent->_[HDOM_INFO_END] = 0;
1409
- $this->parent = $this->parent->parent;
1410
- }
1411
- $node->parent = $this->parent;
1412
- }
1413
-
1414
- $guard = 0; // prevent infinity loop
1415
- $space = array($this->copy_skip($this->token_blank), '', '');
1416
-
1417
- // attributes
1418
- do
1419
- {
1420
- if ($this->char!==null && $space[0]==='')
1421
- {
1422
- break;
1423
- }
1424
- $name = $this->copy_until($this->token_equal);
1425
- if ($guard===$this->pos)
1426
- {
1427
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1428
- continue;
1429
- }
1430
- $guard = $this->pos;
1431
-
1432
- // handle endless '<'
1433
- if ($this->pos>=$this->size-1 && $this->char!=='>') {
1434
- $node->nodetype = HDOM_TYPE_TEXT;
1435
- $node->_[HDOM_INFO_END] = 0;
1436
- $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name;
1437
- $node->tag = 'text';
1438
- $this->link_nodes($node, false);
1439
- return true;
1440
- }
1441
-
1442
- // handle mismatch '<'
1443
- if ($this->doc[$this->pos-1]=='<') {
1444
- $node->nodetype = HDOM_TYPE_TEXT;
1445
- $node->tag = 'text';
1446
- $node->attr = array();
1447
- $node->_[HDOM_INFO_END] = 0;
1448
- $node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1);
1449
- $this->pos -= 2;
1450
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1451
- $this->link_nodes($node, false);
1452
- return true;
1453
- }
1454
-
1455
- if ($name!=='/' && $name!=='') {
1456
- $space[1] = $this->copy_skip($this->token_blank);
1457
- $name = $this->restore_noise($name);
1458
- if ($this->lowercase) $name = strtolower($name);
1459
- if ($this->char==='=') {
1460
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1461
- $this->parse_attr($node, $name, $space);
1462
- }
1463
- else {
1464
- //no value attr: nowrap, checked selected...
1465
- $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
1466
- $node->attr[$name] = true;
1467
- if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev
1468
- }
1469
- $node->_[HDOM_INFO_SPACE][] = $space;
1470
- $space = array($this->copy_skip($this->token_blank), '', '');
1471
- }
1472
- else
1473
- break;
1474
- } while ($this->char!=='>' && $this->char!=='/');
1475
-
1476
- $this->link_nodes($node, true);
1477
- $node->_[HDOM_INFO_ENDSPACE] = $space[0];
1478
-
1479
- // check self closing
1480
- if ($this->copy_until_char_escape('>')==='/')
1481
- {
1482
- $node->_[HDOM_INFO_ENDSPACE] .= '/';
1483
- $node->_[HDOM_INFO_END] = 0;
1484
- }
1485
- else
1486
- {
1487
- // reset parent
1488
- if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node;
1489
- }
1490
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1491
-
1492
- // If it's a BR tag, we need to set it's text to the default text.
1493
- // This way when we see it in plaintext, we can generate formatting that the user wants.
1494
- // since a br tag never has sub nodes, this works well.
1495
- if ($node->tag == "br")
1496
- {
1497
- $node->_[HDOM_INFO_INNER] = $this->default_br_text;
1498
- }
1499
-
1500
- return true;
1501
- }
1502
-
1503
- // parse attributes
1504
- protected function parse_attr($node, $name, &$space)
1505
- {
1506
- // Per sourceforge: http://sourceforge.net/tracker/?func=detail&aid=3061408&group_id=218559&atid=1044037
1507
- // If the attribute is already defined inside a tag, only pay atetntion to the first one as opposed to the last one.
1508
- if (isset($node->attr[$name]))
1509
- {
1510
- return;
1511
- }
1512
-
1513
- $space[2] = $this->copy_skip($this->token_blank);
1514
- switch ($this->char) {
1515
- case '"':
1516
- $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
1517
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1518
- $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"'));
1519
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1520
- break;
1521
- case '\'':
1522
- $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE;
1523
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1524
- $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('\''));
1525
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1526
- break;
1527
- default:
1528
- $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
1529
- $node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr));
1530
- }
1531
- // PaperG: Attributes should not have \r or \n in them, that counts as html whitespace.
1532
- $node->attr[$name] = str_replace("\r", "", $node->attr[$name]);
1533
- $node->attr[$name] = str_replace("\n", "", $node->attr[$name]);
1534
- // PaperG: If this is a "class" selector, lets get rid of the preceeding and trailing space since some people leave it in the multi class case.
1535
- if ($name == "class") {
1536
- $node->attr[$name] = trim($node->attr[$name]);
1537
- }
1538
- }
1539
-
1540
- // link node's parent
1541
- protected function link_nodes(&$node, $is_child)
1542
- {
1543
- $node->parent = $this->parent;
1544
- $this->parent->nodes[] = $node;
1545
- if ($is_child)
1546
- {
1547
- $this->parent->children[] = $node;
1548
- }
1549
- }
1550
-
1551
- // as a text node
1552
- protected function as_text_node($tag)
1553
- {
1554
- $node = new simple_html_dom_node($this);
1555
- ++$this->cursor;
1556
- $node->_[HDOM_INFO_TEXT] = '</' . $tag . '>';
1557
- $this->link_nodes($node, false);
1558
- $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1559
- return true;
1560
- }
1561
-
1562
- protected function skip($chars)
1563
- {
1564
- $this->pos += strspn($this->doc, $chars, $this->pos);
1565
- $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1566
- }
1567
-
1568
- protected function copy_skip($chars)
1569
- {
1570
- $pos = $this->pos;
1571
- $len = strspn($this->doc, $chars, $pos);
1572
- $this->pos += $len;
1573
- $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1574
- if ($len===0) return '';
1575
- return substr($this->doc, $pos, $len);
1576
- }
1577
-
1578
- protected function copy_until($chars)
1579
- {
1580
- $pos = $this->pos;
1581
- $len = strcspn($this->doc, $chars, $pos);
1582
- $this->pos += $len;
1583
- $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1584
- return substr($this->doc, $pos, $len);
1585
- }
1586
-
1587
- protected function copy_until_char($char)
1588
- {
1589
- if ($this->char===null) return '';
1590
-
1591
- if (($pos = strpos($this->doc, $char, $this->pos))===false) {
1592
- $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
1593
- $this->char = null;
1594
- $this->pos = $this->size;
1595
- return $ret;
1596
- }
1597
-
1598
- if ($pos===$this->pos) return '';
1599
- $pos_old = $this->pos;
1600
- $this->char = $this->doc[$pos];
1601
- $this->pos = $pos;
1602
- return substr($this->doc, $pos_old, $pos-$pos_old);
1603
- }
1604
-
1605
- protected function copy_until_char_escape($char)
1606
- {
1607
- if ($this->char===null) return '';
1608
-
1609
- $start = $this->pos;
1610
- while (1)
1611
- {
1612
- if (($pos = strpos($this->doc, $char, $start))===false)
1613
- {
1614
- $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
1615
- $this->char = null;
1616
- $this->pos = $this->size;
1617
- return $ret;
1618
- }
1619
-
1620
- if ($pos===$this->pos) return '';
1621
-
1622
- if ($this->doc[$pos-1]==='\\') {
1623
- $start = $pos+1;
1624
- continue;
1625
- }
1626
-
1627
- $pos_old = $this->pos;
1628
- $this->char = $this->doc[$pos];
1629
- $this->pos = $pos;
1630
- return substr($this->doc, $pos_old, $pos-$pos_old);
1631
- }
1632
- }
1633
-
1634
- // remove noise from html content
1635
- // save the noise in the $this->noise array.
1636
- protected function remove_noise($pattern, $remove_tag=false)
1637
- {
1638
- global $debug_object;
1639
- if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
1640
-
1641
- $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
1642
-
1643
- for ($i=$count-1; $i>-1; --$i)
1644
- {
1645
- $key = '___noise___'.sprintf('% 5d', count($this->noise)+1000);
1646
- if (is_object($debug_object)) { $debug_object->debug_log(2, 'key is: ' . $key); }
1647
- $idx = ($remove_tag) ? 0 : 1;
1648
- $this->noise[$key] = $matches[$i][$idx][0];
1649
- $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
1650
- }
1651
-
1652
- // reset the length of content
1653
- $this->size = strlen($this->doc);
1654
- if ($this->size>0)
1655
- {
1656
- $this->char = $this->doc[0];
1657
- }
1658
- }
1659
-
1660
- // restore noise to html content
1661
- function restore_noise($text)
1662
- {
1663
- global $debug_object;
1664
- if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
1665
-
1666
- while (($pos=strpos($text, '___noise___'))!==false)
1667
- {
1668
- // Sometimes there is a broken piece of markup, and we don't GET the pos+11 etc... token which indicates a problem outside of us...
1669
- if (strlen($text) > $pos+15)
1670
- {
1671
- $key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13].$text[$pos+14].$text[$pos+15];
1672
- if (is_object($debug_object)) { $debug_object->debug_log(2, 'located key of: ' . $key); }
1673
-
1674
- if (isset($this->noise[$key]))
1675
- {
1676
- $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+16);
1677
- }
1678
- else
1679
- {
1680
- // do this to prevent an infinite loop.
1681
- $text = substr($text, 0, $pos).'UNDEFINED NOISE FOR KEY: '.$key . substr($text, $pos+16);
1682
- }
1683
- }
1684
- else
1685
- {
1686
- // There is no valid key being given back to us... We must get rid of the ___noise___ or we will have a problem.
1687
- $text = substr($text, 0, $pos).'NO NUMERIC NOISE KEY' . substr($text, $pos+11);
1688
- }
1689
- }
1690
- return $text;
1691
- }
1692
-
1693
- // Sometimes we NEED one of the noise elements.
1694
- function search_noise($text)
1695
- {
1696
- global $debug_object;
1697
- if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
1698
-
1699
- foreach($this->noise as $noiseElement)
1700
- {
1701
- if (strpos($noiseElement, $text)!==false)
1702
- {
1703
- return $noiseElement;
1704
- }
1705
- }
1706
- }
1707
- function __toString()
1708
- {
1709
- return $this->root->innertext();
1710
- }
1711
-
1712
- function __get($name)
1713
- {
1714
- switch ($name)
1715
- {
1716
- case 'outertext':
1717
- return $this->root->innertext();
1718
- case 'innertext':
1719
- return $this->root->innertext();
1720
- case 'plaintext':
1721
- return $this->root->text();
1722
- case 'charset':
1723
- return $this->_charset;
1724
- case 'target_charset':
1725
- return $this->_target_charset;
1726
- }
1727
- }
1728
-
1729
- // camel naming conventions
1730
- function childNodes($idx=-1) {return $this->root->childNodes($idx);}
1731
- function firstChild() {return $this->root->first_child();}
1732
- function lastChild() {return $this->root->last_child();}
1733
- function createElement($name, $value=null) {return @str_get_html("<$name>$value</$name>")->first_child();}
1734
- function createTextNode($value) {return @end(str_get_html($value)->nodes);}
1735
- function getElementById($id) {return $this->find("#$id", 0);}
1736
- function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
1737
- function getElementByTagName($name) {return $this->find($name, 0);}
1738
- function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);}
1739
- function loadFile() {$args = func_get_args();$this->load_file($args);}
1740
  }
1741
 
1742
  ?>
1
  <?php
2
  /**
3
  * Website: http://sourceforge.net/projects/simplehtmldom/
 
4
  * Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/)
5
  * Contributions by:
6
+ * Yousuke Kumakura (Attribute filters)
7
+ * Vadim Voituk (Negative indexes supports of "find" method)
8
+ * Antcs (Constructor with automatically load contents either text or file/url)
9
  *
10
  * all affected sections have comments starting with "PaperG"
11
  *
24
  * NOTE: If the user's system has a routine called get_last_retrieve_url_contents_content_type availalbe, we will assume it's returning the content-type header from the
25
  * last transfer or curl_exec, and we will parse that and use it in preference to any other method of charset detection.
26
  *
 
 
 
27
  * Licensed under The MIT License
28
  * Redistributions of files must retain the above copyright notice.
29
  *
30
  * @author S.C. Chen <me578022@gmail.com>
31
  * @author John Schlick
32
  * @author Rus Carroll
33
+ * @version 1.11 ($Rev: 184 $)
34
  * @package PlaceLocalInclude
35
  * @subpackage simple_html_dom
36
  */
41
  */
42
  define('HDOM_TYPE_ELEMENT', 1);
43
  define('HDOM_TYPE_COMMENT', 2);
44
+ define('HDOM_TYPE_TEXT', 3);
45
  define('HDOM_TYPE_ENDTAG', 4);
46
+ define('HDOM_TYPE_ROOT', 5);
47
  define('HDOM_TYPE_UNKNOWN', 6);
48
  define('HDOM_QUOTE_DOUBLE', 0);
49
  define('HDOM_QUOTE_SINGLE', 1);
50
+ define('HDOM_QUOTE_NO', 3);
51
  define('HDOM_INFO_BEGIN', 0);
52
+ define('HDOM_INFO_END', 1);
53
  define('HDOM_INFO_QUOTE', 2);
54
  define('HDOM_INFO_SPACE', 3);
55
+ define('HDOM_INFO_TEXT', 4);
56
  define('HDOM_INFO_INNER', 5);
57
  define('HDOM_INFO_OUTER', 6);
58
  define('HDOM_INFO_ENDSPACE',7);
59
  define('DEFAULT_TARGET_CHARSET', 'UTF-8');
60
  define('DEFAULT_BR_TEXT', "\r\n");
 
 
61
  // helper functions
62
  // -----------------------------------------------------------------------------
63
  // get html dom from file
64
  // $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1.
65
+ function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT)
66
  {
67
+ // We DO force the tags to be terminated.
68
+ $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $defaultBRText);
69
+ // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
70
+ $contents = file_get_contents($url, $use_include_path, $context, $offset);
71
+ // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
72
+ // $contents = retrieve_url_contents($url);
73
+ if (empty($contents))
74
+ {
75
+ return false;
76
+ }
77
+ // The second parameter can force the selectors to all be lowercase.
78
+ $dom->load($contents, $lowercase, $stripRN);
79
+ return $dom;
80
  }
81
 
82
  // get html dom from string
83
+ function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT)
84
  {
85
+ $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $defaultBRText);
86
+ if (empty($str))
87
+ {
88
+ $dom->clear();
89
+ return false;
90
+ }
91
+ $dom->load($str, $lowercase, $stripRN);
92
+ return $dom;
93
  }
94
 
95
  // dump html dom tree
96
  function dump_html_tree($node, $show_attr=true, $deep=0)
97
  {
98
+ $node->dump($node);
99
  }
100
 
 
101
  /**
102
  * simple html dom node
103
  * PaperG - added ability for "find" routine to lowercase the value of the selector.
105
  *
106
  * @package PlaceLocalInclude
107
  */
108
+ class simple_html_dom_node {
109
+ public $nodetype = HDOM_TYPE_TEXT;
110
+ public $tag = 'text';
111
+ public $attr = array();
112
+ public $children = array();
113
+ public $nodes = array();
114
+ public $parent = null;
115
+ public $_ = array();
116
+ public $tag_start = 0;
117
+ private $dom = null;
118
+
119
+ function __construct($dom)
120
+ {
121
+ $this->dom = $dom;
122
+ $dom->nodes[] = $this;
123
+ }
124
+
125
+ function __destruct()
126
+ {
127
+ $this->clear();
128
+ }
129
+
130
+ function __toString()
131
+ {
132
+ return $this->outertext();
133
+ }
134
+
135
+ // clean up memory due to php5 circular references memory leak...
136
+ function clear()
137
+ {
138
+ $this->dom = null;
139
+ $this->nodes = null;
140
+ $this->parent = null;
141
+ $this->children = null;
142
+ }
143
+
144
+ // dump node's tree
145
+ function dump($show_attr=true, $deep=0)
146
+ {
147
+ $lead = str_repeat(' ', $deep);
148
+
149
+ echo $lead.$this->tag;
150
+ if ($show_attr && count($this->attr)>0)
151
+ {
152
+ echo '(';
153
+ foreach ($this->attr as $k=>$v)
154
+ echo "[$k]=>\"".$this->$k.'", ';
155
+ echo ')';
156
+ }
157
+ echo "\n";
158
+
159
+ foreach ($this->nodes as $c)
160
+ $c->dump($show_attr, $deep+1);
161
+ }
162
+
163
+
164
+ // Debugging function to dump a single dom node with a bunch of information about it.
165
+ function dump_node()
166
+ {
167
+ echo $this->tag;
168
+ if (count($this->attr)>0)
169
+ {
170
+ echo '(';
171
+ foreach ($this->attr as $k=>$v)
172
+ {
173
+ echo "[$k]=>\"".$this->$k.'", ';
174
+ }
175
+ echo ')';
176
+ }
177
+ if (count($this->attr)>0)
178
+ {
179
+ echo ' $_ (';
180
+ foreach ($this->_ as $k=>$v)
181
+ {
182
+ if (is_array($v))
183
+ {
184
+ echo "[$k]=>(";
185
+ foreach ($v as $k2=>$v2)
186
+ {
187
+ echo "[$k2]=>\"".$v2.'", ';
188
+ }
189
+ echo ")";
190
+ } else {
191
+ echo "[$k]=>\"".$v.'", ';
192
+ }
193
+ }
194
+ echo ")";
195
+ }
196
+
197
+ if (isset($this->text))
198
+ {
199
+ echo " text: (" . $this->text . ")";
200
+ }
201
+
202
+ echo " children: " . count($this->children);
203
+ echo " nodes: " . count($this->nodes);
204
+ echo " tag_start: " . $this->tag_start;
205
+ echo "\n";
206
+
207
+ }
208
+
209
+ // returns the parent of node
210
+ function parent()
211
+ {
212
+ return $this->parent;
213
+ }
214
+
215
+ // returns children of node
216
+ function children($idx=-1)
217
+ {
218
+ if ($idx===-1) return $this->children;
219
+ if (isset($this->children[$idx])) return $this->children[$idx];
220
+ return null;
221
+ }
222
+
223
+ // returns the first child of node
224
+ function first_child()
225
+ {
226
+ if (count($this->children)>0) return $this->children[0];
227
+ return null;
228
+ }
229
+
230
+ // returns the last child of node
231
+ function last_child()
232
+ {
233
+ if (($count=count($this->children))>0) return $this->children[$count-1];
234
+ return null;
235
+ }
236
+
237
+ // returns the next sibling of node
238
+ function next_sibling()
239
+ {
240
+ if ($this->parent===null) return null;
241
+ $idx = 0;
242
+ $count = count($this->parent->children);
243
+ while ($idx<$count && $this!==$this->parent->children[$idx])
244
+ ++$idx;
245
+ if (++$idx>=$count) return null;
246
+ return $this->parent->children[$idx];
247
+ }
248
+
249
+ // returns the previous sibling of node
250
+ function prev_sibling()
251
+ {
252
+ if ($this->parent===null) return null;
253
+ $idx = 0;
254
+ $count = count($this->parent->children);
255
+ while ($idx<$count && $this!==$this->parent->children[$idx])
256
+ ++$idx;
257
+ if (--$idx<0) return null;
258
+ return $this->parent->children[$idx];
259
+ }
260
+
261
+ // function to locate a specific ancestor tag in the path to the root.
262
+ function find_ancestor_tag($tag)
263
+ {
264
+ global $debugObject;
265
+ if (is_object($debugObject))
266
+ {
267
+ $debugObject->debugLogEntry(1);
268
+ }
269
+
270
+ // Start by including ourselves in the comparison.
271
+ $returnDom = $this;
272
+
273
+ while (!is_null($returnDom))
274
+ {
275
+ if (is_object($debugObject))
276
+ {
277
+ $debugObject->debugLog(2, "Current tag is: " . $returnDom->tag);
278
+ }
279
+
280
+ if ($returnDom->tag == $tag)
281
+ {
282
+ break;
283
+ }
284
+ $returnDom = $returnDom->parent;
285
+ }
286
+ return $returnDom;
287
+ }
288
+
289
+ // get dom node's inner html
290
+ function innertext()
291
+ {
292
+ if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
293
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
294
+
295
+ $ret = '';
296
+ foreach ($this->nodes as $n)
297
+ $ret .= $n->outertext();
298
+ return $ret;
299
+ }
300
+
301
+ // get dom node's outer text (with tag)
302
+ function outertext()
303
+ {
304
+ global $debugObject;
305
+ if (is_object($debugObject))
306
+ {
307
+ $text = '';
308
+ if ($this->tag == 'text')
309
+ {
310
+ if (!empty($this->text))
311
+ {
312
+ $text = " with text: " . $this->text;
313
+ }
314
+ }
315
+ $debugObject->debugLog(1, 'Innertext of tag: ' . $this->tag . $text);
316
+ }
317
+
318
+ if ($this->tag==='root') return $this->innertext();
319
+
320
+ // trigger callback
321
+ if ($this->dom && $this->dom->callback!==null)
322
+ {
323
+ call_user_func_array($this->dom->callback, array($this));
324
+ }
325
+
326
+ if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER];
327
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
328
+
329
+ // render begin tag
330
+ if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]])
331
+ {
332
+ $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();
333
+ } else {
334
+ $ret = "";
335
+ }
336
+
337
+ // render inner text
338
+ if (isset($this->_[HDOM_INFO_INNER]))
339
+ {
340
+ // If it's a br tag... don't return the HDOM_INNER_INFO that we may or may not have added.
341
+ if ($this->tag != "br")
342
+ {
343
+ $ret .= $this->_[HDOM_INFO_INNER];
344
+ }
345
+ } else {
346
+ if ($this->nodes)
347
+ {
348
+ foreach ($this->nodes as $n)
349
+ {
350
+ $ret .= $this->convert_text($n->outertext());
351
+ }
352
+ }
353
+ }
354
+
355
+ // render end tag
356
+ if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)
357
+ $ret .= '</'.$this->tag.'>';
358
+ return $ret;
359
+ }
360
+
361
+ // get dom node's plain text
362
+ function text()
363
+ {
364
+ if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
365
+ switch ($this->nodetype)
366
+ {
367
+ case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
368
+ case HDOM_TYPE_COMMENT: return '';
369
+ case HDOM_TYPE_UNKNOWN: return '';
370
+ }
371
+ if (strcasecmp($this->tag, 'script')===0) return '';
372
+ if (strcasecmp($this->tag, 'style')===0) return '';
373
+
374
+ $ret = '';
375
+ // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed for some span tags, and some p tags) $this->nodes is set to NULL.
376
+ // NOTE: This indicates that there is a problem where it's set to NULL without a clear happening.
377
+ // WHY is this happening?
378
+ if (!is_null($this->nodes))
379
+ {
380
+ foreach ($this->nodes as $n)
381
+ {
382
+ $ret .= $this->convert_text($n->text());
383
+ }
384
+ }
385
+ return $ret;
386
+ }
387
+
388
+ function xmltext()
389
+ {
390
+ $ret = $this->innertext();
391
+ $ret = str_ireplace('<![CDATA[', '', $ret);
392
+ $ret = str_replace(']]>', '', $ret);
393
+ return $ret;
394
+ }
395
+
396
+ // build node's text with tag
397
+ function makeup()
398
+ {
399
+ // text, comment, unknown
400
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
401
+
402
+ $ret = '<'.$this->tag;
403
+ $i = -1;
404
+
405
+ foreach ($this->attr as $key=>$val)
406
+ {
407
+ ++$i;
408
+
409
+ // skip removed attribute
410
+ if ($val===null || $val===false)
411
+ continue;
412
+
413
+ $ret .= $this->_[HDOM_INFO_SPACE][$i][0];
414
+ //no value attr: nowrap, checked selected...
415
+ if ($val===true)
416
+ $ret .= $key;
417
+ else {
418
+ switch ($this->_[HDOM_INFO_QUOTE][$i])
419
+ {
420
+ case HDOM_QUOTE_DOUBLE: $quote = '"'; break;
421
+ case HDOM_QUOTE_SINGLE: $quote = '\''; break;
422
+ default: $quote = '';
423
+ }
424
+ $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;
425
+ }
426
+ }
427
+ $ret = $this->dom->restore_noise($ret);
428
+ return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';
429
+ }
430
+
431
+ // find elements by css selector
432
+ //PaperG - added ability for find to lowercase the value of the selector.
433
+ function find($selector, $idx=null, $lowercase=false)
434
+ {
435
+ $selectors = $this->parse_selector($selector);
436
+ if (($count=count($selectors))===0) return array();
437
+ $found_keys = array();
438
+
439
+ // find each selector
440
+ for ($c=0; $c<$count; ++$c)
441
+ {
442
+ // The change on the below line was documented on the sourceforge code tracker id 2788009
443
+ // used to be: if (($levle=count($selectors[0]))===0) return array();
444
+ if (($levle=count($selectors[$c]))===0) return array();
445
+ if (!isset($this->_[HDOM_INFO_BEGIN])) return array();
446
+
447
+ $head = array($this->_[HDOM_INFO_BEGIN]=>1);
448
+
449
+ // handle descendant selectors, no recursive!
450
+ for ($l=0; $l<$levle; ++$l)
451
+ {
452
+ $ret = array();
453
+ foreach ($head as $k=>$v)
454
+ {
455
+ $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k];
456
+ //PaperG - Pass this optional parameter on to the seek function.
457
+ $n->seek($selectors[$c][$l], $ret, $lowercase);
458
+ }
459
+ $head = $ret;
460
+ }
461
+
462
+ foreach ($head as $k=>$v)
463
+ {
464
+ if (!isset($found_keys[$k]))
465
+ $found_keys[$k] = 1;
466
+ }
467
+ }
468
+
469
+ // sort keys
470
+ ksort($found_keys);
471
+
472
+ $found = array();
473
+ foreach ($found_keys as $k=>$v)
474
+ $found[] = $this->dom->nodes[$k];
475
+
476
+ // return nth-element or array
477
+ if (is_null($idx)) return $found;
478
+ else if ($idx<0) $idx = count($found) + $idx;
479
+ return (isset($found[$idx])) ? $found[$idx] : null;
480
+ }
481
+
482
+ // seek for given conditions
483
+ // PaperG - added parameter to allow for case insensitive testing of the value of a selector.
484
+ protected function seek($selector, &$ret, $lowercase=false)
485
+ {
486
+ global $debugObject;
487
+ if (is_object($debugObject))
488
+ {
489
+ $debugObject->debugLogEntry(1);
490
+ }
491
+
492
+ list($tag, $key, $val, $exp, $no_key) = $selector;
493
+
494
+ // xpath index
495
+ if ($tag && $key && is_numeric($key))
496
+ {
497
+ $count = 0;
498
+ foreach ($this->children as $c)
499
+ {
500
+ if ($tag==='*' || $tag===$c->tag) {
501
+ if (++$count==$key) {
502
+ $ret[$c->_[HDOM_INFO_BEGIN]] = 1;
503
+ return;
504
+ }
505
+ }
506
+ }
507
+ return;
508
+ }
509
+
510
+ $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
511
+ if ($end==0) {
512
+ $parent = $this->parent;
513
+ while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) {
514
+ $end -= 1;
515
+ $parent = $parent->parent;
516
+ }
517
+ $end += $parent->_[HDOM_INFO_END];
518
+ }
519
+
520
+ for ($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) {
521
+ $node = $this->dom->nodes[$i];
522
+
523
+ $pass = true;
524
+
525
+ if ($tag==='*' && !$key) {
526
+ if (in_array($node, $this->children, true))
527
+ $ret[$i] = 1;
528
+ continue;
529
+ }
530
+
531
+ // compare tag
532
+ if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;}
533
+ // compare key
534
+ if ($pass && $key) {
535
+ if ($no_key) {
536
+ if (isset($node->attr[$key])) $pass=false;
537
+ } else {
538
+ if (($key != "plaintext") && !isset($node->attr[$key])) $pass=false;
539
+ }
540
+ }
541
+ // compare value
542
+ if ($pass && $key && $val && $val!=='*') {
543
+ // If they have told us that this is a "plaintext" search then we want the plaintext of the node - right?
544
+ if ($key == "plaintext") {
545
+ // $node->plaintext actually returns $node->text();
546
+ $nodeKeyValue = $node->text();
547
+ } else {
548
+ // this is a normal search, we want the value of that attribute of the tag.
549
+ $nodeKeyValue = $node->attr[$key];
550
+ }
551
+ if (is_object($debugObject)) {$debugObject->debugLog(2, "testing node: " . $node->tag . " for attribute: " . $key . $exp . $val . " where nodes value is: " . $nodeKeyValue);}
552
+
553
+ //PaperG - If lowercase is set, do a case insensitive test of the value of the selector.
554
+ if ($lowercase) {
555
+ $check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue));
556
+ } else {
557
+ $check = $this->match($exp, $val, $nodeKeyValue);
558
+ }
559
+ if (is_object($debugObject)) {$debugObject->debugLog(2, "after match: " . ($check ? "true" : "false"));}
560
+
561
+ // handle multiple class
562
+ if (!$check && strcasecmp($key, 'class')===0) {
563
+ foreach (explode(' ',$node->attr[$key]) as $k) {
564
+ // Without this, there were cases where leading, trailing, or double spaces lead to our comparing blanks - bad form.
565
+ if (!empty($k)) {
566
+ if ($lowercase) {
567
+ $check = $this->match($exp, strtolower($val), strtolower($k));
568
+ } else {
569
+ $check = $this->match($exp, $val, $k);
570
+ }
571
+ if ($check) break;
572
+ }
573
+ }
574
+ }
575
+ if (!$check) $pass = false;
576
+ }
577
+ if ($pass) $ret[$i] = 1;
578
+ unset($node);
579
+ }
580
+ // It's passed by reference so this is actually what this function returns.
581
+ if (is_object($debugObject)) {$debugObject->debugLog(1, "EXIT - ret: ", $ret);}
582
+ }
583
+
584
+ protected function match($exp, $pattern, $value) {
585
+ global $debugObject;
586
+ if (is_object($debugObject)) {$debugObject->debugLogEntry(1);}
587
+
588
+ switch ($exp) {
589
+ case '=':
590
+ return ($value===$pattern);
591
+ case '!=':
592
+ return ($value!==$pattern);
593
+ case '^=':
594
+ return preg_match("/^".preg_quote($pattern,'/')."/", $value);
595
+ case '$=':
596
+ return preg_match("/".preg_quote($pattern,'/')."$/", $value);
597
+ case '*=':
598
+ if ($pattern[0]=='/') {
599
+ return preg_match($pattern, $value);
600
+ }
601
+ return preg_match("/".$pattern."/i", $value);
602
+ }
603
+ return false;
604
+ }
605
+
606
+ protected function parse_selector($selector_string) {
607
+ global $debugObject;
608
+ if (is_object($debugObject)) {$debugObject->debugLogEntry(1);}
609
+
610
+ // pattern of CSS selectors, modified from mootools
611
+ // Paperg: Add the colon to the attrbute, so that it properly finds <tag attr:ibute="something" > like google does.
612
+ // Note: if you try to look at this attribute, yo MUST use getAttribute since $dom->x:y will fail the php syntax check.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
613
  // Notice the \[ starting the attbute? and the @? following? This implies that an attribute can begin with an @ sign that is not captured.
614
  // This implies that an html attribute specifier may start with an @ sign that is NOT captured by the expression.
615
  // farther study is required to determine of this should be documented or removed.
616
+ // $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
617
+ $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-:]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
618
+ preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER);
619
+ if (is_object($debugObject)) {$debugObject->debugLog(2, "Matches Array: ", $matches);}
620
+
621
+ $selectors = array();
622
+ $result = array();
623
+
624
+ foreach ($matches as $m) {
625
+ $m[0] = trim($m[0]);
626
+ if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue;
627
+ // for browser generated xpath
628
+ if ($m[1]==='tbody') continue;
629
+
630
+ list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false);
631
+ if (!empty($m[2])) {$key='id'; $val=$m[2];}
632
+ if (!empty($m[3])) {$key='class'; $val=$m[3];}
633
+ if (!empty($m[4])) {$key=$m[4];}
634
+ if (!empty($m[5])) {$exp=$m[5];}
635
+ if (!empty($m[6])) {$val=$m[6];}
636
+
637
+ // convert to lowercase
638
+ if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);}
639
+ //elements that do NOT have the specified attribute
640
+ if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;}
641
+
642
+ $result[] = array($tag, $key, $val, $exp, $no_key);
643
+ if (trim($m[7])===',') {
644
+ $selectors[] = $result;
645
+ $result = array();
646
+ }
647
+ }
648
+ if (count($result)>0)
649
+ $selectors[] = $result;
650
+ return $selectors;
651
+ }
652
+
653
+ function __get($name) {
654
+ if (isset($this->attr[$name]))
655
+ {
656
+ return $this->convert_text($this->attr[$name]);
657
+ }
658
+ switch ($name) {
659
+ case 'outertext': return $this->outertext();
660
+ case 'innertext': return $this->innertext();
661
+ case 'plaintext': return $this->text();
662
+ case 'xmltext': return $this->xmltext();
663
+ default: return array_key_exists($name, $this->attr);
664
+ }
665
+ }
666
+
667
+ function __set($name, $value) {
668
+ switch ($name) {
669
+ case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value;
670
+ case 'innertext':
671
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value;
672
+ return $this->_[HDOM_INFO_INNER] = $value;
673
+ }
674
+ if (!isset($this->attr[$name])) {
675
+ $this->_[HDOM_INFO_SPACE][] = array(' ', '', '');
676
+ $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
677
+ }
678
+ $this->attr[$name] = $value;
679
+ }
680
+
681
+ function __isset($name) {
682
+ switch ($name) {
683
+ case 'outertext': return true;
684
+ case 'innertext': return true;
685
+ case 'plaintext': return true;
686
+ }
687
+ //no value attr: nowrap, checked selected...
688
+ return (array_key_exists($name, $this->attr)) ? TRUE : isset($this->attr[$name]);
689
+ }
690
+
691
+ function __unset($name) {
692
+ if (isset($this->attr[$name]))
693
+ unset($this->attr[$name]);
694
+ }
695
+
696
+ // PaperG - Function to convert the text from one character set to another if the two sets are not the same.
697
+ function convert_text($text) {
698
+ global $debugObject;
699
+ if (is_object($debugObject)) {$debugObject->debugLogEntry(1);}
700
+
701
+ $converted_text = $text;
702
+
703
+ $sourceCharset = "";
704
+ $targetCharset = "";
705
+ if ($this->dom) {
706
+ $sourceCharset = strtoupper($this->dom->_charset);
707
+ $targetCharset = strtoupper($this->dom->_target_charset);
708
+ }
709
+ if (is_object($debugObject)) {$debugObject->debugLog(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);}
710
+
711
+ if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0))
712
+ {
713
+ // Check if the reported encoding could have been incorrect and the text is actually already UTF-8
714
+ if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text)))
715
+ {
716
+ $converted_text = $text;
717
+ }
718
+ else
719
+ {
720
+ $converted_text = iconv($sourceCharset, $targetCharset, $text);
721
+ }
722
+ }
723
+
724
+ return $converted_text;
725
+ }
726
+
727
+ function is_utf8($string)
728
+ {
729
+ return (utf8_encode(utf8_decode($string)) == $string);
730
+ }
731
+
732
+ // camel naming conventions
733
+ function getAllAttributes() {return $this->attr;}
734
+ function getAttribute($name) {return $this->__get($name);}
735
+ function setAttribute($name, $value) {$this->__set($name, $value);}
736
+ function hasAttribute($name) {return $this->__isset($name);}
737
+ function removeAttribute($name) {$this->__set($name, null);}
738
+ function getElementById($id) {return $this->find("#$id", 0);}
739
+ function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
740
+ function getElementByTagName($name) {return $this->find($name, 0);}
741
+ function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);}
742
+ function parentNode() {return $this->parent();}
743
+ function childNodes($idx=-1) {return $this->children($idx);}
744
+ function firstChild() {return $this->first_child();}
745
+ function lastChild() {return $this->last_child();}
746
+ function nextSibling() {return $this->next_sibling();}
747
+ function previousSibling() {return $this->prev_sibling();}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
748
  }
749
 
750
  /**
755
  *
756
  * @package PlaceLocalInclude
757
  */
758
+ class simple_html_dom {
759
+ public $root = null;
760
+ public $nodes = array();
761
+ public $callback = null;
762
+ public $lowercase = false;
763
+ public $size;
764
+ protected $pos;
765
+ protected $doc;
766
+ protected $char;
767
+ protected $cursor;
768
+ protected $parent;
769
+ protected $noise = array();
770
+ protected $token_blank = " \t\r\n";
771
+ protected $token_equal = ' =/>';
772
+ protected $token_slash = " />\r\n\t";
773
+ protected $token_attr = ' >';
774
+ protected $_charset = '';
775
+ protected $_target_charset = '';
776
+ protected $default_br_text = "";
777
+
778
+ // use isset instead of in_array, performance boost about 30%...
779
+ protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1);
780
+ protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1);
781
+ // Known sourceforge issue #2977341
782
+ // B tags that are not closed cause us to return everything to the end of the document.
783
+ protected $optional_closing_tags = array(
784
+ 'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1),
785
+ 'th'=>array('th'=>1),
786
+ 'td'=>array('td'=>1),
787
+ 'li'=>array('li'=>1),
788
+ 'dt'=>array('dt'=>1, 'dd'=>1),
789
+ 'dd'=>array('dd'=>1, 'dt'=>1),
790
+ 'dl'=>array('dd'=>1, 'dt'=>1),
791
+ 'p'=>array('p'=>1),
792
+ 'nobr'=>array('nobr'=>1),
793
+ 'b'=>array('b'=>1),
794
+ );
795
+
796
+ function __construct($str=null, $lowercase=true, $forceTagsClosed=true, $target_charset=DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT) {
797
+ if ($str) {
798
+ if (preg_match("/^http:\/\//i",$str) || is_file($str))
799
+ $this->load_file($str);
800
+ else
801
+ $this->load($str, $lowercase, $stripRN, $defaultBRText);
802
+ }
803
+ // Forcing tags to be closed implies that we don't trust the html, but it can lead to parsing errors if we SHOULD trust the html.
804
+ if (!$forceTagsClosed) {
805
+ $this->optional_closing_array=array();
806
+ }
807
+ $this->_target_charset = $target_charset;
808
+ }
809
+
810
+ function __destruct() {
811
+ $this->clear();
812
+ }
813
+
814
+ // load html from string
815
+ function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT) {
816
+ global $debugObject;
817
+
818
+ // prepare
819
+ $this->prepare($str, $lowercase, $stripRN, $defaultBRText);
820
+ // strip out comments
821
+ $this->remove_noise("'<!--(.*?)-->'is");
822
+ // strip out cdata
823
+ $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true);
824
+ // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037
825
+ // Script tags removal now preceeds style tag removal.
826
+ // strip out <script> tags
827
+ $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");
828
+ $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");
829
+ // strip out <style> tags
830
+ $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is");
831
+ $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is");
832
+ // strip out preformatted tags
833
+ $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is");
834
+ // strip out server side scripts
835
+ $this->remove_noise("'(<\?)(.*?)(\?>)'s", true);
836
+ // strip smarty scripts
837
+ $this->remove_noise("'(\{\w)(.*?)(\})'s", true);
838
+
839
+ // parsing
840
+ while ($this->parse());
841
+ // end
842
+ $this->root->_[HDOM_INFO_END] = $this->cursor;
843
+ $this->parse_charset();
844
+ }
845
+
846
+ // load html from file
847
+ function load_file() {
848
+ $args = func_get_args();
849
+ $this->load(call_user_func_array('file_get_contents', $args), true);
850
+ // Per the simple_html_dom repositiry this is a planned upgrade to the codebase.
851
+ // Throw an error if we can't properly load the dom.
852
+ if (($error=error_get_last())!==null) {
853
+ $this->clear();
854
+ return false;
855
+ }
856
+ }
857
+
858
+ // set callback function
859
+ function set_callback($function_name) {
860
+ $this->callback = $function_name;
861
+ }
862
+
863
+ // remove callback function
864
+ function remove_callback() {
865
+ $this->callback = null;
866
+ }
867
+
868
+ // save dom as string
869
+ function save($filepath='') {
870
+ $ret = $this->root->innertext();
871
+ if ($filepath!=='') file_put_contents($filepath, $ret, LOCK_EX);
872
+ return $ret;
873
+ }
874
+
875
+ // find dom node by css selector
876
+ // Paperg - allow us to specify that we want case insensitive testing of the value of the selector.
877
+ function find($selector, $idx=null, $lowercase=false) {
878
+ return $this->root->find($selector, $idx, $lowercase);
879
+ }
880
+
881
+ // clean up memory due to php5 circular references memory leak...
882
+ function clear() {
883
+ foreach ($this->nodes as $n) {$n->clear(); $n = null;}
884
+ // This add next line is documented in the sourceforge repository. 2977248 as a fix for ongoing memory leaks that occur even with the use of clear.
885
+ if (isset($this->children)) foreach ($this->children as $n) {$n->clear(); $n = null;}
886
+ if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);}
887
+ if (isset($this->root)) {$this->root->clear(); unset($this->root);}
888
+ unset($this->doc);
889
+ unset($this->noise);
890
+ }
891
+
892
+ function dump($show_attr=true) {
893
+ $this->root->dump($show_attr);
894
+ }
895
+
896
+ // prepare HTML data and init everything
897
+ protected function prepare($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT) {
898
+ $this->clear();
899
+
900
+ // set the length of content before we do anything to it.
901
+ $this->size = strlen($str);
902
+
903
+ //before we save the string as the doc... strip out the \r \n's if we are told to.
904
+ if ($stripRN) {
905
+ $str = str_replace("\r", " ", $str);
906
+ $str = str_replace("\n", " ", $str);
907
+ }
908
+
909
+ $this->doc = $str;
910
+ $this->pos = 0;
911
+ $this->cursor = 1;
912
+ $this->noise = array();
913
+ $this->nodes = array();
914
+ $this->lowercase = $lowercase;
915
+ $this->default_br_text = $defaultBRText;
916
+ $this->root = new simple_html_dom_node($this);
917
+ $this->root->tag = 'root';
918
+ $this->root->_[HDOM_INFO_BEGIN] = -1;
919
+ $this->root->nodetype = HDOM_TYPE_ROOT;
920
+ $this->parent = $this->root;
921
+ if ($this->size>0) $this->char = $this->doc[0];
922
+ }
923
+
924
+ // parse html content
925
+ protected function parse() {
926
+ if (($s = $this->copy_until_char('<'))==='')
927
+ return $this->read_tag();
928
+
929
+ // text
930
+ $node = new simple_html_dom_node($this);
931
+ ++$this->cursor;
932
+ $node->_[HDOM_INFO_TEXT] = $s;
933
+ $this->link_nodes($node, false);
934
+ return true;
935
+ }
936
+
937
+ // PAPERG - dkchou - added this to try to identify the character set of the page we have just parsed so we know better how to spit it out later.
938
+ // NOTE: IF you provide a routine called get_last_retrieve_url_contents_content_type which returns the CURLINFO_CONTENT_TYPE fromt he last curl_exec
939
+ // (or the content_type header fromt eh last transfer), we will parse THAT, and if a charset is specified, we will use it over any other mechanism.
940
+ protected function parse_charset()
941
+ {
942
+ global $debugObject;
943
+
944
+ $charset = null;
945
+
946
+ if (function_exists('get_last_retrieve_url_contents_content_type'))
947
+ {
948
+ $contentTypeHeader = get_last_retrieve_url_contents_content_type();
949
+ $success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches);
950
+ if ($success)
951
+ {
952
+ $charset = $matches[1];
953
+ if (is_object($debugObject)) {$debugObject->debugLog(2, 'header content-type found charset of: ' . $charset);}
954
+ }
955
+
956
+ }
957
+
958
+ if (empty($charset))
959
+ {
960
+ $el = $this->root->find('meta[http-equiv=Content-Type]',0);
961
+ if (!empty($el))
962
+ {
963
+ $fullvalue = $el->content;
964
+ if (is_object($debugObject)) {$debugObject->debugLog(2, 'meta content-type tag found' . $fullValue);}
965
+
966
+ if (!empty($fullvalue))
967
+ {
968
+ $success = preg_match('/charset=(.+)/', $fullvalue, $matches);
969
+ if ($success)
970
+ {
971
+ $charset = $matches[1];
972
+ }
973
+ else
974
+ {
975
+ // If there is a meta tag, and they don't specify the character set, research says that it's typically ISO-8859-1
976
+ if (is_object($debugObject)) {$debugObject->debugLog(2, 'meta content-type tag couldn\'t be parsed. using iso-8859 default.');}
977
+ $charset = 'ISO-8859-1';
978
+ }
979
+ }
980
+ }
981
+ }
982
+
983
+ // If we couldn't find a charset above, then lets try to detect one based on the text we got...
984
+ if (empty($charset))
985
+ {
986
+ // Have php try to detect the encoding from the text given to us.
987
+ $charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) );
988
+ if (is_object($debugObject)) {$debugObject->debugLog(2, 'mb_detect found: ' . $charset);}
989
+
990
+ // and if this doesn't work... then we need to just wrongheadedly assume it's UTF-8 so that we can move on - cause this will usually give us most of what we need...
991
+ if ($charset === false)
992
+ {
993
+ if (is_object($debugObject)) {$debugObject->debugLog(2, 'since mb_detect failed - using default of utf-8');}
994
+ $charset = 'UTF-8';
995
+ }
996
+ }
997
+
998
+ // Since CP1252 is a superset, if we get one of it's subsets, we want it instead.
999
+ if ((strtolower($charset) == strtolower('ISO-8859-1')) || (strtolower($charset) == strtolower('Latin1')) || (strtolower($charset) == strtolower('Latin-1')))
1000
+ {
1001
+ if (is_object($debugObject)) {$debugObject->debugLog(2, 'replacing ' . $charset . ' with CP1252 as its a superset');}
1002
+ $charset = 'CP1252';
1003
+ }
1004
+
1005
+ if (is_object($debugObject)) {$debugObject->debugLog(1, 'EXIT - ' . $charset);}
1006
+
1007
+ return $this->_charset = $charset;
1008
+ }
1009
+
1010
+ // read tag info
1011
+ protected function read_tag() {
1012
+ if ($this->char!=='<') {
1013
+ $this->root->_[HDOM_INFO_END] = $this->cursor;
1014
+ return false;
1015
+ }
1016
+ $begin_tag_pos = $this->pos;
1017
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1018
+
1019
+ // end tag
1020
+ if ($this->char==='/') {
1021
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1022
+ // This represetns the change in the simple_html_dom trunk from revision 180 to 181.
1023
+ // $this->skip($this->token_blank_t);
1024
+ $this->skip($this->token_blank);
1025
+ $tag = $this->copy_until_char('>');
1026
+
1027
+ // skip attributes in end tag
1028
+ if (($pos = strpos($tag, ' '))!==false)
1029
+ $tag = substr($tag, 0, $pos);
1030
+
1031
+ $parent_lower = strtolower($this->parent->tag);
1032
+ $tag_lower = strtolower($tag);
1033
+
1034
+ if ($parent_lower!==$tag_lower) {
1035
+ if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) {
1036
+ $this->parent->_[HDOM_INFO_END] = 0;
1037
+ $org_parent = $this->parent;
1038
+
1039
+ while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
1040
+ $this->parent = $this->parent->parent;
1041
+
1042
+ if (strtolower($this->parent->tag)!==$tag_lower) {
1043
+ $this->parent = $org_parent; // restore origonal parent
1044
+ if ($this->parent->parent) $this->parent = $this->parent->parent;
1045
+ $this->parent->_[HDOM_INFO_END] = $this->cursor;
1046
+ return $this->as_text_node($tag);
1047
+ }
1048
+ }
1049
+ else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) {
1050
+ $this->parent->_[HDOM_INFO_END] = 0;
1051
+ $org_parent = $this->parent;
1052
+
1053
+ while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
1054
+ $this->parent = $this->parent->parent;
1055
+
1056
+ if (strtolower($this->parent->tag)!==$tag_lower) {
1057
+ $this->parent = $org_parent; // restore origonal parent
1058
+ $this->parent->_[HDOM_INFO_END] = $this->cursor;
1059
+ return $this->as_text_node($tag);
1060
+ }
1061
+ }
1062
+ else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) {
1063
+ $this->parent->_[HDOM_INFO_END] = 0;
1064
+ $this->parent = $this->parent->parent;
1065
+ }
1066
+ else
1067
+ return $this->as_text_node($tag);
1068
+ }
1069
+
1070
+ $this->parent->_[HDOM_INFO_END] = $this->cursor;
1071
+ if ($this->parent->parent) $this->parent = $this->parent->parent;
1072
+
1073
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1074
+ return true;
1075
+ }
1076
+
1077
+ $node = new simple_html_dom_node($this);
1078
+ $node->_[HDOM_INFO_BEGIN] = $this->cursor;
1079
+ ++$this->cursor;
1080
+ $tag = $this->copy_until($this->token_slash);
1081
+ $node->tag_start = $begin_tag_pos;
1082
+
1083
+ // doctype, cdata & comments...
1084
+ if (isset($tag[0]) && $tag[0]==='!') {
1085
+ $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>');
1086
+
1087
+ if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') {
1088
+ $node->nodetype = HDOM_TYPE_COMMENT;
1089
+ $node->tag = 'comment';
1090
+ } else {
1091
+ $node->nodetype = HDOM_TYPE_UNKNOWN;
1092
+ $node->tag = 'unknown';
1093
+ }
1094
+ if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
1095
+ $this->link_nodes($node, true);
1096
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1097
+ return true;
1098
+ }
1099
+
1100
+ // text
1101
+ if ($pos=strpos($tag, '<')!==false) {
1102
+ $tag = '<' . substr($tag, 0, -1);
1103
+ $node->_[HDOM_INFO_TEXT] = $tag;
1104
+ $this->link_nodes($node, false);
1105
+ $this->char = $this->doc[--$this->pos]; // prev
1106
+ return true;
1107
+ }
1108
+
1109
+ if (!preg_match("/^[\w-:]+$/", $tag)) {
1110
+ $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>');
1111
+ if ($this->char==='<') {
1112
+ $this->link_nodes($node, false);
1113
+ return true;
1114
+ }
1115
+
1116
+ if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
1117
+ $this->link_nodes($node, false);
1118
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1119
+ return true;
1120
+ }
1121
+
1122
+ // begin tag
1123
+ $node->nodetype = HDOM_TYPE_ELEMENT;
1124
+ $tag_lower = strtolower($tag);
1125
+ $node->tag = ($this->lowercase) ? $tag_lower : $tag;
1126
+
1127
+ // handle optional closing tags
1128
+ if (isset($this->optional_closing_tags[$tag_lower]) ) {
1129
+ while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) {
1130
+ $this->parent->_[HDOM_INFO_END] = 0;
1131
+ $this->parent = $this->parent->parent;
1132
+ }
1133
+ $node->parent = $this->parent;
1134
+ }
1135
+
1136
+ $guard = 0; // prevent infinity loop
1137
+ $space = array($this->copy_skip($this->token_blank), '', '');
1138
+
1139
+ // attributes
1140
+ do
1141
+ {
1142
+ if ($this->char!==null && $space[0]==='') break;
1143
+ $name = $this->copy_until($this->token_equal);
1144
+ if ($guard===$this->pos) {
1145
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1146
+ continue;
1147
+ }
1148
+ $guard = $this->pos;
1149
+
1150
+ // handle endless '<'
1151
+ if ($this->pos>=$this->size-1 && $this->char!=='>') {
1152
+ $node->nodetype = HDOM_TYPE_TEXT;
1153
+ $node->_[HDOM_INFO_END] = 0;
1154
+ $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name;
1155
+ $node->tag = 'text';
1156
+ $this->link_nodes($node, false);
1157
+ return true;
1158
+ }
1159
+
1160
+ // handle mismatch '<'
1161
+ if ($this->doc[$this->pos-1]=='<') {
1162
+ $node->nodetype = HDOM_TYPE_TEXT;
1163
+ $node->tag = 'text';
1164
+ $node->attr = array();
1165
+ $node->_[HDOM_INFO_END] = 0;
1166
+ $node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1);
1167
+ $this->pos -= 2;
1168
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1169
+ $this->link_nodes($node, false);
1170
+ return true;
1171
+ }
1172
+
1173
+ if ($name!=='/' && $name!=='') {
1174
+ $space[1] = $this->copy_skip($this->token_blank);
1175
+ $name = $this->restore_noise($name);
1176
+ if ($this->lowercase) $name = strtolower($name);
1177
+ if ($this->char==='=') {
1178
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1179
+ $this->parse_attr($node, $name, $space);
1180
+ }
1181
+ else {
1182
+ //no value attr: nowrap, checked selected...
1183
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
1184
+ $node->attr[$name] = true;
1185
+ if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev
1186
+ }
1187
+ $node->_[HDOM_INFO_SPACE][] = $space;
1188
+ $space = array($this->copy_skip($this->token_blank), '', '');
1189
+ }
1190
+ else
1191
+ break;
1192
+ } while ($this->char!=='>' && $this->char!=='/');
1193
+
1194
+ $this->link_nodes($node, true);
1195
+ $node->_[HDOM_INFO_ENDSPACE] = $space[0];
1196
+
1197
+ // check self closing
1198
+ if ($this->copy_until_char_escape('>')==='/') {
1199
+ $node->_[HDOM_INFO_ENDSPACE] .= '/';
1200
+ $node->_[HDOM_INFO_END] = 0;
1201
+ }
1202
+ else {
1203
+ // reset parent
1204
+ if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node;
1205
+ }
1206
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1207
+
1208
+ // If it's a BR tag, we need to set it's text to the default text.
1209
+ // This way when we see it in plaintext, we can generate formatting that the user wants.
1210
+ if ($node->tag == "br") {
1211
+ $node->_[HDOM_INFO_INNER] = $this->default_br_text;
1212
+ }
1213
+
1214
+ return true;
1215
+ }
1216
+
1217
+ // parse attributes
1218
+ protected function parse_attr($node, $name, &$space) {
1219
+ // Per sourceforge: http://sourceforge.net/tracker/?func=detail&aid=3061408&group_id=218559&atid=1044037
1220
+ // If the attribute is already defined inside a tag, only pay atetntion to the first one as opposed to the last one.
1221
+ if (isset($node->attr[$name]))
1222
+ {
1223
+ return;
1224
+ }
1225
+
1226
+ $space[2] = $this->copy_skip($this->token_blank);
1227
+ switch ($this->char) {
1228
+ case '"':
1229
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
1230
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1231
+ $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"'));
1232
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1233
+ break;
1234
+ case '\'':
1235
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE;
1236
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1237
+ $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('\''));
1238
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1239
+ break;
1240
+ default:
1241
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
1242
+ $node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr));
1243
+ }
1244
+ // PaperG: Attributes should not have \r or \n in them, that counts as html whitespace.
1245
+ $node->attr[$name] = str_replace("\r", "", $node->attr[$name]);
1246
+ $node->attr[$name] = str_replace("\n", "", $node->attr[$name]);
1247
+ // PaperG: If this is a "class" selector, lets get rid of the preceeding and trailing space since some people leave it in the multi class case.
1248
+ if ($name == "class") {
1249
+ $node->attr[$name] = trim($node->attr[$name]);
1250
+ }
1251
+ }
1252
+
1253
+ // link node's parent
1254
+ protected function link_nodes(&$node, $is_child) {
1255
+ $node->parent = $this->parent;
1256
+ $this->parent->nodes[] = $node;
1257
+ if ($is_child)
1258
+ $this->parent->children[] = $node;
1259
+ }
1260
+
1261
+ // as a text node
1262
+ protected function as_text_node($tag) {
1263
+ $node = new simple_html_dom_node($this);
1264
+ ++$this->cursor;
1265
+ $node->_[HDOM_INFO_TEXT] = '</' . $tag . '>';
1266
+ $this->link_nodes($node, false);
1267
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1268
+ return true;
1269
+ }
1270
+
1271
+ protected function skip($chars) {
1272
+ $this->pos += strspn($this->doc, $chars, $this->pos);
1273
+ $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1274
+ }
1275
+
1276
+ protected function copy_skip($chars) {
1277
+ $pos = $this->pos;
1278
+ $len = strspn($this->doc, $chars, $pos);
1279
+ $this->pos += $len;
1280
+ $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1281
+ if ($len===0) return '';
1282
+ return substr($this->doc, $pos, $len);
1283
+ }
1284
+
1285
+ protected function copy_until($chars) {
1286
+ $pos = $this->pos;
1287
+ $len = strcspn($this->doc, $chars, $pos);
1288
+ $this->pos += $len;
1289
+ $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
1290
+ return substr($this->doc, $pos, $len);
1291
+ }
1292
+
1293
+ protected function copy_until_char($char) {
1294
+ if ($this->char===null) return '';
1295
+
1296
+ if (($pos = strpos($this->doc, $char, $this->pos))===false) {
1297
+ $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
1298
+ $this->char = null;
1299
+ $this->pos = $this->size;
1300
+ return $ret;
1301
+ }
1302
+
1303
+ if ($pos===$this->pos) return '';
1304
+ $pos_old = $this->pos;
1305
+ $this->char = $this->doc[$pos];
1306
+ $this->pos = $pos;
1307
+ return substr($this->doc, $pos_old, $pos-$pos_old);
1308
+ }
1309
+
1310
+ protected function copy_until_char_escape($char) {
1311
+ if ($this->char===null) return '';
1312
+
1313
+ $start = $this->pos;
1314
+ while (1) {
1315
+ if (($pos = strpos($this->doc, $char, $start))===false) {
1316
+ $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
1317
+ $this->char = null;
1318
+ $this->pos = $this->size;
1319
+ return $ret;
1320
+ }
1321
+
1322
+ if ($pos===$this->pos) return '';
1323
+
1324
+ if ($this->doc[$pos-1]==='\\') {
1325
+ $start = $pos+1;
1326
+ continue;
1327
+ }
1328
+
1329
+ $pos_old = $this->pos;
1330
+ $this->char = $this->doc[$pos];
1331
+ $this->pos = $pos;
1332
+ return substr($this->doc, $pos_old, $pos-$pos_old);
1333
+ }
1334
+ }
1335
+
1336
+ // remove noise from html content
1337
+ protected function remove_noise($pattern, $remove_tag=false) {
1338
+ $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
1339
+
1340
+ for ($i=$count-1; $i>-1; --$i) {
1341
+ $key = '___noise___'.sprintf('% 3d', count($this->noise)+100);
1342
+ $idx = ($remove_tag) ? 0 : 1;
1343
+ $this->noise[$key] = $matches[$i][$idx][0];
1344
+ $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
1345
+ }
1346
+
1347
+ // reset the length of content
1348
+ $this->size = strlen($this->doc);
1349
+ if ($this->size>0) $this->char = $this->doc[0];
1350
+ }
1351
+
1352
+ // restore noise to html content
1353
+ function restore_noise($text) {
1354
+ while (($pos=strpos($text, '___noise___'))!==false) {
1355
+ $key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13];
1356
+ if (isset($this->noise[$key]))
1357
+ $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+14);
1358
+ }
1359
+ return $text;
1360
+ }
1361
+
1362
+ function __toString() {
1363
+ return $this->root->innertext();
1364
+ }
1365
+
1366
+ function __get($name) {
1367
+ switch ($name) {
1368
+ case 'outertext':
1369
+ return $this->root->innertext();
1370
+ case 'innertext':
1371
+ return $this->root->innertext();
1372
+ case 'plaintext':
1373
+ return $this->root->text();
1374
+ case 'charset':
1375
+ return $this->_charset;
1376
+ case 'target_charset':
1377
+ return $this->_target_charset;
1378
+ }
1379
+ }
1380
+
1381
+ // camel naming conventions
1382
+ function childNodes($idx=-1) {return $this->root->childNodes($idx);}
1383
+ function firstChild() {return $this->root->first_child();}
1384
+ function lastChild() {return $this->root->last_child();}
1385
+ function getElementById($id) {return $this->find("#$id", 0);}
1386
+ function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
1387
+ function getElementByTagName($name) {return $this->find($name, 0);}
1388
+ function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);}
1389
+ function loadFile() {$args = func_get_args();$this->load_file($args);}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1390
  }
1391
 
1392
  ?>
products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php DELETED
@@ -1,117 +0,0 @@
1
- <?php
2
-
3
- /***
4
- {
5
- Module: photocrati-third_party_compat,
6
- Depends: {}
7
- }
8
- ***/
9
- class M_Third_Party_Compat extends C_Base_Module
10
- {
11
- function define()
12
- {
13
- parent::define(
14
- 'photocrati-third_party_compat',
15
- 'Third Party Compatibility',
16
- "Adds Third party compatibility hacks, adjustments, and modifications",
17
- '0.1',
18
- 'http://www.nextgen-gallery.com',
19
- 'Photocrati Media',
20
- 'http://www.photocrati.com'
21
- );
22
- }
23
-
24
- function _register_adapters()
25
- {
26
- }
27
-
28
- function _register_hooks()
29
- {
30
- add_action('init', array(&$this, 'colorbox'), PHP_INT_MAX);
31
- add_action('wp', array(&$this, 'bjlazyload'), PHP_INT_MAX);
32
- }
33
-
34
- /**
35
- * Colorbox fires a filter (pri=100) to add class attributes to images via a the_content filter. We fire our
36
- * shortcodes at PHP_INT_MAX-1 to avoid encoding issues with some themes. Here we move the Colorbox filters
37
- * priority to PHP_INT_MAX so that they run after our shortcode text has been replaced with rendered galleries.
38
- */
39
- function colorbox()
40
- {
41
- if (!class_exists('JQueryColorboxFrontend'))
42
- return;
43
-
44
- global $wp_filter;
45
-
46
- if (empty($wp_filter['the_content'][100]))
47
- return;
48
-
49
- foreach ($wp_filter['the_content'][100] as $id => $filter) {
50
- if (!strpos($id, 'addColorboxGroupIdToImages'))
51
- continue;
52
-
53
- $object = $filter['function'][0];
54
-
55
- if (get_class($object) != 'JQueryColorboxFrontend')
56
- continue;
57
-
58
- remove_filter('the_content', array($object, 'addColorboxGroupIdToImages'), 100);
59
- remove_filter('the_excerpt', array($object, 'addColorboxGroupIdToImages'), 100);
60
- add_filter('the_content', array($object, 'addColorboxGroupIdToImages'), PHP_INT_MAX);
61
- add_filter('the_excerpt', array($object, 'addColorboxGroupIdToImages'), PHP_INT_MAX);
62
- break;
63
- }
64
- }
65
-
66
- /**
67
- * For the same reasons as Colorbox we move BJ-Lazy-load's filter() method to a later priority so it can access
68
- * our rendered galleries.
69
- */
70
- function bjlazyload()
71
- {
72
- if (!class_exists('BJLL'))
73
- return;
74
-
75
- global $wp_filter;
76
-
77
- if (empty($wp_filter['the_content'][200]))
78
- return;
79
-
80
- foreach ($wp_filter['the_content'][200] as $id => $filter) {
81
- if (!strpos($id, 'filter'))
82
- continue;
83
-
84
- $object = $filter['function'][0];
85
-
86
- if (get_class($object) != 'BJLL')
87
- continue;
88
-
89
- remove_filter('the_content', array($object, 'filter'), 200);
90
- add_filter('the_content', array($object, 'filter'), PHP_INT_MAX);
91
- break;
92
- }
93
-
94
- add_filter('the_content', array($this, 'bjlazyload_filter'), PHP_INT_MAX-1);
95
- }
96
-
97
- /**
98
- * BJ-Lazy-load's regex is lazy and doesn't handle multiline search or instances where <img is immediately followed
99
- * by a newline. The following regex replaces newlines and strips unnecessary space. We fire this filter
100
- * before BJ-Lazy-Load's to make our galleries compatible with its expectations.
101
- *
102
- * @param string $content
103
- * @return string
104
- */
105
- function bjlazyload_filter($content)
106
- {
107
- return trim(preg_replace("/\s\s+/", " ", $content));
108
- }
109
-
110
- function get_type_list()
111
- {
112
- return array(
113
- );
114
- }
115
- }
116
-
117
- new M_Third_Party_Compat();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
products/photocrati_nextgen/modules/widget/class.widget.php CHANGED
@@ -30,6 +30,8 @@ class Mixin_Widget extends Mixin
30
  */
31
  function echo_widget_random($number, $width = '75', $height = '50', $exclude = 'all', $list = '', $show = 'thumbnail')
32
  {
 
 
33
  $options = array(
34
  'title' => FALSE,
35
  'items' => $number,
@@ -52,6 +54,8 @@ class Mixin_Widget extends Mixin
52
  */
53
  function echo_widget_recent($number, $width = '75', $height = '50', $exclude = 'all', $list = '', $show = 'thumbnail')
54
  {
 
 
55
  $options = array(
56
  'title' => FALSE,
57
  'items' => $number,
@@ -77,6 +81,8 @@ class Mixin_Widget extends Mixin
77
  */
78
  function echo_widget_slideshow($galleryID, $width = '', $height = '')
79
  {
 
 
80
  $widget = new C_Widget_Slideshow();
81
  $widget->render_slideshow($galleryID, $width, $height);
82
  }
30
  */
31
  function echo_widget_random($number, $width = '75', $height = '50', $exclude = 'all', $list = '', $show = 'thumbnail')
32
  {
33
+ wp_enqueue_style('nextgen_widgets_style', $this->get_static_url('photocrati-widget#widgets.css'));
34
+ wp_enqueue_style('nextgen_basic_thumbnails_style', $this->get_static_url('nextgen_basic_thumbnails#nextgen_basic_thumbnails.css'));
35
  $options = array(
36
  'title' => FALSE,
37
  'items' => $number,
54
  */
55
  function echo_widget_recent($number, $width = '75', $height = '50', $exclude = 'all', $list = '', $show = 'thumbnail')
56
  {
57
+ wp_enqueue_style('nextgen_widgets_style', $this->get_static_url('photocrati-widget#widgets.css'));
58
+ wp_enqueue_style('nextgen_basic_thumbnails_style', $this->get_static_url('nextgen_basic_thumbnails#nextgen_basic_thumbnails.css'));
59
  $options = array(
60
  'title' => FALSE,
61
  'items' => $number,
81
  */
82
  function echo_widget_slideshow($galleryID, $width = '', $height = '')
83
  {
84
+ wp_enqueue_style('nextgen_widgets_style', $this->get_static_url('widgets.css'));
85
+ wp_enqueue_style('nextgen_basic_slideshow_style', $this->get_static_url('nextgen_basic_slideshow#nextgen_basic_slideshow.css'));
86
  $widget = new C_Widget_Slideshow();
87
  $widget->render_slideshow($galleryID, $width, $height);
88
  }
products/photocrati_nextgen/modules/widget/class.widget_gallery.php CHANGED
@@ -45,32 +45,6 @@ class C_Widget_Gallery extends WP_Widget
45
  function update($new_instance, $old_instance)
46
  {
47
  $instance = $old_instance;
48
-
49
- // do not allow 0 or less
50
- if ((int)$new_instance['items'] <= 0)
51
- $new_instance['items'] = 4;
52
-
53
- // for clarity: empty the list if we're showing every gallery anyway
54
- if ($new_instance['exclude'] == 'all')
55
- $new_instance['list'] = '';
56
-
57
- // remove gallery ids that do not exist
58
- if (in_array($new_instance['exclude'], array('denied', 'allow')))
59
- {
60
- // do search
61
- $mapper = C_Component_Registry::get_instance()->get_utility('I_Gallery_Mapper');
62
- $ids = explode(',', $new_instance['list']);
63
- foreach ($ids as $ndx => $id) {
64
- if (!$mapper->find($id))
65
- unset($ids[$ndx]);
66
- }
67
- $new_instance['list'] = implode(',', $ids);
68
- }
69
-
70
- // reset to show all galleries IF there are no valid galleries in the list
71
- if ($new_instance['exclude'] !== 'all' && empty($new_instance['list']))
72
- $new_instance['exclude'] = 'all';
73
-
74
  $instance['title'] = strip_tags($new_instance['title']);
75
  $instance['items'] = (int)$new_instance['items'];
76
  $instance['type'] = $new_instance['type'];
@@ -85,24 +59,55 @@ class C_Widget_Gallery extends WP_Widget
85
 
86
  function widget($args, $instance)
87
  {
88
- $router = C_Router::get_instance();
89
- wp_enqueue_style('nextgen_widgets_style', $router->get_static_url('photocrati-widget#widgets.css'));
90
- wp_enqueue_style('nextgen_basic_thumbnails_style', $router->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.css'));
91
-
92
  // these are handled by extract() but I want to silence my IDE warnings that these vars don't exist
93
  $before_widget = NULL;
94
- $before_title = NULL;
95
- $after_widget = NULL;
96
- $after_title = NULL;
97
- $widget_id = NULL;
98
- extract($args);
99
 
 
 
 
100
  $title = apply_filters('widget_title', empty($instance['title']) ? '&nbsp;' : $instance['title'], $instance, $this->id_base);
101
 
102
- $renderer = C_Component_Registry::get_instance()->get_utility('I_Displayed_Gallery_Renderer');
103
- $factory = C_Component_Registry::get_instance()->get_utility('I_Component_Factory');
 
104
  $view = $factory->create('mvc_view', '');
105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  // IE8 webslice support if needed
107
  if ($instance['webslice'])
108
  {
@@ -111,16 +116,15 @@ class C_Widget_Gallery extends WP_Widget
111
  $after_widget = '</div>' . $after_widget;
112
  }
113
 
114
- $source = ($instance['type'] == 'random' ? 'random_images' : 'recent');
115
-
116
- $params = array(
117
- 'slug' => 'widget-' . $args['widget_id'],
118
- 'source' => $source,
119
  'display_type' => NEXTGEN_GALLERY_BASIC_THUMBNAILS,
120
  'images_per_page' => $instance['items'],
121
  'maximum_entity_count' => $instance['items'],
122
  'template' => $view->get_template_abspath('photocrati-widget#display_gallery'),
123
- 'image_type' => $instance['show'] == 'original' ? 'full' : 'thumb',
124
  'show_all_in_lightbox' => FALSE,
125
  'show_slideshow_link' => FALSE,
126
  'disable_pagination' => TRUE,
@@ -136,26 +140,6 @@ class C_Widget_Gallery extends WP_Widget
136
  'widget_setting_height' => $instance['height'],
137
  'widget_setting_show_setting' => $instance['show'],
138
  'widget_setting_widget_id' => $widget_id
139
- );
140
-
141
- switch ($instance['exclude']) {
142
- case 'all':
143
- break;
144
- case 'denied':
145
- $mapper = C_Component_Registry::get_instance()->get_utility('I_Gallery_Mapper');
146
- $gallery_ids = array();
147
- $list = explode(',', $instance['list']);
148
- foreach ($mapper->find_all() as $gallery) {
149
- if (!in_array($gallery->{$gallery->id_field}, $list))
150
- $gallery_ids[] = $gallery->{$gallery->id_field};
151
- }
152
- $params['container_ids'] = implode(',', $gallery_ids);
153
- break;
154
- case 'allow':
155
- $params['container_ids'] = $instance['list'];
156
- break;
157
- }
158
-
159
- echo $renderer->display_images($params);
160
  }
161
  }
45
  function update($new_instance, $old_instance)
46
  {
47
  $instance = $old_instance;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  $instance['title'] = strip_tags($new_instance['title']);
49
  $instance['items'] = (int)$new_instance['items'];
50
  $instance['type'] = $new_instance['type'];
59
 
60
  function widget($args, $instance)
61
  {
 
 
 
 
62
  // these are handled by extract() but I want to silence my IDE warnings that these vars don't exist
63
  $before_widget = NULL;
64
+ $before_title = NULL;
65
+ $after_widget = NULL;
66
+ $after_title = NULL;
67
+ $widget_id = NULL;
 
68
 
69
+ global $wpdb;
70
+
71
+ extract($args);
72
  $title = apply_filters('widget_title', empty($instance['title']) ? '&nbsp;' : $instance['title'], $instance, $this->id_base);
73
 
74
+ $renderer = C_Component_Registry::get_instance()->get_utility('I_Displayed_Gallery_Renderer');
75
+ $factory = C_Component_Registry::get_instance()->get_utility('I_Component_Factory');
76
+ $mapper = C_Component_Registry::get_instance()->get_utility('I_Image_Mapper');
77
  $view = $factory->create('mvc_view', '');
78
 
79
+ // To prevent huge db scans and/or the loading of every image available: we first retrieve X image
80
+ // ids and then create a gallery using the results for the image_ids parameter
81
+ $image_ids = array();
82
+
83
+ $sql = "SELECT `pid` FROM `{$wpdb->nggpictures}` WHERE `exclude` = 0";
84
+ // possibly filter images not from certain galleries
85
+ if ($instance['exclude'] == 'allow')
86
+ $sql .= sprintf(" AND `galleryid` IN (%s)", $instance['list']);
87
+ // possibly filter images from certain galleries
88
+ if ($instance['exclude'] == 'denied')
89
+ $sql .= sprintf(" AND `galleryid` NOT IN (%s)", $instance['list']);
90
+ if ($instance['type'] == 'random')
91
+ $sql .= ' ORDER BY RAND()';
92
+ else if ($instance['type'] == 'recent')
93
+ $sql .= ' ORDER BY `imagedate` DESC';
94
+ $sql .= " LIMIT {$instance['items']}";
95
+ foreach ($wpdb->get_results($sql, ARRAY_N) as $res) {
96
+ $image_ids[] = reset($res);
97
+ }
98
+ $image_ids = implode(',', $image_ids);
99
+
100
+ if ($instance['type'] == 'random')
101
+ {
102
+ $order_by = 'rand()';
103
+ $order_direction = 'DESC';
104
+ }
105
+ else if ($instance['type'] == 'recent')
106
+ {
107
+ $order_by = $mapper->get_primary_key_column();
108
+ $order_direction = 'DESC';
109
+ }
110
+
111
  // IE8 webslice support if needed
112
  if ($instance['webslice'])
113
  {
116
  $after_widget = '</div>' . $after_widget;
117
  }
118
 
119
+ echo $renderer->display_images(array(
120
+ 'source' => 'galleries',
121
+ 'order_by' => $order_by,
122
+ 'order_direction' => $order_direction,
123
+ 'image_ids' => $image_ids,
124
  'display_type' => NEXTGEN_GALLERY_BASIC_THUMBNAILS,
125
  'images_per_page' => $instance['items'],
126
  'maximum_entity_count' => $instance['items'],
127
  'template' => $view->get_template_abspath('photocrati-widget#display_gallery'),
 
128
  'show_all_in_lightbox' => FALSE,
129
  'show_slideshow_link' => FALSE,
130
  'disable_pagination' => TRUE,
140
  'widget_setting_height' => $instance['height'],
141
  'widget_setting_show_setting' => $instance['show'],
142
  'widget_setting_widget_id' => $widget_id
143
+ ));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  }
145
  }
products/photocrati_nextgen/modules/widget/class.widget_slideshow.php CHANGED
@@ -58,10 +58,6 @@ class C_Widget_Slideshow extends WP_Widget
58
 
59
  function widget($args, $instance)
60
  {
61
- $router = C_Router::get_instance();
62
- wp_enqueue_style('nextgen_widgets_style', $router->get_static_url('photocrati-widget#widgets.css'));
63
- wp_enqueue_style('nextgen_basic_slideshow_style', $router->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow.css'));
64
-
65
  // these are handled by extract() but I want to silence my IDE warnings that these vars don't exist
66
  $before_widget = NULL;
67
  $before_title = NULL;
@@ -75,7 +71,7 @@ class C_Widget_Slideshow extends WP_Widget
75
 
76
  $title = apply_filters('widget_title', empty($instance['title']) ? __('Slideshow', 'nggallery') : $instance['title'], $instance, $this->id_base);
77
 
78
- $out = $this->render_slideshow($instance['galleryid'], $instance['width'], $instance['height'], $args);
79
 
80
  $parent->render_partial(
81
  'photocrati-widget#display_slideshow',
@@ -93,7 +89,7 @@ class C_Widget_Slideshow extends WP_Widget
93
  );
94
  }
95
 
96
- function render_slideshow($galleryID, $irWidth = '', $irHeight = '', $args)
97
  {
98
  $registry = C_Component_Registry::get_instance();
99
  $renderer = $registry->get_utility('I_Displayed_Gallery_Renderer');
@@ -104,7 +100,6 @@ class C_Widget_Slideshow extends WP_Widget
104
  'gallery_width' => $irWidth,
105
  'gallery_height' => $irHeight,
106
  'source' => 'galleries',
107
- 'slug' => 'widget-' . $args['widget_id'],
108
  'entity_types' => array('image'),
109
  'show_thumbnail_link' => FALSE,
110
  'ngg_triggers_display' => 'never'
58
 
59
  function widget($args, $instance)
60
  {
 
 
 
 
61
  // these are handled by extract() but I want to silence my IDE warnings that these vars don't exist
62
  $before_widget = NULL;
63
  $before_title = NULL;
71
 
72
  $title = apply_filters('widget_title', empty($instance['title']) ? __('Slideshow', 'nggallery') : $instance['title'], $instance, $this->id_base);
73
 
74
+ $out = $this->render_slideshow($instance['galleryid'], $instance['width'], $instance['height']);
75
 
76
  $parent->render_partial(
77
  'photocrati-widget#display_slideshow',
89
  );
90
  }
91
 
92
+ function render_slideshow($galleryID, $irWidth = '', $irHeight = '')
93
  {
94
  $registry = C_Component_Registry::get_instance();
95
  $renderer = $registry->get_utility('I_Displayed_Gallery_Renderer');
100
  'gallery_width' => $irWidth,
101
  'gallery_height' => $irHeight,
102
  'source' => 'galleries',
 
103
  'entity_types' => array('image'),
104
  'show_thumbnail_link' => FALSE,
105
  'ngg_triggers_display' => 'never'
products/photocrati_nextgen/modules/widget/module.widget.php CHANGED
@@ -15,7 +15,7 @@ class M_Widget extends C_Base_Module
15
  'photocrati-widget',
16
  'Widget',
17
  'Handles clearing of NextGen Widgets',
18
- '0.3',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
15
  'photocrati-widget',
16
  'Widget',
17
  'Handles clearing of NextGen Widgets',
18
+ '0.1',
19
  'http://www.nextgen-gallery.com',
20
  'Photocrati Media',
21
  'http://www.photocrati.com'
products/photocrati_nextgen/modules/widget/templates/display_gallery.php CHANGED
@@ -13,13 +13,13 @@ echo $settings['widget_setting_before_widget']
13
  <?php // keep the following a/img on the same line ?>
14
  <div class="ngg-widget entry-content">
15
  <?php foreach ($images as $image) { ?>
16
- <a href="<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE))?>"
17
  title="<?php echo esc_attr($image->description)?>"
18
  data-image-id='<?php echo esc_attr($image->pid); ?>'
19
  <?php echo $effect_code ?>
20
  ><img title="<?php echo esc_attr($image->alttext)?>"
21
  alt="<?php echo esc_attr($image->alttext)?>"
22
- src="<?php echo esc_attr($storage->get_image_url($image, $settings['image_type'], TRUE)); ?>"
23
  width="<?php echo esc_attr($settings['image_width']); ?>"
24
  height="<?php echo esc_attr($settings['image_height']); ?>"
25
  /></a>
13
  <?php // keep the following a/img on the same line ?>
14
  <div class="ngg-widget entry-content">
15
  <?php foreach ($images as $image) { ?>
16
+ <a href="<?php echo esc_attr($storage->get_image_url($image))?>"
17
  title="<?php echo esc_attr($image->description)?>"
18
  data-image-id='<?php echo esc_attr($image->pid); ?>'
19
  <?php echo $effect_code ?>
20
  ><img title="<?php echo esc_attr($image->alttext)?>"
21
  alt="<?php echo esc_attr($image->alttext)?>"
22
+ src="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>"
23
  width="<?php echo esc_attr($settings['image_width']); ?>"
24
  height="<?php echo esc_attr($settings['image_height']); ?>"
25
  /></a>
products/photocrati_nextgen/modules/wordpress_routing/adapter.wordpress_router.php CHANGED
@@ -3,7 +3,6 @@
3
  class A_WordPress_Router extends Mixin
4
  {
5
  var $_site_url = FALSE;
6
- var $_home_url = FALSE;
7
 
8
  function initialize()
9
  {
@@ -37,7 +36,7 @@ class A_WordPress_Router extends Mixin
37
  $retval
38
  );
39
 
40
- if ($retval && @file_exists($filename) && $retval != $base_url) {
41
 
42
  // Remove index.php from the url
43
  $retval = $this->object->remove_url_segment('/index.php', $retval);
@@ -56,40 +55,18 @@ class A_WordPress_Router extends Mixin
56
  return $retval;
57
  }
58
 
59
- function _add_index_dot_php_to_url($url)
60
- {
61
- if (strpos($url, '/index.php') === FALSE) {
62
- $pattern = get_option('permalink_structure');
63
- if (!$pattern OR strpos($pattern, '/index.php') !== FALSE) {
64
- $url = $this->object->join_paths($url, '/index.php');
65
- }
66
- }
67
-
68
- return $url;
69
- }
70
-
71
 
72
- function get_base_url($site_url = FALSE)
73
  {
74
- $retval = NULL;
75
- if ($site_url)
76
- {
77
- if (!$this->_site_url) {
78
- $this->_site_url = $this->_add_index_dot_php_to_url(site_url());
79
- }
80
- $retval = $this->_site_url;
81
- }
82
- else {
83
- if (!$this->_home_url) {
84
- $this->_home_url = $this->_add_index_dot_php_to_url(home_url());
85
- }
86
- $retval = $this->_home_url;
87
- }
88
-
89
- if ($this->object->is_https()) {
90
- $retval = preg_replace('/^http:\\/\\//i', 'https://', $retval, 1);
91
  }
92
 
93
- return $retval;
94
  }
95
- }
3
  class A_WordPress_Router extends Mixin
4
  {
5
  var $_site_url = FALSE;
 
6
 
7
  function initialize()
8
  {
36
  $retval
37
  );
38
 
39
+ if ($retval && file_exists($filename) && $retval != $base_url) {
40
 
41
  // Remove index.php from the url
42
  $retval = $this->object->remove_url_segment('/index.php', $retval);
55
  return $retval;
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
+ function get_base_url()
60
  {
61
+ if (!$this->_site_url) {
62
+ $this->_site_url = site_url();
63
+ if (!get_option('permalink_structure')) {
64
+ $this->_site_url = $this->object->join_paths(
65
+ $this->_site_url, '/index.php'
66
+ );
67
+ }
 
 
 
 
 
 
 
 
 
 
68
  }
69
 
70
+ return $this->_site_url;
71
  }
72
+ }
products/photocrati_nextgen/modules/wordpress_routing/adapter.wordpress_routing_app.php CHANGED
@@ -4,18 +4,9 @@ class A_WordPress_Routing_App extends Mixin
4
  {
5
  function remove_parameter($key, $id=NULL, $url=FALSE)
6
  {
7
- $generated_url = '';
8
 
9
- if ($this->is_blog_page()) {
10
- if (preg_match("#(/{$this->object->_settings->router_param_slug}/.*)#", $url, $match)) {
11
- $generated_url = home_url($match[1]);
12
- }
13
- else $generated_url = home_url();
14
- }
15
- else
16
- $generated_url = $this->call_parent('remove_parameter', $key, $id, $url);
17
-
18
- if ($this->is_postname_required_in_url() && $generated_url) {
19
  $generated_url = $this->object->add_post_permalink_to_url($generated_url);
20
  }
21
 
@@ -25,14 +16,9 @@ class A_WordPress_Routing_App extends Mixin
25
  function is_postname_required_in_url()
26
  {
27
  global $wp_query;
28
- return (!$wp_query->is_single() && in_the_loop()) OR $this->is_blog_page();
29
  }
30
 
31
- function is_blog_page()
32
- {
33
- return is_home() OR is_archive();
34
- }
35
-
36
  function parse_url($url)
37
  {
38
  $parts = parse_url($url);
4
  {
5
  function remove_parameter($key, $id=NULL, $url=FALSE)
6
  {
7
+ $generated_url = $this->call_parent('remove_parameter', $key, $id, $url);
8
 
9
+ if ($this->is_postname_required_in_url()) {
 
 
 
 
 
 
 
 
 
10
  $generated_url = $this->object->add_post_permalink_to_url($generated_url);
11
  }
12
 
16
  function is_postname_required_in_url()
17
  {
18
  global $wp_query;
19
+ return !$wp_query->is_single() && in_the_loop();
20
  }
21
 
 
 
 
 
 
22
  function parse_url($url)
23
  {
24
  $parts = parse_url($url);
products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php CHANGED
@@ -14,7 +14,7 @@ class M_WordPress_Routing extends C_Base_Module
14
  'photocrati-wordpress_routing',
15
  'WordPress Routing',
16
  "Integrates the MVC module's routing implementation with WordPress",
17
- '0.3',
18
  'http://www.nextgen-gallery.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
@@ -27,18 +27,6 @@ class M_WordPress_Routing extends C_Base_Module
27
  $this->get_registry()->add_adapter('I_Routing_App', 'A_WordPress_Routing_App');
28
  }
29
 
30
- function _register_hooks()
31
- {
32
- add_action('template_redirect', array(&$this, 'restore_request_uri'), 1);
33
- }
34
-
35
- function restore_request_uri()
36
- {
37
- if (isset($_SERVER['ORIG_REQUEST_URI'])) {
38
- $_SERVER['REQUEST_URI'] = $_SERVER['ORIG_REQUEST_URI'];
39
- }
40
- }
41
-
42
  function get_type_list()
43
  {
44
  return array(
14
  'photocrati-wordpress_routing',
15
  'WordPress Routing',
16
  "Integrates the MVC module's routing implementation with WordPress",
17
+ '0.1',
18
  'http://www.nextgen-gallery.com',
19
  'Photocrati Media',
20
  'http://www.photocrati.com'
27
  $this->get_registry()->add_adapter('I_Routing_App', 'A_WordPress_Routing_App');
28
  }
29
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  function get_type_list()
31
  {
32
  return array(
products/photocrati_nextgen/product.photocrati_nextgen.php CHANGED
@@ -1,10 +1,10 @@
1
  <?php
2
 
3
  /***
4
- {
5
- Product: photocrati-nextgen
6
- }
7
- ***/
8
 
9
  define('NEXTGEN_GALLERY_CHANGE_OPTIONS_CAP', 'NextGEN Manage gallery');
10
 
@@ -17,9 +17,10 @@ class P_Photocrati_NextGen extends C_Base_Product
17
  'photocrati-wordpress_routing',
18
  'photocrati-security',
19
  'photocrati-lzw',
20
- 'photocrati-nextgen_settings',
21
  'photocrati-mvc',
 
22
  'photocrati-ajax',
 
23
  'photocrati-dynamic_stylesheet',
24
  'photocrati-frame_communication',
25
  'photocrati-datamapper',
@@ -43,18 +44,16 @@ class P_Photocrati_NextGen extends C_Base_Product
43
  'photocrati-nextgen_basic_singlepic',
44
  'photocrati-nextgen_basic_tagcloud',
45
  'photocrati-nextgen_basic_album',
46
- 'photocrati-widget',
47
- 'photocrati-third_party_compat',
48
- 'photocrati-nextgen_xmlrpc'
49
  );
50
 
51
  function define()
52
  {
53
  parent::define(
54
  'photocrati-nextgen',
55
- 'Photocrati NextGEN',
56
- 'Photocrati NextGEN',
57
- '2.0.40',
58
  'http://www.nextgen-gallery.com',
59
  'Photocrati Media',
60
  'http://www.photocrati.com'
@@ -71,4 +70,5 @@ class P_Photocrati_NextGen extends C_Base_Product
71
  }
72
  }
73
 
74
- new P_Photocrati_NextGen();
 
1
  <?php
2
 
3
  /***
4
+ {
5
+ Product: photocrati-nextgen
6
+ }
7
+ ***/
8
 
9
  define('NEXTGEN_GALLERY_CHANGE_OPTIONS_CAP', 'NextGEN Manage gallery');
10
 
17
  'photocrati-wordpress_routing',
18
  'photocrati-security',
19
  'photocrati-lzw',
 
20
  'photocrati-mvc',
21
+ 'photocrati-nextgen_settings',
22
  'photocrati-ajax',
23
+ 'photocrati-resource_minifier',
24
  'photocrati-dynamic_stylesheet',
25
  'photocrati-frame_communication',
26
  'photocrati-datamapper',
44
  'photocrati-nextgen_basic_singlepic',
45
  'photocrati-nextgen_basic_tagcloud',
46
  'photocrati-nextgen_basic_album',
47
+ 'photocrati-widget'
 
 
48
  );
49
 
50
  function define()
51
  {
52
  parent::define(
53
  'photocrati-nextgen',
54
+ 'Photocrati NextGen',
55
+ 'Photocrati NextGen',
56
+ '2.0',
57
  'http://www.nextgen-gallery.com',
58
  'Photocrati Media',
59
  'http://www.photocrati.com'
70
  }
71
  }
72
 
73
+ new P_Photocrati_NextGen();
74
+
readme.txt CHANGED
@@ -1,8 +1,8 @@
1
  === NextGEN Gallery ===
2
  Contributors: photocrati
3
  Tags:gallery,image,images,photo,photos,picture,pictures,slideshow,flash,media,thumbnails,photo-albums,nextgen-gallery,nextgen
4
- Requires at least: 3.6.1
5
- Tested up to: 3.7.1
6
  Stable tag: trunk
7
  License: GPLv2
8
 
@@ -112,17 +112,13 @@ If you do want to work with shortcodes, we've also introduce a new, more powerfu
112
 
113
  **<a href="http://www.nextgen-gallery.com/nextgen-gallery-shortcodes">Learn About NextGEN Gallery 2.0 Shortcodes</a>**
114
 
115
- Legacy shortcodes? For reference, we're also maintaining documentation on NextGEN Legacy shortcodes used in NextGEN 1.9.x and earlier. <a href="http://www.nextgen-gallery.com/shortcodes">See more on Legacy shortcodes</a>.
116
 
117
  For more information, feel free to visit the official website for the NextGEN Gallery <a href="http://www.nextgen-gallery.com" target="_blank">WordPress Gallery Plugin</a>.
118
 
119
  == Frequently Asked Questions ==
120
 
121
 
122
- = Why are my galleries not opening up in a lightbox after I move my site? =
123
-
124
- This is often due to the URL paths to the CSS and JavaScript files used by the Lightbox Effects not being changed to relevant addresses based on the new site. This article will help sort out this issue if that is the case: <a href="http://www.nextgen-gallery.com/galleries-opening-lightbox/" target="_blank">Why are my galleries not opening up in a lightbox?</a>.
125
-
126
  = Do you have documentation or tutorials? =
127
 
128
  Yes. See <a href="http://www.nextgen-gallery.com/help/" target="_blank">NextGEN Gallery Documentation</a>.
@@ -199,189 +195,6 @@ For more information, feel free to visit the official website for the NextGEN Ga
199
 
200
  == Changelog ==
201
 
202
- = V2.0.40 - 11.26.2013 =
203
- * NEW: Added the ability to apply lightbox effects to non-NGG images
204
- * NEW: Added NGG_HIDE_STRICT_ERRORS constant. Define and set to TRUE to hide strict errors
205
- * NEW: Added NEXTGEN_GALLERY_IMPORT_ROOT constant. Define and set to TRUE to browse from a custom directory
206
- * NEW: Added NGG_DEBUG constant. Define and set to TRUE to display helpful messages for debugging
207
- * NEW: Each custom table record will have an associated custom post record for expansion
208
- * NEW: Display helpful error messages when there's a problem uploading images
209
- * NEW: Add data-(src|thumbnail|image-id|title|description) attribute to gallery image anchors
210
- * NEW: Variant support for displayed gallery sources. Random images is limited to 5 variations
211
- * Fixed: Excessive creation of transients for random galleries
212
- * Fixed: Many issues prohibiting the ability to upload images
213
- * Fixed: Compatibility with NextGEN Gallery Export Plugin for Adobe Lightroom (thanks Vladimir!)
214
- * Fixed: Sorting in the Attach to Post interface
215
- * Fixed: HTML allowed in gallery/album descriptions
216
- * Fixed: Requests for galleries within albums that have numeric names are broken
217
- * Fixed: Call to a non-member function get() on WP_Query
218
- * Fixed: Ability to sort by Image ID in the Attach to Post interface
219
- * Fixed: Isolate the Attach to Post from implicit third-party script inclusion
220
- * Fixed: Check for the existance of thumbnails when generating urls, and if missing, generate new ones
221
- * Fixed: Compatibility with NextGEN Facebook OpenGraph+ plugin
222
- * Fixed: Various XML-RPC issues
223
- * Fixed: Widgets stylesheet not included
224
- * Fixed: Issue with color not being pre-selected when previewing Watermark
225
- * Fixed: E_NOTICE emitted when cleaning up cached image files
226
- * Fixed: E_NOTICE emitted when viewing display type settings
227
- * Fixed: Typo adjusting pcre.backtrack_limit for shortcodes
228
- * Fixed: Content within the tabs of the Attach to Post interface cut-off
229
- * Fixed: Routing problem which would cause conflicts with different display types on the same page
230
- * Fixed: Broken Dynamic CSS links on GoDaddy
231
- * Fixed: Ability to use HTML in gallery/album descriptions
232
- * Fixed: Sub-album requests conflicting with paginated galleries on the same page
233
- * Merged: Pull request from andreasE (https://bitbucket.org/photocrati/nextgen-gallery/pull-request/6/)
234
-
235
- = V2.0.33 - 10.21.2013 =
236
- * NEW: Requests /ngg_tag/[tagname] will create a displayed gallery
237
- * NEW: Option added to "Import Gallery" tab to use original images
238
- * Fixed: Links are broken on the ngg_tags-sitemap.xml file by WordPress SEO
239
- * Fixed: PHP notice: Attempt to assign property of non-object
240
- * Fixed: Undefined property warnings when using NextGEN Basic Thumbnails
241
- * Fixed: Detect if an applying a transient to a displayed gallery was successful
242
- * Fixed: Compatibility issues with BJ-Lazy-Load and Colorbox
243
- * Fixed: Pagination conflicts for multiple Imagebrowsers on the same page
244
- * Fixed: Ability to display previous exception with debug mode
245
- * Fixed: Tagclouds not working in multisite instances
246
- * Fixed: Load widgets.css when a widget is being used
247
- * Fixed: Installer should remove all instances of the component factory
248
- * Fixed: Widget settings interface not intuitive
249
- * Fixed: Inability to upload images in some Windows host environments
250
- * Fixed: Sorting images/galleries using the Attach To Post interface
251
- * Fixed: Fix detection of HTTPS (pull request by Leonhardt Wille)
252
- * Fixed: Compilation errors of regular expressions
253
- * Fixed: Pro galleries wouldn't display in environments using PHP 5.3.3 or less
254
- * Fixed: Scanning of router slug is now limited to the uri, not the url
255
- * Fixed: Show slideshow link isn't required for thumbnail/imagebrowser integration
256
- * Fixed: WordPress media-upload with 'singlepic' image size
257
- * Fixed: Use target=_blank when the link setting is provided for NextGEN Basic Singlepic
258
- * Fixed: Only display rendering errors if WP_DEBUG is enabled
259
-
260
- = V2.0.31 - 10.03.2013 =
261
- * NEW: Restored AJAX pagination for NextGEN Basic ImageBrowser display type
262
- * Fixed: Compatibility with WordPress Local SEO by Yoast
263
- * Fixed: Inability to upload images if image_slug field was missing in database
264
- * Fixed: Integration of NextGEN Basic Thumbnail and NextGEN Basic Slideshow display types
265
- * Fixed: Photocrati Resource Manager further adjusted to be third-party friendly
266
- * Fixed: Added the ability to find legacy templates in both the child/parent theme directories
267
- * Fixed: JavaScript errors in Attach to Post interface
268
- * Fixed: Router can handle port numbers in urls
269
- * Fixed: Carousel template was linking to NextGEN Basic ImageBrowser view
270
- * Fixed: SQL query generated for displayed galleries using tags as source
271
- * Fixed: 3rd party compat: raise & never lower pcre.backtrack_limit
272
-
273
- = V2.0.30 - 09.25.2013 =
274
- * NEW: Restored the ability to use imagebrowser display type instead of a lightbox effect
275
- * Changed: Displayed galleries are no longer rendered in RSS feeds
276
- * Changed: Removed "Plugin Check" widget from overview page
277
- * Fixed: Silence PHP warnings/errors in an output buffer for AJAX actions
278
- * Fixed: Compatibility issue with WordPress SEO and broken site maps (and large error_logs)
279
- * Fixed: Compatibility issue with AJAX Event Calendar (and possibly others)
280
- * Fixed: Adjusted Photocrati Resource Manager to be third-party friendly
281
- * Fixed: Fixed empty result set for displayed galleries selecting 'All' tags
282
- * Fixed: URL generation for imagebrowser pagination links
283
- * Fixed: Ensure that image meta is imported on creation
284
- * Fixed: Ensure that transients are removed when an external object cache is used
285
- * Fixed: Don't load pluggable.php. This will fix plugin conflicts
286
- * Fixed: In Attach to Post interface, galleries created in one tab weren't showing in another
287
- * Fixed: Don't output frame events cookie for XML-RPC requests
288
-
289
- = V2.0.27 - 09.18.2013 =
290
- * Fixed: Reduce performance impact of purging displayed gallery transients
291
-
292
- = V2.0.25 - 09.18.2013 =
293
- * Reverting to the 2.0.21 codebase, due to major performance issues in 2.0.23 and 2.0.24
294
-
295
- = V2.0.23 - 09.16.2013 =
296
- * NEW: WP-Cron job to periodically clean-up displayed gallery transients
297
- * NEW: Added "excluded_container_ids" as parameter for ngg_images shortcode
298
- * Fixed: Lightbox effect is honoured by all display types
299
- * Fixed: Highslide displays images from the correct displayed galleries
300
- * Fixed: Ensure that sub-albums display correctly when the word "album" is part of a slug
301
- * Fixed: Ensure that sub-albums display correctly when numerical slugs are used
302
- * Fixed: Related images heading only added when Related Images functionality is enabled
303
- * Fixed: PHP Warning about undefined index when viewing basic albums
304
- * Fixed: AJAX handling is third-party compatible
305
- * Fixed: Image date is no longer overwritten when an image is modified
306
- * Fixed: Fixed issue with displayed galleries using source='tags'
307
- * Fixed: Problem with transient cache not getting flushed properly from Other Options page
308
- * Fixed: Use correct gallery/transient ID when ajax pagination is used
309
-
310
- = V2.0.21 - 09.09.2013 =
311
- * NEW: Multisite support
312
- * Changed: Default image quality set to 100 for generated images
313
- * Changed: Removed dependence on simplehtmldom library
314
- * Fixed: Related images functionality works as it did in 1.9.x
315
- * Fixed: Don't compress inline JavaScript in post/page content
316
- * Fixed: Click-to-advance slideshow behavior for slideshows
317
- * Fixed: Security warnings from VaultPress
318
- * Fixed: View as Slideshow link works with AJAX pagination
319
- * Fixed: Broken links on Overview page
320
- * Fixed: Backup images option
321
- * Fixed: Stylesheet url generated correctly for Windows hosts
322
- * Fixed: Compatibility with NextGen Custom Fields plugin
323
- * Fixed: Compatibility with Adsense Explosion plugin
324
- * Fixed: Suppress wp_footer notices unless WP_DEBUG is set to TRUE
325
-
326
- = V2.0.17 - 08.30.2013 =
327
- Fixed: Match legacy behaviour when changing gallery path, i.e. don't move files
328
-
329
- = V2.0.14 - 08.27.2013 =
330
- * NEW: Added the ability to override thumbnail settings for NextGEN Basic Albums
331
- * NEW: Shortcode Manager API, which ensures that shortcodes are outputted as intended
332
- * Changed: Re-added the ability to select the original image size for widgets
333
- * Fixed: Ensure that stylesheet url returned is correct for Windows hosts
334
- * Fixed: Broken links and lightbox effects with AJAX pagination
335
- * Fixed: Try to ensure that third party plugins don't add content to our dynamic JS
336
- * Fixed: Improved reliability of iframely.js
337
- * Fixed: Ensure that urls are generated correctly in HTTPs environments
338
- * Fixed: Datamapper works correctly in environments where temporary tables aren't supported
339
- * Fixed: Fixed an issue with thickbox loading animation when home url differs from site url
340
-
341
- = V2.0.11 - 08.19.2013 =
342
- * NEW: Added "run_ngg_resource_manager" hook to by-pass our resource manager
343
- * Changed: Removed "Reset & Uninstall" tab, for now
344
- * Fixed: Compatibility with W3 Total Cache. Please flush cache after updating.
345
- * Fixed: Conflicts with Photocrati Theme Galleries
346
- * Fixed: Blank Attach to Post interface window
347
- * Fixed: Fixed ability to change Lightbox Effect settings
348
- * Fixed: Implemented techniques to ensure WP_Query variables aren't overwritten
349
- * Fixed: Enqueuing AJAX JS libraries twice in wp-admin
350
- * Fixed: Encoding issues
351
- * Fixed: PHP warnings caused by accessing unserialized data as array
352
- * Fixed: Fixed installer issues
353
-
354
- = V2.0.7 - 08.09.2013 =
355
- * NEW: New resource manager that fixes many plugin and theme incompatibilities
356
- * NEW: Styles (custom stylesheets) should reside in wp-content/ngg_styles
357
- * NEW: Added option to "Other Options -> Misc" to control maximum images returned
358
- * Secured: Removed default connector for jQuery FileTree library
359
- * Changed: Updated the simplehtmldom library to version 1.5
360
- * Changed: jQuery is now enqueued at the beginning of every request
361
- * Fixed: Incompatibilities with BuddyPress
362
- * Fixed: Incompatibilities with Events+, bbPress, Custom Permalinks, and many other plugins
363
- * Fixed: Incompcatibilities with Member Access, AMember, Magic Fields, and More Fields
364
- * Fixed: Incompatibilities with Elegant Themes, Oxygen, Responsive, and many other themes
365
- * Fixed: Ensure that gallery images don't have a border by default
366
- * Fixed: Conflict between imagebrowser and album urls
367
- * Fixed: Reverted default gallerypath to wp-content/gallery/
368
- * Fixed: Upgrade-safe way of overriding Styles
369
- * Fixed: Generation of AJAX url is now based on slug
370
- * Fixed: Restore nggShowGallery and nggShowSlideshow as wrappers to new API
371
- * Fixed: Always use domain as specified by WordPress Site URL
372
- * Fixed: Use WordPress Home URL over Site URL when appropriate
373
- * Fixed: Numerous pagination issues
374
- * Fixed: Adjusted our forms to comply with WordPress Firewalls
375
- * Fixed: Correct use of select2 DOM selector for maximum compatibility
376
- * Fixed: Path and URL calculations for Windows and UNIX environments
377
- * Fixed: Ensure that pluggable.php is loaded at the start of every request
378
- * Fixed: Fancybox: adjust CSS for further box-sizing protection from themes
379
- * Fixed: Use PHP 5.2.1 compatible named pattern matching syntax
380
- * Fixed: Remove usage of __DIR__ constant not supported by PHP 5.2.x
381
- * Fixed: Removed dependency on mb_string PHP module
382
- * Fixed: Allow "No Lightbox" as an option for Lightbox Effects
383
- * Fixed: Warning: "Invalid CRT parameters detected" for Windows environments
384
-
385
  = V2.0 - 07.30.2013 =
386
  * NEW: Improved user experience throughout the plugin, settings and usage.
387
  * NEW: Plupload queue uploader that allows for bulk and zip uploads within the same interface.
@@ -656,4 +469,4 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
656
  == Upgrade Notice ==
657
 
658
  = 1.5.5 =
659
- * Compatibility issue for post thumbnails with WP2.9 and WP3.0. No Database changes...
1
  === NextGEN Gallery ===
2
  Contributors: photocrati
3
  Tags:gallery,image,images,photo,photos,picture,pictures,slideshow,flash,media,thumbnails,photo-albums,nextgen-gallery,nextgen
4
+ Requires at least: 3.5
5
+ Tested up to: 3.5.2
6
  Stable tag: trunk
7
  License: GPLv2
8
 
112
 
113
  **<a href="http://www.nextgen-gallery.com/nextgen-gallery-shortcodes">Learn About NextGEN Gallery 2.0 Shortcodes</a>**
114
 
115
+ Legacy shortcodes? For reference, we're also maintaining documentation on NextGEN Legacy shortcakes used in NextGEN 1.9.x and earlier. <a href="http://www.nextgen-gallery.com/shortcodes">See more on Legacy shortcakes</a>.
116
 
117
  For more information, feel free to visit the official website for the NextGEN Gallery <a href="http://www.nextgen-gallery.com" target="_blank">WordPress Gallery Plugin</a>.
118
 
119
  == Frequently Asked Questions ==
120
 
121
 
 
 
 
 
122
  = Do you have documentation or tutorials? =
123
 
124
  Yes. See <a href="http://www.nextgen-gallery.com/help/" target="_blank">NextGEN Gallery Documentation</a>.
195
 
196
  == Changelog ==
197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  = V2.0 - 07.30.2013 =
199
  * NEW: Improved user experience throughout the plugin, settings and usage.
200
  * NEW: Plupload queue uploader that allows for bulk and zip uploads within the same interface.
469
  == Upgrade Notice ==
470
 
471
  = 1.5.5 =
472
+ * Compatibility issue for post thumbnails with WP2.9 and WP3.0. No Database changes...
wordpress_helpers.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Most use site_url() as a base url. But, site_url()
4
+ // doesn't always reflect what the user has requested using the browser.
5
+ // For example, the site_url() might be 'example.com', but the user typed
6
+ // 'www.example.com' instead. We need to match whatever the user used
7
+ // otherwise we'll get DOM permission errors
8
+ function real_site_url($path="", $scheme=NULL, $admin_url=FALSE)
9
+ {
10
+ // determine if we need to edit $path
11
+ $parsed_url = parse_url(site_url());
12
+
13
+ if (isset($parsed_url['path']))
14
+ $exploded_url = explode('/', ltrim($parsed_url['path'], '/'));
15
+
16
+ // if site_url() returns subdirectories as part of the site url we must strip those from the requested path so
17
+ // wordpress won't just add them again when we call site_url()
18
+ if (!empty($exploded_url))
19
+ {
20
+ $exploded_path = explode('/', ltrim($path, '/'));
21
+ $str = '';
22
+
23
+ foreach ($exploded_url as $pos => $val) {
24
+ if ($exploded_path[$pos] == $val)
25
+ unset($exploded_path[$pos]);
26
+ }
27
+
28
+ foreach ($exploded_path as $tmp) {
29
+ $str .= '/' . $tmp;
30
+ }
31
+
32
+ $path = $str;
33
+ }
34
+
35
+ $site_url = $admin_url ? admin_url($path, $scheme) : site_url($path, $scheme);
36
+
37
+ if (preg_match("/http(s)?:\/\/([^\/]*)/", $site_url, $match)) {
38
+ $user_domain = $_SERVER['SERVER_NAME'];
39
+ $site_domain = $match[2];
40
+ $site_url = str_replace($site_domain, $user_domain, $site_url);
41
+ }
42
+
43
+ return $site_url;
44
+ }
45
+
46
+ // Most use admin_url() as a base url. But, admin_url()
47
+ // doesn't always reflect what the user has requested using the browser.
48
+ // For example, the site_url() might be 'example.com', but the user typed
49
+ // 'www.example.com' instead. We need to match whatever the user used
50
+ // otherwise we'll get DOM permission errors
51
+ function real_admin_url($path="", $scheme=NULL)
52
+ {
53
+ return real_site_url($path, $scheme, TRUE);
54
+ }
55
+
56
+
57
+ // Returns TRUE if we're viewing the frontend of the site
58
+ function is_frontend()
59
+ {
60
+ return !is_backend();
61
+ }
62
+
63
+
64
+ // Returns TRUE if we're viewing the backend (admin) of the site
65
+ function is_backend()
66
+ {
67
+ return strpos($_SERVER['REQUEST_URI'], 'wp-admin') !== FALSE;
68
+ }