{"id":2580,"date":"2025-09-25T19:38:23","date_gmt":"2025-09-25T19:38:23","guid":{"rendered":"https:\/\/vodalandusport.wpenginepowered.com\/?page_id=2580"},"modified":"2025-12-09T20:23:23","modified_gmt":"2025-12-09T20:23:23","slug":"documentation-installation-manuals","status":"publish","type":"page","link":"https:\/\/www.vodalandsolutions.com\/es\/documentation-installation-manuals\/","title":{"rendered":"Documentaci\u00f3n y manuales de instalaci\u00f3n"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2580\" class=\"elementor elementor-2580\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-760a1bf resource-page-wrapper e-flex e-con-boxed e-con e-parent\" data-id=\"760a1bf\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-4985f77 e-con-full e-flex e-con e-child\" data-id=\"4985f77\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-abc3bd8 elementor-widget elementor-widget-template\" data-id=\"abc3bd8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"template.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-template\">\n\t\t\t\t\t<div data-elementor-type=\"container\" data-elementor-id=\"2585\" class=\"elementor elementor-2585\" data-elementor-post-type=\"elementor_library\">\n\t\t\t\t<div class=\"elementor-element elementor-element-34d60bdb e-con-full e-flex e-con e-child\" data-id=\"34d60bdb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-6a41fcd1 e-grid e-con-full e-con e-child\" data-id=\"6a41fcd1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-58025408 e-con-full e-flex e-con e-child\" data-id=\"58025408\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-64586ddd elementor-widget elementor-widget-heading\" data-id=\"64586ddd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Downloads and <br>Resources<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-18705f7f e-con-full e-flex e-con e-child\" data-id=\"18705f7f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5add60fd elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-invisible elementor-widget elementor-widget-text-editor\" data-id=\"5add60fd\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:400}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tVodaland&#8217;s Drain catalog offers a comprehensive range of drainage solutions tailored to meet the diverse needs of modern urban environments. View all of our products&#8217; specs, installation guides and more. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-69fccb93 elementor-invisible elementor-widget elementor-widget-image\" data-id=\"69fccb93\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;zoomIn&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"2000\" height=\"450\" src=\"https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/10\/2000X450.png\" class=\"attachment-full size-full wp-image-4027\" alt=\"\" srcset=\"https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/10\/2000X450.png 2000w, https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/10\/2000X450-300x68.png 300w, https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/10\/2000X450-1024x230.png 1024w, https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/10\/2000X450-768x173.png 768w, https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/10\/2000X450-1536x346.png 1536w, https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/10\/2000X450-18x4.png 18w\" sizes=\"(max-width: 2000px) 100vw, 2000px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cffb159 uael-nav-menu__breakpoint-none uael-nav-menu__align-justify resource-nav uael-submenu-open-hover uael-submenu-icon-arrow uael-submenu-animation-none uael-link-redirect-child elementor-widget elementor-widget-uael-nav-menu\" data-id=\"cffb159\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;distance_from_menu&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"uael-nav-menu.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"uael-nav-menu uael-layout-horizontal uael-nav-menu-layout uael-pointer__none\" data-layout=\"horizontal\">\n\t\t\t\t<div role=\"button\" class=\"uael-nav-menu__toggle elementor-clickable\">\n\t\t\t\t\t<span class=\"screen-reader-text\">Main Menu<\/span>\n\t\t\t\t\t<div class=\"uael-nav-menu-icon\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<nav class=\"uael-nav-menu__layout-horizontal uael-nav-menu__submenu-arrow\" data-toggle-icon=\"\" data-close-icon=\"\" data-full-width=\"\"><ul id=\"menu-1-cffb159\" class=\"uael-nav-menu\"><li id=\"menu-item-2944\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent uael-creative-menu\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/blog\/\" class = \"uael-menu-item\">Blogs<\/a><\/li>\n<li id=\"menu-item-2942\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent uael-creative-menu\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/case-studies\/\" class = \"uael-menu-item\">Case Studies<\/a><\/li>\n<li id=\"menu-item-2708\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent uael-creative-menu\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/videos\/\" class = \"uael-menu-item\">Videos<\/a><\/li>\n<li id=\"menu-item-2589\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent uael-creative-menu\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/documentation-installation-manuals\/\" class = \"uael-menu-item\">Documentation &amp; Installation Manuals<\/a><\/li>\n<li id=\"menu-item-2610\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent uael-creative-menu\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/dwg-bim\/\" class = \"uael-menu-item\">DWG\/BIM<\/a><\/li>\n<li id=\"menu-item-4275\" class=\"menu-item menu-item-type-custom menu-item-object-custom parent uael-creative-menu\"><a href=\"https:\/\/calendly.com\/d\/ctjq-smv-3qz\" class = \"uael-menu-item\">Schedule a Call<\/a><\/li>\n<\/ul><\/nav>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e78a7a0 elementor-widget elementor-widget-html\" data-id=\"e78a7a0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\n   (function() {\n  const urlParams = new URLSearchParams(window.location.search);\n  const paramsToPreserve = ['_primary_categories', 'home_search', '_applications'];\n\n  \/\/ Build an object of the parameters found in the URL\n  const preservedParams = {};\n  paramsToPreserve.forEach(key => {\n    if (urlParams.has(key)) {\n      preservedParams[key] = urlParams.get(key);\n    }\n  });\n\n  \/\/ Only continue if at least one of the parameters is present\n  if (Object.keys(preservedParams).length > 0) {\n    document.querySelectorAll('.resource-nav a').forEach(link => {\n      const linkUrl = new URL(link.href, window.location.origin);\n\n      Object.entries(preservedParams).forEach(([key, value]) => {\n        linkUrl.searchParams.set(key, value); \/\/ add or update param\n      });\n\n      link.href = linkUrl.toString();\n    });\n  }\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1446116 e-grid e-con-full resource-grid-wrapper e-con e-child\" data-id=\"1446116\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-91ae5eb e-con-full resource-sidebar-filters e-flex e-con e-child\" data-id=\"91ae5eb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-2df5d9e2 e-con-full e-flex e-con e-child\" data-id=\"2df5d9e2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-53c99bb e-con-full e-flex e-con e-child\" data-id=\"53c99bb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d820f1d elementor-hidden-mobile resource-sidebar-header elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"d820f1d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M21.25 11.9999H8.895M4.534 11.9999H2.75M4.534 11.9999C4.534 11.4217 4.76368 10.8672 5.17251 10.4584C5.58134 10.0496 6.13583 9.81989 6.714 9.81989C7.29217 9.81989 7.84666 10.0496 8.25549 10.4584C8.66432 10.8672 8.894 11.4217 8.894 11.9999C8.894 12.5781 8.66432 13.1326 8.25549 13.5414C7.84666 13.9502 7.29217 14.1799 6.714 14.1799C6.13583 14.1799 5.58134 13.9502 5.17251 13.5414C4.76368 13.1326 4.534 12.5781 4.534 11.9999ZM21.25 18.6069H15.502M15.502 18.6069C15.502 19.1852 15.2718 19.7403 14.8628 20.1492C14.4539 20.5582 13.8993 20.7879 13.321 20.7879C12.7428 20.7879 12.1883 20.5572 11.7795 20.1484C11.3707 19.7396 11.141 19.1851 11.141 18.6069M15.502 18.6069C15.502 18.0286 15.2718 17.4745 14.8628 17.0655C14.4539 16.6566 13.8993 16.4269 13.321 16.4269C12.7428 16.4269 12.1883 16.6566 11.7795 17.0654C11.3707 17.4742 11.141 18.0287 11.141 18.6069M11.141 18.6069H2.75M21.25 5.39289H18.145M13.784 5.39289H2.75M13.784 5.39289C13.784 4.81472 14.0137 4.26023 14.4225 3.8514C14.8313 3.44257 15.3858 3.21289 15.964 3.21289C16.2503 3.21289 16.5338 3.26928 16.7983 3.37883C17.0627 3.48839 17.3031 3.64897 17.5055 3.8514C17.7079 4.05383 17.8685 4.29415 17.9781 4.55864C18.0876 4.82313 18.144 5.10661 18.144 5.39289C18.144 5.67917 18.0876 5.96265 17.9781 6.22714C17.8685 6.49163 17.7079 6.73195 17.5055 6.93438C17.3031 7.13681 17.0627 7.29739 16.7983 7.40695C16.5338 7.5165 16.2503 7.57289 15.964 7.57289C15.3858 7.57289 14.8313 7.34321 14.4225 6.93438C14.0137 6.52555 13.784 5.97106 13.784 5.39289Z\" stroke=\"black\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Resource Filters<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-48dd3b8 elementor-hidden-mobile elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"48dd3b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-403a5fa elementor-hidden-mobile resource-sidebar-filter resource-sidebar-filter-1 elementor-widget elementor-widget-wpgb-facet\" data-id=\"403a5fa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-9\" data-facet=\"9\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8598b31 resource-sidebar-filter resource-sidebar-filter-1 elementor-widget elementor-widget-wpgb-facet\" data-id=\"8598b31\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-10\" data-facet=\"10\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2497b7c resource-sidebar-filter resource-sidebar-filter-1 elementor-widget elementor-widget-wpgb-facet\" data-id=\"2497b7c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-11\" data-facet=\"11\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-de9a043 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"de9a043\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-85834bb elementor-widget elementor-widget-template\" data-id=\"85834bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"template.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-template\">\n\t\t\t\t\t<div data-elementor-type=\"container\" data-elementor-id=\"2584\" class=\"elementor elementor-2584\" data-elementor-post-type=\"elementor_library\">\n\t\t\t\t<div class=\"elementor-element elementor-element-56a81ef3 e-con-full elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-child\" data-id=\"56a81ef3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-35806620 e-con-full resource-sidebar-cta-save e-flex e-con e-child\" data-id=\"35806620\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4092f640 elementor-widget elementor-widget-heading\" data-id=\"4092f640\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Save Your Document<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6ccb7977 elementor-widget elementor-widget-text-editor\" data-id=\"6ccb7977\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tLogin to our Engineering Portal now to save your documents and organize them into projects. Getting started is easy and only takes a few minutes.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7531d905 elementor-align-justify btn-primary open-login-modal elementor-widget elementor-widget-button\" data-id=\"7531d905\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Engineering Portal Login<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7d95b05c elementor-widget elementor-widget-text-editor\" data-id=\"7d95b05c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<a href=\"\/request-an-account\/\">Request an Account<\/a>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3f4ad233 e-con-full resource-sidebar-cta-support e-flex e-con e-child\" data-id=\"3f4ad233\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-492478ae elementor-widget elementor-widget-heading\" data-id=\"492478ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Looking for Help?<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5e9686f5 elementor-widget elementor-widget-text-editor\" data-id=\"5e9686f5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Let us know how we can assist you.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-24c9f25f elementor-widget elementor-widget-text-editor\" data-id=\"24c9f25f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"\/support\/\">Create a Detailed Support Ticket<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c4d8dcd e-con-full resource-grid e-flex e-con e-child\" data-id=\"c4d8dcd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a75518b e-con-full resource-grid-header e-flex e-con e-child\" data-id=\"a75518b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a7313c6 elementor-widget__width-auto elementor-widget elementor-widget-wpgb-facet\" data-id=\"a7313c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-7\" data-facet=\"7\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-44fb9eb elementor-widget__width-auto elementor-widget elementor-widget-wpgb-facet\" data-id=\"44fb9eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-3\" data-facet=\"3\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"wp-grid-builder wpgb-template elementor-element elementor-element-478cf99 elementor-grid-2 resource-grid-grid elementor-grid-tablet-2 elementor-grid-mobile-1 elementor-widget elementor-widget-loop-grid\" data-options=\"{&quot;itemSelector&quot;:&quot;.elementor-loop-container &gt; *&quot;,&quot;isMainQuery&quot;:false,&quot;id&quot;:&quot;elementor-element-478cf99&quot;,&quot;postId&quot;:2580,&quot;isTemplate&quot;:&quot;Elementor&quot;}\" data-id=\"478cf99\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;template_id&quot;:&quot;2550&quot;,&quot;columns&quot;:2,&quot;row_gap&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:20,&quot;sizes&quot;:[]},&quot;_skin&quot;:&quot;post&quot;,&quot;columns_tablet&quot;:&quot;2&quot;,&quot;columns_mobile&quot;:&quot;1&quot;,&quot;edit_handle_selector&quot;:&quot;[data-elementor-type=\\&quot;loop-item\\&quot;]&quot;,&quot;row_gap_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;row_gap_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"loop-grid.post\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-loop-container elementor-grid\" role=\"list\">\n\t\t<style id=\"loop-2550\">.elementor-2550 .elementor-element.elementor-element-48f1c222{--display:flex;box-shadow:0px 14.64px 22.52px 0px rgba(0, 0, 0, 0.05);}.elementor-2550 .elementor-element.elementor-element-48f1c222:not(.elementor-motion-effects-element-type-background), .elementor-2550 .elementor-element.elementor-element-48f1c222 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:var( --e-global-color-f16c469 );}.elementor-2550 .elementor-element.elementor-element-1d1abd5f{--display:flex;--padding-top:22px;--padding-bottom:22px;--padding-left:22px;--padding-right:22px;}.elementor-2550 .elementor-element.elementor-element-1d1abd5f.e-con{--flex-grow:1;--flex-shrink:0;}.elementor-widget-theme-post-title .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-weight:var( --e-global-typography-primary-font-weight );color:var( --e-global-color-primary );}.elementor-2550 .elementor-element.elementor-element-151a66e0 .elementor-heading-title{font-family:\"Helvetica\", Sans-serif;font-size:20px;font-weight:700;text-decoration:none;color:var( --e-global-color-secondary );}.elementor-2550 .elementor-element.elementor-element-151a66e0 .elementor-heading-title a:hover, .elementor-2550 .elementor-element.elementor-element-151a66e0 .elementor-heading-title a:focus{color:var( --e-global-color-primary );}.elementor-2550 .elementor-element.elementor-element-151a66e0{margin:0px 0px calc(var(--kit-widget-spacing, 0px) + 15px) 0px;}@media(max-width:767px){.elementor-2550 .elementor-element.elementor-element-151a66e0 .elementor-heading-title{font-size:20px;}}\/* Start custom CSS for theme-post-title, class: .elementor-element-151a66e0 *\/.elementor-2550 .elementor-element.elementor-element-151a66e0 a {\n    text-decoration:none;\n}\/* End custom CSS *\/<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1137 post-1137 product type-product status-publish has-post-thumbnail hentry product_category-drain product_category-pro-mega-system product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/10-polymer-concrete-pre-slope-channel-1-slope\/\">10&#8243; Polymer Concrete Pre Slope Channel 1% Slope<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/76071_10inch_polymer_concrete_channel-pdf-pdf\/?wpdmdl=2104&#038;refresh=69e145712d42f1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">77bb22c9aa42&#8211;Channel-drain.pdf<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/77bb22c9aa42-channel-drain-pdf\/?wpdmdl=2103&#038;refresh=69e145712d7541776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">ceafa022df6d&#8211;61541-B-NA-221014-8-Concrete-and-Polymer-Channel-Installation-Mounting-Bracket.pdf<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/ceafa022df6d-61541-b-na-221014-8-concrete-and-polymer-channel-installation-mounting-bracket-pdf\/?wpdmdl=1824&#038;refresh=69e145712d87f1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-c7571d70-2b79-42a5-9bd5-613edd88a87b\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1139 post-1139 product type-product status-publish has-post-thumbnail hentry product_category-clean product_category-oil-water-separators product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/105-gallon-oil-water-separator-ob1-1\/\">105 Gallon Oil \/ Water Separator OB1-1<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/ob1-1_oil_water_separator_70-pdf-pdf\/?wpdmdl=1868&#038;refresh=69e14571321a11776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Technical Document<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/technical_passport_oilbase100_ob1-pdf\/?wpdmdl=1827&#038;refresh=69e14571322fa1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-eed83b20-14be-4cba-ba43-e6bcd069ab52\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1141 post-1141 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/10x10-cast-iron-floor-trap\/\">10&#215;10 Cast Iron Floor Trap<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/33352513-5_10x10_cast_iron_drain_point-pdf-pdf\/?wpdmdl=2215&#038;refresh=69e14571364a81776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-26186d4c-b6c1-4439-8e09-f7f90951a5eb\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1143 post-1143 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/10x10-stainless-floor-trap\/\">10&#215;10 Stainless Floor Trap<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">993123-4_10x10_Stainless_Steel_Floor_Trap-PDF.pdf<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/993123-4_10x10_stainless_steel_floor_trap-pdf-pdf\/?wpdmdl=2011&#038;refresh=69e145713b12e1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-c418d32f-2183-45b6-8980-9f59e7c21ee9\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1145 post-1145 product type-product status-publish has-post-thumbnail hentry product_category-drain product_category-pro-mega-system product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12-fiber-reinforced-pre-slope-channel-1-slope\/\">12&#8243; Fiber Reinforced Pre Slope Channel 1% Slope<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Lineup<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/04700_12inch_concrete_channels_lineup-pdf-pdf\/?wpdmdl=2341&#038;refresh=69e145714067c1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/04700_12inch_concrete_channel_mega-pdf-pdf\/?wpdmdl=2342&#038;refresh=69e14571407cd1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">System Layout<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/12in_concrete_drains_system_layout-pdf-pdf\/?wpdmdl=2314&#038;refresh=69e14571408aa1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Installation Bracket Specification<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/61741-b_12inch_concrete_and_polymer_channel_installation_mounting_bracket-pdf-pdf\/?wpdmdl=2149&#038;refresh=69e14571409741776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Supplemental Installation Guide<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/supplemental_installation_guide_-_12_fiber_reinforced_concrete-pdf\/?wpdmdl=1847&#038;refresh=69e1457140a611776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-9a5b5fbc-fbb7-4dbf-b4ca-bb824d8474f7\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1147 post-1147 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12x12-brass-grate\/\">12&#215;12 Brass Grate<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/33702_12x12_brass_grate-pdf-pdf\/?wpdmdl=2210&#038;refresh=69e145714540b1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-f497c832-e164-42dc-91f0-bb02ed6ea12d\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1149 post-1149 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12x12-cast-iron-floor-trap\/\">12&#215;12 Cast Iron Floor Trap<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/3335313-5_12x12_cast_iron_drain_point-pdf-pdf\/?wpdmdl=2214&#038;refresh=69e145714949b1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-943b4d6e-24b6-40da-8721-713941bba028\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1151 post-1151 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12x12-catch-basin-brass-ada-heel-package\/\">12&#215;12 Catch Basin Brass ADA \/ Heel Package<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Channel Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/33702_12x12_brass_grate-pdf-pdf\/?wpdmdl=2210&#038;refresh=69e145714d2791776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Basin Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/8370_12x12_base_catch_basin-pdf-pdf\/?wpdmdl=2069&#038;refresh=69e145714d3cc1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Installation Guide<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/catch_basin_installation_guide-pdf-pdf\/?wpdmdl=1906&#038;refresh=69e145714d46f1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-1487d4f9-b5b8-40af-9613-c6309ce30511\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1155 post-1155 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12x12-catch-basin-dome-package\/\">12&#215;12 Catch Basin Dome Package<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Basin Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/8370_12x12_base_catch_basin-pdf-pdf\/?wpdmdl=2069&#038;refresh=69e1457150e761776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Grating Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/996563_12x12_base_stainless_steel_mesh_dome_grate-pdf-pdf\/?wpdmdl=1925&#038;refresh=69e14571510c51776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-e220f5df-38ab-40b7-91a4-ffdaec939915\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1157 post-1157 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12x12-catch-basin-ductile-cast-iron-package\/\">12&#215;12 Catch Basin Ductile Cast Iron Package<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Basin Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/8370_12x12_base_catch_basin-pdf-pdf\/?wpdmdl=2069&#038;refresh=69e1457154c481776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Cast Iron Snowflake Grate<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/pdf-four-pdf\/?wpdmdl=1822&#038;refresh=69e1457154def1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Installation Brochure<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/pdf-five-pdf\/?wpdmdl=1823&#038;refresh=69e1457154ee31776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Cast Iron Mesh Grate<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/pdf-two-pdf\/?wpdmdl=1821&#038;refresh=69e1457154fca1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-bc8a84f7-6d0a-4b42-919f-55335f2f698b\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1159 post-1159 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12x12-catch-basin-galvanized-stamped-steel-package\/\">12&#215;12 Catch Basin Galvanized Stamped Steel Package<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Mesh Grate Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/3320_12x12_base_galvanized_steel_grate-pdf-pdf\/?wpdmdl=2219&#038;refresh=69e14571597b71776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Basin Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/8370_12x12_base_catch_basin-pdf-pdf\/?wpdmdl=2069&#038;refresh=69e14571599911776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Installation Guide<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/catch_basin_installation_guide-pdf-pdf\/?wpdmdl=1906&#038;refresh=69e1457159a771776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Wave Grate Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/np-gg33104_12x12_steel_grate_wave-pdf-pdf\/?wpdmdl=1874&#038;refresh=69e1457159b4e1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-226cffba-ef83-45e7-8595-89573e7da928\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"2550\" class=\"elementor elementor-2550 e-loop-item e-loop-item-1161 post-1161 product type-product status-publish has-post-thumbnail hentry product_category-catch-basins product_category-drain product-applications-auto-facilities product-applications-commercial-industrial product-applications-public-roads-parking product-applications-residential-hospitality product-applications-sport\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-48f1c222 download-card e-flex e-con-boxed e-con e-parent\" data-id=\"48f1c222\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1d1abd5f e-con-full e-flex e-con e-child\" data-id=\"1d1abd5f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-151a66e0 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading\" data-id=\"151a66e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-title.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.vodalandsolutions.com\/es\/product\/12x12-catch-basin-gravel-grate-package\/\">12&#215;12 Catch Basin Gravel Grate Package<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a36ccc elementor-widget elementor-widget-shortcode\" data-id=\"5a36ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <div class=\"download-section\">\r\n    <table class=\"download-list\">\r\n      <thead>\r\n        <tr>\r\n          <th>Downloads<\/th>\r\n                      <th>PDF<\/th>\r\n                  <\/tr>\r\n      <\/thead>\r\n      <tbody>\r\n                  <tr>\r\n            <td class=\"download-name\">Dark Gravel Grate Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/33791-dark_12x12_gravel_grate_base_dark-pdf-pdf\/?wpdmdl=2208&#038;refresh=69e145715e89b1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Gray Gravel Grate Specification<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/33791-gray_12x12_gravel_grate_base_grey-dwg-pdf\/?wpdmdl=2207&#038;refresh=69e145715ea541776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Basin Specification Sheet<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/8370_12x12_base_catch_basin-pdf-pdf\/?wpdmdl=2069&#038;refresh=69e145715eb661776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n                  <tr>\r\n            <td class=\"download-name\">Installation Guide<\/td>\r\n                          <td>\r\n                                  <a href=\"https:\/\/www.vodalandsolutions.com\/es\/download\/catch_basin_installation_guide-pdf-pdf\/?wpdmdl=1906&#038;refresh=69e145715ec0e1776371057\" class=\"download-link\" title=\"Download\">\r\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                      <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM4 20V15H6V18H18V15H20V20H4Z\" fill=\"currentColor\"><\/path>\r\n                    <\/svg>\r\n                  <\/a>\r\n                                                <\/td>\r\n                      <\/tr>\r\n              <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  \r\n  <style>\r\n    \/* lightweight styles *\/\r\n    .vd-btn{appearance:none;border:1px solid #d0d7de;background:#fff;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\r\n    .vd-btn:hover{background:#f6f8fa}\r\n    .vd-btn-primary{background:#1a73e8;border-color:#1a73e8;color:#fff}\r\n    .vd-btn-primary:hover{background:#1669d2}\r\n    .vd-btn-secondary,.vd-btn-secondary:hover{background:transparent;border-color:#1a2334;color:#1a2334}\r\n    .vd-btn-link{background:transparent;border:0;padding:0 4px;font-weight:700;color:#2D3648;cursor:pointer}\r\n    .vd-modal{position:fixed;inset:0;background:rgba(16,24,40,.35);display:flex;align-items:center;justify-content:center;z-index:10000}\r\n    .vd-modal__dialog{background:#fff;width:min(720px,92%);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:28px;position:relative}\r\n    .vd-modal__title{margin:0 0 6px}\r\n    .vd-modal__sub{margin:0 0 18px;color:#475467}\r\n    .vd-modal__close{position:absolute;top:10px;right:12px;border:none;background:transparent;font-size:26px;line-height:1;cursor:pointer}\r\n    .vd-field{margin-bottom:14px}\r\n    .vd-field label{display:block;margin:0 0 6px;font-weight:600}\r\n    .vd-field select{width:100%;border:1px solid #d0d7de;border-radius:8px;padding:10px}\r\n    .vd-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:6px}\r\n    .vd-msg{margin-top:10px;font-weight:600}\r\n    .vd-msg.error{color:#b42318}\r\n    .vd-msg.success{color:#027a48}\r\n  <\/style>\r\n\r\n  <script>\r\n  (function(){\r\n    \/\/ Scope by uid to avoid conflicts if shortcode used multiple times\r\n    var uid          = \"rdc-dae47214-22c4-438f-9310-adf44bfdf08b\";\r\n    var ajaxUrl      = \"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-admin\\\/admin-ajax.php\";\r\n    var ajaxNonce    = \"4f69b0a82d\";\r\n\r\n    var modal        = document.getElementById('vd-attach-modal-' + uid);\r\n    if (!modal) return;\r\n\r\n    var successM     = document.getElementById('vd-attach-success-' + uid);\r\n    var msg          = document.getElementById('vd-attach-msg-' + uid);\r\n    var projSel      = document.getElementById('vd-attach-project-' + uid);\r\n    var form         = document.getElementById('vd-attach-form-' + uid);\r\n    var submitBtn    = document.getElementById('vd-attach-submit-' + uid);\r\n    var cancelBtn    = document.getElementById('vd-attach-cancel-' + uid);\r\n    var closeBtn     = document.getElementById('vd-attach-close-' + uid);\r\n    var closeSuc     = document.getElementById('vd-attach-success-close-' + uid);\r\n    var docIdInput   = document.getElementById('vd-attach-doc-id-' + uid);\r\n\r\n    var savedName    = document.getElementById('vd-attach-saved-name-' + uid);\r\n    var savedProj    = document.getElementById('vd-attach-saved-project-' + uid);\r\n    var viewProj     = document.getElementById('vd-attach-view-project-' + uid);\r\n    var attachAnother= document.getElementById('vd-attach-another-' + uid);\r\n\r\n    function openModal(m){ m.style.display='flex'; m.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; }\r\n    function closeModal(m){ m.style.display='none'; m.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; }\r\n\r\n    \/\/ Open modal from any \".vd-add-btn\" that matches this uid\r\n    document.addEventListener('click', function(e){\r\n      var btn = e.target.closest('.vd-add-btn');\r\n      if (!btn) return;\r\n      if (btn.getAttribute('data-uid') !== uid) return; \/\/ only for this block\r\n\r\n      e.preventDefault();\r\n      var docId    = btn.getAttribute('data-doc-id');\r\n      var docTitle = btn.getAttribute('data-doc-title') || 'File';\r\n\r\n      docIdInput.value        = docId;\r\n      savedName.textContent   = docTitle;\r\n\r\n      if (projSel) projSel.selectedIndex = 0;\r\n      msg.textContent = ''; msg.className = 'vd-msg';\r\n\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Close handlers\r\n    closeBtn && closeBtn.addEventListener('click', ()=>closeModal(modal));\r\n    cancelBtn && cancelBtn.addEventListener('click', ()=>closeModal(modal));\r\n    modal && modal.addEventListener('click', (e)=>{ if(e.target===modal) closeModal(modal); });\r\n    closeSuc && closeSuc.addEventListener('click', ()=>closeModal(successM));\r\n    successM && successM.addEventListener('click', (e)=>{ if(e.target===successM) closeModal(successM); });\r\n\r\n    attachAnother && attachAnother.addEventListener('click', function(){\r\n      closeModal(successM);\r\n      openModal(modal);\r\n    });\r\n\r\n    \/\/ Submit -> admin-ajax (vd_attach_file)\r\n    form && form.addEventListener('submit', function(e){\r\n      e.preventDefault();\r\n      msg.textContent=''; msg.className='vd-msg';\r\n\r\n      if (!projSel.value) { msg.textContent='Please select a project.'; msg.classList.add('error'); return; }\r\n\r\n      var params = new URLSearchParams();\r\n      params.set('action',   'vd_attach_file');\r\n      params.set('security', ajaxNonce);\r\n      params.set('doc_id',   docIdInput.value);\r\n      params.set('project_id', projSel.value);\r\n\r\n      submitBtn.disabled = true; submitBtn.textContent = 'Saving...';\r\n\r\n      fetch(ajaxUrl, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n        credentials: 'same-origin',\r\n        body: params.toString()\r\n      })\r\n      .then(r => r.text())\r\n      .then(txt => {\r\n        let data; try { data = JSON.parse(txt); } catch(e){ data = { success:false, data:{ message: txt || 'Non-JSON response' } }; }\r\n        if (data && data.success) {\r\n          const projName = data.data?.project_title || 'Project';\r\n          savedProj.textContent = projName;\r\n          if (data.data?.project_link) viewProj.setAttribute('href', data.data.project_link);\r\n\r\n          form.reset();\r\n          closeModal(modal);\r\n          openModal(successM);\r\n        } else {\r\n          const err = (data && data.data && data.data.message) ? data.data.message : 'Failed to attach file.';\r\n          msg.textContent = err; msg.classList.add('error');\r\n        }\r\n      })\r\n      .catch(() => { msg.textContent='Network error.'; msg.classList.add('error'); })\r\n      .finally(() => { submitBtn.disabled = false; submitBtn.textContent = 'Save'; });\r\n    });\r\n  })();\r\n  <\/script>\r\n\r\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0f803c9 e-con-full resource-grid-footer e-flex e-con e-child\" data-id=\"0f803c9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-03dfbbd elementor-widget elementor-widget-wpgb-facet\" data-id=\"03dfbbd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-8\" data-facet=\"8\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-36bdfc7 elementor-widget elementor-widget-wpgb-facet\" data-id=\"36bdfc7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-7\" data-facet=\"7\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d02cb53 e-con-full resource-sidebar-offcanvas e-flex e-con e-child\" data-id=\"d02cb53\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-66023c1 elementor-widget elementor-widget-off-canvas\" data-id=\"66023c1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"off-canvas.default\">\n\t\t\t\t\t\t\t<div id=\"off-canvas-66023c1\" class=\"e-off-canvas\" role=\"dialog\" aria-hidden=\"true\" aria-label=\"Mobile Filters\" aria-modal=\"true\" inert=\"\" data-delay-child-handlers=\"true\">\n\t\t\t<div class=\"e-off-canvas__overlay\"><\/div>\n\t\t\t<div class=\"e-off-canvas__main\">\n\t\t\t\t<div class=\"e-off-canvas__content\">\n\t\t\t\t\t<div class=\"elementor-element elementor-element-99acdc5 e-con-full resource-sidebar-offcanvas-filters e-flex e-con e-child\" data-id=\"99acdc5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f4ee6a1 resource-sidebar-offcanvas-filter resource-sidebar-offcanvas-filter-1 elementor-widget elementor-widget-wpgb-facet\" data-id=\"f4ee6a1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-9\" data-facet=\"9\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f546433 resource-sidebar-offcanvas-filter resource-sidebar-offcanvas-filter-2 elementor-widget elementor-widget-wpgb-facet\" data-id=\"f546433\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-10\" data-facet=\"10\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b8ef5cd resource-sidebar-offcanvas-filter resource-sidebar-offcanvas-filter-2 elementor-widget elementor-widget-wpgb-facet\" data-id=\"b8ef5cd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpgb-facet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpgb-facet wpgb-loading wpgb-facet-11\" data-facet=\"11\" data-grid=\"elementor-element-478cf99\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-33fc63e elementor-widget elementor-widget-button\" data-id=\"33fc63e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#elementor-action%3Aaction%3Doff_canvas%3Aclose%26settings%3DeyJpZCI6IjY2MDIzYzEiLCJkaXNwbGF5TW9kZSI6ImNsb3NlIn0%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Apply Filters &amp; Close<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f0b5d76 e-con-full resource-sidebar-mobile-sticky-button e-flex e-con e-child\" data-id=\"f0b5d76\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;position&quot;:&quot;fixed&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6658c44 elementor-align-center btn-primary-b elementor-hidden-desktop elementor-widget elementor-widget-button\" data-id=\"6658c44\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;sticky&quot;:&quot;bottom&quot;,&quot;sticky_offset_mobile&quot;:20,&quot;sticky_parent&quot;:&quot;yes&quot;,&quot;sticky_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;],&quot;sticky_offset&quot;:0,&quot;sticky_effects_offset&quot;:0,&quot;sticky_anchor_link_offset&quot;:0}\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#elementor-action%3Aaction%3Doff_canvas%3Aopen%26settings%3DeyJpZCI6IjY2MDIzYzEiLCJkaXNwbGF5TW9kZSI6Im9wZW4ifQ%3D%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M21.25 11.9999H8.895M4.534 11.9999H2.75M4.534 11.9999C4.534 11.4217 4.76368 10.8672 5.17251 10.4584C5.58134 10.0496 6.13583 9.81989 6.714 9.81989C7.29217 9.81989 7.84666 10.0496 8.25549 10.4584C8.66432 10.8672 8.894 11.4217 8.894 11.9999C8.894 12.5781 8.66432 13.1326 8.25549 13.5414C7.84666 13.9502 7.29217 14.1799 6.714 14.1799C6.13583 14.1799 5.58134 13.9502 5.17251 13.5414C4.76368 13.1326 4.534 12.5781 4.534 11.9999ZM21.25 18.6069H15.502M15.502 18.6069C15.502 19.1852 15.2718 19.7403 14.8628 20.1492C14.4539 20.5582 13.8993 20.7879 13.321 20.7879C12.7428 20.7879 12.1883 20.5572 11.7795 20.1484C11.3707 19.7396 11.141 19.1851 11.141 18.6069M15.502 18.6069C15.502 18.0286 15.2718 17.4745 14.8628 17.0655C14.4539 16.6566 13.8993 16.4269 13.321 16.4269C12.7428 16.4269 12.1883 16.6566 11.7795 17.0654C11.3707 17.4742 11.141 18.0287 11.141 18.6069M11.141 18.6069H2.75M21.25 5.39289H18.145M13.784 5.39289H2.75M13.784 5.39289C13.784 4.81472 14.0137 4.26023 14.4225 3.8514C14.8313 3.44257 15.3858 3.21289 15.964 3.21289C16.2503 3.21289 16.5338 3.26928 16.7983 3.37883C17.0627 3.48839 17.3031 3.64897 17.5055 3.8514C17.7079 4.05383 17.8685 4.29415 17.9781 4.55864C18.0876 4.82313 18.144 5.10661 18.144 5.39289C18.144 5.67917 18.0876 5.96265 17.9781 6.22714C17.8685 6.49163 17.7079 6.73195 17.5055 6.93438C17.3031 7.13681 17.0627 7.29739 16.7983 7.40695C16.5338 7.5165 16.2503 7.57289 15.964 7.57289C15.3858 7.57289 14.8313 7.34321 14.4225 6.93438C14.0137 6.52555 13.784 5.97106 13.784 5.39289Z\" stroke=\"white\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Filter &amp; Sort<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Resource Filters Search by Name Search by Name Search by Name Filter by Category Filter by Category Filter by CategoryAllDrain&nbsp;(200)&emsp;Base [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2580","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Documentation &amp; Installation Manuals | Vodaland Engineering Portal<\/title>\n<meta name=\"description\" content=\"Find installation guidance and product documentation at Vodaland Solutions. Explore manuals, specifications, and support resources for every system.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.vodalandsolutions.com\/es\/documentation-installation-manuals\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Documentation &amp; Installation Manuals | Vodaland Engineering Portal\" \/>\n<meta property=\"og:description\" content=\"Find installation guidance and product documentation at Vodaland Solutions. Explore manuals, specifications, and support resources for every system.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.vodalandsolutions.com\/es\/documentation-installation-manuals\/\" \/>\n<meta property=\"og:site_name\" content=\"Vodaland Engineering Portal\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-09T20:23:23+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/documentation-installation-manuals\\\/\",\"url\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/documentation-installation-manuals\\\/\",\"name\":\"Documentation & Installation Manuals | Vodaland Engineering Portal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/#website\"},\"datePublished\":\"2025-09-25T19:38:23+00:00\",\"dateModified\":\"2025-12-09T20:23:23+00:00\",\"description\":\"Find installation guidance and product documentation at Vodaland Solutions. Explore manuals, specifications, and support resources for every system.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/documentation-installation-manuals\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.vodalandsolutions.com\\\/documentation-installation-manuals\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/documentation-installation-manuals\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentation &amp; Installation Manuals\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/#website\",\"url\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/\",\"name\":\"Vodaland Solutions Portal\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/#organization\",\"name\":\"Vodaland\",\"url\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/VodaLand_logo_deskriptor_RGB-EN_8f22a342-0b80-4931-9065-261ba8a8225a.png\",\"contentUrl\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/VodaLand_logo_deskriptor_RGB-EN_8f22a342-0b80-4931-9065-261ba8a8225a.png\",\"width\":300,\"height\":49,\"caption\":\"Vodaland\"},\"image\":{\"@id\":\"https:\\\/\\\/www.vodalandsolutions.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Documentation & Installation Manuals | Vodaland Engineering Portal","description":"Find installation guidance and product documentation at Vodaland Solutions. Explore manuals, specifications, and support resources for every system.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.vodalandsolutions.com\/es\/documentation-installation-manuals\/","og_locale":"es_MX","og_type":"article","og_title":"Documentation & Installation Manuals | Vodaland Engineering Portal","og_description":"Find installation guidance and product documentation at Vodaland Solutions. Explore manuals, specifications, and support resources for every system.","og_url":"https:\/\/www.vodalandsolutions.com\/es\/documentation-installation-manuals\/","og_site_name":"Vodaland Engineering Portal","article_modified_time":"2025-12-09T20:23:23+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.vodalandsolutions.com\/documentation-installation-manuals\/","url":"https:\/\/www.vodalandsolutions.com\/documentation-installation-manuals\/","name":"Documentation & Installation Manuals | Vodaland Engineering Portal","isPartOf":{"@id":"https:\/\/www.vodalandsolutions.com\/#website"},"datePublished":"2025-09-25T19:38:23+00:00","dateModified":"2025-12-09T20:23:23+00:00","description":"Find installation guidance and product documentation at Vodaland Solutions. Explore manuals, specifications, and support resources for every system.","breadcrumb":{"@id":"https:\/\/www.vodalandsolutions.com\/documentation-installation-manuals\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.vodalandsolutions.com\/documentation-installation-manuals\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.vodalandsolutions.com\/documentation-installation-manuals\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.vodalandsolutions.com\/"},{"@type":"ListItem","position":2,"name":"Documentation &amp; Installation Manuals"}]},{"@type":"WebSite","@id":"https:\/\/www.vodalandsolutions.com\/#website","url":"https:\/\/www.vodalandsolutions.com\/","name":"Vodaland Solutions Portal","description":"","publisher":{"@id":"https:\/\/www.vodalandsolutions.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.vodalandsolutions.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.vodalandsolutions.com\/#organization","name":"Vodaland","url":"https:\/\/www.vodalandsolutions.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.vodalandsolutions.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/08\/VodaLand_logo_deskriptor_RGB-EN_8f22a342-0b80-4931-9065-261ba8a8225a.png","contentUrl":"https:\/\/www.vodalandsolutions.com\/wp-content\/uploads\/2025\/08\/VodaLand_logo_deskriptor_RGB-EN_8f22a342-0b80-4931-9065-261ba8a8225a.png","width":300,"height":49,"caption":"Vodaland"},"image":{"@id":"https:\/\/www.vodalandsolutions.com\/#\/schema\/logo\/image\/"}}]}},"featured_image_src":null,"featured_image_src_square":null,"_links":{"self":[{"href":"https:\/\/www.vodalandsolutions.com\/es\/wp-json\/wp\/v2\/pages\/2580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vodalandsolutions.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.vodalandsolutions.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.vodalandsolutions.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vodalandsolutions.com\/es\/wp-json\/wp\/v2\/comments?post=2580"}],"version-history":[{"count":0,"href":"https:\/\/www.vodalandsolutions.com\/es\/wp-json\/wp\/v2\/pages\/2580\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.vodalandsolutions.com\/es\/wp-json\/wp\/v2\/media?parent=2580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}