<?php
	
function leftBrackets(){
	// $leftBrackets = "\^\[\^" では誤作動
	return "^[^"; // encode 中で使う '(' -- クライアント側との約束 lib.js
}
function rightBrackets(){
	return "^]^"; // encode 中で使う '(' -- クライアント側との約束 lib.js
}
function decodeObject($buff){
	// "key(value)" 形式の文字列を OBJECT に decode して返す
	$obj = array();
	//	echo "decodeObject ===\n$buff\n"; //##
	for ($p=$begin=$nest=0, $len=strlen($buff); $p < $len; $p++){
		$ch = substr($buff, $p, 1);
		if (strcmp($ch, "(") == 0){
			if ($nest == 0){
				$key = trim(substr($buff, $begin, $p - $begin)); // key 終端
				$begin = $p + 1; // value 開始位置
			}
			$nest++;
		} else if (strcmp($ch, ")") == 0){
			if (--$nest == 0){
				if ($nest == 0){
					// value 終端 ( trim しない )
					$value = substr($buff,$begin,$p-$begin);
					$begin = $p + 1; // key 開始位置
				}
				if (ereg(")", $value)){ // まだ入れ子になっているなら
					$obj[$key] = decodeObject($value);
				} else {
					// 特定文字を "(", ")" へ戻す
					$array = explode(leftBrackets(), $value);
					$value = join("(", $array);
					$array = explode(rightBrackets(), $value);
					$value = join(")", $array);
					
					$obj[$key] = $value;
				}
				//echo "$key{".$obj[$key]."}\n"; //##
			}
		}
	}
	return $obj;
}

function putMenuItem($tag, $owner, $menuItem){
	// MenuTable をアップデート
	if (strlen($menuItem)){
		$sql = "SELECT * FROM `MenuTable`
			WHERE `tag`='$tag' AND `menu`='$menuItem'";
		$result=mysql_query($sql);
		$update = date("Y-m-d H:i:s",time());
		if (mysql_num_rows ($result) > 0){	// 同じ menuItem が存在した
			$row=mysql_fetch_array($result);
			$rowid = $row['rowid'];
			// menuItem は同じなので freq のみ更新
			$freq = $row['freq'] + 1; // 頻度をインクリメント
			$sql = "UPDATE `MenuTable` 
				SET `freq`='$freq',`updateTime`='$update'
				WHERE `rowid`=$rowid";
		} else {							// 同じ menuItem が存在しなかった
			$sql = "INSERT INTO `MenuTable` 
				( `tag`, `freq`, `menu`, `value`, `updateTime`, `owner` )
				VALUES ( '$tag','0','$menuItem','$value','$update','$owner')";
		}
		mysql_query($sql);
		
		// 変更結果を返す
		echo "\n===== $menuItem について以下の更新をしました =====\n";
		echo $sql;
	}
}

function putDocumentItem($tag, $owner, $docName, $json, $doUpdate){
	// 文書テンプレートをアップデート
	if (strlen($docName)){
		$sql = "SELECT * FROM `MenuTable`
		WHERE `tag`='$tag' AND `menu`='$docName' AND `owner`='$owner'";
		$result=mysql_query($sql);
		$update = date("Y-m-d H:i:s",time());
		if (mysql_num_rows ($result) > 0){	// 同じ docName が存在した
			$row=mysql_fetch_array($result);
			$rowid = $row['rowid'];
			$freq = $row['freq'] + 1; // 頻度をインクリメント
			if ($doUpdate){
				// 内容も更新
				$sql = "UPDATE `MenuTable` 
				SET `value`='$json',`freq`='$freq'
				,`updateTime`='$update'
				WHERE `rowid`=$rowid";
			} else {
				// 頻度のみ更新
				$sql = "UPDATE `MenuTable` 
				SET `freq`='$freq',`updateTime`='$update'
				WHERE `rowid`=$rowid";
			}
		} else {							// 同じ menuItem が存在しなかった
			$sql = "INSERT INTO `MenuTable` 
			( `tag`,`freq`,`menu`,`value`,`updateTime`,`owner` )
			VALUES 
			( '$tag','0','$docName','$json','$update','$owner')";
		}
		mysql_query($sql);
		echo "\n====== $docName について以下の更新をしました =====\n";
		echo "$sql =====\n";
	}
}

function overWriteDocumentItem($tag, $owner, $docName, $json){
	// 文書テンプレートを上書き
	if (strlen($docName)){
		$sql = "SELECT * FROM `MenuTable`
		WHERE `tag`='$tag' AND `menu`='$docName'";
		$result=mysql_query($sql);
		$update = date("Y-m-d H:i:s",time());
		if (mysql_num_rows ($result) > 0){	// 同じ menuItem が存在した
			$row=mysql_fetch_array($result);
			$rowid = $row['rowid'];
			$freq = $row['freq'] + 1; // 頻度をインクリメント
			$sql = "UPDATE `MenuTable` 
			SET `value`='$json',`freq`='$freq',`updateTime`='$update'
			WHERE `rowid`=$rowid";
		} else {							// 同じ menuItem が存在しなかった
			$sql = "INSERT INTO `MenuTable` 
			( `tag`, `freq`, `menu`, `value`, `updateTime`, `owner` )
			VALUES ( '$tag','0','$docName','$json','$update','$owner')";
		}
		mysql_query($sql);
		
		// 変更結果を返す
		echo "\n===== $docName を上書き =====\n";
		echo $sql;
	}
}

function decodeSTRING($val){
	// #, &, +  < > などが URI 送信で化けるため encode して送られたものを decode
	$array = explode("%x0;", $val);
	$val = implode("#", $array);
	$array = explode("%x1;", $val);
	$val = implode("&", $array);
	$array = explode("%x2;", $val);
	$val = implode("+", $array);
	$array = explode("%x3;", $val);
	$val = implode("<", $array);
	$array = explode("%x4;", $val);
	$val = implode(">", $array);
	$array = explode("%x5;", $val);
	$val = implode(" ", $array);
	$array = explode("%x6;", $val);
	$val = implode("\n", $array);
	$array = explode("%x7;", $val);
	$val = implode("\"", $array);
	$array = explode("%x8;", $val);
	$val = implode("$", $array);
	$array = explode("%x9;", $val);
	$val = implode("\'", $array);
	return $val;
}
	
function getTimeStampStatus($owner){
	// owner の MenuTable から timeStampStatus を返す
	$sql = "SELECT * FROM `MenuTable` 
	WHERE `menu`='DocMaker.timeStampStatus' 
	AND `owner`='$owner'";
	$result=mysql_query($sql);
	echo "$sql ======\n\n"; //##
	
	$row = mysql_fetch_array($result);
	return ($row) ? $row['value'] : "0";
}
	
	
	
$command = $_GET['command']; $command=htmlspecialchars($command);
$patientId = $_GET['patientId']; $patientId=htmlspecialchars($patientId);
$tag = $_GET['tag']; $tag=htmlspecialchars($tag);
$target = $_GET['target']; $target=htmlspecialchars($target);
$owner = $_GET['owner']; $owner=htmlspecialchars($owner);
$value = $_GET['value']; $value=htmlspecialchars($value);
//$value = decodeSTRING($value); // lib.php

// DB を開いて該当レコードを読み込む
// ### セキュリティーを保つには、以下のファイルを外からアクセスできない 
// ### directory に置き、以下の cfg.php の相対パスをそこへ変更
require_once('../XNOA/cfg.php');

$dbc = mysql_connect($db['host'], $db['user'], $db['pwd']);
$db_select=mysql_select_db($db['dbname']);
mysql_query("set names utf8");

if (strcmp($command,"PUT_DOCUMENT") == 0){
	// owner, value
	// 宛先メニュー・アイテム、文書テンプレートを登録
	echo "<SEPARATOR>";
	$array = decodeObject($value);
	$owner = $array["owner"];
	$address = $array["address"];
	$docName = $array["documentName"];
	// 以下は JSON 形式 {"greetings":"foo,,","haPatInfo":"on","contents":"bar,,"} 
	$contents = $array["contents"];

	if ($address){
		// 宛先メニューをアップデート
		putMenuItem("UniversalSection.documentAddress", $owner, $address);
	}
	if ($docName){
		// 文書テンプレートをアップデート
		// '"' が URL 転送により '&quot;' になっているので、元へ戻す
		$contents = str_replace("\\&quot;", "\"", $contents);
		// 改行が含まれた JSON は javascript の eval() で正常に展開されない
		$contents = str_replace("\n", "<br/>", $contents);
		putDocumentItem("UniversalSection.documentName", 
						$owner, $docName, $contents, FALSE);
	}
	echo "<SEPARATOR>";
	echo "文書を保存しました";
} else if (strcmp($command,"OVERWRITE_DOCUMENT") == 0){
	// owner, value
	// 文書テンプレートを登録あるいは上書き
	echo "<SEPARATOR>";
	$array = decodeObject($value);
	$owner = $array["owner"];
	$docName = $array["documentName"];
	// 以下は JSON 形式 {"greetings":"foo,,","haPatInfo":"on","contents":"bar,,"} 
	$contents = $array["contents"];

	echo "docName($docName) \n";
	if ($docName){
		// 文書テンプレートをアップデート
		// '"' が URL 転送により '&quot;' になっているので、元へ戻す
		$contents = str_replace("\\&quot;", "\"", $contents);
		// 改行が含まれた JSON は javascript の eval() で正常に展開されない
		$contents = str_replace("\n", "<br/>", $contents);
		putDocumentItem("UniversalSection.documentName", 
						$owner, $docName, $contents, TRUE);
	}
} else if (strcmp($command,"GET_TEMPLATE") == 0){
	// 文書名に該当するテンプレートを返す
	$array = decodeObject($value);
	$owner = $array["owner"];
	$docName = $array["documentName"];

	$sql = "SELECT * FROM `MenuTable`
	WHERE `tag`='UniversalSection.documentName' 
	AND `menu`='$docName' AND `owner`='$owner'
	ORDER BY `freq` DESC";
	$result=mysql_query($sql);
	echo "$sql ======\n\n"; //##

	if (mysql_num_rows ($result) == 0){
		// ### private なデータがない場合は public を使う
		$sql = "SELECT * FROM `MenuTable`
		WHERE `tag`='UniversalSection.documentName' 
		AND `menu`='$docName' AND `owner`='public'
		ORDER BY `freq` DESC";
		$result=mysql_query($sql);
		echo "$sql ======\n\n"; //##
	}
	
	$row = mysql_fetch_array($result);
	echo "<SEPARATOR>";
	echo $row['value'];
} else if (strcmp($command,"PUT_MENU") == 0){
	// tag, onwer に該当するメニュー・リストを DB へ保存
	$args = decodeObject($value);
	// client 側との約束ごと
	$menu = $args['menu'];
	$owner = $args['owner'];
	$val = $args['val'];
	
	echo "menu($menu) val($val)\n"; //####
	
	$sql = "SELECT * FROM `MenuTable` 
	WHERE `menu`='$menu' AND `owner`='$owner'";
	echo "$sql ========\n"; //###
	$result=mysql_query($sql);
	if (mysql_num_rows ($result) > 0){	// 同じ menuItem が存在した
		$sql = "UPDATE `MenuTable` 
		SET `value`='$val'
		WHERE `menu`='$menu' AND `owner`='$owner'";
	} else { // 同じ menuItem が存在しなかった
		$sql = "INSERT INTO `MenuTable` 
		( `tag`,`freq`,`menu`,`value`,`public`,`updateTime`,`owner` )
		VALUES ( '','','$menu','$val','','','$owner')";
	}
	echo "$sql ========\n"; //###
	mysql_query($sql);

	// timeStampStatus を返す
	$records = array();
	$records['timeStampStatus'] = getTimeStampStatus($owner);
	$array = getMenuItems($menu, $owner);
	echo "<SEPARATOR>";
	echo json_encode($array);
} else if (strcmp($command,"GET_MENU") == 0){
	// 宛先メニュー、文書メニュー、timeStampStatus を返す
	$records = array();

	///// 宛名メニュー内容を抽出 /////
	$array = array();
	// まず public から読込む
	$sql = "SELECT * FROM `MenuTable` 
	WHERE `tag`='UniversalSection.documentAddress' 
	AND `owner`='public'
	ORDER BY `freq` DESC";
	$result=mysql_query($sql);
	echo "$sql ======\n"; //##
	
	while( $row = mysql_fetch_array($result)){
		$val = $row['menu'];
		$array[$val] = $row['owner'];
	}
	
	// 次に owner のメニューを読込み 同じものがあれば public を上書き
	$sql = "SELECT * FROM `MenuTable` 
	WHERE `tag`='UniversalSection.documentAddress' 
	AND `owner`='$owner'
	ORDER BY `freq` DESC";
	$result=mysql_query($sql);
	echo "$sql ======\n\n"; //##
	
	while( $row = mysql_fetch_array($result)){
		$val = $row['menu'];
		$array[$val] = $row['owner'];
	}
	$records['documentAddress'] = $array;
	
	///// 文書メニュー内容を抽出 /////
	$array = array();
	// まず public から読込む
	$sql = "SELECT * FROM `MenuTable` 
	WHERE `tag`='UniversalSection.documentName' 
	AND `owner`='public'
	ORDER BY `freq` DESC";
	$result=mysql_query($sql);
	echo "$sql ======\n"; //##

	while( $row = mysql_fetch_array($result)){
		$val = $row['menu'];
		$array[$val] = $row['owner'];
	}
	
	// 次に owner のメニューを読込み 同じものがあれば public を上書き
	$sql = "SELECT * FROM `MenuTable` 
	WHERE `tag`='UniversalSection.documentName' 
	AND `owner`='$owner'
	ORDER BY `freq` DESC";
	$result=mysql_query($sql);
	echo "$sql ======\n\n"; //##
	
	while( $row = mysql_fetch_array($result)){
		$val = $row['menu'];
		$array[$val] = $row['owner'];
	}
	$records['documentName'] = $array;
	
	// timeStampStatus を返す
	$records['timeStampStatus'] = getTimeStampStatus($owner);
	
	echo "<SEPARATOR>";
	echo json_encode($records);
} else if (strcmp($command,"REMOVE_MENU_ITEM") == 0){
	// tag, value
	$array = decodeObject($value);
	$tag = $array["tag"];
	$address = $array["address"];
	
	$sql = "DELETE FROM `MenuTable` WHERE `tag`='$tag' AND `menu`='$address'";
	mysql_query($sql);
	
	// 変更結果を返す
	echo "$sql \n"; // ###
	echo "<SEPARATOR>$address";
} else if (strcmp($command,"PUT_WINDOW_SIZE") == 0){
	// FieldTable の 'editor'フィールドにサイズ属性を格納
	$array = decodeObject($value);
	$val = $array["editor"];
	$tag = $array["tag"];
	$owner = $array["owner"];
	
	$sql = "SELECT * FROM `FieldTable` 
	WHERE `tag`='$tag' AND `owner`='$owner'";
	echo "$sql ========\n"; //###
	$result=mysql_query($sql);
	if (mysql_num_rows ($result) > 0){	// 同じ tag が存在した
		$sql = "UPDATE `FieldTable` 
		SET `editor`='$val'
		WHERE `tag`='$tag' AND `owner`='$owner'";
	} else { // 同じ menuItem が存在しなかった
		$sql = "INSERT INTO `FieldTable` 
		( `tag`,`editor`,`owner` )
		VALUES ( '$tag','$val','$owner')";
	}
	echo "$sql ========\n"; //###
	mysql_query($sql);
	echo "<SEPARATOR>";
	echo "ウインドー・サイズ $val を保存しました";
} else if (strcmp($command,"GET_WINDOW_SIZE") == 0){
	// FieldTable の 'editor'フィールドにサイズ属性を格納
	$array = decodeObject($value);
	$val = $array["editor"];
	$tag = $array["tag"];
	$owner = $array["owner"];
	
	$sql = "SELECT * FROM `FieldTable` 
	WHERE `tag`='$tag' AND `owner`='$owner'";
	echo "$sql ========\n"; //###
	$result=mysql_query($sql);
	echo "<SEPARATOR>";
	$val = "20,10,700,900"; // default window size
	if (mysql_num_rows ($result) > 0){	// 同じ tag が存在した
		$row = mysql_fetch_array($result);
		$val = $row['editor']; // 'editor'フィールドにサイズ属性を格納
		echo "$val"; //###
	}
}
	
?>