/[cvs]/nfo/php/libs/com.newsblob.phphtmllib/form/form_elements/FEListBox.inc
ViewVC logotype

Contents of /nfo/php/libs/com.newsblob.phphtmllib/form/form_elements/FEListBox.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations)
Thu Aug 11 14:09:59 2005 UTC (18 years, 11 months ago) by jonen
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +645 -226 lines
+ updated to version 2.5.3

1 <?php
2 /**
3 * This file contains the FEListBox, FEMultiListBox
4 *
5 * $Id: FEListBox.inc,v 1.47.2.3 2005/05/12 01:24:02 hemna Exp $
6 *
7 * @author Walter A. Boring IV <waboring@newsblob.com>
8 * @author Suren Markosyan <suren@bcsweb.com>
9 * @package phpHtmlLib
10 * @subpackage FormProcessing
11 *
12 * @copyright LGPL - See LICENCE
13 *
14 */
15
16 /**
17 * This is the ListBox FormElement which builds a
18 * select field with all of its options.
19 * It has no validation method.
20 *
21 *
22 * @author Walter A. Boring IV <waboring@newsblob.com>
23 * @author Suren Markossian <suren@bcsweb.com>
24 * @package phpHtmlLib
25 * @subpackage FormProcessing
26 *
27 * @copyright LGPL - See LICENCE
28 */
29 class FEListBox extends FEDataList {
30
31 /**
32 * This function builds and returns the
33 * form element object
34 *
35 * @return object
36 */
37 function get_element() {
38
39 $attributes = $this->_build_element_attributes();
40
41 if ($this->_height) {
42 $attributes["size"] = 5;
43 }
44
45 $selected_value = $this->get_value();
46
47 $tag = new SELECTtag($attributes);
48
49 foreach ($this->_data_list as $name=>$value) {
50
51 $attributes = array("value"=>$value);
52 if ($value == $selected_value) {
53 $attributes['selected'] = "selected";
54 }
55 if (isset($this->_disabled_items[$name])) {
56 $attributes['disabled'] = "disabled";
57 }
58
59 $tag->add(new OPTIONtag($attributes, htmlspecialchars($name)));
60 }
61 return $tag;
62 }
63 }
64
65 /**
66 * Build a Yes/No Select box
67 *
68 * @author Walter A. Boring IV <waboring@newsblob.com>
69 * @author Suren Markossian <suren@bcsweb.com>
70 * @package phpHtmlLib
71 * @subpackage FormProcessing
72 *
73 * @copyright LGPL - See LICENCE
74 */
75 class FEYesNoListBox extends FEListBox {
76
77 /**
78 * The Constructor
79 *
80 * @param label string - text label for the element
81 * @param bool required - is this a required element
82 * @param array data_list - list of data elements (name=>value)
83 * @param int required - element width in characters, pixels (px), percentage (%) or elements (em)
84 * @param string - the value to use for the 'yes' radio
85 * NOTE: default is 'yes'
86 * @param string - the value to use for the 'no' radio
87 * NOTE: default is 'no'
88 */
89 function FEYesNoListBox($label, $required = TRUE, $width = NULL, $height = NULL,
90 $yes_value="yes", $no_value="no") {
91 $options = array("Yes" => $yes_value, "No" => $no_value);
92 $this->FEListBox($label, $required, $width, $height, $options);
93 }
94 }
95
96
97 /**
98 * This class builds a nested select box that
99 * is used to select an entry from nested levels.
100 *
101 * NOTE: The data array must be in the format
102 * array("test" => "testvalue",
103 * "nestedtest" => array("value" => "nestedtestvalue",
104 * "items" => array( "foo" => "foovalue",
105 * "bar" => "barvalue"));
106 *
107 * Example
108 * $data = array("Test" => 1,
109 * "Foo" => array("value" => 2,
110 * "items" => array("Blah" => 3,
111 * "php" => 4)),
112 * "Bar" => array("value" => 5,
113 * "items" => array("testing" => array("value" => 6,
114 * "items" => array("ugh" => 7)),
115 * "again" => 8)));
116 *
117 * would result in
118 *
119 * <select >
120 * <option value="1">Test</option>
121 * <option value="2">Foo</option>
122 * <option value="3">&nbsp;&nbsp;Blah</option>
123 * <option value="4">&nbsp;&nbsp;php</option>
124 * <option value="5">Bar</option>
125 * <option value="6">&nbsp;&nbsp;testing</option>
126 * <option value="7">&nbsp;&nbsp;&nbsp;&nbsp;ugh</option>
127 * <option value="8">&nbsp;&nbsp;again</option>
128 * </select>
129 *
130 *
131 * @author Walter A. Boring IV <waboring@newsblob.com>
132 * @package phpHtmlLib
133 * @subpackage FormProcessing
134 *
135 * @copyright LGPL - See LICENCE
136 */
137 class FENestedListBox extends FEDataList {
138
139 /**
140 * This function builds and returns the
141 * form element object
142 *
143 * @return object
144 */
145 function get_element() {
146
147 $attributes = $this->_build_element_attributes();
148
149 if ($this->_height) {
150 $attributes["size"] = 5;
151 }
152
153 $tag = new SELECTtag($attributes);
154
155 $this->_add_array($this->_data_list, 0, $tag);
156 return $tag;
157 }
158
159
160 /**
161 *
162 * This function is responsible for performing complete
163 * validation and setting the appropriate error message
164 * in case of a failed validation
165 *
166 * @param FormValidation object
167 */
168 function validate(&$_FormValidation) {
169 // we make sure that the value is in the data list
170 $value = $this->get_value();
171
172 if (!$this->_array_search_r($value, $this->_data_list, $temp)) {
173 $this->set_error_message("Invalid value");
174 return FALSE;
175 }
176 return TRUE;
177 }
178
179
180 function _array_search_r($needle, $haystack, &$item) {
181 //xxx($needle);
182 $match = FALSE;
183
184 foreach($haystack as $name=>$value) {
185 if (is_array($value)) {
186 if ($value["value"] == $needle) {
187 $item = $name;
188 $match = TRUE;
189 } else {
190 $match = $this->_array_search_r($needle, $value["items"], $item);
191 $item = $name."::".$item;
192 }
193 } else if ($value==$needle) {
194 $item = $name;
195 $match = TRUE;
196 }
197
198 if ($match)
199 return TRUE;
200 }
201 return $match;
202 }
203
204
205 /**
206 * This provides a method
207 * for the FormContent
208 * to get access to the
209 * text associated with a
210 * field. This is only available
211 * on FormElements that have text
212 * associated with a field.
213 * It is used during Confirmation
214 *
215 * @return string - the text associated
216 */
217 function get_value_text() {
218 $ret = $this->_array_search_r($this->get_value(),
219 $this->_data_list, $item);
220 return $item;
221 }
222
223
224 /**
225 * This is a recursive function used to add
226 * an array of layers to the select box.
227 *
228 * @param array - the next level of name=>value pairs
229 * @param int - the level
230 * @param SELECTtag - the SELECTtag object to add the options
231 * @return none
232 */
233 function _add_array($layer_arr, $level, &$tag) {
234 if (!is_array($layer_arr)) {
235 return;
236 }
237
238 foreach( $layer_arr as $name=>$value) {
239 if (is_array($value)) {
240 $tag->add( $this->_build_option($name, $value["value"], $level));
241 $this->_add_array($value["items"], $level+1, $tag);
242 } else {
243
244 $tag->add($this->_build_option($name, $value, $level));
245 }
246 }
247 }
248
249 /**
250 * This method builds the actual OPTIONtag object
251 *
252 * @param string the name
253 * @param string the value
254 * @param int the level
255 * @return OPTIONtag object
256 */
257 function _build_option($name, $value, $level) {
258 $selected_value = $this->get_value();
259
260 $attributes = array("value"=>$value);
261 if ($value == $selected_value) {
262 $attributes['selected'] = "selected";
263 }
264
265 if (isset($this->_disabled_items[$name])) {
266 $attributes['disabled'] = "disabled";
267 }
268
269 return new OPTIONtag($attributes, $this->_layer_name($name, $level));
270 }
271
272 /**
273 * This builds a layer's name
274 *
275 * @param string - original name
276 * @param int the layer level
277 * @return string the new name
278 */
279 function _layer_name($name, $level) {
280 $newname = '';
281
282 if ($level == 0) {
283 return $name;
284 } else {
285 $newname .= str_repeat(_HTML_SPACE, $level*2).$name;
286 }
287
288 return $newname;
289 }
290 }
291
292
293 /**
294 * This is the MultiListBox FormElement which builds a
295 * select field with all of its options. It enables
296 * the ability to have multiple selections.
297 * It has no validation method.
298 *
299 *
300 * @author Walter A. Boring IV <waboring@newsblob.com>
301 * @author Suren Markossian <suren@bcsweb.com>
302 * @package phpHtmlLib
303 * @subpackage FormProcessing
304 *
305 * @copyright LGPL - See LICENCE
306 */
307 class FEMultiListBox extends FEListBox {
308
309
310 /**
311 * This function creates element name
312 * used in the form based on the text label
313 * or any other parameters
314 *
315 * Overriding things function to make sure
316 * an array is created instead of a single variable
317 */
318 function create_element_name() {
319
320 parent::create_element_name();
321
322 $this->_element_name .= "[]";
323 }
324
325 /**
326 * build the string for the confirmation page
327 *
328 * @return string
329 */
330 function get_value_text() {
331 $value = $this->get_value();
332 if (empty($value)) {
333 return '';
334 }
335
336 $data_flip = array_flip( $this->_data_list );
337 foreach( $value as $val ) {
338 $ret[] = $data_flip[$val];
339 }
340 return implode(", ", $ret);
341 }
342
343 /**
344 * This function builds and returns the
345 * form element object
346 *
347 * @return object
348 */
349 function get_element() {
350
351 $attributes = $this->_build_element_attributes();
352
353 $attributes['multiple'] = "multiple";
354
355 if ($this->_height) {
356 $attributes["size"] = 5;
357 }
358
359 $selected_values = $this->get_value();
360
361 $tag = new SELECTtag($attributes);
362
363 foreach ($this->_data_list as $name=>$value) {
364
365 $attributes = array("value"=>$value);
366 if (is_array($selected_values) && in_array($value, $selected_values)) {
367 $attributes['selected'] = "selected";
368 }
369 if (isset($this->_disabled_items[$name])) {
370 $attributes['disabled'] = "disabled";
371 }
372
373 $tag->add(new OPTIONtag($attributes, $name));
374 }
375 return $tag;
376 }
377 }
378
379 /**
380 * This class builds a FEDataList that shows
381 * a select box for States of the U.S.A.
382 *
383 * @author Walter A. Boring IV
384 */
385 class FEUnitedStates extends FEListBox {
386
387 /**
388 * The states array
389 * @var array
390 */
391 var $_states = array("Select State" => "",
392 "Alabama" => "AL",
393 "Alaska" => "AK",
394 "Arizona" => "AZ",
395 "Arkansas" => "AR",
396 "California" => "CA",
397 "Colorado" => "CO",
398 "Connecticut" => "CT",
399 "Deleware" => "DE",
400 "District of Columbia" => "DC",
401 "Florida" => "FL",
402 "Georgia" => "GA",
403 "Hawaii" => "HI",
404 "Idaho" => "ID",
405 "Illinois" => "IL",
406 "Indiana" => "IN",
407 "Iowa" => "IA",
408 "Kansas" => "KS",
409 "Kentucky" => "KY",
410 "Louisiana" => "LA",
411 "Maine" => "ME",
412 "Maryland" => "MD",
413 "Massachusetts" => "MA",
414 "Michigan" => "MI",
415 "Minnesota" => "MN",
416 "Mississippi" => "MS",
417 "Missouri" => "MO",
418 "Montana" => "MT",
419 "Nebraska" => "NE",
420 "Nevada" => "NV",
421 "New Hampshire" => "NH",
422 "New Jersey" => "NJ",
423 "New Mexico" => "NM",
424 "New York" => "NY",
425 "North Carolina" => "NC",
426 "North Dakota" => "ND",
427 "Ohio" => "OH",
428 "Oklahoma" => "OK",
429 "Oregon" => "OR",
430 "Pennsylvania" => "PA",
431 "Rhode Island" => "RI",
432 "South Carolina" => "SC",
433 "South Dakota" => "SD",
434 "Tennessee" => "TN",
435 "Texas" => "TX",
436 "Utah" => "UT",
437 "Vermont" => "VT",
438 "Virginia" => "VA",
439 "Washington" => "WA",
440 "West Virginia" => "WV",
441 "Wisconsin" => "WI",
442 "Wyoming" => "WY",
443 "Puerto Rico" => "PR",
444 "Virgin Island" => "VI",
445 "Northern Mariana Islands" => "MP",
446 "Guam" => "GU",
447 "American Samoa" => "AS",
448 "Palau" => "PW",
449 );
450
451 /**
452 * The constructor
453 *
454 * @param string text label for the element
455 * @param boolean is this a required element?
456 * @param int element width in characters, pixels (px), percentage (%) or elements (em)
457 * @param int element height in px
458 * @param array data_list - list of data elements (name=>value)
459 */
460 function FEUnitedStates($label, $required = TRUE, $width = NULL, $height = NULL) {
461 $this->FEListBox($label, $required, $width, $height, $this->_states);
462 }
463 }
464
465 /**
466 * This class builds a FEDataList that shows
467 * a select box for states of the European Union.
468 */
469 class FEEuropeanUnion extends FEListBox {
470 /**
471 * The states array
472 * @var array
473 */
474 var $_states = array("Select State" => "",
475 "Belgium" => "be",
476 "Denmark" => "dk",
477 "Germany" => "de",
478 "Greece" => "gr",
479 "Spain" => "es",
480 "France" => "fr",
481 "Ireland" => "ie",
482 "Italy" => "it",
483 "Luxembourg" => "lu",
484 "The Netherlands" => "nl",
485 "Austria" => "at",
486 "Portugal" => "pt",
487 "Finland" => "fi",
488 "Sweden" => "se",
489 "United Kingdom" => "uk",
490 "Czech Republic" => "cz",
491 "Estonia" => "ee",
492 "Cyprus" => "cy",
493 "Latvia" => "lv",
494 "Lithuania" => "lt",
495 "Hungary" => "hu",
496 "Malta" => "mt",
497 "Poland" => "pl",
498 "Slovenia" => "si",
499 "Slovakia" => "sk",
500 );
501
502 /**
503 * The constructor
504 *
505 * @param string text label for the element
506 * @param boolean is this a required element?
507 * @param int element width in characters, pixels (px), percentage (%) or elements (em)
508 * @param int element height in px
509 * @param array data_list - list of data elements (name=>value)
510 */
511 function FEEuropeanUnion($label, $required = TRUE, $width = NULL, $height = NULL) {
512 $this->FEListBox($label, $required, $width, $height, $this->_states);
513 }
514 }
515
516
517 /**
518 * This builds a complex dual select box
519 * with buttons to move entries from one
520 * select box to another.
521 *
522 * From Actions To
523 * -------- Add >> --------
524 * |------| Add All |------|
525 * |------| |------|
526 * |------| |------|
527 * |------| << Remove |------|
528 * |------| Remove All |------|
529 * |------| |------|
530 * -------- --------
531 *
532 * @author Walter A. Boring IV
533 */
534 class FEComboListBox extends FEDataList {
535
536
537 /**
538 * Holds the list of available
539 * data elements for the 'to'
540 * box.
541 *
542 */
543 var $_data_list_to = array();
544
545 /**
546 * The from field's label
547 *
548 * @var string
549 */
550 var $_from_label = 'Available';
551
552 /**
553 * The to field's label
554 *
555 * @var string
556 */
557 var $_to_label = 'Selected';
558
559 /**
560 * This Form Element needs to
561 * propogate some js to the
562 * Form tag's onsubmit attribute
563 *
564 * @var string
565 */
566 var $_has_form_on_submit = true;
567
568
569 /**
570 * The constructor
571 *
572 * @param string text label for the element
573 * @param boolean is this a required element?
574 * @param int element width in characters, pixels (px), percentage (%) or elements (em)
575 * @param int element height in px
576 * @param array list of 'from' field data elements (name=>value)
577 * @param array list of 'to' field data elements (name=>value)
578 */
579 function FEComboListBox($label, $required = TRUE, $width="200px", $height="100px",
580 $from_data_list = array(), $to_data_list = array()) {
581 $this->set_to_list_data($to_data_list);
582 $this->FEDataList($label, $required, $width, $height, $from_data_list);
583 }
584
585 /**
586 * This function sets the array of data
587 * to be used in the data list
588 *
589 * @param array data_list - list of data elements (name=>value)
590 */
591 function set_to_list_data( $data_list = array() ) {
592 $this->_data_list_to = $data_list;
593 }
594
595 /**
596 * Use this method to set the label for the
597 * 'from' field
598 *
599 * @param string
600 * @return none
601 */
602 function set_from_label($label) {
603 $this->_from_label = $label;
604 }
605
606 /**
607 * Use this method to set the label for the
608 * 'to' field
609 *
610 * @param string
611 * @return none
612 */
613 function set_to_label($label) {
614 $this->_to_label = $label;
615 }
616
617
618 /**
619 * This returns the initial value of
620 * the element
621 *
622 * @return mixed
623 */
624 function get_init_value() {
625 if ($this->_data_list_to) {
626 return $this->_data_list_to;
627 } else {
628 return parent::get_init_value();
629 }
630 }
631
632
633 /**
634 * This function will set the
635 * initial value for the element
636 *
637 * @param value mixed
638 */
639 function set_value($value) {
640 //we need to see if we need to modify the
641 //the 2 data sets so the values of each are
642 //correctly displayed.
643
644
645 if (array_key_exists($this->_element_name, $_REQUEST)) {
646 $all_list = array_merge( $this->_data_list, $this->_data_list_to);
647
648 if (isset($_REQUEST[$this->_element_name])) {
649 $diff = array_diff( $all_list, $_REQUEST[$this->_element_name]);
650 $this->set_list_data( $diff );
651 $to_list = array();
652
653 if (is_array($_REQUEST[$this->_element_name])) {
654 foreach( $_REQUEST[$this->_element_name] as $value ) {
655 $key = array_search($value, $all_list);
656 if ($key) {
657 $to_list[$key] = $value;
658 }
659 }
660 } else {
661 if (!empty($_REQUEST[$this->_element_name])) {
662 $to_list[array_search($_REQUEST[$this->_element_name], $all_list)] = $_REQUEST[$this->_element_name];
663 }
664 }
665 $this->set_to_list_data( $to_list );
666 } else {
667 //the assigned list is empty
668 $this->set_list_data( $all_list );
669 $this->set_to_list_data(array());
670 }
671 } else {
672 $this->set_to_list_data($value);
673 }
674
675 }
676
677
678
679 /**
680 * This function builds and returns the
681 * form element object
682 *
683 * @return object
684 */
685 function get_element() {
686 $table = html_table();
687 $table->add_row($this->_from_label, _HTML_SPACE,
688 $this->get_label(NULL,$this->_to_label, FALSE));
689
690 $from_select = form_select($this->_element_name.'_available',
691 $this->_data_list,'', TRUE);
692
693 if ($this->onChangeJS != null) {
694 $from_select->set_tag_attribute("onChange", $this->onChangeJS);
695 }
696
697 $style = '';
698 if ($this->_height) {
699 $style .= "height: ".$this->_height.";";
700 }
701 if ($this->_width) {
702 $style .= "width: ".$this->_width.";";
703 }
704
705 //build the buttons
706 $button_style = 'width: 90px;';
707 $f_name = $this->_element_name."_move_around";
708 $add = form_button($this->_element_name.'_add', 'Add >>', array('style' => $button_style,
709 'onclick' => $f_name."('right',false);"));
710 $add_all = form_button($this->_element_name.'_add_all', 'Add All', array('style' => $button_style,
711 "onclick" => $f_name."('right', true);"));
712
713 $remove = form_button($this->_element_name.'_remove', '<< Remove', array('style' => $button_style,
714 'onclick' => $f_name."('left', false);"));
715 $remove_all = form_button($this->_element_name.'_remove_all', 'Remove All', array('style' => $button_style,
716 'onclick' => $f_name."('left', true);"));
717
718 $to_select = form_select($this->_element_name.'[]',
719 $this->_data_list_to, '', TRUE);
720
721 if (strlen($style) > 0) {
722 $from_select->set_style($style);
723 $to_select->set_style($style);
724 }
725
726 //check to see if we are disabled
727 if ($this->is_disabled()) {
728 $from_select->set_tag_attribute('disabled');
729 $add->set_tag_attribute('disabled');
730 $add_all->set_tag_attribute('disabled');
731 $remove->set_tag_attribute('disabled');
732 $remove_all->set_tag_attribute('disabled');
733 $to_select->set_tag_attribute('disabled');
734 }
735
736
737 $button_td = new TDtag(array('align' => 'left'),
738 $add, html_br(), $add_all, html_br(2),
739 $remove, html_br(), $remove_all);
740 //IE sucks.
741 $button_td->set_collapse();
742 $table->add_row( $from_select,
743 $button_td,
744 $to_select );
745
746 return $table;
747 }
748
749 /**
750 *
751 * This function is responsible for performing complete
752 * validation and setting the appropriate error message
753 * in case of a failed validation
754 *
755 * NOTE: This makes sure that the data submitted for both
756 * fields is in the original list.
757 *
758 * @param FormValidation object
759 */
760 function validate(&$_FormValidation) {
761 //need to make sure we only allow
762 //elements that the class has.
763 $combined = array_flip(array_merge( $this->_data_list, $this->_data_list_to));
764
765 if (isset($_REQUEST[$this->_element_name])) {
766 if (is_array($_REQUEST[$this->_element_name])) {
767 foreach( $_REQUEST[$this->_element_name] as $value ) {
768 if (!isset($combined[$value])) {
769 return FALSE;
770 }
771 }
772 return TRUE;
773 } else {
774 if (!isset($combined[$value])) {
775 return FALSE;
776 } else {
777 return TRUE;
778 }
779 }
780 } else {
781 //empty value
782 return TRUE;
783 }
784
785 return TRUE;
786 }
787
788 /**
789 * This provides a method
790 * for the FormContent
791 * to get access to the
792 * text associated with a
793 * field. This is only available
794 * on FormElements that have text
795 * associated with a field.
796 * It is used during Confirmation
797 *
798 * @param mixed - the value to look up
799 * @return string - the text associated
800 */
801 function get_value_text() {
802 return implode( ", ", array_keys( $this->get_value() ) );
803 }
804
805 /**
806 * This is a method for getting the JS needed
807 * for the form tag's onsubmit attribute.
808 *
809 * @return string
810 */
811 function form_tag_onsubmit() {
812 return $this->_element_name.'_check_submit();';
813 }
814
815
816 /**
817 * This method builds the Javascript needed for this
818 * element.
819 *
820 * @return string The javascript.
821 */
822 function javascript() {
823
824 $js = "function ".$this->_element_name."_move_around(direction, all) {\n".
825 " if (direction==\"right\") {\n".
826 " box1 = \"".$this->_element_name."_available\";\n".
827 " box2 = \"".$this->_element_name."[]\";\n".
828 " } else {\n".
829 " box1 = \"".$this->_element_name."[]\";\n".
830 " box2 = \"".$this->_element_name."_available\" + \"\";\n".
831 " }\n".
832
833 " for (var i=0;i<document.forms[0].elements[box1].length;i++) {\n".
834 " if (document.forms[0].elements[box1][i].selected || all) {\n".
835 " // add to the other list box\n".
836 " document.forms[0].elements[box2].options[document.forms[0].elements[box2].length] =".
837 " new Option(document.forms[0].elements[box1].options[i].text, document.forms[0].elements[box1][i].value);\n".
838 " // remove from the current listbox\n".
839 " document.forms[0].elements[box1][i] = null;\n".
840 " i--;\n".
841 " }\n".
842 " }\n".
843 "}\n";
844
845
846 $js .= "\nfunction ".$this->_element_name."_check_submit() {\n".
847 " // select all items in the added ip list\n".
848 " // in order to include in the post data\n".
849 " box = \"".$this->_element_name."[]\";\n".
850 " if (document.forms[0].elements[box]) {\n".
851 " for (var i=0;i<document.forms[0].elements[box].length;i++) {\n".
852 " document.forms[0].elements[box][i].selected = true;\n".
853 " }\n".
854 " }\n".
855
856 " // disable the buttons\n".
857 " //document.forms[0]._form_action1.disabled = true;\n".
858 " //if (document.forms[0]._form_action2)\n".
859 " // document.forms[0]._form_action2.disabled = true;\n".
860 " //document.forms[0].cancel.disabled = true;\n".
861 " return true;\n".
862 "}\n";
863
864 return trim($js);
865 }
866
867 /**
868 * This function will return the
869 * elements value
870 *
871 * @return mixed
872 */
873 function get_value(){
874 return $this->_data_list_to;
875 }
876
877
878 /**
879 * This method returns the hidden version of this
880 * element for a confirmation page.
881 *
882 * NOTE: This is called by the FormProcessor only.
883 * It shouldn't be called manually.
884 *
885 * @return INPUTtag of type hidden
886 */
887 function get_confirm_element(){
888 $name = $this->get_element_name();
889
890 $c = container();
891 if (is_array( $_REQUEST[$name]) ) {
892 foreach( $_REQUEST[$name] as $value ){
893 $c->add(form_hidden( $name."[]", $value));
894 }
895 } else {
896 $c->add(form_hidden($name."[]", $_REQUEST[$name] ));
897 }
898
899 return $c;
900 }
901 }
902
903 /**
904 * This class builds the FEComboList with buttons below each element
905 *
906 * @author Sumedh Thakar
907 */
908 class FEComboListButtonsBox extends FEComboListBox {
909
910 /**
911 * This variable holds the button array
912 */
913 var $_button_info = array();
914 /**
915 * this function sets the array of buttons and related info
916 * array is of format
917 * array('left' => array(
918 * array(
919 * 'name'=> 'expand',
920 * 'value' => 'Expand it",
921 * 'onclick'=> 'some_function()',
922 * 'js' => 'function some_function(){ alert('hi'); }' * ),
923 * )
924 * )
925 * @author Sumedh Thakar
926 * @param array of buttons and related info
927 */
928 function set_button_array($button_array){
929 $this->_button_info = $button_array;
930 }
931
932 function javascript(){
933 $js = parent::javascript();
934 if(count($this->_button_info)){
935 foreach ($this->_button_info as $side){
936 foreach ($side as $button){
937 if(isset($button['js'])) $js .= " ".$button['js']." ";
938 }
939 }
940 }
941 return $js;
942 }
943
944 function get_element(){
945 $table = parent::get_element();
946 if(empty($this->_button_info)) return $table;
947 if (isset($this->_button_info['left'])){
948 $lbuttons = new TDtag();
949 foreach($this->_button_info['left'] as $butt) {
950
951 $attributes = array();
952 if (strlen($butt['value'])>12) $attributes["style"] = "padding-left:6px;padding-right:6px;";
953 else $attributes["style"] = "width:100px;";
954 $attributes["onClick"] = $butt['onclick'];
955
956 $lbuttons->add(form_button(
957 $butt['name'],
958 $butt['value'],
959 $attributes),
960 _HTML_SPACE);
961 }
962 }else{
963 $lbuttons = _HTML_SPACE;
964 }
965 if (isset($this->_button_info['right'])){
966 $rbuttons = new TDtag();
967 foreach($this->_button_info['right'] as $butt) {
968
969 $attributes = array();
970 if (strlen($butt['value'])>12) $attributes["style"] = "padding-left:6px;padding-right:6px;";
971 else $attributes["style"] = "width:100px;";
972 $attributes["onClick"] = $butt['onclick'];
973
974 $rbuttons->add(form_button(
975 $butt['name'],
976 $butt['value'],
977 $attributes),
978 _HTML_SPACE);
979 }
980 }else{
981 $rbuttons = _HTML_SPACE;
982 }
983 $table->add_row($lbuttons,
984 _HTML_SPACE,
985 $rbuttons
986 );
987 return $table;
988
989 }
990
991
992 }
993
994 /**
995 * This class builds a FEDataList that shows a select box for Months of the year
996 *
997 * You should use the built in php {@link http://www.php.net/manual/en/function.setlocale.php setlocale}
998 * function to affect the language used for the month list.
999 *
1000 * @author Culley Harrelson <culley@fastmail.fm>
1001 * @see FEDate
1002 *
1003 */
1004
1005 class FEMonths extends FEListBox {
1006
1007 /**
1008 * The constructor
1009 *
1010 * @param string text label for the element
1011 * @param boolean is this a required element?
1012 * @param int element width in characters, pixels (px), percentage (%) or elements (em)
1013 * @param int element height in px
1014 * @param string format should be F m or M: Full month name, digit, abbreviated month name
1015 *
1016 */
1017 function FEMonths($label, $required = TRUE, $width = NULL, $height = NULL, $format = 'F'){
1018
1019 // $format should be M m or F. Default to F if the user passes in garbage.
1020 switch ($format) {
1021 case 'M':
1022 $format = '%b';
1023 break;
1024 case 'm':
1025 $format = '%m';
1026 break;
1027 default:
1028 $format = '%B';
1029 break;
1030 }
1031
1032 for ($i = 1; $i < 13; $i++) {
1033 $months[$i] = strftime($format, strtotime("$i/12/2004"));
1034 }
1035
1036 $this->FEListBox($label, $required, $width, $height, array_flip($months));
1037
1038
1039 }
1040 }
1041
1042 /**
1043 * This class builds a FEDataList that shows a select box listing a range of years
1044 *
1045 * @author Culley Harrelson <culley@fastmail.fm>
1046 * @see FEDate
1047 *
1048 */
1049
1050 class FEYears extends FEListBox {
1051
1052 /**
1053 * The constructor
1054 *
1055 * @param string text label for the element
1056 * @param boolean is this a required element?
1057 * @param int element width in characters, pixels (px), percentage (%) or elements (em)
1058 * @param int element height in px
1059 * @param int min_year
1060 * @param int max_year
1061 */
1062 function FEYears($label, $required = TRUE, $width = NULL, $height = NULL, $min_year = 2000, $max_year = 2010){
1063 // this will be cleaner in php5 with array_combine()
1064 $list = range($min_year, $max_year);
1065 foreach ($list as $year){
1066 $years[$year] = $year;
1067 }
1068 $this->FEListBox($label, $required, $width, $height, $years);
1069 }
1070 }
1071
1072 /**
1073 * This class builds a FEDataList that shows a select box listing the days of the month
1074 *
1075 * @author Culley Harrelson <culley@fastmail.fm>
1076 * @see FEDate
1077 *
1078 */
1079
1080 class FEDays extends FEListBox {
1081
1082 /**
1083 * The constructor
1084 *
1085 * @param string text label for the element
1086 * @param boolean is this a required element?
1087 * @param int element width in characters, pixels (px), percentage (%) or elements (em)
1088 * @param int element height in px
1089 */
1090
1091 function FEDays($label, $required = TRUE, $width = NULL, $height = NULL){
1092
1093 // this will be cleaner in php5 with array_combine()
1094 $list = range(1, 31);
1095 foreach ($list as $day){
1096 // pad the single digit days with zeros
1097 $new_day = sprintf('%02d', $day);
1098 $days[$new_day] = $day;
1099 }
1100 $this->FEListBox($label, $required, $width, $height, $days);
1101
1102
1103 }
1104 }
1105
1106 /**
1107 * This class builds a widget that shows a group of select boxes (FEYears, FEMonths, FEDays) representing a date.
1108 *
1109 * FEDate will display three drop down lists representing a date. You can set
1110 * the order in which these elements are displayed and the minimum and maximum
1111 * years displayed.
1112 *
1113 * Like in FEMonths you should use the built in php {@link http://www.php.net/manual/en/function.setlocale.php setlocale}
1114 * function to affect the language used for the month list.
1115 *
1116 * Example as it would appear in FormContent::form_init_elements():
1117 * <code>
1118 * // set the locale to dutch
1119 * setlocale(LC_TIME, 'nl_NL');
1120 * $date_element = new FEDate("FEDate label", false, null, null, 'Fdy', 1970, 1975);
1121 * </code>
1122 *
1123 * the $format parameter conforms the the php {@link http://www.php.net/manual/en/function.setlocale.php date} function
1124 * format argument specification (for years, months and days only).
1125 *
1126 * @author Culley Harrelson <culley@fastmail.fm>
1127 * @author Suren Markosian <suren@emicron.net>
1128 * @see FEMonths
1129 * @see FEDays
1130 * @see FEYears
1131 *
1132 */
1133
1134 class FEDate extends FEBoxElement {
1135
1136 /**
1137 * The earliest year shown in the year list.
1138 * @var integer
1139 * @access private
1140 */
1141 var $_min_year;
1142
1143 /**
1144 * The latest year shown in the year list.
1145 * @var string
1146 * @access private
1147 */
1148 var $_max_year;
1149
1150 /**
1151 * The order in which to show the elements. This variable must be 3
1152 * characters long and contain only one m only one d and only one y.
1153 *
1154 * @var string
1155 * @access private
1156 */
1157 var $_format = 'mdy';
1158
1159 /**
1160 * A printf style format string used to add punctuation to the confirmation
1161 * display. Defaults to space separated. The placeholders are filled
1162 * according to the order set in $_format
1163 *
1164 * @var string
1165 * @access private
1166 */
1167 var $_text_format = '%s %s %s';
1168
1169 /**
1170 * The year form element
1171 *
1172 * @var FEYears
1173 * @access private
1174 */
1175 var $_year;
1176
1177 /**
1178 * The month form element
1179 *
1180 * @var FEMonths
1181 * @access private
1182 */
1183 var $_month;
1184
1185 /**
1186 * The day form element
1187 *
1188 * @var FEDays
1189 * @access private
1190 */
1191 var $_day;
1192
1193 /**
1194 * The constructor
1195 *
1196 * @param string text label for the element
1197 * @param boolean is this a required element?
1198 * @param int element width in characters, pixels (px), percentage (%) or elements (em)
1199 * @param int element height in px
1200 * @param string date format string. M m F Y y d D are valid. 3 characters max.
1201 * @param int min value for year drop down list
1202 * @param int max value for year drop down list
1203 * @see FEDate for an example
1204 * @todo we need to blow up somehow if the format string is bogus
1205 * @access public
1206 *
1207 */
1208
1209 function FEDate($label, $required = TRUE, $width = NULL, $height = NULL,
1210 $format = 'mdy', $min_year = 2000, $max_year = 2010){
1211
1212 $this->_set_format($format);
1213 $this->_min_year = $min_year;
1214 $this->_max_year = $max_year;
1215
1216 $this->_year = new FEYears($this->_element_name . '_years', $required, null, null, $min_year, $max_year);
1217 $this->_month = new FEMonths($this->_element_name . '_months', $required, null, null, preg_replace('/[dy]/i', '', $this->_format));
1218 $this->_day = new FEDays($this->_element_name . '_days', $required, null, null);
1219 $this->FEBoxElement($label, $required, $width, $height);
1220 }
1221
1222 /**
1223 * We need to override this so we get
1224 * the form name set in the child elements
1225 * so the id attributes are set correctly.
1226 */
1227 function set_form_name($name) {
1228 $this->_form_name = $name;
1229 $this->_year->set_form_name($name);
1230 $this->_month->set_form_name($name);
1231 $this->_day->set_form_name($name);
1232 }
1233
1234 /**
1235 * This function builds and returns the
1236 * form element object
1237 *
1238 * @return object
1239 * @access public
1240 */
1241 function get_element(){
1242
1243 $container = new Container();
1244
1245 // add the elements in the order specified.
1246 $chars = preg_split('//', $this->_format, -1, PREG_SPLIT_NO_EMPTY);
1247 foreach ($chars as $char){
1248 switch ($char) {
1249 case 'y':
1250 $container->add($this->_year->get_element());
1251 break;
1252 case 'm':
1253 case 'F':
1254 $container->add($this->_month->get_element());
1255 break;
1256 case 'd':
1257 $container->add($this->_day->get_element());
1258 break;
1259 }
1260 }
1261
1262 return $container;
1263 }
1264
1265 /**
1266 * This function will return the elements value as an array or month, day and year
1267 *
1268 * @return array
1269 * @access public
1270 */
1271 function get_value(){
1272 $value= array("day"=>$this->_day->get_value(),
1273 "month"=>$this->_month->get_value(),
1274 "year"=>$this->_year->get_value());
1275
1276 return $value;
1277
1278
1279 }
1280
1281 /**
1282 * Set the value of the element
1283 *
1284 * This function sets the default values for the date element The
1285 * parameter should be a string representation of the date in ISO 8601
1286 * format.
1287 *
1288 * @param string
1289 * @access public
1290 */
1291 function set_value($value){
1292 if ($value) {
1293 if (is_array($value)) {
1294 $this->_year->set_value($value['year']);
1295 $this->_month->set_value($value['month']);
1296 $this->_day->set_value($value['day']);
1297 } else {
1298 $date_parts = explode('-', $value);
1299 $this->_year->set_value($date_parts[0]);
1300 $this->_month->set_value($date_parts[1]);
1301 $this->_day->set_value($date_parts[2]);
1302 }
1303 }
1304
1305
1306 }
1307
1308 /**
1309 * This returns a formatted string used for the confirmation display (and possibly elsewhere)
1310 *
1311 * @return string
1312 * @access public
1313 */
1314 function get_value_text(){
1315
1316 // loop through the characters in $_format to properly set the placeholders
1317 // determined in $_text_format
1318 $chars = preg_split('//', $this->_format, -1, PREG_SPLIT_NO_EMPTY);
1319 $i = 1;
1320 foreach ($chars as $char){
1321
1322 switch ($char) {
1323 case 'y':
1324 $value = $this->_year->get_value_text();
1325 break;
1326 case 'm':
1327 case 'F':
1328 $value = $this->_month->get_value_text();
1329 break;
1330 case 'd':
1331 $value = $this->_day->get_value_text();
1332 break;
1333 }
1334
1335 switch ($i) {
1336 case 1:
1337 $one = $value;
1338 break;
1339 case 2:
1340 $two = $value;
1341 break;
1342 case 3:
1343 $three = $value;
1344 break;
1345 }
1346
1347 $i++;
1348 }
1349
1350 return sprintf($this->_text_format, $one, $two, $three);
1351 }
1352
1353 /**
1354 *
1355 * This function is responsible for performing complete
1356 * validation and setting the appropriate error message
1357 * in case of a failed validation
1358 *
1359 * @param FormValidation
1360 * @access public
1361 * @return boolean success or failure
1362 */
1363 function validate(&$_FormValidation){
1364 $value = $this->get_value();
1365
1366 // we make sure that the date is valid
1367 if (!checkdate($value["month"], $value["day"], $value["year"])) {
1368 $this->set_error_message("Invalid date");
1369 return FALSE;
1370 }
1371 return TRUE;
1372 }
1373
1374 /**
1375 * this method sets the display order for the elements in the widget
1376 *
1377 * @param string
1378 * @return bool success or failure
1379 * @access private
1380 */
1381 function _set_format($format){
1382
1383 // must be 2 or 3 characters
1384 if (strlen($format) != 3) {
1385 return FALSE;
1386 }
1387
1388 // month can be represented by F m or M
1389 if (strstr($format, 'F')) {
1390 $month = 'f';
1391 } else {
1392 $month = 'm';
1393 }
1394
1395 // compare the characters sent with the characters needed. only set
1396 // the property if one of each is present
1397 $search_for = array ('y', $month, 'd');
1398 $chars = preg_split('//', strtolower($format), -1, PREG_SPLIT_NO_EMPTY);
1399
1400 if (count(array_diff($search_for, $chars)) > 0) {
1401 return FALSE;
1402 }
1403
1404 $this->_format = $format;
1405 return TRUE;
1406
1407
1408 }
1409
1410 /**
1411 * Set the text format for confirmation
1412 *
1413 * this method sets the format string used in get_value_text(). Use this
1414 * method to set special punctuation for the confirmation display. It is
1415 * fed through sprintf
1416 *
1417 * Examples:
1418 * <code>
1419 * $date_element->set_text_format("%s %s, %s");
1420 * $date_element->set_text_format("%04d-%02d-%02d");
1421 * </code>
1422 *
1423 * @param string
1424 * @access public
1425 * @link http://www.php.net/manual/en/function.sprintf.php
1426 *
1427 */
1428 function set_text_format($format){
1429
1430 $this->_text_format = $format;
1431 }
1432
1433 /**
1434 * This method returns the hidden version of this element for a confirmation page.
1435 *
1436 * NOTE: This is called by the FormProcessor only.
1437 * It shouldn't be called manually.
1438 *
1439 * @return container
1440 * @access public
1441 */
1442 function get_confirm_element(){
1443 $element_name = $this->get_element_name();
1444
1445 $c = container();
1446 $c->add(form_hidden($this->_year->get_element_name(), $this->_year->get_value()));
1447 $c->add(form_hidden($this->_month->get_element_name(), $this->_month->get_value()));
1448 $c->add(form_hidden($this->_day->get_element_name(), $this->_day->get_value()));
1449 return $c;
1450 }
1451
1452
1453 /**
1454 * Sets the disabled element flag
1455 *
1456 * @param bool disabled
1457 */
1458 function set_disabled($flag) {
1459 $this->_is_disabled = $flag;
1460 $this->_year->set_disabled($flag);
1461 $this->_month->set_disabled($flag);
1462 $this->_day->set_disabled($flag);
1463 }
1464
1465 }
1466
1467
1468
1469 /**
1470 * this class is used for building a listbox for
1471 * displaying Hours.
1472 *
1473 * @author Walter A. Boring IV
1474 */
1475 class FEHoursListBox extends FEListbox {
1476
1477 /**
1478 * Flag to tell us to use 12 or 24 hour format
1479 */
1480 var $_extended_hours = TRUE;
1481
1482 /**
1483 * The constructor
1484 *
1485 * @param string the label
1486 * @param boolean required flag or not
1487 * @param boolean show 24 hour format?
1488 */
1489 function FEHoursListBox($label='Hours', $required=FALSE, $extended_hours=TRUE) {
1490 if ($extended_hours) {
1491 $hours = array('00'=>0, '01'=>1, '02'=>2, '03'=>3, '04'=>4, '05'=>5,
1492 '06'=>6, '07'=>7, '08'=>8, '09'=>9, '10'=>10, '11'=>11,
1493 '12'=>12, '13'=>13, '14'=>14, '15'=>15, '16'=>16, '17'=>17,
1494 '18'=>18, '19'=>19, '20'=>20, '21'=>21, '22'=>22, '23'=>23);
1495 } else {
1496 $hours = array('00'=>0, '01'=>1, '02'=>2, '03'=>3, '04'=>4, '05'=>5,
1497 '06'=>6, '07'=>7, '08'=>8, '09'=>9, '10'=>10, '11'=>11,
1498 '12'=>12);
1499 }
1500 parent::FEListBox($label, $required, null, null, $hours);
1501 }
1502 }
1503
1504 /**
1505 * this class is used for building a listbox for
1506 * displaying Minutes.
1507 *
1508 * @author Walter A. Boring IV
1509 */
1510 class FEMinutesListBox extends FEListbox {
1511
1512 /**
1513 * The constructor
1514 *
1515 * @param string the label (default = 'Minutes')
1516 * @param boolean required flag or not
1517 */
1518 function FEMinutesListBox($label='Minutes', $required=FALSE) {
1519 $minutes = array('00'=>0, '01'=>1, '02'=>2, '03'=>3, '04'=>4, '05'=>5,
1520 '06'=>6, '07'=>7, '08'=>8, '09'=>9, '10'=>10);
1521
1522 for($x=11;$x<=59;$x++) {
1523 $minutes[$x]=$x;
1524 }
1525
1526 parent::FEListBox($label, $required, null, null, $minutes);
1527 }
1528 }
1529
1530 /**
1531 * this class is used for building a listbox for
1532 * displaying Seconds.
1533 *
1534 * @author Walter A. Boring IV
1535 */
1536 class FESecondsListBox extends FEMinutesListbox {
1537
1538 /**
1539 * The constructor
1540 *
1541 * @param string the label (default = 'Seconds')
1542 * @param boolean required flag or not
1543 */
1544 function FESecondsListBox($label='Seconds', $required=FALSE) {
1545 parent::FEMinutesListBox($label, $required);
1546 }
1547 }
1548
1549
1550 /**
1551 * This class is used to build a ListBox for
1552 * GMT timezone selection
1553 *
1554 * @author Walter A. Boring IV
1555 */
1556 class FEGMTTimeZoneListBox extends FEListBox {
1557
1558 /**
1559 * The timezone selections
1560 */
1561 var $_zones=array("GMT -12 : Eniwetok, Kwajalein"=>-12,
1562 "GMT -11 : Midway Islands, Samoa"=>-11,
1563 "GMT -10 : Hawaii"=>-10,
1564 "GMT -09 : Alaska"=>-9,
1565 "GMT -08 : Pacific (USA, Canada), Tijuana"=>-8,
1566 "GMT -07 : Arizona"=>-7,
1567 "GMT -06 : Central (USA, Canada), Mexico"=>-6,
1568 "GMT -05 : Bogota, Lima, Quito, East (USA, Canada)"=>-5,
1569 "GMT -04 : Caracas, La Paz, Atlantic (Canada)"=>-4,
1570 "GMT -03 : Terre Neuve, Brasilia, Georgetown"=>-3,
1571 "GMT -02 : Atlantic Center"=>-2,
1572 "GMT -01 : Azores"=>-1,
1573 "GMT +00 : Casablanca, London, Dublin, Lisbon"=>0,
1574 "GMT +01 : Paris, Amsterdam, Berlin, Rome, Vienna"=>1,
1575 "GMT +02 : Athens, Bucharest, Riga, Cairo, Israel"=>2,
1576 "GMT +03 : Nairobi, Moscow, Baghdad"=>3,
1577 "GMT +04 : Abu Dhabi, Kabul"=>4,
1578 "GMT +05 : Islamabad"=>5,
1579 "GMT +06 : Colombo"=>6,
1580 "GMT +07 : Bangkok, Hanoi, Jakarta"=>7,
1581 "GMT +08 : Beijing, Hong Kong, Singapore, Taipei"=>8,
1582 "GMT +09 : Tokyo, Seoul"=>9,
1583 "GMT +10 : Sydney, Vladivostok"=>10,
1584 "GMT +11 : New Caledonia"=>11,
1585 "GMT +12 : Wellington"=>12);
1586
1587 /**
1588 * The constructor
1589 *
1590 * @param string the label (default = 'Minutes')
1591 * @param boolean required flag or not
1592 */
1593 function FEGMTTimeZoneListBox($label='TimeZone', $required=FALSE) {
1594 parent::FEListBox($label, $required, null,null, $this->_zones);
1595 }
1596 }
1597
1598 /**
1599 * This Form Element builds a list box of the days of the week.
1600 *
1601 * Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
1602 *
1603 * @author Walter A. Boring IV
1604 */
1605 class FEWeekdaysListBox extends FEListBox {
1606 var $_weekdays = array('Sunday' => 0, 'Monday' => 1,
1607 'Tuesday' => 2, 'Wednesday' => 3,
1608 'Thursday' => 4, 'Friday' => 5,
1609 'Saturday' => 6);
1610
1611 function FEWeekdaysListBox($label='Weekdays', $required=FALSE) {
1612 parent::FEListBox($label, $required, null,null, $this->_weekdays);
1613 }
1614 }
1615
1616 ?>

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed