/**
 * 引数のオブジェクトの配列をenableにする
 *
 * @param array enableにする項目（オブジェクト）の配列（必須）
 */
function enable(array){

	if(array){
		for(i=0;i<array.length;i++){
			if(array[i]){
				array[i].disabled = false;
			}
		}
	}
	
}

/**
 * 引数のオブジェクトの配列をdisableにする
 *
 * @param array enableにする項目（オブジェクト）の配列（必須）
 */
function disable(array){

	if(array){
		for(i=0;i<array.length;i++){
			if(array[i]){
				array[i].disabled = true;
			}
		}
	}
	
}

/**
 * Ajax同期通信を行う
 * レスポンスがあるまでメソッドはブロックされる
 * 通信中はすべてのForm項目がdiasbleとなり
 * レスポンスがきたらenableとなる
 *
 * @param url 送信先URL（必須）
 * @return Ajax.Request
 */
function sendSyncRequest(url){
	var data = Form.serialize(document.forms[0]);
	Form.disable(document.forms[0]);
	var request = new Ajax.Request(
			url, 
			{
				method: 'post', 
				asynchronous: false,
				parameters: data
			});
	Form.enable(document.forms[0]);
	return request;
}

/**
 * Ajax非同期通信を行う（進捗バー付）
 * 通信中はすべてのForm項目がdiasbleとなり
 * レスポンスがきたらenableとなる
 * 引数に渡すコールバック関数はAjax.Requestと処理結果JSONデータを引数に持つ関数とすること
 * 何らかのサーバエラーが発生した場合はhandleFailureが呼び出される
 * 
 * @param url 送信先URL（必須）
 * @param funcSuccess 処理結果ステータスが正常の場合呼び出される関数（必須）
 * @param funcError 処理結果ステータスが異常終了の場合呼び出される
 */
function sendRequestProgress(url,funcSuccess,funcError){
	openProgressWindow();
	var data = Form.serialize(document.forms[0]);
	Form.disable(document.forms[0]);
	new Ajax.Request(
			url, 
			{
				method: 'post', 
				parameters: data, 
				onSuccess : handleResult,
				onFailure : handleFailure
			});


	function handleResult(request,ret){
		Form.enable(document.forms[0]);
		closeProgressWindow();
		if(isSuccess(ret)){
			funcSuccess(request,ret);
		}else if(isError(ret)){
			if(funcError){
				funcError(request,ret);
			}else{
				showResultMessage(ret);
			}
		}else{
			showResultMessage(ret);
		}
	}
}

/**
 * Ajax非同期通信を行う
 * 通信中はすべてのForm項目がdiasbleとなり
 * レスポンスがきたらenableとなる
 * 引数に渡すコールバック関数はAjax.Requestと処理結果JSONデータを引数に持つ関数とすること
 * 何らかのサーバエラーが発生した場合はhandleFailureが呼び出される
 * 
 * @param url 送信先URL（必須）
 * @param funcSuccess 処理結果ステータスが正常の場合呼び出される関数（必須）
 * @param funcError 処理結果ステータスが異常終了の場合呼び出される
 */
function sendRequest(url,funcSuccess,funcError){
	var data = Form.serialize(document.forms[0]);
	Form.disable(document.forms[0]);
	new Ajax.Request(
			url, 
			{
				method: 'post', 
				parameters: data, 
				onSuccess : handleResult,
				onFailure : handleFailure
			});

	function handleResult(request,ret){
		Form.enable(document.forms[0]);
		if(isSuccess(ret)){
			funcSuccess(request,ret);
		}else if(isError(ret)){
			if(funcError){
				funcError(request,ret);
			}else{
				showResultMessage(ret);
			}
		}else{
			showResultMessage(ret);
		}
	}
}

/**
 * 処理ステータスが正常であるか判定する
 * @param ret 処理結果JSONデータ（必須）
 * @return 正常：true
 */
function isSuccess(ret){
	return (ret && ret.status=="SUCCESS");
}

/**
 * 処理ステータスが異常終了であるか判定する
 * @param ret 処理結果JSONデータ（必須）
 * @return 異常終了：true
 */
function isError(ret){
	return (ret && ret.status=="ERROR");
}

/**
 * 処理ステータスが例外終了であるか判定する
 * @param ret 処理結果JSONデータ（必須）
 * @return 例外終了：true
 */
function isException(ret){
	return (ret && ret.status=="EXCEPTION");
}

/**
 * 処理結果のメッセージをメッセージ領域に表示する
 * @param ret 処理結果JSONデータ（必須）
 */
function showResultMessage(ret){
	setInnerText($('messageArea'),getResultMessage(ret));
}

/**
 * innserTextを設定する
 * @param obj オブジェクト（必須）
 * @param value 値（必須）
 */
function setInnerText(obj,value){
	if(!obj){
		return;
	}
	if(obj.innerText){
		obj.innerText = value;
	}else if(obj.textContent){
		obj.textContent = value;
	}else{
		obj.innerText = value;
	}
}

/**
 * メッセージ領域をクリアする
 */
function clearMessage(){
	setInnerText($('messageArea'),"");
}

/**
 * 処理結果のメッセージ取得する
 * @param ret 処理結果JSONデータ（必須）
 */
function getResultMessage(ret){
	var msg = "";
	if(!ret){
		return "レスポンスデータがありません。";
	}
	if(ret.messages){
		for(i=0;i<ret.messages.length;i++){
			msg+=decodeURIComponent(ret.messages[i]) + "\n";
		}
	}
	if(ret.result){
		for(i=0;i<ret.result.length;i++){
			msg += decodeURIComponent(ret.result[i].message) + "\n";
		}
	}
	if(msg==""){
		return "メッセージがありません。";
	}
	return msg;
}

/**
 * 選択されているラジオボタンのインデックスを取得する
 * @param obj ラジオボタンオブジェクト（必須）
 * @return 選択されているインデックス
 */
function getSelectedRadioIndex(obj){
	if(!obj){
		return null;
	}
	if(obj.length){
		for(i=0;i<obj.length;i++){
			if(obj[i].checked){
				return i;
			}
		}
	}else{
		return 0;
	}
}

/**
 * 選択されているラジオボタンのオブジェクトを取得する
 * @param obj ラジオボタンオブジェクト（必須）
 * @return 選択されているラジオボタンオブジェクト
 */
function getSelectedRadio(obj){
	if(!obj){
		return null;
	}
	if(obj.length){
		return obj[getSelectedRadioIndex(obj)];
	}else{
		return obj;
	}
}

/**
 * 画面遷移する
 * @param url 遷移先（必須）
 * @param cursor 砂時計カーソル使用時:true
 */
function jumpTo(url,cursor){
	if(cursor){
		document.body.style.cursor = "wait";
	}
	location.href=url;
}

/**
 * 画面遷移する プログレスバー付
 * @param url 遷移先（必須）
 */
function jumpToProgress(url){
	openProgressWindow();
	jumpTo(url,true);
}

/**
 * formをsubmitする
 * @param url 遷移先（必須）
 * @param cursor 砂時計カーソル使用時:true
 */
function submitAction(url,cursor){
	if(cursor){
		document.body.style.cursor = "wait";
	}
	document.forms[0].action = url;
	document.forms[0].submit();

}

/**
 * formをsubmitする　プログレスバー付
 * @param url 遷移先（必須）
 */
function submitActionProgress(url){
	openProgressWindow();
	submitAction(url,true);
}

/**
 * メニューに戻る
 */
function backMenu(){
	jumpTo('../../system/menu/menu.do');
}

/**
 * サーバーエラーが発生したときに呼び出される
 * サーバーエラーページへ遷移する
 * @param request reqest
 * @param ret ret
 */
function handleFailure(request,ret){
	location.href="../../jsp/common/serverError.jsp";
}

/**
 * サブウィンドウを開く
 * @param url 遷移先（必須）
 */
function openSubWindow(url){
	window.open(url,'subwindow' ,'resizable=no,scrollbars=no,status=no');
}
