﻿/*-------------------------------------------------------------------------
*    二度押し防止ユーティリティ
*
*    このJsファイルを読み込ませるだけで有効になります
*    引用：http://www.squabu.com/IntecJss/Samples/etc/DoublePost.aspx
*
*
*    Copyright(c) beyond, INTEC Inc. All rights reserved.
*-------------------------------------------------------------------------*/

/****************2度押しを制御するクラスです***********************/
var DoublePostManager = "";
$addHandler(window, 'load', function(){
    DoublePostManager = $create(IntecJs.DoublePostManager, {}, null, null, null);
});

Type.registerNamespace("IntecJs");

IntecJs.DoublePostManager = function(){
    IntecJs.DoublePostManager.initializeBase(this);
    this._prman = null;                 //PageRequestManagerのインスタンス
    this._beginRequestHandler = null;   //非同期通信開始時に実行するハンドラー
    this._endRequestHandler = null;     //非同期通信終了時に実行するハンドラー
    this._onclickList = null;           //既存のclick処理を退避するリスト
    this._submitHandler = null;         //クリック処理をフックするハンドラー
}
IntecJs.DoublePostManager.prototype = {
    initialize: function() {
        IntecJs.DoublePostManager.callBaseMethod(this, 'initialize');
        this._setObserveCtrl();

        //UpdatePanel内の非同期通信時に制御するイベントを登録する。
        //ScriptManagerのEnablePartialRenderingプロパティ（部分更新処理）がtrueに設定されている場合、
        //実行時にPageRequestManagerが生成されます。
        //PageRequestManagerが生成されている場合、非同期通信用の制御メソッドを登録します。
        this._prman = Sys.WebForms.PageRequestManager.getInstance();
        if (null != this._prman) {
            this._beginRequestHandler = Function.createDelegate(this, this._onBeginRequest);
            this._endRequestHandler = Function.createDelegate(this, this._onEndRequest);
            this._prman.add_beginRequest(this._beginRequestHandler);
            this._prman.add_endRequest(this._endRequestHandler);
        }
    },
    /*********二度押し制御対象コントロールのonclick処理に制御メソッドを定義します。*********
    */
    _setObserveCtrl: function() {
        if (null == this._submitHandler) {
            this._submitHandler = Function.createDelegate(this, this._submitCtrl);
        }

        this._onclickList = new Array();

        //全てのリンクのクリックイベントに_submitCtrlメソッドを登録する。
        for (var i = 0; i < document.links.length; i++) {
            if (null != document.links[i].onclick) {
                this._onclickList[document.links[i].id] = document.links[i].onclick;
            }
            document.links[i].onclick = this._submitHandler;

        }

        //全てのボタンのクリックイベントを_submitCtrlメソッドを登録する。
        /*         for(var i = 0; i < document.forms[0].elements.length; i ++) {
        var elm = document.forms[0].elements[i];
        if (elm.type == "button" ||
        elm.type == "submit" ||
        elm.type == "reset" ||
        elm.type == "file") {
        if(null!=elm.onclick){
        this._onclickList[elm.id] = elm.onclick;
        }
        elm.onclick = this._submitHandler;
        }
        }
        */
        var inputElmlist = document.getElementsByTagName("input");
        if (inputElmlist != null) {
            for (var j = 0; j < inputElmlist.length; j++) {
                var elm = inputElmlist[j];
                if (elm.type == "button" ||
                    elm.type == "submit" ||
                    elm.type == "reset" ||
                    elm.type == "file" ||
                    elm.type == "image") {
                    if (null != elm.onclick) {
                        this._onclickList[elm.id] = elm.onclick;
                    }
                    elm.onclick = this._submitHandler;
                }
            }
        }
    },
    /*********2度押し制御コントロールのクリック時処理（アクセス中は処理が中断されます）
    2度押しでない場合は登録されていた処理を実行します**********/
    _submitCtrl: function(e) {
        if (DoublePostManager._isAccessing()) {
            alert("処理中です。暫くお待ち下さい。");
            return false;
        }
        var id = null;
        if (Sys.Browser.agent === Sys.Browser.InternetExplorer) {
            //IEは引数が飛んでこないのでeventより取得する。
            id = event.srcElement.id;
        } else {
            //Firefoxでは引数のtarget.idに格納されている。
            try {
                id = e.target.id;
            } catch (err) {
            }
        }
        if (null != this._onclickList) {
            var func = this._onclickList[id];
            if (null != func && typeof (func) != "undefined") {
                var retValue = func();
                //元々設定されていたスクリプトに戻り値がある場合はそれを返却する。
                if (retValue != null) {
                    //return false;//不具合修正
                    return retValue;
                }
            }
        }
        return true;
    },     /*********アクセス中か判定します。**********/
    _isAccessing: function() {
        return (document.readyState != null && document.readyState != "complete");
    },
    /*********非同期通信開始時処理*******************/
    _onBeginRequest: function(sender, args) {
        //全てのリンクボタンとボタンの利用不可にする。
        this._enableCtrl(false);
    },
    /*********非同期通信終了時処理*******************/
    _onEndRequest: function(sender, args) {
        //全てのリンクボタンとボタンの利用可能にする。
        this._enableCtrl(true);
    },
    /*********全てのリンクとボタンの利用可否設定を行う*******************/
    _enableCtrl: function(bEnable) {
        for (var i = 0; i < document.links.length; i++) {
            document.links[i].disabled = !bEnable;
        }

        //以下修正コード（2007年8月17日）
        var inputElmlist = document.getElementsByTagName("input");
        for (var j = 0; j < inputElmlist.length; j++) {
            var elm = inputElmlist[j];
            if (elm.type == "button" ||
                elm.type == "submit" ||
                elm.type == "reset" ||
                elm.type == "file" ||
                elm.type == "image") {
                elm.disabled = !bEnable;
            }
        }
    },
    /*********dispose*******************/
    dispose: function() {
        IntecJs.DoublePostManager.callBaseMethod(this, 'dispose');

        if (null != this._prman) {
            if (null != this._beginRequestHandler) {
                this._prman.remove_beginRequest(this._beginRequestHandler);
            }
            if (null != this._endRequestHandler) {
                this._prman.remove_endRequest(this._endRequestHandler);
            }
        }
    }
}

IntecJs.DoublePostManager.registerClass('IntecJs.DoublePostManager', Sys.Component);
if (typeof(Sys) !== 'undefined')
   Sys.Application.notifyScriptLoaded(); 

