<?php
error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
session_start();

require_once '../lib/mysql.php';
require_once '../lib/user.class.php';
require_once '../lib/lib.php';
require_once '../lib/qdmail.php';

$user = new user();

//print_r($_POST);

$error = null;

if (isset($_POST['name']) && isset($_POST['pass']) && isset($_POST['pass2']) && isset($_POST['email'])){
	$con = new mysqliEx('contents');
	$result = register();
	$con->close();

	if ($result === true){
		$tmp = "<p>アカウント情報の登録を受け付けました。<br />現在、仮登録状態のため、あなたのアカウントにログインすることはできません。<br />";
		$tmp .= "この登録を完了するために、登録メールアドレスへ有効化のためのURLを送信しました。<br />";
		$tmp .= "お手数ですが、メールをご確認いただき、24時間以内にアクティベーションをお願いいたします。<p>";

		$_SESSION["alert-header"] = "ユーザ情報登録を行いました";
		$_SESSION["alert"] = $tmp;
		header("Location: /");
		exit;
	}else{
		$error = $result;
	}
}

// placeholder
$uservalue = (isset($_POST['name'])) ? htmlspecialchars($_POST['name'], ENT_QUOTES) : "";
//$passvalue = (isset($_POST['pass'])) ? $_POST['pass'] : "";
//$pass2value = (isset($_POST['pass2'])) ? $_POST['pass2'] : "";
$emailvalue = (isset($_POST['email'])) ? htmlspecialchars($_POST['email'], ENT_QUOTES) : "";

function register(){
	global $_POST, $con;

	$name = $_POST['name'];
	$pass = $_POST['pass'];
	$pass2 = $_POST['pass2'];
	$mail = $_POST['email'];

	// name
	if (!isValidName($name)){
		return "不正なユーザーIDです!";
	}	
	$res = $con->query('SELECT `id` FROM `'.TPREFIX.'pic_user` WHERE `user_id` = "'.$con->escape_string($name).'"');
	if ($res === false) return("データベースへの接続に失敗しました");
	if ($res->num_rows > 0){
		return "既に登録されているユーザーIDです!";
	}

	// pass
	if (strlen($pass) !== mb_strlen($pass, "UTF-8")){
		return "不正な文字がパスワードに含まれています!";
	}
	$tmp = strlen($pass);
	if ($tmp < 6 || $tmp > 20){
		return "パスワードの文字数が不正です! 6 ~ 20文字で入力してください!";
	}
	if ($pass !== $pass2){
		return "確認のパスワードが一致していません!";
	}

	// mail
	if (!isValidMail($mail)){
		return "不正なメールアドレスです!";
	}
	if (strlen($mail) > 100){
		return "このメールアドレスはご利用いただけません";
	}
	$res = $con->query('SELECT `id` FROM `'.TPREFIX.'pic_user` WHERE `email` = "'.$con->escape_string($mail).'"');
	if ($res->num_rows > 0){
		return "既に登録されているメールアドレスです!";
	}

	// prepare variables
	$encrypted = hash('SHA512', $pass);
	$now = time();
	$actKey = getRandomActKey();

	// insert table
	$query = 'INSERT INTO `'.TPREFIX.'pic_user` (`user_id`, `password`, `email`, `regdate`, `act_key`, `reg_ip`, `last_ip`) ';
	$query .= 'VALUES (?, ?, ?, ?, ?, ?, ?)';
	$stmt = $con->prepare($query);
	$stmt->bind_param('sssisss', $name, $encrypted, $mail, $now, $actKey, $_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_ADDR']);
	$stmt->execute();
	if ($stmt->affected_rows !== 1){
		return "内部エラーのためユーザ登録に失敗しました!管理人へご連絡ください!";
	}

	// send activation e-mail
	$title = "あなたの pic.sakura-server.net アカウントをアクティベートしてください";
	$body = $name." さん\n\n";
	$body .= "SakuraServer画像共有サービスにサインアップしていただきありがとうございます。\n";
	$body .="あなたのアカウントはまだ有効化されていません。次のリンクをクリックして、アカウントをアクティベートしてください:\n";
	$body .= "http://pic.sakura-server.net/activate/".$actKey."?user=".$name."\n\n";
	$body .= "--SakuraServer Share pictures\n  http://pic.sakura-server.net";

	$m = new Qdmail();
	$m->to($mail, $name);
	$m->from('noreply@sakura-server.net', "SakuraServer Pictures");
	$m->subject($title);
	$m->text($body);
	$m->send();

	return true;
}

function getRandomActKey($nLengthRequired = 16){
	// excludes: i, l, I, O, 0
    $sCharList = "abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789_";
    mt_srand();
    $sRes = "";
    for($i = 0; $i < $nLengthRequired; $i++){
        $sRes .= $sCharList[mt_rand(0, strlen($sCharList) - 1)];
    }
    return $sRes;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
<title>Create account - pic.sakura-server.net</title>
<?php include '../includes/imports.php'; ?>
</head>
<body>
<?php include '../includes/header.php'; ?>
<div id="wrapper">
<div id="content" class="xfluid">
<?php if($error != null){
	$html = <<< EOF
	<div class="portlet x12">
		<div class="portlet-header"><h4>Error!</h4></div>
		<div class="portlet-content">
	 	%ERROR%
	 	</div>
	</div>
EOF;
	print str_replace("%ERROR%", $error, $html);
} ?>

	<div class="portlet x8">
	<div class="portlet-header"><h4>Create account</h4></div>
	<div class="portlet-content">
		<form id="make_account-form" class="form-horizontal" name="make_account" action="make_account" method="post">
			<div id="err_name" class="control-group">
				<label class="control-label" for="inputUser">ユーザー名</label>
				<div class="controls"><input type="text" id="inputUser" name="name" placeholder="ユーザー名" value="<?=$uservalue;?>" required>
				<span class="help-inline">2~16文字 半角英数字とアンダーバーが使用できます</span></div>
			</div>
			<div class="control-group err_pass">
				<label class="control-label" for="inputPass">パスワード</label>
				<div class="controls"><input type="password" id="inputPass" name="pass" autocomplete="off" placeholder="パスワード" required>
					<span class="help-inline">6~20文字 半角英数記号が使用できます</span></div>
			</div>
			<div class="control-group err_pass">
				<label class="control-label" for="inputPass2">パスワード(確認)</label>
				<div class="controls"><input type="password" id="inputPass2" name="pass2" autocomplete="off" placeholder="パスワード" required></div>
			</div>
			<div id="err_email" class="control-group">
				<label class="control-label" for="inputEmail">メールアドレス</label>
				<div class="controls"><input type="email" id="inputEmail" name="email" placeholder="メールアドレス" value="<?=$emailvalue;?>" required>
					<span class="help-inline">受信可能な正しいメールアドレスをご入力ください</span></div>
			</div>

			<div id="err_confirm" class="control-group">
				<label class="control-label" for="inputConfirm">確認</label>
				<div class="controls">
					<label class="checkbox"><input id="inputConfirm" type="checkbox">
						<a href="/terms" target="_blank">利用規約</a>に同意します
					</label>
				</div>
			</div>
			<div class="controls"><button id="submit" class="btn btn-primary">上記の内容で登録</button></div>
		</form>
	</div>
	</div>
	<div class="portlet x4">
		<div class="portlet-header"><h4>利用規約</h4></div>
		<div class="portlet-content">
			<p>当サービスの利用を始める前に、<a href="/terms" target="_blank">利用規約</a>をご覧ください。</p>
		</div>
	</div>
	<div class="portlet x4">
		<div class="portlet-header"><h4>ステートメント</h4></div>
		<div class="portlet-content">
			<p>登録されたメールアドレスは、アカウントの有効化と、何らかの問題が発生した場合のご連絡にのみ使用します。その他の目的では一切使用致しません。</p>
			<p>パスワードについては、強固な暗号化技術を用いて暗号化を行い、適切なアクセス制御を行っているデータベース上に保存されます。ですが一般的に、他のウェブサイトやサービスなどで利用されているものと同一のパスワードを使用することは、セキュリティ上推奨されません。</p>
			<p>他者による意図しないアカウントの利用を防ぐために、強固なパスワードをご設定ください。</p>
		</div>
	</div>
</div>
<?php include '../includes/footer.php'; ?>
</div>
<script type="text/javascript" charset="utf-8">
	$("#submit").click(function(){
		if (!validate()){
			alert("内容に不備があります!");
			return false;
		}
		return true;
	});

	function validate(){
		var error = false;

		// name
		var tmp = $("#inputUser").val().length;
		if (tmp < 2 || tmp > 16){
			$("#err_name").addClass("error");
			error = true;
		}else{
			$("#err_name").removeClass("error");
		}


		// password
		var tmp = $("#inputPass").val().length;
		if (tmp < 6 || tmp > 20 || ($("#inputPass").val() != $("#inputPass2").val())){
			$(".err_pass").addClass("error");
			error = true;
		}else{
			$(".err_pass").removeClass("error");
		}

		// email
		if ($("#inputEmail").val().length <= 3){
			$("#err_email").addClass("error");
			error = true;
		}else{
			$("#err_email").removeClass("error");
		}

		// checkbox
		if (!($("#inputConfirm").attr('checked'))){
			$("#err_confirm").addClass("error");
			error = true;
		}else{
			$("#err_confirm").removeClass("error");
		}

		return (!error);
	}
</script>
</body>
</html>