{"id":23460,"date":"2025-10-24T14:10:32","date_gmt":"2025-10-24T18:10:32","guid":{"rendered":"https:\/\/www.arboretum.purdue.edu\/explorer\/?page_id=23460"},"modified":"2025-10-24T16:46:13","modified_gmt":"2025-10-24T20:46:13","slug":"visit-planner","status":"publish","type":"page","link":"https:\/\/www.arboretum.purdue.edu\/explorer\/visit-planner\/","title":{"rendered":"What&#8217;s in Bloom &#8211; Visit Planner"},"content":{"rendered":"\n\n\t<p><em>Enter the expected dates of your campus visit to display a list of plants that have been observed to bloom or fruit during that time.<\/em><\/p>\n\t\r\n<!-- <h1>Visit Planner<\/h1>\r\n    <p class=\"lead d-print-none\">Enter the expected dates of your campus visit to display a list of plants that have been observed to bloom or fruit during that time.<\/p> -->\r\n\r\n<form method=\"get\" action=\"\" class=\"row g-3 align-items-end mb-4 d-print-none\" id=\"visit-planner-form\">\r\n    <div class=\"col-md-3\">\r\n        <label for=\"visit_start_iso\" class=\"form-label\">Visit start (pick a date)<\/label>\r\n        <input type=\"date\" class=\"form-control\" id=\"visit_start_iso\" name=\"visit_start_iso\" value=\"\">\r\n\r\n    <\/div>\r\n\r\n    <div class=\"col-md-3\">\r\n        <label for=\"visit_end_iso\" class=\"form-label\">Visit end (pick a date)<\/label>\r\n        <input type=\"date\" class=\"form-control\" id=\"visit_end_iso\" name=\"visit_end_iso\" value=\"\">\r\n\r\n    <\/div>\r\n\r\n    <div class=\"col-md-3\">\r\n        <label for=\"visit_mode\" class=\"form-label\">Show plants that have been observed<\/label>\r\n        <select id=\"visit_mode\" name=\"visit_mode\" class=\"form-select\">\r\n                        <option value=\"both\"  selected='selected'>Flowering or fruiting<\/option>\r\n            <option value=\"flower\" >Flowering only<\/option>\r\n            <option value=\"fruit\" >Fruiting only<\/option>\r\n        <\/select>\r\n    <\/div>\r\n\r\n    <div id=\"searchFormPlant\" class=\"col-md-12\">\r\n        <div class=\" mb-1\">       <label for = plant_habit>Plant Type       <\/label>       <ul class = \"mb-1 search-feature-select\"><li><label class = \"genericCheckbox d-inline-block\"><input type = \"checkbox\" value = \"fern\" name = \"plant_habit[]\"><div>Fern<\/div><span class=\"genericCheckmark\"><\/span><\/label><sup><span class=\"ms-n1\"><a tabindex=\"0\" type=\"button\" class=\"fa-regular fa-circle-info text-secondary text-decoration-none\" data-bs-title=\"Fern\" data-bs-toggle=\"popover\" data-bs-trigger=\"hover focus\" data-bs-html=\"true\" data-bs-content=\"Flowerless plant which has feathery or leafy fronds\"><\/a><\/span><sup><\/li><li><label class = \"genericCheckbox d-inline-block\"><input type = \"checkbox\" value = \"herbaceous\" name = \"plant_habit[]\"><div>Herbaceous<\/div><span class=\"genericCheckmark\"><\/span><\/label><sup><span class=\"ms-n1\"><a tabindex=\"0\" type=\"button\" class=\"fa-regular fa-circle-info text-secondary text-decoration-none\" data-bs-title=\"Herbaceous\" data-bs-toggle=\"popover\" data-bs-trigger=\"hover focus\" data-bs-html=\"true\" data-bs-content=\"Vascular plants that have no persistent woody stems above ground\"><\/a><\/span><sup><\/li><li><label class = \"genericCheckbox d-inline-block\"><input type = \"checkbox\" value = \"liana\" name = \"plant_habit[]\"><div>Liana (Climbing Vine)<\/div><span class=\"genericCheckmark\"><\/span><\/label><sup><span class=\"ms-n1\"><a tabindex=\"0\" type=\"button\" class=\"fa-regular fa-circle-info text-secondary text-decoration-none\" data-bs-title=\"Liana (Climbing Vine)\" data-bs-toggle=\"popover\" data-bs-trigger=\"hover focus\" data-bs-html=\"true\" data-bs-content=\"Long-stemmed climbing woody vine\"><\/a><\/span><sup><\/li><li><label class = \"genericCheckbox d-inline-block\"><input type = \"checkbox\" value = \"shrub\" name = \"plant_habit[]\"><div>Shrub<\/div><span class=\"genericCheckmark\"><\/span><\/label><sup><span class=\"ms-n1\"><a tabindex=\"0\" type=\"button\" class=\"fa-regular fa-circle-info text-secondary text-decoration-none\" data-bs-title=\"Shrub\" data-bs-toggle=\"popover\" data-bs-trigger=\"hover focus\" data-bs-html=\"true\" data-bs-content=\"Small-to-medium-sized perennial woody plant usually with multiple stems \"><\/a><\/span><sup><\/li><li><label class = \"genericCheckbox d-inline-block\"><input type = \"checkbox\" value = \"shrub-tree\" name = \"plant_habit[]\"><div>Shrub\/Tree<\/div><span class=\"genericCheckmark\"><\/span><\/label><sup><span class=\"ms-n1\"><a tabindex=\"0\" type=\"button\" class=\"fa-regular fa-circle-info text-secondary text-decoration-none\" data-bs-title=\"Shrub\/Tree\" data-bs-toggle=\"popover\" data-bs-trigger=\"hover focus\" data-bs-html=\"true\" data-bs-content=\"Small-to-medium-sized perennial woody plant that can be either classified as a tree or a shrub\"><\/a><\/span><sup><\/li><li><label class = \"genericCheckbox d-inline-block\"><input type = \"checkbox\" value = \"t\" name = \"plant_habit[]\"><div>Tree<\/div><span class=\"genericCheckmark\"><\/span><\/label><sup><span class=\"ms-n1\"><a tabindex=\"0\" type=\"button\" class=\"fa-regular fa-circle-info text-secondary text-decoration-none\" data-bs-title=\"Tree\" data-bs-toggle=\"popover\" data-bs-trigger=\"hover focus\" data-bs-html=\"true\" data-bs-content=\"Woody perennial plant with an elongated stem or trunk\"><\/a><\/span><sup><\/li><\/ul><\/div>        <div class=\"btn-group ms-4\" role=\"group\" aria-label=\"Plant habit quick actions\">\r\n            <button type=\"button\" id=\"plant-select-all\" class=\"btn btn-secondary btn-sm\">Select all<\/button>\r\n            <button type=\"button\" id=\"plant-deselect-all\" class=\"btn btn-secondary btn-sm\">Deselect all<\/button>\r\n        <\/div>\r\n\r\n\r\n\r\n    <\/div>\r\n\r\n    <div class=\"col-md-6\">\r\n        <div class=\"d-flex gap-2 align-items-center\">\r\n            <button id=\"visit-planner-submit\" type=\"submit\" class=\"btn btn-primary\" disabled aria-disabled=\"true\">Show plants for these dates<\/button>\r\n            <!-- <small id=\"visit-planner-helper\" class=\"form-text text-muted ms-2\">Select a start date, an end date and at least one plant type<\/small> -->\r\n            <a href=\"\/explorer\/wp-json\/wp\/v2\/pages\/23460\" class=\"btn btn-link\">Reset<\/a>\r\n        <\/div>\r\n    <\/div>\r\n<\/form>\r\n<input type=\"hidden\" id=\"visit_auto_set\" name=\"visit_auto_set\" value=\"0\">\r\n<script>\r\n    (function() {\r\n        function emitChange(el) {\r\n            if (!el) return;\r\n            var ev;\r\n            try {\r\n                ev = new Event('change', {\r\n                    bubbles: true\r\n                });\r\n            } catch (e) {\r\n                ev = document.createEvent('HTMLEvents');\r\n                ev.initEvent('change', true, false);\r\n            }\r\n            el.dispatchEvent(ev);\r\n        }\r\n\r\n        function selectAllWithin(container) {\r\n            var checks = container.querySelectorAll('input[name=\"plant_habit[]\"]');\r\n            if (checks && checks.length) {\r\n                checks.forEach(function(cb) {\r\n                    cb.checked = true;\r\n                    emitChange(cb);\r\n                });\r\n                if (checks[0]) checks[0].focus();\r\n                return;\r\n            }\r\n            var sel = container.querySelector('select[name=\"plant_habit\"]');\r\n            if (sel) {\r\n                if (sel.multiple) {\r\n                    Array.prototype.forEach.call(sel.options, function(opt) {\r\n                        opt.selected = true;\r\n                    });\r\n                } else {\r\n                    \/\/ choose first non-empty option for single selects\r\n                    for (var i = 0; i < sel.options.length; i++) {\r\n                        if (sel.options[i].value !== '') {\r\n                            sel.value = sel.options[i].value;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                emitChange(sel);\r\n                sel.focus();\r\n            }\r\n        }\r\n\r\n        function deselectAllWithin(container) {\r\n            var checks = container.querySelectorAll('input[name=\"plant_habit[]\"]');\r\n            if (checks && checks.length) {\r\n                checks.forEach(function(cb) {\r\n                    cb.checked = false;\r\n                    emitChange(cb);\r\n                });\r\n                if (checks[0]) checks[0].focus();\r\n                return;\r\n            }\r\n            var sel = container.querySelector('select[name=\"plant_habit\"]');\r\n            if (sel) {\r\n                if (sel.multiple) {\r\n                    Array.prototype.forEach.call(sel.options, function(opt) {\r\n                        opt.selected = false;\r\n                    });\r\n                } else {\r\n                    sel.value = '';\r\n                }\r\n                emitChange(sel);\r\n                sel.focus();\r\n            }\r\n        }\r\n\r\n        var container = document.getElementById('searchFormPlant');\r\n        var btnAll = document.getElementById('plant-select-all');\r\n        var btnNone = document.getElementById('plant-deselect-all');\r\n\r\n        if (btnAll) {\r\n            btnAll.addEventListener('click', function(e) {\r\n                e.preventDefault();\r\n                selectAllWithin(container || document);\r\n            });\r\n        }\r\n        if (btnNone) {\r\n            btnNone.addEventListener('click', function(e) {\r\n                e.preventDefault();\r\n                deselectAllWithin(container || document);\r\n            });\r\n        }\r\n    })();\r\n\r\n    (function() {\r\n        var start = document.getElementById('visit_start_iso');\r\n        var end = document.getElementById('visit_end_iso');\r\n        var autoFlag = document.getElementById('visit_auto_set');\r\n        var form = document.getElementById('visit-planner-form');\r\n\r\n        \/\/ When the user picks a start date, auto-fill end = start + 1 day once if end is empty.\r\n        if (start) start.addEventListener('change', function() {\r\n            try {\r\n                if (!end || !autoFlag) return;\r\n                if (autoFlag.value === '1') return;\r\n                if (end.value) return; \/\/ user already set an end date\r\n                var parts = start.value ? start.value.split('-') : null;\r\n                if (!parts || parts.length !== 3) return;\r\n                var d = new Date(parts[0], parseInt(parts[1], 10) - 1, parseInt(parts[2], 10));\r\n                d.setDate(d.getDate() + 1);\r\n                var y = d.getFullYear();\r\n                var m = (d.getMonth() + 1).toString().padStart(2, '0');\r\n                var dd = d.getDate().toString().padStart(2, '0');\r\n                end.value = y + '-' + m + '-' + dd;\r\n                autoFlag.value = '1';\r\n            } catch (e) {\r\n                \/\/ ignore\r\n            }\r\n        });\r\n\r\n        \/\/ Persist visit_mode on submit\r\n        if (form) form.addEventListener('submit', function() {\r\n            try {\r\n                var sel = document.getElementById('visit_mode');\r\n                if (sel && sel.value) localStorage.setItem('pu_visit_mode', sel.value);\r\n            } catch (e) {}\r\n        });\r\n\r\n        \/\/ Prefill visit_mode from localStorage if present\r\n        try {\r\n            var stored = localStorage.getItem('pu_visit_mode');\r\n            if (stored) {\r\n                var sel = document.getElementById('visit_mode');\r\n                if (sel) sel.value = stored;\r\n            }\r\n        } catch (e) {}\r\n\r\n        \/\/ Disable submit until dates and at least one plant type selected\r\n        try {\r\n            var submitBtn = document.getElementById('visit-planner-submit');\r\n            var plantInputsSelector = 'input[name=\"plant_habit[]\"]';\r\n            var plantSelect = document.querySelector('select[name=\"plant_habit\"]');\r\n            \/\/ Preselected plant habits from server (keeps checkboxes\/select in sync on load)\r\n            var pu_selected_plant_habits = [] || [];\r\n\r\n            function anyPlantSelected() {\r\n                var checks = document.querySelectorAll(plantInputsSelector);\r\n                if (checks && checks.length) {\r\n                    for (var i = 0; i < checks.length; i++) {\r\n                        if (checks[i].checked) return true;\r\n                    }\r\n                    return false;\r\n                }\r\n                if (plantSelect) {\r\n                    return plantSelect.value && plantSelect.value !== '';\r\n                }\r\n                \/\/ fallback: look for any input[name=\"plant_habit\"]\r\n                var single = document.querySelector('input[name=\"plant_habit\"]');\r\n                if (single) return !!single.value;\r\n                return false;\r\n            }\r\n\r\n            function checkEnable() {\r\n                try {\r\n                    var s = document.getElementById('visit_start_iso');\r\n                    var e = document.getElementById('visit_end_iso');\r\n                    var ok = s && s.value && e && e.value && anyPlantSelected();\r\n                    var helper = document.getElementById('visit-planner-helper');\r\n                    if (submitBtn) {\r\n                        if (ok) {\r\n                            submitBtn.removeAttribute('disabled');\r\n                            submitBtn.setAttribute('aria-disabled', 'false');\r\n                            if (helper) helper.style.display = 'none';\r\n                        } else {\r\n                            submitBtn.setAttribute('disabled', 'disabled');\r\n                            submitBtn.setAttribute('aria-disabled', 'true');\r\n                            if (helper) helper.style.display = '';\r\n                        }\r\n                    }\r\n                    return !!ok;\r\n                } catch (err) {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            document.addEventListener('change', function(evt) {\r\n                var t = evt.target;\r\n                if (!t) return;\r\n                if (t.id === 'visit_start_iso' || t.id === 'visit_end_iso' || t.name === 'plant_habit[]' || t.name === 'plant_habit') {\r\n                    checkEnable();\r\n                }\r\n            }, true);\r\n\r\n            \/\/ pre-check any checkboxes or select options from server-provided values\r\n            try {\r\n                if (pu_selected_plant_habits && pu_selected_plant_habits.length) {\r\n                    pu_selected_plant_habits.forEach(function(val) {\r\n                        try {\r\n                            \/\/ match checkboxes\r\n                            var cb = document.querySelectorAll('input[name=\"plant_habit[]\"][value=\"' + CSS.escape(val) + '\"]');\r\n                            if (cb && cb.length) {\r\n                                for (var ii = 0; ii < cb.length; ii++) cb[ii].checked = true;\r\n                            }\r\n                            \/\/ match select\r\n                            var sel = document.querySelector('select[name=\"plant_habit\"]');\r\n                            if (sel) sel.value = val;\r\n                        } catch (ex) {}\r\n                    });\r\n                }\r\n            } catch (ex) {}\r\n\r\n            \/\/ initial check\r\n            checkEnable();\r\n\r\n            \/\/ prevent form submit if form not ready (enter key or other submits)\r\n            if (form) {\r\n                form.addEventListener('submit', function(evt) {\r\n                    try {\r\n                        if (!checkEnable()) {\r\n                            evt.preventDefault();\r\n                            evt.stopPropagation();\r\n                            \/\/ briefly focus the first missing field\r\n                            var s = document.getElementById('visit_start_iso');\r\n                            var e = document.getElementById('visit_end_iso');\r\n                            if (!s || !s.value) {\r\n                                if (s) s.focus();\r\n                            } else if (!e || !e.value) {\r\n                                if (e) e.focus();\r\n                            }\r\n                            return false;\r\n                        }\r\n                    } catch (err) {}\r\n                }, true);\r\n            }\r\n        } catch (e) {}\r\n    })();\r\n<\/script>\n\t\n\n","protected":false},"excerpt":{"rendered":"<p>Enter the expected dates of your campus visit to display a list of plants that have been observed to bloom or fruit during that time. [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"https:\/\/www.arboretum.purdue.edu\/explorer\/visit-planner\/\">Read More&#8230;<span class=\"screen-reader-text\"> from What&#8217;s in Bloom &#8211; Visit Planner<\/span><\/a><\/p>\n","protected":false},"author":8,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/container.php","meta":{"_acf_changed":false,"footnotes":""},"coauthors":[1612],"class_list":["post-23460","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/pages\/23460","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/comments?post=23460"}],"version-history":[{"count":43,"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/pages\/23460\/revisions"}],"predecessor-version":[{"id":23510,"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/pages\/23460\/revisions\/23510"}],"wp:attachment":[{"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/media?parent=23460"}],"wp:term":[{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.arboretum.purdue.edu\/explorer\/wp-json\/wp\/v2\/coauthors?post=23460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}