/[cvs]/nfo/site/htdocs/libs/hawhaw.inc
ViewVC logotype

Annotation of /nfo/site/htdocs/libs/hawhaw.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Fri Sep 3 11:10:57 2004 UTC (19 years, 11 months ago) by joko
Branch: MAIN
CVS Tags: alpha-20040904-1, HEAD
+ initial commit

1 joko 1.1 <?php
2    
3     // HAWHAW: HTML and WML hybrid adapted webserver
4     // PHP class library
5     // Copyright (C) 2004 Norbert Huffschmid
6     // Last modified: 18. August 2004
7     //
8     // This library is free software; you can redistribute it and/or modify it under the
9     // terms of the GNU Library General Public License as published by the Free Software
10     // Foundation; either version 2 of the License, or (at your option) any later
11     // version.
12     //
13     // This library is distributed in the hope that it will be useful, but WITHOUT ANY
14     // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
15     // PARTICULAR PURPOSE. See the GNU Library General Public License for more details.
16     // http://www.gnu.org/copyleft/lgpl.html
17     //
18     // If you modify this library, you have to make sure that the "powered by HAWHAW"
19     // copyright link below the display area is kept unchanged.
20     //
21     // For further information about this library and its license terms please visit:
22     // http://www.hawhaw.de/
23    
24     // miscellaneous constants
25     define("HAW_VERSION", "HAWHAW V5.7");
26     define("HAW_COPYRIGHT", "(C) Norbert Huffschmid");
27    
28     // constants for markup languages
29     define("HAW_HTML", 1);
30     define("HAW_WML", 2);
31     define("HAW_HDML", 3);
32     define("HAW_VXML", 4);
33    
34     // constants for forced markup output
35     define("HAW_OUTPUT_AUTOMATIC", "automatic");
36     define("HAW_OUTPUT_BIGSCREEN", "bigscreen");
37     define("HAW_OUTPUT_WAP", "wap");
38     define("HAW_OUTPUT_HDML", "hdml");
39     define("HAW_OUTPUT_PDA", "pda");
40     define("HAW_OUTPUT_IMODE", "imode");
41     define("HAW_OUTPUT_MML", "mml");
42     define("HAW_OUTPUT_VOICEXML", "voicexml");
43     define("HAW_OUTPUT_XHTML", "xhtml");
44     define("HAW_OUTPUT_LYNX", "lynx");
45     // ----- proprietary output types (for debugging purposes only) ------
46     define("HAW_OUTPUT_UP", "up"); // UP browser
47     define("HAW_OUTPUT_OWGUI", "owgui");// Openwave GUI
48     define("HAW_OUTPUT_PVX", "pvx"); // PublicVoiceXML
49    
50     // constants for page elements
51     define("HAW_PLAINTEXT", 1);
52     define("HAW_IMAGE", 2);
53     define("HAW_TABLE", 3);
54     define("HAW_FORM", 4);
55     define("HAW_LINK", 5);
56     define("HAW_PHONE", 6);
57     define("HAW_LINKSET", 7);
58     define("HAW_INPUT", 8);
59     define("HAW_TEXTAREA", 9);
60     define("HAW_BANNER", 10);
61     define("HAW_SELECT", 11);
62     define("HAW_CHECKBOX", 12);
63     define("HAW_RADIO", 13);
64     define("HAW_HIDDEN", 14);
65     define("HAW_SUBMIT", 15);
66     define("HAW_RAW", 16);
67     define("HAW_RULE", 17);
68     define("HAW_VOICERECORDER", 18);
69     define("HAW_USERDEFINED", 19);
70    
71     // constants for page setup
72     define("HAW_ALIGN_LEFT", 1);
73     define("HAW_ALIGN_RIGHT", 2);
74     define("HAW_ALIGN_CENTER", 3);
75     define("HAW_NOTITLE", -1);
76    
77     // constants for text formatting
78     define("HAW_TEXTFORMAT_NORMAL", 0);
79     define("HAW_TEXTFORMAT_BOLD", 1);
80     define("HAW_TEXTFORMAT_UNDERLINE", 2);
81     define("HAW_TEXTFORMAT_ITALIC", 4);
82     define("HAW_TEXTFORMAT_BIG", 8);
83     define("HAW_TEXTFORMAT_SMALL", 16);
84     define("HAW_TEXTFORMAT_BOXED", 32);
85    
86     // constants for input treatment
87     define("HAW_INPUT_TEXT", 0);
88     define("HAW_INPUT_PASSWORD", 1);
89    
90     // constants for select treatment
91     define("HAW_NOTSELECTED", 0);
92     define("HAW_SELECTED", 1);
93     define("HAW_SELECT_POPUP", 0);
94     define("HAW_SELECT_SPIN", 1);
95    
96     // constants for radio and checkbox treatment
97     define("HAW_NOTCHECKED", 0);
98     define("HAW_CHECKED", 1);
99    
100     // constants for link treatment
101     define("HAW_NO_ACCESSKEY", -1);
102    
103     // constants for HDML card types
104     define("HAW_HDML_DISPLAY", 0);
105     define("HAW_HDML_ENTRY", 1);
106     define("HAW_HDML_CHOICE", 2);
107     define("HAW_HDML_NODISPLAY", 3);
108    
109     // constants for banners
110     define("HAW_TOP", 0);
111     define("HAW_BOTTOM", 1);
112     define("HAW_NOLINK", -1);
113    
114     // constants for MML input modes
115     define("HAW_INPUT_HIRAGANA", 1); // values correspond to according cHTML values!
116     define("HAW_INPUT_KATAKANA", 2);
117     define("HAW_INPUT_ALPHABET", 3);
118     define("HAW_INPUT_NUMERIC", 4);
119    
120     // constants for VoiceXML
121     define("HAW_VOICE_PAUSE", 300); // pause after text output
122     define("HAW_VOICE_ENUMERATE", 1); // activate enumeration
123    
124     // constants for bigscreen default display
125     define("HAW_DISP_BGCOLOR", "#00BB77"); // green HAWHAW display
126     define("HAW_DISP_LINKCOLOR", "#004411"); // dark green
127     define("HAW_DISP_VLINKCOLOR", "#006633"); // lighter green
128     define("HAW_DISP_FACE", "Arial,Times");
129    
130     function HAW_specchar($input, $deck)
131     {
132     // convert special characters
133    
134     $temp = htmlspecialchars($input); // translate &"<> to HTML entities
135     $output = "";
136    
137     if ($deck->ml == HAW_WML)
138     $temp = str_replace("$", "$$", $temp); // escape $ character in WML
139     elseif ($deck->ml == HAW_HDML)
140     $temp = str_replace("$", "&dol;", $temp); // escape $ character in HDML
141    
142     if (strstr($deck->charset,"iso-8859-1"))
143     {
144     // character set iso-8859-1 (trivial mapping 1:1)
145    
146     for ($i=0; $i<strlen($temp); $i++)
147     {
148     // do for each character of $temp
149    
150     if (ord(substr($temp, $i, 1)) > 127)
151     // translate character into &#...; sequence
152     $output .= "&#" . ord(substr($temp, $i, 1)) . ";";
153     else
154     // copy character unchanged
155     $output .= substr($temp, $i, 1);
156     }
157     }
158     else
159     {
160     // other character set than iso-8859-1
161    
162     if ($deck->unicodearray)
163     {
164     // array with mapping rules was prepared earlier
165    
166     if(!trim($temp))
167     return $temp;
168    
169     while($temp!="")
170     {
171     // do for each character in string
172    
173     if (ord(substr($temp,0,1))>127)
174     {
175     $index = ord(substr($temp, 0, 1)); // ASCII value of first character from $temp
176    
177     if ($deck->unicodearray[$index])
178     {
179     // unicode stored for this one byte code
180     // insert unicode and go 1 byte further
181    
182     $output .= "&#" . $deck->unicodearray[$index] . ";";
183     $temp = substr($temp, 1, strlen($temp));
184     }
185     else
186     {
187     // check if there's a unibyte code stored for 1st two bytes
188    
189     $index = $index * 256 + ord(substr($temp, 1, 1));
190    
191     if ($deck->unicodearray[$index])
192     {
193     // unicode stored for this 2-byte code!
194     // insert unicode and go 2 bytes further
195    
196     $output .= "&#" . $deck->unicodearray[$index] . ";";
197     $temp = substr($temp, 2, strlen($temp));
198     }
199     else
200     {
201     // no mapping info for 1st 2 bytes available ==> leave it as it is
202    
203     $output .= substr($temp, 0, 1);
204     $temp = substr($temp, 1, strlen($temp));
205     }
206     }
207     }
208     else
209     {
210     // character <= 127 ==> leave it as it is
211     $output .= substr($temp, 0, 1);
212     $temp = substr($temp, 1, strlen($temp));
213     }
214     }
215     }
216    
217     else
218     $output = $temp; // no mapping to unicode required
219     }
220    
221     return($output);
222     }
223    
224    
225     function HAW_voice_audio($text, $audio_src, $pause, $deck)
226     {
227     // print VoiceXML tags for audio output
228    
229     if ($audio_src)
230     // play audio file if possible
231     printf("<audio src=\"%s\">%s</audio>", $audio_src, $text);
232     else
233     // speak text only
234     echo $text;
235    
236     if (($pause > 0) && $deck->supportsVXMLBreakTag)
237     printf("<break time=\"%dms\"/>", $pause);
238     }
239    
240    
241     function HAW_voice_eventhandler($handler, $audio_array, $deck)
242     {
243     // create VoiceXML event handler, e.g. "help", "nomatch", "noinput"
244    
245     if (count($audio_array) > 0)
246     {
247     while (list($key, $val) = each($audio_array))
248     {
249     if ($key > 0)
250     $count = sprintf(" count=\"%d\"", $key+1);
251     else
252     $count = "";
253    
254     printf("<catch%s event=\"%s\">", $count, $handler);
255    
256     HAW_voice_audio(HAW_specchar($val["text"], $deck), $val["src"], 0, $deck);
257    
258     if ($val["url"])
259     printf("<goto next=\"%s\"/>", $val["url"]);
260    
261     echo "</catch>\n";
262     }
263     }
264     }
265    
266    
267     function HAW_handle_forced_output(&$url, $hawoutput)
268     {
269     // add hawoutput query parameter to url in order to force special HAWHAW output type
270    
271     if ($hawoutput)
272     {
273     // hawoutput parameter to be added
274    
275     if (strchr($url, '?'))
276     $url .= "&hawoutput=" . $hawoutput;
277     else
278     $url .= "?hawoutput=" . $hawoutput;
279     }
280     }
281    
282    
283    
284    
285    
286    
287     class HAW_hdmlcardset
288     {
289     var $number_of_cards;
290     var $card; // array of cards
291     var $title;
292     var $final_action = ""; // action of last card
293     var $defaults; // default values of variables
294     var $disable_cache;
295     var $debug;
296     var $charset;
297    
298    
299     function HAW_hdmlcardset($title, $defaults, $disable_cache, $debug, $charset)
300     {
301     $this->title = $title;
302     $this->defaults = $defaults;
303     $this->disable_cache = $disable_cache;
304     $this->debug = $debug;
305     $this->charset = $charset;
306    
307     // initialize first card of cardset as DISPLAY card
308    
309     $this->card[0]["type"] = HAW_HDML_DISPLAY;
310    
311     $this->card[0]["options"] = " name=\"1\"";
312    
313     if ($title)
314     $this->card[0]["options"] .= " title=\"$title\"";
315    
316     $this->number_of_cards = 1;
317     }
318    
319    
320     function add_display_content($display_content)
321     {
322     // enhance the display content of the current card with the received content
323    
324     // number_of_cards-1 is the index of the current card, i.e. the last card
325    
326     if ($this->card[$this->number_of_cards-1]["type"] == HAW_HDML_DISPLAY)
327     {
328     // current card is display card ==> continue with content
329    
330     if (isset($this->card[$this->number_of_cards-1]["display_content"]))
331     $this->card[$this->number_of_cards-1]["display_content"] .= $display_content;
332     else
333     $this->card[$this->number_of_cards-1]["display_content"] = $display_content;
334     }
335     else
336     {
337     // current card is entry or choice card
338     // ==> create new display card to display received content
339     // ==> link current card to this new display card
340    
341     $this->card[$this->number_of_cards]["type"] = HAW_HDML_DISPLAY;
342    
343     $cardname = sprintf(" name=\"%d\"", $this->number_of_cards+1);
344     $this->card[$this->number_of_cards]["options"] .= $cardname;
345    
346     if ($this->title)
347     $this->card[$this->number_of_cards]["options"] .= " title=\"$this->title\"";
348    
349     $this->card[$this->number_of_cards]["display_content"] = $display_content;
350    
351     $action = sprintf("<action type=\"accept\" task=\"go\" dest=\"#%d\">\n",
352     $this->number_of_cards+1);
353     $this->card[$this->number_of_cards-1]["action"] = $action;
354    
355     $this->number_of_cards++;
356     }
357     }
358    
359    
360     function make_ui_card($options, $generic_content, $cardtype)
361     {
362     // make user interactive card (ENTRY or CHOICE card)
363    
364     if ($this->card[$this->number_of_cards-1]["type"] == HAW_HDML_DISPLAY)
365     {
366     // current card is display card
367    
368     // ==> make an entry/choice card out of it
369     $this->card[$this->number_of_cards-1]["type"] = $cardtype;
370    
371     // append options to the already existing ones
372     if (!isset($this->card[$this->number_of_cards-1]["options"]))
373     $this->card[$this->number_of_cards-1]["options"] = "";
374    
375     $this->card[$this->number_of_cards-1]["options"] .= $options;
376    
377     // append received content to the already existing one
378     if (!isset($this->card[$this->number_of_cards-1]["display_content"]))
379     $this->card[$this->number_of_cards-1]["display_content"] = "";
380    
381     $this->card[$this->number_of_cards-1]["display_content"] .= $generic_content;
382     }
383     else
384     {
385     // current card is already entry or choice card
386     // ==> create new entry/choice card
387     // ==> link current card to this new entry/choice card
388    
389     $this->card[$this->number_of_cards]["type"] = $cardtype;
390    
391     $cardname = sprintf(" name=\"%d\"", $this->number_of_cards+1);
392    
393     if (!isset($this->card[$this->number_of_cards]["options"]))
394     $this->card[$this->number_of_cards]["options"] = "";
395    
396     $this->card[$this->number_of_cards]["options"] .= $cardname;
397    
398     if ($this->title)
399     $this->card[$this->number_of_cards]["options"] .= " title=\"$this->title\"";
400    
401     $this->card[$this->number_of_cards]["options"] .= $options;
402    
403     $this->card[$this->number_of_cards]["display_content"] = $generic_content;
404    
405     $action = sprintf("<action type=\"accept\" task=\"go\" dest=\"#%d\">\n",
406     $this->number_of_cards+1);
407     $this->card[$this->number_of_cards-1]["action"] = $action;
408    
409     $this->number_of_cards++;
410     }
411     }
412    
413    
414     function set_final_action($action)
415     {
416     $this->final_action = $action;
417     }
418    
419    
420     function create_hdmldeck()
421     {
422     if (!$this->debug)
423     {
424     $ct = sprintf("content-type: text/x-hdml;charset=%s", $this->charset);
425     header($ct);
426     }
427    
428     $ttl = ($this->disable_cache ? " TTL=\"0\"" : "");
429    
430     printf("<hdml version=\"3.0\" public=\"true\"%s>\n", $ttl);
431     printf("<!-- Generated by %s %s -->\n", HAW_VERSION, HAW_COPYRIGHT);
432    
433     // create NODISPLAY card if it's necessary to initialize variables
434     if ($this->defaults)
435     {
436     $vars = "";
437    
438     while (list($d_key, $d_val) = each($this->defaults))
439     $vars .= sprintf("%s=%s&amp;", $d_val['name'], $d_val['value']);
440    
441     // strip terminating '&'
442     $vars = substr($vars, 0, -5);
443    
444     echo "<nodisplay>\n";
445     printf("<action type=\"accept\" task=\"go\" dest=\"#1\" vars=\"%s\">\n", $vars);
446     echo "</nodisplay>\n";
447     }
448    
449     // set action of last card
450     $this->card[$this->number_of_cards-1]["action"] = $this->final_action;
451    
452     // create all cards of card set
453     $i = 0;
454     while ( $i < $this->number_of_cards )
455     {
456     if ($this->card[$i]["type"] == HAW_HDML_DISPLAY)
457     $cardtype = "display";
458     elseif ($this->card[$i]["type"] == HAW_HDML_ENTRY)
459     $cardtype = "entry";
460     elseif ($this->card[$i]["type"] == HAW_HDML_CHOICE)
461     $cardtype = "choice";
462    
463     printf("<%s%s>\n", $cardtype, $this->card[$i]["options"]);
464     printf("%s", $this->card[$i]["action"]);
465     printf("%s", $this->card[$i]["display_content"]);
466     printf("</%s>\n", $cardtype);
467    
468     $i++;
469     }
470    
471     echo "</hdml>\n";
472     }
473     };
474    
475    
476    
477    
478    
479    
480     /**
481     This class is the top level class of all HAWHAW classes. Your page should consist
482     of exactly one HAW_deck object. For WML browsers one deck with one card will be
483     generated. For HDML browsers one deck including as much cards as necessary will
484     generated. HTML browsers will receive a normal HTML page, PDA browsers will
485     receive handheldfriendly HTML etc.
486     <p>Do not overload HAW_deck objects! Remember that a lot of older WAP devices can not
487     handle more than about 1400 byte of compiled data.
488     <p><b>Examples:</b><p>
489     $myPage = new HAW_deck();<br>
490     $myPage = new HAW_deck("My WAP page");<br>
491     $myPage = new HAW_deck("", HAW_ALIGN_CENTER);<br>
492     $myPage = new HAW_deck("PDA edition", HAW_ALIGN_CENTER, HAW_OUTPUT_PDA);<br>
493     ...<br>
494     $myPage->set_bgcolor("blue");<br>
495     ...<br>
496     $myPage->add_text($myText);<br>
497     ...<br>
498     $myPage->create_page();
499     */
500     class HAW_deck
501     {
502     var $title;
503     var $alignment;
504     var $output;
505     var $timeout;
506     var $red_url;
507     var $disable_cache = false;
508     var $ml;
509     var $element;
510     var $number_of_elements;
511     var $number_of_forms;
512     var $number_of_linksets;
513     var $number_of_links;
514     var $number_of_phones;
515     var $top_banners;
516     var $number_of_top_banners = 0;
517     var $bottom_banners;
518     var $number_of_bottom_banners = 0;
519     var $display_banners = true;
520     var $waphome;
521     var $hdmlcardset;
522    
523     // browser dependent properties
524     var $pureHTML = true; // Big-screen-HTML-code (default)
525     var $PDAstyle = false; // PDA browsers needs special HTML code
526     var $iModestyle = false; // cHTML too
527     var $upbrowser = false; // UP browser
528     var $owgui_1_3 = false; // Openwave GUI Extensions for WML 1.3
529     var $MMLstyle = false; // Mobile Markup Language
530     var $lynx = false; // Lynx text browser
531     var $xhtml = false; // XHTML MP (mobile profile)
532     var $gif_enabled = false; // browser can not deal with GIF images
533     var $submitViaLink = false; // use link instead of <do>
534     var $supportsVXMLBreakTag = true; // false for PublicVoiceXML browser only
535     var $css_enabled = false; // support of cascading style sheets (HTML)
536     var $debug = false; // HAWHAW debugger off
537     var $hawoutput = ""; // no forced output
538    
539     // device simulator properies
540     var $use_simulator = false; // decide whether default simulator device is to be used
541     var $skin = ""; // contains css url, where skinning is defined
542    
543     // character set properties
544     var $charset = "iso-8859-1"; // default charset
545     var $unicodemaptab; // filename of cross mapping table to map country
546     // specific character code into unicode
547     var $unicodearray; // array containing cross mapping table
548    
549     // language properties
550     var $language = "";
551    
552    
553     // display properties for HTML
554    
555     // page background properties
556     var $bgcolor = "";
557     var $background = "";
558    
559     // display (table) properties
560     var $border = 8;
561     var $disp_bgcolor = "";
562     var $disp_background = "";
563     var $width = 200;
564     var $height = 200;
565    
566     // text properties
567     var $size = "";
568     var $color = "";
569     var $link_color = "";
570     var $vlink_color = "";
571     var $face = "";
572     var $fontstyle_attrbs = "";
573    
574     // voice properties
575     var $voice_links = "";
576     var $voice_timeout = 0;
577     var $voice_text = "";
578     var $voice_audio_src = "";
579     var $voice_jingle = "";
580     var $voice_help = array();
581     var $voice_noinput = array();
582     var $voice_nomatch = array();
583     var $voice_property = array();
584     var $voice_navigator = array();
585    
586     /**
587     Constructor
588     @param title (optional, default: HAW_NOTITLE) <br>
589     If a string is provided here, it will be displayed
590     in the HTML title bar, respectively somewhere on the WAP display. Using a
591     title you will normally have to spend one of your few lines on your WAP
592     display. Consider that some WAP phones/SDK's and handheld devices don't
593     display the title at all.
594     @param alignment (optional, default: HAW_ALIGN_LEFT) <br>
595     You can enter HAW_ALIGN_CENTER
596     or HAW_ALIGN_RIGHT to modify the alignment of the whole page.
597     @param output (optional, default: HAW_OUTPUT_AUTOMATIC) <br>
598     You can override HAWHAW's automatic browser detection and force a certain
599     output type.<br>
600     Possible value are:<br>
601     <ul>
602     <li>HAW_OUTPUT_AUTOMATIC (default)</li>
603     <li>HAW_OUTPUT_BIGSCREEN</li>
604     <li>HAW_OUTPUT_WAP</li>
605     <li>HAW_OUTPUT_HDML</li>
606     <li>HAW_OUTPUT_PDA</li>
607     <li>HAW_OUTPUT_IMODE</li>
608     <li>HAW_OUTPUT_MML</li>
609     <li>HAW_OUTPUT_VOICEXML</li>
610     <li>HAW_OUTPUT_XHTML</li>
611     <li>HAW_OUTPUT_LYNX</li>
612     </ul><br>
613     With this parameter you can offer dedicated links for PC's, WAP phones, PDA's,
614     XHTML phones etc.
615     */
616     function HAW_deck($title=HAW_NOTITLE, $alignment=HAW_ALIGN_LEFT, $output=HAW_OUTPUT_AUTOMATIC)
617     {
618     // determine environment variables
619     if (isset($_SERVER['HTTP_USER_AGENT']))
620     $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
621     else
622     $HTTP_USER_AGENT = "";
623    
624     if (isset($_SERVER['HTTP_ACCEPT']))
625     $HTTP_ACCEPT = $_SERVER['HTTP_ACCEPT'];
626     else
627     $HTTP_ACCEPT = "";
628    
629     if (isset($_SERVER['HTTP_HOST']))
630     $HTTP_HOST = $_SERVER['HTTP_HOST'];
631     else
632     $HTTP_HOST = "";
633    
634     if (isset($_SERVER['SCRIPT_NAME']))
635     $SCRIPT_NAME = $_SERVER['SCRIPT_NAME'];
636     else
637     $SCRIPT_NAME = "";
638    
639     if ($title != HAW_NOTITLE)
640     $this->title = $title;
641    
642     if ($alignment == HAW_ALIGN_CENTER)
643     $this->alignment = "center";
644     elseif ($alignment == HAW_ALIGN_RIGHT)
645     $this->alignment = "right";
646     else
647     $this->alignment = "left";
648    
649     $this->timeout = 0;
650     $this->red_url = "";
651    
652     $this->waphome = "http://" . $HTTP_HOST . $SCRIPT_NAME;
653    
654     // query parameter "hawdebug" can be used to debug hawhaw output
655     // enter http://wap.yourdomain.com/yourscript.php?hawdebug=wap
656     // resp. other value defined above for HAW_OUTPUT_...
657     // query parameter "hawoutput" can be used for overwrite output type
658     // enter http://wap.yourdomain.com/yourscript.php?hawoutput=wap
659     global $HTTP_GET_VARS;
660     $forced_output = "";
661    
662     if (isset ($HTTP_GET_VARS["hawdebug"]))
663     {
664     $forced_output = $HTTP_GET_VARS["hawdebug"];
665     $this->debug = true;
666     }
667     elseif (isset ($HTTP_GET_VARS["hawoutput"]))
668     {
669     $forced_output = $HTTP_GET_VARS["hawoutput"];
670     $this->hawoutput = $HTTP_GET_VARS["hawoutput"];
671     }
672     elseif ($output != HAW_OUTPUT_AUTOMATIC)
673     $forced_output = $output;
674    
675     // manipulate HTTP environment variables in case of forced output
676     if ($forced_output)
677     {
678     if ($forced_output == HAW_OUTPUT_BIGSCREEN)
679     {
680     $HTTP_ACCEPT = "";
681     $HTTP_USER_AGENT = "MSIE";
682     }
683     elseif ($forced_output == HAW_OUTPUT_WAP)
684     {
685     $HTTP_ACCEPT = "text/vnd.wap.wml";
686     $HTTP_USER_AGENT = "";
687     }
688     elseif ($forced_output == HAW_OUTPUT_HDML)
689     {
690     $HTTP_ACCEPT = "hdml;version=3.0";
691     $HTTP_USER_AGENT = "";
692     }
693     elseif ($forced_output == HAW_OUTPUT_PDA)
694     {
695     $HTTP_ACCEPT = "";
696     $HTTP_USER_AGENT = "avantgo";
697     }
698     elseif ($forced_output == HAW_OUTPUT_IMODE)
699     {
700     $HTTP_ACCEPT = "";
701     $HTTP_USER_AGENT = "DoCoMo";
702     }
703     elseif ($forced_output == HAW_OUTPUT_MML)
704     {
705     $HTTP_ACCEPT = "";
706     $HTTP_USER_AGENT = "J-";
707     }
708     elseif ($forced_output == HAW_OUTPUT_VOICEXML)
709     {
710     $HTTP_ACCEPT = "text/x-vxml";
711     $HTTP_USER_AGENT = "Tellme";
712     }
713     elseif ($forced_output == HAW_OUTPUT_XHTML)
714     {
715     $HTTP_ACCEPT = "application/vnd.wap.xhtml+xml";
716     $HTTP_USER_AGENT = "";
717     }
718     elseif ($forced_output == HAW_OUTPUT_LYNX)
719     {
720     $HTTP_ACCEPT = "";
721     $HTTP_USER_AGENT = "Lynx";
722     }
723     elseif ($forced_output == HAW_OUTPUT_UP)
724     {
725     $HTTP_ACCEPT = "text/vnd.wap.wml";
726     $HTTP_USER_AGENT = "UP.Browser";
727     }
728     elseif ($forced_output == HAW_OUTPUT_OWGUI)
729     {
730     $HTTP_ACCEPT = "text/vnd.wap.wml";
731     $HTTP_USER_AGENT = "UP/GUI...UP.Link ";
732     }
733     elseif ($forced_output == HAW_OUTPUT_PVX)
734     {
735     $HTTP_ACCEPT = "";
736     $HTTP_USER_AGENT = "publicVoiceXML"; // user agent header of PublicVoiceXML browser
737     }
738     }
739    
740     // determine markup language to create
741    
742     if (strstr(strtolower($HTTP_USER_AGENT), "docomo") ||
743     strstr(strtolower($HTTP_USER_AGENT), "portalmmm") ||
744     strstr(strtolower($HTTP_USER_AGENT), "opera ") ||
745     strstr(strtolower($HTTP_USER_AGENT), "reqwirelessweb") ||
746     strstr(strtolower($HTTP_ACCEPT), "vnd.wap.xhtml"))
747     {
748     $this->ml = HAW_HTML; // create HTML (even when device accepts text/vnd.wap.wml too!)
749     }
750     elseif (strstr(strtolower($HTTP_ACCEPT), "text/vnd.wap.wml"))
751     {
752     $this->ml = HAW_WML; // create WML
753    
754     if (strstr($HTTP_USER_AGENT, "UP/") ||
755     strstr($HTTP_USER_AGENT, "UP.B"))
756     $this->upbrowser = true; // UP browser
757    
758     if ((strstr($HTTP_USER_AGENT, "UP/") ||
759     strstr($HTTP_USER_AGENT, "UP.B")) &&
760     strstr($HTTP_USER_AGENT, "GUI") &&
761     strstr($HTTP_USER_AGENT, "UP.Link")) // Non-UP.Link gateways sometimes have problems!
762     $this->owgui_1_3 = true; // device accepts Openwave GUI extensions for WML 1.3
763     }
764     elseif (strstr(strtolower($HTTP_ACCEPT), "hdml;version=3.")) // HDML 3.0 and 3.1
765     $this->ml = HAW_HDML; // create HDML
766     elseif (strstr(strtolower($HTTP_ACCEPT), "vxml") || // VoiceXML signalled in accept header
767     strstr(strtolower($HTTP_ACCEPT), "voicexml") || // alternative accept header
768     strstr($HTTP_USER_AGENT, "OpenVXI") || // Speechworks OpenVXI
769     strstr(strtolower($HTTP_USER_AGENT), "publicvoicexml") || // PublicVoiceXML voice browser
770     strstr($HTTP_USER_AGENT, "Tellme")) // Tellme studio voice browser
771     {
772     $this->ml = HAW_VXML; // create VoiceXML
773    
774     // PublicVoiceXML browser cannot handle <break> elements!!!
775     if (strstr(strtolower($HTTP_USER_AGENT), "publicvoicexml"))
776     {
777     $this->supportsVXMLBreakTag = false;
778     }
779     }
780     else
781     {
782     if (strstr($HTTP_USER_AGENT, "Mozilla") ||
783     strstr($HTTP_USER_AGENT, "MSIE") ||
784     strstr(strtolower($HTTP_USER_AGENT), "lynx") ||
785     strstr(strtolower($HTTP_USER_AGENT), "avantgo") ||
786     strstr(strtolower($HTTP_USER_AGENT), "pendragonweb") ||
787     strstr(strtolower($HTTP_USER_AGENT), "j-"))
788     $this->ml = HAW_HTML; // HTML-based browser
789     else
790     $this->ml = HAW_WML; // try it with WML
791     }
792    
793     $this->number_of_elements = 0;
794     $this->number_of_forms = 0;
795     $this->number_of_linksets = 0;
796     $this->number_of_links = 0;
797     $this->number_of_phones = 0;
798    
799     if (strstr(strtolower($HTTP_ACCEPT), "vnd.wap.xhtml"))
800     {
801     // XHTML device detected
802     $this->xhtml = true;
803     $this->pureHTML = false;
804     $this->display_banners = false;
805     $this->gif_enabled = true;
806     $this->css_enabled = true;
807     }
808     elseif ( strstr(strtolower($HTTP_USER_AGENT), "avantgo") ||
809     strstr(strtolower($HTTP_USER_AGENT), "reqwirelessweb") ||
810     strstr(strtolower($HTTP_USER_AGENT), "pendragonweb") ||
811     strstr(strtolower($HTTP_USER_AGENT), "palmos") ||
812     strstr(strtolower($HTTP_USER_AGENT), "windows ce") ||
813     strstr($HTTP_USER_AGENT, "Mozilla/4.7"))
814     {
815     // PDA browser detected (or poor old Netscape 4.7x which messes with CSS)
816     $this->PDAstyle = true;
817     $this->pureHTML = false;
818     $this->display_banners = false;
819     }
820     elseif (strstr(strtolower($HTTP_USER_AGENT), "docomo") ||
821     strstr(strtolower($HTTP_USER_AGENT), "portalmmm"))
822     {
823     // i-mode browser detected
824     $this->iModestyle = true;
825     $this->pureHTML = false;
826     $this->display_banners = false;
827     }
828     elseif (strstr(strtolower($HTTP_USER_AGENT), "j-"))
829     {
830     // MML browser detected
831     $this->MMLstyle = true;
832     $this->pureHTML = false;
833     $this->display_banners = false;
834     }
835     elseif (strstr(strtolower($HTTP_USER_AGENT), "lynx"))
836     {
837     // text browser detected
838     $this->lynx = true;
839     $this->css_enabled = true; // enabled in the meaning of silently discarding it ...
840     $this->pureHTML = true;
841     $this->display_banners = false;
842     }
843    
844     // determine if browser is CSS-enbled
845     if (($this->ml == HAW_HTML) &&
846     (strstr($HTTP_USER_AGENT, "MSIE") ||
847     strstr($HTTP_USER_AGENT, "Mozilla") ||
848     strstr($HTTP_USER_AGENT, "Opera")))
849     $this->css_enabled = true;
850    
851     // determine if browser is able to display GIF images
852     if (($this->ml == HAW_HTML) ||
853     (strstr(strtolower($HTTP_ACCEPT), "image/gif")) ||
854     (strstr(strtolower($HTTP_USER_AGENT), "T68")))
855     $this->gif_enabled = true; // browsers can display GIF
856    
857     // determine how forms are to be transmitted
858     if (strstr(strtolower($HTTP_USER_AGENT), "ericsson"))
859     $this->submitViaLink = true; // with Ericsson WAP devices it's quite difficult to submit WML forms
860     }
861    
862    
863     /**
864     Adds a HAW_text object to HAW_deck.
865     @param text Some HAW_text object.
866     @see HAW_text
867     */
868     function add_text($text)
869     {
870     if (!is_object($text))
871     die("invalid argument in add_text()");
872    
873     $this->element[$this->number_of_elements] = $text;
874    
875     $this->number_of_elements++;
876     }
877    
878    
879     /**
880     Adds a HAW_image object to HAW_deck.
881     @param image Some HAW_image object.
882     @see HAW_image
883     */
884     function add_image($image)
885     {
886     if (!is_object($image))
887     die("invalid argument in add_image()");
888    
889     $this->element[$this->number_of_elements] = $image;
890    
891     $this->number_of_elements++;
892     }
893    
894    
895     /**
896     Adds a HAW_table object to HAW_deck.
897     @param table Some HAW_table object.
898     @see HAW_table
899     */
900     function add_table($table)
901     {
902     if (!is_object($table))
903     die("invalid argument in add_table()");
904    
905     $this->element[$this->number_of_elements] = $table;
906    
907     $this->number_of_elements++;
908     }
909    
910    
911     /**
912     Adds a HAW_form object to HAW_deck.
913     @param form Some HAW_form object.
914     @see HAW_form
915     */
916     function add_form($form)
917     {
918     if (!is_object($form))
919     die("invalid argument in add_form()");
920    
921     if ($this->number_of_forms > 0)
922     die("only one form per deck allowed!");
923    
924     $this->element[$this->number_of_elements] = $form;
925    
926     $this->number_of_elements++;
927     $this->number_of_forms++;
928     }
929    
930    
931     /**
932     Adds a HAW_link object to HAW_deck.
933     @param link Some HAW_link object.
934     @see HAW_link
935     */
936     function add_link($link)
937     {
938     if (!is_object($link))
939     die("invalid argument in add_link()");
940    
941     $this->element[$this->number_of_elements] = $link;
942    
943     $this->number_of_elements++;
944     $this->number_of_links++;
945     }
946    
947    
948     /**
949     Adds a HAW_phone object to HAW_deck.
950     @param phone Some HAW_phone object.
951     @see HAW_phone
952     */
953     function add_phone($phone)
954     {
955     if (!is_object($phone))
956     die("invalid argument in add_phone()");
957    
958     $this->element[$this->number_of_elements] = $phone;
959    
960     $this->number_of_elements++;
961     $this->number_of_phones++;
962     }
963    
964    
965     /**
966     Adds a HAW_linkset object to HAW_deck.
967     @param linkset Some HAW_linkset object.
968     @see HAW_linkset
969     */
970     function add_linkset($linkset)
971     {
972     if (!is_object($linkset))
973     die("invalid argument in add_linkset()");
974    
975     if ($this->number_of_linksets > 0)
976     die("only one linkset per deck allowed!");
977    
978     $this->element[$this->number_of_elements] = $linkset;
979    
980     $this->number_of_elements++;
981     $this->number_of_linksets++;
982     }
983    
984    
985     /*
986     Adds a HAW_raw object to HAW_deck. (undocumented feature - for test only!)
987     @param raw Some HAW_raw object.
988     @see HAW_raw
989     */
990     function add_raw($raw)
991     {
992     if (!is_object($raw))
993     die("invalid argument in add_raw()");
994    
995     $this->element[$this->number_of_elements] = $raw;
996    
997     $this->number_of_elements++;
998     }
999    
1000    
1001     /*
1002     Adds some user-defined HAWHAW object to HAW_deck (undocumented feature)<br>
1003     For skilled HAWHAW programmers only!
1004     @param udef Some user-defined object.
1005     */
1006     function add_userdefined($udef)
1007     {
1008     /* A user-defined HAWHAW class definition MUST look like this:
1009    
1010     class HAW_foo // some class name of your choice
1011     {
1012     var $bar; // some class variable declarations of your choice
1013    
1014     function HAW_foo(...)
1015     {
1016     // some constructor code of your choice
1017     }
1018    
1019     function HAW_boobaz(...)
1020     {
1021     // as many user-defined functions as needed
1022     }
1023    
1024     // this member function is called by HAWHAW and MUST NOT be changed!
1025     function get_elementtype()
1026     {
1027     return HAW_USERDEFINED;
1028     }
1029    
1030     function create($deck)
1031     {
1032     // this member function is called by HAWHAW and MUST be present!
1033     // it is in the programmers responsibility what kind of markup is created here!
1034     // you have access to all HAW_deck properties by evaluating $deck
1035     }
1036     } ;
1037    
1038     You have to define this class somewhere after your require("hawhaw.inc") statement
1039    
1040     Usage: ...
1041     $myText = new HAW_text("Classic text");
1042     $myDeck->add_text($myText);
1043     $myClass = new HAW_foo("Cool output");
1044     $myClass->boobaz($ringtone, $sms, $userposition);
1045     $myDeck->add_userdefined($myClass);
1046     ...
1047     */
1048    
1049     if (!is_object($udef))
1050     die("invalid argument in add_userdefined()");
1051    
1052     $this->element[$this->number_of_elements] = $udef;
1053    
1054     $this->number_of_elements++;
1055     }
1056    
1057    
1058     /**
1059     Adds a HAW_banner object to HAW_deck. <br>
1060     Note: Has no effect on WML/handheld pages.
1061     @param banner Some HAW_banner object.
1062     @param position (optional)<br>
1063     HAW_TOP: above HAW_deck<br>
1064     HAW_BOTTOM: beneath HAW_deck (default)
1065     @see HAW_banner
1066     */
1067     function add_banner($banner, $position=HAW_BOTTOM)
1068     {
1069     if (!is_object($banner))
1070     die("invalid argument in add_banner()");
1071    
1072     if ($position == HAW_TOP)
1073     {
1074     $this->top_banners[$this->number_of_top_banners] = $banner;
1075     $this->number_of_top_banners++;
1076     }
1077     else
1078     {
1079     $this->bottom_banners[$this->number_of_bottom_banners] = $banner;
1080     $this->number_of_bottom_banners++;
1081     }
1082     }
1083    
1084    
1085     /**
1086     Adds a HAW_rule object to HAW_deck.
1087     @param rule Some HAW_rule object.
1088     @see HAW_rule
1089     */
1090     function add_rule($rule)
1091     {
1092     if (!is_object($rule))
1093     die("invalid argument in add_rule()");
1094    
1095     $this->element[$this->number_of_elements] = $rule;
1096    
1097     $this->number_of_elements++;
1098     }
1099    
1100    
1101     /**
1102     Adds a HAW_voicerecorder object to HAW_deck.
1103     @param voicerecorder Some HAW_voicerecorder object.
1104     @see HAW_voicerecorder
1105     */
1106     function add_voicerecorder($voicerecorder)
1107     {
1108     if (!is_object($voicerecorder))
1109     die("invalid argument in add_voicerecorder()");
1110    
1111     $this->element[$this->number_of_elements] = $voicerecorder;
1112    
1113     $this->number_of_elements++;
1114     }
1115    
1116    
1117     /**
1118     Redirects automatically after timeout to another URL. <br>
1119     Note: This feature can not be supported for HDML browsers, due to HDML's missing
1120     timer functionality. If you intend to serve HDML users, you should consider this
1121     by creating an additional link to <i>red_url</i>.
1122     @param timeout Some timeout value in seconds.
1123     @param red_url Some URL string.
1124     */
1125     function set_redirection($timeout, $red_url)
1126     {
1127     $this->timeout = $timeout;
1128     $this->red_url = $red_url;
1129     }
1130    
1131    
1132     /**
1133     Disables deck caching in the users client. <br>
1134     Note: Use this object function, if you intend to provide changing content under
1135     the same URL.
1136     */
1137     function disable_cache()
1138     {
1139     $this->disable_cache = true;
1140     }
1141    
1142    
1143     /**
1144     Enables mobile specific session support. <br>
1145     Note: Applications for mobile devices require special session handling: As cookies
1146     are often not supported, URL rewriting has to be done. As XML does not allow unescaped
1147     '&amp;' characters, the arg-separator has to be modified. And as WML/VoiceXML defines tags
1148     which are not defined in HTML, the PHP predefined url_rewriter tags have to be adapted.<br>
1149     Important: This function has be called before any session handling is done! Due to some
1150     bugs in previous PHP versions, it is highly recommended to use PHP version 4.1.1 or
1151     higher.
1152     */
1153     function enable_session()
1154     {
1155     // set session server options
1156     ini_set('session.use_cookies', 0); // do not use cookies
1157     ini_set('session.use_trans_sid', 1); // use transient sid support
1158     ini_set('arg_separator.output', '&amp;'); // '&' is not allowed in WML (XML)
1159    
1160     // url rewriter tags are dependent from markup language
1161    
1162     switch ($this->ml)
1163     {
1164     case HAW_HTML:
1165     {
1166     ini_set('url_rewriter.tags', 'a=href,form=option');
1167     break;
1168     }
1169    
1170     case HAW_WML:
1171     {
1172     ini_set('url_rewriter.tags', 'a=href,go=href,option=onpick');
1173     break;
1174     }
1175    
1176     case HAW_HDML:
1177     {
1178     ini_set('url_rewriter.tags', 'a=href');
1179     break;
1180     }
1181    
1182     case HAW_VXML:
1183     {
1184     ini_set('url_rewriter.tags', 'submit=next,link=next,goto=next');
1185     break;
1186     }
1187     }
1188     }
1189    
1190    
1191     /**
1192     Sets a given character set. <br>
1193     Note: For the iso-8859-1 character set all characters with value greater
1194     127 are automatically transformed into a "&amp;#dec;" sequence (unicode).
1195     For all other character sets a specific cross mapping table is
1196     required for the conversion into unicode. Usage of unicode cross
1197     mapping tables is optional for non-iso-8859-1 character sets.
1198     Mapping tables are available at:
1199     <a href="http://www.unicode.org/Public/MAPPINGS/" target="_blank">
1200     http://www.unicode.org/Public/MAPPINGS/</a>
1201     @param charset Character set that is used in your country.<br>Default: iso-8859-1
1202     @param unicodemaptab (optional)<br>
1203     Cross mapping table from country specific character coding to
1204     unicode (default: no mapping to unicode activated).<br>
1205     With this parameter you specify where HAWHAW will find the conversion table
1206     with the mapping rules. It is recommended to store the cross mapping table
1207     in the same directory where hawhaw.inc is located.<br>
1208     format: [PATH][Filename].[EXT] e.g. "../GB2312.TXT"
1209     */
1210     function set_charset($charset, $unicodemaptab="")
1211     {
1212     $this->charset = $charset;
1213     $this->unicodemaptab = $unicodemaptab;
1214    
1215     if ($unicodemaptab)
1216     {
1217     // cross mapping table is to be used
1218    
1219     if(!file_exists($unicodemaptab))
1220     {
1221     $errormsg = "HAWHAW!<br>Cross mapping table \"$unicodemaptab\" not found!<br>";
1222     $errormsg .= "Please download your country-specific unicode cross mapping table from:<br>";
1223     $errormsg .= "<a href=http://www.unicode.org/Public/MAPPINGS/>http://www.unicode.org/Public/MAPPINGS/</a>";
1224     die("$errormsg");
1225     }
1226    
1227     // open cross mapping table file and create array with mapping info
1228    
1229     $filename = $unicodemaptab;
1230     $line=file($filename);
1231    
1232     while(list($key,$value)=each($line))
1233     {
1234     if (substr($value, 0, 2) == "0x") // skip comment lines
1235     {
1236     $pair = explode(" ", $value); // tab separates code and unicode
1237    
1238     if ((strlen($pair[0]) == 6) && ($pair[0] < 0x8080))
1239     $this->unicodearray[hexdec($pair[0]) + 0x8080] = hexdec($pair[1]); // offset EUC
1240     else
1241     $this->unicodearray[hexdec($pair[0])] = hexdec($pair[1]);
1242     }
1243     }
1244     }
1245     }
1246    
1247    
1248     /**
1249     Sets a given language. <br>
1250     Note: Specifies the main language of the deck, as e.g. english, german,
1251     japanese or whatever. Language declaration is highly recommended in order
1252     to provide barrierfree content and as is required to validate a deck as
1253     Bobby AAA approved!
1254     @param language Language code according ISO 639, e.g. "en", "de", etc.
1255     */
1256     function set_language($language)
1257     {
1258     $this->language = $language;
1259     }
1260    
1261    
1262     /**
1263     Sets the window background color for a HTML (big-screen browser) page.
1264     Has no effect on WML/handheld pages.
1265     @param bgcolor See HTML specification for possible values (e.g. "#CCFFFF",
1266     "red", ...).
1267     */
1268     function set_bgcolor($bgcolor)
1269     {
1270     $this->bgcolor = $bgcolor;
1271     }
1272    
1273    
1274     /**
1275     Sets a window wallpaper for a HTML (big-screen browser) page.
1276     Has no effect on WML/handheld pages.
1277     @param background e.g. "backgrnd.gif"
1278     */
1279     function set_background($background)
1280     {
1281     $this->background = $background;
1282     }
1283    
1284    
1285     /**
1286     Sets the thickness of the HTML display frame. Has no effect on WML/handheld pages.
1287     @param border Thickness is pixels (default: 8)
1288     */
1289     function set_border($border)
1290     {
1291     $this->border = $border;
1292     }
1293    
1294    
1295     /**
1296     Sets the display background color for a (X)HTML page. Has no effect on
1297     WML pages.
1298     @param disp_bgcolor See HTML specification for possible values (e.g. "#CCFFFF",
1299     "red", ...).
1300     */
1301     function set_disp_bgcolor($disp_bgcolor)
1302     {
1303     $this->disp_bgcolor = $disp_bgcolor;
1304     }
1305    
1306    
1307     /**
1308     Sets a display wallpaper for a (X)HTML page. Has no effect on WML
1309     pages.
1310     @param background e.g. "backgrnd.gif"
1311     */
1312     function set_disp_background($background)
1313     {
1314     $this->disp_background = $background;
1315     }
1316    
1317    
1318     /**
1319     Sets the display width for a HTML page. Has no effect on WML/handheld
1320     pages.
1321     @param width See HTML specification for possible values (e.g. "200", "50%", ...).
1322     */
1323     function set_width($width)
1324     {
1325     $this->width = $width;
1326     }
1327    
1328    
1329     /**
1330     Sets the display height for a HTML page. Has no effect on WML/handheld
1331     pages.
1332     @param height See HTML specification for possible values (e.g. "200", "50%", ...).
1333     */
1334     function set_height($height)
1335     {
1336     $this->height = $height;
1337     }
1338    
1339    
1340     /**
1341     Sets the font size for all characters in a (X)HTML page. Has no effect on
1342     WML pages.
1343     @param size See HTML specification for possible values (e.g. "12pt", ...).
1344     */
1345     function set_size($size)
1346     {
1347     $this->size = $size;
1348     }
1349    
1350    
1351     /**
1352     Sets the color for all characters in a (X)HTML page. Has no effect on WML pages.
1353     Nevertheless, HAW_text objects can overwrite this value by defining their own color
1354     attributes.
1355     @param color See HTML specification for possible values (e.g. "#CCFFFF", "red",
1356     ...).
1357     @see HAW_text
1358     */
1359     function set_color($color)
1360     {
1361     $this->color = $color;
1362     }
1363    
1364    
1365     /**
1366     Sets the color of links in a (X)HTML page. Has no effect on
1367     WML pages.
1368     @param link_color See HTML specification for possible values (e.g. "#CCFFFF", "red",
1369     ...).
1370     */
1371     function set_link_color($link_color)
1372     {
1373     $this->link_color = $link_color;
1374     }
1375    
1376    
1377     /**
1378     Sets the color of visited links in a (X)HTML page. Has no effect on
1379     WML pages.
1380     @param vlink_color See HTML specification for possible values (e.g. "#CCFFFF", "red",
1381     ...).
1382     */
1383     function set_vlink_color($vlink_color)
1384     {
1385     $this->vlink_color = $vlink_color;
1386     }
1387    
1388    
1389     /**
1390     Sets the font for all characters in a (X)HTML page. Has no effect on
1391     WML pages.
1392     @param face See HTML specification for possible values (e.g. "Avalon",
1393     "Wide Latin").
1394     */
1395     function set_face($face)
1396     {
1397     $this->face = $face;
1398     }
1399    
1400    
1401     /**
1402     Sets the URL of a website, a bigscreen-browsing user is invited to visit via WAP. <br>
1403     Note: On bigscreen browsers a small copyright link to the
1404     HAWHAW information page will be created automatically by HAWHAW. The information
1405     page invites the user to visit your site with a WAP phone.
1406     Therefore by default your hostname and your refering script will be part of this
1407     copyright link. You can modify this value, e.g. if your application leads the
1408     user across different pages, but you want to make visible the entry page only.
1409     @param waphome Some URL string.
1410     */
1411     function set_waphome($waphome)
1412     {
1413     $this->waphome = $waphome;
1414     }
1415    
1416    
1417     /**
1418     Activates the device simulator on bigscreen browsers. <br>
1419     Note: If no skin is specified, the HAWHAW default skin is used.
1420     HAWHAW output can be displayed in any kind of user-defined skin.
1421     See <a href="http://skin.hawhaw.de/skin.css" target="_blank">
1422     CSS file</a> of the HAWHAW default skin for more info.
1423     @param skin URL of CSS file, where skin is defined (optional)
1424     */
1425     function use_simulator($skin="http://skin.hawhaw.de/skin.css")
1426     {
1427     $this->use_simulator = true;
1428     $this->skin = $skin;
1429     }
1430    
1431    
1432     /**
1433     Sets deck-related text to be spoken by voice browsers. <br>
1434     @param text Some introducing text that will be spoken before any other dialog or
1435     text output is started.
1436     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
1437     */
1438     function set_voice_text($text, $audio_src="")
1439     {
1440     if (!is_string($text))
1441     die("invalid argument in set_voice_text()");
1442    
1443     $this->voice_text = $text;
1444     $this->voice_audio_src = $audio_src;
1445     }
1446    
1447    
1448     /**
1449     Play jingle before link &lt;label&gt;s are spoken. <br>
1450     Note: Voice users can not distinguish between plain text and link text. Playing
1451     a short jingle before each link will make voice navigation easier.
1452     @param url Some wav-file.
1453     */
1454     function set_voice_jingle($url)
1455     {
1456     if (!is_string($url))
1457     die("invalid argument in set_voice_jingle()");
1458    
1459     $this->voice_jingle = $url;
1460     }
1461    
1462    
1463     /**
1464     Sets help text for voice browsers. <br>
1465     @param text Some helpful information concerning this deck.
1466     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
1467     @param url Some other voice deck to go to (optional).
1468     */
1469     function set_voice_help($text, $audio_src="", $url="")
1470     {
1471     if (!is_string($text))
1472     die("invalid argument in set_voice_help()");
1473    
1474     $arr["text"] = $text;
1475     $arr["src"] = $audio_src;
1476     $arr["url"] = $url;
1477    
1478     $this->voice_help[] = $arr;
1479     }
1480    
1481    
1482     /**
1483     Sets noinput text for voice browsers. <br>
1484     @param text Some text to inform the user that no input has been received.
1485     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
1486     @param url Some other voice deck to go to (optional).
1487     */
1488     function set_voice_noinput($text, $audio_src="", $url="")
1489     {
1490     if (!is_string($text))
1491     die("invalid argument in set_voice_noinput()");
1492    
1493     $arr["text"] = $text;
1494     $arr["src"] = $audio_src;
1495     $arr["url"] = $url;
1496    
1497     $this->voice_noinput[] = $arr;
1498     }
1499    
1500    
1501     /**
1502     Sets nomatch text for voice browsers. <br>
1503     @param text Some text to complain that user input was not recognized.
1504     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
1505     @param url Some other voice deck to go to (optional).
1506     */
1507     function set_voice_nomatch($text, $audio_src="", $url="")
1508     {
1509     if (!is_string($text))
1510     die("invalid argument in set_voice_nomatch()");
1511    
1512     $arr["text"] = $text;
1513     $arr["src"] = $audio_src;
1514     $arr["url"] = $url;
1515    
1516     $this->voice_nomatch[] = $arr;
1517     }
1518    
1519    
1520     /**
1521     Sets a name/value property pair for VoiceXML decks. <br>
1522     Attention: This function should be used by experienced VoiceXML developers
1523     only! name/value combinations which are not compliant to the VoiceXML
1524     standard or are not supported by the voice platform, will throw an
1525     semantic error and terminate voice output. Please refer to the
1526     <a href="http://www.w3.org/TR/voicexml20/#dml6.3" target="_blank">
1527     W3C VoiceXML Recommendation (chapter 6.3)</a>
1528     for detailled info about valid name/value combinations.
1529     @param name Name of property (e.g. "bargein", "timeout", etc.)
1530     @param value Value of property (e.g. "false", "10s", etc.)
1531     */
1532     function set_voice_property($name, $value)
1533     {
1534     $arr["name"] = $name;
1535     $arr["value"] = $value;
1536    
1537     $this->voice_property[] = $arr;
1538     }
1539    
1540    
1541     /**
1542     Defines a DTMF/voice grammar to repeat or skip voice output. <br>
1543     This function enables voice users to repeat or skip voice output which
1544     has been created by means of HAW_text objects.
1545     For both <i>repeat</i> and <i>forward</i> at least one trigger criteria (DTMF or voice)
1546     has to be defined.
1547     HAW_text objects where user navigation should apply have to call <i>set_voice_navigation()</i>.
1548     @param repeat_dtmf DTMF key that triggers the repetition of the current output (e.g. "1", "2", "", etc.)
1549     @param repeat_voice What the user has to say to repeat the current output (e.g. "repeat", "")
1550     @param forward_dtmf DTMF key that terminates the current output (e.g. "0", "*", "", etc.)
1551     @param forward_voice What the user has to say to continue with the next output (e.g. "forward", "")
1552     @see HAW_text
1553     */
1554     function set_voice_navigator($repeat_dtmf, $repeat_voice, $forward_dtmf, $forward_voice)
1555     {
1556     $repeat_dtmf = (string) $repeat_dtmf;
1557     $forward_dtmf = (string) $forward_dtmf;
1558    
1559     if (!ereg("^[0-9#\*]$", $repeat_dtmf) && !$repeat_voice)
1560     die("at least one repeat indication required in set_voice_navigator()");
1561    
1562     if (!ereg("^[0-9#\*]$", $forward_dtmf) && !$forward_voice)
1563     die("at least one forward indication required in set_voice_navigator()");
1564    
1565     $this->voice_navigator["repeat_dtmf"] = $repeat_dtmf;
1566     $this->voice_navigator["repeat_voice"] = $repeat_voice;
1567     $this->voice_navigator["forward_dtmf"] = $forward_dtmf;
1568     $this->voice_navigator["forward_voice"] = $forward_voice;
1569     }
1570    
1571    
1572     /**
1573     Smooth contiguous text sections. <br>
1574     Note: This function affects VoiceXML output only.<br>
1575     Voice decks often are assembled by some HAW_text objects. Each HAW_text
1576     object creates a VoiceXML &lt;block&gt; element. On some voice browsers this
1577     results in an interruptive speech synthesis. This function coalesces directly
1578     neighbored HAW_text objects to one single HAW_text object and thus results in
1579     a smoothed voice perception.
1580     */
1581     function smooth_voice()
1582     {
1583     if ($this->ml == HAW_VXML)
1584     {
1585     // this function make sense for VoiceXML output only
1586    
1587     $i = 0;
1588    
1589     while (isset($this->element[$i]))
1590     {
1591     $current_element = $this->element[$i];
1592    
1593     if (isset($this->element[$i+1]))
1594     {
1595     $next_element = $this->element[$i+1];
1596    
1597     if (($current_element->get_elementtype() == HAW_PLAINTEXT) &&
1598     ($current_element->get_br() == 0) &&
1599     ($next_element->get_elementtype() == HAW_PLAINTEXT) &&
1600     ($next_element->get_br() == 0) &&
1601     ($current_element->get_attrib() == $next_element->get_attrib()))
1602     {
1603     // create single HAW_text object containing both text sections
1604     $merged_text = new HAW_text($current_element->get_text() . " " . $next_element->get_text(),
1605     $current_element->get_attrib());
1606    
1607     // adopt line breaks from next element
1608     $merged_text->set_br($next_element->get_br());
1609    
1610     // replace old two objects with new object
1611     array_splice($this->element, $i, 2, array($merged_text));
1612     $this->number_of_elements--;
1613    
1614     $i--; // continue with merged element
1615     }
1616     }
1617    
1618     $i++;
1619     }
1620     }
1621     }
1622    
1623    
1624     /**
1625     Creates the page in the according markup language. Depending on the clients
1626     browser type, HTML (pure HTML, handheldfriendly HTML, XHTML, i-mode cHTML, MML),
1627     WML, HDML or VoiceXML is thrown out.
1628     */
1629     function create_page()
1630     {
1631     global $haw_license_holder;
1632     global $haw_license_domain;
1633     global $haw_signature;
1634     global $haw_sig_text;
1635     global $haw_sig_link;
1636    
1637     // add hawoutput query parameter to redirection url, if required
1638     HAW_handle_forced_output($this->red_url, $this->hawoutput);
1639    
1640     if ($this->debug)
1641     header("content-type: text/plain");
1642    
1643     if ($this->disable_cache)
1644     header("cache-control: no-cache");
1645    
1646     if ($this->ml == HAW_HTML)
1647     {
1648     // create HTML page header
1649    
1650     if (!$this->debug)
1651     {
1652     if ($this->xhtml)
1653     {
1654     if ($this->lynx)
1655     $ct = "content-type: text/html";
1656     else
1657     $ct = "content-type: application/vnd.wap.xhtml+xml";
1658     }
1659     else
1660     $ct = sprintf("content-type: text/html;charset=%s", $this->charset);
1661    
1662     header($ct);
1663     }
1664    
1665     if ($this->xhtml)
1666     {
1667     printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n", $this->charset);
1668    
1669     if ($this->lynx)
1670     echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\" >\n";
1671     else
1672     echo "<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.0//EN\" \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\" >\n";
1673     }
1674     elseif ($this->css_enabled)
1675     echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n";
1676    
1677     if ($this->language)
1678     {
1679     if ($this->xhtml)
1680     $language = sprintf(" xml:lang=\"%s\"", $this->language);
1681     else
1682     $language = sprintf(" lang=\"%s\"", $this->language);
1683     }
1684     else
1685     $language = "";
1686    
1687     printf("<html%s>\n", $language);
1688     echo "<head>\n";
1689    
1690     // validation issue: HTML does not allow XHTML-stylish "/>" within <head> part
1691     // HTML has set option SHORTTAG=YES in SGML declaration
1692     // ==> "/" closes the tag and ">" will be treated as text
1693     // <body> allows text, but <head> does not!
1694     if ($this->xhtml)
1695     $endtag = "/>";
1696     else
1697     $endtag = ">";
1698    
1699     if (!$this->iModestyle && !$this->MMLstyle)
1700     {
1701     // cHTML and MML don't support meta tags
1702    
1703     if ($haw_license_domain)
1704     $license = " - registered for $haw_license_domain";
1705     else
1706     $license = "";
1707    
1708     printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\" %s\n",
1709     $this->charset, $endtag);
1710     printf("<meta name=\"GENERATOR\" content=\"%s (PHP) %s%s\" %s\n",
1711     HAW_VERSION, HAW_COPYRIGHT, $license, $endtag);
1712    
1713     if ($this->timeout > 0)
1714     {
1715     printf("<meta http-equiv=\"refresh\" content=\"%d; URL=%s\" %s\n",
1716     $this->timeout, HAW_specchar($this->red_url, $this), $endtag);
1717     }
1718    
1719     if ($this->disable_cache)
1720     {
1721     echo "<meta http-equiv=\"Cache-Control\" content=\"must-revalidate\" $endtag\n";
1722     echo "<meta http-equiv=\"Cache-Control\" content=\"no-cache\" $endtag\n";
1723     echo "<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" $endtag\n";
1724     echo "<meta http-equiv=\"Expires\" content=\"0\" $endtag\n";
1725     }
1726     }
1727    
1728     if ($this->PDAstyle)
1729     {
1730     echo "<meta name=\"HandheldFriendly\" content=\"True\" $endtag\n";
1731     }
1732    
1733     // init style properties
1734     $bgcolor = "";
1735     $background = "";
1736     $disp_background = "";
1737     $size = "";
1738     $color = "";
1739     $link_color = "";
1740     $vlink_color = "";
1741     $face = "";
1742     $bodystyle = "text-align: center; ";
1743     $css_style = "";
1744    
1745     if ($this->pureHTML || $this->PDAstyle || $this->xhtml)
1746     {
1747     if ($this->pureHTML)
1748     {
1749     // big-screen browser
1750    
1751     if ($this->bgcolor)
1752     {
1753     // set background color (=window background color)
1754     $bgcolor = " bgcolor=\"" . $this->bgcolor . "\"";
1755     $bodystyle .= sprintf("background-color:%s; ", $this->bgcolor);
1756     }
1757    
1758     if ($this->background)
1759     {
1760     // set wallpaper (=window wallpaper)
1761     $background = " background=\"" . $this->background . "\"";
1762     $bodystyle .= sprintf("background-image:url(%s); ", $this->background);
1763     }
1764    
1765     // set display defaults, if not assigned by yet
1766     if (!$this->disp_bgcolor)
1767     $this->disp_bgcolor = HAW_DISP_BGCOLOR;
1768     if (!$this->link_color)
1769     $this->link_color = HAW_DISP_LINKCOLOR;
1770     if (!$this->vlink_color)
1771     $this->vlink_color = HAW_DISP_VLINKCOLOR;
1772     if (!$this->face)
1773     $this->face = HAW_DISP_FACE;
1774     }
1775     else
1776     {
1777     // XHTML or PDA
1778    
1779     if ($this->disp_bgcolor)
1780     {
1781     // set background color of mobile device
1782     $bgcolor = " bgcolor=\"" . $this->disp_bgcolor . "\"";
1783     $bodystyle .= sprintf("background-color:%s; ", $this->disp_bgcolor);
1784     }
1785    
1786     if ($this->disp_background)
1787     {
1788     // set wallpaper of mobile device
1789     $background = " background=\"" . $this->disp_background . "\"";
1790     $bodystyle .= sprintf("background-image:url(%s); ", $this->disp_background);
1791     }
1792     }
1793    
1794     if ($this->size)
1795     {
1796     // set the font size for all characters in a HTML created page
1797     $size = " size=\"" . $this->size . "\"";
1798     $bodystyle .= sprintf("font-size:%s; ", $this->size);
1799     }
1800    
1801     if ($this->color)
1802     {
1803     // set the color for all characters in a HTML created page
1804     $color = " color=\"" . $this->color . "\"";
1805     $bodystyle .= sprintf("color:%s; ", $this->color);
1806     }
1807    
1808     if ($this->link_color)
1809     {
1810     // set the color of links in a HTML created page
1811     $link_color = " link=\"" . $this->link_color . "\"";
1812     $css_style .= sprintf("a:link { color:%s; }\n", $this->link_color);
1813     }
1814    
1815     if ($this->vlink_color)
1816     {
1817     // set the color of visited links in a HTML created page
1818     $vlink_color = " vlink=\"" . $this->vlink_color . "\"";
1819     $css_style .= sprintf("a:visited { color:%s; }\n", $this->vlink_color);
1820     }
1821    
1822     if ($this->face)
1823     {
1824     // set the font for all characters in a HTML created page
1825     $face = " face=\"" . $this->face . "\"";
1826     $bodystyle .= sprintf("font-family:%s; ", $this->face);
1827     }
1828    
1829     $this->fontstyle_attrbs = $size . $color . $face;
1830     }
1831    
1832     printf("<title>%s</title>\n", HAW_specchar($this->title, $this));
1833    
1834     if ($this->pureHTML && $this->use_simulator && $this->css_enabled)
1835     // use HAWHAW default- or user-defined skin
1836     printf("<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\" $endtag\n", $this->skin);
1837    
1838     if ($this->css_enabled)
1839     printf("<style type=\"text/css\">\n<!--\nbody { %s}\n%s-->\n</style>\n", $bodystyle, $css_style);
1840    
1841     echo "</head>\n";
1842    
1843     if ($this->css_enabled)
1844     echo "<body>\n";
1845     else
1846     printf("<body%s%s%s%s>\n", $bgcolor, $background, $link_color, $vlink_color);
1847    
1848     if ($this->display_banners)
1849     {
1850     if ($this->number_of_top_banners > 0)
1851     {
1852     echo "<center>\n";
1853    
1854     for ($i=0; $i<$this->number_of_top_banners; $i++)
1855     {
1856     // display banners at the top of the HTML page
1857     $banner = $this->top_banners[$i];
1858     $banner->create();
1859     }
1860    
1861     echo "</center>\n";
1862     }
1863     }
1864    
1865     if ($this->pureHTML)
1866     {
1867     if ($this->css_enabled && $this->use_simulator)
1868     {
1869     // use simulator design
1870     echo "<div id=\"skin\">\n";
1871     echo "<div id=\"display\">\n";
1872     }
1873     else
1874     {
1875     // use classic HAWHAW design
1876     printf("<div style=\"background-color: %s; background-image: url(%s); border: %dpx solid #aaa; padding: 8px; width: %spx; margin: 0px auto;\">\n",
1877     $this->disp_bgcolor, $this->disp_background, $this->border, $this->width);
1878     }
1879     }
1880    
1881     if (!$this->css_enabled && $this->fontstyle_attrbs)
1882     {
1883     // write style attributes, if any
1884     printf("<font%s>\n", $this->fontstyle_attrbs);
1885     }
1886     }
1887     else
1888     {
1889     // determine default values for WML, HDML and VXML form elements
1890    
1891     while (list($e_key, $e_val) = each($this->element))
1892     {
1893     if ($e_val->get_elementtype() == HAW_FORM)
1894     {
1895     // one (and only one!) form exists
1896    
1897     $form = $e_val;
1898     $defaults = $form->get_defaults();
1899     }
1900     }
1901    
1902     if ($this->ml == HAW_WML)
1903     {
1904     // create WML page header
1905     if (!$this->debug)
1906     {
1907     $ct = sprintf("content-type: text/vnd.wap.wml");
1908     header($ct);
1909     }
1910    
1911     if ($this->disable_cache)
1912     {
1913     // not all WAP clients interprete meta directives!
1914     // disable caching by sending HTTP content-location header with unique value
1915    
1916     if (isset($_SERVER['REQUEST_URI']))
1917     $request_uri = $_SERVER['REQUEST_URI'];
1918     else
1919     $request_uri = "";
1920    
1921     if (strchr($request_uri, "?"))
1922     // request URI already contains parameter(s)
1923     $header= sprintf("content-location: %s&hawcid=%s", $request_uri, date("U"));
1924     else
1925     // no parameters in URI
1926     $header= sprintf("content-location: %s?hawcid=%s", $request_uri, date("U"));
1927    
1928     header($header);
1929     }
1930    
1931     echo "<?xml version=\"1.0\"?" . ">\n";
1932    
1933     if ($this->owgui_1_3)
1934     echo "<!DOCTYPE wml PUBLIC \"-//OPENWAVE.COM//DTD WML 1.3//EN\" \"http://www.openwave.COM/dtd/wml13.dtd\" >\n";
1935     else
1936     echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";
1937    
1938     printf("<!-- Generated by %s %s -->\n", HAW_VERSION, HAW_COPYRIGHT);
1939    
1940     if ($this->language)
1941     $language = sprintf(" xml:lang=\"%s\"", $this->language);
1942     else
1943     $language = "";
1944    
1945     printf("<wml%s>\n", $language);
1946    
1947     if ($this->disable_cache)
1948     {
1949     echo "<head>\n";
1950     echo "<meta http-equiv=\"Cache-Control\" content=\"must-revalidate\" forua=\"true\"/>\n";
1951     echo "<meta http-equiv=\"Cache-Control\" content=\"no-cache\" forua=\"true\"/>\n";
1952     echo "<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>\n";
1953     echo "<meta http-equiv=\"Expires\" content=\"0\" forua=\"true\"/>\n";
1954     echo "<meta http-equiv=\"Pragma\" content=\"no-cache\" forua=\"true\"/>\n";
1955     echo "</head>\n";
1956     }
1957    
1958     if ($this->title)
1959     $title = " title=\"" . HAW_specchar($this->title,$this) . "\"";
1960     else
1961     $title = "";
1962    
1963     printf("<card%s>\n", $title);
1964    
1965     if (isset ($defaults) && $defaults)
1966     {
1967     // default values exist
1968    
1969     // set variables each time the card is enter in forward direction ...
1970    
1971     echo "<onevent type=\"onenterforward\">\n";
1972     echo "<refresh>\n";
1973    
1974     // initialize all WML variables with their default values
1975     while (list($d_key, $d_val) = each($defaults))
1976     printf("<setvar name=\"%s\" value=\"%s\"/>\n",
1977     $d_val['name'], HAW_specchar($d_val['value'], $this));
1978    
1979     reset($defaults);
1980    
1981     echo "</refresh>\n";
1982     echo "</onevent>\n";
1983    
1984     // ... and backward direction
1985    
1986     echo "<onevent type=\"onenterbackward\">\n";
1987     echo "<refresh>\n";
1988    
1989     while (list($d_key, $d_val) = each($defaults))
1990     printf("<setvar name=\"%s\" value=\"%s\"/>\n", $d_val['name'], $d_val['value']);
1991    
1992     echo "</refresh>\n";
1993     echo "</onevent>\n";
1994     }
1995    
1996     // set redirection timeout
1997     if ($this->timeout > 0)
1998     {
1999     echo "<onevent type=\"ontimer\">\n";
2000     printf("<go href=\"%s\"/>\n", HAW_specchar($this->red_url, $this));
2001     echo "</onevent>\n";
2002     printf("<timer value=\"%d\"/>\n", $this->timeout*10);
2003     }
2004    
2005     // define <back> softkey
2006     echo "<do type=\"prev\" label=\"Back\">\n";
2007     echo "<prev/>\n";
2008     echo "</do>\n";
2009     }
2010     elseif ($this->ml == HAW_HDML)
2011     {
2012     // create HDML card set structure
2013    
2014     if (!isset($defaults))
2015     $defaults = array();
2016    
2017     $this->hdmlcardset = new HAW_hdmlcardset(HAW_specchar($this->title, $this),
2018     $defaults, $this->disable_cache,
2019     $this->debug, $this->charset);
2020     }
2021     elseif ($this->ml == HAW_VXML)
2022     {
2023     // create VXML page header
2024     if (!$this->debug)
2025     {
2026     $ct = sprintf("content-type: application/vxml+xml");
2027     header($ct);
2028     }
2029    
2030     echo "<?xml version=\"1.0\"?" . ">\n";
2031    
2032     printf("<!-- Generated by %s %s -->\n", HAW_VERSION, HAW_COPYRIGHT);
2033    
2034     if ($this->language)
2035     $language = sprintf(" xml:lang=\"%s\"", $this->language);
2036     else
2037     $language = "";
2038    
2039     printf("<vxml%s version=\"2.0\">\n", $language);
2040    
2041     if ($this->disable_cache)
2042     echo "<meta http-equiv=\"Expires\" content=\"0\"/>\n";
2043    
2044     // define voice deck properties
2045     while (list($key, $val) = each($this->voice_property))
2046     printf("<property name=\"%s\" value=\"%s\"/>\n", $val["name"], $val["value"]);
2047    
2048     echo "<form>\n";
2049    
2050     if (count($this->voice_navigator) > 0)
2051     {
2052     // allow user navigation in dedicated prompts
2053    
2054     echo "<var name=\"nav_counter\"/>\n";
2055    
2056     if (strlen($this->voice_navigator["repeat_dtmf"]) > 0)
2057     $dtmf = sprintf(" dtmf=\"%s\"", $this->voice_navigator["repeat_dtmf"]);
2058     else
2059     $dtmf = "";
2060    
2061     if ($this->voice_navigator["repeat_voice"])
2062     $voice_grammar = sprintf("<grammar>[%s]</grammar>", $this->voice_navigator["repeat_voice"]);
2063     else
2064     $voice_grammar = "";
2065    
2066     printf("<link%s event=\"repeat\">%s</link>\n", $dtmf, $voice_grammar); // define repeat link
2067    
2068     if (strlen($this->voice_navigator["forward_dtmf"]) > 0)
2069     $dtmf = sprintf(" dtmf=\"%s\"", $this->voice_navigator["forward_dtmf"]);
2070     else
2071     $dtmf = "";
2072    
2073     if ($this->voice_navigator["forward_voice"])
2074     $voice_grammar = sprintf("<grammar>[%s]</grammar>", $this->voice_navigator["forward_voice"]);
2075     else
2076     $voice_grammar = "";
2077    
2078     printf("<link%s event=\"forward\">%s</link>\n", $dtmf, $voice_grammar); // define forward link
2079    
2080     // define catch handler for links
2081     echo "<catch event=\"repeat\"><goto expritem=\"'block' + nav_counter\"/></catch>\n";
2082     echo "<catch event=\"forward\"><goto expritem=\"'block' + nav_counter + 'end'\"/></catch>\n";
2083     }
2084    
2085     if ($this->voice_text || $this->voice_audio_src)
2086     {
2087     // create introducing audio output for VoiceXML deck
2088    
2089     echo "<block><prompt>";
2090    
2091     HAW_voice_audio(HAW_specchar($this->voice_text, $this),
2092     $this->voice_audio_src, HAW_VOICE_PAUSE, $this);
2093    
2094     echo "</prompt></block>\n";
2095     }
2096     }
2097     }
2098    
2099     // position:relative is needed to work-around MSIE's Peekaboo bug ...
2100     // text-align aligns left, centered or right
2101     $divstyle = sprintf("text-align:%s; position:relative;", $this->alignment);
2102    
2103     if ($this->ml == HAW_HTML)
2104     {
2105     if ($this->css_enabled)
2106     printf("<div style=\"%s\">\n", $divstyle);
2107     else
2108     printf("<div align=\"%s\">\n", $this->alignment);
2109     }
2110     elseif ($this->ml == HAW_WML)
2111     printf("<p align=\"%s\">\n", $this->alignment);
2112    
2113     $i = 0;
2114     while (isset($this->element[$i]))
2115     {
2116     $page_element = $this->element[$i];
2117     switch ($page_element->get_elementtype())
2118     {
2119     case HAW_PLAINTEXT:
2120     case HAW_IMAGE:
2121     case HAW_TABLE:
2122     case HAW_FORM:
2123     case HAW_LINK:
2124     case HAW_PHONE:
2125     case HAW_LINKSET:
2126     case HAW_RAW:
2127     case HAW_USERDEFINED:
2128     case HAW_RULE:
2129     case HAW_VOICERECORDER:
2130     {
2131     $element = $this->element[$i];
2132     $element->create($this);
2133    
2134     break;
2135     }
2136     }
2137    
2138     $i++;
2139     }
2140    
2141     if ($this->ml == HAW_HTML)
2142     {
2143     // create HTML page end
2144    
2145     // ATTENTION!
2146     //
2147     // DO NOT REMOVE THE COPYRIGHT LINK WITHOUT PERMISSION!
2148     // IF YOU DO SO, YOU ARE VIOLATING THE LICENSE TERMS
2149     // OF THIS SOFTWARE! YOU HAVE TO PAY NOTHING FOR THIS
2150     // SOFTWARE, SO PLEASE BE SO FAIR TO ACCEPT THE RULES.
2151     // IF YOU DON'T, YOUR WEBSITE WILL AT LEAST BE LISTED IN
2152     // THE HAWHAW HALL OF SHAME!
2153     // PLEASE REFER TO THE LIBRARY HEADER AND THE HAWHAW
2154     // HOMEPAGE FOR MORE INFORMATION.
2155    
2156     echo "</div>\n";
2157    
2158     if (!$this->css_enabled && $this->fontstyle_attrbs)
2159     echo "</font>\n";
2160    
2161     if ($this->pureHTML)
2162     {
2163     if ($this->css_enabled && $this->use_simulator)
2164     // terminate display div
2165     echo "</div>\n";
2166    
2167     echo "</div>\n"; // terminate skin/classic div
2168    
2169     if (!$this->lynx)
2170     {
2171     if ($haw_license_holder && $haw_signature)
2172     {
2173     if ($haw_signature == 1)
2174     $signature = "<small>Powered by HAWHAW (C)</small>\n";
2175     else
2176     if ($haw_sig_text)
2177     if ($haw_sig_link)
2178     $signature = sprintf("<a href=\"%s\" target=\"_blank\"><small>%s</small></a>\n", $haw_sig_link, $haw_sig_text);
2179     else
2180     $signature = sprintf("<small>%s</small>\n", $haw_sig_text);
2181     }
2182     else
2183     $signature = sprintf("<a href=\"http://info.hawhaw.de/index.htm?host=%s\" target=\"_blank\"><small>Powered by HAWHAW (C)</small></a>\n", $this->waphome);
2184    
2185     echo $signature;
2186     }
2187     }
2188    
2189     if ($this->display_banners)
2190     {
2191     if ($this->number_of_bottom_banners > 0)
2192     {
2193     echo "<center>\n";
2194    
2195     for ($i=0; $i<$this->number_of_bottom_banners; $i++)
2196     {
2197     // display banners at the bottom of the HTML page
2198     $banner = $this->bottom_banners[$i];
2199     $banner->create();
2200     }
2201    
2202     echo "</center>\n";
2203     }
2204     }
2205    
2206     echo "</body>\n";
2207     echo "</html>\n";
2208     }
2209     elseif ($this->ml == HAW_WML)
2210     {
2211     // create WML page end
2212     echo "</p>\n";
2213     echo "</card>\n";
2214     echo "</wml>\n";
2215     }
2216     elseif ($this->ml == HAW_HDML)
2217     {
2218     // create HDML page from hdml card set structure
2219     $cardset = $this->hdmlcardset;
2220     $cardset->create_hdmldeck();
2221     }
2222     elseif ($this->ml == HAW_VXML)
2223     {
2224     // create VoiceXML page end
2225    
2226     // set redirection timeout
2227     if ($this->timeout > 0)
2228     {
2229     // redirect after <timout> to another URL
2230     // (define dummy grammar in case that no other grammar is active)
2231     printf("<field><grammar>[(hawhaw really rocks)]</grammar><prompt timeout=\"%ds\"/><noinput><goto next=\"%s\"/></noinput></field>\n",
2232     $this->timeout, $this->red_url);
2233     }
2234     elseif($this->voice_timeout > 0)
2235     {
2236     // there is at least one voice link active
2237     // wait longest link timeout value until disconnect is forced
2238    
2239     printf("<field><prompt timeout=\"%ds\"/>", $this->voice_timeout);
2240    
2241     // test for user-defined noinput event handler
2242     if (!isset($this->voice_noinput) || (count($this->voice_noinput) == 0))
2243     echo "<noinput><exit/></noinput>"; // terminate in case of no input
2244    
2245     echo "</field>\n";
2246     }
2247    
2248     echo "</form>\n";
2249    
2250     if ($this->voice_links)
2251     echo $this->voice_links;
2252    
2253     // create event handlers
2254     HAW_voice_eventhandler("help", $this->voice_help, $this);
2255     HAW_voice_eventhandler("noinput", $this->voice_noinput, $this);
2256     HAW_voice_eventhandler("nomatch", $this->voice_nomatch, $this);
2257    
2258     echo "</vxml>\n";
2259     }
2260     }
2261     };
2262    
2263    
2264    
2265    
2266    
2267    
2268     /**
2269     This class defines a form with various possible input elements. The input elements
2270     have to be defined as separate objects and are linked to the form with a special
2271     "add" function. One HAW_deck object can contain only one HAW_form object.
2272     <p><b>Examples:</b><p>
2273     $myPage = new HAW_deck(...);<br>
2274     ...<br>
2275     $myForm = new HAW_form("/mynextpage.php");<br>
2276     $myText = new HAW_text(...);<br>
2277     $myForm->add_text($myText);<br>
2278     $myInput = new HAW_input(...);<br>
2279     $myForm->add_input($myInput);<br>
2280     $mySubmit = new HAW_submit(...);<br>
2281     $myForm->add_submit($mySubmit);<br>
2282     ...<br>
2283     $myPage->add_form($myForm);<br>
2284     ...<br>
2285     $myPage->create_page();
2286     @see HAW_text
2287     @see HAW_image
2288     @see HAW_table
2289     @see HAW_input
2290     @see HAW_textarea
2291     @see HAW_select
2292     @see HAW_radio
2293     @see HAW_checkbox
2294     @see HAW_hidden
2295     @see HAW_submit
2296     @see HAW_rule
2297     */
2298     class HAW_form
2299     {
2300     var $url;
2301     var $element;
2302     var $number_of_elements = 0;
2303     var $number_of_submitobjects = 0;
2304     var $voice_text = "";
2305     var $voice_audio_src = "";
2306    
2307     /**
2308     Constructor
2309     @param url Address where the user input is sent to.<br>
2310     Note: Currently only the GET method is supported.
2311     */
2312     function HAW_form($url)
2313     {
2314     $this->url = $url;
2315     }
2316    
2317    
2318     /**
2319     Adds a HAW_text object to HAW_form.
2320     @param text Some HAW_text object.
2321     @see HAW_text
2322     */
2323     function add_text($text)
2324     {
2325     if (!is_object($text))
2326     die("invalid argument in add_text()");
2327    
2328     $this->element[$this->number_of_elements] = $text;
2329    
2330     $this->number_of_elements++;
2331     }
2332    
2333    
2334     /**
2335     Adds a HAW_image object to HAW_form.
2336     @param image Some HAW_image object.
2337     @see HAW_image
2338     */
2339     function add_image($image)
2340     {
2341     if (!is_object($image))
2342     die("invalid argument in add_image()");
2343    
2344     $this->element[$this->number_of_elements] = $image;
2345    
2346     $this->number_of_elements++;
2347     }
2348    
2349    
2350     /**
2351     Adds a HAW_table object to HAW_form.
2352     @param table Some HAW_table object.
2353     @see HAW_table
2354     */
2355     function add_table($table)
2356     {
2357     if (!is_object($table))
2358     die("invalid argument in add_table()");
2359    
2360     $this->element[$this->number_of_elements] = $table;
2361    
2362     $this->number_of_elements++;
2363     }
2364    
2365    
2366     /**
2367     Adds a HAW_input object to HAW_form.
2368     @param input Some HAW_input object.
2369     @see HAW_input
2370     */
2371     function add_input($input)
2372     {
2373     if (!is_object($input))
2374     die("invalid argument in add_input()");
2375    
2376     $this->element[$this->number_of_elements] = $input;
2377    
2378     $this->number_of_elements++;
2379     }
2380    
2381    
2382     /**
2383     Adds a HAW_textarea object to HAW_form.
2384     @param textarea Some HAW_textarea object.
2385     @see HAW_textarea
2386     */
2387     function add_textarea($textarea)
2388     {
2389     if (!is_object($textarea))
2390     die("invalid argument in add_textarea()");
2391    
2392     $this->element[$this->number_of_elements] = $textarea;
2393    
2394     $this->number_of_elements++;
2395     }
2396    
2397    
2398     /**
2399     Adds a HAW_select object to HAW_form.
2400     @param select Some HAW_select object.
2401     @see HAW_select
2402     */
2403     function add_select($select)
2404     {
2405     if (!is_object($select))
2406     die("invalid argument in add_select()");
2407    
2408     $this->element[$this->number_of_elements] = $select;
2409    
2410     $this->number_of_elements++;
2411     }
2412    
2413    
2414     /**
2415     Adds a HAW_radio object to HAW_form.
2416     @param radio Some HAW_radio object.
2417     @see HAW_radio
2418     */
2419     function add_radio($radio)
2420     {
2421     if (!is_object($radio))
2422     die("invalid argument in add_radio()");
2423    
2424     $this->element[$this->number_of_elements] = $radio;
2425    
2426     $this->number_of_elements++;
2427     }
2428    
2429    
2430     /**
2431     Adds a HAW_checkbox object to HAW_form.
2432     @param checkbox Some HAW_checkbox object.
2433     @see HAW_checkbox
2434     */
2435     function add_checkbox($checkbox)
2436     {
2437     if (!is_object($checkbox))
2438     die("invalid argument in add_checkbox()");
2439    
2440     $this->element[$this->number_of_elements] = $checkbox;
2441    
2442     $this->number_of_elements++;
2443     }
2444    
2445    
2446     /**
2447     Adds a HAW_hidden object to HAW_form.
2448     @param hidden Some HAW_hidden object.
2449     @see HAW_hidden
2450     */
2451     function add_hidden($hidden)
2452     {
2453     if (!is_object($hidden))
2454     die("invalid argument in add_hidden()");
2455    
2456     $this->element[$this->number_of_elements] = $hidden;
2457    
2458     $this->number_of_elements++;
2459     }
2460    
2461    
2462     /**
2463     Adds a HAW_submit object to HAW_form.
2464     @param submit Some HAW_submit object.
2465     @see HAW_submit
2466     */
2467     function add_submit($submit)
2468     {
2469     if (!is_object($submit))
2470     die("invalid argument in add_submit()");
2471    
2472     if ($this->number_of_submitobjects > 0)
2473     die("only one HAW_submit object per form allowed!");
2474    
2475     $this->element[$this->number_of_elements] = $submit;
2476    
2477     $this->number_of_elements++;
2478     $this->number_of_submitobjects++;
2479     }
2480    
2481    
2482     /*
2483     Adds a HAW_raw object to HAW_form. (undocumented feature - for test only!)
2484     @param raw_markup_object Some HAW_raw object.
2485     @see HAW_raw
2486     */
2487     function add_raw($raw)
2488     {
2489     if (!is_object($raw))
2490     die("invalid argument in add_raw()");
2491    
2492     $this->element[$this->number_of_elements] = $raw;
2493    
2494     $this->number_of_elements++;
2495     }
2496    
2497    
2498     /*
2499     Adds some user-defined HAWHAW object to HAW_form (undocumented feature)<br>
2500     For skilled HAWHAW programmers only!
2501     @param udef Some user-defined object.
2502     */
2503     function add_userdefined($udef)
2504     {
2505     // see HAW_deck->add_userdefined($def) for documentation
2506    
2507     if (!is_object($udef))
2508     die("invalid argument in add_userdefined()");
2509    
2510     $this->element[$this->number_of_elements] = $udef;
2511    
2512     $this->number_of_elements++;
2513     }
2514    
2515    
2516     /**
2517     Adds a HAW_rule object to HAW_form.
2518     @param rule Some HAW_rule object.
2519     @see HAW_rule
2520     */
2521     function add_rule($rule)
2522     {
2523     if (!is_object($rule))
2524     die("invalid argument in add_rule()");
2525    
2526     $this->element[$this->number_of_elements] = $rule;
2527    
2528     $this->number_of_elements++;
2529     }
2530    
2531    
2532     /**
2533     Sets form-related text to be spoken by voice browsers. <br>
2534     @param text Some introducing text that will be spoken before any dialog
2535     is started.
2536     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
2537     */
2538     function set_voice_text($text, $audio_src="")
2539     {
2540     if (!is_string($text))
2541     die("invalid argument in set_voice_text()");
2542    
2543     $this->voice_text = $text;
2544     $this->voice_audio_src = $audio_src;
2545     }
2546    
2547    
2548     function get_defaults()
2549     {
2550     $defaults = array();
2551    
2552     $i = 0;
2553     while (list($key, $val) = each($this->element))
2554     {
2555     switch ($val->get_elementtype())
2556     {
2557     case HAW_CHECKBOX:
2558     {
2559     $checkbox = $val;
2560    
2561     if ($checkbox->is_checked())
2562     {
2563     $defaults[$i]["name"] = $checkbox->get_name();
2564     $defaults[$i]["value"] = $checkbox->get_value();
2565     $i++;
2566     }
2567    
2568     break;
2569     }
2570    
2571     case HAW_INPUT:
2572     case HAW_TEXTAREA:
2573     case HAW_SELECT:
2574     case HAW_RADIO:
2575     case HAW_HIDDEN:
2576     {
2577     $element = $val;
2578    
2579     $defaults[$i]["name"] = $element->get_name();
2580     $defaults[$i]["value"] = $element->get_value();
2581     $i++;
2582    
2583     break;
2584     }
2585     }
2586     }
2587    
2588     return $defaults;
2589     }
2590    
2591     function get_elementtype()
2592     {
2593     return HAW_FORM;
2594     }
2595    
2596     function create(&$deck)
2597     {
2598     // add hawoutput query parameter to form, if required
2599     if ($deck->hawoutput)
2600     {
2601     $hidden_hawoutput = new HAW_hidden("hawoutput", $deck->hawoutput);
2602     $this->add_hidden($hidden_hawoutput);
2603     }
2604    
2605     // determine all elements that have to be submitted
2606    
2607     $i = 0;
2608     while (list($key, $val) = each($this->element))
2609     {
2610     switch ($val->get_elementtype())
2611     {
2612     case HAW_INPUT:
2613     case HAW_TEXTAREA:
2614     case HAW_SELECT:
2615     case HAW_CHECKBOX:
2616     case HAW_RADIO:
2617     case HAW_HIDDEN:
2618     {
2619     $element = $val;
2620     $getvar[$i] = $element->get_name();
2621     $i++;
2622     }
2623     }
2624     }
2625    
2626     if ($deck->ml == HAW_HTML)
2627     {
2628     // start tag of HTML form
2629     printf("<form action=\"%s\" method=\"get\">\n", $this->url);
2630    
2631     if ($deck->xhtml)
2632     echo "<div>\n"; // needed for validation
2633     }
2634     // not necessary in WML, HDML and VoiceXML!
2635    
2636     if ($deck->ml == HAW_VXML)
2637     {
2638     if ($this->voice_text || $this->voice_audio_src)
2639     {
2640     // create introducing audio output for VoiceXML form
2641    
2642     echo "<block><prompt>";
2643    
2644     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
2645     $this->voice_audio_src, HAW_VOICE_PAUSE, $deck);
2646    
2647     echo "</prompt></block>\n";
2648     }
2649     }
2650    
2651     $i = 0;
2652     while (isset($this->element[$i]))
2653     {
2654     $form_element = $this->element[$i];
2655     switch ($form_element->get_elementtype())
2656     {
2657     case HAW_PLAINTEXT:
2658     case HAW_IMAGE:
2659     case HAW_TABLE:
2660     case HAW_INPUT:
2661     case HAW_TEXTAREA:
2662     case HAW_SELECT:
2663     case HAW_RADIO:
2664     case HAW_CHECKBOX:
2665     case HAW_HIDDEN:
2666     case HAW_RAW:
2667     case HAW_RULE:
2668     case HAW_USERDEFINED:
2669     {
2670     $form_element->create($deck);
2671     break;
2672     }
2673    
2674     case HAW_SUBMIT:
2675     {
2676     $submit = $this->element[$i];
2677     $submit->create($deck, $getvar, $this->url);
2678     break;
2679     }
2680    
2681     }
2682    
2683     $i++;
2684     }
2685    
2686     if ($deck->ml == HAW_HTML)
2687     {
2688     if ($deck->xhtml)
2689     echo "</div>\n";
2690    
2691     // terminate HTML form
2692     echo "</form>\n";
2693     }
2694     }
2695     };
2696    
2697    
2698    
2699    
2700    
2701    
2702     /**
2703     This class allows to insert plain text into a HAW_deck, HAW_form or HAW_table object.
2704     <p><b>Examples:</b><p>
2705     $myText1 = new HAW_text("Hello WAP!");<br>
2706     $myText2 = new HAW_text("Welcome to HAWHAW", HAW_TEXTFORMAT_BOLD);<br>
2707     $myText3 = new HAW_text("Good Morning", HAW_TEXTFORMAT_BOLD | HAW_TEXTFORMAT_BIG);<br>
2708     <br>
2709     $myText3->set_br(2);<br>
2710     @see HAW_deck
2711     @see HAW_form
2712     @see HAW_row
2713     */
2714     class HAW_text
2715     {
2716     var $text;
2717     var $attrib;
2718     var $color;
2719     var $boxcolor;
2720     var $br;
2721     var $voice_text;
2722     var $voice_audio_src;
2723     var $voice_navigation;
2724    
2725     /**
2726     Constructor
2727     @param text Some string you want to display
2728     @param attrib (optional)<br>
2729     HAW_TEXTFORMAT_NORMAL (default)<br>
2730     HAW_TEXTFORMAT_BOLD<br>
2731     HAW_TEXTFORMAT_UNDERLINE<br>
2732     HAW_TEXTFORMAT_ITALIC<br>
2733     HAW_TEXTFORMAT_BIG<br>
2734     HAW_TEXTFORMAT_SMALL<br>
2735     HAW_TEXTFORMAT_BOXED (text in a colored box for headings etc.)
2736     */
2737     function HAW_text($text, $attrib=HAW_TEXTFORMAT_NORMAL)
2738     {
2739     $this->text = $text;
2740     $this->attrib = $attrib;
2741     $this->color = "";
2742     $this->boxcolor = "";
2743     $this->br = 1; // default: 1 line break after text
2744     $this->voice_text = $text;
2745     $this->voice_audio_src = "";
2746     $this->voice_navigation = false;
2747     }
2748    
2749     /**
2750     Sets the color of this object in a (X)HTML page.
2751     @param color See HTML specification for possible values (e.g. "#CCFFFF", "red",
2752     ...).
2753     @param boxcolor (optional)<br>
2754     box background for attribute HAW_TEXTFORMAT_BOXED
2755     */
2756     function set_color($color, $boxcolor="")
2757     {
2758     $this->color = $color;
2759     $this->boxcolor = $boxcolor;
2760     }
2761    
2762     /**
2763     Sets the number of line breaks (CRLF) after text. (default: 1)
2764     @param br Some number of line breaks.
2765     */
2766     function set_br($br)
2767     {
2768     if (!is_int($br) || ($br < 0))
2769     die("invalid argument in set_br()");
2770    
2771     $this->br = $br;
2772     }
2773    
2774     /**
2775     Sets text to be spoken by voice browsers. <br>
2776     @param text Some alternative text that replaces original &lt;text&gt;.
2777     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
2778     */
2779     function set_voice_text($text, $audio_src="")
2780     {
2781     if (!is_string($text))
2782     die("invalid argument in set_voice_text()");
2783    
2784     $this->voice_text = $text;
2785     $this->voice_audio_src = $audio_src;
2786     }
2787    
2788     /**
2789     Turns on the voice navigation capability for this object. <br>
2790     Note: See <i>set_voice_navigator(...)</i> in class HAW_deck.
2791     @see HAW_deck
2792     */
2793     function set_voice_navigation()
2794     {
2795     $this->voice_navigation = true;
2796     }
2797    
2798     function get_text()
2799     {
2800     return $this->text;
2801     }
2802    
2803     function get_color()
2804     {
2805     return $this->color;
2806     }
2807    
2808     function get_br()
2809     {
2810     return $this->br;
2811     }
2812    
2813     function get_attrib()
2814     {
2815     return $this->attrib;
2816     }
2817    
2818     function get_elementtype()
2819     {
2820     return HAW_PLAINTEXT;
2821     }
2822    
2823     function create(&$deck)
2824     {
2825     if ($deck->ml == HAW_HDML)
2826     {
2827     // HDML
2828    
2829     $deck->hdmlcardset->add_display_content("<" . $deck->alignment . ">\n");
2830    
2831     // print text
2832     if ($this->text)
2833     {
2834     $content = sprintf("%s\n", HAW_specchar($this->text, $deck));
2835     $deck->hdmlcardset->add_display_content($content);
2836     }
2837    
2838     // create required amount of carriage return's
2839     $br = "";
2840     for ($i=0; $i < $this->br; $i++)
2841     $br .= "<br>\n";
2842    
2843     $deck->hdmlcardset->add_display_content($br);
2844     }
2845     elseif(($deck->ml == HAW_HTML) || ($deck->ml == HAW_WML))
2846     {
2847     // HTML or WML
2848    
2849     if (($this->attrib & HAW_TEXTFORMAT_BOXED) && ($deck->ml == HAW_HTML))
2850     {
2851     // determine text and background color, if not already assigned
2852    
2853     if (!$this->color)
2854     $this->color = $deck->disp_bgcolor;
2855     if (!$this->color)
2856     $this->color = "#FFFFFF"; // default: white text
2857    
2858     if (!$this->boxcolor)
2859     $this->boxcolor = $deck->color;
2860     if (!$this->boxcolor)
2861     $this->boxcolor = "#000000"; // default: on black background
2862    
2863     if ($deck->css_enabled)
2864     printf("<div style=\"background-color:%s; margin:0px;\">\n", $this->boxcolor);
2865     else
2866     {
2867     printf("<table border=\"0\" bgcolor=\"%s\" width=\"100%%\"><tr><td><font%s>\n",
2868     $this->boxcolor, $deck->fontstyle_attrbs);
2869    
2870     // align text in (table-)box
2871     printf("<div align=\"%s\">\n", $deck->alignment);
2872     }
2873    
2874     // decrement line breaks because div/table already causes 1 br
2875     if ($this->br >= 1)
2876     $this->br--;
2877     }
2878    
2879     if ($this->attrib & HAW_TEXTFORMAT_BOLD)
2880     echo "<b>\n";
2881    
2882     if ($this->attrib & HAW_TEXTFORMAT_UNDERLINE)
2883     {
2884     if ($deck->css_enabled)
2885     echo "<span style=\"text-decoration:underline;\">\n";
2886     else
2887     echo "<u>\n";
2888     }
2889    
2890     if ($this->attrib & HAW_TEXTFORMAT_ITALIC)
2891     echo "<i>\n";
2892    
2893     if ($this->attrib & HAW_TEXTFORMAT_BIG)
2894     echo "<big>\n";
2895    
2896     if ($this->attrib & HAW_TEXTFORMAT_SMALL)
2897     echo "<small>\n";
2898    
2899     if (($deck->ml == HAW_HTML) && $this->color)
2900     {
2901     if ($deck->css_enabled)
2902     printf("<span style=\"color:%s;\">\n", $this->color);
2903     else
2904     printf("<font color=\"%s\">", $this->color);
2905     }
2906    
2907     // print text
2908     if (isset($this->text))
2909     printf("%s\n", HAW_specchar($this->text, $deck));
2910    
2911     if (($deck->ml == HAW_HTML) && $this->color)
2912     {
2913     if ($deck->css_enabled)
2914     echo "</span>";
2915     else
2916     echo "</font>";
2917     }
2918    
2919     if ($this->attrib & HAW_TEXTFORMAT_SMALL)
2920     echo "</small>\n";
2921    
2922     if ($this->attrib & HAW_TEXTFORMAT_BIG)
2923     echo "</big>\n";
2924    
2925     if ($this->attrib & HAW_TEXTFORMAT_ITALIC)
2926     echo "</i>\n";
2927    
2928     if ($this->attrib & HAW_TEXTFORMAT_UNDERLINE)
2929     {
2930     if ($deck->css_enabled)
2931     echo "</span>\n";
2932     else
2933     echo "</u>\n";
2934     }
2935    
2936     if ($this->attrib & HAW_TEXTFORMAT_BOLD)
2937     echo "</b>\n";
2938    
2939     if (($this->attrib & HAW_TEXTFORMAT_BOXED) && ($deck->ml == HAW_HTML))
2940     {
2941     if ($deck->css_enabled)
2942     echo "</div>\n";
2943     else
2944     echo "</div></font></td></tr></table>\n";
2945     }
2946    
2947     // create required amount of carriage return's
2948     for ($i=0; $i < $this->br; $i++)
2949     echo "<br />\n";
2950     }
2951     elseif($deck->ml == HAW_VXML)
2952     {
2953     // VoiceXML
2954    
2955     if ($this->voice_navigation)
2956     {
2957     // enable navigation (repeat/forward)
2958     static $block_counter = 0;
2959     printf("<block name=\"block%d\"><assign name=\"nav_counter\" expr=\"%d\"/><prompt>",
2960     $block_counter, $block_counter);
2961     }
2962     else
2963     echo "<block><prompt>";
2964    
2965     $pause = $this->br * HAW_VOICE_PAUSE; // short pause for each break
2966    
2967     // remove leading commas, dots etc. which may appear after link objects
2968     HAW_voice_audio(ereg_replace("^[\?!,;.]", " ", HAW_specchar($this->voice_text, $deck)),
2969     $this->voice_audio_src, $pause, $deck);
2970    
2971     echo "</prompt></block>\n";
2972    
2973     if ($this->voice_navigation)
2974     {
2975     // create artificial field to control VoiceXML sequencing
2976     printf("<field name=\"dummy%d\">\n", $block_counter);
2977     echo "<property name=\"timeout\" value=\"0.5s\"/>\n";
2978     echo "<grammar>[(hawhaw really rocks)]</grammar>\n";
2979     printf("<noinput><assign name=\"dummy%d\" expr=\"true\"/></noinput>\n", $block_counter);
2980     echo "</field>\n";
2981    
2982     // create block end where forward will go to
2983     printf("<block name=\"block%dend\"/>\n", $block_counter++);
2984     }
2985     }
2986     }
2987     };
2988    
2989    
2990    
2991    
2992    
2993    
2994     /**
2995     This class allows to insert bitmap images into a HAW_deck, HAW_form or HAW_table
2996     object.
2997     <p><b>Examples:</b><p>
2998     $myImage1 = new HAW_image("my_image.wbmp", "my_image.gif", ":-)");<br>
2999     $myImage2 = new HAW_image("my_image.wbmp", "my_image.gif", ":-)", "my_image.bmp");<br>
3000     $myImage2->set_br(1);<br>
3001     @see HAW_deck
3002     @see HAW_form
3003     @see HAW_row
3004     */
3005     class HAW_image
3006     {
3007     var $src_wbmp;
3008     var $src_html;
3009     var $alt;
3010     var $src_bmp;
3011     var $br;
3012     var $localsrc;
3013     var $chtml_icon;
3014     var $mml_icon;
3015     var $voice_text;
3016     var $voice_audio_src;
3017    
3018     /**
3019     Constructor
3020     @param src_wbmp Your bitmap in WAP-conform .wbmp format.
3021     @param src_html Your bitmap in .gif, .jpg or any other HTML compatible format.
3022     @param alt Alternative text for your bitmap. Will be displayed if the client can
3023     display none of your graphic formats.
3024     @param src_bmp (optional)<br>your bitmap in monochrome .bmp format. If the
3025     browser signals in the HTTP request header, that he's only able to display
3026     image/bmp and not image/vnd.wap.wbmp (e.g. the UPSim 3.2 did so), this image
3027     will be sent.
3028     */
3029     function HAW_image($src_wbmp, $src_html, $alt, $src_bmp="")
3030     {
3031     $this->src_wbmp = $src_wbmp;
3032     $this->src_html = $src_html;
3033     $this->alt = $alt;
3034     $this->src_bmp = $src_bmp;
3035     $this->br = 0; // default: no line break after image
3036     $this->localsrc = ""; // no localsrc attribute
3037     $this->chtml_icon = 0; // no cHTML icon
3038     $this->mml_icon = 0; // no MML icon
3039     $this->voice_text = "";
3040     $this->voice_audio_src = "";
3041     }
3042    
3043     /**
3044     Sets the number of line breaks (CRLF) after the image. (default: 0)
3045     @param br Some number of line breaks.
3046     */
3047     function set_br($br)
3048     {
3049     if (!is_int($br) || ($br < 0))
3050     die("invalid argument in set_br()");
3051    
3052     $this->br = $br;
3053     }
3054    
3055     /**
3056     Use localsrc attribute on WAP/HDML devices. <br>
3057     Using built-in icons, mobile devices don't have to download
3058     bitmap images. If the device can not render the specified icon,
3059     it will download the according bitmap as specified in the HAW_image
3060     constructor.
3061     @param icon Device-internal representation of the image, e.g. "heart".
3062     */
3063     function use_localsrc($icon)
3064     {
3065     if (!is_string($icon))
3066     die("invalid argument in use_localsrc()");
3067    
3068     $this->localsrc = $icon;
3069     }
3070    
3071     /**
3072     Use cHTML icon instead of HTML bitmap on i-mode devices. <br>
3073     Using built-in icons, mobile devices don't have to download
3074     bitmap images. Has no effect on non-i-mode devices.
3075     @param icon cHTML icon code, e.g. 63889 for the "heart" icon.
3076     */
3077     function use_chtml_icon($icon)
3078     {
3079     if (!is_int($icon) || ($icon < 1))
3080     die("invalid argument in use_chtml_icon()");
3081    
3082     $this->chtml_icon = $icon;
3083     }
3084    
3085     /**
3086     Use MML icon instead of HTML bitmap on MML devices. <br>
3087     Using built-in icons, mobile devices don't have to download
3088     bitmap images. Has no effect on non-MML devices.
3089     @param icon MML icon code, e.g. "GB" for the "heart" icon.
3090     */
3091     function use_mml_icon($icon)
3092     {
3093     if (!is_string($icon) || (strlen($icon) != 2))
3094     die("invalid argument in use_mml_icon()");
3095    
3096     $this->mml_icon = $icon;
3097     }
3098    
3099     /**
3100     Sets text to be spoken by voice browsers. <br>
3101     @param text Some text that represents the image for voice users.
3102     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
3103     */
3104     function set_voice_text($text, $audio_src="")
3105     {
3106     if (!is_string($text))
3107     die("invalid argument in set_voice_text()");
3108    
3109     $this->voice_text = $text;
3110     $this->voice_audio_src = $audio_src;
3111     }
3112    
3113     function get_elementtype()
3114     {
3115     return HAW_IMAGE;
3116     }
3117    
3118     function create(&$deck)
3119     {
3120     if (isset($_SERVER['HTTP_ACCEPT']))
3121     $HTTP_ACCEPT = $_SERVER['HTTP_ACCEPT'];
3122     else
3123     $HTTP_ACCEPT = "";
3124    
3125     if ($deck->ml == HAW_HDML)
3126     {
3127     // HDML
3128    
3129     $deck->hdmlcardset->add_display_content("<" . $deck->alignment . ">\n");
3130    
3131     if ($this->localsrc)
3132     $icon = sprintf(" icon=\"%s\"", $this->localsrc);
3133     else
3134     $icon = "";
3135    
3136     $content = sprintf("<img src=\"%s\" alt=\"%s\"%s>\n",
3137     $this->src_bmp,
3138     HAW_specchar($this->alt, $deck), $icon);
3139    
3140     $deck->hdmlcardset->add_display_content($content);
3141    
3142     // create required amount of carriage return's
3143     $br = "";
3144     for ($i=0; $i < $this->br; $i++)
3145     $br .= "<br>\n";
3146    
3147     $deck->hdmlcardset->add_display_content($br);
3148     }
3149     elseif (($deck->ml == HAW_HTML) || ($deck->ml == HAW_WML))
3150     {
3151     // HTML or WML
3152    
3153     if ($deck->ml == HAW_HTML)
3154     {
3155     // HTML
3156    
3157     if ($deck->iModestyle && $this->chtml_icon)
3158     {
3159     // cHTML icon available ==> use this icon instead of bitmap
3160     printf("&#%d;", $this->chtml_icon);
3161     }
3162     elseif ($deck->MMLstyle && $this->mml_icon)
3163     {
3164     // MML icon available ==> use this icon instead of bitmap
3165     echo CHR(27) . "$" . $this->mml_icon . CHR(15);
3166     }
3167     else
3168     {
3169     // use HTML bitmap
3170    
3171     printf("<img src=\"%s\" alt=\"%s\" />\n",
3172     $this->src_html, HAW_specchar($this->alt, $deck));
3173     }
3174    
3175     // evaluate HTML break instruction
3176     if ($deck->MMLstyle)
3177     $br_command = "<br>\n"; // MML has problems with clear attribute
3178     elseif ($deck->xhtml)
3179     $br_command = "<br style=\"clear:both;\" />\n"; // XHTML does not know clear attribute
3180     else
3181     $br_command = "<br clear=\"all\" />\n";
3182     }
3183     else
3184     {
3185     // WML
3186    
3187     if ($this->localsrc)
3188     $localsrc = sprintf(" localsrc=\"%s\"", $this->localsrc);
3189     else
3190     $localsrc = "";
3191    
3192     if ($deck->gif_enabled && (substr(strtolower($this->src_html), -4) == ".gif"))
3193     // user agent is able to display the provided GIF image
3194     printf("<img src=\"%s\" alt=\"%s\"%s/>\n", $this->src_html,
3195     HAW_specchar($this->alt, $deck), $localsrc);
3196    
3197     elseif (strstr(strtolower($HTTP_ACCEPT), "image/vnd.wap.wbmp"))
3198     // user agent is able to display .wbmp image
3199     printf("<img src=\"%s\" alt=\"%s\"%s/>\n", $this->src_wbmp,
3200     HAW_specchar($this->alt, $deck), $localsrc);
3201    
3202     elseif (strstr(strtolower($HTTP_ACCEPT), "image/bmp") && $this->src_bmp)
3203     // user agent is able to display .bmp and .bmp image is available
3204     printf("<img src=\"%s\" alt=\"%s\"%s/>\n", $this->src_bmp,
3205     HAW_specchar($this->alt, $deck), $localsrc);
3206    
3207     else
3208     // hope that the user agent makes the best of it!
3209     printf("<img src=\"%s\" alt=\"%s\"%s/>\n", $this->src_wbmp,
3210     HAW_specchar($this->alt, $deck), $localsrc);
3211    
3212     // break instruction in WML
3213     $br_command = "<br/>\n";
3214     }
3215    
3216     // create required amount of carriage return's
3217     for ($i=0; $i < $this->br; $i++)
3218     echo $br_command;
3219     }
3220     elseif ($deck->ml == HAW_VXML)
3221     {
3222     // VoiceXML
3223    
3224     if ($this->voice_text || $this->voice_audio_src)
3225     {
3226     // create image-related audio output for VoiceXML images
3227    
3228     echo "<block><prompt>";
3229    
3230     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
3231     $this->voice_audio_src, HAW_VOICE_PAUSE, $deck);
3232    
3233     echo "</prompt></block>\n";
3234     }
3235     }
3236     }
3237     };
3238    
3239    
3240    
3241    
3242    
3243    
3244     /**
3245     This class allows to insert tables into a HAW_deck or HAW_form object.
3246     <p>Note: Not all WAP clients are able to display tables properly! HDML is not
3247     supporting tables at all. For HDML users the table's content will be generated
3248     column-by-column, respectively row-by-row, where each table cell will result in
3249     one separate line on the display.
3250     <p><b>Examples:</b><p>
3251     ...<br>
3252     $myTable = new HAW_table();<br>
3253     $row1 = new HAW_row();<br>
3254     $row1->add_column($image1);<br>
3255     $row1->add_column($text1);<br>
3256     $myTable->add_row($row1);<br>
3257     $row2 = new HAW_row();<br>
3258     $row2->add_column($image2);<br>
3259     $row2->add_column($text2);<br>
3260     $myTable->add_row($row2);<br>
3261     $myDeck->add_table($myTable);<br>
3262     ...
3263     @see HAW_deck
3264     @see HAW_form
3265     @see HAW_row
3266     */
3267     class HAW_table
3268     {
3269     var $row;
3270     var $number_of_rows;
3271     var $voice_text;
3272     var $voice_audio_src;
3273    
3274     /**
3275     Constructor
3276     */
3277     function HAW_table()
3278     {
3279     $this->number_of_rows = 0;
3280     $this->voice_text = "";
3281     $this->voice_audio_src = "";
3282     }
3283    
3284    
3285     /**
3286     Adds a HAW_row object to HAW_table.
3287     @param row Some HAW_row object.
3288     */
3289     function add_row($row)
3290     {
3291     if (!is_object($row))
3292     die("invalid argument in add_row()");
3293    
3294     $this->row[$this->number_of_rows] = $row;
3295    
3296     $this->number_of_rows++;
3297     }
3298    
3299     /**
3300     Sets text to be spoken by voice browsers. <br>
3301     Note: Tables should be avoided whenever voice users are targeted.
3302     Anyway, the HAWHAW API allows to assign voice output to HAW_table objects in order
3303     to say some introducing words before the table content is spoken.
3304     @param text Some helpful text.
3305     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
3306     */
3307     function set_voice_text($text, $audio_src="")
3308     {
3309     if (!is_string($text))
3310     die("invalid argument in set_voice_text()");
3311    
3312     $this->voice_text = $text;
3313     $this->voice_audio_src = $audio_src;
3314     }
3315    
3316     function get_elementtype()
3317     {
3318     return HAW_TABLE;
3319     }
3320    
3321     function create(&$deck)
3322     {
3323     // HDML does not support tables ==> skip all table tags for HDML
3324    
3325     if ($deck->ml == HAW_HTML)
3326     {
3327     // HTML
3328     if ($deck->xhtml)
3329     // border attribute is not allowed in XHTML
3330     echo "<table style=\"border-width:1px; border-style:solid;\">\n";
3331     else
3332     printf("<table border=\"1\" align=\"%s\">\n", $deck->alignment);
3333     }
3334     elseif ($deck->ml == HAW_WML)
3335     {
3336     // WML
3337    
3338     // evaluate maximum number of columns in table
3339    
3340     $max_columns = 0;
3341     for ($i = 0; $i < $this->number_of_rows; $i++)
3342     {
3343     $row = $this->row[$i];
3344     $columns = $row->get_number_of_columns();
3345    
3346     if ($columns > $max_columns)
3347     $max_columns = $columns;
3348     }
3349    
3350     printf("<table columns=\"%d\">\n", $max_columns);
3351     }
3352     elseif ($deck->ml == HAW_VXML)
3353     {
3354     if ($this->voice_text || $this->voice_audio_src)
3355     {
3356     // create introducing audio output for VoiceXML table
3357    
3358     echo "<block><prompt>";
3359    
3360     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
3361     $this->voice_audio_src, HAW_VOICE_PAUSE, $deck);
3362    
3363     echo "</prompt></block>\n";
3364     }
3365     }
3366    
3367     for ($i = 0; $i < $this->number_of_rows; $i++)
3368     {
3369     $row = $this->row[$i];
3370     $row->create($deck);
3371     }
3372    
3373     //terminate table
3374     if ($deck->ml == HAW_HTML)
3375     {
3376     // make new line in HTML
3377     if ($deck->MMLstyle)
3378     echo "</table><br>\n"; // MML has problems with clear attribute
3379     elseif ($deck->xhtml)
3380     echo "</table><br style=\"clear:both;\" />\n"; // XHTML does not know clear attribute
3381     else
3382     echo "</table><br clear=\"all\" />\n";
3383     }
3384     elseif ($deck->ml == HAW_WML)
3385     {
3386     // make new line in WML
3387     echo "</table><br/>\n";
3388     }
3389     }
3390     };
3391    
3392    
3393    
3394    
3395    
3396    
3397     /**
3398     This class defines the rows, a HAW_table object consists of.
3399     <p><b>Examples:</b><p>
3400     ...<br>
3401     $image1 = new HAW_image("my_image.wbmp", "my_image.gif", ":-)");<br>
3402     $text1 = new HAW_text("my text");<br>
3403     $row1 = new HAW_row();<br>
3404     $row1->add_column($image1);<br>
3405     $row1->add_column();<br>
3406     $row1->add_column($text1);<br>
3407     ...
3408     @see HAW_table
3409     @see HAW_text
3410     @see HAW_image
3411     @see HAW_link
3412     */
3413     class HAW_row
3414     {
3415     var $column;
3416     var $number_of_columns;
3417    
3418     /**
3419     Constructor
3420     */
3421     function HAW_row()
3422     {
3423     $this->number_of_columns = 0;
3424     }
3425    
3426    
3427     /**
3428     Adds a cell element to a HAW_row object.
3429     @param cell_element (optional)<br>Can be a HAW_text object, a HAW_image object,
3430     a HAW_link object or the NULL pointer (default).
3431     The latter results in an empty cell element.
3432     */
3433     function add_column($cell_element=NULL)
3434     {
3435     $this->column[$this->number_of_columns] = $cell_element;
3436    
3437     if (is_object($cell_element))
3438     {
3439     if (($cell_element->get_elementtype() != HAW_PLAINTEXT) &&
3440     ($cell_element->get_elementtype() != HAW_IMAGE) &&
3441     ($cell_element->get_elementtype() != HAW_LINK))
3442     die("invalid argument in add_column()");
3443     }
3444    
3445     $this->number_of_columns++;
3446     }
3447    
3448     function get_number_of_columns()
3449     {
3450     return $this->number_of_columns;
3451     }
3452    
3453     function create(&$deck)
3454     {
3455     // HDML and VXML do not support tables ==> skip all table tags for HDML and VXML
3456    
3457     if (($deck->ml != HAW_HDML) && ($deck->ml != HAW_VXML))
3458     echo "<tr>\n"; // start of row
3459    
3460     for ($i = 0; $i < $this->number_of_columns; $i++)
3461     {
3462     if (($deck->ml != HAW_HDML) && ($deck->ml != HAW_VXML))
3463     echo "<td>\n"; // start of column
3464    
3465     // call create function for each cellelement that is a HAWHAW object
3466     $column = $this->column[$i];
3467     if (is_object($column))
3468     $column->create($deck);
3469    
3470     if (($deck->ml != HAW_HDML) && ($deck->ml != HAW_VXML))
3471     echo "</td>\n"; // end of column
3472     }
3473    
3474     if (($deck->ml != HAW_HDML) && ($deck->ml != HAW_VXML))
3475     echo "</tr>\n"; // end of row
3476     }
3477     };
3478    
3479    
3480    
3481    
3482    
3483    
3484     /**
3485     This class provides a text input field in a HAW_form object.
3486     <p><b>Examples:</b><p>
3487     $myInput1 = new HAW_input("cid", "", "Customer ID");<br>
3488     <br>
3489     $myInput2 = new HAW_input("cid", "", "Customer ID", "*N");<br>
3490     $myInput2->set_size(6);<br>
3491     $myInput2->set_maxlength(6);<br>
3492     <br>
3493     $myInput3 = new HAW_input("pw", "", "Password", "*N");<br>
3494     $myInput3->set_size(8);<br>
3495     $myInput3->set_maxlength(8);<br>
3496     $myInput3->set_type(HAW_INPUT_PASSWORD);<br>
3497     @see HAW_form
3498     */
3499     class HAW_input
3500     {
3501     var $name;
3502     var $value;
3503     var $label;
3504     var $size;
3505     var $maxlength;
3506     var $type;
3507     var $format;
3508     var $mode;
3509     var $br;
3510     var $voice_text;
3511     var $voice_audio_src;
3512     var $voice_type;
3513     var $voice_grammar;
3514     var $voice_help;
3515     var $voice_noinput;
3516     var $voice_nomatch;
3517    
3518     /**
3519     Constructor
3520     @param name Variable in which the input is sent to the destination URL.
3521     @param value Initial value (string!) that will be presented in the input field.
3522     @param label Describes your input field on the surfer's screen/display.
3523     @param format (optional, default: "*M")<br>
3524     Input format code according to the WAP standard.
3525     Allows the WAP user client e.g. to input only digits and no characters.
3526     */
3527     function HAW_input($name, $value, $label, $format="*M")
3528     {
3529     $this->name = $name;
3530     $this->value = $value;
3531     $this->label = $label;
3532     $this->format = $format;
3533     $this->type = HAW_INPUT_TEXT;
3534     $this->mode = HAW_INPUT_ALPHABET;
3535     $this->br = 1;
3536     $this->voice_text = $label;
3537     $this->voice_audio_src = "";
3538     $this->voice_type = "digits";
3539     $this->voice_grammar = "";
3540     $this->voice_help = array();
3541     $this->voice_noinput = array();
3542     $this->voice_nomatch = array();
3543     }
3544    
3545     /**
3546     Set size of the input field. <br>
3547     Note: Will be ignored in case of HDML/VoiceXML output.
3548     @param size Number of characters fitting into the input field.
3549     */
3550     function set_size($size)
3551     {
3552     $this->size = $size;
3553     }
3554    
3555     /**
3556     Set maximum of allowed characters in the input field. <br>
3557     Note: Will be ignored in case of HDML output.
3558     @param maxlength Maximum number of characters the user can enter.
3559     */
3560     function set_maxlength($maxlength)
3561     {
3562     $this->maxlength = $maxlength;
3563     }
3564    
3565     /**
3566     Set input type
3567     @param type Allowed values: HAW_INPUT_TEXT (default) or HAW_INPUT_PASSWORD.
3568     */
3569     function set_type($type)
3570     {
3571     $this->type = $type;
3572     }
3573    
3574     /**
3575     Set input mode/istyle for japanese MML/i-mode devices
3576     @param mode input mode<br>
3577     HAW_INPUT_ALPHABET (default)<br>
3578     HAW_INPUT_KATAKANA<br>
3579     HAW_INPUT_HIRAGANA<br>
3580     HAW_INPUT_NUMERIC
3581     */
3582     function set_mode($mode)
3583     {
3584     $this->mode = $mode;
3585    
3586     // input mode can be mapped into a format string, used from WML and HDML
3587     // ==> set format string
3588     // (if a format string was provided during object initiation, this value
3589     // will be overwritten)
3590    
3591     switch ($mode)
3592     {
3593     case HAW_INPUT_HIRAGANA: { $this->format = "*M"; break; }
3594     case HAW_INPUT_KATAKANA: { $this->format = "*M"; break; }
3595     case HAW_INPUT_ALPHABET: { $this->format = "*m"; break; }
3596     case HAW_INPUT_NUMERIC: { $this->format = "*N"; break; }
3597     }
3598     }
3599    
3600     /**
3601     Sets the number of line breaks (CRLF) after input field (default: 1). <br>
3602     Note: Has no effect in WML/HDML.
3603     @param br Some number of line breaks.
3604     */
3605     function set_br($br)
3606     {
3607     if (!is_int($br) || ($br < 0))
3608     die("invalid argument in set_br()");
3609    
3610     $this->br = $br;
3611     }
3612    
3613     /**
3614     Sets text to be spoken by voice browsers. <br>
3615     @param text Some alternative text that replaces &lt;label&gt;.
3616     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
3617     */
3618     function set_voice_text($text, $audio_src="")
3619     {
3620     if (!is_string($text))
3621     die("invalid argument in set_voice_text()");
3622    
3623     $this->voice_text = $text;
3624     $this->voice_audio_src = $audio_src;
3625     }
3626    
3627     /**
3628     Sets the type of the input field in voice decks (default: "digits"). <br>
3629     Note: Support of builtin grammar types is platform specific.
3630     The W3C VoiceXML Version 2.0 recommendation defines these grammar types:
3631     <ul>
3632     <li>boolean</li>
3633     <li>date</li>
3634     <li>digits (default)</li>
3635     <li>currency</li>
3636     <li>number</li>
3637     <li>phone</li>
3638     <li>time</li>
3639     </ul>
3640     @param type String with grammar type.
3641     */
3642     function set_voice_type($type)
3643     {
3644     if (!is_string($type))
3645     die("invalid argument in set_voice_type()");
3646    
3647     $this->voice_type = $type;
3648     }
3649    
3650     /**
3651     Defines an external grammar for an input field in voice decks. <br>
3652     Attention: This function should be used by experienced VoiceXML developers
3653     only! Please refer to the W3C VoiceXML Recommendation for detailled info
3654     about grammar definitions.
3655     @param src URL specifying the location of the grammar, e.g. "http://www.foo.com/myinput.grxml".
3656     @param type Media type of the grammar, e.g. "application/srgs+xml (optional)".
3657     */
3658     function set_voice_grammar($src, $type="")
3659     {
3660     if (!is_string($src))
3661     die("invalid argument in set_voice_grammar()");
3662    
3663     $this->voice_grammar["src"] = $src;
3664     $this->voice_grammar["type"] = $type;
3665    
3666     $this->voice_type = ""; // external grammar overrides builtin grammar
3667     }
3668    
3669     /**
3670     Sets help text for voice browsers. <br>
3671     @param text Some helpful information concerning this input.
3672     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
3673     @param url Some other voice deck to go to (optional).
3674     */
3675     function set_voice_help($text, $audio_src="", $url="")
3676     {
3677     if (!is_string($text))
3678     die("invalid argument in set_voice_help()");
3679    
3680     $arr["text"] = $text;
3681     $arr["src"] = $audio_src;
3682     $arr["url"] = $url;
3683    
3684     $this->voice_help[] = $arr;
3685     }
3686    
3687     /**
3688     Sets noinput text for voice browsers. <br>
3689     @param text Some text to inform the user that no input has been received.
3690     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
3691     @param url Some other voice deck to go to (optional).
3692     */
3693     function set_voice_noinput($text, $audio_src="", $url="")
3694     {
3695     if (!is_string($text))
3696     die("invalid argument in set_voice_noinput()");
3697    
3698     $arr["text"] = $text;
3699     $arr["src"] = $audio_src;
3700     $arr["url"] = $url;
3701    
3702     $this->voice_noinput[] = $arr;
3703     }
3704    
3705     /**
3706     Sets nomatch text for voice browsers. <br>
3707     @param text Some text to complain that user input was not recognized.
3708     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
3709     @param url Some other voice deck to go to (optional).
3710     */
3711     function set_voice_nomatch($text, $audio_src="", $url="")
3712     {
3713     if (!is_string($text))
3714     die("invalid argument in set_voice_nomatch()");
3715    
3716     $arr["text"] = $text;
3717     $arr["src"] = $audio_src;
3718     $arr["url"] = $url;
3719    
3720     $this->voice_nomatch[] = $arr;
3721     }
3722    
3723     function get_name()
3724     {
3725     return $this->name;
3726     }
3727    
3728     function get_value()
3729     {
3730     return $this->value;
3731     }
3732    
3733     function get_label()
3734     {
3735     return $this->label;
3736     }
3737    
3738     function get_size()
3739     {
3740     return $this->size;
3741     }
3742    
3743     function get_maxlength()
3744     {
3745     return $this->maxlength;
3746     }
3747    
3748     function get_type()
3749     {
3750     return $this->type;
3751     }
3752    
3753     function get_mode()
3754     {
3755     return $this->mode;
3756     }
3757    
3758     function get_format()
3759     {
3760     return $this->format;
3761     }
3762    
3763     function get_elementtype()
3764     {
3765     return HAW_INPUT;
3766     }
3767    
3768     function create(&$deck)
3769     {
3770     if ($this->type == HAW_INPUT_PASSWORD)
3771     $type = "type=\"password\"";
3772     else
3773     $type = "type=\"text\"";
3774    
3775     if ($this->size)
3776     $size = sprintf("size=\"%d\"", $this->size);
3777     else
3778     $size = "";
3779    
3780     if ($this->maxlength)
3781     $maxlength = sprintf("maxlength=\"%d\"", $this->maxlength);
3782     else
3783     $maxlength = "";
3784    
3785     if ($deck->ml == HAW_HTML)
3786     {
3787     if ($deck->iModestyle)
3788     $mode = sprintf(" istyle=\"%d\"", $this->mode);
3789     else
3790     $mode = "";
3791    
3792     if ($deck->MMLstyle)
3793     {
3794     switch ($this->mode)
3795     {
3796     case HAW_INPUT_ALPHABET: { $mode = " mode=\"alphabet\""; break; }
3797     case HAW_INPUT_KATAKANA: { $mode = " mode=\"katakana\""; break; }
3798     case HAW_INPUT_HIRAGANA: { $mode = " mode=\"hiragana\""; break; }
3799     case HAW_INPUT_NUMERIC: { $mode = " mode=\"numeric\""; break; }
3800     default: { $mode = " mode=\"alphabet\""; break; }
3801     }
3802     }
3803    
3804     // create HTML input
3805     if ($deck->xhtml || $deck->pureHTML)
3806     {
3807     printf("<label for=\"%s\">%s</label>\n",
3808     $this->name, HAW_specchar($this->label, $deck));
3809     printf("<input %s name=\"%s\" id=\"%s\" value=\"%s\" %s %s%s /> ",
3810     $type, $this->name,
3811     $this->name, $this->value, $size, $maxlength, $mode);
3812     }
3813     else
3814     printf("%s <input %s name=\"%s\" value=\"%s\" %s %s%s /> ",
3815     HAW_specchar($this->label, $deck), $type,
3816     $this->name, $this->value, $size, $maxlength, $mode);
3817    
3818     for ($i=0; $i < $this->br; $i++)
3819     echo "<br />\n";
3820     }
3821     elseif ($deck->ml == HAW_WML)
3822     {
3823     // create WML input
3824     printf("%s<input emptyok=\"true\" format=\"%s\" %s name=\"%s\" value=\"%s\" %s %s/>\n",
3825     HAW_specchar($this->label, $deck), $this->format,
3826     $type, $this->name, $this->value, $size, $maxlength);
3827     }
3828     elseif ($deck->ml == HAW_HDML)
3829     {
3830     // create HDML input
3831    
3832     $options = " format=\"$this->format\"";
3833     $options .= " key=\"$this->name\"";
3834    
3835     if ($this->type == HAW_INPUT_PASSWORD)
3836     $options .= " NOECHO=\"true\"";
3837    
3838     $display_content = "<" . $deck->alignment . ">\n";
3839    
3840     $display_content .= HAW_specchar($this->label, $deck);
3841     $display_content .= "\n";
3842    
3843     // make user interactive entry card
3844     $deck->hdmlcardset->make_ui_card($options, $display_content, HAW_HDML_ENTRY);
3845     }
3846     elseif ($deck->ml == HAW_VXML)
3847     {
3848     // create VoiceXML input
3849    
3850     if ($this->voice_type)
3851     {
3852     if (($this->voice_type == "digits") && $this->maxlength)
3853     $type = sprintf(" type=\"digits?maxlength=%d\"", $this->maxlength);
3854     else
3855     $type = sprintf(" type=\"%s\"", $this->voice_type);
3856     }
3857     else
3858     $type = "";
3859    
3860     printf("<field%s name=\"%s\">\n", $type, $this->name);
3861    
3862     if ($this->voice_grammar)
3863     {
3864     // external grammar has been defined
3865    
3866     if ($this->voice_grammar["type"])
3867     $grammar_type = sprintf(" type=\"%s\"", $this->voice_grammar["type"]);
3868     else
3869     $grammar_type = ""; // let the interpreter context determine the grammar type
3870    
3871     printf("<grammar src=\"%s\"%s/>\n",
3872     $this->voice_grammar["src"], $grammar_type);
3873     }
3874    
3875     if ($this->voice_text || $this->voice_audio_src)
3876     {
3877     echo "<prompt>";
3878    
3879     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
3880     $this->voice_audio_src, 0, $deck);
3881    
3882     echo "</prompt>\n";
3883     }
3884    
3885     // create event handlers
3886     HAW_voice_eventhandler("help", $this->voice_help, $deck);
3887     HAW_voice_eventhandler("noinput", $this->voice_noinput, $deck);
3888     HAW_voice_eventhandler("nomatch", $this->voice_nomatch, $deck);
3889    
3890     echo "</field>\n";
3891     }
3892     }
3893     };
3894    
3895    
3896    
3897    
3898    
3899    
3900     /**
3901     This class provides a input textarea in a HAW_form object.<br>
3902     Note: Creates no output for VoiceXML. Voice applications can use class
3903     HAW_voicerecorder instead.
3904     <p><b>Examples:</b><p>
3905     $myArea1 = new HAW_textarea("fb", "", "Feedback");<br>
3906     <br>
3907     $myArea2 = new HAW_textarea("msg", "Enter message here ...", "Message", 40 , 5);<br>
3908     $myArea2->set_br(2);<br>
3909     @see HAW_form
3910     @see HAW_voicerecorder
3911     */
3912     class HAW_textarea
3913     {
3914     var $name;
3915     var $value;
3916     var $label;
3917     var $rows;
3918     var $cols;
3919     var $mode;
3920     var $br;
3921    
3922     /**
3923     Constructor
3924     @param name Variable in which the input is sent to the destination URL.
3925     @param value Initial value (string!) that will be presented in the textarea.
3926     @param label Describes your textarea on the surfer's screen/display.
3927     @param rows Rows (optional, default: 3)
3928     @param cols Columns (optional, default: 16)
3929     */
3930     function HAW_textarea($name, $value, $label, $rows=3, $cols=16)
3931     {
3932     $this->name = $name;
3933     $this->value = $value;
3934     $this->label = $label;
3935     $this->rows = $rows;
3936     $this->cols = $cols;
3937     $this->mode = HAW_INPUT_ALPHABET;
3938     $this->br = 1;
3939     }
3940    
3941    
3942     /**
3943     Set input mode/istyle for japanese MML/i-mode devices
3944     @param mode input mode<br>
3945     HAW_INPUT_ALPHABET (default)<br>
3946     HAW_INPUT_KATAKANA<br>
3947     HAW_INPUT_HIRAGANA<br>
3948     HAW_INPUT_NUMERIC
3949     */
3950     function set_mode($mode)
3951     {
3952     $this->mode = $mode;
3953     }
3954    
3955     /**
3956     Sets the number of line breaks (CRLF) after textarea. (default: 1)<br>
3957     Note: Has no effect in WML/HDML.
3958     @param br Some number of line breaks.
3959     */
3960     function set_br($br)
3961     {
3962     if (!is_int($br) || ($br < 0))
3963     die("invalid argument in set_br()");
3964    
3965     $this->br = $br;
3966     }
3967    
3968     function get_name()
3969     {
3970     return $this->name;
3971     }
3972    
3973     function get_value()
3974     {
3975     return $this->value;
3976     }
3977    
3978     function get_label()
3979     {
3980     return $this->label;
3981     }
3982    
3983     function get_mode()
3984     {
3985     return $this->mode;
3986     }
3987    
3988     function get_elementtype()
3989     {
3990     return HAW_TEXTAREA;
3991     }
3992    
3993     function create(&$deck)
3994     {
3995     if ($deck->ml == HAW_HTML)
3996     {
3997     if ($deck->iModestyle)
3998     $mode = sprintf(" istyle=\"%d\"", $this->mode);
3999    
4000     if ($deck->MMLstyle)
4001     {
4002     switch ($this->mode)
4003     {
4004     case HAW_INPUT_ALPHABET: { $mode = " mode=\"alphabet\""; break; }
4005     case HAW_INPUT_KATAKANA: { $mode = " mode=\"katakana\""; break; }
4006     case HAW_INPUT_HIRAGANA: { $mode = " mode=\"hiragana\""; break; }
4007     case HAW_INPUT_NUMERIC: { $mode = " mode=\"numeric\""; break; }
4008     default: { $mode = " mode=\"alphabet\""; break; }
4009     }
4010     }
4011    
4012     if (!$deck->iModestyle && !$deck->MMLstyle)
4013     $wrap = sprintf(" wrap=\"virtual\"");
4014    
4015     // create HTML input
4016     printf("%s<br /><textarea name=\"%s\" rows=\"%s\" cols=\"%s\"%s%s>%s</textarea> ",
4017     HAW_specchar($this->label, $deck), $this->name, $this->rows,
4018     $this->cols, $mode, $wrap, $this->value);
4019    
4020     for ($i=0; $i < $this->br; $i++)
4021     echo "<br />\n";
4022     }
4023     elseif ($deck->ml == HAW_WML)
4024     {
4025     // create WML input
4026     printf("%s<input emptyok=\"true\" name=\"%s\" value=\"%s\"/>\n",
4027     HAW_specchar($this->label, $deck),
4028     $this->name, $this->value);
4029     }
4030     elseif ($deck->ml == HAW_HDML)
4031     {
4032     // create HDML input
4033    
4034     $options = " key=\"$this->name\"";
4035    
4036     $display_content = "<" . $deck->alignment . ">\n";
4037    
4038     $display_content .= HAW_specchar($this->label, $deck);
4039     $display_content .= "\n";
4040    
4041     // make user interactive entry card
4042     $deck->hdmlcardset->make_ui_card($options, $display_content, HAW_HDML_ENTRY);
4043     }
4044     elseif ($deck->ml == HAW_VXML)
4045     {
4046     // no output for VoiceXML possible
4047     }
4048     }
4049     };
4050    
4051    
4052    
4053    
4054    
4055    
4056     /**
4057     This class provides a select element in a HAW_form object.
4058     It allows to create optimized WML for WAP devices which
4059     are capable to interprete the Openwave GUI extensions for WML 1.3. All other
4060     WAP devices receive WML 1.1 compatible markup code, which is quite similar to
4061     the markup code created by the HAW_radio class.
4062     <p><b>Examples:</b><p>
4063     $mySelect = new HAW_select("color");<br>
4064     $mySelect->add_option("Blue", "b");<br>
4065     $mySelect->add_option("Red", "r", HAW_SELECTED);<br>
4066     $mySelect->add_option("Yellow", "y");
4067     @see HAW_form
4068     */
4069     class HAW_select
4070     {
4071     var $name;
4072     var $type;
4073     var $value;
4074     var $options;
4075     var $number_of_options;
4076     var $voice_text;
4077     var $voice_audio_src;
4078     var $voice_help;
4079     var $voice_noinput;
4080     var $voice_nomatch;
4081    
4082    
4083     /**
4084     Constructor
4085     @param name Variable in which the information about the selected option is sent to
4086     the destination URL.
4087     @param type (optional)<br>
4088     Type of select area:<br>
4089     HAW_SELECT_POPUP: popup the whole selection list (default)<br>
4090     HAW_SELECT_SPIN: rotate options on a WAP device screen<br>
4091     */
4092     function HAW_select($name, $type=HAW_SELECT_POPUP)
4093     {
4094     $this->name = $name;
4095     $this->type = $type;
4096     $this->value = false;
4097     $this->number_of_options = 0;
4098     $this->voice_text = HAW_VOICE_ENUMERATE;
4099     $this->voice_audio_src = "";
4100     $this->voice_help = array();
4101     $this->voice_noinput = array();
4102     $this->voice_nomatch = array();
4103     }
4104    
4105     /**
4106     Adds one option to a HAW_select object.
4107     @param label Describes the option on the surfer's screen/display.
4108     @param value Value (string!) sent in the "name" variable, if this option is selected.
4109     @param is_selected (optional)<br>Allowed values are HAW_SELECTED or HAW_NOTSELECTED
4110     (default).<br>Note: Setting to "selected" will overwrite previous "selected"
4111     options of this HAW_select object.
4112     */
4113     function add_option($label, $value, $is_selected=HAW_NOTSELECTED)
4114     {
4115     if (!$label || !$value)
4116     die("invalid argument in add_option()");
4117    
4118     $this->options[$this->number_of_options]["label"] = $label;
4119     $this->options[$this->number_of_options]["value"] = $value;
4120    
4121     if (!$this->value || ($is_selected == HAW_SELECTED))
4122     $this->value = $value;
4123    
4124     $this->number_of_options++;
4125     }
4126    
4127     /**
4128     Sets text to be spoken by voice browsers. <br>
4129     @param text Some alternative text that replaces the enumeration of select options.
4130     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4131     */
4132     function set_voice_text($text, $audio_src="")
4133     {
4134     if (!is_string($text))
4135     die("invalid argument in set_voice_text()");
4136    
4137     $this->voice_text = $text;
4138     $this->voice_audio_src = $audio_src;
4139     }
4140    
4141     /**
4142     Sets help text for voice browsers. <br>
4143     @param text Some helpful information concerning this select element.
4144     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4145     @param url Some other voice deck to go to (optional).
4146     */
4147     function set_voice_help($text, $audio_src="", $url="")
4148     {
4149     if (!is_string($text))
4150     die("invalid argument in set_voice_help()");
4151    
4152     $arr["text"] = $text;
4153     $arr["src"] = $audio_src;
4154     $arr["url"] = $url;
4155    
4156     $this->voice_help[] = $arr;
4157     }
4158    
4159     /**
4160     Sets noinput text for voice browsers. <br>
4161     @param text Some text to inform the user that no input has been received.
4162     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4163     @param url Some other voice deck to go to (optional).
4164     */
4165     function set_voice_noinput($text, $audio_src="", $url="")
4166     {
4167     if (!is_string($text))
4168     die("invalid argument in set_voice_noinput()");
4169    
4170     $arr["text"] = $text;
4171     $arr["src"] = $audio_src;
4172     $arr["url"] = $url;
4173    
4174     $this->voice_noinput[] = $arr;
4175     }
4176    
4177     /**
4178     Sets nomatch text for voice browsers. <br>
4179     @param text Some text to complain that user input was not recognized.
4180     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4181     @param url Some other voice deck to go to (optional).
4182     */
4183     function set_voice_nomatch($text, $audio_src="", $url="")
4184     {
4185     if (!is_string($text))
4186     die("invalid argument in set_voice_nomatch()");
4187    
4188     $arr["text"] = $text;
4189     $arr["src"] = $audio_src;
4190     $arr["url"] = $url;
4191    
4192     $this->voice_nomatch[] = $arr;
4193     }
4194    
4195     function get_name()
4196     {
4197     return $this->name;
4198     }
4199    
4200     function get_value()
4201     {
4202     return $this->value;
4203     }
4204    
4205     function get_elementtype()
4206     {
4207     return HAW_SELECT;
4208     }
4209    
4210     function create(&$deck)
4211     {
4212     if ($deck->ml == HAW_HTML)
4213     {
4214     // create HTML select
4215    
4216     if ($deck->xhtml || $deck->pureHTML)
4217     {
4218     // dummy label for select element (needed for Bobby approval)
4219     // object to be enhanced in future versions ...
4220     printf("<label for=\"%s\">%s</label>\n", $this->name, " ");
4221     printf("<select name=\"%s\" id=\"%s\" size=\"1\">\n", $this->name, $this->name);
4222     }
4223     else
4224     printf("<select name=\"%s\" size=\"1\">\n", $this->name);
4225    
4226     for ($i=0; $i < $this->number_of_options; $i++)
4227     {
4228     if ($this->options[$i]["value"] == $this->value)
4229     $state = " selected=\"selected\"";
4230     else
4231     $state = "";
4232    
4233     echo "<option" . $state . " value=\"" . $this->options[$i]["value"] . "\">"
4234     . HAW_specchar($this->options[$i]["label"], $deck) . "</option>\n";
4235     }
4236    
4237     echo "</select>\n";
4238     }
4239     elseif ($deck->ml == HAW_WML)
4240     {
4241     // create WML select
4242    
4243     if ($deck->owgui_1_3)
4244     {
4245     // Openwave GUI extensions for WML 1.3
4246    
4247     switch ($this->type)
4248     {
4249     case HAW_SELECT_POPUP: { $type_option = "type=\"popup\""; break; }
4250     case HAW_SELECT_SPIN: { $type_option = "type=\"spin\""; break; }
4251     default: { $type_option = "type=\"popup\""; break; }
4252     }
4253    
4254     echo "<select " . $type_option . " name=\"" . $this->name . "\">\n";
4255     }
4256     else
4257     // conventional WML (similar as for HAW_radio)
4258     echo "<select name=\"" . $this->name . "\">\n";
4259    
4260     for ($i=0; $i < $this->number_of_options; $i++)
4261     {
4262     echo "<option value=\"" . $this->options[$i]["value"] . "\">"
4263     . HAW_specchar($this->options[$i]["label"], $deck) . "</option>\n";
4264     }
4265    
4266     echo "</select>\n";
4267     }
4268     elseif ($deck->ml == HAW_HDML)
4269     {
4270     // create HDML select (similar as for HAW_radio)
4271    
4272     $options = " key=\"$this->name\"";
4273     $ce_area = "";
4274    
4275     while (list($key, $val) = each($this->options))
4276     {
4277     // create one <ce> statement for each option
4278     $ce_area .= sprintf("<ce value=\"%s\">%s\n",
4279     $val["value"],
4280     HAW_specchar($val["label"], $deck));
4281     }
4282    
4283     // make user interactive choice card
4284     $deck->hdmlcardset->make_ui_card($options, $ce_area, HAW_HDML_CHOICE);
4285     }
4286     elseif ($deck->ml == HAW_VXML)
4287     {
4288     // create VoiceXML select
4289    
4290     printf("<field name=\"%s\">\n", $this->name);
4291    
4292     if ($this->voice_text || $this->voice_audio_src)
4293     {
4294     if ($this->voice_text != HAW_VOICE_ENUMERATE)
4295     {
4296     echo "<prompt>";
4297    
4298     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
4299     $this->voice_audio_src, 0, $deck);
4300    
4301     echo "</prompt>\n";
4302     }
4303     }
4304    
4305     while (list($key, $val) = each($this->options))
4306     {
4307     if ($key < 9)
4308     $dtmf = sprintf(" dtmf=\"%d\"", $key+1);
4309     else
4310     $dtmf = "";
4311    
4312     if ($deck->supportsVXMLBreakTag)
4313     $breakTag = sprintf("<break time=\"%dms\"/>", HAW_VOICE_PAUSE);
4314     else
4315     $breakTag = "";
4316    
4317     printf("<prompt>%s%s</prompt>\n", HAW_specchar($val["label"], $deck), $breakTag);
4318    
4319     printf("<option%s value=\"%s\">%s</option>\n", $dtmf, $val["value"],
4320     ereg_replace("[\?!]"," ",strtolower(HAW_specchar($val["label"], $deck))));
4321     }
4322    
4323     // create event handlers
4324     HAW_voice_eventhandler("help", $this->voice_help, $deck);
4325     HAW_voice_eventhandler("noinput", $this->voice_noinput, $deck);
4326     HAW_voice_eventhandler("nomatch", $this->voice_nomatch, $deck);
4327    
4328     echo "</field>\n";
4329     }
4330     }
4331     };
4332    
4333    
4334    
4335    
4336    
4337    
4338     /**
4339     This class provides a radio button element in a HAW_form object.
4340     <p><b>Examples:</b><p>
4341     $myRadio = new HAW_radio("country");<br>
4342     $myRadio->add_button("Finland", "F");<br>
4343     $myRadio->add_button("Germany", "G", HAW_CHECKED);<br>
4344     $myRadio->add_button("Sweden", "S");
4345     @see HAW_form
4346     */
4347     class HAW_radio
4348     {
4349     var $name;
4350     var $value;
4351     var $buttons;
4352     var $number_of_buttons;
4353     var $voice_text;
4354     var $voice_audio_src;
4355     var $voice_help;
4356     var $voice_noinput;
4357     var $voice_nomatch;
4358    
4359     /**
4360     Constructor
4361     @param name Variable in which the information about the pressed button is sent to
4362     the destination URL.
4363     */
4364     function HAW_radio($name)
4365     {
4366     $this->name = $name;
4367     $this->value = "";
4368     $this->number_of_buttons = 0;
4369     $this->voice_text = HAW_VOICE_ENUMERATE;
4370     $this->voice_audio_src = "";
4371     $this->voice_help = array();
4372     $this->voice_noinput = array();
4373     $this->voice_nomatch = array();
4374     }
4375    
4376     /**
4377     Adds one radio button to a HAW_radio object.
4378     @param label Describes the radiobutton on the surfer's screen/display.
4379     @param value Value (string!) sent in the "name" variable, if this button is selected.
4380     @param is_checked (optional)<br>Allowed values are HAW_CHECKED or HAW_NOTCHECKED
4381     (default).<br>Note: Setting to "checked" will overwrite previous "checked"
4382     radiobuttons of this HAW_radio object.
4383     */
4384     function add_button($label, $value, $is_checked=HAW_NOTCHECKED)
4385     {
4386     if (!$label || !$value)
4387     die("invalid argument in add_button()");
4388    
4389     $this->buttons[$this->number_of_buttons]["label"] = $label;
4390     $this->buttons[$this->number_of_buttons]["value"] = $value;
4391    
4392     if (!$this->value || ($is_checked == HAW_CHECKED))
4393     $this->value = $value;
4394    
4395     $this->number_of_buttons++;
4396     }
4397    
4398     /**
4399     Sets text to be spoken by voice browsers. <br>
4400     @param text Some alternative text that replaces the enumeration of buttons.
4401     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4402     */
4403     function set_voice_text($text, $audio_src="")
4404     {
4405     if (!is_string($text))
4406     die("invalid argument in set_voice_text()");
4407    
4408     $this->voice_text = $text;
4409     $this->voice_audio_src = $audio_src;
4410     }
4411    
4412     /**
4413     Sets help text for voice browsers. <br>
4414     @param text Some helpful information concerning this radio button element.
4415     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4416     @param url Some other voice deck to go to (optional).
4417     */
4418     function set_voice_help($text, $audio_src="", $url="")
4419     {
4420     if (!is_string($text))
4421     die("invalid argument in set_voice_help()");
4422    
4423     $arr["text"] = $text;
4424     $arr["src"] = $audio_src;
4425     $arr["url"] = $url;
4426    
4427     $this->voice_help[] = $arr;
4428     }
4429    
4430     /**
4431     Sets noinput text for voice browsers. <br>
4432     @param text Some text to inform the user that no input has been received.
4433     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4434     @param url Some other voice deck to go to (optional).
4435     */
4436     function set_voice_noinput($text, $audio_src="", $url="")
4437     {
4438     if (!is_string($text))
4439     die("invalid argument in set_voice_noinput()");
4440    
4441     $arr["text"] = $text;
4442     $arr["src"] = $audio_src;
4443     $arr["url"] = $url;
4444    
4445     $this->voice_noinput[] = $arr;
4446     }
4447    
4448     /**
4449     Sets nomatch text for voice browsers. <br>
4450     @param text Some text to complain that user input was not recognized.
4451     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4452     @param url Some other voice deck to go to (optional).
4453     */
4454     function set_voice_nomatch($text, $audio_src="", $url="")
4455     {
4456     if (!is_string($text))
4457     die("invalid argument in set_voice_nomatch()");
4458    
4459     $arr["text"] = $text;
4460     $arr["src"] = $audio_src;
4461     $arr["url"] = $url;
4462    
4463     $this->voice_nomatch[] = $arr;
4464     }
4465    
4466     function get_name()
4467     {
4468     return $this->name;
4469     }
4470    
4471     function get_value()
4472     {
4473     return $this->value;
4474     }
4475    
4476     function get_elementtype()
4477     {
4478     return HAW_RADIO;
4479     }
4480    
4481     function create(&$deck)
4482     {
4483     if ($deck->ml == HAW_HTML)
4484     {
4485     // create HTML radio
4486    
4487     while (list($key, $val) = each($this->buttons))
4488     {
4489     if ($val["value"] == $this->value)
4490     $state = "checked=\"checked\"";
4491     else
4492     $state = "";
4493    
4494     if ($deck->xhtml || $deck->pureHTML)
4495     {
4496     printf("<input type=\"radio\" name=\"%s\" id=\"%s\" %s value=\"%s\" />",
4497     $this->name, $this->name . $key, $state, $val["value"]);
4498    
4499     printf(" <label for=\"%s\">%s</label><br />\n",
4500     $this->name . $key, HAW_specchar($val["label"], $deck));
4501     }
4502     else
4503     printf("<input type=\"radio\" name=\"%s\" %s value=\"%s\" /> %s<br />\n",
4504     $this->name, $state, $val["value"],
4505     HAW_specchar($val["label"], $deck));
4506     }
4507     }
4508     elseif ($deck->ml == HAW_WML)
4509     {
4510     // create WML radio
4511    
4512     if ($deck->owgui_1_3)
4513     // Openwave GUI extensions for WML 1.3
4514     printf("<select type=\"radio\" name=\"%s\">\n", $this->name);
4515     else
4516     // conventional WML (similar as for HAW_select)
4517     printf("<select name=\"%s\">\n", $this->name);
4518    
4519     while (list($key, $val) = each($this->buttons))
4520     {
4521     printf("<option value=\"%s\">%s</option>\n",
4522     $val["value"], HAW_specchar($val["label"], $deck));
4523     }
4524    
4525     echo "</select>\n";
4526     }
4527     elseif ($deck->ml == HAW_HDML)
4528     {
4529     // create HDML radio (similar as for HAW_select)
4530    
4531     $options = " key=\"$this->name\"";
4532     $ce_area = "";
4533    
4534     while (list($key, $val) = each($this->buttons))
4535     {
4536     // create one <ce> statement for each button
4537     $ce_area .= sprintf("<ce value=\"%s\">%s\n",
4538     $val["value"],
4539     HAW_specchar($val["label"], $deck));
4540     }
4541    
4542     // make user interactive choice card
4543     $deck->hdmlcardset->make_ui_card($options, $ce_area, HAW_HDML_CHOICE);
4544     }
4545     elseif ($deck->ml == HAW_VXML)
4546     {
4547     // create VoiceXML radio
4548    
4549     printf("<field name=\"%s\">\n", $this->name);
4550    
4551     if ($this->voice_text || $this->voice_audio_src)
4552     {
4553     if ($this->voice_text != HAW_VOICE_ENUMERATE)
4554     {
4555     echo "<prompt>";
4556    
4557     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
4558     $this->voice_audio_src, 0, $deck);
4559    
4560     echo "</prompt>\n";
4561     }
4562     }
4563    
4564     while (list($key, $val) = each($this->buttons))
4565     {
4566     if ($key < 9)
4567     $dtmf = sprintf(" dtmf=\"%d\"", $key+1);
4568     else
4569     $dtmf = "";
4570    
4571     if ($deck->supportsVXMLBreakTag)
4572     $breakTag = sprintf("<break time=\"%dms\"/>", HAW_VOICE_PAUSE);
4573     else
4574     $breakTag = "";
4575    
4576     printf("<prompt>%s%s</prompt>\n", HAW_specchar($val["label"], $deck), $breakTag);
4577    
4578     printf("<option%s value=\"%s\">%s</option>\n", $dtmf, $val["value"],
4579     ereg_replace("[\?!]"," ",strtolower(HAW_specchar($val["label"], $deck))));
4580     }
4581    
4582     // create event handlers
4583     HAW_voice_eventhandler("help", $this->voice_help, $deck);
4584     HAW_voice_eventhandler("noinput", $this->voice_noinput, $deck);
4585     HAW_voice_eventhandler("nomatch", $this->voice_nomatch, $deck);
4586    
4587     echo "</field>\n";
4588     }
4589     }
4590     };
4591    
4592    
4593    
4594    
4595    
4596    
4597     /**
4598     This class provides a single checkbox element in a HAW_form object.
4599     <p><b>Examples:</b><p>
4600     $myCheckbox = new HAW_checkbox("agmt", "yes", "I agree");<br>
4601     $myCheckbox = new HAW_checkbox("agmt", "yes", "I agree", HAW_NOTCHECKED);<br>
4602     $myCheckbox = new HAW_checkbox("agmt", "yes", "I agree", HAW_CHECKED);<br>
4603     <br>
4604     Note: The first and the second example are identical.
4605     @see HAW_form
4606     */
4607     class HAW_checkbox
4608     {
4609     var $name;
4610     var $value;
4611     var $state;
4612     var $voice_text;
4613     var $voice_audio_src;
4614     var $voice_help;
4615     var $voice_noinput;
4616     var $voice_nomatch;
4617    
4618     /**
4619     Constructor
4620     @param name Variable in which "value" is sent to the destination URL, in case that
4621     the box is checked.
4622     @param value See name.
4623     @param label Describes the checkbox on the surfer's screen/display.
4624     @param state (optional)<br>Allowed values are HAW_CHECKED or HAW_NOTCHECKED
4625     (default).
4626     */
4627     function HAW_checkbox($name, $value, $label, $state=HAW_NOTCHECKED)
4628     {
4629     $this->name = $name;
4630     $this->value = $value;
4631     $this->label = $label;
4632     $this->state = $state;
4633     $this->voice_text = $label;
4634     $this->voice_audio_src = "";
4635     $this->voice_help = array();
4636     $this->voice_noinput = array();
4637     $this->voice_nomatch = array();
4638     }
4639    
4640     /**
4641     Sets text to be spoken by voice browsers. <br>
4642     @param text Some alternative text that replaces &lt;label&gt;.
4643     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4644     */
4645     function set_voice_text($text, $audio_src="")
4646     {
4647     if (!is_string($text))
4648     die("invalid argument in set_voice_text()");
4649    
4650     $this->voice_text = $text;
4651     $this->voice_audio_src = $audio_src;
4652     }
4653    
4654     /**
4655     Sets help text for voice browsers. <br>
4656     @param text Some helpful information concerning this checkbox.
4657     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4658     @param url Some other voice deck to go to (optional).
4659     */
4660     function set_voice_help($text, $audio_src="", $url="")
4661     {
4662     if (!is_string($text))
4663     die("invalid argument in set_voice_help()");
4664    
4665     $arr["text"] = $text;
4666     $arr["src"] = $audio_src;
4667     $arr["url"] = $url;
4668    
4669     $this->voice_help[] = $arr;
4670     }
4671    
4672     /**
4673     Sets noinput text for voice browsers. <br>
4674     @param text Some text to inform the user that no input has been received.
4675     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4676     @param url Some other voice deck to go to (optional).
4677     */
4678     function set_voice_noinput($text, $audio_src="", $url="")
4679     {
4680     if (!is_string($text))
4681     die("invalid argument in set_voice_noinput()");
4682    
4683     $arr["text"] = $text;
4684     $arr["src"] = $audio_src;
4685     $arr["url"] = $url;
4686    
4687     $this->voice_noinput[] = $arr;
4688     }
4689    
4690     /**
4691     Sets nomatch text for voice browsers. <br>
4692     @param text Some text to complain that user input (typically "yes" or "no") was not recognized.
4693     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
4694     @param url Some other voice deck to go to (optional).
4695     */
4696     function set_voice_nomatch($text, $audio_src="", $url="")
4697     {
4698     if (!is_string($text))
4699     die("invalid argument in set_voice_nomatch()");
4700    
4701     $arr["text"] = $text;
4702     $arr["src"] = $audio_src;
4703     $arr["url"] = $url;
4704    
4705     $this->voice_nomatch[] = $arr;
4706     }
4707    
4708     function is_checked()
4709     {
4710     return $this->state;
4711     }
4712    
4713     function get_name()
4714     {
4715     return $this->name;
4716     }
4717    
4718     function get_value()
4719     {
4720     return $this->value;
4721     }
4722    
4723     function get_label()
4724     {
4725     return $this->label;
4726     }
4727    
4728     function get_elementtype()
4729     {
4730     return HAW_CHECKBOX;
4731     }
4732    
4733     function create(&$deck)
4734     {
4735     if ($deck->ml == HAW_HTML)
4736     {
4737     // create HTML checkbox
4738    
4739     $state = ($this->is_checked() ? "checked=\"checked\"" : "");
4740    
4741     if ($deck->xhtml || $deck->pureHTML)
4742     {
4743     printf("<input type=\"checkbox\" name=\"%s\" id=\"%s\" %s value=\"%s\" />",
4744     $this->name, $this->name, $state, $this->value);
4745    
4746     printf(" <label for=\"%s\">%s</label><br />\n",
4747     $this->name, HAW_specchar($this->label, $deck));
4748     }
4749     else
4750     printf("<input type=\"checkbox\" name=\"%s\" %s value=\"%s\" /> %s<br />\n",
4751     $this->name, $state, $this->value,
4752     HAW_specchar($this->label, $deck));
4753     }
4754     elseif ($deck->ml == HAW_WML)
4755     {
4756     // create WML checkbox
4757     printf("<select name=\"%s\" multiple=\"true\">\n", $this->name);
4758     printf("<option value=\"%s\">%s</option>\n",
4759     $this->value, HAW_specchar($this->label, $deck));
4760     printf("</select>\n");
4761     }
4762     elseif ($deck->ml == HAW_HDML)
4763     {
4764     // create HDML checkbox
4765     // HDML does not support the multiple option feature!
4766     // ==> trick: simulate checkbox by creating radio buttons [x] and [ ]
4767    
4768     $options = " key=\"$this->name\"";
4769    
4770     // create label above the radio buttons
4771     $cb = sprintf("%s\n", HAW_specchar($this->label, $deck));
4772    
4773     // create "checked" radio button
4774     $cb .= sprintf("<ce value=\"%s\">[x]\n", $this->value);
4775    
4776     // create "not checked" radio button
4777     $cb .= "<ce value=\"\">[ ]\n";
4778    
4779     // make user interactive choice card
4780     $deck->hdmlcardset->make_ui_card($options, $cb, HAW_HDML_CHOICE);
4781     }
4782     elseif ($deck->ml == HAW_VXML)
4783     {
4784     // create VoiceXML checkbox (field with boolean grammar type)
4785    
4786     printf("<field type=\"boolean\" name=\"%s\">\n", $this->name);
4787    
4788     if ($this->voice_text || $this->voice_audio_src)
4789     {
4790     echo "<prompt>";
4791    
4792     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
4793     $this->voice_audio_src, 0, $deck);
4794    
4795     echo "</prompt>\n";
4796     }
4797    
4798     printf("<filled><if cond=\"%s\"><assign name=\"%s\" expr=\"'%s'\"/><else/><assign name=\"%s\" expr=\"''\"/></if></filled>\n",
4799     $this->name, $this->name, $this->value, $this->name);
4800    
4801     // create event handlers
4802     HAW_voice_eventhandler("help", $this->voice_help, $deck);
4803     HAW_voice_eventhandler("noinput", $this->voice_noinput, $deck);
4804     HAW_voice_eventhandler("nomatch", $this->voice_nomatch, $deck);
4805    
4806     echo "</field>\n";
4807     }
4808     }
4809     };
4810    
4811    
4812    
4813    
4814    
4815    
4816     /**
4817     This class provides a "hidden" element in a HAW_form object.
4818     <p><b>Examples:</b><p>
4819     $myHiddenElement = new HAW_hidden("internal_reference", "08154711");
4820     @see HAW_form
4821     */
4822     class HAW_hidden
4823     {
4824     var $name;
4825     var $value;
4826    
4827     /**
4828     Constructor
4829     @param name Variable in which "value" sent to the destination URL.
4830     @param value See name.
4831     */
4832     function HAW_hidden($name, $value)
4833     {
4834     $this->name = $name;
4835     $this->value = $value;
4836     }
4837    
4838     function get_name()
4839     {
4840     return $this->name;
4841     }
4842    
4843     function get_value()
4844     {
4845     return $this->value;
4846     }
4847    
4848     function get_elementtype()
4849     {
4850     return HAW_HIDDEN;
4851     }
4852    
4853     function create(&$deck)
4854     {
4855     if ($deck->ml == HAW_HTML)
4856     {
4857     // create hidden HTML field
4858    
4859     printf("<input type=\"hidden\" name=\"%s\" value=\"%s\" />\n",
4860     $this->name, HAW_specchar($this->value, $deck));
4861     }
4862     elseif ($deck->ml == HAW_VXML)
4863     {
4864     // create hidden field in VoiceXML
4865    
4866     printf("<field name=\"%s\" expr=\"'%s'\"/>\n",
4867     $this->name, HAW_specchar($this->value, $deck));
4868     }
4869    
4870     // not necessary in WML and HDML!
4871     }
4872     };
4873    
4874    
4875    
4876    
4877    
4878    
4879     /**
4880     This class provides a submit button in a HAW_form object.
4881     One HAW_form object can contain only one HAW_submit object.
4882     <p><b>Examples:</b><p>
4883     $mySubmit = new HAW_submit("Submit");<br>
4884     $mySubmit = new HAW_submit("Submit", "user_pressed");
4885     @see HAW_form
4886     */
4887     class HAW_submit
4888     {
4889     var $label;
4890     var $name;
4891    
4892     /**
4893     Constructor
4894     @param label What's written on the button.
4895     @param name (optional)<br>
4896     Variable in which "label" is sent to the destination URL.
4897     */
4898     function HAW_submit($label, $name="")
4899     {
4900     $this->label = $label;
4901     $this->name = $name;
4902     }
4903    
4904     function get_name()
4905     {
4906     return $this->name;
4907     }
4908    
4909     function get_label()
4910     {
4911     return $this->label;
4912     }
4913    
4914     function get_elementtype()
4915     {
4916     return HAW_SUBMIT;
4917     }
4918    
4919     function create(&$deck, $getvar, $url)
4920     {
4921     if ($deck->ml == HAW_HTML)
4922     {
4923     // create submit button in HTML
4924    
4925     $name = ($this->name ? "name=\"" . "$this->name" ."\"" : "");
4926    
4927     printf("<input type=\"submit\" %s value=\"%s\" /><br />\n", $name,
4928     HAW_specchar($this->label, $deck));
4929    
4930     }
4931     elseif (($deck->ml == HAW_WML) || ($deck->ml == HAW_HDML))
4932     {
4933     // determine querystring for both WML and HDML
4934    
4935     $query_string = "";
4936    
4937     if ($getvar) // safety check for "empty" forms
4938     {
4939     while (list($key, $val) = each($getvar))
4940     $query_string .= $val . "=$(" . $val . ")&amp;";
4941     }
4942    
4943     if ($this->name != "")
4944     $query_string .= $this->name . "=" . urlencode($this->label);
4945    
4946     if (substr($query_string, -5) == "&amp;")
4947     $query_string = substr($query_string, 0, strlen($query_string)-5);
4948    
4949     // replace '&' character in URL with '&amp;'
4950     $url = ereg_replace("&", "&amp;", $url);
4951    
4952     if ($deck->ml == HAW_WML)
4953     {
4954     if ($deck->submitViaLink)
4955     {
4956     // special handling for devices which have problems with <do> construct
4957    
4958     printf("<anchor>%s\n", HAW_specchar($this->label, $deck));
4959    
4960     if (strchr($url,"?"))
4961     printf("<go href=\"%s&amp;%s\"/>\n", $url, $query_string);
4962     else
4963     printf("<go href=\"%s?%s\"/>\n", $url, $query_string);
4964    
4965     echo "</anchor><br/>\n";
4966     }
4967     else
4968     {
4969     // normal WML style
4970    
4971     if ($deck->owgui_1_3)
4972     // create <do type="button"> sequence for Openwave GUI extensions WML 1.3
4973     printf("<do type=\"button\" label=\"%s\">\n",
4974     HAW_specchar($this->label, $deck));
4975     else
4976     // create <do type="accept"> sequence in normal WML
4977     printf("<do type=\"accept\" label=\"%s\">\n",
4978     HAW_specchar($this->label, $deck));
4979    
4980     if (strchr($url,"?"))
4981     printf("<go href=\"%s&amp;%s\">\n", $url, $query_string);
4982     else
4983     printf("<go href=\"%s?%s\">\n", $url, $query_string);
4984    
4985     echo "</go>\n";
4986     echo "</do>\n";
4987     }
4988     }
4989     elseif ($deck->ml == HAW_HDML)
4990     {
4991     // store info for final card in HDML card set
4992    
4993     if (strchr($url,"?"))
4994     $action = sprintf("<action type=\"accept\" label=\"%s\" task=\"go\" dest=\"%s&amp;%s\">\n",
4995     HAW_specchar($this->label, $deck),
4996     $url, $query_string);
4997     else
4998     $action = sprintf("<action type=\"accept\" label=\"%s\" task=\"go\" dest=\"%s?%s\">\n",
4999     HAW_specchar($this->label, $deck),
5000     $url, $query_string);
5001    
5002     $deck->hdmlcardset->set_final_action($action);
5003     }
5004     }
5005     elseif ($deck->ml == HAW_VXML)
5006     {
5007     // determine filled tag for VoiceXML
5008    
5009     $namelist = " namelist=\""; // init namelist attribute
5010    
5011     if ($getvar) // safety check for "empty" forms
5012     {
5013     // created namelist attribute with form fields
5014    
5015     while (list($key, $val) = each($getvar))
5016     $namelist .= $val . " ";
5017     }
5018    
5019     if ($this->name != "")
5020     {
5021     // create special field for submit info
5022     printf("<field name=\"%s\" expr=\"'%s'\"/>\n",
5023     $this->name, HAW_specchar($this->label, $deck));
5024    
5025     // add submit field to namelist
5026     $namelist .= $this->name . " ";
5027     }
5028    
5029     // remove last blank character in namelist
5030     if (substr($namelist, -1) == " ")
5031     $namelist = substr($namelist, 0, strlen($namelist)-1);
5032    
5033     // complete namelist attribute
5034     $namelist .= "\"";
5035    
5036     // replace '&' character in URL with '&amp;'
5037     $url = ereg_replace("&", "&amp;", $url);
5038    
5039     printf("<filled><submit next=\"%s\"%s method=\"get\"/></filled>\n",
5040     $url, $namelist);
5041     }
5042     }
5043     };
5044    
5045    
5046    
5047    
5048    
5049    
5050     /**
5051     This class provides a link in a HAW_deck, HAW_linkset or HAW_table object.
5052     <p><b>Examples:</b><p>
5053     $myPage = new HAW_deck(...);<br>
5054     ...<br>
5055     $myLink = new HAW_link("Continue","/mynextpage.php");<br>
5056     $myPage->add_link($myLink);
5057     @see HAW_deck
5058     @see HAW_linkset
5059     @see HAW_table
5060     */
5061     class HAW_link
5062     {
5063     var $label;
5064     var $url;
5065     var $title;
5066     var $accesskey; // "1", "2", ... "0", "*", "#"
5067     var $br;
5068     var $voice_text;
5069     var $voice_audio_src;
5070     var $voice_timeout;
5071    
5072     /**
5073     Constructor
5074     @param label Describes the link on the surfer's screen/display.
5075     @param url Next destination address.
5076     @param title (optional)<br>If a string is provided here, it will be displayed
5077     in the HTML browser status bar during "MouseOver", respectively somewhere
5078     on the WAP/XHTML display. In order to work well with a broad range of user agents,
5079     keep your title under 6 characters.
5080     */
5081     function HAW_link($label, $url, $title="")
5082     {
5083     $this->label = $label;
5084     $this->url = $url;
5085     $this->title = $title;
5086     $this->accesskey = HAW_NO_ACCESSKEY; // no accesskey assigned
5087     // can be assigned later e.g. from HAW_linkset object if required
5088     $this->br = 1; // default: 1 line break after text
5089     $this->voice_text = $label;
5090     $this->voice_audio_src = "";
5091     $this->voice_timeout = 10; // voice decks with text and links only terminate after 10 sec
5092     }
5093    
5094     /**
5095     Sets the number of line breaks (CRLF) after link. (default: 1)
5096     @param br Some number of line breaks.
5097     */
5098     function set_br($br)
5099     {
5100     if (!is_int($br) || ($br < 0))
5101     die("invalid argument in set_br()");
5102    
5103     $this->br = $br;
5104     }
5105    
5106     /**
5107     Sets link text to be spoken by voice browsers. <br>
5108     @param text Some alternative text that replaces &lt;label&gt;.
5109     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
5110     */
5111     function set_voice_text($text, $audio_src="")
5112     {
5113     if (!is_string($text))
5114     die("invalid argument in set_voice_text()");
5115    
5116     $this->voice_text = $text;
5117     $this->voice_audio_src = $audio_src;
5118     }
5119    
5120     /**
5121     Sets the link timeout for voice browsers (default: 10 sec). <br>
5122     Note: Voice decks with text only will force a disconnect immediately after the
5123     complete text has been spoken.
5124     Voice decks with text and links will wait some time for user voice input and will
5125     initiate the disconnect too, if no user input is received.
5126     For each link it is possible to specify an individual timeout value, i.e. a voice
5127     deck does not disconnect before the longest timeout of all active links expires.
5128     @param timeout Timeout in seconds.
5129     */
5130     function set_voice_timeout($timeout)
5131     {
5132     if (!is_int($timeout) || ($timeout < 1))
5133     die("invalid argument in set_voice_timeout()");
5134    
5135     $this->voice_timeout = $timeout;
5136     }
5137    
5138     /**
5139     Sets a DTMF key as link trigger for voice browsers.
5140     @param key "1", "2", ..., "9", "0", "*", "#"
5141     */
5142     function set_voice_dtmf($key)
5143     {
5144     if (!ereg("[0-9#\*]", $key))
5145     die("invalid argument in set_voice_dtmf()");
5146    
5147     $this->set_accesskey($key);
5148     }
5149    
5150     function get_url()
5151     {
5152     return $this->url;
5153     }
5154    
5155     function get_label()
5156     {
5157     return $this->label;
5158     }
5159    
5160     function get_title()
5161     {
5162     return $this->title;
5163     }
5164    
5165     function get_accesskey()
5166     {
5167     return $this->accesskey;
5168     }
5169    
5170     function get_elementtype()
5171     {
5172     return HAW_LINK;
5173     }
5174    
5175     function set_accesskey($accesskey)
5176     {
5177     $this->accesskey = $accesskey;
5178     }
5179    
5180     function create(&$deck)
5181     {
5182     // add hawoutput query parameter to url, if required
5183     HAW_handle_forced_output($this->url, $deck->hawoutput);
5184    
5185     if ($this->url)
5186     {
5187     // inhibit "empty" links
5188    
5189     if ($deck->ml == HAW_HTML)
5190     {
5191     // create link in HTML
5192    
5193     $title_option = "";
5194    
5195     if ($this->title && $deck->pureHTML)
5196     $title_option = sprintf(" onmouseover=\"self.status='%s';return true;\"",
5197     HAW_specchar($this->title, $deck));
5198    
5199     if ($this->title && ($deck->xhtml || $deck->lynx))
5200     $title_option = sprintf(" title=\"%s\"", HAW_specchar($this->title, $deck));
5201    
5202     $accesskey_option = "";
5203    
5204     if (($this->accesskey != HAW_NO_ACCESSKEY) &&
5205     ($deck->iModestyle || $deck->xhtml))
5206     $accesskey_option = sprintf(" accesskey=\"%s\"", $this->accesskey);
5207    
5208     if ($deck->MMLstyle && ($this->accesskey != HAW_NO_ACCESSKEY))
5209     $accesskey_option = sprintf(" directkey=\"%s\"", $this->accesskey);
5210    
5211     // create required amount of carriage return's
5212     $br = "";
5213     for ($i=0; $i < $this->br; $i++)
5214     $br .= "<br />";
5215    
5216     printf("<a href=\"%s\"%s%s>%s</a>%s\n",
5217     HAW_specchar($this->url, $deck), $title_option, $accesskey_option,
5218     HAW_specchar($this->label, $deck), $br);
5219     }
5220    
5221     elseif ($deck->ml == HAW_WML)
5222     {
5223     // create link in WML
5224    
5225     if ($this->title)
5226     $title_option = sprintf(" title=\"%s\"",
5227     HAW_specchar($this->title, $deck));
5228     else
5229     $title_option = "";
5230    
5231     // create required amount of carriage return's
5232     $br = "";
5233     for ($i=0; $i < $this->br; $i++)
5234     $br .= "<br/>";
5235    
5236     printf("<a%s href=\"%s\">%s</a>%s\n",
5237     $title_option, HAW_specchar($this->url, $deck),
5238     HAW_specchar($this->label, $deck), $br);
5239     }
5240    
5241     elseif ($deck->ml == HAW_HDML)
5242     {
5243     // create link in HDML
5244    
5245     if ($this->title)
5246     $title_option = sprintf(" label=\"%s\"",
5247     HAW_specchar($this->title, $deck));
5248     else
5249     $title_option = "";
5250    
5251     if ($this->accesskey != HAW_NO_ACCESSKEY)
5252     $accesskey_option = sprintf(" accesskey=\"%s\"", $this->accesskey);
5253     else
5254     $accesskey_option = "";
5255    
5256     // create required amount of carriage return's
5257     $br = "";
5258     for ($i=0; $i < $this->br; $i++)
5259     $br .= "<br>";
5260    
5261     $content = sprintf("<a task=\"go\" dest=\"%s\"%s%s>%s</a>%s\n",
5262     HAW_specchar($this->url, $deck),
5263     $title_option, $accesskey_option,
5264     HAW_specchar($this->label, $deck), $br);
5265    
5266     $deck->hdmlcardset->add_display_content($content);
5267     }
5268    
5269     elseif ($deck->ml == HAW_VXML)
5270     {
5271     // remove http:// from link label, as voice browsers complain about :
5272     // (and users can't speak complete url anyway)
5273     $label = ereg_replace("^http://", "", strtolower(HAW_specchar($this->label, $deck)));
5274    
5275     // * is not allowed in GSL grammar???
5276     $label = ereg_replace("\*", "", $label);
5277    
5278     if ($this->accesskey != HAW_NO_ACCESSKEY)
5279     $dtmf = sprintf(" dtmf=\"%s\"", $this->accesskey);
5280     else
5281     $dtmf = "";
5282    
5283     // prepare tag for VoiceXML link (will be written at form end)
5284     $deck->voice_links .= sprintf("<link next=\"%s\"%s><grammar>[%s]</grammar></link>\n",
5285     HAW_specchar($this->url, $deck), $dtmf, $label);
5286    
5287     if ($this->voice_text || $this->voice_audio_src)
5288     {
5289     // create audio output for VoiceXML link
5290    
5291     echo "<block><prompt>";
5292    
5293     if ($deck->voice_jingle)
5294     {
5295     // play jingle before link label is spoken
5296     printf("<audio src=\"%s\"></audio>", $deck->voice_jingle);
5297     }
5298    
5299     $pause = $this->br * HAW_VOICE_PAUSE; // short pause for each break
5300    
5301     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
5302     $this->voice_audio_src, $pause, $deck);
5303    
5304     echo "</prompt></block>\n";
5305     }
5306    
5307     // update deck timeout
5308     if ($deck->voice_timeout < $this->voice_timeout)
5309     $deck->voice_timeout = $this->voice_timeout;
5310     }
5311     }
5312     }
5313     };
5314    
5315    
5316    
5317    
5318    
5319    
5320     /**
5321     This class provides a phone number in a HAW_deck object. If supported by their
5322     mobile device, users can establish a voice connection to the specified number.
5323     <p><b>Examples:</b><p>
5324     $myPage = new HAW_deck(...);<br>
5325     ...<br>
5326     $myPhone = new HAW_phone("123-45678", "CALL");<br>
5327     $myPage->add_phone($myPhone);
5328     @see HAW_deck
5329     */
5330     class HAW_phone
5331     {
5332     var $label;
5333     var $number;
5334     var $title;
5335     var $voice_text;
5336     var $voice_audio_src;
5337    
5338     /**
5339     Constructor
5340     @param phone_number Phone number to dial.
5341     @param title (optional)<br>If a string is provided here, the call button on a
5342     WAP/HDML/XHTML device will be entitled. In order to work well with a broad range
5343     of user agents, keep your title under 6 characters.
5344     */
5345     function HAW_phone($phone_number, $title="")
5346     {
5347     $this->label = $phone_number;
5348     $this->number = ereg_replace("[^+0-9]", "", $phone_number);
5349     $this->title = $title;
5350     $this->voice_text = $phone_number;
5351     $this->voice_audio_src = "";
5352     }
5353    
5354     /**
5355     Sets text to be spoken by voice browsers. <br>
5356     @param text Some alternative text that replaces &lt;phone_number&gt;.
5357     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
5358     */
5359     function set_voice_text($text, $audio_src="")
5360     {
5361     if (!is_string($text))
5362     die("invalid argument in set_voice_text()");
5363    
5364     $this->voice_text = $text;
5365     $this->voice_audio_src = $audio_src;
5366     }
5367    
5368     function get_elementtype()
5369     {
5370     return HAW_PHONE;
5371     }
5372    
5373     function create($deck)
5374     {
5375     if ($deck->ml == HAW_HTML)
5376     {
5377     if ($this->title)
5378     $title_option = sprintf(" title=\"%s\"", HAW_specchar($this->title, $deck));
5379     else
5380     $title_option = "";
5381    
5382     if ($deck->iModestyle)
5383     // create phoneto: link for i-Mode
5384     printf("<a href=\"phoneto:%s\">%s</a><br>\n",
5385     $this->number, HAW_specchar($this->label, $deck));
5386     elseif ($deck->MMLstyle)
5387     // create tel: link for MML
5388     printf("<a href=\"tel:%s\">%s</a><br>\n",
5389     $this->number, HAW_specchar($this->label, $deck));
5390     elseif ($deck->xhtml && !$deck->lynx)
5391     // create wtai: link for XHTML Mobile
5392     printf("<a href=\"wtai://wp/mc;%s\"%s>%s</a><br />\n",
5393     $this->number, $title_option, HAW_specchar($this->label, $deck));
5394     else
5395     // create phone number as plain text
5396     printf("<code><big>%s</big></code><br />\n", HAW_specchar($this->label, $deck));
5397     }
5398     elseif ($deck->ml == HAW_WML)
5399     {
5400     // create phone number in WML
5401    
5402     if ($this->title)
5403     $title_option = sprintf(" title=\"%s\"", HAW_specchar($this->title, $deck));
5404     else
5405     $title_option = "";
5406    
5407     printf("<a%s href=\"wtai://wp/mc;%s\">%s</a><br/>\n", $title_option,
5408     ereg_replace("[+]", "%2B", $this->number), HAW_specchar($this->label, $deck));
5409     }
5410     elseif ($deck->ml == HAW_HDML)
5411     {
5412     // create phone number in HDML
5413    
5414     if ($this->title)
5415     $title_option = sprintf(" label=\"%s\"", HAW_specchar($this->title, $deck));
5416     else
5417     $title_option = "";
5418    
5419     $content = sprintf("<a task=\"call\" number=\"%s\"%s>%s</a><br>\n",
5420     $this->number, $title_option, HAW_specchar($this->label, $deck));
5421    
5422     $deck->hdmlcardset->add_display_content($content);
5423     }
5424     elseif ($deck->ml == HAW_VXML)
5425     {
5426     // create phone number in VXML
5427     // VoiceXML transfer is not supported yet
5428    
5429     if ($this->voice_text || $this->voice_audio_src)
5430     {
5431     // create audio output for VoiceXML text
5432    
5433     echo "<block><prompt>";
5434    
5435     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
5436     $this->voice_audio_src, HAW_VOICE_PAUSE, $deck);
5437    
5438     echo "</prompt></block>\n";
5439     }
5440     }
5441     }
5442     };
5443    
5444    
5445    
5446    
5447    
5448    
5449     /**
5450     This class defines a set of links. It should be preferably used for all kinds of menus.
5451     The links have to be defined as separate HAW_link objects and are attached to the
5452     linkset with a special "add_link" function.
5453     For WAP devices browser-dependent WML code will be created. On all UP-browser-based
5454     WAP devices linksets allow easier navigation through WML decks by using the "onpick"
5455     WML option and therefore are improving the "usability" of an application. Instead of
5456     painfully navigating through the links "sports->football->results->today" the mobile
5457     user e.g. can press "2431" on the keypad to enter his favorite deck. For all other
5458     WAP devices normal &lt;a&gt; tags are created. One HAW_deck object can contain only
5459     one linkset object.
5460     <p><b>Examples:</b><p>
5461     $myPage = new HAW_deck(...);<br>
5462     ...<br>
5463     $myLinkset = new HAW_linkset();<br>
5464     $myLink1 = new HAW_link("Phonebook", "/wap/phonebook.php");<br>
5465     $myLinkset->add_link($myLink1);<br>
5466     $myLink2 = new HAW_link("DateBook", "/wap/datebook.php");<br>
5467     $myLinkset->add_link($myLink2);<br>
5468     ...<br>
5469     $myPage->add_linkset($myLinkset);<br>
5470     ...<br>
5471     $myPage->create_page();
5472     @see HAW_link
5473     @see HAW_deck
5474     */
5475     class HAW_linkset
5476     {
5477     var $element;
5478     var $number_of_elements;
5479     var $voice_text;
5480     var $voice_audio_src;
5481     var $voice_help;
5482     var $voice_noinput;
5483     var $voice_nomatch;
5484    
5485    
5486     /**
5487     Constructor
5488     */
5489     function HAW_linkset()
5490     {
5491     $this->number_of_elements = 0;
5492     $this->voice_text = HAW_VOICE_ENUMERATE;
5493     $this->voice_audio_src = "";
5494     $this->voice_help = array();
5495     $this->voice_noinput = array();
5496     $this->voice_nomatch = array();
5497     }
5498    
5499    
5500     /**
5501     Adds a HAW_link object to HAW_linkset
5502     @param link Some HAW_link object.
5503     @see HAW_link
5504     */
5505     function add_link(&$link)
5506     {
5507     if (!is_object($link))
5508     die("invalid argument in add_link()");
5509    
5510     if ($this->number_of_elements < 12)
5511     {
5512     // number of possible access keys not exhausted
5513    
5514     $accesskey = $this->number_of_elements + 1; // start with key 1
5515    
5516     if ($accesskey == 12)
5517     $accesskey = "#";
5518     elseif ($accesskey == 11)
5519     $accesskey = "*";
5520     elseif ($accesskey == 10)
5521     $accesskey = "0";
5522    
5523     $link->set_accesskey($accesskey);
5524     }
5525    
5526     $this->element[$this->number_of_elements] = $link;
5527    
5528     $this->number_of_elements++;
5529     }
5530    
5531     /**
5532     Sets text to be spoken by voice browsers. <br>
5533     @param text Some alternative text that replaces the enumeration of link &lt;label&gt;s.
5534     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
5535     */
5536     function set_voice_text($text, $audio_src="")
5537     {
5538     if (!is_string($text))
5539     die("invalid argument in set_voice_text()");
5540    
5541     $this->voice_text = $text;
5542     $this->voice_audio_src = $audio_src;
5543     }
5544    
5545     /**
5546     Sets help text for voice browsers. <br>
5547     @param text Some helpful information concerning this linkset.
5548     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
5549     @param url Some other voice deck to go to (optional).
5550     */
5551     function set_voice_help($text, $audio_src="", $url="")
5552     {
5553     if (!is_string($text))
5554     die("invalid argument in set_voice_help()");
5555    
5556     $arr["text"] = $text;
5557     $arr["src"] = $audio_src;
5558     $arr["url"] = $url;
5559    
5560     $this->voice_help[] = $arr;
5561     }
5562    
5563     /**
5564     Sets noinput text for voice browsers. <br>
5565     @param text Some text to inform the user that no input has been received.
5566     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
5567     @param url Some other voice deck to go to (optional).
5568     */
5569     function set_voice_noinput($text, $audio_src="", $url="")
5570     {
5571     if (!is_string($text))
5572     die("invalid argument in set_voice_noinput()");
5573    
5574     $arr["text"] = $text;
5575     $arr["src"] = $audio_src;
5576     $arr["url"] = $url;
5577    
5578     $this->voice_noinput[] = $arr;
5579     }
5580    
5581     /**
5582     Sets nomatch text for voice browsers. <br>
5583     @param text Some text to complain that user input was not recognized.
5584     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
5585     @param url Some other voice deck to go to (optional).
5586     */
5587     function set_voice_nomatch($text, $audio_src="", $url="")
5588     {
5589     if (!is_string($text))
5590     die("invalid argument in set_voice_nomatch()");
5591    
5592     $arr["text"] = $text;
5593     $arr["src"] = $audio_src;
5594     $arr["url"] = $url;
5595    
5596     $this->voice_nomatch[] = $arr;
5597     }
5598    
5599     function get_elementtype()
5600     {
5601     return HAW_LINKSET;
5602     }
5603    
5604     function create(&$deck)
5605     {
5606     if ($this->number_of_elements > 0)
5607     {
5608     if ($deck->ml == HAW_HTML)
5609     {
5610     // create linkset in HTML
5611    
5612     if ($deck->css_enabled)
5613     {
5614     // create links inside a frame
5615    
5616     echo "<div style=\"border: solid 1px; margin: 5px; padding: 5px;\">\n";
5617    
5618     if ($deck->lynx)
5619     {
5620     // create link list to avoid whitespace between links
5621     echo "<ul>\n";
5622     while (list($key, $val) = each($this->element))
5623     {
5624     echo "<li>\n";
5625     $val->create($deck); // create one list element for each link
5626     echo "</li>\n";
5627     }
5628     echo "</ul>\n";
5629     }
5630     else
5631     {
5632     while (list($key, $val) = each($this->element))
5633     $val->create($deck);
5634     }
5635    
5636     echo "</div>\n";
5637     }
5638     else
5639     // create normal links for the small devices
5640     while (list($key, $val) = each($this->element))
5641     $val->create($deck);
5642     }
5643    
5644     elseif ($deck->ml == HAW_WML)
5645     {
5646     // create linkset in WML
5647    
5648     if ($deck->upbrowser &&
5649     ($deck->number_of_forms == 0) &&
5650     ($deck->number_of_links == 0) &&
5651     ($deck->number_of_phones == 0))
5652     {
5653     echo "<select>\n";
5654    
5655     while (list($key, $val) = each($this->element))
5656     {
5657     if ($val->get_title())
5658     $title = " title=\"" . HAW_specchar($val->get_title(), $deck) . "\"";
5659    
5660     printf("<option onpick=\"%s\"%s>%s</option>\n",
5661     HAW_specchar($val->get_url(), $deck), $title,
5662     HAW_specchar($val->get_label(), $deck));
5663     }
5664    
5665     echo "</select>\n";
5666     }
5667     else
5668     // create normal WML links
5669     while (list($key, $val) = each($this->element))
5670     $val->create($deck);
5671     }
5672    
5673     elseif ($deck->ml == HAW_HDML)
5674     {
5675     // create linkset in HDML
5676    
5677     while (list($key, $val) = each($this->element))
5678     $val->create($deck);
5679     }
5680    
5681     elseif ($deck->ml == HAW_VXML)
5682     {
5683     // create linkset for VoiceXML
5684    
5685     echo "<field name=\"haw_menu_item\">\n";
5686    
5687     if ($this->voice_text || $this->voice_audio_src)
5688     {
5689     if ($this->voice_text != HAW_VOICE_ENUMERATE)
5690     {
5691     echo "<prompt>";
5692    
5693     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
5694     $this->voice_audio_src, 0, $deck);
5695    
5696     echo "</prompt>\n";
5697     }
5698     }
5699    
5700     while (list($key, $val) = each($this->element))
5701     {
5702     if ($val->get_url())
5703     {
5704     // inhibit "empty" links
5705    
5706     if ($val->get_accesskey() != HAW_NO_ACCESSKEY)
5707     $dtmf = sprintf(" dtmf=\"%s\"", $val->get_accesskey());
5708     else
5709     $dtmf = "";
5710    
5711     if ($deck->supportsVXMLBreakTag)
5712     $breakTag = sprintf("<break time=\"%dms\"/>", HAW_VOICE_PAUSE);
5713     else
5714     $breakTag = "";
5715    
5716     printf("<prompt>%s%s</prompt>\n", HAW_specchar($val->get_label(), $deck), $breakTag);
5717    
5718     printf("<option%s value=\"%s\">%s</option>\n",
5719     $dtmf, HAW_specchar($val->get_url(), $deck),
5720     ereg_replace("[\?!]"," ",strtolower(HAW_specchar($val->get_label(), $deck))));
5721     }
5722     }
5723    
5724     // create event handlers
5725     HAW_voice_eventhandler("help", $this->voice_help, $deck);
5726     HAW_voice_eventhandler("noinput", $this->voice_noinput, $deck);
5727     HAW_voice_eventhandler("nomatch", $this->voice_nomatch, $deck);
5728    
5729     echo "</field>\n";
5730     echo "<filled><submit expr=\"haw_menu_item\"/></filled>\n";
5731     }
5732     }
5733     }
5734     };
5735    
5736    
5737    
5738    
5739    
5740    
5741     /*
5742     Undocumented class for raw markup insertion - For test only!
5743     */
5744     class HAW_raw
5745     {
5746     var $ml;
5747     var $code;
5748    
5749     /**
5750     Constructor
5751     @param ml Markup language (HAW_HTML, HAW_WML, HAW_HDML).
5752     @param code Some markup code to be inserted for the selected markup language<br>
5753     Note: Using this class is for meant for test purposes only. Inproper usage
5754     can result in highly incompatible applications.
5755     */
5756     function HAW_raw($ml,$code)
5757     {
5758     $this->ml = $ml;
5759     $this->code = $code;
5760     }
5761    
5762     function get_elementtype()
5763     {
5764     return HAW_RAW;
5765     }
5766    
5767     function create($deck)
5768     {
5769     if ($deck->ml == $this->ml)
5770     echo($this->code);
5771     }
5772     };
5773    
5774    
5775    
5776    
5777    
5778    
5779     /**
5780     This class provides a banner in a HAW_deck object (HTML only).
5781     <p><b>Examples:</b><p>
5782     $myPage = new HAW_deck(...);<br>
5783     ...<br>
5784     $myBanner1 = new HAW_banner("http://wwww.adpartner1.org/images/adp1.gif", "http://www.adpartner1.org/", "Welcome at adpartner1!");<br>
5785     $myPage->add_banner($myBanner1);<br>
5786     ...<br>
5787     $myBanner2 = new HAW_banner("http://wwww.adpartner2.org/images/adp2.gif", HAW_NOLINK, "Buy products of adpartner2!");<br>
5788     $myBanner2->set_size(300,50);<br>
5789     $myBanner2->set_br(0);<br>
5790     $myPage->add_banner($myBanner2,HAW_TOP);
5791     @see HAW_deck
5792     */
5793     class HAW_banner
5794     {
5795     var $image;
5796     var $url;
5797     var $alt;
5798     var $width = -1;
5799     var $height = -1;
5800     var $br = 1;
5801    
5802     /**
5803     Constructor
5804     @param image Your ad-partners banner in .gif, .jpg or any other HTML compatible format.
5805     @param url Link to your ad-partner (or HAW_NOLINK if no link available)
5806     @param alt Alternative text for the banner
5807     */
5808     function HAW_banner($image, $url, $alt)
5809     {
5810     $this->image = $image;
5811     $this->url = $url;
5812     $this->alt = $alt;
5813     }
5814    
5815     /**
5816     Sets explicitely the size of a banner<br>
5817     Note: Use of this function is not mandatory but will accelerate page set-up
5818     @param width Width of banner in pixels.
5819     @param height Height of banner in pixels.
5820     */
5821     function set_size($width, $height)
5822     {
5823     if (!is_int($width) || ($width < 1) || !is_int($height) || ($height < 1))
5824     die("invalid argument in set_size()");
5825    
5826     $this->width = $width;
5827     $this->height = $height;
5828     }
5829    
5830     /**
5831     Sets the number of line breaks (CRLF) after banner. (default: 1)
5832     @param br Some number of line breaks.
5833     */
5834     function set_br($br)
5835     {
5836     if (!is_int($br) || ($br < 0))
5837     die("invalid argument in set_br()");
5838    
5839     $this->br = $br;
5840     }
5841    
5842    
5843     function create()
5844     {
5845     if ($this->url != HAW_NOLINK)
5846     // banner links to url
5847     echo "<a href=\"$this->url\" target=\"_blank\">";
5848    
5849     if (($this->width>0) && ($this->height>0))
5850     // prepare this variable only if size info available
5851     $size = sprintf(" width=\"%d\" height=\"%d\"", $this->width, $this->height);
5852    
5853     printf("<img src=\"%s\" alt=\"%s\"%s hspace=\"10\" vspace=\"10\" border=\"0\" />",
5854     $this->image, $this->alt, $size);
5855    
5856     if ($this->url != HAW_NOLINK)
5857     // close <a> tag
5858     echo "</a>\n";
5859    
5860     for ($i=0; $i<$this->br; $i++)
5861     // create required number of line breaks
5862     echo "<br />\n";
5863     }
5864     };
5865    
5866    
5867    
5868    
5869    
5870    
5871     /**
5872     This class will cause a (hawrizontal) rule to be drawn across the screen.
5873     You can use it to separate text paragraphs in HAW_deck or HAW_form objects.
5874     <p><b>Examples:</b><p>
5875     $myDefaultRule = new HAW_rule();<br>
5876     $mySpecialRule = new HAW_rule("60%", 4);<br>
5877     ...<br>
5878     $myPage->add_rule($myDefaultRule)<br>;
5879     ...<br>
5880     $myPage->add_rule($mySpecialRule);
5881     @see HAW_deck
5882     @see HAW_form
5883     */
5884     class HAW_rule
5885     {
5886     var $width;
5887     var $size;
5888    
5889    
5890     /**
5891     Constructor
5892     @param width (optional)<br>Percentage of screen width or absolute value in
5893     number of pixels (e.g. "50%", 100).
5894     @param size (optional)<br>Height of the line to be drawn in pixels.
5895     */
5896     function HAW_rule($width="", $size="")
5897     {
5898     $this->width = $width;
5899     $this->size = $size;
5900     }
5901    
5902    
5903     function get_elementtype()
5904     {
5905     return HAW_RULE;
5906     }
5907    
5908    
5909     function create(&$deck)
5910     {
5911     $width_option = ($this->width ? " width=\"" . $this->width . "\"" : "");
5912     $size_option = ($this->size ? " size=\"" . $this->size . "\"" : "");
5913    
5914     if ($deck->ml == HAW_HTML)
5915     // draw horizontal row in HTML
5916     echo "<hr" . $width_option . $size_option . " />\n";
5917    
5918     elseif ($deck->ml == HAW_WML)
5919     {
5920     if ($deck->owgui_1_3)
5921     // WAP device accepts Openwave GUI extensions for WML 1.3
5922     echo "<hr" . $width_option . $size_option . "/>\n";
5923     else
5924     // WAP device does not understand <hr> tags
5925     // ==> draw some number of hyphens to create a rule
5926     echo "----------<br/>\n";
5927     }
5928     elseif ($deck->ml == HAW_HDML)
5929     {
5930     // HDML devices doesn't understand <hr>
5931     // ==> draw some number of hyphens to create a rule
5932    
5933     $deck->hdmlcardset->add_display_content("<" . $deck->alignment . ">\n");
5934    
5935     $deck->hdmlcardset->add_display_content("----------\n<br>\n");
5936     }
5937     elseif ($deck->ml == HAW_VXML)
5938     {
5939     // make a longer speech pause
5940     if ($deck->supportsVXMLBreakTag)
5941     printf("<block><prompt><break time=\"%dms\"/></prompt></block>\n",
5942     3 * HAW_VOICE_PAUSE);
5943     }
5944     }
5945     };
5946    
5947    
5948    
5949    
5950    
5951    
5952     /**
5953     This class provides a voice recorder in a HAW_deck object.<br><br>
5954     Voice recording is feature for voice browsers only (VoiceXML).
5955     The recorded voice input will be sent encrypted as multipart/form-data
5956     to some other url, which normally will be another PHP/HAWHAW script. Here you can
5957     store the received data as .wav file on your server, play it to the user, or do whatever
5958     you want. Saving of the received voice data is similar to normal PHP file upload handling.
5959     <br><br>
5960     Voice recording is a very powerful feature which offers many oportunities to
5961     create high-sophisticated voice applications.<br><br>
5962     <p><b>Examples:</b><p>
5963     $myRecorder = new HAW_voicerecorder("http://www.foo.com/script.php", "Please speak after the tone");<br>
5964     <br>
5965     $myRecorder = new HAW_voicerecorder("http://www.foo.com/script.php", "You have 2 minutes from now");<br>
5966     $myRecorder->make_beep(false);<br>
5967     $myRecorder->set_maxtime(120);<br><br>
5968     // ... and in http://www.foo.com/script.php we store the received wav file like this:<br>
5969     move_uploaded_file($_FILES['haw_recording']['tmp_name'], "/voice/message.wav");
5970     @see HAW_deck
5971     */
5972     class HAW_voicerecorder
5973     {
5974     var $url;
5975     var $label;
5976     var $beep;
5977     var $maxtime;
5978     var $finalsilence;
5979     var $type;
5980     var $voice_text;
5981     var $voice_audio_src;
5982     var $voice_noinput;
5983    
5984     /**
5985     Constructor
5986     @param url Address where the recorded file is sent to.
5987     @param label Some introducing words before the recording starts.
5988     */
5989     function HAW_voicerecorder($url, $label)
5990     {
5991     $this->url = $url;
5992     $this->label = $label;
5993     $this->beep = true;
5994     $this->maxtime = "";
5995     $this->finalsilence = "";
5996     $this->type = "";
5997     $this->voice_text = $label;
5998     $this->voice_audio_src = "";
5999     $this->voice_noinput = array();
6000     }
6001    
6002     /**
6003     Sets text to be spoken by voice browsers.
6004     @param text Some alternative text that replaces &lt;label&gt;.
6005     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
6006     */
6007     function set_voice_text($text, $audio_src="")
6008     {
6009     if (!is_string($text))
6010     die("invalid argument in set_voice_text()");
6011    
6012     $this->voice_text = $text;
6013     $this->voice_audio_src = $audio_src;
6014     }
6015    
6016     /**
6017     Sets noinput text for voice browsers. <br>
6018     @param text Some text to inform the user that no input has been received.
6019     @param audio_src Some audio file (e.g. *.wav file) to play (optional).
6020     @param url Some other voice deck to go to (optional).
6021     */
6022     function set_voice_noinput($text, $audio_src="", $url="")
6023     {
6024     if (!is_string($text))
6025     die("invalid argument in set_voice_noinput()");
6026    
6027     $arr["text"] = $text;
6028     $arr["src"] = $audio_src;
6029     $arr["url"] = $url;
6030    
6031     $this->voice_noinput[] = $arr;
6032     }
6033    
6034     /**
6035     Activates/deactivates beep before recording starts.
6036     @param beep_indicator: true (default) or false.
6037     */
6038     function make_beep($beep_indicator)
6039     {
6040     if ($beep_indicator == false)
6041     $this->beep = false;
6042     }
6043    
6044     /**
6045     Sets maximum duration of recording.
6046     @param maxtime Duration of record in seconds
6047     */
6048     function set_maxtime($maxtime)
6049     {
6050     $this->maxtime = $maxtime;
6051     }
6052    
6053     /**
6054     Sets interval of silence that indicates end of speech.
6055     @param finalsilence Silence duration (in seconds)
6056     */
6057     function set_finalsilence($finalsilence)
6058     {
6059     $this->finalsilence = $finalsilence;
6060     }
6061    
6062     /**
6063     Sets media format of recording.
6064     @param type e.g. "audio/x-wav"
6065     */
6066     function set_type($type)
6067     {
6068     $this->type = $type;
6069     }
6070    
6071     function get_elementtype()
6072     {
6073     return HAW_VOICERECORDER;
6074     }
6075    
6076     function create(&$deck)
6077     {
6078     if ($deck->ml == HAW_VXML)
6079     {
6080     // VoiceXML (no output for non-voice browsers)
6081    
6082     if ($this->maxtime)
6083     $maxtime = sprintf(" maxtime=\"%ds\"", $this->maxtime);
6084     else
6085     $maxtime = "";
6086    
6087     if ($this->finalsilence)
6088     $finalsilence = sprintf(" finalsilence=\"%ds\"", $this->finalsilence);
6089     else
6090     $finalsilence = "";
6091    
6092     if ($this->type)
6093     $type = sprintf(" type=\"%s\"", $this->type);
6094     else
6095     $type = "";
6096    
6097     if ($this->beep)
6098     $beep = "true";
6099     else
6100     $beep = "false";
6101    
6102     printf("<record name=\"haw_recording\" beep=\"%s\"%s%s%s>\n",
6103     $beep, $maxtime, $finalsilence, $type);
6104    
6105     if ($this->voice_text || $this->voice_audio_src)
6106     {
6107     echo "<prompt>";
6108    
6109     HAW_voice_audio(HAW_specchar($this->voice_text, $deck),
6110     $this->voice_audio_src, 0, $deck);
6111    
6112     echo "</prompt>\n";
6113     }
6114    
6115     // replace '&' character in URL with '&amp;'
6116     $this->url = ereg_replace("&", "&amp;", $this->url);
6117    
6118     printf("<filled><submit next=\"%s\" enctype=\"multipart/form-data\" method=\"post\" namelist=\"haw_recording\"/></filled>\n",
6119     $this->url);
6120    
6121     // create event handler for noinput
6122     HAW_voice_eventhandler("noinput", $this->voice_noinput, $deck);
6123    
6124     // create catch handler for disconnect
6125     printf("<catch event=\"connection.disconnect.hangup\"><submit next=\"%s\" enctype=\"multipart/form-data\" method=\"post\" namelist=\"haw_recording\"/></catch>\n",
6126     $this->url);
6127    
6128     echo "</record>\n";
6129     }
6130     }
6131     };
6132    
6133     ?>

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