<?php

if (!Auth::check()) {
	becomeMsgPage(UOJLocale::get('need login'));
}

$REQUIRE_LIB['shjs'] = "";
$REQUIRE_LIB['dracula'] = "";
$REQUIRE_LIB['base64'] = "";
$REQUIRE_LIB['raphael'] = "";
echoUOJPageHeader("图可视化");

?>
<div class="container">
	<div class="row">
		<div class="col-md-3">
			<div class="form-check">
				<input class="form-check-input" type="checkbox" id="directed" name="directed">
				<label class="form-check-label" for="directed">
					是否有向
				</label>
			</div>
			<div class="form-group">
				<textarea class="form-control" id="edges" rows="3" placeholder="格式:
第一条边起点 第一条边终点 [第一条边权重]
第二条边起点 第二条边终点 [第二条边权重]
第三条边起点 第三条边终点 [第三条边权重]
如:
1 2
2 3
1 3 2
"></textarea>
			</div>
			<?php if (UOJConfig::$data['tools']['map-copy-enabled']): ?>
			<button type="button" class="btn btn-secondary" id="copy">复制图片</button>
			<?php endif ?>
		</div>
		<div class="col-md-9" id="paper">
		</div>
	</div>
</div>
<script>
	(function () {
		<?php if (UOJConfig::$data['tools']['map-copy-enabled']): ?>
		$("#copy").click(function () {
			if(navigator.permissions) {
				navigator.permissions.query({name: "clipboard-write"}).then(result => {
					if (result.state === "granted" || result.state === "prompt") {
						let paper = $("#paper")
						// First, we create an canvas and a img which has the same size with the canvas.
						let canvas = document.createElement('canvas');
						let s_img = document.createElement('img');
						s_img.height = paper.height()
						s_img.width = paper.width()
						canvas.height = paper.height()
						canvas.width = paper.width()
						// After this image is loaded, we draw it on our canvas
						s_img.onload = function () {
							// On some browsers, the exported png have a black background.
							// So we will draw a white background first.
							ctx = canvas.getContext('2d');
							ctx.beginPath();
							ctx.rect(0, 0, paper.width(), paper.height());
							ctx.fillStyle = "white";
							ctx.fill();
							// We put our image created from the svg to the canvas
							canvas.getContext('2d').drawImage(s_img, 0, 0);
							// Then we export canvas as a png file, paste it to clipboard.
							canvas.toBlob(function (blob) {
								const item = new ClipboardItem({[blob.type]: blob});
								navigator.clipboard.write([item]).then(function () {
									alert("图片已经复制到剪切板中");
								}, function (err) {
									alert(err);
								});
							});
						}
						// Load our svg to this image.
						s_img.src = "data:image/svg+xml;base64," + Base64.encode(new XMLSerializer().serializeToString(document.querySelector("#paper > svg")));
					} else {
						alert("获取剪切板权限失败, 请打开网页设置并授予剪切板权限!")
					}
				});
			} else {
				alert("获取剪切板权限失败, 请使用最新Chrome浏览器, 打开网页设置并授予剪切板权限!")
			}
		})
		<?php endif ?>
		let repaint = function () {
			let paper = $("#paper");
			// Clear existing elements.
			paper.html("");
			let directed = $('#directed').is(":checked");
			let Graph = Dracula.Graph;
			let Renderer = Dracula.Renderer.Raphael;
			let Layout = Dracula.Layout.Spring;
			let graph = new Graph();
			let render = function(r, n) {
				let color = Raphael.getColor();
				return r.set()
					.push(
						r.ellipse(0, 0, 30, 20).attr({stroke: color, "stroke-width": 2, fill: color, "fill-opacity": 0})
					)
					.push(r.text(0, 0, n.id).attr({ opacity: 1, 'font-size': 20,}));
			}
			$("#edges").val().split("\n").forEach(function (edge) {
				if (edge.split(" ").length >= 2) {
					if (edge.split(" ")[0].length !== 0 && edge.split(" ")[1].length !== 0 ){
						graph.addNode(edge.split(" ")[0],  {
							render: render
						});
						graph.addNode(edge.split(" ")[1],  {
							render: render
						});
						graph.addEdge(edge.split(" ")[0], edge.split(" ")[1], {
							directed: directed,
							label:edge.split(" ")[2],
							'label-style' : {
								'font-size': 20,
								"fill-opacity":"1"
							}
						});
					}
				}
			})
			var layout = new Layout(graph)
			var renderer = new Renderer('#paper', graph, paper.width(), paper.height())
			renderer.draw()
		}
		$("#edges").on("input", repaint)
		$("#directed").on("input", repaint)
	})()
</script>

<?php
echoUOJPageFooter();