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 */
016package org.opengion.hayabusa.taglib;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.HybsSystemException;
020
021import static org.opengion.fukurou.util.StringUtil.nval ;
022
023import org.opengion.fukurou.util.TagBuffer;
024import 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 * 記述例  @readonly Areadonly="" Breadonly="readonly" の3種類が推奨されます。
052 *          「属性名」 「属性名=""」 「属性名="属性名"」
053 * フレームワーク側の問題として、@やAの渡し方は他の属性との関係や、動的なリクエスト変数の処理の
054 * 関係で、Bを利用します。また、動的切替の為に、Creadonly="[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 */
064abstract 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属性で登録しておき、<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         * 例えば、<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         * 例えば、<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         * 各データのリスト項目は、<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人以上4人以下
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人以上4人以下
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; ※単位0.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         *   A AimaiPicker となる、preタグを出力(スペースを含む固定幅文字にするため)
897         *   B aimai属性で、前方一致、後方一致、前後曖昧、完全一致 選択が可能
898         *   C aimai属性で選択した検索方法を、submit時にvalueに反映し、result.jsp に送信する。
899         *
900         * aimai属性の指定方法を以下に示します。
901         *  "0" または "V"   :完全一致
902         *  "1" または "V*"  :前方一致
903         *  "2" または "*V"  :後方一致
904         *  "3" または "*V*" :前後曖昧
905         *
906         * Vは、0,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                        // 曖昧タイプは、0,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         *   A USE_HTML5_HEADER = "true" に設定する。
1001         *   B IEのツール⇒互換表示設定で、互換表示に追加したWebサイトから削除する。
1002         *   C 同上の設定で、イントラサイトを互換表示で表示するのチェックを外す。
1003         * 必要があります。
1004         * このメソッドで返すのは、@とAの設定ができていれば 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" );       // A HTML5 ヘッダーが true
1016
1017                return useHTML5 ;
1018        }
1019}