SKU

In stock

HPS AGRO 400W 6 Plants Pro Lamp Kit 6 Plants Pro

GSI
1lt ph- As a GIFT
Hydroponic cultivation kit with 400W HPS Agro lamp for 6 Plants for useful growth and flowering. This kit includes everything you need to cultivate indoor in hydroponics.
SKU KCI400P-1-1

In stock

Details

Among the professional assemblies for hydroponic proposed by GSI, the 400W Pro hydroponic cultivation kit is the most complete and qualitative to cultivate on about 1sqm surfaces.

This HPS AGRO 400W 6 Plants Pro & NBSP HPS Cultivation Kit; includes the best components to ensure a professional hydroponic cultivation with all the options of the case. Specifically, an excellent quality drip hydroponic system, air extraction kit with active carbon filter and the electrical meter of electroconductivity (EC)


The Pro Hydroponic Cultivation Kits is equipped with extraction kit with air filtering, essential to eliminate unpleasant odors emitted by your cultivation.
< /p>

Advantages of the Professional Hydroponical Kit

By choosing to purchase a professional hydroponic kit you will have the guarantee of total control of indoor cultivation. In fact, the equipment supplied also includes the anti-pordori kit for the extraction of the air and the very useful tributes to complete and expand the performance of the kit.

In hydroponic cultivation the < Strong> Hydroponic system automatically provides water and nutritions to plants. However, to maintain high performance, the hydroponic cultivation requires precision in the dosage of fertilizers and in the measurement of the variables of acidity (pH) and electroconductivity (EC) of the nutritional solution.

assembly of the 400W Pro hydroponic kit:
  • HPS 400 W light kit (growth and flowering)
    the kit light hps agro 400w basic with lamp pure light hps agro from 400W, Stuco reflector , 400W magnetic power supply , cables and plug for connections.
  • Air extractor: Vents TT125mm </a> </strong> with power 190mc/h </li> <li Class = "P-Productdescription"> <strong> Active coal filter: </strong> <a title = "Max Carbon 125mm-250mch" Href = "https://www.growshopitalia.com/filtro-carboni- Active-125mm-400mch.html "> <strong> Active Carboni filter 125mm-250mc/h </strong> </a> </li> <li Class = "P-Productdescription"> <strong> Hydroponic system: </strong> <a href="https://www.growshopitalia.com/platinium- Hydrostar-60.html"> <strong> Platinum Hydrostar 60 </strong> </a> drip hydroponic system with 6 vessels. </li> <li Class = "P-Productdescription"> <strong> EC Memoring: </strong> <a href="https://www.growshopitalia.com//tester-c-milwaukee.html"> <strong> EC Tester Milwakee </strong> </a> </li> <li Class = "P-Productdescription"> <strong> fertilizers: </strong> <a title="ripack ghe" href="https://www.growshopitalia.com/ripack-ghe.html"> <strong> Tripack ghe </strong> </a> 500 ml </li> <li> <strong> GHE PH TEST & NBSP; Manual </strong> </li> <li> <strong> Booster Flowering: </strong> <a href="https://www.growshopitalia.com/ripen-500ml.html"> <strong> ghe rethink 500ml </strong> </a> < /li> <li Class = "P-Productdescription"> <strong> timer: </strong> <a title="TIMER analogue" href="https://www.growshopitalia.com//timer-analogico.html"> <strong > analog timer </strong> </a> at 15 minutes intervals </li> <li Class = "P-Productdescription"> <strong> Doser: </strong> Dostarice pipette for fertilizers up to 3 ml </li> <li> <strong> expanded clay </strong> 30l </li> <li Class = "P-Productdescition"> <span style = "color: #ff0000;"> <strong> homage: </strong> </dpa> bionova ph- 1l </li> <li> <Span Style = "Color: #FF0000;"> <strong> homage: </strong> </Pan> 2MT & Nbsp; Tube & Nbsp; Flexible & Nbsp; 125mm </li> </ul> <p> <strong> N.B.: fertilization in hydroponic cultivation is one of the most decisive factors to obtain a satisfactory result. Measuring and dosing the nutrients carefully will allow you to grow in the water uncomfortable without inconvenience and making your plants express at best. <br> </strong> </p> <p> & Nbsp; </p> <p style = "Text-align: center;"> <strong> <a title = "indoor cultivation kit" href = "https://www.growshopitalia.com/manual-isorse/kit-comingoor/ "target =" _ self "> <img style =" border: 2px solid black; vertical-align: middle; display: block; margin-left: car; margin-Right: car; border-width: 2px; " title = "indoor cultivation kit" src = "https://www.growshopitalia.com/pub/media/wysiwyg/concimation- hydroponica.jpg" alt = "Hydroponics fertilization" Width = "150" Height = "85"> < /a> <br> <span style = "font-size: small;"> <a title = "hydroponic fertilization" href = "https://www.growshopitalia.com/manual- and-isoeo/fertoloization- Hydroponics-Indoor/"Target =" _ Self "> Consult the article: Hydroponics fertilization </a> </Pan> </strong> </p> <div class="product attribute description"><h3>HPS AGRO 400W 6 Plants Pro Lamp Kit 6 Plants Pro comprende:</h3> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/k/i/kit-luce-hps-agro-400w-basic_1.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/k/i/kit-luce-hps-agro-400w-basic_1.jpg" alt="HPS AGRO 400W Basic LIGHT KIT LIGHT KIT" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/kit-luce-lampada-agro-400w-basic.html"><strong>HPS AGRO 400W BASIC LIGHT KIT LIGHT KIT</strong></a></p><p> The HPS 400W Basic HPS LIGHT KIT includes all the fundamental accessories for the growth and flowering of plants. By growing indoor with an agro 400W lamp you will be able to cover surfaces of 1 square meters .. </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/p/l/platinum_hydrostar_60.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/p/l/platinum_hydrostar_60.jpg" alt="Platinium Hydrostar 60" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/platinium-hydrostar-60.html"><strong>PLATINIUM HYDROSTAR 60</strong></a></p><p> Platinium Hydrostar 60 Drop hydroponic system with 6 6 -liter vessels. </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/e/tester_ec_milwaukee_-1.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/e/tester_ec_milwaukee_-1.jpg" alt="EC Milwaukee CD 611 testers" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/tester-ec-milwaukee.html"><strong>EC MILWAUKEE CD 611 TESTERS</strong></a></p><p> The EC Milwaukee CD611 tester is a tester for electric conductivity (EC) with a scale from 0.00 to 19.99 ms/cm. Compact and pocket design tool, it has a rapid and precise capacity for analysis. Practical and reliable: it has the right characteristics for an EC meter for hydroponics. </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/t/tt-125-estrattore-bi-potenza.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/t/tt-125-estrattore-bi-potenza.jpg" alt="Venti TT 125 Bi-Potenza helical extractor" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/estrattore-elicoidale-vents-tt-125-bi-potenza-cablato.html"><strong>VENTI TT 125 BI-POTENZA HELICAL EXTRACTOR</strong></a></p><p> Vents TT125 Bi power extractor with 125 mm diameter and air flow 220-280mc/h. This double -speed extractor model allows air recyccarcolo with a very low noise. </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/f/i/filtro-carboni-attivi-125.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/f/i/filtro-carboni-attivi-125.jpg" alt="Active carbon filter 125-250m³/h" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/filtro-carbone-attivo-1.html"><strong>ACTIVE CARBON FILTER 125-250M³/H</strong></a></p><p> Active carbon filter 125mm flange diameter and air flow of 250m³/h product and assembled of the Siderclima Italian company. </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/i/timer_analogico.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/i/timer_analogico.jpg" alt="Analog Timer at intervals of 15 min" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/timer-analogico.html"><strong>ANALOG TIMER AT INTERVALS OF 15 MIN</strong></a></p><p> analogue Timer 24h at 15 minutes intervals with a connectable socket directly to the wall or mutipresce. Mechanical timing with load capacity up to 3500w </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/r/tripart-tripack-3x500ml-terra-aquatica.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/t/r/tripart-tripack-3x500ml-terra-aquatica.jpg" alt="Tripart Series Terra Aquatica - Ex Tripack Ghe" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/tripack-ghe.html"><strong>TRIPART SERIES TERRA AQUATICA - EX TRIPACK GHE</strong></a></p><p> The Tripart Series of the Aquatic Earth line line is a tric component suitable for all types of crops, invatti guarantees excellent results on the ground, in hydroponics or aeroponic and also in the cultivation with coconut fiber. </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/f/i/final-part-500ml-terra-aquatica.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/f/i/final-part-500ml-terra-aquatica.jpg" alt="Final part Terra Aquatica - ex Renpen" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/ripen-500ml.html"><strong>FINAL PART TERRA AQUATICA - EX RENPEN</strong></a></p><p> Final part is a stimulator for the final flowering phase. A solution of forcing that allows you to accelerate the finalization of the flowers and at the same time to increase the natural defenses of the plants. It is used by more experienced growers to harmonize and accelerate the conclusion of flowering, reducing the residues of unexpressed fertilizer. & Nbsp; </p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/p/h/ph_test_manuale_-1.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/p/h/ph_test_manuale_-1.jpg" alt="PH Test manuale " class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/ph-test-manuale.html"><strong>PH TEST MANUALE </strong></a></p><p>Il <strong>test manuale della GHE </strong>è uno strumento di misurazione che vi permette di conoscere i valori del ph e lo stato di salute delle vostre piante.</p> <hr></div></div> <div class="row 2222 product-kit"><div class="col-11 no-padding"><span class="col-4 col-sm-2 rounded float-left mr-2"><picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/a/r/argilla-espansa.webp"><img src="https://www.growshopitalia.com/media/catalog/product/cache/63e3e164b0a4876d2e0a179b273a9aba/a/r/argilla-espansa.jpg" alt="Expanded clay for hydroponics" class="" width="180" height="180" loading="lazy" /></picture></span> <p><a href="https://www.growshopitalia.com/en/argilla-espansa-10l.html"><strong>EXPANDED CLAY FOR HYDROPONICS</strong></a></p><p> expanded clay for hydroculture plants and to make the draining background to the vessels. It is an ecological, natural product, aimed at promoting the development and growth of the roots. </p> <hr></div></div></div> </div></div></section> <section id="product.attributes" class="border-t border-solid -mt-px" :class="selected === 2 ? 'lg:block' : 'lg:hidden' "><div class="heading cursor-pointer lg:cursor-none lg:hidden" @click="window.innerWidth < 768 ? selected.includes(2) ? selected = selected.filter(item => item !== 2) : selected.push(2) : selected = 2"> <div class="w-full flex py-3 pr-5 md:flex-row border-gray-300 relative"><h2 class="text-primary text-base title-font font-base uppercase text-left w-full">More Information <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-transform transform duration-300 ease-in-out absolute right-1 top-1/2 -m-3 mr-0 hidden"><path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></h2></div></div><div id="product.attributes-div" class="w-full relative overflow-hidden mb-4 pt-4 lg:py-4 lg:px-4 lg:bg-container-darker product.attributes-div" x-ref="container2" x-bind:class="{ 'block' : window.innerWidth < 768 ? selected.includes(2) : selected == 2, 'hidden' : window.innerWidth < 768 ? !selected.includes(2) : selected !== 2 }" > <div class="table-wrapper overflow-x-auto "><table class="additional-attributes w-full -mt-1"> <tr class="text-sm "><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Producer</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Producer" >GSI</td></tr> <tr class="text-sm bg-gray-200"><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Brand and Model</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Brand and Model" >400W PRO HYDROPONIC GROWING KIT</td></tr> <tr class="text-sm "><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Distance from plants</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Distance from plants" >40cm</td></tr> <tr class="text-sm bg-gray-200"><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Number of plants</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Number of plants" >6</td></tr> <tr class="text-sm "><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Support for germination</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Support for germination" >Grodan</td></tr> <tr class="text-sm bg-gray-200"><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Suitable surface</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Suitable surface" >1m2</td></tr> <tr class="text-sm "><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Features</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Features" >GROWTH-FLOWERING</td></tr> <tr class="text-sm bg-gray-200"><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Consumption watts</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Consumption watts" >400 W</td></tr> <tr class="text-sm "><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Shipments all over Europe</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Shipments all over Europe" >Yes</td></tr> <tr class="text-sm bg-gray-200"><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row"> Manuals and related articles</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th=" Manuals and related articles" ><a class="link-productdescription" href="/manuali-e-risorse/idroponica-fai-da-te">DIY HYDROPONICS HOW TO BUILD A HYDROPONIC SYSTEM</a></td></tr> <tr class="text-sm "><th class="col label w-1/2 py-2 px-2 text-left text-primary font-bold uppercase" scope="row">Free Gift</th><td class="col data w-1/2 py-2 px-2 text-left text-primary" data-th="Free Gift" >1lt ph-</td></tr></table></div></div></section> <section id="product.info.details.reviews.container" class="border-t border-solid -mt-px" :class="selected === 3 ? 'lg:block' : 'lg:hidden' "><div class="heading cursor-pointer lg:cursor-none lg:hidden" @click="window.innerWidth < 768 ? selected.includes(3) ? selected = selected.filter(item => item !== 3) : selected.push(3) : selected = 3"> <div class="w-full flex py-3 pr-5 md:flex-row border-gray-300 relative"><h2 class="text-primary text-base title-font font-base uppercase text-left w-full">Reviews <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-transform transform duration-300 ease-in-out absolute right-1 top-1/2 -m-3 mr-0 hidden"><path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></h2></div></div><div id="product.info.details.reviews.container-div" class="w-full relative overflow-hidden mb-4 pt-4 lg:py-4 lg:px-4 lg:bg-container-darker product.info.details.reviews.container-div" x-ref="container3" x-bind:class="{ 'block' : window.innerWidth < 768 ? selected.includes(3) : selected == 3, 'hidden' : window.innerWidth < 768 ? !selected.includes(3) : selected !== 3 }" > <div class="w-full mx-auto items-center" id="review-form"><div class="w-full"><div class=""><h4 class="text-primary text-base uppercase title-font font-base text-left md:text-left w-full">Write Your Own Review</h4></div> <form class="review-form" id="review_form" @submit.prevent="submitForm()" action="" x-data="initReviewForm()" > <div class="control"><input type="hidden" value="" class="form-input" name="g-recaptcha-response" /></div> <fieldset><div class="text-xs"><span> You're reviewing:</span> <span class="font-semibold">HPS AGRO 400W 6 Plants Pro Lamp Kit 6 Plants Pro</span></div> <div><div><label for="nickname_field" class="sr-only"><span>Nickname</span></label> <div><input class="form-input mt-3 block w-full text-sm" required title="Nickname" placeholder="Nickname*" type="text" name="nickname" id="nickname_field"/></div></div><div><label for="summary_field" class="sr-only"><span>Summary</span></label> <div><input class="form-input mt-3 block w-full text-sm" required title="Summary" placeholder="Summary*" type="text" name="title" id="summary_field"/></div></div><div><label for="review_field" class="sr-only"><span>Review</span></label> <div><textarea class="form-input mt-3 block w-full text-sm" required title="Review" placeholder="Review*" name="detail" id="review_field" cols="5" rows="3"></textarea></div></div></div></fieldset><div class="my-3"><div><button x-show="!displaySuccessMessage" type="submit" class="btn btn-primary"><span> Submit Review</span></button> <div class="flex flex-row justify-start items-center w-full" x-show="isLoading"><!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --><svg width="57" height="57" viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg" stroke="#fff" style="transform: scale(0.6)" class="stroke-current text-primary"><g fill="none" fill-rule="evenodd"><g transform="translate(1 1)" stroke-width="2"><circle cx="5" cy="50" r="5"><animate attributeName="cy" begin="0s" dur="2.2s" values="50;5;50;50" calcMode="linear" repeatCount="indefinite"/><animate attributeName="cx" begin="0s" dur="2.2s" values="5;27;49;5" calcMode="linear" repeatCount="indefinite"/></circle><circle cx="27" cy="5" r="5"><animate attributeName="cy" begin="0s" dur="2.2s" from="5" to="5" values="5;50;50;5" calcMode="linear" repeatCount="indefinite"/><animate attributeName="cx" begin="0s" dur="2.2s" from="27" to="27" values="27;49;5;27" calcMode="linear" repeatCount="indefinite"/></circle><circle cx="49" cy="50" r="5"><animate attributeName="cy" begin="0s" dur="2.2s" values="50;50;5;50" calcMode="linear" repeatCount="indefinite"/><animate attributeName="cx" from="49" to="49" begin="0s" dur="2.2s" values="49;5;27;49" calcMode="linear" repeatCount="indefinite"/></circle></g></g></svg><div class="ml-4 text-primary">Loading...</div></div><p x-show="displaySuccessMessage" class="text-green flex items-center"><span class="inline-block w-8 h-8 mr-3"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/></svg></span> You submitted your review for moderation.</p><template x-if="displayErrorMessage"><p class="text-red flex items-center"><span class="inline-block w-8 h-8 mr-3"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg></span> <template x-for="errorMessage in errorMessages"><span x-html="errorMessage"></span></template></p></template></div> <p class="my-4 text-sm text-gray-900">This form is protected by reCAPTCHA - the <a class="underline" href="https://policies.google.com/privacy">Google Privacy Policy</a> and <a class="underline" href="https://policies.google.com/terms">Terms of Service</a> apply.</p></div></form><script> function initReviewForm() { return { isLoading: false, displayNickname: false, displaySuccessMessage: false, displayErrorMessage: false, errorMessages: [], errors: 0, hasCaptchaToken: 0, nickname: null, summary: null, ratings: [], review: null, setErrorMessages: function (messages) { this.errorMessages = [messages] this.displayErrorMessage = this.errorMessages.length }, submitForm: function () { var $form = document.querySelector('#review_form'); this.validate(); if (!this.hasCaptchaToken) { this.errors = 1; const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LdMoTUeAAAAAPewqPBGGTxK3IcFELTLYkVDciKH"; const executeGreCaptcha = () => { grecaptcha.ready(() => { grecaptcha.execute( '6LdMoTUeAAAAAPewqPBGGTxK3IcFELTLYkVDciKH', {action: 'submit'} ).then((token) => { const recaptchaResponseInput = $form.querySelector('input[name="g-recaptcha-response"]'); if (recaptchaResponseInput != null) { recaptchaResponseInput.value = token; this.errors = 0; this.hasCaptchaToken = 1; this.submitForm(); } else { this.errors = 1; if (this.setErrorMessages) { this.setErrorMessages(['Your form does not have the required fields for recaptcha to work.']) this.displayErrorMessage = true; } } }); }) } if (typeof window.grecaptcha !== 'undefined') { executeGreCaptcha(); } else { let script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', recaptchaUrl); document.head.appendChild(script); script.addEventListener("load", executeGreCaptcha, false); } } if (this.errors === 0) { this.placeReview(); } }, validate: function () { this.nickname = document.getElementById('nickname_field').value; this.summary = document.getElementById('summary_field').value; this.review = document.getElementById('review_field').value; let ratingValue; if (!(this.nickname && this.summary && this.review && Object.keys(this.ratings).length === 0 )) { this.setErrorMessages( ['Please\u0020verify\u0020you\u0027ve\u0020entered\u0020all\u0020required\u0020information'] ); this.displayErrorMessage = true; this.errors = 1; this.hasCaptchaToken = 0; } }, placeReview: function () { this.isLoading = true; this.displayErrorMessage = false; const query = ` mutation createProductReviewMutation( $sku: String!, $nick: String!, $summary: String!, $review: String!, $ratings: [ProductReviewRatingInput]! ) { createProductReview( input: { sku: $sku, nickname: $nick, summary: $summary, text: $review, ratings: $ratings } ) { review { nickname } } } `; const variables = { sku: 'KCI400P\u002D1\u002D1', nick: this.nickname, summary: this.summary, review: this.review, ratings: Object.keys(this.ratings).map(key => { return {id: btoa(key), value_id: this.ratings[key]} }) }; const form = document.querySelector('#review_form'); const recaptchaHeader = form && form.elements['g-recaptcha-response'] ? {'X-ReCaptcha': form.elements['g-recaptcha-response'].value} : {}; fetch(`${BASE_URL}graphql`, { method: 'POST', headers: Object.assign({ 'Content-Type': 'application/json;charset=utf-8', 'Store': 'en' }, recaptchaHeader), credentials: 'include', body: JSON.stringify({query: query, variables: variables}) }) .then(response => response.json()) .then(data => { this.isLoading = false; if (data.errors) { this.setErrorMessages(['Submitting\u0020your\u0020review\u0020failed,\u0020please\u0020try\u0020again.']); this.displayErrorMessage = true; } else { this.displaySuccessMessage = true; } } ); } } }</script></div></div> </div></section> </div> <section><div class="product-slider"><div></div><script> 'use strict'; window.addEventListener('DOMContentLoaded', function() { if (! window.productSliderEventHandlerInitialized) { window.productSliderEventHandlerInitialized = true; window.addEventListener('product-add-to-wishlist', (event) => { const productId = event.detail.productId; fetch(BASE_URL + "wishlist/index/add/", { headers: { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, body: new URLSearchParams({ form_key: hyva.getFormKey(), product: productId, uenc: btoa(window.location.href) } ), method: "POST", mode: "cors", credentials: "include" }).then(function (response) { if (response.redirected) { window.location.href = response.url; } else if (response.ok) { return response.json(); } else { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Could not add item to wishlist." }], 5000 ); } }).then(function (result) { if (!result) { return } typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: (result.success) ? "success" : "error", text: (result.success) ? "Product has been added to your Wish List." : result.error_message }], 5000 ); window.dispatchEvent(new CustomEvent("reload-customer-section-data")); }).catch(function (error) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: error }], 5000 ); }); }) window.addEventListener('product-add-to-compare', (event) => { const productId = event.detail.productId; hyva.postForm({ action: BASE_URL + 'catalog/product_compare/add/', data: {product: productId} }) }) } });</script></div> <div class="product-slider"><div></div><script> 'use strict'; window.addEventListener('DOMContentLoaded', function() { if (! window.productSliderEventHandlerInitialized) { window.productSliderEventHandlerInitialized = true; window.addEventListener('product-add-to-wishlist', (event) => { const productId = event.detail.productId; fetch(BASE_URL + "wishlist/index/add/", { headers: { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, body: new URLSearchParams({ form_key: hyva.getFormKey(), product: productId, uenc: btoa(window.location.href) } ), method: "POST", mode: "cors", credentials: "include" }).then(function (response) { if (response.redirected) { window.location.href = response.url; } else if (response.ok) { return response.json(); } else { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Could not add item to wishlist." }], 5000 ); } }).then(function (result) { if (!result) { return } typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: (result.success) ? "success" : "error", text: (result.success) ? "Product has been added to your Wish List." : result.error_message }], 5000 ); window.dispatchEvent(new CustomEvent("reload-customer-section-data")); }).catch(function (error) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: error }], 5000 ); }); }) window.addEventListener('product-add-to-compare', (event) => { const productId = event.detail.productId; hyva.postForm({ action: BASE_URL + 'catalog/product_compare/add/', data: {product: productId} }) }) } });</script></div> </section></div> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Product","name":"HPS AGRO 400W 6 Plants Pro Lamp Kit 6 Plants Pro","sku":"KCI400P-1-1","image":"https:\/\/www.growshopitalia.com\/media\/catalog\/product\/cache\/9bd442661597b3f0d63ed1ded4db5701\/k\/i\/kit-coltivazione-idroponico-hps-400w-pro.jpg","category":"Prodotti in offerta","description":" Hydroponic cultivation kit with 400W HPS Agro lamp for 6 Plants for useful growth and flowering. This kit includes everything you need to cultivate indoor in hydroponics. ","offers":{"@type":"Offer","url":"https:\/\/www.growshopitalia.com\/en\/kit-coltivazione-idroponica-400w-pro.html","price":"349.00","priceCurrency":"EUR","priceValidUntil":"2030-01-01","availability":"https:\/\/schema.org\/InStock","sku":"KCI400P-1-1"}}</script> <script> function hasWebP() { var elem = document.createElement('canvas'); if (!!(elem.getContext && elem.getContext('2d'))) { return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0; } return false; } if (hasWebP()) { document.body.classList.add("webp"); } else { document.body.classList.add("no-webp"); }</script><script> document.addEventListener('alpine:init', () => { Alpine.data('initGallery', () => { const galleryInitData = initGallery(); document.dispatchEvent(new CustomEvent('gallery-init', {detail: galleryInitData})); return galleryInitData; }); });</script><script> document.addEventListener('gallery-init', ({detail: galleryData}) => { if (typeof hasWebP != 'function') { console.error('[Yireo_WebP2] JavaScript function "hasWebP" does not exist'); return; } function replaceImage(image) { if (image.full && image.full_webp) { image.full = image.full_webp; delete image.full_webp; } if (image.img && image.img_webp) { image.img = image.img_webp; delete image.img_webp; } if (image.thumb && image.thumb_webp) { image.thumb = image.thumb_webp; delete image.thumb_webp; } } if (galleryData.images) { galleryData.images.forEach(function(image) { replaceImage(image); }); } if (galleryData.initialImages) { galleryData.initialImages.forEach(function(image) { replaceImage(image); }); } });</script> <section class="amsearch-overlay-block" data-bind=" scope: 'index = amsearch_overlay_section', mageInit: { 'Magento_Ui/js/core/app': { components: { 'amsearch_overlay_section': { component: 'Amasty_Xsearch/js/components/overlay' } } } }"><div class="amsearch-overlay" data-bind=" event: { click: hide }, afterRender: initNode"></div></section> <script type="text/x-magento-init"> { "*": { "amsearchAnalyticsCollector": { "minChars": 3 } } }</script></div></div></main><footer class="page-footer"><div class="footer content"> <script> function initFooter () { return { footer: { }, applyIcons: function() { var iconArrowUp = '<svg xmlns="http://www.w3.org/2000/svg" class="up h-6 w-6 hidden absolute right-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7" /></svg>'; var iconArrowDown = '<svg xmlns="http://www.w3.org/2000/svg" class="down h-6 w-6 hidden absolute right-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" /></svg>'; accordion = this.$refs.accordion; var headings = accordion.querySelectorAll('.heading'); headings.forEach(function (el,i) { el.innerHTML = el.innerHTML + iconArrowUp + iconArrowDown; }); } } }</script><footer class="text-gray-700 body-font bg-footer border-t border-container-darker shadow text-contrast-primary mt-5" x-data="initFooter()"><div class="container px-5 py-8 mx-auto footer-top"><div class="order-first gap-y-16"><style>#html-body [data-pb-style=LDV4NAN]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="LDV4NAN"><div data-content-type="html" data-appearance="default" data-element="main"><div class="w-full px-4 gap-y-4 accordion" x-ref="accordion" x-on:load.window="applyIcons()"> <div class="w-full lg:grid lg:grid-cols-4 lg:gap-1 xl:col-span-2"> <div> <h4 class="py-2 text-md leading-0 font-black font-lato tracking-wider heading" :class="{ 'open' : footer.menu1}" x-on:click="footer.menu1 = ! footer.menu1"> My Account </h4> <ul class="mt-4 text-sm content" :class="{ 'active' : footer.menu1}" > <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/customer/account" title="Il mio account">Il mio account</a></li> <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/sales/order/history" title="I miei Ordini">I miei ordini</a></li> <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/termini-e-condizioni" title="Termini e condizioni">Termini e condizioni</a></li> <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/privacy-policy" title="Termini e condizioni">Privacy & Policy</a></li> </ul> </div> <div> <h4 class="py-2 text-md leading-0 font-black font-lato tracking-wider heading" :class="{ 'open' : footer.menu2}" x-on:click="footer.menu2 = ! footer.menu2">Informazioni GSI </h4> <ul class="mt-4 text-sm content" :class="{ 'active' : footer.menu2}" > <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/chi-siamo" title="Chi Siamo">Chi siamo</a></li> <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/spedizioni" title="Spedizioni">Spedizioni</a></li> <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/negozi" title="Punti vendita">Punti vendita</a></li> <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/grow-shop-roma" title="Punti vendita">Grow Shop Roma</a></li> <li class="mt-2"><a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/contact" title="Contattaci">Contattaci</a></li> </ul> </div> <div> <h4 class="py-2 text-md leading-0 font-black font-lato tracking-wider heading" :class="{ 'open' : footer.menu3}" x-on:click="footer.menu3 = ! footer.menu3">Il nostro punto vendita </h4> <div class="mt-4 text-sm content" :class="{ 'active' : footer.menu3}" > <div class="feature feature-icon-hover first mt-3"> <p class="no-margin"> <a class="block p-2 lg:p-0" href="https://www.growshopitalia.com/contact"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" fill="currentColor" aria-hidden="true" width="12" height="12" viewBox="0 0 267 383" class="w-4 h-4 text-yellow inline"> <title/> <g id="location"> </g> <path d="M265,128.9C263.7,68.1,218.9,14.4,159.4,2.5C154,1.4,148.6,0.8,143.2,0c-6.5,0-13,0-19.4,0c-8.2,1.5-16.5,2.5-24.5,4.6 c-50.2,13.2-89,57.6-95.9,109.1c-4.1,30.1,1.2,58.2,15.7,84.7c31.1,56.9,62.2,113.8,93.1,170.8c4,7.3,9.7,11.7,17.5,13.8 c2.5,0,5,0,7.5,0c9.2-2.2,14.6-8.3,19-16.4c30.1-55.5,60.3-110.8,90.7-166.1C259.1,178.1,265.5,154.5,265,128.9z M133.3,192.8 c-40.3-0.1-73-33.1-72.8-73.5c0.1-40.1,33-72.7,73.2-72.6c40.3,0.1,73,33.1,72.8,73.5C206.3,160.2,173.4,192.8,133.3,192.8z"/> </svg> Via Tor De Schiavi 1-1b-1c Roma 00171 <br>     06 - 95947059</a> </p> </div> </div> </div> <div> <h4 class="py-2 text-md leading-0 font-black font-lato tracking-wider heading" :class="{ 'open' : footer.menu4}" x-on:click="footer.menu4 = ! footer.menu4">Social </h4> <div class="social-icons mt-4 text-sm content" :class="{ 'active' : footer.menu4}" > <div class="mt-2 inline"><a rel="noreferrer" href="https://www.facebook.com/GrowShopItalia/" title="Facebook" target="_blank"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" fill="currentColor" width="12" height="12" viewBox="0 0 1024 1024" class="w-10 h-10 border-2 text-white rounded-md p-2 inline mr-2"> <title/> <g id="grow-facebook"> </g> <path d="M575.87 1024h-191.87v-512h-128v-176.45l128-0.058-0.208-103.952c0-143.952 39.034-231.54 208.598-231.54h141.176v176.484h-88.23c-66.032 0-69.206 24.656-69.206 70.684l-0.262 88.324h158.69l-18.704 176.45-139.854 0.058-0.13 512z"/> </svg> </a> </div> <div class="mt-2 inline"><a rel="noreferrer" href="https://www.instagram.com/growshopitalia/" title="Twitter" target="_blank"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" fill="currentColor" width="12" height="12" viewBox="0 0 1024 1024" class="w-10 h-10 border-2 text-white rounded-md p-2 inline mr-2"> <title/> <g id="grow-instagram"> </g> <path d="M896 0h-768c-70.656 0-128 57.344-128 128v768c0 70.656 57.344 128 128 128h768c70.656 0 128-57.344 128-128v-768c0-70.656-57.344-128-128-128zM512 384c117.888 0 128 128 128 128s3.776 128-128 128c-131.712 0-128-128-128-128s10.112-128 128-128zM896 832c0 35.392-28.608 64-64 64h-640c-35.392 0-64-28.608-64-64v-320c0-35.392 28.608-64 64-64h73.088c-5.376 20.544-9.088 41.728-9.088 64 0 141.376 114.624 256 256 256s256-114.624 256-256c0-22.272-3.776-43.456-9.088-64h73.088c35.392 0 64 28.608 64 64v320zM896 256c0 35.328-28.608 64-64 64h-64c-35.328 0-64-28.672-64-64v-64c0-35.328 28.672-64 64-64h64c35.392 0 64 28.672 64 64v64z"/> </svg> </a> </div> <div class="mt-2 inline"><a rel="noreferrer" href="https://www.youtube.com/channel/UCLKV1bhNpsvi9LDb-0FVIOw" title="Linkedin" target="_blank"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" fill="currentColor" width="1024" height="1024" viewBox="0 0 1024 1024" class="w-10 h-10 border-2 text-white rounded-md p-2 inline mr-2"> <title/> <g id="grow-youtube"> </g> <path d="M832 128h-640c-105.6 0-192 86.4-192 192v384c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-384c0-105.6-86.4-192-192-192zM384 768v-512l320 256-320 256z"/> </svg> </a> </div> </div> </div> </div> </div> </div></div></div><style type="text/css"></style> </div></div><div class="bg-footer-darker border-container"><div class="container px-5 py-6 mx-auto flex items-center justify-between sm:flex-row flex-col"><div class="my-3 lg:my-0 text-xs text-left text-white">Filodafab srl P.iva 10316661007 viale Ippocrate 61 - 00161 Roma</div><style>.cmsb206-my-3 { margin-top: 0.75rem; margin-bottom: 0.75rem } .cmsb206-flex { display: flex } .cmsb206-items-center { align-items: center } .cmsb206-gap-2 { gap: 0.5rem } @media (min-width: 1024px) { .cmsb206-lg\:my-0 { margin-top: 0px; margin-bottom: 0px } }</style> <div data-content-type="html" data-appearance="default" data-element="main"><div class="footer-bottom-payment-methods cmsb206-my-3 cmsb206-flex cmsb206-items-center cmsb206-gap-2 cmsb206-lg:my-0"> <picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/wysiwyg/varie/mastercard.webp"><img src="https://www.growshopitalia.com/media/wysiwyg/varie/mastercard.png" alt="Payments methods accepted" width="50" height="31" loading="lazy" /></picture> <picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/wysiwyg/varie/maestro.webp"><img src="https://www.growshopitalia.com/media/wysiwyg/varie/maestro.png" alt="Payments methods accepted" width="50" height="31" loading="lazy" /></picture> <picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/wysiwyg/varie/visa.webp"><img src="https://www.growshopitalia.com/media/wysiwyg/varie/visa.png" alt="Payments methods accepted" width="50" height="31" loading="lazy" /></picture> <picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/wysiwyg/varie/electron.webp"><img src="https://www.growshopitalia.com/media/wysiwyg/varie/electron.png" alt="Payments methods accepted" width="50" height="31" loading="lazy" /></picture> <picture><source type="image/webp" srcset="https://www.growshopitalia.com/media/wysiwyg/varie/amex.webp"><img src="https://www.growshopitalia.com/media/wysiwyg/varie/amex.png" alt="Payments methods accepted" width="50" height="31" loading="lazy" /></picture> </div></div></div></div></footer></div></footer><script data-ommit="true"> document.addEventListener("DOMContentLoaded", () => { let bind = () => { Object.entries( { add_to_cart: event => { AEC.add(event.currentTarget, dataLayer); }, remove_from_cart:event => { AEC.remove(event.currentTarget, dataLayer); }, select_item:event => { AEC.click(event.currentTarget, dataLayer); }, add_to_wishlist:event => { AEC.wishlist(event.currentTarget, dataLayer); }, add_to_compare:event => { AEC.compare(event.currentTarget, dataLayer); }, add_to_cart_swatch:event => { AEC.addSwatch(event.currentTarget, dataLayer); } }).forEach(([event, callback]) => { [...document.querySelectorAll('[data-event]:not([data-bound])')].filter(element => { return element.dataset.event === event; }).forEach(element => { element.addEventListener('click', callback); element.dataset.bound = true; }); }); }; bind(); if("PerformanceObserver" in window) { const observer = new PerformanceObserver((items) => { items.getEntries().filter(({ initiatorType }) => initiatorType === "xmlhttprequest").forEach((entry) => { bind(); }); }); observer.observe( { entryTypes: ["resource"] }); } });</script><script data-ommit="true"> document.addEventListener("DOMContentLoaded", () => { var PromotionTrack = ((dataLayer) => { return { apply: () => { var promotions = [], position = 0; document.querySelectorAll('[data-promotion]').forEach(promotion => { let entity = { promotion_id: promotion.dataset.promotionId, promotion_name: promotion.dataset.promotionName, creative_name: promotion.dataset.promotionCreative, creative_slot: promotion.dataset.promotionPosition }; AEC.EventDispatcher.trigger('ec.cookie.promotion.entity', entity, { element: promotion }); promotions.push(entity); promotion.addEventListener('click', (event) => { var data = { 'event': 'select_promotion', 'ecommerce': { 'items': [ { promotion_id: event.target.dataset.promotionId, promotion_name: event.target.dataset.promotionName, creative_name: event.target.dataset.promotionCreative, creative_slot: event.target.dataset.promotionPosition } ] } }; AEC.Cookie.promotionClick(data, promotion).push(dataLayer); /** * Save persistent data */ AEC.Persist.push(AEC.Persist.CONST_KEY_PROMOTION, { 'promotion': data.ecommerce.items[0] }); }); }); if (promotions.length) { AEC.Cookie.promotion( { 'event':'view_promotion', 'ecommerce': { 'items': promotions } }).push(dataLayer); } return this; } } })(dataLayer).apply(); });</script><script data-ommit="true"> document.addEventListener("DOMContentLoaded", () => { (() => { let map = {}, trace = {}; document.querySelectorAll('[data-widget]').forEach((element) => { let widget = element.dataset.widget; let entity = { item_id: element.dataset.id, item_name: element.dataset.name, item_list_name: element.dataset.list, item_list_id: element.dataset.list, item_brand: element.dataset.brand, category: element.dataset.category, price: parseFloat(element.dataset.price), index: parseFloat(element.dataset.position), currency: AEC.GA4.currency, quantity: 1, google_business_vertical: 'retail' }; Object.assign(entity, entity, AEC.GA4.augmentCategories(entity)); let attributes = element.dataset.attributes; if (attributes) { Object.entries(JSON.parse(attributes)).forEach(([key, value]) => { entity[key] = value; }); } if (!map.hasOwnProperty(widget)) { map[widget] = []; map[widget].trace = {}; map[widget].entry = []; map[widget].item_list_id = ''; map[widget].item_list_name = ''; } if (!map[widget].trace.hasOwnProperty(element.dataset.id)) { map[widget].trace[element.dataset.id] = true; map[widget].entry.push(entity); map[widget].item_list_id = entity.item_list_id; map[widget].item_list_name = entity.item_list_name; } }); Object.entries(map).forEach(([key, value]) => { if (value.entry.length) { let data = { event: 'view_item_list', ecommerce: { item_list_id: value.item_list_id, item_list_name: value.item_list_name, items: value.entry } }; if ('undefined' !== typeof dataLayer) { (function(callback) { if (AEC.Const.COOKIE_DIRECTIVE) { AEC.CookieConsent.queue(callback).process(); } else { callback.apply(window,[]); } }) ( (function(dataLayer, data) { return function() { AEC.EventDispatcher.trigger('ec.widget.view.data', data); dataLayer.push(data); } })(dataLayer, data) ); } } }); })(); });</script><script data-ommit="true"> if (typeof dataLayer !== "undefined") { AEC.Request.get(AEC.url('datalayer/index/events'), {}, response => { Object.entries(response.events).forEach(([key, event]) => { dataLayer.push(event); }); }); AEC.EventDispatcher.on('ec.facebook.loaded', () => { }); if (window.google_tag_params) { (function(callback) { if (AEC.Const.COOKIE_DIRECTIVE) { if (!AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED) { AEC.CookieConsent.queue(callback); } else { callback.apply(window,[]); } } else { callback.apply(window,[]); } }) ( (function(dataLayer) { return () => { AEC.Cookie.remarketing({ event:'fireRemarketingTag', google_tag_params: window.google_tag_params }).push(dataLayer); } })(dataLayer) ); } } else { console.log('dataLayer[] is not intialized. Check if GTM is installed properly'); }</script><script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/www.growshopitalia.com\/en\/kit-impianto-indoor","name":"kit coltivazione"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/www.growshopitalia.com\/en\/kit-coltivazione-idroponica","name":"Hydroponic cultivation kit"}},{"@type":"ListItem","position":3,"item":{"@id":"https:\/\/www.growshopitalia.com\/en\/kit-coltivazione-idroponica-400w-pro.html","name":"HPS AGRO 400W 6 Plants Pro Lamp Kit 6 Plants Pro"}}]}</script> <script type="module" src="https://www.growshopitalia.com/static/version1725441768/frontend/Magenio/growshopitalia_hyva/en_US/js/swiper-bundle.min.js" defer crossorigin ></script> <script> (function () { "use strict"; const DIRECTIVE = "intersect"; const X_ATTR_RE = /^x-([a-z-]*)\b/i; function parseHtmlAttribute(reference) { const name = reference.name; const value = reference.value; const typeMatch = name.match(X_ATTR_RE); const valueMatch = name.match(/:([a-zA-Z0-9\-:]+)/); const modifiers = name.match(/\.[^.\]]+(?=[^\]]*$)/g) || []; return { type: typeMatch ? typeMatch[1] : null, value: valueMatch ? valueMatch[1] : null, modifiers: modifiers.map((i) => i.replace(".", "")), expression: value, }; } function getXDirectives(el) { return Array.from(el.attributes) .filter(function (attr) { return X_ATTR_RE.test(attr.name); }) .map(parseHtmlAttribute); } if (window.Alpine) { console.error("Intersect plugin must be included before AlpineJs, x-intersect will not work."); } const getLengthValue = (rawValue) => { let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/) return match ? match[1] + (match[2] || 'px') : undefined } const getRootMargin = (modifiers) => { const key = 'margin' const fallback = '0px 0px 0px 0px' const index = modifiers.indexOf(key) if (index === -1) return fallback let values = [] for (let i = 1; i < 5; i++) { values.push(getLengthValue(modifiers[index + i] || '')) } values = values.filter((v) => v !== undefined) return values.length ? values.join(' ').trim() : fallback } const getThreshhold = (modifiers) => { if (modifiers.includes("full")) return 0.8; if (modifiers.includes("half")) return 0.5; return 0; }; const AlpineIntersectionDirective = { start: function start() { Alpine.onBeforeComponentInitialized(function (component) { const legacyResolveBoundAttributes = component.resolveBoundAttributes; component.resolveBoundAttributes = function (el, initialUpdate, extraVars) { if (initialUpdate === void 0) { initialUpdate = false; } if (initialUpdate) { const attrs = getXDirectives(el); attrs.forEach(function (reference) { const type = reference.type; const expression = reference.expression; const value = reference.value; const modifiers = reference.modifiers; if (type === DIRECTIVE) { const options = { rootMargin: getRootMargin(modifiers), threshold: getThreshhold(modifiers), }; if ("IntersectionObserver" in window) { const observer = new IntersectionObserver((elements) => { elements.forEach((element) => { if (element.isIntersecting === (value === 'leave')) return component.evaluateReturnExpression(el, expression, extraVars); modifiers.includes("once") && observer.disconnect(); }); }, options); observer.observe(el); } else { component.evaluateReturnExpression(el, expression, extraVars); } } }); } return legacyResolveBoundAttributes.bind(component)(el, initialUpdate, extraVars); }; }); }, }; const initAlpine = window.deferLoadingAlpine || ((callback) => callback()); window.deferLoadingAlpine = (callback) => { AlpineIntersectionDirective.start(); initAlpine(callback); }; })();</script> <script type="module" src="https://www.growshopitalia.com/static/version1725441768/frontend/Magenio/growshopitalia_hyva/en_US/Hyva_Theme/js/alpine.min.js" defer crossorigin ></script> <script> 'use strict'; function dispatchMessages(messages, hideAfter) { const messagesEvent = new CustomEvent("messages-loaded", { detail: { messages: messages, hideAfter: hideAfter } }); window.dispatchEvent(messagesEvent); } if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } (function( hyva, undefined ) { hyva.initFormKey = () => { const inputSelector = 'input[name="form_key"]', formKey = hyva.getFormKey(); Array.from(document.querySelectorAll(inputSelector)).map(function (input) { input.value = formKey }); } hyva.initMessages = () => { try { const messages = hyva.getCookie('mage-messages'); window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; dispatchMessages(window.mageMessages); const skipSetDomain = true; hyva.setCookie('mage-messages','', -1, skipSetDomain); } catch (error) { console.warn('Error parsing Cookie Messages:', error); } } window.addEventListener('DOMContentLoaded', hyva.initFormKey); window.addEventListener('load', hyva.initMessages); }( window.hyva = window.hyva || {} ));</script> <script> 'use strict'; { const private_content_key = 'mage-cache-storage'; const private_content_expire_key = 'mage-cache-timeout'; const private_content_version_key = 'private_content_version'; const section_data_ids_key = 'section_data_ids'; const mage_cache_session_id_key = 'mage-cache-sessid'; const last_visited_store_key = 'last_visited_store'; const ttl = 3600; if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } function loadSectionData () { const browserStorage = hyva.getBrowserStorage(); if (!browserStorage) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Please enable LocalStorage in your browser." }] ); return; } try { let isInvalid = false; if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { isInvalid = true; } hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); if (!hyva.getCookie(mage_cache_session_id_key)) { isInvalid = true; const skipSetDomain = true; const days = false; hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) } const cookieVersion = hyva.getCookie(private_content_version_key); const storageVersion = browserStorage.getItem(private_content_version_key); if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { isInvalid = true; } const privateContentExpires = browserStorage.getItem(private_content_expire_key); if (privateContentExpires && new Date(privateContentExpires) < new Date()) { browserStorage.removeItem(private_content_key); } if (isInvalid) { fetchPrivateContent([]); } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); if ( privateContent && privateContentExpires && privateContent.cart && privateContent.customer ) { dispatchPrivateContent(privateContent); } else { fetchPrivateContent([]); } } else { dispatchPrivateContent({}); } } catch (error) { console.warn('Error retrieving Private Content:', error); } } window.addEventListener('load', loadSectionData); window.addEventListener('reload-customer-section-data', loadSectionData); function dispatchPrivateContent(data) { const privateContentEvent = new CustomEvent("private-content-loaded", { detail: { data: data } }); window.dispatchEvent(privateContentEvent); } function fetchPrivateContent(sections) { fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } }) .then(response => response.json()) .then( data => { if (data) { try { const browserStorage = hyva.getBrowserStorage(); const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}'); if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { delete oldSectionData['checkout-data']; } const newSectionData = Object.assign(oldSectionData, data); dispatchPrivateContent(newSectionData); if (newSectionData.messages && newSectionData.messages.messages ) { newSectionData.messages.messages = []; } browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); browserStorage.setItem(private_content_expire_key, expiresAt); const newCookieVersion = hyva.getCookie(private_content_version_key); browserStorage.setItem(private_content_version_key, newCookieVersion); hyva.setCookie( section_data_ids_key, JSON.stringify( Object.keys(data).reduce((sectionDataIds, sectionKey) => { sectionDataIds[sectionKey] = data[sectionKey]['data_id']; return sectionDataIds; }, {}) ), false, true ); } catch (error) { console.warn("Couldn't store privateContent", error); } } } ); } }</script><script> (() => { document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); })()</script> <script> (events => { const dispatchUserInteractionEvent = () => { events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) window.dispatchEvent(new Event('init-external-scripts')) }; events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown'])</script> <script> function initCompareOnProductList() { return { addToCompare(productId) { const formKey = document.querySelector('input[name=form_key]').value; const postUrl = BASE_URL + 'catalog/product_compare/add/'; fetch(postUrl, { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, "body": "form_key="+ formKey + "&product="+productId+"&uenc="+btoa(window.location.href), "method": "POST", "mode": "cors", "credentials": "include" }).then(function (response) { if (response.redirected) { window.location.href = response.url; } }).catch(function (error) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: error }], 5000 ); }); } }; }</script> <script> function initWishlist() { return { addToWishlist(productId) { const formKey = hyva.getFormKey(); fetch(BASE_URL + "wishlist/index/add/", { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, "body": "form_key="+ formKey + "&product="+productId+"&uenc="+btoa(window.location.href), "method": "POST", "mode": "cors", "credentials": "include" }).then(function (response) { if (response.redirected) { window.location.href = response.url; } else if (response.ok) { return response.json(); } else { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Could not add item to wishlist." }], 5000 ); } }).then(function (response) { if (!response) { return } typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: (response.success) ? "success" : "error", text: (response.success) ? "Product has been added to your Wish List." : response.error_message }], 5000 ); const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data"); window.dispatchEvent(reloadCustomerDataEvent); }).catch(function (error) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: error }], 5000 ); }); } } }</script> <script> function initSwatchOptions(swatchConfig) { return { swatchConfig, getAttributeSwatchData(attributeId) { const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); return swatchConfig; }, getAllAttributeOptions(attributeId) { return ( this.optionConfig.attributes[attributeId] && this.optionConfig.attributes[attributeId].options ) || [] }, optionIsActive(attributeId, optionId) { return !!this.getAllowedAttributeOptions(attributeId).find( option => option.id === optionId ) }, optionIsEnabled(attributeId, optionId) { for (const productId in this.optionConfig.index) { if (this.optionConfig.index[productId][attributeId] === optionId) { return true; } } return false; }, mapSwatchTypeNumberToTypeCode(typeNumber) { switch ("" + typeNumber) { case "1": return "color" case "2": return "image" case "3": return "empty" case "0": default: return "text" } }, getTypeOfFirstOption(attributeId) { for (const optionId in this.swatchConfig[attributeId]) { const option = this.swatchConfig[attributeId][optionId]; if (typeof option.type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(option.type); } } }, getVisualSwatchType(attributeId, targetOptionId) { const config = this.swatchConfig[attributeId]; if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); } return this.getTypeOfFirstOption(attributeId); }, getSwatchType(attributeId, optionId) { if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); } const type = this.swatchConfig[attributeId] && this.swatchConfig[attributeId].details && this.swatchConfig[attributeId].details.swatch_input_type || "empty"; return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; }, isTextSwatch(attributeId, optionId) { return this.getSwatchType(attributeId, optionId) === 'text'; }, isVisualSwatch(attributeId, optionId) { const type = this.getSwatchType(attributeId, optionId); return ['image', 'color'].includes(type); }, getSwatchBackgroundStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value; } else if (type === "image") { return "background: #ffffff url('" + config.value + "') no-repeat center"; } else { return ''; } }, getSwatchText(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); }, getOptionLabelFromOptionConfig(attributeId, optionId) { const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); return option && option[0] && option[0].label ||''; }, getSwatchConfig(attributeId, optionId) { return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] ? this.swatchConfig[attributeId][optionId] : false; }, activeTooltipItem: false, tooltipPositionElement: false, isTooltipVisible() { return this.activeTooltipItem && this.getSwatchConfig( this.activeTooltipItem.attribute, this.activeTooltipItem.item ); }, getTooltipImageStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value + '; width: 110px; height: 90px;'; } else if (type === "image") { return "background: #ffffff url('" + config.thumb + "') center center no-repeat; width: 110px; height: 90px;"; } else { return 'display:none'; } }, getTooltipPosition() { return this.tooltipPositionElement ? `top: ${this.tooltipPositionElement.offsetTop}px;` + `left: ${ this.tooltipPositionElement.offsetLeft - ( this.tooltipPositionElement.closest('.snap') && this.tooltipPositionElement.closest('.snap').scrollLeft || 0 ) }px;` : '' }, getTooltipLabel() { return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label }, focusedLabel: false, focusLabel(optionId) { this.focusedLabel = optionId; }, blurLabel() { this.focusedLabel = false; }, showSwatches: false, initShowSwatchesIntersect() { if ('IntersectionObserver' in window && !window.scrollY) { const io = new IntersectionObserver( entries => { entries.map(entry => { if (entry.isIntersecting) { this.showSwatches = true; io.unobserve(this.$el); } }) } ); io.observe(this.$el); } else { this.showSwatches = true } } } }</script> <script> function initConfigurableOptions(productId, optionConfig) { function findPathParam(key) { const baseUrl = (BASE_URL.substr(0, 2) === '//' ? 'http:' : '') + BASE_URL; const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); for (let i = 0; i < pathParts.length; i += 2) { if (pathParts[i] === key && pathParts.length > i) { return pathParts[i + 1]; } } } return { optionConfig, productId, itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), allowedAttributeOptions: [], selectedValues: [], init() { this.findAllowedAttributeOptions(); this.$nextTick(() => { if (this.itemId && typeof this.optionConfig.defaultValues === 'object') { for (const [optionId, value] of Object.entries(this.optionConfig.defaultValues)) { this.changeOption(optionId, value + ''); } } }); }, findSimpleIndex() { this.productIndex = this.calculateSimpleIndexForFullSelection(this.selectedValues); }, calculateSimpleIndexForFullSelection(selectedValues) { const productIndexes = this.optionConfig.index; return Object.keys(productIndexes).find(productIndex => { const productCandidateOptions = productIndexes[productIndex]; for (const productOption in productCandidateOptions) { if ( ! selectedValues[productOption] || selectedValues[productOption] !== productCandidateOptions[productOption] ) { return false; } } return productIndex; }); }, productIndex: 0, findAllowedAttributeOptions() { this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); }, calculateAllowedAttributeOptions(selectedValues) { const allAttributes = this.optionConfig.attributes; const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { return a.position - b.position }); const productIndexes = this.optionConfig.index; let previousOption = false; let availableIndexes = Object.keys(productIndexes); const newAllowedAttributeOptions = []; allAttributesSorted.forEach(attribute => { if (previousOption && selectedValues[previousOption]) { availableIndexes = availableIndexes.filter(availableIndex => { return productIndexes[availableIndex][previousOption] === selectedValues[previousOption] }) } newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { return !!option.products.find(product => { return availableIndexes.includes(product); }) }); previousOption = attribute.id; }); return newAllowedAttributeOptions; }, findAttributeByOptionId(optionId) { for (const attributeId in this.optionConfig.attributes) { const attributeOptions = this.optionConfig.attributes[attributeId].options || []; if (attributeOptions.find(option => option.id === optionId)) { return attributeId; } } }, getAllowedAttributeOptions(attributeId) { return this.allowedAttributeOptions[attributeId] || [] }, getProductIdsForOption(option) { const attributeId = this.findAttributeByOptionId(option.id); const allOptions = this.optionConfig.attributes[attributeId]; const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); return opt && opt.products ? opt.products : []; }, findProductIdsForPartialSelection(optionSelection) { const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { const newCandidates = this.getProductIdsForOption({id: optionId}); return candidates === null ? newCandidates : candidates.filter(productId => newCandidates.includes(productId)); }, null); return candidateProducts || []; }, findCheapestProductForPartialSelection(optionSelection) { const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); return candidateProducts.reduce((cheapest, simpleIdx) => { if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount ? simpleIdx : cheapest; }, 0) }, findProductIdToUseForOptionPrice(option) { const attributeId = this.findAttributeByOptionId(option.id); const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); }, getAttributeOptionLabel(option) { const optionProduct = this.findProductIdToUseForOptionPrice(option); if ((! optionProduct) || (optionProduct === this.productIndex)) { return option.label; } const currentPrice = this.getOptionPriceAdjustmentBasePrice(); if (this.optionConfig.optionPrices[optionProduct]) { const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; if (optionPrice !== currentPrice){ return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); } } return option.label; }, getOptionPriceAdjustmentBasePrice() { if (this.optionConfig.optionPrices[this.productIndex]) { return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount } const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues); return this.optionConfig.optionPrices[cheapestForSelection] ? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount : this.optionConfig.prices.finalPrice.amount; }, changeOption(optionId, value) { this.selectedValues[optionId] = value; this.findSimpleIndex(); this.findAllowedAttributeOptions(); this.updatePrices(); this.updateGallery(); window.dispatchEvent( new CustomEvent( 'configurable-selection-changed', { detail: { productId: this.productId, optionId: this.optionId, value: this.value, productIndex: this.productIndex, selectedValues: this.selectedValues } } ) ); }, calculateIsMinimalPrice() { return ( this.selectedValues.filter(value => !!value).length < Object.keys(this.optionConfig.attributes).length ); }, updatePrices() { const value = this.productIndex ? this.optionConfig.optionPrices[this.productIndex] : this.optionConfig.prices; window.dispatchEvent( new CustomEvent( "update-prices-" + this.productId, { detail: Object.assign( value, { isMinimalPrice: this.calculateIsMinimalPrice() } ) } ) ); }, updateGallery () { const value = this.productIndex ? this.optionConfig.images[this.productIndex] : Object.values(this.optionConfig.images)[0]; value && window.dispatchEvent( new CustomEvent( "update-gallery", { detail: value } ) ); }, onGetCartData(data) { this.preselectCartItems(data); this.preselectQuerystringItems(); this.preselectLocationHashItems(); }, preselectCartItems(data) { const cart = data && data.cart; if (cart && cart.items) { const cartItem = cart.items.find((item) => { return ( item.item_id === this.itemId && item.product_id === this.productId ) }); if (cartItem && cartItem.options && cartItem.options.length) { cartItem.options.map(option => { this.changeOption(option.option_id, option.option_value); }) } } }, preselectQuerystringItems() { const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); Object.values(this.optionConfig.attributes).map(attribute => { urlQueryParams.get(attribute.code) && this.changeOption(attribute.id, urlQueryParams.get(attribute.code)); }); }, preselectLocationHashItems() { const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); Object.values(this.optionConfig.attributes).map(attribute => { urlHashParams.get(attribute.id) && this.changeOption(attribute.id, urlHashParams.get(attribute.id)); }); } } }</script> <script defer> 'use strict'; (() => { const equalizeButtonWidths = (buttons) => { const buttonList = buttons.querySelectorAll('[data-element="link"], [data-element="empty_link"]'); let buttonMinWidth = 0; buttonList.forEach(button => { const buttonWidth = button.offsetWidth; if (buttonWidth > buttonMinWidth) { buttonMinWidth = buttonWidth; } }); buttonList.forEach(button => { button.style.minWidth = `${buttonMinWidth}px`; }); }; window.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('[data-content-type="buttons"][data-same-width="true"]').forEach(buttons => { equalizeButtonWidths(buttons); }); }); })();</script> <script defer> 'use strict'; (() => { const initCarousels = (elements) => { if (!Glider) { return; } const initProductCarousel = (carousel) => { const gliderElement = carousel.querySelector('[data-role="glider-content"]'); if (!gliderElement) { return; } const gliderDots = carousel.querySelector('.glider-dots'); const gliderPrev = carousel.querySelector('.glider-prev'); const gliderNext = carousel.querySelector('.glider-next'); const glider = new Glider(gliderElement, { slidesToShow: 2, slidesToScroll: 2, scrollLock: true, draggable: true, dragVelocity: 2.5, dots: gliderDots, arrows: { prev: gliderPrev, next: gliderNext, }, responsive: [ { breakpoint: 768, settings: { slidesToShow: 3, slidesToScroll: 3, } }, { breakpoint: 1024, settings: { slidesToShow: 4, slidesToScroll: 4, } }, ], }); carousel.classList.remove('overflow-x-scroll'); gliderPrev.classList.remove('hidden'); gliderNext.classList.remove('hidden'); if (carousel.dataset.autoplay !== 'false') { gliderAutoplay( glider, carousel.dataset.autoplaySpeed, carousel.dataset.infiniteLoop ); } }; const initSliderCarousel = (slider) => { slider.innerHTML = `<div data-role="glider-content">${slider.innerHTML}</div>`; slider.classList.add('glider-contain'); slider.insertAdjacentHTML( 'beforeend', '\u0020\u003Cdiv\u0020class\u003D\u0022carousel\u002Dnav\u0020flex\u0020items\u002Dcenter\u0020justify\u002Dcenter\u0020flex\u002D1\u0020p\u002D4\u0022\u003E\u003Cbutton\u0020aria\u002Dlabel\u003D\u0022Previous\u0022\u0020class\u003D\u0022glider\u002Dprev\u0020w\u002D8\u0020h\u002D8\u0020mr\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u003Csvg\u0020viewBox\u003D\u00220\u00200\u00201024\u00201024\u0022\u003E\u003Cpath\u0020class\u003D\u0022path1\u0022\u0020d\u003D\u0022M716.8\u00201024c6.552\u00200\u002013.102\u002D2.499\u002018.101\u002D7.499\u00209.998\u002D9.997\u00209.998\u002D26.206\u00200\u002D36.203l\u002D442.698\u002D442.698\u0020442.698\u002D442.699c9.998\u002D9.997\u00209.998\u002D26.206\u00200\u002D36.203s\u002D26.206\u002D9.998\u002D36.203\u00200l\u002D460.8\u0020460.8c\u002D9.998\u00209.997\u002D9.998\u002026.206\u00200\u002036.203l460.8\u0020460.8c5\u00205\u002011.55\u00207.499\u002018.102\u00207.499z\u0022\u003E\u003C\u002Fpath\u003E\u003C\u002Fsvg\u003E\u003C\u002Fbutton\u003E\u0020\u003Cdiv\u0020role\u003D\u0022tablist\u0022\u0020class\u003D\u0022glider\u002Ddots\u0020select\u002Dnone\u0020flex\u0020flex\u002Dwrap\u0020mx\u002D1\u0020justify\u002Dcenter\u0020p\u002D0\u0020focus\u003Aoutline\u002Dnone\u0022\u003E\u003C\u002Fdiv\u003E\u003Cbutton\u0020aria\u002Dlabel\u003D\u0022Next\u0022\u0020class\u003D\u0022glider\u002Dnext\u0020w\u002D8\u0020h\u002D8\u0020ml\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u003Csvg\u0020viewBox\u003D\u00220\u00200\u00201024\u00201024\u0022\u003E\u003Cpath\u0020class\u003D\u0022path1\u0022\u0020d\u003D\u0022M256\u00201024c\u002D6.552\u00200\u002D13.102\u002D2.499\u002D18.101\u002D7.499\u002D9.998\u002D9.997\u002D9.998\u002D26.206\u00200\u002D36.203l442.698\u002D442.698\u002D442.698\u002D442.699c\u002D9.998\u002D9.997\u002D9.998\u002D26.206\u00200\u002D36.203s26.206\u002D9.998\u002036.203\u00200l460.8\u0020460.8c9.998\u00209.997\u00209.998\u002026.206\u00200\u002036.203l\u002D460.8\u0020460.8c\u002D5\u00205\u002D11.55\u00207.499\u002D18.102\u00207.499z\u0022\u003E\u003C\u002Fpath\u003E\u003C\u002Fsvg\u003E\u003C\u002Fbutton\u003E\u003C\u002Fdiv\u003E' ); const gliderElement = slider.querySelector('[data-role="glider-content"]'); const gliderDots = slider.querySelector('.glider-dots'); const gliderPrev = slider.querySelector('.glider-prev'); const gliderNext = slider.querySelector('.glider-next'); const glider = new Glider(gliderElement, { slidesToShow: 1, slidesToScroll: 1, scrollLock: true, scrollLockDelay: 250, draggable: true, dragVelocity: 2.5, dots: gliderDots, arrows: { prev: gliderPrev, next: gliderNext, }, }); slider.classList.add('glider-initialized'); if (slider.dataset.showArrows === 'true') { gliderPrev.classList.remove('hidden'); gliderNext.classList.remove('hidden'); } if (slider.dataset.autoplay !== 'false') { gliderAutoplay( glider, slider.dataset.autoplaySpeed, slider.dataset.infiniteLoop ); } }; const gliderAutoplay = (glider, milliseconds, loop) => { const pagesCount = glider.track.childElementCount; let slideTimeout = null; let nextIndex = 1; let paused = false; const slide = () => { slideTimeout = setTimeout( () => { if (loop && nextIndex >= pagesCount) { nextIndex = 0; } glider.scrollItem(nextIndex); }, parseInt(milliseconds) ); }; glider.ele.addEventListener('glider-animated', () => { nextIndex = glider.slide + glider.opt.slidesToScroll; window.clearInterval(slideTimeout); if (!paused && (loop || nextIndex < pagesCount)) { slide(); } }); const pause = () => { if (!paused) { clearInterval(slideTimeout); paused = true; } }; const unpause = () => { if (paused) { slide(); paused = false; } }; glider.ele.parentElement.addEventListener('mouseover', pause, {passive: true}); glider.ele.parentElement.addEventListener('touchstart', pause, {passive: true}); glider.ele.parentElement.addEventListener('mouseout', unpause, {passive: true}); glider.ele.parentElement.addEventListener('touchend', unpause, {passive: true}); slide(); }; elements.forEach(element => { if (element.dataset.contentType === 'products') { initProductCarousel(element); } if (element.dataset.contentType === 'slider') { initSliderCarousel(element); } }); }; window.addEventListener('DOMContentLoaded', () => { const carouselElements = document.querySelectorAll( `[data-content-type="products"][data-appearance="carousel"], [data-content-type="slider"]` ); if (carouselElements.length > 0) { const script = document.createElement('script'); script.type = 'text/javascript'; script.addEventListener('load', () => { initCarousels(carouselElements); }); script.src = 'https\u003A\u002F\u002Fwww.growshopitalia.com\u002Fstatic\u002Fversion1725441768\u002Ffrontend\u002FMagenio\u002Fgrowshopitalia_hyva\u002Fen_US\u002FHyva_PageBuilder\u002Fjs\u002Fglider.min.js'; document.head.appendChild(script); } }); })();</script> <script defer> 'use strict'; (() => { const initMaps = (elements) => { const renderMap = (element) => { const dataLocations = element.dataset.locations; if (!dataLocations || dataLocations === '[]') { element.classList.add('hidden'); return; } const map = new google.maps.Map( element, getMapOptions( element.dataset.showControls !== 'true', element.dataset.showControls === 'true' ) ); const locations = JSON.parse(dataLocations); const latitudeLongitudeBounds = new google.maps.LatLngBounds(); const bounds = []; locations.forEach(location => { const position = { lat: parseFloat(location.position.latitude), lng: parseFloat(location.position.longitude), }; bounds.push(position); const infowindow = new google.maps.InfoWindow({ content: getInfoWindowContent(location), }); const marker = new google.maps.Marker({ position: position, map, title: location.location_name, }); marker.addListener('click', () => { infowindow.open(map, marker); }); }); if (bounds.length > 1) { bounds.forEach(function (bound) { latitudeLongitudeBounds.extend(bound); }); map.fitBounds(latitudeLongitudeBounds); } if (bounds.length === 1) { map.setCenter(bounds[0]); } }; const getMapOptions = (disableDefaultUI, mapTypeControl) => { const style = ''; return { zoom: 8, scrollwheel: false, disableDoubleClickZoom: false, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DEFAULT, }, styles: style ? JSON.parse(style) : [], disableDefaultUI: disableDefaultUI, mapTypeControl: mapTypeControl, }; }; const getInfoWindowContent = (location) => { const title = location.location_name ? `<h3 class="text-2xl font-medium text-gray-900 title-font">${location.location_name}</h3>` : ''; const comment = location.comment ? `<p class="px-1 pt-3 text-primary">${location.comment}</p>` : ''; const phone = location.phone ? `<p class="px-1 pt-3 text-primary">Phone: ${location.phone}</p>` : ''; const street = location.address ? `${location.address}<br/>` : ''; const city = location.city ? `${location.city}<br/>` : ''; const state = location.state ? `${location.state}<br/>` : ''; const zipCode = location.zipcode ? `${location.zipcode}<br/>` : ''; const country = location.country ? location.country : ''; return `<div> ${title} ${comment} ${phone} <p class="px-1 pt-3 text-primary"> ${street} ${city} ${state} ${zipCode} ${country}</p></div>`; }; const hideAllMaps = () => { document.querySelectorAll('[data-content-type="map"]').forEach(element => { element.classList.add('hidden'); }); }; window.gm_authFailure = () => { hideAllMaps(); }; if (typeof google.maps === 'undefined') { hideAllMaps(); return; } elements.forEach(element => { if (element.dataset.contentType === 'map') { renderMap(element); } }); }; window.addEventListener('DOMContentLoaded', () => { const mapElements = document.querySelectorAll('[data-content-type="map"]'); if (mapElements.length > 0) { const script = document.createElement('script'); script.type = 'text/javascript'; script.addEventListener('load', () => { initMaps(mapElements); }); script.src = 'https\u003A\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fjs\u003Fv\u003D3\u0026key\u003D'; document.head.appendChild(script); } }); })();</script> <script defer> 'use strict'; (() => { const initParallaxImage = (element) => { if (!window.jarallax) { return; } element.classList.add('jarallax'); element.dataset.jarallax = ''; const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5; const elementStyle = window.getComputedStyle(element); window.jarallax(element, { imgPosition: elementStyle.backgroundPosition || '50% 50%', imgRepeat: elementStyle.backgroundRepeat || 'no-repeat', imgSize: elementStyle.backgroundSize || 'cover', speed: parallaxSpeed, }); }; const initVideoBackground = (element) => { if (!window.jarallax) { return; } let slider = null; if (element.classList.contains('pagebuilder-slide-wrapper')) { const viewportElement = document.createElement('div'); slider = element.closest('[data-content-type=slider]'); viewportElement.classList.add('jarallax-viewport-element'); element.dataset.elementInViewport = '.jarallax-viewport-element'; element.appendChild(viewportElement); } element.classList.add('jarallax'); element.dataset.jarallax = ''; const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5; window.jarallax(element, { imgSrc: element.dataset.videoFallbackSrc, speed: parallaxSpeed, videoLoop: element.dataset.videoLoop, videoPlayOnlyVisible: element.dataset.videoPlayOnlyVisible, videoLazyLoading: element.dataset.videoLazyLoad, disableVideo: false, elementInViewport: element.dataset.elementInViewport && element.querySelector(element.dataset.elementInViewport), }); if (slider) { if (slider.dataset.afterChangeIsSet) { return; } slider.addEventListener('glider-loaded', () => { slider.querySelectorAll('.jarallax').forEach(videoSlide => { videoSlide.jarallax && videoSlide.jarallax.onScroll(); }); }); slider.addEventListener('glider-animated', () => { slider.querySelectorAll('.jarallax').forEach(videoSlide => { videoSlide.jarallax && videoSlide.jarallax.onScroll(); }); }); slider.dataset.afterChangeIsSet = true; } }; window.addEventListener('DOMContentLoaded', () => { const parallaxImageElements = document.querySelectorAll( `[data-content-type="row"][data-background-type="image"][data-enable-parallax="1"], [data-content-type="row"] > [data-background-type="image"][data-enable-parallax="1"]` ); const videoBackgroundsElements = document.querySelectorAll( `[data-content-type="row"][data-background-type="video"][data-enable-parallax="1"], [data-content-type="row"] > [data-background-type="video"][data-enable-parallax="1"], [data-content-type="banner"] [data-background-type="video"], [data-content-type="slide"] [data-background-type="video"]` ); if (parallaxImageElements.length > 0 || videoBackgroundsElements.length > 0) { const jarallaxScript = document.createElement('script'); jarallaxScript.type = 'text/javascript'; jarallaxScript.addEventListener('load', () => { parallaxImageElements.forEach(row => { initParallaxImage(row); }); const jarallaxVideoScript = document.createElement('script'); jarallaxVideoScript.type = 'text/javascript'; jarallaxVideoScript.addEventListener('load', () => { videoBackgroundsElements.forEach(element => { initVideoBackground(element); }); }); jarallaxVideoScript.src = 'https\u003A\u002F\u002Fwww.growshopitalia.com\u002Fstatic\u002Fversion1725441768\u002Ffrontend\u002FMagenio\u002Fgrowshopitalia_hyva\u002Fen_US\u002FHyva_PageBuilder\u002Fjs\u002Fjarallax\u002Dvideo.min.js'; document.head.appendChild(jarallaxVideoScript); }); jarallaxScript.src = 'https\u003A\u002F\u002Fwww.growshopitalia.com\u002Fstatic\u002Fversion1725441768\u002Ffrontend\u002FMagenio\u002Fgrowshopitalia_hyva\u002Fen_US\u002FHyva_PageBuilder\u002Fjs\u002Fjarallax.min.js'; document.head.appendChild(jarallaxScript); } }); })();</script> <script defer> 'use strict'; (() => { const applyShowOnHover = (element) => { const showOverlayOnHover = (element) => { const overlay = element.querySelector('.pagebuilder-overlay'); const color = overlay.dataset.overlayColor; element.addEventListener('mouseover', () => { overlay.style.backgroundColor = color; }); element.addEventListener('mouseout', () => { overlay.style.backgroundColor = 'transparent'; }); }; const showButtonOnHover = (element) => { const button = element.querySelector('.pagebuilder-banner-button'); element.addEventListener('mouseover', () => { button.style.opacity = '1'; button.style.visibility = 'visible'; }); element.addEventListener('mouseout', () => { button.style.opacity = '0'; button.style.visibility = 'hidden'; }); }; if (element.dataset.showOverlay === 'hover') { showOverlayOnHover(element); } if (element.dataset.showButton === 'hover') { showButtonOnHover(element); } }; window.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('[data-content-type="banner"],[data-content-type="slider"]').forEach(element => { applyShowOnHover(element); }); }); })();</script> <script defer> 'use strict'; (() => { document.querySelectorAll('[data-content-type="tab-item"]').forEach(tabItem => { tabItem.setAttribute('x-show', `tab === '${tabItem.id}'`); }); document.querySelectorAll('[data-content-type="tabs"]').forEach(tab => { const defaultActiveTab = parseInt(tab.dataset.activeTab) || 0; tab.querySelectorAll('.tab-header').forEach((tabHeader, index) => { const tabLink = tabHeader.querySelector('a'); const tabId = tabLink.getAttribute('href').replace('#', ''); tabHeader.setAttribute(':class', `{ 'active': tab === '${tabId}' }`); tabLink.setAttribute('x-on:click.prevent', `tab = '${tabId}'`); if (index === defaultActiveTab) { tab.setAttribute('x-data', `{ tab: '${tabId}' }`); } }); }); })();</script> <script> 'use strict'; (function() { const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LdMoTUeAAAAAPewqPBGGTxK3IcFELTLYkVDciKH"; const loadRecaptchaScript = (event) => { if (typeof window.grecaptcha !== 'undefined' || !event.target.form) { return } let script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', recaptchaUrl); document.head.appendChild(script); } document.body.addEventListener("input", loadRecaptchaScript, { once: true }); document.body.addEventListener("focus", loadRecaptchaScript, { once: true }); }());</script> <script> (payload => { dataLayer.push(payload); })({"payload":"detail"});</script><script> (() => { const { fetch: originalFetch } = window; window.fetch = async (...args) => { let [resource, config ] = args; let targetUrl = (resource instanceof Request) ? resource.url : resource.toString(); const response = await originalFetch(resource, config); const json = () => response.clone().json().then((data) => { switch (true) { case -1 !== targetUrl.indexOf('removeItem'): if (data.hasOwnProperty('dataLayer') && 'undefined' !== typeof dataLayer) { AEC.Cookie.remove(data.dataLayer).push(dataLayer); } break; } return data; }); response.json = json; return response; }; /** * Custom variants */ AEC.EventDispatcher.on('ec.variants', variants => { if (!variants.length) { [...document.querySelectorAll('[name^="super_attribute"')].forEach(input => { if (input.parentNode.classList.contains('border-primary')) { var name = input.getAttribute('name'), id = name.substring(name.indexOf('[') + 1, name.lastIndexOf(']')); Object.entries(AEC.SUPER).forEach(([key, attribute]) => { if (attribute.id == id) { attribute.options.forEach(option => { if (option.value_index == input.value) { variants.push( { id: id, option: option.value_index, text: option.label }); } }); } }); } }); } }); window.addEventListener('add-to-cart', event => { let element = [...document.querySelectorAll('[data-event=add_to_cart]')].filter(node => { return node.dataset.id === event.detail.product_sku; }); if (element) { AEC.add(element[0], dataLayer); } }); window.addEventListener('cart-data-updated', event => { dataLayer.push( { event: 'update_cart', payload: event.detail.cart }); }); })();</script> <script> 'use strict'; function GoogleAnalytics () { let self = this; this.config = { isCookieRestrictionModeEnabled: 0, currentWebsite: 1, cookieName: "user_allowed_save_cookie", ordersTrackingData: [], pageTrackingData: {"optPageUrl":"","isAnonymizedIpActive":false,"accountId":"UA-60860694-1"}, } this.initGoogleAnalytics = function () { let allowServices = false, allowedCookies, allowedWebsites; if (self.config.isCookieRestrictionModeEnabled) { allowedCookies = hyva.getCookie(self.config.cookieName); if (allowedCookies !== null) { allowedWebsites = JSON.parse(decodeURIComponent(allowedCookies)); if (allowedWebsites[self.config.currentWebsite] === 1) { allowServices = true; } } } else { allowServices = true; } if (allowServices) { (function (i, s, o, g, r, a, m) { i.GoogleAnalyticsObject = r; i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.defer = 1; a.src = g; m.parentNode.insertBefore(a, m) })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); ga('create', self.config.pageTrackingData.accountId, 'auto'); if (self.config.pageTrackingData.isAnonymizedIpActive) { ga('set', 'anonymizeIp', true); } if (self.config.ordersTrackingData.hasOwnProperty('currency')) { ga('require', 'ec', 'ec.js'); ga('set', 'currencyCode', self.config.ordersTrackingData.currency); if (self.config.ordersTrackingData.products) { self.config.ordersTrackingData.products.forEach(function (value) { ga('ec:addProduct', value); }); } if (self.config.ordersTrackingData.orders) { self.config.ordersTrackingData.orders.forEach(function (value) { ga('ec:setAction', 'purchase', value); }); } ga('send', 'pageview'); } else { ga('send', 'pageview' + self.config.pageTrackingData.optPageUrl); } } }; } window.addEventListener("load", new GoogleAnalytics().initGoogleAnalytics);</script></div></body></html><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8c560cf20f1a89f2',t:'MTcyNjcxMTk0NS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>