1 2 3 4 5<!DOCTYPE html> 6<html lang="fi" xml:lang="fi"> 7 <head> 8 <link rel="apple-touch-icon" sizes="180x180" href="/static/img/apple-touch-icon.png"/> 9 <link rel="icon" type="image/png" sizes="32x32" href="/static/img/favicon-32x32.png"/> 10 <link rel="icon" type="image/png" sizes="16x16" href="/static/img/favicon-16x16.png"/> 11 <link rel="canonical" href="https://tanssi.io/cal/performers/83ae10f0-7016-41a3-8be4-83fdf4455ec6/"/> 12 <meta http-equiv="Content-Language" content="fi"> 13 <meta charset="utf-8"/> 14 <meta name="google" content="notranslate"> 15 <meta name="htmx-config" content='{"selfRequestsOnly":false}'> 16 <title>Neloset | tanssi.net</title> 17 <meta name="description" content="Tulevat tanssitapahtumat: Neloset."/> 18 19 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css"/> 20 <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet"/> 21
21<script defer data-domain="tanssi.net" src="https://p.tanssi.io/js/script.js"></script>
21 22
22<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
22 23
23<script src="https://cdnjs.cloudflare.com/ajax/libs/corejs-typeahead/1.3.4/bloodhound.min.js"></script>
23 24
24<script src="https://cdnjs.cloudflare.com/ajax/libs/corejs-typeahead/1.3.4/typeahead.jquery.min.js"></script>
24 25
26<script src="/static/js/cal.js"></script>
vendor: 1 bytes, line 26
26
27<script> 28$(document).ready(function() { 29 $('[data-bs-toggle="tooltip"]').tooltip(); 30}); 31</script>
31 32 33 34 35 36 37 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> 38
38<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
38 39 40
40<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/[email protected]/dist/cdn.min.js"></script>
40 41
41<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.js"></script>
41 42 43
43<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/htmx.js" integrity="sha384-yWakaGAFicqusuwOYEmoRjLNOC+6OFsdmwC2lbGQaRELtuVEqNzt11c2J711DeCZ" crossorigin="anonymous"></script>
43 44
44<script src="https://cdn.jsdelivr.net/npm/[email protected]" integrity="sha384-aiAPowx3gG+h620/TJLIfLPgBcn6DMWlhu45oOhWVwTOjds9E6X2pmGbT4Xc8XMJ" crossorigin="anonymous"></script>
44 45
45<script> 46 // Enable credentials (cookies) for all HTMX requests, including cross-origin 47 (function() { 48 document.addEventListener('htmx:configRequest', function(evt) { 49 evt.detail.withCredentials = true; 50 }); 51 })(); 52 </script>
52 53 54
54<script src="/static/js/jquery.formset.js"></script>
54 55 <style>.user_events .user-events-button { 56 cursor: pointer; 57}</style> 58 59 <link rel="stylesheet" href="/static/css/styles.min.css"/> 60 61 62 63 <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 64</head> 65<body hx-ext="response-targets" hx-headers='{"X-CSRFToken": "JaBWkcbDyJU96acAN0JxGZtKJ9FTPmMO7kpVDZTwOv0pcLYDsUmEgYT0Awm1M4ya"}'> 66
66<script> 67 // Get CSRF token from cookie for cross-domain requests (e.g., tanssi.net -> a.tanssi.io) 68 // This ensures HTMX requests have a valid CSRF token even on static pages 69 (function() { 70 function getCookie(name) { 71 let cookieValue = null; 72 if (document.cookie && document.cookie !== '') { 73 const cookies = document.cookie.split(';'); 74 for (let i = 0; i < cookies.length; i++) { 75 const cookie = cookies[i].trim(); 76 if (cookie.substring(0, name.length + 1) === (name + '=')) { 77 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 78 break; 79 } 80 } 81 } 82 return cookieValue; 83 } 84 85 // Update HTMX config with CSRF token from cookie 86 // Only needed for static pages (tanssi.net) where template token is stale 87 document.addEventListener('DOMContentLoaded', function() { 88 // Check if we're on a static site (no server-side rendering) 89 // Static sites have stale tokens, dynamic sites have fresh tokens from template 90 const bodyToken = document.body.getAttribute('hx-headers'); 91 const csrftoken = getCookie('csrftoken'); 92 93 // Only update if we have a cookie token AND we're likely on a static page 94 // (indicated by hostname being tanssi.net, not a.tanssi.io) 95 if (csrftoken && window.location.hostname === 'tanssi.net') { 96 try { 97 const headers = JSON.parse(bodyToken || '{}'); 98 headers['X-CSRFToken'] = csrftoken; 99 document.body.setAttribute('hx-headers', JSON.stringify(headers)); 100 } catch (e) { 101 console.error('Error updating CSRF token:', e); 102 } 103 } 104 }); 105 })(); 106 </script>
106 107 108 <div class="header"> 109 <nav class="navbar navbar-custom navbar-expand-lg sticky-top navbar-dark bg-dark"> 110 <div class="container-fluid"> 111 112 113<div class="position-relative me-3" style="margin-top: 20px; margin-bottom: 10px"> 114 <a class="navbar-brand" href="https://tanssi.io/cal/today/"><img width="64" height="45" style="margin-left: 20px" src="/static/img/tanssi_net_logo_white.png" alt="Logo"/></a> 115</div> 116 117 118 119 120 121 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> 122 <span class="navbar-toggler-icon"></span> 123</button> 124 125 126 127 128 129<div class="collapse navbar-collapse" id="navbarSupportedContent"> 130 131 <ul class="list-unstyled navbar-nav"> 132 133 <li class="nav-item "> 134 <a class="nav-link" href="https://tanssi.io/cal/today/">Tänään</a> 135 </li> 136 <li class="nav-item "> 137 <a class="nav-link" href="https://tanssi.io/cal/events/">Kalenteri</a> 138 </li> 139 140 <li class="nav-item "> 141 <a class="nav-link" href="https://tanssi.io/cal/venues/">Paikat</a> 142 </li> 143 <li class="nav-item "> 144 <a class="nav-link" href="https://tanssi.io/cal/regions/">Maakunnat</a> 145 </li> 146 <li class="nav-item active"> 147 <a class="nav-link" href="https://tanssi.io/cal/performers/">Esiintyjät</a> 148 </li> 149 <li class="nav-item "> 150 <a class="nav-link" href="https://a.tanssi.io/routes/">Reitit</a> 151 </li> 152 <li class="nav-item "> 153 <a class="nav-link" href="https://a.tanssi.io/search/events/list/">Haku</a> 154 </li> 155 156 157 158 159 160 161 <li class="nav-item d-block d-lg-none" 162 hx-get="https://a.tanssi.io/accounts/user-info/navbar/" 163 hx-vals='{"p": "/cal/performers/83ae10f0-7016-41a3-8be4-83fdf4455ec6/"}' 164 hx-swap="outerHTML" 165 hx-trigger="load" 166 hx-timeout="10000" 167 hx-request='{"credentials": true}' 168 > 169 <div> 170 <a class="foo1 nav-link " href="https://a.tanssi.io/accounts/login/">Kirjaudu sisään</a>h 171 <a class="foo1 nav-link " href="https://a.tanssi.io/accounts/register/">Rekisteröidy</a> 172 </div> 173 </li> 174 175 176 177 </ul> 178</div> 179 180 <div class="d-none d-lg-block ms-auto me-1"> 181 <ul class="list-unstyled navbar-nav"> 182 183 184 185 186 187 188 189 190 191 192 193 194 <li class="nav-item d-none d-flex align-items-end d-lg-block dropdown " 195 x-data="{ showErrors: false }" 196 x-show="!showErrors" 197 hx-get="https://a.tanssi.io/accounts/user-info/navbar-dropdown/" 198 hx-vals='{"p": "/cal/performers/83ae10f0-7016-41a3-8be4-83fdf4455ec6/"}' 199 hx-trigger="load delay:100ms" 200 hx-timeout="10000" 201 hx-swap="outerHTML" 202 x-on:htmx:before-request="this.showErrors = false" 203 x-on:htmx:after-request="if ($event.detail.failed) { this.showErrors = true }" 204 > 205 <span class="text-white spinner-border spinner-border" role="status" aria-hidden="true"></span><span class="nav-text text-white "> Loading ...</span> 206 </li> 207 <li x-cloak x-show="showErrors" class="nav-item"> 208 <a class="nav-link" href="https://a.tanssi.io/accounts/login/">Kirjaudu sisään</a> 209 </li> 210 <li x-cloak x-show="showErrors" class="nav-item"> 211 <a class="nav-link" href="https://a.tanssi.io/accounts/register/">Rekisteröidy</a> 212 </li> 213 214 215 216 217 218 219<li class="nav-item"> 220 <a class="nav-link" title="Sivulatauksia viimeisen 30 päivän aikana, klikkaamalla näet historian" data-bs-toggle="tooltip" href="https://tanssi.io/cal/stats/"><i class="bi bi-bar-chart-line"></i> 1.9M</a> 221</li> 222 223 </ul> 224 </div> 225 </div> 226 </nav> 227 </div> 228 229 <div class="container mt-3"> 230 231 232 233 234<div class="ad d-none m-0" 235 236 x-init=" 237 $nextTick(() => { 238 htmx.trigger($el, 'reload-this'); 239 }) 240 " 241 hx-trigger="reload-this" 242
243 hx-get="/components/ad/ad/" 244 hx-target="this" 245 hx-swap="outerHTML" 246 x-bind:hx-vals="JSON.stringify({ 247 248 249 'd': 'a', 250 251 252 'z': 'header', 253 254 255 'c': 'other', 256 257 258 'w': (window.innerWidth > 0) ? window.innerWidth : screen.width, 259 })" 260 data-djc-id-cDj0xt8=""> 261</div> 262 263 264 265 </div> 266 267 <div id="content"> 268 269 <div class="row w-100"> 270 <div class="col col-auto d-none d-lg-block d-print-none" id="sidenav-container"> 271 <div class="container-fluid h-100 mx-0 g-0"> 272 273 </div> 274 </div> 275 <div class="col"> 276 277<div class="container"> 278<section> 279 280<h1>Neloset</h1> 281<p> 282Muokattu: 2.2.2024 283</p> 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313<div class="row mt-4"> 314 <div class="col"> 315 316 317 <div> 318 319 320 321 322 323<div class="event" x-show="!f || 'trad-fi'.indexOf(f) > -1" data-venue="aff4b0d4-296c-4b70-b199-7378733126aa" data-djc-id-cnqxt3f=""><small class="mt-3 mb-0"> 324 Forssan iltapäivätanssit<br/></small><h4 class="mt-0 mb-0 d-flex align-items-center"> 325 326<div 327 id="user-events-50742636-c0ea-4be9-a4f9-d483a2d3161e" 328 class="user_events" 329 x-show="window.UserInfo.hasFeature('https://a.tanssi.io', 'interests')" 330 x-data="{ 331 event_id: '50742636-c0ea-4be9-a4f9-d483a2d3161e', 332 status: null, 333 async init() { 334 let that = this; 335 window.UserInfo.getEventInterest('https://a.tanssi.io', '50742636-c0ea-4be9-a4f9-d483a2d3161e').then((eventInterest) => { 336 that.status = eventInterest; 337 }); 338 } 339 }" 340 x-init=" 341 status = await window.UserInfo.getEventInterest('https://a.tanssi.io', '50742636-c0ea-4be9-a4f9-d483a2d3161e'); 342 $watch('status', (v) => { window.UserInfo.setEventInterest('50742636-c0ea-4be9-a4f9-d483a2d3161e', v); $dispatch('save'); }) 343 " 344 data-djc-id-chkEWES=""> 345 <div class="user-events-button" 346 @click="status = !status || status === 'not-interested' ? 'interested' : (status === 'interested' ? 'going' : 'not-interested')" 347 > 348 <i class="bi" 349 data-bs-toggle="tooltip" 350 :data-bs-original-title="!status ? 'Lisää tapahtuma henkilökohtaiseen kalenteriisi' : (status === 'going' ? 'Menossa' : (status === 'interested' ? 'Kiinnostunut': 'En ole kiinnostunut'))" 351 :title="!status ? 'Lisää tapahtuma henkilökohtaiseen kalenteriisi' : (status === 'going' ? 'Menossa' : (status === 'interested' ? 'Kiinnostunut': 'En ole kiinnostunut'))" 352 :class="{ 353 'text-primary bi-calendar-plus': !status, 354 'text-primary bi-calendar-check-fill': status === 'going', 355 'text-primary bi-calendar-heart-fill': status === 'interested', 356 'text-primary bi-calendar-x-fill': status === 'not-interested' 357 }"></i> 358 </div> 359 <input 360 name="status" 361 type="hidden" 362 :value="status" 363 hx-trigger="save from:#user-events-50742636-c0ea-4be9-a4f9-d483a2d3161e" 364 hx-post="https://a.tanssi.io/components/user-events/user-events/" 365 hx-swap="none" 366 hx-vals="js:{ 367 'event_id': '50742636-c0ea-4be9-a4f9-d483a2d3161e', 368 }"/> 369</div> 370<span><span> </span><a class="link-opacity-0" href="/cal/events/50742636-c0ea-4be9-a4f9-d483a2d3161e/"><i class="bi bi-info-circle"></i></a></span><span> </span><span class="event-date"><a class="text-decoration-none text-black" href="/cal/events/2026/9/24/">To 24.9.2026</a></span></h4><a class="venue-link" href="/cal/venues/aff4b0d4-296c-4b70-b199-7378733126aa/">Forssan järjestöjentalo</a><br/><p class="mt-0 mb-3"><span><a class="performer-link" href="/cal/performers/83ae10f0-7016-41a3-8be4-83fdf4455ec6/">Neloset</a></span><br/><small><span data-event-type="trad-fi" class="event-type badge border border-primary text-primary">Lavatanssit</span>  371 372 Forssa | 10 ⬠| <span data-bs-toggle="tooltip" data-bs-placement="right" title="Päivätanssit loppuvat ennen klo 18">Päivätanssit</span> | 13 â 16<span class="event-distance with-separator" data-lat="60.814610" data-lon="23.614688"></span></small></p></div> 373 374 </div> 375 376 377 </div> 378</div> 379</section> 380</div> 381 382 383 384 </div> 385 </div> 386 </div> 387 388 <div class="container mt-3"> 389 390 391 392 393<div class="ad d-none m-0" 394 395 x-init=" 396 $nextTick(() => { 397 htmx.trigger($el, 'reload-this'); 398 }) 399 " 400 hx-trigger="reload-this" 401
402 hx-get="/components/ad/ad/" 403 hx-target="this" 404 hx-swap="outerHTML" 405 x-bind:hx-vals="JSON.stringify({ 406 407 408 'd': 'a', 409 410 411 'z': 'footer', 412 413 414 'c': 'other', 415 416 417 'w': (window.innerWidth > 0) ? window.innerWidth : screen.width, 418 })" 419 data-djc-id-cItOHyF=""> 420</div> 421 422 423 424 </div> 425 426 427 428 429 430 431<footer id="footer" class="mt-auto page-footer small pt-4 footer-text-color bg-primary"> 432 <div class="container-fluid text-left"> 433 <div class="row"> 434 <div class="col-lg-4 d-none d-lg-block"> 435 <img class="my-0 py-0" width="69" height="200" src="/static/img/tanssinet_footer_logo.png" alt="Logo"/> 436 </div> 437 <div class="col-12 col-lg-4"> 438 <h5>Tuki</h5> 439 440 <p> 441 <a href="https://a.tanssi.io/support/wizard/start/">Tukipyyntö</a> 442 </p> 443 444 <p> 445 Sähköposti ja puhelinnumero löytyvät <a href="https://tanssi.io/public/contact/">yhteystiedoista</a>. 446 </p> 447 448 <p> 449 <h3> 450 <a href="https://www.facebook.com/profile.php?id=61561894911334"><i class="bi bi-facebook"></i></a> 451 </h3> 452 </p> 453 </div> 454 455 <div class="col-12 col-lg-4"> 456 457 <h5>Tanssi.net</h5> 458 459 <ul class="list-unstyled footer-links text-light"> 460 <li> 461 <a class="text-white" href="https://tanssi.io/public/about/">Tietoa palvelusta</a> 462 </li> 463 464 <li> 465 <a class="text-white" href="https://tanssi.io/public/privacy-policy/">Rekisteri- ja tietosuojaseloste</a> 466 </li> 467 <li> 468 <a class="text-white" href="https://tanssi.io/public/instructions/">Ohjevideot</a> 469 </li> 470 <li> 471 <a class="text-white" href="https://a.tanssi.io/support/faq/">Usein Kysytyt Kysymykset</a> 472 </li> 473 <li> 474 <a class="text-white" href="https://tanssi.io/public/news/">Uutiset</a> 475 </li> 476 <li> 477 <a class="text-white" href="https://tanssi.io/public/contact/">Yhteystiedot</a> 478 </li> 479 <li> 480 <a class="text-white" href="https://tanssi.io/public/banner-sales/">Mediamyynti</a> 481 </li> 482 483 </ul> 484 </div> 485 </div> 486 </div> 487 <div class="footer-copyright text-center py-3">© 2025 Copyright <a class="text-white" href="https://kalenterppi.com/">Kalenterppi Oy</a> | 0.1011.0 | 24.9.2026 23:52:02 488 </div> 489</footer> 490 491 492
492<script src="/static/js/userinfo.js"></script>
492 493 494 <div class="alert-messages"> 495 496</div> 497 498 499 500 501 502 503
503<script src="/static/django_components/django_components.min.js"></script>
503<script type="application/json" data-djc>{"loadedCssUrls": ["L2NvbXBvbmVudHMvY2FjaGUvVXNlckV2ZW50c18zYTNkOWMuY3Nz"], "loadedJsUrls": [], "toLoadCssTags": [], "toLoadJsTags": []}</script>
503 504</body> 505</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.