<?php

#---------------------------------------------#
#             				ソートキー生成
#---------------------------------------------#

function  key_make($KEY) {

	$table = array("あ"=>"00","ぁ"=>"00","い"=>"01","ぃ"=>"01","う"=>"02","ぅ"=>"02","え"=>"03","ぇ"=>"03","お"=>"04","ぉ"=>"04",
							"か"=>"10","き"=>"11","く"=>"12","け"=>"13","こ"=>"14","さ"=>"20","し"=>"21","す"=>"22","せ"=>"23","そ"=>"24",
							"た"=>"30","ち"=>"31","つ"=>"32","っ"=>"32","て"=>"33","と"=>"34","な"=>"40","に"=>"41","ぬ"=>"42","ね"=>"43","の"=>"44",
							"は"=>"50","ひ"=>"51","ふ"=>"52","へ"=>"53","ほ"=>"54","ま"=>"60","み"=>"61","む"=>"62","め"=>"63","も"=>"64",
							"や"=>"70","ゃ"=>"70","ゆ"=>"71","ゅ"=>"71","よ"=>"72","ょ"=>"72","ら"=>"80","り"=>"81","る"=>"82","れ"=>"83","ろ"=>"84",
							"わ"=>"90","を"=>"91","ん"=>"92");
	mb_internal_encoding("Shift_JIS");
	mb_regex_encoding("Shift_JIS");

	$b = mb_convert_kana($KEY, "hks","Shift_JIS");
	$b = ereg_replace("ﾟ|ﾞ|ｰ| ", "", $b);//濁点、半濁点を排除
	$b = mb_ereg_replace("[^あ-ん]", "",mb_convert_kana($b, "H","Shift_JIS" ));//ひらがな以外を排除
	//$b = mb_ereg_replace("ゃ|ゅ|ょ|っ", "",$b );//特定かなを排除
	$b = sprintf("%0-20s",substr(str_replace( array_keys( $table), array_values( $table), $b),0, 20)); // 20桁の数列を生成

	return $b;
}

#---------------------------------------------#
#              sql書き込みモジュール::MDB（トータル件数同時読み）
#---------------------------------------------#

//mysqlを書き込みデータ配列を作成する
function savesqlfile($query){

	if(!$query){ return; };
	if(!SQL_FLAG){ error('現在、データベースが停止していますので編集作業は行えません。 - '.$f,1); };
	
	//モジュール取り込み
	require_once 'MDB.php';

	// データソース名: 接続文字列です
	$dsn = "mysql://".sql_user.":".sql_pass."@".sql_local."/".sql_database;

	// MDB::connect は、成功した場合に PEAR MDB オブジェクト
	// 失敗した場合に PEAR MDB Error オブジェクトを返します
	$db = MDB::connect($dsn);

	// MDB::isError で、エラーと正常な接続を区別します
	if (MDB::isError($db)) { die ($db->getMessage()); }

	foreach ($query as $key) {
		if(!$key){ continue; };
//$key=str_replace("\'","'", $key);
//echo $key."<br><br>";
		$sth = $db->prepareQuery($key);
		$result=$db->executeQuery($sth);
		if (MDB::isError($result)) { die ($result->getMessage()); }	;
		$db->freeResult($result);
	}

	// 接続を閉じます
	$db->disconnect();

	return;

}

#---------------------------------------------#
#              	AUTO_INCREMENT取得
#---------------------------------------------#

//mysqlを書き込みデータ配列を作成する
function savesqlidno($SQL_TABLE,$KEY){

	if(!SQL_FLAG){ error('現在、データベースが停止していますので編集作業は行えません。 - '.$f,1); };
	
	//モジュール取り込み
	require_once 'MDB.php';

	// データソース名: 接続文字列です
	$dsn = "mysql://".sql_user.":".sql_pass."@".sql_local."/".sql_database;

	// MDB::connect は、成功した場合に PEAR MDB オブジェクト
	// 失敗した場合に PEAR MDB Error オブジェクトを返します
	$db = MDB::connect($dsn);

	// MDB::isError で、エラーと正常な接続を区別します
	if (MDB::isError($db)) { die ($db->getMessage()); }

	$query = "INSERT INTO ".$SQL_TABLE." (".$KEY.") VALUES('');";
	$sth = $db->prepareQuery($query);
	$result=$db->executeQuery($sth, $row);
	$last_id = mysql_insert_id();

	// $result がエラーでないことを常にチェックします
	if (MDB::isError($result)) { die ($result->getMessage()); };

	// 接続を閉じます
	$db->freeResult($result);
	$db->disconnect();

	//AUTO上限値を超えた場合
	//if($last_id>60000) $last_id=resqlidno($SQL_TABLE);

	if($last_id=='') error("現在、大変混み合っていますので、しばらく時間を空けてご利用ください。 error-GL0003");
	
	return $last_id;

}

#---------------------------------------------#
#              	AUTO_INCREMENT上限超え
#---------------------------------------------#

//mysqlを書き込みデータ配列を作成する
function resqlidno($SQL_TABLE){

	if(!SQL_FLAG){ error('現在、データベースが停止していますので編集作業は行えません。 - '.$f,1); };

	$TEMP=array();
	$query ="select * from ".$SQL_TABLE." order by no_log";
	$TEMP=loadsqldata($query,'','');

	$query=array();
	$query[0] = "DELETE FROM ".$SQL_TABLE;
	$query[1] = "ALTER TABLE ".$SQL_TABLE." AUTO_INCREMENT = 1;";

	savesqlfile($query);

	$query=array();
	foreach($TEMP as $k => $val) $query[] = "INSERT INTO ".$SQL_TABLE." no_log,id_log,gid_log,sys_log,com_log,uptime_log,time_log,data_log,other_log,temp1_log,temp2_log,temp3_log) VALUES('','".$val['id_log']."','".$val['gid_log']."','".$val['sys_log']."','".$val['com_log']."','".$val['uptime_log']."','".$val['time_log']."','".$val['data_log']."','".$val['other_log']."','".$val['temp1_log']."','".$val['temp2_log']."','".$val['temp3_log']."');";
	savesqlfile($query);

	$last_id=sprintf("%05d",($k+1));

	return $last_id;

}

#---------------------------------------------#
#              	AUTO_INCREMENT削除
#---------------------------------------------#

//mysqlを書き込みデータ配列を作成する
function delsqlidno($SQL_TABLE,$KEY,$VAL){

	if(!SQL_FLAG){ error('現在、データベースが停止していますので編集作業は行えません。 - '.$f,1); };
	
	//モジュール取り込み
	require_once 'MDB.php';

	// データソース名: 接続文字列です
	$dsn = "mysql://".sql_user.":".sql_pass."@".sql_local."/".sql_database;

	// MDB::connect は、成功した場合に PEAR MDB オブジェクト
	// 失敗した場合に PEAR MDB Error オブジェクトを返します
	$db = MDB::connect($dsn);

	// MDB::isError で、エラーと正常な接続を区別します
	if (MDB::isError($db)) { die ($db->getMessage()); }

	$query= "DELETE FROM ".$SQL_TABLE." WHERE ".$KEY."='".$VAL."';";
	$sth = $db->prepareQuery($query);
	$result=$db->executeQuery($sth, $row);

	// $result がエラーでないことを常にチェックします
	if (MDB::isError($result)) { die ($result->getMessage()); };

	// 接続を閉じます
	$db->freeResult($result);
	$db->disconnect();
	
	return;

}

#---------------------------------------------#
#          				実ファイルの生成
#---------------------------------------------#
// 機能 ファイルの保存
// 引数 $file: ファイル名
//　　　$str: ファイル内容
// 戻値 書き込んだファイルサイズ
function savefile($file, $str) {
	if( !file_exists($file) ){
		touch( $file );
	}

	$fp = fopen($file, "w");
	if (flock($fp, LOCK_EX | LOCK_NB)) {
		$size = fwrite($fp, $str);
		flock($fp, LOCK_UN);
	}
	fclose($fp);
	if(substr(sprintf('%o', fileperms($file)), -4)!='0666'){ chmod($file,0666); };
	return $size;
}

#---------------------------------------------#
#          			GD:投稿画像リサイズ
#---------------------------------------------#
function resize_gd($org_file,$length,$up_dir,$newname,$lockfile=''){

	if(!$length || !$org_file || !$up_dir || !$newname){ return; };
	if(!file_exists($org_file) && $org_file) return;
	if(!is_writable($up_dir) || !is_writable($org_file)) return;
	if(!@GetImageSize($org_file) && $org_file){ unlink($org_file);return; };

	//使用している画像の本来の幅と高さ
	$image=getimagesize($org_file);
	$W=$image[0];$H=$image[1];$type=$image['mime'];

	//加工画像
	$new_fname=$up_dir.$newname;

	//横サイズを固定算出
	if($W!=$length){ 
		$width = $length;
		if($W && $H) $height = $H * $length / $W; else $height =$width;
	}else{
		if(copy($org_file,$new_fname)) chmod($new_fname,0666);return;
	}
	
	//jpg以外の画像をjpg変換
	$tmb = ImageCreateTrueColor($width,$height);
	switch ($type) {
		case 'image/png':
			$src=imagecreatefrompng($org_file);
			imagealphablending($tmb, false);  // アルファブレンディングをoffにする
			imagesavealpha($tmb, true);       // 完全なアルファチャネル情報を保存するフラグをonにする
			ImageCopyResampled($tmb, $src,0,0,0,0, $width, $height, $W, $H);
			ImagePNG($tmb,$new_fname);//画像ファイルの書き出し
			break;
		case 'image/gif':
			$src=imagecreatefromgif($org_file);
			ImageCopyResampled($tmb,$src,0,0,0,0,$width,$height,$W,$H);
			ImageGIF($tmb,$new_fname);//画像ファイルの書き出し
			break;
		default:
			$src=imagecreatefromjpeg($org_file);
			ImageCopyResampled($tmb,$src,0,0,0,0,$width,$height,$W,$H);
			ImageJPEG($tmb,$new_fname,80);//画像ファイルの書き出し
	}
	ImageDestroy($src);
	ImageDestroy($tmb);
	if(file_exists($new_fname) && substr(sprintf('%o', fileperms($new_fname)), -4)!='0666'){ chmod($new_fname,0666); };
	
	return;
}

#---------------------------------------------#
#          		GD:画像カット＆サイズ変更
#---------------------------------------------#
function cutsize_gd($org_file,$MaxW,$MaxH,$up_dir,$newname,$lockfile=''){

	if(!$org_file || !$up_dir || !$newname){ return; };
	if(!file_exists($org_file)) return;
	if(!is_writable($up_dir) || !is_writable($org_file)) return;
	if(!@GetImageSize($org_file) && $org_file){ unlink($org_file);return; };

	//使用している画像の本来の幅と高さ
	$image=getimagesize($org_file);
	$W=$image[0];$H=$image[1];$type=$image['mime'];

	//加工画像
	$new_fname=$up_dir.$newname;
	if($W==$MaxW && $H==$MaxH) if(copy($org_file,$new_fname)){ chmod($new_fname,0666);return; };

	//最小公倍（最大公約）数を取得
	$W2 = $MaxW / $W;
	$H2 = $MaxH / $H;
	if ($W2 >= $H2) { $key = $W2; }else { $key = $H2; }
	$width = (int) ($W * $key)+1 ;//黒線対策で+1
	$height = (int) ($H * $key) ;

	$x = ($width-$MaxW)/2/$key;
	$y = ($height-$MaxH)/2/$key;
	$tmb = ImageCreateTrueColor($MaxW,$MaxH);
	
	//jpg以外の画像をjpg変換
	switch ($type) {
		case 'image/png':
			$src=imagecreatefrompng($org_file);
			imagealphablending($tmb, false);  // アルファブレンディングをoffにする
			imagesavealpha($tmb, true);       // 完全なアルファチャネル情報を保存するフラグをonにする
			ImageCopyResampled($tmb, $src,0,0,$x,$y, $width, $height, $W, $H);
			ImagePNG($tmb,$new_fname);//画像ファイルの書き出し
			break;
		case 'image/gif':
			$src=imagecreatefromgif($org_file);
			//$alpha=imagecolortransparent($src);//透過色を取得
			//imagefill($tmb, 0, 0, $alpha);//透過色で塗る
			//imagecolortransparent($tmb, $alpha);//塗りつぶした色を透過色として指定
			ImageCopyResampled($tmb, $src,0,0,$x,$y, $width, $height, $W, $H);
			ImageGIF($tmb,$new_fname);//画像ファイルの書き出し
			break;
		default:
			$src=imagecreatefromjpeg($org_file);
			ImageCopyResampled($tmb, $src,0,0,$x,$y, $width, $height, $W, $H);
			ImageJPEG($tmb,$new_fname);//画像ファイルの書き出し
	}
	ImageDestroy($src);
	ImageDestroy($tmb);
	if(file_exists($new_fname) && substr(sprintf('%o', fileperms($new_fname)), -4)!='0666'){ chmod($new_fname,0666); };

	return;
}

#---------------------------------------------#
#        	IDマッチングによるサブデータ削除
#---------------------------------------------#
function delsqlsubdata($DEL_TABLE,$DEL_ID){

	if($DEL_TABLE==sql_maintable) return;

	//存在しないIDを抽出
	$query="SELECT C.".$DEL_ID." FROM ".$DEL_TABLE." as C LEFT JOIN ".sql_maintable ." as S on S.id_c=C.".$DEL_ID." WHERE S.id_c is null";
	$DATALOG=loadsqldata($query,"","");

	//該当IDを削除
	$query=array();
	foreach($DATALOG as $key => $value){
		$query[] = "DELETEA FROM ".$DEL_TABLE." WHERE ".$DEL_ID."='".$value[$DEL_ID]."'";
	}

	//SQL書き換え
	if($query) savesqlfile($query);

}


#---------------------------------------------#
#        			画像ファイル比較
#---------------------------------------------#
function filescheck($file1,$file2){

	if(!file_exists($file1) && file_exists($file2)) return true;
	if(!file_exists($file2)) return false;
	
	$data1 = file_get_contents($file1);
	$data2 = file_get_contents($file2);
	$im1 = imagecreatefromstring($data1);
	$im2 = imagecreatefromstring($data2);

	$width1  = imagesx($im1); $height1 = imagesy($im1);
	$width2  = imagesx($im2); $height2 = imagesy($im2);

	$width_ratio  = $width2 / $width1;
	$height_ratio = $height2 / $height1;

	if ($width_ratio < 0.5 || 2.0 < $width_ratio ||
	    $height_ratio < 0.5 || 2.0 < $height_ratio) {
	    return false;
	}

	$width = min($width1, $width2);
	$height = min($height1, $height2);

	$distance_square_sum = 0;

	for ($y = 0 ; $y < $height ; $y++) {
	    for ($x = 0 ; $x < $width ; $x++) {
	        $i1 = imagecolorat($im1, $x, $y);
	        $i2 = imagecolorat($im2, $x, $y);
	        $rgb1 = imagecolorsforindex($im1, $i1);
	        $rgb2 = imagecolorsforindex($im2, $i2);
	        $red_diff   = $rgb1['red']   - $rgb2['red'];
	        $green_diff = $rgb1['green'] - $rgb2['green'];
	        $blue_diff  = $rgb1['blue']  - $rgb2['blue'];
	        $distance_square_sum += $red_diff*$red_diff + $green_diff*$green_diff + $blue_diff*$blue_diff;
	    }
	}
	$check=$distance_square_sum / ($width * $height);

	if($check<1000) return false; else return true;

}

?>