jMîB<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="chrome-extension://lbjapbcmmceacocpimbpbidpgmlmoaao/content.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" async></script>
<title>Course Tee Management</title>
</head>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.container {
background-color: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);
width: 50%;
max-height: 100vh;
}
input, button, select {
padding: 10px;
border-radius: 5px;
border: 1px solid #ccc;
width: 100%;
margin-top: 10px;
}
button {
background-color: #2a9d8f;
color: white;
border: none;
cursor: pointer;
margin-top: 20px;
}
button:hover {
background-color: #21867a;
}
label {
font-weight: bold;
}
select {
margin-top: 20px;
}
.input-section {
margin-bottom: 20px;
}
</style>
<body>
<div class="container">
<h2>Course Tee Management</h2>
<!-- Password Section -->
<div id="passwordSection" class="input-section">
<label for="password">Enter Password:</label>
<input type="password" id="password" placeholder="Enter password">
<button onclick="verifyPassword()">Submit</button>
<p id="errorMessage" style="color: red; display: none;">Incorrect password. Try again.</p>
</div>
<!-- Manual Input for Country Code and Course Code -->
<div id="manualInputSection" class="input-section" style="display: none;">
<label for="manualCountry">Enter Country Code:</label>
<input type="text" id="manualCountry" placeholder="Country Code (e.g., 064)">
<label for="manualCourseCode">Enter Course Code:</label>
<input type="text" id="manualCourseCode" placeholder="Course Code (e.g., 271)">
<button onclick="setManualEntry()">Use Manual Entry</button>
</div>
<!-- Tee Selection Section -->
<div id="teeSelectionSection" class="input-section" style="display: none;">
<label for="teeSelect">Select Tee Type:</label>
<select id="teeSelect"></select>
<button onclick="loadTeeData()">Load Tee Data</button>
<button onclick="addNewTeeFile()">Add New Tee</button>
<button onclick="deleteTeeFile()">Delete Selected Tee</button>
</div>
<!-- Edit Section -->
<div id="editSection" class="input-section" style="display: none;">
<label for="courseName">Course Name:</label>
<input type="text" id="courseName">
<label for="country">Country:</label>
<input type="text" id="country">
<label for="courseCode">Course Code:</label>
<input type="text" id="courseCode">
<h3>Holes (Par, Difficulty, Distance)</h3>
<table id="holesTable">
<thead>
<tr>
<th>Hole</th>
<th>Par</th>
<th>Difficulty</th>
<th>Distance</th>
</tr>
</thead>
<tbody id="holesContainer"></tbody>
</table>
<p id="totalPar">Total Par: 0</p>
<p id="totalDistance">Total Distance: 0</p>
<button onclick="updateCourseData()">Update Course Data</button>
<button onclick="cancelUpdate()">Cancel</button>
<p id="updateMessage" style="color: green; display: none;">Course data updated successfully!</p>
</div>
</div>
<script>
const correctPassword = "new"; // Password for verification
let isManualEntry = false;
// Function to verify password
function verifyPassword() {
const passwordInput = document.getElementById("password").value;
if (passwordInput === correctPassword) {
document.getElementById("passwordSection").style.display = "none";
document.getElementById("manualInputSection").style.display = "block"; // Show the next section after password is verified
} else {
document.getElementById("errorMessage").style.display = "block";
}
}
// Function to set the manual entry flag
function setManualEntry() {
const manualCountry = document.getElementById("manualCountry").value;
const manualCourseCode = document.getElementById("manualCourseCode").value;
if (manualCountry && manualCourseCode) {
isManualEntry = true;
populateTeeList();
document.getElementById("manualInputSection").style.display = "none";
document.getElementById("teeSelectionSection").style.display = "block";
} else {
alert("Please enter both country and course code.");
}
}
// Function to populate the tee list
function populateTeeList() {
const teeSelect = document.getElementById("teeSelect");
const manualCountry = document.getElementById("manualCountry").value;
const manualCourseCode = document.getElementById("manualCourseCode").value;
fetch(`https://bsvhost.com:8000/golf/${manualCountry}/${manualCourseCode}/listTees`)
.then(response => response.json())
.then(teeList => {
teeSelect.innerHTML = '';
teeList.forEach(tee => {
const option = document.createElement("option");
option.value = tee;
option.text = tee.charAt(0).toUpperCase() + tee.slice(1) + " Tee";
teeSelect.appendChild(option);
});
})
.catch(error => console.error('Error fetching tee list:', error));
}
function loadTeeData() {
const teeType = document.getElementById("teeSelect").value;
const manualCountry = document.getElementById("manualCountry").value;
const manualCourseCode = document.getElementById("manualCourseCode").value;
// Ensure .json is added only once
const teeFile = teeType.endsWith(".json") ? teeType : `${teeType}.json`;
fetch(`https://bsvhost.com:8000/golf/${manualCountry}/${manualCourseCode}/${teeFile}`)
.then(response => response.json())
.then(data => {
document.getElementById("editSection").style.display = "block";
document.getElementById('courseName').value = data.Course;
document.getElementById('country').value = data.country;
document.getElementById('courseCode').value = data.courseCode;
const holesContainer = document.getElementById('holesContainer');
holesContainer.innerHTML = '';
data.Par.forEach((par, index) => {
const difficulty = data.Difficulty[index];
const distance = data.Distance[index];
const row = `
<tr>
<td>${index + 1}</td>
<td><input type="number" id="par${index}" value="${par}" style="width: 60px;"></td>
<td><input type="number" id="difficulty${index}" value="${difficulty}" style="width: 80px;"></td>
<td><input type="number" id="distance${index}" value="${distance}" style="width: 100px;"></td>
</tr>
`;
holesContainer.innerHTML += row;
});
calculateTotals();
})
.catch(error => console.error('Error loading tee data:', error));
}
function updateCourseData() {
const parValues = [];
const difficultyValues = [];
const distanceValues = [];
for (let i = 0; i < 18; i++) {
parValues.push(parseInt(document.getElementById(`par${i}`).value));
difficultyValues.push(parseInt(document.getElementById(`difficulty${i}`).value));
distanceValues.push(parseInt(document.getElementById(`distance${i}`).value));
}
const updatedData = {
Course: document.getElementById('courseName').value,
country: document.getElementById('country').value,
courseCode: document.getElementById('courseCode').value,
Par: parValues,
Difficulty: difficultyValues,
Distance: distanceValues
};
const manualCountry = document.getElementById("manualCountry").value;
const manualCourseCode = document.getElementById("manualCourseCode").value;
const teeFileName = document.getElementById("teeSelect").value;
// Updated URL to match the server route we'll create
const url = `https://bsvhost.com:8000/golf/${manualCountry}/${manualCourseCode}/updateTee/${teeFileName}`;
fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(updatedData)
})
.then(response => {
console.log('Response status:', response.status);
if (response.ok) {
console.log('Update successful');
document.getElementById('updateMessage').textContent = 'Course data updated successfully!';
document.getElementById('updateMessage').style.display = 'block';
setTimeout(() => {
document.getElementById('editSection').style.display = 'none';
document.getElementById('teeSelectionSection').style.display = 'block';
}, 2000);
} else {
console.error('Failed to update course data.');
document.getElementById('updateMessage').textContent = 'Failed to update course data. Please try again.';
document.getElementById('updateMessage').style.display = 'block';
}
})
.catch(error => {
console.error('Error updating course data:', error);
document.getElementById('updateMessage').textContent = 'Error updating course data. Please try again.';
document.getElementById('updateMessage').style.display = 'block';
});
}
function cancelUpdate() {
document.getElementById('editSection').style.display = 'none';
document.getElementById('teeSelectionSection').style.display = 'block';
}
// Function to calculate totals for holes
function calculateTotals() {
let totalPar = 0;
let totalDistance = 0;
for (let i = 0; i < 18; i++) {
totalPar += parseInt(document.getElementById(`par${i}`).value) || 0;
totalDistance += parseInt(document.getElementById(`distance${i}`).value) || 0;
}
document.getElementById('totalPar').textContent = `Total Par: ${totalPar}`;
document.getElementById('totalDistance').textContent = `Total Distance: ${totalDistance}`;
}
function addNewTeeFile() {
// Clear all the form fields
document.getElementById('courseName').value = '';
document.getElementById('country').value = '';
document.getElementById('courseCode').value = '';
// Generate blank fields for 18 holes
const holesContainer = document.getElementById('holesContainer');
holesContainer.innerHTML = '';
for (let i = 0; i < 18; i++) {
const row = `
<tr>
<td>${i + 1}</td>
<td><input type="number" id="par${i}" value="" style="width: 60px;"></td>
<td><input type="number" id="difficulty${i}" value="" style="width: 80px;"></td>
<td><input type="number" id="distance${i}" value="" style="width: 100px;"></td>
</tr>
`;
holesContainer.innerHTML += row;
}
// Show the edit section with the blank form
document.getElementById('editSection').style.display = 'block';
document.getElementById('teeSelectionSection').style.display = 'none';
// Set the currentTee to a new value from user input
const newTee = prompt("Enter the name for the new Tee (e.g., bluetee):");
if (newTee) {
currentTee = newTee;
// Add a save button for the new tee
const saveButton = document.createElement('button');
saveButton.textContent = 'Save New Tee';
saveButton.onclick = function() {
saveNewTee(newTee);
};
document.getElementById('editSection').appendChild(saveButton);
} else {
alert("Tee name cannot be empty.");
}
}
function saveNewTee(teeName) {
const parValues = [];
const difficultyValues = [];
const distanceValues = [];
for (let i = 0; i < 18; i++) {
parValues.push(parseInt(document.getElementById(`par${i}`).value) || 0);
difficultyValues.push(parseInt(document.getElementById(`difficulty${i}`).value) || 0);
distanceValues.push(parseInt(document.getElementById(`distance${i}`).value) || 0);
}
const newTeeData = {
Course: document.getElementById('courseName').value,
country: document.getElementById('country').value,
courseCode: document.getElementById('courseCode').value,
Par: parValues,
Difficulty: difficultyValues,
Distance: distanceValues
};
const manualCountry = document.getElementById("manualCountry").value;
const manualCourseCode = document.getElementById("manualCourseCode").value;
const url = `https://bsvhost.com:8000/golf/${manualCountry}/${manualCourseCode}/createTee/${teeName}`;
fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newTeeData)
})
.then(response => {
console.log('Response status:', response.status);
if (response.ok) {
console.log('New tee created successfully');
document.getElementById('updateMessage').textContent = 'New tee created successfully!';
document.getElementById('updateMessage').style.display = 'block';
setTimeout(() => {
document.getElementById('editSection').style.display = 'none';
document.getElementById('teeSelectionSection').style.display = 'block';
// Refresh the tee list
populateTeeList();
}, 2000);
} else {
console.error('Failed to create new tee.');
document.getElementById('updateMessage').textContent = 'Failed to create new tee. Please try again.';
document.getElementById('updateMessage').style.display = 'block';
}
})
.catch(error => {
console.error('Error creating new tee:', error);
document.getElementById('updateMessage').textContent = 'Error creating new tee. Please try again.';
document.getElementById('updateMessage').style.display = 'block';
});
}
function deleteTeeFile() {
const selectedTee = document.getElementById("teeSelect").value;
const manualCountry = document.getElementById("manualCountry").value;
const manualCourseCode = document.getElementById("manualCourseCode").value;
if (!selectedTee) {
alert("Please select a tee to delete.");
return;
}
// Confirm the delete action
const confirmed = confirm(`Are you sure you want to delete the tee: ${selectedTee}?`);
if (!confirmed) {
return;
}
const url = `https://bsvhost.com:8000/golf/${manualCountry}/${manualCourseCode}/${selectedTee}`;
fetch(url, {
method: 'DELETE',
})
.then(response => {
if (response.ok) {
alert(`Tee file ${selectedTee} deleted successfully.`);
// Remove the deleted tee from the select list
const teeSelect = document.getElementById("teeSelect");
const optionToDelete = teeSelect.querySelector(`option[value="${selectedTee}"]`);
teeSelect.removeChild(optionToDelete);
} else {
throw new Error('Failed to delete the tee file.');
}
})
.catch(error => {
console.error('Error deleting tee file:', error);
alert('Error deleting tee file. Please try again.');
});
}
</script>
</body>
</html>
https://whatsonchain.com/tx/6bc89bbbf5403a2737c068f76ce67b70e7a5673dfb7b566be43efd49965ebc4c