summaryrefslogtreecommitdiff
path: root/guestbook.js
blob: e13a614ddef501cb926f6719a7c99b0106c7b0f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
document.addEventListener("DOMContentLoaded", function() {
    const form = document.getElementById('guestbook-form');
    const entriesContainer = document.getElementById('guestbook-entries');
    const captchaCanvas = document.getElementById('captcha-canvas');
    const refreshCaptchaButton = document.getElementById('refresh-captcha');
    const captchaInput = document.getElementById('captcha-input');
    const imageInput = document.getElementById('image');
    const GUESTBOOK_KEY = 'guestbookEntries';

    let currentCaptcha = '';

    // Function to generate a random CAPTCHA string
    function generateCaptcha() {
        const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        let captcha = '';
        for (let i = 0; i < 6; i++) {
            captcha += chars.charAt(Math.floor(Math.random() * chars.length));
        }
        return captcha;
    }

    // Function to draw CAPTCHA on canvas
    function drawCaptcha(captcha) {
        const ctx = captchaCanvas.getContext('2d');
        ctx.clearRect(0, 0, captchaCanvas.width, captchaCanvas.height);
        ctx.font = '20px Arial';
        ctx.fillStyle = '#000';
        ctx.fillText(captcha, 10, 30);
    }

    // Function to refresh the CAPTCHA image
    function refreshCaptcha() {
        currentCaptcha = generateCaptcha();
        drawCaptcha(currentCaptcha);
    }

    // Load and display existing entries
    function loadEntries() {
        const entries = JSON.parse(localStorage.getItem(GUESTBOOK_KEY)) || [];
        entriesContainer.innerHTML = '';

        entries.reverse().forEach((entry) => {
            const entryElement = document.createElement('div');
            entryElement.className = 'entry';

            const nameElement = document.createElement('h4');
            if (entry.name === 'Anonymous') {
                nameElement.className = 'anonymous';
            }
            nameElement.textContent = entry.name;
            entryElement.appendChild(nameElement);

            const messageElement = document.createElement('p');
            messageElement.innerHTML = formatMessage(entry.message);
            entryElement.appendChild(messageElement);

            if (entry.image) {
                const imageElement = document.createElement('img');
                imageElement.src = entry.image;
                entryElement.appendChild(imageElement);
            }

            entriesContainer.appendChild(entryElement);
        });
    }

    // Format message: add green text for lines starting with '>'
    function formatMessage(message) {
        return message.split('\n').map(line => {
            if (line.startsWith('>')) {
                return `<span class="anonymous">${line}</span>`;
            }
            return line;
        }).join('<br>');
    }

    // Handle form submission
    form.addEventListener('submit', function(event) {
        event.preventDefault();

        // Set default name to "Anonymous" if the name field is empty
        let name = document.getElementById('name').value.trim();
        if (!name) {
            name = 'Anonymous';
        }

        const message = document.getElementById('message').value.trim();
        const captchaValue = captchaInput.value.trim();
        const imageFile = imageInput.files[0];

        if (name && message && captchaValue === currentCaptcha) {
            const entries = JSON.parse(localStorage.getItem(GUESTBOOK_KEY)) || [];

            if (imageFile) {
                const reader = new FileReader();
                reader.onload = function() {
                    const image = reader.result;
                    entries.unshift({ name, message, image });
                    localStorage.setItem(GUESTBOOK_KEY, JSON.stringify(entries));

                    form.reset(); // Clear the form fields
                    document.getElementById('name').value = 'Anonymous'; // Reset the name field to "Anonymous"
                    loadEntries(); // Refresh the entries display
                    refreshCaptcha(); // Generate a new CAPTCHA after successful submission
                };
                reader.readAsDataURL(imageFile);
            } else {
                entries.unshift({ name, message, image: null });
                localStorage.setItem(GUESTBOOK_KEY, JSON.stringify(entries));

                form.reset(); // Clear the form fields
                document.getElementById('name').value = 'Anonymous'; // Reset the name field to "Anonymous"
                loadEntries(); // Refresh the entries display
                refreshCaptcha(); // Generate a new CAPTCHA after successful submission
            }
        } else {
            alert('CAPTCHA is incorrect. Please try again.');
        }
    });

    // Refresh CAPTCHA on page load and on refresh button click
    refreshCaptcha();
    refreshCaptchaButton.addEventListener('click', refreshCaptcha);

    // Initial load
    loadEntries();
});