﻿/****************2度押しを制御するクラスです***********************/
var DoublePostManager = "";
$addHandler(window, 'load', function(){
    DoublePostManager = $create(CodeSample.DoublePostManager, {}, null, null, null);
});

Type.registerNamespace("CodeSample");

CodeSample.DoublePostManager = function(){
    CodeSample.DoublePostManager.initializeBase(this);
    this._prman = null;                 //PageRequestManagerのインスタンス
    this._beginRequestHandler = null;   //非同期通信開始時に実行するハンドラー
    this._endRequestHandler = null;     //非同期通信終了時に実行するハンドラー
    this._onclickList = null;           //既存のclick処理を退避するリスト
    this._submitHandler = null;         //クリック処理をフックするハンドラー
}

CodeSample.DoublePostManager.prototype ={
    initialize:function() {
        CodeSample.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._submitCtrl;
            document.links[i].onclick = this._submitHandler;
        }
  
        //全てのボタンのクリックイベントを_submitCtrlメソッドを登録する。
        /*
        //以下のコードではImageButtonに対応できない（というか最初から対応できてないなぁ）
        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;
                //IDはコール先で取得するように変更
            }
        }
        */
        //上記ではImageButtonが設定できないので以下のように変更
        var inputElmlist = document.getElementsByTagName("input");
        if(inputElmlist!=null){
            for(var i=0;i<inputElmlist.length;i++){
                var elm = inputElmlist[i];
                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;
                    //IDはコール先で取得するように変更
                }
            }
        }
    },
    /*********2度押し制御コントロールのクリック時処理（アクセス中は処理が中断されます）
    （非同期通信時は利用しません）**********/
    //_submitCtrl : function(id){
    _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'){
                //func();
                var retValue = func();
                //元々設定されていたスクリプトに戻り値がある場合はそれを返却する。
                if(retValue!=null){
                    return false;
                }
            }
        }
        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;
        }
        /*
        //以下のコードではImageButtunは検出できない
        for(var i = 0; i < document.forms[0].elements.length; i ++) {
            if (document.forms[0].elements[i].type == "button" ||
              document.forms[0].elements[i].type == "submit" ||
              document.forms[0].elements[i].type == "reset" ||
              document.forms[0].elements[i].type == "file") {
              document.forms[0].elements[i].disabled = !bEnable;;
            }
        }
        */
        var inputElmlist = document.getElementsByTagName("input");
        for(var i=0;i<inputElmlist.length;i++){
            var elm = inputElmlist[i];
            if (elm.type == "button" ||
                elm.type == "submit" ||
                elm.type == "reset" ||
                elm.type == "file" ||
                elm.type == "image") {
                    elm.disabled = !bEnable;
            }
        }
    },
    dispose: function() {
        CodeSample.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);
            }
        }
    }
}


CodeSample.DoublePostManager.registerClass('CodeSample.DoublePostManager', Sys.Component);

if (typeof(Sys) !== 'undefined')
   Sys.Application.notifyScriptLoaded(); 



