1 <?php
2 /**
3 * Smarty plugin
4 *
5 * @package Smarty
6 * @subpackage PluginsFunction
7 */
9 /**
10 * @ignore
11 */
12 require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
13 /**
14 * @ignore
15 */
16 require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
18 /**
19 * Smarty {html_select_time} function plugin
20 *
21 * Type: function<br>
22 * Name: html_select_time<br>
23 * Purpose: Prints the dropdowns for time selection
24 *
25 * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time}
26 * (Smarty online manual)
27 * @author Roberto Berto <roberto@berto.net>
28 * @author Monte Ohrt <monte AT ohrt DOT com>
29 * @param array $params parameters
30 * @param Smarty_Internal_Template $template template object
31 * @return string
32 * @uses smarty_make_timestamp()
33 */
34 function smarty_function_html_select_time($params, $template)
35 {
36 $prefix = "Time_";
37 $field_array = null;
38 $field_separator = "\n";
39 $option_separator = "\n";
40 $time = null;
42 $display_hours = true;
43 $display_minutes = true;
44 $display_seconds = true;
45 $display_meridian = true;
47 $hour_format = '%02d';
48 $hour_value_format = '%02d';
49 $minute_format = '%02d';
50 $minute_value_format = '%02d';
51 $second_format = '%02d';
52 $second_value_format = '%02d';
54 $hour_size = null;
55 $minute_size = null;
56 $second_size = null;
57 $meridian_size = null;
59 $all_empty = null;
60 $hour_empty = null;
61 $minute_empty = null;
62 $second_empty = null;
63 $meridian_empty = null;
65 $all_id = null;
66 $hour_id = null;
67 $minute_id = null;
68 $second_id = null;
69 $meridian_id = null;
71 $use_24_hours = true;
72 $minute_interval = 1;
73 $second_interval = 1;
75 $extra_attrs = '';
76 $all_extra = null;
77 $hour_extra = null;
78 $minute_extra = null;
79 $second_extra = null;
80 $meridian_extra = null;
82 foreach ($params as $_key => $_value) {
83 switch ($_key) {
84 case 'time':
85 if (!is_array($_value)) {
86 $time = smarty_make_timestamp($_value);
87 }
88 break;
90 case 'prefix':
91 case 'field_array':
93 case 'field_separator':
94 case 'option_separator':
96 case 'all_extra':
97 case 'hour_extra':
98 case 'minute_extra':
99 case 'second_extra':
100 case 'meridian_extra':
102 case 'all_empty':
103 case 'hour_empty':
104 case 'minute_empty':
105 case 'second_empty':
106 case 'meridian_empty':
108 case 'all_id':
109 case 'hour_id':
110 case 'minute_id':
111 case 'second_id':
112 case 'meridian_id':
114 case 'hour_format':
115 case 'hour_value_format':
116 case 'minute_format':
117 case 'minute_value_format':
118 case 'second_format':
119 case 'second_value_format':
120 $$_key = (string)$_value;
121 break;
123 case 'display_hours':
124 case 'display_minutes':
125 case 'display_seconds':
126 case 'display_meridian':
127 case 'use_24_hours':
128 $$_key = (bool)$_value;
129 break;
131 case 'minute_interval':
132 case 'second_interval':
134 case 'hour_size':
135 case 'minute_size':
136 case 'second_size':
137 case 'meridian_size':
138 $$_key = (int)$_value;
139 break;
141 default:
142 if (!is_array($_value)) {
143 $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
144 } else {
145 trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
146 }
147 break;
148 }
149 }
151 if (isset($params['time']) && is_array($params['time'])) {
152 if (isset($params['time'][$prefix . 'Hour'])) {
153 // $_REQUEST[$field_array] given
154 foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) {
155 $_variableName = '_' . strtolower($_elementName);
156 $$_variableName = isset($params['time'][$prefix . $_elementName])
157 ? $params['time'][$prefix . $_elementName]
158 : date($_elementKey);
159 }
160 $_meridian = isset($params['time'][$prefix . 'Meridian'])
161 ? (' ' . $params['time'][$prefix . 'Meridian'])
162 : '';
163 $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian );
164 list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
165 } elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) {
166 // $_REQUEST given
167 foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) {
168 $_variableName = '_' . strtolower($_elementName);
169 $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName])
170 ? $params['time'][$field_array][$prefix . $_elementName]
171 : date($_elementKey);
172 }
173 $_meridian = isset($params['time'][$field_array][$prefix . 'Meridian'])
174 ? (' ' . $params['time'][$field_array][$prefix . 'Meridian'])
175 : '';
176 $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian );
177 list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
178 } else {
179 // no date found, use NOW
180 list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
181 }
182 } elseif ($time === null) {
183 list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s'));
184 } else {
185 list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
186 }
188 // generate hour <select>
189 if ($display_hours) {
190 $_html_hours = '';
191 $_extra = '';
192 $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour');
193 if ($all_extra) {
194 $_extra .= ' ' . $all_extra;
195 }
196 if ($hour_extra) {
197 $_extra .= ' ' . $hour_extra;
198 }
200 $_html_hours = '<select name="' . $_name . '"';
201 if ($hour_id !== null || $all_id !== null) {
202 $_html_hours .= ' id="' . smarty_function_escape_special_chars(
203 $hour_id !== null ? ( $hour_id ? $hour_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
204 ) . '"';
205 }
206 if ($hour_size) {
207 $_html_hours .= ' size="' . $hour_size . '"';
208 }
209 $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator;
211 if (isset($hour_empty) || isset($all_empty)) {
212 $_html_hours .= '<option value="">' . ( isset($hour_empty) ? $hour_empty : $all_empty ) . '</option>' . $option_separator;
213 }
215 $start = $use_24_hours ? 0 : 1;
216 $end = $use_24_hours ? 23 : 12;
217 for ($i=$start; $i <= $end; $i++) {
218 $_val = sprintf('%02d', $i);
219 $_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i);
220 $_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i);
222 if ($use_24_hours) {
223 $selected = $_hour == $_val;
224 } else {
225 $_hour12 = $_hour == 0
226 ? 12
227 : ($_hour <= 12 ? $_hour : $_hour -12);
228 }
230 $selected = $use_24_hours ? $_hour == $_val : $_hour12 == $_val;
231 $_html_hours .= '<option value="' . $_value . '"'
232 . ($selected ? ' selected="selected"' : '')
233 . '>' . $_text . '</option>' . $option_separator;
234 }
236 $_html_hours .= '</select>';
237 }
239 // generate minute <select>
240 if ($display_minutes) {
241 $_html_minutes = '';
242 $_extra = '';
243 $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute');
244 if ($all_extra) {
245 $_extra .= ' ' . $all_extra;
246 }
247 if ($minute_extra) {
248 $_extra .= ' ' . $minute_extra;
249 }
251 $_html_minutes = '<select name="' . $_name . '"';
252 if ($minute_id !== null || $all_id !== null) {
253 $_html_minutes .= ' id="' . smarty_function_escape_special_chars(
254 $minute_id !== null ? ( $minute_id ? $minute_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
255 ) . '"';
256 }
257 if ($minute_size) {
258 $_html_minutes .= ' size="' . $minute_size . '"';
259 }
260 $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator;
262 if (isset($minute_empty) || isset($all_empty)) {
263 $_html_minutes .= '<option value="">' . ( isset($minute_empty) ? $minute_empty : $all_empty ) . '</option>' . $option_separator;
264 }
266 $selected = $_minute - $_minute % $minute_interval;
267 for ($i=0; $i <= 59; $i += $minute_interval) {
268 $_val = sprintf('%02d', $i);
269 $_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i);
270 $_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i);
271 $_html_minutes .= '<option value="' . $_value . '"'
272 . ($selected == $i ? ' selected="selected"' : '')
273 . '>' . $_text . '</option>' . $option_separator;
274 }
276 $_html_minutes .= '</select>';
277 }
279 // generate second <select>
280 if ($display_seconds) {
281 $_html_seconds = '';
282 $_extra = '';
283 $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second');
284 if ($all_extra) {
285 $_extra .= ' ' . $all_extra;
286 }
287 if ($second_extra) {
288 $_extra .= ' ' . $second_extra;
289 }
291 $_html_seconds = '<select name="' . $_name . '"';
292 if ($second_id !== null || $all_id !== null) {
293 $_html_seconds .= ' id="' . smarty_function_escape_special_chars(
294 $second_id !== null ? ( $second_id ? $second_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
295 ) . '"';
296 }
297 if ($second_size) {
298 $_html_seconds .= ' size="' . $second_size . '"';
299 }
300 $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator;
302 if (isset($second_empty) || isset($all_empty)) {
303 $_html_seconds .= '<option value="">' . ( isset($second_empty) ? $second_empty : $all_empty ) . '</option>' . $option_separator;
304 }
306 $selected = $_second - $_second % $second_interval;
307 for ($i=0; $i <= 59; $i += $second_interval) {
308 $_val = sprintf('%02d', $i);
309 $_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i);
310 $_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i);
311 $_html_seconds .= '<option value="' . $_value . '"'
312 . ($selected == $i ? ' selected="selected"' : '')
313 . '>' . $_text . '</option>' . $option_separator;
314 }
316 $_html_seconds .= '</select>';
317 }
319 // generate meridian <select>
320 if ($display_meridian && !$use_24_hours) {
321 $_html_meridian = '';
322 $_extra = '';
323 $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian');
324 if ($all_extra) {
325 $_extra .= ' ' . $all_extra;
326 }
327 if ($meridian_extra) {
328 $_extra .= ' ' . $meridian_extra;
329 }
331 $_html_meridian = '<select name="' . $_name . '"';
332 if ($meridian_id !== null || $all_id !== null) {
333 $_html_meridian .= ' id="' . smarty_function_escape_special_chars(
334 $meridian_id !== null ? ( $meridian_id ? $meridian_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
335 ) . '"';
336 }
337 if ($meridian_size) {
338 $_html_meridian .= ' size="' . $meridian_size . '"';
339 }
340 $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator;
342 if (isset($meridian_empty) || isset($all_empty)) {
343 $_html_meridian .= '<option value="">' . ( isset($meridian_empty) ? $meridian_empty : $all_empty ) . '</option>' . $option_separator;
344 }
346 $_html_meridian .= '<option value="am"'. ($_hour < 12 ? ' selected="selected"' : '') .'>AM</option>' . $option_separator
347 . '<option value="pm"'. ($_hour < 12 ? '' : ' selected="selected"') .'>PM</option>' . $option_separator
348 . '</select>';
349 }
351 $_html = '';
352 foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) {
353 if (isset($$k)) {
354 if ($_html) {
355 $_html .= $field_separator;
356 }
357 $_html .= $$k;
358 }
359 }
361 return $_html;
362 }
364 ?>