{"id":259,"date":"2025-06-06T00:30:14","date_gmt":"2025-06-05T23:30:14","guid":{"rendered":"https:\/\/tarunmadhav.com\/?p=259"},"modified":"2025-06-12T21:44:57","modified_gmt":"2025-06-12T20:44:57","slug":"filterable-limiting-heights","status":"publish","type":"post","link":"https:\/\/tarunmadhav.com\/index.php\/2025\/06\/06\/filterable-limiting-heights\/","title":{"rendered":"Filterable limiting heights"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;4.27.3&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.3&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.3&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_code _builder_version=&#8221;4.27.3&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<style><!-- [et_pb_line_break_holder] -->    \/* Ensure Inter font is loaded and applied if Divi doesn't override *\/<!-- [et_pb_line_break_holder] -->    body {<!-- [et_pb_line_break_holder] -->        font-family: 'Inter', sans-serif !important; \/* Added !important to ensure it applies *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    .filter-select {<!-- [et_pb_line_break_holder] -->        appearance: none;<!-- [et_pb_line_break_holder] -->        -webkit-appearance: none;<!-- [et_pb_line_break_holder] -->        -moz-appearance: none;<!-- [et_pb_line_break_holder] -->        background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='lucide lucide-chevron-down'%3E%3Cpath d='m7 10 5 5 5-5'\/%3E%3C\/svg%3E\");<!-- [et_pb_line_break_holder] -->        background-repeat: no-repeat;<!-- [et_pb_line_break_holder] -->        background-position: right 0.5rem center;<!-- [et_pb_line_break_holder] -->        background-size: 1em;<!-- [et_pb_line_break_holder] -->        padding-right: 2rem;<!-- [et_pb_line_break_holder] -->        \/* Added default styles to help with Divi conflicts if Tailwind isn't fully active *\/<!-- [et_pb_line_break_holder] -->        border: 1px solid #d1d5db; \/* gray-300 *\/<!-- [et_pb_line_break_holder] -->        border-radius: 0.375rem; \/* rounded-md *\/<!-- [et_pb_line_break_holder] -->        padding: 0.5rem 0.75rem; \/* py-2 px-3 *\/<!-- [et_pb_line_break_holder] -->        width: 100%;<!-- [et_pb_line_break_holder] -->        box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); \/* shadow-sm *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    .filter-select:focus {<!-- [et_pb_line_break_holder] -->        outline: 2px solid transparent; \/* focus:outline-none *\/<!-- [et_pb_line_break_holder] -->        outline-offset: 2px;<!-- [et_pb_line_break_holder] -->        border-color: rgba(59, 130, 246, 0.5); \/* focus:ring-2 focus:ring-blue-500 *\/<!-- [et_pb_line_break_holder] -->        box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); \/* focus:ring-2 focus:ring-blue-500 *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/* Custom CSS for the table *\/<!-- [et_pb_line_break_holder] -->    .custom-table-container {<!-- [et_pb_line_break_holder] -->        border-radius: 0.5rem;<!-- [et_pb_line_break_holder] -->        overflow: hidden;<!-- [et_pb_line_break_holder] -->        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);<!-- [et_pb_line_break_holder] -->        \/* Ensure it can occupy full width and manage overflow *\/<!-- [et_pb_line_break_holder] -->        width: 100%;<!-- [et_pb_line_break_holder] -->        max-width: 100%;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table {<!-- [et_pb_line_break_holder] -->        width: 100%;<!-- [et_pb_line_break_holder] -->        border-collapse: collapse;<!-- [et_pb_line_break_holder] -->        min-width: 900px; \/* Increased min-width to accommodate new columns for horizontal scrolling *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table thead tr {<!-- [et_pb_line_break_holder] -->        background-color: #f7fafc;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table th,<!-- [et_pb_line_break_holder] -->    .custom-table td {<!-- [et_pb_line_break_holder] -->        padding: 0.75rem 1rem;<!-- [et_pb_line_break_holder] -->        text-align: left;<!-- [et_pb_line_break_holder] -->        border-bottom: 1px solid #e2e8f0;<!-- [et_pb_line_break_holder] -->        white-space: nowrap; \/* Keep content on one line for horizontal scrolling *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table th {<!-- [et_pb_line_break_holder] -->        font-weight: 500;<!-- [et_pb_line_break_holder] -->        color: #4a5568;<!-- [et_pb_line_break_holder] -->        cursor: pointer; \/* Indicate sortable columns *\/<!-- [et_pb_line_break_holder] -->        position: relative;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table th .sort-icon {<!-- [et_pb_line_break_holder] -->        position: absolute;<!-- [et_pb_line_break_holder] -->        right: 0.5rem;<!-- [et_pb_line_break_holder] -->        top: 50%;<!-- [et_pb_line_break_holder] -->        transform: translateY(-50%);<!-- [et_pb_line_break_holder] -->        font-size: 0.8em;<!-- [et_pb_line_break_holder] -->        color: #9ca3af; \/* gray-400 *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table th.sorted .sort-icon {<!-- [et_pb_line_break_holder] -->        color: #1f2937; \/* gray-800 *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table tbody tr:hover {<!-- [et_pb_line_break_holder] -->        background-color: #edf2f7;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .custom-table tbody tr td {<!-- [et_pb_line_break_holder] -->        color: #718096;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    .no-results {<!-- [et_pb_line_break_holder] -->        text-align: center;<!-- [et_pb_line_break_holder] -->        font-style: italic;<!-- [et_pb_line_break_holder] -->        color: #a0aec0;<!-- [et_pb_line_break_holder] -->        padding-top: 1rem;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/* Loading Spinner *\/<!-- [et_pb_line_break_holder] -->    .loading-spinner {<!-- [et_pb_line_break_holder] -->        border: 4px solid rgba(0, 0, 0, 0.1);<!-- [et_pb_line_break_holder] -->        border-left-color: #3b82f6; \/* blue-500 *\/<!-- [et_pb_line_break_holder] -->        border-radius: 50%;<!-- [et_pb_line_break_holder] -->        width: 24px;<!-- [et_pb_line_break_holder] -->        height: 24px;<!-- [et_pb_line_break_holder] -->        animation: spin 1s linear infinite;<!-- [et_pb_line_break_holder] -->        display: inline-block;<!-- [et_pb_line_break_holder] -->        vertical-align: middle;<!-- [et_pb_line_break_holder] -->        margin-right: 8px;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    @keyframes spin {<!-- [et_pb_line_break_holder] -->        0% { transform: rotate(0deg); }<!-- [et_pb_line_break_holder] -->        100% { transform: rotate(360deg); }<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/* Pagination controls styling *\/<!-- [et_pb_line_break_holder] -->    .pagination-controls button {<!-- [et_pb_line_break_holder] -->        background-color: #e2e8f0; \/* gray-200 *\/<!-- [et_pb_line_break_holder] -->        color: #4a5568; \/* gray-700 *\/<!-- [et_pb_line_break_holder] -->        padding: 0.5rem 1rem;<!-- [et_pb_line_break_holder] -->        border-radius: 0.375rem;<!-- [et_pb_line_break_holder] -->        font-weight: 600;<!-- [et_pb_line_break_holder] -->        transition: background-color 0.15s ease-in-out;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    .pagination-controls button:hover:not(:disabled) {<!-- [et_pb_line_break_holder] -->        background-color: #cbd5e0; \/* gray-300 *\/<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    .pagination-controls button:disabled {<!-- [et_pb_line_break_holder] -->        opacity: 0.5;<!-- [et_pb_line_break_holder] -->        cursor: not-allowed;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    .pagination-controls select {<!-- [et_pb_line_break_holder] -->        padding: 0.5rem;<!-- [et_pb_line_break_holder] -->        border-radius: 0.375rem;<!-- [et_pb_line_break_holder] -->        border: 1px solid #d1d5db;<!-- [et_pb_line_break_holder] -->        background-color: white;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><\/style>\n<p><!-- [et_pb_line_break_holder] --><!-- Tailwind CSS CDN - often best placed right after custom styles or at the very beginning of the script tag --><!-- [et_pb_line_break_holder] --><script src=\"https:\/\/cdn.tailwindcss.com\"><\/script><!-- [et_pb_line_break_holder] --><!-- Ensure Inter font is loaded --><!-- [et_pb_line_break_holder] --><link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\"><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><\/p>\n<div class=\"container mx-auto p-6 bg-gray-100 rounded-lg shadow-inner\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<h1 class=\"text-3xl font-semibold text-gray-800 text-center mb-8\">Single Span Curtain Wall Limiting Heights<\/h1>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"bg-white rounded-lg shadow-md p-6 mb-8\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 gap-4 items-end\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"member-filter\" class=\"text-gray-700 font-medium\">Stud Member:<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"member-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"stud-width-filter\" class=\"text-gray-700 font-medium\">Stud Width:<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"stud-width-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"flange-filter\" class=\"text-gray-700 font-medium\">Flange:<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"flange-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"thickness-filter\" class=\"text-gray-700 font-medium\">Thickness:<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"thickness-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"spacing-filter\" class=\"text-gray-700 font-medium\">Max Spacing (in):<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"spacing-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"load-filter\" class=\"text-gray-700 font-medium\">Load (psf):<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"load-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"deflection-filter\" class=\"text-gray-700 font-medium\">Deflection Limit:<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"deflection-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                    <!-- Options will be populated dynamically by JavaScript --><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <!-- [et_pb_line_break_holder] -->            <!-- Min Height Filter (Dropdown) --><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"min-height-filter\" class=\"text-gray-700 font-medium\">Min Height (ft):<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"min-height-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <!-- Max Height Filter (Dropdown) --><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex flex-col gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"max-height-filter\" class=\"text-gray-700 font-medium\">Max Height (ft):<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"max-height-filter\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"\">All<\/option><!-- [et_pb_line_break_holder] -->                <\/select><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"col-span-full flex justify-center mt-4\"> <!-- Centered reset button --><!-- [et_pb_line_break_holder] -->                <button id=\"reset-filters\" class=\"bg-gray-300 hover:bg-gray-400 text-gray-700 font-bold py-2 px-4 rounded-md shadow focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-transparent transition duration-150 ease-in-out\"><!-- [et_pb_line_break_holder] -->                    Reset Filters<!-- [et_pb_line_break_holder] -->                <\/button><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"bg-white rounded-lg shadow-md overflow-hidden custom-table-container\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"overflow-x-auto\"> <!-- This div handles horizontal scrolling --><!-- [et_pb_line_break_holder] -->            <\/p>\n<table id=\"limiting-heights-table\" class=\"custom-table\"><!-- [et_pb_line_break_holder] -->                <\/p>\n<thead class=\"bg-gray-100\"><!-- [et_pb_line_break_holder] -->                    <\/p>\n<tr><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"stud\">Stud Member <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"stud_width\">Stud Width <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"flange\">Flange <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"thickness\">Thickness <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"fy\">Fy (ksi) <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"spacing\">Spacing (in. o.c.) <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"load_psf\">Load (psf) <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"deflection_limit\">Deflection Limit <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                        <\/p>\n<th class=\"text-gray-600 font-semibold\" data-sort-key=\"limiting_height\">Limiting Height <span class=\"sort-icon\"><\/span><\/th>\n<p><!-- [et_pb_line_break_holder] -->                    <\/tr>\n<p><!-- [et_pb_line_break_holder] -->                <\/thead>\n<p><!-- [et_pb_line_break_holder] -->                <\/p>\n<tbody id=\"table-body\"><!-- [et_pb_line_break_holder] -->                    <!-- Data will be inserted here by JavaScript --><!-- [et_pb_line_break_holder] -->                    <\/p>\n<tr><!-- [et_pb_line_break_holder] -->                        <\/p>\n<td colspan=\"9\" class=\"text-center py-4 text-gray-500\"><!-- [et_pb_line_break_holder] -->                            <\/p>\n<div id=\"loading-indicator\" class=\"flex items-center justify-center\"><!-- [et_pb_line_break_holder] -->                                <\/p>\n<div class=\"loading-spinner\"><\/div>\n<p> Loading data&#8230;<!-- [et_pb_line_break_holder] -->                            <\/div>\n<p><!-- [et_pb_line_break_holder] -->                        <\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/tr>\n<p><!-- [et_pb_line_break_holder] -->                <\/tbody>\n<p><!-- [et_pb_line_break_holder] -->            <\/table>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <pee id=\"no-results\" class=\"text-center py-4 text-gray-500 italic\" style=\"display: none;\">No results found matching your criteria.<\/pee><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <!-- Pagination Controls --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"pagination-controls flex flex-wrap justify-between items-center mt-6 p-4 bg-white rounded-lg shadow-md\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"flex items-center gap-4\"><!-- [et_pb_line_break_holder] -->            <label for=\"rows-per-page\" class=\"text-gray-700 font-medium\">Rows per page:<\/label><!-- [et_pb_line_break_holder] -->            <select id=\"rows-per-page\" class=\"filter-select\"><!-- [et_pb_line_break_holder] --><option value=\"10\">10<\/option><!-- [et_pb_line_break_holder] --><option value=\"25\">25<\/option><!-- [et_pb_line_break_holder] --><option value=\"50\">50<\/option><!-- [et_pb_line_break_holder] --><option value=\"100\">100<\/option><!-- [et_pb_line_break_holder] --><option value=\"all\">All<\/option><!-- [et_pb_line_break_holder] -->            <\/select><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"flex items-center gap-4 mt-4 sm:mt-0\"><!-- [et_pb_line_break_holder] -->            <button id=\"prev-page-btn\" class=\"flex items-center justify-center\"><!-- [et_pb_line_break_holder] -->                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left\"><path d=\"m15 18-6-6 6-6\"\/><\/svg><!-- [et_pb_line_break_holder] -->                Prev<!-- [et_pb_line_break_holder] -->            <\/button><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"flex items-center gap-2\"><!-- [et_pb_line_break_holder] -->                <label for=\"current-page-select\" class=\"sr-only\">Go to page:<\/label><!-- [et_pb_line_break_holder] -->                <select id=\"current-page-select\" class=\"filter-select\"><\/select><!-- [et_pb_line_break_holder] -->                <span id=\"total-pages-display\" class=\"text-gray-700 font-medium\">of 1<\/span><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <button id=\"next-page-btn\" class=\"flex items-center justify-center\"><!-- [et_pb_line_break_holder] -->                Next<!-- [et_pb_line_break_holder] -->                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right\"><path d=\"m9 18 6-6-6-6\"\/><\/svg><!-- [et_pb_line_break_holder] -->            <\/button><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script><!-- [et_pb_line_break_holder] -->    \/\/ Define the URL to your PHP file.<!-- [et_pb_line_break_holder] -->    \/\/ IMPORTANT: Replace 'https:\/\/tarunmadhav.com\/fetch_curtain_wall_data.php' with the actual absolute URL<!-- [et_pb_line_break_holder] -->    \/\/ where you have uploaded your fetch_curtain_wall_data.php file on your WordPress site.<!-- [et_pb_line_break_holder] -->    const PHP_DATA_URL = 'https:\/\/tarunmadhav.com\/fetch_curtain_wall_data.php';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    let allData = []; \/\/ Will store the fetched data from the database<!-- [et_pb_line_break_holder] -->    let filteredAndSortedData = []; \/\/ Data after filters and sorting, before pagination<!-- [et_pb_line_break_holder] -->    let sortConfig = { key: 'limiting_height', direction: 'asc' }; \/\/ Default sort config<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Pagination state<!-- [et_pb_line_break_holder] -->    let currentPage = 1;<!-- [et_pb_line_break_holder] -->    let rowsPerPage = 10; \/\/ Default rows per page<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ DOM Elements<!-- [et_pb_line_break_holder] -->    const memberFilter = document.getElementById('member-filter');<!-- [et_pb_line_break_holder] -->    const studWidthFilter = document.getElementById('stud-width-filter');<!-- [et_pb_line_break_holder] -->    const flangeFilter = document.getElementById('flange-filter');<!-- [et_pb_line_break_holder] -->    const thicknessFilter = document.getElementById('thickness-filter');<!-- [et_pb_line_break_holder] -->    const spacingFilter = document.getElementById('spacing-filter');<!-- [et_pb_line_break_holder] -->    const loadFilter = document.getElementById('load-filter');<!-- [et_pb_line_break_holder] -->    const deflectionFilter = document.getElementById('deflection-filter');<!-- [et_pb_line_break_holder] -->    const minHeightFilter = document.getElementById('min-height-filter');<!-- [et_pb_line_break_holder] -->    const maxHeightFilter = document.getElementById('max-height-filter');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    const resetButton = document.getElementById('reset-filters');<!-- [et_pb_line_break_holder] -->    const tableBody = document.getElementById('table-body');<!-- [et_pb_line_break_holder] -->    const noResultsMessage = document.getElementById('no-results');<!-- [et_pb_line_break_holder] -->    const loadingIndicator = document.getElementById('loading-indicator');<!-- [et_pb_line_break_holder] -->    const tableHeaders = document.querySelectorAll('#limiting-heights-table th');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Pagination Elements<!-- [et_pb_line_break_holder] -->    const rowsPerPageSelect = document.getElementById('rows-per-page');<!-- [et_pb_line_break_holder] -->    const prevPageBtn = document.getElementById('prev-page-btn');<!-- [et_pb_line_break_holder] -->    const nextPageBtn = document.getElementById('next-page-btn');<!-- [et_pb_line_break_holder] -->    const currentPageSelect = document.getElementById('current-page-select');<!-- [et_pb_line_break_holder] -->    const totalPagesDisplay = document.getElementById('total-pages-display');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Mapping for thickness to gauge<!-- [et_pb_line_break_holder] -->    const thicknessToGaugeMap = {<!-- [et_pb_line_break_holder] -->        '18': '25ga',<!-- [et_pb_line_break_holder] -->        '33': '20ga',<!-- [et_pb_line_break_holder] -->        '43': '18ga',<!-- [et_pb_line_break_holder] -->        '54': '16ga',<!-- [et_pb_line_break_holder] -->        '68': '14ga',<!-- [et_pb_line_break_holder] -->        '97': '12ga',<!-- [et_pb_line_break_holder] -->        '125': '10ga'<!-- [et_pb_line_break_holder] -->    };<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Converts a height string (e.g., \"21' 7\"\") into total inches for numerical sorting.<!-- [et_pb_line_break_holder] -->     * @param {string} heightString - The height string in \"X' Y\"\" format.<!-- [et_pb_line_break_holder] -->     * @returns {number} The total height in inches.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function convertHeightToInches(heightString) {<!-- [et_pb_line_break_holder] -->        if (!heightString || typeof heightString !== 'string') return 0;<!-- [et_pb_line_break_holder] -->        const parts = heightString.replace(\/\"\/g, '').split(\"'\");<!-- [et_pb_line_break_holder] -->        const feet = parseInt(parts[0]) || 0;<!-- [et_pb_line_break_holder] -->        const inches = parseInt(parts[1]) || 0;<!-- [et_pb_line_break_holder] -->        return (feet * 12) + inches;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Converts total inches back to \"X' Y\"\" format.<!-- [et_pb_line_break_holder] -->     * @param {number} totalInches - The total height in inches.<!-- [et_pb_line_break_holder] -->     * @returns {string} The height string in \"X' Y\"\" format.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function convertInchesToHeightString(totalInches) {<!-- [et_pb_line_break_holder] -->        const feet = Math.floor(totalInches \/ 12);<!-- [et_pb_line_break_holder] -->        const inches = totalInches % 12;<!-- [et_pb_line_break_holder] -->        return `${feet}' ${inches}\"`;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Gets the display string for thickness, including gauge.<!-- [et_pb_line_break_holder] -->     * @param {string} thicknessValue - The raw thickness value (e.g., '33').<!-- [et_pb_line_break_holder] -->     * @returns {string} Formatted thickness string (e.g., '33 (20ga)').<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function getFormattedThickness(thicknessValue) {<!-- [et_pb_line_break_holder] -->        const gauge = thicknessToGaugeMap[thicknessValue] || '';<!-- [et_pb_line_break_holder] -->        return gauge ? `${thicknessValue} (${gauge})` : thicknessValue;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Fetches data from the PHP file.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    async function fetchData() {<!-- [et_pb_line_break_holder] -->        showLoading(); \/\/ Show loading indicator<!-- [et_pb_line_break_holder] -->        try {<!-- [et_pb_line_break_holder] -->            const response = await fetch(PHP_DATA_URL);<!-- [et_pb_line_break_holder] -->            if (!response.ok) {<!-- [et_pb_line_break_holder] -->                throw new Error(`HTTP error! status: ${response.status}`);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->            const result = await response.json();<!-- [et_pb_line_break_holder] -->            console.log(\"Fetched data:\", result); \/\/ Log data to console for debugging<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            if (result.error) {<!-- [et_pb_line_break_holder] -->                throw new Error(result.error);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            allData = result; \/\/ Store fetched data<!-- [et_pb_line_break_holder] -->            populateFilters(); \/\/ Populate filter dropdowns with unique values from all fetched data<!-- [et_pb_line_break_holder] -->            filterAndSortData(); \/\/ Apply initial filters and sorting<!-- [et_pb_line_break_holder] -->            updatePaginationControls(); \/\/ Initialize pagination controls<!-- [et_pb_line_break_holder] -->            updateTable(); \/\/ Display the first page of data<!-- [et_pb_line_break_holder] -->        } catch (error) {<!-- [et_pb_line_break_holder] -->            console.error(\"Error fetching data:\", error);<!-- [et_pb_line_break_holder] -->            tableBody.innerHTML = `<\/p>\n<td colspan=\"9\" class=\"text-center py-4 text-red-600\">Failed to load data: ${error.message}<\/td>\n<p>`;<!-- [et_pb_line_break_holder] -->            noResultsMessage.style.display = 'none';<!-- [et_pb_line_break_holder] -->        } finally {<!-- [et_pb_line_break_holder] -->            hideLoading(); \/\/ Hide loading indicator<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Stores the current selections for cascading filter logic<!-- [et_pb_line_break_holder] -->    let activeFilters = {<!-- [et_pb_line_break_holder] -->        member: '',<!-- [et_pb_line_break_holder] -->        stud_width: '',<!-- [et_pb_line_break_holder] -->        flange: '',<!-- [et_pb_line_break_holder] -->        thickness: '',<!-- [et_pb_line_break_holder] -->        spacing: '',<!-- [et_pb_line_break_holder] -->        load_psf: '',<!-- [et_pb_line_break_holder] -->        deflection_limit: '',<!-- [et_pb_line_break_holder] -->        minHeight: '',<!-- [et_pb_line_break_holder] -->        maxHeight: ''<!-- [et_pb_line_break_holder] -->    };<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Populates the filter dropdowns with unique values from the fetched data,<!-- [et_pb_line_break_holder] -->     * taking into account other active filters for cascading behavior.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function populateFilters() {<!-- [et_pb_line_break_holder] -->        const filterCategories = [<!-- [et_pb_line_break_holder] -->            { id: 'member-filter', key: 'stud', element: memberFilter },<!-- [et_pb_line_break_holder] -->            { id: 'stud-width-filter', key: 'stud_width', element: studWidthFilter, sorter: (a, b) => parseInt(a) - parseInt(b) },<!-- [et_pb_line_break_holder] -->            { id: 'flange-filter', key: 'flange', element: flangeFilter, sorter: (a, b) => parseInt(a) - parseInt(b) },<!-- [et_pb_line_break_holder] -->            { id: 'thickness-filter', key: 'thickness', element: thicknessFilter, formatter: getFormattedThickness, sorter: (a, b) => parseInt(a) - parseInt(b) },<!-- [et_pb_line_break_holder] -->            { id: 'spacing-filter', key: 'spacing', element: spacingFilter, sorter: (a, b) => a - b },<!-- [et_pb_line_break_holder] -->            { id: 'load-filter', key: 'load_psf', element: loadFilter, sorter: (a, b) => a - b },<!-- [et_pb_line_break_holder] -->            { id: 'deflection-filter', key: 'deflection_limit', element: deflectionFilter, sorter: (a, b) => {<!-- [et_pb_line_break_holder] -->                const getDeflectionValue = (d) => parseInt(d.split('\/')[1]); return getDeflectionValue(a) - getDeflectionValue(b);<!-- [et_pb_line_break_holder] -->            }},<!-- [et_pb_line_break_holder] -->            { id: 'min-height-filter', key: 'limiting_height', element: minHeightFilter, sorter: (a, b) => convertHeightToInches(a) - convertHeightToInches(b), isRange: true },<!-- [et_pb_line_break_holder] -->            { id: 'max-height-filter', key: 'limiting_height', element: maxHeightFilter, sorter: (a, b) => convertHeightToInches(a) - convertHeightToInches(b), isRange: true }<!-- [et_pb_line_break_holder] -->        ];<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        filterCategories.forEach(category => {<!-- [et_pb_line_break_holder] -->            const filterElement = category.element;<!-- [et_pb_line_break_holder] -->            const currentSelectedValue = filterElement.value; \/\/ Preserve current selection<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            filterElement.innerHTML = '<option value=\"\">All<\/option>'; \/\/ Clear existing options<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            let subsetData = allData;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ Filter allData based on ALL OTHER active filters<!-- [et_pb_line_break_holder] -->            const otherFilterKeys = filterCategories.filter(fc => fc.key !== category.key && !fc.isRange).map(fc => fc.key);<!-- [et_pb_line_break_holder] -->            <!-- [et_pb_line_break_holder] -->            subsetData = allData.filter(item => {<!-- [et_pb_line_break_holder] -->                let match = true;<!-- [et_pb_line_break_holder] -->                for (const key of otherFilterKeys) {<!-- [et_pb_line_break_holder] -->                    \/\/ Only filter if an active filter value exists for this key<!-- [et_pb_line_break_holder] -->                    if (activeFilters[key] && item[key] != activeFilters[key]) {<!-- [et_pb_line_break_holder] -->                        match = false;<!-- [et_pb_line_break_holder] -->                        break;<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                \/\/ Special handling for height range filters when populating other filters<!-- [et_pb_line_break_holder] -->                \/\/ This ensures other filters only show options compatible with the selected height range<!-- [et_pb_line_break_holder] -->                const currentMinHeightVal = activeFilters.minHeight ? convertHeightToInches(activeFilters.minHeight) : -Infinity;<!-- [et_pb_line_break_holder] -->                const currentMaxHeightVal = activeFilters.maxHeight ? convertHeightToInches(activeFilters.maxHeight) : Infinity;<!-- [et_pb_line_break_holder] -->                const itemHeightInInches = convertHeightToInches(item.limiting_height);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                if (!(itemHeightInInches >= currentMinHeightVal && itemHeightInInches <= currentMaxHeightVal)) {<!-- [et_pb_line_break_holder] -->                    match = false;<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                return match;<!-- [et_pb_line_break_holder] -->            });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            let uniqueValues;<!-- [et_pb_line_break_holder] -->            if (category.isRange) {<!-- [et_pb_line_break_holder] -->                \/\/ For height range, populate both min\/max dropdowns with all unique heights<!-- [et_pb_line_break_holder] -->                \/\/ from the subset of data that matches OTHER filters.<!-- [et_pb_line_break_holder] -->                uniqueValues = [...new Set(subsetData.map(item => item.limiting_height))];<!-- [et_pb_line_break_holder] -->            } else {<!-- [et_pb_line_break_holder] -->                uniqueValues = [...new Set(subsetData.map(item => item[category.key]))];<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            if (category.sorter) {<!-- [et_pb_line_break_holder] -->                uniqueValues.sort(category.sorter);<!-- [et_pb_line_break_holder] -->            } else {<!-- [et_pb_line_break_holder] -->                uniqueValues.sort(); \/\/ Default string sort<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            uniqueValues.forEach(value => {<!-- [et_pb_line_break_holder] -->                const option = document.createElement('option');<!-- [et_pb_line_break_holder] -->                option.value = value;<!-- [et_pb_line_break_holder] -->                option.textContent = category.formatter ? category.formatter(value) : value;<!-- [et_pb_line_break_holder] -->                filterElement.appendChild(option);<!-- [et_pb_line_break_holder] -->            });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ Restore previous selection if it's still a valid option<!-- [et_pb_line_break_holder] -->            if ([...uniqueValues, ''].includes(currentSelectedValue)) {<!-- [et_pb_line_break_holder] -->                filterElement.value = currentSelectedValue;<!-- [et_pb_line_break_holder] -->            } else {<!-- [et_pb_line_break_holder] -->                filterElement.value = ''; \/\/ Reset if previously selected value is no longer valid<!-- [et_pb_line_break_holder] -->                \/\/ Update activeFilters to reflect the reset for this category<!-- [et_pb_line_break_holder] -->                activeFilters[category.key] = '';<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ Set initial values for min\/max height filters if they are 'All' or unset<!-- [et_pb_line_break_holder] -->        \/\/ This makes sure the range always covers the available data<!-- [et_pb_line_break_holder] -->        if (!activeFilters.minHeight || !minHeightFilter.value) { \/\/ If 'All' or empty<!-- [et_pb_line_break_holder] -->             const relevantHeights = [...new Set(allData.map(item => item.limiting_height))].sort((a, b) => convertHeightToInches(a) - convertHeightToInches(b));<!-- [et_pb_line_break_holder] -->            if (relevantHeights.length > 0) {<!-- [et_pb_line_break_holder] -->                minHeightFilter.value = relevantHeights[0];<!-- [et_pb_line_break_holder] -->                activeFilters.minHeight = relevantHeights[0];<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->        if (!activeFilters.maxHeight || !maxHeightFilter.value) { \/\/ If 'All' or empty<!-- [et_pb_line_break_holder] -->            const relevantHeights = [...new Set(allData.map(item => item.limiting_height))].sort((a, b) => convertHeightToInches(a) - convertHeightToInches(b));<!-- [et_pb_line_break_holder] -->            if (relevantHeights.length > 0) {<!-- [et_pb_line_break_holder] -->                maxHeightFilter.value = relevantHeights[relevantHeights.length - 1];<!-- [et_pb_line_break_holder] -->                activeFilters.maxHeight = relevantHeights[relevantHeights.length - 1];<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Filters and sorts the data based on current selections.<!-- [et_pb_line_break_holder] -->     * Stores the result in `filteredAndSortedData`.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function filterAndSortData() {<!-- [et_pb_line_break_holder] -->        \/\/ Update activeFilters based on current dropdown values<!-- [et_pb_line_break_holder] -->        activeFilters.member = memberFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.stud_width = studWidthFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.flange = flangeFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.thickness = thicknessFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.spacing = spacingFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.load_psf = loadFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.deflection_limit = deflectionFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.minHeight = minHeightFilter.value;<!-- [et_pb_line_break_holder] -->        activeFilters.maxHeight = maxHeightFilter.value;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        let filtered = allData.filter(item => {<!-- [et_pb_line_break_holder] -->            const memberMatch = !activeFilters.member || item.stud === activeFilters.member;<!-- [et_pb_line_break_holder] -->            const studWidthMatch = !activeFilters.stud_width || item.stud_width === activeFilters.stud_width;<!-- [et_pb_line_break_holder] -->            const flangeMatch = !activeFilters.flange || item.flange === activeFilters.flange;<!-- [et_pb_line_break_holder] -->            const thicknessMatch = !activeFilters.thickness || item.thickness === activeFilters.thickness;<!-- [et_pb_line_break_holder] -->            const spacingMatch = !activeFilters.spacing || item.spacing == activeFilters.spacing;<!-- [et_pb_line_break_holder] -->            const loadMatch = !activeFilters.load_psf || item.load_psf == activeFilters.load_psf;<!-- [et_pb_line_break_holder] -->            const deflectionMatch = !activeFilters.deflection_limit || item.deflection_limit === activeFilters.deflection_limit;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            const itemHeightInInches = convertHeightToInches(item.limiting_height);<!-- [et_pb_line_break_holder] -->            \/\/ Use current activeFilters.minHeight and .maxHeight directly<!-- [et_pb_line_break_holder] -->            const minHeightInches = activeFilters.minHeight ? convertHeightToInches(activeFilters.minHeight) : -Infinity;<!-- [et_pb_line_break_holder] -->            const maxHeightInches = activeFilters.maxHeight ? convertHeightToInches(activeFilters.maxHeight) : Infinity;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ Ensure min height is not greater than max height for actual filtering logic<!-- [et_pb_line_break_holder] -->            let effectiveMinHeightInches = Math.min(minHeightInches, maxHeightInches);<!-- [et_pb_line_break_holder] -->            let effectiveMaxHeightInches = Math.max(minHeightInches, maxHeightInches);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            const heightRangeMatch = itemHeightInInches >= effectiveMinHeightInches && itemHeightInInches <= effectiveMaxHeightInches;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            return memberMatch && studWidthMatch && flangeMatch && thicknessMatch && spacingMatch && loadMatch && deflectionMatch && heightRangeMatch;<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ Apply sorting based on sortConfig<!-- [et_pb_line_break_holder] -->        filtered.sort((a, b) => {<!-- [et_pb_line_break_holder] -->            let valA, valB;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ Handle specific data types for sorting<!-- [et_pb_line_break_holder] -->            if (sortConfig.key === 'limiting_height') {<!-- [et_pb_line_break_holder] -->                valA = convertHeightToInches(a[sortConfig.key]);<!-- [et_pb_line_break_holder] -->                valB = convertHeightToInches(b[sortConfig.key]);<!-- [et_pb_line_break_holder] -->            } else if (['fy', 'spacing', 'load_psf', 'stud_width', 'flange'].includes(sortConfig.key)) {<!-- [et_pb_line_break_holder] -->                valA = parseInt(a[sortConfig.key]);<!-- [et_pb_line_break_holder] -->                valB = parseInt(b[sortConfig.key]);<!-- [et_pb_line_break_holder] -->            } else if (sortConfig.key === 'thickness') {<!-- [et_pb_line_break_holder] -->                valA = parseInt(a[sortConfig.key]); \/\/ Sort by numerical thickness<!-- [et_pb_line_break_holder] -->                valB = parseInt(b[sortConfig.key]);<!-- [et_pb_line_break_holder] -->            } else { \/\/ Default to string comparison for others<!-- [et_pb_line_break_holder] -->                valA = String(a[sortConfig.key]).toLowerCase();<!-- [et_pb_line_break_holder] -->                valB = String(b[sortConfig.key]).toLowerCase();<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            if (valA < valB) {<!-- [et_pb_line_break_holder] -->                return sortConfig.direction === 'asc' ? -1 : 1;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->            if (valA > valB) {<!-- [et_pb_line_break_holder] -->                return sortConfig.direction === 'asc' ? 1 : -1;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->            return 0;<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        filteredAndSortedData = filtered; \/\/ Store the result<!-- [et_pb_line_break_holder] -->        currentPage = 1; \/\/ Reset to first page after filtering\/sorting<!-- [et_pb_line_break_holder] -->        populateFilters(); \/\/ Re-populate filters to show valid options based on the new `activeFilters`<!-- [et_pb_line_break_holder] -->        updatePaginationControls(); \/\/ Update pagination based on new data size<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Updates the table body with the data for the current page.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function updateTable() {<!-- [et_pb_line_break_holder] -->        tableBody.innerHTML = ''; \/\/ Clear current rows<!-- [et_pb_line_break_holder] -->        \/\/ Adjust colspan for loading indicator to 9 columns (6 original + 3 new)<!-- [et_pb_line_break_holder] -->        loadingIndicator.parentNode.setAttribute('colspan', '9');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        const start = (currentPage - 1) * rowsPerPage;<!-- [et_pb_line_break_holder] -->        const end = rowsPerPage === 'all' ? filteredAndSortedData.length : start + rowsPerPage;<!-- [et_pb_line_break_holder] -->        const paginatedData = filteredAndSortedData.slice(start, end);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if (paginatedData.length === 0) {<!-- [et_pb_line_break_holder] -->            noResultsMessage.style.display = 'block';<!-- [et_pb_line_break_holder] -->        } else {<!-- [et_pb_line_break_holder] -->            noResultsMessage.style.display = 'none';<!-- [et_pb_line_break_holder] -->            paginatedData.forEach(item => {<!-- [et_pb_line_break_holder] -->                const row = document.createElement('tr');<!-- [et_pb_line_break_holder] -->                row.innerHTML = `<!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${item.stud}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${item.stud_width}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${item.flange}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${getFormattedThickness(item.thickness)}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${item.fy}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${item.spacing}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${item.load_psf}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm text-gray-700\">${item.deflection_limit}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<td class=\"px-3 py-2 text-sm font-medium text-gray-900\">${item.limiting_height}<\/td>\n<p><!-- [et_pb_line_break_holder] -->                `;<!-- [et_pb_line_break_holder] -->                tableBody.appendChild(row);<!-- [et_pb_line_break_holder] -->            });<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->        updateSortIcons(); \/\/ Update sort icons after table update<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Updates pagination controls (buttons, page dropdown, total pages).<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function updatePaginationControls() {<!-- [et_pb_line_break_holder] -->        const totalRows = filteredAndSortedData.length;<!-- [et_pb_line_break_holder] -->        const totalPages = rowsPerPage === 'all' ? 1 : Math.ceil(totalRows \/ rowsPerPage);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ Update page dropdown<!-- [et_pb_line_break_holder] -->        currentPageSelect.innerHTML = '';<!-- [et_pb_line_break_holder] -->        if (totalPages > 0) { \/\/ Only populate if there are pages<!-- [et_pb_line_break_holder] -->            for (let i = 1; i <= totalPages; i++) {<!-- [et_pb_line_break_holder] -->                const option = document.createElement('option');<!-- [et_pb_line_break_holder] -->                option.value = i;<!-- [et_pb_line_break_holder] -->                option.textContent = `Page ${i}`;<!-- [et_pb_line_break_holder] -->                currentPageSelect.appendChild(option);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->        } else {<!-- [et_pb_line_break_holder] -->            \/\/ Add a default option if no pages (e.g., when no results)<!-- [et_pb_line_break_holder] -->            const option = document.createElement('option');<!-- [et_pb_line_break_holder] -->            option.value = 1;<!-- [et_pb_line_break_holder] -->            option.textContent = `Page 1`;<!-- [et_pb_line_break_holder] -->            currentPageSelect.appendChild(option);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->        currentPageSelect.value = currentPage; \/\/ Set current page in dropdown<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ Update total pages display<!-- [et_pb_line_break_holder] -->        totalPagesDisplay.textContent = `of ${totalPages}`;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ Enable\/disable pagination buttons<!-- [et_pb_line_break_holder] -->        prevPageBtn.disabled = currentPage === 1 || totalPages === 0;<!-- [et_pb_line_break_holder] -->        nextPageBtn.disabled = currentPage === totalPages || totalPages === 0 || rowsPerPage === 'all';<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Resets all filter dropdowns to 'All' and re-filters the data.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function resetFilters() {<!-- [et_pb_line_break_holder] -->        memberFilter.value = '';<!-- [et_pb_line_break_holder] -->        studWidthFilter.value = '';<!-- [et_pb_line_break_holder] -->        flangeFilter.value = '';<!-- [et_pb_line_break_holder] -->        thicknessFilter.value = '';<!-- [et_pb_line_break_holder] -->        spacingFilter.value = '';<!-- [et_pb_line_break_holder] -->        loadFilter.value = '';<!-- [et_pb_line_break_holder] -->        deflectionFilter.value = '';<!-- [et_pb_line_break_holder] -->        <!-- [et_pb_line_break_holder] -->        \/\/ Reset height dropdowns<!-- [et_pb_line_break_holder] -->        minHeightFilter.value = ''; \/\/ Set to \"All\"<!-- [et_pb_line_break_holder] -->        maxHeightFilter.value = ''; \/\/ Set to \"All\"<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        rowsPerPageSelect.value = 10; \/\/ Reset rows per page to default<!-- [et_pb_line_break_holder] -->        rowsPerPage = 10;<!-- [et_pb_line_break_holder] -->        currentPage = 1; \/\/ Reset current page to 1<!-- [et_pb_line_break_holder] -->        sortConfig = { key: 'limiting_height', direction: 'asc' }; \/\/ Reset sort config<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ Reset activeFilters object<!-- [et_pb_line_break_holder] -->        activeFilters = {<!-- [et_pb_line_break_holder] -->            member: '', stud_width: '', flange: '', thickness: '', spacing: '',<!-- [et_pb_line_break_holder] -->            load_psf: '', deflection_limit: '', minHeight: '', maxHeight: ''<!-- [et_pb_line_break_holder] -->        };<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        filterAndSortData(); \/\/ Re-apply filters and sort<!-- [et_pb_line_break_holder] -->        updateTable(); \/\/ Update table with first page of reset data<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Shows the loading indicator.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function showLoading() {<!-- [et_pb_line_break_holder] -->        tableBody.innerHTML = `<\/p>\n<tr>\n<td colspan=\"9\" class=\"text-center py-4 text-gray-500\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div id=\"loading-indicator\" class=\"flex items-center justify-center\"><!-- [et_pb_line_break_holder] -->                <\/p>\n<div class=\"loading-spinner\"><\/div>\n<p> Loading data...<!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/td>\n<\/tr>\n<p>`;<!-- [et_pb_line_break_holder] -->        noResultsMessage.style.display = 'none';<!-- [et_pb_line_break_holder] -->        \/\/ Disable controls while loading if needed<!-- [et_pb_line_break_holder] -->        [memberFilter, studWidthFilter, flangeFilter, thicknessFilter, spacingFilter, loadFilter, deflectionFilter, minHeightFilter, maxHeightFilter, rowsPerPageSelect, prevPageBtn, nextPageBtn, currentPageSelect, resetButton].forEach(el => {<!-- [et_pb_line_break_holder] -->            if (el) el.disabled = true;<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Hides the loading indicator.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function hideLoading() {<!-- [et_pb_line_break_holder] -->        \/\/ Re-enable controls<!-- [et_pb_line_break_holder] -->        [memberFilter, studWidthFilter, flangeFilter, thicknessFilter, spacingFilter, loadFilter, deflectionFilter, minHeightFilter, maxHeightFilter, rowsPerPageSelect, prevPageBtn, nextPageBtn, currentPageSelect, resetButton].forEach(el => {<!-- [et_pb_line_break_holder] -->            if (el) el.disabled = false;<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] -->        \/\/ The tableBody.innerHTML is reset by updateTable or error message.<!-- [et_pb_line_break_holder] -->        \/\/ No specific action needed here if updateTable is always called.<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/**<!-- [et_pb_line_break_holder] -->     * Updates sort icons in the table headers to reflect current sort state.<!-- [et_pb_line_break_holder] -->     *\/<!-- [et_pb_line_break_holder] -->    function updateSortIcons() {<!-- [et_pb_line_break_holder] -->        tableHeaders.forEach(header => {<!-- [et_pb_line_break_holder] -->            const sortKey = header.dataset.sortKey;<!-- [et_pb_line_break_holder] -->            const sortIcon = header.querySelector('.sort-icon');<!-- [et_pb_line_break_holder] -->            header.classList.remove('sorted');<!-- [et_pb_line_break_holder] -->            sortIcon.textContent = ''; \/\/ Clear previous icon<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            if (sortKey === sortConfig.key) {<!-- [et_pb_line_break_holder] -->                header.classList.add('sorted');<!-- [et_pb_line_break_holder] -->                sortIcon.textContent = sortConfig.direction === 'asc' ? '\u25b2' : '\u25bc';<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Event Listeners for filter changes<!-- [et_pb_line_break_holder] -->    memberFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] -->    studWidthFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] -->    flangeFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] -->    thicknessFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] -->    spacingFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] -->    loadFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] -->    deflectionFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Event listeners for height range dropdowns<!-- [et_pb_line_break_holder] -->    minHeightFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] -->    maxHeightFilter.addEventListener('change', () => { filterAndSortData(); updateTable(); });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    resetButton.addEventListener('click', resetFilters);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Event Listeners for pagination controls<!-- [et_pb_line_break_holder] -->    rowsPerPageSelect.addEventListener('change', (e) => {<!-- [et_pb_line_break_holder] -->        rowsPerPage = e.target.value === 'all' ? 'all' : parseInt(e.target.value);<!-- [et_pb_line_break_holder] -->        currentPage = 1; \/\/ Reset to first page when rows per page changes<!-- [et_pb_line_break_holder] -->        updatePaginationControls();<!-- [et_pb_line_break_holder] -->        updateTable();<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    prevPageBtn.addEventListener('click', () => {<!-- [et_pb_line_break_holder] -->        if (currentPage > 1) {<!-- [et_pb_line_break_holder] -->            currentPage--;<!-- [et_pb_line_break_holder] -->            updatePaginationControls();<!-- [et_pb_line_break_holder] -->            updateTable();<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    nextPageBtn.addEventListener('click', () => {<!-- [et_pb_line_break_holder] -->        const totalPages = rowsPerPage === 'all' ? 1 : Math.ceil(filteredAndSortedData.length \/ rowsPerPage);<!-- [et_pb_line_break_holder] -->        if (currentPage < totalPages) {<!-- [et_pb_line_break_holder] -->            currentPage++;<!-- [et_pb_line_break_holder] -->            updatePaginationControls();<!-- [et_pb_line_break_holder] -->            updateTable();<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    currentPageSelect.addEventListener('change', (e) => {<!-- [et_pb_line_break_holder] -->        currentPage = parseInt(e.target.value);<!-- [et_pb_line_break_holder] -->        updatePaginationControls();<!-- [et_pb_line_break_holder] -->        updateTable();<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Add click event listeners to table headers for sorting<!-- [et_pb_line_break_holder] -->    tableHeaders.forEach(header => {<!-- [et_pb_line_break_holder] -->        header.addEventListener('click', () => {<!-- [et_pb_line_break_holder] -->            const key = header.dataset.sortKey;<!-- [et_pb_line_break_holder] -->            if (sortConfig.key === key) {<!-- [et_pb_line_break_holder] -->                sortConfig.direction = sortConfig.direction === 'asc' ? 'desc' : 'asc';<!-- [et_pb_line_break_holder] -->            } else {<!-- [et_pb_line_break_holder] -->                sortConfig.key = key;<!-- [et_pb_line_break_holder] -->                sortConfig.direction = 'asc'; \/\/ Default to ascending when changing columns<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->            filterAndSortData(); \/\/ Re-sort the current filtered data<!-- [et_pb_line_break_holder] -->            updateTable(); \/\/ Update table with the sorted data for the current page<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Initial data fetch when the script loads<!-- [et_pb_line_break_holder] -->    fetchData();<!-- [et_pb_line_break_holder] --><\/script><!-- [et_pb_line_break_holder] -->[\/et_pb_code][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.3&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.3&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.3&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div contenteditable=\"true\" translate=\"no\" class=\"ProseMirror\">\n<h1>Introducing: The New Curtain Wall Limiting Heights Tool<\/h1>\n<p>We are excited to announce the launch of our new &#8220;Single Span Curtain Wall Limiting Heights&#8221; tool, now available on our internal platform! Designed specifically for our engineering and design teams, this tool simplifies the process of looking up crucial data for cold-formed steel stud curtain wall applications.<\/p>\n<h2>What is it and Why Use It?<\/h2>\n<p>This interactive web tool centralizes limiting height data, eliminating the need to manually sift through extensive tables or documents. It&#8217;s built to enhance your efficiency and accuracy in design and material selection.<\/p>\n<p><strong>Key Benefits:<\/strong><\/p>\n<ul>\n<li><strong>Rapid Data Access:<\/strong> Quickly find relevant limiting heights based on multiple criteria.<\/li>\n<li><strong>Accurate Material Selection:<\/strong> Ensure precise component choices for your projects.<\/li>\n<li><strong>Efficient Design:<\/strong> Streamline your design workflow with instant data insights.<\/li>\n<li><strong>Informed Decision-Making:<\/strong> Make faster, more confident decisions with easily accessible data.<\/li>\n<\/ul>\n<h2>How to Use the Tool<\/h2>\n<p>The tool features an intuitive interface with powerful filtering and sorting capabilities:<\/p>\n<ol>\n<li><strong>Access the Tool:<\/strong> Visit <a href=\"https:\/\/tarunmadhav.com\/index.php\/2025\/06\/06\/filterable-limiting-heights\/\" title=\"null\">https:\/\/tarunmadhav.com\/index.php\/2025\/06\/06\/filterable-limiting-heights\/<\/a>.<\/li>\n<li><strong>Filter Your Data:<\/strong> Use the dropdowns at the top (e.g., Stud Member, Stud Width, Flange, Thickness, Load, Deflection Limit, Min\/Max Height) to narrow down results. As you select options, the table and other filter choices will update dynamically.<\/li>\n<li><strong>Sort the Table:<\/strong> Click on any column header (like &#8220;Stud Member&#8221; or &#8220;Limiting Height&#8221;) to sort the data in ascending or descending order.<\/li>\n<li><strong>Navigate Pages:<\/strong> For large result sets, use the &#8220;Rows per page&#8221; selector, &#8220;Prev&#8221;\/&#8221;Next&#8221; buttons, or the page dropdown to navigate through the data.<\/li>\n<li><strong>Reset:<\/strong> The &#8220;Reset Filters&#8221; button will clear all selections and revert to the full dataset.<\/li>\n<\/ol>\n<p>For a comprehensive guide on all features, including detailed explanations of each filter and sorting option, please refer to the full instruction sheet: <a href=\"https:\/\/tarunmadhav.com\/wp-content\/uploads\/2025\/06\/Instructions_-Curtain-Wall-Limiting-Heights-Tool.pdf\" title=\"Instructions: Curtain Wall Limiting Heights Tool\" target=\"_blank\" rel=\"noopener\">Instructions: Curtain Wall Limiting Heights Tool<\/a><\/p>\n<p>We encourage everyone involved in curtain wall design and selection to explore this new tool and integrate it into your workflows. Your feedback is invaluable as we continue to improve our internal resources!<\/p>\n<p>&nbsp;<\/p>\n<p>This tool is created for ease of access using the data provided by BAILEY METAL PRODUCTS INC.<br \/><a href=\"https:\/\/www.bmp-group.com\/docs\/default-source\/literature\/bailey-load-tables---windbearing-(imperial).pdf?sfvrsn=886c2ee2_0\" target=\"_blank\" rel=\"noopener\">https:\/\/www.bmp-group.com\/docs\/default-source\/literature\/bailey-load-tables&#8212;windbearing-(imperial).pdf?sfvrsn=886c2ee2_0<\/a><\/p>\n<\/div>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducing: The New Curtain Wall Limiting Heights Tool We are excited to announce the launch of our new &#8220;Single Span Curtain Wall Limiting Heights&#8221; tool, now available on our internal platform! Designed specifically for our engineering and design teams, this tool simplifies the process of looking up crucial data for cold-formed steel stud curtain wall [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[1,14],"tags":[],"class_list":["post-259","post","type-post","status-publish","format-standard","hentry","category-blog","category-construction"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":18,"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"predecessor-version":[{"id":282,"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/posts\/259\/revisions\/282"}],"wp:attachment":[{"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tarunmadhav.com\/index.php\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}