function isMobile() { return $('body').hasClass('mobile'); } function imgHoverIn(event) { if ($(event.target).attr('src') != null) { $(event.target).attr('src', getHoveredImgSrc($(event.target).attr('src'))); } if ($(event.target).css('background-image') != '') { $(event.target).css('background-image', getHoveredImgSrc($(event.target).css('background-image'))); } } function imgClickIn(event) { if ($(event.target).attr('src') != null) { $(event.target).attr('src', getClickedImgSrc($(event.target).attr('src'))); } if ($(event.target).css('background-image') != '') { $(event.target).css('background-image', getClickedImgSrc($(event.target).css('background-image'))); } } function imgOut(event) { if ($(event.target).attr('src') != null) { $(event.target).attr('src', getBaseImgSrc($(event.target).attr('src'))); } if ($(event.target).css('background-image') != '') { $(event.target).css('background-image', getBaseImgSrc($(event.target).css('background-image'))); } } function registerGalleryEventHandlers() { $(".gallery").fancybox(); } /** * Registers event handlers for hovered images. */ function registerHoverEventHandlers() { var selector = '.hovered'; $(selector).hover(imgHoverIn, imgOut); } /** * Registers various click event handlers (e.g. for clicked images). */ function registerClickEventHandlers() { var selector = '.clicked'; $(selector).mousedown(imgClickIn); $(selector).mouseup(imgOut); $('input[type=submit].confirmed').click(function(event) { if (!confirm($(this).data('confirm-text'))) { event.preventDefault(); } }); } /** * Registers event handlers for displaying "more" content. */ function registerMoreContentEventHandlers() { var moreDivSelector = 'div.more'; $(moreDivSelector + ' .link').toggle(function() { $(this).next(moreDivSelector + ' .content').show(); }, function() { $(this).next(moreDivSelector + ' .content').hide(); }); } /** * Registers event handles for the top navigation menu. */ function registerMenuItemEventHandlers() { $('#top_navigation li.menuItem') .mouseenter(function() { $(this).addClass('active'); }) .mouseleave(function() { $(this).removeClass('active'); }); } /** * Prefetches the given image array. * @param images the image array to prefetch */ function prefetchImages(images) { if (images != null) { var image = new Image(); for (var i = 0; i < images.length; ++i) { image.src = images[i]; } } } function generateHighlightLinks() { $('.programm .dates .highlight').each(function (index, element) { $(element).html('' + $(element).html() + ''); }); } function generateProgramDatesLinks() { generateProgramDatesLinksForRegion('bl'); generateProgramDatesLinksForRegion('bb'); } function generateProgramDatesLinksForRegion(regionCode) { $('.programm.' + regionCode + ' .dates .place').each(function (index, element) { if ($(element).data('place-disabled')) { return; } let place = $(element).data('place'); if (!place) { place = $(element).html(); } $(element).html('' + $(element).html() + ''); }); } function registerValidationEventHandlers() { $('input[type=submit].validate').closest('form').on('change', function() { let isValid = validate($(this), false); $(this).find('#submit_button').prop('disabled', !isValid); }).change(); } /** * Registers event handlers for captchas. */ function registerCaptchaEventHandlers() { $('div.captcha .new_image').click(function() { $(this).closest('.captcha').find('img').attr('src', 'https://www.spatzenkino.de/securimage/securimage_show.php?' + Math.random()); }); } /** * Initializes datepicker elements ('.datepicker'). */ function initDatepickers() { $.datepicker.setDefaults ({ dateFormat: 'd. MM yy', dayNames: [ 'Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag' ], dayNamesShort: [ 'So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa' ], dayNamesMin: [ 'So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa' ], monthNames: [ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember' ], monthNamesShort: [ 'Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez' ] }); $('.datepicker').each(function() { var datepickerOptions = {}; var _id = $(this).attr('id'); if (_id) { var dbFieldSuffix = '_dbDate'; var altFieldId = _id + dbFieldSuffix; datepickerOptions = { altField: '#' + altFieldId, altFormat: 'yy-mm-dd' }; if ($('#' + altFieldId).length <= 0) { var name = $(this).attr('name') + dbFieldSuffix; $(this).after(''); } } $(this).datepicker(datepickerOptions); }); } function clearDateField(fieldName) { if (fieldName) { $('input[name=' + fieldName + ']').val(''); $('input[name=' + fieldName + '_dbDate]').val(''); } } function updateAllNewEmailAddresses(select) { $('.email input[type=checkbox].new').prop('checked', select); } function updateAllInactiveEmailAddresses(select) { $('.email input[type=checkbox]:not(.active)').prop('checked', select); } function updateAllKitaEmailAddresses(select) { $('.email input[type=checkbox].kita').prop('checked', select); } function updateAllUnsentAddresses(select) { var daysBack = parseInt($('#select_unsent_newsletter_recipients_days').val()); var thresholdTimestamp = Date.now(); thresholdTimestamp -= daysBack * 24 * 60 * 60 * 1000; $('#address_book tr').each(function(index, row) { var timestamp = $(row).find('.last_mail_sent .timestamp').text(); if (timestamp == null || timestamp == '' || timestamp < (thresholdTimestamp / 1000)) { $(row).find('.email input[type=checkbox]').prop('checked', select); } }); } function registerNewsletterAddressBookEventHandlers() { $('#select_new_newsletter_recipients').click(function() { updateAllNewEmailAddresses($(this).is(':checked')); }); $('#select_inactive_newsletter_recipients').click(function() { updateAllInactiveEmailAddresses($(this).is(':checked')); }); $('#select_kita_newsletter_recipients').click(function() { updateAllKitaEmailAddresses($(this).is(':checked')); }); $('#select_unsent_newsletter_recipients').click(function() { updateAllUnsentAddresses($(this).is(':checked')); }); } function setAlertifyDefaults() { alertify.defaults = { notifier: { delay: 3, position: 'top-left', closeButton: true } }; } function updateSendNewsletterButton() { var buttonSelector = 'button#save_and_send_newsletter_button'; var attachmentsCount = $('input[type=checkbox].with_attachment:checked').length; var attachmentsText = 'keine Anhänge'; if (attachmentsCount > 0) { attachmentsText = attachmentsCount + ' ' + (attachmentsCount == 1 ? 'Anhang' : 'Anhänge'); } $(buttonSelector + ' #save_and_send_newsletter_button_attachments').text(attachmentsText); } function registerToNewsletterRecipientCheckboxesEventHandlers() { var selector = 'input[type=checkbox].to_newsletter_recipients'; $('body').on('change', selector, function() { var input = $(this).next('label').find('input.additional_recipient'); input.prop('disabled', ! $(this).is(':checked')); if ($(this).is(':checked')) { if ($(this).attr('id') == 'to_newsletter_recipients_bl') { $('input[type=checkbox]#to_newsletter_recipients_bl_kita').prop('checked', false); $('input[type=checkbox]#to_newsletter_recipients_bl_kita').attr('disabled', 'disabled'); } if ($(this).attr('id') == 'to_newsletter_recipients_bl_kita') { $('input[type=checkbox]#to_newsletter_recipients_bl').prop('checked', false); $('input[type=checkbox]#to_newsletter_recipients_bl').attr('disabled', 'disabled'); } if ($(this).attr('id') == 'to_newsletter_recipients_bb') { $('input[type=checkbox]#to_newsletter_recipients_bb_kita').prop('checked', false); $('input[type=checkbox]#to_newsletter_recipients_bb_kita').attr('disabled', 'disabled'); } if ($(this).attr('id') == 'to_newsletter_recipients_bb_kita') { $('input[type=checkbox]#to_newsletter_recipients_bb').prop('checked', false); $('input[type=checkbox]#to_newsletter_recipients_bb').attr('disabled', 'disabled'); } } else { if ($(this).attr('id') == 'to_newsletter_recipients_bl') { $('input[type=checkbox]#to_newsletter_recipients_bl_kita').removeAttr('disabled'); } if ($(this).attr('id') == 'to_newsletter_recipients_bl_kita') { $('input[type=checkbox]#to_newsletter_recipients_bl').removeAttr('disabled'); } if ($(this).attr('id') == 'to_newsletter_recipients_bb') { $('input[type=checkbox]#to_newsletter_recipients_bb_kita').removeAttr('disabled'); } if ($(this).attr('id') == 'to_newsletter_recipients_bb_kita') { $('input[type=checkbox]#to_newsletter_recipients_bb').removeAttr('disabled'); } } updateSendNewsletterButton(); }); } function registerWithAttachmentCheckboxesEventHandlers() { var selector = 'input[type=checkbox].with_attachment'; $('body').on('change', selector, function() { var input = $(this).next('label').find('input.additional_attachment'); input.prop('disabled', ! $(this).is(':checked')); updateSendNewsletterButton(); }); } function registerIconEventHandlers() { $('#add_additional_recipient_group').click(addAdditionalRecipientGroup); $('#add_additional_recipient_email_address').click(addAdditionalRecipientEmailAddress); $('#add_additional_recipient_region').click(addAdditionalRecipientRegion); $('#add_additional_attachment').click(addAdditionalAttachmentInputField); $('.remove_parent_list_item').live('click', removeParentListItem); } function registerToNewsletterRecipientsEventHandlers() { var fieldPrefix = 'to_newsletter_recipients_'; var fields = [ 'regions', 'sub_regions' ]; fields.forEach(function(field){ $('select.' + fieldPrefix + 'all_' + field).each(function() { $(this).off('change'); $(this).on('change', function() { var sibling = $(this).nextAll('select.' + fieldPrefix + field); if ($(this).val() == 0) { $(sibling).show(); } else { $(sibling).hide(); } }); $(this).change(); }); }); } function registerNewsletterSendEventHandlers() { $('#toggle_newsletter_recipient_mails').click(function() { $('#newsletter_recipient_mails').toggle(); }); $('#send_newsletter_confirm_button').click(function() { const count = $('#newsletter_recipient_count').text() if (window.confirm('Newsletter an ' + count + ' Empfänger versenden?')) { $('#send_newsletter_form').submit(); } }); } function addAdditionalRecipientGroup(withMinusIcon = true) { var html = $('#html_template_recipient_group').html(); if (withMinusIcon) { html += $('#html_template_minus_icon').html(); } $('#to_newsletter_recipients').append('
  • ' + html + '
  • '); $('#to_newsletter_recipients li select').removeAttr('disabled'); registerToNewsletterRecipientsEventHandlers(); } function addAdditionalRecipientEmailAddress(withMinusIcon = true) { var html = $('#html_template_recipient_email').html(); if (withMinusIcon) { html += $('#html_template_minus_icon').html(); } $('#to_newsletter_recipients').append('
  • ' + html + '
  • '); $('#to_newsletter_recipients li input').removeAttr('disabled'); registerToNewsletterRecipientsEventHandlers(); } function addAdditionalRecipientRegion(withMinusIcon = true) { var html = $('#html_template_recipient_region').html(); if (withMinusIcon) { html += $('#html_template_minus_icon').html(); } $('#recipient_regions').append('
  • ' + html + '
  • '); $('#recipient_regions li select, #recipient_regions li input').removeAttr('disabled'); } function removeParentListItem(event) { $(event.target).parents('li').remove(); } function addAdditionalAttachmentInputField() { var count = $('input[type=checkbox].with_additional_attachment').length; var id = 'with_additional_attachment_' + (count + 1); var html = '
  • ' + '' + '' + '
  • '; $('#with_attachments li.plus_icon').before(html); $('#' + id).trigger('change'); } function initNewsletterAdminArea() { registerToNewsletterRecipientCheckboxesEventHandlers(); registerWithAttachmentCheckboxesEventHandlers(); registerIconEventHandlers(); registerToNewsletterRecipientsEventHandlers(); $('#html_template_recipient_group select').attr('disabled', 'disabled'); $('#html_template_recipient_region select, #html_template_recipient_region input').attr('disabled', 'disabled'); updateSendNewsletterButton(); registerNewsletterSendEventHandlers(); } function initScreenAnimation() { initSnowScreenAnimation(); } function initConfettiScreenAnimation() { confetti({ particleCount: 100, spread: 70, origin: { y: 0.6 } }); } function initSnowScreenAnimation() { var duration = 15 * 1000; var animationEnd = Date.now() + duration; var skew = 1; function randomInRange(min, max) { return Math.random() * (max - min) + min; } (function frame() { var timeLeft = animationEnd - Date.now(); var ticks = Math.max(200, 500 * (timeLeft / duration)); skew = Math.max(0.8, skew - 0.001); confetti({ particleCount: 1, startVelocity: 0, ticks: ticks, origin: { x: Math.random(), // since particles fall down, skew start toward the top y: (Math.random() * skew) - 0.2 }, colors: ['#ffffff'], shapes: ['circle'], gravity: randomInRange(0.4, 0.6), scalar: randomInRange(0.4, 1), drift: randomInRange(-0.4, 0.4) }); if (timeLeft > 0) { requestAnimationFrame(frame); } }()); } function initTableSorter() { $('table.tablesorter').tablesorter({ widgets : ['zebra', 'filter'], widgetOptions: { filter_startsWith : false, filter_ignoreCase : true } }); } function initClickZones() { $('.click-zone').click(function(){ let targetUrl = $(this).data('target-url'); if (targetUrl) { window.location = targetUrl; } }); } function isAdminArea() { return $('#admin').length > 0; } function initBurgerMenu() { var $mobileMenu = $('#mobile_menu'); var $mobileMenuButton = $('#mobile_menu_button'); $mobileMenu.hide(); $mobileMenuButton.on('click', function() { $mobileMenu.toggle(); }); var $mobileMenuItems = $mobileMenu.find('.menuItem'); $mobileMenuItems.find('ul').hide(); $mobileMenuItems.on('click', function() { $mobileMenuItems.find('ul').hide(); $(this).find('ul').show(); }); } function initContentToggles() { const expandParam = 'expand'; $('.content_toggle').each(function() { let $toggleTarget = $($(this).data('content-toggle-target')); if ($toggleTarget.length <= 0) { $toggleTarget = $(this).next('div'); } $toggleTarget.hide(); $(this).click(function() { $toggleTarget.toggle(); }); if (!isRequestParam(expandParam) && $(this).hasClass('expanded')) { $(this).click(); } }); if (isRequestParam(expandParam)) { const expandParamValue = getRequestParamValue(expandParam); const $contentToggle = $('[data-content-toggle-target=#' + expandParamValue + ']'); if ($contentToggle && $contentToggle.length) { $contentToggle.click(); } } } $(document).ready(function() { registerHoverEventHandlers(); registerClickEventHandlers(); registerMoreContentEventHandlers(); registerMenuItemEventHandlers(); registerGalleryEventHandlers(); registerNewsletterAddressBookEventHandlers(); generateProgramDatesLinks(); generateHighlightLinks(); registerValidationEventHandlers(); registerCaptchaEventHandlers(); initDatepickers(); initNewsletterAdminArea(); initTableSorter(); initClickZones(); initBurgerMenu(); if (isMobile()) { initContentToggles(); } setAlertifyDefaults(); prefetchImages(); if (!isAdminArea()) { } });