/*
 * Copyright (c) 2009 The openGion Project.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.opengion.plugin.column;

import org.opengion.hayabusa.common.HybsSystem;
import org.opengion.hayabusa.db.AbstractRenderer;
import org.opengion.hayabusa.db.CellRenderer;
import org.opengion.hayabusa.db.DBColumn;
import org.opengion.fukurou.util.StringFormat;
import org.opengion.fukurou.util.StringUtil;
import org.opengion.fukurou.util.TagBuffer;

/**
 * URLCALL レンデラーは、汎用ボタンにURLをｸﾘｯｸする機能を適用するクラスです。
 *
 * ボタンのラベルは、ラベルリソースから取得します。それ以外に値に設定された文字列から、
 * 変数 $1,$2,$3,$4 を適用できます。
 * AAA:BBB:CCC:DDD という値を、$1,$2,$3,$4 に割り当てます。
 *
 * <button name="CC" id="CC" type="button" onClick="window.open('URL','CC_FRM').close();" >CC</button>
 * <iframe style="display:none;" name="CC_FRM"><!-- --></iframe>
 *
 * window.open で、すぐに閉じるのと、iframe を 見えなくすることで、ajax と同じような感じで実行できる。
 *
 * ※ 色々と試行錯誤した結果、window.open + 見えない iframe 方式で行います。
 *
 * 不採用案１：ajaxによる非同期通信
 *  <button name="AA" id="AA" type="button" onClick="ajaxCall('URL');" >ﾗﾍﾞﾙAA</button>
 *  default.js に ajaxCall を用意して、非同期にURLを呼び出す。
 *  IE11 では、localhost 等から呼び出せない(セキュリティ)を低にすれば動作する。Microsoft Edge では実行可能。
 *  将来的には、こちらの方法になる可能性は大きい
 *
 * 不採用案２：location.href 遷移
 *  <button name="BB" id="BB" type="button" onClick="location.href='URL'" >ﾗﾍﾞﾙBB</button>
 *  どうしても、URLに飛んで画面遷移してしまう。return false; を入れてもすでに遷移してしまう。
 *
 * @og.rev 7.4.2.0 (2021/05/14) 新規作成
 * @og.group データ表示
 *
 * @version  7.4
 * @author   Kazuhiko Hasegawa
 * @since    JDK11,
 */
public class Renderer_URLCALL extends AbstractRenderer {
	/** このプログラムのVERSION文字列を設定します。	{@value} */
	private static final String VERSION = "7.4.2.0 (2021/05/14)" ;

	private static final CellRenderer DB_CELL = new Renderer_URLCALL() ;

	private  String		name;
	private  String		label;
	private  String		param;

	/**
	 * デフォルトコンストラクター。
	 * このコンストラクターで、基本オブジェクトを作成します。
	 *
	 */
	public Renderer_URLCALL() {
		super();
	}

	/**
	 * DBColumnオブジェクトを指定したprivateコンストラクター。
	 *
	 * @param	clm	DBColumnオブジェクト
	 */
	private Renderer_URLCALL( final DBColumn clm ) {
		super();

		name  = clm.getName();
		label = clm.getLabel();
		param = StringUtil.nvalAdd( clm.getRendererParam() ,
									clm.getRendererAttributes().get( "optionAttributes" ) );
	}

	/**
	 * 各オブジェクトから自分のインスタンスを返します。
	 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に
	 * まかされます。
	 *
	 * @param	clm	DBColumnオブジェクト
	 *
	 * @return	CellRendererオブジェクト
	 * @og.rtnNotNull
	 */
	public CellRenderer newInstance( final DBColumn clm ) {
		return new Renderer_URLCALL( clm );
	}

	/**
	 * データの表示用文字列を返します。
	 *
	 * @og.rev 7.4.2.0 (2021/05/14) 新規作成
	 *
	 * @param   value 入力値
	 *
	 * @return  データの表示用文字列
	 * @og.rtnNotNull
	 */
	@Override
	public String getValue( final String value ) {
		return makeButton( name, value );
	}

	/**
	 * データ出力用の文字列を作成します。
	 * ファイル等に出力する形式を想定しますので、HTMLタグを含まない
	 * データを返します。
	 * 基本は、#getValue( String ) をそのまま返します。
	 *
	 * @og.rev 7.4.2.0 (2021/05/14) 新規作成
	 *
	 * @param   value 入力値
	 *
	 * @return  データ出力用の文字列
	 * @og.rtnNotNull
	 * @see		#getValue( String )
	 */
	@Override
	public String getWriteValue( final String value ) {
		return value == null ? "" : value;
	}

	/**
	 * データの表示用文字列を返します。
	 *
	 * @og.rev 7.4.2.0 (2021/05/14) 新規作成
	 *
	 * @param	name	カラム名
	 * @param   value	入力値 表示するファイルのアドレス
	 *
	 * @return  データ表示用の文字列
	 * @og.rtnNotNull
	 */
	private String makeButton( final String name,final String value ) {
		final String newVal = new StringFormat( param, value, name ).format();		// $C は name に置き換える。

		final String button = new TagBuffer( "button" )
					.add( "name"	, name	)
					.add( "id"		, name	)
					.add( "type"	, "button"	)
					.add( "onClick"	, "window.open('" + newVal + "','" + name + "_FRM').close();" )
					.addBody( label )				// ボタンの表示
					.makeTag();

		final String iframe = new TagBuffer( "iframe" )
					.add( "name"	, name	)
					.add( "style"	, "display:none;" )
					.makeTag();

		return button + iframe;
	}
}
