git.sophuwu.com > cdn   
              175
            
             {{ define "index" }}
<!DOCTYPE html>
<html lang="en">
<head>
	{{ template "head" . }}
	<title>{{ .Path }}</title>
	<script>
		function fileExt(url) {
			let i = url.toString().toLowerCase().lastIndexOf(".");
			if (i === -1) {
				return "";
			}
			return url.toString().toLowerCase().substring(url.toString().lastIndexOf("."));
		}
		const imgExts = [".jpg", ".jpeg", ".png", ".gif", ".webp", ".mp4"];
		var dirPath = "{{ .Path }}";
		if (!dirPath.endsWith("/")) {
			dirPath += "/";
		}
		function IconCheck(elem) {
			let icon = elem.querySelector(".icon");
			let url = elem.querySelector(".file-name").innerText;
			let ext = fileExt(url);
			if (imgExts.includes(ext)) {
				let mod = elem.querySelector(".mod-time").value.replaceAll(" ", "_").replaceAll(":", "_");
				url = dirPath + url;
				icon.innerHTML = "<img src='"+url+".png?icon=" + url + "&mod="+ mod +"'  alt='a'/>";
			}
		}
		function ZeroPad(num, size) {
			num = num.toString();
			for (let l = num.length;l < size;l++)num = "0" + num.toString();
			return num;
		}

		function reverseList(list){
			let c = list.childElementCount;
			for (i = 1; i < c;i++){
				list.insertBefore(list.children[i],list.firstChild);
			}
			Reversed = true;
		}
		function AlphabetSort(list) {
			let i, switching, b, shouldSwitch;
			switching = true;
			while (switching) {
				switching = false;
				b = list.children;
				for (i = 0; i < (b.length - 1); i++) {
					shouldSwitch = false;
					if (b[i].id.toLowerCase() > b[i + 1].id.toLowerCase()) {
						shouldSwitch = true;
						break;
					}
				}
				if (shouldSwitch) {
					b[i].parentNode.insertBefore(b[i + 1], b[i]);
					switching = true;
				}
			}
			Reversed = false;
			currentSort = "AlphabetSort";
		}
		function ModSizeSort(list,size=false){
			let classs = ".mod-time";
			if (size===true)classs=".size";
			let arr =new Array(...list.children);
			arr.sort((b,a)=>(a.querySelector(classs).value)-(b.querySelector(classs).value));
			arr.forEach(e=>e.parentNode.appendChild(e));
			Reversed = false;
		}
		function ModSort(list){
			ModSizeSort(list,false);
			currentSort = "ModSort";
		}
		function SizeSort(list){
			ModSizeSort(list,true);
			currentSort = "SizeSort";
		}
		var currentSort = "ModSort";
		var Reversed = false;
		function Id2Fn(id){
			let fn = {
			AlphabetSort: AlphabetSort,
			ModSort: ModSort,
			SizeSort: SizeSort,
			}[id];
			if (currentSort === id && !Reversed) {
				return function (list){fn(list);reverseList(list);}
			}
			else {
				return function (list){fn(list);};
			}
		}
		function SortWith(elem) {
			let fn = Id2Fn(elem.id);
			document.querySelectorAll(".dirs,.files").forEach(e =>fn(e));
			if (Reversed) elem.parentElement.classList.add("rev");
			else elem.parentElement.classList.remove("rev");
			document.querySelectorAll(".CurSort").forEach(e => e.classList.remove("CurSort"));
			elem.classList.add("CurSort");
			localStorage.setItem("sort", currentSort);
			localStorage.setItem("reversed", Reversed.toString());
		}


		document.addEventListener("DOMContentLoaded", function() {
			document.querySelectorAll(".files > .filelabel").forEach(filelement =>IconCheck(filelement));
			document.querySelectorAll(".timestr").forEach(elem => {
				// let t= new Date(Date.parse("15 Mar 2025 15:23 +0000"))
				let t =new Date(Date.parse(elem.title));
				if (elem.innerText[0] >= '0' && elem.innerText[0] <= '9') {
					elem.innerText = t.getFullYear()+"-"+ZeroPad((t.getMonth()+1),2)+"-"+ZeroPad(t.getDate(),2);
				} else {
					elem.innerText = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][t.getDay()] + ", " + ZeroPad(t.getHours(),2) + ":" + ZeroPad(t.getMinutes(),2);
				}
			});
			currentSort = localStorage.getItem("sort");
			if (currentSort === null) {
				currentSort = "ModSort";
			}
			Reversed = localStorage.getItem("reversed") !== "true";
			if (currentSort==="ModSort"&&Reversed)return;
			SortWith(document.getElementById(currentSort));
		});
	</script>
</head>
<body>
{{ if .Path }}
<header>
{{ if eq .Path "/" }}
{{ else }}
<a href=".." class="button">
	<span class="icon"><</span><span>Back</span>
</a>
{{ end }}
<h1>Index of: {{ .Path }}</h1>
</header>
<div class="filelabel">
	<span class="icon">l</span>
	<span id="AlphabetSort" onclick="SortWith(this)" class="sorter">Name</span>
	<span id="SizeSort" onclick="SortWith(this)" class="right sorter">Size</span>
	<span id="ModSort" onclick="SortWith(this)" class="right CurSort sorter">Time Modified</span>
</div>
<br>
<div class="trees dirs">
{{ range .Dirs }}
 	{{ template "filelabel" . }}
{{ end }}
</div>
<div class="trees files">
{{ range .Items }}
	{{ template "filelabel" . }}
{{ end }}
</div>
{{ else }}
{{ if .Error }}
<h1>{{ .Error }}</h1>
{{ else }}
{{ if .Upload }}
<h1>Upload</h1>
<form class="trees" enctype="multipart/form-data" action="{{ .Upload }}" method="post">
	<div class="filelabel"><span>Path:</span><input type="text" name="path" /></div>
	<div class="filelabel"><span>File:</span><input type="file" name="myFile" /></div>
	<div class="filelabel"><span>Username:</span><input type="text" name="username" /></div>
	<div class="filelabel"><span>Password:</span><input type="password" name="password" /></div>
	<div class="filelabel"><span>OTP:</span><input type="text" name="otp" /></div>
	<div class="filelabel"><span></span><input type="submit" value="Upload" /></div>
</form>
{{ end }}
{{ end }}
{{ end }}
</body>
</html>
{{ end }}