Υπεγράφη η σύμβαση για την υλοποίηση του έργου επισκευής και αντικατάστασης κατεστραμμένων αρμών γεφυρών στο πρωτεύον αστικό δίκτυο αρμοδιότητας της Περιφέρειας Αττικής, συνολικού προϋπολογισμού 1 εκ. ευρώ, από τον περιφερειάρχη Αττικής Γ. Πατούλη. Ειδικότερα, σύμφωνα με σχετική ανακοίνωση, το συγκεκριμένο έργο προβλέπει την τακτική συντήρηση, επισκευή αλλά και αντικατάσταση των αρμών διαστολής οι οποίοι υπάρχουν στα σημεία σύνδεσης των οδικών γεφυρών του πρωτεύοντος αστικού οδικού δικτύου. Πρόκειται για εργασίες νευραλγικής σημασίας καθώς ο υλικό των αρμών διαστολής συχνότατα εμφανίζει κόπωση από το πέρασμα των χρόνων, με αποτέλεσμα να μην επιτελεί το σκοπό για τον οποίο προορίζεται που δεν είναι άλλος από την απόσβεση των συστολών και διαστολών που παρουσιάζουν τα διαφορετικά τμήματα από τα οποία αποτελείται μία οδική γέφυρα. «Παραμένουμε πιστοί στις δεσμεύσεις μας πως στο επίκεντρο των πολιτικών μας είναι η ασφάλεια του πολίτη. Σ΄ αυτό το πλαίσιο υλοποιούμε έργα που στόχο έχουν την ενίσχυση της οδικής ασφάλειας στο αστικό δίκτυο που είναι στην αρμοδιότητά μας και τα οποία εκσυγχρονίζουν τις υποδομές μας, προς όφελος των πολιτών. Θα συνεχίσουμε προς την ίδια κατεύθυνση και με άλλες παρεμβάσεις καθώς η ποιοτική βελτίωση της ζωής και η προστασία των πολιτών είναι προτεραιότητα»., σημειώνει ο Γ. Πατούλης.
');
}
},
error: function() {
// Fallback to admin-ajax if REST API fails
$.ajax({
url: 'https://www.xtesini.gr/wp-admin/admin-ajax.php',
type: 'POST',
data: {
action: 'get_recommendations_carousel',
limit: limit,
nonce: '940da0b272'
},
success: function(response) {
if (response.success && response.data.html) {
container.html(response.data.html);
initializeCarousel($('#carousel_684e9bb69e98b'));
} else {
container.html('
');
}
}
});
}
});
// Carousel initialization function
function initializeCarousel($wrapper) {
var $container = $wrapper.find(".carousel-container");
var $carousel = $wrapper.find(".related-articles-carousel");
var $items = $wrapper.find(".carousel-item");
var $prevBtn = $wrapper.find(".prev-arrow");
var $nextBtn = $wrapper.find(".next-arrow");
if ($items.length === 0) return;
var itemWidth = $items.first().outerWidth(true);
var visibleItems = Math.floor($container.parent().width() / itemWidth);
var position = 0;
var maxPosition = Math.max(0, $items.length - visibleItems);
// Touch handling variables
var isDragging = false;
var startX = 0;
var startY = 0;
var currentX = 0;
var currentTranslate = 0;
var startTranslate = 0;
var threshold = 10;
var isScrolling = null;
// Hide prev button initially
$prevBtn.css("opacity", "0.5");
// Navigation
$nextBtn.click(function() {
if (position < maxPosition) {
position++;
updatePosition();
}
});
$prevBtn.click(function() {
if (position > 0) {
position--;
updatePosition();
}
});
// Touch support
$carousel.on("touchstart", function(e) {
var touch = e.originalEvent.touches[0];
startX = touch.clientX;
startY = touch.clientY;
isDragging = true;
isScrolling = null;
var transform = $container.css("transform");
var matrix = transform.replace(/[^0-9,.\-]/g, "").split(",");
startTranslate = currentTranslate = matrix[4] ? parseInt(matrix[4]) : 0;
$container.css("transition", "none");
});
$carousel.on("touchmove", function(e) {
if (!isDragging) return;
var touch = e.originalEvent.touches[0];
var deltaX = touch.clientX - startX;
var deltaY = touch.clientY - startY;
if (isScrolling === null) {
if (Math.abs(deltaX) > threshold || Math.abs(deltaY) > threshold) {
isScrolling = Math.abs(deltaY) > Math.abs(deltaX) * 0.7;
}
}
if (isScrolling === true) {
isDragging = false;
$container.css("transition", "transform 0.3s ease");
return;
}
if (isScrolling === false) {
e.preventDefault();
currentX = deltaX;
var newTranslate = startTranslate + deltaX;
var minTranslate = -maxPosition * itemWidth;
var maxTranslate = 0;
if (newTranslate > maxTranslate) {
newTranslate = maxTranslate + (newTranslate - maxTranslate) * 0.3;
} else if (newTranslate < minTranslate) {
newTranslate = minTranslate + (newTranslate - minTranslate) * 0.3;
}
$container.css("transform", "translateX(" + newTranslate + "px)");
}
});
$carousel.on("touchend", function(e) {
if (!isDragging || isScrolling === true) return;
isDragging = false;
$container.css("transition", "transform 0.3s ease");
var prevPosition = position;
if (Math.abs(currentX) > itemWidth * 0.25) {
if (currentX > 0 && position > 0) {
position--;
} else if (currentX < 0 && position < maxPosition) {
position++;
}
}
if (position !== prevPosition && window.RecommendationTracker) {
var action = position > prevPosition ? 'next' : 'prev';
window.RecommendationTracker.trackCarouselInteraction(action);
}
updatePosition();
isScrolling = null;
currentX = 0;
});
function updatePosition() {
var translateX = -position * itemWidth;
currentTranslate = translateX;
$container.css({
"transition": "transform 0.3s ease",
"transform": "translateX(" + translateX + "px)"
});
$prevBtn.css("opacity", position <= 0 ? "0.5" : "1");
$nextBtn.css("opacity", position >= maxPosition ? "0.5" : "1");
}
// Responsive
$(window).on("resize", function() {
itemWidth = $items.first().outerWidth(true);
visibleItems = Math.floor($container.parent().width() / itemWidth);
maxPosition = Math.max(0, $items.length - visibleItems);
if (position > maxPosition) {
position = maxPosition;
}
updatePosition();
});
updatePosition();
}
});