SMART STORAGE SOLUTIONS

Add efficiency to your warehouse with intelligent space management

Contact

Mecalux: experience and innovation for your warehouse

Mecalux is one of the world’s leading intralogistics technology companies. It is at the cutting edge of warehouse automation and software development, while its metal racking systems are synonymous with quality in the industry.

We are backed by 60 years of experience, a determined commitment to innovation and — most importantly — our customers' satisfaction. Whatever the characteristics of your business, we have a storage solution for you.

Research by Mecalux and the MIT Intelligent Logistics Systems Lab shows rapid automation and AI adoption

The state of AI in warehousing

New MIT–Mecalux study finds AI now embedded in 60% of warehouses, reshaping productivity and workforce models worldwide

Request the MIT Report here

Case Studies

Adidas

The Adidas sportswear and footwear store in Pennsylvania, USA

Adidas, the popular footwear and sportswear company, has equipped its warehouse in Pennsylvania (USA) with pallet racks and shelving for picking from Interlake Mecalux. The facility is designed for online order preparation and deliveries to retailers and sportswear shops. Read more

Adidas

DHL

Mecalux installs a new logistics centre for DHL on the outskirts of Madrid

Exemple of pallet racking and mezzanine floor for DHL in Spain developed by Mecalux and other examples of storage systems. Read more

DHL

Unilever

Mecalux has equipped the new Unilever distribution centre with pallet racking

Unilever, a multinational manufacturer of consumer goods, opens a warehouse in Uruguay that stores more than 15,000 pallets. Read more

Unilever
See more case studies

FEATURED PRODUCT

Autonomous Mobile Robots (AMRs) Autonomous Mobile Robots (AMRs)

AUTONOMOUS MOBILE ROBOTS (AMRs)

The robotic solution that streamlines internal goods transport

Automate internal material flows with Mecalux’s innovative range of AMRs. Expedite multiple intralogistics operations and boost warehouse productivity with intelligent vehicles designed to operate independently.

Discover our AMRs

MECALUX IN NUMBERS

  • 60 years

    60 years

    of experience

  • commercial network

    +70 countries

    in commercial network

  • 12 production centres

    12 production

    centres

  • 7 R&D centres

    7 R&D centres

    for technological development

Mecalux News

Go to Mecalux News

We are wherever your warehouse is

We have offices in 23 countries

SEE ALL OUR COMMERCIAL OFFICES
TURKEYOffice in Istanbul
SLOVENIAOffice in Brnik
ROMANIAOffice in Bucharest
CROATIA
POLANDOffices in Gliwice, Gdańsk, Kraków, Poznań, Warsaw and Wrocław
SLOVAKIAOffice in Bratislava
CZECH REPUBLICOffice in Prague
ITALYOffices in Milan, Padua, Rome and Turin
GERMANYOffice in Dormagen
NETHERLANDSOffice in Amsterdam
BELGIUMOffice in Brussels
FRANCEOffices in Paris, Aix-en-Provence, Bordeaux, Lille, Lyon, Nantes - Rouen, Toulouse and Strasbourg
UNITED KINGDOMOffice in Birmingham
SPAINOffices in Barcelona, Alicante, Bilbao, Córdoba, Gijón, La Coruña, Las Palmas, Madrid, Murcia, Palencia, Palma De Mallorca, Pamplona, San Sebastián, Seville, Tenerife, Valencia, Vitoria-Gasteiz and Zaragoza
PORTUGALOffices in Lisbon and Porto
BRAZILOffice in Hortolândia
URUGUAYOffice in Canelones
ARGENTINAOffice in Buenos Aires
COLOMBIAOffice in Bogotá and Cali
CHILEOffice in Santiago
MEXICOOffices in Tijuana, Guadalajara, Hermosillo, Matamoros, Mérida, Mexico City, Puebla and Monterrey
UNITED STATESOffices in Chicago, Dallas, Pontiac, San Diego and Sumter
CANADAOffice in Toronto
We are wherever your warehouse is

Some of our customers

Logo Cepsa
Novartis logo
Adidas logo
Michelin logo
An error occurred while processing the template.
The following has evaluated to null or missing:
==> officeValues["name"]  [in template "20101#20128#3282514" at line 146, column 130]

----
Tip: It's the final [] step that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${officeValues["name"]?upper_case}  [in template "20101#20128#3282514" at line 146, column 128]
----
1<#assign countryCode = (mlxExpandoService.getExpandoValueForClass("com.liferay.portal.kernel.model.Group","country-code", scopeGroupId).getString())!"" /> 
2<#assign masterName = mlxMastersHelperService.getMasterNameByLayout(layout) /> 
3 
4<!--INIT MKTG-464 SUCCESSPAGE REDESIGN(Estilos para hacer doble columna + Dark)--> 
5<style> 
6    .corporate--successpage--title, .corporate--successpage--subtitle {color:#fff!important} 
7    @media(min-width: 1300px){ 
8        .corporate--successpage--row { 
9            display:flex 
10
11        .corporate--successpage--item { 
12            max-width:50% 
13
14
15    .corporate--successpage *{ 
16        color: #fff 
17
18    .corporate--successpage{ 
19        background-color: #333!important 
20
21    .corporate--successpage--item-card { 
22        background-color: #444!important 
23
24    .corporate--successpage--description a { 
25        color: #fa6900 !important; 
26
27     
28    .corporate--successpage--description a:hover { 
29         color: #ff9549 !important 
30
31    </style> 
32    <!--END MKTG-464--> 
33     
34     
35    <#assign privacyMasterId = 46002 /> 
36     
37    <#assign globalGroupId = mlxConstants.getLongConstant("GroupIds","GLOBAL") /> 
38    <#assign office = '' /> 
39    <#assign siteInternationalArticleId = '3534343' /> 
40     
41    <#assign vocabularyId = mlxConstants.getLongConstant('VocabularyIds','VOCABULARY_OFFICES_COUNTRIES') /> 
42    <#assign categoryList = mlxAssetHelperService.getAssetCategoriesByVocabularyId(vocabularyId) /> 
43    <#assign currentOfficesCategory = 0 /> 
44     
45    <#assign language_id = themeDisplay.getLanguageId() /> 
46     
47    <#list categoryList as cat> 
48        <#if cat.description?contains(">"+countryCode+"<")> 
49            <#assign currentOfficesCategory = cat.categoryId />      
50        </#if> 
51    </#list> 
52     
53    <#assign telValue=mlxPhoneUtilService.getTelephone(mlxServiceContext)/> 
54    <#assign telDash = telValue?replace(" - ", " ")?replace(" ", "-")?replace("(", "")?replace(")", "") /> 
55     
56    <#assign cdn = (mlxUrlUtilService.getCdn(groupId))!"" /> <#-- AÑADIR CDN -->  
57 
58    <div id="corporate--v3--contact-form--v1" class="corporate--contact-us"  
59        data-gtm-event="form"  
60    	data-gtm-event-category="${ctaOriginParam!'CTA_Default'}"  
61    	data-gtm-event-ctaorigin="${ctaOriginParam!'CTA_Default'}"  
62    	data-gtm-event-gaformid="${mlxForm["gaFormId"]!''}"   
63    	data-gtm-event-formType="${mlxForm.getType()!''}"  
64    	data-gtm-event-formPosition="footer"  
65        data-js-form  
66        data-js-form-type="${mlxForm.getPopup()}"> 
67        <#-- Cambiar url del background por una de la document library cuando esté, de momento pongo la url de PRO actual --> 
68        <figure class="corporate--contact-us--figure">             
69            <#assign imgWidth = '2048'> 
70            <#assign imgUrl = '/documents/20128/3352716/10_contacta_bkg.jpg'> 
71            <#assign imgClass = 'corporate--contact-us--figure-image'> 
72            <#assign urlParamConcat = imgUrl?contains("?")?then("&","?")> 
73             
74            ${corporate.img(cdn + imgUrl + urlParamConcat + 'imwidth=' + imgWidth + '', true,  
75                            'alt="background contact"', 'class="' + imgClass + '" srcset="' + cdn + imgUrl + urlParamConcat + 'imwidth=640&imdensity=1 640w,' +  
76                                        cdn + imgUrl + urlParamConcat + 'imwidth=1024&imdensity=1 1024w,' +  
77                                        cdn + imgUrl + urlParamConcat + 'imwidth=2048&imdensity=1 2048w"')} 
78             
79        </figure> 
80        <div class="corporate--contact-us--container"> 
81            <div class="corporate--contact-us--info-section"> 
82            <p class="corporate--contact-us--title">${(i18nLabels["supra_title"])}</p> 
83            <ul class="corporate--contact-us--info-list"> 
84                <p class="corporate--contact-us--subtitle">${(i18nLabels["title"])}</p> 
85                <#-- Cambiar url del icono phone por una de la document library cuando esté, de momento pongo la url de PRO actual y tambien mirar de poner bien el alt --> 
86                <li class="corporate--contact-us--info-list--item"><span class="corporate--contact-us--info--icon">${corporate.img(cdn+'/documents/20128/3352716/10_contacta_ico_phone.svg/2eb57424-7250-dff9-7f15-812b2807b653', true, 'alt="$titlePhone" class="corporate--contact-us--icon"')}</span> 
87                <a class="corporate--contact-us--title-highlighted" href="tel:${telDash}" dir="ltr" rel="nofollow">${telValue}</a> 
88                </li> 
89                <#--<#if (offices?has_content)> --> 
90                <p class="corporate--contact-us--subtitle"> 
91                    <@corporate.mlxlanguage key="mlx.contactv3.offices.subtitle" /> 
92                </p> 
93                <#-- Cambiar url del icono location por una de la document library cuando esté, de momento pongo la url de PRO actual y tambien mirar de poner bien el alt --> 
94                <li class="corporate--contact-us--info-list--item"><span class="corporate--contact-us--info--icon">${corporate.img(cdn+'/documents/20128/3352716/10_contacta_ico_location.svg/4d23278d-3bf3-a723-0382-89edd823f884', true, 'alt="$titleLocation" class="corporate--contact-us--icon"')}</span> 
95                <#-- #set($article = $mlxHelperLocalServiceUtil.getArticleByAssetUrl($assetUrl, $globalGroupId, "$locale")) --> 
96                <ul class="corporate--contact-us--office-list"> 
97                     
98     
99                    <#assign language_id = themeDisplay.getLanguageId() /> 
100                    <#assign offices = mlxSalesOfficeService.getOfficesMapByCategoryId(3705718, language_id, groupId) /> 
101 
102                    <#if offices?has_content> 
103 
104                        <#list offices as key, value> 
105 
106                            <#list value as keyChild, valueChild> 
107 
108                                <#assign office = (mlxUrlUtilService.getJournalArticleByUrl(keyChild, locale, groupId, true))!"" /> 
109                                     
110                                <#if office?has_content> 
111                                 
112                                    <#assign officeValues = mlxJournalHelperService.getStructureFieldValues(office, languageId) /> 
113 
114                                    <#if key?index == 0> 
115 
116                                        <!--MAIN OFFICE--> 
117                                        <#assign globalContent = jsonFactoryUtil.createJSONObject(officeValues["contentWebFromGlobal"]) /> 
118                                        <#assign contentFromGlobalClassPK = globalContent.classPK />   
119                                        <#assign ja = mlxAssetHelperService.fetchLatestApprovedArticle(contentFromGlobalClassPK?number)/> 
120                                        <#assign jaMapStrValues = mlxJournalHelperService.getStructureFieldValues(ja, languageId) /> 
121                                         
122                                        <li class="corporate--contact-us--office-list--item"><span class="corporate--contact-us--office--name">${officeValues["name"]?upper_case}</span> <p class="corporate--contact-us--office--location">${jaMapStrValues["street_address"]} ${jaMapStrValues["extended_street_address"]}${jaMapStrValues["postal_code"]?has_content?then(' - '+jaMapStrValues["postal_code"],"")}, ${jaMapStrValues["locality"]}</p></li> 
123                                    <#else> 
124                                        <#assign ctgs = mlxAssetHelperService.getAssetCategoryListByJournalArticle(office) /> 
125                                        <#list ctgs as cat> 
126                                            <!--OTHER OFFICES DESTACADAS DE LA HOME--> 
127                                            <#if cat.categoryId?number == 3705718> <#-- "Oficina Destacada Home"--> 
128                                            <#assign globalContent = jsonFactoryUtil.createJSONObject(officeValues["contentWebFromGlobal"]) /> 
129                                            <#assign contentFromGlobalClassPK = globalContent.classPK />   
130                                            <#assign ja = mlxAssetHelperService.fetchLatestApprovedArticle(contentFromGlobalClassPK?number)/> 
131                                            <#assign jaMapStrValues = mlxJournalHelperService.getStructureFieldValues(ja, languageId) /> 
132 
133                                                <li class="corporate--contact-us--office-list--item"><span class="corporate--contact-us--office--name">${officeValues["name"]?upper_case}</span> <p class="corporate--contact-us--office--location">${jaMapStrValues["street_address"]} - ${jaMapStrValues["extended_street_address"]} ${jaMapStrValues["postal_code"]}, ${jaMapStrValues["locality"]}</p></li>   
134                                            </#if> 
135                                        </#list> 
136                                    </#if> 
137                                </#if> 
138                            </#list> 
139                        </#list> 
140                    <#else> 
141                        <!--INTERNATIONAL OFFICE SI NO LLEGA NINGUNA OFICINA DESTACADA--> 
142 
143                        <#assign office = mlxAssetHelperService.fetchLatestApprovedArticle(globalGroupId, siteInternationalArticleId) /> 
144                        <#assign jaMapStrValues = mlxJournalHelperService.getStructureFieldValues(office, languageId) /> 
145                        <#assign officeValues = mlxJournalHelperService.getStructureFieldValues(office, languageId) /> 
146                        <li class="corporate--contact-us--office-list--item"><span class="corporate--contact-us--office--name">${officeValues["name"]?upper_case}</span> <p class="corporate--contact-us--office--location">${jaMapStrValues["street_address"]} ${jaMapStrValues["extended_street_address"]} - ${jaMapStrValues["postal_code"]}, ${jaMapStrValues["locality"]}</p></li>           
147                    </#if> 
148                     
149                    <!--VER MÁS OFICINAS--> 
150                    <#assign officeMasterId = 48003 /> 
151                    <#assign siteId = themeDisplay.getLayout().getGroupId()> 
152                    <#assign officeLayout=(mlxMastersHelperService.getLayoutByMasterAndGroup(officeMasterId,scopeGroupId)!"") /> 
153                     
154                    <#if officeLayout?has_content> 
155                        <#assign officePage = officeLayout.getFriendlyURL() /> 
156                        <li class="corporate--contact-us--office-list--viewmore"><a href="${officePage}" class="corporate--contact-us--office-list--viewmore-link"><@corporate.mlxlanguage key="mlx.contactv3.offices.see-more" /></a> 
157                        </li> 
158                    </#if> 
159     
160            </ul> 
161            </div> 
162            <div class="corporate--contact-us--form-section"> 
163            <p class="corporate--contact-us--subtitle">${(i18nLabels["sub_title"])}</p> 
164            <#--form:init--> 
165            <form action="${mlxFormSaveActionURL}" method="POST" class="formlyWrapper-Base" id="${pn!''}_contact" data-js-form-submittype="${mlxSubmit!''}"> 
166                <input name="${pn!''}utmz" type="hidden"/> 
167                <input type="hidden" id="${pn!''}g-recaptcha-response" name="${pn!''}g-recaptcha-response"> 
168                <input type="hidden" id="${pn!''}g-recaptcha-response-action" name="${pn!''}g-recaptcha-response-action" value="validate_captcha"> 
169                <div class="hide"> 
170                    <label><@corporate.mlxlanguage key="mlx.contact.adt.common.honeypot" /></label> 
171                    <input type="text" maxlength="480" id="myusername" name="${pn!''}myusername"> 
172                </div> 
173            <#--form:init--> 
174                <div class="corporate--contact-us--form--textbox" data-js="js__form-item"> 
175                    <label for="contact-name" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-name" /></label> 
176                    <input class="corporate--contact-us--form--textbox--input" name="${pn!''}contact-name" id="contact-name" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-name" />' tabindex="1" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-name" />' type="text" maxlength="40" required="required" data-js="js__form-field" data-parsley-trigger="focusout" data-parsley-required="true" data-parsley-maxlength="40" value="${(previousFormValues['contact-name'])!''}"> 
177                </div> 
178                <div class="corporate--contact-us--form--textbox" data-js="js__form-item"> 
179                    <label for="contact-surname" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-surname" /></label> 
180                    <input class="corporate--contact-us--form--textbox--input" name="${pn!''}contact-surname" id="contact-surname" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-surname" />' tabindex="2" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-surname" />' type="text" maxlength="40" required="required" data-js="js__form-field" data-parsley-trigger="focusout" data-parsley-required="true" data-parsley-maxlength="40" value="${(previousFormValues['contact-surname'])!''}"> 
181                </div> 
182                <div class="corporate--contact-us--form--textbox" data-js="js__form-item"> 
183                    <label for="contact-company" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-company" /></label> 
184                    <input class="corporate--contact-us--form--textbox--input" name="${pn!''}contact-company" id="contact-company" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-company" />' tabindex="3" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-company" />' type="text" maxlength="120" required="required" data-js="js__form-field" data-parsley-trigger="focusout" data-parsley-required="true" data-parsley-maxlength="120" value="${(previousFormValues['contact-company'])!''}"> 
185                </div> 
186                <div class="corporate--contact-us--form--textbox" data-js="js__form-item"> 
187                    <label for="contact-email" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-email" /></label> 
188                    <input class="corporate--contact-us--form--textbox--input" name="${pn!''}contact-email" id="contact-email" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-email" />' tabindex="4" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-email" />' type="email" maxlength="40" required="required" data-js="js__form-field" data-parsley-trigger="focusout" data-parsley-type='email' data-parsley-required="true" data-parsley-maxlength="100" value="${(previousFormValues['contact-email'])!''}"> 
189                </div> 
190                <div class="corporate--contact-us--form--row"> 
191                    <div class="corporate--contact-us--form--textbox-small" data-js="js__form-item"> 
192                        <label for="contact-telephone" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-telephone" /></label>   
193                        <input class="corporate--contact-us--form--textbox--input" name="${pn!''}contact-telephone" id="contact-telephone" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-telephone" />' tabindex="5" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-telephone" />' type="text" maxlength="40" required="required" data-js="js__form-field" maxlength="40" data-parsley-trigger="focusout" data-parsley-required="true" data-parsley-maxlength="40" value="${(previousFormValues['contact-telephone'])!''}"> 
194                    </div> 
195                    <div class="corporate--contact-us--form--textbox-small" data-js="js__form-item"> 
196                        <label for="contact-postcode" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-postcode" /></label> 
197                        <input class="corporate--contact-us--form--textbox--input" name="${pn!''}contact-postcode" id="contact-postcode" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-postcode" />' tabindex="6" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-postcode" />' type="text" maxlength="50" required="required" data-parsley-trigger="focusout"  data-parsley-required="true" data-parsley-maxlength="50" value="${(previousFormValues['contact-postcode'])!''}" > 
198                    </div> 
199                </div> 
200                <div class="corporate--contact-us--form--textbox" data-js="js__form-item"> 
201                <label for="contact-countryHidden" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-country" /></label> 
202                <#-- De momento el current countryCode lo pillo del campo personalizado de site contact-country-default, si hace falta cambiarlo es aqui --> 
203                <#assign countryCode = (mlxExpandoService.getExpandoValueForClass("com.liferay.portal.kernel.model.Group","country-code", scopeGroupId).getString())!"" /> 
204                <#-- Geolocalizar el pais por IP --> 
205                <#assign countryIp = (mlxGeoIpUtilService.getCountry(mlxServiceContext))!"" /> 
206                <#if !countryIp?has_content > 
207                    <#assign countryIp = countryCode /> <#-- si falla el pais por ip se pone el default --> 
208                </#if> 
209                 
210                    <select class="corporate--contact-us--form--textbox--select" tabindex="7" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-country" />' id="contact-country" name="${pn!''}contact-country"> 
211                        <#-- Obtener select de paises --> 
212                        <#assign articleCountry = mlxMastersHelperService.getJournalArticleByMasterAndGroup(countrySelectorMasterId?number, groupId) /> 
213                        <#-- Se hace un replace para poner como seleccionado o el valor previo introducido o el codigo del pais actual --> 
214                        <#assign countryOptionsHtml = htmlUtil.unescape(mlxJournalContentService.getContent(articleCountry, articleCountry.getDDMTemplateKey(),"${locale}",themeDisplay,'view'))?replace('value="${(previousFormValues["contact-country"])!countryIp}"','value="${(previousFormValues["contact-country"])!countryIp}" selected') /> 
215                        ${countryOptionsHtml} 
216                    </select> 
217                </div> 
218                <div class="corporate--contact-us--form--textbox" data-js="js__form-item"> 
219                    <label for="contact-message" class="hide"><@corporate.mlxlanguage key="mlx.contact.field.contact-message" /></label>   
220                    <#if (masterName?lower_case?contains("software"))> 
221                        <textarea class="corporate--contact-us--form--textbox--input corporate--contact-us--form--textbox--textarea" name="${pn!''}contact-message" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-message" />' id="contact-message" tabindex="8" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-message" />' maxlength="200" data-js="js__form-field" data-parsley-trigger="focusout" data-parsley-maxlength="200" data-parsley-required="true" required="required">${(previousFormValues['contact-message'])!''}</textarea> 
222                    <#else> 
223                        <textarea class="corporate--contact-us--form--textbox--input corporate--contact-us--form--textbox--textarea" name="${pn!''}contact-message" title='<@corporate.mlxlanguage key="mlx.contact.field.contact-message" />' id="contact-message" tabindex="8" placeholder='<@corporate.mlxlanguage key="mlx.contact.field.contact-message" /> <@corporate.mlxlanguage key="mlx.contact.adt.common.optional" />' maxlength="200" data-js="js__form-field" data-parsley-trigger="focusout" data-parsley-maxlength="200" >${(previousFormValues['contact-message'])!''}</textarea> 
224                    </#if> 
225                </div> 
226     
227                <div class="corporate--contact-us--form--bottom"> 
228                    <div class="corporate--contact-us--form--textbox corporate--contact-us--form--checkbox" data-js="js__form-item"> 
229                        <input id="contact-agree" name="${pn!''}contact-agree" tabindex="9" type="checkbox" data-parsley-required="true" data-parsley-trigger="change focusout" required requinetworking="" > 
230                        <label for="contact-agree"></label> 
231                        <#assign customPrivacyLayout = mlxMastersHelperService.getLayoutByMasterAndGroup(privacyMasterId, groupId) /> 
232                        <#assign customPrivacyUrl = customPrivacyLayout.getFriendlyURL(locale) /> 
233     
234                        <p class="corporate--contact-us--form--textbox-paragraph"> 
235                            <#if validator.isNotNull(i18nLabels["privacity"]!)> 
236                                ${(i18nLabels["privacity"])} 
237                            <#else> 
238                                ${languageUtil.format(locale, "mlx.contact.adt.common.agree", customPrivacyUrl + "?l=true")} 
239                            </#if> 
240                        </p> 
241                    </div> 
242                   <#-- 
243                    #set($mlxCacheUtilsService = $serviceLocator.findService("mecalux-portlet", "com.mecalux.portal.service.MlxCacheUtilLocalService")) 
244                    #set($domainDataMap = $mlxCacheUtilsService.getDomainData($groupId)) 
245                    #set($expandoAtributes = $domainDataMap.getExpandoAttributesMap()) 
246                    #set($siteName = $expandoAtributes.get('Site-name')) 
247                     
248                    #set($newsAdvice = $languageUtil.get($locale, "mlx.contact.adt.common.lssi") + $languageUtil.get($locale, "mlx.contact.adt.common.optional")) 
249                     
250                    #if($siteName.toString().toLowerCase().contains(".com") && $newsAdvice.toString().toLowerCase().contains("interlake")) 
251                        #set($newsAdvice = $newsAdvice.replace("Interlake ", ""))	 
252                    #end 
253                    --> 
254                    <#assign langCommonLssi><@corporate.mlxlanguage key='mlx.contact.adt.common.lssi' /></#assign> 
255                    <#assign langCommonOptional><@corporate.mlxlanguage key='mlx.contact.adt.common.optional' /></#assign> 
256                    <#if validator.isNotNull(i18nLabels["lssi"]!)> 
257                        <#assign newsAdvice = (i18nLabels["lssi"]) /> 
258                    <#else> 
259                        <#assign newsAdvice = langCommonLssi + " " + langCommonOptional /> 
260                    </#if> 
261                    <#assign siteName = (mlxExpandoService.getExpandoValueForClass("com.liferay.portal.kernel.model.Group","site-name", scopeGroupId).getString())!"" /> 
262                    <#if (siteName?lower_case?contains(".com") && newsAdvice?lower_case?contains("interlake")) > 
263                        <#assign newsAdvice = newsAdvice?replace("Interlake ", "") />	 
264                    </#if> 
265                    <div class="corporate--contact-us--form--textbox corporate--contact-us--form--checkbox" data-js="js__form-item">  
266                        <input id="checkLssi" name="${pn!''}checkLssi" tabindex="10" type="checkbox"> 
267                        <label for="checkLssi"></label> 
268                        <p class="corporate--contact-us--form--textbox-paragraph">${newsAdvice}</p> 
269                    </div> 
270                </div> 
271                <div class="corporate--contact-us--form--textbox">  
272                    <#if validator.isNotNull(i18nLabels["button"]!)> 
273                        <#assign buttonSumbitValue = i18nLabels["button"]> 
274                    <#else> 
275                        <#assign buttonSumbitValue><@corporate.mlxlanguage key='mlx.contact.adt.common.button.submit' /></#assign> 
276                    </#if> 
277                    <button id="submitButton" type="submit" class="corporate--contact-us--button" tabindex="11" data-js="js__form-submit">${buttonSumbitValue}</button> 
278                </div> 
279            <#-- </form> --> 
280            <#-- Imagen de cargando --> 
281            <#--<img alt="" class="sending hide" src="${cdn}/o/corporate-theme/images/common/loading2.gif">--> 
282            ${corporate.img(cdn+"/o/corporate-theme/images/common/loading2.gif", false, 'alt=""', 'title=""', 'class="sending hide"', 'loading="lazy"')} 
283            <#--form:end--> 
284			<input type="hidden" title="track-consent" name="${pn}track-consent" id="track-consent" maxlength="10"> 
285			<input id="geotowns" type="hidden" value="" name="${pn!''}geotowns"> 
286			<input id="geotowns" type="hidden" value="" name="${pn!''}geotowns"> 
287			<input id="geostates" type="hidden" value="" name="${pn!''}geostates"> 
288            </form> 
289            <#--form:end--> 
290        </div> 
291    </div> 
292</div> 
293     
294<!-- DATOS ESTRUCTURADOS SEO JSON+LD --> 
295 
296<#assign domain = themeDisplay.getPortalDomain() />  
297<#assign currentUrl = "https://"+ domain /> 
298 
299<#-- logo --> 
300<#assign logo="/documents/20128/3456912/Mecalux-logo_600x60px.jpg" /> 
301<#if (domain?contains("es")) || (domain?contains("mecalux.es")) > 
302    <#assign logo="/documents/20128/3456912/MecaluxEsmena-logo_600x60px.jpg" /> 
303</#if> 
304<#if (domain?contains("us")) || (domain?contains("interlake")) > 
305    <#assign logo="/documents/20128/3456912/InterlakeMecalux-logo_600x60px.jpg" /> 
306</#if> 
307 
308<#assign telValue=mlxPhoneUtilService.getTelephone(mlxServiceContext)/> 
309<#assign telDash = telValue?replace("+", "")?replace(" - ", " ")?replace(" ", "-")?replace("(", "")?replace(")", "") /> 
310<#assign telValue=mlxPhoneUtilService.getTelephone(mlxServiceContext)/> 
311<script type="application/ld+json"> 
312
313        "@context": "https://schema.org", 
314        "@type": "Organization", 
315        "url": "${currentUrl}", 
316        "logo": "${currentUrl}${logo}", 
317        "contactPoint": [{ 
318            "@type": "ContactPoint", 
319            "telephone": "+${telDash}", 
320            "contactType": "customer service", 
321            "areaServed": "${countryCode}", 
322            "availableLanguage": [ 
323                "${locale.getDisplayLanguage()}" 
324                <#if siteName?lower_case?contains("belgique")> 
325                    ,"Dutch" 
326                </#if> 
327                <#if siteName?lower_case?contains("mecalux.be")> 
328                    ,"French" 
329                </#if> 
330                <#if locale.getDisplayLanguage() != "English"> 
331                    ,"English" 
332                </#if> 
333
334        },{ 
335            "@type": "ContactPoint", 
336            "telephone": "+${telDash}", 
337            "contactType": "sales", 
338            "areaServed": "${countryCode}", 
339            "availableLanguage": [ 
340                "${locale.getDisplayLanguage()}" 
341                <#if siteName?lower_case?contains("belgique")> 
342                    ,"Dutch" 
343                </#if> 
344                <#if siteName?lower_case?contains("mecalux.be")> 
345                    ,"French" 
346                </#if> 
347                <#if locale.getDisplayLanguage() != "English"> 
348                    ,"English" 
349                </#if> 
350
351        }] 
352
353</script> 
354 
355<script> 
356    window.addEventListener('load', function() { 
357      var heroContactLinks = document.querySelectorAll(".corporate--hero-video--contact"); 
358      var inContentCTALinks = document.querySelectorAll(".corporate--home--hero--highlighted--third-column a"); 
359      var stickyCTALinks = document.querySelectorAll(".corporate--sticky-header--cta"); 
360     
361      function setGTMEventAttributes(category, ctaOrigin) { 
362        var contactForm = document.querySelector("#corporate--v3--contact-form--v1"); 
363        if (contactForm) { 
364          contactForm.setAttribute("data-gtm-event-category", category); 
365          contactForm.setAttribute("data-gtm-event-ctaorigin", ctaOrigin); 
366
367
368     
369      heroContactLinks.forEach(function(link) { 
370        link.addEventListener("click", function(ev) { 
371          setGTMEventAttributes("CTA_Hero", "CTA_Hero"); 
372        }); 
373      }); 
374     
375      inContentCTALinks.forEach(function(link) { 
376        link.addEventListener("click", function(ev) { 
377          setGTMEventAttributes("CTA_InContent", "CTA_InContent"); 
378        }); 
379      }); 
380     
381      stickyCTALinks.forEach(function(link) { 
382        link.addEventListener("click", function(ev) { 
383          setGTMEventAttributes("CTA_Sticky", "CTA_Sticky"); 
384        }); 
385      }); 
386    }); 
387</script>