Refactor code structure for improved readability and maintainability

This commit is contained in:
MaddoScientisto 2026-04-12 17:26:17 +02:00
commit c71e4b4cd0
27 changed files with 1738 additions and 324 deletions

View file

@ -114,6 +114,19 @@ function getCurrentLangValue() {
return $("html").attr("lang") || "it";
}
function getFaceAiStorageValue(fieldId, simulatorKey) {
var field = $("#" + fieldId);
if (field.length && field.val()) {
return field.val();
}
if (window.faceAiSimulator && window.faceAiSimulator.raceStorage && window.faceAiSimulator.raceStorage[simulatorKey]) {
return window.faceAiSimulator.raceStorage[simulatorKey];
}
return "";
}
function faceAiFeatureEnabled() {
var config = window.faceAiConfig || {};
var simulatorConfig = window.faceAiSimulator || {};
@ -136,6 +149,57 @@ function faceAiEscapeHtml(value) {
.replace(/'/g, "'");
}
function isFaceAiDebugEnabled() {
var hostname = window.location && window.location.hostname ? window.location.hostname : "";
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
}
function getFaceAiDebugPayload() {
var raceYear = getFaceAiStorageValue("faceAiRaceYear", "year");
var raceMonthFolder = getFaceAiStorageValue("faceAiRaceMonthFolder", "monthFolder");
var raceFolder = getFaceAiStorageValue("faceAiRaceFolder", "raceFolder");
var racePathBase = $("#faceAiRacePathBase").val() || "";
var raceStorageRelativeDir = $("#faceAiRaceStorageRelativeDir").val() || [raceYear, raceMonthFolder, raceFolder].filter(Boolean).join("/");
var simulatorConfig = window.faceAiSimulator || null;
return {
pageUrl: window.location.href,
race: {
id: $("#id_gara").val() || "",
slug: $("#garaDesc").val() || "",
name: $("h1.my-4").last().text().replace(/\s+/g, " ").trim(),
lang: getCurrentLangValue(),
storage: {
year: raceYear,
monthFolder: raceMonthFolder,
raceFolder: raceFolder,
pathBase: racePathBase,
relativeDir: raceStorageRelativeDir
}
},
simulator: simulatorConfig,
handoff: {
url: (simulatorConfig && simulatorConfig.handoffUrl) || "faceai_handoff.php",
returnUrl: (simulatorConfig && simulatorConfig.returnUrl) || window.location.href
}
};
}
function logFaceAiDebug(label, extraPayload) {
if (!isFaceAiDebugEnabled() || !window.console || typeof window.console.groupCollapsed !== "function") {
return;
}
var payload = getFaceAiDebugPayload();
if (extraPayload) {
payload.extra = extraPayload;
}
window.console.groupCollapsed("[FaceAI] " + label);
window.console.log(payload);
window.console.groupEnd();
}
function getFaceAiErrorState() {
if (typeof URLSearchParams === "undefined") {
return null;
@ -191,6 +255,9 @@ function buildFaceAiLaunchUrl() {
var raceId = $("#id_gara").val() || "";
var raceSlug = $("#garaDesc").val() || "";
var raceName = $("h1.my-4").last().text().replace(/\s+/g, " ").trim();
var raceYear = getFaceAiStorageValue("faceAiRaceYear", "year");
var raceMonthFolder = getFaceAiStorageValue("faceAiRaceMonthFolder", "monthFolder");
var raceFolder = getFaceAiStorageValue("faceAiRaceFolder", "raceFolder");
var lang = getCurrentLangValue();
var handoffUrl = (window.faceAiSimulator && window.faceAiSimulator.handoffUrl) || "faceai_handoff.php";
var returnUrl = (window.faceAiSimulator && window.faceAiSimulator.returnUrl) || window.location.href;
@ -198,6 +265,9 @@ function buildFaceAiLaunchUrl() {
"raceId=" + encodeURIComponent(raceId),
"raceSlug=" + encodeURIComponent(raceSlug),
"raceName=" + encodeURIComponent(raceName),
"raceYear=" + encodeURIComponent(raceYear),
"raceMonthFolder=" + encodeURIComponent(raceMonthFolder),
"raceFolder=" + encodeURIComponent(raceFolder),
"lang=" + encodeURIComponent(lang),
"returnUrl=" + encodeURIComponent(returnUrl)
];
@ -215,10 +285,18 @@ function buildFaceAiLaunchUrl() {
query.push("devMembershipStatus=" + encodeURIComponent(window.faceAiSimulator.devMembershipStatus));
}
logFaceAiDebug("Legacy launch payload prepared", {
query: query.slice(0),
raceId: raceId,
raceSlug: raceSlug,
raceName: raceName
});
return handoffUrl + "?" + query.join("&");
}
function launchFaceAi() {
logFaceAiDebug("Redirecting to FaceAI handoff");
$("body").addClass("loading");
window.location.href = buildFaceAiLaunchUrl();
return false;
@ -451,6 +529,7 @@ function goPage()
$(function() {
initFaceAiRaceSearchButton();
initFaceAiErrorModal();
logFaceAiDebug("Legacy race page ready");
});

View file

@ -8,6 +8,9 @@ try {
$raceId = faceai_request_value('raceId');
$raceSlug = faceai_request_value('raceSlug');
$raceName = faceai_request_value('raceName', $raceSlug !== '' ? $raceSlug : $raceId);
$raceYear = faceai_request_value('raceYear');
$raceMonthFolder = faceai_request_value('raceMonthFolder');
$raceFolder = faceai_request_value('raceFolder');
$lang = faceai_request_value('lang', 'it');
$returnUrl = faceai_request_value('returnUrl');
@ -36,6 +39,20 @@ try {
faceai_redirect_with_error($returnUrl, 'Il tuo account non e abilitato all uso di Face ID.');
}
$racePayload = array(
'id' => $raceId,
'slug' => $raceSlug !== '' ? $raceSlug : $raceId,
'name' => $raceName !== '' ? $raceName : $raceId
);
if ($raceYear !== '' && $raceMonthFolder !== '' && $raceFolder !== '') {
$racePayload['storage'] = array(
'year' => $raceYear,
'monthFolder' => $raceMonthFolder,
'raceFolder' => strtoupper(trim($raceFolder))
);
}
$payload = array(
'type' => 'handoff',
'user' => array(
@ -44,11 +61,7 @@ try {
'email' => $identity['email'],
'membershipStatus' => $identity['membershipStatus']
),
'race' => array(
'id' => $raceId,
'slug' => $raceSlug !== '' ? $raceSlug : $raceId,
'name' => $raceName !== '' ? $raceName : $raceId
),
'race' => $racePayload,
'lang' => $lang,
'returnUrl' => $returnUrl,
'expiresAt' => ((int) round(microtime(true) * 1000)) + (5 * 60 * 1000)

View file

@ -1,11 +1,14 @@
<?php
require_once __DIR__ . '/faceai_simulator_view.php';
$raceId = isset($_GET['raceId']) ? trim((string) $_GET['raceId']) : '101';
$raceId = isset($_GET['raceId']) ? trim((string) $_GET['raceId']) : '202';
$lang = isset($_GET['lang']) ? trim((string) $_GET['lang']) : 'it';
$raceSlug = isset($_GET['raceSlug']) ? trim((string) $_GET['raceSlug']) : 'mezza-di-firenze';
$raceName = isset($_GET['raceName']) ? trim((string) $_GET['raceName']) : 'Mezza di Firenze';
$returnUrl = 'http://localhost:8080/faceai_simulator.php?raceId=' . rawurlencode($raceId) . '&lang=' . rawurlencode($lang) . '&raceSlug=' . rawurlencode($raceSlug) . '&raceName=' . rawurlencode($raceName);
$raceSlug = isset($_GET['raceSlug']) ? trim((string) $_GET['raceSlug']) : 'mezza-di-pisa';
$raceName = isset($_GET['raceName']) ? trim((string) $_GET['raceName']) : 'Mezza di Pisa';
$raceYear = isset($_GET['raceYear']) ? trim((string) $_GET['raceYear']) : '2026';
$raceMonthFolder = isset($_GET['raceMonthFolder']) ? trim((string) $_GET['raceMonthFolder']) : '04.APRILE';
$raceFolder = isset($_GET['raceFolder']) ? trim((string) $_GET['raceFolder']) : 'PISA';
$returnUrl = 'http://localhost:8080/faceai_simulator.php?raceId=' . rawurlencode($raceId) . '&lang=' . rawurlencode($lang) . '&raceSlug=' . rawurlencode($raceSlug) . '&raceName=' . rawurlencode($raceName) . '&raceYear=' . rawurlencode($raceYear) . '&raceMonthFolder=' . rawurlencode($raceMonthFolder) . '&raceFolder=' . rawurlencode($raceFolder);
$photos = array(
array('id' => 'f101-001', 'thumb' => 'thumb-arrivo-001.jpg', 'label' => 'Arrivo 001', 'checkpoint' => 'Arrivo'),
@ -27,6 +30,9 @@ faceai_sim_render_page(array(
'lang' => $lang,
'raceSlug' => $raceSlug,
'raceName' => $raceName,
'raceYear' => $raceYear,
'raceMonthFolder' => $raceMonthFolder,
'raceFolder' => $raceFolder,
'returnUrl' => $returnUrl,
'banner' => 'Questa pagina PHP simula il punto di ingresso del sito legacy. Il vecchio select con ID <strong>tipoPuntoFoto</strong> viene rimosso dal JavaScript originale e sostituito dal pulsante Face ID.',
'totalLabel' => count($photos) . ' foto demo',

View file

@ -11,6 +11,9 @@ function faceai_sim_render_page(array $options)
$lang = $options['lang'];
$raceSlug = $options['raceSlug'];
$raceName = $options['raceName'];
$raceYear = $options['raceYear'] ?? '';
$raceMonthFolder = $options['raceMonthFolder'] ?? '';
$raceFolder = $options['raceFolder'] ?? '';
$returnUrl = $options['returnUrl'];
$banner = $options['banner'];
$totalLabel = $options['totalLabel'];
@ -69,8 +72,8 @@ function faceai_sim_render_page(array $options)
<nav class="navbar fixed-top navbar-expand-lg navbar-light bg-white fixed-top">
<div class="container">
<a class="navbar-brand" href="faceai_simulator.php?raceId=<?php echo faceai_sim_html($raceId); ?>&lang=<?php echo faceai_sim_html($lang); ?>"><img src="images/layout/regalami-un-sorriso-ets-640.png" alt="Regalami Un Sorriso Ets" width="100"></a>
<button class="navbar-toggler navbar-toggler-right" type="button"><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse show" id="navbarResponsive">
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link" href="index.jsp">Home</a></li>
<li class="nav-item"><a class="nav-link" href="associazione.jsp">Associazione</a></li>
@ -105,6 +108,9 @@ function faceai_sim_render_page(array $options)
<input name="id_gara" id="id_gara" type="hidden" value="<?php echo faceai_sim_html($raceId); ?>">
<input name="id_foto" id="id_foto" type="hidden">
<input name="garaDesc" id="garaDesc" type="hidden" value="<?php echo faceai_sim_html($raceSlug); ?>">
<input name="faceAiRaceYear" id="faceAiRaceYear" type="hidden" value="<?php echo faceai_sim_html($raceYear); ?>">
<input name="faceAiRaceMonthFolder" id="faceAiRaceMonthFolder" type="hidden" value="<?php echo faceai_sim_html($raceMonthFolder); ?>">
<input name="faceAiRaceFolder" id="faceAiRaceFolder" type="hidden" value="<?php echo faceai_sim_html($raceFolder); ?>">
<input name="lang" id="lang" type="hidden" value="<?php echo faceai_sim_html($lang); ?>">
<input name="pageNumber" id="pageNumber" type="hidden" value="1">
<input name="actionPage" id="actionPage" type="hidden" value="Foto.abl">
@ -169,11 +175,54 @@ window.faceAiSimulator = {
enabled: true,
handoffUrl: 'faceai_handoff.php',
returnUrl: <?php echo json_encode($returnUrl); ?>,
raceStorage: {
year: <?php echo json_encode($raceYear); ?>,
monthFolder: <?php echo json_encode($raceMonthFolder); ?>,
raceFolder: <?php echo json_encode($raceFolder); ?>
},
devUserId: '1',
devDisplayName: 'Mario Rossi',
devEmail: 'mario.rossi@example.test',
devMembershipStatus: 'active'
};
(function () {
var hostname = window.location && window.location.hostname ? window.location.hostname : '';
var isLocalDebug = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1';
if (!isLocalDebug || !window.console || typeof window.console.groupCollapsed !== 'function') {
return;
}
window.console.groupCollapsed('[FaceAI] Simulator bootstrap');
window.console.log({
pageUrl: window.location.href,
race: {
id: <?php echo json_encode($raceId); ?>,
slug: <?php echo json_encode($raceSlug); ?>,
name: <?php echo json_encode($raceName); ?>,
lang: <?php echo json_encode($lang); ?>,
storage: {
year: <?php echo json_encode($raceYear); ?>,
monthFolder: <?php echo json_encode($raceMonthFolder); ?>,
raceFolder: <?php echo json_encode($raceFolder); ?>,
relativeDir: <?php echo json_encode(implode('/', array_values(array_filter([$raceYear, $raceMonthFolder, $raceFolder], static function ($segment) {
return $segment !== null && $segment !== '';
})))); ?>
}
},
handoff: {
url: 'faceai_handoff.php',
returnUrl: <?php echo json_encode($returnUrl); ?>
},
devUser: {
id: '1',
displayName: 'Mario Rossi',
email: 'mario.rossi@example.test',
membershipStatus: 'active'
}
});
window.console.groupEnd();
}());
</script>
<?php endif; ?>
<script src="vendor/jquery/jquery.min.js"></script>

View file

@ -56,6 +56,50 @@ if (faceAiFeatureEnabledValue == null) {
faceAiFeatureEnabledValue = System.getProperty("FACEAI_FEATURE_ENABLED", "0");
}
boolean faceAiFeatureEnabled = "1".equals(faceAiFeatureEnabledValue) || "true".equalsIgnoreCase(faceAiFeatureEnabledValue) || "yes".equalsIgnoreCase(faceAiFeatureEnabledValue) || "on".equalsIgnoreCase(faceAiFeatureEnabledValue);
java.util.Date faceAiRaceDate = CR.getGara().getDataGaraInizio();
String faceAiRacePathBase = CR.getGara().getPathBase() != null ? CR.getGara().getPathBase().trim() : "";
String faceAiRaceYear = "";
String faceAiRaceMonthFolder = "";
String faceAiRaceFolder = "";
String faceAiRaceStorageRelativeDir = "";
if (!faceAiRacePathBase.isEmpty()) {
String[] faceAiPathSegments = faceAiRacePathBase.split("/");
java.util.ArrayList faceAiNormalizedSegments = new java.util.ArrayList();
for (int faceAiSegmentIndex = 0; faceAiSegmentIndex < faceAiPathSegments.length; faceAiSegmentIndex++) {
String faceAiSegment = faceAiPathSegments[faceAiSegmentIndex] != null ? faceAiPathSegments[faceAiSegmentIndex].trim() : "";
if (!faceAiSegment.isEmpty()) {
faceAiNormalizedSegments.add(faceAiSegment);
}
}
if (faceAiNormalizedSegments.size() > 0) {
faceAiRaceYear = (String) faceAiNormalizedSegments.get(0);
}
if (faceAiNormalizedSegments.size() > 1) {
faceAiRaceMonthFolder = (String) faceAiNormalizedSegments.get(1);
}
if (faceAiNormalizedSegments.size() > 2) {
faceAiRaceFolder = (String) faceAiNormalizedSegments.get(2);
} else if (faceAiNormalizedSegments.size() > 1) {
faceAiRaceFolder = (String) faceAiNormalizedSegments.get(faceAiNormalizedSegments.size() - 1);
}
}
if (faceAiRaceYear.isEmpty() && faceAiRaceDate != null) {
java.util.Calendar faceAiCalendar = java.util.Calendar.getInstance();
faceAiCalendar.setTime(faceAiRaceDate);
faceAiRaceYear = String.valueOf(faceAiCalendar.get(java.util.Calendar.YEAR));
}
if (faceAiRaceFolder.isEmpty()) {
faceAiRaceFolder = String.valueOf(CR.getGara().getId_gara());
}
if (!faceAiRaceYear.isEmpty()) {
faceAiRaceStorageRelativeDir = faceAiRaceYear;
if (!faceAiRaceMonthFolder.isEmpty()) {
faceAiRaceStorageRelativeDir += "/" + faceAiRaceMonthFolder;
}
if (!faceAiRaceFolder.isEmpty()) {
faceAiRaceStorageRelativeDir += "/" + faceAiRaceFolder;
}
}
%>
<!-- InstanceEndEditable -->
<!-- InstanceBeginEditable name="doctitle" -->
@ -121,6 +165,11 @@ boolean faceAiFeatureEnabled = "1".equals(faceAiFeatureEnabledValue) || "true".e
<input name="id_gara" id="id_gara" type="hidden" value="<%= CR.getId_gara() %>">
<input name="id_foto" id="id_foto" type="hidden">
<input name="garaDesc" id="garaDesc" type="hidden" value="<%=bean.getDescrizioneGaraHtml() %>">
<input name="faceAiRaceYear" id="faceAiRaceYear" type="hidden" value="<%= faceAiRaceYear %>">
<input name="faceAiRaceMonthFolder" id="faceAiRaceMonthFolder" type="hidden" value="<%= faceAiRaceMonthFolder %>">
<input name="faceAiRaceFolder" id="faceAiRaceFolder" type="hidden" value="<%= faceAiRaceFolder %>">
<input name="faceAiRacePathBase" id="faceAiRacePathBase" type="hidden" value="<%= faceAiRacePathBase %>">
<input name="faceAiRaceStorageRelativeDir" id="faceAiRaceStorageRelativeDir" type="hidden" value="<%= faceAiRaceStorageRelativeDir %>">
<div class="row">
<input type="hidden" name="pageNumber" id="pageNumber" value="<%=list.getPageNumber()%>">
<input type="hidden" name="actionPage" id="actionPage" value="Foto.abl">

View file

@ -56,6 +56,50 @@ if (faceAiFeatureEnabledValue == null) {
faceAiFeatureEnabledValue = System.getProperty("FACEAI_FEATURE_ENABLED", "0");
}
boolean faceAiFeatureEnabled = "1".equals(faceAiFeatureEnabledValue) || "true".equalsIgnoreCase(faceAiFeatureEnabledValue) || "yes".equalsIgnoreCase(faceAiFeatureEnabledValue) || "on".equalsIgnoreCase(faceAiFeatureEnabledValue);
java.util.Date faceAiRaceDate = CR.getGara().getDataGaraInizio();
String faceAiRacePathBase = CR.getGara().getPathBase() != null ? CR.getGara().getPathBase().trim() : "";
String faceAiRaceYear = "";
String faceAiRaceMonthFolder = "";
String faceAiRaceFolder = "";
String faceAiRaceStorageRelativeDir = "";
if (!faceAiRacePathBase.isEmpty()) {
String[] faceAiPathSegments = faceAiRacePathBase.split("/");
java.util.ArrayList faceAiNormalizedSegments = new java.util.ArrayList();
for (int faceAiSegmentIndex = 0; faceAiSegmentIndex < faceAiPathSegments.length; faceAiSegmentIndex++) {
String faceAiSegment = faceAiPathSegments[faceAiSegmentIndex] != null ? faceAiPathSegments[faceAiSegmentIndex].trim() : "";
if (!faceAiSegment.isEmpty()) {
faceAiNormalizedSegments.add(faceAiSegment);
}
}
if (faceAiNormalizedSegments.size() > 0) {
faceAiRaceYear = (String) faceAiNormalizedSegments.get(0);
}
if (faceAiNormalizedSegments.size() > 1) {
faceAiRaceMonthFolder = (String) faceAiNormalizedSegments.get(1);
}
if (faceAiNormalizedSegments.size() > 2) {
faceAiRaceFolder = (String) faceAiNormalizedSegments.get(2);
} else if (faceAiNormalizedSegments.size() > 1) {
faceAiRaceFolder = (String) faceAiNormalizedSegments.get(faceAiNormalizedSegments.size() - 1);
}
}
if (faceAiRaceYear.isEmpty() && faceAiRaceDate != null) {
java.util.Calendar faceAiCalendar = java.util.Calendar.getInstance();
faceAiCalendar.setTime(faceAiRaceDate);
faceAiRaceYear = String.valueOf(faceAiCalendar.get(java.util.Calendar.YEAR));
}
if (faceAiRaceFolder.isEmpty()) {
faceAiRaceFolder = String.valueOf(CR.getGara().getId_gara());
}
if (!faceAiRaceYear.isEmpty()) {
faceAiRaceStorageRelativeDir = faceAiRaceYear;
if (!faceAiRaceMonthFolder.isEmpty()) {
faceAiRaceStorageRelativeDir += "/" + faceAiRaceMonthFolder;
}
if (!faceAiRaceFolder.isEmpty()) {
faceAiRaceStorageRelativeDir += "/" + faceAiRaceFolder;
}
}
%>
<!-- InstanceEndEditable -->
<!-- InstanceBeginEditable name="doctitle" -->
@ -121,6 +165,11 @@ boolean faceAiFeatureEnabled = "1".equals(faceAiFeatureEnabledValue) || "true".e
<input name="id_gara" id="id_gara" type="hidden" value="<%= CR.getId_gara() %>">
<input name="id_foto" id="id_foto" type="hidden">
<input name="garaDesc" id="garaDesc" type="hidden" value="<%=bean.getDescrizioneGaraHtml() %>">
<input name="faceAiRaceYear" id="faceAiRaceYear" type="hidden" value="<%= faceAiRaceYear %>">
<input name="faceAiRaceMonthFolder" id="faceAiRaceMonthFolder" type="hidden" value="<%= faceAiRaceMonthFolder %>">
<input name="faceAiRaceFolder" id="faceAiRaceFolder" type="hidden" value="<%= faceAiRaceFolder %>">
<input name="faceAiRacePathBase" id="faceAiRacePathBase" type="hidden" value="<%= faceAiRacePathBase %>">
<input name="faceAiRaceStorageRelativeDir" id="faceAiRaceStorageRelativeDir" type="hidden" value="<%= faceAiRaceStorageRelativeDir %>">
<div class="row">
<input type="hidden" name="pageNumber" id="pageNumber" value="<%=list.getPageNumber()%>">
<input type="hidden" name="actionPage" id="actionPage" value="Foto.abl">