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.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    
021    import static org.opengion.fukurou.util.StringUtil.nval ;
022    
023    import org.opengion.fukurou.util.TagBuffer;
024    import org.opengion.fukurou.util.XHTMLTag;
025    
026    /**
027     * TagSupport から継承されたサブクラスです?
028     *
029     * 汎用属? のsetterメソ?を持って?す?
030     * それ以外に、{@XXXX} 変数の対応と、lang属?のメソ?も用意して?す?
031     *
032     * ロケールは、ユーザー??の lang 属?をデフォルトで使用し?
033     * セ?されて???合?、リクエスト情報のロケールから取得します?
034     *
035     * ??は、{@XXXX} 変数が使用できます?
036     * これは、ServletRequest から、XXXX をキーに値を取り??こ?変数に
037     * 割り当てます?つまり?こ?XXXXをキーにリクエストすれ??
038     * こ?変数に値をセ?することができます?
039     *
040     * http://localhost/query.jsp?KEY1=VLA1&KEY2=VAL2
041     *
042     * のようなリクエストで、{@KEY1} とすれば?VAL1 がセ?されます?
043     *
044     * こ?タグは、ラベル部?入力フィールド部???ブルタグの<td>
045     * により左右に?されます?HTML 表示時?、前後に<tr>タグで囲って,
046     * 整形できます?
047     *
048     * ※ readonly , disabled , autofocus[HTML5] , required[HTML5]  は、論理属?です?
049     * 通常は、キーワード?みの?で、有効です?
050     * よって、readonly="false" としても?readonly と?キーワードが存在すると、有効になります?
051     * 記述? ?eadonly ②readonly="" ③readonly="readonly" の?種類が推奨されます?
052     *          「属?名? 「属??""?「属??"属???
053     * フレー?ーク側の問題として、①?の渡し方は他?属?との関係や、動?リクエスト変数の処??
054     * 関係で、③を利用します?また?動的?の為に、④readonly="[true/false]" も受け付けます?
055     * ??は、readonly="true" の場合?、readonly="readonly" を作?し?readonly="false" の場合??
056     * なにも作?しな??処?行って?す?
057     *
058     * @og.group 画面部?
059     *
060     * @version  4.0
061     * @author   Kazuhiko Hasegawa
062     * @since    JDK5.0,
063     */
064    abstract class HTMLTagSupport extends CommonTagSupport {
065            //* こ?プログラ??VERSION??を設定します?       {@value} */
066            private static final String VERSION = "5.7.2.0 (2014/01/10)" ;
067    
068            private static final long serialVersionUID = 572020140110L ;
069            
070            // 5.8.4.1 (2014/02/20) AimaiPicker のタイプに対応したキーワー?
071            private static final String[] AIMAI_TEXT = new String[] { " V ", " V*", "*V ", "*V*" };
072            private static final String[] AIMAI_TITL = new String[] { "完???", "前方??", "後方??", "前後曖昧" };
073    
074            // 5.2.1.0 (2010/10/01) must , mustAny 属?を?動化します?
075            private String  mustType        = null;         // 5.2.1.0 (2010/10/01)
076            // 5.7.2.0 (2014/01/10) 自動化の制御をできるようにします?(初期は自?
077            private boolean useMustHidden = true;   // 5.7.2.0 (2014/01/10)
078            
079            //  5.8.4.1 (2014/02/20) aimai 属?を追??
080            private int             aimai           = -1;           // 6.2.0.0 (2015/01/30)
081    
082            /**
083             * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
084             *
085             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
086             * @og.rev 4.0.0.0 (2005/11/30) ロール を?慮します?
087             * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対?
088             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
089             *
090             * @return      後続??
091             */
092            @Override
093            public int doEndTag() {
094                    debugPrint();           // 4.0.0 (2005/02/28)
095                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
096                    if( useTag() && getUser().isAccess( get( "roles" ) ) ) {                        // 4.3.0.0 (2008/07/04) ロールモード?ルチ対?
097                            jspPrint( makeTag() );
098                    }
099                    return EVAL_PAGE ;
100            }
101    
102            /**
103             * タグリブオブジェクトをリリースします?
104             * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
105             *
106             * @og.rev 5.2.1.0 (2010/10/01) mustType 属?を追??
107             * @og.rev 5.7.2.0 (2014/01/10) useMustHidden追?
108             * @og.rev 5.8.4.1 (2015/02/20) aimai追?
109             */
110            @Override
111            protected void release2() {
112                    super.release2();
113                    mustType        = null;         // 5.2.1.0 (2010/10/01)
114                    useMustHidden = true;   // 5.7.2.0 (2013/12/10)
115                    aimai                   = -1;   // 5.8.4.1 (2015/02/20)
116            }
117    
118            /**
119             * ボタンを作?します?
120             *
121             * <button type="submit" name="名前" value="値">
122             *
123             * @return  ボタンタグ??
124             */
125            abstract protected String makeTag() ;
126    
127            /**
128             * 【HTML】要?対して固有?名前(id)をつける場合に設定します?
129             *
130             * @og.tag
131             * 特別な使用方法として、id="FOCUS" とすることで、フィールド系要?
132             * フォーカスを移動させます?これは、そのペ?ジ?唯?? id 属?として使用ください?
133             *
134             * ※ HTML5 より、autofocus属?の使用が可能になりました?
135             *
136             * @param   id 固有?名前
137             */
138            @Override
139            public void setId( final String id ) {
140                    set( "id",getRequestParameter( id ) );
141            }
142    
143            /**
144             * 【HTML】要?対して class 属?を設定します?
145             *
146             * @og.tag
147             * Javaの?使用上?class で作?できな?め?代用として
148             * clazz を使用して?す?
149             * html で作?される属?は?class で作?されます?
150             *
151             * @og.rev 3.5.0.0 (2003/09/17) set ではなく?add を利用します?
152             *
153             * @param   cls classを表す文字?
154             */
155            public void setClazz( final String cls ) {
156                    add( "class",getRequestParameter( cls ) );      // 3.5.5.9 (2004/06/07) セパレータ引数付きのメソ?に変更
157            }
158    
159            /**
160             * 【HTML】要???と他?属?値の??lang,xml:lang)を指定します?
161             *
162             * @og.tag
163             * HTMLの?属?に使われます??する?は、ISO 639で規定されて?「?コード?です?
164             * [ja/en/zh/…]などのほかに、en-US:アメリカ英語?en-cockney:コ?ニ?英?など?
165             * 副?を?する方法も定められて?す?
166             * ここでは、lang と xml:lang の両方に同じ値がセ?されます?
167             * タグの language 属?とは使用用途が異なります?
168             *
169             * @og.tag lang セ?
170             *
171             * @param   lang ?[ja/en/zh/…]
172             */
173            public void setLang( final String lang ) {
174                    String lng = getRequestParameter( lang );
175                    if( lng != null ) {
176                            set( "lang",lng );
177                            set( "xml:lang",lng );
178                    }
179            }
180    
181            /**
182             * 【HTML】文字表記?方?dir)を指定します?
183             *
184             * @og.tag
185             * 当該要??書字方向を?する属?です?
186             * ltr で、左から右に、rtl で、右から左に並べます?
187             *
188             * @param   dir (ltr:左から右、rtl:右から左 )
189             */
190            public void setDir( final String dir ) {
191                    set( "dir",getRequestParameter( dir ) );
192            }
193    
194            /**
195             * 【HTML】要?対する補足?報(title)を設定します?
196             *
197             * @og.tag
198             * title セ?は、?タンなどに適用すると、?ウスオーバ?によりこ?メ?ージ?
199             * チップスのように表示されます?これを利用して、説明文を登録することが可能です?
200             * ここに登録した??が?メ?ージリソースに存在する場合?、そのメ?ージ?
201             * 存在しな??合?、そのままの値を設定します?
202             *
203             * @og.rev 3.5.5.8 (2004/05/20) メ?ージリソースから読み込んだ?を使用します?
204             * @og.rev 4.0.0.0 (2007/10/18) メ?ージリソース統? getResource().getMessage ?getResource().getLabel )
205             *
206             * @param   title 補足?報(title)
207             */
208            public void setTitle( final String title ) {
209                    String str = nval( getRequestParameter( title ),null );
210                    if( str != null ) {
211                            set( "title",getResource().getLabel( str ) );
212                    }
213            }
214    
215            /**
216             * 【HTML】この要?対して適用させるスタイルシー?style)を設定します?
217             *
218             * @og.tag
219             * タグにstyle属?を設定します?これは、キー:値; のセ?を?記述できます?
220             * 通常は、class属???id属?で登録しておき?lt;style type="text/css"> で
221             * 外部から?する方がソースは読み?くなります?
222             *
223             * @param   style スタイルシー?style="color:red; font-size:24pt;" など)
224             */
225            public void setStyle( final String style ) {
226                    set( "style",getRequestParameter( style ) );
227            }
228    
229            /**
230             * 【TAG】その部品に対して変更が?来な??(readonly)?しま?サーバ?に送信され??
231             *
232             * @og.tag
233             * INPUT/TEXTAREA 系に対して、指定可能です?
234             * readonly="readonly" , readonly="true" が指定された場合?、有効です?
235             * false も指定?としては、有効です?(大?小文字?区別も不?
236             * それ以外???、エラーとします?
237             *
238             * ※ readonly は、論理属?です?
239             *
240             * @og.rev 3.7.1.0 (2005/04/26) readonly,true,false が指定できるように変更?
241             *
242             * @param   ronly 読み取り専用属?[readonly/true/false]
243             */
244            public void setReadonly( final String ronly ) {
245                    String readonly = nval( getRequestParameter( ronly ),null );
246                    if( readonly != null ) {
247                            if( "readonly".equalsIgnoreCase( readonly ) ||
248                                    "true".equalsIgnoreCase( readonly ) ) {
249                                            set( "readonly","readonly" );
250                            }
251                            else if( ! "false".equalsIgnoreCase( readonly ) ) {
252                                    String errMsg = "readonly には、[readonly,true,false]以外????できません?
253                                                                    + " readonly=[" + readonly + "]" + HybsSystem.CR ;
254                                    throw new HybsSystemException( errMsg );
255                            }
256                    }
257            }
258    
259            /**
260             * 【TAG】その部品に対して?択や変更が?来な??(disabled)?しま?サーバ?に送信されな??
261             *
262             * @og.tag
263             * BUTTON/INPUT/OPTGROUP/OPTION/SELECT/TEXTAREA 系に対して、指定可能です?
264             * disabled="disabled" , disabled="true" が指定された場合?、有効です?
265             * false も指定?としては、有効です?(大?小文字?区別も不?
266             * それ以外???、エラーとします?
267             *
268             * ※ disabled は、論理属?です?
269             *
270             * @og.rev 3.7.1.0 (2005/04/26) disabled,true,false が指定できるように変更?
271             *
272             * @param   dis 選択や変更が?来な??するかど?[disabled/true/false]
273             */
274            public void setDisabled( final String dis ) {
275                    String disabled = nval( getRequestParameter( dis ),null );
276                    if( disabled != null ) {
277                            if( "disabled".equalsIgnoreCase( disabled ) ||
278                                    "true".equalsIgnoreCase( disabled ) ) {
279                                            set( "disabled","disabled" );
280                            }
281                            else if( ! "false".equalsIgnoreCase( disabled ) ) {
282                                    String errMsg = "disabled には、[disabled/true/false]以外????できません?
283                                                                    + " disabled=[" + disabled + "]" + HybsSystem.CR ;
284                                    throw new HybsSystemException( errMsg );
285                            }
286                    }
287            }
288    
289            /**
290             * 【HTML】タブ?移動?(tabindex)を指定しま?0 ??32767)?
291             *
292             * @og.tag
293             * Tabキーを押したときに要?選択される?を指定します?
294             * 値には?択させた??番を数値で記述します?
295             *
296             * @param       tabindex        タブ?移動?(0 ??32767)
297             */
298            public void setTabindex( final String tabindex ) {
299                    set( "tabindex",getRequestParameter( tabindex ) );
300            }
301    
302            /**
303             * 【HTML】アクセスキー(alt+キーで直接??を割り当てます?
304             *
305             * @og.tag
306             * アクセスキーは、?ウスの使えな??も?リンクにジャンプする?ボタンを押す?入力フォー?
307             * フォーカスを移すなどの操作を簡単に行うことができるように??されたものです?
308             * Windows の「ファイル(F)」メニューにつ??、F と同じような働きをします?
309             *
310             * @param   accesskey アクセスキー
311             */
312            public void setAccesskey( final String accesskey ) {
313                    set( "accesskey",getRequestParameter( accesskey ) );
314            }
315    
316            /**
317             * 【TAG】JavaScript などの HTML基本タグ以外?属?を?そ?ままタグとして使用します?
318             *
319             * @og.tag
320             * JavaScript などの HTML基本タグ以外?属?を?そ?まま
321             * タグとして使用します?
322             *
323             * @og.rev 3.1.0.1 (2003/03/26) (')?")に置き換え??て?のを止める?
324             *
325             * @param   optionAttributes HTML基本タグ以外?属?
326             */
327            public void setOptionAttributes( final String optionAttributes ) {
328                    String optAttri = getRequestParameter( optionAttributes );
329                    if( optAttri != null && optAttri.length() > 0 ) {
330                            set( "optionAttributes",optAttri );
331                    }
332            }
333    
334            /**
335             * 【HTML】JavaScriptのイベン?onClick を設定しま??onClick="renew('query.jsp','QUERY');")?
336             *
337             * @og.tag
338             * onClick をセ?します?
339             * 例えば?lt;og:column name="KBSAKU" onClick="renew('query.jsp','QUERY');" />
340             * のように?することで、?ル?ンメニューの絞込み検索が可能になります?
341             *
342             * @og.rev 3.5.0.0 (2003/09/17) 新規追?
343             * @og.rev 3.5.5.9 (2004/06/07) セパレータ付きの追?ソ?に変更
344             *
345             * @param       onClick onClickイベン??onClick="renew('query.jsp','QUERY');")
346             */
347            public void setOnClick( final String onClick ) {
348                    add( "onClick",getRequestParameter( onClick ),";" );
349            }
350    
351            /**
352             * 【HTML】JavaScriptのイベン?onChange を設定しま??onChange="renew('query.jsp','QUERY');")?
353             *
354             * @og.tag
355             * onChange をセ?します?
356             * 例えば?lt;og:column name="KBSAKU" onChange="renew('query.jsp','QUERY');" />
357             * のように?することで、?ル?ンメニューの絞込み検索が可能になります?
358             *
359             * @og.rev 3.5.0.0 (2003/09/17) 新規追?
360             * @og.rev 3.5.5.9 (2004/06/07) セパレータ付きの追?ソ?に変更
361             *
362             * @param   onChange    onChangeイベン??onChange="renew('query.jsp','QUERY');")
363             */
364            public void setOnChange( final String onChange ) {
365                    add( "onChange",getRequestParameter( onChange ),";" );
366            }
367    
368            /**
369             * 【HTML】JavaScriptのイベン?onBlur を設定しま??onBlur="this.value=value.toUpperCase();")?
370             *
371             * @og.tag
372             * onBlur は、フォーカスが離れたときに発生するイベントです?
373             *
374             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
375             *
376             * @param   onBlur      onBlurイベン??onBlur="this.value=value.toUpperCase();")
377             */
378            public void setOnBlur( final String onBlur ) {
379                    add( "onBlur",getRequestParameter( onBlur ),";" );
380            }
381    
382            /**
383             * 【HTML】JavaScriptのイベン?onFocus を設定します?
384             *
385             * @og.tag
386             * onFocus は、フォーカスされたときに発生するイベントです?
387             *
388             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
389             *
390             * @param   onFocus     onFocusイベン?
391             */
392            public void setOnFocus( final String onFocus ) {
393                    add( "onFocus",getRequestParameter( onFocus ),";" );
394            }
395    
396            /**
397             * 【HTML】JavaScriptのイベン?onSelect を設定します?
398             *
399             * @og.tag
400             * onSelect は、テキストフィール??ストエリアの?ストが
401             * 選択されたときに発生するイベントです?
402             *
403             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
404             *
405             * @param   onSelect    onSelectイベン?
406             */
407            public void setOnSelect( final String onSelect ) {
408                    add( "onSelect",getRequestParameter( onSelect ),";" );
409            }
410    
411            /**
412             * 【HTML】JavaScriptのイベン?ondblClick を設定します?
413             *
414             * @og.tag
415             * ondblClick は、?ウスで?ルクリ?されたときに発生するイベントです?
416             *
417             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
418             *
419             * @param   ondblClick  ondblClickイベン?
420             */
421            public void setOndblClick( final String ondblClick ) {
422                    add( "ondblClick",getRequestParameter( ondblClick ),";" );
423            }
424    
425            /**
426             * 【HTML】JavaScriptのイベン?onMouseDown を設定します?
427             *
428             * @og.tag
429             * onMouseDown は、?ウス?ンされたときに発生するイベントです?
430             *
431             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
432             *
433             * @param   onMouseDown onMouseDownイベン?
434             */
435            public void setOnMouseDown( final String onMouseDown ) {
436                    add( "onMouseDown",getRequestParameter( onMouseDown ),";" );
437            }
438    
439            /**
440             * 【HTML】JavaScriptのイベン?onMouseUp を設定します?
441             *
442             * @og.tag
443             * onMouseUp は、?ウスア??されたときに発生するイベントです?
444             *
445             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
446             *
447             * @param   onMouseUp   onMouseUpイベン?
448             */
449            public void setOnMouseUp( final String onMouseUp ) {
450                    add( "onMouseUp",getRequestParameter( onMouseUp ),";" );
451            }
452    
453            /**
454             * 【HTML】JavaScriptのイベン?onMouseMove を設定します?
455             *
456             * @og.tag
457             * onMouseMove は、?ウスが移動されたときに発生するイベントです?
458             *
459             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
460             *
461             * @param   onMouseMove onMouseMoveイベン?
462             */
463            public void setOnMouseMove( final String onMouseMove ) {
464                    add( "onMouseMove",getRequestParameter( onMouseMove ),";" );
465            }
466    
467            /**
468             * 【HTML】JavaScriptのイベン?onMouseOut を設定します?
469             *
470             * @og.tag
471             * onMouseOut は、?ウスが離れたときに発生するイベントです?
472             *
473             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
474             *
475             * @param   onMouseOut  onMouseOutイベン?
476             */
477            public void setOnMouseOut( final String onMouseOut ) {
478                    add( "onMouseOut",getRequestParameter( onMouseOut ),";" );
479            }
480    
481            /**
482             * 【HTML】JavaScriptのイベン?onMouseOver を設定します?
483             *
484             * @og.tag
485             * onMouseOver は、?ウスが重なったときに発生するイベントです?
486             *
487             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
488             *
489             * @param   onMouseOver onMouseOverイベン?
490             */
491            public void setOnMouseOver( final String onMouseOver ) {
492                    add( "onMouseOver",getRequestParameter( onMouseOver ),";" );
493            }
494    
495            /**
496             * 【HTML】JavaScriptのイベン?onKeydown を設定します?
497             *
498             * @og.tag
499             * onKeydown は、キーが押されたときに発生するイベントです?
500             *
501             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
502             *
503             * @param   onKeydown   onKeydownイベン?
504             */
505            public void setOnKeydown( final String onKeydown ) {
506                    add( "onKeydown",getRequestParameter( onKeydown ),";" );
507            }
508    
509            /**
510             * 【HTML】JavaScriptのイベン?onKeypress を設定します?
511             *
512             * @og.tag
513             * onKeypress は、キーが押され続けて?ときに発生するイベントです?
514             *
515             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
516             *
517             * @param   onKeypress  onKeypressイベン?
518             */
519            public void setOnKeypress( final String onKeypress ) {
520                    add( "onKeypress",getRequestParameter( onKeypress ),";" );
521            }
522    
523            /**
524             * 【HTML】JavaScriptのイベン?onKeyup を設定します?
525             *
526             * @og.tag
527             * onKeyup は、キーが押された状態から離されたときに発生するイベントです?
528             *
529             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
530             *
531             * @param   onKeyup     onKeyupイベン?
532             */
533            public void setOnKeyup( final String onKeyup ) {
534                    add( "onKeyup",getRequestParameter( onKeyup ),";" );
535            }
536    
537            /**
538             * 【HTML5】?力?補を提示して入力?容を?動補完する[on/off]??期?はon??
539             *
540             * @og.tag
541             * HTML5から追?れた新機?です?
542             * オートコンプリートを有効にする場合?、on 、無効にする場合?、off を設定します?
543             * 初期値は、on(有効) です?
544             * 
545             * <datalist> タグを使用して、?力?補となるデータリストを定義できます? 
546             * ?ータのリスト?目は?lt;option>で定義します? <datalist>をサポ?トしたブラウザでは?
547             * <option>で?された値がユーザーに対して入力?補として提案表示されます? 
548             * <input>のlist属?の値と<datalist>のid属?の値を同じにして、?力?
549             * ??タリストを関連付けます? 
550             *
551             * 利用可能type:[text,search,url,tel,email,password,datetime,date,month,week,time,datetime-local,number,range,color]
552             *
553             * <pre>
554             * &lt;og:input type="text" name="yourarea" autocomplete="on" list="tokyo" /&gt;
555             *
556             *  &lt;og:datalist id="tokyo" &gt;
557             *      &lt;og:option value="渋谷" /&gt;
558             *      &lt;og:option value="新宿" /&gt;
559             *      &lt;og:option value="?? /&gt;
560             *  &lt;/og:datalist&gt;&lt;
561             * </pre>
562             *
563             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
564             *
565             * @param       autocomplete 入力?補?自動補完?設?[on/off]??期?はon??
566             * @see         <a href="http://www.htmq.com/html5/input_autocomplete.shtml">autocomplete</a>
567             */
568            public void setAutocomplete( final String autocomplete ) {
569                    set( "autocomplete" , getRequestParameter( autocomplete ) );
570            }
571    
572            /**
573             * 【HTML5】指定した?力?カーソルが当たって自動的にフォーカスされます?
574             *
575             * @og.tag
576             * HTML5から追?れた新機?です?
577             * autofocus属?を指定すると、ウェブ?ージが表示された際に?
578             * ?した?力?カーソルが当たって自動的にフォーカスされます?
579             *
580             * autofocus="autofocus" , autofocus="true" が指定された場合?、有効です?
581             * false も指定?としては、有効です?(大?小文字?区別も不?
582             * それ以外???、エラーとします?
583             *
584             * 利用可能type:[text,search,url,tel,email,password]
585             *
586             * ※ autofocus は、論理属?です?
587             *
588             * <pre>
589             * &lt;og:input type="text" name="userid" autofocus="autofocus" /&gt;
590             * </pre>
591             *
592             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
593             *
594             * @param       atfocus カーソルが当たって自動的にフォーカスされ?
595             * @see         <a href="http://www.htmq.com/html5/input_autofocus.shtml">autofocus</a>
596             */
597            public void setAutofocus( final String atfocus ) {
598                    String autofocus = nval( getRequestParameter( atfocus ),null );
599                    if( autofocus != null ) {
600                            if( "autofocus".equalsIgnoreCase( autofocus ) ||
601                                    "true".equalsIgnoreCase( autofocus ) ) {
602                                            set( "autofocus","autofocus" );
603                            }
604                            else if( ! "false".equalsIgnoreCase( autofocus ) ) {
605                                    String errMsg = "autofocus には、[autofocus,true,false]以外????できません?
606                                                                    + " autofocus=[" + autofocus + "]" + HybsSystem.CR ;
607                                    throw new HybsSystemException( errMsg );
608                            }
609                    }
610            }
611    
612            /**
613             * 【HTML5】正規表現で入力?のパターンを指定します?
614             *
615             * @og.tag
616             * HTML5から追?れた新機?です?
617             * 正規表現を使って入力?のパターンを指定することができます?
618             *
619             * 利用可能type:[text,search,url,tel,email,password]
620             *
621             * <pre>
622             * &lt;og:input type="text" name="userid" pattern="^[0-9A-Za-z]+$" /&gt; ※半角英数
623             * </pre>
624             *
625             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
626             *
627             * @param       pattern 正規表現で入力?のパターンを指?
628             * @see         <a href="http://www.htmq.com/html5/input_pattern.shtml">pattern</a>
629             */
630            public void setPattern( final String pattern ) {
631                    set( "pattern",getRequestParameter( pattern ) );
632            }
633    
634            /**
635             * 【HTML5】?力?初期表示する?を指定します?
636             *
637             * @og.tag
638             * HTML5から追?れた新機?です?
639             * placeholder属?で?した?が?入力?初期値として表示されます?
640             * 例えば、テキストフィールドに初期値として?「検索するキーワードを入力してください?
641             * などのヒントを示してユーザーの操作を補助することができます? 
642             *
643             * 利用可能type:[text,search,url,tel,email,password]
644             *
645             * <pre>
646             * &lt;og:input type="search" name="q" placeholder="キーワードを入? /&gt;
647             * </pre>
648             *
649             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
650             *
651             * @param       placeholder 入力?初期表示する?
652             * @see         <a href="http://www.htmq.com/html5/input_placeholder.shtml">placeholder</a>
653             */
654            public void setPlaceholder( final String placeholder ) {
655                    set( "placeholder",getRequestParameter( placeholder ) );
656            }
657    
658            /**
659             * 【HTML5】ユーザーに入力?補として提案するデータリスト?要??id属?の値を指定します?
660             *
661             * @og.tag
662             * HTML5から追?れた新機?です?
663             * ユーザーに入力?補として提案するデータリストタグ(&lt;datalist&gt;)のid属??
664             * こ?、list 属?に設定することで?連付けができます?
665             * 
666             * ※
667             * ?事情で、list属? に設定するキーも?datalistタグのid属?に設定するキーも?
668             * inputタグ(columnタグ)の name属???.sel" を標準的に使用してください?
669             *
670             * 利用可能type:[text,search,url,tel,email,datetime,date,month,week,time,datetime-local,number,range,color]
671             *
672             * <pre>
673             *              &lt;og:input type="search" name="keywords" autocomplete="on" list="keywords.sel" /&gt;
674             *              &lt;og:datalist id="keywords.sel"&gt;
675             *                      &lt;og:option value="ウィキペディア" /&gt;
676             *                      &lt;og:option value="ウィルス対? /&gt;
677             *                      &lt;og:option value="ウィンドウズ" /&gt;
678             *              &lt;/og:datalist&gt;
679             * </pre>
680             *
681             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
682             *
683             * @param       list 入力?補として提案するデータリスト?id属?の値を指?
684             * @see         <a href="http://www.htmq.com/html5/datalist.shtml">list</a>
685             */
686            public void setList( final String list ) {
687                    set( "list",getRequestParameter( list ) );
688            }
689    
690            /**
691             * 【HTML5】?力?入力できる??を指定します?
692             *
693             * @og.tag
694             * HTML5から追?れた新機?です?
695             *  数値型や日付型の入力?入力できる??を指定することができます?
696             *
697             * 利用可能type:[datetime,date,month,week,time,datetime-local,number,range]
698             *
699             * <pre>
700             * &lt;og:input type="number" name="ninzu" min="1" max="4" /&gt;??1人以?人以?
701             * </pre>
702             *
703             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
704             *
705             * @param       min 入力できる??
706             * @see         <a href="http://www.htmq.com/html5/input_min.shtml">min</a>
707             */
708            public void setMin( final String min ) {
709                    set( "min",getRequestParameter( min ) );
710            }
711    
712            /**
713             * 【HTML5】?力?入力できる?値を指定します?
714             *
715             * @og.tag
716             * HTML5から追?れた新機?です?
717             *  数値型や日付型の入力?入力できる?値を指定することができます?
718             *
719             * 利用可能type:[datetime,date,month,week,time,datetime-local,number,range]
720             *
721             * <pre>
722             * &lt;og:input type="number" name="ninzu" min="1" max="4" /&gt;??1人以?人以?
723             * </pre>
724             *
725             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
726             *
727             * @param       max 入力できる?値
728             * @see         <a href="http://www.htmq.com/html5/input_min.shtml">max</a>
729             */
730            public void setMax( final String max ) {
731                    set( "max",getRequestParameter( max ) );
732            }
733    
734            /**
735             * 【HTML5】?力?刻??プ?を指定する?
736             *
737             * @og.tag
738             * HTML5から追?れた新機?です?
739             * step属?を指定すると?数値型や日付型の入力?刻??プ?を指定することができます?
740             *
741             * 利用可能type:[datetime,date,month,week,time,datetime-local,number,range]
742             *
743             * <pre>
744             * &lt;og:input type="number" name="lot" step="0.5" /&gt;??単?.5
745             * </pre>
746             *
747             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
748             *
749             * @param       step 入力?刻??プ?
750             * @see         <a href="http://www.htmq.com/html5/input_step.shtml">step</a>
751             */
752            public void setStep( final String step ) {
753                    set( "step",getRequestParameter( step ) );
754            }
755    
756            /**
757             * 【HTML5】?力??を指定する?
758             *
759             * @og.tag
760             * HTML5から追?れた新機?です?
761             * 入力?目が?力??であることをブラウザに知らせることができます?
762             * 単独で、required 属?を使用できるようにしておきます?
763             *
764             * フレー?ークの入力??は、must 属?ですが、must 属?を指定した?合にも?
765             * シス?リソースの USE_HTML5_HEADER ?true に設定して?場合??
766             * required 属?を?力します?
767             *
768             * 利用可能type:[text,search,url,tel,email,datetime,date,month,week,time,datetime-local,number,checkbox,radio,file]
769             *
770             * ※ required は、論理属?です?
771             *
772             * <pre>
773             * &lt;og:input type="text" name="yourname" required="required" /&gt;
774             * </pre>
775             *
776             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
777             *
778             * @param       req 入力??を指?
779             * @see         <a href="http://www.htmq.com/html5/input_required.shtml">required</a>
780             */
781            public void setRequired( final String req ) {
782                    String required = nval( getRequestParameter( req ),null );
783                    if( required != null ) {
784                            if( "required".equalsIgnoreCase( required ) ||
785                                    "true".equalsIgnoreCase( required ) ) {
786                                            set( "required","required" );
787                            }
788                            else if( ! "false".equalsIgnoreCase( required ) ) {
789                                    String errMsg = "required には、[required/true/false]以外????できません?
790                                                                    + " required=[" + required + "]" + HybsSystem.CR ;
791                                    throw new HybsSystemException( errMsg );
792                            }
793                    }
794            }
795    
796            /**
797             * 【TAG】ロールをセ?します?
798             *
799             * @og.tag
800             * ここで?したカラ?ールを?に、ユーザー毎?アクセス許可がチェ?されます?
801             * アクセス許可されな?、表示されません?
802             * こ?ロールを指定しな??合?、カラ?ソースのロールが使用されます?
803             *
804             * @og.rev 4.0.0.0 (2005/11/30) 新規追?
805             *
806             * @param       roles ロール
807             */
808            public void setRoles( final String roles ) {
809                    set( "roles",getRequestParameter( roles ) );
810            }
811    
812            /**
813             * 【TAG】??入力を表す色に変えるかど?[true/false]を指定しま?初期値:false)?
814             *
815             * @og.tag
816             * 初期値は、??でな?"false") です?
817             * シス?リソースの USE_HTML5_HEADER が?true に?されて?場合??
818             * HTML5 適用として、required 属?も?出力します?
819             *
820             * &lt;og:input name="PN" must="true" /&gt;
821             *
822             * @og.rev 5.2.1.0 (2010/10/01) 新規追?
823             * @og.rev 5.7.1.0 (2013/12/06) HTML5 対?required属?)?
824             *
825             * @param       flag    ??入力色に変えるかど?[true:??入?それ以???でない]
826             */
827            public void setMust( final String flag ) {
828                    mustType = nval( getRequestParameter( flag ),null );
829                    if( "true".equalsIgnoreCase( mustType ) ) {
830                            mustType = "must";
831                            add( "class","must" );
832    
833                            // 5.7.1.0 (2013/12/06) HTML5 対?required属?)?
834                            if( isUseHTML5() ) {
835                                    set( "required","required" );
836                            }
837                    }
838            }
839    
840            /**
841             * 【TAG】選択??入?どれかひとつ??)を表す色[true/mustAny/そ?他]を指定しま?初期値:無???
842             *
843             * @og.tag
844             * ?のカラ???、どれかひとつを??とする選択??入力を示す色を指定します?
845             * true また?、mustAny を設定すると、class属?に、mustAny がセ?されます?
846             * mustAny は、CSSファイルに初期設定されて?す?true また?、mustAny 以外?値をセ?
847             * すると、その値がそのまま、class属?にセ?されます?で?択??のグループ化?
848             * 可能です?
849             * なお?実際の選択??入力チェ?は、ここではなく?columnCheck タグで?が?です?
850             * 自動???、mustAny="true" ??場合?み有効です?
851             * 初期値は、無?です?
852             *
853             * @og.rev 5.2.1.0 (2010/10/01) 新規追?
854             *
855             * @param       flag 選択??入の?[true/mustAny/そ?他]
856             */
857            public void setMustAny( final String flag ) {
858                    if( mustType == null ) {        // must 属?と同時設定時には、must 属?を優先します?
859                            mustType = nval( getRequestParameter( flag ),null );
860                            if( "true".equalsIgnoreCase( mustType ) ) {
861                                    mustType = "mustAny";
862                            }
863                            add( "class",mustType );        // mustType == null の場合?、add されません?
864                    }
865            }
866            
867            /**
868             * 【TAG】??の自動チェ?用Hiddenを?力するかど?[true/false]を指定しま?初期値:true)?
869             *
870             * @og.tag
871             * query.jsp上でmust/mustAny?した?合に検索時???チェ?を?動化するための
872             * hiddenを?力するかど?を選択します?
873             * 初期値は、?力す?"true") です?
874             * 通常は初期値で問題ありませんが???の?をScriptで行う場合等に邪魔になる?合が
875             * あるため出力??を?来るよ?しておきます?
876             * 
877             *
878             * @og.rev 5.7.2.0 (2013/01/10) 新規作?
879             *
880             * @param       flag    自動チェ?用hiddenを?力するか[true:出?それ以?出力しない]
881             */
882            public void setUseMustHidden( final String flag ) {
883                    useMustHidden = nval( getRequestParameter( flag ),useMustHidden );
884            }
885            
886            /**
887             * 【TAG】曖昧検索可能フィールドとして、曖昧検索方法を?しま?初期値:null)
888             *
889             * @og.tag
890             * 従来は、clazz="aimai" として、点線?入力フィールド?み作?して?したが?
891             * AimaiPicker をCallするようにして、検索方法を?できるようにします?
892             * なお?AimaiPickerは、カラ??値に?択した条件に応じ???付与するため?
893             * result.jsp の like には??含めな?に記述してください?
894             *
895             *   ?class="aimai" の設?(ほぼ、従来と同じ)
896             *   ② AimaiPicker となる?preタグを??スペ?スを含?定?字にするため)
897             *   ③ aimai属?で、前方??、後方??、前後曖昧、完??? 選択が可能
898             *   ④ aimai属?で選択した検索方法を、submit時にvalueに反映し?result.jsp に送信する?
899             *
900             * aimai属?の?方法を以下に示します?
901             * ?0" また? "V"   :完???
902             * ?1" また? "V*"  :前方??
903             * ?2" また? "*V"  :後方??
904             * ?3" また? "*V*" :前後曖昧
905             *
906             * Vは?,1,2,3 以外であれば、何でも構いません? の位置で判定します?
907             *
908             * @og.rev 5.8.4.1 (2015/02/20) aimai 属?を追??6.2.0.0
909             *
910             * @param   val 曖昧検索??[0,V:完???/1,V*:前方??/2,*V:後方??/3,*V*:前後曖昧]
911             */
912            public void setAimai( final String val ) {
913                    String tmp = nval( getRequestParameter( val ),null );
914                    if( tmp != null && !tmp.isEmpty() ) {
915                            add( "class","aimai" );                                         // class 設定?先に行う?がある?
916    
917                            // 曖昧タイプ??,1,2,3,null(?が不?? に再設定しなおします?
918                            if( tmp.length() == 1 && "0,1,2,3".indexOf( tmp ) >= 0 ) {
919                                    aimai = Integer.parseInt( tmp );
920                            }
921                            else {
922                                    int type = 0 ;                                                                  // % ?0???V:完??? ??0
923                                    if( tmp.endsWith(   "%" ) ) { type  = 1; }              // % ?後ろ?V%:前方?? ??1
924                                    if( tmp.startsWith( "%" ) ) { type += 2; }              // % ?? ??V:後方?? ??2
925                                                                                                                                    // 先にV%:前方??(typeを加???V%:前後曖昧 ??3
926                                    aimai = type;
927                            }
928                    }
929            }
930    
931            /**
932             * mustType 属?を取得します?
933             *
934             * must , mustAny 属?を設定する?合に、mustType 属?を設定します?
935             * そ?設定された値を取り?します?
936             * 何も設定されて??態では、null を返します?
937             *
938             * @og.rev 5.2.1.0 (2010/10/01) 新規追??
939             *
940             * @return      mustType属?
941             */
942            protected String getMustType() {
943                    return mustType ;
944            }
945    
946            /**
947             * must , mustAny 属?を?動化するためのhiddenタグを生成します?
948             *
949             * HybsSystem.MUST_KEY + mustType をキーに、指定?カラ?を?として
950             * hidden を作?します?こ?値?columnChack タグで拾って must 処?ます?
951             * なお?must , mustAny 属?を使用して???合?、null を返します?
952             *
953             * @og.rev 5.2.1.0 (2010/10/01) 新規追??
954             * @og.rev 5.7.2.0 (2014/01/10) useMustHidden対?
955             *
956             * @param       name    must?するカラ??名称
957             *
958             * @return      自動化するためのhiddenタグ
959             */
960            protected String makeMustHidden( final String name ) {
961                    String rtn = "";
962                    if( mustType != null && useMustHidden ) { // 5.7.2.0 (2014/01/10)
963                            rtn = XHTMLTag.hidden( HybsSystem.MUST_KEY + mustType, name );
964                    }
965                    return rtn;
966            }
967            
968            /**
969             * aimai 属?を?動化するためのAimaiPicker関連タグを生成します?
970             *
971             * AIMAI_xxxのid属?をキーに、指定?カラ??value値の??加を?JavaScriptで行います?
972             * そ?ための、preタグを?力します?
973             *
974             * @og.rev 5.8.4.1 (2015/02/20) aimai 属?を追??6.2.0.0 addメソ?は現行?マとしておく
975             *
976             * @param       name    aimai?するカラ?
977             *
978             * @return      自動化するためのpreタグ
979             * @og.rtnNotNull
980             */
981            protected String makeAimaiPicker( final String name ) {
982                    if( aimai >= 0 ) {
983                            TagBuffer tg =  new TagBuffer( "pre" );
984                            tg.add( "id"            , "AIMAI_" + name );
985                            tg.add( "class"         , "aimaiClm" );
986                            tg.add( "aimaiType"     , String.valueOf( aimai ) );
987                            tg.add( "title"         , AIMAI_TITL[aimai] );
988                            tg.addBody( AIMAI_TEXT[aimai] );
989                            return tg.makeTag();
990                            
991                    }
992                    return "" ;
993            }
994    
995            /**
996             * HTML5を使用するかど?(true:使用する/false:使用しな?を取得します?
997             *
998             * HTML5 の機?を有効にするには、ネイ?ブモードで動作させる?があります?
999             *   ?USE_IE7_HEADER = "false" に設定する?
1000             *   ② USE_HTML5_HEADER = "true" に設定する?
1001             *   ③ IEの??ル⇒互換表示設定で、互換表示に追?たWebサイトから削除する?
1002             *   ④ 同上?設定で、イントラサイトを互換表示で表示するのチェ?を外す?
1003             * ?があります?
1004             * こ?メソ?で返すのは、①と②の設定ができて?ば true、そ?なければ、false を返します?
1005             * 
1006             *      (初期値:USE_IE7_HEADER[={@og.value org.opengion.hayabusa.common.SystemData#USE_IE7_HEADER}])?
1007             *      (初期値:USE_HTML5_HEADER[={@og.value org.opengion.hayabusa.common.SystemData#USE_HTML5_HEADER}])?
1008             *
1009             * @og.rev 5.7.1.0 (2013/12/06) 新規追?
1010             *
1011             * @return      HTML5を使用するかど?(true:使用する/false:使用しな?
1012             */
1013            protected boolean isUseHTML5() {
1014                    boolean useHTML5 = ! HybsSystem.sysBool( "USE_IE7_HEADER" )                     // ?IE7互換モードが、false
1015                                                            &&      HybsSystem.sysBool( "USE_HTML5_HEADER" );       // ② HTML5 ヘッ???true
1016    
1017                    return useHTML5 ;
1018            }
1019    }