1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15: class Horde_Core_Ui_VarRenderer_Html extends Horde_Core_Ui_VarRenderer
16: {
17: protected $_onLoadJS = array();
18:
19: protected function _renderVarInputDefault($form, &$var, &$vars)
20: {
21: return '<strong>Warning:</strong> Unknown variable type ' .
22: htmlspecialchars($var->getTypeName());
23: }
24:
25: protected function _renderVarInput_number($form, &$var, &$vars)
26: {
27: $value = $var->getValue($vars);
28: if ($var->type->getProperty('fraction')) {
29: $value = sprintf('%01.' . $var->type->getProperty('fraction') . 'f', $value);
30: }
31: $linfo = Horde_Nls::getLocaleInfo();
32: 33:
34: if (!empty($linfo['mon_decimal_point'])) {
35: $value = str_replace('.', $linfo['mon_decimal_point'], $value);
36: }
37: return sprintf('<input type="text" size="5" name="%s" id="%s" value="%s"%s />',
38: htmlspecialchars($var->getVarName()),
39: $this->_genID($var->getVarName(), false),
40: $value,
41: $this->_getActionScripts($form, $var)
42: );
43: }
44:
45: protected function _renderVarInput_int($form, &$var, &$vars)
46: {
47: return sprintf('<input type="number" size="5" name="%s" id="%s" value="%s"%s />',
48: htmlspecialchars($var->getVarName()),
49: $this->_genID($var->getVarName(), false),
50: htmlspecialchars($var->getValue($vars)),
51: $this->_getActionScripts($form, $var)
52: );
53: }
54:
55: protected function _renderVarInput_octal($form, &$var, &$vars)
56: {
57: return sprintf('<input type="text" size="5" name="%s" id="%s" value="%s"%s />',
58: htmlspecialchars($var->getVarName()),
59: $this->_genID($var->getVarName(), false),
60: sprintf('0%o', octdec($var->getValue($vars))),
61: $this->_getActionScripts($form, $var)
62: );
63: }
64:
65: protected function _renderVarInput_intlist($form, &$var, &$vars)
66: {
67: return sprintf('<input type="text" name="%s" id="%s" value="%s"%s />',
68: htmlspecialchars($var->getVarName()),
69: $this->_genID($var->getVarName(), false),
70: htmlspecialchars($var->getValue($vars)),
71: $this->_getActionScripts($form, $var)
72: );
73: }
74:
75: protected function _renderVarInput_text($form, &$var, &$vars)
76: {
77: $maxlength = $var->type->getMaxLength();
78: return sprintf('<input type="text" name="%s" id="%s" size="%s" value="%s" %s%s%s />',
79: htmlspecialchars($var->getVarName()),
80: $this->_genID($var->getVarName(), false),
81: $var->type->getSize(),
82: htmlspecialchars($var->getValue($vars)),
83: $var->isDisabled() ? ' disabled="disabled" ' : '',
84: empty($maxlength) ? '' : ' maxlength="' . $maxlength . '"',
85: $this->_getActionScripts($form, $var)
86: );
87: }
88:
89: protected function _renderVarInput_stringlist($form, &$var, &$vars)
90: {
91: return sprintf('<input type="text" size="60" name="%s" id="%s" value="%s"%s />',
92: htmlspecialchars($var->getVarName()),
93: $this->_genID($var->getVarName(), false),
94: htmlspecialchars($var->getValue($vars)),
95: $this->_getActionScripts($form, $var)
96: );
97: }
98:
99: protected function _renderVarInput_stringarray($form, &$var, &$vars)
100: {
101: return sprintf('<input type="text" size="60" name="%s" id="%s" value="%s"%s />',
102: htmlspecialchars($var->getVarName()),
103: $this->_genID($var->getVarName(), false),
104: htmlspecialchars(implode(', ', $var->getValue($vars))),
105: $this->_getActionScripts($form, $var)
106: );
107: }
108:
109: protected function _renderVarInput_phone($form, &$var, &$vars)
110: {
111: return sprintf('<input type="text" name="%s" id="%s" size="%s" value="%s" %s%s />',
112: htmlspecialchars($var->getVarName()),
113: $this->_genID($var->getVarName(), false),
114: $var->type->getSize(),
115: htmlspecialchars($var->getValue($vars)),
116: $var->isDisabled() ? ' disabled="disabled" ' : '',
117: $this->_getActionScripts($form, $var)
118: );
119: }
120:
121: protected function _renderVarInput_cellphone($form, &$var, &$vars)
122: {
123: return $this->_renderVarInput_phone($form, $var, $vars);
124: }
125:
126: protected function _renderVarInput_ipaddress($form, &$var, &$vars)
127: {
128: return sprintf('<input type="text" name="%s" id="%s" size="16" value="%s" %s%s />',
129: htmlspecialchars($var->getVarName()),
130: $this->_genID($var->getVarName(), false),
131: htmlspecialchars($var->getValue($vars)),
132: $var->isDisabled() ? ' disabled="disabled" ' : '',
133: $this->_getActionScripts($form, $var)
134: );
135: }
136:
137: protected function _renderVarInput_ip6address($form, &$var, &$vars)
138: {
139: return sprintf('<input type="text" name="%s" id="%s" size="40" value="%s" %s%s />',
140: htmlspecialchars($var->getVarName()),
141: $this->_genID($var->getVarName(), false),
142: htmlspecialchars($var->getValue($vars)),
143: $var->isDisabled() ? ' disabled="disabled" ' : '',
144: $this->_getActionScripts($form, $var)
145: );
146: }
147:
148: protected function _renderVarInput_file($form, &$var, &$vars)
149: {
150: return sprintf('<input type="file" size="30" name="%s" id="%s"%s />',
151: htmlspecialchars($var->getVarName()),
152: $this->_genID($var->getVarName(), false),
153: $this->_getActionScripts($form, $var));
154: }
155:
156: 157: 158:
159: protected function _renderVarInput_image($form, &$var, &$vars)
160: {
161: $image = $var->type->getImage($vars, $var);
162: $varname = $this->_genID($var->getVarName(), false);
163: Horde::addScriptFile('image.js', 'horde');
164: $html = '';
165:
166:
167: if (isset($image['img'])) {
168:
169: $html = sprintf('<input type="hidden" name="%s" id="%s" value="%s" />',
170: htmlspecialchars($var->getVarName()) . '[hash]',
171: $this->_genID($var->getVarName() . '[hash]', false),
172: $var->type->getRandomId());
173: }
174:
175:
176: if ($var->type->getProperty('max_filesize')) {
177: $html .= sprintf('<input type="hidden" name="MAX_FILE_SIZE" value="%d" />',
178: $var->type->getProperty('max_filesize'));
179: }
180:
181:
182: $html .= sprintf('<input type="file" size="30" name="%s" id="%s" />',
183: htmlspecialchars($var->getVarName()) . '[new]',
184: $this->_genID($var->getVarName() . '[new]', false));
185:
186:
187: if ($var->type->getProperty('show_upload')) {
188: $html .= ' ';
189: $html .= sprintf('<input class="button" name="%s" id="%s" type="submit" value="%s" /> ',
190: 'do_' . htmlspecialchars($var->getVarName()),
191: 'do_' . $this->_genID($var->getVarName(), false),
192: Horde_Core_Translation::t("Upload"));
193: }
194:
195: if (!empty($image['img'])) {
196: $html .= ' ';
197: $html .= sprintf('<input class="button" name="%s" id="%S" type="submit" value="%s" /> ',
198: 'remove_' . htmlspecialchars($var->getVarName()),
199: 'remove_' . $this->_genID($var->getVarName(), false),
200: Horde_Core_Translation::t("Remove"));
201: 202:
203: $html .= '<br />';
204: $img = Horde::url($GLOBALS['registry']->get('webroot', 'horde') . '/services/images/view.php');
205: if (isset($image['img']['vfs_id'])) {
206:
207: $img->add(array(
208: 'f' => $image['img']['vfs_id'],
209: 'p' => $image['img']['vfs_path'],
210: 's' => 'vfs'
211: ));
212: } else {
213:
214: $img->add('f', $image['img']['file']);
215: }
216:
217:
218: $html .= Horde::link('#', Horde_Core_Translation::t("Reset"), '', '', 'showImage(\'' . $img . '\', \'_p_' . $varname . '\', true);') . Horde::img('image/refresh.png', Horde_Core_Translation::t("Reset")) . '</a>';
219:
220:
221: $html .= Horde::link('#', Horde_Core_Translation::t("Rotate Left"), '', '', 'showImage(\'' . $img->copy()->add(array('a' => 'rotate', 'v' => '270')) . '\', \'_p_' . $varname . '\', true);') . Horde::img('image/rotate-270.png', Horde_Core_Translation::t("Rotate Left")) . '</a>';
222:
223:
224: $html .= Horde::link('#', Horde_Core_Translation::t("Rotate 180"), '', '', 'showImage(\'' . $img->copy()->add(array('a' => 'rotate', 'v' => '180')) . '\', \'_p_' . $varname . '\', true);') . Horde::img('image/rotate-180.png', Horde_Core_Translation::t("Rotate 180")) . '</a>';
225:
226:
227: $html .= Horde::link('#', Horde_Core_Translation::t("Rotate Right"), '', '', 'showImage(\'' . $img->copy()->add(array('a' => 'rotate', 'v' => '90')) . '\', \'_p_' . $varname . '\', true);') . Horde::img('image/rotate-90.png', Horde_Core_Translation::t("Rotate Right")) . '</a>';
228:
229:
230: $html .= Horde::link('#', Horde_Core_Translation::t("Flip"), '', '', 'showImage(\'' . $img->copy()->add('a', 'flip') . '\', \'_p_' . $varname . '\', true);') . Horde::img('image/flip.png', Horde_Core_Translation::t("Flip")) . '</a>';
231:
232:
233: $html .= Horde::link('#', Horde_Core_Translation::t("Mirror"), '', '', 'showImage(\'' . $img->copy()->add('a', 'mirror') . '\', \'_p_' . $varname . '\', true);') . Horde::img('image/mirror.png', Horde_Core_Translation::t("Mirror")) . '</a>';
234:
235:
236: $html .= Horde::link('#', Horde_Core_Translation::t("Grayscale"), '', '', 'showImage(\'' . $img->copy()->add('a', 'grayscale') . '\', \'_p_' . $varname . '\', true);') . Horde::img('image/grayscale.png', Horde_Core_Translation::t("Grayscale")) . '</a>';
237:
238:
239: $html .= sprintf('%s<input type="text" size="4" onchange="src=getResizeSrc(\'%s\', \'%s\');showImage(src, \'_p_%s\', true);" %s />',
240: Horde_Core_Translation::t("w:"),
241: $img->copy()->add('a', 'resize'),
242: $varname,
243: $varname,
244: $this->_genID('_w_' . $varname));
245:
246:
247: $html .= sprintf('%s<input type="text" size="4" onchange="src=getResizeSrc(\'%s\', \'%s\');showImage(src, \'_p_%s\', true);" %s />',
248: Horde_Core_Translation::t("h:"),
249: $img->copy()->add('a', 'resize'),
250: $varname,
251: $varname,
252: $this->_genID('_h_' . $varname));
253:
254:
255: $html .= Horde::link('#', Horde_Core_Translation::t("Fix ratio"), '', '', 'src=getResizeSrc(\'' . $img->copy()->add('a', 'resize') . '\', \'' . $varname . '\', \'1\');showImage(src, \'_p_' . $varname . '\', true);') . Horde::img('ratio.png', Horde_Core_Translation::t("Fix ratio")) . '</a>';
256:
257:
258: if ($var->type->getProperty('show_keeporig')) {
259: $html .= sprintf('<input type="checkbox" class="checkbox" name="%s" id="%s"%s />%s' . "\n",
260: htmlspecialchars($var->getVarName()) . '[keep_orig]',
261: $varname . '[keep_orig]',
262: !empty($image['keep_orig']) ? ' checked="checked"' : '',
263: Horde_Core_Translation::t("Keep original?"));
264: }
265:
266:
267: $html .= '<br /><img src="' . $img . '" ' . $this->_genID('_p_' . $varname) . ">\n";
268: }
269:
270: return $html;
271: }
272:
273: protected function _renderVarInput_longtext($form, &$var, &$vars)
274: {
275: global $browser;
276:
277: $html = sprintf('<textarea name="%s" id="%s" cols="%s" rows="%s"%s%s>%s</textarea>',
278: htmlspecialchars($var->getVarName()),
279: $this->_genID($var->getVarName(), false),
280: (int)$var->type->getCols(),
281: (int)$var->type->getRows(),
282: $this->_getActionScripts($form, $var),
283: $var->isDisabled() ? ' disabled="disabled"' : '',
284: htmlspecialchars($var->getValue($vars)));
285:
286: if ($var->type->hasHelper('rte')) {
287: $GLOBALS['injector']->getInstance('Horde_Editor')->initialize(
288: array('id' => $this->_genID($var->getVarName(), false),
289: 'relativelinks' => $var->type->hasHelper('relativelinks'),
290: 'config' => array('extraPlugins' => 'syntaxhighlight')));
291: }
292:
293: if ($var->type->hasHelper() && $browser->hasFeature('javascript')) {
294: $html .= '<br /><table cellspacing="0"><tr><td>';
295: $imgId = $this->_genID($var->getVarName(), false) . 'ehelper';
296:
297: Horde::addScriptFile('open_html_helper.js', 'horde');
298:
299: if ($var->type->hasHelper('emoticons')) {
300: $filter = $GLOBALS['injector']->getInstance('Horde_Core_Factory_TextFilter')->create('emoticons');
301: $icon_list = array();
302:
303: foreach (array_flip($filter->getIcons()) as $icon => $string) {
304: $icon_list[] = array(
305: $filter->getIcon($icon),
306: $string
307: );
308: }
309:
310: Horde::addInlineJsVars(array(
311: 'Horde_Html_Helper.iconlist' => $icon_list
312: ));
313:
314: $html .= Horde::link('#', Horde_Core_Translation::t("Emoticons"), '', '', 'Horde_Html_Helper.open(\'emoticons\', \'' . $var->getVarName() . '\'); return false;') . Horde::img('emoticons/smile.png', Horde_Core_Translation::t("Emoticons"), 'id="' . $imgId . '"') . '</a>';
315: }
316: $html .= '</td></tr><tr><td><div ' . $this->_genID('htmlhelper_' . $var->getVarName()) . ' class="control"></div></td></tr></table>' . "\n";
317: }
318:
319: return $html;
320: }
321:
322: protected function _renderVarInput_countedtext($form, &$var, &$vars)
323: {
324: return sprintf('<textarea name="%s" id="%s" cols="%s" rows="%s"%s%s>%s</textarea>',
325: htmlspecialchars($var->getVarName()),
326: $this->_genID($var->getVarName(), false),
327: (int)$var->type->getCols(),
328: (int)$var->type->getRows(),
329: $this->_getActionScripts($form, $var),
330: $var->isDisabled() ? ' disabled="disabled"' : '',
331: htmlspecialchars($var->getValue($vars)));
332: }
333:
334: protected function _renderVarInput_address($form, &$var, &$vars)
335: {
336: return sprintf('<textarea name="%s" id="%s" cols="%s" rows="%s"%s%s>%s</textarea>',
337: htmlspecialchars($var->getVarName()),
338: $this->_genID($var->getVarName(), false),
339: (int)$var->type->getCols(),
340: (int)$var->type->getRows(),
341: $this->_getActionScripts($form, $var),
342: $var->isDisabled() ? ' disabled="disabled"' : '',
343: htmlspecialchars($var->getValue($vars)));
344: }
345:
346: protected function _renderVarInput_addresslink($form, &$var, &$vars)
347: {
348: return '';
349: }
350:
351: protected function _renderVarInput_pgp($form, &$var, &$vars)
352: {
353: return $this->_renderVarInput_longtext($form, $var, $vars);
354: }
355:
356: protected function _renderVarInput_smime($form, &$var, &$vars)
357: {
358: return $this->_renderVarInput_longtext($form, $var, $vars);
359: }
360:
361: protected function _renderVarInput_country($form, &$var, &$vars)
362: {
363: return $this->_renderVarInput_enum($form, $var, $vars);
364: }
365:
366: protected function _renderVarInput_date($form, &$var, &$vars)
367: {
368: return sprintf('<input type="text" name="%s" id="%s" value="%s"%s />',
369: htmlspecialchars($var->getVarName()),
370: $this->_genID($var->getVarName(), false),
371: htmlspecialchars($var->getValue($vars)),
372: $this->_getActionScripts($form, $var));
373: }
374:
375: protected function _renderVarInput_time($form, &$var, &$vars)
376: {
377: return sprintf('<input type="text" size="5" name="%s" id="%s" value="%s"%s />',
378: htmlspecialchars($var->getVarName()),
379: $this->_genID($var->getVarName(), false),
380: htmlspecialchars($var->getValue($vars)),
381: $this->_getActionScripts($form, $var));
382: }
383:
384: protected function _renderVarInput_hourminutesecond($form, &$var, &$vars)
385: {
386: $time = $var->type->getTimeParts($var->getValue($vars));
387:
388:
389: $hours = array('' => Horde_Core_Translation::t("hh"));
390: for ($i = 0; $i <= 23; $i++) {
391: $hours[$i] = $i;
392: }
393: $html = sprintf('<select name="%s[hour]" id="%s_hour_"%s>%s</select>',
394: htmlspecialchars($var->getVarName()),
395: $this->_genID($var->getVarName(), false),
396: $this->_getActionScripts($form, $var),
397: $this->selectOptions($hours, ($time['hour'] === '') ? '' : $time['hour']));
398:
399:
400: $minutes = array('' => Horde_Core_Translation::t("mm"));
401: for ($i = 0; $i <= 59; $i++) {
402: $m = sprintf('%02d', $i);
403: $minutes[$m] = $m;
404: }
405: $html .= sprintf('<select name="%s[minute]" id="%s_minute_"%s>%s</select>',
406: htmlspecialchars($var->getVarName()),
407: $this->_genID($var->getVarName(), false),
408: $this->_getActionScripts($form, $var),
409: $this->selectOptions($minutes, ($time['minute'] === '') ? '' : sprintf('%02d', $time['minute'])));
410:
411:
412: if (!$var->type->getProperty('show_seconds')) {
413: return $html;
414: }
415:
416:
417: $seconds = array('' => Horde_Core_Translation::t("ss"));
418: for ($i = 0; $i <= 59; $i++) {
419: $s = sprintf('%02d', $i);
420: $seconds[$s] = $s;
421: }
422: return $html . sprintf('<select name="%s[second]" id="%s_second_"%s>%s</select>',
423: htmlspecialchars($var->getVarName()),
424: $this->_genID($var->getVarName(), false),
425: $this->_getActionScripts($form, $var),
426: $this->selectOptions($seconds, ($time['second'] === '') ? '' : sprintf('%02d', $time['second'])));
427: }
428:
429: protected function _renderVarInput_monthyear($form, &$var, &$vars)
430: {
431: $dates = array();
432: $dates['month'] = array('' => Horde_Core_Translation::t("MM"),
433: 1 => Horde_Core_Translation::t("January"),
434: 2 => Horde_Core_Translation::t("February"),
435: 3 => Horde_Core_Translation::t("March"),
436: 4 => Horde_Core_Translation::t("April"),
437: 5 => Horde_Core_Translation::t("May"),
438: 6 => Horde_Core_Translation::t("June"),
439: 7 => Horde_Core_Translation::t("July"),
440: 8 => Horde_Core_Translation::t("August"),
441: 9 => Horde_Core_Translation::t("September"),
442: 10 => Horde_Core_Translation::t("October"),
443: 11 => Horde_Core_Translation::t("November"),
444: 12 => Horde_Core_Translation::t("December"));
445: $dates['year'] = array('' => Horde_Core_Translation::t("YYYY"));
446: if ($var->type->getProperty('start_year') > $var->type->getProperty('end_year')) {
447: for ($i = $var->type->getProperty('start_year'); $i >= $var->type->getProperty('end_year'); $i--) {
448: $dates['year'][$i] = $i;
449: }
450: } else {
451: for ($i = $var->type->getProperty('start_year'); $i <= $var->type->getProperty('end_year'); $i++) {
452: $dates['year'][$i] = $i;
453: }
454: }
455: return sprintf('<select name="%s" id="%s"%s>%s</select>',
456: $var->type->getMonthVar($var),
457: $var->type->getMonthVar($var),
458: $this->_getActionScripts($form, $var),
459: $this->selectOptions($dates['month'], $vars->get($var->type->getMonthVar($var)))) .
460: sprintf('<select name="%s" id="%s"%s>%s</select>',
461: $var->type->getYearVar($var),
462: $var->type->getYearVar($var),
463: $this->_getActionScripts($form, $var),
464: $this->selectOptions($dates['year'], $vars->get($var->type->getYearVar($var))));
465: }
466:
467: protected function _renderVarInput_monthdayyear($form, &$var, &$vars)
468: {
469: $js = "document.observe('Horde_Calendar:select', " .
470: "function(e) {" .
471: "var elt = e.element();" .
472: "elt.up().previous('SELECT[name$=\"[month]\"]').setValue(e.memo.getMonth() + 1);" .
473: "elt.up().previous('SELECT[name$=\"[day]\"]').setValue(e.memo.getDate());" .
474: "elt.up().previous('SELECT[name$=\"[year]\"]').setValue(e.memo.getFullYear());" .
475: "});\n";
476: Horde::addInlineScript($js, 'dom');
477: $dates = array();
478: $dates['month'] = array('' => Horde_Core_Translation::t("MM"),
479: '1' => Horde_Core_Translation::t("January"),
480: '2' => Horde_Core_Translation::t("February"),
481: '3' => Horde_Core_Translation::t("March"),
482: '4' => Horde_Core_Translation::t("April"),
483: '5' => Horde_Core_Translation::t("May"),
484: '6' => Horde_Core_Translation::t("June"),
485: '7' => Horde_Core_Translation::t("July"),
486: '8' => Horde_Core_Translation::t("August"),
487: '9' => Horde_Core_Translation::t("September"),
488: '10' => Horde_Core_Translation::t("October"),
489: '11' => Horde_Core_Translation::t("November"),
490: '12' => Horde_Core_Translation::t("December"));
491: $dates['day'] = array('' => Horde_Core_Translation::t("DD"));
492: for ($i = 1; $i <= 31; $i++) {
493: $dates['day'][$i] = $i;
494: }
495: $dates['year'] = array('' => Horde_Core_Translation::t("YYYY"));
496: if ($var->type->getProperty('start_year') > $var->type->getProperty('end_year')) {
497: for ($i = $var->type->getProperty('start_year'); $i >= $var->type->getProperty('end_year'); $i--) {
498: $dates['year'][$i] = $i;
499: }
500: } else {
501: for ($i = $var->type->getProperty('start_year'); $i <= $var->type->getProperty('end_year'); $i++) {
502: $dates['year'][$i] = $i;
503: }
504: }
505: $date = $var->type->getDateParts($var->getValue($vars));
506:
507:
508:
509: $html = '';
510: $date_parts = array('month', 'day', 'year');
511: foreach ($date_parts as $part) {
512: $html .= sprintf('<select name="%s" id="%s"%s>%s</select>',
513: htmlspecialchars($var->getVarName() . '[' . $part . ']'),
514: $this->_genID($var->getVarName(), false) . $part,
515: $this->_getActionScripts($form, $var),
516: $this->selectOptions($dates[$part], $date[$part]));
517: }
518:
519: if ($var->type->getProperty('picker') &&
520: $GLOBALS['browser']->hasFeature('javascript')) {
521: Horde_Core_Ui_JsCalendar::init();
522: $imgId = $this->_genID($var->getVarName(), false) . 'goto';
523: $html .= Horde::link('#', Horde_Core_Translation::t("Select a date"), '', '', 'Horde_Calendar.open(\'' . $imgId . '\', null)') . Horde::img('calendar.png', Horde_Core_Translation::t("Calendar"), 'id="' . $imgId . '"') . "</a>\n";
524: }
525:
526: return $html;
527: }
528:
529: protected function _renderVarInput_datetime(&$form, &$var, &$vars)
530: {
531: return $this->_renderVarInput_monthdayyear($form, $var, $vars) .
532: $this->_renderVarInput_hourminutesecond($form, $var, $vars);
533: }
534:
535: protected function _renderVarInput_sound(&$form, &$var, &$vars)
536: {
537: $value = htmlspecialchars($var->getValue($vars));
538: $html = '<ul class="sound-list">';
539: if (!$var->isRequired()) {
540: $html .= '<li><label><input type="radio" id="' . $this->_genID($var->getVarName(), false) . '" name="' . htmlspecialchars($var->getVarName()) . '" value=""' . (!$value ? ' checked="checked"' : '') . ' /> ' . Horde_Core_Translation::t("No Sound") . '</label></li>';
541: }
542: foreach ($var->type->getSounds() as $sound) {
543: $sound = htmlspecialchars($sound);
544: $html .= '<li><label><input type="radio" id="' . $this->_genID($var->getVarName(), false) . '" name="' . htmlspecialchars($var->getVarName()) . '" value="' . $sound . '"' . ($value == $sound ? ' checked="checked"' : '') . ' />' . $sound . '</label>'
545: . ' <embed autostart="false" src="'. Horde_Themes::sound($sound) . '" /></li>';
546: }
547: return $html . '</ul>';
548: }
549:
550: protected function _renderVarInput_colorpicker($form, &$var, &$vars)
551: {
552: global $registry, $browser;
553:
554: $varname = $this->_genID($var->getVarName(), false);
555: $color = $var->getValue($vars);
556: if ($color) {
557: $style = ' style="background-color:' . $color . ';color:'
558: . (Horde_Image::brightness($color) < 128 ? '#fff' : '#000') . '"';
559: } else {
560: $style = '';
561: }
562: $html = '<table cellspacing="0"><tr><td>'
563: . '<input type="text" size="10" maxlength="7" name="'
564: . htmlspecialchars($var->getVarName()) . '" id="' . $varname . '"' . $style
565: . ' value="' . htmlspecialchars($color)
566: . '" /></td>';
567: if ($browser->hasFeature('javascript')) {
568: Horde::addScriptFile('colorpicker.js', 'horde');
569: $html .= '<td>'
570: . Horde::link('#', Horde_Core_Translation::t("Color Picker"), '', '',
571: 'new ColorPicker({ color: \'' . htmlspecialchars($color) . '\', offsetParent: Event.element(event), update: [[\'' . $varname . '\', \'value\'], [\'' . $varname . '\', \'background\']] }); return false;')
572: . Horde::img('colorpicker.png', Horde_Core_Translation::t("Color Picker"), 'height="16"') . '</a></td>';
573: }
574: return $html . '</tr></table>';
575: }
576:
577: protected function _renderVarInput_sorter($form, &$var, &$vars)
578: {
579: global $registry;
580:
581: $instance = $var->type->getProperty('instance');
582:
583: Horde::addScriptFile('sorter.js', 'horde');
584:
585: return '<input type="hidden" name="' . htmlspecialchars($var->getVarName()) .
586: '[array]" value="" ' . $this->_genID($var->getVarName() . '_array') . '/>' .
587: '<select class="leftFloat" multiple="multiple" size="' .
588: (int)$var->type->getSize() . '" name="' . htmlspecialchars($var->getVarName()) .
589: '[list]" onchange="' . $instance . '.deselectHeader();" ' .
590: $this->_genID($var->getVarName() . '_list') . '>' .
591: $var->type->getOptions($var->getValue($vars)) . '</select><div class="leftFloat">' .
592: Horde::link('#', Horde_Core_Translation::t("Move up"), '', '', $instance . '.moveColumnUp(); return false;') . Horde::img('nav/up.png', Horde_Core_Translation::t("Move up")) . '</a><br />' .
593: Horde::link('#', Horde_Core_Translation::t("Move up"), '', '', $instance . '.moveColumnDown(); return false;') . Horde::img('nav/down.png', Horde_Core_Translation::t("Move down")) . '</a></div>' .
594: '<script type="text/javascript">' . "\n" .
595: sprintf('%1$s = new Horde_Form_Sorter(\'%1$s\', \'%2$s\', \'%3$s\');' . "\n",
596: $instance, $this->_genID($var->getVarName(), false), $var->type->getHeader()) .
597: sprintf("%s.setHidden();\n</script>\n", $instance);
598: }
599:
600: protected function _renderVarInput_assign($form, &$var, &$vars)
601: {
602: global $registry;
603:
604: Horde::addScriptFile('form_assign.js', 'horde');
605:
606: $name = htmlspecialchars($var->getVarName());
607: $size = $var->type->getSize();
608: $width = $var->type->getWidth();
609: $lhdr = (bool)$var->type->getHeader(0);
610: $rhdr = (bool)$var->type->getHeader(1);
611: $this->_addOnLoadJavascript('Horde_Form_Assign.setField(\'' . $form->getName() . '\', \'' . $var->getVarName() . '\');');
612:
613: return '<input type="hidden" name="' . $name . '__values" />' .
614: '<table style="width:auto"><tr><td>' .
615: sprintf('<select name="%s__left" multiple="multiple" size="%d" style="width:%s"%s>',
616: $name, $size, $width,
617: $lhdr ? ' onchange="Horde_Form_Assign.deselectHeaders(\'' . $form->getName() . '\', \'' . $var->getVarName() . '\', 0);"' : '') .
618: $var->type->getOptions(0, $form->getName(), $var->getVarName()) .
619: '</select></td><td>' .
620: '<a href="#" onclick="Horde_Form_Assign.move(\'' . $form->getName() . '\', \'' . $var->getVarName() . '\', 0); return false;">' .
621: Horde::img('rhand.png', Horde_Core_Translation::t("Add")) .
622: '</a><br /><a href="#" onclick="Horde_Form_Assign.move(\'' .
623: $form->getName() . '\', \'' . $var->getVarName() . '\', 1); return false;">' .
624: Horde::img('lhand.png', Horde_Core_Translation::t("Remove")) .
625: '</a></td><td>' .
626: sprintf('<select name="%s__right" multiple="multiple" size="%d" style="width:%s"%s>',
627: $name, $size, $width,
628: $rhdr ? ' onchange="Horde_Form_Assign.deselectHeaders(\'' . $form->getName() . '\', \'' . $var->getVarName() . '\', 1);"' : '') .
629: $var->type->getOptions(1, $form->getName(), $var->getVarName()) .
630: '</select></td></tr></table>';
631: }
632:
633: protected function _renderVarInput_invalid($form, &$var, &$vars)
634: {
635: return $this->_renderVarDisplay_invalid($form, $var, $vars);
636: }
637:
638: protected function _renderVarInput_enum($form, &$var, &$vars)
639: {
640: $values = $var->getValues();
641: $prompt = $var->type->getPrompt();
642: $htmlchars = $var->getOption('htmlchars');
643: if (!empty($prompt)) {
644: $prompt = '<option value="">' . ($htmlchars ? $prompt : htmlspecialchars($prompt)) . '</option>';
645: }
646: return sprintf('<select name="%s" id="%s" %s>%s%s</select>',
647: htmlspecialchars($var->getVarName()),
648: $this->_genID($var->getVarName(), false),
649: $this->_getActionScripts($form, $var),
650: $prompt,
651: $this->selectOptions($values, $var->getValue($vars), $htmlchars));
652: }
653:
654: protected function _renderVarInput_mlenum($form, &$var, &$vars)
655: {
656: $varname = $var->getVarName();
657: $hvarname = htmlspecialchars($varname);
658: $values = $var->getValues();
659: $prompts = $var->type->getPrompts();
660: $selected = $var->getValue($vars);
661:
662: if (!is_array($selected)) {
663: foreach ($values as $key_1 => $values_2) {
664: if (isset($values_2[$selected])) {
665: $selected = array('1' => $key_1, '2' => $selected);
666: break;
667: }
668: }
669: }
670:
671:
672: $html = sprintf('<input type="hidden" name="%s[old]" value="%s" %s />',
673: $hvarname,
674: htmlspecialchars($selected['1']),
675: $this->_genID($varname . '_old'));
676:
677:
678: $values_1 = Horde_Array::valuesToKeys(array_keys($values));
679: $html .= sprintf('<select %s name="%s[1]" onchange="%s"%s>',
680: $this->_genID($varname . '_1'),
681: $hvarname,
682: 'if (this.value) { document.' . $form->getName() . '.formname.value=\'\';' . 'document.' . $form->getName() . '.submit() }',
683: ($var->hasAction() ? ' ' . $this->_genActionScript($form, $var->_action, $varname) : ''));
684: if (!empty($prompts)) {
685: $html .= '<option value="">' . htmlspecialchars($prompts[0]) . '</option>';
686: }
687: $html .= $this->selectOptions($values_1, $selected['1']);
688: $html .= '</select>';
689:
690:
691: $html .= sprintf('<select %s name="%s[2]"%s>',
692: $this->_genID($varname . '_2'),
693: $hvarname,
694: ($var->hasAction() ? ' ' . $this->_genActionScript($form, $var->_action, $varname) : ''));
695: if (!empty($prompts)) {
696: $html .= '<option value="">' . htmlspecialchars($prompts[1]) . '</option>';
697: }
698: $values_2 = array();
699: if (!empty($selected['1'])) {
700: $values_2 = &$values[$selected['1']];
701: }
702: return $html . $this->selectOptions($values_2, $selected['2']) . '</select>';
703: }
704:
705: protected function _renderVarInput_multienum($form, &$var, &$vars)
706: {
707: $values = $var->getValues();
708: $selected = $vars->getExists($var->getVarName(), $wasset);
709: if (!$wasset) {
710: $selected = $var->getDefault();
711: }
712: return sprintf('<select multiple="multiple" size="%s" name="%s[]" %s>%s</select>',
713: (int)$var->type->size,
714: htmlspecialchars($var->getVarName()),
715: $this->_getActionScripts($form, $var),
716: $this->_multiSelectOptions($values, $selected)) .
717: "<br />\n" . Horde_Core_Translation::t("To select multiple items, hold down the Control (PC) or Command (Mac) key while clicking.") . "\n";
718: }
719:
720: protected function _renderVarInput_keyval_multienum($form, &$var, &$vars)
721: {
722: return $this->_renderVarInput_multienum($form, $var, $vars);
723: }
724:
725: protected function _renderVarInput_radio($form, &$var, &$vars)
726: {
727: return $this->_radioButtons($var->getVarName(),
728: $var->getValues(),
729: $var->getValue($vars),
730: $this->_getActionScripts($form, $var));
731: }
732:
733: protected function _renderVarInput_set($form, &$var, &$vars)
734: {
735: $html = $this->_checkBoxes($var->getVarName(),
736: $var->getValues(),
737: $var->getValue($vars),
738: $this->_getActionScripts($form, $var));
739:
740: if ($var->type->getProperty('checkAll')) {
741: $form_name = $form->getName();
742: $var_name = $var->getVarName() . '[]';
743: $function_name = 'select' . $form_name . $var->getVarName();
744: $enable = Horde_Core_Translation::t("Select all");
745: $disable = Horde_Core_Translation::t("Select none");
746: $invert = Horde_Core_Translation::t("Invert selection");
747: $html .= <<<EOT
748: <script type="text/javascript">
749: function $function_name()
750: {
751: for (var i = 0; i < document.$form_name.elements.length; i++) {
752: f = document.$form_name.elements[i];
753: if (f.name != '$var_name') {
754: continue;
755: }
756: if (arguments.length) {
757: f.checked = arguments[0];
758: } else {
759: f.checked = !f.checked;
760: }
761: }
762: }
763: </script>
764: <a href="#" onclick="$function_name(true); return false;">$enable</a>,
765: <a href="#" onclick="$function_name(false); return false;">$disable</a>,
766: <a href="#" onclick="$function_name(); return false;">$invert</a>
767: EOT;
768: }
769:
770: return $html;
771: }
772:
773: protected function _renderVarInput_link($form, &$var, &$vars)
774: {
775: return $this->_renderVarDisplay_link($form, $var, $vars);
776: }
777:
778: protected function _renderVarInput_html($form, &$var, &$vars)
779: {
780: return $this->_renderVarDisplay_html($form, $var, $vars);
781: }
782:
783: protected function _renderVarInput_email($form, &$var, &$vars)
784: {
785: return sprintf('<input type="email" name="%s" id="%s" value="%s"%s%s />',
786: htmlspecialchars($var->getVarName()),
787: $this->_genID($var->getVarName(), false),
788: htmlspecialchars($var->getValue($vars)),
789: $var->type->getSize() ? ' size="' . $var->type->getSize() . '"' : '',
790: $this->_getActionScripts($form, $var));
791: }
792:
793: protected function _renderVarInput_matrix($form, &$var, &$vars)
794: {
795: $varname = $var->getVarName();
796: $var_array = $var->getValue($vars);
797: $cols = $var->type->getCols();
798: $rows = $var->type->getRows();
799: $matrix = $var->type->getMatrix();
800: $new_input = $var->type->getNewInput();
801:
802: $html = '<table cellspacing="0"><tr>';
803:
804: $html .= '<td class="rightAlign" width="20%"></td>';
805: foreach ($cols as $col_title) {
806: $html .= '<td align="center" width="1%">' . htmlspecialchars($col_title) . '</td>';
807: }
808: $html .= '<td class="rightAlign" width="60%"></td></tr>';
809:
810:
811: if ($new_input) {
812: $html .= '<tr><td>';
813: if (is_array($new_input)) {
814: $html .= sprintf('<select %s name="%s[n][r]"><option value="">%s</option>%s</select><br />',
815: $this->_genID($varname . '_n_r'),
816: htmlspecialchars($var->getVarName()),
817: Horde_Core_Translation::t("-- select --"),
818: $this->selectOptions($new_input, $var_array['n']['r']));
819: } elseif ($new_input == true) {
820: $html .= sprintf('<input %s type="text" name="%s[n][r]" value="%s" />',
821: $this->_genID($varname . '_n_r'),
822: htmlspecialchars($var->getVarName()),
823: $var_array['n']['r']);
824: }
825: $html .= ' </td>';
826: foreach ($cols as $col_id => $col_title) {
827: $html .= sprintf('<td align="center"><input type="checkbox" class="checkbox" name="%s[n][v][%s]" /></td>', htmlspecialchars($var->getVarName()), $col_id);
828: }
829: $html .= '<td> </td></tr>';
830: }
831:
832:
833: foreach ($rows as $row_id => $row_title) {
834: $html .= sprintf('<tr><td>%s</td>', $row_title);
835: foreach ($cols as $col_id => $col_title) {
836: $html .= sprintf('<td align="center"><input type="checkbox" class="checkbox" name="%s[r][%s][%s]"%s /></td>', htmlspecialchars($var->getVarName()), $row_id, $col_id, (!empty($matrix[$row_id][$col_id]) ? ' checked="checked"' : ''));
837: }
838: $html .= '<td> </td></tr>';
839: }
840:
841: return $html . '</table>';
842: }
843:
844: protected function _renderVarInput_password($form, &$var, &$vars)
845: {
846: return sprintf('<input type="password" name="%s" id="%s" value="%s"%s />',
847: htmlspecialchars($var->getVarName()),
848: $this->_genID($var->getVarName(), false),
849: htmlspecialchars($var->getValue($vars)),
850: $this->_getActionScripts($form, $var));
851: }
852:
853: protected function _renderVarInput_emailconfirm($form, &$var, &$vars)
854: {
855: $email = $var->getValue($vars);
856: return sprintf('<input type="email" name="%s[original]" id="%s_original" value="%s"%s />',
857: htmlspecialchars($var->getVarName()),
858: $this->_genID($var->getVarName(), false),
859: htmlspecialchars($email['original']),
860: $this->_getActionScripts($form, $var)) .
861: ' ' . sprintf('<input type="email" name="%s[confirm]" id="%s_confirm" value="%s"%s />',
862: htmlspecialchars($var->getVarName()),
863: $this->_genID($var->getVarName(), false),
864: htmlspecialchars($email['confirm']),
865: $this->_getActionScripts($form, $var));
866: }
867:
868: protected function _renderVarInput_passwordconfirm($form, &$var, &$vars)
869: {
870: $password = $var->getValue($vars);
871: return sprintf('<input type="password" name="%s[original]" id="%s_original" value="%s"%s />',
872: htmlspecialchars($var->getVarName()),
873: $this->_genID($var->getVarName(), false),
874: htmlspecialchars($password['original']),
875: $this->_getActionScripts($form, $var)) .
876: ' ' . sprintf('<input type="password" name="%s[confirm]" id="%s_confirm" value="%s"%s />',
877: htmlspecialchars($var->getVarName()),
878: $this->_genID($var->getVarName(), false),
879: htmlspecialchars($password['confirm']),
880: $this->_getActionScripts($form, $var));
881: }
882:
883: protected function _renderVarInput_boolean($form, &$var, &$vars)
884: {
885: $html = '<input type="checkbox" class="checkbox" name="' . htmlspecialchars($var->getVarName()) . '"' .
886: ' id="' . $this->_genID($var->getVarName(), false) . '"' . ($var->getValue($vars) ? ' checked="checked"' : '');
887: if ($var->hasAction()) {
888: $html .= $this->_genActionScript($form, $var->_action,
889: $var->getVarName());
890: }
891: return $html . ' />';
892: }
893:
894: protected function _renderVarInput_creditcard($form, &$var, &$vars)
895: {
896: $html = '<input type="text" name="' . htmlspecialchars($var->getVarName()) . '" id="' . $this->_genID($var->getVarName(), false) . '" value="' .
897: htmlspecialchars($var->getValue($vars)) . '"';
898: if ($var->hasAction()) {
899: $html .= $this->_genActionScript($form, $var->_action,
900: $var->getVarName());
901: }
902: return $html . ' />';
903: }
904:
905: protected function _renderVarInput_obrowser($form, &$var, &$vars)
906: {
907: $varname = $var->getVarName();
908: $varvalue = $vars->get($varname);
909: $fieldId = $this->_genID(uniqid(mt_rand()), false) . 'id';
910: $html = '
911: <script type="text/javascript">
912: var obrowserWindowName;
913: function obrowserCallback(name, oid)
914: {
915: if (name == obrowserWindowName) {
916: document.getElementById(\'' . $fieldId . '\').value = oid;
917: return false;
918: } else {
919: return "Invalid window name supplied";
920: }
921: }
922: </script>
923: ';
924: $html .= sprintf('<input type="hidden" name="%s" id="%s"%s value="%s">',
925: htmlspecialchars($varname),
926: $fieldId,
927: $this->_getActionScripts($form, $var),
928: htmlspecialchars($varvalue));
929: if (!empty($varvalue)) {
930: $html .= $varvalue;
931: }
932:
933: if ($GLOBALS['browser']->hasFeature('javascript')) {
934: $html .= Horde::link($GLOBALS['registry']->get('webroot', 'horde') . '/services/obrowser/', Horde_Core_Translation::t("Select an object"), '', '_blank', 'obrowserWindow = ' . Horde::popupJs($GLOBALS['registry']->get('webroot', 'horde') . '/services/obrowser/', array('urlencode' => true)) . 'obrowserWindowName = obrowserWindow.name; return false;') . Horde::img('tree/leaf.png', Horde_Core_Translation::t("Object")) . "</a>\n";
935: }
936:
937: return $html;
938: }
939:
940: protected function _renderVarInput_dblookup($form, &$var, &$vars)
941: {
942: return $this->_renderVarInput_enum($form, $var, $vars);
943: }
944:
945: protected function _renderVarInput_figlet($form, &$var, &$vars)
946: {
947: return sprintf('<input type="text" name="%s" id="%s" size="%s" value="%s" />',
948: htmlspecialchars($var->getVarName()),
949: $this->_genID($var->getVarName(), false),
950: strlen($var->type->getText()),
951: htmlspecialchars($var->getValue($vars))) .
952: '<br />' . Horde_Core_Translation::t("Enter the letters below:") . '<br />' .
953: $this->_renderVarDisplay_figlet($form, $var, $vars);
954: }
955:
956: protected function _renderVarInput_captcha($form, &$var, &$vars)
957: {
958: return sprintf('<input type="text" name="%s" id="%s" size="%s" value="%s" />',
959: htmlspecialchars($var->getVarName()),
960: $this->_genID($var->getVarName(), false),
961: strlen($var->type->getText()),
962: htmlspecialchars($var->getValue($vars))) .
963: '<br />' . Horde_Core_Translation::t("Enter the letters below:") . '<br />' .
964: $this->_renderVarDisplay_captcha($form, $var, $vars);
965: }
966:
967: protected function _renderVarDisplayDefault($form, &$var, &$vars)
968: {
969: return nl2br(htmlspecialchars($var->getValue($vars)));
970: }
971:
972: protected function _renderVarDisplay_html($form, &$var, &$vars)
973: {
974:
975:
976: return $var->getValue($vars);
977: }
978:
979: protected function _renderVarDisplay_email($form, &$var, &$vars)
980: {
981: $email_val = $var->getValue($vars);
982:
983: if ($var->type->getProperty('link_compose')) {
984:
985: $addrs = $var->type->getProperty('allow_multi')
986: ? Horde_Mime_Address::explode($email_val)
987: : array($email_val);
988:
989: $link = '';
990: foreach ($addrs as $addr) {
991: $addr = trim($addr);
992:
993: $display_email = $addr;
994: if ($var->type->getProperty('strip_domain') && strpos($addr, '@') !== false) {
995: $display_email = str_replace(array('@', '.'),
996: array(' (at) ', ' (dot) '),
997: $addr);
998: }
999:
1000:
1001: $mailbox_host = explode('@', $addr);
1002: if (!isset($mailbox_host[1])) {
1003: $mailbox_host[1] = '';
1004: }
1005:
1006: $name = $var->type->getProperty('link_name');
1007:
1008: $address = Horde_Mime_Address::writeAddress($mailbox_host[0], $mailbox_host[1], $name);
1009:
1010:
1011:
1012: $address = str_replace('@>', '>', $address);
1013: try {
1014: $mail_link = $GLOBALS['registry']->call('mail/compose', array(array('to' => addslashes($address))));
1015: } catch (Horde_Exception $e) {
1016: $mail_link = 'mailto:' . urlencode($address);
1017: }
1018:
1019: if (!empty($link)) {
1020: $link .= ', ';
1021: }
1022: $link .= Horde::link($mail_link, $addr) . htmlspecialchars($display_email) . '</a>';
1023: }
1024:
1025: return $link;
1026: } else {
1027: $email_val = trim($email_val);
1028:
1029: if ($var->type->getProperty('strip_domain') && strpos($email_val, '@') !== false) {
1030: $email_val = str_replace(array('@', '.'),
1031: array(' (at) ', ' (dot) '),
1032: $email_val);
1033: }
1034:
1035: return nl2br(htmlspecialchars($email_val));
1036: }
1037: }
1038:
1039: protected function _renderVarDisplay_password($form, &$var, &$vars)
1040: {
1041: return '********';
1042: }
1043:
1044: protected function _renderVarDisplay_passwordconfirm($form, &$var, &$vars)
1045: {
1046: return '********';
1047: }
1048:
1049: protected function _renderVarDisplay_octal($form, &$var, &$vars)
1050: {
1051: return sprintf('0%o', octdec($var->getValue($vars)));
1052: }
1053:
1054: protected function _renderVarDisplay_boolean($form, &$var, &$vars)
1055: {
1056: return $var->getValue($vars) ? Horde_Core_Translation::t("Yes") : Horde_Core_Translation::t("No");
1057: }
1058:
1059: protected function _renderVarDisplay_enum($form, &$var, &$vars)
1060: {
1061: $values = $var->getValues();
1062: $value = $var->getValue($vars);
1063: if (count($values) == 0) {
1064: return Horde_Core_Translation::t("No values");
1065: } elseif (isset($values[$value]) && $value != '') {
1066: return htmlspecialchars($values[$value]);
1067: }
1068: }
1069:
1070: protected function _renderVarDisplay_radio($form, &$var, &$vars)
1071: {
1072: $values = $var->getValues();
1073: if (count($values) == 0) {
1074: return Horde_Core_Translation::t("No values");
1075: } elseif (isset($values[$var->getValue($vars)])) {
1076: return htmlspecialchars($values[$var->getValue($vars)]);
1077: }
1078: }
1079:
1080: protected function _renderVarDisplay_multienum($form, &$var, &$vars)
1081: {
1082: $values = $var->getValues();
1083: $on = $var->getValue($vars);
1084: if (!count($values) || !count($on)) {
1085: return Horde_Core_Translation::t("No values");
1086: } else {
1087: $display = array();
1088: foreach ($values as $value => $name) {
1089: if (in_array($value, $on)) {
1090: $display[] = $name;
1091: }
1092: }
1093: return htmlspecialchars(implode(', ', $display));
1094: }
1095: }
1096:
1097: protected function _renderVarDisplay_keyval_multienum($form, &$var, &$vars)
1098: {
1099: $values = $var->getValues();
1100: $on = $var->getValue($vars);
1101: if (!count($values) || !count($on)) {
1102: return Horde_Core_Translation::t("No values");
1103: } else {
1104: $display = array();
1105: foreach ($values as $name) {
1106: if (in_array($name, $on)) {
1107: $display[] = $name;
1108: }
1109: }
1110: return htmlspecialchars(implode(', ', $display));
1111: }
1112: }
1113:
1114: protected function _renderVarDisplay_set($form, &$var, &$vars)
1115: {
1116: $values = $var->getValues();
1117: $on = $var->getValue($vars);
1118: if (!count($values) || !count($on)) {
1119: return Horde_Core_Translation::t("No values");
1120: } else {
1121: $display = array();
1122: foreach ($values as $value => $name) {
1123: if (in_array($value, $on)) {
1124: $display[] = $name;
1125: }
1126: }
1127: return htmlspecialchars(implode(', ', $display));
1128: }
1129: }
1130:
1131: protected function _renderVarDisplay_image($form, &$var, &$vars)
1132: {
1133: $image = $var->getValue($vars);
1134:
1135:
1136: $var->type->loadImageData($image);
1137:
1138: if (empty($image['img'])) {
1139: return '';
1140: }
1141:
1142: $img = Horde::url($GLOBALS['registry']->get('webroot', 'horde') . '/services/images/view.php');
1143:
1144: if (isset($image['img']['vfs_id'])) {
1145:
1146: $img->add(array(
1147: 'f' => $image['img']['vfs_id'],
1148: 'p' => $image['img']['vfs_path'],
1149: 's' => 'vfs'
1150: ));
1151: } else {
1152:
1153: $img->add('f', $image['img']['file']);
1154: }
1155:
1156: return Horde::img((string)$img, '', '', '');
1157: }
1158:
1159: protected function _renderVarDisplay_phone($form, &$var, &$vars)
1160: {
1161: global $registry;
1162:
1163: $number = $var->getValue($vars);
1164: $html = htmlspecialchars($number);
1165:
1166: if ($number && $registry->hasMethod('telephony/dial')) {
1167: $url = $registry->call('telephony/dial', array($number));
1168: $label = sprintf(Horde_Core_Translation::t("Dial %s"), $number);
1169: $html .= ' ' . Horde::link($url, $label) . Horde::img('phone.png', $label) . '</a>';
1170: }
1171:
1172: return $html;
1173: }
1174:
1175: protected function _renderVarDisplay_cellphone($form, &$var, &$vars)
1176: {
1177: global $registry;
1178:
1179: $html = $this->_renderVarDisplay_phone($form, $var, $vars);
1180:
1181: $number = $var->getValue($vars);
1182: if ($number && $registry->hasMethod('sms/compose')) {
1183: $url = $registry->link('sms/compose', array('to' => $number));
1184: $html .= ' ' . Horde::link($url, Horde_Core_Translation::t("Send SMS")) . Horde::img('mobile.png', Horde_Core_Translation::t("Send SMS")) . '</a>';
1185: }
1186:
1187: return $html;
1188: }
1189:
1190: protected function _renderVarDisplay_address($form, &$var, &$vars, $text = true)
1191: {
1192: global $registry;
1193:
1194: $address = $var->getValue($vars);
1195: if (empty($address)) {
1196: return '';
1197: }
1198:
1199: $info = $var->type->parse($address);
1200:
1201: $google_icon = 'map.png';
1202: if (!empty($info['country'])) {
1203: switch ($info['country']) {
1204: case 'uk':
1205:
1206: $mapurl = 'http://www.multimap.com/map/browse.cgi?pc='
1207: . urlencode($info['zip']);
1208: $desc = Horde_Core_Translation::t("Multimap UK map");
1209: $icon = 'map.png';
1210: break;
1211:
1212: case 'au':
1213:
1214: $mapurl = 'http://www.whereis.com.au/whereis/mapping/geocodeAddress.do?';
1215: $desc = Horde_Core_Translation::t("Whereis Australia map");
1216: $icon = 'map.png';
1217:
1218: if (isset($info['streetNumber']) &&
1219: isset($info['streetName'])) {
1220: $mapurl .= '&streetNumber='
1221: . urlencode($info['streetNumber']) . '&streetName='
1222: . urlencode($info['streetName']);
1223: }
1224:
1225: if (isset($info['city'])) {
1226: $mapurl .= '&suburb=' . urlencode($info['city']);
1227: }
1228:
1229: if (isset($info['state'])) {
1230: $mapurl .= '&state=' . urlencode($info['state']);
1231: }
1232: break;
1233:
1234: case 'us':
1235: case 'ca':
1236:
1237:
1238: $mapurl = 'http://www.mapquest.com/maps/map.adp?size=big&zoom=7';
1239: $desc = Horde_Core_Translation::t("MapQuest map");
1240: $icon = 'map.png';
1241: if (!empty($info['street'])) {
1242: $mapurl .= '&address=' . urlencode($info['street']);
1243: }
1244: if (!empty($info['city'])) {
1245: $mapurl .= '&city=' . urlencode($info['city']);
1246: }
1247: if (!empty($info['state'])) {
1248: $mapurl .= '&state=' . urlencode($info['state']);
1249: }
1250: if (!empty($info['zip'])) {
1251: if ($info['country'] == 'ca') {
1252: $mapurl .= '&country=CA';
1253: }
1254: $mapurl .= '&zipcode=' . urlencode($info['zip']);
1255: }
1256:
1257:
1258: $mapurl2 = 'http://us.rd.yahoo.com/maps/home/submit_a/*-http://maps.yahoo.com/maps?srchtype=a&getmap=Get+Map&';
1259: $desc2 = Horde_Core_Translation::t("Yahoo! map");
1260: $icon2 = 'map.png';
1261: if (!empty($info['street'])) {
1262: $mapurl2 .= '&addr=' . urlencode($info['street']);
1263: }
1264:
1265: if (empty($info['zip']) &&
1266: !empty($info['city']) && !empty($info['state'])) {
1267: $mapurl2 .= '&csz='
1268: . urlencode($info['city'] . ' ' . $info['state']);
1269: }
1270: if (!empty($info['zip'])) {
1271: if (preg_match('|([a-zA-Z]\d[a-zA-Z])\s?(\d[a-zA-Z]\d)|', $info['zip'], $pcParts)) {
1272: $mapurl2 .= '&country=ca';
1273:
1274: $info['zip'] = $pcParts[1] . ' ' . $pcParts[2];
1275: }
1276: $mapurl2 .= '&csz=' . urlencode($info['zip']);
1277: }
1278: break;
1279:
1280: default:
1281: if (!count($info)) {
1282: break;
1283: }
1284:
1285: $google_icon = 'map_eu.png';
1286:
1287: $mapurl2 = 'http://www.mapquest.com/maps/map.adp?country=' . Horde_String::upper($info['country']);
1288: $desc2 = Horde_Core_Translation::t("MapQuest map");
1289: $icon2 = 'map_eu.png';
1290: if (!empty($info['street'])) {
1291: $mapurl2 .= '&address=' . urlencode($info['street']);
1292: }
1293: if (!empty($info['zip'])) {
1294: $mapurl2 .= '&zipcode=' . urlencode($info['zip']);
1295: }
1296: if (!empty($info['city'])) {
1297: $mapurl2 .= '&city=' . urlencode($info['city']);
1298: }
1299: break;
1300: }
1301: }
1302:
1303: $html = $text ? nl2br(htmlspecialchars($address)) : '';
1304: if (!empty($mapurl)) {
1305: $html .= ' ' . Horde::link(Horde::externalUrl($mapurl), $desc, null, '_blank') . Horde::img($icon, $desc) . '</a>';
1306: }
1307: if (!empty($mapurl2)) {
1308: $html .= ' ' . Horde::link(Horde::externalUrl($mapurl2), $desc2, null, '_blank') . Horde::img($icon2, $desc2) . '</a>';
1309: }
1310:
1311:
1312: if ($address) {
1313: $html .= ' ' . Horde::link(Horde::externalUrl('http://maps.google.com/maps?q=' . urlencode(preg_replace('/\r?\n/', ',', $address)) . '&hl=en'), Horde_Core_Translation::t("Google Maps"), null, '_blank') . Horde::img($google_icon, Horde_Core_Translation::t("Google Maps")) . '</a>';
1314: }
1315:
1316: return $html;
1317: }
1318:
1319: protected function _renderVarDisplay_addresslink($form, &$var, &$vars)
1320: {
1321: return $this->_renderVarDisplay_address($form, $var, $vars, false);
1322: }
1323:
1324: protected function _renderVarDisplay_pgp($form, &$var, &$vars)
1325: {
1326: $key = $var->getValue($vars);
1327: if (empty($key)) {
1328: return '';
1329: }
1330: return '<pre>' .
1331: $GLOBALS['injector']->getInstance('Horde_Core_Factory_Crypt')->create('Pgp', $var->type->getPGPParams())->pgpPrettyKey($key) .
1332: '</pre>';
1333: }
1334:
1335: protected function _renderVarDisplay_smime($form, &$var, &$vars)
1336: {
1337: $cert = $var->getValue($vars);
1338: if (empty($cert)) {
1339: return '';
1340: }
1341: try {
1342: return $GLOBALS['injector']
1343: ->getInstance('Horde_Core_Factory_Crypt')
1344: ->create('Smime', $var->type->getSMIMEParams())
1345: ->certToHTML($cert);
1346: } catch (Horde_Crypt_Exception $e) {
1347: return $e->getMessage();
1348: }
1349: }
1350:
1351: protected function _renderVarDisplay_country($form, &$var, &$vars)
1352: {
1353: return $this->_renderVarDisplay_enum($form, $var, $vars);
1354: }
1355:
1356: protected function _renderVarDisplay_date($form, &$var, &$vars)
1357: {
1358: return htmlspecialchars($var->type->getFormattedTime($var->getValue($vars)));
1359: }
1360:
1361: protected function _renderVarDisplay_hourminutesecond($form, &$var, &$vars)
1362: {
1363: $time = $var->type->getTimeParts($var->getValue($vars));
1364: if (!$var->type->getProperty('show_seconds')) {
1365: return (int)$time['hour'] . ':' . sprintf('%02d', (int)$time['minute']);
1366: } else {
1367: return (int)$time['hour'] . ':' . sprintf('%02d', (int)$time['minute']) . ':' . sprintf('%02d', (int)$time['second']);
1368: }
1369: }
1370:
1371: protected function _renderVarDisplay_monthyear($form, &$var, &$vars)
1372: {
1373: return (int)$vars->get($var->getVarName() . '[month]') . ', ' . (int)$vars->get($var->getVarName() . '[year]');
1374: }
1375:
1376: protected function _renderVarDisplay_monthdayyear($form, &$var, &$vars)
1377: {
1378: $date = $var->getValue($vars);
1379: if ((is_array($date) && !empty($date['year']) &&
1380: !empty($date['month']) && !empty($date['day'])) ||
1381: (!is_array($date) && !empty($date) && $date != '0000-00-00')) {
1382: try {
1383: return $var->type->formatDate($date);
1384: } catch (Horde_Date_Exception $e) {
1385: return $e->getMessage();
1386: }
1387: }
1388: return '';
1389: }
1390:
1391: protected function _renderVarDisplay_datetime($form, &$var, &$vars)
1392: {
1393: $value = $var->getValue($vars);
1394: try {
1395: $html = htmlspecialchars($var->type->formatDate($value));
1396: } catch (Horde_Date_Exception $e) {
1397: return $e->getMessage();
1398: }
1399: if (!$var->type->emptyDateArray($value)) {
1400: $html .= Horde_Form_Type_date::getAgo($value);
1401: }
1402: return $html;
1403: }
1404:
1405: protected function _renderVarDisplay_invalid($form, &$var, &$vars)
1406: {
1407: return '<span class="form-error">' . htmlspecialchars($var->type->message) . '</span>';
1408: }
1409:
1410: protected function _renderVarDisplay_link($form, &$var, &$vars)
1411: {
1412: $values = $var->type->values;
1413: if (!isset($values[0])) {
1414: $values = array($values);
1415: }
1416:
1417: $count = count($values);
1418: $html = '';
1419: for ($i = 0; $i < $count; $i++) {
1420: if (empty($values[$i]['url']) || empty($values[$i]['text'])) {
1421: continue;
1422: }
1423: if (!isset($values[$i]['target'])) {
1424: $values[$i]['target'] = '';
1425: }
1426: if (!isset($values[$i]['onclick'])) {
1427: $values[$i]['onclick'] = '';
1428: }
1429: if (!isset($values[$i]['title'])) {
1430: $values[$i]['title'] = '';
1431: }
1432: if (!isset($values[$i]['accesskey'])) {
1433: $values[$i]['accesskey'] = '';
1434: }
1435: if ($i > 0) {
1436: $html .= ' | ';
1437: }
1438: $html .= Horde::link($values[$i]['url'], $values[$i]['text'], 'widget', $values[$i]['target'], $values[$i]['onclick'], $values[$i]['title'], $values[$i]['accesskey']) . htmlspecialchars($values[$i]['text']) . '</a>';
1439: }
1440:
1441: return $html;
1442: }
1443:
1444: protected function _renderVarDisplay_dblookup($form, &$var, &$vars)
1445: {
1446: return $this->_renderVarDisplay_enum($form, $var, $vars);
1447: }
1448:
1449: protected function _renderVarDisplay_figlet($form, &$var, &$vars)
1450: {
1451: static $figlet;
1452:
1453: if (!isset($figlet)) {
1454: $figlet = new Text_Figlet();
1455: }
1456:
1457: $result = $figlet->loadFont($var->type->getFont());
1458: if (is_a($result, 'PEAR_Error')) {
1459: return $result->getMessage();
1460: }
1461:
1462: return '<pre>' . $figlet->lineEcho($var->type->getText()) . '</pre>';
1463: }
1464:
1465: protected function _renderVarDisplay_captcha($form, &$var, &$vars)
1466: {
1467: static $captcha;
1468:
1469: if (!isset($captcha)) {
1470: $captcha = Text_CAPTCHA::factory('Image');
1471: }
1472:
1473: $image = $captcha->init(150, 60, $var->type->getText(),
1474: array('font_path' => dirname($var->type->getFont()) . '/',
1475: 'font_file' => basename($var->type->getFont())));
1476: if (is_a($image, 'PEAR_Error')) {
1477: return $image->getMessage();
1478: }
1479:
1480: $cid = md5($var->type->getText());
1481: $cache = $GLOBALS['injector']->getInstance('Horde_Cache');
1482:
1483: $cache->set($cid, serialize(array('data' => $captcha->getCAPTCHAAsJPEG(),
1484: 'ctype' => 'image/jpeg')));
1485:
1486: $url = Horde::url($GLOBALS['registry']->get('webroot', 'horde') . '/services/cacheview.php')->add('cid', $cid);
1487:
1488: return '<img src="' . $url . '" />';
1489:
1490: }
1491:
1492: protected function _renderVarInput_selectFiles($form, &$var, &$vars)
1493: {
1494:
1495: $html = sprintf('<input type="hidden" name="%s" id="%s" value="%s" />',
1496: 'selectlist_selectid',
1497: 'selectlist_selectid',
1498: $var->type->getProperty('selectid')) .
1499: sprintf('<input type="hidden" name="%s" id="%s" />', 'actionID', 'actionID') .
1500:
1501:
1502: sprintf('<input type="hidden" name="%s" id="%s" value="%s" />',
1503: htmlspecialchars($var->getVarName()),
1504: $this->_genID($var->getVarName(), false),
1505: $var->type->getProperty('selectid'));
1506:
1507:
1508: $param = array($var->type->getProperty('link_text'),
1509: $var->type->getProperty('link_style'),
1510: $form->getName(),
1511: $var->type->getProperty('icon'),
1512: $var->type->getProperty('selectid'));
1513: $html .= $GLOBALS['registry']->call('files/selectlistLink', $param) . "<br />\n";
1514:
1515: if ($var->type->getProperty('selectid')) {
1516: $param = array($var->type->getProperty('selectid'));
1517: $files = $GLOBALS['registry']->call('files/selectlistResults', $param);
1518: if ($files) {
1519: $html .= '<ol>';
1520: foreach ($files as $id => $file) {
1521: $dir = key($file);
1522: $filename = current($file);
1523: if ($GLOBALS['registry']->hasMethod('files/getViewLink')) {
1524: $filename = basename($filename);
1525: $url = $GLOBALS['registry']->call('files/getViewLink', array($dir, $filename));
1526: $filename = Horde::link($url, Horde_Core_Translation::t("Preview"), null, 'form_file_view') . htmlspecialchars(Horde_Util::realPath($dir . '/' . $filename)) . '</a>';
1527: } else {
1528: if (!empty($dir) && ($dir != '.')) {
1529: $filename = $dir . '/' . $filename;
1530: }
1531: $filename = htmlspecialchars($filename);
1532: }
1533: $html .= '<li>' . $filename . "</li>\n";
1534: }
1535: $html .= '</ol>';
1536: }
1537: }
1538:
1539: return $html;
1540: }
1541:
1542: protected function _renderVarInput_category($form, &$var, &$vars)
1543: {
1544: Horde::addScriptFile('form_helpers.js', 'horde');
1545: $this->_addOnLoadJavascript('addEvent(document.getElementById(\'' . $form->getName() . '\'), \'submit\', checkCategory);');
1546: return '<input type="hidden" name="new_category" />'
1547: . Horde_Prefs_CategoryManager::getJavaScript($form->getName(), $var->getVarName())
1548: . Horde_Prefs_CategoryManager::getSelect($var->getVarName(), $var->getValue($vars));
1549: }
1550:
1551: public function selectOptions(&$values, $selectedValue = false,
1552: $htmlchars = false)
1553: {
1554: $result = '';
1555: $sel = false;
1556: foreach ($values as $value => $display) {
1557: if (!is_null($selectedValue) && !$sel &&
1558: $value == $selectedValue &&
1559: strlen($value) == strlen($selectedValue)) {
1560: $selected = ' selected="selected"';
1561: $sel = true;
1562: } else {
1563: $selected = '';
1564: }
1565: $result .= ' <option value="';
1566: $result .= $htmlchars
1567: ? $value
1568: : htmlspecialchars($value);
1569: $result .= '"' . $selected . '>';
1570: $result .= $htmlchars
1571: ? $display
1572: : htmlspecialchars($display);
1573: $result .= "</option>\n";
1574: }
1575:
1576: return $result;
1577: }
1578:
1579: protected function _multiSelectOptions(&$values, $selectedValues)
1580: {
1581: if (!is_array($selectedValues)) {
1582: $selectedValues = array();
1583: } else {
1584: $selectedValues = array_flip($selectedValues);
1585: }
1586:
1587: $result = '';
1588: $sel = false;
1589: foreach ($values as $value => $display) {
1590: if (isset($selectedValues[$value])) {
1591: $selected = ' selected="selected"';
1592: } else {
1593: $selected = '';
1594: }
1595: $result .= " <option value=\"" . htmlspecialchars($value) . "\"$selected>" . htmlspecialchars($display) . "</option>\n";
1596: }
1597:
1598: return $result;
1599: }
1600:
1601: protected function _checkBoxes($name, $values, $checkedValues, $actions = '')
1602: {
1603: $result = '';
1604: if (!is_array($checkedValues)) {
1605: $checkedValues = array();
1606: }
1607: $i = 0;
1608: foreach ($values as $value => $display) {
1609: $checked = (in_array($value, $checkedValues)) ? ' checked="checked"' : '';
1610: $result .= sprintf('<input id="%s%s" type="checkbox" class="checkbox" name="%s[]" value="%s"%s%s /><label for="%s%s"> %s</label><br />',
1611: htmlspecialchars($name),
1612: $i,
1613: htmlspecialchars($name),
1614: htmlspecialchars($value),
1615: $checked,
1616: $actions,
1617: htmlspecialchars($name),
1618: $i,
1619: htmlspecialchars($display));
1620: $i++;
1621: }
1622:
1623: return $result;
1624: }
1625:
1626: protected function _radioButtons($name, $values, $checkedValue = null, $actions = '')
1627: {
1628: $result = '';
1629: $i = 0;
1630: foreach ($values as $value => $display) {
1631: $checked = (!is_null($checkedValue) && $value == $checkedValue) ? ' checked="checked"' : '';
1632: $result .= sprintf('<input id="%s%s" type="radio" class="checkbox" name="%s" value="%s"%s%s /><label for="%s%s"> %s</label><br />',
1633: htmlspecialchars($name),
1634: $i,
1635: htmlspecialchars($name),
1636: htmlspecialchars($value),
1637: $checked,
1638: $actions,
1639: htmlspecialchars($name),
1640: $i,
1641: htmlspecialchars($display));
1642: $i++;
1643: }
1644:
1645: return $result;
1646: }
1647:
1648: protected function _genID($name, $fulltag = true)
1649: {
1650: $name = htmlspecialchars(preg_replace('/[^A-Za-z0-9-_:.]+/', '_', $name));
1651: return $fulltag ? 'id="' . $name . '"' : $name;
1652: }
1653:
1654: protected function _genActionScript($form, $action, $varname)
1655: {
1656: $html = '';
1657: $triggers = $action->getTrigger();
1658: if (!is_array($triggers)) {
1659: $triggers = array($triggers);
1660: }
1661: $js = $action->getActionScript($form, $this, $varname);
1662: foreach ($triggers as $trigger) {
1663: if ($trigger == 'onload') {
1664: $this->_addOnLoadJavascript($js);
1665: } else {
1666: $html .= ' ' . $trigger . '="' . $js . '"';
1667: }
1668: }
1669: return $html;
1670: }
1671:
1672: protected function _getActionScripts($form, &$var)
1673: {
1674: $actions = '';
1675: if ($var->hasAction()) {
1676: $varname = $var->getVarName();
1677: $action = &$var->_action;
1678: $triggers = $action->getTrigger();
1679: if (!is_array($triggers)) {
1680: $triggers = array($triggers);
1681: }
1682: $js = $action->getActionScript($form, $this, $varname);
1683: foreach ($triggers as $trigger) {
1684: if ($trigger == 'onload') {
1685: $this->_addOnLoadJavascript($js);
1686: } else {
1687: $actions .= ' ' . $trigger . '="' . $js . '"';
1688: }
1689: }
1690: }
1691: return $actions;
1692: }
1693:
1694: protected function _addOnLoadJavascript($script)
1695: {
1696: $this->_onLoadJS[] = $script;
1697: }
1698:
1699: public function renderEnd()
1700: {
1701: if (count($this->_onLoadJS)) {
1702: return "<script type=\"text/javascript\">" .
1703: "<!--\n" . implode("\n", $this->_onLoadJS) . "\n// -->\n" .
1704: "</script>";
1705: } else {
1706: return '';
1707: }
1708: }
1709:
1710: }
1711: