/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.basic;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.TreeMap;

import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIDBMultiConf;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SITableCondition;
import jp.co.sint.database.SITableConditionManager;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIStringUtil;
import jp.co.sint.tools.SIUtil;
import oracle.jdbc.OracleTypes;

import org.apache.log4j.Category;

/**
 * @version $Id: SICtgryManager.java,v 1.0 Exp $
 * @author Jinwang Chen <br>
 * Description: 全てのカテゴリレコードリストを管理する用のクラス 1)各カテゴリコードに対する親カテゴリ 2)各カテゴリに対する子カテゴリリスト 3)各HTMLスクリプト
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;=========================== <br>
 * J.W.Chen 2003/06/25 Original
 */
public class SICtgryManager extends SISrchCtgry {
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //カテゴリコード
  private String ctgryCode = SIConfig.SICATEGORY_ROOT_CODE;
  
  private static int SCRIPT_TYPE = 0;
  private static int TREE_SCRIPT_TYPE = SCRIPT_TYPE + 0;
  private static int TITLE_SCRIPT_TYPE = SCRIPT_TYPE + 1;
  private static int PLATE_SCRIPT_TYPE = SCRIPT_TYPE + 2;
  
  private static final int TREE_TYPE = 0;
  public static final int BLUE_TREE_TYPE = TREE_TYPE + 0;
  public static final int RED_TREE_TYPE = TREE_TYPE + 1;
  public static final int ALL_TREE_TYPE = TREE_TYPE + 999;
  //カテゴリセット
  private TreeMap ctgries = new TreeMap();
  
  //カテゴリを出力するスクリプト
  private StringBuffer resultTreeScriptBuf = new StringBuffer("");
  private StringBuffer resultPlateScriptBuf = new StringBuffer("");
  private StringBuffer resultTitleScriptBuf = new StringBuffer("");
  
  //各ケースの場合に使われるテンプレート文
  private StringBuffer treeScriptBuf = new StringBuffer("");//treeの構造用のテンプレート文
  private StringBuffer plateScriptBuf = new StringBuffer("");//plateの構造用のテンプレート文
  private StringBuffer titleScriptBuf = new StringBuffer("");//タイトルの構造用のテンプレート文

  //テンプレートスクリプト文に書き換える用のToken名称
  private String tokenLevel = "level";
  private String tokenCtgryCode = "ctgrycode";
  private String tokenCtgryName = "ctgryname";
  private String tokenJSCtgryName = "jsctgryname";//7.4.0 ST2083 追加 javascript用
  private String tokenAbbvCtgryName = "abbvctgryname";
  private String tokenAmount = "amount";
  private String tokenChecked = "check";
  private String tokenSelected = "select";
  private String tokenCmdtyFlag = "cmdtyflag";//7.2.0 ST0301 追加
  
  private String[] checked = { "", "checked" };
  private String[] selected = { "", "", "" };//treeとtitleとplateの構造に{select}に入れ替える用のスクリプト文
  private String[] endSelected = { "", "", "" };//treeとtitleとplateの構造に{/select}に入れ替える用のスクリプト文
  
  //レベルindent(Tree構造だけが有効)
  private int indent = 3;
  
  //トップ名称が出力するかどうかフラグ(Tree構造だけが有効)
  private boolean topEnable = true;
  
  private Connection databaseConnection;
  
  private String managerFlg = "0";
  
  private boolean emptyCtgry = true;
  
  /**
   * <b>SICtgryManager </b> コンストラクタ
   * 
   * @param なし
   * @return なし
   * @throws なし
   */
  public SICtgryManager() {
  }
  
  /**
   * <b>SICtgryManager </b> コンストラクタ(管理側にカテゴリの表示画面に使われます。)
   * 
   * @param lConnection DBへのコネクション
   * @return なし
   * @throws なし
   */
  public SICtgryManager(Connection lConnection) {
    //親カテゴリの選択
    StringBuffer lSqlBuf = new StringBuffer();
    lSqlBuf
        .append("SELECT aa.*,bb.CtgryName,bb.AbbvCtgryName,NULL AS ExistFlg ,bb.CmdtyAmount AS Amount ");//7.1.1
    // ST0176
    // 修正
    lSqlBuf.append(",bb.CmdtyFlag ");//7.2.0 ST0301 追加
    lSqlBuf.append("FROM CtgryVW").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("aa,");
    lSqlBuf.append("CtgryMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("bb ");
    lSqlBuf.append("WHERE aa.CtgryCode=bb.CtgryCode ");
    if (SIDBMultiConf.SIDB_CURRENT_INX == SIDBMultiConf.SIDB_POSTGRESQL_INX) {
      lSqlBuf.append("ORDER BY aa.LEVEL DESC,aa.ParentCtgryCode ASC,bb.AbbvCtgryName ASC");
    } else {
      lSqlBuf.append("ORDER BY aa.\"LEVEL\" DESC,aa.ParentCtgryCode ASC,bb.AbbvCtgryName ASC");
    }
    
    initCtgry(lConnection, lSqlBuf.toString());
    if (isEmpty()) initRoot(lConnection);
    setDatabaseConnection(lConnection);
  }
  
  /**
   * <b>SICtgryManager </b> コンストラクタ(主にフロント側に使われます)
   * 
   * @param lConnection DBへのコネクション
   * @param lCurrCatgryCode 直前にクリックされたカテゴリコード
   * @return なし
   * @throws なし
   */
  public SICtgryManager(Connection lConnection, String lCurrCatgryCode) {
    this(lConnection,lCurrCatgryCode,BLUE_TREE_TYPE);
    /*
    this(lConnection);
    setCtgryCode(lCurrCatgryCode);//カテゴリの設定
    super.reset(lConnection);//リセット、フロント側に、検索用のキーワードのために
    */
  }
  
  /**
   * <b>SICtgryManager </b> コンストラクタ(主にフロント側に使われます)
   * 
   * @param lConnection DBへのコネクション
   * @param lCurrCatgryCode 直前にクリックされたカテゴリコード
   * @param treeType 設定するツリーの種別
   * @return なし
   * @throws なし
   */
  public SICtgryManager(Connection lConnection, String lCurrCatgryCode,int treeType) {
    StringBuffer treeSelectStr = new StringBuffer();
    if(SIUtil.isNotNull(SICtgry.invisibleStr())) treeSelectStr.append("AND aa.CtgryCode NOT IN(").append(SICtgry.invisibleStr()).append(") ");
    if(treeType == RED_TREE_TYPE) {
      treeSelectStr.append("AND (aa.CtgryCode IN ('category007','category008','category110','category014','category015','category016','category017','category018')");
      treeSelectStr.append(" OR aa.ParentCtgryCode IN ('category007','category008','category110','category014','category015','category016','category017','category018')) ");
    } else if(treeType == BLUE_TREE_TYPE){
      treeSelectStr.append("AND aa.CtgryCode NOT IN ('category007','category008','category110','category014','category015','category016','category017','category018') ");
      treeSelectStr.append("AND aa.ParentCtgryCode NOT IN ('category007','category008','category110','category014','category015','category016','category017','category018') ");
    }
    //親カテゴリの選択
    StringBuffer lSqlBuf = new StringBuffer();
    lSqlBuf.append("SELECT aa.*,bb.CtgryName,bb.AbbvCtgryName,NULL AS ExistFlg ,bb.CmdtyAmount AS Amount ");
    lSqlBuf.append(",bb.CmdtyFlag ");
    lSqlBuf.append("FROM CtgryVW").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("aa,");
    lSqlBuf.append("CtgryMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("bb ");
    lSqlBuf.append("WHERE aa.CtgryCode=bb.CtgryCode ").append(treeSelectStr);
    lSqlBuf.append("ORDER BY aa.LEVEL DESC,aa.ParentCtgryCode ASC,bb.AbbvCtgryName ASC");
    initCtgry(lConnection, lSqlBuf.toString());
    if (isEmpty()) initRoot(lConnection);
    setDatabaseConnection(lConnection);
    setCtgryCode(lCurrCatgryCode);//カテゴリの設定
    super.reset(lConnection);//リセット、フロント側に、検索用のキーワードのために
  }
  
  /**
   * <b>SICtgryManager </b> コンストラクタ(主に管理側の商品カテゴリ画面に使われます)
   * 
   * @param lConnection DBへのコネクション
   * @param lCurrCatgryCode 直前にクリックされたカテゴリコード
   * @return なし
   * @throws なし
   */
  public SICtgryManager(Connection lConnection, String lCtgryCode, String lShopCode, String lCmdtyCode) {
    //商品カテゴリの関連
    StringBuffer lSqlBuf = new StringBuffer();
    lSqlBuf.append("SELECT aa.*,bb.CtgryCode AS ExistFlg,0 AS Amount ");
    lSqlBuf.append("," + SIDBUtil.SQL2Str(SIConfig.SICMDTY_FLAG_ADVICE, " ") + " AS CmdtyFlag ");//7.2.0
    // ST0301 追加
    lSqlBuf.append("FROM CtgryNameVW").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("aa ");
    lSqlBuf.append("LEFT OUTER JOIN CmdtyCtgryMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME)
        .append("bb ");
    lSqlBuf.append("ON aa.CtgryCode=bb.CtgryCode ");
    lSqlBuf.append("AND bb.ShopCode=" + SIDBUtil.SQL2Str(lShopCode, " "));
    lSqlBuf.append("AND bb.CmdtyCode=" + SIDBUtil.SQL2Str(lCmdtyCode, " "));
    if (SIDBMultiConf.SIDB_CURRENT_INX == SIDBMultiConf.SIDB_POSTGRESQL_INX) {
      lSqlBuf.append("ORDER BY aa.LEVEL DESC,aa.ParentCtgryCode ASC,aa.AbbvCtgryName ASC");
    } else {
      lSqlBuf.append("ORDER BY aa.\"LEVEL\" DESC,aa.ParentCtgryCode ASC,aa.AbbvCtgryName ASC");
    }
    initCtgry(lConnection, lSqlBuf.toString());
    if (isEmpty()) initRoot(lConnection);
    setCtgryCode(lCtgryCode);//カテゴリの設定
    super.reset(lConnection);//リセット
  }
  
  /**
   * <b>initRoot </b> PostgreSQLの場合には、ルートのカテゴリだけがあれば、特別の処理を行なう必要がありますので、
   * Oracleの場合には、この処理が要りません。
   * 
   * @param lConnection DBへのコネクション
   * @return なし
   * @throws なし
   */
  public void initRoot(Connection lConnection) {
    if (SIDBMultiConf.SIDB_CURRENT_INX != SIDBMultiConf.SIDB_POSTGRESQL_INX) return;
    StringBuffer lSqlBuf = new StringBuffer("SELECT CtgryCode,ParentCtgryCode,0 AS Level,CtgryCode AS branch,");
    lSqlBuf.append("CtgryName,AbbvCtgryName,NULL AS ExistFlg ,CmdtyAmount AS Amount, ");
    lSqlBuf.append(SIDBUtil.SQL2Str(SIConfig.SICMDTY_FLAG_ADVICE)).append(" AS CmdtyFlag ");
    lSqlBuf.append("FROM CtgryMTbl");
    initCtgry(lConnection, lSqlBuf.toString());
  }
  
  /**
   * <b>initCtgry </b> SQL文から、親子カテゴリのデータを取得して、この親子構造をクラスに置いて 画面にtreeなどの構造を作ります。
   * 
   * @param lConnection DBへのコネクション
   * @param lSql カテゴリデータを取得するSQL文
   * @return なし
   * @throws なし
   */
  public void initCtgry(Connection lConnection, String lSql) {
    log.debug("initCtgry:lSql=" + lSql);
    
    Statement statement = null;
    ResultSet resultSet = null;
    
    String currCtgryCode = "";// カテゴリコード
    String currParentCode = "";// 親カテゴリコード
    
    SICtgryNode parentNodeCtgry = new SICtgryNode();
    SICtgryNode childNodeCtgry = new SICtgryNode();
    
    try {
      // コネクションの作成
      statement = lConnection.createStatement();
      resultSet = statement.executeQuery(lSql);
      //
      while (resultSet.next()) {
        emptyCtgry = false;
        childNodeCtgry = new SICtgryNode();
        // 各パラメータのデータの設定
        currCtgryCode = resultSet.getString("CtgryCode");// カテゴリコード
        currParentCode = resultSet.getString("ParentCtgryCode");// 親カテゴリコード
        
        // 既に存在するかどうかをチェック
        childNodeCtgry = (SICtgryNode) ctgries.get(currCtgryCode);
        if (childNodeCtgry == null) {
          childNodeCtgry = new SICtgryNode();
        }
        
        // 情報データの設定
        childNodeCtgry.setCtgryCode(currCtgryCode);// カテゴリコード
        childNodeCtgry.setParentCtgryCode(currParentCode);// 親カテゴリコード
        childNodeCtgry.setCtgryName(resultSet.getString("CtgryName"));// カテゴリ名
        childNodeCtgry.setAbbvCtgryName(resultSet.getString("AbbvCtgryName"));// カテゴリ略名
        childNodeCtgry.setLevel(resultSet.getInt("Level"));// レベル
        childNodeCtgry.setCmdtyAmount(resultSet.getInt("Amount"));// 商品数量
        childNodeCtgry.setExistFlg(resultSet.getString("ExistFlg"));// 商品カテゴリ関連あるかどうか
        childNodeCtgry.setCmdtyFlagTxt(resultSet.getString("CmdtyFlag"));// 商品の初期表示
        // 7.2.0 ST0301 追加
        ctgries.put(currCtgryCode, childNodeCtgry);
        
        // 当分のカテゴリに対する親カテゴリが存在するかどうかをチェック
        if (SIUtil.isNotNull(currParentCode)) {
          parentNodeCtgry = (SICtgryNode) ctgries.get(currParentCode);
          if (parentNodeCtgry == null) {
            parentNodeCtgry = new SICtgryNode();
            parentNodeCtgry.setCtgryCode(currParentCode);
          }
          parentNodeCtgry.addChild(currCtgryCode);
          parentNodeCtgry.addChild(childNodeCtgry.getChild());
          // 保存する
          ctgries.put(currParentCode, parentNodeCtgry);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      SIDBUtil.close(statement, resultSet);
    }
  }
  
  public void setDatabaseConnection(Connection lDatabaseConnection) {
    this.databaseConnection = lDatabaseConnection;
  }
  
  public boolean isEmpty() {
    return this.emptyCtgry;
  }
  
  public void setManagerFlg(String lManagerFlg) {
    this.managerFlg = lManagerFlg;
  }
  
  public Connection getDatabaseConnection() {
    return this.databaseConnection;
  }
  
  public String getManagerFlg() {
    return this.managerFlg;
  }
  
  /**
   * <b>setTokenLevel </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setTokenLevel(String lTokenLevel) {
    if (SIUtil.isNull(lTokenLevel)) lTokenLevel = "";
    this.tokenLevel = lTokenLevel.trim();
  }
  
  /**
   * <b>setTokenCtgryCode </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setTokenCtgryCode(String lTokenCtgryCode) {
    if (SIUtil.isNull(lTokenCtgryCode)) lTokenCtgryCode = "";
    this.tokenCtgryCode = lTokenCtgryCode;
  }
  
  /**
   * <b>setTokenCtgryName </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setTokenCtgryName(String lTokenCtgryName) {
    if (SIUtil.isNull(lTokenCtgryName)) lTokenCtgryName = "";
    this.tokenCtgryName = lTokenCtgryName;
  }
  
  // 7.4.0 ST2083 追加 ここから
  /**
   * <b>setTokenJSCtgryName </b> テンプレート文に入れ替えるようのJavaScript名称を設定する
   * 
   * @param tokenName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setTokenJSCtgryName(String lTokenJSCtgryName) {
    if (SIUtil.isNull(lTokenJSCtgryName)) lTokenJSCtgryName = "";
    this.tokenJSCtgryName = lTokenJSCtgryName;
  }
  
  // 7.4.0 ST2083 追加 ここまで
  
  /**
   * <b>setTokenAbbvCtrgyName </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenAbbvName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setTokenAbbvCtrgyName(String lTokenAbbvCtgryName) {
    if (SIUtil.isNull(lTokenAbbvCtgryName)) lTokenAbbvCtgryName = "";
    this.tokenAbbvCtgryName = lTokenAbbvCtgryName;
  }
  
  /**
   * <b>setTokenAmount </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenAbbvName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setTokenAmount(String lTokenAmount) {
    if (SIUtil.isNull(lTokenAmount)) lTokenAmount = "";
    this.tokenAmount = lTokenAmount;
  }
  
  /**
   * <b>setTokenChecked </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenChecked 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setTokenChecked(String lTokenChecked) {
    if (SIUtil.isNull(lTokenChecked)) lTokenChecked = "";
    this.tokenChecked = lTokenChecked;
  }
  
  /**
   * <b>setTokenChecked </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenChecked 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void setChecked(String[] lChecked) {
    if (lChecked == null) checked = new String[0];
    this.checked = lChecked;
  }
  
  /**
   * <b>setTreeSelected </b> treeの構造に対して選択されたカテゴリに対する表示文字列、または、背景など
   * 
   * @param lTreeSelected 選択されるときに、表示用のスクリプト
   * @return なし
   * @throws なし
   */
  public void setTreeSelected(String lTreeSelected) {
    if (SIUtil.isNull(lTreeSelected)) lTreeSelected = "";
    this.selected[TREE_SCRIPT_TYPE] = lTreeSelected;
  }
  
  /**
   * <b>setTreeEndSelected </b> treeの構造に対して選択されたカテゴリに対する表示文字列、または、背景など
   * 
   * @param lTreeEndSelected 選択されるときに、表示用のスクリプト
   * @return なし
   * @throws なし
   */
  public void setTreeEndSelected(String lTreeEndSelected) {
    if (SIUtil.isNull(lTreeEndSelected)) lTreeEndSelected = "";
    this.endSelected[TREE_SCRIPT_TYPE] = lTreeEndSelected;
  }
  
  /**
   * <b>setTitleSelected </b> titleの構造に対して選択されたカテゴリに対する表示文字列、または、背景など
   * 
   * @param lTitleSelected 選択されるときに、表示用のスクリプト
   * @return なし
   * @throws なし
   */
  public void setTitleSelected(String lTitleSelected) {
    if (SIUtil.isNull(lTitleSelected)) lTitleSelected = "";
    this.selected[TITLE_SCRIPT_TYPE] = lTitleSelected;
  }
  
  /**
   * <b>setTitleEndSelected </b> titleの構造に対して選択されたカテゴリに対する表示文字列、または、背景など
   * 
   * @param lTitleEndSelected 選択されるときに、表示用のスクリプト
   * @return なし
   * @throws なし
   */
  public void setTitleEndSelected(String lTitleEndSelected) {
    if (SIUtil.isNull(lTitleEndSelected)) lTitleEndSelected = "";
    this.endSelected[TITLE_SCRIPT_TYPE] = lTitleEndSelected;
  }
  
  /**
   * <b>setPlateSelected </b> plateの構造に対して選択されたカテゴリに対する表示文字列、または、背景など
   * 
   * @param lPlateSelected 選択されるときに、表示用のスクリプト
   * @return なし
   * @throws なし
   */
  public void setPlateSelected(String lPlateSelected) {
    if (SIUtil.isNull(lPlateSelected)) lPlateSelected = "";
    this.selected[PLATE_SCRIPT_TYPE] = lPlateSelected;
  }
  
  /**
   * <b>setPlateEndSelected </b> plateの構造に対して選択されたカテゴリに対する表示文字列、または、背景など
   * 
   * @param lPlateEndSelected 選択されるときに、表示用のスクリプト
   * @return なし
   * @throws なし
   */
  public void setPlateEndSelected(String lPlateEndSelected) {
    if (SIUtil.isNull(lPlateEndSelected)) lPlateEndSelected = "";
    this.endSelected[PLATE_SCRIPT_TYPE] = lPlateEndSelected;
  }
  
  public void setIndent(int lIndent) {
    this.indent = lIndent;
  }
  
  public void setCtgryCode(String lCtgryCode) {
    // 7.1.1 ST0195 修正 ここから
    SICtgryNode lCtgryNode = (SICtgryNode) ctgries.get(lCtgryCode);
    if (lCtgryNode == null || SIUtil.isNull(lCtgryCode)) lCtgryCode = SIConfig.SICATEGORY_ROOT_CODE;
    // 7.1.1 ST0195 修正 ここまで
    if (SIUtil.isNull(lCtgryCode)) lCtgryCode = SIConfig.SICATEGORY_ROOT_CODE;
    this.ctgryCode = lCtgryCode;
    super.setCtgryCode(getAncesterCtgryCode(lCtgryCode));
  }
  
  /**
   * <b>setTopEnable </b> ルートを表示するかどうかフラグ、特にtreeの構造だけに有効
   * 
   * @param lTopEnable 表示有効
   * @return なし
   * @throws なし
   */
  public void setTopEnable(boolean lTopEnable) {
    this.topEnable = lTopEnable;
  }
  
  /**
   * <b>setTreeScript </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenAbbvName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void addTreeScript(String lTreeScript) {
    if (SIUtil.isNull(lTreeScript)) lTreeScript = "";
    treeScriptBuf.append(lTreeScript);
  }
  
  /**
   * <b>setPlateScript </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param tokenAbbvName 入れ替える名称
   * @return なし
   * @throws なし
   */
  public void addPlateScript(String lPlateScript) {
    if (SIUtil.isNull(lPlateScript)) lPlateScript = "";
    plateScriptBuf.append(lPlateScript);
  }
  
  /**
   * <b>setTitleScript </b> テンプレート文に入れ替えるようの名称を設定する
   * 
   * @param lTitleScript 選択されたカテゴリに対する出力タイトル文のスクリプト
   * @return なし
   * @throws なし
   */
  public void addTitleScript(String lTitleScript) {
    if (SIUtil.isNull(lTitleScript)) lTitleScript = "";
    titleScriptBuf.append(lTitleScript);
  }
  
  /**
   * <b>getCtgry </b> 指定のカテゴリ名を基づいて、カテゴリ詳細データレコードの取得
   * 
   * @param name カテゴリ名
   * @return カテゴリデータ
   * @throws なし
   */
  public SICtgryNode getCtgry(String name) {
    return (SICtgryNode) ctgries.get(name);
  }
  
  /**
   * <b>getTreeScript </b> 指定のカテゴリ名を基づいて、カテゴリ詳細データレコードの取得
   * 
   * @param name カテゴリ名
   * @return カテゴリデータ
   * @throws なし
   */
  public String getTreeScript() {
    return treeScriptBuf.toString();
  }
  
  /**
   * <b>getPlateScript </b> 指定のカテゴリ名を基づいて、カテゴリ詳細データレコードの取得
   * 
   * @param name カテゴリ名
   * @return カテゴリデータ
   * @throws なし
   */
  public String getPlateScript() {
    return plateScriptBuf.toString();
  }
  
  /**
   * <b>getTitleScript </b> 指定のカテゴリ名を基づいて、カテゴリ詳細データレコードの取得
   * 
   * @param name カテゴリ名
   * @return カテゴリデータ
   * @throws なし
   */
  public String getTitleScript() {
    return titleScriptBuf.toString();
  }
  
  public String[] getChecked() {
    return this.checked;
  }
  
  public String getTreeSelected() {
    return this.selected[TREE_SCRIPT_TYPE];
  }
  
  public String getTreeEndSelected() {
    return this.endSelected[TREE_SCRIPT_TYPE];
  }
  
  public String getTitleSelected() {
    return this.selected[TITLE_SCRIPT_TYPE];
  }
  
  public String getTitleEndSelected() {
    return this.endSelected[TITLE_SCRIPT_TYPE];
  }
  
  public String getPlateSelected() {
    return this.selected[PLATE_SCRIPT_TYPE];
  }
  
  public String getPlateEndSelected() {
    return this.endSelected[PLATE_SCRIPT_TYPE];
  }
  
  public int getIndent() {
    return this.indent;
  }
  
  public String getCtgryCode() {
    return this.ctgryCode;
  }
  
  public boolean getTopEnable() {
    return this.topEnable;
  }
  
  /**
   * <b>getFullToken </b> 指定のカテゴリ名を基づいて、カテゴリ詳細データレコードの取得
   * 
   * @param name カテゴリ名
   * @return カテゴリデータ
   * @throws なし
   */
  public String getFullToken(String lTokenName) {
    if (SIUtil.isNull(lTokenName)) return "";
    return "{" + lTokenName.trim() + "}";
  }
  
  public String outputTreeScript() {
    return outputTreeScript(getCtgryCode());
  }
  
  /**
   * <b>outputTreeScript </b> トップからあるカテゴリコードまでの全ての出力
   * 
   * @param lToCtgryCode 終点カテゴリコード
   * @return なし
   * @throws カテゴリ構造のスクリプト
   */
  public String outputTreeScript(String lToCtgryCode) {
    log.debug("outputTreeScript(String lToCtgryCode)=" + lToCtgryCode);
    resultTreeScriptBuf = new StringBuffer();// クリア
    if (getTopEnable()) {// トップから出力
      outputNode(SIConfig.SICATEGORY_ROOT_CODE, lToCtgryCode);
      return resultTreeScriptBuf.toString();
    }
    
    String currCtgryCode = "";
    SICtgryNode currCtgryNode = new SICtgryNode();
    SICtgryNode topCtgryCode = (SICtgryNode) ctgries.get(SIConfig.SICATEGORY_ROOT_CODE);
    if (topCtgryCode == null) return "";
    ArrayList topChildList = topCtgryCode.getChild();
    
    // トップレベルの以下のレベル1からの全てのカテゴリを出力します。
    for (int ii = 0; ii < topChildList.size(); ii++) {
      currCtgryCode = (String) topChildList.get(ii);
      currCtgryNode = (SICtgryNode) ctgries.get(currCtgryCode);
      if (currCtgryNode.getParentCtgryCode().equals(SIConfig.SICATEGORY_ROOT_CODE)) {
        outputNode(currCtgryCode, lToCtgryCode);
      }
    }
    return resultTreeScriptBuf.toString();
  }
  
  public String outputTreeScriptFront() {
    return outputTreeScriptFront(getCtgryCode());
  }
  
  /**
   * <b>outputTreeScript </b> トップからあるカテゴリコードまでの全ての出力
   * 
   * @param lToCtgryCode 終点カテゴリコード
   * @return なし
   * @throws カテゴリ構造のスクリプト
   */
  public String outputTreeScriptFront(String lToCtgryCode) {
    log.debug("outputTreeScript(String lToCtgryCode)=" + lToCtgryCode);
    resultTreeScriptBuf = new StringBuffer();// クリア
    if (getTopEnable()) {// トップから出力
      outputNodeFront(SIConfig.SICATEGORY_ROOT_CODE, lToCtgryCode);
      return resultTreeScriptBuf.toString();
    }
    
    String currCtgryCode = "";
    SICtgryNode currCtgryNode = new SICtgryNode();
    SICtgryNode topCtgryCode = (SICtgryNode) ctgries.get(SIConfig.SICATEGORY_ROOT_CODE);
    if (topCtgryCode == null) return "";
    ArrayList topChildList = topCtgryCode.getChild();
    
    // トップレベルの以下のレベル1からの全てのカテゴリを出力します。
    for (int ii = 0; ii < topChildList.size(); ii++) {
      currCtgryCode = (String) topChildList.get(ii);
      currCtgryNode = (SICtgryNode) ctgries.get(currCtgryCode);
      if (currCtgryNode.getParentCtgryCode().equals(SIConfig.SICATEGORY_ROOT_CODE)) {
        outputNodeFront(currCtgryCode, lToCtgryCode);
      }
    }
    return resultTreeScriptBuf.toString();
  }
  
  /**
   * <b>outputNode </b> あるカテゴリコードからあるカテゴリコードまで、出力する
   * 
   * @param fromCtgryCode 起点としてカテゴリコード
   * @param toCtgryCode 終点としてカテゴリコード
   * @return なし
   * @throws なし
   */
  private void outputNode(String fromCtgryCode, String toCtgryCode) {
    log.debug("outputNode:fromCtgryCode=" + fromCtgryCode + ",toCtgryCode=" + toCtgryCode);
    
    SICtgryNode fromCtgryNode;
    ArrayList childList;
    String childCtgryCode;
    Iterator childIterator;
    
    fromCtgryNode = (SICtgryNode) ctgries.get(fromCtgryCode);
    if (fromCtgryNode == null) return;
    if (fromCtgryCode.equals(toCtgryCode)) {// 自身
      resultTreeScriptBuf.append(constructTreeScript(fromCtgryNode, true));
    } else {
      resultTreeScriptBuf.append(constructTreeScript(fromCtgryNode, false));
    }
    childList = fromCtgryNode.getChild();
    
    if (childList.contains(toCtgryCode) || fromCtgryCode.equals(toCtgryCode)) {
      childIterator = childList.iterator();
      while (childIterator.hasNext()) {
        childCtgryCode = (String) childIterator.next();
        if (fromCtgryNode.getLevel() == ((SICtgryNode) ctgries.get(childCtgryCode)).getLevel() - 1) {
          outputNode(childCtgryCode, toCtgryCode);
        }
      }
    }
  }
  
  /**
   * <b>outputNode </b> あるカテゴリコードからあるカテゴリコードまで、出力する
   * 
   * @param fromCtgryCode 起点としてカテゴリコード
   * @param toCtgryCode 終点としてカテゴリコード
   * @return なし
   * @throws なし
   */
  private void outputNodeFront(String fromCtgryCode, String toCtgryCode) {
    log.debug("outputNode:fromCtgryCode=" + fromCtgryCode + ",toCtgryCode=" + toCtgryCode);
    
    SICtgryNode fromCtgryNode;
    ArrayList childList;
    String childCtgryCode;
    Iterator childIterator;
    
    fromCtgryNode = (SICtgryNode) ctgries.get(fromCtgryCode);
    if (fromCtgryNode == null) return;
    if (fromCtgryCode.equals(toCtgryCode)) {// 自身
      resultTreeScriptBuf.append(constructTreeScriptFront(fromCtgryNode, true));
    } else {
      resultTreeScriptBuf.append(constructTreeScriptFront(fromCtgryNode, false));
    }
    childList = fromCtgryNode.getChild();
    
    if (childList.contains(toCtgryCode) || fromCtgryCode.equals(toCtgryCode)) {
      childIterator = childList.iterator();
      while (childIterator.hasNext()) {
        childCtgryCode = (String) childIterator.next();
        if (fromCtgryNode.getLevel() == ((SICtgryNode) ctgries.get(childCtgryCode)).getLevel() - 1) {
          outputNodeFront(childCtgryCode, toCtgryCode);
        }
      }
    }
  }
  
  public String outputPlateScript() {
    return outputPlateScript(getCtgryCode(),"","","",false);
  }
  
  public String outputPlateScript(String makerCode,String usedNewTxt,String keyWord,boolean isSearch) {
    return outputPlateScript(getCtgryCode(),makerCode,usedNewTxt,keyWord,isSearch);
  }
  /**
   * <b>outputPlateScript </b> 
   * 指定したカテゴリコードがルートなら子カテゴリの 指定したカテゴリコードが第1階層なら同列のカテゴリ一覧を取得する(true)
   * 指定したカテゴリコードが第1階層なら子カテゴリの 指定したカテゴリコードが第2階層なら同列のカテゴリ一覧を取得する(false)
   * 
   * @param lCtgryCode 指定カテゴリコード
   * @return なし
   * @throws なし
   */
  public String outputPlateScript(String lCtgryCode,String makerCode,String usedNewTxt,String keyWord,boolean isSearch) {
    log.debug("outputPlateScript:lCtgryCode=" + lCtgryCode);
    if (!isSearch && lCtgryCode.trim().equals(SIConfig.SICATEGORY_ROOT_CODE)) return "";
    boolean selectFlg = true;
    if(isSearch) selectFlg = false;
    resultPlateScriptBuf = new StringBuffer("|&nbsp;");
    SICtgryNode currNodeCtgry = (SICtgryNode) ctgries.get(lCtgryCode);
    if (currNodeCtgry.getParentCtgryCode().equals(SIConfig.SICATEGORY_ROOT_CODE)) {
      selectFlg = false;
      if(isSearch) selectFlg = true;
    }
    
    ArrayList childList = currNodeCtgry.getChild();
    if (selectFlg) childList = ((SICtgryNode) ctgries.get(currNodeCtgry.getParentCtgryCode())).getChild();
    
    for (int ii = 0; ii < childList.size(); ii++) {
      currNodeCtgry = (SICtgryNode) ctgries.get(childList.get(ii));
      StringBuffer sqlStr = new StringBuffer();
      boolean enable = true;
      
      if(isSearch){
        if(!currNodeCtgry.getParentCtgryCode().equals(SIConfig.SICATEGORY_ROOT_CODE)){
          enable = false;//全検索の場合、第一階層以外は非表示
        }
        
        if(SIUtil.isNotNull(makerCode) && enable){
          sqlStr = new StringBuffer();
          sqlStr.append("SELECT cc.ctgrycode FROM cmdtymtbl cm,cmdtyctgrymtbl cc,ctgrymtbl ct ");
          sqlStr.append("WHERE cc.cmdtycode = cm.cmdtycode AND cc.ctgrycode = ct.ctgrycode ");
          sqlStr.append("AND ct.parentctgrycode = ").append(SIDBUtil.SQL2Str(currNodeCtgry.getCtgryCode(), " "));
          sqlStr.append("AND cm.makercode = ").append(SIDBUtil.SQL2Str(makerCode, " "));
          sqlStr.append("AND cm.cmdtycode IN (SELECT cmdtycode FROM cmdtyunittbl WHERE frontdispflg='1' AND NOT(usednewflg!='1' AND usednewflg!='7' AND rsrvenableflg='0' AND amountflg='1' AND amount='0' AND (soldoutdate + "+SIConfig.DEFAULT_SOLDOUT+" <= CURRENT_DATE)))");
          
          try{
            enable = enable && SIDBUtil.hasData(this.getDatabaseConnection(), sqlStr.toString());
          }catch(Exception e){
            e.printStackTrace();
            enable = false;
          }
        }
        if(SIUtil.isNotNull(usedNewTxt) && enable){
          String appendTxt = "";
          if(usedNewTxt.equals("new")) appendTxt="AND usednewflg IN ('1','6','7') ";
          if(usedNewTxt.equals("outlet")) appendTxt="AND usednewflg = '2' ";
          if(usedNewTxt.equals("used")) appendTxt="AND usednewflg IN ('0','3','4','5') ";
          sqlStr = new StringBuffer();
          sqlStr.append("SELECT cc.ctgrycode FROM cmdtymtbl cm,cmdtyctgrymtbl cc,ctgrymtbl ct ");
          sqlStr.append("WHERE cc.cmdtycode = cm.cmdtycode AND cc.ctgrycode = ct.ctgrycode ");
          sqlStr.append("AND ct.parentctgrycode = ").append(SIDBUtil.SQL2Str(currNodeCtgry.getCtgryCode(), " "));
          sqlStr.append("AND cm.cmdtycode IN (SELECT cmdtycode FROM cmdtyunittbl WHERE frontdispflg='1' ").append(appendTxt);
          sqlStr.append("AND NOT(usednewflg!='1' AND usednewflg!='7' AND rsrvenableflg='0' AND amountflg='1' AND amount='0' AND (soldoutdate + "+SIConfig.DEFAULT_SOLDOUT+" <= CURRENT_DATE)))");
          
          try{
            enable = enable && SIDBUtil.hasData(this.getDatabaseConnection(), sqlStr.toString());
          }catch(Exception e){
            e.printStackTrace();
            enable = false;
          }
        }
        if(SIUtil.isNotNull(keyWord) && enable){
          sqlStr = new StringBuffer();
          sqlStr.append("SELECT cc.ctgrycode FROM cmdtymtbl cm,cmdtyctgrymtbl cc,ctgrymtbl ct ");
          sqlStr.append("WHERE cc.cmdtycode = cm.cmdtycode AND cc.ctgrycode = ct.ctgrycode ");
          sqlStr.append("AND ct.parentctgrycode = ").append(SIDBUtil.SQL2Str(currNodeCtgry.getCtgryCode(), " "));
          sqlStr.append("AND cm.cmdtycode IN (SELECT cmdtycode FROM cmdtyunittbl WHERE frontdispflg='1' ");
          sqlStr.append("AND (cmdtyname LIKE '%").append(SIDBUtil.SQL2Like(keyWord)).append("%'");
          sqlStr.append(" OR description LIKE '%").append(SIDBUtil.SQL2Like(keyWord)).append("%'");
          sqlStr.append(" OR individualcode LIKE '%").append(SIDBUtil.SQL2Like(keyWord)).append("%') ");
          sqlStr.append("AND NOT(usednewflg!='1' AND usednewflg!='7' AND rsrvenableflg='0' AND amountflg='1' AND amount='0' AND (soldoutdate + "+SIConfig.DEFAULT_SOLDOUT+" <= CURRENT_DATE)))");
          
          try{
            enable = enable && SIDBUtil.hasData(this.getDatabaseConnection(), sqlStr.toString());
          }catch(Exception e){
            e.printStackTrace();
            enable = false;
          }
        }
        if (enable && currNodeCtgry.getCtgryCode().trim().equals(lCtgryCode)) {
          resultPlateScriptBuf.append(constructPlateScript(currNodeCtgry, true));
        } else if (enable) {
          resultPlateScriptBuf.append(constructPlateScript(currNodeCtgry, false));
        }
      }else{
        
        if(SIUtil.isNotNull(makerCode) && enable){
          sqlStr = new StringBuffer();
          sqlStr.append("SELECT cc.ctgrycode FROM cmdtymtbl cm,cmdtyctgrymtbl cc ");
          sqlStr.append("WHERE cc.cmdtycode = cm.cmdtycode AND cc.ctgrycode = ").append(SIDBUtil.SQL2Str(currNodeCtgry.getCtgryCode(), " "));
          sqlStr.append("AND cm.makercode = ").append(SIDBUtil.SQL2Str(makerCode, " "));
          sqlStr.append("AND cm.cmdtycode IN (SELECT cmdtycode FROM cmdtyunittbl WHERE frontdispflg='1' AND NOT(usednewflg!='1' AND usednewflg!='7' AND rsrvenableflg='0' AND amountflg='1' AND amount='0' AND (soldoutdate + "+SIConfig.DEFAULT_SOLDOUT+" <= CURRENT_DATE)))");
          
          try{
            enable = enable && SIDBUtil.hasData(this.getDatabaseConnection(), sqlStr.toString());
          }catch(Exception e){
            e.printStackTrace();
            enable = false;
          }
        }
        if(SIUtil.isNotNull(usedNewTxt) && enable){
          String appendTxt = "";
          if(usedNewTxt.equals("new")) appendTxt="AND usednewflg IN ('1','6','7') ";
          if(usedNewTxt.equals("outlet")) appendTxt="AND usednewflg = '2' ";
          if(usedNewTxt.equals("used")) appendTxt="AND usednewflg IN ('0','3','4','5') ";
          sqlStr = new StringBuffer();
          sqlStr.append("SELECT cc.ctgrycode FROM cmdtymtbl cm,cmdtyctgrymtbl cc ");
          sqlStr.append("WHERE cc.cmdtycode = cm.cmdtycode AND cc.ctgrycode = ").append(SIDBUtil.SQL2Str(currNodeCtgry.getCtgryCode(), " "));
          sqlStr.append("AND cm.cmdtycode IN (SELECT cmdtycode FROM cmdtyunittbl WHERE frontdispflg='1' ").append(appendTxt);
          sqlStr.append("AND NOT(usednewflg!='1' AND usednewflg!='7' AND rsrvenableflg='0' AND amountflg='1' AND amount='0' AND (soldoutdate + "+SIConfig.DEFAULT_SOLDOUT+" <= CURRENT_DATE)))");
          
          try{
            enable = enable && SIDBUtil.hasData(this.getDatabaseConnection(), sqlStr.toString());
          }catch(Exception e){
            e.printStackTrace();
            enable = false;
          }
        }
        if(SIUtil.isNotNull(keyWord) && enable){
          sqlStr = new StringBuffer();
          sqlStr.append("SELECT cc.ctgrycode FROM cmdtymtbl cm,cmdtyctgrymtbl cc ");
          sqlStr.append("WHERE cc.cmdtycode = cm.cmdtycode AND cc.ctgrycode = ").append(SIDBUtil.SQL2Str(currNodeCtgry.getCtgryCode(), " "));
          sqlStr.append("AND cm.cmdtycode IN (SELECT cmdtycode FROM cmdtyunittbl WHERE frontdispflg=1 ");
          sqlStr.append("AND (cmdtyname LIKE '%").append(SIDBUtil.SQL2Like(keyWord)).append("%'");
          sqlStr.append(" OR description LIKE '%").append(SIDBUtil.SQL2Like(keyWord)).append("%'");
          sqlStr.append(" OR individualcode LIKE '%").append(SIDBUtil.SQL2Like(keyWord)).append("%') ");
          sqlStr.append("AND NOT(usednewflg!='1' AND usednewflg!='7' AND rsrvenableflg='0' AND amountflg='1' AND amount='0' AND (soldoutdate + "+SIConfig.DEFAULT_SOLDOUT+" <= CURRENT_DATE)))");
          
          try{
            enable = enable && SIDBUtil.hasData(this.getDatabaseConnection(), sqlStr.toString());
          }catch(Exception e){
            e.printStackTrace();
            enable = false;
          }
        }
        if (enable && currNodeCtgry.getCtgryCode().trim().equals(lCtgryCode)) {
          resultPlateScriptBuf.append(constructPlateScript(currNodeCtgry, true));
        } else if (enable) {
          resultPlateScriptBuf.append(constructPlateScript(currNodeCtgry, false));
        }
      }
    }
    return resultPlateScriptBuf.toString();
  }
  
  /**
   * <b>outputPlateScript </b> あるカテゴリからあるカテゴリコードまで、一行に出力する
   * 
   * @param lFromCtgryCode 起点のカテゴリコード
   * @param lToCtgryCode 終点までのカテゴリコード
   * @return なし
   * @throws なし
   */
  /*
  private void outputPlateScript(String lFromCtgryCode, String lToCtgryCode) {
    log.debug("outputPlateScript:lFromCtgryCode=" + lFromCtgryCode + ",lToCtgryCode=" + lToCtgryCode);
    
    SICtgryNode ctgryNode = (SICtgryNode) ctgries.get(lFromCtgryCode);
    if (ctgryNode == null) return;
    SICtgryNode currNodeCtgry = null;
    ArrayList childList = ctgryNode.getChild();
    
    if (lFromCtgryCode.trim().equals(lToCtgryCode)) {// 目的のカテゴリが見つかった
      resultPlateScriptBuf.append(constructPlateScript(ctgryNode, true));
      return;
    } else {
      resultPlateScriptBuf.append(constructPlateScript(ctgryNode, false));
    }
    
    for (int ii = 0; ii < childList.size(); ii++) {
      currNodeCtgry = (SICtgryNode) ctgries.get(childList.get(ii));
      if (currNodeCtgry.getCtgryCode().trim().equals(lToCtgryCode)) {
        resultPlateScriptBuf.append(constructPlateScript(currNodeCtgry, true));
        break;
      } else if (currNodeCtgry.getChild().contains(lToCtgryCode)) {
        resultPlateScriptBuf.append(constructPlateScript(currNodeCtgry, false));
      }
    }
  }
  */
  public String outputTitleScript() {
    return outputTitleScript(getCtgryCode());
  }
  
  /**
   * <b>outputTitleScript </b> あるカテゴリからあるカテゴリコードまで、一行に出力する
   * 
   * @param lToCtgryCode 終点までのカテゴリコード
   * @return なし
   * @throws なし
   */
  public String outputTitleScript(String lToCtgryCode) {
    log.debug("outputTitleScript:lToCtgryCode=" + lToCtgryCode);
    
    resultTitleScriptBuf = new StringBuffer();
    String ancesterCode = getAncesterCtgryCode(lToCtgryCode);
    String currCtgryCode = "";
    SICtgryNode currCtgryNode = new SICtgryNode();
    SICtgryNode topCtgryCode = (SICtgryNode) ctgries.get(SIConfig.SICATEGORY_ROOT_CODE);
    if (topCtgryCode == null) return "";
    ArrayList topChildList = topCtgryCode.getChild();
    
    // まず、トップコードを無条件に表示します。
    if (lToCtgryCode.equals(SIConfig.SICATEGORY_ROOT_CODE)) {
      resultTitleScriptBuf.append(constructTitleScript(topCtgryCode, true));
    } else {
      resultTitleScriptBuf.append(constructTitleScript(topCtgryCode, false));
    }
    
    // トップレベルの以下のレベル1の全てのカテゴリを出力します。
    for (int ii = 0; ii < topChildList.size(); ii++) {
      currCtgryCode = (String) topChildList.get(ii);
      currCtgryNode = (SICtgryNode) ctgries.get(currCtgryCode);
      if (currCtgryNode.getParentCtgryCode().trim().equals(SIConfig.SICATEGORY_ROOT_CODE)) {
        if (ancesterCode.trim().equals(currCtgryCode)) {
          resultTitleScriptBuf.append(constructTitleScript(currCtgryNode, true));
        } else {
          resultTitleScriptBuf.append(constructTitleScript(currCtgryNode, false));
        }
      }
    }
    return resultTitleScriptBuf.toString();
  }
  
  /**
   * <b>getCondition </b> あるカテゴリコードに対する、全ての商品レコードを取得するようの条件SQL文
   * 
   * @param lAliasName 条件項目に対するアリアス名
   * @param lFromCtgryCode 開始カテゴリコード
   * @return 条件のセット
   * @throws なし
   */
  public ArrayList getCondition(String lAliasName, String lFromCtgryCode) {
    if (SIUtil.isNull(lAliasName)) lAliasName = "";
    ArrayList lResultList = new ArrayList();
    SITableCondition tableCondition = new SITableCondition();
    
    // 全商品の場合に
    if (lFromCtgryCode.trim().equals(SIConfig.SICATEGORY_ROOT_CODE)) return new ArrayList();
    
    // 全商品以外の場合に
    SICtgryNode currCtgryNode = (SICtgryNode) ctgries.get(lFromCtgryCode);
    if (currCtgryNode == null) return new ArrayList();
    SICtgryNode childNode = new SICtgryNode();
    Iterator childIterator = currCtgryNode.getChild().iterator();
    
    // まず自分のカテゴリコードを条件に入れる
    tableCondition = new SITableCondition(lAliasName, "ctgryCode", lFromCtgryCode, SIConfig.SICONDITION_TYPE_EQUAL,// 比較のタイプ
        SIConfig.SICONDITION_TYPE_NOT);// 連携のタイプ
    lResultList.add(tableCondition);
    // 全ての子カテゴリコードを条件に入れる
    while (childIterator.hasNext()) {
      tableCondition = new SITableCondition();
      childNode = (SICtgryNode) ctgries.get((String) childIterator.next());
      tableCondition.setTableName(lAliasName);
      tableCondition.setItemName("ctgryCode");
      tableCondition.setItemValue(childNode.getCtgryCode());
      tableCondition.setAndOrType(SIConfig.SICONDITION_TYPE_OR);
      lResultList.add(tableCondition);
    }
    return lResultList;
  }
  
  public ArrayList getCondition(String lFromCtgryCode) {
    return getCondition("", lFromCtgryCode);
  }
  
  /**
   * <b>outputConditionSQL </b> あるカテゴリコードに対する、全ての商品レコードを取得するようの条件SQL文
   * 
   * @param lAliasName 検索項目に対するアリアス名
   * @param lFromCtgryCode カテゴリコード
   * @return 条件のセット
   * @throws なし
   */
  public String getConditionSQL(String lAliasName, String lFromCtgryCode) {
    if (SIUtil.isNull(lAliasName)) lAliasName = "";
    return SITableConditionManager.getCondtionSQL(getCondition(lAliasName, lFromCtgryCode));
  }
  
  public String getConditionSQL(String lFromCtgryCode) {
    return getConditionSQL("", lFromCtgryCode);
  }
  
  public String getConditionSQL() {
    return getConditionSQL("", getCtgryCode());
  }
  
  public String getConditionSQLL(String lAliasName, String lFromCtgryCode) {
    if (SIUtil.isNull(lFromCtgryCode)) lFromCtgryCode = SIConfig.SICATEGORY_ROOT_CODE;
    if (lFromCtgryCode.equals(SIConfig.SICATEGORY_ROOT_CODE)) return "";
    
    if (SIUtil.isNull(lAliasName)) lAliasName = "";
    else lAliasName = lAliasName + ".";
    
    StringBuffer lResBuf = new StringBuffer("(");
    if (lFromCtgryCode.equals(SIConfig.SICATEGORY_ROOT_CODE)) {
      lResBuf.append(lAliasName);
      lResBuf.append("branch LIKE '" + lFromCtgryCode + "%') ");
    } else {
      lResBuf.append(lAliasName);
      lResBuf.append("branch LIKE '%~" + lFromCtgryCode + "~%' ");
      lResBuf.append(" OR " + lAliasName);
      lResBuf.append("branch LIKE '%~" + lFromCtgryCode + "') ");
    }
    return lResBuf.toString();
  }
  
  public String getConditionSQL(String lAliasName, String lFromCtgryCode,String path) {
    if (SIUtil.isNull(lFromCtgryCode)) lFromCtgryCode = SIConfig.SICATEGORY_ROOT_CODE;
    if (SIUtil.isNull(lAliasName)) lAliasName = "";
    else lAliasName = lAliasName + ".";
    String ctgryGroup = "";
    if (SIUtil.isNotNull(path)&&path.equals("/hair")) ctgryGroup = "hair";
    else if (SIUtil.isNotNull(path)&&path.equals("/esthe")) ctgryGroup = "esthe";
    else if (SIUtil.isNotNull(path)&&path.equals("/bed")) ctgryGroup = "bed";
    else if (SIUtil.isNotNull(path)&&path.equals("/cosme")) ctgryGroup = "cosme";
    else if (SIUtil.isNotNull(path)&&path.equals("/nail")) ctgryGroup = "nail";
    else if (SIUtil.isNotNull(path)&&path.equals("/haircosme")) ctgryGroup = "haircosme";
    else if (SIUtil.isNotNull(path)&&path.equals("/book")) ctgryGroup = "book";
    else if (SIUtil.isNotNull(path)&&path.equals("/eyelash")) ctgryGroup = "eyelash";
    
    StringBuffer lResBuf = new StringBuffer("(");
    if (lFromCtgryCode.equals(SIConfig.SICATEGORY_ROOT_CODE)) {
      lResBuf.append(lAliasName);
      lResBuf.append("ctgrycode IN ");
      lResBuf.append("(SELECT a.ctgrycode FROM ctgryvw a,ctgrygrouptbl b ");
      lResBuf.append("WHERE (a.branch LIKE '%~'||b.ctgrycode||'~%' OR a.branch LIKE '%~'||b.ctgrycode) ");
      lResBuf.append("AND b.ctgrygroup=").append(SIDBUtil.SQL2Str(ctgryGroup,")) "));
    } else {
      lResBuf.append(lAliasName);
      lResBuf.append("branch LIKE '%~" + lFromCtgryCode + "~%' ");
      lResBuf.append(" OR " + lAliasName);
      lResBuf.append("branch LIKE '%~" + lFromCtgryCode + "') ");
    }
    return lResBuf.toString();
  }
  
  /**
   * <b>getAncesterCtgryCode </b> あるカテゴリコードに対する祖先カテゴリコードの取得、つまり、レベル1のカテゴリコード(レベル0:トップカテゴリコード)
   * 
   * @param lCtgryCode 対象カテゴリコード
   * @return 祖先カテゴリコード(レベル1のカテゴリコード)
   * @throws なし
   */
  public String getAncesterCtgryCode(String lCtgryCode) {
    if (SIUtil.isNull(lCtgryCode)) {
      log.warn("null ctgry code.");
      return "";
    }
    // ///
    Iterator ctgryList = ctgries.keySet().iterator();
    SICtgryNode currNodeCtgry;
    String currCtgryCode = null;
    
    while (ctgryList.hasNext()) {
      currCtgryCode = (String) ctgryList.next();
      currNodeCtgry = (SICtgryNode) ctgries.get(currCtgryCode);
      if (currNodeCtgry.getParentCtgryCode().trim().equals(SIConfig.SICATEGORY_ROOT_CODE)) {
        if (currCtgryCode.trim().equals(lCtgryCode)) return currCtgryCode;// 自身
        else if (currNodeCtgry.getChild().contains(lCtgryCode)) return currCtgryCode;// こどもリストに属する
      }
    }
    return SIConfig.SICATEGORY_ROOT_CODE;
  }
  
  /**
   * <b>constructScript </b> サンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、実際のスクリプトを作成します。
   * 
   * @param lTemplateScript サンプルスクリプト
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lScriptType スクリプトタイプ(Tree、Plate、Title)
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructScriptFront(String lTemplateScript, SICtgryNode lCtgryCode, int lScriptType,
      boolean lOnSelected) {
    if (SIUtil.isNull(lTemplateScript))
      return "";
    String lSpace = "";
    String lAmount = "0";
    ResourceBundle rb = ResourceBundle.getBundle(SIConfig.SICONFIG_CONTEXT_NAME,new Locale("ja","JP"));
    String webshop ="/"+ rb.getString("contextName");
    if (lCtgryCode.getCtgryCode().equals("category001")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image1','','"+webshop+"/img/top/menu/menu_biyo_01_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_01.gif\" alt=\"{ctgryname}\" name=\"Image1\" width=\"194\" border=\"0\" id=\"Image1\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category002")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+ "/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image2','','"+webshop+"/img/top/menu/menu_biyo_02_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_02.gif\" alt=\"{ctgryname}\" name=\"Image2\" width=\"194\" border=\"0\" id=\"Image2\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category003")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image3','','"+webshop+"/img/top/menu/menu_biyo_03_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_03.gif\" alt=\"{ctgryname}\" name=\"Image3\" width=\"194\" border=\"0\" id=\"Image3\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category004")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image4','','"+webshop+"/img/top/menu/menu_biyo_04_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_04.gif\" alt=\"{ctgryname}\" name=\"Image4\" width=\"194\" border=\"0\" id=\"Image4\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category005")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image5','','"+webshop+"/img/top/menu/menu_biyo_05_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_05.gif\" alt=\"{ctgryname}\" name=\"Image5\" width=\"194\" border=\"0\" id=\"Image5\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category006")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image6','','"+webshop+"/img/top/menu/menu_biyo_06_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_06.gif\" alt=\"{ctgryname}\" name=\"Image6\" width=\"194\" border=\"0\" id=\"Image6\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category009")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image9','','"+webshop+"/img/top/menu/menu_biyo_09_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_09.gif\" alt=\"{ctgryname}\" name=\"Image9\" width=\"194\" border=\"0\" id=\"Image9\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category010")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image10','','"+webshop+"/img/top/menu/menu_biyo_10_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_10.gif\" alt=\"{ctgryname}\" name=\"Image10\" width=\"194\" border=\"0\" id=\"Image10\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category011")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image11','','"+webshop+"/img/top/menu/menu_biyo_11_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_11.gif\" alt=\"{ctgryname}\" name=\"Image11\" width=\"194\" border=\"0\" id=\"Image11\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category012")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image12','','"+webshop+"/img/top/menu/menu_biyo_12_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_12.gif\" alt=\"{ctgryname}\" name=\"Image12\" width=\"194\" border=\"0\" id=\"Image12\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category013")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image13','','"+webshop+"/img/top/menu/menu_biyo_13_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_biyo_13.gif\" alt=\"{ctgryname}\" name=\"Image13\" width=\"194\" border=\"0\" id=\"Image13\"></a><br>"
        + "</td></tr>";
    // ここからエステカテゴリ
    } else if (lCtgryCode.getCtgryCode().equals("category007")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image7','','"+webshop+"/img/top/menu/menu_esthe_07_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_07.gif\" alt=\"{ctgryname}\" name=\"Image7\" width=\"194\" border=\"0\" id=\"Image7\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category008")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image8','','"+webshop+"/img/top/menu/menu_esthe_08_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_08.gif\" alt=\"{ctgryname}\" name=\"Image8\" width=\"194\" border=\"0\" id=\"Image8\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category110")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image10e','','"+webshop+"/img/top/menu/menu_esthe_10_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_10.gif\" alt=\"{ctgryname}\" name=\"Image10e\" width=\"194\" border=\"0\" id=\"Image10e\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category014")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image14','','"+webshop+"/img/top/menu/menu_esthe_14_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_14.gif\" alt=\"{ctgryname}\" name=\"Image14\" width=\"194\" border=\"0\" id=\"Image14\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category015")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image15','','"+webshop+"/img/top/menu/menu_esthe_15_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_15.gif\" alt=\"{ctgryname}\" name=\"Image15\" width=\"194\" border=\"0\" id=\"Image15\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category016")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image16','','"+webshop+"/img/top/menu/menu_esthe_16_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_16.gif\" alt=\"{ctgryname}\" name=\"Image16\" width=\"194\" border=\"0\" id=\"Image16\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category017")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image17','','"+webshop+"/img/top/menu/menu_esthe_17_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_17.gif\" alt=\"{ctgryname}\" name=\"Image17\" width=\"194\" border=\"0\" id=\"Image17\"></a><br>"
        + "</td></tr>";
    } else if (lCtgryCode.getCtgryCode().equals("category018")) {
      lTemplateScript = "<tr><td align= \"left\"><a {select} href=\""
        + webshop+"/main"
        + "?actionNameTxt="
        + SIConfig.SIACTION_CTGRY
        + "&cmdtyFlagTxt={cmdtyflag}&ctc={ctgrycode}\" onMouseOver=\"MM_swapImage('Image18','','"+webshop+"/img/top/menu/menu_esthe_18_2.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\""+webshop+"/img/top/menu/menu_esthe_18.gif\" alt=\"{ctgryname}\" name=\"Image18\" width=\"194\" border=\"0\" id=\"Image18\"></a><br>"
        + "</td></tr>";
    }

    if (getTopEnable()) {
      lSpace = SIHTMLUtil.getHTMLSpace(lCtgryCode.getLevel() * getIndent());
    } else {
      lSpace = SIHTMLUtil.getHTMLSpace((lCtgryCode.getLevel() - 1) * getIndent());
    }

    if (lOnSelected) {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenSelected),
          selected[lScriptType]);
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken("/" + tokenSelected),
          endSelected[lScriptType]);
    } else {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenSelected), " ");
      lTemplateScript = SIStringUtil
          .replace(lTemplateScript, getFullToken("/" + tokenSelected), "");
    }

    //7.1.1 ST0176 修正 ここから
    if (lTemplateScript.indexOf(tokenAmount) != -1 && getManagerFlg().equals("1")) {//商品数の表示があれば
      // かつ
      // 管理画面、無条件に表示
      lAmount = getCmdtyAmount(lCtgryCode);
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAmount), "【"
          + String.valueOf(lAmount) + "件】");
    } else if (lTemplateScript.indexOf(tokenAmount) != -1 && SIConfig.SICMDTY_AMOUNT_ENABLE) {//商品数の表示があれば
      // かつ
      // 件数表示可能フラグ設定
      lAmount = String.valueOf(lCtgryCode.getCmdtyAmount());
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAmount), "【"
          + String.valueOf(lAmount) + "件】");
      //7.1.1 ST0176 修正 ここまで
    } else {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAmount), "");
    }

    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenLevel), lSpace);
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenCtgryCode),
        SIHTMLUtil.HTMLEncode(lCtgryCode.getCtgryCode()));

    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenCtgryName),
        SIHTMLUtil.HTMLEncode(lCtgryCode.getCtgryName()));

    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenJSCtgryName),
        SIHTMLUtil.JSHTMLEncode(lCtgryCode.getCtgryName()));//7.4.0 ST2083 追加
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAbbvCtgryName),
        SIHTMLUtil.HTMLEncode(lCtgryCode.getAbbvCtgryName()));
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenCmdtyFlag),
        SIHTMLUtil.HTMLEncode(lCtgryCode.getCmdtyFlagTxt()));//7.2.0 ST0301 追加

    if (lCtgryCode.getExistFlg()) {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenChecked),
          SIHTMLUtil.HTMLEncode(checked[1]));
    } else {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenChecked),
          SIHTMLUtil.HTMLEncode(checked[0]));
    }
    if (lCtgryCode.getCtgryCode().equals("/")) {
      lTemplateScript = "";
    }

    return lTemplateScript + "\n";
  }

  /**
   * <b>constructTreeScript </b> Tree構造のサンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、 実際のTree構造用のスクリプトを作成します。
   * 
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructTreeScript(SICtgryNode lCtgryCode, boolean lOnSelected) {
    return constructScript(getTreeScript(), lCtgryCode, TREE_SCRIPT_TYPE, lOnSelected);
  }
  
  /**
   * <b>constructTitleScript </b> Title構造のサンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、 実際のTitle構造用のスクリプトを作成します。
   * 
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructTitleScript(SICtgryNode lCtgryCode, boolean lOnSelected) {
    // タブ表示名が登録されていないとき、カテゴリタイトルの"|"は非表示にする
    if (lCtgryCode.getAbbvCtgryName().equals("")) return "";// 7.2.0 ST0301 追加
    return constructScript(getTitleScript(), lCtgryCode, TITLE_SCRIPT_TYPE, lOnSelected);
  }
  
  /**
   * <b>constructPlateScript </b> Plate構造のサンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、 実際のPlate構造用のスクリプトを作成します。
   * 
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructPlateScriptFront(SICtgryNode lCtgryCode, boolean lOnSelected) {
    if (lOnSelected) {
      return constructScriptFront(getPlateSelected(), lCtgryCode, PLATE_SCRIPT_TYPE, false);
    } else {
      return constructScriptFront(getPlateScript(), lCtgryCode, PLATE_SCRIPT_TYPE, false);
    }
  }
  
  /**
   * <b>constructTreeScript </b> Tree構造のサンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、 実際のTree構造用のスクリプトを作成します。
   * 
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructTreeScriptFront(SICtgryNode lCtgryCode, boolean lOnSelected) {
    return constructScriptFront(getTreeScript(), lCtgryCode, TREE_SCRIPT_TYPE, lOnSelected);
  }
  
  /**
   * <b>constructTitleScript </b> Title構造のサンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、 実際のTitle構造用のスクリプトを作成します。
   * 
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructTitleScriptFront(SICtgryNode lCtgryCode, boolean lOnSelected) {
    // タブ表示名が登録されていないとき、カテゴリタイトルの"|"は非表示にする
    if (lCtgryCode.getAbbvCtgryName().equals("")) return "";// 7.2.0 ST0301 追加
    return constructScriptFront(getTitleScript(), lCtgryCode, TITLE_SCRIPT_TYPE, lOnSelected);
  }
  
  /**
   * <b>constructPlateScript </b> Plate構造のサンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、 実際のPlate構造用のスクリプトを作成します。
   * 
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructPlateScript(SICtgryNode lCtgryCode, boolean lOnSelected) {
    if (lOnSelected) {
      return constructScript(getPlateSelected(), lCtgryCode, PLATE_SCRIPT_TYPE, false);
    } else {
      return constructScript(getPlateScript(), lCtgryCode, PLATE_SCRIPT_TYPE, false);
    }
  }
  
  /**
   * <b>getCollection </b> 一覧選択用の検索項目に対する、comboxに使われるデータリストを生成
   * 
   * @param lConnection DBへのコネクション
   * @param lSeq 検索項目の順番番号
   * @return combox用のデータリストコレクション
   * @throws なし
   */
  public Collection getCollection(Connection lConnection, int lSeq) {
    if (!isCombox(lSeq)) return null;
    
    Collection lResultColl = new ArrayList();
    String lItemName = SIConfig.getSrchKeyNameDB(lSeq);// 検索項目名の作成
    
    // 検索用のSQL文の作成
    PreparedStatement lPreparedStatement = null;
    ResultSet lResultSet = null;
    
    StringBuffer lSqlBuf = new StringBuffer();
    if (SIDBMultiConf.SIDB_CURRENT_INX == SIDBMultiConf.SIDB_POSTGRESQL_INX) {
      lSqlBuf.append("SELECT * FROM SrchKeyNameFunc(?,?)");
      try {
        lPreparedStatement = lConnection.prepareStatement(lSqlBuf.toString());
        lPreparedStatement.setString(1, lItemName);
        lPreparedStatement.setString(2, getCtgryCode());
        lResultSet = lPreparedStatement.executeQuery();
      } catch (SQLException e1) {
        e1.printStackTrace();
      }
    } else {
      lSqlBuf.append("{CALL SrchKeyName.SrchKeyNameProc(?,?,?)}");
      try {
        CallableStatement cstmt;
        cstmt = lConnection.prepareCall(lSqlBuf.toString());
        cstmt.setString(1, lItemName);
        cstmt.setString(2, getCtgryCode());
        cstmt.registerOutParameter(3, OracleTypes.CURSOR);
        cstmt.execute();
        lResultSet = (ResultSet) cstmt.getObject(3);
      } catch (SQLException e1) {
        e1.printStackTrace();
      }
    }
    
    SINameValue lNameValue = new SINameValue();
    try {
      while (lResultSet.next()) {
        lNameValue = new SINameValue(lResultSet.getString(1), lResultSet.getString(2));
        lResultColl.add(lNameValue);
      }
    } catch (SQLException e1) {
      e1.printStackTrace();
    } finally {
      if (lPreparedStatement != null) try {
        lPreparedStatement.close();
      } catch (SQLException sqle) {
        sqle.printStackTrace();
      }
      if (lResultSet != null) try {
        lResultSet.close();
      } catch (SQLException sqle) {
        sqle.printStackTrace();
      }
    }
    
    lResultColl = SIUtil.insertColl(lResultColl, new SINameValue("指定しない", ""));
    return lResultColl;
    
  }
  
  /**
   * <b>getCollection </b> 可能の全ての検索項目に対する、comboxに使われるデータリストを生成
   * 
   * @param lConnection DBへのコネクション
   * @return combox用のデータリストコレクション列
   * @throws なし
   */
  public Collection[] getCollection(Connection lConnection) {
    Collection[] lResultColl = new ArrayList[SIConfig.SISRCH_KEY_NAME_MAX];
    for (int ii = 0; ii < SIConfig.SISRCH_KEY_NAME_MAX; ii++) {
      lResultColl[ii] = getCollection(lConnection, ii);
    }
    return lResultColl;
  }
  
  /**
   * <b>getShopCollection </b> フロント側に全ての開店ショップ一覧リストを取得します。
   * 
   * @param lConnection DBへのコネクション
   * @return 開店ショップ一覧リスト
   * @throws なし
   */
  public Collection getShopCollection(Connection lConnection) {
    StringBuffer lSqlBuf = new StringBuffer("SELECT AbbvFrontShopName,MallShopCode FROM MallShopMTbl ");
    lSqlBuf.append("WHERE MallShopFlg='1' AND Status='1' ORDER BY AbbvFrontShopName");
    log.debug("getShopCollection:lSqlBuf=" + lSqlBuf.toString());
    
    try {
      return SIDBUtil.getCollection(lConnection, lSqlBuf.toString(), true);
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      return new ArrayList();
    }
  }
  
  /**
   * <b>getCmdtyAmount </b> あるカテゴリコード及び子カテゴリに所属する商品数を求める
   * 
   * @param lCtgryCode 対象カテゴリ
   * @return 商品数
   * @throws なし
   */
  public String getCmdtyAmount(SICtgryNode lCtgryCode) {
    PreparedStatement lPreparedStatement = null;
    ResultSet lResultSet = null;
    String lAmount = "0";
    
    // 7.3.0 PI-NES0501 修正 ここから
    // カテゴリに関わる商品数を問い合わせSQL文の作成
    StringBuffer lSqlBuf = new StringBuffer("SELECT COUNT(*) FROM (");
    lSqlBuf.append("SELECT aa.ShopCode,aa.CmdtyCode ");
    lSqlBuf.append("FROM CmdtyCtgryMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("aa,");
    lSqlBuf.append("CmdtyMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("bb,");
    lSqlBuf.append("MallShopMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("cc ");
    lSqlBuf.append("WHERE aa.shopcode=cc.mallshopcode ");
    if (getManagerFlg().equals("0")) {// フロント側に閉店の場合には、対象外、
      lSqlBuf.append("AND cc.status='1' ");
    }
    lSqlBuf.append("AND aa.shopcode = bb.shopcode AND aa.cmdtycode = bb.cmdtycode ");
    // 7.3.0 PI-NES0501 修正 ここまで
    ArrayList lArrayList = new ArrayList();
    if (!lCtgryCode.getCtgryCode().equals(SIConfig.SICATEGORY_ROOT_CODE)) {// ルートの場合には、全て
      lSqlBuf.append("AND aa.CtgryCode IN (?");
      lArrayList = lCtgryCode.getChild();// 子カテゴリリストの取得
      for (int ii = 0; ii < lArrayList.size(); ii++) {
        lSqlBuf.append(",?");
      }
      lSqlBuf.append(") ");
    }
    lSqlBuf.append("GROUP BY aa.ShopCode,aa.CmdtyCode)");
    lSqlBuf.append(SIDBMultiConf.SIALIAS_CURR_NAME).append("CmdtyAmount");
    // log.debug("getCmdtyAmount:lSqlBuf="+lSqlBuf.toString());
    // SQL文の構成完了
    
    try {
      lPreparedStatement = getDatabaseConnection().prepareStatement(lSqlBuf.toString());
      if (!lCtgryCode.getCtgryCode().equals(SIConfig.SICATEGORY_ROOT_CODE)) {// ルートの場合には、全て
        lPreparedStatement.setString(1, lCtgryCode.getCtgryCode());// まず、自身のカテゴリコード
        for (int ii = 0; ii < lArrayList.size(); ii++) {// 子カテゴリリスト
          lPreparedStatement.setString(ii + 2, (String) lArrayList.get(ii));
        }
      }
      lResultSet = lPreparedStatement.executeQuery();// 実行
      if (lResultSet.next()) lAmount = lResultSet.getString(1);// 結果あれば、設定
      else lAmount = "0";// default
    } catch (SQLException e1) {
      e1.printStackTrace();
    } finally {
      if (lPreparedStatement != null) try {
        lPreparedStatement.close();
      } catch (SQLException sqle) {
        sqle.printStackTrace();
      }
      if (lResultSet != null) try {
        lResultSet.close();
      } catch (SQLException sqle) {
        sqle.printStackTrace();
      }
    }
    return lAmount;
  }
  
  /**
   * <b>constructScript</b> サンプルスクリプトを基づいて、各パラメータのデータを入れ替えて、実際のスクリプトを作成します。
   * 
   * @param lTemplateScript サンプルスクリプト
   * @param lCtgryCode 出力するカテゴリレコード
   * @param lScriptType スクリプトタイプ(Tree、Plate、Title)
   * @param lOnSelected 選択されるかどうかフラグ
   * @return 変換後のスクリプト
   * @throws なし
   */
  private String constructScript(String lTemplateScript, SICtgryNode lCtgryCode, int lScriptType, boolean lOnSelected) {
    if (SIUtil.isNull(lTemplateScript)) return "";
    String lSpace = "";
    String lAmount = "0";
    
    if (getTopEnable()) {
      lSpace = SIHTMLUtil.getHTMLSpace(lCtgryCode.getLevel() * getIndent());
    } else {
      lSpace = SIHTMLUtil.getHTMLSpace((lCtgryCode.getLevel() - 1) * getIndent());
    }
    
    if (lOnSelected) {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenSelected), selected[lScriptType]);
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken("/" + tokenSelected), endSelected[lScriptType]);
    } else {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenSelected), " ");
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken("/" + tokenSelected), "");
    }
    
    // 7.1.1 ST0176 修正 ここから
    if (lTemplateScript.indexOf(tokenAmount) != -1 && getManagerFlg().equals("1")) {// 商品数の表示があれば かつ 管理画面、無条件に表示
      lAmount = getCmdtyAmount(lCtgryCode);
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAmount), "【" + String.valueOf(lAmount) + "件】");
    } else if (lTemplateScript.indexOf(tokenAmount) != -1 && SIConfig.SICMDTY_AMOUNT_ENABLE) {// 商品数の表示があれば かつ 件数表示可能フラグ設定
      lAmount = String.valueOf(lCtgryCode.getCmdtyAmount());
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAmount), "【" + String.valueOf(lAmount) + "件】");
      // 7.1.1 ST0176 修正 ここまで
    } else {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAmount), "");
    }
    
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenLevel), lSpace);
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenCtgryCode), SIHTMLUtil.HTMLEncode(lCtgryCode.getCtgryCode()));
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenCtgryName), SIHTMLUtil.HTMLEncode(lCtgryCode.getCtgryName()));
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenJSCtgryName), SIHTMLUtil.JSHTMLEncode(lCtgryCode.getCtgryName()));// 7.4.0 ST2083 追加
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenAbbvCtgryName), SIHTMLUtil.HTMLEncode(lCtgryCode.getAbbvCtgryName()));
    lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenCmdtyFlag), SIHTMLUtil.HTMLEncode(lCtgryCode.getCmdtyFlagTxt()));// 7.2.0 ST0301 追加
    
    if (lCtgryCode.getExistFlg()) {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenChecked), SIHTMLUtil.HTMLEncode(checked[1]));
    } else {
      lTemplateScript = SIStringUtil.replace(lTemplateScript, getFullToken(tokenChecked), SIHTMLUtil.HTMLEncode(checked[0]));
    }
    return lTemplateScript + "\n";
  }
  
  // 7.1.1 ST0195 追加 ここから
  /**
   * <b>checkCtgryList </b> 当分商品に属されるカテゴリリストデータは、フロント側にクリックされるカテゴリと一致するかどうかをチェック
   * 
   * @param lChkedCtgryList 商品に属されるカテゴリリスト
   * @return チェックの結果
   * @throws なし
   */
  public boolean checkCtgryList(ArrayList lChkedCtgryList) {
    if (lChkedCtgryList == null || lChkedCtgryList.size() == 0) return false;
    
    boolean lResult = false;
    SICtgryNode lCtgryCode = (SICtgryNode) ctgries.get(getCtgryCode());
    if (lCtgryCode == null) lCtgryCode = new SICtgryNode();
    ArrayList lChildList = lCtgryCode.getChild();
    if (lChildList == null) lChildList = new ArrayList();
    
    for (int ii = 0; ii < lChkedCtgryList.size(); ii++) {
      String lChkedCtgryCode = (String) lChkedCtgryList.get(ii);
      if (lChildList.contains(lChkedCtgryCode) || lChkedCtgryCode.equalsIgnoreCase(getCtgryCode())) {
        lResult = true;
        break;
      }
    }
    return lResult;
  }
  // 7.1.1 ST0195 追加 ここまで
  public boolean isJoin(String lCtgryCode){
    if(SIUtil.isNull(lCtgryCode) || lCtgryCode.equals(SIConfig.SICATEGORY_ROOT_CODE)) return false;
    return (ctgries.get(lCtgryCode) != null);
  }
}