/*==============================================================================
	＜pelabo.js＞
	 ぺんラボが作成したWebアプリで使う関数ライブラリ

	著作：
		Satoshi Ishikawa
		ishikawa@penlabo.net
		http://penlabo.net/

	2011-10-14 openWindowのパラメータにwindowTitleを追加
	2011-10-14 クエリストリングをオブジェクトに変換（querystring2object）、オブジェクトをクエリストリングに変換（object2querystring）を実装
	2011-09-26 openWindowを仮導入
	2011-09-05 eventAdd_tableTrSelect_runのオブジェクト指定不備を修正
	2011-08-24 sendAjaxにalert追加
	2011-08-17 addTR追加
	2011-05-24 sendAjax追加（個別のajax_requestと同等）
	2011-05-17 フォーム一括チェックにクラス名（checkFlipFlop）指定を追加、後で指定できるようにする
	2011-04-27
-------------------------------------------------------------------------------*/
/*==============================================================================
 クエリストリングをオブジェクトに変換
 変換する内容は現在のロケーションから取得

 2011-10-14 新設
--------------------------------------------------------------------------------*/
function str2obj(){ return querystring2object(); }
function querystring2object(){

	var param = location.search.substr( 1 ).split( '&' );
	var method = new Object();
	for( i = 0; i < param.length; i ++ ){
		var temp = param[i].split( '=' );
		method[ temp[0] ] = temp[1];
	}

	return method;

}
/*==============================================================================
 オブジェクトをクエリストリングに変換

 2011-10-14 新設
--------------------------------------------------------------------------------*/
function obj2str( set_obj ){ return object2querystring( set_obj ); }
function object2querystring( set_obj ){

	var method = new Array();
	for( i in set_obj ){
		if( set_obj[i] == undefined ) continue;
		method.push( i + '=' + set_obj[i] );
	}

	return method.join( '&' );

}

var openWindowZIndex = 100;
var offsetX = 0;
var offsetY = 0;
var startX = 0; // 対象の初期値
var startY = 0; // 対象の初期値
var baseX = 0; // 対象の初期値
var baseY = 0; // 対象の初期値
var dragObj = null;
document.onmousemove = onMouseMove;
document.onmouseup = onMouseUp;
/*==============================================================================
 移動
------------------------------------------------------------------------------*/
function onMouseMove( e ){
	// カーソルの場所を
	if( document.all ){
		cursorX = event.clientX + document.documentElement.scrollLeft;
		cursorY = event.clientY + document.documentElement.scrollTop;
	}
	else if( document.getElementById || document.Layers ){
		cursorX = e.pageX;
		cursorY = e.pageY;
	}
	if( dragObj == null ) return;
	var diffX = cursorX - startX;
	var diffY = cursorY - startY;
	dragObj.style.left = ( baseX + diffX ) +'px';
	dragObj.style.top  = ( baseY + diffY ) +'px';
}
/*==============================================================================
 onMouseUp
------------------------------------------------------------------------------*/
function onMouseUp( e ){
	if( dragObj == null ) return;
	dragObj = null;
}
/*==============================================================================
 読み込み完了時で初期化開始
------------------------------------------------------------------------------*/
function onMouseDown( e ){
	dragObj = this.parentNode;
	// イベント開始座標の記録
	startX = cursorX;
	startY = cursorY;
	// 対象の初期値
	baseX = parseInt( dragObj.style.left );
	baseY = parseInt( dragObj.style.top );

}




/*==============================================================================

 2011-10-14 パラメータにwindowTitle追加
 2011-06-29 タイトルバーのイベントをonclickからonmousedownに変更
------------------------------------------------------------------------------*/
function openWindow( event, windowName, documents, margin_x, margin_y, windowTitle ){

	var objWindow = $( windowName );
//alert(objWindow);
	//----- ウィンドウ未定義なら新規に作成
	if( objWindow == null ){
		//----- オブジェクト生成
		objWindow = document.createElement( 'div' );
//		objWindow.setAttribute( 'name', windowName );
		objWindow.setAttribute( 'id', windowName );
		objWindow.style.border = '3px gray ridge';
		objWindow.style.backgroundColor = 'white';
		objWindow.style.position = 'absolute';
		objWindow.style.zIndex = openWindowZIndex++;
		objWindow.onmousedown = function(){ this.style.zIndex = openWindowZIndex ++; }; // 2011-09-26 onclick -> onmousedown
		//----- ヘッダ生成
		var objWindowHeader = document.createElement( 'div' );
//		objWindow.setAttribute( 'name', windowName );
		objWindowHeader.setAttribute( 'id', windowName + '_header' );
		objWindow.appendChild( objWindowHeader );
		objWindowHeader.onmousedown = onMouseDown;
		objWindowHeader.style.textAlign = 'left';
		objWindowHeader.style.color = 'white';
		objWindowHeader.style.backgroundColor = 'green';
		objWindowHeader.style.padding = '2px';
		var content = '<button type="button" onclick="$(\''+windowName+'\').style.display=\'none\';">×</button>';
		if( windowTitle != undefined ){ content += '<span>'+ windowTitle+'</span>'; }
		objWindowHeader.innerHTML = content;
		//----- コンテンツ生成
		var objWindowContent = document.createElement( 'div' );
//		objWindow.setAttribute( 'name', windowName );
		objWindowContent.setAttribute( 'id', windowName + '_content' );
		objWindow.appendChild( objWindowContent );
		objWindowContent.style.padding = '3px';
		objWindowContent.innerHTML = '';

		var bodyObj = document.getElementsByTagName('body')[0];
		bodyObj.appendChild( objWindow );
	}

	var obj = objWindow;
	var objIn = $( windowName + '_content' );
	if( documents == undefined || documents == '' ){
		obj.style.display = 'none';
		return;
	}
	objIn.innerHTML = documents;
	obj.style.zIndex = 200;
	obj.style.top  = ( Event.pointerY( event ) ) + margin_y + 'px';
	if( margin_x == null ){
		obj.style.left = '20px';//
	}
	else {
		obj.style.left = ( Event.pointerX( event ) ) + margin_x + 'px';
	}
	obj.style.display = 'block';
}
/*==============================================================================
 セルウィンドウ
// documentが空なら非表示に
------------------------------------------------------------------------------*/
function closeWindow( objTR, documents, margin_x, margin_y ){
	var obj = addTR2( objTR );
	if( documents == undefined || documents == '' ){
		obj.innerHTML = 'null';
		return;
	}
	obj.innerHTML = documents;
}
/*==============================================================================
	TRタグ追加用

	概要：
		テーブルでTRを追加してそのオブジェクトを返す
	実行：
		addTR( $( 'td' ) );
	要素：
		TD（オブジェクト）
	戻り値：
		追加したTD（オブジェクト）
	補足：
		（なし）
	注意：
		（なし）
	履歴：
		2011-08-17 新設
------------------------------------------------------------------------------*/
function addTR( set_obj ){

	var td = set_obj.parentNode;
	var tr = td.parentNode;
	var table = tr.parentNode;

	//----- 繰り返し処理を回避（この方法でいいのかな？
	if( tr.nextSibling.childNodes.length == 1 ){
		var td2 = tr.nextSibling.childNodes[0];
		return td2;
	}
//alert( tr.nextSibling.childNodes.length != 0 );//hasChildNodes() );//childNodes.tagName );//

	//----- TDの数を数える
	var count = 0;
	for( i in tr.childNodes ){
		if( tr.childNodes[i].tagName != 'TD' ) continue;
		count ++;
	}
//alert(count);

	//----- 追加する
	var td2 = document.createElement( 'td' );
	td2.setAttribute( 'colspan', count );
	var tr2 = document.createElement( 'tr' );
	tr2.appendChild( td2 );
//alert(tr2);
	table.insertBefore( tr2, tr.nextSibling );
//alert(td2);

	return td2;

}
/*==============================================================================
	Ajax非同期通信（prototype.js必須）

	引数：
		ループバックDOM（オブジェクト）
		リクエストを行う対象（接頭辞付与：ajax_）
		コマンド
		要素（パラメータ）

	2011-05-24 新設
------------------------------------------------------------------------------*/
function sendAjax( set_obj, set_target, set_cmd, set_param ){

	var param = "cmd=" + set_cmd + ( set_param != undefined ? '&'+set_param : '' );
	var action = "./ajax_" + set_target + ".php";

	new Ajax.Request( action, {
		method: "post",
		parameters: param,
		onSuccess: function( httpObj ){
			var temp = httpObj.responseText.split( '<>' );
			if( temp[0] == '0' ){
				alert( temp[2] );
			}
			if( temp[0] == '1' ){
				switch( temp[1] ){
					case 'alert': // 2011-08-24 追加
						alert( temp[2] );
						break;
					case 'delete':
						set_obj.parentNode.parentNode.style.display = 'none';
						break;
					case 'valid':
						set_obj.parentNode.parentNode.className = '';
						break;
					case 'invalid':
						set_obj.parentNode.parentNode.className = 'invalid';
						break;
					case 'reload':
						location.href = location.href;
						break;
					case 'form': // 再送時のパラメータにconfirm=1を追加
						set_obj.innerHTML = '<form onsubmit="sendAjax(this,\''+set_target+'\',\''+set_cmd+'\',\''+set_param+'&query=\'+this.elements[0].value+\'&confirm=1\');return false;">' + temp[2] + '<\/form>';
						if( set_obj.firstChild.elements == undefined ){ return; }
						if( set_obj.firstChild.elements[0] ){
							set_obj.firstChild.elements[0].focus();
							set_obj.firstChild.elements[0].select();
						}
						break;
					case 'text':
					default:
						//----- INPUTの場合はvalueを書き換える
						if( set_obj.tagName == 'INPUT' ){
							set_obj.value = temp[2];
						}
						else if( set_obj.tagName == 'SELECT' ){
							// 何もしない
						}
						else {
							set_obj.innerHTML = temp[2];
						}
						if( temp[3] != undefined ){
							eval( temp[3] );
						}
						return false;
						break;
				}
			}
		},
		onFailure: function( httpObj ){
			alert( "リクエストに失敗しました。" );
		}
	} );
	return false;

}
/*==============================================================================
	＜フォームパーツ番号取得＞ 2011-05-01

	概要：
		指定したフォームパーツがフォームの何番目にあるかを取得する
	実行：
		getnumberByItem( obj );
	要素：
		フォームパーツオブジェクト
	戻り値：
		数値（失敗ならnull）
	補足：
		（なし）
	注意：
		指定されたオブジェクトの酒類を確認したほうが良い
	履歴：
		2011-05-01 フォームがTABLE全体を囲んでいる場合に対応
		2011-04-27 作成
-------------------------------------------------------------------------------*/
function getNumberByItem( set_itemObj ){
	var formObj = set_itemObj.form;
	for( var i = 0; i < formObj.length; i++ ){
		if( set_itemObj == formObj[i] ) return i;
	}
	return null;
}
/*==============================================================================
	＜TRクラス切替＞ 2011-04-20
	概要：
		TABLEタグを対象に、指定したクラスを持つものにイベントを追加する
	実行：
		eventAdd_tableTrSelect( set_class, set_on, set_off );
	要素：
		タグTABLEのクラス名
		タグTRを選択ON状態で割り当てるクラス名
		タグTRを選択OFF状態で割り当てるクラス名（デフォルトは空）
	補足：
		選択ON状態で割り当てたクラス名は、選択OFF状態で削除する。
		このため、選択ON状態のクラス内容を上書きするようなクラスを用意する必要はない。
	注意：
		THまたはTDのFORMのINPUTチェックボックスと連携するが、制約を設けてないので調整が必要
	履歴：
		2011-09-05 判定文のオブジェクト指定不備を修正
		イベントを割り当てる対象をIDからCLASSに変更 2011-04-20
		イベントを発したオブジェクト基準で書き直したものを作成 2011-04-18
-------------------------------------------------------------------------------*/
function eventAdd_tableTrSelect( set_class, set_on, set_off ){
	Event.observe( window, 'load', function(){ eventAdd_tableTrSelect_event( set_class, set_on, set_off ) } );
}

function eventAdd_tableTrSelect_event( set_class, set_on, set_off ){
	var obj = document.getElementsByTagName( 'TABLE' );
	for( i = 0; i < obj.length ; i ++ ){
		if( obj[i].getAttribute( 'class' ) != set_class ) continue;
		var tbody = obj[i].childNodes;
		for( s = 0; s < tbody.length; s ++ ){
			if( tbody[s].tagName != 'TBODY' ) continue;
			var tr = tbody[s].childNodes;
			for( t = 0; t < tr.length; t ++ ){
				if( tr[t].tagName != 'TR' ) continue;
	//			tr[t].ondblclick = function(){ eventAdd_tableTrSelect_( this, set_on, set_off ); }
	//			tr[t].onclick = function(){ eventAdd_tableTrSelect_( this, set_on, set_off ); }
				var td = tr[t].childNodes;
				for( m = 0; m < td.length; m ++ ){
					if( td[m].tagName == undefined ) continue;
	//				if( td[m].tagName != 'TH' && td[m].tagName != 'TD' ) continue;
					if( td[m].tagName != 'TD' ) continue;
					td[m].onclick = function(){ eventAdd_tableTrSelect_run( this, set_on, set_off ); }
					var form = td[m].childNodes;
					for( n = 0; n < form.length; n ++ ){
						//----- TABLE全体をフォームが囲んでいる場合 2011-05-01
						if( form[n].tagName == 'INPUT' &&  form[n].getAttribute('type') == 'checkbox' && form[n].className == 'checkFlipFlop' ){
							form[n].onchange = function(){ eventAdd_tableTrSelect_run( this, set_on, set_off ); }
						}
						//----- TDの中にフォームが納まっている場合
						else if( form[n].tagName == 'FORM' ){
	//					form[n].elements[0].onchange = function(){ eventAdd_tableTrSelect_( this, set_on, set_off ); }
							form[n].elements[0].onchange = function(){ eventAdd_tableTrSelect_run( this, set_on, set_off ); }
						}
					}
				}
			}
		}
	}
}

function eventAdd_tableTrSelect_run( set_obj, set_on, set_off ){
	if( set_obj == undefined ) return;
	if( set_obj == null ) return;
	var trObj = null;

	var temp = set_obj.className.split( ' ' );
	var onFlag = 0; // onクラス設定判定フラグ

	//----- 対象がTRなら切り替える
	if( set_obj.tagName == 'TD' ){
		trObj = set_obj.parentNode;
		var temp = trObj.className.split( ' ' );
		var onFlag = 0; // onクラス設定判定フラグ
		for( var i = 0; i < temp.length; i ++ ){
			if( temp[i] == set_on ){
				onFlag = 1;
				temp.splice( i, 1 ); // 設定済みなら削除
			}
		}
		//----- チェックボックスがあれば反転
		var obj = trObj.childNodes;
		for( i in obj ){
//			if( obj[i].tagName != 'TH' && obj[i].tagName != 'TD' ) continue;
			if( obj[i].tagName != 'TD' ) continue;
			var form = obj[i].childNodes;
			for( s in form ){
				if( form[s] == undefined ){ continue; }
				//----- TABLE全体をフォームが囲んでいる場合 2011-05-01
				if( form[s].tagName == 'INPUT' && form[s].getAttribute( 'type' ) == 'checkbox' && form[s].className == 'checkFlipFlop' ){
					form[s].checked = onFlag ? false : true;
				}
				//----- TDの中にフォームが納まっている場合
				else if( form[s].tagName == 'FORM' ){
					form[s].elements[0].checked = onFlag ? false : true;
				}
			}
		}
	}
	//----- 対象がチェックボックスなら、状態を優先  2011-09-05 オブジェクト指定不備を修正
	else if( set_obj.tagName == 'INPUT' && set_obj.getAttribute( 'type' ) == 'checkbox' && set_obj.className == 'checkFlipFlop' ){
		trObj = set_obj.parentNode.parentNode.parentNode;
		onFlag = set_obj.checked ? 0 : 1;
	}

	if( onFlag ){
		temp.push( set_off );
	}
	else {
		temp.push( set_on );
	}
	trObj.className = temp.join( ' ' );
}

