package jp.agentec.sinaburocast.action.admin.enquete;

import java.util.ArrayList;
import java.util.HashMap;

import jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.SinaburoConstant.EnqueteType;
import jp.agentec.sinaburocast.common.annotation.OperationHistoryAno;
import jp.agentec.sinaburocast.common.util.SinaburoUtil;
import jp.agentec.sinaburocast.common.util.SinaburoViewUtil;
import jp.agentec.sinaburocast.entity.AdminUser;
import jp.agentec.sinaburocast.entity.Answer;
import jp.agentec.sinaburocast.entity.Enquete;
import jp.agentec.sinaburocast.entity.Question;
import jp.agentec.sinaburocast.form.admin.enquete.EnqueteRegistForm;
import jp.agentec.sinaburocast.service.AnswerService;
import jp.agentec.sinaburocast.service.EnqueteService;
import jp.agentec.sinaburocast.service.OrganizationService;
import jp.agentec.sinaburocast.service.QuestionService;
import jp.agentec.sinaburocast.service.ReplyService;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.TokenProcessor;
import org.seasar.framework.beans.util.Beans;
import org.seasar.framework.util.StringUtil;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

/**
 * アンケート登録
 *
 * @author choi-c
 *
 */
public class EnqueteRegistAction extends AbstractAction {

	private final Logger logger = Logger.getLogger(getClass());

	@ActionForm
	public EnqueteRegistForm enqueteRegistForm;

	public EnqueteService enqueteService;

	public QuestionService questionService;

	public AnswerService answerService;

	public OrganizationService organizationService;

	public ReplyService replyService;


	public static String selectKuhaku="  ";
	/**
	 * 初期表示「アンケート基本」
	 */
	@Execute(validator = false,reset="resetIndex")
	public String index() {
		//アンケート基本情報設定
		if(!StringUtil.equals(enqueteRegistForm.eid,"0")){//アンケート検索画面でコーピー,アンケート名リンクを押下した際。
			enqueteRegistForm.enquete = enqueteService.findById(Integer.parseInt(enqueteRegistForm.eid));

			if(StringUtil.equals(enqueteRegistForm.cmd,"copy")){//アンケート検索画面でコーピーを押下した際。
				enqueteRegistForm.enquete.enqueteName ="";
				enqueteRegistForm.enquete.enqueteId = 0;
			}


			//スラッシュ追加
			if(StringUtil.isNotEmpty(enqueteRegistForm.enquete.startDate)){
				enqueteRegistForm.enquete.startDate = SinaburoUtil.convertStringDateToFormat(enqueteRegistForm.enquete.startDate, SinaburoConstant.datePikerSign.signSlash);
			}

			if(StringUtil.isNotEmpty(enqueteRegistForm.enquete.endDate)){
				enqueteRegistForm.enquete.endDate = SinaburoUtil.convertStringDateToFormat(enqueteRegistForm.enquete.endDate,SinaburoConstant.datePikerSign.signSlash);
			}
		}else{
			enqueteRegistForm.enquete = new Enquete();
			session.removeAttribute(EnqueteRegistForm.sessionKey);
		}

		enqueteRegistForm.replyCount = replyService.getCountByEnqueteId(Integer.parseInt(enqueteRegistForm.eid));



		return "/admin/enquete/enqueteRegist.html";
	}

	/**
	 * アンケート基本設定確認画面から戻ってきた場合
	 * @return
	 */
	@Execute(validator = false)
	public String confirmBack() {
		return "/admin/enquete/enqueteRegist.html";
	}


	@Execute(validator = true,validate="enqueteRegistConfirmValidate",input="/admin/enquete/enqueteRegist.html")
	public String enqueteConfirm() {
		TokenProcessor.getInstance().saveToken(request);
		formCheck();
		if(hasErrors()){
			return "/admin/enquete/enqueteRegist.html";
		}
		return "/admin/enquete/enqueteRegistConfirm.html";
	}

	/**
	 * Formの日付のチェックを行う。
	 */
	private void formCheck(){
		if(StringUtil.isNotBlank(enqueteRegistForm.enquete.startDate) && !SinaburoUtil.checkDate(enqueteRegistForm.enquete.startDate)){
			addErrorMessage("dateError", "errors.E033");
			addErrorMessage("dateError_1", "errors.E033_1");
			addErrorMessage("dateError_2", "errors.E033_2");
		}else if(StringUtil.isNotBlank(enqueteRegistForm.enquete.endDate) && !SinaburoUtil.checkDate(enqueteRegistForm.enquete.endDate)){
			addErrorMessage("dateError", "errors.E033");
			addErrorMessage("dateError_1", "errors.E033_1");
			addErrorMessage("dateError_2", "errors.E033_2");
		}else if(StringUtil.isNotBlank(enqueteRegistForm.enquete.startDate) && StringUtil.isNotBlank(enqueteRegistForm.enquete.endDate)
				&& enqueteRegistForm.enquete.endDate.compareTo(enqueteRegistForm.enquete.startDate) < 0
				){
			addErrorMessage("dateError", "errors.E020");
		}
	}

	/**
	 * アンケート登録
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.INSERT,target="アンケート登録",detail="登録",screenId=SinaburoConstant.screenId.CEN0003)
	public String enqueteRegist() {
		if (!TokenProcessor.getInstance().isTokenValid(request, true)) {
			addError(SinaburoViewUtil.getMessage("errors.S999"));
			return "/error/admin/doubleAction.html";
		}
		enqueteService.registEnquete(enqueteRegistForm,getAdmin());
		return "/admin/enquete/enqueteRegistEnd.html";
	}

	/**
	 * アンケートコピー
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.INSERT,target="アンケート登録",detail="コピー",screenId=SinaburoConstant.screenId.CEN0001)
	public String enqueteCopy() {
		enqueteService.enqueteCopy(Integer.parseInt(enqueteRegistForm.eid),getAdmin().loginId);
		return "/admin/enquete/enqueteSearch/search/1";
	}



	/**
	 * アンケート更新
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.UPDATE,target="アンケート更新",detail="更新",screenId=SinaburoConstant.screenId.CEN0003)
	public String enqueteUpdate() {
		if (!TokenProcessor.getInstance().isTokenValid(request, true)) {
			addError(SinaburoViewUtil.getMessage("errors.S999"));
			return "/error/admin/doubleAction.html";
		}


		enqueteService.updateEnquete(enqueteRegistForm,getAdmin());
		return "/admin/enquete/enqueteRegistEnd.html";
	}


	/**
	 * 初期表示「設問定義」
	 */
	@Execute(validator = false)
	public String questionRegistIndex() {
		enqueteRegistForm.enquete = enqueteService.findById(Integer.parseInt(enqueteRegistForm.eid));
		enqueteRegistForm.questionList = questionService.findAllOrderByEnqueteId(enqueteRegistForm.eid);
		enqueteRegistForm.organizationListFor1Percent = organizationService.findAllOrderByNo();

		enqueteRegistForm.replyCount = replyService.getCountByEnqueteId(Integer.parseInt(enqueteRegistForm.eid));
		//設問設定画面
		return "/admin/enquete/questionRegist.html";
	}


	/**
	 * 設問定義更新「順番更新」
	 */
	@Execute(validator = false)
	public String questionUpdate() {
		/******************************削除 ************************************/
		delQuestion(true);
		/******************************順番更新 *************************************/
		enqueteRegistForm.questionList = questionService.findAllOrderByEnqueteId(enqueteRegistForm.eid);

		if(enqueteRegistForm.questionNoSort != null){
			ArrayList<String> questionNoSort = enqueteRegistForm.questionNoSort;

			ArrayList<String> questionNoSortOld = enqueteRegistForm.questionNoSortOld;

			//ソート番号と実際の設問番号の数が合わない場合
			if(questionNoSort.size() != enqueteRegistForm.questionList.size()){
				ActionMessages errors = new ActionMessages();
				errors.add("questionNoSortError", new ActionMessage("設問の数が画面を開いた際と相違があります。",false));
				return "/admin/enquete/questionRegist.html";
			}

			//表示した際の番号を取得する。
			HashMap <Integer,Question> sortMap = new HashMap <Integer,Question>();
			if(questionNoSortOld.size() > 1){
				//questionNoを上書きする。
				for(Question question :enqueteRegistForm.questionList){
					sortMap.put(question.questionId, question);
				}
			}

			boolean isReload=false;

			//順番変更と削除されたものがあったら詰める
			for(int i=0;i<questionNoSort.size();i++){
				Question que =sortMap.get(Integer.parseInt(questionNoSort.get(i)));
				if(que != null && que.questionNo != i+1){
					que.questionNo= i+1;
					questionService.update(que);
					isReload = true;
				}
			}


			//順番変更があった場合、再検索を行う。
			if(isReload){
				enqueteRegistForm.questionList = questionService.findAllOrderByEnqueteId(enqueteRegistForm.eid);
			}
		}

		enqueteRegistForm .organizationListFor1Percent = organizationService.findAllOrderByNo();

		return "/admin/enquete/questionRegist.html";
	}

	/**
	 * 設問の削除を行う
	 * 削除される設問を条件付き必須にしている別の設問の条件必須設問ID、条件付き必須回答IDを0にクリアする。
	 */
	private void delQuestion(boolean isClear){
	/******************************削除************************************/
		String delQuestionId = enqueteRegistForm.delQuestionIdList;

		if (StringUtil.isNotBlank(delQuestionId)) {
			// m_question
			questionService.deleteByQuestionInfo(delQuestionId,getAdmin().loginId,isClear);
		}
	}
	/**
	 * 設問編集
	 * @return
	 */
	@Execute(validator = false)
	public String questionEdit() {
		enqueteRegistForm.enquete = enqueteService.findById(Integer.parseInt(enqueteRegistForm.eid));
		enqueteRegistForm.questionList = questionService.findAllOrderByEnqueteId(enqueteRegistForm.eid);
		//select * from m_organization order by organization_no
		enqueteRegistForm.organizationListFor1Percent = organizationService.findAllOrderByNo();
		//条件付き必須の回答一覧取得
		if(enqueteRegistForm.inputQuestion.condRequiredQuestionNo != null ){
			if(enqueteRegistForm.inputQuestion.condRequiredQuestionNo == 0 && !CollectionUtils.isEmpty(enqueteRegistForm.condRequiredQuestionAnswerList)){
				enqueteRegistForm.condRequiredQuestionAnswerList.removeAll(enqueteRegistForm.condRequiredQuestionAnswerList);
			}else{
				enqueteRegistForm.condRequiredQuestionAnswerList = (ArrayList<Answer>) answerService.findAllByEnqueteIdAndQuestionId(enqueteRegistForm.eid,enqueteRegistForm.inputQuestion.condRequiredQuestionNo);
			}
		}
		//設問編集画面
		return "/admin/enquete/questionEdit.html";
	}

	/**
	 * 設問一覧からの項目名リンク押下
	 * @return
	 */
	@Execute(validator = false)
	public String questionEditFromQuestionList() {
		EnqueteRegistForm frm = enqueteRegistForm;
		//アップデート
		frm.condRequiredQuestionAnswerList = new ArrayList<Answer>();
		frm.condRequiredAnswerIdList = new ArrayList<String>();
		frm.radioAdminText = new ArrayList<String>();
		frm.checkDefault = new ArrayList<String>();
		frm.checkAdminText = new ArrayList<String>();
		frm.radioAsnwerIdList = new ArrayList<String>();
		frm.checkAsnwerIdList = new ArrayList<String>();
		frm.selectAsnwerIdList = new ArrayList<String>();

		Question question = questionService.findByQuestionIdOrderByEnqueteId(Integer.parseInt(frm.qid));
		frm .questionList = questionService.findAllOrderByEnqueteId(question.enqueteId.toString());
		frm.eid =question.enqueteId+"";
		frm .enquete = enqueteService.findById(Integer.parseInt(question.enqueteId.toString()));
		frm .organizationListFor1Percent = organizationService.findAllOrderByNo();


		//条件付き必須の回答一覧取得
		if(StringUtil.isNotBlank(question.condRequiredAnswer)){
			//frm.condRequiredQuestionAnswerList = (ArrayList<Answer>) answerService.findAllByAnswerId(question.condRequiredAnswer.split(","));
			frm.condRequiredAnswerIdList = new ArrayList<String>();
			for (String answerId : question.condRequiredAnswer.split(",")) {
				frm.condRequiredAnswerIdList.add(answerId);
			}
		}

		frm .inputQuestion = question;
		if(StringUtil.isNotBlank(question.condRequiredAnswer)  ){
			frm .condRequiredQuestionAnswerList = (ArrayList<Answer>) answerService.findAllByEnqueteIdAndQuestionId(frm.eid,frm.inputQuestion.condRequiredQuestionNo);
		}



		switch (frm.inputQuestion.controlId) {
		/**全復元**/
		/**********************************ラジオボタン***************************************/
		case 0:
			//表示列項目数
			frm.inputQuestion.colNum = frm.radioColumnCount;

			int freeIndex=0;
			for (int i = 0; i < frm.inputQuestion.answerList.size(); i++) {
				//自由入力欄
				Answer answer =frm.inputQuestion.answerList.get(i);
				if(answer.freeTextFlg != null && answer.freeTextFlg > 0 && StringUtil.isBlank(frm.radioFreeAnserUse)){
					frm.radioFreeAnserUse = "1";
					frm.radioFreeTextColWidth = answer.freeTextColWidth+"";
					frm.radioFreeTextLimit = answer.freeTextLimit+"";
					frm.radioFreeNo = (i+1)+"";

					if(answer.freeTextFlg >= 2){
						frm.radioFreeAnserRequired = "1";
					}
					freeIndex++;
				}

				frm.radioAdminText.add(answer.answer);
				frm.radioAsnwerIdList.add(answer.answerId.toString());
				if(answer.defaultFlg == 1){
					frm.radioDefault = (i+1-freeIndex)+"";
				}
			}

			frm.inputQuestion.maxSelectNum = 1;

			break;
			/************************************チェックボックス**************************************/
		case 1:
			//表示列項目数
			frm.checkColumnCount = frm.inputQuestion.colNum;
			//最小選択数
			frm.checkMinSelectNum = frm.inputQuestion.minSelectNum+"";
			//最代選択数
			frm.checkMaxSelectNum = frm.inputQuestion.maxSelectNum+"";


			for (int i = 0; i < frm.inputQuestion.answerList.size(); i++) {
				Answer checkAnswer = frm.inputQuestion.answerList.get(i);

				//自由入力欄使用の場合
				if(checkAnswer.freeTextFlg != null && checkAnswer.freeTextFlg > 0){
					frm.checkFreeAnserUse = "1";
					frm.checkFreeTextColWidth = checkAnswer.freeTextColWidth+"";
					frm.checkFreeTextLimit= checkAnswer.freeTextLimit+"";
					frm.checkFreeNo = (i+1)+"";
					if(checkAnswer.freeTextFlg >= 2){
						frm.checkFreeAnserRequired = "1";
					}

				}

				frm.checkAdminText.add(checkAnswer.answer);
				frm.checkAsnwerIdList.add(checkAnswer.answerId.toString());
				frm.checkDefault.add(checkAnswer.defaultFlg+"");
			}
			break;
			/****************************************セレクトメニュー****************************************/
		case 2:
			//選択候補
			//空白追加
			frm.selectCand="";
			if(StringUtil.equals(frm.selectKuhakuUse, "1")){
				Answer answer = new Answer();

				answer.answer = selectKuhaku;
				frm.inputQuestion.answerList.add(answer);
			}

			frm.selectKuhakuUse = frm.inputQuestion.blankAdd==null||StringUtil.isBlank(frm.inputQuestion.blankAdd+"")?"0":frm.inputQuestion.blankAdd.toString();

			//選択候補
			for (int i = 0 ; i < frm.inputQuestion.answerList.size(); i++) {
				Answer selectAnswer = frm.inputQuestion.answerList.get(i);

				if(frm.inputQuestion.blankAdd !=null && frm.inputQuestion.blankAdd.equals(1)  && StringUtil.isBlank(selectAnswer.answer)){
					continue;
				}

				frm.selectCand += selectAnswer.answer+"\r\n";
				frm.selectAsnwerIdList.add(selectAnswer.answerId.toString());
				if(selectAnswer.defaultFlg==1 && StringUtil.isBlank(frm.selectDefault)){
					frm.selectDefault = selectAnswer.answer ;
				}

			}
			break;
			/****************************************テキストエリア****************************************/
		case 3:
				frm.areaCols    = frm.inputQuestion.dispWitdth+"";
				frm.areaRows    = frm.inputQuestion.rowCount+"";
				frm.areaMaxCount= frm.inputQuestion.maxInputText+"";
			break;
			/****************************************テキストボックス****************************************/
		case 4:

			frm.textSize      = frm.inputQuestion.dispWitdth+"";
			frm.textMinLength = frm.inputQuestion.minInputText+"";
			frm.textMaxLength = frm.inputQuestion.maxInputText+"";
			frm.textSeigen    = frm.inputQuestion.inputTextLimit+"";
			frm.isSendMailAddress = frm.inputQuestion.mailType + "";
			break;
			/****************************************日付****************************************/
		case 5:
			frm.dateFrom=frm.inputQuestion.startymd;
			frm.dateTo=frm.inputQuestion.endymd;
			/****************************************1%支援制度ポイント寄付****************************************/
		case 6:

		}


		//設問編集画面
		return "/admin/enquete/questionEdit.html";
	}


	/**
	 * 設問編集確認
	 * @return
	 */
	@Execute(validator = true ,validate="questionEditValidate",input="/admin/enquete/questionEdit.html")
	public String questionEditConfirm() {
		TokenProcessor.getInstance().saveToken(request);

		enqueteRegistForm.questionList = questionService.findAllOrderByEnqueteId(enqueteRegistForm.eid);
		if(enqueteRegistForm.questionList.size() >= 30 &&(StringUtil.isBlank(enqueteRegistForm.qid) || StringUtil.equals("0", enqueteRegistForm.qid))){//設問が30件以上の場合は追加登録できない。
			addErrorMessage("QuestionCountError", "question.maxCoutError");
			return "/admin/enquete/questionEdit.html";
		}

		if(isAlreadyExistMailQuestion()){
			addErrorMessage("isSendMailAddress", "question.alreadyExistMailQuestion");
			return "/admin/enquete/questionEdit.html";
		}

		enqueteRegistForm.enquete = enqueteService.findById(Integer.parseInt(enqueteRegistForm.eid));

		String condAnswerStr="";

		if(enqueteRegistForm.condRequiredAnswerIdList == null){
			enqueteRegistForm.condRequiredAnswerIdList = new ArrayList<String>();
		}
		for (int i = 0;  i < enqueteRegistForm.condRequiredAnswerIdList.size(); i++) {
			condAnswerStr += enqueteRegistForm.condRequiredAnswerIdList.get(i)+",";
		}
		if(StringUtil.isNotBlank(condAnswerStr)){
			enqueteRegistForm.inputQuestion.condRequiredAnswer = condAnswerStr.substring(0, condAnswerStr.lastIndexOf(","));
		}

		//formのバックアップを取る。
		//enqueteRegistForm.questionList = questionService.findAllOrderByEnqueteId(enqueteRegistForm.eid);
		enqueteRegistForm.condRequiredQuestionAnswerList = (ArrayList<Answer>)answerService.findAllByEnqueteIdAndQuestionId(enqueteRegistForm.eid,enqueteRegistForm.inputQuestion.condRequiredQuestionNo);
		enqueteRegistForm.organizationListFor1Percent = organizationService.findAllOrderByNo();
		EnqueteRegistForm formBAK = org.seasar.framework.beans.util.Beans.createAndCopy(EnqueteRegistForm.class, enqueteRegistForm).execute();
		session.setAttribute("formBAK", formBAK);

		//デフォルトを設定していない場合。
		if (StringUtil.isBlank(formBAK.selectDefault)) {

			String[] conds = formBAK.selectCand.split("\r\n");
			if(StringUtil.equals(formBAK.selectKuhakuUse,"1")){
				formBAK.selectDefault ="    ";
			}else{
				for (int i = 0; i < conds.length; i++) {
					if (StringUtil.isBlank(conds[i])) {
						continue;
					}
					formBAK.selectDefault = conds[i];
					break;
				}
			}
		}


		//設問編集確認
		return "/admin/enquete/questionEditConfirm.html";
	}

	private boolean isAlreadyExistMailQuestion() {
		boolean result = false;
		if (enqueteRegistForm.inputQuestion.controlId == 4 && enqueteRegistForm.isSendMailAddress != null && enqueteRegistForm.isSendMailAddress.equals("1")) {
			Question mailQuestion = questionService.getMailTypeQuestion(Integer.parseInt(enqueteRegistForm.eid));
			if (mailQuestion != null && !enqueteRegistForm.qid.equals("" + mailQuestion.questionId)) {
				result = true;
			}
		}
		return result;
	}

	/**
	 * 設問編集登録を行う
	 */
	private void setQuestionEditRegistData(){
		EnqueteRegistForm frm = enqueteRegistForm;

		Integer eidInt = Integer.parseInt(frm.eid);
		//削除フラグ
		frm.inputQuestion.enqueteId = eidInt;
		frm.inputQuestion.delFlg = 0;
		frm.inputQuestion.answerList = new ArrayList<Answer>();
		frm.inputQuestion.mailType = 0;

		switch (frm.inputQuestion.controlId) {
		/**********************************ラジオボタン***************************************/
		case 0:
			//表示列項目数
			frm.inputQuestion.colNum = frm.radioColumnCount;
			//最小選択数
			frm.inputQuestion.minSelectNum = 1;
			//最大選択数
			frm.inputQuestion.maxSelectNum = 1;

			for (int i = 0; i < frm.radioAdminText.size(); i++) {//コントロル数分追加する。
				Answer answerRadio = new Answer();
				answerRadio.answer = frm.radioAdminText.get(i);
				answerRadio.defaultFlg = StringUtil.equals(frm.radioDefault, (i+1)+"") ? 1 : 0;//ラジオのデフォルト番号に該当するものをDefalutFlagを1に設定
				frm.inputQuestion.answerList.add(answerRadio);
			}

			//Answer freeAnswerRadio = new Answer();
			//自由入力欄使用の場合 自由入力欄を追加
			if(StringUtil.equals(frm.radioFreeAnserUse, "1")){
				//チェックボックスが2個でfrm.radioFreeNoが3より上だったら最後につける
				Integer insertIndex = Integer.parseInt(frm.radioFreeNo) ;
				insertIndex = Math.min(frm.inputQuestion.answerList.size(), insertIndex)-1;
				Answer freeAnswerRadio = frm.inputQuestion.answerList.get(insertIndex);

				//freeAnswerRadio.answer = "その他(全角"+frm.radioFreeTextLimit+"文字以内)";
				freeAnswerRadio.freeTextFlg = 1 + (StringUtil.equals(frm.radioFreeAnserRequired, "1") ? 1 : 0);//必須の場合2に変更
				freeAnswerRadio.freeTextColWidth = Short.parseShort(frm.radioFreeTextColWidth);
				freeAnswerRadio.freeTextRowNum = 1;
				freeAnswerRadio.freeTextLimit = Integer.parseInt(frm.radioFreeTextLimit);

//				//チェックボックスが2個でfrm.radioFreeNoが3より上だったら最後につける
//				Integer insertIndex = Integer.parseInt(frm.radioFreeNo) - 1;
//				insertIndex = Math.min(frm.inputQuestion.answerList.size(), insertIndex);
//				frm.inputQuestion.answerList.add(insertIndex, freeAnswerRadio);
			}


			break;
			/************************************チェックボックス**************************************/
		case 1:
			//表示列項目数
			frm.inputQuestion.colNum = frm.checkColumnCount;
			//最小選択数
			frm.inputQuestion.minSelectNum = Integer.parseInt(frm.checkMinSelectNum);
			//最大選択数
			frm.inputQuestion.maxSelectNum = Integer.parseInt(frm.checkMaxSelectNum);

			for (int i = 0; i < frm.checkAdminText.size(); i++) {
				Answer answerCheck = new Answer();
				answerCheck.answer = frm.checkAdminText.get(i);
				answerCheck.defaultFlg = StringUtil.equals(frm.checkDefault.get(i),"1") ? 1 : 0;
				frm.inputQuestion.answerList.add(answerCheck);
			}

			//自由入力欄使用の場合
			if(StringUtil.equals(frm.checkFreeAnserUse, "1")){
				//Answer freeRadioAnswer = new Answer();
				Integer insertIndex = Integer.parseInt(frm.checkFreeNo);
				insertIndex = Math.min(frm.inputQuestion.answerList.size(), insertIndex) -1;
				Answer freeRadioAnswer = frm.inputQuestion.answerList.get(insertIndex);

				//freeRadioAnswer.answer = "その他(全角"+frm.checkFreeTextLimit+"文字以内)";
				freeRadioAnswer.freeTextFlg = 1 + (StringUtil.equals(frm.checkFreeAnserRequired, "1") ? 1 : 0);//必須の場合2に変更
				freeRadioAnswer.freeTextColWidth = Short.parseShort(frm.checkFreeTextColWidth);
				freeRadioAnswer.freeTextRowNum = 1;
				freeRadioAnswer.freeTextLimit = Integer.parseInt(frm.checkFreeTextLimit);

//				Integer insertIndex = Integer.parseInt(frm.checkFreeNo) - 1;
//				insertIndex = Math.min(frm.inputQuestion.answerList.size(), insertIndex);
//				frm.inputQuestion.answerList.add(insertIndex, freeRadioAnswer);
			}


			break;
			/****************************************セレクトメニュー****************************************/
		case 2:

			//空白追加
			if(StringUtil.equals(frm.selectKuhakuUse, "1")){
				Answer answer = new Answer();

				answer.answer = selectKuhaku;
				frm.inputQuestion.blankAdd =1;
				frm.inputQuestion.answerList.add(answer);
			}
			boolean isDefault=false;
			//選択候補
			String [] conds = frm.selectCand.split("\r\n");
			for (int i = 0 ; i < conds.length; i++) {
				Answer answer = new Answer();
				if(StringUtil.isBlank(conds[i])){
					continue;
				}
				answer.answer = conds[i];
				answer.defaultFlg = (StringUtil.equals(answer.answer, frm.selectDefault) ? 1 :0);

				if(answer.defaultFlg == 1){
					isDefault = true;
				}
				frm.inputQuestion.answerList.add(answer);
			}

			//デフォルトの設定がない場合。一番上をデフォルトにする。
			if(!isDefault){
				frm.inputQuestion.answerList.get(0).defaultFlg=1;
			}


			break;
			/****************************************テキストエリア****************************************/
		case 3:
			frm.inputQuestion.dispWitdth   = Integer.parseInt(frm.areaCols);
			frm.inputQuestion.rowCount     = Integer.parseInt(frm.areaRows);
			frm.inputQuestion.maxInputText = Integer.parseInt(frm.areaMaxCount);

			Answer answerTextArea = new Answer();
			answerTextArea.answer = "textArea";
			answerTextArea.defaultFlg = 0;
			frm.inputQuestion.answerList.add(answerTextArea);

			break;
			/****************************************テキストボックス****************************************/
		case 4:
			//表示幅(文字数)
			frm.inputQuestion.dispWitdth = Integer.parseInt(frm.textSize);
            //最小入力文字数
			frm.inputQuestion.minInputText = Integer.parseInt(frm.textMinLength);
			//最大入力文字数
			frm.inputQuestion.maxInputText = Integer.parseInt(frm.textMaxLength);
			//入力文字制限
			frm.inputQuestion.inputTextLimit = Integer.parseInt(frm.textSeigen);
			// メール送信する
			if (frm.enquete.enqueteType == SinaburoConstant.EnqueteType.WEB_ENQUETE && frm.textSeigen.equals("7")) {
				frm.inputQuestion.mailType = StringUtil.equals(frm.isSendMailAddress, "1") ? 1 : 0;
			}
			Answer answerText = new Answer();
			answerText.answer = "text";
			answerText.defaultFlg = 0;
			frm.inputQuestion.answerList.add(answerText);
			break;
			/****************************************日付****************************************/
		case 5:
			frm.inputQuestion.startymd = frm.dateFrom;
			frm.inputQuestion.endymd = frm.dateTo;
			Answer answerDate = new Answer();
			answerDate.answer = "date";
			answerDate.defaultFlg = 0;
			frm.inputQuestion.answerList.add(answerDate);
			break;
			/****************************************1%支援制度ポイント寄付****************************************/
		case 6:
			Answer answerOrganization = new Answer();
			answerOrganization.answer = "org";
			answerOrganization.defaultFlg = 0;
			frm.inputQuestion.answerList.add(answerOrganization);
		}

		AdminUser adminUser = getAdmin();
		//更新
		if(StringUtil.isNotBlank(frm.qid) && !StringUtil.equals("0", frm.qid)){
			//更新前の設問情報を取得する。
			Question oldQuestion = questionService.findByQuestionIdOrderByEnqueteId(Integer.parseInt(frm.qid));
			frm.inputQuestion.version=oldQuestion.version;
			//コントロルが変わってない場合
			if(oldQuestion.controlId.equals(frm.inputQuestion.controlId)){
				//NEW設問のIDに元のIDを設定→更新
				frm.inputQuestion.questionId = oldQuestion.questionId;
				frm.inputQuestion.questionNo = oldQuestion.questionNo;
				//questionService.update(frm.inputQuestion,adminUser.loginId);
				//削除された回答があればその回答を条件付き必須にしている設問情報から削除された回答IDを削除
				ArrayList<String> oldAnswerIdList = new ArrayList<String>();
				for (Answer oldAnswer: oldQuestion.answerList) {
					oldAnswerIdList.add(oldAnswer.answerId.toString());
				}
				ArrayList<String> condAnswerStr=new ArrayList<String>();
				//削除対象が持っていた回答リストから削除された回答を取得
				switch (frm.inputQuestion.controlId) {
				case SinaburoConstant.ControlType.RADIO:
					this.removeAll(frm.radioAsnwerIdList,"",condAnswerStr);
					frm.radioAsnwerIdList.remove("");
					//回答IDの復元
					recoveryAnswerId(frm,frm.radioAsnwerIdList);
					break;
				case SinaburoConstant.ControlType.CHECKBOX:
					oldAnswerIdList.removeAll(frm.checkAsnwerIdList);
					this.removeAll(frm.checkAsnwerIdList,"",condAnswerStr);
					//回答IDの復元
					recoveryAnswerId(frm,frm.checkAsnwerIdList);
					break;
				case SinaburoConstant.ControlType.SELECTMENU:
					oldAnswerIdList.removeAll(frm.selectAsnwerIdList);
					this.removeAll(frm.selectAsnwerIdList,"",condAnswerStr);
					//回答IDの復元
					recoveryAnswerId(frm,frm.selectAsnwerIdList);
					break;
				}

				questionService.questionUpdate(oldQuestion, condAnswerStr, frm,adminUser);

			//コントロルが変わった場合
			}else{
				enqueteRegistForm.delQuestionIdList=frm.qid;
				Question question = questionService.findById(Integer.parseInt(frm.qid));
				frm.inputQuestion.questionNo = question.questionNo;
				delQuestion(true);
				questionService.questionRegist(frm,adminUser.loginId, false);
			}
		}else{
			//設問登録
			questionService.questionRegist(frm,adminUser.loginId, false);
		}
	}


	/**リストの中のブランクを全部削除*/
	private void removeAll(ArrayList<String> arr,String del,ArrayList<String> condAnswerStr){
		while(arr.remove(del)){}

		for (String string : arr) {
			condAnswerStr.add(string);
		}

//		if(StringUtil.isNotBlank(returnCond)){
//			returnCond = returnCond.substring(0, returnCond.lastIndexOf(","));
//		}else{
//			returnCond ="0";
//		}
//		return returnCond ;
	}

	/**
	 * 回答マスタのIDを復元する。
	 * @param frm
	 * @param answerIdList
	 */
	private void recoveryAnswerId(EnqueteRegistForm frm,ArrayList<String > answerIdList){

		for(int i=0;i<frm.inputQuestion.answerList.size();i++) {
			Answer answer = frm.inputQuestion.answerList.get(i);
			if(answerIdList.size()-1 >= i){
				answer.answerId = Integer.parseInt(answerIdList.get(i));
			}else{
				break;
			}
		}

	}

	/**
	 * 設問編集登録
	 * @return
	 */
	@Execute(validator = false)
	public String questionEditRegist() {
		if (!TokenProcessor.getInstance().isTokenValid(request, true)) {
			addError(SinaburoViewUtil.getMessage("errors.S999"));
			return "/error/admin/doubleAction.html";
		}
		enqueteRegistForm =  (EnqueteRegistForm)session.getAttribute("formBAK");

		if(isAlreadyExistMailQuestion()){
			addErrorMessage("isSendMailAddress", "question.alreadyExistMailQuestion");
			return "/admin/enquete/questionEditConfirm.html";
		}

		setQuestionEditRegistData();
		//設問編集登録
		return "/admin/enquete/questionEditEnd.html";
	}


	@Execute(validator = false)
	public String enqueteMailSetting() {
		//メール設定
		return "/admin/enquete/enqueteMailSetting.html";
	}


	/**
	 *
	 * @return エラーメッセージを返還する。
	 */
	public ActionMessages enqueteRegistConfirmValidate(){
		//■必須チェック
		if(StringUtil.isBlank(enqueteRegistForm.enquete.enqueteName)){
			addErrorMessage("enqueteRegistForm.enquete.enqueteName",  "errors.required","アンケート名");
		}

		if(!StringUtil.isNumber(enqueteRegistForm.enquete.pointNum+"")){
			addErrorMessage("enqueteRegistForm.enquete.pointNum",  "errors.required","ポイント");
		}

		if(enqueteRegistForm.enquete.dispFlg == 1
				&& (StringUtil.isBlank(enqueteRegistForm.enquete.startDate) || StringUtil.isBlank(enqueteRegistForm.enquete.endDate))){
			addErrorMessage("enqueteRegistForm.enquete.dispFlg",  "labels.dispFlg");
		}

		if (enqueteRegistForm.enquete.enqueteType != EnqueteType.WEB_ENQUETE) {
			enqueteRegistForm.enquete.privateFlg = false;
		}

		return (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
	}

	@Execute(validator = false)
	public String backFromQuestionEditConfirm(){
		//formのバックアップを復元する。
		if(session.getAttribute("formBAK") != null ){
			Beans.copy((EnqueteRegistForm)session.getAttribute("formBAK"), enqueteRegistForm ).execute();
		}

		////enqueteRegistForm.condRequiredQuestionAnswerList = answerService.findAllByEnqueteIdAndQuestionId(enqueteRegistForm.eid,enqueteRegistForm.inputQuestion.condRequiredQuestionNo);
		enqueteRegistForm.questionList = questionService.findAllOrderByEnqueteId(enqueteRegistForm.eid);
		//session.removeAttribute("formBAK");
		return "/admin/enquete/questionEdit.html";
	}

}