001    /*****************************************************************************
002    *                             MODULE DESCRIPTION
003    ******************************************************************************
004    *
005    *      NAME:     HtmlBean.java
006    *      LANGUAGE: Java 2
007    *      DATE:     13.11.2002
008    *      AUTHOR:   Jussi Mäkinen, Jyväskylä University (JYU)
009    *      PURPOSE:  Contains some useful routines to make HTML code
010    *
011    ******************************************************************************
012    *                  COPYRIGHT (C) Kiuru group
013    *             Limited rights granted. Please refer to license
014    *****************************************************************************/
015    
016    /*****************************************************************************
017     *                                 UPDATES
018    ******************************************************************************
019    *
020    * 6.2.2003 / MN
021    *   - Added method getH
022    * 
023    * 24.3.2003 / MN
024    *   - Added support for writers (eg JspWriter, PrintWriter...)
025    *
026    * 28.5.2003 /mn
027    *   - Moved getLink from HtmlTable
028    ******************************************************************************/
029    package kiurubeans;
030    
031    import java.util.*;
032    import kotkabeans.*;
033    
034    
035    
036    /**
037     * Facilitates HTML output and translations.
038     * 
039     * @author  Jussi Mäkinen & Miika Nurminen
040     */
041    public class HtmlBean {
042    
043    // Attributes
044        
045      /** used for translation. if user is not set, text is translated 'as is'. */
046      public User user; 
047      
048      /** Writer - current JSP page (or other writer) to print */
049      private java.io.PrintWriter writer;
050    
051    // Constructors
052      
053      /** Creates a new instance of HtmlBean. Dummy empty constructor */
054      public HtmlBean() {
055      }
056      
057    // Access methods
058      
059      /** Getter for property writer.
060       * @return Value of property writer.
061       */
062      public java.io.PrintWriter getWriter() {
063        return this.writer;
064      }
065      
066      /** Setter for property writer.
067       * @param writer New value of property writer.
068       */
069      public void setWriter(java.io.Writer writer) {
070        this.writer = new java.io.PrintWriter(writer);
071      }
072      
073      /**
074       * Prints string to current writer and adds endline.
075       * @param s string to be written.
076       */
077      private void println(String s) {
078        getWriter().println(s);
079      }
080      
081      /** Setter method for user
082       * @param user current user
083       */
084      public void setUser(User user) {
085        this.user=user;
086      }
087      
088      /** Getter method for user
089       * @return current user
090       */
091      public User getUser() {
092        return this.user;
093      }
094      
095      /** 
096       * Translates given string 
097       * @param s String that is being translated
098       * @return Translated String
099       */
100      public String translate(String s) {
101         if (getUser()==null) return s;
102         else return getUser().T(s);
103      }
104    
105      /**
106       * Creates a new HTML Select list
107       *
108       * @return Generated HTML code including a select list.
109       * @param name The name of HTML Select list.
110       * @param rs ResultSet
111       * @param valueField The name of SQL field that contains the id values
112       * @param textField The name of SQL field that contains the text values.
113       * @param selected Id that is selected.
114       * @throws Exception if problems with RS2
115       */  
116      public static String makeSelectList(String name,RS2 rs, String valueField, String textField, String selected) throws Exception {
117        return HtmlBean.makeSelectList(name,rs,valueField,textField,selected,null);
118      }
119     
120       /** Creates a new HTML Select list
121        *
122        * @return Generated HTML code including a select list.
123        * @param name The name of HTML Select list.
124        * @param rs ResultSet
125        * @param valueField The name of SQL field that contains the id values
126        * @param textField The name of SQL field that contains the text values.
127        * @param selected Id that is selected.
128        * @param nullString nullstring is added in the beginning with value 0 (if nullString==null, nothing is added)
129        * @throws Exception If problems with RS2
130        */
131      public static String makeSelectList(String name,RS2 rs, String valueField, String textField, String selected,String nullString) throws Exception {
132        StringBuffer sb=new StringBuffer(1000);
133        sb.append("<select name=\"");
134        sb.append(name);
135        sb.append("\">\n");
136        rs.beforeFirst();
137        if (nullString!=null) {
138          sb.append("<option value=\"0\"");
139          if (selected.equals("0")) {
140            sb.append(" selected=\"selected\"");
141          }
142          sb.append(">");
143          sb.append(nullString);
144          sb.append("</option>\n");
145        }
146        while (rs.next()) {
147          sb.append("<option value=\"");
148          sb.append(rs.getString(valueField));
149          sb.append("\"");
150          if ((rs.getString(valueField).equals(selected)) && (!selected.equals(""))) {
151            sb.append(" selected=\"selected\"");
152          }
153          sb.append(">");
154          sb.append(rs.getString(textField));
155          sb.append("</option>\n");
156        }
157        sb.append("</select>");
158        return new String(sb);
159      }
160    
161      
162      /** Creates a group of HTML Radiobuttons
163       *
164       * @return generated radiobutton group
165       * @param name The name of HTML radiobuttons.
166       * @param rs ResultSet
167       * @param valueField The name of SQL field that contains the id values
168       * @param textField The name of SQL field that contains the text values.
169       * @param checked Which radio button is selected by default.
170       * @throws Exception if problems with rs
171       */
172      public String makeRadioGroup(String name, RS2 rs, String valueField, String textField, String checked) throws Exception {  
173        return makeRadioGroup(name,rs,valueField,textField,checked,null);
174      }
175      
176      /** Creates a group of HTML Radiobuttons
177       *
178       * @return generated radiobutton group
179       * @param name The name of HTML radiobuttons.
180       * @param rs RS2 where data is retrieved
181       * @param valueField The name of SQL field that contains the id values
182       * @param textField The name of SQL field that contains the text values.
183       * @param checked Which radio button is selected by default.
184       * @param nullString nullstring is added in the beginning with value 0 (if nullString==null, nothing is added)
185       * @throws Exception if problems with rs
186       */
187      public String makeRadioGroup(String name, RS2 rs, String valueField, String textField, String checked,String nullString) throws Exception {
188        StringBuffer sb=new StringBuffer(1000);
189        if (nullString!=null) {
190          sb.append("<input type=\"radio\" name=");
191          sb.append(KiuruString.quote(name));
192          sb.append(" value=\"0\"");
193          if (checked.equals("0")) {
194            sb.append(" checked=\"checked\"");
195          }
196          sb.append(" />");
197          sb.append(nullString);
198          sb.append("<br />\n");
199        }
200        rs.beforeFirst();
201        while (rs.next()) {
202          sb.append("<input type=\"radio\" name=\"");
203          sb.append(name);
204          sb.append("\" value=\"");
205          sb.append(rs.getString(valueField));
206          sb.append("\"");
207          if ((rs.getString(valueField).equals(checked)) && (!checked.equals(""))) {
208            sb.append(" checked=\"checked\"");
209          }
210          sb.append(" />");
211          sb.append(rs.getString(textField));
212          sb.append("<br />\n");
213        }
214        return new String(sb);
215      }
216      
217      /** Creates a group of HTML Radiobuttons based on ArrayList with StringPairs
218       *
219       * @return generated radiobutton group
220       * @see StringPair
221       * @param name The name of HTML radiobuttons.
222       * @param rs arraylist containing (key,value) StringPairs
223       * @param checked Which radio button is selected by default.
224       * @param dobreak if true, a <code>br</code> tag is appended to the end
225       */
226      public static String makeRadioGroup(String name, ArrayList rs, String checked,boolean dobreak) {
227        if ((rs==null) || (rs.size()==0)) 
228          return new String();
229        StringBuffer sb=new StringBuffer(1000);
230        for (int i=0; i<rs.size(); i++) {
231          StringPair p = (StringPair)rs.get(i);
232          sb.append("<input type=\"radio\" name="+KiuruString.quote(name));
233          sb.append(" value="+KiuruString.quote(p.getKey()));
234          if ((p.getKey().equals(checked)) && (!checked.equals(""))) {
235            sb.append(" checked="+KiuruString.quote("checked"));
236          }
237          sb.append(">");
238          sb.append(p.getValue());
239          if (dobreak)
240            sb.append("<br />\n");
241          else
242            sb.append(" \n");
243        }
244        return new String(sb);
245      }
246      
247      /** Creates a group of Checkbox
248       * @param name The name of HTML checkboxes
249       * @param rs RS2 where data is retrieved
250       * @param valueField The name of SQL field that contains the id values
251       * @param textField The name of SQL field that contains the text values.
252       * @param checked id for checked box
253       * @throws Exception if problems with RS2
254       * @return generated checkbox group
255       */
256      public String makeCheckBox(String name, RS2 rs, String valueField, String textField, String checked) throws Exception {
257        StringBuffer sb=new StringBuffer(1000);
258        rs.beforeFirst();
259        while (rs.next()) {
260          sb.append("<input type=\"checkbox\" name=\"");
261          sb.append(name);
262          sb.append("\" value=\"");
263          sb.append(rs.getString(valueField));
264          sb.append("\"");
265          if (rs.getString(valueField).equals(checked)) {
266            sb.append(" checked");
267          }
268          sb.append(">");
269          sb.append(rs.getString(textField));
270          sb.append("<br>\n");
271        }
272        return new String(sb);
273      }
274      
275    
276      
277       /** Creates a new HTML Select list with size
278        *
279        * @return Generated HTML code including a select list.
280        * @param name The name of HTML Select list.
281        * @param rs ResultSet
282        * @param valueField The name of SQL field that contains the id values
283        * @param textField The name of SQL field that contains the text values.
284        * @param selected Id that is selected.
285        * @param size Select list size
286        * @param multiple if true, multiple values can be selected
287        * @throws Exception If problems with RS2
288        */
289      public static String makeSelectList(String name,RS2 rs, String valueField, String textField, String selected, int size, boolean multiple) throws Exception {
290        StringBuffer sb=new StringBuffer(1000);
291        sb.append("<select name="+KiuruString.quote(name)+" size="+KiuruString.quote(Integer.toString(size)));
292        if (multiple) {
293          sb.append(" multiple="+KiuruString.quote("multiple"));
294        }
295        sb.append(">\n");
296        while (rs.next()) {
297          sb.append("<option value=\"");
298          sb.append(rs.getString(valueField));
299          sb.append("\"");
300          if (rs.getString(valueField).equals(selected)) {
301            sb.append(" selected");
302          }
303          sb.append(">");
304          sb.append(rs.getString(textField));
305          sb.append("</option>\n");
306        }
307        sb.append("</select>");
308        return new String(sb);
309      }
310      
311      
312    
313      /** Creates simple search form. Used for searching spaces & persons
314       * @param targetPage action page
315       * @param editName name for edit box
316       * @param editContent default text for edit box
317       * @return search form as string
318       */
319      public static String createSearchForm(String targetPage,String editName,String editContent) {
320        return HtmlBean.createSearchForm(targetPage,editName,editContent,true);
321      }
322    
323      /** Creates simple search form. Used for searching spaces & persons
324       * @param targetPage action page
325       * @param editName name for edit box
326       * @param editContent default text for edit box
327       * @param closeForm if true, form is closed
328       * @return search form as string
329       */
330      public static String createSearchForm(String targetPage,String editName,String editContent,boolean closeForm) {
331        StringBuffer sb = new StringBuffer(1000);
332        sb.append("<form action="+KiuruString.quote(targetPage)+" method=\"get\">\n");
333        sb.append("<label for=\"haku\">Hakuehto:</label><br />\n");
334        sb.append("<input id=\"haku\" type=\"text\" name="+KiuruString.quote(editName)+" size=\"50\" value="+KiuruString.quote(editContent)+" />\n");
335        sb.append("<input type=\"submit\" name=\"submitSearch\" value=\"Hae\" />\n");
336        if (closeForm) sb.append("</form>");
337        return sb.toString();
338      }
339      
340      /**
341       * Standard navigation text for bottom of pages concerning spaces, spacegroups & reports. probably obsolete.
342       * @return html string
343       */
344      public static String bottomNavigator() {
345        StringBuffer sb = new StringBuffer(1000);
346        sb.append("<p>\n");
347        sb.append("<a href=\"searchSpace.jsp\">Salit</a> | <a href=\"searchSpaceGroup.jsp\">Saliryhmät</a> | <a href=\"reportInit.jsp\">Raportit</a>\n");
348        sb.append("</p>\n");
349        return sb.toString();
350      }
351      
352      /** Returns hidden component for html form
353       *  @param name Name of the HTML hidden component.
354       *  @param value Value of the HTML hidden component.
355       *  @return HTML code containing the HTML hidden component.
356       */
357      public static String getHidden(String name, String value) {
358        return "<input type=\"hidden\" name="+KiuruString.quote(name)+" value="+KiuruString.quote(value)+" />\n";
359      }
360    
361      /** Returns hidden component for html form
362       *  @param name Name of the HTML hidden component.
363       *  @param value Value of the HTML hidden component.
364       *  @return HTML code containing the HTML hidden component.
365       */
366      public static String getHidden(String name, int value) {
367        return getHidden(name,Integer.toString(value));
368      }
369      
370      /**
371       * Returns submit component for html form
372       * @param name Name of the HTML submit component.
373       * @param value Value of the HTML submit component.
374       * @return HTML code containing the HTML submit component.
375       */  
376      public static String getSubmit(String name, String value) {
377        return "<input type=\"submit\" name="+KiuruString.quote(name)+" value="+KiuruString.quote(value)+" />\n";
378      }
379      
380      /** Prints translated submit button to current writer
381       * @param name button component name
382       * @param value text on button
383       */
384      public void printSubmit(String name,String value) {
385        println(getSubmit(name,translate(value)));
386      }
387      /** Returns NON-TRANSLATED text with label style (used in html forms).
388       * to do: should the text be translated?
389       * @param text content text
390       * @return HTML code for label
391       */
392      public static String getLabel(String text) {
393        return "<strong>"+text+"</strong> ";
394      }
395      
396      /** Returns page's main headline. Translates text.
397       * @param text content text
398       * @return HTML code for headline
399       */
400      public String getH(String text) {
401        return getH(text,1);
402      }
403      
404      /** Returns page's headline of given level. Translates text.
405       * @param text content text
406       * @param level content level
407       * @return HTML code for headline
408       */
409      public String getH(String text, int level) {
410        return "<h"+level+">"+translate(text)+"</h"+level+">\n";
411      }
412      
413      /** Retuns script tag and begin HTML comment. Always use in conjunction 
414       * with end_javascript!
415       * @see #end_javascript()
416       * @return HTML code to begin javascript.
417       */
418      public static String begin_javascript() {
419        return "<script type=\"text/javascript\">"+"<!--\n";
420      }
421      
422      /** Retuns end HTML comment and end script tag. Always use in conjunction
423       * with begin_javascript!
424       * @see #begin_javascript()
425       * @return HTML code to end javascript
426       */
427      public static String end_javascript() {
428        return "\n // --> </script>";
429      }
430    
431      /** return begin <code>table</code> tag with parameters, standard formatting
432       * @return HTML code for begin table
433       */
434      public static String begin_table() {
435        return "<table border=\"1\" cellpadding=\"3\" cellspacing=\"0\">";
436      }
437      
438      /** Returns javascript code for printing a submit button. translated.
439       * @param name component name
440       * @param value component value
441       * @param onClick javascript code to execute on click
442       * @return javascript code for printing a submit button.
443       */
444      public String getJsButton(String name, String value, String onClick) {
445        StringBuffer result = new StringBuffer(20);
446        result.append(begin_javascript());
447        result.append("document.write('<input type="+KiuruString.quote("button")+" name=");
448        result.append(KiuruString.quote(name));
449        result.append(" value=");
450        result.append(KiuruString.quote(translate(value)));
451        result.append(" onClick=");
452        result.append(KiuruString.quote(onClick));
453        result.append(" />');\n");
454        result.append(end_javascript());
455        return result.toString();
456      }
457      
458      
459      /**  Returns current page filename, no request parameters or path.
460       * @param r request from JSP page
461       * @throws MalformedURLException if URI is not valid
462       * @return page filename
463       */
464      public static String getCurrentPage(javax.servlet.http.HttpServletRequest r) throws java.net.MalformedURLException {
465        String s=r.getRequestURI();
466        int i=s.indexOf("?");
467        if (i<=0) 
468          return s;
469        else
470          return s.substring(1,s.indexOf("?")-1);
471      }  
472      
473      /** 
474       * Returns current time in string. parameter "currentTime". Can be appended in
475       * URL.
476       * @return current time in string - can be appended in urls that mustn't be cached
477       */
478      public static String getCurrentTime() {
479        return "currentTime="+System.currentTimeMillis();
480      }
481      
482      /** Taken from portal/pageAddUser. Sorts hashtable values and puts them in a
483       * combo box.
484       * @param translations Translation values in a hash table (key id)
485       * @param selected Selected value
486       */
487      public void printOptionValues(java.util.Hashtable translations, String selected) /*throws Exception */{
488        java.util.ArrayList sortedIDs = Tools.sortHashtableByValue(translations);
489        for (int i=0; i<sortedIDs.size(); i++) {        
490          String id = (String)sortedIDs.get(i);  //nextIter;
491                    String sel = ( id.equals(selected) ? " selected=\"selected\"" : "" );
492                    println("<option value=\"" + id + "\""+sel+">" + translations.get(id)+"</option>\n");
493        }
494      }
495      
496    
497       /**
498        *  Creates a new HTML Select list based on hashtable. hashtable values are not translated!
499        * @param name The name of HTML Select list.
500        * @param values Values to be printed (keys are ids)
501        * @param selected Id that is selected.
502        * @param nullString nullstring is added in the beginning with value 0 (if nullString==null, nothing is added)
503        */
504      public void printSelectList(String name,java.util.Hashtable values, String selected,String nullString) {
505        println("<select name="+KiuruString.quote(name)+">");
506        if (nullString!=null) {
507          println("<option value=\"0\"");
508          if (selected.equals("0")) {
509            println(" selected=\"selected\"");
510          }
511          println(">---"+translate(nullString)+"---</option>");
512        }
513        printOptionValues(values,selected);
514        println("</select>");
515      }
516      
517      /**
518       * Prints a HtmlTable component on current writer
519       * @param h HtmlTable component
520       * @see HtmlTable
521       */  
522      public void printHtmlTable(HtmlTable h) {
523        println(h.generateTable());
524      }
525      
526      /** Returns current time as a hidden control to ensure cache-free functionality.
527       * @return HTML code to be put inside a form
528       */
529      public static String getCurrentTimeAsHidden() {
530        return "<input type=\"hidden\" name=\"currentTimeMillis\" value=\""+System.currentTimeMillis()+"\" />\n";
531      }
532    
533      /** Returns HTML code for a link. If title is empty, defaultTitle is appended
534       * instead.
535       *
536       * @return HTML code for a link
537       * @param title Visible text in link
538       * @param value value appended to base text
539       * @param defaultTitle visible text if title is empty
540       */  
541      public static String getLink(String title,String value,String defaultTitle) {
542        if (KiuruString.isEmpty(title)) title=defaultTitle;
543        StringBuffer sb=new StringBuffer(20);
544        sb.append("<a href="+KiuruString.quote(value));
545        sb.append(">");
546        sb.append(title);
547        sb.append("</a>");
548        return sb.toString();
549      }
550    
551      /** Returns HTML code for a link.
552       *
553       * @return HTML code for a link
554       * @param title Visible text in link
555       * @param value value appended to base text
556       */  
557      public static String getLink(String title,String value) {
558        return getLink(title,value,"");
559      }  
560    }
561    /***************************************************************************************************
562     *               COPYRIGHT (C) KIURU -PROJECT GROUP
563     *               Limited rights granted. Please refer to license.
564     **************************************************************************************************/