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