aboutsummaryrefslogtreecommitdiffstats
path: root/guestbook.js
blob: 2394287d8fab445b23e726988484ca32474b0ec3 (plain) (blame)
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 (actually red now) 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();
});