`).join('');
}historyBtn.addEventListener('click', () => {
displayHistory();
historyModal.style.display = 'flex';
});closeModal.addEventListener('click', () => {
historyModal.style.display = 'none';
});clearHistoryBtn.addEventListener('click', () => {
if (confirm('Are you sure you want to clear all history?')) {
localStorage.removeItem('aid-history');
displayHistory();
}
});historyModal.addEventListener('click', (e) => {
if (e.target === historyModal) {
historyModal.style.display = 'none';
}
});// Export functions
copyBtn.addEventListener('click', () => {
if (!currentAnalysisData) return;
const text = `AI Content Detector Pro - Analysis Results
${'='.repeat(50)}
Verdict: ${currentAnalysisData.verdict}
AI Confidence: ${currentAnalysisData.aiScore}%
Human Confidence: ${currentAnalysisData.humanScore}%Metrics:
- Readability Score: ${currentAnalysisData.readability.score} (${currentAnalysisData.readability.level})
- Sentiment: ${currentAnalysisData.sentiment.label} (${currentAnalysisData.sentiment.score})
- Passive Voice Instances: ${currentAnalysisData.passiveVoice}
- Reading Time: ${currentAnalysisData.readingTime} minutesKey Indicators:
- Vocabulary Complexity: ${currentAnalysisData.perplexity.toFixed(2)}%
- Sentence Uniformity: ${currentAnalysisData.burstiness.toFixed(2)}%
- Repetitive Phrases: ${currentAnalysisData.repetition.toFixed(2)}%
${'='.repeat(50)}`;
navigator.clipboard.writeText(text).then(() => {
showNotification('Results copied to clipboard!');
});
});exportPdfBtn.addEventListener('click', () => {
if (!currentAnalysisData) return;
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFontSize(20);
doc.text('AI Content Detector Pro', 20, 20);
doc.setFontSize(12);
doc.text('Analysis Results', 20, 30);
let y = 45;
doc.setFontSize(16);
doc.text(`Verdict: ${currentAnalysisData.verdict}`, 20, y);
y += 10;
doc.setFontSize(12);
doc.text(`AI Confidence: ${currentAnalysisData.aiScore}%`, 20, y);
y += 7;
doc.text(`Human Confidence: ${currentAnalysisData.humanScore}%`, 20, y);
y += 15;
doc.setFontSize(14);
doc.text('Metrics:', 20, y);
y += 10;
doc.setFontSize(11);
doc.text(`Readability Score: ${currentAnalysisData.readability.score} (${currentAnalysisData.readability.level})`, 25, y);
y += 7;
doc.text(`Sentiment: ${currentAnalysisData.sentiment.label} (${currentAnalysisData.sentiment.score})`, 25, y);
y += 7;
doc.text(`Passive Voice Instances: ${currentAnalysisData.passiveVoice}`, 25, y);
y += 7;
doc.text(`Reading Time: ${currentAnalysisData.readingTime} minutes`, 25, y);
y += 15;
doc.setFontSize(14);
doc.text('Key Indicators:', 20, y);
y += 10;
doc.setFontSize(11);
doc.text(`Vocabulary Complexity: ${currentAnalysisData.perplexity.toFixed(2)}%`, 25, y);
y += 7;
doc.text(`Sentence Uniformity: ${currentAnalysisData.burstiness.toFixed(2)}%`, 25, y);
y += 7;
doc.text(`Repetitive Phrases: ${currentAnalysisData.repetition.toFixed(2)}%`, 25, y);
doc.save('ai-content-analysis.pdf');
showNotification('PDF exported successfully!');
});exportJsonBtn.addEventListener('click', () => {
if (!currentAnalysisData) return;
const dataStr = JSON.stringify(currentAnalysisData, null, 2);
const dataBlob = new Blob([dataStr], { type: 'application/json' });
const url = URL.createObjectURL(dataBlob);
const link = document.createElement('a');
link.href = url;
link.download = 'ai-content-analysis.json';
link.click();
showNotification('JSON exported successfully!');
});function showNotification(message) {
const notification = document.createElement('div');
notification.className = 'aid-notification';
notification.textContent = message;
document.body.appendChild(notification);
setTimeout(() => {
notification.classList.add('show');
}, 10);
setTimeout(() => {
notification.classList.remove('show');
setTimeout(() => notification.remove(), 300);
}, 3000);
}function createMetricsChart(data) {
const ctx = document.getElementById('aidMetricsChart').getContext('2d');
if (metricsChart) {
metricsChart.destroy();
}
metricsChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Vocabulary Complexity', 'Sentence Uniformity', 'Repetitive Phrases', 'Overall AI Score'],
datasets: [{
label: 'Score (%)',
data: [
data.perplexity.toFixed(2),
data.burstiness.toFixed(2),
data.repetition.toFixed(2),
data.aiScore
],
backgroundColor: [
'rgba(255, 99, 132, 0.7)',
'rgba(54, 162, 235, 0.7)',
'rgba(255, 206, 86, 0.7)',
'rgba(153, 102, 255, 0.7)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(153, 102, 255, 1)'
],
borderWidth: 2
}]
},
options: {
responsive: true,
maintainAspectRatio: true,
scales: {
y: {
beginAtZero: true,
max: 100
}
},
plugins: {
legend: {
display: false
}
}
}
});
}// Main analysis
analyzeBtn.addEventListener('click', async () => {
try {
const text = textInput.value;
if (text.trim().length < 10) {
showNotification('Please enter more text for a meaningful analysis.');
return;
}loadingEl.style.display = 'block';
analyzeBtn.disabled = true;
await new Promise(resolve => setTimeout(resolve, 1000));const words = text.trim().split(/\s+/);const perplexityScore = calculatePerplexity(words);
const burstinessScore = calculateBurstiness(text);
const repetitionResult = findRepetitiveStructures(text);
const repetitionScore = repetitionResult.score;const finalAIScore = (perplexityScore * 0.4) + (burstinessScore * 0.4) + (repetitionScore * 0.2);const verdict = finalAIScore > 45 ? 'Likely AI-Generated' : 'Likely Human-Written';
const humanPercentage = 100 - finalAIScore;
const readability = calculateReadability(text);
const sentiment = analyzeSentiment(text);
const passiveVoice = detectPassiveVoice(text);
const readingTime = calculateReadingTime(words.length);document.getElementById('aidAiPercentageBar').style.width = `${finalAIScore}%`;
document.getElementById('aidHumanPercentageBar').style.width = `${humanPercentage}%`;
document.getElementById('aidAiPercentageLabel').textContent = `AI: ${finalAIScore.toFixed(2)}%`;
document.getElementById('aidHumanPercentageLabel').textContent = `Human: ${humanPercentage.toFixed(2)}%`;confidenceScoreEl.textContent = `${finalAIScore.toFixed(2)}%`;
verdictEl.textContent = verdict;
const verdictCard = document.getElementById('aidVerdictCard');
const verdictIcon = document.getElementById('aidVerdictIcon');
if (finalAIScore > 45) {
verdictCard.classList.add('ai');
verdictCard.classList.remove('human');
verdictIcon.innerHTML = '';
} else {
verdictCard.classList.add('human');
verdictCard.classList.remove('ai');
verdictIcon.innerHTML = '';
}
document.getElementById('aidReadabilityScore').textContent = readability.score;
document.getElementById('aidReadabilityLevel').textContent = readability.level;
document.getElementById('aidSentimentScore').textContent = sentiment.score;
document.getElementById('aidSentimentLabel').textContent = sentiment.label;
document.getElementById('aidPassiveVoice').textContent = passiveVoice;
document.getElementById('aidReadingTime').textContent = readingTime;reasonsList.innerHTML = `Vocabulary Complexity Score: ${perplexityScore.toFixed(2)}% Sentence Uniformity Score: ${burstinessScore.toFixed(2)}% Repetitive Phrases Score: ${repetitionScore.toFixed(2)}%
`;let highlightedHTML = text.replace(/\n/g, '
'); if (finalAIScore > 45) { const uniqueHighlights = new Set(repetitionResult.highlights); uniqueHighlights.forEach(phrase => { const regex = new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'); highlightedHTML = highlightedHTML.replace(regex, `$&`); }); } highlightedTextEl.innerHTML = highlightedHTML;resultsContainer.style.display = 'block'; currentAnalysisData = { text, verdict, aiScore: finalAIScore.toFixed(2), humanScore: humanPercentage.toFixed(2), perplexity: perplexityScore, burstiness: burstinessScore, repetition: repetitionScore, readability, sentiment, passiveVoice, readingTime, wordCount: words.length }; createMetricsChart(currentAnalysisData); saveToHistory(currentAnalysisData); loadingEl.style.display = 'none'; analyzeBtn.disabled = false; resultsContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' });} catch (error) { console.error("Analysis Error:", error); showNotification("An unexpected error occurred during analysis. Please try different text."); loadingEl.style.display = 'none'; analyzeBtn.disabled = false; } }); })();
'); if (finalAIScore > 45) { const uniqueHighlights = new Set(repetitionResult.highlights); uniqueHighlights.forEach(phrase => { const regex = new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'); highlightedHTML = highlightedHTML.replace(regex, `$&`); }); } highlightedTextEl.innerHTML = highlightedHTML;resultsContainer.style.display = 'block'; currentAnalysisData = { text, verdict, aiScore: finalAIScore.toFixed(2), humanScore: humanPercentage.toFixed(2), perplexity: perplexityScore, burstiness: burstinessScore, repetition: repetitionScore, readability, sentiment, passiveVoice, readingTime, wordCount: words.length }; createMetricsChart(currentAnalysisData); saveToHistory(currentAnalysisData); loadingEl.style.display = 'none'; analyzeBtn.disabled = false; resultsContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' });} catch (error) { console.error("Analysis Error:", error); showNotification("An unexpected error occurred during analysis. Please try different text."); loadingEl.style.display = 'none'; analyzeBtn.disabled = false; } }); })();
