001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.util;
017    
018    import org.opengion.fukurou.security.HybsCryptography;
019    
020    /**
021     * XHTMLTag.java ã¯ã€å?通的ã«ä½¿ç”¨ã•れるHTMLã‚¿ã‚°ã®ç”Ÿæ?メソãƒ?ƒ‰ã‚’集ç´?—ãŸã‚¯ãƒ©ã‚¹ã§ã™ã?
022     *
023     * 全変数?メソãƒ?ƒ‰ã¯ã€public static final 宣è¨?•れã¦ã?¾ã™ã?
024     *
025     * @version  4.0
026     * @author   Kazuhiko Hasegawa
027     * @since    JDK5.0,
028     */
029    public final class XHTMLTag {
030    
031            /** シスãƒ?ƒ ä¾å­˜ã?改行記å·ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?     */
032            public static final String CR = System.getProperty("line.separator");
033    
034            /** ãƒãƒƒãƒ•ã‚¡ã®åˆæœŸå®¹é‡ã‚’通常より若干多ã„ç›®ã«è¨­å®šã—ã¾ã™ã?(50)  */
035            public static final int BUFFER_SMALL = 50;
036    
037            /** ãƒãƒƒãƒ•ã‚¡ã®åˆæœŸå®¹é‡ã‚’通常より多ã„ç›®ã«è¨­å®šã—ã¾ã™ã?(200)  */
038            public static final int BUFFER_MIDDLE = 200;
039    
040            /** ãƒãƒƒãƒ•ã‚¡ã®åˆæœŸå®¹é‡ã‚’通常より大å¹?«å¤šã„ç›®ã«è¨­å®šã—ã¾ã™ã?(500)  */
041            public static final int BUFFER_LARGE  = 500;
042    
043            /** URLãƒã‚§ãƒ?‚¯ã‚­ãƒ¼ç™ºè¡Œç”¨ 4.3.7.1 (2009/06/08) */
044            private static final HybsCryptography HYBS_CRYPTOGRAPHY = new HybsCryptography(); // 4.3.7.0 (2009/06/01)
045    
046            /**
047             * BUTTON ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
048             *
049             */
050            private static final String[]
051                    BUTTON_KEY =  { "type","name","value","onClick",
052                                                    "id","class","lang","dir","title","style","xml:lang",
053                                                    "disabled","tabindex","accesskey",
054                                                    "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
055                                                    "onMouseMove","onMouseOut","onMouseOver"
056                                            };
057    
058            /**
059             * INPUT ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
060             *
061             */
062            private static final String[]
063                    INPUT_KEY = { "type","size","maxlength","checked","src",
064                                                    "alt","accept","usemap","ismap",
065                                                    "id","class","lang","dir","title","style","xml:lang",
066                                                    "readonly","disabled","tabindex","accesskey","onClick","onChange",
067                                                    "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
068                                                    "onMouseMove","onMouseOut","onMouseOver",
069                                                    "onSelect","onKeydown","onKeypress","onKeyup"
070                                            };
071    
072            /**
073             * TEXTAREA ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
074             *
075             */
076            private static final String[]
077                    TEXTAREA_KEY = { "name","rows","cols",
078                                                    "id","class","lang","dir","title","style","xml:lang",
079                                                    "readonly","disabled","tabindex","accesskey","onClick",
080                                                    "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
081                                                    "onMouseMove","onMouseOut","onMouseOver",
082                                                    "onSelect","onKeydown","onKeypress","onKeyup"
083                                            };
084    
085            /**
086             * LINK ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
087             *
088             */
089            private static final String[]
090                    LINK_KEY = { "type","name","hreflang","rel","rev","charset",
091                                                    "target","shape","coords","onClick",
092                                                    "id","class","lang","dir","title","style","xml:lang",
093                                                    "tabindex","accesskey",
094                                                    "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
095                                                    "onMouseMove","onMouseOut","onMouseOver"
096                                            };
097    
098            /**
099             * SELECT ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
100             *
101             */
102            private static final String[]
103                    SELECT_KEY = { "size","multiple",
104                                                    "id","class","lang","dir","title","style","xml:lang",
105                                                    "disabled","tabindex","onClick","onChange",
106                                                    "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
107                                                    "onMouseMove","onMouseOut","onMouseOver",
108                                                    "onSelect","onKeydown","onKeypress","onKeyup"
109                                            };
110    
111            /**
112             * OPTION ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
113             *
114             */
115            private static final String[]
116                    OPTION_KEY = { "value","label","selected",
117                                                    "id","class","lang","dir","title","style","xml:lang",
118                                                    "disabled"
119                                            };
120    
121            /**
122             * FRAME ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
123             *
124             */
125            private static final String[]
126                    FRAME_KEY = { "name","longdesc","marginwidth","marginheight","noresize",
127                                                    "scrolling","frameborder",
128                                                    "id","class","title","style"
129                                            };
130    
131            /**
132             * IMAGE ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
133             *
134             */
135            private static final String[]
136                    IMAGE_KEY = { "src","alt","longdesc","width","height","usemap","ismap","name","onClick",
137                                                    "align","border","hspace","vspace",              // ã“ã?行ã?éžæŽ¨å¥¨å±žæ?ã§ã™ã?
138                                                    "id","class","title","style","lang","dir","xml:lang",
139                                                    "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
140                                                    "onMouseMove","onMouseOut","onMouseOver"
141                                            };
142    
143            /**
144             * FORM ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
145             *
146             */
147            private static final String[]
148                    FORM_KEY = { "action","method","enctype","accept-charset","accept","name","target",
149                                                    "id","class","title","style","lang","dir","xml:lang"
150                                            };
151    
152            /**
153             * SPAN ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
154             *
155             */
156            private static final String[]
157                    SPAN_KEY = { "id","class","title","style","lang","dir","xml:lang" };
158    
159            /**
160             * PRE ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
161             *
162             */
163            private static final String[]
164                    PRE_KEY = { "id","class","title","style","lang","dir","xml:lang" };
165    
166            /**
167             *  ãƒ?ƒ•ォルトコンストラクターをprivateã«ã—ã¦ã€?
168             *  オブジェクトã?生æ?ã‚’ã•ã›ãªã?‚ˆã?«ã™ã‚‹ã€?
169             *
170             */
171            private XHTMLTag() { }
172    
173            /**
174             * ボタンを作æ?ã—ã¾ã™ã?
175             *
176             * <button type="å½¢å¼? name="åå‰" value="é€ä¿¡æ–?­? オプション?¥?¥?¥ >ラベル</button>
177             *
178             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
179             * <table border="1" frame="box" rules="all" >
180             * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚­ãƒ¼</td></tr>
181             * <tr><td>type="形�</td><td>�?</td><td>submit/reset/button</td></tr>
182             * <tr><td>value="値"</td><td>オプション</td><td>name属æ?ã¨å…±ã«é€ä¿¡ã•れるå?</td></tr>
183             * <tr><td>disabled="disabled"</td><td>オプション</td><td>ボタンを利用ã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
184             * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å­—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
185             * <tr><td>accesskey="ショートカãƒ?ƒˆã‚­ãƒ¼"</td><td>オプション</td><td>æ–?­—ã‚»ãƒ?ƒˆä¸­ã®?‘文字:Windowsã§ã‚れã°Altキーã¨åŒæ™‚使用</td></tr>
186             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
187             * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?­—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?­—ãªã©ãƒœã‚¿ãƒ³ä¸Šã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?­—å?</td></tr>
188             * </table>
189             *
190             * 設定ã§ãる属æ?
191             * å½¢å¼ã???
192             *  submit  é€ä¿¡(サブミãƒ?ƒˆ)
193             *  reset   リセãƒ?ƒˆ
194             *  button  汎用ボタン
195             * を指定ã—ã¾ã™ã?
196             *
197             * ラベルã«?ŒHTMLãƒ?‚­ã‚¹ãƒ?強調æ–?­—ãªã©)ã‚’ã?ã‚è¾¼ã‚?“ã¨ãŒå?æ¥ã¾ã™ã?
198             * ã¾ãŸï¼Œã‚¤ãƒ¡ãƒ¼ã‚¸ &lt;img ?¥?¥?¥?¥&gt; を指定ã™ã‚‹ã“ã¨ã‚?å¯èƒ½ã§ã™ã?
199             * disabled="disabled" ã®ã¨ã,ã“ã®ãƒœã‚¿ãƒ³ã®ãƒ??ã‚¿ã¯ã‚µãƒ¼ãƒã?ã«é€ä¿¡ã•れã¾ã›ã‚“ã€?
200             * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸­ã«,CSSç­‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
201             * 汎用属æ?ã‚’è?ç”±ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
202             *
203             * @param   attri 属æ?群
204             *
205             * @return  ボタンタグæ–?­—å?
206             */
207            public static String button( final Attributes attri ) {
208                    String   checkedType = "|submit|reset|button|";
209    
210                    String type  = attri.get( "type" );
211                    if( checkedType.indexOf( "|" + type + "|" ) < 0 ) {
212                            String errMsg = "button タイプ設定エラー [" + type + "]";
213                            throw new RuntimeException( errMsg );
214                    }
215    
216                    String values = attri.getAttribute( BUTTON_KEY );
217                    String body   = attri.get( "body" );
218                    if( body == null ) { body = "" ; }
219    
220                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
221                    rtn.append("<button ");
222                    rtn.append( values );
223                    rtn.append( ">" );
224                    rtn.append( body );
225                    rtn.append("</button>");
226    
227                    return rtn.toString();
228            }
229    
230            /**
231             * 入力フォーãƒ?‚’作æ?ã—ã¾ã™ã?
232             *
233             * @param   attri 属æ?群
234             *
235             * @return  入力フォーãƒ?‚¿ã‚°æ–?­—å?
236             * @see     #input( Attributes attri,String name,String value,String optAtt )
237             */
238            public static String input( final Attributes attri ) {
239                    String name     = attri.get( "name" );
240                    String value    = attri.get( "value" );
241                    String optAttri = attri.get( "optionAttributes" );
242    
243                    return input( attri,name,value,optAttri );
244            }
245    
246            /**
247             * 入力フォーãƒ?‚’作æ?ã—ã¾ã™ã?
248             *
249             * &lt;input type="text" name="åå‰" value="é€ä¿¡æ–?­? ....&gt;
250             *
251             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
252             * <table border="1" frame="box" rules="all" >
253             * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚­ãƒ¼</td></tr>
254             * <tr><td>type="形�</td><td>�?</td><td>text/password/checkbox/radio/submit/reset/button/image/file/hidden</td></tr>
255             * <tr><td>value="値"</td><td>オプション</td><td>name属æ?ã¨å…±ã«é€ä¿¡ã•れるå?</td></tr>
256             * <tr><td>size="30"</td><td>オプション</td><td>inputã‚¿ã‚°ã®å¤§ãã•</td></tr>
257             * <tr><td>maxlength="50"</td><td>オプション</td><td>type属æ?ãŒï½¢text?£,?¢password?£ ã®ã¨ãã?æœ?¤§æ–?­—æ•°</td></tr>
258             * <tr><td>checked="checked"</td><td>オプション</td><td>type属æ?ãŒï½¢checkbox?£,?¢radio?£ ã®å ´åˆã«é¸æŠžã•れã¦ã?‚‹çŠ¶æ…‹ã«ã™ã‚‹ã€?/td></tr>
259             * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
260             * <tr><td>accept="MIMEタイãƒ?</td><td>オプション</td><td>type属æ?ãŒï½¢file?£ã®å ´åˆã«å‡¦ç?¯èƒ½ãªMIMEタイプをæŒ?®?/td></tr>
261             * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å­—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
262             * <tr><td>accesskey="ショートカãƒ?ƒˆã‚­ãƒ¼"</td><td>オプション</td><td>æ–?­—ã‚»ãƒ?ƒˆä¸­ã®?‘文字:Windowsã§ã‚れã°Altキーã¨åŒæ™‚使用</td></tr>
263             * <tr><td>src="URL"</td><td>オプション</td><td>type属æ?ãŒï½¢image?£ã®å ´åˆé?信ボタンã®ç”»åƒURLを指å®?/td></tr>
264             * <tr><td>alt="代替æ–?­—å?"</td><td>オプション</td><td>type属æ?ãŒï½¢image?£ã®å ´åˆã?ç”»åƒãŒè¡¨ç¤ºã§ããªã?¨ãã?代替æ–?­—å?を指å®?/td></tr>
265             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
266             * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?­—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?­—ãªã©ãƒœã‚¿ãƒ³ä¸Šã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?­—å?</td></tr>
267             * <tr><td>サãƒã?トå¤?/td><td>未実è£?/td><td>readonly属æ?ã€usemap属æ?ã€ismap属æ?ã€align属æ?</td></tr>
268             * </table>
269             *
270             * 設定ã§ãる属æ?
271             * å½¢å¼ã???
272             *  text       ?‘行ã?ãƒ?‚­ã‚¹ãƒˆãƒ•ィールãƒ?
273             *  password   パスワード用ãƒ?‚­ã‚¹ãƒˆãƒ•ィールãƒ?
274             *  checkbox   ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹(è¤?•°é¸æŠžå¯)
275             *  radio      ラジオボタン(è¤?•°é¸æŠžä¸å¯)
276             *  submit     é€ä¿¡(サブミãƒ?ƒˆ)
277             *  reset      リセãƒ?ƒˆ
278             *  button     汎用ボタン
279             *  image      イメージã«ã‚ˆã‚‹ç”»åƒã?タン
280             *  file       é€ä¿¡ãƒ•ァイルã®é¸æŠ?
281             *  hidden     表示ã›ãšã«ã‚µãƒ¼ãƒã?ã«é€ä¿¡ã™ã‚‹ã€?
282             * を指定ã—ã¾ã™ã?
283             *
284             * ラジオボタン?ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹ã§ã‚らã‹ã˜ã‚?ãƒã‚§ãƒ?‚¯ã‚’ã—ã¦
285             * ãŠããŸã„å ´åˆã?,checked 属æ?ã« "checked" を登録ã—ã¾ã™ã?
286             * ファイルãƒ?‚¤ã‚¢ãƒ­ã‚°ã®å ´åˆã?,attributesã® accept 属æ?ã« "MIMEタイãƒ?
287             * を登録ã—ã¾ã™ã?
288             * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸­ã«,CSSç­‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
289             * æ–?­—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
290             * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
291             * タブã§ç§»å‹•é?を指定ã™ã‚?tabindex="タブé?"
292             * ショートカãƒ?ƒˆã‚­ãƒ¼ã‚’割り当ã¦ã‚?accesskey="ショートカãƒ?ƒˆã‚­ãƒ¼"
293             *
294             * @param   attri  属æ?群
295             * @param   name   åå‰
296             * @param   value  値
297             * @param   optAttri オプションæ–?­—å?(タグ属æ?定義ã•れã¦ã?ªã?±žæ?ã®ç™»éŒ²ç”¨æ–?­—å?)
298             *
299             * @return  入力フォーãƒ?‚¿ã‚°æ–?­—å?
300             */
301            public static String input( final Attributes attri,final String name,final String value,final String optAttri ) {
302                    String values = attri.getAttribute( INPUT_KEY );
303    
304                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
305                    rtn.append("<input ");
306                    if( name  != null ) { rtn.append("name=\"").append( name ).append( "\" " ); }
307                    if( value != null ) { rtn.append("value=\"").append( value ).append( "\" " ); }
308                    rtn.append( values );
309                    if( optAttri != null ) {
310                            rtn.append( " " );
311                            rtn.append( optAttri );
312                    }
313                    rtn.append( " />" );
314    
315                    return rtn.toString();
316            }
317    
318            /**
319             * 入力フォーãƒ??属æ?æƒ??ã®ã¿ã®æ–?­—å?を作æ?ã—ã¾ã™ã?
320             * ã“れã¯ã€name 属æ?ã‚?value 属æ?ãªã©ã€ä¸?ˆ¬ã«éƒ½åº¦å¤‰æ›´ã•れるフィールãƒ?
321             * 以外ã?固定的ãªå±žæ?æƒ??ã‚’ã?å…ˆã«ä½œæ?ã—ã¦ãŠãå ´åˆã«ã€ä½¿ç”¨ã—ã¾ã™ã?
322             *
323             * @param   attri       属æ?リスãƒ?
324             *
325             * @return  入力フォーãƒ?‚¿ã‚°ã®å±žæ?æƒ??æ–?­—å?
326             */
327            public static String inputAttri( final Attributes attri ) {
328                    return attri.getAttribute( INPUT_KEY );
329            }
330    
331            /**
332             * ãƒ?‚­ã‚¹ãƒˆã‚¨ãƒªã‚¢ã®å±žæ?æƒ??ã®ã¿ã®æ–?­—å?を作æ?ã—ã¾ã™ã?
333             * ã“れã¯ã€name 属æ?ã‚?value 属æ?ãªã©ã€ä¸?ˆ¬ã«éƒ½åº¦å¤‰æ›´ã•れるフィールãƒ?
334             * 以外ã?固定的ãªå±žæ?æƒ??ã‚’ã?å…ˆã«ä½œæ?ã—ã¦ãŠãå ´åˆã«ã€ä½¿ç”¨ã—ã¾ã™ã?
335             *
336             * @param   attri       属æ?リスãƒ?
337             *
338             * @return  ãƒ?‚­ã‚¹ãƒˆã‚¨ãƒªã‚¢ã®å±žæ?æƒ??æ–?­—å?
339             */
340            public static String textareaAttri( final Attributes attri ) {
341                    return attri.getAttribute( TEXTAREA_KEY );
342            }
343    
344            /**
345             * プルãƒ?‚¦ãƒ³ç­‰ã?メニューã®å±žæ?æƒ??ã®ã¿ã®æ–?­—å?を作æ?ã—ã¾ã™ã?
346             * ã“れã¯ã€name 属æ?ã‚?value 属æ?ãªã©ã€ä¸?ˆ¬ã«éƒ½åº¦å¤‰æ›´ã•れるフィールãƒ?
347             * 以外ã?固定的ãªå±žæ?æƒ??ã‚’ã?å…ˆã«ä½œæ?ã—ã¦ãŠãå ´åˆã«ã€ä½¿ç”¨ã—ã¾ã™ã?
348             *
349             * @param   attri       属æ?リスãƒ?
350             *
351             * @return  プルãƒ?‚¦ãƒ³ç­‰ã?メニューã®å±žæ?æƒ??æ–?­—å?
352             */
353            public static String selectAttri( final Attributes attri ) {
354                    return attri.getAttribute( SELECT_KEY );
355            }
356    
357            /**
358             * HIDDEN フォーãƒ?‚’作æ?ã—ã¾ã™ã?
359             *
360             * id属æ?ã«ã€name ã¨åŒã˜å€¤ãŒè¨­å®šã•れã¾ã™ã?
361             *
362             * @og.rev 5.5.4.0 (2012/07/02) ID属æ?追åŠ?
363             *
364             * @param   name  フォーãƒ??åå‰
365             * @param   value 値
366             *
367             * @return  HIDDENフォーãƒ?‚¿ã‚°æ–?­—å?
368             */
369            public static String hidden( final String name,final String value ) {
370    //              StringBuilder rtn = new StringBuilder( BUFFER_SMALL );
371    
372    //              rtn.append("<input type=\"hidden\" ");
373    //              rtn.append("name=\"" ).append( name );
374    //              rtn.append("\" value=\"").append( value );
375    //              rtn.append( "\" />" );
376    
377    //              return rtn.toString();
378                    return hidden(name,value,name);
379            }
380    
381            /**
382             * HIDDEN フォーãƒ?‚’作æ?ã—ã¾ã™ã?
383             *
384             * @og.rev 5.5.4.0 (2012/07/02) ID属æ?追åŠ?
385             *
386             * @param   name  フォーãƒ??åå‰
387             * @param   value 値
388             * @param   id    フォー�?ID
389             *
390             * @return  HIDDENフォーãƒ?‚¿ã‚°æ–?­—å?
391             */
392            public static String hidden( final String name, final String value, final String id ) {
393                    StringBuilder rtn = new StringBuilder( BUFFER_SMALL );
394    
395                    rtn.append( "<input type=\"hidden\" " );
396                    rtn.append( "name=\"" ).append( name );
397                    rtn.append( "\" value=\"" ).append( value );
398                    rtn.append( "\" id=\"" ).append( id );
399                    rtn.append( "\" />" );
400    
401                    return rtn.toString();
402            }
403    
404            /**
405             * ãƒ?‚­ã‚¹ãƒˆã‚¨ãƒªã‚¢ã‚’作æ?ã—ã¾ã™ã?
406             *
407             * &lt;textarea name="åå‰" rows="4" cols="40"  ....&gt;é€ä¿¡æ–?­—å? &lt;/textarea&gt
408             *
409             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
410             * <table border="1" frame="box" rules="all" >
411             * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚­ãƒ¼</td></tr>
412             * <tr><td>rows="行数"</td><td>オプション</td><td>入力フィールドã?表示行数</td></tr>
413             * <tr><td>cols="å¹?</td><td>オプション</td><td>入力フィールドã?表示å¹?æ–?­—æ•°)</td></tr>
414             * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
415             * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å­—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
416             * <tr><td>accesskey="ショートカãƒ?ƒˆã‚­ãƒ¼"</td><td>オプション</td><td>æ–?­—ã‚»ãƒ?ƒˆä¸­ã®?‘文字:Windowsã§ã‚れã°Altキーã¨åŒæ™‚使用</td></tr>
417             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
418             * <tr><td>value="値"</td><td>オリジナル</td><td>name属æ?ã¨å…±ã«é€ä¿¡ã•れるå?</td></tr>
419             * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?­—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?­—ãªã©ãƒœã‚¿ãƒ³ä¸Šã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?­—å?</td></tr>
420             * <tr><td>サãƒã?トå¤?/td><td>未実è£?/td><td>readonly属æ?</td></tr>
421             * </table>
422             *
423             * 設定ã§ãる属æ?
424             *
425             * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸­ã«,CSSç­‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
426             * æ–?­—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
427             * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
428             * タブã§ç§»å‹•é?を指定ã™ã‚?tabindex="タブé?"
429             * ショートカãƒ?ƒˆã‚­ãƒ¼ã‚’割り当ã¦ã‚?accesskey="ショートカãƒ?ƒˆã‚­ãƒ¼"
430             *
431             * @param   attri 属æ?群
432             *
433             * @return  入力フォーãƒ?‚¿ã‚°æ–?­—å?
434             */
435            public static String textarea( final Attributes attri ) {
436                    String values = attri.getAttribute( TEXTAREA_KEY );
437                    String body   = attri.get( "body" );
438                    if( body == null ) { body = "" ; }
439    
440                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
441                    rtn.append("<textarea ");
442                    rtn.append( values );
443                    rtn.append( ">" );
444                    rtn.append( body );
445                    rtn.append( "</textarea>" );
446    
447                    return rtn.toString();
448            }
449    
450            /**
451             * ペã?ジリンクを作æ?ã—ã¾ã™ã?
452             *
453             * &lt;A href="?µ?²?¬" target="ターゲãƒ?ƒˆå?&gt;ラベル&lt;/A&gt;
454             *
455             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
456             * <table border="1" frame="box" rules="all" >
457             * <tr><td>href="URL"</td><td>å¿??</td><td>リンク先ã?URLを指定ã—ã¾ã™ã?</td></tr>
458             * <tr><td>charset="æ–?­—ã‚»ãƒ?ƒˆ"</td><td>オプション</td><td>リンク先ã?æ–?­—コードセãƒ?ƒˆã‚’指定ã—ã¾ã™ã?</td></tr>
459             * <tr><td>hreflang="è¨?ªžã‚»ãƒ?ƒˆ"</td><td>オプション</td><td>リンク先ã?基本ã¨ãªã‚‹è¨?ªžã‚³ãƒ¼ãƒ‰ã‚’æŒ?®šã—ã¾ã™ã?</td></tr>
460             * <tr><td>type="MIMEタイãƒ?</td><td>オプション</td><td>リンク先ã?MIMEタイプをæŒ?®šã—ã¾ã™ã?</td></tr>
461             * <tr><td>name="åå‰"</td><td>オプション</td><td>ã“ã?è¦ç´?‚’リンクã®åˆ°é”点ã¨ã™ã‚‹ãŸã‚ã®åå‰ã‚’指定ã—ã¾ã™ã?</td></tr>
462             * <tr><td>rel="リンクタイãƒ?</td><td>オプション</td><td>ã“ã?æ–?›¸ã‹ã‚‰ã¿ã?href 属æ?ã§æŒ?®šã•れるリンク先ã¨ã®é–¢ä¿?/td></tr>
463             * <tr><td>rev="リンクタイãƒ?</td><td>オプション</td><td>href 属æ?ã§æŒ?®šã•れるリンク先ã‹ã‚‰ã¿ãŸã?ã“ã?æ–?›¸ã¨ã®é–¢ä¿?/td></tr>
464             * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å­—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
465             * <tr><td>accesskey="ショートカãƒ?ƒˆã‚­ãƒ¼"</td><td>オプション</td><td>æ–?­—ã‚»ãƒ?ƒˆä¸­ã®?‘文字:Windowsã§ã‚れã°Altキーã¨åŒæ™‚使用</td></tr>
466             * <tr><td>target="フレーãƒ?"</td><td>オプション</td><td>リンク先ã?フレーãƒ?</td></tr>
467             * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?­—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?­—ãªã©ã‚’リンクã«ã§ãã¾ã™ã?</td></tr>
468             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
469             * <tr><td>サãƒã?トå¤?/td><td>未実è£?/td><td>shape属æ?ã€coords属æ?</td></tr>
470             * </table>
471             *
472             * 設定ã§ãる属æ?
473             *
474             * ラベルãªã—ã?å ´å? href属æ?ã® "URL" ãã?ã‚‚ã?を付ã‘ã¾ã™ã?
475             *
476             * target属æ?ã®ãƒ•レーãƒ?ã¯
477             *
478             *  _top        フレーãƒ?‚’解除ã—ã¦,リンク先をフレーãƒ??体ã«è¡¨ç¤ºã™ã‚‹ã€?
479             *  _parent リンク先を親フレーãƒ?«è¡¨ç¤ºã™ã‚‹ã€?
480             *  _self   リンク先を自åˆ??身ã«è¡¨ç¤ºã™ã‚‹ã€?
481             *  _blank  æ–°ã—ã„ウインドウを開ã?¦?Œè¡¨ç¤ºã™ã‚‹ã€?
482             *  ãã?ä»? フレーãƒ?½œæ?時ã?åå‰ã§æŒ?®šå¯èƒ½ã€?
483             *
484             * を指定ã—ã¾ã™ã?
485             * ãªã—ã?å ´å?_self (自åˆ??身)を指定ã—ã¾ã™ã?
486             *
487             * リンクメール機è?
488             * URLを,mailto:メールアドレス ã§è¨­å®šã™ã‚Œã?,メールé€ä¿¡ãƒ?‚¤ã‚¢ãƒ­ã‚°ã‚?
489             * é–‹ã事ãŒå‡ºæ¥ã¾ã™ã?
490             * ç”»åƒãƒªãƒ³ã‚¯æ©Ÿè?
491             * ç”»åƒã‚’クリãƒ?‚¯ã™ã‚‹ãƒªãƒ³ã‚¯ã¯?Œãƒ©ãƒ™ãƒ«ã®å€‹æ‰€ã« &lt;img&gt;タグを設定ã—ã¾ã™ã?
492             *
493             * &lt;a href="books.html"&gt;&lt;img src="banner.gif" width="468px" height="60px" alt="関連書ç±ç´¹ä»? border="0"&gt;&lt;/a&gt;
494             *
495             * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸­ã«,CSSç­‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
496             * æ–?­—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
497             * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
498             * タブã§ç§»å‹•é?を指定ã™ã‚?tabindex="タブé?"
499             * ショートカãƒ?ƒˆã‚­ãƒ¼ã‚’割り当ã¦ã‚?accesskey="ショートカãƒ?ƒˆã‚­ãƒ¼"
500             *
501             * @param   attri 属æ?群
502             *
503             * @return  ペã?ジリンクタグæ–?­—å?
504             */
505            public static String link( final Attributes attri ) {
506                    return link( attri,"" );
507            }
508    
509            /**
510             * ペã?ジリンクを作æ?ã—ã¾ã™ã?
511             *
512             * @param   attri 属æ?群
513             * @param   urlEncode æ–?­—å?   ( ?key1=val1&?¥?¥?¥?¥ ã¨ã?†æ–?­—å? ç„¡ã?¨ãã? "" )
514             *
515             * @return  ペã?ジリンクタグæ–?­—å?
516             */
517            public static String link( final Attributes attri, final String urlEncode ) {
518    
519                    String href = addUrlEncode( attri.get( "href" ),urlEncode );
520    
521                    String values = attri.getAttribute( LINK_KEY );
522                    String body   = attri.get( "body" );
523                    if( body == null ) { body = attri.get( "href" ) ; }
524    
525                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
526                    rtn.append("<a href=\"");
527                    rtn.append( href );
528                    rtn.append( "\" " );
529                    rtn.append( values );
530                    rtn.append( ">" );
531                    rtn.append( body );
532                    rtn.append( "</a>" );
533    
534                    return rtn.toString();
535            }
536    
537            /**
538             * xlink å½¢å¼ã?ペã?ジリンクを作æ?ã—ã¾ã™ã?
539             *
540             * 基本çš?«ã¯ã€link ã¨åŒã˜ã§ã™ã?ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æŒ?®šã‚‚ã€href ã§æŒ?®šã—ã¦ãã ã•ã„ã€?
541             * å†?ƒ¨çš?«ã€xlink:href ã«å¤‰æ›ã—ã¾ã™ã?
542             * ã¾ãŸã?URL引数をã?"&amp;" ã§çµåˆã™ã‚‹ã®ã§ã¯ãªãã?"&amp;amp;" ã§çµåˆã•ã›ã¾ã™ã?
543             * ã“れã¯ã€xlink ãã?ã‚‚ã?ãŒã?XML上ã«è¨˜è¿°ã•れãŸå?åˆã«ã€XMLã®ãƒ«ãƒ¼ãƒ«ã§å†åº¦ãƒ‘ã?ス
544             * ã•れる為ã§ã™ã?
545             *
546             * @param   attri 属æ?群
547             * @param   urlEncode æ–?­—å?   ( ?key1=val1&?¥?¥?¥?¥ ã¨ã?†æ–?­—å? ç„¡ã?¨ãã? "" )
548             *
549             * @return  ペã?ジリンクタグæ–?­—å?
550             */
551            public static String xlink( final Attributes attri, final String urlEncode ) {
552    
553                    String href = addUrlEncode( attri.get( "href" ),urlEncode,"&amp;" );
554    
555                    String values = attri.getAttribute( LINK_KEY );
556                    String body   = attri.get( "body" );
557                    if( body == null ) { body = attri.get( "href" ) ; }
558    
559                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
560                    rtn.append("<a xlink:href=\"");
561                    rtn.append( href );
562                    rtn.append( "\" " );
563                    rtn.append( values );
564                    rtn.append( ">" );
565                    rtn.append( body );
566                    rtn.append( "</a>" );
567    
568                    return rtn.toString();
569            }
570    
571            /**
572             * メニューを作æ?ã—ã¾ã™ã?
573             *
574             * @param   attri 属æ?群
575             * @param   opt é¸æŠžè‚¢(オプション)
576             *
577             * @return  メニュータグæ–?­—å?
578             */
579            public static String select( final Attributes attri,final Options opt ) {
580                    String name     = attri.get( "name" );
581                    String optAttri = attri.get( "optionAttributes" );
582    
583                    return select( attri,opt,name,optAttri );
584            }
585    
586            /**
587             * メニューを作æ?ã—ã¾ã™ã?
588             *
589             * &lt;select size="行数" name="åå‰" multiple&gt;
590             * &lt;option value="é€ä¿¡æ–?­—ï¼?&gt;コメンãƒ?lt;/option&gt;
591             * &lt;option value="é€ä¿¡æ–?­—ï¼?&gt;コメンãƒ?lt;/option&gt;
592             * &lt;option value="é€ä¿¡æ–?­—ï¼? selected="selected"&gt;コメンãƒ?lt;/option&gt;
593             * &lt;/select&gt;
594             *
595             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
596             * <table border="1" frame="box" rules="all" >
597             * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚­ãƒ¼</td></tr>
598             * <tr><td>size="行数"</td><td>オプション</td><td>selectè¦ç´?‚’リストã?ãƒ?‚¯ã‚¹ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹å ´åˆã?行数</td></tr>
599             * <tr><td>multiple="multiple"</td><td>オプション</td><td>é¸æŠžè‚¢ã®ä¸­ã‹ã‚‰è¤?•°é¸æŠžå?æ¥ã‚‹ã‚ˆã?«ã™ã‚‹ã€?/td></tr>
600             * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
601             * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å­—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
602             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
603             * </table>
604             *
605             * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸­ã«,CSSç­‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
606             * æ–?­—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
607             * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
608             *
609             * @param   attri       属æ?群
610             * @param   opt         é¸æŠžè‚¢(オプション)
611             * @param   name        åå‰
612             * @param   optAttri オプション属æ?
613             *
614             * @return  メニュータグæ–?­—å?
615             */
616            public static String select( final Attributes attri,final Options opt,final String name,final String optAttri ) {
617                    String values  = attri.getAttribute( SELECT_KEY );
618                    String options = opt.getOption();
619    
620                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
621                    rtn.append("<select ");
622                    if( name  != null ) { rtn.append("name=\"").append( name ).append( "\" " ); }
623                    rtn.append( values );
624                    if( optAttri != null ) {
625                            rtn.append( " " );
626                            rtn.append( optAttri );
627                    }
628                    rtn.append( ">" );
629                    rtn.append( options );
630                    rtn.append( "</select>" );
631    
632                    return rtn.toString();
633            }
634    
635            /**
636             * オプションを作æ?ã—ã¾ã™ã?
637             *
638             * &lt;select size="行数" name="åå‰" multiple&gt;
639             * &lt;option value="é€ä¿¡æ–?­—ï¼?&gt;コメンãƒ?lt;/option&gt;
640             * &lt;option value="é€ä¿¡æ–?­—ï¼?&gt;コメンãƒ?lt;/option&gt;
641             * &lt;option value="é€ä¿¡æ–?­—ï¼? selected="selected"&gt;コメンãƒ?lt;/option&gt;
642             * &lt;/select&gt;
643             *
644             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
645             * <table border="1" frame="box" rules="all" >
646             * <tr><td>value="値"</td><td>オプション</td><td>é€ä¿¡ã™ã‚‹å€¤</td></tr>
647             * <tr><td>selected="selected"</td><td>オプション</td><td>é¸æŠžè‚¢ã‚’ã‚らã‹ã˜ã‚é¸æŠžã•れãŸçŠ¶æ…‹ã«ã—ã¦ãŠã</td></tr>
648             * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
649             * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?­—å?"</td><td>オリジナル</td><td>é¸æŠžè‚¢ã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?­—å?</td></tr>
650             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
651             * </table>
652             *
653             * セレクタã¨ã¯?Œãƒªã‚¹ãƒˆã?ãƒ?‚¯ã‚¹ã‚?ƒ¡ãƒ‹ãƒ¥ãƒ¼ãªã©ã® option引数ã«ã‚»ãƒ?ƒˆã™ã‚‹
654             * è¤?•°ã®ãƒ??ã‚¿ã‚’optionã‚¿ã‚°ã§ãã‚‹ã‚“ã ã‚‚ã?ã§ã™ã?
655             *
656             * @param   attri 属æ?群
657             *
658             * @return  オプションタグæ–?­—å?
659             */
660            public static String option( final Attributes attri ) {
661                    String values  = attri.getAttribute( OPTION_KEY );
662                    String body     = attri.get( "body" );
663                    if( body == null ) { body = "No Label" ; }
664    
665                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
666                    rtn.append("<option ");
667                    rtn.append( values );
668                    rtn.append( " >" );
669                    rtn.append( body );
670                    rtn.append( "</option>" );
671    
672                    return rtn.toString();
673            }
674    
675            /**
676             * フレーãƒ?‚¿ã‚°ã‚’作æ?ã—ã¾ã™ã?
677             *
678             * &lt;frame marginheight="2px" marginwidth="2px" src="query.jsp" name="QUERY" /&gt;
679             *
680             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
681             * <table border="1" frame="box" rules="all" >
682             * <tr><td>src="URL"</td><td>オプション</td><td>フレーãƒ??表示å…?RLを指定ã—ã¾ã™ã?</td></tr>
683             * <tr><td>name="フレーãƒ?"</td><td>オプション</td><td>フレーãƒ?«ä»˜ã‘ã‚‹åå‰ã‚’æŒ?®šã—ã¾ã™ã?</td></tr>
684             * <tr><td>longdesc="URI"</td><td>オプション</td><td>フレーãƒ??詳ã—ã„説明ã?URI</td></tr>
685             * <tr><td>marginwidth="å·¦å³ã®ãƒžã?ジン"</td><td>オプション</td><td>フレーãƒ??ã®å·¦å³ã®ãƒžã?ジンを指定ã—ã¾ã™ã?</td></tr>
686             * <tr><td>marginheight="上下ã?マã?ジン"</td><td>オプション</td><td>フレーãƒ??ã®ä¸Šä¸‹ã?マã?ジンを指定ã—ã¾ã™ã?</td></tr>
687             * <tr><td>noresize="noresize"</td><td>オプション</td><td>フレーãƒ?‚µã‚¤ã‚ºã‚’変更ã§ããªã?‚ˆã?«ã—ã¾ã™ã?</td></tr>
688             * <tr><td>scrolling="スクロールã®åˆ¶å¾¡"</td><td>オプション</td><td>yes:スクロールãƒã?を表示 no:表示ã—ãªã?auto:å¿?¦ã«å¿œã˜ã¦è¡¨ç¤º(ãƒ?ƒ•ォルãƒ?</td></tr>
689             * <tr><td>frameborder="æž??表示"</td><td>オプション</td><td>0:æž?‚’表示ã—ãªã? 1:æž?‚’表示ã™ã‚‹ã€?ãƒ?ƒ•ォルãƒ?</td></tr>
690             * <tr><td>keys="引数ã«ã‚»ãƒ?ƒˆã™ã‚‹ã‚­ãƒ¼"</td><td>オプション</td><td>URI ã®å¼•æ•°ã«ã‚»ãƒ?ƒˆã™ã‚‹ã‚­ãƒ¼ã‚?CSV å½¢å¼ã§ã‚»ãƒ?ƒˆã—ã¾ã™ã?</td></tr>
691             * <tr><td>value="引数ã«ã‚»ãƒ?ƒˆã™ã‚‹å€¤"</td><td>オプション</td><td>URI ã®å¼•æ•°ã«ã‚»ãƒ?ƒˆã™ã‚‹å€¤ã‚?CSV å½¢å¼ã§ã‚»ãƒ?ƒˆã—ã¾ã™ã?</td></tr>
692             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style</td></tr>
693             * </table>
694             *
695             * 設定ã§ãる属æ?
696             *
697             * scrolling属æ?
698             *
699             *  yes:常ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ãƒã?を表示
700             *  no:常ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ãƒã?を表示ã—ãªã?
701             *  auto:å¿?¦ã«å¿œã˜ã¦ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ãƒã?を表示(ãƒ?ƒ•ォルãƒ?
702             *
703             * を指定ã—ã¾ã™ã?
704             *
705             * frameborder属æ?
706             *
707             *  0:æž?‚’表示ã—ãªã?
708             *  1:æž?‚’表示ã™ã‚‹ã€?ãƒ?ƒ•ォルãƒ?
709             *
710             * を指定ã—ã¾ã™ã?
711             *
712             * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸­ã«,CSSç­‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
713             * æ–?­—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
714             * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
715             *
716             * @param   attri 属æ?群
717             *
718             * @return  フレーãƒ?‚¿ã‚°æ–?­—å?
719             */
720            public static String frame( final Attributes attri ) {
721                    return frame( attri,"" );
722            }
723    
724            /**
725             * フレーãƒ?‚¿ã‚°ã‚’作æ?ã—ã¾ã™ã?
726             *
727             * @param   attri 属æ?群
728             * @param   urlEncode æ–?­—å?   ( ?key1=val1&?¥?¥?¥?¥ ã¨ã?†æ–?­—å? ç„¡ã?¨ãã? "" )
729             *
730             * @return  フレーãƒ?‚¿ã‚°æ–?­—å?
731             */
732            public static String frame( final Attributes attri,final String urlEncode ) {
733    
734                    String src  = addUrlEncode( attri.get( "src" ),urlEncode );
735                    String values = attri.getAttribute( FRAME_KEY );
736    
737                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
738                    rtn.append("<frame src=\"");
739                    rtn.append( src );
740                    rtn.append( "\" " );
741                    rtn.append( values );
742                    rtn.append( " />" );
743    
744                    return rtn.toString();
745            }
746    
747            /**
748             * URLエンコード文字å?を作æ?ã—ã¾ã™ã?
749             * エンコードã™ã¹ã文字å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
750             * エンコード文字å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?­—å?ã‚?
751             * è¿”ã—ã¾ã™ã?
752             * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
753             *
754             * @param   keys   URLã®å¼•æ•°ã¨ãªã‚‹ã‚­ãƒ¼ç¾¤
755             * @param   values URLã®å¼•æ•°ã¨ãªã‚‹å?群
756             *
757             * @return  URLエンコード文字å?
758             */
759            public static String urlEncode( final String keys,final String values ) {
760                    return urlEncode( keys,values,"&" );
761            }
762    
763            /**
764             * URLエンコード文字å?を作æ?ã—ã¾ã™ã?
765             * エンコードã™ã¹ã文字å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
766             * エンコード文字å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?­—å?ã‚?
767             * è¿”ã—ã¾ã™ã?
768             * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
769             *
770             * @param   keys   URLã®å¼•æ•°ã¨ãªã‚‹ã‚­ãƒ¼ç¾¤
771             * @param   values URLã®å¼•æ•°ã¨ãªã‚‹å?群
772             * @param   join   URLã®å¼•数群をé?çµã•ã›ã‚‹æ–?­—å?
773             *
774             * @return  URLエンコード文字å?
775             */
776            public static String urlEncode( final String keys,final String values,final String join ) {
777                    if( keys == null || values == null ) { return ""; }
778    
779                    String[] key = StringUtil.csv2Array( keys );
780                    String[] val = StringUtil.csv2Array( values );
781    
782                    return ( urlEncode( key,val,join ) );
783            }
784    
785            /**
786             * URLエンコード文字å?を作æ?ã—ã¾ã™ã?
787             * エンコードã™ã¹ã文字å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
788             * エンコード文字å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?­—å?ã‚?
789             * è¿”ã—ã¾ã™ã?
790             * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
791             *
792             * @param   key   URLã®å¼•æ•°ã¨ãªã‚‹ã‚­ãƒ¼ã®é…å?
793             * @param   val   URLã®å¼•æ•°ã¨ãªã‚‹å?ã®é…å?
794             *
795             * @return  URLエンコード文字å?
796             */
797            public static String urlEncode( final String[] key,final String[] val ) {
798                    return urlEncode( key,val,"&" );
799            }
800    
801            /**
802             * URLエンコード文字å?を作æ?ã—ã¾ã™ã?
803             * エンコードã™ã¹ã文字å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
804             * エンコード文字å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?­—å?ã‚?
805             * è¿”ã—ã¾ã™ã?
806             * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
807             *
808             * @og.rev 4.3.3.3 (2008/10/22) valã«å¯¾ã—ã¦å‰¯ä½œç”¨ã‚’åŠã¼ã•ãªã?‚ˆã?«ä¿®æ­£
809             *
810             * @param   key   URLã®å¼•æ•°ã¨ãªã‚‹ã‚­ãƒ¼ã®é…å?
811             * @param   val   URLã®å¼•æ•°ã¨ãªã‚‹å?ã®é…å?
812             * @param   join   URLã®å¼•数群をé?çµã•ã›ã‚‹æ–?­—å?
813             *
814             * @return  URLエンコード文字å?
815             */
816            public static String urlEncode( final String[] key,final String[] val,final String join ) {
817                    if( key == null || key.length == 0 || val == null || val.length == 0 ) {
818                            return "";
819                    }
820                    else if( key.length != val.length ) {
821                            String errMsg = "urlEncode ã®ã‚­ãƒ¼ã¨ãƒãƒªãƒ¥ãƒ¼ã®å€‹æ•°ãŒç•°ãªã‚Šã¾ã™ã?" + CR
822                                                    + "key.length=[" + key.length + "]  val.length=[" + val.length + "]";
823                            throw new RuntimeException( errMsg );
824                    }
825    
826                    // 4.3.3.3 (2008/10/22)
827                    String[] tval = new String[val.length];
828    
829                    for( int i=0; i<val.length; i++ ) {
830                            if( key[i] == null || key[i].length() == 0 ) { return ""; }
831                            if( val[i] == null || val[i].length() == 0 ) { tval[i] = ""; }
832                            else if( val[i].charAt(0) == '[' ) {            // 暫定対�
833                                    tval[i] = val[i];
834                            }
835                            else {
836                                    tval[i] = StringUtil.urlEncode( val[i] );
837                            }
838    //                      else if( val[i].charAt(0) != '[' ) {            // 暫定対�
839    //                              tval[i] = StringUtil.urlEncode( val[i] );
840    //                      }
841    //                      else {
842    //                              tval[i] = val[i];
843    //                      }
844                    }
845    
846                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
847    
848                    rtn.append( key[0] ).append( "=" ).append( tval[0] );
849                    for( int i=1; i<key.length; i++) {
850                            rtn.append( join );
851                            rtn.append( key[i] ).append( "=" ).append( tval[i] );
852                    }
853                    return rtn.toString();
854            }
855    
856            /**
857             * URLæ–?­—å?ã«ã€URLエンコード文字å?ã‚’é?çµã—ã¾ã™ã?
858             *
859             * URLæ–?­—å?中ã«ã™ã§ã« "?" æ–?­—ãŒå­˜åœ¨ã™ã‚‹å ´åˆã?ã€URLエンコードå?ã®
860             * æ–?­—å?ã¨ã¯ã€?"&" ã§é€£çµã—ã¾ã™ã?
861             * é€?«ã€??" ãŒå­˜åœ¨ã—ãªã‘れã°ã€??" ã§é€£çµã—ã¾ã™ã?
862             * URLエンコード文字å?ã?null ã®å ´åˆã?ã€??çµã—ã¾ã›ã‚“ã€?
863             *
864             * @param   url URLæ–?­—å?
865             * @param   encode URLエンコード文字å?
866             *
867             * @return  é€£çµæ–‡å­—å?
868             */
869            public static String addUrlEncode( final String url,final String encode ) {
870                    return addUrlEncode( url,encode,"&" );
871            }
872    
873            /**
874             * URLæ–?­—å?ã«ã€URLエンコード文字å?ã‚’é?çµã—ã¾ã™ã?
875             *
876             * URLæ–?­—å?中ã«ã™ã§ã« "?" æ–?­—ãŒå­˜åœ¨ã™ã‚‹å ´åˆã?ã€URLエンコードå?ã®
877             * æ–?­—å?ã¨ã¯ã€?join (ä¾?"&" ) ã§é€£çµã—ã¾ã™ã?
878             * é€?«ã€??" ãŒå­˜åœ¨ã—ãªã‘れã°ã€??" ã§é€£çµã—ã¾ã™ã?
879             * URLエンコード文字å?ã?null ã®å ´åˆã?ã€??çµã—ã¾ã›ã‚“ã€?
880             * 連çµã™ã‚‹ã?encode æ–?­—å?ã®å…ˆé?ãŒã?join æ–?­—å?ã®å ´åˆã?ãã?ã¾ã¾é€£çµã—ã¾ã™ã?
881             * å…ˆé?ãŒã?ãã†ã§ãªã??åˆã?ã€join æ–?­—å?ã§é€£çµã—ã¾ã™ã?
882             * "?" ãŒå­˜åœ¨ã›ãšã€encode æ–?­—å?ã®å…ˆé?ãŒã?join æ–?­—å?ã®å ´åˆã?ã€ã?
883             * encode æ–?­—å?ã®å…ˆé?ã‚’å–り除ã?¦ã€??" ã§é€£çµã—ã¾ã™ã?
884             *
885             * 例�
886             *    � abc.html    key1=val1&key2=val2  �abc.html?key1=val1&key2=val2
887             *    â‘¡?Žabc.html   &key1=val1&key2=val2  â‡?abc.html?key1=val1&key2=val2
888             *    â‘¢?Žabc.html?key1=val1    key2=val2  â‡?abc.html?key1=val1&key2=val2
889             *    â‘£?Žabc.html?key1=val1   &key2=val2  â‡?abc.html?key1=val1&key2=val2
890             *
891             * @og.rev 5.2.1.0 (2010/10/01) urlãŒnullã®å ´åˆã«ã€NullPointerExceptionãŒç™ºç”Ÿã™ã‚‹ãƒã‚°ã‚’修正
892             *
893             * @param   url URLæ–?­—å?
894             * @param   encode URLエンコード文字å?
895             * @param   join   URLã®å¼•数群をé?çµã•ã›ã‚‹æ–?­—å?
896             *
897             * @return  é€£çµæ–‡å­—å?
898             */
899            public static String addUrlEncode( final String url,final String encode,final String join ) {
900                    // 5.2.1.0 (2010/10/01) urlãŒnullã®å ´åˆã«ã€NullPointerExceptionãŒç™ºç”Ÿã™ã‚‹ãƒã‚°ã‚’修正
901                    String tmpUrl = ( url == null ? "" : url );
902    
903                    if( encode == null || encode.length() == 0 ) { return tmpUrl; }
904    
905                    final String rtn ;
906                    if( tmpUrl.indexOf( '?' ) < 0 ) {
907                            if( encode.startsWith( join ) ) {
908                                    rtn = tmpUrl + "?" + encode.substring(join.length());           // â‘¡
909                            }
910                            else {
911                                    rtn = tmpUrl + "?" + encode;                                                            // â‘?
912                            }
913                    }
914                    else {
915                            if( encode.startsWith( join ) ) {
916                                    rtn = tmpUrl + encode;                                          // â‘£
917                            }
918                            else {
919                                    rtn = tmpUrl + join + encode;                           // â‘¢
920                            }
921                    }
922                    return rtn ;
923            }
924    
925            /**
926             * æŒ?®šä½ç½®ã«ç”»åƒã‚’é…ç½®ã—ã¾ã™ã?
927             *
928             * @param   attri 属æ?群
929             *
930             * @return  イメージタグæ–?­—å?
931             */
932            public static String img( final Attributes attri ) {
933                    String values = attri.getAttribute( IMAGE_KEY );
934                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
935                    rtn.append( "<img " );
936                    rtn.append( values );
937                    rtn.append( " />" );
938    
939                    return rtn.toString();
940            }
941    
942            /**
943             * フォーãƒ?‚’作æ?ã—ã¾ã™ã?
944             *
945             * &lt;form action="URI" method="HTTPメソãƒ?ƒ‰" enctype="MIMEタイãƒ? target="フレーãƒ?" ?¥?¥?¥ &gt;フォーãƒ?­?lt;/form&gt;
946             *
947             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
948             * <table border="1" frame="box" rules="all" >
949             * <tr><td>action="URI"</td><td>å¿??</td><td>é€ä¿¡ã•れãŸãƒ•ォーãƒ?ƒ‡ãƒ¼ã‚¿ã‚’å?ç?™ã‚‹ã?ログラãƒ?¼µ?²?©</td></tr>
950             * <tr><td>method="HTTPメソãƒ?ƒ‰"</td><td>オプション</td><td>get/post</td></tr>
951             * <tr><td>enctype="MIMEタイãƒ?</td><td>オプション</td><td>フォーãƒ?ƒ‡ãƒ¼ã‚¿é€ä¿¡æ™‚ã?MIMEタイãƒ?/td></tr>
952             * <tr><td>accept-charset="æ–?­—ã‚»ãƒ?ƒˆ"</td><td>オプション</td><td>ãƒ??ã‚¿ã¨ã—ã¦å—付å¯èƒ½ãªæ–?­—ã‚»ãƒ?ƒˆã®æŒ?®?/td></tr>
953             * <tr><td>accept="MIMEタイãƒ?</td><td>オプション</td><td>ãƒ??ã‚¿ã¨ã—ã¦å‡¦ç?¯èƒ½ãªMIMEタイプをæŒ?®?/td></tr>
954             * <tr><td>name="åå‰"</td><td>オプション</td><td>スクリプト等ã‹ã‚‰å‚ç…§ã™ã‚‹å ´åˆã?åå‰</td></tr>
955             * <tr><td>target="フレーãƒ?"</td><td>オプション</td><td>フォーãƒ?‚’é€ä¿¡ã—ãŸçµæžœã‚’表示ã•ã›ã‚‹ãƒ•レーãƒ?/td></tr>
956             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
957             * <tr><td>body="フォーãƒ?­‰ã?æ–?­—å?"</td><td>å¿??</td><td>input ç­‰ã?フォーãƒ?¦ç´?/td></tr>
958             * </table>
959             *
960             * @param   attri 属æ?群
961             *
962             * @return  フォーãƒ?‚¿ã‚°æ–?­—å?
963             */
964            public static String form( final Attributes attri ) {
965                    String values = attri.getAttribute( FORM_KEY );
966                    String body   = attri.get( "body" );
967                    if( body == null ) { body = "" ; }
968    
969                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
970                    rtn.append("<form ");
971                    rtn.append( values );
972                    rtn.append( ">" );
973                    rtn.append( CR );
974                    rtn.append( body );
975                    rtn.append( CR );
976                    rtn.append("</form>");
977    
978                    return rtn.toString();
979            }
980    
981            /**
982             * 汎用インラインè¦ç´?SPAN)を作æ?ã—ã¾ã™ã?
983             *
984             * &lt;span class="XXXX" ?¥?¥?¥ &gt;ãƒ?‚­ã‚¹ãƒˆç­?lt;/span&gt;
985             *
986             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
987             * <table border="1" frame="box" rules="all" >
988             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
989             * <tr><td>body="ãƒ?‚­ã‚¹ãƒˆç­‰ã?æ–?­—å?"</td><td>オプション</td><td>ã“ã?ãƒ?‚­ã‚¹ãƒˆã‚’修飾ã—ã¾ã™ã?</td></tr>
990             * </table>
991             *
992             * @param   attri 属æ?群
993             *
994             * @return  SPANã‚¿ã‚°æ–?­—å?
995             */
996            public static String span( final Attributes attri ) {
997                    String values = attri.getAttribute( SPAN_KEY );
998    
999                    String optAttri = attri.get( "optionAttributes" );
1000                    String body   = attri.get( "body" );
1001                    if( body == null ) { body = "" ; }
1002    
1003                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
1004                    rtn.append("<span ");
1005                    rtn.append( values );
1006                    if( optAttri != null ) {
1007                            rtn.append( " " );
1008                            rtn.append( optAttri );
1009                    }
1010                    rtn.append( ">" );
1011                    rtn.append( body );
1012                    rtn.append( "</span>" );
1013    
1014                    return rtn.toString();
1015            }
1016    
1017            /**
1018             * 整形済ã¿ãƒ?‚­ã‚¹ãƒ?PRE)を作æ?ã—ã¾ã™ã?
1019             *
1020             * &lt;pre class="XXXX" ?¥?¥?¥ &gt;ãƒ?‚­ã‚¹ãƒˆç­?lt;/pre&gt;
1021             *
1022             * Attributes ã«è¨­å®šã§ãる属æ?</ br>
1023             * <table border="1" frame="box" rules="all" >
1024             * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
1025             * <tr><td>body="ãƒ?‚­ã‚¹ãƒˆç­‰ã?æ–?­—å?"</td><td>オプション</td><td>ã“ã?ãƒ?‚­ã‚¹ãƒˆã‚’修飾ã—ã¾ã™ã?</td></tr>
1026             * </table>
1027             *
1028             * @param   attri 属æ?群
1029             *
1030             * @return  PREã‚¿ã‚°æ–?­—å?
1031             */
1032            public static String pre( final Attributes attri ) {
1033                    String values = attri.getAttribute( PRE_KEY );
1034    
1035                    String optAttri = attri.get( "optionAttributes" );
1036                    String body   = attri.get( "body" );
1037                    if( body == null ) { body = "" ; }
1038    
1039                    StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
1040                    rtn.append("<pre ");
1041                    rtn.append( values );
1042                    if( optAttri != null ) {
1043                            rtn.append( " " );
1044                            rtn.append( optAttri );
1045                    }
1046                    rtn.append( ">" );
1047                    rtn.append( body );
1048                    rtn.append( "</pre>" );
1049    
1050                    return rtn.toString();
1051            }
1052    
1053            /**
1054             * URLãƒã‚§ãƒ?‚¯ç”¨ã®ã‚­ãƒ¼ã‚’è¿”ã—ã¾ã™ã?
1055             *
1056             * å¼•æ•°ã«æŒ?®šã•れãŸhrefã«å¯¾ã—ã¦ã€æ™‚é–“ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼IDを付加ã—ãŸæš—å·åŒ–文字å?ã‚?
1057             * 引数ã«è¿½åŠ?—ã¾ã™ã?
1058             *
1059             * æš—å·åŒ–ã?ã€org.opengion.fukurou.util.HybsCryptographyを使用ã—ã¾ã™ã?
1060             * æš—å·åŒ–ã‚’è¡Œã†æ–?­—å?ã®ãƒ•ォーマットã?ã€[href],time=[checkTime],userid=[loginUser]ã§ã™ã?
1061             *
1062             * @og.rev 4.3.7.1 (2009/06/08) æ–°è¦è¿½åŠ?
1063             * @og.rev 4.3.7.4 (2009/07/01) 循環å‚ç?ã‚’è§£æ¶?
1064             *
1065             * @param   href ãƒã‚§ãƒ?‚¯å¯¾è±¡ã®URL
1066             * @param   key ãƒã‚§ãƒ?‚¯ã‚­ãƒ¼ã®ãƒ‘ラメーターキー
1067             * @param   userid ユーザーID
1068             * @param   time 有効時間
1069             *
1070             * @return  ãƒã‚§ãƒ?‚¯ã‚­ãƒ¼
1071             * @see org.opengion.fukurou.security.HybsCryptography
1072             */
1073            public static String addURLCheckKey( final String href, final String key, final String userid, final long time ) {
1074                    String checkKey = href;
1075    
1076                    checkKey = checkKey.replace( "../", "" );
1077    //              int idx = 0;
1078    //              if ( ( idx = checkKey.indexOf( '#' ) ) >= 0 ) {
1079    //                      checkKey = checkKey.substring( 0, idx );
1080    //              }
1081    //              if ( ( idx = checkKey.indexOf( '?' ) ) >= 0 ) {
1082    //                      checkKey = checkKey.substring( 0, idx );
1083    //              }
1084                    checkKey = checkKey + ",time=" + time + ",userid=" + userid;
1085                    checkKey = HYBS_CRYPTOGRAPHY.encrypt( checkKey );
1086    
1087                    return addUrlEncode( href, key + "=" + checkKey );
1088            }
1089    
1090            /**
1091             * Aã‚¿ã‚°ã®æ–?­—å?ã‚’è§£æžã—ã¦ã€href属æ?ã«URLãƒã‚§ãƒ?‚¯ç”¨ã®æš—å·åŒ–文字å?を付加ã—ãŸå½¢ã§ã€?
1092             * Aã‚¿ã‚°ã‚’å?構築ã—ã€è¿”ã—ã¾ã™ã?
1093             *
1094             * @og.rev 4.3.7.1 (2009/06/08) æ–°è¦è¿½åŠ?
1095             * @og.rev 4.3.7.4 (2009/07/01) 循環å‚ç?ã‚’è§£æ¶?
1096             *
1097             * @param   tag Aã‚¿ã‚°æ–?­—å?
1098             * @param   key ãƒã‚§ãƒ?‚¯ã‚­ãƒ¼ã®ãƒ‘ラメーターキー
1099             * @param   userid ユーザーID
1100             * @param   time 有効時間
1101             *
1102             * @return  URLãƒã‚§ãƒ?‚¯ã‚­ãƒ¼ãŒä»˜åŠ ã•れãŸAã‚¿ã‚°æ–?­—å?
1103             */
1104            public static String embedURLCheckKey( final String tag, final String key, final String userid, final long time  ) {
1105                    String rtn = tag;
1106                    int hrefStr = rtn.indexOf( "href=\"" );
1107                    if( hrefStr >= 0 ) {
1108                            int hrefEnd = rtn.indexOf( "\"",hrefStr + 6 );
1109                            if( hrefEnd >= 0 ) {
1110                                    String href = rtn.substring( hrefStr + 6, hrefEnd );
1111                                    href = XHTMLTag.addURLCheckKey( href, key, userid, time );
1112                                    rtn = rtn.substring( 0,  hrefStr ) + "href=\"" + href + rtn.substring( hrefEnd );
1113                            }
1114                    }
1115                    return rtn;
1116            }
1117    }