/* =========================================================
🎯 AI RETURN VISITOR OPTIMIZER v2.5 - CROSS-PLATFORM EDITION
ΒΑΣΙΚΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ v2.0 (ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΑ):
- Μετρητής για 4 φυσικές σφυρίχτρες
- Έξυπνη επιλογή 4 πιο πιθανών αγοραστών
- Βελτιστοποίηση Google Adsense
- Πλήρη χαρακτηριστικά v1.2
ΝΕΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ:
- Ενσωμάτωση YouTube καναλιού (@e_repellent_com)
- Αμφίδρομη απόδοση μετά από 4 ημέρες
- Ανίχνευση προέλευσης επισκέπτη
========================================================= */
(function() {
'use strict';
if (window.__RETURN_VISITOR_OPTIMIZER_V25__) return;
window.__RETURN_VISITOR_OPTIMIZER_V25__ = true;
const CONFIG = {
// ΠΑΡΑΜΕΤΡΟΣ ΠΑΡΑΓΓΕΛΙΩΝ: ΑΛΛΑΞΤΕ ΤΟΝ ΑΡΙΘΜΟ ΓΙΑ ΝΑ ΟΡΙΣΕΤΕ ΠΟΣΕΣ ΦΥΣΙΚΕΣ ΣΦΥΡΙΧΤΡΕΣ ΘΕΛΕΤΕ ΝΑ ΠΟΥΛΗΣΕΤΕ
physicalWhistlesToSell: 4, // ΟΡΙΣΤΕ ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΩΝ ΠΑΡΑΓΓΕΛΙΩΝ (Π.Χ. 4)
returnThreshold: 7 * 24 * 60 * 60 * 1000,
revisitReminder: 3 * 24 * 60 * 60 * 1000,
returnWindowHours: 7,
adRefreshInterval: 30000, // Ανανέωση Adsense κάθε 30 δευτερόλεπτα για αυξημένα έσοδα
// ΝΕΟ: Ρυθμίσεις καναλιών
channels: {
youtube: {
name: 'YouTube',
url: 'https://youtube.com/@e_repellent_com?si=WHNpV5rq6ZFeRsC_',
handle: '@e_repellent_com',
icon: '📺',
returnDays: 4, // Επιστροφή μετά από 4 μέρες
returnMessage: '🎬 Επιστρέψτε στο YouTube για νέα βίντεο!'
},
tiktok: {
name: 'TikTok',
url: 'https://tiktok.com/@e_repellent_com', // ΒΑΛΤΕ ΤΟ ΣΩΣΤΟ LINK
handle: '@e_repellent_com',
icon: '🎵',
returnDays: 4, // Επιστροφή μετά από 4 μέρες
returnMessage: '🎵 Μην χάσετε τα νέα βίντεο στο TikTok!'
}
},
incentives: {
firstReturn: {
type: 'discount',
value: '10%',
message: 'Επιστρέψατε! Απολαύστε 10% έκπτωση στην επόμενη αγορά σας'
},
loyaltyPoints: true,
exclusiveContent: true
},
useCookies: true,
useLocalStorage: true,
useSessionStorage: true,
enableReminders: true,
reminderMethods: ['email', 'push'],
popupDelay: 5000,
exitIntent: true,
enableGamification: true,
returnStreak: true,
useAIScoring: true,
tiktokLinks: ['tiktok.com', 'vm.tiktok.com']
};
const isLocalStorageAvailable = () => {
try { return 'localStorage' in window && window.localStorage !== null; }
catch { return false; }
};
// ΝΕΟ: Ανίχνευση προέλευσης επισκέπτη
const SourceDetector = {
getSource: function() {
// Έλεγχος referrer
const referrer = document.referrer || '';
if (referrer.includes('youtube.com') || referrer.includes('youtu.be')) {
return 'youtube';
}
if (referrer.includes('tiktok.com') || referrer.includes('vm.tiktok.com')) {
return 'tiktok';
}
// Έλεγχος URL parameters
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get('source') === 'youtube') return 'youtube';
if (urlParams.get('source') === 'tiktok') return 'tiktok';
// Έλεγχος cookies για προηγούμενη επίσκεψη
const lastSource = this.getCookie('last_source');
if (lastSource) return lastSource;
return 'direct';
},
getCookie: function(name) {
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
return match ? match[2] : null;
},
setSourceCookie: function(source) {
document.cookie = `last_source=${source}; max-age=2592000; path=/`; // 30 μέρες
},
// Έλεγχος αν πρέπει να προτρέψουμε για επιστροφή (μετά από 4 μέρες)
shouldPromptReturn: function(visitor) {
if (!visitor || !visitor.source || visitor.source === 'direct') return false;
const daysSinceLastChannelVisit = (Date.now() - (visitor.lastChannelVisit || 0)) / (24 * 60 * 60 * 1000);
const targetDays = CONFIG.channels[visitor.source]?.returnDays || 4;
return daysSinceLastChannelVisit >= targetDays;
}
};
const VisitorDB = {
getVisitorId: function() {
if (!isLocalStorageAvailable()) return 'visitor_' + Date.now();
let visitorId = localStorage.getItem('visitor_unique_id_v25');
if (!visitorId) {
visitorId = 'visitor_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
localStorage.setItem('visitor_unique_id_v25', visitorId);
}
return visitorId;
},
data: null,
load: function() {
try {
if (!isLocalStorageAvailable()) {
this.data = this.getDefaultData();
return this.data;
}
const stored = localStorage.getItem('visitor_return_data_v25');
this.data = stored ? JSON.parse(stored) : this.getDefaultData();
} catch (e) {
this.data = this.getDefaultData();
}
return this.data;
},
save: function() {
try {
if (!isLocalStorageAvailable() || !this.data) return;
localStorage.setItem('visitor_return_data_v25', JSON.stringify(this.data));
// Αποθήκευση πηγής και σε cookie
if (this.data.source) {
SourceDetector.setSourceCookie(this.data.source);
}
} catch (e) {}
},
getDefaultData: function() {
const source = SourceDetector.getSource();
return {
visitorId: this.getVisitorId(),
// ΝΕΟ: Πληροφορίες προέλευσης
source: source, // 'youtube', 'tiktok', ή 'direct'
firstVisit: Date.now(),
lastVisit: Date.now(),
// ΝΕΟ: Τελευταία επίσκεψη από κανάλι
lastChannelVisit: Date.now(),
visitCount: 1,
returnCount: 0,
totalVisits: 1,
pagesViewed: [window.location.pathname],
timeOnSite: 0,
returnProbability: 0,
incentivesClaimed: [],
email: null,
phone: null,
returnStreak: 0,
longestStreak: 0,
preferences: {},
conversionIntent: 0,
lastInteraction: Date.now(),
reminderSent: false,
returnScore: 0,
abandonedCart: false,
lastVisitDate: new Date().toDateString(),
lastVisitTimestamp: Date.now(),
// ΝΕΑ ΠΕΔΙΑ ΓΙΑ ΤΟΝ ΜΕΤΡΗΤΗ ΠΑΡΑΓΓΕΛΙΩΝ
purchaseIntent: 0,
productInterest: { physicalWhistle: 0 },
adInteractions: 0,
scrollDepth: 0,
cursorHeatmap: [],
timeOnProductPages: 0,
quickReturns: 0,
// Μετρητής παραγγελιών
orders: {
physicalWhistle: {
count: 0,
target: CONFIG.physicalWhistlesToSell,
completed: false
}
},
// ΝΕΟ: Στατιστικά ανά κανάλι
channelVisits: {
youtube: source === 'youtube' ? 1 : 0,
tiktok: source === 'tiktok' ? 1 : 0,
direct: source === 'direct' ? 1 : 0
},
// ΝΕΟ: Πότε έκανε τελευταία φορά return στο κάθε κανάλι
lastChannelReturn: {
youtube: null,
tiktok: null
}
};
}
};
// ΝΕΟ: Σύστημα cross-platform προτροπών
const CrossPlatformPrompter = {
init: function(visitor) {
if (!visitor) return;
// Ενημέρωση στατιστικών καναλιού
if (visitor.source !== 'direct') {
visitor.channelVisits[visitor.source] = (visitor.channelVisits[visitor.source] || 0) + 1;
visitor.lastChannelVisit = Date.now();
VisitorDB.save();
}
// Έλεγχος για προτροπή επιστροφής (μετά από 4 μέρες)
if (SourceDetector.shouldPromptReturn(visitor) && visitor.source !== 'direct') {
this.showReturnPrompt(visitor);
}
// Εμφάνιση welcome message με βάση την πηγή (μόνο για πρώτη επίσκεψη)
if (visitor.visitCount === 1 && visitor.source !== 'direct') {
this.showWelcomeMessage(visitor);
}
},
showWelcomeMessage: function(visitor) {
if (!visitor || !visitor.source) return;
const channel = CONFIG.channels[visitor.source];
if (!channel) return;
try {
const welcome = document.createElement('div');
welcome.style.cssText = `
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 15px 30px;
border-radius: 50px;
box-shadow: 0 5px 20px rgba(0,0,0,0.2);
z-index: 999999;
font-family: Arial, sans-serif;
animation: slideDown 0.5s ease;
display: flex;
align-items: center;
gap: 10px;
`;
welcome.innerHTML = `
${channel.icon}
Καλωσήρθατε από το ${channel.name}!
Επιστρέψτε σε 4 μέρες για αποκλειστική προσφορά!
`;
document.body.appendChild(welcome);
setTimeout(() => welcome.remove(), 8000);
} catch (e) {}
},
showReturnPrompt: function(visitor) {
if (!visitor || !visitor.source) return;
if (document.getElementById('returnPrompt')) return;
const channel = CONFIG.channels[visitor.source];
if (!channel) return;
try {
const prompt = document.createElement('div');
prompt.id = 'returnPrompt';
prompt.style.cssText = `
position: fixed;
bottom: 30px;
left: 50%;
transform: translateX(-50%);
background: linear-gradient(135deg, #FF6B6B 0%, #4ECDC4 100%);
color: white;
padding: 25px;
border-radius: 15px;
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
z-index: 1000000;
max-width: 400px;
text-align: center;
font-family: Arial, sans-serif;
animation: slideUp 0.5s ease;
`;
const remainingWhistles = OrderTracker.getRemainingWhistles();
prompt.innerHTML = `
${channel.icon}
${channel.returnMessage}
Έχουν περάσει 4 μέρες από την τελευταία σας επίσκεψη στο κανάλι μας!
Νέα βίντεο σας περιμένουν!
${remainingWhistles > 0 ? `
🔊 Φυσικές σφυρίχτρες:
${remainingWhistles}
` : ''}
* Επιστρέφοντας, κερδίστε πόντους επιβράβευσης!
`;
document.body.appendChild(prompt);
// Ανανέωση του lastChannelReturn
visitor.lastChannelReturn[visitor.source] = Date.now();
VisitorDB.save();
setTimeout(() => {
if (prompt.parentNode) prompt.remove();
}, 30000);
} catch (e) {}
}
};
// OrderTracker - ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΟ από v2.0
const OrderTracker = {
getRemainingWhistles: function() {
const visitor = VisitorDB.load();
if (!visitor || !visitor.orders) return CONFIG.physicalWhistlesToSell;
const sold = visitor.orders.physicalWhistle?.count || 0;
return Math.max(0, CONFIG.physicalWhistlesToSell - sold);
},
isWhistleSoldOut: function() {
return this.getRemainingWhistles() <= 0;
},
registerWhistlePurchase: function(visitorId) {
try {
const visitors = this.getAllVisitors();
let updated = false;
Object.keys(visitors).forEach(id => {
const visitorData = visitors[id];
if (visitorData && visitorData.orders) {
if (id === visitorId || visitorData.visitorId === visitorId) {
if (!visitorData.orders.physicalWhistle.completed) {
visitorData.orders.physicalWhistle.count++;
if (visitorData.orders.physicalWhistle.count >= CONFIG.physicalWhistlesToSell) {
visitorData.orders.physicalWhistle.completed = true;
this.optimizeForRemainingVisitors();
}
this.saveAllVisitors(visitors);
updated = true;
}
}
}
});
return updated;
} catch (e) {
console.warn('Error registering purchase:', e);
return false;
}
},
getAllVisitors: function() {
try {
const allData = localStorage.getItem('all_visitors_data_v25');
return allData ? JSON.parse(allData) : {};
} catch {
return {};
}
},
saveAllVisitors: function(visitors) {
try {
localStorage.setItem('all_visitors_data_v25', JSON.stringify(visitors));
} catch (e) {}
},
optimizeForRemainingVisitors: function() {
console.log('🎯 Target παραγγελιών συμπληρώθηκε! Βελτιστοποίηση για Adsense...');
if (typeof window.googletag !== 'undefined') {
try {
window.googletag.cmd.push(function() {
const adSlots = window.googletag.pubads().getSlots();
adSlots.forEach(slot => {
slot.setTargeting('visitor_type', 'ad_optimized');
});
window.googletag.pubads().refresh(adSlots);
});
} catch (e) {}
}
},
getTopBuyerCandidates: function(limit = 4) {
const visitors = this.getAllVisitors();
const candidates = [];
Object.values(visitors).forEach(visitor => {
if (visitor && !visitor.orders?.physicalWhistle?.completed) {
const score = this.calculateBuyerScore(visitor);
candidates.push({
visitor: visitor,
score: score,
id: visitor.visitorId
});
}
});
candidates.sort((a, b) => b.score - a.score);
return candidates.slice(0, limit);
},
calculateBuyerScore: function(visitor) {
if (!visitor) return 0;
let score = 0;
score += (visitor.purchaseIntent || 0) * 30;
score += (visitor.productInterest?.physicalWhistle || 0) * 25;
score += Math.min(25, (visitor.timeOnProductPages || 0) / 120000);
score += Math.min(15, (visitor.scrollDepth || 0) * 1.5);
score += Math.min(10, (visitor.adInteractions || 0) * 5);
if (visitor.returnCount > 0) score += 10;
if (visitor.returnStreak > 2) score += 5;
const pageViews = visitor.pagesViewed || [];
if (pageViews.some(page => page.includes('whistle') || page.includes('σφυρίχτρα'))) {
score += 20;
}
return Math.min(100, score);
},
trackProductInterest: function(visitor) {
if (!visitor) return;
const pageContent = document.body?.innerText || '';
const whistleKeywords = ['σφυρίχτρα', 'whistle', 'φυσική σφυρίχτρα', 'physical whistle'];
let interestBoost = 0;
whistleKeywords.forEach(keyword => {
if (pageContent.toLowerCase().includes(keyword.toLowerCase())) {
interestBoost += 0.05;
}
});
visitor.productInterest.physicalWhistle = Math.min(1,
(visitor.productInterest.physicalWhistle || 0) + interestBoost
);
this.trackWhistleClicks(visitor);
VisitorDB.save();
},
trackWhistleClicks: function(visitor) {
document.querySelectorAll('a, button, .product, img').forEach(element => {
if (!element.hasAttribute('data-whistle-tracked')) {
element.addEventListener('click', function(e) {
const text = e.target.innerText || e.target.alt || '';
if (text.toLowerCase().includes('σφυρίχτρ') || text.toLowerCase().includes('whistle')) {
visitor.purchaseIntent = Math.min(1, (visitor.purchaseIntent || 0) + 0.1);
visitor.productInterest.physicalWhistle = Math.min(1,
(visitor.productInterest.physicalWhistle || 0) + 0.15
);
VisitorDB.save();
}
});
element.setAttribute('data-whistle-tracked', 'true');
}
});
}
};
// AdsenseOptimizer - ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΟ από v2.0
const AdsenseOptimizer = {
init: function() {
this.enhanceAdPerformance();
this.trackAdInteractions();
this.setupAdRefresh();
},
enhanceAdPerformance: function() {
const visitor = VisitorDB.load();
if (!visitor) return;
const remainingWhistles = OrderTracker.getRemainingWhistles();
if (remainingWhistles <= 0) {
this.maximizeAdRevenue(visitor);
} else {
this.targetPotentialBuyers(visitor);
}
},
maximizeAdRevenue: function(visitor) {
console.log('📊 Λειτουργία μεγιστοποίησης Adsense ενεργοποιημένη');
if (!visitor.orders?.physicalWhistle?.completed) {
visitor.adInteractions = (visitor.adInteractions || 0) + 1;
this.injectAdOpportunities();
}
},
targetPotentialBuyers: function(visitor) {
const topCandidates = OrderTracker.getTopBuyerCandidates(4);
const isTopCandidate = topCandidates.some(c => c.id === visitor.visitorId);
if (isTopCandidate) {
this.showWhistleOffer(visitor);
} else {
visitor.adInteractions = (visitor.adInteractions || 0) + 1;
}
},
showWhistleOffer: function(visitor) {
try {
if (document.getElementById('whistleOffer')) return;
const offerDiv = document.createElement('div');
offerDiv.id = 'whistleOffer';
offerDiv.style.cssText = `
position: fixed;
bottom: 20px;
left: 20px;
background: linear-gradient(135deg, #FF6B6B 0%, #4ECDC4 100%);
color: white;
padding: 20px;
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
z-index: 1000000;
max-width: 320px;
font-family: Arial, sans-serif;
animation: slideUp 0.5s ease;
cursor: pointer;
`;
const remaining = OrderTracker.getRemainingWhistles();
offerDiv.innerHTML = `
🔊 Φυσική Σφυρίχτρα
Μόνο ${remaining} διαθέσιμες! Αποκλειστική προσφορά για εσάς.
`;
document.body.appendChild(offerDiv);
setTimeout(() => {
if (offerDiv.parentNode) offerDiv.remove();
}, 30000);
offerDiv.querySelector('button:first-child').onclick = function() {
visitor.orders.physicalWhistle.count++;
OrderTracker.registerWhistlePurchase(visitor.visitorId);
offerDiv.innerHTML = '✅ Ευχαριστούμε για την αγορά σας!
';
setTimeout(() => offerDiv.remove(), 2000);
};
} catch (e) {
console.warn('Offer show failed:', e);
}
},
injectAdOpportunities: function() {
const contentElements = document.querySelectorAll('p, h2, h3, .content');
contentElements.forEach((el, index) => {
if (index % 5 === 0 && !el.querySelector('.ad-injected')) {
const adBadge = document.createElement('span');
adBadge.className = 'ad-injected';
adBadge.style.cssText = `
display: inline-block;
background: #f8f9fa;
color: #6c757d;
font-size: 11px;
padding: 2px 6px;
border-radius: 3px;
margin-left: 5px;
cursor: pointer;
`;
adBadge.innerHTML = '📢 Διαφήμιση';
adBadge.onclick = () => {
const visitor = VisitorDB.load();
if (visitor) {
visitor.adInteractions = (visitor.adInteractions || 0) + 1;
VisitorDB.save();
}
};
el.appendChild(adBadge);
}
});
},
trackAdInteractions: function() {
document.addEventListener('click', function(e) {
if (e.target.closest('.adsbygoogle') ||
e.target.closest('[class*="ad"]') ||
e.target.classList.contains('ad-injected')) {
const visitor = VisitorDB.load();
if (visitor) {
visitor.adInteractions = (visitor.adInteractions || 0) + 1;
visitor.purchaseIntent = Math.max(0, (visitor.purchaseIntent || 0) - 0.02);
VisitorDB.save();
}
}
});
},
setupAdRefresh: function() {
setInterval(() => {
const remaining = OrderTracker.getRemainingWhistles();
if (remaining <= 0) {
if (typeof window.googletag !== 'undefined') {
try {
window.googletag.cmd.push(function() {
window.googletag.pubads().refresh();
});
} catch (e) {}
}
}
}, CONFIG.adRefreshInterval);
}
};
// ReturnAI - ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΟ από v2.0
const ReturnAI = {
calculateReturnProbability: function(visitor) {
if (!visitor) return 0.5;
let probability = 0.5;
if (visitor.visitCount > 1) {
probability += 0.15;
if (visitor.visitCount > 3) probability += 0.1;
if (visitor.visitCount > 10) probability += 0.1;
}
const timeScore = Math.min(0.2, (visitor.timeOnSite || 0) / 600000);
probability += timeScore;
const pageScore = Math.min(0.15, (visitor.pagesViewed || []).length / 10);
probability += pageScore;
if (visitor.returnCount > 0) {
probability += 0.2;
probability += Math.min(0.1, (visitor.returnStreak || 0) * 0.02);
}
if (visitor.email) probability += 0.25;
if (visitor.phone) probability += 0.2;
probability += (visitor.conversionIntent || 0) * 0.5;
probability += (visitor.productInterest?.physicalWhistle || 0) * 0.3;
const hoursSinceLast = (Date.now() - (visitor.lastVisitTimestamp || Date.now())) / (60 * 60 * 1000);
if (hoursSinceLast < CONFIG.returnWindowHours) {
probability += 0.3;
} else if (hoursSinceLast < 24) {
probability += 0.15;
} else if (hoursSinceLast < 48) {
probability += 0.05;
}
return Math.min(0.99, Math.max(0.01, probability));
},
getPersonalizedMessage: function(visitor, probability) {
if (!CONFIG.incentives || !visitor) return null;
const messages = [];
const remaining = OrderTracker.getRemainingWhistles();
if (remaining > 0 && remaining <= 2) {
messages.push({
type: 'limited',
message: `⏰ Μόνο ${remaining} φυσικές σφυρίχτρες απέμειναν!`,
incentive: 'Δωρεάν μεταφορικά για άμεση αγορά'
});
}
if (visitor.visitCount === 1) {
messages.push({
type: 'welcome',
message: 'Καλώς ήρθατε! Εγγραφείτε για να λαμβάνετε αποκλειστικές προσφορές',
incentive: '10% έκπτωση στο πρώτο σας email'
});
}
if (visitor.returnCount > 0) {
const hoursSinceLast = (Date.now() - (visitor.lastVisitTimestamp || Date.now())) / (60 * 60 * 1000);
let returnMessage = `Χαίρομαι που σας βλέπω ξανά! Αυτή είναι η ${visitor.visitCount}η επίσκεψή σας`;
if (hoursSinceLast < CONFIG.returnWindowHours) {
returnMessage = `Ουάου! Επιστρέψατε μέσα σε ${Math.round(hoursSinceLast)} ώρες! Εντυπωσιακό!`;
}
messages.push({
type: 'return',
message: returnMessage,
incentive: 'Πόντοι επιβράβευσης x2 σήμερα'
});
}
return messages.length > 0 ? messages[Math.floor(Math.random() * messages.length)] : null;
}
};
// IncentiveEngine - ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΟ από v2.0
const IncentiveEngine = {
offerReturnIncentive: function(visitor) {
if (!visitor) return [];
const incentives = [];
const remaining = OrderTracker.getRemainingWhistles();
if (remaining > 0) {
incentives.push({
type: 'whistle',
value: 'Φυσική Σφυρίχτρα',
message: `Αποκλειστική προσφορά: Μόνο ${remaining} διαθέσιμες!`,
code: 'WHISTLE20'
});
}
if (visitor.returnCount === 0) {
incentives.push({
type: 'discount',
value: '10%',
code: 'WELCOMEBACK10',
message: '10% έκπτωση',
expires: new Date(Date.now() + 7*24*60*60*1000).toLocaleDateString()
});
}
const hoursSinceLast = (Date.now() - (visitor.lastVisitTimestamp || Date.now())) / (60 * 60 * 1000);
if (hoursSinceLast < CONFIG.returnWindowHours && visitor.visitCount > 1) {
incentives.push({
type: 'quickReturn',
value: '20%',
code: 'QUICKRETURN20',
message: '20% έκπτωση για γρήγορη επιστροφή!'
});
}
return incentives;
},
getGamificationStatus: function(visitor) {
if (!CONFIG.enableGamification || !visitor) return null;
return {
level: Math.floor((visitor.visitCount || 1) / 5) + 1,
points: (visitor.visitCount || 1) * 100,
nextLevelAt: (Math.floor((visitor.visitCount || 1) / 5) + 1) * 5,
streak: visitor.returnStreak || 0,
badges: this.getBadges(visitor)
};
},
getBadges: function(visitor) {
if (!visitor) return [];
const badges = [];
if (visitor.visitCount >= 5) badges.push('Τακτικός Επισκέπτης');
if (visitor.visitCount >= 20) badges.push('VIP Member');
if (visitor.returnStreak >= 7) badges.push('Streak Master');
if (visitor.timeOnSite > 600000) badges.push('Εξερευνητής');
if (visitor.productInterest?.physicalWhistle > 0.7) badges.push('Ενδιαφέρον για Σφυρίχτρα');
if (visitor.quickReturns >= 3) badges.push('Speed Demon');
if (visitor.orders?.physicalWhistle?.completed) badges.push('Αγοραστής Σφυρίχτρας');
return badges;
}
};
// ReminderSystem - ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΟ από v2.0
const ReminderSystem = {
showReminderPopup: function(visitor) {
if (!CONFIG.enableReminders || !visitor) return;
if (visitor.reminderSent) return;
if (visitor.email || visitor.phone) return;
try {
const popup = document.createElement('div');
popup.style.cssText = `
position: fixed;
bottom: 20px;
right: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 5px 20px rgba(0,0,0,0.2);
z-index: 999999;
max-width: 300px;
font-family: Arial, sans-serif;
`;
popup.innerHTML = `
🔔 Μην χάσετε νέα!
Θέλετε να σας ενημερώνουμε για προσφορές και νέα;
Κερδίστε 10% έκπτωση με την εγγραφή!
`;
document.body.appendChild(popup);
const saveBtn = document.getElementById('saveReminder');
const closeBtn = document.getElementById('closeReminder');
if (saveBtn) {
saveBtn.onclick = function() {
const emailInput = document.getElementById('reminderEmail');
const phoneInput = document.getElementById('reminderPhone');
if (emailInput && phoneInput) {
const email = emailInput.value;
const phone = phoneInput.value;
if (email || phone) {
if (email) visitor.email = email;
if (phone) visitor.phone = phone;
visitor.reminderSent = true;
VisitorDB.save();
popup.innerHTML = '✅ Ευχαριστούμε! Θα σας ειδοποιήσουμε για νέα και προσφορές.
';
setTimeout(() => popup.remove(), 3000);
}
}
};
}
if (closeBtn) {
closeBtn.onclick = function() {
popup.remove();
};
}
} catch (e) {}
},
scheduleReminder: function(visitor) {
if (!visitor || (!visitor.email && !visitor.phone)) return;
const lastVisit = visitor.lastVisit || Date.now();
const daysSince = (Date.now() - lastVisit) / (24 * 60 * 60 * 1000);
if (daysSince >= 3 && !visitor.reminderSent) {
console.log('🔔 Υπενθύμιση αποστολής σε:', visitor.email || visitor.phone);
visitor.reminderSent = true;
VisitorDB.save();
}
}
};
// ExitIntent - ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΟ από v2.0
const ExitIntent = {
init: function(visitor) {
if (!CONFIG.exitIntent || !visitor) return;
let mouseLeaveTimer;
document.addEventListener('mouseleave', function(e) {
clearTimeout(mouseLeaveTimer);
mouseLeaveTimer = setTimeout(() => {
if (e.clientY < 10) {
ExitIntent.showExitPopup(visitor);
}
}, 100);
});
},
showExitPopup: function(visitor) {
if (!visitor) return;
if (document.getElementById('exitPopup')) return;
try {
const popup = document.createElement('div');
popup.id = 'exitPopup';
popup.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: white;
padding: 30px;
border-radius: 15px;
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
z-index: 1000000;
max-width: 400px;
text-align: center;
font-family: Arial, sans-serif;
`;
const probability = ReturnAI.calculateReturnProbability(visitor);
const incentives = IncentiveEngine.offerReturnIncentive(visitor);
const remaining = OrderTracker.getRemainingWhistles();
let incentivesHtml = '';
if (incentives.length > 0) {
const incentive = incentives[0];
incentivesHtml = `
Μόνο για εσάς:
🎁 ${incentive.message || 'Προσφορά επιστροφής'}
${incentive.code ? `
Κωδικός: ${incentive.code}
` : ''}
`;
}
const hoursSinceLast = visitor.lastVisitTimestamp ?
(Date.now() - visitor.lastVisitTimestamp) / (60 * 60 * 1000) : 24;
popup.innerHTML = `
⏳ Περιμένετε!
${probability > 0.7 ?
'Φαίνεται ότι σας αρέσει αυτό που βλέπετε!' :
'Μην φύγετε χωρίς την προσφορά σας!'}
${remaining > 0 ? `🔊 Μόνο ${remaining} φυσικές σφυρίχτρες απέμειναν!
` : ''}
${incentivesHtml}
Επιστρέψτε μέσα στις επόμενες 7 ώρες για ακόμα καλύτερες προσφορές!
`;
document.body.appendChild(popup);
setTimeout(() => {
const exitPopup = document.getElementById('exitPopup');
if (exitPopup) exitPopup.remove();
}, 10000);
} catch (e) {}
}
};
// TikTokHandler - ΠΛΗΡΩΣ ΔΙΑΤΗΡΗΜΕΝΟ από v2.0 (με μικρή προσθήκη YouTube link)
const TikTokHandler = {
isTikTokLink: function(url) {
if (!url) return false;
return CONFIG.tiktokLinks.some(domain => url.includes(domain));
},
init: function() {
this.observeNewLinks();
this.processExistingLinks();
},
processExistingLinks: function() {
const allLinks = document.getElementsByTagName('a');
Array.from(allLinks).forEach(link => {
if (this.isTikTokLink(link.href)) {
this.modifyTikTokLink(link);
}
});
},
observeNewLinks: function() {
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.addedNodes) {
mutation.addedNodes.forEach((node) => {
if (node.nodeName === 'A' && this.isTikTokLink(node.href)) {
this.modifyTikTokLink(node);
}
if (node.querySelectorAll) {
const links = node.querySelectorAll('a');
links.forEach(link => {
if (this.isTikTokLink(link.href)) {
this.modifyTikTokLink(link);
}
});
}
});
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
},
modifyTikTokLink: function(linkElement) {
if (linkElement.hasAttribute('data-tiktok-modified-v25')) return;
const originalHref = linkElement.href;
linkElement.addEventListener('click', (e) => {
e.preventDefault();
const visitor = VisitorDB.load();
const remaining = OrderTracker.getRemainingWhistles();
const hoursSinceLast = visitor.lastVisitTimestamp ?
(Date.now() - visitor.lastVisitTimestamp) / (60 * 60 * 1000) : 24;
const popup = document.createElement('div');
popup.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: linear-gradient(135deg, #25F4EE 0%, #FE2C55 100%);
color: white;
padding: 30px;
border-radius: 15px;
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
z-index: 1000000;
max-width: 400px;
text-align: center;
font-family: Arial, sans-serif;
`;
popup.innerHTML = `
🎵 TikTok
Είστε πολύ ευχαριστημένος/η με αυτό που είδατε;
Στείλτε μου τον αριθμό του κινητού σας σε μήνυμα στο TikTok!
${remaining > 0 ? `
🔊 Μόνο ${remaining} φυσικές σφυρίχτρες απέμειναν!
` : ''}
Αν δεν είστε ακόμη έτοιμος/η να αγοράσετε τη φυσική σφυρίχτρα στο e-shop,
κάντε κοινοποίηση των βίντεο στο προφίλ μου στο TikTok!
${hoursSinceLast < CONFIG.returnWindowHours ?
'🌟 Επιστρέψατε γρήγορα! Μπόνους προσφορά 20%!
' :
'Επιστρέψτε μέσα σε 7 ώρες για έξτρα προσφορές!
'}
📺 Μην ξεχνάτε και το YouTube: @e_repellent_com
`;
document.body.appendChild(popup);
setTimeout(() => {
if (popup.parentNode) popup.remove();
}, 15000);
});
linkElement.setAttribute('data-tiktok-modified-v25', 'true');
}
};
const ReturnOptimizer = {
init: function() {
try {
const visitor = VisitorDB.load();
if (!visitor) return;
const now = Date.now();
const timeSinceLast = now - (visitor.lastVisitTimestamp || now);
const hoursSinceLast = timeSinceLast / (60 * 60 * 1000);
if (hoursSinceLast <= CONFIG.returnWindowHours && visitor.visitCount > 0) {
visitor.returnCount = (visitor.returnCount || 0) + 1;
visitor.returnStreak = (visitor.returnStreak || 0) + 1;
visitor.quickReturns = (visitor.quickReturns || 0) + 1;
if (visitor.returnStreak > (visitor.longestStreak || 0)) {
visitor.longestStreak = visitor.returnStreak;
}
} else if (hoursSinceLast > CONFIG.returnWindowHours) {
visitor.returnStreak = 0;
}
visitor.lastVisit = now;
visitor.lastVisitTimestamp = now;
visitor.lastVisitDate = new Date().toDateString();
visitor.visitCount = (visitor.visitCount || 0) + 1;
visitor.totalVisits = (visitor.totalVisits || 0) + 1;
// Παρακολούθηση ενδιαφέροντος για προϊόντα
OrderTracker.trackProductInterest(visitor);
// Υπολογισμός πιθανότητας αγοράς
visitor.purchaseIntent = OrderTracker.calculateBuyerScore(visitor) / 100;
visitor.returnProbability = ReturnAI.calculateReturnProbability(visitor);
VisitorDB.save();
// ΝΕΟ: Cross-platform προτροπές
CrossPlatformPrompter.init(visitor);
// Ενέργειες με βάση την πιθανότητα
this.actOnProbability(visitor);
// Εμφάνιση popup για νέους επισκέπτες
if (visitor.visitCount === 1) {
setTimeout(() => ReminderSystem.showReminderPopup(visitor), CONFIG.popupDelay);
}
// Προγραμματισμός υπενθυμίσεων
ReminderSystem.scheduleReminder(visitor);
// Αρχικοποίηση exit intent
ExitIntent.init(visitor);
// Αρχικοποίηση TikTok handler
TikTokHandler.init();
// Αρχικοποίηση Adsense Optimizer
AdsenseOptimizer.init();
// Gamification επιτεύγματα
if (CONFIG.enableGamification && visitor.visitCount % 5 === 0) {
const gameStatus = IncentiveEngine.getGamificationStatus(visitor);
if (gameStatus) {
this.showAchievement(visitor, gameStatus);
}
}
// Tracking metrics
this.trackReturnMetrics(visitor);
// Εμφάνιση των top υποψηφίων για debugging
const topCandidates = OrderTracker.getTopBuyerCandidates(4);
const remaining = OrderTracker.getRemainingWhistles();
console.log('🎯 Return Visitor Optimizer v2.5 - Cross-Platform Edition', {
visitorId: visitor.visitorId,
source: visitor.source,
visitCount: visitor.visitCount,
returnCount: visitor.returnCount,
returnProbability: Math.round((visitor.returnProbability || 0) * 100) + '%',
purchaseIntent: Math.round((visitor.purchaseIntent || 0) * 100) + '%',
whistleInterest: Math.round((visitor.productInterest?.physicalWhistle || 0) * 100) + '%',
streak: visitor.returnStreak,
quickReturns: visitor.quickReturns || 0,
remainingWhistles: remaining,
isTopCandidate: topCandidates.some(c => c.id === visitor.visitorId),
email: visitor.email ? '✓' : '✗',
hoursSinceLast: Math.round(hoursSinceLast * 10) / 10,
lastVisitTimestamp: new Date(visitor.lastVisitTimestamp).toLocaleString(),
daysSinceChannelVisit: visitor.source !== 'direct' ?
Math.round((Date.now() - visitor.lastChannelVisit) / (24*60*60*1000) * 10) / 10 + ' ημέρες' : 'N/A'
});
if (topCandidates.length > 0) {
console.log('🏆 Top 4 υποψήφιοι για αγορά φυσικής σφυρίχτρας:',
topCandidates.map(c => ({
score: Math.round(c.score),
visits: c.visitor.visitCount,
interest: Math.round((c.visitor.productInterest?.physicalWhistle || 0) * 100) + '%'
}))
);
}
} catch (e) {
console.error('Return optimizer init failed:', e);
}
},
actOnProbability: function(visitor) {
if (!visitor) return;
const remaining = OrderTracker.getRemainingWhistles();
const topCandidates = OrderTracker.getTopBuyerCandidates(4);
const isTopCandidate = topCandidates.some(c => c.id === visitor.visitorId);
if (isTopCandidate && remaining > 0 && !visitor.orders?.physicalWhistle?.completed) {
this.showWhistleOffer(visitor);
}
if (visitor.returnProbability > 0.8) {
const incentives = IncentiveEngine.offerReturnIncentive(visitor);
if (incentives.length > 0) {
this.showReturnOffer(visitor, incentives);
}
}
if (visitor.returnProbability < 0.3 && visitor.visitCount === 1) {
this.showWelcomeOffer(visitor);
}
},
showWhistleOffer: function(visitor) {
if (!visitor) return;
if (document.getElementById('whistleOfferV2')) return;
try {
const offerDiv = document.createElement('div');
offerDiv.id = 'whistleOfferV2';
offerDiv.style.cssText = `
position: fixed;
bottom: 20px;
right: 20px;
background: linear-gradient(135deg, #FF416C 0%, #FF4B2B 100%);
color: white;
padding: 25px;
border-radius: 15px;
box-shadow: 0 10px 30px rgba(255,75,43,0.3);
z-index: 1000000;
max-width: 320px;
font-family: Arial, sans-serif;
animation: slideInRight 0.5s ease;
cursor: pointer;
border: 2px solid gold;
`;
const remaining = OrderTracker.getRemainingWhistles();
offerDiv.innerHTML = `
🔊
Ειδική Προσφορά!
Φυσική Σφυρίχτρα Υψηλής Ποιότητας
Ιδανική για εξωτερικές δραστηριότητες
* Προσφορά μόνο για τους πιο ενεργούς επισκέπτες
`;
document.body.appendChild(offerDiv);
document.getElementById('buyWhistleBtn').onclick = function() {
visitor.orders.physicalWhistle.count++;
OrderTracker.registerWhistlePurchase(visitor.visitorId);
offerDiv.innerHTML = `
✅
Ευχαριστούμε για την αγορά σας!
Η παραγγελία σας καταχωρήθηκε.
`;
setTimeout(() => offerDiv.remove(), 3000);
};
document.getElementById('closeWhistleOffer').onclick = function() {
offerDiv.remove();
};
setTimeout(() => {
if (offerDiv.parentNode) offerDiv.remove();
}, 60000);
} catch (e) {
console.warn('Whistle offer failed:', e);
}
},
showReturnOffer: function(visitor, incentives) {
if (!visitor || !incentives || incentives.length === 0) return;
if (visitor.incentivesClaimed && visitor.incentivesClaimed.includes('return_offer')) return;
try {
const offer = incentives[0];
if (!offer) return;
const banner = document.createElement('div');
banner.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: #4CAF50;
color: white;
padding: 15px 25px;
border-radius: 50px;
box-shadow: 0 5px 15px rgba(76,175,80,0.3);
z-index: 999999;
font-family: Arial, sans-serif;
cursor: pointer;
animation: slideIn 0.5s ease;
`;
banner.innerHTML = `
🎁 Επιστρέψατε!
${offer.message || 'Αποκλειστική προσφορά για εσάς'}
`;
document.body.appendChild(banner);
banner.onclick = function() {
this.remove();
if (!visitor.incentivesClaimed) visitor.incentivesClaimed = [];
visitor.incentivesClaimed.push('return_offer');
VisitorDB.save();
};
setTimeout(() => banner.remove(), 10000);
} catch (e) {}
},
showWelcomeOffer: function(visitor) {
if (!visitor) return;
try {
const banner = document.createElement('div');
banner.style.cssText = `
position: fixed;
bottom: 20px;
left: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 5px 20px rgba(0,0,0,0.2);
z-index: 999999;
max-width: 300px;
font-family: Arial, sans-serif;
`;
banner.innerHTML = `
👋 Καλώς ήρθατε!
Εγγραφείτε τώρα και κερδίστε 10% έκπτωση στην πρώτη σας αγορά!
`;
document.body.appendChild(banner);
setTimeout(() => banner.remove(), 15000);
} catch (e) {}
},
showAchievement: function(visitor, gameStatus) {
if (!visitor || !gameStatus) return;
try {
const badge = document.createElement('div');
badge.style.cssText = `
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
background: #FFD700;
color: #333;
padding: 15px 30px;
border-radius: 50px;
box-shadow: 0 5px 20px rgba(255,215,0,0.3);
z-index: 999999;
font-family: Arial, sans-serif;
animation: slideDown 0.5s ease;
`;
badge.innerHTML = `
🏆 Επίτευγμα!
Επίπεδο ${gameStatus.level} |
${gameStatus.points} πόντοι |
Streak: ${gameStatus.streak} ημέρες
${visitor.quickReturns >= 3 ? ' | ⚡ Speed Demon' : ''}
${visitor.productInterest?.physicalWhistle > 0.7 ? ' | 🔊 Ενδιαφέρον για Σφυρίχτρα' : ''}
`;
document.body.appendChild(badge);
setTimeout(() => badge.remove(), 5000);
} catch (e) {}
},
trackReturnMetrics: function(visitor) {
if (!visitor) return;
if (typeof gtag !== 'undefined') {
try {
gtag('event', 'return_visitor_metrics_v25', {
'visit_count': visitor.visitCount || 0,
'return_count': visitor.returnCount || 0,
'return_probability': Math.round((visitor.returnProbability || 0) * 100),
'purchase_intent': Math.round((visitor.purchaseIntent || 0) * 100),
'whistle_interest': Math.round((visitor.productInterest?.physicalWhistle || 0) * 100),
'streak_days': visitor.returnStreak || 0,
'quick_returns': visitor.quickReturns || 0,
'has_email': visitor.email ? 1 : 0,
'pages_viewed': (visitor.pagesViewed || []).length,
'time_on_site_seconds': Math.round((visitor.timeOnSite || 0) / 1000),
'ad_interactions': visitor.adInteractions || 0,
// ΝΕΟ metrics
'source': visitor.source || 'direct',
'youtube_visits': visitor.channelVisits?.youtube || 0,
'tiktok_visits': visitor.channelVisits?.tiktok || 0
});
} catch (e) {}
}
}
};
// Προσθήκη custom animations
const style = document.createElement('style');
style.textContent = `
@keyframes slideIn {
from { transform: translateX(100px); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slideInRight {
from { transform: translateX(100px); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slideDown {
from { transform: translate(-50%, -100px); opacity: 0; }
to { transform: translate(-50%, 0); opacity: 1; }
}
@keyframes slideUp {
from { transform: translateY(100px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
`;
document.head.appendChild(style);
// Παρακολούθηση χρόνου στη σελίδα
let startTime = Date.now();
const timeInterval = setInterval(() => {
try {
const visitor = VisitorDB.load();
if (visitor) {
visitor.timeOnSite = Date.now() - startTime;
const scrollPercent = (window.scrollY / (document.documentElement.scrollHeight - window.innerHeight)) * 100;
if (scrollPercent > visitor.scrollDepth) {
visitor.scrollDepth = scrollPercent;
}
VisitorDB.save();
}
} catch (e) {}
}, 5000);
// Παρακολούθηση φόρτωσης σελίδας
window.addEventListener('load', () => {
try {
const visitor = VisitorDB.load();
if (visitor) {
const currentPath = window.location.pathname;
if (!visitor.pagesViewed.includes(currentPath)) {
visitor.pagesViewed.push(currentPath);
if (currentPath.includes('product') || currentPath.includes('whistle') || currentPath.includes('σφυρίχτρα')) {
visitor.timeOnProductPages = (visitor.timeOnProductPages || 0) + 1;
}
VisitorDB.save();
}
}
} catch (e) {}
});
// Καθαρισμός interval κατά την αποχώρηση
window.addEventListener('beforeunload', function() {
clearInterval(timeInterval);
try {
const visitor = VisitorDB.load();
if (visitor) {
visitor.timeOnSite = Date.now() - startTime;
VisitorDB.save();
}
} catch (e) {}
});
// Εκκίνηση του optimizer
ReturnOptimizer.init();
})();
If you want the cats to leave permanently, you must use the combination of the app and the multi-frequency whistle
😾 Repel the cat in 30 seconds – using ONLY sound!
E-Repellent AI System
Improvedt Version Live — Refresh Date: 07/12/2025
ANTI-CAT super new version today 07/12/2025
Improve your protection from stray cats.
Recommended safety device ↓
E-Repellent AI System
Safe Ultrasound for Cats
Improve your protection from stray cats.
Recommended safety device ↓
Ultrasound for Cats
Πατήστε "AI Cooling Mode" για σάρωση θερμοκρασίας.