Error executing template "Designs/aal/_parsed/destination-2020.parsed.cshtml"
System.Net.WebException: The remote server returned an error: (403) Forbidden.
at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
at System.Net.WebClient.DownloadString(Uri address)
at CompiledRazorTemplates.Dynamic.RazorEngine_4935428376864ca985ae0f67fe64be99.Execute() in D:\dynamicweb.net\Solutions\Gotcha\aal.dev.gotcha.dk\Files\Templates\Designs\aal\_parsed\destination-2020.parsed.cshtml:line 318
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @using AAL.Data.ViewModels;
2 @using Newtonsoft.Json;
3
4 @{
5 string cssEditDate = System.IO.File.GetLastWriteTimeUtc(System.Web.HttpContext.Current.Server.MapPath("~/assets/css/aal.min.css")).ToString("yyyyMMddHHmmss");
6 string canonicalURL = "";
7
8 if (GetInteger("DwPageID") == GetInteger("DwAreaFirstActivePageID")) {
9 canonicalURL = System.Web.HttpContext.Current.Request.Url.Scheme + "://" + System.Web.HttpContext.Current.Request.Url.Host;
10 }
11 if (GetInteger("DwPageID") == GetInteger("Item.Area.SearchPage")) {
12 canonicalURL = System.Web.HttpContext.Current.Request.Url.Scheme + "://" + System.Web.HttpContext.Current.Request.Url.Host + Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(GetInteger("Item.Area.SearchPage"));
13 }
14 }
15
16 <!DOCTYPE html>
17 <html lang='@GetString("LongLang")'>
18
19 <head>
20 <meta charset='@GetString("CharSet")'>
21
22 <title>@GetValue("Title")</title>
23 @GetValue("MetaTags")
24 @GetValue("CopyRightNotice")
25
26
27 <meta name="viewport" content="width=device-width, initial-scale=1.0">
28 @if (System.Web.HttpContext.Current.Request.Url.Host.Contains(".dev.gotcha.dk")) {
29 <meta name="robots" content="noindex,nofollow">
30 }
31 @if (!string.IsNullOrWhiteSpace(canonicalURL)) {
32 <link rel="canonical" href='@canonicalURL'>
33 }
34
35 <link rel="preload" href="/Files/Templates/Designs/aal/assets/webfonts/2F9B16_1_0.woff2" as="font" type="font/woff2" crossorigin="">
36 <link rel="preload" href="/Files/Templates/Designs/aal/assets/webfonts/2F9B16_0_0.woff2" as="font" type="font/woff2" crossorigin="">
37 <link rel="preload" href="/Files/Templates/Designs/aal/assets/webfonts/2F9B16_2_0.woff2" as="font" type="font/woff2" crossorigin="">
38
39 <link rel="dns-prefetch" href="https://www.googletagmanager.com">
40
41 <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin="">
42
43 <meta name="facebook-domain-verification" content="yelug7szu5u0zzzq72ef64bvql7c7d">
44
45 @RenderSnippet("Meta")
46
47 <link rel="stylesheet" id="aal-css" href="/Files/Templates/Designs/aal/assets/css/aal.min.css?@cssEditDate">
48 @RenderSnippet("StylesheetTop")
49
50 @if (System.Web.HttpContext.Current.Request.Url.Host.Contains(".dev.gotcha.dk")) {
51 <!-- Google Tag Manager -->
52 <script>(function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-N8ZBPGW');</script>
53 <!-- End Google Tag Manager -->
54 } else {
55 <!-- Google Tag Manager -->
56 <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-WXQD7L');</script>
57 <!-- End Google Tag Manager -->
58 }
59
60 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.GoogleAnalyticsID"))) {
61 <script>
62 (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.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
63
64 ga('create', '@GetString("Item.Area.GoogleAnalyticsID")', 'auto');
65 ga('send', 'pageview');
66 </script>
67 }
68 @RenderSnippet("JavaScriptTop")
69
70 <link href="/Files/Templates/Designs/aal/assets/images/favicon.ico" rel="shortcut icon" type="image/x-icon">
71 <link href="/Files/Templates/Designs/aal/assets/images/favicon.ico" rel="icon" type="image/x-icon">
72
73 @RenderSnippet("Schema")
74 <script type="application/ld+json">
75 {
76 "@@context": "http://schema.org",
77 "@@type": "Airport",
78 "name": "@GetString("Item.Area.SchemaOrganizationName")",
79 "address": {
80 "@@type": "PostalAddress",
81 "streetAddress": "@GetString("Item.Area.SchemaOrganizationAddress")",
82 "postalCode": "@GetString("Item.Area.SchemaOrganizationPostalCode")",
83 "addressLocality": "@GetString("Item.Area.SchemaOrganizationCity")",
84 "addressCountry": "@GetString("Item.Area.SchemaOrganizationCountry")"
85 },
86 "url": "@System.Web.HttpContext.Current.Request.Url.Scheme@("://")@System.Web.HttpContext.Current.Request.Url.Host",
87 "geo": {
88 "@@type": "GeoCoordinates",
89 "latitude": "@GetString("Item.Area.SchemaOrganizationLatitude")",
90 "longitude": "@GetString("Item.Area.SchemaOrganizationLongitude")"
91 },
92 "telephone": "@GetString("Item.Area.SchemaOrganizationPhone")",
93 "openingHours": "Mo-Su 00:00-00:00",
94 "iataCode": "@GetString("Item.Area.SchemaOrganizationIATA")",
95 "icaoCode": "@GetString("Item.Area.SchemaOrganizationICAO")",
96 "hasMap": "https://www.google.com/maps/search/Aalborg+Lufthavn/@@57.0969187,9.8542745,14z?hl=da",
97 "logo": {
98 "@@type": "ImageObject",
99 "url": "@System.Web.HttpContext.Current.Request.Url.Scheme@("://")@System.Web.HttpContext.Current.Request.Url.Host@("/files/Templates/Designs/aal/assets/images/logo-schema.png")",
100 "width": 696,
101 "height": 696
102 },
103 "sameAs" : [
104 "@GetString("Item.Area.FacebookURL")",
105 "@GetString("Item.Area.TwitterURL")",
106 "@GetString("Item.Area.LinkedInURL")",
107 "@GetString("Item.Area.InstagramURL")",
108 "@GetString("Item.Area.YouTubeURL")",
109 "@GetString("Item.Area.GooglePlusURL")"
110 ]},
111 "contactPoint": [{
112 "@@type": "ContactPoint",
113 "telephone": "+1-401-555-1212",
114 "contactType": "customer service"
115
116 // https://developers.google.com/search/docs/data-types/corporate-contacts
117 }],
118 "amenityFeature": [{
119 "@@type": "LocationFeatureSpecification",
120 "name": "Baggageservice",
121 "url": "https://www.aal.dk/lufthavnen/bagage/",
122 "hoursAvailable": "06.30-10.00 12.30-15.30 18.00-22.00"
123 }, {
124 "@@type": "LocationFeatureSpecification",
125 "name": "Wifi",
126 "value": "True"
127 }, {
128 "@@type": "LocationFeatureSpecification",
129 "name": "Free parking",
130 "value": "True"
131 }],
132 "containsPlace": [{
133 "@@type": "Hotel",
134 "name": "Aalborg Airport Hotel",
135 "url": "https://www.airporthotel.dk/aalborg-airport-hotel.aspx"
136 }]
137 }
138 </script>
139 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.SearchPage"))) {
140 <script type="application/ld+json">
141 {
142 "@@context": "http://schema.org",
143 "@@type": "WebSite",
144 "url": "@System.Web.HttpContext.Current.Request.Url.Scheme@("://")@System.Web.HttpContext.Current.Request.Url.Host",
145 "name": "@GetString("Item.Area.SchemaOrganizationName")",
146 "potentialAction": {
147 "@@type": "SearchAction",
148 "target": "@System.Web.HttpContext.Current.Request.Url.Scheme@("://")@System.Web.HttpContext.Current.Request.Url.Host@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(GetInteger("Item.Area.SearchPage"))@("&q={q}")",
149 "query-input": "required name=q"
150 }
151 }
152 </script>
153 }
154 <script src="https://www.google.com/recaptcha/enterprise.js?render=6LfGIv4pAAAAAN17BC1srLTRcb03NS4LKGzCY1GX"></script>
155 @{
156 string dwPageName = GetString("DwPageName");
157 }
158 <script>
159 window.dataLayer = window.dataLayer || [];
160 window.dataLayer.push({
161 'event': 'showPage',
162 'groupName': '@dwPageName',
163 'groupId': '@dwPageName'
164 });
165 </script>
166 @GetValue("Stylesheets")
167 @GetValue("Javascripts")
168 </head>
169
170 <body class='page-template-@GetGlobalValue("Global:Pageview.LayoutTemplate").ToLower().Replace(".cshtml", "")'>
171 @if (System.Web.HttpContext.Current.Request.Url.Host.Contains(".by.gotcha.dk")) {
172 <!-- Google Tag Manager (noscript) -->
173 <noscript>
174 <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N8ZBPGW" height="0" width="0" style="display:none;visibility:hidden"></iframe>
175 </noscript>
176 <!-- End Google Tag Manager (noscript) -->
177 } else {
178 <!-- Google Tag Manager (noscript) -->
179 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WXQD7L" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
180 <!-- End Google Tag Manager (noscript) -->
181 }
182
183 <a href="#page-content" class="skip-to-content">Skip to content</a>
184 <header class="site-header">
185 <div class="site-logo"><a href='@System.Web.HttpContext.Current.Request.Url.Scheme@("://")@System.Web.HttpContext.Current.Request.Url.Host' title='@GetString("Item.Area.SchemaOrganizationName")'><img src="/Files/Templates/Designs/aal/assets/images/logo-blue.svg" width="141" height="60" alt='@GetString("Item.Area.SchemaOrganizationName")'></a></div>
186
187 <nav class="site-navigation">
188 <ul class="primary">
189 @RenderNavigation(new {
190 template = "navigation.xslt",
191 expandmode = "all",
192 id = "primary-navigation",
193 startlevel = 1,
194 endlevel = 3
195 })
196 </ul>
197
198 <button type="button" class="toggle-navigation" aria-label='@Translate("NavigationButton")' aria-expanded="false" data-action="navigation-open"><img src="/Files/Templates/Designs/aal/assets/images/icon-navigation.svg" width="30" height="20" alt=""></button>
199 </nav>
200
201 @if (GetLoop("Languages").Count() > 1) {
202 <nav class="site-language">
203 <button type="button" class="language-button" aria-label='@Translate("LanguageButtonLabel")' aria-expanded="false" data-action="language-toggle">@GetLoop("Languages").Where(x => x.GetBoolean("IsCurrent")).First().GetString("Name")</button>
204
205 <ul class="language-list">
206 @foreach (var language in GetLoop("Languages")) {
207 <li class='@(language.GetBoolean("IsCurrent") ? "current" : null)'><a href='@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(language.GetInteger("FirstPageID"))'>@language.GetString("Name")</a></li>
208 }
209 </ul>
210 </nav>
211 }
212
213 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.SearchPage"))) {
214 <button type="button" class="toggle-search" aria-label='@Translate("SearchButton")' aria-expanded="false" data-action="search-open"><img src="/Files/Templates/Designs/aal/assets/images/icon-search-blue.svg" width="18" height="18" alt=""></button>
215 }
216 </header>
217
218 <main class="site-content">
219 @if (GetString("Item.SystemName") == "Destination" && string.IsNullOrWhiteSpace(GetString("DwContent(top)"))) {
220 @RenderSnippet("DestinationPageHeader")
221 } else if (!string.IsNullOrWhiteSpace(GetString("DwContent(top)"))) {
222 <div class="page-top">
223 <link rel="stylesheet" href="https://unpkg.com/swiper@8/swiper-bundle.min.css">
224
225 <!-- Slider main container -->
226 <div class="swiper">
227 <!-- Additional required wrapper -->
228 <div class="swiper-wrapper">
229 <!-- Slides -->
230 @GetValue("DwContent(top)")
231 </div>
232 <!-- If we need navigation buttons -->
233 <div class="swiper-button-prev"></div>
234 <div class="swiper-button-next"></div>
235 </div>
236 <!-- Swiper JS -->
237 <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
238
239 <!-- Initialize Swiper -->
240 <script>
241 var swiper = new Swiper(".swiper", {
242 pagination: {
243 el: ".swiper-pagination",
244 type: "progressbar",
245 },
246 navigation: {
247 nextEl: ".swiper-button-next",
248 prevEl: ".swiper-button-prev",
249 },
250 autoplay: {
251 delay: 5000,
252 },
253 });
254 </script>
255 @RenderSnippet("PageTop")
256 </div>
257 } else if (GetString("Item.SystemName") == "News" && string.IsNullOrWhiteSpace(GetString("DwContent(top)"))) {
258 <section class="page-header bottom">
259 <div class="background"></div>
260 <div class="caption">
261 <div class="heading">@GetString("DwPageName")</div>
262 </div>
263 </section>
264 } else {
265 <section class="page-header">
266 <div class="background"></div>
267 <div class="caption">
268 <div class="heading">@GetString("DwPageName")</div>
269 </div>
270 </section>
271 }
272
273 <a id="page-content"></a>
274
275
276
277 @using System.Collections.Generic;
278 @using AAL.Data.Models;
279 @using AAL.Data.ViewModels;
280 @using Newtonsoft.Json;
281
282 @{
283 var destinations = GetValue("Destination") as List<Destination>;
284 var destinationOffers = GetValue("DestinationFavourites") as List<Destination>;
285
286 List<string> travelSeasons = new List<string>();
287
288 foreach (var travelInfo in GetLoop("Item.TravelInformation")) {
289 // Find unique travel seasons
290 if (!string.IsNullOrEmpty(travelInfo.GetString("Item.TravelInformation.TravelSeason"))) {
291 foreach (var season in travelInfo.GetString("Item.TravelInformation.TravelSeason").Split(',').ToList()) {
292 if (!travelSeasons.Contains(season.ToString())) {
293 travelSeasons.Add(season.ToString());
294 }
295 }
296 }
297 }
298
299 travelSeasons.Sort();
300
301 string travelSeason = String.Join(",", travelSeasons);
302
303 if (travelSeason == "summer,winter") {
304 travelSeason = Translate("DestinationListSeasonAllYear");
305 } else if (travelSeason == "summer") {
306 travelSeason = Translate("DestinationListSeasonSummer");
307 } else if (travelSeason == "winter") {
308 travelSeason = Translate("DestinationListSeasonWinter");
309 }
310
311 string travelTime = GetString("Item.TravelTime");
312 string travelTimeFormatted = travelTime + " " + Translate("DestinationFlightDetailsMinutesShort");
313
314 if (!string.IsNullOrWhiteSpace(GetString("Item.TravelTime")) && Int32.Parse(travelTime) >= 90) {
315 travelTimeFormatted = TimeSpan.FromMinutes(Convert.ToDouble(travelTime)).ToString(@"%h") + " " + Translate("DestinationFlightDetailsHoursShort") + " " + TimeSpan.FromMinutes(Convert.ToDouble(travelTime)).ToString(@"mm") + " " + Translate("DestinationFlightDetailsMinutesShort");
316 }
317
318 var destinationCharterJSON = new System.Net.WebClient().DownloadString("https://www.aal.dk/CustomModules/CharterHandler.ashx?names=" + GetString("Item.AlternateNames").Trim().Replace("; ", ",").Replace(";", ""));
319 CharterListViewModel destinationCharter = JsonConvert.DeserializeObject<CharterListViewModel>(destinationCharterJSON);
320
321 string operatorBookingLink = "";
322
323 if (GetLoop("Item.TravelInformation").Count() == 1) {
324 operatorBookingLink = GetLoop("Item.TravelInformation").First().GetString("Item.TravelInformation.BookingURL");
325 }
326
327 string destinationCharterBookingLink = "";
328
329 if (destinationCharter.Charters != null) {
330 destinationCharterBookingLink = destinationCharter.Charters.OrderBy(x => x.Price).First().BookingURL;
331 }
332 }
333
334 @SnippetStart("StylesheetTop")
335 <link rel="stylesheet" href="/Files/Templates/Designs/aal/assets/css/destination-2020.css">
336 @SnippetEnd("StylesheetTop")
337
338 @SnippetStart("Schema")
339 <script type="application/ld+json">
340 {
341 "@@context": "http://schema.org/",
342 "@@type": "City",
343 "name": "@GetString("Item.Name")",
344 "geo": {
345 "@@type": "GeoCoordinates",
346 "latitude": "@GetString("Item.Latitude")",
347 "longitude": "@GetString("Item.Longitude")"
348 }
349 }
350 </script>
351 @SnippetEnd("Schema")
352
353 @SnippetStart("DestinationPageHeader")
354 @if (string.IsNullOrWhiteSpace(GetString("DwContent(top)"))) {
355 <section class="page-header">
356 <div class="background" style='background-image: url(@GetString("Item.TopImage").Replace("\\", "/").Replace(" ", "%20"))'></div>
357
358 <div class="caption">
359 <h1>@GetString("Item.Name")</h1>
360
361 @if (!string.IsNullOrWhiteSpace(GetString("Item.Price"))) {
362 <p class="">@Translate("HeaderDestinationPriceFromPart1") @GetString("Item.Name") @Translate("HeaderDestinationPriceFromPart2") @GetString("Item.Price"),- @Translate("HeaderDestinationPriceFromPart3")</p>
363 } else if (!string.IsNullOrWhiteSpace(GetString("DestinationPrice")) && !string.IsNullOrWhiteSpace(GetString("Item.AlternateNames")) && !string.IsNullOrWhiteSpace(destinationCharter.Cheapest)) {
364 <p class="">@Translate("HeaderDestinationPriceFromPart1") @GetString("Item.Name") @Translate("HeaderDestinationPriceFromPart2") @Math.Min(GetInteger("DestinationPrice"), Int32.Parse(destinationCharter.Cheapest)),- @Translate("HeaderDestinationPriceFromPart3")</p>
365 } else if (!string.IsNullOrWhiteSpace(GetString("DestinationPrice"))) {
366 <p class="">@Translate("HeaderDestinationPriceFromPart1") @GetString("Item.Name") @Translate("HeaderDestinationPriceFromPart2") @GetString("DestinationPrice"),- @Translate("HeaderDestinationPriceFromPart3")</p>
367 } else if (!string.IsNullOrWhiteSpace(GetString("Item.AlternateNames")) && !string.IsNullOrWhiteSpace(destinationCharter.Cheapest)) {
368 <p class="">@Translate("HeaderDestinationPriceFromPart1") @GetString("Item.Name") @Translate("HeaderDestinationPriceFromPart2") @destinationCharter.Cheapest,- @Translate("HeaderDestinationPriceFromPart3")</p>
369 }
370
371 <p><a href="#accordion-tickets" class="button">@Translate("HeaderDestinationBookingLink")</a></p>
372 </div>
373 </section>
374 }
375 @SnippetEnd("DestinationPageHeader")
376
377 <section class="page-content">
378 <div class="inner">
379 <div class="destination-description">@GetValue("DwContent(destinationdescription)")</div>
380
381 <div class="destination-facts">
382 <h1>@Translate("DestinationFactsHeading")</h1>
383
384 <div class="accordions">
385 @if (!string.IsNullOrWhiteSpace(GetString("DwContent(accordiontickets)")) || GetLoop("Item.TravelInformation").Any()) {
386 <div class="accordion js-hide">
387 <h2><a href='#accordion-tickets' id='accordion-button-tickets' class="accordion-button" role="button" aria-expanded="false" aria-controls='accordion-tickets' data-action="accordion-toggle">@Translate("DestinationFactsAccordionButtonTickets")</a></h2>
388 <div id='accordion-tickets' class="accordion-content" aria-labelledby='accordion-button-tickets'>
389 <div class="accordion-inner">
390 @GetValue("DwContent(accordiontickets)")
391
392 @if (GetLoop("Item.TravelInformation").Any()) {
393 <p>@Translate("DestinationTicketsDescriptionPart1") @GetString("Item.Name") @Translate("DestinationTicketsDescriptionPart2")</p>
394
395 foreach (var travelInfo in GetLoop("Item.TravelInformation")) {
396 <div class="travel-information-2020">
397 @{
398 string providerType = travelInfo.GetString("Item.TravelInformation.Provider.SystemName");
399 string providerID = travelInfo.GetString("Item.TravelInformation.Provider");
400
401 Dynamicweb.Content.Items.Item provider = Dynamicweb.Content.Items.Item.GetItemById(providerType, providerID);
402 }
403
404 <div class="left">
405 <div class="travel-provider">
406
407 @{
408 var imgUrl = "/Admin/Public/GetImage.ashx?Image=" + @provider["Logo"] + "&Height=50&Crop=0";
409 }
410
411 @if (!string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.Provider"))) {
412 <img src="@imgUrl" alt='@(provider["AlternativeText"] != null && !string.IsNullOrWhiteSpace(provider["AlternativeText"].ToString()) ? provider["AlternativeText"] : provider["Name"])'>
413 } else {
414 if (provider["AlternativeText"] != null && !string.IsNullOrWhiteSpace(provider["AlternativeText"].ToString())) {
415 <text>provider["AlternativeText"]</text>
416 } else {
417 <text>provider["Name"]</text>
418 }
419 }
420 </div>
421
422 <div class="separator"></div>
423
424 <div class="travel-type">
425 @if (travelInfo.GetString("Item.TravelInformation.TravelType") == "charter") {
426 <img src="/Files/Templates/Designs/aal/assets/images/icon-palm-blue.svg" width="36" height="36" alt="">
427 <span>@Translate("DestinationTypeCharter")</span>
428 } else if (travelInfo.GetString("Item.TravelInformation.TravelType") == "direct") {
429 <img src="/Files/Templates/Designs/aal/assets/images/icon-departure-blue.svg" width="36" height="36" alt="">
430 <span>@Translate("DestinationTypeDirect")</span>
431 }
432 </div>
433
434 @if (!string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.TravelPeriodStart")) && !string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.TravelPeriodEnd"))) {
435 <div class="separator"></div>
436
437 <div class="travel-date">
438 <img src="/Files/Templates/Designs/aal/assets/images/icon-calendar-blue.svg" width="30" height="30" alt="">
439 <span>
440 <time datetime='@travelInfo.GetDate("Item.TravelInformation.TravelPeriodStart").ToString("yyyy-MM-dd HH:mm:ss")'>@travelInfo.GetDate("Item.TravelInformation.TravelPeriodStart").ToString("d.MM.yyyy")</time><span class="arrow"><img src="/Files/Templates/Designs/aal/assets/images/icon-pointer-right-blue.svg" width="12" height="12" alt=""></span><time datetime='@travelInfo.GetDate("Item.TravelInformation.TravelPeriodEnd").ToString("yyyy-MM-dd HH:mm:ss")'>@travelInfo.GetDate("Item.TravelInformation.TravelPeriodEnd").ToString("d.MM.yyyy")</time>
441 </span>
442 </div>
443 }
444
445 <div class="separator"></div>
446
447 <div class="travel-days">
448 <div class="label">@Translate("DestinationDeparturesDays"):</div>
449 <div class="days">
450 <table>
451 <tr>
452 @{
453 var dayListTable = new List<string> { "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday" };
454
455 for (int d = 0; d < dayListTable.Count(); d++) {
456 string selectClass = "";
457
458 if (travelInfo.GetString("Item.TravelInformation.TravelDays").Contains(dayListTable[d])) {
459 selectClass = "selected";
460 }
461
462 <td align="center" valign="center" width="28" class='day @selectClass'>@Translate("DestinationTravelDays" + @dayListTable[d], @dayListTable[d]).Substring(0,1)</td>
463 }
464 }
465 </tr>
466 </table>
467 </div>
468 </div>
469 </div>
470
471 <div class="right">
472 @if (!string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.Price"))) {
473 <div class="price">@Translate("DestinationListPriceFrom") @travelInfo.GetString("Item.TravelInformation.Price"),- t/r</div>
474 }
475
476 <div class="link">
477 @if (travelInfo.GetString("Item.TravelInformation.TravelType") == "charter") {
478 <a href='@travelInfo.GetString("Item.TravelInformation.BookingURL")' class="button">@Translate("DestinationDeparturesBookingCharterLink")</a>
479 } else if (travelInfo.GetString("Item.TravelInformation.TravelType") == "direct") {
480 <a href='@travelInfo.GetString("Item.TravelInformation.BookingURL")' class="button">@Translate("DestinationDeparturesBookingDirectLink")</a>
481 }
482 </div>
483 </div>
484 </div>
485 }
486 }
487 </div>
488 </div>
489 </div>
490 }
491
492 @if (!string.IsNullOrWhiteSpace(GetString("DwContent(accordiontransport)"))) {
493 <div class="accordion js-hide">
494 <h2><a href='#accordion-transport' id='accordion-button-transport' class="accordion-button" role="button" aria-expanded="false" aria-controls='accordion-transport' data-action="accordion-toggle">@Translate("DestinationFactsAccordionButtonTransport")</a></h2>
495 <div id='accordion-transport' class="accordion-content" aria-labelledby='accordion-button-transport'>
496 <div class="accordion-inner">
497 @GetValue("DwContent(accordiontransport)")
498 </div>
499 </div>
500 </div>
501 }
502
503 @if (!string.IsNullOrWhiteSpace(GetString("DwContent(accordionsightseeing)"))) {
504 <div class="accordion js-hide">
505 <h2><a href='#accordion-sightseeing' id='accordion-button-sightseeing' class="accordion-button" role="button" aria-expanded="false" aria-controls='accordion-sightseeing' data-action="accordion-toggle">@Translate("DestinationFactsAccordionButtonSightseeing")</a></h2>
506 <div id='accordion-sightseeing' class="accordion-content" aria-labelledby='accordion-button-sightseeing'>
507 <div class="accordion-inner">
508 @GetValue("DwContent(accordionsightseeing)")
509 </div>
510 </div>
511 </div>
512 }
513 </div>
514 </div>
515 </div>
516
517 @GetValue("DwContent(destinationdetails)")
518
519 <div class="inner">
520 @if (GetLoop("Item.TravelInformation").Any()) {
521 <h1>@Translate("DestinationDeparturesHeading") @GetString("Item.Name")</h1>
522
523 foreach (var travelInfo in GetLoop("Item.TravelInformation")) {
524 <div class="travel-information-2020">
525 @{
526 string providerType = travelInfo.GetString("Item.TravelInformation.Provider.SystemName");
527 string providerID = travelInfo.GetString("Item.TravelInformation.Provider");
528
529 Dynamicweb.Content.Items.Item provider = Dynamicweb.Content.Items.Item.GetItemById(providerType, providerID);
530 var imgUrl2 = "/Admin/Public/GetImage.ashx?Image=" + @provider["Logo"] + "&Height=50&Crop=0";
531
532 }
533
534 <div class="left">
535 <div class="travel-provider">
536 @if (!string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.Provider"))) {
537 <img src="@imgUrl2" alt='@(provider["AlternativeText"] != null && !string.IsNullOrWhiteSpace(provider["AlternativeText"].ToString()) ? provider["AlternativeText"] : provider["Name"])'>
538 } else {
539 if (provider["AlternativeText"] != null && !string.IsNullOrWhiteSpace(provider["AlternativeText"].ToString())) {
540 <text>provider["AlternativeText"]</text>
541 } else {
542 <text>provider["Name"]</text>
543 }
544 }
545 </div>
546
547 <div class="separator"></div>
548
549 <div class="travel-type">
550 @if (travelInfo.GetString("Item.TravelInformation.TravelType") == "charter") {
551 <img src="/Files/Templates/Designs/aal/assets/images/icon-palm-blue.svg" width="36" height="36" alt="">
552 <span>@Translate("DestinationTypeCharter")</span>
553 } else if (travelInfo.GetString("Item.TravelInformation.TravelType") == "direct") {
554 <img src="/Files/Templates/Designs/aal/assets/images/icon-departure-blue.svg" width="36" height="36" alt="">
555 <span>@Translate("DestinationTypeDirect")</span>
556 }
557 </div>
558
559 @if (!string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.TravelPeriodStart")) && !string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.TravelPeriodEnd"))) {
560 <div class="separator"></div>
561
562 <div class="travel-date">
563 <img src="/Files/Templates/Designs/aal/assets/images/icon-calendar-blue.svg" width="30" height="30" alt="">
564 <span>
565 <time datetime='@travelInfo.GetDate("Item.TravelInformation.TravelPeriodStart").ToString("yyyy-MM-dd HH:mm:ss")'>@travelInfo.GetDate("Item.TravelInformation.TravelPeriodStart").ToString("d.MM.yyyy")</time><span class="arrow"><img src="/Files/Templates/Designs/aal/assets/images/icon-pointer-right-blue.svg" width="12" height="12" alt=""></span><time datetime='@travelInfo.GetDate("Item.TravelInformation.TravelPeriodEnd").ToString("yyyy-MM-dd HH:mm:ss")'>@travelInfo.GetDate("Item.TravelInformation.TravelPeriodEnd").ToString("d.MM.yyyy")</time>
566 </span>
567 </div>
568 }
569
570 <div class="separator"></div>
571
572 <div class="travel-days">
573 <div class="label">@Translate("DestinationDeparturesDays"):</div>
574 <div class="days">
575 <table>
576 <tr>
577 @{
578 var dayListTable = new List<string> { "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday" };
579
580 for (int d = 0; d < dayListTable.Count(); d++) {
581 string selectClass = "";
582
583 if (travelInfo.GetString("Item.TravelInformation.TravelDays").Contains(dayListTable[d])) {
584 selectClass = "selected";
585 }
586
587 <td class='day @selectClass'>@Translate("DestinationTravelDays" + @dayListTable[d], @dayListTable[d]).Substring(0,1)</td>
588 }
589 }
590 </tr>
591 </table>
592 </div>
593 </div>
594 </div>
595
596 <div class="right">
597 @if (!string.IsNullOrWhiteSpace(travelInfo.GetString("Item.TravelInformation.Price"))) {
598 <div class="price">@Translate("DestinationListPriceFrom") @travelInfo.GetString("Item.TravelInformation.Price"),- t/r</div>
599 }
600
601 <div class="link">
602 @if (travelInfo.GetString("Item.TravelInformation.TravelType") == "charter") {
603 <a href='@travelInfo.GetString("Item.TravelInformation.BookingURL")' class="button">@Translate("DestinationDeparturesBookingCharterLink")</a>
604 } else if (travelInfo.GetString("Item.TravelInformation.TravelType") == "direct") {
605 <a href='@travelInfo.GetString("Item.TravelInformation.BookingURL")' class="button">@Translate("DestinationDeparturesBookingDirectLink")</a>
606 }
607 </div>
608 </div>
609 </div>
610 }
611 }
612 </div>
613
614 @GetValue("DwContent(destinationrelated)")
615 </section>
616
617 @SnippetStart("JavaScriptBottom")
618 @if (System.Web.HttpContext.Current.Items["AccordionJSLoaded"] != "true") {
619 System.Web.HttpContext.Current.Items["AccordionJSLoaded"] = "true";
620
621 <script src="/Files/Templates/Designs/aal/assets/js/accordions.min.js" async=""></script>
622 }
623
624 <script src="/Files/Templates/Designs/aal/assets/js/accordions.min.js" async=""></script>
625 @SnippetEnd("JavaScriptBottom")
626
627
628 @if (!string.IsNullOrWhiteSpace(GetString("DwContent(bottom)"))) {
629 @GetValue("DwContent(bottom)")
630 }
631 </main>
632
633 <footer class="site-footer">
634 <div class="inner">
635 <div class="site-logo"><a href='@System.Web.HttpContext.Current.Request.Url.Scheme@("://")@System.Web.HttpContext.Current.Request.Url.Host' title='@GetString("Item.Area.SchemaOrganizationName")'><img src="/Files/Templates/Designs/aal/assets/images/logo-white.svg" width="141" height="60" alt='@GetString("Item.Area.SchemaOrganizationName")'></a></div>
636
637 <div class="footer-address">
638 @RenderParagraphContent(GetInteger("Item.Area.FooterParagraph"))
639 </div>
640
641 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.FooterNavigation"))) {
642 <nav class="footer-navigation">
643 <ul>
644 @RenderNavigation(new {
645 template = "navigation.xslt",
646 expandmode = "all",
647 id = "footer-navigation",
648 startlevel = 2,
649 endlevel = 3,
650 parentid = GetInteger("Item.Area.FooterNavigation")
651 })
652 </ul>
653 </nav>
654 }
655
656 <div class="footer-social-media">
657 <div class="heading">@Translate("FooterSocialMediaHeading")</div>
658 <p>
659 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.FacebookURL"))) {
660 <a href='@GetString("Item.Area.FacebookURL")' target="_blank" rel="noopener"><img src="/Files/Templates/Designs/aal/assets/images/icon-facebook.svg" class="icon-social" width="30" height="30" alt="Facebook"></a>
661 }
662 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.TwitterURL"))) {
663 <a href='@GetString("Item.Area.TwitterURL")' target="_blank" rel="noopener"><img src="/Files/Templates/Designs/aal/assets/images/icon-twitter.svg" class="icon-social" width="44" height="30" alt="Twitter"></a>
664 }
665 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.LinkedInURL"))) {
666 <a href='@GetString("Item.Area.LinkedInURL")' target="_blank" rel="noopener"><img src="/Files/Templates/Designs/aal/assets/images/icon-linkedin.svg" class="icon-social" width="32" height="30" alt="LinkedIn"></a>
667 }
668 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.InstagramURL"))) {
669 <a href='@GetString("Item.Area.InstagramURL")' target="_blank" rel="noopener"><img src="/Files/Templates/Designs/aal/assets/images/icon-instagram.svg" class="icon-social" width="30" height="30" alt="Instagram"></a>
670 }
671 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.YouTubeURL"))) {
672 <a href='@GetString("Item.Area.YouTubeURL")' target="_blank" rel="noopener"><img src="/Files/Templates/Designs/aal/assets/images/icon-youtube.svg" class="icon-social" width="30" height="30" alt="YouTube"></a>
673 }
674 </p>
675 <div class="copyright">© Copyright @GetString("Item.Area.SchemaOrganizationName"). All rights reserved.</div>
676 </div>
677 </div>
678 </footer>
679
680 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.BreakingParagraph"))) {
681 @RenderParagraphContent(GetInteger("Item.Area.BreakingParagraph"))
682 }
683 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.MarqueeParagraph"))) {
684 @RenderParagraphContent(GetInteger("Item.Area.MarqueeParagraph"))
685 }
686
687 <div class="navigation-overlay" role="dialog" aria-modal="true">
688 <div class="inner">
689 <div class="logo"><a href="/" title="Aalborg Lufthavn"><img src="/Files/Templates/Designs/aal/assets/images/logo-blue.svg" width="188" height="80" alt="Aalborg Lufthavn"></a></div>
690 <button type="button" class="close" aria-label='@Translate("NavigationClose")' data-action="navigation-close"><img src="/Files/Templates/Designs/aal/assets/images/icon-close.svg" width="24" height="24" alt=""></button>
691 </div>
692
693 <div class="container">
694 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.SearchPage"))) {
695 <div class="search">
696 <form action='@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(GetInteger("Item.Area.SearchPage"))' method="get" name="search">
697 <input type="hidden" name="ID" value='@GetInteger("Item.Area.SearchPage")'>
698 <label for="navigation-q" class="visually-hidden">@Translate("NavigationSearchLabel")</label>
699 <input type="text" name="q" id="navigation-q" placeholder=' @Translate("NavigationSearchInputPlaceholder")' required="">
700 <button type="submit" aria-label='@Translate("NavigationSearchButton")'><img src="/Files/Templates/Designs/aal/assets/images/icon-search-blue.svg" width="20" height="20" alt=""></button>
701 </form>
702 </div>
703 }
704
705 <nav class="site-navigation">
706 <ul class="primary">
707 @RenderNavigation(new {
708 template = "navigation-overlay.xslt",
709 expandmode = "all",
710 id = "primary-navigation-overlay",
711 startlevel = 1,
712 endlevel = 5,
713 backbutton = Translate("NavigationBackButton")
714 })
715 </ul>
716 </nav>
717
718 @if (GetLoop("Languages").Count() > 1) {
719 <nav class="site-language">
720 <ul class="language-list">
721 @foreach (var language in GetLoop("Languages")) {
722 <li class='@(language.GetBoolean("IsCurrent") ? "current" : null)'><a href='@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(language.GetInteger("FirstPageID"))'>@language.GetString("Name")</a></li>
723 }
724 </ul>
725 </nav>
726 }
727 </div>
728 </div>
729
730 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.SearchPage"))) {
731 <div class="search-overlay" role="dialog" aria-modal="true">
732 <div class="inner">
733 <button type="button" class="close" data-action="search-close">@Translate("SearchClose") <img src="/Files/Templates/Designs/aal/assets/images/icon-close.svg" width="24" height="24" alt=""></button>
734 </div>
735
736 <div class="container">
737 <div class="search">
738 <form action='@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(GetInteger("Item.Area.SearchPage"))' method="get" name="search">
739 <input type="hidden" name="ID" value='@GetInteger("Item.Area.SearchPage")'>
740 <label for="search-q" class="visually-hidden">@Translate("SearchSearchLabel")</label>
741 <input type="search" name="q" id="search-q" placeholder=' @Translate("SearchInputPlaceholder")' required="">
742 <button type="submit" aria-label='@Translate("SearchButton")'><img src="/Files/Templates/Designs/aal/assets/images/icon-search-blue.svg" width="20" height="20" alt=""></button>
743 </form>
744 </div>
745
746 <div class="row">
747 <div class="col-md-4">
748 @RenderParagraphContent(GetInteger("Item.Area.SearchMostVisited"))
749 </div>
750 <div class="col-md-4">
751 @RenderParagraphContent(GetInteger("Item.Area.SearchPopularSearchterms"))
752 </div>
753 <div class="col-md-4">
754 @RenderParagraphContent(GetInteger("Item.Area.SearchPopularDestinations"))
755 </div>
756 </div>
757 </div>
758 </div>
759 }
760
761 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.DeparturesParagraph")) || !string.IsNullOrWhiteSpace(GetString("Item.Area.ArrivalsParagraph"))) {
762 <div class="schedules-overlay" role="dialog" aria-modal="true">
763 <div class="inner">
764 <button type="button" class="close" data-action="schedules-close">@Translate("SchedulesClose") <img src="/Files/Templates/Designs/aal/assets/images/icon-close.svg" width="24" height="24" alt=""></button>
765 </div>
766
767 <div class="container">
768 <div class="search">
769 <label for="schedules-search" class="visually-hidden">@Translate("SchedulesSearchLabel")</label>
770 <input type="text" id="schedules-search" placeholder='@Translate("SchedulesSearchInputPlaceholder")' data-action="schedule-search">
771 <button type="button" aria-label='@Translate("SchedulesSearchButton")' data-action="schedule-search"><img src="/Files/Templates/Designs/aal/assets/images/icon-search-blue.svg" width="20" height="20" alt=""></button>
772 </div>
773
774 <div class="tabs">
775 <nav class="tab-navigation">
776 <ul role="tablist">
777 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.DeparturesParagraph"))) {
778 <li role="none">
779 <a href="#tab-departures" id="tab-button-departures" class="tab-button js-active" role="tab" aria-selected="true" aria-controls="tab-departures" data-action="tab-open">@Translate("SchedulesTabDepartures")</a>
780 </li>
781 }
782 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.ArrivalsParagraph"))) {
783 <li role="none">
784 <a href="#tab-arrivals" id="tab-button-arrivals" class="tab-button" role="tab" aria-selected="false" aria-controls="tab-arrivals" data-action="tab-open">@Translate("SchedulesTabArrivals")</a>
785 </li>
786 }
787 </ul>
788 </nav>
789
790 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.DeparturesParagraph"))) {
791 <div id="tab-departures" class="tab-content js-active" role="tabpanel" aria-labelledby="tab-button-departures">
792 @RenderParagraphContent(GetInteger("Item.Area.DeparturesParagraph"))
793 </div>
794 }
795 @if (!string.IsNullOrWhiteSpace(GetString("Item.Area.ArrivalsParagraph"))) {
796 <div id="tab-arrivals" class="tab-content" role="tabpanel" aria-labelledby="tab-button-arrivals">
797 @RenderParagraphContent(GetInteger("Item.Area.ArrivalsParagraph"))
798 </div>
799 }
800 </div>
801 </div>
802 </div>
803 }
804
805 <div id="modal-schedules-subscription" class="modal" role="dialog" aria-modal="true">
806 <div class="modal-content">
807 <button type="button" class="close" aria-label='@Translate("SchedulesClose")' data-action="modal-close">×</button>
808
809 <div class="content">
810 <div class="heading">@Translate("SchedulesSubscriptionHeading")</div>
811
812 <div class="flight-info">
813 <strong>@Translate("SchedulesSubscriptionRoute")</strong><br>
814 @Translate("SchedulesSubscriptionFlightNo"): <span class="flight-no"></span><br>
815 @Translate("SchedulesSubscriptionRoute"): <span class="route"></span><br>
816 @Translate("SchedulesSubscriptionDateTime"): <span class="date"></span>
817 </div>
818
819 <div class="success">@RenderParagraphContent(GetInteger("Item.Area.TextSuccess"))</div>
820
821 <div class="error">@RenderParagraphContent(GetInteger("Item.Area.TextError"))</div>
822
823 <div class="banned" data-blacklist='@GetString("Item.Area.TextBlacklist")'>@RenderParagraphContent(GetInteger("Item.Area.TextBanned"))</div>
824
825 <form id="schedule-subscription">
826 <input type="hidden" name="dataid" id="schedule-subscription-dataid" value="">
827
828 <fieldset>
829 <label for="schedule-subscription-mobile"><strong>@Translate("SchedulesSubscriptionPhone"):</strong></label>
830 <div class="schedule-subscription-mobile-wrap">
831 @{
832 string mobilePrefixPlaceholder = Translate("SchedulesSubscriptionPhonePrefixPlaceholder");
833 string mobilePlaceholder = Translate("SchedulesSubscriptionPhonePlaceholder");
834 }
835 <span>+</span>
836 <input type="text" class="phone-prefix" name="phonePrefix" id="schedule-subscription-mobile-prefix" placeholder="@mobilePrefixPlaceholder" pattern="[0-9]{2,}" required="">
837 <input type="text" name="phone" id="schedule-subscription-mobile" placeholder="@mobilePlaceholder" pattern="[0-9]{2,}" required="">
838 </div>
839 </fieldset>
840
841 <fieldset>
842 <input type="checkbox" name="schedule-subscription-marketing-permissions" id="schedule-subscription-marketing-permissions" value="yes" required="">
843 <label for="schedule-subscription-marketing-permissions">@Translate("SchedulesSubscriptionMarketingPermissions")</label>
844 </fieldset>
845
846 <fieldset>
847 <button>@Translate("SchedulesSubscriptionButton")</button>
848 </fieldset>
849 </form>
850
851 <div class="disclaimer">
852 @RenderParagraphContent(GetInteger("Item.Area.TextDisclaimer"))
853 </div>
854 </div>
855 </div>
856 <div class="modal-loader"></div>
857 </div>
858
859 @RenderSnippet("Modals")
860
861 @RenderSnippet("Templates")
862
863 <script src="/Files/Templates/Designs/aal/assets/js/aal.min.js" async=""></script>
864
865 @RenderSnippet("JavaScriptBottom")
866 </body>
867
868 </html>
869