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"] + "&amp;Height=50&amp;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"] + "&amp;Height=50&amp;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">&copy; 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='&nbsp;&nbsp;@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='&nbsp;&nbsp;@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">&times;</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