
var _staffs;
function setStaffList(array){
	_staffs = array;
}
function addSaffList(name){
	for (var i=0,ct=_staffs.length; i < ct; i++){
		if (_staffs[i] == name) return _staffs;
	}
	_staffs.splice(ct-2,0,name);
	return _staffs;
}
function staffList(){
	return _staffs;
}

var _staffRecord;
function setStaffRecord(rec){
    //alert("setStaffRecord->"+encodeObject(rec)); //##
    var code = rec.sectionCode; // 部署コード = "23" 形式
    
	_staffRecord = rec;
}
function staffRecord(){
	return _staffRecord;
}
function staffValueForKey(key){
	return _staffRecord[key];
}
function setStaffValueForKey(val, key){
	_staffRecord[key] = val;
}

function MML0026(){
	// 記録者分類および医療資格コード: groupCode
	return { "doctor":"医師","dentist":"歯科医師","nurse":"看護師","assistantNurse":"准看護師","lab":"臨床検査技師","rad":"レントゲン技師","pharmacist":"薬剤師","pt":"理学療法士","ot":"作業療法士","psy":"精神保健福祉士","cps":"臨床心理技術者","nutritionist":"栄養士","dentalHygienist":"歯科衛生士","dentalTechician":"歯科技工士","clinicalEngineer":"臨床工学士","careManager":"介護支援専門員","other":"その他の医療従事者","acupuncturist":"鍼灸師","patient":"患者およびその代理人","clerk":"書記","office worker":"事務" };
}

function MML0028(){
	// 医科診療科コード: sectionCode
	return { "01":"内科","02":"精神科","03":"神経科","04":"神経内科","05":"呼吸器科","06":"消化器科","07":"胃腸科","08":"循環器科","09":"小児科","10":"外科","11":"整形外科","12":"形成外科","13":"美容外科","14":"脳神経外科","15":"呼吸器外科","16":"心臓血管外科","17":"小児外科","18":"皮膚泌尿器科","19":"皮膚科","20":"泌尿器科","21":"性病科","22":"肛門科","23":"産婦人科","24":"産科","25":"婦人科","26":"眼科","27":"耳鼻咽喉科","28":"気管食道科","29":"理学療法科","30":"放射線科","31":"麻酔科","32":"人工透析科","33":"心療内科","34":"アレルギー","35":"リウマチ","36":"リハビリ","A1":"鍼灸","00":"その他" };
}

function MML0034(){
    // アクセス許可区分: userCode に割り振る
    return { "none":"すべてのアクセスを不許可","read":"参照を許可","write":"参照，修正を許可","delete":"参照，削除を許可","all":"修正，削除を許可" }
}

////////////////////////////////////////////////////
///// Ajax /////////////////////////////////////////

var _loadedKanjiName;
function gotStaffList(){
	// 職員リストを表示
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("gotStaffList ===\n"+value);//###
        
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			var obj = eval('(' + array[1] + ')');
			var items = new Array();
            for (i in obj){
				var rec = obj[i];
				items.push(rec.kanjiName);
			}
			//alert("gotStaffList ===\n"+encodeObject(items));//###
			setStaffList(items);
			items.splice(0,0,"");
			items.push("...その他");

            //alert("gotStaffList->"+encodeObject(items));//###

			// 職員リストを表示
			showStaffPopup(items);
		}
		hideMessage("_message");
	}
	else
		showMessage("_message", "get staffList ...");
}
function getStaffList(kanjiName){
	// 職員リストを DB へリクエスト
	xmlHttpObject = createXMLHttpRequest(gotStaffList);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		var array = new Array();
        array['hospitalId'] = hospitalId();
		
		var st = "./sysServer.php?command=GET_USERS"
		+ "&value=" + encodeObject(array);
		//alert("getStaffList ===\n"+st); return; //###
        
        _loadedKanjiName = kanjiName;
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

var _isNew;
function gotStaff(){
	// 職員のレコードを表示
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("gotStaff ===\n"+value);//###
        
		var array = value.split("<SEPARATOR>");
		if (array.length == 2){
			var record = JSON.parse(array[1]);
			record.hospitalId = hospitalId();
			setStaffRecord(record);
			
			// スタッフ編集パネルを開く
			showStaffEditor(record, _isNew);
			
			// 職員リストのポップアップを更新
			var kanjiName = record.kanjiName;
			var items = staffList();
			if (indexOfArray(items, kanjiName) < 0){
				var pos = items.length - 1;
				items.splice(pos, 0, kanjiName);
				showStaffPopup(items);
			}
		} else if (array.length > 2){
			// loginName 重複エラー
			alert(array[1]);
		}
		hideMessage("_message");
	} else
		showMessage("_message", "get staffs ...");
}
function getStaff(name, isNew){
	// スタッフのレコードを DB へリクエスト
	xmlHttpObject = createXMLHttpRequest(gotStaff);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		var array = new Array();
		array['hospitalId'] = hospitalId();
		array['kanjiName'] = name;
		if (isNew) array['isNew'] = 1;
		var val = encodeObject(array);
        
		var st = "./sysServer.php?command=GET_USER"
		+ "&value=" + encodeSTRING(val);
		//alert(st); //return; //##
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

function savedStaff(){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
        //alert("savedStaff->"+value); //##
        
        // 職員ポップアップを再読み込み kanjiName を選択し、その編集ペーンを開く
        var rec = staffRecord();
        getStaffList(rec.kanjiName);
	}
}
function saveStaff(){
	// スタッフのレコードを DB へ保存
	var rec = staffRecord();
	if (incompleteStaffInfo(rec)) return;
	
	xmlHttpObject = createXMLHttpRequest(savedStaff);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		// rec は $row そのもので key に番号も入っているので文字指定で取り出す
		var array = new Array();
		array['userCode'] = rec['userCode']; // ACCESS CODE
		//array['userCode'] = 4; // 読み書き可に決め打ち
		array['sectionCode'] = rec['sectionCode'];
		array['groupCode'] = rec['groupCode'];
		array['loginName'] = rec['loginName'];
		array['kanjiName'] = rec['kanjiName'];
        if (rec['identifier'])
            array['identifier'] = rec['identifier'];
		array['hospitalId'] = hospitalId();
		array['memo'] = rec['memo'];
		array['entryDate'] = rec['entryDate'];
		array['updateTime'] = rec['updateTime'];
		array['owner'] = owner();
		var val = encodeObject(array);
		
		var st = "./sysServer.php?command=PUT_USER"
		+ "&value=" + encodeSTRING(val);
        //alert("saveStaff ===\n"+st); return; //##

		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
	
	function incompleteStaffInfo(rec){
		// スタッフ情報の入力内容が不十分なら true を返す
		if (!rec.sectionCode || (rec.sectionCode.length == 0)){
			alert("「部署」が空欄なので保存できません");
			return true;
		} else if (!rec.groupCode || (rec.groupCode.length == 0)){
			alert("「職種」が空欄なので保存できません");
			return true;
		} else if (!rec.kanjiName || (rec.kanjiName.length == 0)){
			alert("「氏名」が空欄なので保存できません");
			return true;
		} else if (!rec.loginName || (rec.loginName.length == 0)){
			alert("「ログイン名」が空欄なので保存できません");
			return true;
		}
		return false;
	}
}

function removeStaff(loginName){
	// スタッフのレコードを DB から削除
	if (!confirm(loginName + " を登録職員から削除していいですか")) return;
	
	xmlHttpObject = createXMLHttpRequest(gotStaffList);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		var array = new Array();
        array['hospitalId'] = hospitalId();
        array['loginName'] = loginName;
		
		var st = "./sysServer.php?command=REMOVE_USER"
		+ "&value=" + encodeObject(array);
		//alert(st); //return; //##
		
		// 編集エリアを削除
		document.getElementById("staffEditorArea").innerHTML = "";
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

///// Ajax /////////////////////////////////////////
////////////////////////////////////////////////////



function showStaffHelp(){
	var elm = document.getElementById("staffHelpArea");
    if (elm.innerHTML.length){
        elm.innerHTML = "";
    } else {
        elm.innerHTML = "";
        var st = "職員を選択し編集してください。新規に職員を登録するには「...その他」を選択します。<br>　ログイン名を変更した場合、旧ログイン名のユーザ情報はそのまま残り<br>　新たなログイン名で新規ユーザとして別個に追加されます。";
        var sp = newSPAN(elm, "");
        sp.innerHTML = st;
        sp.style.color = "#a63"; // brown
        sp.style.padding = "5px 10px";
    }
}

function changeStaffValue(key){
    // key に対応する staffValue を更新し「保存」ボタンを表示
    if (key == "loginName")
        var val = document.getElementById("stf."+key).value;
    else if (key == "userCode")
        var val = document.getElementById("stf."+key).value;
    else
        var val = document.getElementById("stf."+key).innerHTML;
	setStaffValueForKey(val, key);
	
	var elm = document.getElementById("saveStaffButtonArea");
	elm.innerHTML = "";
	var bt = newBUTTON(elm, "", "保存");
	bt.setAttribute("onclick", "saveStaff()");
}

function clickedStaffList(elm){
    // 職員名がポップアップから選択された
	var name = elm.value;
	if (name.length == 0){
		document.getElementById("staffEditorArea").innerHTML = "";
		return;
	} else if (name == "...その他"){
		var array = hospitalIdTableInDB();
		var hid = hospitalId();
		if (indexOfArray(array, hid) < 0){
			alert("施設ID：" + hid + " がサーバに保存されていないので、その施設の職員を登録することはできません");
		} else {
			var name = window.prompt("スタッフ名（漢字）を入力してください","");
			if (name.length == 0) return;
			getStaff(name, true);
		}
	} else {
		getStaff(name, false);
    }
}
function showStaffPopup(items, kanjiName){
	// 職員リストを表示（kanjiName が存在すればその名前を選択）
    var elm = document.getElementById("staffInfoArea");
    elm.innerHTML = "";
//    alert("showStaffPopup ->"+items+"->"+elm);//###

    // 職員ポップアップ・エリア
    var dv = newDIV(elm, "yellow-bar");
    var sp = newSPAN(dv, "");
    sp.style.paddingRight = "5px";
    sp.innerHTML = "職員 ID";
    // 職員ポップアップ
    var sp = newSPAN(dv, "staffPopUpArea");
    sp.style.paddingRight = "5px";
    var item = (kanjiName) ? kanjiName : "";
	var pu = makePopupMenu(sp, "", items, item);
	pu.setAttribute("onchange", "clickedStaffList(this)");
    // ヘルプ・アンカー
    var a = newA(dv, "職員の登録について", "#", "");
    a.setAttribute("onclick", "showStaffHelp()");
    a.style.fontSize = "9pt";
    a.style.paddingLeft = "10px";
        
    // ヘルプ・エリア
    var dv = newDIV(elm, "staffHelpArea");
    
	// 職員編集エリア
    var dv = newDIV(elm, "staffEditorArea");

    if (kanjiName){
        // kanjiName があればその編集ペーンを開く
        getStaff(kanjiName);
    }
}

function clickedSectionCode(elm, key){
	// 診療科コードのポップアップメニューがクリックされた
	var name = elm.value;
	var table = MML0028();
	var code = "";
	for (cd in table){
		if (name == table[cd]){
			code = cd;
			break;
		}
	}
	document.getElementById("stf." + key).innerHTML = code;
	changeStaffValue(key);
}
function makeSectionCode(tbl, key, label, record){
	// 診療科コードのポップアップメニューを生成
    //alert("makeSectionCode->"+encodeObject(record)); //##
    
	var tr = newTR(tbl, "", "");
	var td = newTD(tr, "", label);
	td.style.padding = "0px 5px";
	var td = newTD(tr, "", "");
	var items = new Array();
	var table = MML0028();
	items.push("");
	for (cd in table){
		items.push(table[cd]);
	}
	var val = "";
	var code = "";
	if (record){
		if (record.sectionCode){
			code = record.sectionCode;
			val = table[code];
		}
	}
    // 職種ポップアップ
	var pu = makePopupMenu(td, "", items, val);
	pu.setAttribute("onchange", "clickedSectionCode(this,'" + key + "')");
    
    // 職種入力欄
    var sp = newSPAN(td, "stf." + key);
    sp.style.paddingLeft = "10px";
    sp.innerHTML = code;
}

function clickedGroupCode(elm, key){
	// 医療資格コードのポップアップメニューがクリックされた
	var name = elm.value;
	var table = MML0026();
	var code = "";
	for (cd in table){
		if (name == table[cd]){
			code = cd;
			break;
		}
	}
	document.getElementById("stf." + key).innerHTML = code;
	changeStaffValue(key);
}
function makeGroupCode(tbl, key, label, record){
	// 医療資格コードのポップアップメニューを生成
	var tr = newTR(tbl, "", "");
	var td = newTD(tr, "", label);
	td.style.padding = "0px 5px";
	var td = newTD(tr, "", "");

	var items = [""];
	var table = MML0026();
	for (cd in table){
		items.push(table[cd]);
	}
	var val = "";
	var code = "";
	if (record){
		if (record.groupCode){
			code = record.groupCode;
			val = table[code];
		}
	}
	var pu = makePopupMenu(td, "", items, val);
	pu.setAttribute("onchange", "clickedGroupCode(this,'" + key + "')");
    var sp = newSPAN(td, "stf." + key);
    sp.style.paddingLeft = "10px";
    sp.innerHTML = code;
}

function clickedUserCode(elm, key){
	// アクセス許可区分のポップアップメニューがクリックされた
	var name = elm.value;
	var table = MML0034();
	var code = "";
	for (cd in table){
		if (name == table[cd]){
			code = cd;
			break;
		}
	}
	document.getElementById("stf." + key).value = code;
//	document.getElementById("stf." + key).innerHTML = code;
	changeStaffValue(key);
}
function makeUserCode(tbl, key, label, record){
	// アクセス許可区分のポップアップメニューを生成: userCode に割り振る
	var tr = newTR(tbl, "", "");
	var td = newTD(tr, "", label);
	td.style.padding = "0px 5px";
	var td = newTD(tr, "", "");

	var items = [""];
	var table = MML0034();
	for (cd in table){
		items.push(table[cd]);
	}
	var val = "";
	var code = "";
	if (record){
		if (record.userCode){
			code = record.userCode;
			val = table[code];
		}
	}
	var pu = makePopupMenu(td, "", items, val);
	pu.setAttribute("onchange", "clickedUserCode(this,'" + key + "')");
    var sp = newSPAN(td, "");
    sp.style.paddingLeft = "10px";
    var fd = newFIELD(td, "stf." + key, "", 20, code);
    fd.setAttribute("onchange", "changeStaffValue('" + key + "')");
    //var sp = newSPAN(td, "stf." + key);
    //sp.innerHTML = code;
}

function removePasswd(){
    // パスワードを削除
    _staffRecord.identifier = "";
    saveStaff();
}

function showStaffEditor(record, isNew){
    // 職員情報編集パネルを開く
	//alert("showStaffEditor:"+encodeObject(record)); //##
    
    // 施設情報編集パネルを閉じる
    document.getElementById("hospitalEditorArea").innerHTML = "";
    
	var elm = document.getElementById("staffEditorArea");
	elm.innerHTML = "";
	var tbl = newTABLE(elm, "base-table");
	tbl.style.fontSize = "10pt";
	tbl.style.marginTop = "5px";
	
	if (!record)
		record.hospitalInfo = hospitalId();
    
	// contents
	makeStaffValue(tbl, "kanjiName", "氏名（漢字）", record);
	makeStaffValue(tbl, "loginName", "ログイン名 (アルファベット)", record, "");
    
    // パスワード
	var tr = newTR(tbl, "", "");
	var td = newTD(tr, "", "パスワード");
    td.style.padding = "0px 5px";
    td.style.width = "220px";
	var td = newTD(tr, "", "");
    if (record.identifier){
        td.innerHTML = "設定済みパスワードを ";
        var bt = newBUTTON(td, "", "削除");
        bt.setAttribute("onclick", "removePasswd()");
    } else {
        td.innerHTML = "未設定";
    }
	var tr = newTR(tbl, "passwordHelpArea", "");
    showPasswordHelp();

	makeSectionCode(tbl, "sectionCode", "部署", record);
	makeGroupCode(tbl, "groupCode", "職種", record);
	makeUserCode(tbl, "userCode", "アクセス許可区分", record);
	var tr = newTR(tbl, "authorityHelpArea", "");
    showAuthoritydHelp();
    
    // ### 暫定ヘルプ ###
	var tr = newTR(tbl, "", "");
    var td = newTD(tr, "", "");
    var td = newTD(tr, "", "");
    td.innerHTML = "アクセス許可区分は手でも修正できますが、通常はポップアップメニューからの選択に従ってください。旧バージョンNOAを使う場合のみ、ここに半角数値の 1 を入れると全権限を持つ設定になります。";
    td.style.padding = "10px 0px 0px 20px";
    td.style.fontSize = "9pt";
    td.style.color = "#888"; //brown
    // ### 暫定ヘルプ ###
	
	makeStaffValue(tbl, "memo", "メモ", record);
    
    makeStaffInfo(tbl, "登録年月日", record["entryDate"]);
    makeStaffInfo(tbl, "更新年月日", record["updateTime"]);
    makeStaffInfo(tbl, "オーナー", owner());

    var div = newDIV(elm, "yellow-bar");
	var bt = newBUTTON(div, "", "このユーザを削除");
	bt.setAttribute("onclick", "removeStaff('" + record['loginName'] + "')");
	var sp = newSPAN(div, "saveStaffButtonArea");
	
	function makeStaffValue(tbl, key, label, record, comment, disabled){
		var tr = newTR(tbl, "", "");
		var td = newTD(tr, "label-left", label);
		var val = "";
		if (record){
			if (record[key])
				val = record[key];
			else
				record[key] = ""; // record の値未設定なら空値で補完
		}
		
		var td = newTD(tr, "", "");
		if (key == "loginName"){
            var fd = newFIELD(td, "stf." + key, "", 20, val);
            fd.setAttribute("onchange", "changeStaffValue('" + key + "')");
            fd.focus();
        } else {
            var sp = newSPAN(td, "stf." + key);
            sp.innerHTML = val;
        }

		if (comment){
			td.style.color = "#a63"; //brown
			var tx = newTEXT(td, comment);
		}
		
		return td;
	}

	function makeStaffInfo(tbl, key, value){
		var tr = newTR(tbl, "", "");
		var td = newTD(tr, "label-left", key);
		var td = newTD(tr, "", value);
    }
    
    function showPasswordHelp(){
        // パスワード設定の説明
        var tr = document.getElementById("passwordHelpArea");
        var td = newTD(tr, "", "");
        var td = newTD(tr, "", "");
        td.innerHTML = "　パスワードの設定はここでは行いません。初回ログイン時にパスワード設定パネルが開き、そこで設定できます。<br>　既存のパスワードを変更したい場合のみ、ここで「パスワードを削除」してください。そうすると再びログイン時にパスワードを新規設定できます。";
        td.style.fontSize = "10pt";
        td.style.color = "#a63"; //brown
    }
    
    function showAuthoritydHelp(){
        // パスワード設定の説明
        var tr = document.getElementById("authorityHelpArea");
        var td = newTD(tr, "", "");
        var td = newTD(tr, "", "");
        td.innerHTML = "　NOA や FRONT の管理者には必ず「修正 削除を許可」の権限を与えてください。この権限がないと NOA や FRONT のレイアウト設定をすることができません。通常は NOA をインストール・メンテナンスする人が管理者になると思います。<br>　NOA の基本設定にタッチして欲しくないユーザは「参照、修正を許可」などの権限とします。";
        td.style.fontSize = "10pt";
        td.style.color = "#a63"; //brown
    }
}

function closeStaffInfo(){
    var elm = document.getElementById("staffInfoArea");
    elm.innerHTML = "";
}

