Více než 870 000 spokojených pacientů v celé Evropě

přílohy

Arnstadt – VIVISOL Kundenservicezentrum

VIVISOL Deutschland GmbH

Hinterm Stadion 1, 99310 Arnstadt

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Augsburg

ATEMCENTER AUGSBURG AM DIAKO

Montag bis Donnerstag: 9.00 – 12.00 Uhr und 13.00 – 17.00 Uhr

Freitag: 9.00 – 12.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Frölichstraße 17, 86150 Augsburg

Tel: 0821 5083 5950

Fax: 03628 9211 903

Email:

Bad Reichenhall

Wichtige Mitteilung:

Dieser Standort ist dauerhaft geschlossen. Die medizinische Versorgung für Patienten aus der Region Bad Reichenhall erfolgt ab sofort durch das neue VIVISOL AtemCenter Salzburg in Himmelreich. Erhalten Sie Maskenanpassung, Zubehör und Schulung direkt am Standort Salzburg.

AtemCenter Salzburg, Ludwig-Bieringer-Platz 1, 5071 Himmelreich

Tel: +43 1 524 62 83 441

Fax: /

Email:

Baiersdorf

ATEMCENTER BAIERSDORF

Montag und Mittwoch: 09.00 – 13.00 Uhr

Donnerstag: 13.00 – 17.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Erlanger Str. 9, 91083 Baiersdorf

Tel: 09133 8309 777

Fax: 03628 9211 903

Email:

Cottbus

ATEMCENTER COTTBUS

Montag – Donnerstag: 08.00 – 12.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Thiemstr. 124, 03050 Cottbus

Tel: 0355 4994 7575

Fax: 03628 9211 903

Email:

Ditzingen

ATEMCENTER DITZINGEN

Dienstag: 10.00 Uhr – 14.00 Uhr

Donnerstag: 12.00 Uhr – 16.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Siemensstraße 22, 71254 Ditzingen

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Dorfen

ATEMCENTER DORFEN

Mittwoch: 09.00 – 13.00 Uhr

Freitag: 09.00 – 13.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Bahnhofstraße 6, 84405 Dorfen

Tel: 08081 6049854

Fax: 03628 9211 903

Email:

Dresden

ATEMCENTER DRESDEN

Termine nur nach telefonischer Vereinbarung

Friedrichstraße 26, 01067 Dresden

Tel: 0351 4845 1841

Fax: 03628 9211 903

Email:

Erfurt

ATEMCENTER ERFURT

Montag – Donnerstag: 09.00 – 11.00 Uhr

Dienstag und Donnerstag: 13.00 – 15.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Nordhäuser Straße 74 – Haus 27 / 2. Etage, 99089 Erfurt

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Eschwege

ATEMCENTER ESCHWEGE

Dienstag – Freitag: 09.00 – 13.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Luisenstraße 23b, 4. Etage – Zimmer 428, 37269 Eschwege

Tel: 05651 9522 920

Fax: 03628 9211 903

Email:

Essen

ATEMCENTER ESSEN

Dienstag: 09.00 – 12.30 Uhr und 14.00 – 17.00 Uhr

Mittwoch: 09.00 – 12.30 Uhr

Donnerstag: 09.00 – 12.30 Uhr und 14.00 – 17.00 Uhr

Freitag: 09.00 – 12.30 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Kreuzeskirchstraße 8, 45127 Essen

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Freiburg

ATEMCENTER FREIBURG

Montag bis Donnerstag: 09.00 – 13.00 Uhr

Freitag: 08.00 – 12.00 Uhr

Nachmittags Neuversorgungen nach Terminvereinbarung

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Wirthstr. 9, 79110 Freiburg

Tel: 0761 15189324

Fax: 03628 9211 903

Email:

Friesoythe

ATEMCENTER FRIESOYTHE

Termine nach tel. Vereinbarung

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Moorstr. 12, 26169 Friesoythe

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Gauting

ATEMCENTER GAUTING

Montag: 14.00 – 16.00 Uhr

Donnerstag: 15.00 – 17.00 Uhr

Freitag: 13.00 – 15.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien. Unser Atemcenter ist am 5. Juni geschlossen.

Unser Atemcenter ist am 5. Juni geschlossen.

Robert-Koch-Allee 7, 82131 Gauting

Tel: 089 23541460

Fax: 03628 9211 903

Email:

Greifswald

ATEMCENTER GREIFSWALD

Dienstag: 08:00 – 13:00 Uhr

Mittwoch: 13:00 – 17:00 Uhr

Donnerstag: 08:00 – 13:00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren.

Ernst-Thälmann-Ring 66, 17491 Greifswald

Tel: 03834 4399 077

Fax: 03628 9211 903

Email:

Grünstadt

ATEMCENTER GRÜNSTADT – in den Räumen der Firma Medtek Medizintechnik GmbH

Montag – Donnerstag: 8.00 – 17.00 Uhr

Freitag 8.00 – 13.00 Uhr

Dieselstraße 5, 67269 Grünstadt

Tel: 03628 92110

Fax: 03628 9211 903

Email:

Hildesheim

ATEMCENTER HILDESHEIM

Montag – Freitag: 08.00 – 12.00 Uhr

Das Atemcenter Hildesheim ist vom 22.7. bis einschl. 2.8.26 geschlossen.

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Schuhstr. 6, 31134 Hildesheim

Tel: 05121 4088 160

Fax: 03628 9211 903

Email:

Hochheim

ATEMCENTER HOCHHEIM

Donnerstag: 09.00 – 14.00 Uhr

Mittwoch: 13.00 – 17.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Frankfurter Straße 14, 65239 Hochheim am Main

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Ingolstadt

ATEMCENTER INGOLSTADT

Freitag: 09.00 – 12.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Bahnhofstraße 3, 85051 Ingolstadt

Tel: 0841 95352568

Fax: 03628 9211 903

Email:

Kalkar

ATEMCENTER KALKAR

Montag: 09.00 – 13.00 Uhr

Dienstag: 09.00 – 13.00 Uhr

Mittwoch: 14.00 – 18.00 Uhr

Donnerstag: 09.00 – 13.00 Uhr

Freitag: 09.00 – 13.00 Uhr

Das AtemCenter bleibt vom 27.7.26 bis einschl. 31.7.26 sowie vom 17.8.26 bis einschl. 28.8.26. geschlossen.

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Markt 7, 47546 Kalkar

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Karlsruhe

ATEMCENTER KARLSRUHE

Montag, Dienstag und Donnerstag: 07.30 – 17.00 Uhr

Mittwoch und Freitag: 07.30 – 13.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Raiherwiesenstraße 13, 76227 Karlsruhe

Tel: 0721 79196415

Fax: 03628 9211 903

Email:

Krefeld

ATEMCENTER KREFELD

Dienstag: 08.00 – 12.00 Uhr

Donnerstag: 12.00 – 16.00 Uhr

und nach telefonischer Vereinbarung

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Hafenstraße 61–63, 47809 Krefeld

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Landshut

ATEMCENTER LANDSHUT

Mittwoch: 09.00 – 13.00 Uhr

Donnerstag: 12.00 – 16.00 Uhr (Maskensprechstunde)

Freitag: 09.00 – 13.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Oberndorferstr. 19, 84030 Landshut

Tel: 0871 1439 6863

Fax: 03628 9211 903

Email:

Leer

ATEMCENTER LEER

Montag: 09.00 – 12.00 Uhr

Dienstag: 09.00 – 12.00 Uhr

Mittwoch: 09.00 – 12.00 Uhr

Donnerstag: 09.00 – 11.00 Uhr

Freitag: 09.00 – 12.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Friesenstr. 75, 26789 Leer

Tel: 0491 9767 3791

Fax: 03628 9211 903

Email:

Leipzig

ATEMCENTER LEIPZIG

Um eine individuelle Beratung ohne Wartezeiten zu garantieren, ist unser AtemCenter ausschließlich nach telefonischer Terminabsprache für Sie geöffnet.

Philipp-Rosenthal-Straße 9, 04103 Leipzig

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Magdeburg

ATEMCENTER MAGDEBURG

Mittwoch: 08:00 – 14:00 Uhr

Freitag: 08:00 – 14:00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren.

Halberstädter Chaussee 123C, 39116 Magdeburg

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Mannheim

ATEMCENTER MANNHEIM

Montag: 09.00 – 14.00 Uhr

Mittwoch: 10.00 – 16.00 Uhr

Freitag: 09.00 – 14.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Traitteurstraße 28 – 34, 68165 Mannheim

Tel: 0621 97885500

Fax: 03628 9211 903

Email:

Mühldorf am Inn

ATEMCENTER MÜHLDORF

Montag: 09.00 – 13.00 Uhr

Mittwoch: 13.00 – 16.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Krankenhausstr. 1 – Eingangshalle zur InnKlinik, 84453 Mühldorf am Inn

Tel: 08631 9846325

Fax: 03628 9211 903

Email:

München am Hirschgarten

ATEMCENTER MÜNCHEN AM HIRSCHGARTEN

Dienstag: 10:00 – 12:00 Uhr

Mittwoch: 10:00 – 15:00 Uhr

Donnerstag: 10:00 – 12:00 Uhr

und nach telefonischer Vereinbarung

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Friedenheimer Brücke 20, 80639 München am Hirschgarten

Tel: 089 9274 9311

Fax: 03628 9211 903

Email:

Neufahrn – VIVISOL Deutschland Zentrale

VIVISOL DEUTSCHLAND GmbH

Dienstag: 13.00 – 16.00 Uhr – Maskensprechstunde

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Werner-von-Siemens-Str. 1, 85375 Neufahrn bei Freising

Tel: +49 3628 9211 0

Fax: +49 3628 9211 903

Email:

Neutraubling

ATEMCENTER NEUTRAUBLING

Dienstag: 09.00 – 13.00 Uhr

Donnerstag: 12.00 – 16.00 Uhr

Freitag: 09.00 – 13.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Dresdener Straße 1a, 93073 Neutraubling

Tel: 09401 9133097

Fax: 03628 9211 903

Email:

Offenburg

ATEMCENTER OFFENBURG

Montag und Mittwoch: 09.00 – 17.00 Uhr

Dienstag und Donnerstag: 09.00 – 18.00 Uhr

Freitag: 09.00 – 15.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Weingartenstr.70, 77654 Offenburg

Tel: 0781 6300 3344

Fax: 03628 9211 903

Email:

Potsdam

ATEMCENTER POTSDAM

Dienstag: 07.00 – 14.00 Uhr

Donnerstag und Freitag: 07.00 – 12.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Berliner Straße 150 / Haus Z, Ebene 1, Zimmer 106, 14467 Potsdam

Tel: 0331 87096795

Fax: 03628 9211 903

Email:

Salzburg

ATEMCENTER SALZBURG

Dienstag: 09.00 – 15.00 Uhr

Donnerstag: 09.00 – 15.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Ludwig-Bieringer-Platz 1, 5071 Himmelreich

Tel: +43 1 524 6283 441

Fax: /

Email:

Schopfheim

ATEMCENTER SCHOPFHEIM

Montag: 09.00 – 14.00 Uhr

Dienstag: nach Terminvereinbarung

Mittwoch: nach Terminvereinbarung

Donnerstag: 09.00 – 13.00 Uhr

Freitag: 10.00 – 14.00 Uhr

Unser AtemCenter hat vom 31.08. bis 04.09.2026 geschlossen.

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Walter-Faller-Weg 1, 79650 Schopfheim

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Siegen

ATEMCENTER SIEGEN

Montag: 09.00 – 15.30 Uhr

Dienstag: 09.00 – 13.00 Uhr

Mittwoch: 09.00 – 14.00 Uhr

Donnerstag: 09.00 – 14.00 Uhr

Unser AtemCenter hat vom 27.7.26 bis einschl. 7.8.26 geschlossen.

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Sankt-Johann-Str. 8, 57074 Siegen

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Singen

ATEMCENTER SINGEN

Montag – Freitag: 08.00 – 17.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

August-Ruf-Straße 16, 78224 Singen

Tel: 07731 182913

Fax: 03628 9211 903

Email:

Spremberg

ATEMCENTER SPREMBERG

Montag, Mittwoch und Freitag: 08.00 – 12.00 Uhr

Dienstag und Donnerstag: 13.00 – 17.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Karl-Marx-Straße 6, 03130 Spremberg

Tel: 03563 5939650

Fax: 03628 9211 903

Email:

VIVISOL Frankreich

VIVISOL FRANCE Sarl

269 rue du Maréchal Juin Bâtiment 55 77000 Vaux-le-Pénil

Tel: +33 (0)1 64 39 11 12

Fax: +33 (0)1 64 10 34 71

Email:

VIVISOL Griechenland

VIVISOL HELLAS Home Care SA

203 Mesogion Ave. , 11525 Athen

Tel: 210 6720400

Fax: /

Email:

VIVISOL Heimbehandlungsgeräte GmbH

VIVISOL Heimbehandlungsgeräte GmbH

Richard Strauss-Straße 10 1230 Wien – Austria

Tel: +43 1 524 62 83

Fax: +43 1 524 16 42

Email:

VIVISOL Italien

Vivisol S.r.l.

Via Gerolamo Borgazzi, 27 20900 - MONZA (MB), Italia

Tel: +39 039 2396.359

Fax: +39 039 2396.392

Email:

VIVISOL Polen

Pallmed Sp. z o.o.

ul. Powstańców 6 – 86-050 Solec Kujawski

Tel: +48 52 50 65 689

Fax: /

Email:

VIVISOL Schottland

Dolby Medical Home Respiratory Care Ltd

North Suite, Lomond Court, Castle Business Park, Stirling, FK9 4TU

Tel: 0800 028 4002

Fax: /

Email:

VIVISOL Schweiz AG

VIVISOL Schweiz AG

Südstrasse 4 – 3250 Lyss

Tel: +41 32 387 73 80

Fax: /

Email:

VIVISOL Spanien & Portugal (Iberische Halbinsel)

VIVISOL IBÉRICA

Calle Yeso 2, Arganda del Rey 28500 - MADRID

Tel: +34 91 7131692

Fax: +34 91 3610714

Email:

VIVISOL Tschechien

VIVISOL Czechia s.r.o.

Na Ladech 125/6 – 250 92 Praha-východ, Šestajovice

Tel: +420 286 584 553 (24-Stunden-Service-Mobil: +420 774 667 995)

Fax: /

Email:

Vivisol Brasil

Vivisol Brasil

Rua Conde de São Joaquim, 327 – Bela Vista São Paulo – SP – CEP: 01320-010

Tel: +55 11 4858-0338

Fax: /

Email:

Waren

ATEMCENTER WAREN

Dienstag: 08.00 – 13.00 Uhr

Mittwoch: 13.00 – 17.00 Uhr

Donnerstag: 08.00 – 13.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Rosa-Luxemburg-Straße 10, 17192 Waren (Müritz)

Tel: 03628 9211 0

Fax: 03628 9211 903

Email:

Zwickau

ATEMCENTER ZWICKAU

Montag – Freitag: 09.00 – 12.00 Uhr

Um lange Wartezeiten zu verhindern, möchten wir Sie bitten, vorab einen Termin zu vereinbaren. Bitte beachten Sie ggf. unsere geänderten Öffnungszeiten während der Schulferien.

Karl-Keil-Straße 35 – Haus 1 / Eingang B / 4. Etage, 08060 Zwickau

Tel: 0375 5122 96

Fax: 03628 9211 903

Email:

Při zpracování šablony došlo k chybě.
The following has evaluated to null or missing:
==> assetVocabularyLocalService.fetchGroupVocabulary(themeDisplay.getScopeGroupId(), vocabularyName)  [in template "37204#37246#42066452" at line 70, column 31]

----
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: #assign vocabulary = assetVocabularyL...  [in template "37204#37246#42066452" at line 70, column 9]
----
1<#assign resourcePrimaryKey = .vars["reserved-article-resource-prim-key"].data /> 
2<#assign idArticle = .vars["reserved-article-id"].data /> 
3 
4<#-- assetEntry--> 
5<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") /> 
6<#assign assetTagLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService") /> 
7<#assign assetCategoryLocalService  = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") /> 
8<#assign assetVocabularyLocalService= serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") /> 
9<#assign assetEntry = assetEntryLocalService.fetchEntry("com.liferay.journal.model.JournalArticle", resourcePrimaryKey?number) /> 
10<#if !assetEntry?has_content> 
11    <#stop "Error: Asset Entry with resourcePrimaryKey = ${resourcePrimaryKey} not found. Template execution stopped." /> 
12</#if> 
13 
14<#-- JournalArticle--> 
15<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
16<#assign journalArticle = journalArticleLocalService.fetchLatestArticle(resourcePrimaryKey?number) /> 
17<#if !journalArticle?has_content> 
18    <#stop "Error: Journal Article with resourcePrimaryKey = ${resourcePrimaryKey} not found. Template execution stopped." /> 
19</#if> 
20 
21<div class="thematic-area-page-content mt-5"> 
22    <div class="page-intro"> 
23 
24        <!-- Publish Date --> 
25        <#if assetEntry.getPublishDate()?has_content> 
26            <div class="subtitle-div gap-3"> 
27                <h4 class="subtitle plain-text mb-0"> ${dateUtil.getDate(assetEntry.getPublishDate(), "d MMMM yyyy", locale, timeZone)?upper_case}</h4> 
28            </div> 
29        </#if> 
30 
31        <!-- Title --> 
32        <h1 class="title">${journalArticle.getTitle(themeDisplay.getLocale())}</h1> 
33 
34        <!-- Subtitle --> 
35        <div class="row ml-0 mr-1"> 
36            <h4 class="subtitle plain-text col-md-6 p-0"><b>${languageUtil.get(locale, 'authors')}</b>: ${authors.getData()}</h4> 
37            <h4 class="subtitle plain-text col-md-6 col-12 p-0"><b>${languageUtil.get(locale, 'document-language')}</b>:  ${documentLanguage.getData()!""}</h4> 
38            <#if publishDateCustom?? && publishDateCustom.getData()?has_content> 
39                <#assign dateObj = dateUtil.parseDate("yyyy-MM-dd", publishDateCustom.getData(), locale) /> 
40                <h4 class="subtitle plain-text col-md-6 col-12 p-0"><b>${languageUtil.get(locale, 'publish-date')}</b>:  ${dateUtil.getDate(dateObj, "d MMMM yyyy", locale, timeZone)}</h4> 
41            </#if> 
42            <h4 class="subtitle plain-text col-md-6 col-12 p-0"><b>${languageUtil.get(locale, 'citation')}</b>: ${(citation.getData())!""}</h4> 
43            <h4 class="subtitle plain-text col-md-6 col-12 p-0"><b>DOI</b>: ${(doi.getData())!""}</h4> 
44            <h4 class="subtitle plain-text col-md-6 col-12 p-0"><b>${languageUtil.get(locale, 'keywords-vivilibrary')}</b>: ${(keywords.getData())!""}</h4> 
45        </div> 
46 
47        <#assign distributionLevelChoice = distributionLevel.getData()!""/> 
48        <div class="distribution-level mt-3 ${distributionLevelChoice}"> 
49            <b>${languageUtil.get(locale, distributionLevelChoice)}</b> 
50        </div> 
51 
52        <!-- Main Image --> 
53        <#assign mainImageUrl = ""/> 
54        <#assign mainImageCss = ""/> 
55        <#if uploadDocument.document.getData()?has_content> 
56            <#assign mainImageUrl = uploadDocument.document.getData() + "&previewFileIndex=1"> 
57            <#assign mainImageCss = "main-image-crop"/> 
58        <#elseif journalArticle.getArticleImageURL(themeDisplay)?has_content> 
59            <#assign mainImageUrl = journalArticle.getArticleImageURL(themeDisplay)> 
60        </#if> 
61        <#if mainImageUrl?has_content> 
62            <div class="main-image-div"> 
63                <img class="main-image ${(mainImageCss)!""}" src="${mainImageUrl}" alt="scientific article"> 
64            </div> 
65        </#if> 
66 
67        <!-- Categories--> 
68        <#assign vocabularyName = "Therapy" /> 
69        <#assign vocabularyId = 0 /> 
70        <#assign vocabulary = assetVocabularyLocalService.fetchGroupVocabulary(themeDisplay.getScopeGroupId(), vocabularyName)/> 
71        <#if vocabulary??> 
72            <#assign vocabularyId = vocabulary.getVocabularyId()/> 
73        </#if> 
74 
75        <#assign cats = [] /> 
76        <#if assetEntry.getCategories()?has_content> 
77            <#list assetEntry.getCategories() as c> 
78                <#if c.getVocabularyId() == vocabularyId> 
79                    <#assign cats = cats + [c] /> 
80                </#if> 
81            </#list> 
82        </#if> 
83 
84        <#assign tags = [] /> 
85        <#if assetTagLocalService.getAssetEntryAssetTags(assetEntry.getEntryId())?has_content> 
86            <#assign tags =  assetTagLocalService.getAssetEntryAssetTags(assetEntry.getEntryId())> 
87        </#if> 
88 
89        <#if tags?has_content || cats?has_content> 
90            <div class="tags-container flex-wrap"> 
91                <#if cats?has_content> 
92                    <#list cats as cat> 
93                        <span class="tag tag-style">${languageUtil.get(locale, "account-treatment-"+cat.getTitle(themeDisplay.getLocale()))}</span> 
94                    </#list> 
95                </#if> 
96                <#if tags?has_content> 
97                    <#list tags as tag> 
98                        <span class="tag tag-style">${tag.getName()}</span> 
99                    </#list> 
100                </#if> 
101            </div> 
102        </#if> 
103    </div> 
104 
105    <!-- Wavy divider --> 
106    <div class="wavy-divider"> 
107        <svg viewBox="0 0 1440 60" fill="none" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none"> 
108            <path d="M0,20 Q360,60 720,20 T1440,20 V60 H0 Z" fill="#fff"/> 
109        </svg> 
110    </div> 
111 
112    <!-- 1. One column section --> 
113    <#if shortAbstract.oneColumnSectionTitle.getData()?has_content && shortAbstract.oneColumnText.getData()?has_content> 
114        <div class="sections-block"> 
115            <h4 class="section-title reading-time-parameter">${shortAbstract.oneColumnSectionTitle.getData()}</h4> 
116            <div class="one-column-text p-0"> 
117                <div class="plain-text reading-time-parameter">${shortAbstract.oneColumnText.getData()}</div> 
118            </div> 
119        </div> 
120    </#if> 
121 
122    <!-- 3. Two columns section --> 
123    <#if abstract.title.getData()?has_content && 
124    abstract.text.getData()?has_content> 
125        <div class="sections-block"> 
126            <h4 class="section-title reading-time-parameter">${abstract.title.getData()}</h4> 
127            <div class="col-md-12 p-0"> 
128                <div class="plain-text reading-time-parameter multi-column-text">${abstract.text.getData()}</div> 
129            </div> 
130        </div> 
131    </#if> 
132 
133    <!-- 5. Embedded document section --> 
134    <#if uploadDocument.docSectionTitle.getData()?has_content && uploadDocument.document.getData()?has_content && uploadDocument.document.getData()?has_content> 
135        <#assign totalPages = webContentUtil.getDocumentPreviewPageCount(themeDisplay, uploadDocument.document.getData()) /> 
136        <div class="sections-block"> 
137            <h4 class="section-title reading-time-parameter">${uploadDocument.docSectionTitle.getData()}</h4> 
138            <div class="doc-container"> 
139                <div class="col-md-12 p-0"> 
140                    <div class="doc-embed d-flex flex-column align-items-center"> 
141                        <button class="pdf-open-doc" data-pdf-url="${uploadDocument.document.getData()}"> 
142                            ${languageUtil.get(locale, "open-document")} 
143                        </button> 
144                        <div class="pdf-pages-container"> 
145                            <#list 1..totalPages as page> 
146                                <img 
147                                        src="${uploadDocument.document.getData()}&previewFileIndex=${page}" 
148                                        class="pdf-page" 
149                                        data-page="${page}" 
150                                /> 
151                            </#list> 
152                        </div> 
153                        <div class="doc-index"> 
154                            <div class="pdf-pagination"> 
155                                <button class="pdf-nav prev subtitle">&lt;</button> 
156                                <div class="pdf-nav-index-div"></div> 
157                                <button class="pdf-nav next subtitle">&gt;</button> 
158                            </div> 
159                        </div> 
160                    </div> 
161                </div> 
162            </div> 
163        </div> 
164    </#if> 
165 
166    <#assign linkTagIsNotEmpty = false> 
167    <#list references.getSiblings() as field> 
168        <#if field.getData()?? && field.linkTitle.getData()?trim != "" && field.linkUrl.getData()?trim != ""> 
169            <#assign linkTagIsNotEmpty = true> 
170            <#break> 
171        </#if> 
172    </#list> 
173 
174    <!-- 6. Link section --> 
175    <#if linkTagIsNotEmpty> 
176        <div class="sections-block" style="border-bottom-right-radius:12px;border-bottom-left-radius:12px;"> 
177            <h4 class="section-title reading-time">${languageUtil.get(locale, "references")}</h4> 
178            <div class="d-flex flex-column"> 
179                <#list references.getSiblings() as link> 
180                    <#if link.linkTitle.getData()?has_content && link.linkUrl.getData()?has_content> 
181                        <div class="link-card mb-4"> 
182                            <div class="link-info"> 
183                                <div class="link-title reading-time-parameter"><b>${link.linkTitle.getData()}</b></div> 
184                                <#if link.linkDesc.getData()?has_content> 
185                                    <div class="link-description reading-time-parameter">${link.linkDesc.getData()}</div> 
186                                </#if> 
187                            </div> 
188                            <a href="${(link.linkUrl.getData())!'javascript:void(0);'}" class="download-btn" 
189                               title="Scarica" onclick="openLinkInNewTab(event, this)"> 
190                                <i class="icom-vivimedical-link-icon"> 
191                                </i> 
192                            </a> 
193                        </div> 
194                    </#if> 
195                </#list> 
196            </div> 
197        </div> 
198    </#if> 
199 
200</div> 
201 
202<script src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js"></script> 
203 
204<script> 
205    function initializeOpenDocButton() { 
206        const openDocBtn = document.querySelector('.pdf-open-doc'); 
207        if (openDocBtn) { 
208            openDocBtn.addEventListener('click', () => { 
209                const pdfUrl = openDocBtn.getAttribute('data-pdf-url'); 
210                if (!pdfUrl) { 
211                    alert('PDF not available'); 
212                    return; 
213
214                const newTab = window.open(pdfUrl, '_blank'); 
215                if (!newTab) { 
216                    alert('Unable to open the PDF. Please check your browser settings for pop-ups.'); 
217
218            }); 
219
220
221 
222    function pdfPagination() { 
223        const pages = document.querySelectorAll('.pdf-page'); 
224        const prevBtn = document.querySelector('.pdf-nav.prev'); 
225        const nextBtn = document.querySelector('.pdf-nav.next'); 
226        const pageNumbersContainer = document.querySelector('.pdf-nav-index-div'); 
227 
228        // pdf-pagination struct: 1....lastPage 
229        const totalPages = pages.length; 
230        const firstPage = 1; 
231        const lastPage = totalPages; 
232        let currentPage = firstPage; 
233        let indexStyleClass = 'subtitle'; 
234 
235        function addStyle(elem, styleClass) { 
236            elem.classList.add(styleClass); 
237
238 
239        function addPageButton(pageNumber) { 
240            const btn = document.createElement('button'); 
241            btn.className = 'pdf-page-num'; 
242            btn.textContent = pageNumber; 
243            addStyle(btn, indexStyleClass); 
244            pageNumbersContainer.appendChild(btn); 
245
246 
247        function addEllipsis() { 
248            const span = document.createElement('span'); 
249            span.className = 'pdf-page-num ellipsis'; 
250            span.textContent = '...'; 
251            addStyle(span, indexStyleClass); 
252            pageNumbersContainer.appendChild(span); 
253
254 
255        // invalid currentPage sets value to default (firstPage) 
256        function validateCurrentPage(currentPage, defaultValue) { 
257            if (typeof currentPage !== 'number' || isNaN(currentPage) || 
258                currentPage < firstPage || currentPage > lastPage) { 
259                return defaultValue; 
260
261            return currentPage; 
262
263 
264        function renderPageNumbers(currentPage) { 
265            pageNumbersContainer.innerHTML = ''; 
266            currentPage = validateCurrentPage(currentPage, firstPage); 
267            console.log("totalPages  " + totalPages); 
268            if (totalPages >= 1 && totalPages <= 4) { 
269                for (let i = firstPage; i < firstPage + totalPages; i++) { 
270                    addPageButton(i); 
271
272
273            else if (currentPage == firstPage || currentPage == firstPage + 1) { 
274                addPageButton(firstPage); 
275                addPageButton(firstPage + 1); 
276                addPageButton(firstPage + 2); 
277                addEllipsis(); 
278                addPageButton(lastPage); 
279            } else if (currentPage == lastPage - 1 || currentPage == lastPage) { 
280                addPageButton(firstPage); 
281                addEllipsis(); 
282                addPageButton(lastPage - 2); 
283                addPageButton(lastPage - 1); 
284                addPageButton(lastPage); 
285            } else { 
286                addPageButton(firstPage); 
287                addEllipsis(); 
288                addPageButton(currentPage); 
289                addEllipsis(); 
290                addPageButton(lastPage); 
291
292
293 
294        function setActivePage(currentPage) { 
295            if (validateCurrentPage(currentPage, firstPage)) { 
296                const buttons = document.querySelectorAll('.pdf-page-num'); 
297                buttons.forEach(btn => btn.classList.remove('active')); 
298                buttons.forEach(btn => { 
299                    if (parseInt(btn.textContent, 10) === currentPage) { 
300                        btn.classList.add('active'); 
301
302                }); 
303
304
305 
306        function showPage(page) { 
307            currentPage = page; 
308            // hides all images 
309            document.querySelectorAll('.pdf-page').forEach(img => img.style.display = 'none'); 
310            // display currentPage image 
311            const currentPageElement = document.querySelector('.pdf-page[data-page="' + page + '"]'); 
312            if (currentPageElement) { 
313                currentPageElement.style.display = 'block'; 
314
315            prevBtn.disabled = currentPage === firstPage; 
316            nextBtn.disabled = currentPage === lastPage; 
317            renderPageNumbers(currentPage); 
318            setActivePage(currentPage); 
319
320 
321        // prev btn listener 
322        prevBtn.addEventListener('click', function () { 
323            if (currentPage > firstPage) showPage(currentPage - 1); 
324        }); 
325 
326        // next btn listener 
327        nextBtn.addEventListener('click', function () { 
328            if (currentPage < lastPage) showPage(currentPage + 1); 
329        }); 
330 
331        // index btn listener 
332        pageNumbersContainer.addEventListener('click', function (e) { 
333            if (e.target.classList.contains('pdf-page-num') && !e.target.classList.contains('ellipsis')) { 
334                const pageNumber = parseInt(e.target.textContent, 10); 
335                if (!isNaN(pageNumber)) { 
336                    showPage(pageNumber); 
337
338
339        }); 
340 
341        //Hammer.js 
342        function initializeHammer() { 
343            const container = document.querySelector('.pdf-pages-container'); 
344 
345            if (!container || typeof Hammer === 'undefined') { 
346                console.warn('Container not found or Hammer.js not loaded'); 
347                return; 
348
349 
350            const hammer = new Hammer(container); 
351 
352            hammer.get('swipe').set({ direction: Hammer.DIRECTION_HORIZONTAL }); 
353 
354            hammer.on('swipeleft', () => { 
355                if (currentPage < totalPages) { 
356                    showPage(currentPage + 1); 
357
358            }); 
359 
360            hammer.on('swiperight', () => { 
361                if (currentPage > 1) { 
362                    showPage(currentPage - 1); 
363
364            }); 
365
366 
367        // Initialize Hammer 
368        initializeHammer(); 
369 
370 
371        showPage(firstPage); 
372
373 
374    function openLinkInNewTab(event, el) { 
375        event.preventDefault(); 
376        event.stopPropagation(); 
377 
378        const href = el.getAttribute('href'); 
379 
380        if (!href || href.trim() === '' || href === 'javascript:void(0);') { 
381            alert('Link non disponibile'); 
382            return; 
383
384        try { 
385            new URL(href, window.location.href); 
386        } catch (e) { 
387            alert('URL non valido'); 
388            return; 
389
390 
391        const newTab = window.open(href, '_blank'); 
392 
393        if (!newTab || newTab.closed || typeof newTab.closed === 'undefined') { 
394            alert('Unable to open the link. Please check your browser settings to allow pop-ups.'); 
395
396
397 
398 
399    function init() { 
400        pdfPagination(); 
401        initializeOpenDocButton(); 
402
403    if (document.readyState === "loading") { 
404        document.addEventListener('DOMContentLoaded', init); 
405        document.addEventListener('DOMContentLoaded', function(){ 
406            let readingTime = calculateReadingTime(); 
407            $('#readingTime').text(readingTime); 
408        }); 
409    } else { 
410        init(); 
411        let readingTime = calculateReadingTime(); 
412        $('#readingTime').text(readingTime); 
413
414 
415    function calculateReadingTime(){ 
416        let wordCount = 0; 
417        const wordsPerMinute = 200; 
418        $('.reading-time-parameter').each(function(index, elem){ 
419            let text = $(elem).text(); 
420            wordCount += text.trim().split(/\s+/).length; 
421        }); 
422        if(wordCount > 0){ 
423            return Math.ceil(wordCount / wordsPerMinute); 
424        }else{ 
425            return 0; 
426
427
428 
429</script> 
430 
431<style> 
432    * { 
433        overflow-wrap: break-word; 
434
435 
436    .main-image-crop{ 
437        height: 300px; 
438        object-position:top center; 
439        @media(max-width: 576px){ 
440            height: 60px; 
441
442
443    .multi-column-text{ 
444        column-count: 2; 
445        column-gap: 2rem; 
446
447    .distribution-level{ 
448        text-transform: uppercase; 
449        &:before{ 
450            content: ""; 
451            display: inline-block; 
452            width: 20px; 
453            height: 20px; 
454            margin-right: 6px; 
455            border: 5px solid; 
456            border-radius: 50%; 
457            background: transparent; 
458            vertical-align: sub; 
459
460        &.disclosable{ 
461            &.before{ 
462                border-color: #23863F; 
463
464            color: #23863F; 
465
466        &.limited-disclosure{ 
467            &.before{ 
468                border-color: #F7B32B; 
469
470            color: #F7B32B; 
471
472        &.internal-use-only{ 
473            &.before{ 
474                border-color: #D24445; 
475
476            color: #D24445; 
477
478
479    .icom-vivimedical-link-icon:before{ 
480        color: #8ed300; 
481
482    .thematic-area-page-content{ 
483        .download-btn:hover{ 
484            text-decoration: none; 
485
486
487 
488    .plain-text{ 
489        p{ 
490            line-height: 1.5; 
491
492
493 
494    .sections-block > .one-column-text > .plain-text img { 
495        height: auto; !important; 
496        max-width: 100%; !important; 
497
498 
499    @media (max-width: 768px) { 
500        .multi-column-text { 
501            column-count: 1; 
502
503
504</style>