
// ### 注意 ###
// ### prescription.js, usageEditor.jp, groupEditor.js でメソッド名が重複しないこと
// ###########

var _groupName; // Global 変数
var _effect; // Global 変数

var _groupTableArray; // Global 変数
function setGroupTableArray(ln){
	// 文字列形式でもらった ln を基に薬剤テーブルを生成
	_groupTableArray = new Array();
	var records = eval('(' + ln + ')');
	var i, count = records.length;
	for (i=0; i < count; i++){
		var obj = records[i];
		var recObj = new GroupRecordObj(obj);
		if (recObj) _groupTableArray.push(recObj);
	}
}
function groupTableArray(){
	return _groupTableArray;
}
function groupNameArray(){
	// 約束処方名の配列を返す
	var array = new Array();
	var i, count = _groupTableArray.length;
	for (i=0; i < count; i++){
		var obj = _groupTableArray[i];
		array[i] = obj.name;
	}
	return array;
}
function groupObjectForName(key){
	// 約束処方名:key に一致する薬剤オブジェクトを返す
	var array = new Array();
	var i, num, count = _groupTableArray.length;
	for (i=0; i < count; i++){
		var obj = _groupTableArray[i];
		if (isSame(obj.name, key))
			return obj;
	}
	return null;
}
function GroupRecordObj(obj){ // Record Object のコンストラクタ
	var newObj = new Object();
	newObj.code = obj.code; // 21,22,23
	newObj.alias = obj.alias;
	newObj.name = obj.name;
	newObj.generic = obj.generic;
	newObj.dose = obj.dose; // "6"
	if (obj.standard) newObj.dose = obj.standard;
	newObj.unit = obj.unit; // obj.unit = "Tab 日分"
	newObj.handan = obj.handan;
	newObj.min = obj.min;
	newObj.standard = obj.standard;
	newObj.max = obj.max;
	newObj.width = obj.width;
	newObj.effect = obj.effect;
	newObj.memo = obj.memo;
	return newObj;
}

var _selectedName;
function setSelectedGroupName(name){
	_selectedName = name;
}
function selectedGroupName(){
	return _selectedName;
}

///////////////////////////
/// Ajax による処理

function groupRemoved(){
	// サーバから約束処方を削除したレスポンスを表示
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		var ary = value.split("<SEPARATOR>");
		if (ary.length > 1){
			closeGroupEditor();
			document.getElementById("message").innerHTML = trim(ary[1]);
		}
	}
	else 
		document.getElementById("message").innerHTML = "Wait...";
}
function removeGroup(){
	// 約束処方の削除
	var groupName = document.getElementById("groupName").value;
	if (confirm("約束処方( "+groupName+" )を削除していいですか")){
		xmlHttpObject = createXMLHttpRequest(groupRemoved);
		
		if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
			var st = "./priceListServer.php?command=REMOVE_GROUP"
			+ "&groupName=" + groupName;
			xmlHttpObject.open("GET", encodeURI(st), true);
			xmlHttpObject.send(null);
		}
	}
}

function savedGroup(){
	// 約束処方の本格登録依頼に対するサーバからのレスポンスを処理
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		//var value = xmlHttpObject.responseText;
		document.getElementById("message").innerHTML 
			= "約束処方を追加しました";
	} else 
		document.getElementById("message").innerHTML = "Wait...";
}
function saveGroup(){
	// 約束処方の本格登録依頼
	xmlHttpObject = createXMLHttpRequest(savedGroup);
	if (xmlHttpObject){
		// saveData() がセットされる時点で groupName, effect などはまだ入力されて
		// いないので、saveData() が呼ばれてからここで生成する必要がある。
		if (trim(_groupName).length == 0){
			alert("処方名がないので登録できません");
			document.getElementById("message").innerHTML = "";
			return;
		}
		
		var obj = prescriptionObject();
		if (! obj){
			alert("処方内容がないので登録できません");
			document.getElementById("message").innerHTML = "";
			return;
		}
		
		var value = object2json(obj);
		var st = "./priceListServer.php?command=PUT_GROUP"
		+ "&groupName="+_groupName+"&effect="+_effect+"&records="+value;
		//alert(st); //return; //------------
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

function editAsGroup(){
	// 約束処方の名称や薬効を訂正
	xmlHttpObject = createXMLHttpRequest(savedGroup);
	if (xmlHttpObject){
		// saveData() がセットされる時点で groupName, effect などはまだ入力されて
		// いないので、saveData() が呼ばれてからここで生成する必要がある。
		var groupName = document.getElementById("groupName").value;
		var effect = document.getElementById("effect").value;
		var value = contentsOfShohou();
		var st = "./priceListServer.php?command=PUT_GROUP"
		+ "&groupName="+groupName+"&effect="+effect+"&records="+value;
		//alert(st); //return; //------------
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
	
	function contentsOfShohou(groupName){
		// 選択された約束処方の内容を JSON 文字列として返す
		var groupName = selectedGroupName();
		var sourceObj = groupObjectForName(groupName);
		if (!sourceObj){
			alert("(" + groupName + ") に相当する約束処方はありません");
			return;
		}
		
		// memo の " が '&quot;' に encode されているので decode する
		var ary = sourceObj.memo.split("&quot;");
		var memo = ary.join("\"");
		var buff = '{';
		var yakusokuObj = eval('(' + memo + ')');
		for (groupId in yakusokuObj){
			var youhouObj = yakusokuObj[groupId]; // 同じ用法セット
			buff += '"'+groupId+'":{'; // グループID
			var num = 0;
			for (cId in youhouObj){
				var obj = youhouObj[cId]; // 薬剤または用法オブジェクト
				var cd = (obj.code > 120) ? obj.code : num++;
				buff += '"'+cId+'":{'; // 薬剤・用法ID
				buff += '"code":"' + cd + '",';
				buff += '"name":"' + obj.name + '",';
				buff += '"dose":"' + obj.dose + '",';
				buff += '"unit":"' + obj.unit + '"},';
			}
			if (buff.charAt(buff.length - 1) == ",")
				buff = buff.substr(0, buff.length-1);
			buff += '},';
		}
		if (buff.charAt(buff.length - 1) == ",")
			buff = buff.substr(0, buff.length-1);
		buff += '}';
		return buff;
	}
}

function registerdAsGroup(){
	// 約束処方の登録依頼に対するサーバからのレスポンスを処理
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		var ary = value.split("<SEPARATOR>");
		if (ary.length > 1){
			var st = trim(ary[1]);
			if (st.length > 0){
				if (! confirm("この約束処方名は登録済みです。上書きしますか？"))
					return;
			}
			closeGroupEditor();
			saveGroup(); // ここで登録動作を行う
		}
	}
	else {
		document.getElementById("message").innerHTML = "Wait...";
	}
}
function putAsGroup(){
	// 約束処方の登録を依頼
	xmlHttpObject = createXMLHttpRequest(registerdAsGroup);
	if (xmlHttpObject){
		// putAsGroup() がセットされる時点で groupName, effect などは
		// まだ入力されていないので、putAsGroup() が呼ばれてから
		// ここで Global 変数に記憶保持しておく必要がある
		_groupName = document.getElementById("groupName").value;
		_effect = document.getElementById("effect").value;
		
		var groupName = encodeURI(document.getElementById("groupName").value);
		var st = "./priceListServer.php?command=HAS_GROUP"
			+"&groupName="+groupName;
		xmlHttpObject.open("GET", st, true);
		xmlHttpObject.send(null);
	}
}

function loadedGroupList(){
	// HTTP 通信の状態が変化したら呼び出される関数
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("loadedGroupList ---\n"+value);
		var ary = value.split("<SEPARATOR>");
		if (ary.length > 1){
			setGroupTableArray(ary[1]);
			document.getElementById("groupList").innerHTML = groupList();
		}
		document.getElementById("message").innerHTML = "";
	}
	else 
		document.getElementById("groupList").innerHTML = "Loading groupList ...";

	function groupList(){
		// 用法リストを HTML 形式にして返す
		var array = groupNameArray();
		var results = new Array();
		var i, j, count = array.length;
		for (i=j=0; i < count; i++){
			var name = array[i];
			results[j++] = "<A HREF=# onclick=\"clickedGroup('"+name+"')\">"+name+"</A>";
		}
		return results.join("<BR/>");
	}
}
function loadGroupList(){
	// 約束処方すべてをリクエスト
	if (document.getElementById("groupList").innerHTML.length){
		// 約束処方リストを toggle 式に表示・非表示
		setAsRegisterMode();
	} else {
		setAsEdotorMode();

		xmlHttpObject = createXMLHttpRequest(loadedGroupList);
		if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
			var st = "./priceListServer.php?command=GET_LIST"
			+ "&code=120"; // code:120 は約束処方
			//alert(st); //------
			xmlHttpObject.open("GET", st, true);
			xmlHttpObject.send(null);
		}
	}
}

/// Ajax による処理
///////////////////////////


function setAsRegisterMode(){
	// 約束処方の登録モード
	
	// タイトル表示
	document.getElementById("editorLabel").innerHTML = "上の処方を登録";
	
	// 編集モードでの処方内容表示
	document.getElementById("displayArea").innerHTML = "";
	
	// 約束処方名・薬効
	document.getElementById("groupName").value = "";
	document.getElementById("effect").value = "";

	// コントロール・エリア
	var td = document.getElementById("editorControlArea");
	td.innerHTML = "この約束処方を ";
    var bt = newDIV(td, "/whiteButton");
    bt.innerHTML = "登録";
	bt.setAttribute("onclick", "putAsGroup()");
	
	// 約束処方リスト表示エリア
	document.getElementById("groupList").innerHTML = "";
}
function setAsEdotorMode(){
	// 約束処方の編集モード
	
	// タイトル表示
	document.getElementById("editorLabel").innerHTML = "約束処方の編集";
	
	// 編集モードでの処方内容表示
	var st = "処方内容の編集はここではできません<br>";
    st += "上の領域で作成し登録してください。<br/>";
	st += "＊ 処方を以下のリストから選択してください";
	document.getElementById("displayArea").innerHTML = st;
    
	// 約束処方名・薬効
	document.getElementById("groupName").value = "";
	document.getElementById("effect").value = "";
	
	// コントロール・エリア
	var td = document.getElementById("editorControlArea");
	td.innerHTML = "この約束処方を ";
    var bt = newDIV(td, "/whiteButton");
    bt.innerHTML = "削除";
	bt.setAttribute("onclick", "removeGroup()");
    var bt = newDIV(td, "/whiteButton");
    bt.innerHTML = "確定";
	bt.setAttribute("onclick", "editAsGroup()");
}

function clickedGroup(item){
	// 約束処方内容を確認
	var obj = groupObjectForName(item);
	document.getElementById("groupName").value = item;
	document.getElementById("effect").value = obj.effect;
	setSelectedGroupName(item); // 編集用に選択された約束処方名を記憶
	// memo の " が '&quot;' に encode されているので decode する
	var ary = obj.memo.split("&quot;");
	var memo = ary.join("\"");
	//alert(memo); //##
	var recs = new Array();
	var yakusokuObj = eval('(' + memo + ')');
	for (groupId in yakusokuObj){
		var subObj = yakusokuObj[groupId];
		//alert("== groupId"+groupId); //##
		for (cId in subObj){
			var recObj = subObj[cId];
			if (recObj.code > 120)
				var ln = "--- "+recObj.name+" ("+recObj.dose+" "+recObj.unit+")";
			else
				var ln = recObj.name+" ("+recObj.dose+" "+recObj.unit+")";
			recs.push(ln);
		}
	}
	document.getElementById("displayArea").innerHTML = recs.join("</BR>");
}

function closeGroupEditor(){
	document.getElementById("editorArea").innerHTML = "";
}

function showGroupEditor(){
	// 約束処方編集ペーンを開く
	var elm = document.getElementById("editorArea");
	if (elm.innerHTML.length > 0){
		elm.innerHTML = "";
		return;
	}
    
    var frame = newDIV(elm, "templateFrame");

    // HEADER
    var div = newDIV(frame, "/clearfix");
    div.style.paddingBottom = "5px";
	var im = newIMAGE(div,"icon","./close.png","close");
    im.style.height = "14px";
	im.setAttribute("onclick", "closeGroupEditor()");
    var dv = newSPAN(div, "editorLabel");
    
	// 約束処方名入力
    var div = newDIV(frame, "");
	var fd = newFIELD(div, "groupName", "約束処方名", 15, "");
	var fd = newFIELD(div, "effect", "薬効", 15, "");
    
	// controls
    var div = newDIV(frame, "editorControlArea");
    
	// アンカー・エリア
    var div = newDIV(frame, "");
	var a = newA(div, "約束処方の編集", "#", "");
	a.setAttribute("onclick", "loadGroupList()");
	a.style.fontSize = "10pt";
	
	// 編集モードにおける約束処方表示エリア
    var div = newDIV(frame, "displayArea");
    
	// 用法表示エリア
    var div = newDIV(frame, "groupList");
	
	document.getElementById("message").innerHTML = "";
	setAsRegisterMode();
}
