1<?php 2 3/** 4 * 5 * Use to overlay thumbnail images with icons depending on the state of the image. 6 * 7 * 8 * Thumbnails may be flagged with the following icons: 9 * <ul> 10 * <li><img src="%WEBPATH%/%ZENFOLDER%/%PLUGIN_FOLDER%/flag_thumbnail/new.png" />: <i>New</i>—images whose <var>date</var> (or <var>mtime</var>) are within the selected "range" of the current day.</li> 11 * <li><img src="%WEBPATH%/%ZENFOLDER%/%PLUGIN_FOLDER%/flag_thumbnail/lock.png" />: <i>Protected</i>—images which are in a password protected album or because 12 * a parent album is password protected.</li> 13 * <li><img src="%WEBPATH%/%ZENFOLDER%/%PLUGIN_FOLDER%/flag_thumbnail/action.png" />: <i>Un-published</i>—images that are marked as not visible.</li> 14 * <li><img src="%WEBPATH%/%ZENFOLDER%/%PLUGIN_FOLDER%/flag_thumbnail/GPS.png" />: <i>Geotagged</i>—images which have latitude/longitude information in their metadata.</li> 15 * </ul> 16 * 17 * The icon with which the thumbnail is flagged is selectable by option. The above standard icons are provided as defaults. 18 * Additional icons can be used by placing them in the <var>%USER_PLUGIN_FOLDER%/flag_thumbnail</var> folder. 19 * 20 * @author Stephen Billard (sbillard), Malte Müller (acrylian) 21 * @package plugins 22 * @subpackage flag-thumbnail 23 */ 24$plugin_description = gettext('Overlay icons over thumbnails to indicate image status.'); 25$plugin_author = "Stephen Billard (sbillard), Malte Müller (acrylian)"; 26$plugin_category = gettext('Media'); 27$option_interface = 'flag_thumbnail'; 28 29zp_register_filter('standard_image_thumb_html', 'flag_thumbnail::std_image_thumbs'); 30zp_register_filter('standard_album_thumb_html', 'flag_thumbnail::std_album_thumbs', 99); 31zp_register_filter('custom_album_thumb_html', 'flag_thumbnail::custom_album_thumbs', 99); 32zp_register_filter('custom_image_html', 'flag_thumbnail::custom_images', 99); 33 34/** 35 * Plugin option handling class 36 * 37 */ 38class flag_thumbnail { 39 40 function __construct() { 41 setOptionDefault('flag_thumbnail_date', 'date'); 42 setOptionDefault('flag_thumbnail_range', '3'); 43 setOptionDefault('flag_thumbnail_new_text', 'NEW'); 44 setOptionDefault('flag_thumbnail_unpublished_text', 'unpub'); 45 setOptionDefault('flag_thumbnail_locked_text', 'locked'); 46 setOptionDefault('flag_thumbnail_geodata_text', 'GPS'); 47 setOptionDefault('flag_thumbnail_use_text', ''); 48 setOptionDefault('flag_thumbnail_flag_new', 1); 49 setOptionDefault('flag_thumbnail_flag_locked', 1); 50 setOptionDefault('flag_thumbnail_flag_unpublished', 1); 51 setOptionDefault('flag_thumbnail_flag_geodata', 1); 52 setOptionDefault('flag_thumbnail_new_icon', 'new.png'); 53 setOptionDefault('flag_thumbnail_unpublished_icon', 'action.png'); 54 setOptionDefault('flag_thumbnail_locked_icon', 'lock.png'); 55 setOptionDefault('flag_thumbnail_geodata_icon', 'GPS.png'); 56 } 57 58 function getOptionsSupported() { 59 $buttons = array(); 60 $icons = getPluginFiles('*.png', 'flag_thumbnail'); 61 foreach ($icons as $icon) { 62 $icon = str_replace(SERVERPATH, WEBPATH, $icon); 63 $buttons[' <img src="' . $icon . '" />'] = basename($icon); 64 } 65 return array('» ' . gettext('Criteria') => array('key' => 'flag_thumbnail_date', 'type' => OPTION_TYPE_SELECTOR, 66 'order' => 3.6, 67 'selections' => array(gettext('date') => "date", gettext('mtime') => "mtime"), 68 'desc' => gettext("Select the basis for considering if an image is new.")), 69 '» ' . gettext('Icon') . chr(0) . '3' => array('key' => 'flag_thumbnail_new_icon', 'type' => OPTION_TYPE_RADIO, 70 'order' => 3.1, 71 'buttons' => $buttons, 'behind' => true, 72 'desc' => gettext('Select the icon that will show for “new” images.')), 73 '» ' . gettext('Icon') . chr(0) . '2' => array('key' => 'flag_thumbnail_unpublished_icon', 'type' => OPTION_TYPE_RADIO, 74 'order' => 2.1, 75 'buttons' => $buttons, 'behind' => true, 76 'desc' => gettext('Select the icon that will show for “un-published” images.')), 77 '» ' . gettext('Icon') . chr(0) . '4' => array('key' => 'flag_thumbnail_locked_icon', 'type' => OPTION_TYPE_RADIO, 78 'order' => 4.1, 79 'buttons' => $buttons, 'behind' => true, 80 'desc' => gettext('Select the icon that will show for “Protected” images.')), 81 '» ' . gettext('Icon') . chr(0) . '5' => array('key' => 'flag_thumbnail_geodata_icon', 'type' => OPTION_TYPE_RADIO, 82 'order' => 5.1, 83 'buttons' => $buttons, 'behind' => true, 84 'desc' => gettext('Select the icon that will show for images tagged with geodata.')), 85 gettext('Un-published') => array('key' => 'flag_thumbnail_flag_unpublished', 'type' => OPTION_TYPE_CHECKBOX, 86 'order' => 2, 87 'desc' => gettext('Thumbnails for images which are not <em>published</em> will be marked.')), 88 gettext('Protected') => array('key' => 'flag_thumbnail_flag_locked', 'type' => OPTION_TYPE_CHECKBOX, 89 'order' => 4, 90 'desc' => gettext('Thumbnails for images which are password protected or in password protected albums will be marked.')), 91 gettext('New') => array('key' => 'flag_thumbnail_flag_new', 'type' => OPTION_TYPE_CHECKBOX, 92 'order' => 3, 93 'desc' => gettext('Thumbnails for images which have recently been added to the gallery will be marked.')), 94 gettext('Geotagged') => array('key' => 'flag_thumbnail_flag_geodata', 'type' => OPTION_TYPE_CHECKBOX, 95 'order' => 5, 96 'desc' => gettext('Thumbnails for images which are geodata tagged will be marked.')), 97 '» ' . gettext('Text') . chr(0) . '5' => array('key' => 'flag_thumbnail_geodata_text', 'type' => OPTION_TYPE_TEXTBOX, 98 'order' => 5.5, 99 'desc' => gettext("Text flag for <em>geodata tagged</em> images.")), 100 5 => array('type' => OPTION_TYPE_NOTE, 101 'order' => 5.9, 102 'desc' => '<hr />'), 103 '» ' . gettext('Aging') => array('key' => 'flag_thumbnail_range', 'type' => OPTION_TYPE_TEXTBOX, 104 'order' => 3.7, 105 'desc' => gettext("The range in days until images are no longer flagged as new.")), 106 '» ' . gettext('Text') . chr(0) . '3' => array('key' => 'flag_thumbnail_new_text', 'type' => OPTION_TYPE_TEXTBOX, 107 'order' => 3.5, 108 'desc' => gettext("Text flag for <em>new</em> images.")), 109 3 => array('type' => OPTION_TYPE_NOTE, 110 'order' => 3.9, 111 'desc' => '<hr />'), 112 '» ' . gettext('Text') . chr(0) . '2' => array('key' => 'flag_thumbnail_unpublished_text', 'type' => OPTION_TYPE_TEXTBOX, 113 'order' => 2.5, 114 'desc' => gettext("Text flag for <em>un-published</em> images.")), 115 2 => array('type' => OPTION_TYPE_NOTE, 116 'order' => 2.9, 117 'desc' => '<hr />'), 118 '» ' . gettext('Text') . chr(0) . '4' => array('key' => 'flag_thumbnail_locked_text', 'type' => OPTION_TYPE_TEXTBOX, 119 'order' => 4.5, 120 'desc' => gettext("Text flag for <em>protected</em> images.")), 121 4 => array('type' => OPTION_TYPE_NOTE, 122 'order' => 4.9, 123 'desc' => '<hr />'), 124 gettext('Use text') => array('key' => 'flag_thumbnail_use_text', 'type' => OPTION_TYPE_CHECKBOX, 125 'order' => 8, 126 'desc' => gettext('If checked, the defined <em>text</em> will be used in place of the icon. (Use the class <code>textasnewflag</code> for styling "text" overlays.)')) 127 ); 128 } 129 130 private static function insert_class($html) { 131 global $_zp_current_album, $_zp_current_image; 132 if (getOption('flag_thumbnail_flag_new')) { 133 if (isset($_zp_current_image)) { 134 $obj = $_zp_current_image; 135 } else { 136 $obj = $_zp_current_album; 137 } 138 $html = '<span class="flag_thumbnail" style="position:relative; display:block;">' . "\n" . $html . "\n"; 139 switch (getOption('flag_thumbnail_date')) { 140 case "date": 141 $imagedatestamp = strtotime($obj->getDateTime()); 142 break; 143 case "mtime": 144 $imagedatestamp = $obj->get('mtime'); 145 break; 146 } 147 $not_older_as = (60 * 60 * 24 * getOption('flag_thumbnail_range')); 148 $age = (time() - $imagedatestamp); 149 if ($age <= $not_older_as) { 150 if (getOption('flag_thumbnail_use_text')) { 151 $text = getOption('flag_thumbnail_new_text'); 152 $html .= '<span class="textasnewflag" style="position: absolute;top: 10px;right: 6px;">' . $text . "</span>\n"; 153 } else { 154 $img = getPlugin('flag_thumbnail/' . getOption('flag_thumbnail_new_icon'), false, true); 155 $html .= '<img src="' . $img . '" class="imageasflag" alt="" style="position: absolute;top: 4px;right: 4px;"/>' . "\n"; 156 } 157 } 158 } 159 if (getOption('flag_thumbnail_flag_geodata')) { 160 if (isAlbumClass($obj)) { 161 $obj = $obj->getAlbumThumbImage(); 162 } 163 if (is_object($obj) && get_class($obj) == 'Image') { 164 $exif = $obj->getMetaData(); 165 if (!empty($exif['EXIFGPSLatitude']) && !empty($exif['EXIFGPSLongitude'])) { 166 if (getOption('flag_thumbnail_use_text')) { 167 $text = getOption('flag_thumbnail_geodata_text'); 168 $html .= '<span class="textasnewflag" style="position: absolute;bottom: 10px;right: 6px;">' . $text . "</span>\n"; 169 } else { 170 $img = getPlugin('flag_thumbnail/' . getOption('flag_thumbnail_geodata_icon'), false, true); 171 $html .= '<img src="' . $img . '" class="imageasflag" alt="" style="position: absolute;bottom: 4px;right: 4px;"/>' . "\n"; 172 } 173 } 174 } 175 } 176 $i = strpos($html, 'class='); 177 if ($i !== false) { 178 $locked = strpos($html, 'password_protected', $i + 7) !== false; 179 $unpublished = strpos($html, 'not_visible', $i + 7) !== false; 180 181 if ($locked && getOption('flag_thumbnail_flag_locked')) { 182 if (getOption('flag_thumbnail_use_text')) { 183 $text = getOption('flag_thumbnail_locked_text'); 184 $html .= '<span class="textasnewflag" style="position: absolute;bottom: 10px;left: 4px;">' . $text . "</span>\n"; 185 } else { 186 $img = getPlugin('flag_thumbnail/' . getOption('flag_thumbnail_locked_icon'), false, true); 187 $html .= '<img src="' . $img . '" class="imageasflag" alt="" style="position: absolute;bottom: 4px;left: 4px;"/>' . "\n"; 188 } 189 } 190 if ($unpublished && getOption('flag_thumbnail_flag_unpublished')) { 191 if (getOption('flag_thumbnail_use_text')) { 192 $text = getOption('flag_thumbnail_unpublished_text'); 193 $html .= '<span class="textasnewflag" style="position: absolute;top: 10px;left: 4px;">' . $text . "</span>\n"; 194 } else { 195 $img = getPlugin('flag_thumbnail/' . getOption('flag_thumbnail_unpublished_icon'), false, true); 196 $html .= '<img src="' . $img . '" class="imageasflag" alt="" style="position: absolute;top: 4px;left: 4px;"/>' . "\n"; 197 } 198 } 199 } 200 $html .= "</span>\n"; 201 return $html; 202 } 203 204 static function custom_images($html, $thumbstandin) { 205 if ($thumbstandin) { 206 $html = flag_thumbnail::insert_class($html); 207 } 208 return $html; 209 } 210 211 static function std_image_thumbs($html) { 212 $html = flag_thumbnail::insert_class($html); 213 return $html; 214 } 215 216 static function std_album_thumbs($html) { 217 $html = flag_thumbnail::insert_class($html); 218 return $html; 219 } 220 221 static function custom_album_thumbs($html) { 222 $html = flag_thumbnail::insert_class($html); 223 return $html; 224 } 225 226} 227 228?>