<?php $page = ''; if (!isset($_GET['page'])) { header("location: ?page=term"); } else if (!empty($_GET['page'])) { $page = $_GET['page']; $license = "true"; } else { header("location: ?page=term"); } function CHECK_ROBOTS_TXT_FILE() { if (file_exists("../robots.txt") == 1) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_PHP_VERSION() { $version = phpversion(); if ($version > 5.5) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_CURL() { if (function_exists('curl_version') == "enabled") { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_MYSQL() { if (function_exists('mysqli_connect') == 1) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_MDSTRING() { if (extension_loaded('mbstring') == 1) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_AUF() { if (ini_get('allow_url_fopen') == 1) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_HTACCESS() { if (file_exists("../.htaccess") == 1) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_TABLE() { if (file_exists("../zontal.sql") == 1) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } function CHECK_CONFIG_FILE() { if (file_exists("../config.php") == 1) { echo '&check; Installed'; } else { echo '&times; Not Installed'; } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Zontal</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="installation-page px-4"> <div class="installation-progress flex"> <div class="steps"> <div class="step"> <span id="step_1" class="circle">1</span> </div> <div class="step"> <span id="step_2" class="circle ">2</span> </div> <div class="step"> <span id="step_3" class="circle">3</span> </div> <div class="step"> <span id="step_4" class="circle">4</span> </div> <div class="progress-bar"> <span class="indicator"></span> </div> </div> </div> <div class="installtion-information bg-white rounded-md px-6 py-5 shadow-md mt-6"> <!-- <div class="purchase-validation"> <h3 class="text-2xl font-bold text-gray-800 ">Purchase Validation</h3> <p class="mt-4 text-gray-600">Before proceeding with the installation process, we would like to verify your purchase whether you even purchased our script or not</p> <form action="" class="mt-4 block"> <input type="file" id="fileInput" accept=".txt" class="w-full my-2 disabled:opacity-0.5 border p-2 rounded-md border-1 border-blue-500" required /> <div style="display: none;" id="loader" class="loader animate-spin"></div> <style> .loader { height: 50px !important; width: 50px !important; margin-top: 20px; border: 6px solid #dcdcdc; border-radius: 999px; border-right-color: #fff; } </style> </form> </div> --> <!-- <script> function disableInput(state) { if (state === "true") { document.getElementById("fileInput").disabled = true; document.getElementById("loader").style.display = ""; } else { document.getElementById("fileInput").disabled = false; document.getElementById("loader").style.display = "none"; } } document.getElementById('fileInput').addEventListener('change', function (event) { disableInput("true"); const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = function (e) { const licenseText = e.target.result; // console.log(text); // Extract information using regex const authorUsername = licenseText.match(/Licensor's Author Username:\s*(.+)/)[1]; const licensee = licenseText.match(/Licensee:\s*(.+)/)[1]; const itemName = licenseText.match(/For the item:\s*(.+)/)[1]; const licenseType = licenseText.match(/purchase of:\s*(ONE .+ LICENSE)/)[1].replace("ONE", "").replace("LICENSE", "").trim().toLowerCase(); const itemId = licenseText.match(/Item ID:\s*(\d+)/)[1]; const licenseCode = licenseText.match(/License Code:\s*(\w+)/)[1]; if (licenseType !== "regular" && licenseType !== "extended") { alert("Invalid License File"); setTimeout(() => { disableInput("false") }, 2000); return; } if (authorUsername.trim() !== "codervp") { alert("Invalid License File"); setTimeout(() => { disableInput("false") }, 2000); return; } if (!itemName.trim().toLowerCase().includes(document.getElementsByTagName("title")[0].innerText.trim().toLowerCase())) { alert("Invalid License File"); setTimeout(() => { disableInput("false") }, 2000); return; } // Create an object with the extracted information const licenseData = { authorUsername: authorUsername, licensee: licensee, itemName: itemName, licenseType: licenseType, itemId: itemId, licenseCode: licenseCode, domain: "<?= $_SERVER['HTTP_HOST'] ?>" }; // Send the data to PHP via AJAX fetch('https://purchases.lustricon.com/index.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(licenseData) }).then(response => response.json()) .then(data => { if (data.status === 'error') { alert(data.message); // Show alert if there's an error (e.g., regular license already used) setTimeout(() => { disableInput("false") }, 2000); } else { alert(data.message); // Log success message localStorage.setItem("license", "valid"); window.location.href = ''; // You can add additional actions here if needed, e.g., redirecting the user or showing a success message. } }) .catch(error => console.error('Error:', error)); }; reader.onerror = function (e) { console.error("Error reading file", e); setTimeout(() => { disableInput("false") }, 2000); }; reader.readAsText(file); } }); </script> --> <?php if (isset($page) && $page == 'term') { ?> <?php // if ($license == "required") { ?> <?php // } else { ?> <div class="agreement tabs-content"> <h3 class="text-2xl font-bold text-gray-800 ">Terms & Condition</h3> <p class="mt-4 text-gray-600">LICENSE AGREEMENT: one (1) Domain (site) Install</p> <p class="mt-4 font-bold text-gray-600">You CAN:</p> <p class="text-gray-600">1) Use on one (1) domain only, additional license purchase required for each additional domain.</span> <p class="text-gray-600">2) Modify or edit as you see fit.</p> <p class="text-gray-600">3) Delete sections as you see fit.</p> <p class="text-gray-600">4) Translate to your choice of language.</p> <p class="mt-4 font-bold text-gray-600">You CANNOT:</p> <p class="text-gray-600">1) Resell, distribute, give away or trade by any means to any third party or individual without permission. </p> <p class="text-gray-600">2) Use on more than one (1) domain.</p> <div class="divider h-[1px] w-full bg-gray-200 mt-6"></div> <form action="?page=requirem"> <div class="agree-button mt-4"> <input required type="checkbox" class="AgreementInput" id="agreeButton"> <label class="text-gray-600" id="agreeButton">Before Continuing You Agreement Terms And Condition</label> </div> <button disabled id="step_1_button" style="width: fit-content;" href="?page=requirem" class="mt-6 block bg-blue-600 px-3 py-2 rounded-md text-sm text-white uppercase spacing-md">Continue</button> </form> </div> <?php // } ?> <?php } ?> <?php if (isset($page) && $page == 'requirem') { ?> <div class="requirements tabs-content"> <table border="1" class="w-full" width="100"> <thead class="py-2 block border-b-2 border-gray-200"> <tr class="flex px-2"> <td class="text-gray-600 w-full">Name</td> <td class="text-gray-600 w-full">Description</td> <td class="text-gray-600 w-full text-right">Status</td> </tr> </thead> <tbody> <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">cURL</td> <td class="text-gray-700 w-full text-xs">Required cURL PHP extension</td> <td class="text-green-600 w-full text-right status-check text-xs"><?php CHECK_CURL() ?></td> </tr> <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">MySQLi</td> <td class="text-gray-700 w-full text-xs">Required MySQLi PHP extension</td> <td class="text-green-600 w-full text-right status-check text-xs"><?php CHECK_MYSQL() ?> </td> </tr> <!-- <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">GD Library </td> <td class="text-gray-700 w-full text-xs">Required GD Library for image cropping </td> <td class="text-green-600 w-full text-right text-xs">&check; Installed</td> </tr> --> <!-- <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">ZIP</td> <td class="text-gray-700 w-full text-xs">Required ZIP extension for backuping data </td> <td class="text-green-600 w-full text-right text-xs">&check; Installed</td> </tr> --> <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">allow_url_fopen</td> <td class="text-gray-700 w-full text-xs">Required allow_url_fopen </td> <td class="text-green-600 w-full text-right status-check text-xs"><?php CHECK_AUF() ?></td> </tr> <!-- <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">FileInfo </td> <td class="text-gray-700 w-full text-xs">Required FileInfo extension for FFMPEG </td> <td class="text-green-600 w-full text-right text-xs">&check; Installed</td> </tr> --> <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">.htaccess </td> <td class="text-gray-700 w-full text-xs">Required .htaccess file for script security (Located in ./Zontal) </td> <td class="text-green-600 w-full text-right status-check text-xs"><?php CHECK_HTACCESS() ?> </td> </tr> <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">zontal.sql</td> <td class="text-gray-700 w-full text-xs ">Required zontal.sql for the installation (Located in root directory) </td> <td class="text-green-600 w-full text-right status-check text-xs"><?php CHECK_TABLE() ?> </td> </tr> <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">config.php</td> <td class="text-gray-700 w-full text-xs">Required config.php to be writable for the installation </td> <td class="text-green-600 w-full text-right status-check text-xs"> <?php CHECK_CONFIG_FILE() ?> </td> </tr> <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">robots.txt</td> <td class="text-gray-700 w-full text-xs">Required robots.txt to be writable for the installation </td> <td class="text-green-600 w-full text-right status-check text-xs"> <?php CHECK_ROBOTS_TXT_FILE() ?> </td> </tr> <!-- <tr class="flex py-2 hover:bg-gray-200 px-2"> <td class="text-gray-700 text-xs w-full">config.json</td> <td class="text-gray-700 w-full text-xs">Required config.php to be writable for the installation (Located in nodejs/config.json) </td> <td class="text-green-600 w-full text-right text-xs">&check; Installed</td> </tr> --> </tbody> </table> <form action="?page=info"> <button href="#" id="step_2_button" style="width: fit-content;" href="?page=info" class="mt-6 block bg-blue-600 px-3 py-2 rounded-md text-sm text-white uppercase spacing-md">Continue</button> </form> </div> <?php } ?> <?php if (isset($page) && $page == 'info') { ?> <form action="setup.php" method="POST" class="installation tabs-content"> <h2 class="text-2xl font-bold text-gray-600">Installation</h2> <div class="form sm:px-6 px-24 mt-6"> <input required type="text" name="host_name" class="w-full bg-gray-100 mb-4 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="SQL Host Name"> <input required type="text" name="db_username" class="w-full bg-gray-100 mb-4 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="SQL Username"> <input type="text" name="db_password" class="w-full bg-gray-100 mb-4 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="SQL Password"> <input required type="text" name="db_name" class="w-full bg-gray-100 mb-4 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="SQL Database Name "> <input id="site_url" required type="text" name="site_url" class="w-full bg-gray-100 mb-1 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="Site URL"> <label class="text-xs text-gray-600 mb-6 block">Example: http://example.com - http://www.example.com </label> <input required type="text" name="site_name" class="w-full bg-gray-100 mb-1 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="Site Name"> <input required type="text" name="site_title" class="w-full bg-gray-100 mb-1 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="Site Title"> <input required type="text" name="admin_username" class="w-full bg-gray-100 mb-1 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="Admin Username"> <input required type="text" name="admin_password" class="w-full bg-gray-100 mb-1 outline-none border-2 rounded-md focus:border-blue-600 px-2 py-2" placeholder="Admin Password"> </div> <!-- <a id="step_3_button" style="width: fit-content;" href="?page=finish" class="mt-6 block bg-blue-600 px-3 py-2 rounded-md text-sm text-white uppercase spacing-md">Install</a> --> <button id="Submit" name="install" class="mt-6 flex gap-5 items-center bg-blue-600 px-3 py-2 rounded-md text-sm text-white uppercase spacing-md" type="button">Install</button> <button type="submit" name="install" id="go" class="opacity-0"></button> </form> <?php } ?> <?php if (isset($page) && $page == 'finish') { ?> <div class="finish tabs-content"> <h2 class="text-2xl mb-4 font-bold text-gray-800">Your Website is Ready!</h2> <p class="text-gray-600"> Congratulations! Zontal Script Has Been Successfully Installed and your website is ready.</p> <p class="text-gray-600"> Login to your admin panel to make changes and modify any default content according to your needs.</p> <a id="step_3_button" style="width: fit-content;" class="mt-6 cursor-pointer block bg-blue-600 px-3 py-2 mt-6 rounded-md text-sm text-white uppercase spacing-md">Let's Start</a> <script> localStorage.setItem("license", "<?= $license ?>"); </script> </div> <?php } ?> </div> </div> <script> var uri = document.URL; var url = uri.replace("install/?page=info", ""); var element_site_url = document.getElementById("site_url"); if (element_site_url) { element_site_url.value = url; } </script> <style> [disabled] { opacity: 0.4; user-select: none; touch-action: none; } button[disabled] { opacity: 0.4; } * { margin: 0; padding: 0; scroll-behavior: smooth; } .loader { height: 10px; width: 10px; border-radius: 50%; border-top: 3px solid #fff; -webkit-animation: 1s spin linear infinite; -moz-animation: 1s spin linear infinite; animation: 1s spin linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-webkit-keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } body { background: #f6f7fb; } .installation-page { max-width: 900px; margin: 50px auto; } .steps .progress-bar { position: absolute; height: 4px; width: 100%; background: #4070f4 !important; z-index: -1; } .progress-bar .indicator { position: absolute; height: 100%; width: 0%; /* background: #4070f4; */ transition: all 300ms ease; } .steps { display: flex; width: 100%; align-items: center; justify-content: space-between; position: relative; } .steps .circle { display: flex; align-items: center; justify-content: center; height: 50px; width: 50px; color: #999; font-size: 22px; font-weight: 500; border-radius: 50%; background: #fff; border: 4px solid #e0e0e0; transition: all 200ms ease; transition-delay: 0s; } .steps .circle.active { transition-delay: 100ms; border-color: #4070f4; color: #4070f4; } .complete { background: #4070f4 !important; color: #fff !important; } </style> <script> // const license = localStorage.getItem("license"); // if (license !== "valid") { // localStorage.setItem("license", "<?= $license ?>"); // } // if (license === 'required') { // // document.querySelector(".purchase-validation").style.display = "block"; // document.querySelectorAll(".tabs-content").forEach((e) => { // e.style.display = "none"; // }); // } else { // // document.querySelector(".purchase-validation").style.display = "none"; // // document.querySelector(".agreement").style.display = ""; // document.querySelectorAll(".tabs-content").forEach((e) => { // e.style.display = ""; // }); // } const STEP_1 = document.getElementById('step_1'); const STEP_2 = document.getElementById('step_2'); const STEP_3 = document.getElementById('step_3'); const STEP_4 = document.getElementById('step_4'); const STEP_1_BUTTON = document.getElementById('step_1_button'); const STEP_2_BUTTON = document.getElementById('step_2_button'); const STEP_5_BUTTON = document.getElementById('step_3_button'); const STEP_3_BUTTON = document.getElementById('Submit'); const STEP_4_BUTTON = document.getElementById('step_4_button'); if (STEP_1_BUTTON !== null) { STEP_1_BUTTON.addEventListener("click", STEP_1_FUNC); } if (STEP_2_BUTTON !== null) { STEP_2_BUTTON.addEventListener("click", STEP_2_FUNC); } if (STEP_3_BUTTON !== null) { STEP_3_BUTTON.addEventListener("click", STEP_3_FUNC); } if (STEP_4_BUTTON !== null) { STEP_4_BUTTON.addEventListener("click", STEP_4_FUNC); } function STEP_1_FUNC() { STEP_1.classList.add("complete"); localStorage.setItem('KEY_1', '1'); } function STEP_2_FUNC() { STEP_2.classList.add("complete"); localStorage.setItem('KEY_2', '2'); } function STEP_3_FUNC() { STEP_3.classList.add("complete"); localStorage.setItem('KEY_3', '3'); var Submit_Button = document.querySelector('#Submit'); Submit_Button.setAttribute("disabled", ""); Submit_Button.innerHTML = "<div class='loader'></div> Install"; // Submit_Button.setAttribute("type", "submit"); document.getElementById('go').click(); // setTimeout(() => { // }, 1000); } function STEP_4_FUNC() { STEP_4.classList.add("complete"); localStorage.setItem('KEY_4', '4'); } const SESSION_1 = localStorage.getItem('KEY_1'); const SESSION_2 = localStorage.getItem('KEY_2'); const SESSION_3 = localStorage.getItem('KEY_3'); const SESSION_4 = localStorage.getItem('KEY_4'); const CURRENT_URL = window.location; const STR_URL = new URL(CURRENT_URL); const PARAM_URL = STR_URL.searchParams; if (SESSION_1) { STEP_1.classList.add('active'); STEP_1.classList.add('complete'); STEP_1.innerHTML = '&check;'; if (PARAM_URL.get("page") == 'term') { window.location.href = '?page=requirem'; } } if (SESSION_2) { STEP_2.classList.add('active'); STEP_2.classList.add('complete'); STEP_2.innerHTML = '&check;'; if (PARAM_URL.get("page") == 'requirem') { window.location.href = '?page=info'; } } if (SESSION_3) { STEP_3.classList.add('active'); STEP_3.classList.add('complete'); STEP_3.innerHTML = '&check;'; if (PARAM_URL.get("page") == 'info') { window.location.href = '?page=finish'; } } if (SESSION_4) { STEP_4.classList.add('active'); STEP_4.classList.add('complete'); STEP_4.innerHTML = '&check;'; if (PARAM_URL.get("page") == 'term') { window.location.href = '?page=requirem'; } } if (PARAM_URL.get("page") == 'term') { STEP_1.classList.add("active"); } if (PARAM_URL.get("page") == 'requirem') { STEP_2.classList.add("active"); } if (PARAM_URL.get("page") == 'info') { STEP_3.classList.add("active"); } if (PARAM_URL.get("page") == 'finish') { STEP_4.classList.add("active"); } const STATUS = document.querySelectorAll('.status-check'); STATUS.forEach((e) => { const STRING = e.textContent.toLowerCase(); if (STRING.indexOf("not") !== -1) { e.style.color = "red"; STEP_2_BUTTON.setAttribute("disabled", "true"); STEP_2_BUTTON.removeAttribute("href"); // console.log("Hello World") } }) function Check_Form_Validity() { document.querySelectorAll('input[required]').forEach((e) => { // e.addEventListener("keyup", () => { if (e.value !== '') { if (document.getElementById("Submit") !== null) { document.getElementById("Submit").disabled = false; } } else { if (document.getElementById("Submit") !== null) { document.getElementById("Submit").disabled = true; } } // }) }); } if (STEP_5_BUTTON !== null) { STEP_5_BUTTON.addEventListener("click", () => { localStorage.clear(); window.location.href = '../'; }) } Check_Form_Validity(); document.querySelectorAll('input[required]').forEach((e) => { e.addEventListener("keyup", () => { Check_Form_Validity(); }) }); document.querySelector('.AgreementInput').addEventListener("click", () => { if (document.querySelector('.AgreementInput').checked === false) { STEP_1_BUTTON.setAttribute("disabled", ""); } else { STEP_1_BUTTON.removeAttribute("disabled"); } }) // console.log(PARAM_URL.get('page')); </script> <script src="tailwind.js"></script> </body> </html>