/**
 * フォーム入力チェック参照クラス
 *
 * @copyright  2012 sesh
 * @version  1.0.0
 *
 */
require(["dojo/ready"], function(ready) {
    require([
        "dijit/dijit",
        "dijit/Tooltip",
        "dijit/form/Form",
        "dijit/form/TextBox",
        "dijit/form/TimeTextBox",
        "dijit/form/Select",
        "boostrade/form/AlphaBox",
        "boostrade/form/AlphaNumberBox",
        "boostrade/form/CodeBox",
        "boostrade/form/DateBox",
        "boostrade/form/HostNameBox",
        "boostrade/form/MailBox",
        "boostrade/form/NumberBox",
        "boostrade/form/TelBox",
        "boostrade/form/Textarea",
        "boostrade/form/TimeBox",
        "boostrade/form/UriBox",
        "boostrade/form/ValidationBox",
        "boostrade/form/YbnoBox",
        "boostrade/form/ZenkakuKanaBox",
        "boostrade/form/NecessaryBox",
        "boostrade/form/NecAlphaBox",
        "boostrade/form/NecAlphaNumberBox",
        "boostrade/form/NecCodeBox",
        "boostrade/form/NecDateBox",
        "boostrade/form/NecHostNameBox",
        "boostrade/form/NecMailBox",
        "boostrade/form/NecNumberBox",
        "boostrade/form/NecTelBox",
        "boostrade/form/NecTimeBox",
        "boostrade/form/NecUriBox",
        "boostrade/form/NecYbnoBox",
        "boostrade/form/NecZenkakuKanaBox",
        "boostrade/form/NecTextarea"
    ]);

    require([
     ], function() {
        var necClass       = "nec";                     // 必須項目に付加するクラス
        var errorTextClass = "dijitTextBoxError";       // 入力チェックエラー時に付加するクラス

        /**
         * 入力チェック
         */
        dojoValidate = function(form) {

            // Dojo入力チェック
            if (!dijit.byId(form).validate()) {
                return false;
            }

            // セレクトボックス必須チェック
            var selectValidObj = null;
            $("#" + form + " select[class*='" + necClass + "']").each(function() {
                if ($(this).attr("disabled") != "disabled" && $(this).val() == '') {
                    dojoError($(this).attr("id"), "この項目は必須選択です");
                    if (selectValidObj == null) {
                        selectValidObj = $(this);
                    }
                }
            });

            if (selectValidObj != null) {
                selectValidObj.focus();
                return false;
            }

            return true;
        };

        /**
         * エラーツールチップ表示
         * ひとつの画面で複数回呼ばれた場合、dojoの仕様のため最後のウィジェットにのみツールチップが表示される
         * @param  id  エラー対象id
         * @param  msg ツールチップに表示するメッセージ
         */
        dojoError = function(id, msg) {
            var widget = dijit.byId(id);
            var orgValid;

            // 対象がウィジェットならvalidatorを取得
            if (widget) {
                orgValid = widget.validator;
            }

            // validator持ちウィジェットかチェック
            if (orgValid) {
                // ウィジェットをエラーに設定
                widget.validator = function() {return false;};
                widget.validate();
                widget.validator = orgValid;

                // フォーカス
                widget.focus();

                // ウィジェットにツールチップ表示
                if (msg) {
                    dijit.showTooltip(
                        msg,
                        widget.domNode,
                        widget.get('tooltipPosition'),
                        !widget.isLeftToRight()
                    );
                }

            } else {
                // ウィジェットじゃないかvalidatorをもたないウィジェット

                // 入力エラークラスを付加
                dojo.addClass(id, errorTextClass);

                // 通常のツールチップを表示
                dojoTooltip(id, msg);

                // フォーカス
                dojo.byId(id).focus();
            }
        };

        /**
         * ツールチップ表示
         * @param  id      表示対象id
         * @param  label   ツールチップに表示するメッセージ
         */
        dojoTooltip = function(id, label) {
            if (!label) {
                return;
            }

            new dijit.Tooltip({
                connectId: id,
                label: label,
                position: ["above","below","after","before"]
            });
        };

        /**
         * エラータブへフォーカス
         * @param  tabContainerId  タブコンテナid
         */
        dojoFocusTab = function(tabContainerId) {
            var tabContainer = dijit.byId(tabContainerId);
            var firstInvalidItem = null;

            dojo.forEach(tabContainer.getChildren(), function(pane) {
                // ウィジェットエラー
                dojo.forEach(pane.getDescendants(), function(dj) {
                    if (!firstInvalidItem && !dj.disabled && dj.isValid && !dj.isValid()) {
                        // タブを開く
                        firstInvalidItem = dj;
                        tabContainer.selectChild(pane);

                        dj.focus();
                    }
                });

                // セレクトボックス必須エラー
                if (!firstInvalidItem) {
                    var selectObj = $("#" + pane.get("id") + " select[class*='" + necClass + " " + errorTextClass + "']").get(0);
                    if (selectObj) {
                        // タブを開く
                        firstInvalidItem = true;
                        tabContainer.selectChild(pane);

                        selectObj.focus();
                    };
                }
            });
        };

        /**
         * フォーム配下のウィジェットを全て読み込み専用に変える
         * @param  formId  フォームid
         */
        dojoReadonly = function(formId) {
            var form = dijit.byId(formId);

            // 全ウィジェットを読み込み専用に変換
            dojo.forEach(form.getDescendants(), function(dj) {
                dj.set("readonly", "readonly");
            });

            // 全セレクトボックスを読み込み専用に変換
            $("#" + formId + " select option:not(:selected)").remove();

            // 全ボタンをdisabledに変換
            $("#" + formId + " input[type='button'], input[type='radio']:not(:checked), input[type='checkbox']:not(:checked)").attr("disabled", "disabled");

            // 検索ボタンを無効化
            $("#" + formId + " .iconSearch").remove();
        };
    });
});
