{"id":2202,"date":"2025-08-21T20:13:56","date_gmt":"2025-08-21T20:13:56","guid":{"rendered":"https:\/\/visionnetworkcamp.org\/?page_id=2202"},"modified":"2025-08-21T20:16:10","modified_gmt":"2025-08-21T20:16:10","slug":"%ec%8b%a0%ec%84%b1%ed%95%99-%ec%9d%bc%ec%a0%95","status":"publish","type":"page","link":"https:\/\/visionnetworkcamp.org\/ko\/%ec%8b%a0%ec%84%b1%ed%95%99-%ec%9d%bc%ec%a0%95\/","title":{"rendered":"\uc2e0\uc131\ud559 \uc77c\uc815"},"content":{"rendered":"<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\uc5ec\ud589 \uc77c\uc815 \uad00\ub9ac<\/title>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            background-color: #f5f7fa;\n            margin: 0;\n            padding: 20px;\n            line-height: 1.6;\n        }\n        \n        .container {\n            max-width: 800px;\n            margin: 0 auto;\n            background: white;\n            border-radius: 10px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n            overflow: hidden;\n        }\n        \n        .header {\n            background: #4a90e2;\n            color: white;\n            padding: 20px;\n            text-align: center;\n        }\n        \n        .header h1 {\n            margin: 0 0 5px 0;\n            font-size: 1.8rem;\n        }\n        \n        .header p {\n            margin: 0 0 15px 0;\n            opacity: 0.9;\n        }\n        \n        .header-controls {\n            display: flex;\n            justify-content: center;\n            gap: 10px;\n            flex-wrap: wrap;\n        }\n        \n        .header-btn {\n            background: rgba(255,255,255,0.2);\n            color: white;\n            border: 1px solid rgba(255,255,255,0.3);\n            padding: 8px 16px;\n            border-radius: 20px;\n            cursor: pointer;\n            font-size: 13px;\n            transition: all 0.3s;\n        }\n        \n        .header-btn:hover {\n            background: rgba(255,255,255,0.3);\n            border-color: rgba(255,255,255,0.5);\n        }\n        \n        .day-row {\n            border-bottom: 1px solid #eee;\n            padding: 20px;\n        }\n        \n        .day-row:last-child {\n            border-bottom: none;\n        }\n        \n        .day-header {\n            margin-bottom: 15px;\n            padding-bottom: 10px;\n            border-bottom: 2px solid #e3f2fd;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            position: relative;\n            transition: all 0.3s;\n        }\n        \n        .day-header:hover {\n            background: rgba(74, 144, 226, 0.02);\n            border-radius: 8px;\n            padding: 10px;\n            margin: -5px -10px 15px -10px;\n        }\n        \n        .day-title {\n            font-size: 1.2rem;\n            font-weight: bold;\n            color: #333;\n        }\n        \n        .day-delete-btn {\n            position: absolute;\n            right: 0;\n            top: 50%;\n            transform: translateY(-50%);\n            background: rgba(220, 53, 69, 0.1);\n            color: #dc3545;\n            border: 1px solid rgba(220, 53, 69, 0.2);\n            padding: 6px;\n            border-radius: 50%;\n            cursor: pointer;\n            font-size: 14px;\n            opacity: 0;\n            visibility: hidden;\n            transition: all 0.3s;\n            width: 28px;\n            height: 28px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            line-height: 1;\n        }\n        \n        .day-header:hover .day-delete-btn {\n            opacity: 1;\n            visibility: visible;\n            transform: translateY(-50%) scale(1);\n        }\n        \n        .day-delete-btn:hover {\n            background: #dc3545;\n            color: white;\n            border-color: #dc3545;\n            transform: translateY(-50%) scale(1.1);\n        }\n        \n        .day-delete-btn::before {\n            content: '\ud83d\uddd1\ufe0f';\n            font-size: 12px;\n        }\n        \n        .schedule-divider {\n            position: relative;\n            height: 2px;\n            margin: 5px 0;\n            background: transparent;\n            cursor: pointer;\n            transition: all 0.3s;\n        }\n        \n        .schedule-divider:hover {\n            background: #e3f2fd;\n            height: 6px;\n            margin: 8px 0;\n        }\n        \n        .schedule-divider::before {\n            content: '';\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background: #f0f8ff;\n            opacity: 0;\n            transition: opacity 0.3s;\n        }\n        \n        .schedule-divider:hover::before {\n            opacity: 1;\n        }\n        \n        .add-btn {\n            position: absolute;\n            left: 50%;\n            top: 50%;\n            transform: translate(-50%, -50%);\n            background: #4a90e2;\n            color: white;\n            border: none;\n            padding: 6px 12px;\n            border-radius: 15px;\n            cursor: pointer;\n            font-size: 12px;\n            opacity: 0;\n            transition: all 0.3s;\n            z-index: 10;\n            white-space: nowrap;\n        }\n        \n        .schedule-divider:hover .add-btn {\n            opacity: 1;\n            transform: translate(-50%, -50%) scale(1);\n        }\n        \n        .add-btn:hover {\n            background: #357abd;\n            transform: translate(-50%, -50%) scale(1.05);\n        }\n        \n        .schedules-list {\n            min-height: 20px;\n        }\n        \n        .schedule-item {\n            background: #f8f9fa;\n            border: 1px solid #e9ecef;\n            border-radius: 8px;\n            padding: 15px;\n            margin-bottom: 10px;\n            display: flex;\n            align-items: center;\n            gap: 15px;\n        }\n        \n        .schedule-time {\n            min-width: 80px;\n        }\n        \n        .schedule-time select {\n            border: none;\n            background: transparent;\n            font-size: 14px;\n            font-weight: bold;\n            color: #4a90e2;\n            cursor: pointer;\n            padding: 2px;\n        }\n        \n        .schedule-time select:focus {\n            outline: 1px solid #4a90e2;\n            border-radius: 3px;\n        }\n        \n        .schedule-content {\n            flex: 1;\n        }\n        \n        .schedule-title {\n            font-weight: bold;\n            margin-bottom: 5px;\n        }\n        \n        .schedule-title input {\n            border: none;\n            background: transparent;\n            font-weight: bold;\n            font-size: 14px;\n            width: 100%;\n            padding: 2px;\n        }\n        \n        .schedule-title input:focus {\n            outline: 1px solid #4a90e2;\n            border-radius: 3px;\n            background: white;\n        }\n        \n        .schedule-description {\n            color: #666;\n            font-size: 13px;\n        }\n        \n        .schedule-description textarea {\n            border: none;\n            background: transparent;\n            color: #666;\n            font-size: 13px;\n            width: 100%;\n            resize: none;\n            padding: 2px;\n            height: 20px;\n        }\n        \n        .schedule-description textarea:focus {\n            outline: 1px solid #4a90e2;\n            border-radius: 3px;\n            background: white;\n            height: 60px;\n        }\n        \n        .schedule-actions {\n            display: flex;\n            gap: 5px;\n        }\n        \n        .delete-btn {\n            background: #dc3545;\n            color: white;\n            border: none;\n            padding: 5px 10px;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 12px;\n        }\n        \n        .delete-btn:hover {\n            background: #c82333;\n        }\n        \n        .modal {\n            display: none;\n            position: fixed;\n            z-index: 1000;\n            left: 0;\n            top: 0;\n            width: 100%;\n            height: 100%;\n            background-color: rgba(0,0,0,0.5);\n        }\n        \n        .modal-content {\n            background-color: white;\n            margin: 10% auto;\n            padding: 0;\n            border-radius: 15px;\n            width: 90%;\n            max-width: 500px;\n            box-shadow: 0 20px 50px rgba(0,0,0,0.2);\n            animation: modalSlideIn 0.3s ease-out;\n        }\n        \n        @keyframes modalSlideIn {\n            from { \n                transform: translateY(-50px); \n                opacity: 0; \n            }\n            to { \n                transform: translateY(0); \n                opacity: 1; \n            }\n        }\n        \n        .modal-header {\n            background: #4a90e2;\n            color: white;\n            padding: 20px;\n            border-radius: 15px 15px 0 0;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        \n        .modal-header h2 {\n            margin: 0;\n            font-weight: 300;\n        }\n        \n        .modal-body {\n            padding: 30px;\n        }\n        \n        .form-group {\n            margin-bottom: 20px;\n        }\n        \n        .form-group label {\n            display: block;\n            margin-bottom: 8px;\n            font-weight: 600;\n            color: #495057;\n        }\n        \n        .form-group input,\n        .form-group textarea,\n        .form-group select {\n            width: 100%;\n            padding: 12px 16px;\n            border: 2px solid #dee2e6;\n            border-radius: 8px;\n            font-size: 14px;\n            transition: border-color 0.3s;\n            font-family: inherit;\n        }\n        \n        .form-group input:focus,\n        .form-group textarea:focus,\n        .form-group select:focus {\n            outline: none;\n            border-color: #4a90e2;\n        }\n        \n        .form-group textarea {\n            resize: vertical;\n            min-height: 100px;\n        }\n        \n        .modal-actions {\n            display: flex;\n            gap: 10px;\n            justify-content: flex-end;\n            padding: 20px 30px;\n            background: #f8f9fa;\n            border-radius: 0 0 15px 15px;\n        }\n        \n        .close {\n            color: white;\n            font-size: 28px;\n            font-weight: bold;\n            cursor: pointer;\n            opacity: 0.8;\n            transition: opacity 0.3s;\n            line-height: 1;\n        }\n        \n        .close:hover {\n            opacity: 1;\n        }\n        \n        @media (max-width: 600px) {\n            .container {\n                margin: 10px;\n                border-radius: 5px;\n            }\n            \n            .header-controls {\n                flex-direction: column;\n                align-items: center;\n            }\n            \n            .day-header:hover {\n                margin: -5px -5px 15px -5px;\n                padding: 10px 5px;\n            }\n            \n            .day-header {\n                flex-direction: column;\n                gap: 10px;\n                align-items: stretch;\n            }\n            \n            .day-delete-btn {\n                position: static;\n                transform: none;\n                align-self: flex-end;\n                margin-top: 5px;\n            }\n            \n            .day-header:hover .day-delete-btn {\n                transform: none;\n            }\n            \n            .day-delete-btn:hover {\n                transform: scale(1.1);\n            }\n            \n            .schedule-item {\n                flex-direction: column;\n                align-items: stretch;\n                gap: 10px;\n            }\n            \n            .schedule-time {\n                min-width: auto;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <div class=\"header\">\n            <h1>\uc5ec\ud589 \uc77c\uc815 \uad00\ub9ac<\/h1>\n            <p>2024\ub144 8\uc6d4 28\uc77c ~ 9\uc6d4 18\uc77c<\/p>\n            <div class=\"header-controls\">\n                <button class=\"header-btn\" onclick=\"showAddDateModal()\">\ud83d\udcc5 \ub0a0\uc9dc \ucd94\uac00<\/button>\n                <button class=\"header-btn\" onclick=\"exportSchedules()\">\ud83d\udce4 \ub0b4\ubcf4\ub0b4\uae30<\/button>\n                <button class=\"header-btn\" onclick=\"clearAllData()\">\ud83d\uddd1\ufe0f \uc804\uccb4 \uc0ad\uc81c<\/button>\n            <\/div>\n        <\/div>\n        \n        <div id=\"calendar\">\n            <!-- \ub0a0\uc9dc\ubcc4 \ud589\ub4e4\uc774 \uc5ec\uae30\uc5d0 \uc0dd\uc131\ub429\ub2c8\ub2e4 -->\n        <\/div>\n    <\/div>\n\n    <!-- \ub0a0\uc9dc \ucd94\uac00 \ubaa8\ub2ec -->\n    <div id=\"addDateModal\" class=\"modal\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h2>\uc0c8 \ub0a0\uc9dc \ucd94\uac00<\/h2>\n                <span class=\"close\" onclick=\"closeAddDateModal()\">&times;<\/span>\n            <\/div>\n            <div class=\"modal-body\">\n                <div class=\"form-group\">\n                    <label for=\"newDate\">\ub0a0\uc9dc \uc120\ud0dd:<\/label>\n                    <input type=\"date\" id=\"newDate\" required>\n                <\/div>\n                <p style=\"color: #666; font-size: 13px; margin-top: 10px;\">\n                    * \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ub0a0\uc9dc\ub294 \ucd94\uac00\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n                <\/p>\n            <\/div>\n            <div class=\"modal-actions\">\n                <button class=\"btn btn-danger\" onclick=\"closeAddDateModal()\">\ucde8\uc18c<\/button>\n                <button class=\"btn\" onclick=\"addNewDate()\">\ucd94\uac00<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- \uae30\uc874 \ubaa8\ub2ec\ub4e4... -->\n\n    <script>\n        \/\/ \uc804\uc5ed \ubcc0\uc218\n        var schedules = {};\n        var timeOptions = [];\n        var STORAGE_KEY = 'travel_schedules';\n        \n        \/\/ \uc2dc\uac04 \uc635\uc158 \uc0dd\uc131 (30\ubd84 \uac04\uaca9)\n        function generateTimeOptions() {\n            timeOptions = [];\n            for (var hour = 0; hour < 24; hour++) {\n                for (var minute = 0; minute < 60; minute += 30) {\n                    var hourStr = hour.toString().padStart(2, '0');\n                    var minuteStr = minute.toString().padStart(2, '0');\n                    timeOptions.push(hourStr + ':' + minuteStr);\n                }\n            }\n        }\n        \n        \/\/ \ub370\uc774\ud130 \uc800\uc7a5\n        function saveSchedules() {\n            try {\n                localStorage.setItem(STORAGE_KEY, JSON.stringify(schedules));\n                console.log('\uc77c\uc815\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4:', schedules);\n            } catch (error) {\n                console.error('\ub370\uc774\ud130 \uc800\uc7a5 \uc911 \uc624\ub958:', error);\n            }\n        }\n        \n        \/\/ \ub370\uc774\ud130 \ub85c\ub4dc\n        function loadSchedules() {\n            try {\n                var savedData = localStorage.getItem(STORAGE_KEY);\n                if (savedData) {\n                    schedules = JSON.parse(savedData);\n                    console.log('\uc800\uc7a5\ub41c \uc77c\uc815\uc744 \ubd88\ub7ec\uc654\uc2b5\ub2c8\ub2e4:', schedules);\n                } else {\n                    \/\/ \ucd08\uae30 \ub370\uc774\ud130 (\ucc98\uc74c \ubc29\ubb38\uc2dc\uc5d0\ub9cc)\n                    schedules = {\n                        '2024-08-28': [\n                            {\n                                id: '1',\n                                time: '09:00',\n                                title: '\uc778\ucc9c\uacf5\ud56d \ucd9c\ubc1c',\n                                description: '\uccb4\ud06c\uc778 2\uc2dc\uac04 \uc804 \ub3c4\ucc29'\n                            },\n                            {\n                                id: '2',\n                                time: '15:30',\n                                title: '\ud604\uc9c0 \ub3c4\ucc29',\n                                description: '\uacf5\ud56d\uc5d0\uc11c \ud638\ud154\ub85c \uc774\ub3d9'\n                            }\n                        ],\n                        '2024-08-29': [\n                            {\n                                id: '3',\n                                time: '10:00',\n                                title: '\uc2dc\ub0b4 \uad00\uad11',\n                                description: '\uc8fc\uc694 \uba85\uc18c \ub458\ub7ec\ubcf4\uae30'\n                            }\n                        ]\n                    };\n                    saveSchedules(); \/\/ \ucd08\uae30 \ub370\uc774\ud130 \uc800\uc7a5\n                }\n            } catch (error) {\n                console.error('\ub370\uc774\ud130 \ub85c\ub4dc \uc911 \uc624\ub958:', error);\n                schedules = {};\n            }\n        }\n\n        \/\/ \ud398\uc774\uc9c0 \ub85c\ub4dc \ud6c4 \uc2e4\ud589\n        document.addEventListener('DOMContentLoaded', function() {\n            console.log('\ud398\uc774\uc9c0\uac00 \ub85c\ub4dc\ub418\uc5c8\uc2b5\ub2c8\ub2e4');\n            try {\n                generateTimeOptions();\n                console.log('\uc2dc\uac04 \uc635\uc158 \uc0dd\uc131 \uc644\ub8cc');\n                \n                loadSchedules();\n                console.log('\uc77c\uc815 \ub370\uc774\ud130 \ub85c\ub4dc \uc644\ub8cc:', schedules);\n                \n                renderCalendar();\n                console.log('\uce98\ub9b0\ub354 \ub80c\ub354\ub9c1 \uc644\ub8cc');\n            } catch (error) {\n                console.error('\ucd08\uae30\ud654 \uc911 \uc624\ub958 \ubc1c\uc0dd:', error);\n                \n                \/\/ \uc624\ub958 \ubc1c\uc0dd \uc2dc \uae30\ubcf8 \ub370\uc774\ud130\ub85c \ucd08\uae30\ud654\n                schedules = {\n                    '2024-08-28': [\n                        {\n                            id: '1',\n                            time: '09:00',\n                            title: '\uc778\ucc9c\uacf5\ud56d \ucd9c\ubc1c',\n                            description: '\uccb4\ud06c\uc778 2\uc2dc\uac04 \uc804 \ub3c4\ucc29'\n                        }\n                    ]\n                };\n                console.log('\uae30\ubcf8 \ub370\uc774\ud130\ub85c \ucd08\uae30\ud654:', schedules);\n                renderCalendar();\n            }\n        });\n\n        \/\/ \uce98\ub9b0\ub354 \ub80c\ub354\ub9c1\n        function renderCalendar() {\n            console.log('\uce98\ub9b0\ub354 \ub80c\ub354\ub9c1 \uc2dc\uc791');\n            try {\n                var calendar = document.getElementById('calendar');\n                if (!calendar) {\n                    console.error('\uce98\ub9b0\ub354 \uc694\uc18c\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4');\n                    return;\n                }\n                \n                calendar.innerHTML = '';\n                \n                \/\/ \uae30\ubcf8 \uc5ec\ud589 \uae30\uac04\uc758 \ubaa8\ub4e0 \ub0a0\uc9dc \uc0dd\uc131\n                var dateList = [];\n                var startDate = new Date('2024-08-28');\n                var endDate = new Date('2024-09-18');\n                var currentDate = new Date(startDate);\n                \n                while (currentDate <= endDate) {\n                    var dateStr = currentDate.toISOString().split('T')[0];\n                    dateList.push(dateStr);\n                    currentDate.setDate(currentDate.getDate() + 1);\n                }\n                \n                \/\/ \uc800\uc7a5\ub41c \uc77c\uc815\uc774 \uc788\ub294 \ucd94\uac00 \ub0a0\uc9dc\ub4e4\ub3c4 \ud3ec\ud568\n                for (var date in schedules) {\n                    if (schedules.hasOwnProperty(date) &#038;&#038; dateList.indexOf(date) === -1) {\n                        dateList.push(date);\n                    }\n                }\n                \n                \/\/ \ub0a0\uc9dc\uc21c \uc815\ub82c\n                dateList.sort();\n                \n                console.log('\ub80c\ub354\ub9c1\ud560 \ub0a0\uc9dc \ubaa9\ub85d:', dateList);\n                \n                if (dateList.length === 0) {\n                    calendar.innerHTML = '<div style=\"text-align: center; padding: 40px; color: #666;\">\ub0a0\uc9dc\ub97c \ucd94\uac00\ud574\uc8fc\uc138\uc694.<\/div>';\n                    return;\n                }\n                \n                for (var i = 0; i < dateList.length; i++) {\n                    var dateStr = dateList[i];\n                    try {\n                        var date = new Date(dateStr + 'T00:00:00');\n                        var dayRow = createDayRow(date, dateStr);\n                        calendar.appendChild(dayRow);\n                    } catch (dateError) {\n                        console.error('\ub0a0\uc9dc \ucc98\ub9ac \uc624\ub958:', dateStr, dateError);\n                    }\n                }\n                \n                console.log('\uce98\ub9b0\ub354 \ub80c\ub354\ub9c1 \uc644\ub8cc');\n            } catch (error) {\n                console.error('\uce98\ub9b0\ub354 \ub80c\ub354\ub9c1 \uc911 \uc624\ub958:', error);\n                var calendar = document.getElementById('calendar');\n                if (calendar) {\n                    calendar.innerHTML = '<div style=\"text-align: center; padding: 40px; color: #dc3545;\">\uce98\ub9b0\ub354\ub97c \ub85c\ub4dc\ud558\ub294 \uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \ud398\uc774\uc9c0\ub97c \uc0c8\ub85c\uace0\uce68\ud574 \uc8fc\uc138\uc694.<\/div>';\n                }\n            }\n        }\n\n        \/\/ \ub0a0\uc9dc \ud589 \uc0dd\uc131\n        function createDayRow(date, dateStr) {\n            var row = document.createElement('div');\n            row.className = 'day-row';\n            \n            var month = date.getMonth() + 1;\n            var day = date.getDate();\n            var weekdays = ['\uc77c', '\uc6d4', '\ud654', '\uc218', '\ubaa9', '\uae08', '\ud1a0'];\n            var weekday = weekdays[date.getDay()];\n            \n            var daySchedules = schedules[dateStr] || [];\n            \n            \/\/ \uc2dc\uac04\uc21c \uc815\ub82c\n            daySchedules.sort(function(a, b) {\n                return a.time.localeCompare(b.time);\n            });\n            \n            var schedulesHtml = '';\n            \n            \/\/ \uccab \ubc88\uc9f8 \uad6c\ubd84\uc120 (\ub0a0\uc9dc \ud5e4\ub354 \ub2e4\uc74c)\n            schedulesHtml += '<div class=\"schedule-divider\" onclick=\"addNewScheduleAtPosition(\\'' + dateStr + '\\', 0)\">' +\n                '<button class=\"add-btn\">+ \uc5ec\uae30\uc5d0 \uc77c\uc815 \ucd94\uac00<\/button>' +\n            '<\/div>';\n            \n            if (daySchedules.length === 0) {\n                \/\/ \uc77c\uc815\uc774 \uc5c6\uc744 \ub54c\ub294 \uad6c\ubd84\uc120\ub9cc \ud45c\uc2dc\n            } else {\n                for (var i = 0; i < daySchedules.length; i++) {\n                    schedulesHtml += createScheduleItem(daySchedules[i], dateStr);\n                    \n                    \/\/ \uac01 \uc77c\uc815 \ub2e4\uc74c\uc5d0 \uad6c\ubd84\uc120 \ucd94\uac00\n                    schedulesHtml += '<div class=\"schedule-divider\" onclick=\"addNewScheduleAtPosition(\\'' + dateStr + '\\', ' + (i + 1) + ')\">' +\n                        '<button class=\"add-btn\">+ \uc5ec\uae30\uc5d0 \uc77c\uc815 \ucd94\uac00<\/button>' +\n                    '<\/div>';\n                }\n            }\n            \n            row.innerHTML = \n                '<div class=\"day-header\">' +\n                    '<div class=\"day-title\">' + month + '\uc6d4 ' + day + '\uc77c (' + weekday + ')<\/div>' +\n                    '<button class=\"day-delete-btn\" onclick=\"deleteDate(\\'' + dateStr + '\\')\" title=\"\uc774 \ub0a0\uc9dc\uc640 \ubaa8\ub4e0 \uc77c\uc815 \uc0ad\uc81c\"><\/button>' +\n                '<\/div>' +\n                '<div class=\"schedules-list\" id=\"schedules-' + dateStr + '\">' +\n                    schedulesHtml +\n                '<\/div>';\n            \n            return row;\n        }\n\n        \/\/ \uc77c\uc815 \uc544\uc774\ud15c \uc0dd\uc131\n        function createScheduleItem(schedule, dateStr) {\n            try {\n                \/\/ HTML \ud2b9\uc218\ubb38\uc790 \uc774\uc2a4\ucf00\uc774\ud504\n                function escapeHtml(text) {\n                    if (!text) return '';\n                    var div = document.createElement('div');\n                    div.textContent = text;\n                    return div.innerHTML;\n                }\n                \n                var timeOptionsHtml = '';\n                for (var i = 0; i < timeOptions.length; i++) {\n                    var selected = timeOptions[i] === schedule.time ? ' selected' : '';\n                    timeOptionsHtml += '<option value=\"' + timeOptions[i] + '\"' + selected + '>' + timeOptions[i] + '<\/option>';\n                }\n                \n                var safeTitle = escapeHtml(schedule.title || '\uc0c8 \uc77c\uc815');\n                var safeDescription = escapeHtml(schedule.description || '');\n                var safeTime = escapeHtml(schedule.time || '09:00');\n                var safeId = escapeHtml(schedule.id || 'temp-' + Date.now());\n                var safeDateStr = escapeHtml(dateStr);\n                \n                return '<div class=\"schedule-item\" data-id=\"' + safeId + '\">' +\n                    '<div class=\"schedule-time\">' +\n                        '<select onchange=\"updateScheduleTime(\\'' + safeDateStr + '\\', \\'' + safeId + '\\', this.value)\">' +\n                            timeOptionsHtml +\n                        '<\/select>' +\n                    '<\/div>' +\n                    '<div class=\"schedule-content\">' +\n                        '<div class=\"schedule-title\">' +\n                            '<input type=\"text\" value=\"' + safeTitle + '\" ' +\n                            'onblur=\"updateScheduleTitle(\\'' + safeDateStr + '\\', \\'' + safeId + '\\', this.value)\" ' +\n                            'placeholder=\"\uc77c\uc815 \uc81c\ubaa9\">' +\n                        '<\/div>' +\n                        '<div class=\"schedule-description\">' +\n                            '<textarea onblur=\"updateScheduleDescription(\\'' + safeDateStr + '\\', \\'' + safeId + '\\', this.value)\" ' +\n                            'placeholder=\"\uc124\uba85 \ucd94\uac00...\">' + safeDescription + '<\/textarea>' +\n                        '<\/div>' +\n                    '<\/div>' +\n                    '<div class=\"schedule-actions\">' +\n                        '<button class=\"delete-btn\" onclick=\"deleteSchedule(\\'' + safeDateStr + '\\', \\'' + safeId + '\\')\">\uc0ad\uc81c<\/button>' +\n                    '<\/div>' +\n                '<\/div>';\n            } catch (error) {\n                console.error('\uc77c\uc815 \uc544\uc774\ud15c \uc0dd\uc131 \uc911 \uc624\ub958:', schedule, error);\n                return '<div class=\"schedule-item\" style=\"color: #dc3545;\">\uc77c\uc815 \ub85c\ub4dc \uc624\ub958<\/div>';\n            }\n        }\n\n        \/\/ \uc0c8 \uc77c\uc815 \ucd94\uac00 (\uae30\uc874 \ud568\uc218)\n        function addNewSchedule(dateStr) {\n            addNewScheduleAtPosition(dateStr, 0);\n        }\n\n        \/\/ \ud2b9\uc815 \uc704\uce58\uc5d0 \uc0c8 \uc77c\uc815 \ucd94\uac00\n        function addNewScheduleAtPosition(dateStr, position) {\n            var daySchedules = schedules[dateStr] || [];\n            \n            \/\/ \uae30\ubcf8 \uc2dc\uac04 \uacc4\uc0b0 (\ud604\uc7ac \uc704\uce58\uc758 \uc55e\ub4a4 \uc2dc\uac04 \uace0\ub824)\n            var defaultTime = '09:00';\n            if (daySchedules.length > 0) {\n                if (position === 0) {\n                    \/\/ \ub9e8 \uc55e\uc5d0 \ucd94\uac00\ud558\ub294 \uacbd\uc6b0\n                    var firstTime = daySchedules[0].time;\n                    var hour = parseInt(firstTime.split(':')[0]);\n                    if (hour > 0) {\n                        defaultTime = (hour - 1).toString().padStart(2, '0') + ':00';\n                    } else {\n                        defaultTime = '23:30';\n                    }\n                } else if (position >= daySchedules.length) {\n                    \/\/ \ub9e8 \ub4a4\uc5d0 \ucd94\uac00\ud558\ub294 \uacbd\uc6b0\n                    var lastTime = daySchedules[daySchedules.length - 1].time;\n                    var hour = parseInt(lastTime.split(':')[0]);\n                    var minute = parseInt(lastTime.split(':')[1]);\n                    if (hour < 23 || minute < 30) {\n                        if (minute === 30) {\n                            defaultTime = (hour + 1).toString().padStart(2, '0') + ':00';\n                        } else {\n                            defaultTime = hour.toString().padStart(2, '0') + ':30';\n                        }\n                    } else {\n                        defaultTime = '00:00';\n                    }\n                } else {\n                    \/\/ \uc911\uac04\uc5d0 \ucd94\uac00\ud558\ub294 \uacbd\uc6b0\n                    var prevTime = daySchedules[position - 1].time;\n                    var nextTime = daySchedules[position].time;\n                    var prevHour = parseInt(prevTime.split(':')[0]);\n                    var prevMinute = parseInt(prevTime.split(':')[1]);\n                    var nextHour = parseInt(nextTime.split(':')[0]);\n                    var nextMinute = parseInt(nextTime.split(':')[1]);\n                    \n                    \/\/ \uc911\uac04 \uc2dc\uac04 \uacc4\uc0b0\n                    var prevTotal = prevHour * 60 + prevMinute;\n                    var nextTotal = nextHour * 60 + nextMinute;\n                    var midTotal = Math.floor((prevTotal + nextTotal) \/ 2);\n                    \n                    var midHour = Math.floor(midTotal \/ 60);\n                    var midMinute = midTotal % 60;\n                    \n                    \/\/ 30\ubd84 \ub2e8\uc704\ub85c \ubc18\uc62c\ub9bc\n                    if (midMinute < 15) {\n                        midMinute = 0;\n                    } else if (midMinute < 45) {\n                        midMinute = 30;\n                    } else {\n                        midMinute = 0;\n                        midHour = (midHour + 1) % 24;\n                    }\n                    \n                    defaultTime = midHour.toString().padStart(2, '0') + ':' + midMinute.toString().padStart(2, '0');\n                }\n            }\n            \n            var newSchedule = {\n                id: Date.now().toString(),\n                time: defaultTime,\n                title: '\uc0c8 \uc77c\uc815',\n                description: ''\n            };\n            \n            if (!schedules[dateStr]) {\n                schedules[dateStr] = [];\n            }\n            \n            schedules[dateStr].push(newSchedule);\n            saveSchedules(); \/\/ \ub370\uc774\ud130 \uc800\uc7a5\n            refreshDaySchedules(dateStr);\n        }\n\n        \/\/ \uc77c\uc815 \uc2dc\uac04 \uc5c5\ub370\uc774\ud2b8\n        function updateScheduleTime(dateStr, scheduleId, newTime) {\n            if (schedules[dateStr]) {\n                for (var i = 0; i < schedules[dateStr].length; i++) {\n                    if (schedules[dateStr][i].id === scheduleId) {\n                        schedules[dateStr][i].time = newTime;\n                        break;\n                    }\n                }\n                saveSchedules(); \/\/ \ub370\uc774\ud130 \uc800\uc7a5\n                refreshDaySchedules(dateStr);\n            }\n        }\n\n        \/\/ \uc77c\uc815 \uc81c\ubaa9 \uc5c5\ub370\uc774\ud2b8\n        function updateScheduleTitle(dateStr, scheduleId, newTitle) {\n            if (schedules[dateStr]) {\n                for (var i = 0; i < schedules[dateStr].length; i++) {\n                    if (schedules[dateStr][i].id === scheduleId) {\n                        schedules[dateStr][i].title = newTitle || '\uc0c8 \uc77c\uc815';\n                        break;\n                    }\n                }\n                saveSchedules(); \/\/ \ub370\uc774\ud130 \uc800\uc7a5\n            }\n        }\n\n        \/\/ \uc77c\uc815 \uc124\uba85 \uc5c5\ub370\uc774\ud2b8\n        function updateScheduleDescription(dateStr, scheduleId, newDescription) {\n            if (schedules[dateStr]) {\n                for (var i = 0; i < schedules[dateStr].length; i++) {\n                    if (schedules[dateStr][i].id === scheduleId) {\n                        schedules[dateStr][i].description = newDescription;\n                        break;\n                    }\n                }\n                saveSchedules(); \/\/ \ub370\uc774\ud130 \uc800\uc7a5\n            }\n        }\n\n        \/\/ \uc77c\uc815 \uc0ad\uc81c\n        function deleteSchedule(dateStr, scheduleId) {\n            if (!confirm('\uc815\ub9d0\ub85c \uc774 \uc77c\uc815\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?')) {\n                return;\n            }\n            \n            if (schedules[dateStr]) {\n                var newSchedules = [];\n                for (var i = 0; i < schedules[dateStr].length; i++) {\n                    if (schedules[dateStr][i].id !== scheduleId) {\n                        newSchedules.push(schedules[dateStr][i]);\n                    }\n                }\n                schedules[dateStr] = newSchedules;\n                \n                if (schedules[dateStr].length === 0) {\n                    delete schedules[dateStr];\n                }\n                \n                saveSchedules(); \/\/ \ub370\uc774\ud130 \uc800\uc7a5\n                refreshDaySchedules(dateStr);\n            }\n        }\n\n        \/\/ \ud2b9\uc815 \ub0a0\uc9dc\uc758 \uc77c\uc815\ub9cc \uc0c8\ub85c\uace0\uce68\n        function refreshDaySchedules(dateStr) {\n            var schedulesContainer = document.getElementById('schedules-' + dateStr);\n            if (!schedulesContainer) return;\n            \n            var daySchedules = schedules[dateStr] || [];\n            \n            \/\/ \uc2dc\uac04\uc21c \uc815\ub82c\n            daySchedules.sort(function(a, b) {\n                return a.time.localeCompare(b.time);\n            });\n            \n            var schedulesHtml = '';\n            \n            \/\/ \uccab \ubc88\uc9f8 \uad6c\ubd84\uc120 (\ub0a0\uc9dc \ud5e4\ub354 \ub2e4\uc74c)\n            schedulesHtml += '<div class=\"schedule-divider\" onclick=\"addNewScheduleAtPosition(\\'' + dateStr + '\\', 0)\">' +\n                '<button class=\"add-btn\">+ \uc5ec\uae30\uc5d0 \uc77c\uc815 \ucd94\uac00<\/button>' +\n            '<\/div>';\n            \n            if (daySchedules.length > 0) {\n                for (var i = 0; i < daySchedules.length; i++) {\n                    schedulesHtml += createScheduleItem(daySchedules[i], dateStr);\n                    \n                    \/\/ \uac01 \uc77c\uc815 \ub2e4\uc74c\uc5d0 \uad6c\ubd84\uc120 \ucd94\uac00\n                    schedulesHtml += '<div class=\"schedule-divider\" onclick=\"addNewScheduleAtPosition(\\'' + dateStr + '\\', ' + (i + 1) + ')\">' +\n                        '<button class=\"add-btn\">+ \uc5ec\uae30\uc5d0 \uc77c\uc815 \ucd94\uac00<\/button>' +\n                    '<\/div>';\n                }\n            }\n            \n            schedulesContainer.innerHTML = schedulesHtml;\n        }\n        \n        \/\/ \ub0a0\uc9dc \ucd94\uac00 \ubaa8\ub2ec \ud45c\uc2dc\n        function showAddDateModal() {\n            document.getElementById('addDateModal').style.display = 'block';\n            \n            \/\/ \uc624\ub298 \ub0a0\uc9dc\ub97c \uae30\ubcf8\uac12\uc73c\ub85c \uc124\uc815\n            var today = new Date();\n            var dateStr = today.toISOString().split('T')[0];\n            document.getElementById('newDate').value = dateStr;\n        }\n        \n        \/\/ \ub0a0\uc9dc \ucd94\uac00 \ubaa8\ub2ec \ub2eb\uae30\n        function closeAddDateModal() {\n            document.getElementById('addDateModal').style.display = 'none';\n        }\n        \n        \/\/ \uc0c8 \ub0a0\uc9dc \ucd94\uac00\n        function addNewDate() {\n            var dateInput = document.getElementById('newDate');\n            var dateStr = dateInput.value;\n            \n            if (!dateStr) {\n                alert('\ub0a0\uc9dc\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694.');\n                return;\n            }\n            \n            \/\/ \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ub0a0\uc9dc\uc778\uc9c0 \ud655\uc778\n            if (schedules[dateStr]) {\n                alert('\uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ub0a0\uc9dc\uc785\ub2c8\ub2e4.');\n                return;\n            }\n            \n            \/\/ \uc0c8 \ub0a0\uc9dc \ucd94\uac00 (\ube48 \uc77c\uc815\uc73c\ub85c)\n            schedules[dateStr] = [];\n            saveSchedules();\n            renderCalendar();\n            closeAddDateModal();\n            \n            \/\/ \ucd94\uac00\ub41c \ub0a0\uc9dc\ub85c \uc2a4\ud06c\ub864\n            setTimeout(function() {\n                var targetElement = document.querySelector('[data-date=\"' + dateStr + '\"]');\n                if (targetElement) {\n                    targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n                }\n            }, 100);\n        }\n        \n        \/\/ \ub0a0\uc9dc \uc0ad\uc81c\n        function deleteDate(dateStr) {\n            var date = new Date(dateStr + 'T00:00:00');\n            var month = date.getMonth() + 1;\n            var day = date.getDate();\n            \n            var scheduleCount = schedules[dateStr] ? schedules[dateStr].length : 0;\n            var message = month + '\uc6d4 ' + day + '\uc77c\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?';\n            if (scheduleCount > 0) {\n                message += '\\n(\ud3ec\ud568\ub41c ' + scheduleCount + '\uac1c\uc758 \uc77c\uc815\ub3c4 \ud568\uaed8 \uc0ad\uc81c\ub429\ub2c8\ub2e4)';\n            }\n            \n            if (!confirm(message)) {\n                return;\n            }\n            \n            delete schedules[dateStr];\n            saveSchedules();\n            renderCalendar();\n        }\n        \n        \/\/ \ub370\uc774\ud130 \ub0b4\ubcf4\ub0b4\uae30\n        function exportSchedules() {\n            var output = '';\n            output += '='.repeat(50) + '\\n';\n            output += '           \uc5ec\ud589 \uc77c\uc815\ud45c\\n';\n            output += '='.repeat(50) + '\\n\\n';\n            \n            \/\/ \ub0a0\uc9dc\ubcc4\ub85c \uc815\ub82c\n            var dateList = Object.keys(schedules).sort();\n            \n            if (dateList.length === 0) {\n                output += '\ub4f1\ub85d\ub41c \uc77c\uc815\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.\\n';\n            } else {\n                for (var i = 0; i < dateList.length; i++) {\n                    var dateStr = dateList[i];\n                    var date = new Date(dateStr + 'T00:00:00');\n                    var month = date.getMonth() + 1;\n                    var day = date.getDate();\n                    var weekdays = ['\uc77c', '\uc6d4', '\ud654', '\uc218', '\ubaa9', '\uae08', '\ud1a0'];\n                    var weekday = weekdays[date.getDay()];\n                    \n                    output += '\ud83d\udcc5 ' + month + '\uc6d4 ' + day + '\uc77c (' + weekday + '\uc694\uc77c)\\n';\n                    output += '-'.repeat(30) + '\\n';\n                    \n                    var daySchedules = schedules[dateStr] || [];\n                    \n                    if (daySchedules.length === 0) {\n                        output += '   \uc77c\uc815 \uc5c6\uc74c\\n';\n                    } else {\n                        \/\/ \uc2dc\uac04\uc21c \uc815\ub82c\n                        daySchedules.sort(function(a, b) {\n                            return a.time.localeCompare(b.time);\n                        });\n                        \n                        for (var j = 0; j < daySchedules.length; j++) {\n                            var schedule = daySchedules[j];\n                            output += '\ud83d\udd50 ' + schedule.time + ' - ' + schedule.title + '\\n';\n                            if (schedule.description &#038;&#038; schedule.description.trim()) {\n                                \/\/ \uc124\uba85\uc744 \uc5ec\ub7ec \uc904\ub85c \ub098\ub204\uc5b4 \ub4e4\uc5ec\uc4f0\uae30\n                                var descLines = schedule.description.split('\\n');\n                                for (var k = 0; k < descLines.length; k++) {\n                                    if (descLines[k].trim()) {\n                                        output += '     \ud83d\udcdd ' + descLines[k].trim() + '\\n';\n                                    }\n                                }\n                            }\n                            output += '\\n';\n                        }\n                    }\n                    \n                    output += '\\n';\n                }\n            }\n            \n            output += '='.repeat(50) + '\\n';\n            output += '\uc0dd\uc131\uc77c\uc2dc: ' + new Date().toLocaleString('ko-KR') + '\\n';\n            output += '='.repeat(50) + '\\n';\n            \n            \/\/ \ud14d\uc2a4\ud2b8 \ud30c\uc77c\ub85c \ub2e4\uc6b4\ub85c\ub4dc\n            var dataBlob = new Blob([output], {type: 'text\/plain; charset=utf-8'});\n            var url = URL.createObjectURL(dataBlob);\n            var link = document.createElement('a');\n            link.href = url;\n            link.download = '\uc5ec\ud589\uc77c\uc815_' + new Date().toISOString().split('T')[0] + '.txt';\n            link.click();\n            URL.revokeObjectURL(url);\n        }\n        \n        \/\/ \uc804\uccb4 \ub370\uc774\ud130 \uc0ad\uc81c\n        function clearAllData() {\n            if (!confirm('\uc815\ub9d0\ub85c \ubaa8\ub4e0 \uc77c\uc815\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?\\n\uc774 \uc791\uc5c5\uc740 \ub418\ub3cc\ub9b4 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.')) {\n                return;\n            }\n            \n            schedules = {};\n            saveSchedules();\n            renderCalendar();\n            alert('\ubaa8\ub4e0 \uc77c\uc815\uc774 \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.');\n        }\n    <\/script>\n<\/body>\n<\/html>","protected":false},"excerpt":{"rendered":"<p>\uc5ec\ud589 \uc77c\uc815 \uad00\ub9ac \uc5ec\ud589 \uc77c\uc815 \uad00\ub9ac 2024\ub144 8\uc6d4 28\uc77c ~ 9\uc6d4 18\uc77c \ud83d\udcc5 \ub0a0\uc9dc \ucd94\uac00 \ud83d\udce4 \ub0b4\ubcf4\ub0b4\uae30 \ud83d\uddd1\ufe0f \uc804\uccb4 \uc0ad\uc81c \uc0c8 \ub0a0\uc9dc \ucd94\uac00 &times; \ub0a0\uc9dc \uc120\ud0dd: * \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \ub0a0\uc9dc\ub294&#8230;<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_tribe_ticket_capacity":"0","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"_EventAllDay":false,"_EventTimezone":"","_EventStartDate":"","_EventEndDate":"","_EventStartDateUTC":"","_EventEndDateUTC":"","_EventShowMap":false,"_EventShowMapLink":false,"_EventURL":"","_EventCost":"","_EventCostDescription":"","_EventCurrencySymbol":"","_EventCurrencyCode":"","_EventCurrencyPosition":"","_EventDateTimeSeparator":"","_EventTimeRangeSeparator":"","_EventOrganizerID":[],"_EventVenueID":[],"_OrganizerEmail":"","_OrganizerPhone":"","_OrganizerWebsite":"","_VenueAddress":"","_VenueCity":"","_VenueCountry":"","_VenueProvince":"","_VenueState":"","_VenueZip":"","_VenuePhone":"","_VenueURL":"","_VenueStateProvince":"","_VenueLat":"","_VenueLng":"","_VenueShowMap":false,"_VenueShowMapLink":false,"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":"","_tec_slr_enabled":"","_tec_slr_layout":""},"class_list":["post-2202","page","type-page","status-publish","hentry"],"ticketed":false,"_links":{"self":[{"href":"https:\/\/visionnetworkcamp.org\/ko\/wp-json\/wp\/v2\/pages\/2202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/visionnetworkcamp.org\/ko\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/visionnetworkcamp.org\/ko\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/visionnetworkcamp.org\/ko\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/visionnetworkcamp.org\/ko\/wp-json\/wp\/v2\/comments?post=2202"}],"version-history":[{"count":0,"href":"https:\/\/visionnetworkcamp.org\/ko\/wp-json\/wp\/v2\/pages\/2202\/revisions"}],"wp:attachment":[{"href":"https:\/\/visionnetworkcamp.org\/ko\/wp-json\/wp\/v2\/media?parent=2202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}