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