// ************************************
// onunloadイベントで無効化されたボタンを有効化する。
// (そうしないとFireFoxにおいて、ブラウザの戻るボタンで
// 元の画面へ戻ったとき、ボタンが無効のままになってしまう。)
// ************************************
//var _oldEvent = window.onunload;
//window.onunload=(typeof _oldEvent != 'function') ?
//enableButton :
//function(){
//	enableButton();
//	return true;
//};

// ************************************
// onloadイベントでボタンを無効化する。
// (そうしないとIEにおいて、ブラウザの戻るボタンで
// 元の画面へ戻ったとき、ボタンが有効となってしまう。)
// ************************************
var _disableCalled = false;	// disableButtonが呼び出されたらtrue
var _cookieName = "";

// onLoadとonUnloadにイベントを追加する。
addEvent(window, "load", checkCurrentPage);
addEvent(window, "unload", resetFlag);

function suppressMultiEntryInit( cookieName )
{
	_cookieName = cookieName;
	return true;
}

// ************************************
// 戻るボタンが使用されたかどうかの判定
// ************************************
function checkCurrentPage() {
	var url = document.URL;
	var inCookie = getCookie(_cookieName);
	var disabledPage = getCookie(_cookieName + "_d");

	//alert("URL -> " + document.URL +
	//	"\n inCookie -> " + inCookie +
	//	"\n disabled Page -> " + disabledPage); // for DEBUG

	if( url != inCookie )
	{
		if( document.URL == disabledPage )
		{
			// 戻るボタンで戻ってきた場合の処理。
			// ボタンを無効化する。
			disableButton();
			return true;
		}
	}

	enableButton();
	return true;
};

function resetFlag() {
	if( true != _disableCalled )
	{
		// ボタン無効化が実行されたとき以外は、現在無効化されているページをリセットする。
		setCookie(_cookieName + "_d", "");
	}

	return true;
}

// ************************************
// イベントを追加する
// ************************************
function addEvent(element, listener, fn)
{
	try{
		// IE以外
		element.addEventListener(listener, fn, true);
	}catch(e){
		// IE
		element.attachEvent('on' + listener, fn);
	}
}

// ************************************
// クッキーの値を取得する
// ************************************
function getCookie(key) {
	var tmp1;
	var tmp2;
	var nameCount;
	var keyIndex;
	var valueIndex;
	var len;

    tmp1 = " " + document.cookie + ";";
    nameCount = keyIndex = 0;
    len = tmp1.length;
    while (nameCount < len) {
        keyIndex = tmp1.indexOf(";", nameCount);
        tmp2 = tmp1.substring(nameCount + 1, keyIndex);
        valueIndex = tmp2.indexOf("=");
        if (tmp2.substring(0, valueIndex) == key) {
            return(unescape(tmp2.substring(valueIndex + 1, keyIndex - nameCount - 1)));
        }
        nameCount = keyIndex + 1;
    }
    return("");
}

// ************************************
// クッキーの値を設定する
// ************************************
function setCookie(key, val) {
	var tmp = key + "=" + escape(val) + "; ";
    tmp += "path=/;";
    document.cookie = tmp;
}


// ************************************
// フォームからの2重送信を抑制するためのスクリプト。
// submitボタンを押下した後、ボタンをdisableにします。
// @param target 無効化対象となるオブジェクト。
//               nullを指定すると、idがsuppressMultiEntryのタグが無効化される。
//        bNotSubmit  INPUTタグの場合、submit()を自動で実行しないなら1。するなら0。省略すると1になる。
// ************************************
function disableButton(target, bNotSubmit) {
	return _suppressMultiEntry(target, bNotSubmit);
}

function _suppressMultiEntry(target, bNotSubmit) {
    var originalURI = "";
    var flag_href = 0;  // href2回目以降用
    // for IE(id=suppressMultiEntryが複数存在する場合)
    if( document.all && document.all.item('suppressMultiEntry') )
    {
        if( document.all.item('suppressMultiEntry').length )
        {
            // タグを無効化する
            for( var i = 0; i < document.all.item('suppressMultiEntry').length; i++ )
            {
               document.all.item('suppressMultiEntry', i).disabled = true;

               if( "A" == document.all.item('suppressMultiEntry', i).tagName )
               {
                    // 指定されたAタグならば
                    if( target )
                    {
                        if( target == document.all.item('suppressMultiEntry', i) )
                        {
                            // リンク先を覚えておく
                            originalURI = target.href;
                            flag_href = 1;
                        }
                    }
                    // Aタグからhref属性を取り除く
                    document.all.item('suppressMultiEntry', i).hrefBK = document.all.item('suppressMultiEntry', i).href;
                    document.all.item('suppressMultiEntry', i).removeAttribute('href');
               }
            }
        }
        else
        {
            document.all.item('suppressMultiEntry').disabled = true;

            if( "A" == document.all.item('suppressMultiEntry').tagName )
            {
                // 指定されたAタグならば
                if( target )
                {
                    if( target == document.all.item('suppressMultiEntry') )
                    {
                        // リンク先を覚えておく
                        originalURI = target.href;
                        flag_href = 1;
                    }
                }
                // Aタグからhref属性を取り除く。
                document.all.item('suppressMultiEntry').hrefBK = document.all.item('suppressMultiEntry').href;
                document.all.item('suppressMultiEntry').removeAttribute("href");
            }
        }
    }
    // for FireFox
    else if( document.getElementById('suppressMultiEntry') )
    {
        var objRegex = new RegExp('suppressMultiEntry');

        // INPUTタグ無効化
        var objInput = document.getElementsByTagName('INPUT');
        for( var i = 0; i < objInput.length; i++ )
        {
            if( objInput[i].id.match(objRegex) )
            {
                objInput[i].disabled = true;
            }
        }

        // Aタグ無効化
        var objA = document.getElementsByTagName('A');
        for( var i = 0; i < objA.length; i++ )
        {
            if( objA[i].id.match(objRegex) )
            {
                // 指定されたAタグならば
                if( target )
                {
                    if( target == objA[i] )
                    {
                        // リンク先を覚えておく
                        originalURI = target.href;
                        flag_href = 1;
                    }
                }
                // Aタグからhref属性を取り除く。
                objA[i].hrefBK = objA[i].href;
                objA[i].removeAttribute('href');

                objA[i].disabled = true;
            }
        }
    }
    else if( target )
    {
        // 指定されたオブジェクトを無効化する。
        if( "A" == target.tagName )
        {
            originalURI = target.href;
            target.hrefBK = target.href;
            target.removeAttribute('href');
        }

        target.disabled = true;
    }

	// クッキーに現在のURLを保存
	_disableCalled = true;
	setCookie(_cookieName + "_d", document.URL);

	// クリックされたURL or ボタンの情報セット
    if( "" != originalURI )
    {
        location.href = originalURI;
    }
    else if( target && !bNotSubmit && !flag_href )
    {
        target.form.submit();
    }
}

// ************************************
// submitボタンを押下した後、id="suppressMultiEntry"の
// ボタンをenableにします。
// ************************************
function enableButton() {
    var originalURI = "";

    // for IE(id=suppressMultiEntryが複数存在する場合)
    if( document.all && document.all.item('suppressMultiEntry') )
    {
        if( document.all.item('suppressMultiEntry').length )
        {
            // タグを有効化する
            for( var i = 0; i < document.all.item('suppressMultiEntry').length; i++ )
            {
            	document.all.item('suppressMultiEntry', i).disabled = false;

            	if( "A" == document.all.item('suppressMultiEntry', i).tagName )
				{
					if(document.all.item('suppressMultiEntry', i).hrefBK != null) {
					    document.all.item('suppressMultiEntry', i).setAttribute("href", document.all.item('suppressMultiEntry', i).hrefBK);
					}
				}
            }
        }
        else
        {
        	if( "A" == document.all.item('suppressMultiEntry').tagName )
        	{
	        	if(document.all.item('suppressMultiEntry').hrefBK != null) {
	        		document.all.item('suppressMultiEntry').setAttribute("href", document.all.item('suppressMultiEntry').hrefBK);
	        	}
        	}
            document.all.item('suppressMultiEntry').disabled = false;
        }
    }
    // for FireFox
    else if( document.getElementById('suppressMultiEntry') )
    {
        var objRegex = new RegExp('suppressMultiEntry');

        // INPUTタグ有効化
        var objInput = document.getElementsByTagName('INPUT');
        for( var i = 0; i < objInput.length; i++ )
        {
            if( objInput[i].id.match(objRegex) )
            {
                objInput[i].disabled = false;
            }

        }

        // Aタグ有効化
        var objA = document.getElementsByTagName('A');
        for( var i = 0; i < objA.length; i++ )
        {
            if( objA[i].id.match(objRegex) )
            {
   	        	if(objA[i].hrefBK != null) {
	                objA[i].setAttribute('href', objA[i].hrefBK);
	                objA[i].disabled = false;
	            }
            }
        }
    }
}
