package jp.co.y_net.amm.page;

import java.util.List;

import jp.co.y_net.amm.AppSession;
import jp.co.y_net.amm.AppSession.LoginUser;
import jp.co.y_net.amm.common.AppStringUtils;
import jp.co.y_net.amm.common.AppUtils;
import jp.co.y_net.amm.common.CalcHash;
import jp.co.y_net.amm.common.ChoiceDateElement;
import jp.co.y_net.amm.common.ChoiceDateElement.DropDownChoiceDate;
import jp.co.y_net.amm.common.ChoiceElement;
import jp.co.y_net.amm.dao.Org;
import jp.co.y_net.amm.dao.Usr;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

/**
 * 機関情報詳細
 * @author k_inaba
 */
public class OrgDetailPage extends CommonFrameA {
    private static final long serialVersionUID = 1L;
	
    /*
     * 画面入力値
     */
    public String kindValue;
    public String nameValue;
    public String adminnameValue;
    public String adminnamekanaValue;
    public String postnumValue;
    public String addressValue;
    public String telnumValue;
    public String mailValue;
    public String mail2Value; 
    public String passwordValue;
    public String password2Value;
    public String fromdateValue;
    public String todateValue;
    public String limitnumValue;
    
    /*
     * 画面の状態
     */
    private boolean completeMod = false;
    private boolean completeDel = false;
	
    /**
     * ログインチェック定義
     * @see jp.co.y_net.amm.page.AppPage#validateLogin()
     */
    @Override
    public boolean validateLogin() {
        if(AppSession.get().isLogin()) {
            if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者)) {
                return true;
            }
            if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関管理者)) {
                return true;
            }
        }
        return false;
    }
	
    public OrgDetailPage(PageParameters pageParams) {
        
        /* 共通戻るリンクの設置 */
        createCommonBackLinks();
        
        /* 画面固有の戻るボタンの設置 */
        createBackLink(OrgMemberListPage.class, "登録会員情報管理");
        
        /* フィードバックパネルの設置 */
        createFeedbackPanel();
        
        /* 入力フォーム */
        final Form<Void> form  = new Form<Void>("form");
        add(form);
        
        /* 初期表示エラーチェック ----------------------------------------------------------------------------------- */
        form.setVisible(false); // Formはエラーチェックが完了するまで非表示とする。
        
        final LoginUser loginUser  = AppSession.get().getLoginUser();
        if(loginUser == null) {
            error("ログイン情報が取得できません。");
            return; // ----------中断
        }
        final Integer loginUserId = loginUser.getUsrid();
        
        String paramOrgid = pageParams.get("orgid").toString("");
        Integer targetOrgid;
        if(StringUtils.isEmpty(paramOrgid)) {
            /*
             * パラメータ orgid が指定されていなければ、ログインユーザに紐づく機関情報を対象とする。
             * 　ただし、機関管理者か、運営管理者に限る。
             */
            if (isOrgAdmin() || isSystemAdmin()) {
                targetOrgid = loginUser.getOrgid();
                
            } else {
                error("パラメータ orgid がありません。");
                return; // ----------中断
                
            }
        } else {
            targetOrgid = AppUtils.toInteger(paramOrgid);
        }
        final Org targetOrg = orgDao.getByOrgid(targetOrgid);
        if (targetOrg == null) {
            error("該当する登録会員情報がありません。");
            return; // ----------中断
        }
        if(isSystemAdmin()) {
            /* 機関管理者が他機関の情報にアクセスしてはいけない */
            if(AppUtils.equals(loginUser.getOrgid(), targetOrg.getOrgid()) == false && isSystemAdmin() == false) {
                error("該当する情報を扱う権限がありません。");
                return; // ----------中断
            }
        }
        
        final Usr target代表者; 
        {
            Usr cnd = new Usr();
            cnd.setOrgid(targetOrgid);
            cnd.setOrgrole(1); // 代表者
            List<Usr> users = usrDao.get(cnd);
            if(users.size() != 1) {
                error("代表者のデータが取得できません。");
                return; // ----------中断
            } else {
                target代表者 = users.get(0);
            }
        }
        
        
        if(hasInputError()) return; // ----------エラーがあれば中止
        form.setVisible(true);

        /* Form内の設定 ----------------------------------------------------------------------------------------------*/
        
        /* 完了メッセージ */
        Model<String> resultMessageModel = new Model<String>() {
            @Override
            public String getObject() {
                if(completeMod) {
                    return "登録会員情報を変更しました。";
                }
                if(completeDel) {
                    return "登録会員情報を削除しました。";
                }
                return "";
            }
        };
        final Label resutlMessage = new Label("resutlMessage", resultMessageModel);
        form.add(resutlMessage);
        
        /* 組織IDの出力 */
        form.add(new Label("orgid", Model.of(targetOrg.getOrgid())));
        
        
        /* 入力コンポーネントの設定 ----------------------------------------------------------------------------------*/
        
//        kindValue = AppUtils.toStr(targetOrg.getKind());
        nameValue = targetOrg.getName();
//        adminnameValue = targetOrg.getAdminname();
        adminnameValue = target代表者.getName();
        adminnamekanaValue = targetOrg.getAdminnamekana();
        postnumValue = targetOrg.getPostnum_Disp(); // ハイフン付きへ変換
        addressValue = targetOrg.getAddress();
        telnumValue = targetOrg.getTelnum();
//        mailValue = targetOrg.getMail();
        mailValue = target代表者.getLoginid();
        mail2Value = "";
        fromdateValue = AppUtils.toStr(targetOrg.getFromdate());
        todateValue = AppUtils.toStr(targetOrg.getTodate());
        limitnumValue = AppUtils.toStr(targetOrg.getLimitnum());
        if(StringUtils.isEmpty(limitnumValue)) {
            limitnumValue = "-1";
        }
        
        /* 会員の種類 */
        form.add(new Label("kind", Model.of(targetOrg.getKind_Disp())));
        
        /* 団体名称 */
        TextField<String> name = new TextField<String>("name", new PropertyModel<String>(this, "nameValue")){
            @Override
            public boolean isVisible() {
                if(targetOrg.isPersonalOrg()) { // 個人の場合は非表示
                    return false;
                }
                return true;
            }
        };
        form.add(name);
        
        /* 管理者氏名 */
        final Label thAdminname = new Label("thAdminname", new Model<String>(){
            @Override
            public String getObject() {
                if(targetOrg.isPersonalOrg() == false) {
                    return "代表者氏名";
                }
                return "氏名";
            }
        }){
        };
        form.add(thAdminname);
        TextField<String> adminname = new TextField<String>("adminname", new PropertyModel<String>(this, "adminnameValue"));
        form.add(adminname);
        
        /* ふりがな */
        TextField<String> adminnamekana = new TextField<String>("adminnamekana", new PropertyModel<String>(this, "adminnamekanaValue"));
        form.add(adminnamekana);
        
        /* 連絡先郵便番号 */
        TextField<String> postnum = new TextField<String>("postnum", new PropertyModel<String>(this, "postnumValue"));
        form.add(postnum);
        
        /* 連絡先住所 */
        TextField<String> address = new TextField<String>("address", new PropertyModel<String>(this, "addressValue"));
        form.add(address);
        
        /* 連絡先電話番号 */
        TextField<String> telnum = new TextField<String>("telnum", new PropertyModel<String>(this, "telnumValue"));
        form.add(telnum);
        
        /* 連絡先メールアドレス */
        TextField<String> mail = new TextField<String>("mail", new PropertyModel<String>(this, "mailValue"));
        form.add(mail);
        
        /* 連絡先メールアドレス確認用 */
        TextField<String> mail2 = new TextField<String>("mail2", new PropertyModel<String>(this, "mail2Value"));
        form.add(mail2);
        
        /* パスワード */
        final PasswordTextField password = new PasswordTextField("password", new PropertyModel<String>(this, "passwordValue")){
            @Override
            public boolean isVisible() {
                /* ログインユーザ自身の情報でなければ画面から変更できない */
                return isLoginUser(target代表者);
            }
        };
        password.setRequired(false);
        form.add(password);
        
        /* パスワード確認用 */
        PasswordTextField password2 = new PasswordTextField("password2", new PropertyModel<String>(this, "password2Value")){
            @Override
            public boolean isVisible() {
                /* ログインユーザ自身の情報でなければ画面から変更できない */
                return isLoginUser(target代表者);
            }
        };
        password2.setRequired(false);
        form.add(password2);
        
        /* 利用可能期間 ---------------------------------------------------------------------------------------  */
        
        List<ChoiceDateElement> choiceY = ChoiceDateElement.createChoiceY(fromdateValue, todateValue);
        List<ChoiceDateElement> choiceM = ChoiceDateElement.createChoiceM();
        List<ChoiceDateElement> choiceD = ChoiceDateElement.createChoiceD();
        
        final Model<ChoiceDateElement> fromdateYModel = ChoiceDateElement.createModelY(choiceY, fromdateValue);
        final Model<ChoiceDateElement> fromdateMModel = ChoiceDateElement.createModelM(choiceM, fromdateValue);
        final Model<ChoiceDateElement> fromdateDModel = ChoiceDateElement.createModelD(choiceD, fromdateValue);
        
        final Model<ChoiceDateElement> todateYModel = ChoiceDateElement.createModelY(choiceY, todateValue);
        final Model<ChoiceDateElement> todateMModel = ChoiceDateElement.createModelM(choiceM, todateValue);
        final Model<ChoiceDateElement> todateDModel = ChoiceDateElement.createModelD(choiceD, todateValue);
        
        final DropDownChoiceDate fromdateY = new DropDownChoiceDate("fromdateY", fromdateYModel, choiceY);
        form.add(fromdateY);
        final DropDownChoiceDate fromdateM = new DropDownChoiceDate("fromdateM", fromdateMModel, choiceM);
        form.add(fromdateM);
        final DropDownChoiceDate fromdateD = new DropDownChoiceDate("fromdateD", fromdateDModel, choiceD);
        form.add(fromdateD);
        
        final DropDownChoiceDate todateY = new DropDownChoiceDate("todateY", todateYModel, choiceY);
        form.add(todateY);
        final DropDownChoiceDate todateM = new DropDownChoiceDate("todateM", todateMModel, choiceM);
        form.add(todateM);
        final DropDownChoiceDate todateD = new DropDownChoiceDate("todateD", todateDModel, choiceD);
        form.add(todateD);
        
        if(isSystemAdmin() == false) { // 運営管理者にのみ表示する編集項目
            fromdateY.setVisible(false); 
            fromdateM.setVisible(false);
            fromdateD.setVisible(false);
            todateY.setVisible(false);
            todateM.setVisible(false);
            todateD.setVisible(false);
        }
        /* 即時日付チェック */
        final Label quickMsgFromto = new Label("quickMsgFromto", new Model<String>(){
            @Override
            public String getObject() {
//                fromdateY.getModelObject().getId()
                String tmpFromdate = ChoiceDateElement.日付取得(fromdateYModel, fromdateMModel, fromdateDModel);
                String tmpTodate = ChoiceDateElement.日付取得(todateYModel, todateMModel, todateDModel);
                
                if(validFromToDate(tmpFromdate) == false || validFromToDate(tmpTodate) == false) {
                    return "日付が正しくありません。";
                } else {
                    return "";
                }
            }
        });
        quickMsgFromto.setOutputMarkupId(true);
        form.add(quickMsgFromto);
        
        /* ドロップダウン変更時の挙動を設定 */
        fromdateY.add(new DateDropDownOnchangeBehavior(quickMsgFromto));
        fromdateM.add(new DateDropDownOnchangeBehavior(quickMsgFromto));
        fromdateD.add(new DateDropDownOnchangeBehavior(quickMsgFromto));
        todateY.add(new DateDropDownOnchangeBehavior(quickMsgFromto));
        todateM.add(new DateDropDownOnchangeBehavior(quickMsgFromto));
        todateD.add(new DateDropDownOnchangeBehavior(quickMsgFromto));     
        
        /* 利用可能期間 ここまで ----------------------------------------------------------------------------------  */
        
        /* 登録可能会員数 */
        List<ChoiceElement> choiceLimitnum = Org.createLimitChices(limitnumValue);
        final Model<ChoiceElement> limitnumModel = new Model<ChoiceElement>();
        ChoiceElement.setDropDownList(limitnumModel, choiceLimitnum, String.valueOf(limitnumValue)); // 初期値設定

        final DropDownChoice<ChoiceElement> limitnum = new DropDownChoice<ChoiceElement>(
                "limitnum", limitnumModel, choiceLimitnum, new ChoiceElement.Renderer());
        form.add(limitnum);
        
        if(isSystemAdmin() == false) { // 運営管理者にのみ表示する編集項目
            limitnum.setVisible(false);
        }
        
        
        /* 組織「運営管理」を編集する場合の表示制御 ------------------------------------------------------------------*/
        if(targetOrg.getKind().equals(Org.KIND_運営管理)) {
            /* 次の項目を非表示 */
            adminnamekana.setVisible(false); // ふりがな
            postnum.setVisible(false); // 連絡先郵便番号
            address.setVisible(false); // 連絡先住所
            telnum.setVisible(false); // 連絡先電話番号 
            limitnum.setVisible(false); // 登録可能会員数
            /* 利用可能期間 */
            fromdateY.setVisible(false); 
            fromdateM.setVisible(false);
            fromdateD.setVisible(false);
            todateY.setVisible(false);
            todateM.setVisible(false);
            todateD.setVisible(false);
        }
        
        /* 表示コンポーネントの設定 ----------------------------------------------------------------------------------*/
        
        form.add(new Label("thLoginid", new Model<String>(){
            @Override
            public String getObject() {
                if(targetOrg.getKind().equals(Org.KIND_運営管理) == false) {
                    return "連絡先メールアドレス";
                } else {
                    return "ログインID";
                }
            }
        }));
        form.add(new Label("thLoginid2", new Model<String>(){
            @Override
            public String getObject() {
                if(targetOrg.getKind().equals(Org.KIND_運営管理) == false) {
                    return "連絡先メールアドレス確認用";
                } else {
                    return "ログインID確認用";
                }
            }
        }));
        
        /* 代表者によるメールアドレス変更のメッセージ */
        form.add(new Label("msgpwreset", "※ メールアドレスを変更するとパスワードがリセットされます。") {
            @Override
            public boolean isVisible() {
                /* パスワード欄から変更できない場合はパスワードリセット */
                return password.isVisible() == false;
            }
        });
        
        
        /* パスワード情報 */
        PasswordInfoPanel passwordInfoPanel = new PasswordInfoPanel("PasswordInfoPanel", 
                target代表者,
                isSystemAdmin());
        form.add(passwordInfoPanel);
        
        
        /* 処理ボタン定義 --------------------------------------------------------------------------------------------*/

        /*
         * 【更新する】
         */
        Button btnSubmitMod = new ConfirmAjaxButton("btnSubmitMod") {
            @Override
            String getConfirmMessage() {
                return "更新します。";
            }
            @Override
            boolean executeBefore() {
                /* モデル(PropertyModel以外)から値取得 */
                fromdateValue = ChoiceDateElement.日付取得(fromdateYModel, fromdateMModel, fromdateDModel);
                todateValue = ChoiceDateElement.日付取得(todateYModel, todateMModel, todateDModel);
                if(limitnumModel.getObject() == null) {
                    limitnumValue = String.valueOf(Org.LIMITNUM_未指定);
                } else {
                    limitnumValue = limitnumModel.getObject().getId();
                }
                /* 入力値変換 */
//                kindValue = AppStringUtils.trim(kindModel);
                nameValue = AppStringUtils.trim(nameValue);
                adminnameValue = AppStringUtils.trim(adminnameValue);
                adminnamekanaValue = AppStringUtils.trim(adminnamekanaValue);
                postnumValue = AppStringUtils.trimHalf(postnumValue);
                postnumValue = postnumValue.replaceAll("-", "");// 郵便番号からハイフン除去
                addressValue = AppStringUtils.trim(addressValue);
                telnumValue = AppStringUtils.trimHalf(telnumValue);
                mailValue = AppStringUtils.trimHalf(mailValue);
                mail2Value = AppStringUtils.trimHalf(mail2Value);
                passwordValue = AppStringUtils.trimHalf(passwordValue);
                password2Value = AppStringUtils.trimHalf(password2Value);
                if(isSystemAdmin()) {
                    
                    fromdateValue = AppStringUtils.trimHalf(fromdateValue);
                    todateValue = AppStringUtils.trimHalf(todateValue);
                    
                    limitnumValue = AppStringUtils.trimHalf(limitnumValue);
                }
                
                boolean isメールアドレスが変更されている = (mailValue.equals(target代表者.getLoginid()) == false);
                boolean isパスワード欄が入力されている = (StringUtils.isEmpty(passwordValue) == false);
                
                /* 入力値検査 */
//                validItemNum(kindValue, "会員の種類", 1, 1);
                validItem(nameValue, "機関・団体名称", 0, 512);
                validItem(adminnameValue, thAdminname.getDefaultModelObjectAsString(), 1, 512); // 代表者氏名 or 氏名
                
                
                if(targetOrg.getKind().equals(Org.KIND_運営管理)) { 
                    /* 組織「運営管理」を編集する場合のチェック */
                    validItem(mailValue, "ログインID確認用", 1, 256);
                    
                } else {
                    /* 通常のチェック */
                    validItem(adminnamekanaValue, "ふりがな", 1, 512);
                    validItemNum(postnumValue, "連絡先郵便番号", 7, 7);
                    validItem(addressValue, "連絡先住所", 1, 1024);
                    validItemTel(telnumValue, "連絡先電話番号", 1, 32);
                    validItemMail(mailValue, "連絡先メールアドレス");
                    if(isSystemAdmin()) {
                        validItemNum(limitnumValue, "登録可能会員数", 0, 4);
                    }
                    if(hasInputError()) return false; // ここまででエラーチェック
                    
                    if(isSystemAdmin() && validFromToDate(fromdateValue) == false) {
                        error("利用可能期間(開始)が日付として正しくありません。");
                    }
                    if(isSystemAdmin() && validFromToDate(todateValue) == false) {
                        error("利用可能期間(終了)が日付として正しくありません。");
                    }
                }

                if(hasInputError()) return false; // ここまででエラーチェック

                if(isメールアドレスが変更されている) {

                    if(targetOrg.getKind().equals(Org.KIND_運営管理)) { 
                        /* 組織「運営管理」を編集する場合のチェック */
                        validItem(mail2Value, "ログインID確認用", 1, 256);
                        if(hasInputError()) return false; // ここまででエラーチェック
                        
                        if(mailValue.equals(mail2Value) == false) {
                            error("ログインIDが一致しません。");
                        }
                        if(mailAddressCheck.exist(mailValue)) {
                            error("このログインIDは既に使用されています。");
                        }
                        
                    } else {
                        /* 通常のチェック */
                        validItemMail(mail2Value, "メールアドレス確認用");
                        
                        if(hasInputError()) return false; // ここまででエラーチェック
                        
                        if(mailValue.equals(mail2Value) == false) {
                            error("メールアドレスが一致しません。");
                        }
                        if(mailAddressCheck.exist(mailValue)) {
                            error("このメールアドレスは既に使用されています。");
                        }
                    }

                }

                if (isパスワード欄が入力されている) {
                    validItemAscii(passwordValue, "パスワード", 8, 16);
                    validItemAscii(password2Value, "パスワード確認用", 8, 16);
                }
                
                if(hasInputError()) return false; // ここまででエラーチェック
                
                if(isパスワード欄が入力されている) {
                    if(passwordValue.equals(password2Value) == false) {
                        error("パスワードが一致しません。");
                    }
                }
                if(hasInputError()) return false; // ここまででエラーチェック
                
                /*
                 * パスワードの変更について
                 *  メールアドレスが変更されている場合は、パスワードの変更が必須である。
                 *  パスワード欄が入力できるのは変更対象の情報が、ログインユーザ本人であるときのみ。
                 *  パスワード欄が入力できない場合（代表者や運営管理者による変更）は、パスワードリセットを実施する。
                 */
//                boolean パスワードリセットが必要 = false;
                if(isメールアドレスが変更されている) {
                    
                    if(isLoginUser(target代表者) ) {
                        /* 変更対象の情報が、ログインユーザ本人 */
                        
                        if(isパスワード欄が入力されている) {
                            // 正しい
                        } else {
                            error("メールアドレスを変更する場合は、パスワードも設定してください。");
                        }
                        
                    } else if(isSystemAdmin() ) {
                        /* パスワード欄が入力できない場合（代表者や運営管理者による変更） */
//                        パスワードリセットが必要 = true;
                    } else {
                        /* 通常想定されない条件 */
                        error("メールアドレスを変更することはできません。");
                    }
                }

                
                if(hasInputError()) return false; // ここまででエラーチェック
                
                return true;
            }
            @Override
            void executeAfter(AjaxRequestTarget target) {
                
                /* データアクセス 代表者による登録会員情報の変更  */
                
//                targetOrg.setKind(Integer.parseInt(kindValue));
                targetOrg.setName(nameValue);
                targetOrg.setAdminname(adminnameValue);
                targetOrg.setAdminnamekana(adminnamekanaValue);
                targetOrg.setPostnum(postnumValue);
                targetOrg.setTelnum(telnumValue);
                targetOrg.setAddress(addressValue);
                targetOrg.setMail(mailValue);
                if(isSystemAdmin()) {
                    if(StringUtils.isEmpty(fromdateValue) == false) {
                        int i = AppUtils.toInteger(fromdateValue);
                        if(i == 0) {
                            i = -1; // 未指定は「-1」とする。
                        }
                        targetOrg.setFromdate(i);
                    }
                    if(StringUtils.isEmpty(todateValue) == false) {
                        int i = AppUtils.toInteger(todateValue);
                        if(i == 0) {
                            i = -1; // 未指定は「-1」とする。
                        }
                        targetOrg.setTodate(i);                        
                    }
                    if(StringUtils.isEmpty(limitnumValue) == false) {
                        targetOrg.setLimitnum(AppUtils.toInteger(limitnumValue));
                    }
                }
                
                orgDao.update(targetOrg, loginUserId); // 【更新処理】
                
                
                // 代表者の氏名、メールアドレス、パスワードの変更についてユーザー情報も変更する。
                
                boolean isメールアドレスが変更されている = (mailValue.equals(target代表者.getLoginid()) == false);
                boolean isパスワード欄が入力されている = (StringUtils.isEmpty(passwordValue) == false);
                
                if(isメールアドレスが変更されている){
                    target代表者.setLoginid(mailValue);
                }
                if(isパスワード欄が入力されている) {
                    String pwhash = CalcHash.passowrdHash(passwordValue, target代表者.getLoginid());
                    target代表者.setPwhash(pwhash);
                    target代表者.setModpwdate(AppUtils.createNowLong()); // パスワード変更日時
                }
                
                if(isメールアドレスが変更されている 
                        && isパスワード欄が入力されている == false) {
                    /* 運営管理者によるメールアドレスだけの変更 */
                    target代表者.setPwhash("");
                    target代表者.setModpwdate(AppUtils.createNowLong()); // パスワード変更日時
                }
                target代表者.setName(adminnameValue);
                
                usrDao.update(target代表者, loginUserId); // 更新処理
                
                /* 本人以外がメールアドレスを変更していたらパスワードリセット */
                boolean パスワードリセットが必要 = false;
                if(isメールアドレスが変更されている) {
                    if(isSystemAdmin() ) {
                        /* パスワード欄が入力できない場合（代表者や運営管理者による変更） */
                        パスワードリセットが必要 = true;
                    }
                }
                if(パスワードリセットが必要) {
                    doパスワードリセット(target代表者.getUsrid(), passwordTicketManager, mailValue);
                }
                
                /* TODO ログインユーザのメールアドレスかパスワードが変更されたら、自動ログアウトさせる */
                
                /*
                 * 状態遷移
                 */
                completeMod = true;
                
                /* 画面コンポーネントを更新する */
                target.add(form);
            }

            @Override
            public boolean isVisible() {
                /* 完了後の状態ならボタンを表示しない */
                return completeMod == false && completeDel == false;
            }
        };
        form.add(btnSubmitMod);
        
        
        /*
         * 【削除する】
         */
        Button btnSubmitDel = new ConfirmAjaxButton("btnSubmitDel") {
            @Override
            String getConfirmMessage() {
                return "削除します。";
            }
            @Override
            String getConfirmMessageStrong() {
                return "登録情報を削除すると、機関・団体の情報が削除され、所属する会員もすべて退会します。";
            }
            @Override
            void executeAfter(AjaxRequestTarget target) {
                
                /* 
                 * 運営管理者による機関情報の削除
                 * ・所属する会員を退会
                 * ・組織を論理削除
                 */
                Usr cndUser = new Usr();
                cndUser.setOrgid(targetOrg.getOrgid());
                List<Usr> members = usrDao.get(cndUser);
                for(Usr member: members) {
                    if(Usr.STATUS_退会 != member.getStatus()) {
                        member.退会処理();
                        usrDao.update(member, loginUserId); // 更新処理
                    }
                }
                /* 外部APIに退会者のログインIDを通知 */
                AppUtils.callDeleteNotice(members);
                
                orgDao.removeLogical(targetOrg, loginUserId); // 論理削除
                
                /* 状態遷移 */
                completeDel = true;
                
                /* 画面コンポーネントを更新する */
                target.add(form);
            }
            @Override
            public boolean isVisible() {
                /* 運営管理者以外には表示しない */
                if(isSystemAdmin() == false) {
                    return false;
                }
                if(targetOrg.getKind().equals(Org.KIND_運営管理)) { 
                    /* 組織「運営管理」は削除しない */
                    return false;
                }
                /* 完了後の状態ならボタンを表示しない */
                return completeMod == false && completeDel == false;
            }
        };
        form.add(btnSubmitDel);
    }


    /**
     * 利用期間の日付ドロップダウンが変更された時の振る舞い
     */
    private class DateDropDownOnchangeBehavior extends AjaxFormComponentUpdatingBehavior {
        private final Label quickMsgFromto;
        private DateDropDownOnchangeBehavior(Label quickMsgFromto) {
            super("onchange");
            this.quickMsgFromto = quickMsgFromto;
        }
        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            target.add(quickMsgFromto);
        }
    }
}
