PageSourceSearch

https://milkychance.net/4/js/functions.js?v=5728836

js milkychance.net collected 2026-10-03 17:36:06 UTC 73,237 bytes, 1,972 lines download raw bytes

1// milkychance | 4 | functions.js
2
3// ------------ scroll to 0 ------------ /
4// window.scrollTo(0,0);
5// window.onbeforeunload = function(){ window.scrollTo(0,0); };
6var cachecontrol = getCacheControl();
7
8function doCtrl() {
9    doLog("doCtrl()");
10	// hi ;)
11}
12
13function onPageReady() {
14	doLog("onPageReady");
15	getConf();
16    initHeader();
17	initEffects();
18    doTruncate('.text_truncate', 9);
19	initCarousels();
20	initSvg();
21	if (main == "index") {
22		initNav();
23        hidePreloader();
24        // initMasonry();
25	}
26	initFancybox();
27    checkLinks();
28	onResize();
29	initResize();
30    sInit();
31	sRefresh();
32    lazySizes.init();
33}
34
35function onPageLoaded() {
36	doLog("onPageLoaded");
37	sRefresh();
38	setTimeout(function() { 
39		initAudioplayer();
40        initMusicplayer();
41        initNewsletter();
42	}, 5000);
43	setTimeout(function() { 
44        $('.carousel-holder-size-detect-auto .carousel').flickity('resize');
45	}, 1500);
46}
47
48function hidePreloader() {
49	$('#loading-animation').removeClass("fadeIn");
50	$('#loading-animation').addClass("animated_manual_animation fadeOut");
51	$('#preloader').delay(500).fadeOut(500);
52
53	setTimeout(function() {
54		$('.header_norm .social .animated_manual').each( function() {
55			var elem = $(this);
56			if ( !elem.hasClass('visible') ) {
57				var animationDelay = elem.data('animation-delay');
58				var animation = elem.data('animation');
59				if ( animationDelay ) {
60					setTimeout(function(){
61						elem.addClass( animation + " animated_manual_animation visible" );
62					}, animationDelay);
63				} else {
64					elem.addClass( animation + " animated_manual_animation visible" );
65				}
66			}
67		});
68	}, 2000);
69    
70	$('#teaser .animated_manual').each( function() {
71		var elem = $(this);
72		if ( !elem.hasClass('visible') ) {
73			var animationDelay = elem.data('animation-delay');
74			var animation = elem.data('animation');
75			if ( animationDelay ) {
76				setTimeout(function(){
77					elem.addClass( animation + " animated_manual_animation visible" );
78				}, animationDelay);
79			} else {
80				elem.addClass( animation + " animated_manual_animation visible" );
81			}
82		}
83	});
84}
85
86function skipIntro() {
87	doScroll('#products');
88	volume_bg_video(0);
89}
90
91function onResize() {
92	Waypoint.refreshAll();
93}
94
95
96// ------------ passion-special ------------ //
97
98function initDrawPassion() {
99   
100    var obj = JSON.parse(wavesPassion);
101    var c = document.getElementById("drawcanvas-passion");
102    var ctx = c.getContext("2d");
103    var h = c.height;
104    var w = c.width;
105    ctx.strokeStyle = '#666';
106    ctx.lineWidth = 10;
107    var max_i = 158; // obj.data.length;
108    var i = 100;
109    var myDrawTimer;
110
111
112    var dot1 = document.getElementById("passion-dot1");
113    var dot2 = document.getElementById("passion-dot2");
114    var dot3 = document.getElementById("passion-dot3");
115    var dot4 = document.getElementById("passion-dot4");
116    var dot5 = document.getElementById("passion-dot5");
117    var dot6 = document.getElementById("passion-dot6");
118    var dot7 = document.getElementById("passion-dot7");
119    var dot8 = document.getElementById("passion-dot8");
120    var dot9 = document.getElementById("passion-dot9");
121    var dot10 = document.getElementById("passion-dot10");
122    
123    var noise1 = document.getElementById("passion-noise1");
124    var noise2 = document.getElementById("passion-noise2");
125    var noise3 = document.getElementById("passion-noise3");
126
127    var noise4 = document.getElementById("passion-noise4");
128    var noise5 = document.getElementById("passion-noise5");
129    var noise6 = document.getElementById("passion-noise6");
130    
131    var dot_w = 60;
132    var dot_h = 60;
133    var min_p = 100;
134    var max_p = 0;
135
136    function startDraw() {
137        myDrawTimer= setInterval(doShine, 35);
138    }
139
140    function stopDraw() {
141        clearInterval(myDrawTimer);
142        // console.log("min_p: " + min_p + ", max_p: " + max_p);
143    }
144    
145    function doShine() {
146        ctx.clearRect(0, 0, w, h);
147        ctx.beginPath();
148        
149        i++;
150        if (i > max_i) {
151            i = 0;   
152        }
153        
154        let cx = w / 2;
155        let cy = h / 2;
156        let r = h / 4;
157        let percent = (h / 2 - r) / 255;
158        let point_count = 64; // -> 64 immer doppelt so viel wie striche erwuenscht
159        let increase = (360 / point_count) * Math.PI / 180;
160        
161        for (let point = 1; point <= point_count; point++) {
162            var myPoint = point - 1;
163            let p = obj.data[i][myPoint]; // data[600 % point]; // get value
164            p *= percent;
165            // point++; //start at 1
166            let a = point * increase;
167
168            let sx = cx + r * Math.cos(a);
169            let sy = cy + r * Math.sin(a);
170            ctx.moveTo(sx, sy);
171
172            let dx = cx + (r + p) * Math.cos(a);
173            let dy = cy + (r + p) * Math.sin(a);
174            ctx.lineTo(dx, dy);
175            
176            // ctx.drawImage(dot5,0,0,200,200,dx,dy,dot_w,dot_h);
177            drawDot(dx,dy,p);
178        }
179        
180        var j;
181        // pink noise
182        for (j = 1; j <= 10; j++) {
183            var tmp_x = myRandom(0, (w - dot_w));
184            var tmp_y = myRandom(0, (h - dot_h));
185            ctx.drawImage(noise1,0,0,200,200,tmp_x,tmp_y,dot_w,dot_h);
186        }
187        for (j = 1; j <= 5; j++) {
188            var tmp_x = myRandom(0, (w - dot_w));
189            var tmp_y = myRandom(0, (h - dot_h));
190            ctx.drawImage(noise2,0,0,200,200,tmp_x,tmp_y,dot_w,dot_h);
191        }
192        for (j = 1; j <= 2; j++) {
193            var tmp_x = myRandom(0, (w - dot_w));
194            var tmp_y = myRandom(0, (h - dot_h));
195            ctx.drawImage(noise3,0,0,200,200,tmp_x,tmp_y,dot_w,dot_h);
196        }
197        
198        // yellow noise
199        for (j = 1; j <= 3; j++) {
200            var tmp_x = myRandom(0, (w - dot_w));
201            var tmp_y = myRandom(0, (h - dot_h));
202            ctx.drawImage(noise4,0,0,200,200,tmp_x,tmp_y,dot_w,dot_h);
203        }
204        for (j = 1; j <= 3; j++) {
205            var tmp_x = myRandom(0, (w - dot_w));
206            var tmp_y = myRandom(0, (h - dot_h));
207            ctx.drawImage(noise5,0,0,200,200,tmp_x,tmp_y,dot_w,dot_h);
208        }
209        for (j = 1; j <= 3; j++) {
210            var tmp_x = myRandom(0, (w - dot_w));
211            var tmp_y = myRandom(0, (h - dot_h));
212            ctx.drawImage(noise6,0,0,200,200,tmp_x,tmp_y,dot_w,dot_h);
213        }
214        // ctx.stroke();
215    }
216
217
218    function drawDot(a,b,p) {
219        // console.log("drawDot Before(" + a + "," + b + "," + p + ")");
220        p = Math.round((p * 100) / 340);
221        if (p < min_p) {
222            min_p = p;
223        }
224        if (p > max_p) {
225            max_p = p;
226        }
227        // console.log("drawDot(" + a + "," + b + "," + p + ")");
228        a = Math.round(a + myRandom(-10, 10));
229        b = Math.round(b - 50);
230        
231        // min_p: 28, max_p: 84
232
233        switch(true) {
234            case p > 80:
235                // ctx.drawImage(dot10,0,0,200,200,a,b,dot_w*2,dot_h*2);
236                ctx.drawImage(dot1,0,0,200,200,a,b,dot_w,dot_h);
237                break;
238            case p > 70:
239                // ctx.drawImage(dot9,0,0,200,200,a,b,dot_w*1.9,dot_h*1.9);
240                ctx.drawImage(dot2,0,0,200,200,a,b,dot_w,dot_h);
241                break;
242            case p > 65:
243                // ctx.drawImage(dot8,0,0,200,200,a,b,dot_w*1.8,dot_h*1.8);
244                ctx.drawImage(dot3,0,0,200,200,a,b,dot_w,dot_h);
245                break;
246            case p > 50:
247                // ctx.drawImage(dot7,0,0,200,200,a,b,dot_w*1.7,dot_h*1.7);
248                ctx.drawImage(dot4,0,0,200,200,a,b,dot_w,dot_h);
249                break;
250            case p > 55:
251                // ctx.drawImage(dot6,0,0,200,200,a,b,dot_w*1.6,dot_h*1.6);
252                ctx.drawImage(dot5,0,0,200,200,a,b,dot_w,dot_h);
253                break;
254            case p > 50:
255                // ctx.drawImage(dot5,0,0,200,200,a,b,dot_w*1.5,dot_h*1.5);
256                ctx.drawImage(dot6,0,0,200,200,a,b,dot_w,dot_h);
257                break;
258            case p > 45:
259                // ctx.drawImage(dot4,0,0,200,200,a,b,dot_w*1.4,dot_h*1.4);
260                ctx.drawImage(dot7,0,0,200,200,a,b,dot_w,dot_h);
261                break;
262            case p > 40:
263                // ctx.drawImage(dot3,0,0,200,200,a,b,dot_w*1.3,dot_h*1.3);
264                ctx.drawImage(dot8,0,0,200,200,a,b,dot_w,dot_h);
265                break;
266            case p > 30:
267                // ctx.drawImage(dot2,0,0,200,200,a,b,dot_w*1.2,dot_h*1.1);
268                ctx.drawImage(dot9,0,0,200,200,a,b,dot_w,dot_h);
269                break;
270            default:
271                // ctx.drawImage(dot1,0,0,200,200,a,b,dot_w*1.1,dot_h*1.1);
272                ctx.drawImage(dot10,0,0,200,200,a,b,dot_w,dot_h);
273                break;
274        }
275
276    }
277    
278    startDraw();
279
280}
281
282// ------------ vienna-special ------------ //
283
284function initDrawVienna() {
285    
286    var obj = JSON.parse(wavesVienna);
287    var c = document.getElementById("drawcanvas-vienna");
288    var ctx = c.getContext("2d");
289    var h = c.height;
290    var w = c.width;
291    ctx.strokeStyle = '#fff';
292    ctx.lineWidth = 10;
293    var max_i = 150; // obj.data.length;
294    var i = 100;
295    var myDrawTimer;
296
297    var dot1 = document.getElementById("vienna-dot1");
298    var dot2 = document.getElementById("vienna-dot2");
299    var dot3 = document.getElementById("vienna-dot3");
300    var dot4 = document.getElementById("vienna-dot4");
301    var dot5 = document.getElementById("vienna-dot5");
302    var dot6 = document.getElementById("vienna-dot6");
303    var dot7 = document.getElementById("vienna-dot7");
304    var dot8 = document.getElementById("vienna-dot8");
305    var dot9 = document.getElementById("vienna-dot9");
306    var dot10 = document.getElementById("vienna-dot10");
307    var dot_w = 30;
308    var dot_h = 60;
309    var min_p = 100;
310    var max_p = 0;
311
312    function startDraw() {
313        myDrawTimer= setInterval(doWave, 50);
314    }
315
316    function stopDraw() {
317        clearInterval(myDrawTimer);
318        // console.log("min_p: " + min_p + ", max_p: " + max_p);
319    }
320
321    function doWave() {
322        ctx.clearRect(0, 0, w, h);
323        i++;
324        if (i > max_i) {
325            i = 50;   
326        }
327
328        var cx = w / 2;
329        var cy = h / 2;
330        var r = h / 3.5;
331        var percent = h / 255;
332        var point_count = 64; // -> 64 immer doppelt so viel wie striche erwuenscht
333        var increase = (w / point_count);
334
335        for (var point = 1; point <= point_count; point++) {
336            var myPoint = point;
337            var p = obj.data[i][myPoint]; // data[600 % point]; // get value
338            var b = Math.round(p * percent);
339            var a = Math.round(point * increase);
340            point++; // nur jeden 2. malen -> 32 striche
341            drawDot(a,b,p);
342        }
343    }
344
345    function drawDot(a,b,p) {
346        p = Math.round((p * 100) / 255);
347        if (p < min_p) {
348            min_p = p;
349        }
350        if (p > max_p) {
351            max_p = p;
352        }
353        // console.log("drawDot(" + a + "," + b + "," + p + ")");
354        a = Math.round((a * 0.7) + myRandom(-1, 1) + (w * 0.1));
355        b = Math.round(b / 1.5);
356        // min_p: 28, max_p: 84
357        switch(true) {
358            case p > 95:
359                ctx.drawImage(dot10,0,0,100,200,a,b,dot_w*2,dot_h*2);
360                break;
361            case p > 87:
362                ctx.drawImage(dot9,0,0,100,200,a,b,dot_w*1.9,dot_h*1.9);
363                break;
364            case p > 85:
365                ctx.drawImage(dot8,0,0,100,200,a,b,dot_w*1.8,dot_h*1.8);
366                break;
367            case p > 80:
368                ctx.drawImage(dot7,0,0,100,200,a,b,dot_w*1.7,dot_h*1.7);
369                break;
370            case p > 75:
371                ctx.drawImage(dot6,0,0,100,200,a,b,dot_w*1.6,dot_h*1.6);
372                break;
373            case p > 70:
374                ctx.drawImage(dot5,0,0,100,200,a,b,dot_w*1.5,dot_h*1.5);
375                break;
376            case p > 65:
377                ctx.drawImage(dot4,0,0,100,200,a,b,dot_w*1.4,dot_h*1.4);
378                break;
379            case p > 55:
380                ctx.drawImage(dot3,0,0,100,200,a,b,dot_w*1.3,dot_h*1.3);
381                break;
382            case p > 50:
383                ctx.drawImage(dot2,0,0,100,200,a,b,dot_w*1.2,dot_h*1.1);
384                break;
385            default:
386                ctx.drawImage(dot1,0,0,100,200,a,b,dot_w*1.1,dot_h*1.1);
387                break;
388        }
389
390    }
391    
392    startDraw();
393
394}
395
396// ------------ skrollr ------------ //
397
398var s;
399var lastDocumentWidth = 0;
400var lastDocumentHeight = 0;
401var sRefreshTimeout;
402
403function sInit() {
404    s = skrollr.init({ forceHeight:false, mobileBreakpoint:860 });
405}
406
407function sRefresh() {
408    var width = $(document).width();
409    var height = $(document).height();
410    if (height !== lastDocumentHeight || width !== lastDocumentWidth) {
411        // only refresh if the size actually changed // console.log("document width/height has changed to: " + width + "/" + height);
412        lastDocumentWidth = width;
413        lastDocumentHeight = height;
414        clearTimeout(sRefreshTimeout);
415		sRefreshTimeout = setTimeout(doRefresh, 250);
416    }
417	initCopyButtons();
418}
419
420function doRefresh() {
421    s.refresh();
422    Waypoint.refreshAll();
423}
424
425// ------------ effects ------------ //
426
427function unSticky(el) {
428    $(el).slideUp("fast", function() { 
429        $(el).css({"position":"relative","top":"auto","display":"block"});
430        $(el).find(".close").remove();
431    });
432}
433
434function initEffects() {
435    initAnims();
436    if (document.getElementById("drawcanvas-vienna")) {
437        initDrawVienna();
438    }
439    if (document.getElementById("drawcanvas-passion")) {
440        initDrawPassion();
441    }
442}
443    
444function initAnims() {
445	$.appear('.animated', { force_process:true });
446	$('.animated').on('appear', function() {
447		var elem = $(this);
448		var animation = elem.data('animation');
449		if (!elem.hasClass('visible')) {
450			var animationDelay = elem.data('animation-delay');
451			if (animationDelay) {
452				setTimeout(function() {
453					elem.addClass(animation + " visible");
454				}, animationDelay);
455			} else {
456				elem.addClass(animation + " visible");
457			}
458		}
459	});
460	$('.animated').on('disappear', function() {
461		var elem = $(this);
462		var animation = elem.data('animation');
463		if (elem.hasClass('visible')) {
464			elem.removeClass(animation + " visible");
465		}
466	});
467	$(window).on("load", function() {
468		$('.onstart').each(function() {
469			var elem = $(this);
470			if (!elem.hasClass('visible')) {
471				var animationDelay = elem.data('animation-delay');
472				var animation = elem.data('animation');
473				if (animationDelay) {
474					setTimeout(function() {
475						elem.addClass(animation + " visible");
476					}, animationDelay);
477				} else {
478					elem.addClass(animation + " visible");
479				}
480			}
481		});
482	});
483}
484
485function initAnimsManual(target) {
486	$(target).appear();
487	$(target).on('appear', function() {
488		var elem = $(this);
489		var animation = elem.data('animation');
490		if (!elem.hasClass('visible')) {
491			var animationDelay = elem.data('animation-delay');
492			if (animationDelay) {
493				setTimeout(function(){
494					elem.addClass(animation + " visible");
495				}, animationDelay);
496			} else {
497				elem.addClass(animation + " visible");
498			}
499		}
500	});
501}
502
503function doAnim(elem, effect, remove) {
504	if (remove === false) { 
505		$(elem).addClass("animated_manual_animation " + effect).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function() {});
506	} else {
507		$(elem).addClass("animated_manual_animation " + effect).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function() {
508			$(elem).removeClass("animated_manual_animation");
509			$(elem).removeClass(effect);
510		});
511		$(elem).removeClass('animated_manual');
512	}
513}
514
515// ------------ inits ------------ /
516
517// https://stackoverflow.com/questions/9038625/#answer-9039885, https://stackoverflow.com/questions/7944460/
518var isiOS = ['iPad Simulator','iPhone Simulator','iPod Simulator','iPad','iPhone','iPod'].includes(navigator.platform)||(navigator.userAgent.includes("Mac")&&"ontouchend"in document);
519var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && navigator.userAgent.indexOf('CriOS') == -1 && navigator.userAgent.indexOf('FxiOS') == -1;
520var isSafariMac = false;
521
522function getConf() {
523	if (device == "") {
524		// http://stackoverflow.com/questions/3514784/
525		var ua = navigator.userAgent.toLowerCase(); doLog("ua: " + ua);
526        var vendor = navigator.vendor;
526 doLog("vendor: " + vendor);
527		if (ua.match(/webos/i)) { device = "webos"; }
528		if (ua.match(/opera mini/i)) { device = "opera mini"; }		
529		if (ua.match(/mobile/i)) { device = "mobile"; }
530		if (ua.match(/ipad/i)) { device = "ipad"; }
531		if (ua.match(/ipod|iphone/i)) { device = "iphone"; }
532		if (ua.match(/blackberry/i)) { device = "blackberry"; }
533		if (ua.match(/android/i)) { device = "android"; }
534		if (ua.match(/kindle/i)) { device = "kindle"; }
535		if (ua.match(/windows phone/i)) { device = "windows phone"; }
536		if (ua.match(/iemobile/i)) { device = "iemobile"; }
537		if (ua.match(/tablet/i)) { device = "tablet"; }
538    }
539    if (isSafari && isiOS) {
540        isSafariMac = false; doLog("safari on ios");
541    } else {
542        if (isSafari) { isSafariMac = true; doLog("safari on mac"); }
543    }
544	doLog("getConf() -> device: " + device);
545	if (device === "ipad" || device === "tablet") { $("#viewport_id").attr("content", "width=device-width, initial-scale=1"); } // set viewport
546	if (device !== "") {
547		$("#body_id").removeClass("desktop").addClass("device"); // set body-class, default: desktop
548	}
549	if (isiOS) {
550		$("#body_id").addClass("iOS");
551	}
552}
553
554
555// ------------------------ gallery ------------------------ //
556var $grid;
557
558var masonryOptions = {
559    itemSelector: '.grid-item',
560    // columnWidth: 80,
561    gutter: 30
562};
563
564function initMasonry() {
565	$grid = $('.grid').masonry(masonryOptions);
566}
567
568function destroyMasonry() {
569	$grid.masonry('destroy');
570}
571
572
573// ------------ load section-content ------------ //
574function getItems(section,type,subtype) {
575	doLog("getItems('" + section + "," + type + "," + subtype + "')");
576	saveHistory(section,type,subtype,"");
577	$.ajax({
578		url: "/" + base + "/section_" + section + "_get_items.php",
579		data: "section=" + section + "&type=" + type + "&subtype=" + subtype + "&lang=" + lang + "&device=" + device + "&country=" + country,
580		method: "GET",
581		dataType: "html",
582		cache: false,
583		beforeSend: function() {
584			$("#" + section + " ul.sub_nav li").removeClass("on");
585			$("#" + section + "_items ul.itemlist").empty();
586			$("#" + section + "_items .more").html('<div class="loading"><div class="icon icon-spin5 animate-spin"></div></div>');
587            if (section == "gallery") {
588                destroyMasonry();
589                $('.grid').empty();
590            }
591		},
592		success: function(data) {
593            $("#" + section + "_items ul.itemlist").attr("class","itemlist type-" + type + " clearfix"); // gregorian special
594			$("#" + section + " ul.sub_nav li.type" + type).addClass("on");
595            if (section == "gallery") {
596                initMasonry();
597                var $content = $(data);
598                $grid.append($content).masonry('appended', $content);
599                setTimeout(function(){ $grid.masonry(); }, 100);
600            } else {
601                $("#" + section + "_items ul.itemlist").append(data);
602                initSvg("#" + section);
603            }
604		},
605		error: function(XMLHttpRequest, textStatus, errorThrown) {
606			// alert("Error:" + errorThrown + "(" + XMLHttpRequest.status + ")");
607		},
608		complete: function() {
609			sRefresh();
610		}
611	});
612}
613
614function getMoreItems(section,start,limit,type,subtype,id,modus) {
615	doLog("getMoreItems('" + section + "," + start + "," + limit + "," + type + "," + subtype + "," + id + "," + modus + "')");
616	if (start < 0) { start = 0; }
617	$.ajax({
618		url: "/" + base + "/section_" + section + "_get_items.php",
619		data: "section=" + section + "&start=" + start + "&limit=" + limit + "&type=" + type + "&subtype=" + subtype + "&id=" + id + "&lang=" + lang + "&device=" + device + "&country=" + country,
620		method: "GET",
621		dataType: "html",
622		cache: false,
623		beforeSend: function() {
624			$("#" + section + "_items .more").html('<div class="loading"><div class="icon icon-spin5 animate-spin"></div></div>');
625		},
626		success: function(data) {
627            $("#" + section + "_items ul.itemlist").attr("class","itemlist type-" + type + " clearfix"); // gregorian special
628			if (modus === "clear") {
629				$("#" + section + "_items ul.itemlist").empty().append(data);
630			} else {
631                if (section == "gallery") {
632                    var $content = $(data);
633                    $grid.append($content).masonry('appended', $content);
634                    setTimeout(function(){ $grid.masonry(); }, 100);
635                } else {
636                    $("#" + section + "_items ul.itemlist").append(data);
637                    initSvg("#" + section);
638                }
639			}
640		},
641		error: function(XMLHttpRequest, textStatus, errorThrown) {
642			// alert("Error:" + errorThrown + "(" + XMLHttpRequest.status + ")");
643		},
644		complete: function() {
645			sRefresh();
646		}
647	});
648}
649
650function getItem(section,type,subtype,id,autoplay) {
651	doLog("getItem(" + section + "," + type + "," + subtype + "," + id + "," + autoplay + ")");
652	saveHistory(section,type,subtype,id);
653	var ausdruck = /^(\d*)?$/;   // \d = digit, \w = word, ? = egal wievielmal vorher (zb. egal wieviel buchstaben)
654	if (ausdruck.exec(id)) {
655		// alert("valid request ->\n id:" + RegExp.$1);
656		var id = RegExp.$1;
657		var feedback_id = "#" + section + "_container";
658		$.ajax({
659			url: "/" + base + "/section_" + section + "_get_item.php",
660			data: "type=" + type + "&subtype=" + subtype + "&id=" + id + "&autoplay=" + autoplay + "&lang=" + lang + "&device=" + device + "&country=" + country,
661			method: "GET",
662			dataType: "html",
663			cache: false,
664			beforeSend: function() {
665				$("#" + section + " ul.sub_nav li").removeClass("on");
666                $("#" + section + "_holder").removeClass(function (index, className) { return (className.match (/(^|\s)type-\S+/g) || []).join(' '); }); // https://stackoverflow.com/questions/2644299/
667                $("#" + section + "_holder").addClass("type-" + type);
668				$("#" + section + "_holder").slideDown(1000);
669				$("#" + section + "_title").empty().append("Loading...");
670				$(feedback_id).html('<div class="loading"><div class="icon icon-spin5 animate-spin"></div></div>');
671			},
672			success: function(data) {
673				$("#" + section + " ul.sub_nav li.type" + type).addClass("on");
674				$(feedback_id).empty().append(data);
675                initSvg(feedback_id);
676			},
677			error: function(XMLHttpRequest, textStatus, errorThrown) {
678				// alert("Error:" + errorThrown + "(" + XMLHttpRequest.status + ")");
679			},
680			complete: function() {
681				sRefresh();
682			}
683		});
684	} else {
685		alert("invalid request");
686	}
687}
688
689function setItem(section, id, txt) {
690	// doLog("setItem(" + section + "," + id + "," + txt + ")");
691	if (section === "video") {
692		ytFirstStart = false;
693		$("#video_title").empty().append(urldecode(txt));
694	}
695	$("." + section + "_items ul li").removeClass("on");
696	$("." + section + "_items ul li.item" + id).addClass("on");
697	sRefresh();
698}
699
700// ------------------------ history ------------------------ //
701function getContent(itemLang,itemSection,itemName,itemType,itemSubtype,itemId,itemStart) {
702	// alert("getContent(" + itemLang + "," + itemSection + "," + itemName + "," + itemType + "," + itemSubtype + "," + itemId + "," + itemStart + ")");
703	doStop();
704	var data = {lang:itemLang,section:itemSection,type:itemType,subtype:itemSubtype,id:itemId,start:itemStart};
705	var theTitle = itemLang + "|" + itemSection + "|" + itemType + "|" + itemSubtype + "|" + itemId + "|" + itemStart;	
706	var theUrl = "/" + itemSection + "/" + itemName + "-" + itemType + "-" + itemSubtype + "-" + itemId + "-" + itemStart + ".html";
707	// base + "/" + // + itemLang + "/"
708	// var theUrl = "/" + itemSection + "/" + itemName + "-" + itemType + "-" + itemSubtype + "-" + itemId + "-" + itemStart + ".html"; // special: itemLang always "en"
709	if (itemName == "" && itemType == "" && itemSubtype == "" && itemId == "" && itemStart == "") {
710		theUrl = "/" + itemSection + "/"; // base + "/" 
711	}
712    updateContent(data);
713    if (window.history && window.history.pushState) {		
714		history.pushState(data, theTitle, theUrl); // add an item to the history log // http://stackoverflow.com/questions/11932869/ 
715	}
716	// tracking: var tmp_virtualpage = "/" + base + "/" + itemLang + "/" + itemSection + "/" + itemName + "-" + itemType + "-" + itemSubtype + "-" + itemId + "/"; var tmp_title = itemSection + ": " + itemName.replace(/-/g, " "); doTrackPage(tmp_virtualpage,tmp_title);
717}
718
719function setHistory(itemLang,itemSection,itemName,itemType,itemSubtype,itemId,itemStart) {
720	doLog("setHistory(" + itemLang + "," + itemSection + "," + itemName + "," + itemType + "," + itemSubtype + "," + itemId + "," + itemStart + ")");
721	var data = {lang:itemLang,section:itemSection,type:itemType,subtype:itemSubtype,id:itemId,start:itemStart};
722	var theTitle = itemLang + "|" + itemSection + "|" + itemType + "|" + itemSubtype + "|" + itemId + "|" + itemStart;	
723	var theUrl = "/" + itemSection + "/" + itemName + "-" + itemType + "-" + itemSubtype + "-" + itemId + "-" + itemStart + ".html";
724	// base + "/" + // + itemLang + "/" 
725	// var theUrl = "/" + itemSection + "/" + itemName + "-" + itemType + "-" + itemSubtype + "-" + itemId + "-" + itemStart + ".html"; // special: itemLang always "en"
726	if (itemName == "" && itemType == "" && itemSubtype == "" && itemId == "" && itemStart == "") {
727		theUrl = "/" + itemSection + "/"; // base + "/" + // + itemLang + "/" 
728	}
729    if (window.history && window.history.pushState) {		
730		history.pushState(data, theTitle, theUrl); // add an item to the history log // http://stackoverflow.com/questions/11932869/ 
731	}
732}
733
734if (window.history && window.history.pushState) {		
735	// revert to a previously saved state
736	window.addEventListener('popstate', function(event) {
737		// doLog('popstate fired!');
738		updateContent(event.state);
739	});	
740}
741
742function updateContent(data) {
743    if (data == null) { return; }
744	doShow(data.section,data.type,data.subtype,data.id,1);	
745}
746				
747function doShow(section,type,subtype,id,autoplay) {
748	doLog("doShow(" + section + "," + type + "," + subtype + "," + id + "," + autoplay + ")");
749	/* type = parseInt(type);subtype = parseInt(subtype);id = parseInt(id);autoplay = parseInt(autoplay); */
750	var ausdruck = /^(\w*)?$/;   // \d = digit, \w = word, ? = egal wievielmal vorher (zb. egal wieviel buchstaben)
751	var yOffset = -1 * $(".header_norm").height();
752	if (ausdruck.exec(id) && id != "" && id != 0 && id != undefined && id != null) {
753		// prio 1: id
754		var tmp_id = RegExp.$1;
755		doLog("id detected: " + tmp_id);
756		var tmp_type = "";
757		if (ausdruck.exec(type) && type != "" && type != 0 && type != undefined && type != null) {
758			var tmp_type = RegExp.$1;
759			doLog("type detected: " + tmp_type);
760		}
761		// if onepager:
762		if (section != "dates") {
763			if (hist[section]["type"] != tmp_type) {
764				getItems(section,tmp_type,subtype); // only reload items if type changes
765			}
766			getItem(section,tmp_type,subtype,tmp_id,autoplay);
767		}
768		section = section + "_scroll"; // scrollpoint
769		yOffset -= 20;
770	} else {
771		if (ausdruck.exec(subtype) && subtype != "" && subtype != 0 && subtype != undefined && subtype != null) {
772			// prio 2: subtype
773			var tmp_subtype = RegExp.$1;
774			doLog("subtype detected: " + tmp_subtype);
775			if (hist[section]["type"] != type) {
776				getItems(section,type,tmp_subtype); // only reload items if type changes
777			}
778			getItem(section,type,tmp_subtype,id,autoplay);
779			section = section + "_scroll"; // scrollpoint
780			yOffset -= 20;
781		} else {
782			// prio 3: type
783			if (ausdruck.exec(type) && type != "" && type != 0 && type != undefined && type != null) {
784				var tmp_type = RegExp.$1;
785				doLog("type detected: " + tmp_type);
786				$("#" + section + "_holder").slideUp("fast");
787				$("#" + section + "_holder ." + section + "_container").empty();
788				getItems(section,tmp_type,subtype);
789			} else {
790				// prio 4: no type, no subtype, no id -> clear section_holder
791				if (type == "" && subtype == "" && id == "") {
792					doLog("clear of section detected. vars: " + section + "," + type + "," + subtype + "," + id);
793					$("#" + section + "_holder").slideUp("slow", function() {
794						$("#" + section + "_holder ." + section + "_container").empty();
795						$("#" + section + " .itemlist_header").slideUp("fast");
796						getItems(section,"","");
797					});
798				}
799			}
800		}
801	}
802    yOffset = 0;
803	$.scrollTo("#" + section, 1250, {
804		axis: "y",
805		offset: yOffset,
806		onAfter: function () {
807		}
808	});
809}
810
811// keep tracking of sections content
812var hist = new Array();
813hist["video"] = new Object(); hist["video"]["type"] = ""; hist["video"]["subtype"] = ""; hist["video"]["id"] = ""; hist["video"]["start"] = "";
814hist["photos"] = new Object(); hist["photos"]["type"] = ""; hist["photos"]["subtype"] = ""; hist["photos"]["id"] = ""; hist["photos"]["start"] = "";
815hist["music"] = new Object(); hist["music"]["type"] = ""; hist["music"]["subtype"] = ""; hist["music"]["id"] = ""; hist["music"]["start"] = "";
816hist["news"] = new Object(); hist["news"]["type"] = ""; hist["news"]["subtype"] = ""; hist["news"]["id"] = ""; hist["news"]["start"] = "";
817hist["bio"] = new Object(); hist["bio"]["type"] = ""; hist["bio"]["subtype"] = ""; hist["bio"]["id"] = ""; hist["bio"]["start"] = "";
818hist["products"] = new Object(); hist["products"]["type"] = ""; hist["products"]["subtype"] = ""; hist["products"]["id"] = ""; hist["products"]["start"] = "";
819hist["tracks"] = new Object(); hist["tracks"]["type"] = ""; hist["tracks"]["subtype"] = ""; hist["tracks"]["id"] = ""; hist["tracks"]["start"] = "";
820hist["specials"] = new Object(); hist["specials"]["type"] = ""; hist["specials"]["subtype"] = ""; hist["specials"]["id"] = ""; hist["specials"]["start"] = "";
821hist["remixes"] = new Object(); hist["remixes"]["type"] = ""; hist["remixes"]["subtype"] = ""; hist["remixes"]["id"] = ""; hist["remixes"]["start"] = "";
822hist["gallery"] = new Object(); hist["gallery"]["type"] = ""; hist["gallery"]["subtype"] = ""; hist["gallery"]["id"] = ""; hist["gallery"]["start"] = "";
823
824function saveHistory(section,type,subtype,id) {
825	hist[section]["type"] = type; hist[section]["subtype"] = subtype; hist[section]["id"] = id; hist[section]["start"] = "";
826}
827
828
829// ------------ teaser / carousels ------------ //
830function initCarousels() {
831    $('.carousel-holder-size-auto-autoplay .carousel').flickity({ cellAlign:'center', contain:true, cellSelector:'.carousel-cell', setGallerySize:true, autoPlay:3500 });
832	$('.carousel-holder-size-auto .carousel').flickity({ cellAlign:'center', contain:true, cellSelector:'.carousel-cell', setGallerySize:true, adaptiveHeight:true });
833	$('.carousel-holder-size-css .carousel').flickity({ cellAlign:'center', contain:true, cellSelector:'.carousel-cell', setGallerySize:false }); // autoPlay: 5000, 
834    $('.carousel-holder-size-detect-auto .carousel').flickity({ cellAlign:'left', contain:true, cellSelector:'.carousel-cell', setGallerySize:true, autoPlay:5000 });
835    
836    if (isiOS) {
837        /* fix iOS touchmove issue */
838        // https://wpdevdesign.com/fixing-flickitys-issue-with-ios15-safari/
839        (function() {
840            let touchingCarousel = false
841            let startXCoordinate
842
843            document.body.addEventListener('touchstart', e => {
844                if (e.target.closest('.flickity-slider')) {
845                    touchingCarousel = true
846                } else {
847                    touchingCarousel = false
848                    return
849                }
850                startXCoordinate = e.touches[0].pageX
851            })
852
853            document.body.addEventListener('touchmove', e => {
854                if (
855                    !touchingCarousel ||
856                    !e.cancelable ||
857                    Math.abs(e.touches[0].pageX - startXCoordinate) < 8
858                ) return
859                e.preventDefault()
860                e.stopPropagation()
861            }, {
862                passive: false
863            })
864        }())
865        /* prevent resize in flickity if still animating */
866        var resize = Flickity.prototype.resize;
867        Flickity.prototype.resize = function() {
868            if (!this.isAnimating) {
869                resize.call(this);
870            }
871        };
872    }
873    
874    /*
875    $('.carousel').each( function() {
876		var elem = $(this);
877		elem.on('select.flickity', function() {
878			var flkty = elem.data('flickity');
879			elem.find(".carousel-zoom").data("index", flkty.selectedIndex);
880		});
881	});
882	$('.carousel-zoom').click(function(e) {
883		var sources = urldecode($(this).data("sources"));
884		var index = $(this).data("index");
885		eval("$.fancybox.open([" + sources + "], { }, " + index + ")");
886		return false;
887    });
888    $("#teaser-carousel").flickity('playPlayer');
889    */
890    
891    $("#products-carousel").on('change.flickity', function(event, index) {
892        doLog('products-carousel > slide changed to ' + index);
893        $("#products .sub_nav li").removeClass("on");
894        $("#products .sub_nav li.thumb" + (index + 1)).addClass("on");       
895        id = $("#products .item-" + (index + 1)).data("id");
896        nr = $("#products .item-" + (index + 1)).data("nr");
897        var name = $("#products .item-" + (index + 1)).data("name");
898        setHistory(lang,'products',name,'','',id,'');
899    });
900    
901    $("#tracks-carousel").on('change.flickity', function(event, index) {
902        doLog('tracks-carousel > slide changed to ' + index);
903        $("#tracks .sub_nav li").removeClass("on");
904        $("#tracks .sub_nav li.thumb" + (index + 1)).addClass("on");       
905        id = $("#tracks .item-" + (index + 1)).data("id");
906        nr = $("#tracks .item-" + (index + 1)).data("nr");
907        var name = $("#tracks .item-" + (index + 1)).data("name");
908        setHistory(lang,'tracks',name,'','',id,'');
909    });
910    
911    $("#specials-carousel").on('change.flickity', function(event, index) {
912        doLog('specials-carousel > slide changed to ' + index);
913        $("#specials .sub_nav li").removeClass("on");
914        $("#specials .sub_nav li.thumb" + (index + 1)).addClass("on");       
915        id = $("#specials .item-" + (index + 1)).data("id");
916        nr = $("#specials .item-" + (index + 1)).data("nr");
917        var name = $("#specials .item-" + (index + 1)).data("name");
918        setHistory(lang,'specials',name,'','',id,'');
919    });
920    
921    $("#remixes-carousel").on('change.flickity', function(event, index) {
922        doLog('remixes-carousel > slide changed to ' + index);
923        $("#remixes .sub_nav li").removeClass("on");
924        $("#remixes .sub_nav li.thumb" + (index + 1)).addClass("on");       
925        id = $("#remixes .item-" + (index + 1)).data("id");
926        nr = $("#remixes .item-" + (index + 1)).data("nr");
927        var name = $("#remixes .item-" + (index + 1)).data("name");
928        setHistory(lang,'remixes',name,'','',id,'');
929    });
930
931}
932
933function setCarouselCell(section,id) {
934    doLog("setCarouselCell(" + section + "," + id + ")");
935	nr = $("#" + section + id).data("nr");
936    $("#" + section + "-carousel").flickity('selectCell', (nr - 1));
937}
938
939function getCarouselVideo(section,feedback_id,id) {
940	// alert("getCarouselVideo(" + section + "," + feedback_id + ","+ id + ")");
941	$.ajax({
942		url: "/" + base + "/section_get_carousel_video.php",
943		data: "section=" + section + "&id=" + id + "&country=" + country + "&device=" + device,
944		method: "GET",
945		dataType: "html",
946		cache: false,
947		beforeSend: function() {
948			$(feedback_id).html('<div class="loading"><div class="icon icon-spin5 animate-spin"></div></div>');
949		},
950		success: function(data) {
951			$(feedback_id).empty().append(data);
952		},
953		error: function(XMLHttpRequest, textStatus, errorThrown) {
954			// alert("Error:" + errorThrown + "(" + XMLHttpRequest.status + ")");
955		},
956		complete: function() {
957			sRefresh(); // alert("complete");
958		}
959	});
960}
961
962
963// ------------- collapse ------------- //
964
965function toggleCollapse(event,target) {   
966    var collapse_item = $(event.target).parents().closest('.item-collapse');
967    var collapse = collapse_item.find('.collapse');
968    var toggle_link = collapse_item.find('.toggle a');
969    if (collapse_item.hasClass('on')) {
970        // close target item
971        collapse_item.removeClass('on');
972        collapse.slideUp("fast", function() {
973            toggle_link.attr("aria-expanded","false");
974            doScroll(collapse_item);
975        });
976    } else {
977        // close already opened item
978        var collapse_items = $(event.target).parents().closest('.items-collapse');
979        var collapse_item_opened = collapse_items.find('.item-collapse.on');
980        var collapse_opened = collapse_item_opened.find('.collapse');
981        var toggle_link_opened = collapse_item_opened.find('.toggle a');
982        collapse_item_opened.removeClass('on');
983        collapse_opened.slideUp("fast", function() {
984            toggle_link_opened.attr("aria-expanded","false");
985        });
986        // open target item
987        collapse_item.addClass('on');
988        collapse.slideDown("slow", function() { 
989            toggle_link.attr("aria-expanded","true");
990            doScroll(collapse_item);
991        });
992    }
993}
994
995// ------------------------ products ------------------------ //
996
997function toggleAlbumplayer(section, id) {
998	if ($("." + section + " #albumplayer" + id).css("display") === "none") {
999		// close other players
1000		$("." + section + " .albumplayer").empty();
1001		$("." + section + " .albumplayer").css("display","none");
1002		$("." + section + " .item li.albumplayer_trigger .title_off").css("display","block");
1003		$("." + section + " .item li.albumplayer_trigger .title_on").css("display","none");
1004		$("." + section + " .item .imageborder_holder").css("opacity", 1);
1005		// load specific player
1006		var txt = $("#" + section + " #albumplayer" + id).data("embedcode");
1007		$("#" + section + " #albumplayer" + id).html(urldecode(txt));
1008		$("#" + section + " #albumplayer" + id).css("display","block");
1009		$("#" + section + id + " li.albumplayer_trigger .title_off").css("display","none");
1010		$("#" + section + id + " li.albumplayer_trigger .title_on").css("display","block");
1011		$("#" + section + id + " .imageborder_holder").css("opacity", 0);
1012		doLog("hide: " + "#" + section + id + " .imageborder_holder");
1013		doScroll("#" + section + " #albumplayer" + id);
1014	} else {
1015		$("#" + section + " #albumplayer" + id).empty();
1016		$("#" + section + " #albumplayer" + id).css("display","none");
1017		$("#" + section + id + " li.albumplayer_trigger .title_off").css("display","block");
1018		$("#" + section + id + " li.albumplayer_trigger .title_on").css("display","none");
1019		$("#" + section + id + " .imageborder_holder").css("opacity", 1);
1020	}
1021}
1022
1023// ------------------------ dates ------------------------ //
1024function toggleDates(id) {
1025	var new_h, row_display;
1026	// get modus (compact, large) usually triggered via @media screen and (max-width:640px) { }
1027	if ($("#dates_block" + id + " .dateslist li").first().css("display") === "table") {
1028		row_display = "table";
1029	} else {
1030		row_display = "block";
1031	}
1032	if ($("#dates_block" + id + " .dateslist li.row-more").css("display") === "none") {
1033		// show more rows
1034		new_h = $("#dates_block" + id + " .dateslist").innerHeight();
1035		$("#dates_block" + id + " .dateslist_holder").css("height", new_h + "px");
1036		$("#dates_block" + id + " .dateslist li.row-more").css("display",row_display);
1037		new_h = $("#dates_block" + id + " .dateslist").innerHeight();
1038		$("#dates_block" + id + " .dateslist_holder").animate({ height: new_h }, "slow", function() {
1039			$("#dates_block" + id + " .dateslist_holder").css("height", "auto");
1040			$("#dates_block" + id + " .more_dates a.icon-down-open").css("display","none");
1041			$("#dates_block" + id + " .more_dates a.icon-up-open").css("display","inline-block");
1042			sRefresh();
1043  		});	
1044	} else {
1045		// show less rows
1046		$("#dates_block" + id + " .dateslist li.row-more").css("display","none");
1047		new_h = $("#dates_block" + id + " .dateslist").innerHeight();
1048		$("#dates_block" + id + " .dateslist li.row-more").css("display",row_display);
1049		$("#dates_block" + id + " .dateslist_holder").animate({ height: new_h }, "slow", function() {
1050			$("#dates_block" + id + " .dateslist li.row-more").css("display","none");
1051			$("#dates_block" + id + " .dateslist_holder").css("height", "auto");
1052			$("#dates_block" + id + " .more_dates a.icon-down-open").css("display","inline-block");
1053			$("#dates_block" + id + " .more_dates a.icon-up-open").css("display","none");
1054			$.scrollTo("#dates_block" + id + " .more_dates", 1000, {
1055				axis: "y",
1056				offset: -220,
1057				onAfter: function () {
1058				}
1059			});
1060			sRefresh();
1061  		});
1062	}
1063}
1064
1065function toggleCalendar(id) {
1066	if ($(".calendar_links" + id).css("display") === "none") {
1067		$(".calendar_toggle" + id).text("-");
1068		$(".calendar_links" + id).fadeIn("fast", function() { });
1069        setTimeout(function(){
1070            $(document).click(function(e) {
1071                if (!$(e.target).closest(".calendar_links" + id).length) {
1072                    // alert('click outside!');
1073                    $(".calendar_toggle" + id).text("+");	
1074                    $(".calendar_links" + id).fadeOut("fast", function() { });
1075                    $(document).unbind("click");
1076                }
1077            });
1078        }, 200);
1079	} else {
1080		$(".calendar_toggle" + id).text("+");	
1081		$(".calendar_links" + id).fadeOut("fast", function() { });
1082        $(document).unbind("click");
1083	}
1084}
1085
1086function getBio(nr,bg) {
1087	$("#bio ul.sub_nav li").removeClass("on");
1088	$("#bio ul.sub_nav li").addClass("off");
1089	// var bg_empty = "url(/" + base + "/images/layout/pix.gif)";
1090	// if (bg == "") { bg = bg_empty; }
1091	$("#bio .bio_container").slideUp("slow", function() {
1092		// $("#bio").css("background-image",bg_empty);
1093		$("#bio ul.sub_nav li.type" + nr).addClass("on");
1094		$("#bio .bio_container .item").css("display","none");
1095		$("#bio .bio_container .item" + nr).css("display","block");
1096		setTimeout(function(){
1097			$("#bio .bio_container").slideDown("slow", function() {
1098				// $("#bio").css("background-image",bg);
1099				sRefresh();
1100			});
1101		}, 500);
1102	});
1103}
1104
1105function getNewsletter(nr) {
1106	$("#newsletter ul.sub_nav li").removeClass("on");
1107	$("#newsletter ul.sub_nav li").addClass("off");
1108	$("#newsletter .newsletter_container").slideUp("fast", function() {
1109		$("#newsletter ul.sub_nav li.type" + nr).addClass("on");
1110		$("#newsletter .newsletter_container .item").css("display","none");
1111		$("#newsletter .newsletter_container .item" + nr).css("display","block");
1112		setTimeout(function(){
1113			$("#newsletter .newsletter_container").slideDown("slow", function() {
1114				sRefresh();
1115			});
1116		}, 100);
1117	});
1118}
1119
1120// ------------------------ audioplayer ------------------------ //
1121
1122var audioplayerOn = false;
1123
1124function initAudioplayer() {
1125    doLog("initAudioplayer()");
1126	var src = $('#audioplayer iframe').data("src");
1127	$('#audioplayer iframe').attr("src", src);
1128    setTimeout(function() {
1129        $('#audioplayer').addClass("on");
1130        audioplayerOn = true;
1131        /*
1132        var waypoint = new Waypoint({
1133            element: $('#products h2'),
1134            handler: function(direction) {
1135                // doLog('Scrolled to #products h2, Direction: ' + direction);
1136                if (audioplayerOn == false) {
1137                    $('#audioplayer').addClass("on");
1138                    audioplayerOn = true;
1139                }
1140            },
1141            offset: 200
1142        });
1143        */
1144	}, 2000);
1145}
1146
1147function toggleAudioplayer() {
1148    if ($('#audioplayer').hasClass("hidden")) {
1149        $('#audioplayer').removeClass("hidden");
1150    } else {
1151        $('#audioplayer').addClass("hidden");
1152    }
1153}
1154
1155
1156// ------------------------ audio ------------------------ //
1157
1158var playlist;
1159var playlist_pos = -1;
1160var play_modus = "manual";
1161var oldTrack = null;
1162var audioFirstStart = false;
1163
1164function initMusicplayer() {
1165	$("#musicplayer").attr("oncanplay", "canPlay();");
1166	$("#musicplayer").attr("onended", "playNext();");
1167}
1168
1169function playTrack(id) {
1170	// alert("playTrack(" + id + "), oldTrack: " + oldTrack);
1171	var audio = document.getElementById("musicplayer");
1172	id = parseInt(id);
1173	playlist_pos = $.inArray(id, playlist);
1174	doLog("playTrack(" + id + "), my playlist_pos:" + playlist_pos);
1175	if (oldTrack == id) {
1176		if (audio.paused) {
1177			doPlay();
1178		} else {
1179			doPause();
1180		}	
1181	} else {
1182		audio.addEventListener("timeupdate", progressBar, true);
1183		var trackname = $("#track"+ id).data("trackname");
1184		$(".track").removeClass("track_on");
1185		$(".track .playback_icon").html("<div class='icon icon-play'></div>");
1186		$(".track .track_progress").css("width","0%");
1187		$("#track"+ id).addClass("track_on");
1188		$("#track"+ id + " .playback_icon").html("<div class='icon icon-spin5 animate-spin'></div>");
1189		oldTrack = id;
1190		audioFirstStart = false;
1191		audio.src = $("#track"+ id).data("src");
1192		audio.load();
1193	}	
1194}
1195
1196function canPlay() {
1197    if (play_modus == "auto" || play_modus == "manual") {
1198        doPlay();
1199    } else {
1200		doPause();
1201	}
1202}
1203
1204function doPlay() {
1205	var audio = document.getElementById("musicplayer");
1206    audio.play();
1207	$("#track"+ oldTrack + " .playback_icon").html("<div class='icon icon-pause'></div>");
1208	if (audioFirstStart == false) {
1209		audioFirstStart = true;
1210		doTrack('Audio','AudioStart',$("#track"+ oldTrack).data("trackname"));
1211	} else {
1212		doTrack('Audio','AudioResume',$("#track"+ oldTrack).data("trackname"));
1213	}
1214}
1215
1216function doPause() {
1217	var audio = document.getElementById("musicplayer");
1218	if (!audio.ended) {
1219		doTrack('Audio','AudioPause',$("#track"+ oldTrack).data("trackname"));
1220	}
1221	if (audio.ended) {
1222		$("#track"+ oldTrack + " .track_progress").css("width", "0%");
1223		doTrack('Audio','AudioFinish',$("#track"+ oldTrack).data("trackname"));
1224	}
1225    audio.pause();
1226	$("#track"+ oldTrack + " .playback_icon").html("<div class='icon icon-play'></div>");
1227}
1228
1229function doStop() {
1230	doLog("doStop()");
1231	var audio = document.getElementById("musicplayer");
1232 	if (audio) {
1233		audio.pause();
1234		if (oldTrack) {
1235			doTrack('Audio','AudioStop',$("#track"+ oldTrack).data("trackname"));
1236		}
1237		$("#track"+ oldTrack + " .track_progress").css("width", "0%");
1238		$("#track"+ oldTrack + " .playback_icon").html("<div class='icon icon-play'></div>");
1239		oldTrack = null;
1240		playlist_pos = -1;
1241 	}
1242}
1243
1244function playPause() {
1245	var audio = document.getElementById("musicplayer");
1246    if (audio.paused) {
1247        doPlay();
1248    } else {
1249        doPause();
1250    }
1251}
1252
1253function playNext() {
1254	if (typeof(playlist) != "undefined") {
1255		doLog("playNext(), playlist.length:" + playlist.length + ", playlist_pos:" + playlist_pos)
1256		if (play_modus == "auto") {
1257			playlist_pos++;
1258			if (playlist_pos < playlist.length) {
1259				var next_id = playlist[playlist_pos];
1260				doLog("next_id: " + next_id + ", playlist_pos:" + playlist_pos);
1261				doTrack('Audio','AudioGotoNextTrack',$("#track"+ next_id).data("trackname"));
1262				playTrack(next_id);
1263			} else {
1264				playlist_pos = -1;
1265				doLog("playlist end");
1266				doPause();	
1267			}
1268		} else {
1269			doPause();	
1270		}
1271	}
1272}
1273
1274function progressBar() { 
1275	var oAudio = document.getElementById("musicplayer");	
1276	var elapsedTime = Math.round(oAudio.currentTime); // get current time in seconds
1277	var w = (elapsedTime / oAudio.duration) * 100; // update the progress bar
1278	if (w >= 0 && w <= 100) {
1279		// doLog("audio-progress: " + w);
1280		$("#track"+ oldTrack + " .track_progress").css("width", w + "%");
1281	}
1282}
1283
1284
1285// ------------ bg-video ------------ //
1286
1287function load_bg_video(src,id,loop) {
1288	// doLog("load_bg_video(" + src + "," + id + "," + loop + ")");
1289	var loop_str = "";
1290	var onended_str = "";
1291	if (loop == "Y") {
1292		loop_str = "loop";
1293	} else {
1294		onended_str = "hide_bg_video('bg_video" + id + "');";	
1295	}
1296	var txt = "";
1297	txt += "<video id=\"bg_video" + id + "\" class=\"bg_video bg_video_off\" preload=\"auto\" muted playsinline volume=\"0\" autoplay " + loop_str + " onCanPlay=\"show_bg_video('bg_video" + id + "');\" onended=\"" + onended_str + "\">";
1298	txt += "<source src=\"" + src + "\" type=\"video/mp4\">";
1299	txt += "</video>";
1300	txt += "<div class=\"fg_video fg_video_on\"></div>";
1301	$("#bg_video_holder" + id).html(txt);
1302}
1303
1304function show_bg_video(id) {
1305	if ($("#" + id).hasClass("bg_video_off")) {
1306		if (id == "bg_video-bg-0") {
1307			var vid = document.getElementById(id);
1308			vid.playbackRate = 1;
1309		}
1310		// doLog("show_bg_video(" + id + ")");
1311		$("#" + id).removeClass("bg_video_off");
1312		$("#" + id).addClass("bg_video_on");
1313		$("#" + id).attr("onCanPlay","");
1314	}
1315}
1316
1317function hide_bg_video(id) {
1318	$("#" + id).removeClass("bg_video_on");
1319	$("#" + id).addClass("bg_video_off");
1320}
1321
1322
1323function volume_bg_video(vol) {
1324	var vid = $(".slides .bg_video");
1325	vid.animate({volume: vol}, 1000, 'swing', function() {
1326    	// $(".slides .bg_video").each(this.pause()); // pause video
1327    });
1328}
1329
1330function toggle_bg_video() {
1331	/*
1332	var video = document.getElementById('bg_video_main');
1333	if (bgVideo) {
1334		$(".bg_video_ctrl").removeClass("bg_video_ctrl_on");
1335		if (video) { video.pause(); }
1336		$(".bg_video_holder").hide();
1337		bgVideo = false;
1338	} else {
1339		$(".bg_video_ctrl").addClass("bg_video_ctrl_on");
1340		if (video) { video.play(); }
1341		$(".bg_video_holder").show();
1342		bgVideo = true;
1343	}
1344	*/
1345}
1346
1347
1348// ------------ forms + newsletter ------------ //
1349var newsletterKeyPress = false;
1350function initNewsletter() {
1351    /*
1352    $("#nl_sender_form input").keypress(function(event) {
1353        if (newsletterKeyPress == false) {
1354            newsletterKeyPress = true;
1355            window.dataLayer = window.dataLayer || [];
1356            window.dataLayer.push({
1357                event: "Generic Event",
1358                event_name: "newsletter_soi_start",
1359                newsletter_soi_start: {
1360                    newsletter_selection: nl_addressbooks,
1361                    event_category: "Customer Relations",
1362                    event_action: "Newsletter",
1363                    event_label: "Single Opt-In - Start"
1364                }
1365            });
1366        }
1367    });
1368    */
1369    // rewrite browser-history for urls like /newsletter/confirm/
1370    var res = /newsletter\/([a-zA-Z]+)/.exec(window.location.href);
1371    if (Array.isArray(res)) {
1372        // doLog("newsletter_path found: " + res[1]);
1373        if (window.history && window.history.replaceState) {
1374            history.replaceState("", window.location.host, window.location.protocol + "//" + window.location.host);
1375        }
1376    }
1377}
1378
1379function validateEmail(email) { 
1380	var exp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
1381	return exp.test(email);
1382}
1383
1384var warnTimeout;
1385
1386function doWarn(id,txt) {
1387	// alert("doWarn(" + id + "," + txt + ")");
1388	$("#"+id).addClass("warning");
1389	$("label[for='"+ id +"']").html("<span class='icon icon-attention'></span> " + txt);
1390	$("label[for='"+ id +"']").addClass("warning");
1391	/*
1392	// make it shake!
1393	$(elem).addClass("animated_manual_animation shake").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function(){
1394    	$(elem).removeClass("animated_manual_animation");
1395		$(elem).removeClass("shake");
1396    });
1397	*/
1398	$("#"+id).disabled = false;
1399	$("#"+id).trigger("focus");
1400	
1401	clearTimeout(warnTimeout);
1402	warnTimeout = setTimeout(function(){ 
1403		resetFormWarnings();
1404	}, 5000);
1405}
1406
1407function resetFormWarnings() {
1408	$("form .text").removeClass("warning");
1409	$("form label").removeClass("warning");
1410	$("form label").each(function(index) {
1411		var myText = $(this).attr('data-text');
1412		if (myText !== undefined) {
1413			$(this).html(urldecode(myText));
1414		}
1415	});
1416}
1417
1418function checkInput(id, title, allow_empty) {
1419	title = urldecode(title);
1420	input = $("#" + id);
1421	if (allow_empty === undefined) { allow_empty = false; }
1422	if (allow_empty == false) {
1423		if (input.val() === "" || input.val().length < 2) {
1424			doWarn(id, title + " is missing.");
1425			return false;
1426		}
1427	}
1428	var zeichen ="<>";
1429	var eingabe = input.val();
1430	var laenge = eingabe.length;
1431	for(i=0; i<laenge;  i++) {
1432	  	badchar = eingabe.charAt(i);
1433	  	if (zeichen.indexOf(badchar)>-1) {
1434			doWarn(id, title + " contains invalid chars.");
1435			return false;
1436		}
1437	}
1438	return true;
1439}
1440
1441function checkText(id, title, allow_empty) {
1442	input = $("#" + id);
1443	if (allow_empty === undefined) { allow_empty = false; }
1444	if (allow_empty == false) {
1445		if (input.val() === "" || input.val().length < 24) {
1446			doWarn(id, title + " is missing.");
1447			return false;
1448		}
1449	}
1450	return true;
1451}
1452
1453function checkCharCount(el) {
1454	var str = $("#" + el).val();	
1455	if ($("#" + el).val().length >= maxChars) {
1456		doWarn(el, "Too many chars.");
1457	}
1458}
1459
1460function checkUrl(id, title, allow_empty) {
1461	input = $("#" + id);
1462	if (allow_empty === undefined) { allow_empty = false; }
1463	if (allow_empty == false) {
1464		if (input.val() === "" || input.val().length < 2) {
1465			doWarn(id, title + " is missing.");
1466			return false;
1467		}
1468	}
1469	var zeichen =";<>";
1470	var eingabe = input.val();
1471	var laenge = eingabe.length;
1472	for(i=0; i<laenge;  i++) {
1473	  	badchar = eingabe.charAt(i);
1474	  	if (zeichen.indexOf(badchar)>-1) {
1475			doWarn(id, title + " contains invalid chars.");
1476			return false;
1477		}
1478	}
1479	if (eingabe.indexOf("http") !== 0) {
1480		doWarn(id, title + " must start with http or https.");
1481		return false;
1482	}
1483	return true;
1484}
1485
1486function doFeedback(id,txt) {
1487	$("#"+ id + " .content").html(txt);
1488	$("#" + id).slideDown("slow");
1489	setTimeout(function() { $("#" + id + " a.close").fadeIn("slow"); }, 3000);
1490}
1491
1492function closeFeedback(id) {
1493	$("#" + id + " a.close").fadeOut("fast");
1494	$("#" + id).fadeOut("slow");
1495}
1496
1497function sendnewsletter() {
1498	doLog("sendnewsletter()");	
1499
1500	// check email
1501	if (document.getElementById("nl_email_id")) {
1502		if (!checkInput("nl_email_id", "E-Mail")) { return false; }
1503		if (!validateEmail($("#nl_email_id").val())) {
1504			doWarn("nl_email_id", "The E-Mail is invalid.");
1505			return false; 
1506		}
1507	}
1508
1509	// check firstname
1510	if (document.getElementById("nl_firstname_id")) {
1511		if (!checkInput("nl_firstname_id", "First Name")) { return false; }
1512	}
1513	
1514	// check nl_country
1515	if (document.getElementById("nl_country_id")) {
1516		if (!checkInput("nl_country_id", "Country")) { return false; }
1517	}
1518	
1519	// send data
1520	var post_data = $("#nl_sender_form").serialize();
1521	
1522	// add pers_lytics_uid
1523    /*
1524	if (window.hasOwnProperty('lio')) {
1525		post_data += "&pers_lytics_uid=" + window.lio._uid;
1526	} else {
1527		post_data += "&pers_lytics_uid=";
1528	}
1529	// doLog("post_data:"); doLog(post_data);
1530    */
1531    var feedback_id = "nl_feedback_id";
1532	
1533	$.ajax({
1534		url: "/" + base + "/section_newsletter_sender.php",
1535		data: post_data,
1536		method: "POST",
1537		dataType: "html",
1538		cache: false,
1539		beforeSend: function() {
1540			$("#nl_btn_send_holder").slideUp("fast");
1541			doFeedback(feedback_id,"<span class='icon icon-spin5 animate-spin'></span> One moment please...");
1542		},
1543		success: function(data) {
1544            var txt;
1545			if (data.search(/error/i) == -1 && data.search(/fehler/i) == -1 && data.search(/erreur/i) == -1) {
1546				// feedback contains no errors:
1547                txt = "<h5><span class=\"icon icon-ok\"></span></h5>";
1548                txt += data;
1549                // txt += "Please check your inbox right now and confirm your subscription.<br>";
1550                // txt += "Advice: The confirmation-email might be found in your advertising- or spam-folder.<br>";
1551                // when double-opt-in: "Bitte überprüfe gleich deinen Email-Briefkasten und folge den Anweisungen in der Bestätigungsemail die Du gleich erhalten wirst.<br><br>Tip: Überprüfe auch den Spam-Ordner.";
1552                // form hochklappen
1553                $("#nl_form_holder").slideUp("slow");
1554                $("#newsletter .required").slideUp("fast");
1555                $("#nl_feedback_id a.close").remove();
1556                // doTrack("CRM", "NewsletterSubscribe", artist);
1557            } else {
1558                txt = "<h5><span class=\"icon-attention\"></span><h5>";
1559                txt += data;
1560                document.getElementById("nl_btn_send").disabled = false;
1561                document.getElementById("nl_btn_send").value = $("#nl_btn_send").data("text");
1562                $("#nl_btn_send_holder").slideDown("fast");
1563            }
1564            $("#" + feedback_id).empty().append(txt);
1565		},
1566		error: function(XMLHttpRequest, textStatus, errorThrown) {
1567			alert("Error: " + errorThrown + "(" + XMLHttpRequest.status + ")");
1568			$("#nl_btn_send_holder").slideDown("fast");
1569		},
1570		complete: function() {
1571			//
1572		}
1573	});
1574	
1575	return false;
1576}
1577
1578
1579// ------------ standard functions ------------ //
1580
1581var resized;
1582
1583function initResize() {
1584	doLog("initResize");
1585	$(window).on('resize orientationChanged', function() {
1586		$("#body_id").addClass("resize");
1587		clearTimeout(resized);
1588		resized = setTimeout(onResize, 150);
1589	});
1590}	
1591
1592function onYTPlayerRendered() { }
1593
1594var copyActive = false;
1595
1596function initCopyButtons() {
1597	// doLog("initCopyButtons()"); // for clipboard.js v2.0.6
1598	var clipboard = new ClipboardJS(".copy-button");
1599	clipboard.on('success', function(e) {
1600        if (copyActive == false) {
1601            // console.info('Action:', e.action); console.info('Text:', e.text); console.info('Trigger:', e.trigger);
1602            doTrack('Social', "LinkCopy", urldecode(e.text));
1603            e.clearSelection();
1604            if (lang == "de") {
1605                doMsg("<span class='icon icon-ok'></span> Link kopiert");
1606            } else {
1607                doMsg("<span class='icon icon-ok'></span> Link copied");	
1608            }
1609            copyActive = true;
1610            setTimeout(function() { closeMsg(); copyActive = false; }, 3000);
1611        }
1612	});
1613	var emailclipboard = new ClipboardJS('a.copy-email', {
1614        text: function(trigger) {
1615            return trigger.getAttribute('data-usr') + "@" + trigger.getAttribute('data-dom') + "." + trigger.getAttribute('data-tld');
1616        }
1617    });
1618	emailclipboard.on('success', function(e) {
1619         if (copyActive == false) {
1620            // console.info('emailclipboard Action:', e.action); console.info('emailclipboard Text:', e.text); console.info('Trigger:', e.trigger);
1621            doTrack('Social', "EmailCopy", urldecode(e.text));
1622            e.clearSelection();
1623            if (lang == "de") {
1624                doMsg("<span class='icon icon-ok'></span> E-Mail kopiert");
1625            } else {
1626                doMsg("<span class='icon icon-ok'></span> E-Mail copied");	
1627            }
1628            copyActive = true;
1629            setTimeout(function() { closeMsg(); copyActive = false; }, 3000);
1630         }
1631	});
1632}
1633
1634function doMsg(txt) {
1635	// if ($("#msg .content").html() != "") { doAnim("#msg", "flash"); }
1636	$("#msg .content").html(urldecode(txt));
1637	$("#msg").slideDown('fast', function() {});
1638}
1639
1640function closeMsg() {
1641	if (window.jQuery) {
1642		$("#msg").slideUp("fast", function() { $("#msg .content").empty(); });
1643	} else {
1644		document.getElementById('msg').children[0].innerHTML='';document.getElementById('msg').style.display='none';
1645	}
1646}
1647
1648function setShare(id, url, title) {
1649	var txt = '';
1650	txt += '<div class="share_tools" data-url="' + url + '" data-title="' + title + '">';
1651	txt += '<a class="button share_facebook" href="#" onclick="doShare(event,\'facebook\');return false;" title="Share on facebook"><span class="icon icon-facebook"></span></a>';
1652	// txt += '<a class="button share_facebook_messenger" href="#" onclick="doShare(event,\'facebook_messenger\');" title="Share with Facebook Messenger"><span class="icon icon-facebook-messenger"></span></a>';
1653	txt += '<a class="button share_whatsapp" href="#" onclick="doShare(event,\'whatsapp\');" title="Share with whatsapp"><span class="icon icon-whatsapp"></span></a>';
1654	txt += '<a class="button share_twitter" href="#" onclick="doShare(event,\'twitter\');return false;" title="Tweet"><span class="icon icon-twitter"></span></a>';
1655	txt += '<a class="button share_email" href="#" onclick="doShare(event,\'email\');" title="Share via email"><span class="icon icon icon-mail"></span></a>';
1656	txt += '<a class="button copy-button" data-clipboard-action="copy" data-clipboard-text="' + urldecode(url) + '" href="#" onclick="return false;" title="Copy link"><span class="icon icon-link"></span></a>'; 
1657	txt += '</div>';
1658	$('#' + id).empty().append(txt);
1659	initCopyButtons();
1660}
1661
1662function toggleShare(event) {
1663	$(event.target).closest(".share_tools").toggleClass("on");
1664}
1665
1666function doShare(event, network) {
1667	// doMsg("doShare(" + network + ")");console.log("event:");console.log(event);
1668	var share_el,share_container,url,title,share_window;
1669	// get data-url & data-title from parent div.share_tools
1670	if (event.target.parentNode.className == "share_tools") {
1671		// old safari
1672		share_el = event.target;
1673		share_container = event.target.parentNode;
1674	} else {
1675		share_el = event.target.parentNode;
1676		share_container = event.target.parentNode.parentNode;
1677	}
1678	// console.log("share_container:");console.log(share_container);
1679	url = share_container.dataset.url;
1680	title = share_container.dataset.title;
1681	// console.log("data:");console.log(url);console.log(urldecode(title));doMsg("url: " + urldecode(url) + "<br>title: " + urldecode(title));
1682	switch(network) {
1683		case "facebook":
1684			doTrack('Social', "Facebook", urldecode(url));
1685			share_window = window.open("https://www.facebook.com/sharer/sharer.php?u=" + url,"share_window","width=600,height=450,status=no,location=no,scrollbars=no,resizable=yes");
1686			share_window.focus();
1687			break;
1688		case "twitter":
1689			doTrack('Social', "Twitter", urldecode(url));
1690			title = urldecode(title);
1691			title = encodeURIComponent(title);
1692			$(window).bind("message", function(event) { event = event.originalEvent; if (event.source == share_window && event.data != "__ready__") { doLog("tweet successful"); } });
1693			share_window = window.open("https://twitter.com/intent/tweet?url=" + url + "&text=" + title + "&hashtags=","share_window","width=600,height=500,status=no,location=no,scrollbars=no,resizable=yes");
1694			share_window.focus();
1695			break;
1696		case "email":
1697			doTrack('Social', "Email", urldecode(url));
1698			title = urldecode(title);
1699			title = encodeURIComponent(title);
1700			share_el.href = "mailto:?subject=" + title + "&body=" + url;
1701			break;	
1702		case "whatsapp":
1703			doTrack('Social', "Whatsapp", urldecode(url));
1704			share_el.href = "whatsapp://send?text=" + title + encodeURIComponent(": ") + url;
1705			break;
1706		case "facebook_messenger":
1707			doTrack('Social', "FacebookMessenger", urldecode(url));
1708			share_el.href = "fb-messenger://share?link=" + url;
1709		default:
1710			break;
1711	}
1712}
1713
1714function toggleMenu() {
1715	if ($("#body_id").hasClass("menu_on")) {
1716        $("html").removeClass("menu_on");
1717		$("#body_id").removeClass("menu_on");
1718	} else {
1719		$("html").addClass("menu_on");
1720        $("#body_id").addClass("menu_on");
1721	}
1722}
1723
1724function doScroll(el) {
1725	doLog("doScroll(" + el + ")");
1726	yOffset = 0; // -1 * $(".header_norm").outerHeight();
1727	// yOffset -= 100;
1728	$.scrollTo(el, 800, {
1729		axis: "y",
1730		offset: yOffset,
1731		onAfter: function () { }
1732	});
1733}
1734
1735function initNav() {
1736	$('.header_norm .nav_list a.page_link').on("click", function(){
1737		doShow($(this).data('href'),"",0);
1738		return false;
1739	});
1740	$('.nav_overlay .nav_list a.page_link').on("click", function(){
1741		doShow($(this).data('href'),"",0);
1742		toggleMenu();
1743		return false;
1744	});
1745	var sections = $('section');
1746	var waypoints = sections.waypoint({
1747		handler: function(direction) {
1748			var active_id = this.element.id;
1749			// doLog(active_id + ' hit 40% from top of window');
1750			if (direction === 'up'){ active_id = $("#" + active_id).prev().attr('id'); }
1751			// if (direction === 'down'){ active_id = $("#" + active_id).next().attr('id'); }
1752			$('.nav_list ul li.nav_page').removeClass('on');
1753			$('.nav_list ul li.nav_' + active_id).addClass('on');
1754			// setHash(sectionId); // 2do: if not scrolling because of doShow(), leads to blinks while auto-scrolling (ie, ff)
1755		},
1756		offset: '35%'
1757	});
1758	var waypoint = new Waypoint({
1759		element: $('#header_bottom'),
1760		handler: function(direction) {
1761			// console.log('Scrolled to #header_bottom, Direction: ' + direction);
1762			if (direction === 'up'){
1763				$("#body_id").removeClass("compact");
1764			}
1765			if (direction === 'down'){
1766				$("#body_id").addClass("compact");
1767			}
1768		},
1769		offset: -450
1770	});
1771}
1772
1773function initHeader() {
1774	// https://stackoverflow.com/questions/31223341/#answer-31223774
1775	var body = $("#body_id");
1776	var lastScrollTop = 0;
1777	window.addEventListener("scroll", function() {
1778	   var st = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"
1779	   if (st > lastScrollTop && st > 60){
1780		  body.addClass("scrollDown");
1781	   } else {
1782		  body.removeClass("scrollDown");
1783	   }
1784	   lastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling
1785	}, false);
1786}
1787
1788function initFancybox() {
1789	$.fancybox.defaults.buttons = ['close']; // 'fullScreen','slideShow',
1790	$.fancybox.defaults.hash = false;
1791	$.fancybox.defaults.loop = true;
1792	$.fancybox.defaults.backFocus = false;
1793	// $.fancybox.defaults.hideScrollbar = true;
1794	// $.fancybox.defaults.margin = [0,0];
1795}
1796
1797function doTruncate(identifier, limit) {
1798    switch (lang) {
1799        case "de":
1800            var showText = "Mehr anzeigen";
1801            var hideText = "Weniger anzeigen";
1802            break;
1803        case "fr":
1804            var showText = "Voir Plus";
1805            var hideText = "Voir Moins";
1806            break;
1807        default:
1808            var showText = "Show more";
1809            var hideText = "Show less";
1810            break;
1811    }
1812	if (isNaN(limit)) { limit = 7; }
1813	$(identifier).truncate({
1814		"maxLines": limit,
1815		"truncateString": "&nbsp;&#8230;",
1816		"showText": "<div class='more clearfix'><span class='border title'>" + showText + "</span>&nbsp;<span class='icon icon-down-open'></span></div>",
1817		"hideText": "<div class='more clearfix'><span class='border title'>" + hideText + "</span>&nbsp;<span class='icon icon-up-open'></span></div>",
1818		"animate": true,
1819		"animateOptions": { 'complete': function() {
1820			$(identifier).css("height","auto");
1821			sRefresh();
1822			if ($(this).data("status") === "open") {
1823				$(this).data("status","closed");
1824				var yOffset = -1 * $(".header_compact").height();
1825				yOffset -= 10;
1826				var myId = $(this).attr("id");
1827				if (!myId) {
1828					myId = "trunc_" + myRandom(100000, 999999);
1829					$(this).attr("id",myId);
1830				}
1831				var target = $("#" + myId);
1832				$.scrollTo(target, 1000, {
1833					axis: "y",
1834					offset: yOffset,
1835					duration: 3000,
1836					onAfter: function () {
1837                        try { $("#products-carousel").flickity('resize'); } catch (e) { }
1838                        try { $("#tracks-carousel").flickity('resize'); } catch (e) { }
1839                        try { $("#specials-carousel").flickity('resize'); } catch (e) { }
1840                        try { $("#remixes-carousel").flickity('resize'); } catch (e) { }
1841                    }
1842				});
1843			} else {
1844				$(this).data("status","open");
1845                try { $("#products-carousel").flickity('resize'); } catch (e) { }
1846                try { $("#tracks-carousel").flickity('resize'); } catch (e) { }
1847                try { $("#specials-carousel").flickity('resize'); } catch (e) { }
1848                try { $("#remixes-carousel").flickity('resize'); } catch (e) { }
1849			}
1850		} }
1851	});
1852}
1853
1854function urldecode(str) {
1855	return decodeURIComponent((str+'').replace(/\+/g, ' '));
1856}
1857
1858function doLog(txt) {
1859	node = document.getElementById("log");
1860	if (node) { node.innerHTML = txt + "<br>" + node.innerHTML; }
1861    if (console) { console.log(txt); }
1862}
1863
1864function doTrack(category, action, label) {
1865	if (category != "" && action != "") {
1866		// umg-tracking
1867        switch(category) {
1868            case "CRM":
1869            case "Video":
1870                dataLayer.push({'event':'GAEvent', 'attributes': {'eventCategory': '' + category + '', 'eventAction': '' + action +'', 'eventLabel': '' + label + '' }});
1871                break;
1872            case "Social":
1873                dataLayer.push({'event': 'Generic Event', 'event_name': 'share_start', 'share_start' : { 'social_network': '' + action + '', 'event_category': 'Social', 'event_action': 'Share - ' + action + '', 'event_label': '' + label + ''}});
1874                break;
1875            case "Audio":
1876                dataLayer.push({'event': "Generic Event", 'event_name': "audio_play", 'audio_play': { 'artist_name': '' + artist + '', 'audio_name': '' + label + '', 'event_category': "Audio", 'event_action': '' + action + '', 'event_label': '' + label + '' }});
1877                break;
1878            default:
1879                break;    
1880        }
1881		// analytics.js
1882		// ga('send', 'event', category, action, label);
1883		// ga.js:
1884		// _gaq.push(['_trackEvent', category, action, label]);	
1885	}
1886	doLog("doTrack(" + category + " | " + action + " | " + label + ")");
1887}
1888
1889function initSvg() {
1890	$('img.svg').each(function(){
1891		var $img = $(this); var imgID = $img.attr('id'); var imgClass = $img.attr('class'); var imgURL = $img.attr('src');
1892		$.get(imgURL, function(data) {
1893			var $svg = $(data).find('svg');
1894			if (typeof imgID !== 'undefined') { $svg = $svg.attr('id', imgID); }
1895			if (typeof imgClass !== 'undefined') { $svg = $svg.attr('class', imgClass+' replaced-svg'); }
1896			$svg = $svg.removeAttr('xmlns:a'); $img.replaceWith($svg);
1897		}, 'xml');
1898	});
1899}
1900
1901function getCacheControl() {
1902	var date = new Date();
1903	var year = date.getUTCFullYear();
1904	var month = date.getUTCMonth(); 
1905	month++; // (from 0-11)
1906	if (month < 10) { month = "0" + month; }
1907	var day = date.getUTCDate();
1908	if (day < 10) { day = "0" + day; }
1909	var hour = date.getUTCHours();
1910	if (hour < 10) { hour = "0" + hour; }
1911	var minutes = date.getUTCMinutes();
1912	switch(true) { case minutes>45:minutes="45";break; case minutes>30:minutes="30";break; case minutes>15:minutes="15";break; default:minutes="00";break; }
1913	var c = year + month + day + "-" + hour + minutes;
1914	return c;
1915}
1916
1917function inIframe() {
1918    try {
1919        return window.self !== window.top;
1920    } catch (e) {
1921        return true;
1922    }
1923}
1924
1925function checkLinks() {
1926    $('a[href^="http"]').not('a[href*="' + location.hostname + '"]').attr({target: "_blank", rel: "noopener"});
1927}
1928
1929function winopen(url,name,w,h) {
1930	var w_shift = Number((screen.width/2)-(w/2));
1931	var h_shift = Number((screen.height/2)-(h/2));
1932	var newWin = window.open(url, name, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no, width='+w+', height='+h+', left='+w_shift+', top='+h_shift);
1933	newWin.focus();
1934}
1935
1936function capitalizeFirstLetter(string) {
1937    return string.charAt(0).toUpperCase() + string.slice(1);
1938}
1939
1940function getCookieValue(a) { // thx 2 mac: http://stackoverflow.com/questions/5639346/#answer-25490531
1941    var b = document.cookie.match('(^|;)\\s*' + a + '\\s*=\\s*([^;]+)');
1942    return b ? b.pop() : '';
1943}
1944
1945function getRequestVar(name){
1946	if (name=(new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search)) { return decodeURIComponent(name[1]); }
1947}
1948
1949function kill(id) {
1950	element = document.getElementById(id);
1951 	if (element) {
1952  		var parent = element.parentNode;
1953  		if (parent) {
1954			parent.removeChild(element);
1955		}
1956 	}
1957 	return false;
1958}
1959
1960// thx Jonas Raoni Soares Silva, http://jsfromhell.com/array/shuffle [rev. #1] // usage: var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; alert('shuffle(a): ' + shuffle(a));
1961function shuffle(v) {
1962    for(var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
1963    return v;
1964};
1965
1966function myRandom(a, b) {
1967	if (a > b) { return(-1); }
1968	if (a === b) { return(a); }
1969	return a + parseInt(Math.random() * ( b - a+1 ));
1970}
1971
1972// peace out

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.