function parseISO86012000(s) {
    //var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);
    var m = s.match(/^([0-9]{4})(([0-9]{2})(([0-9]{2})([T]([0-9]{2})([0-9]{2})(([0-9]{2})(\.([0-9]+))?)?(Z)?)?)?)?$/);
    
    if (!m) {
        return null;
    }
    var date = new Date(m[1], 0, 1);
    date.setUTCFullYear(
        m[1],
        m[3] ? m[3] - 1 : 0,
        m[5] || 1
    );
    date.setUTCHours(
        m[7] || 0,
        m[8] || 0,
        m[10] || 0,
        m[12] ? Number("0." + m[12]) * 1000 : 0
    );
    if (m[14]) {
        var offset = Number(m[16]) * 60 + (m[18] ? Number(m[18]) : 0);
        offset *= m[15] == '-' ? 1 : -1;
        date = new Date(+date + (offset * 60 * 1000));
    }
    return date;
}

function init_zoomlevel_modifier() {
    if ($('ul.body_fontsizes').length > 0) {
        
        $('body').delegate('ul.body_fontsizes .size', 'click', function() {
            $body = $('body');
            for (i=0;i<$('ul.body_fontsizes .size').length;i++) {
                $body.removeClass('scale' + i);
                $body.removeClass('zoom' + i);
            }
            var zoomLevel = $.inArray(this, $.makeArray($('ul.body_fontsizes .size')));
            if (typeof document.body.style.zoom == 'string') {
                //$body.addClass('zoom' + zoomLevel);
                $body.addClass('scale' + zoomLevel);
            } else {
                $body.addClass('scale' + zoomLevel);
            }
            $('ul.body_fontsizes .size').removeClass('active');
            $(this).addClass('active');
            $.cookies.set('zoomLevel', zoomLevel.toString());
        });
        
        $('body').delegate('ul.body_fontsizes .decrease', 'click', function() {
            var prev = $('ul.body_fontsizes .size.active').prev();
            if (prev.hasClass('size')) {
                prev.click();
            }
        });
        
        $('body').delegate('ul.body_fontsizes .encrease', 'click', function() {
            var next = $('ul.body_fontsizes .size.active').next();
            if (next.hasClass('size')) {
                next.click();
            }
        });
        
        var zoomLevel = $.cookies.get('zoomLevel');
        if (zoomLevel) {
            try {
                $($('ul.body_fontsizes .size')[parseInt(zoomLevel)]).click();
            } catch(e) {
                alert(e);
                $('ul.body_fontsizes .size.default').addClass('active');
            }
        } else {
            $('ul.body_fontsizes .size.default').addClass('active');
        }
        
        $('ul.body_fontsizes').addClass('loaded');
    }
}

function init_teaser_accordion() {
    $teaser_accordion = $('#teaserpane .teaser_accordion');
    
    $('#teaserpane .teaser_accordion_item .text').hide();
    $('body').delegate('#teaserpane .teaser_accordion_item .title', 'click', function() {
        $(this).toggleClass('active');
        $(this).next().slideToggle();
    });
}

function init_lunch_reservation_form() {
    var now = new Date().getTime();
    $('div.formfield_day', '#formradiolist_lunch_reservation_day').each(function() {
        var $this = $(this);
        var deadline = parseInt($.parseJSON(decodeURIComponent($this.data('deadline'))));
        if (now > deadline) {
            $this.addClass('deadlinereached');
            $('input', $this).attr('disabled', 'disabled');
        } else {
            var participants_left = $.parseJSON(decodeURIComponent($this.data('participants_left')));
            if (!isNaN(participants_left) && participants_left <= 0) {
                $this.addClass('maxparticipantsreached');
                $('input', $this).attr('disabled', 'disabled');
            }
        }
    });
    
    $('body').delegate('#formradiolist_lunch_reservation_day div.formfield_day', 'focus mouseenter', function() {
        var $this = $(this);
        try {
            $this.data('qtip').show();
        } catch (e) {
            $this.qtip({
                overwrite: true,
                content: {
                    text: getLangStr('message_lunch_reservation_day_loading', lang),
                    ajax: {
                        url: $.parseJSON(decodeURIComponent($this.data('url'))),
                        type: 'GET',
                        data: {'contentonly': 1},
                        success: function(data, status) {
                            if ($this.hasClass('deadlinereached')) {
                                data += '<div class="text_event_deadline_reached">' + decodeURIComponent($('#form_lunch_reservation').data('text_event_deadline_reached')) + '</div>';
                            } else if ($this.hasClass('maxparticipantsreached')) {
                                data += '<div class="text_event_max_participants_reached">' + decodeURIComponent($('#form_lunch_reservation').data('text_event_max_participants_reached')) + '</div>';
                            } else {
                                data += '<label class="btn_choose_day" for="' + $('label', $this).attr('for') + '" data-formfield="' + $this.attr('id') + '"><span>Auswählen</span></label>';
                            }
                            this.set('content.text', data);
                        }
                    }
                },
                hide: {
                    fixed: true
                },
                show: {
                    ready: true,
                    event: false
                },
                position: {
                    my: 'top left',
                    at: 'top right',
                    target: $('label', $this),
                    viewport: $(window)
                },
                style: {
                    classes: 'ui-tooltip-rounded ui-tooltip-lunch',
                    tip: false
                }
            });
        }
    });
    
    $('body').delegate('.ui-tooltip-lunch .ui-tooltip-content .btn_choose_day', 'click', function() {
        $('#' + $(this).data('formfield')).qtip('api').hide();
    })
}

function init_room_reservation_form() {
    $.fn.RoomReservationForm = function(options) {
        var t = this;
        t.$fieldinputStart = options.$fieldinputStart;
        t.$fieldinputEnd = options.$fieldinputEnd;
        t.$calendarsContainer = options.$calendarsContainer;
        t.now = new XDate();
        t.startDate = new XDate(t.now.getFullYear(), t.now.getMonth(), 1);
        t.firstAvailableDate = new XDate(t.now.getFullYear(), t.now.getMonth(), t.now.getDate());
        t.firstAvailableDate.addDays(parseInt(t.data('calendar_offset')));
        t.min_duration = parseInt(t.data('min_duration'));
        
        var currentDate = new XDate(t.startDate);
        for (i=0;i<2;i++) {
            var currentYear = currentDate.getFullYear();
            var currentMonth = currentDate.getMonth();
            var $calendar = $('<div class="calendar"></div>');
            t.$calendarsContainer.append($calendar);
            $calendar.fullCalendar({
                firstDay: 1,
                monthNames: $.datepicker._defaults['monthNames'],
                monthNamesShort: $.datepicker._defaults['monthNamesShort'],
                dayNames: $.datepicker._defaults['dayNames'],
                dayNamesShort: $.datepicker._defaults['dayNamesShort'],
                header: {
                    'left': 'title',
                    'center': '',
                    'right': ''
                },
                year: currentYear,
                month: currentMonth
            });
            currentDate.addMonths(1);
        }
        t.$calendars = $('.calendar', t.$calendarsContainer);
        t.firstDate = new XDate(t.$calendars.first().fullCalendar('getView').start);
        t.lastDate = new XDate(t.$calendars.last().fullCalendar('getView').end);
        t.busydates = {};
        
        var currentDate = new XDate(t.firstDate);
        while (currentDate < t.firstAvailableDate) {
            t.busydates[currentDate.toString('yyyy-MM-dd')] = true;
            currentDate.addDays(1);
        }
        
        function getNextEventStart(from) {
            var currentDate = new XDate(from);
            while (currentDate < t.lastDate && !t.busydates[currentDate.toString('yyyy-MM-dd')]) {
                currentDate.addDays(1);
            }
            return currentDate;
        }
        
        t.$fieldinputStart.change(function(event) {
            $this = $(this);
            
            t.$calendars.each(function() {
                var $calendar = $(this).data('fullCalendar').removeEvents('fc-userevent');
            });
            
            var startDate = new XDate($this.val());
            var minEndDate = startDate.clone().addDays(t.min_duration-1);
            
            var nextEventStart = getNextEventStart(startDate);
            var days = minEndDate.diffDays(nextEventStart)-1;
            
            var currentDate = minEndDate.clone();
            var currentValue = currentDate.toString('yyyy-MM-dd');
            t.$fieldinputEnd.empty();
            t.$fieldinputEnd.append('<option value=""></option>');
            t.$fieldinputEnd.append('<option value="' + currentValue + '">' + currentValue + '</option>');
            for (i=1; i<=days; i++) {
                currentDate.addDays(1);
                currentValue = currentDate.toString('yyyy-MM-dd');
                t.$fieldinputEnd.append('<option value="' + currentValue + '">' + currentValue + '</option>');
            }
        });
        
        t.$fieldinputEnd.change(function(event) {
            $this = $(this);
            var eventStartDate = new XDate(t.$fieldinputStart.val());
            var eventEndDate = new XDate($this.val());
            t.$calendars.each(function() {
                var $calendar = $(this);
                var fc = $calendar.data('fullCalendar');
                var fcView = fc.getView();
                var fcStart = fcView.start;
                var fcEnd = fcView.end;
                
                fc.removeEvents('fc-userevent');
                if ((eventStartDate >= fcStart && eventStartDate <= fcEnd) || (eventEndDate >= fcStart && eventEndDate <= fcEnd)) {
                    fc.renderEvent({
                        title: 'belegt',
                        start: eventStartDate,
                        end: eventEndDate,
                        allDay: true,
                        className: 'fc-userevent',
                        id: 'fc-userevent'
                    }, true);
                }
            });
        });
        
        $.ajax({
            url: $room_reservation_form.data('caldav_freebusy_url'),
            dataType: 'text',
            context: t,
            success: function(data) {
                var t = this;
                var ics = $.icalendar.parse(data);
                var ics_freebusy = [];
                if (ics.vfreebusy && ics.vfreebusy.freebusy) {
                    if ($.isArray(ics.vfreebusy.freebusy)) {
                        ics_freebusy = ics.vfreebusy.freebusy;
                    } else {
                        ics_freebusy.push(ics.vfreebusy.freebusy);
                    }
                }
                for (var i=0; i<ics_freebusy.length; i++) {
                    var period = ics_freebusy[i];
                    var currentDate = new XDate(period.start.getFullYear(), period.start.getMonth(), period.start.getDate());
                    var currentEndDate = new XDate(period.end.getFullYear(), period.end.getMonth(), period.end.getDate());
                    while (currentDate < currentEndDate) {
                        t.busydates[currentDate.toString('yyyy-MM-dd')] = true;
                        currentDate.addDays(1);
                    }
                }
                
                t.$calendars.each(function() {
                    var $calendar = $(this);
                    var fc = $calendar.data('fullCalendar');
                    var fcView = fc.getView();
                    var fcStart = fcView.start;
                    var fcEnd = fcView.end;
                    var currentDate = new XDate(fcStart);
                    while (currentDate <= fcEnd) {
                        if (t.busydates[currentDate.toString('yyyy-MM-dd')]) {
                            var eventStart = new XDate(currentDate);
                            while (currentDate < fcEnd && t.busydates[currentDate.toString('yyyy-MM-dd')]) {
                                var eventEnd = new XDate(currentDate);
                                currentDate.addDays(1);
                            }
                            fc.renderEvent({
                                title: 'belegt',
                                start: new XDate(eventStart),
                                end: new XDate(eventEnd),
                                allDay: true
                            }, true);
                        } else {
                            currentDate.addDays(1);
                        }
                    }
                });
                
                var nextEventStart, days, currentValue, i;
                var currentDate = new XDate(t.firstAvailableDate);
                while (currentDate < t.lastDate) {
                    if (t.busydates[currentDate.toString('yyyy-MM-dd')]) {
                        currentDate.addDays(1);
                    } else {
                        nextEventStart = getNextEventStart(currentDate);
                        days = currentDate.diffDays(nextEventStart) - t.min_duration;
                        if (days>0) {
                            currentValue = currentDate.toString('yyyy-MM-dd');
                            t.$fieldinputStart.append('<option value="' + currentValue + '">' + currentValue + '</option>');
                        }
                        for (i=1; i<=days; i++) {
                            currentDate.addDays(1);
                            currentValue = currentDate.toString('yyyy-MM-dd');
                            t.$fieldinputStart.append('<option value="' + currentValue + '">' + currentValue + '</option>');
                        }
                        currentDate = new XDate(nextEventStart);
                    }
                }
                
                var reservation_start = t.data('reservation_start');
                var reservation_end = t.data('reservation_end');
                if (reservation_start.length > 0) {
                    t.$fieldinputStart.val(reservation_start);
                    t.$fieldinputStart.change();
                }
                if (reservation_end.length > 0) {
                    t.$fieldinputEnd.val(reservation_end);
                    t.$fieldinputEnd.change();
                }
                
                t.addClass('loaded');
            }
        });
    }
    
    var $room_reservation_form = $('form.form_room_reservation');
    if ($room_reservation_form.length > 0) {
        var $loading = $('<div class="loading"><span>...lade Kalender...</span></div>');
        $('> .functions', '#formfieldset_room_reservation_reservation').append($loading);
        
        var $legend = $('<ul class="legend"><li class="free"><span class="color"></span><span class="label">frei</span></li><li class="event"><span class="color"></span><span class="label">belegt</span></li><li class="userevent"><span class="color"></span><span class="label">Ihre Reservierung</span></li></ul>');
        $('> .innercontent', '#formfieldset_room_reservation_reservation').append($legend);
        
        var $calendarsContainer = $('<div class="calendars"></div>');
        $('> .innercontent', '#formfieldset_room_reservation_reservation').append($calendarsContainer);
        
        $room_reservation_form.RoomReservationForm({
            $fieldinputStart: $('#field_input_room_reservation_reservation_start'),
            $fieldinputEnd: $('#field_input_room_reservation_reservation_end'),
            $calendarsContainer: $calendarsContainer,
        });
    }
}

function init_eventroom_reservation_form() {
    $.fn.EventroomReservationForm = function(options) {
        var t = this;
        t.$fieldinputDate = options.$fieldinputDate;
        t.$fieldinputTimeAM = options.$fieldinputTimeAM;
        t.$fieldinputTimePM = options.$fieldinputTimePM;
        t.$calendarsContainer = options.$calendarsContainer;
        t.now = new XDate();
        t.firstAvailableDate = t.now.clone().clearTime().addDays(parseInt(t.data('calendar_offset')));
        
        t.firstDate = t.firstAvailableDate.clone();
        var firstDay = t.firstDate.getDay();
        if (firstDay == 0) {
            t.firstDate.addDays(-6);
        } else if (firstDay > 1) {
            t.firstDate.addDays(-(firstDay-1));
        }
        
        t.lastAvailableDate = t.now.clone().clearTime().addMonths(1);
        t.lastAvailableDate.setDate(XDate.getDaysInMonth(t.lastAvailableDate.getFullYear(), t.lastAvailableDate.getMonth()));
        t.lastDate = t.lastAvailableDate.clone();
        if (t.lastDate.getDay() > 0) {
            t.lastDate.addDays(7-t.lastAvailableDate.getDay());
        }
        
        t.busydates = {};
        
        var currentDate = t.firstDate.clone();
        while (currentDate < t.firstAvailableDate) {
            t.busydates[currentDate.toString('yyyy-MM-dd')] = {am: true, pm: true};
            currentDate.addDays(1);
        }
        var currentDate = t.lastDate.clone();
        while (currentDate > t.lastAvailableDate) {
            t.busydates[currentDate.toString('yyyy-MM-dd')] = {am: true, pm: true};
            currentDate.addDays(-1);
        }
        
        // init fullCalendar
        t.$calendarsContainer.fullCalendar({
            firstDay: 1,
            defaultView: 'agendaWeek',
            header: {
                left:   'title',
                right:  'prev,next'
            },
            weekends: true,
            allDaySlot: false,
            allDayDefault: false,
            slotMinutes: 360,
            titleFormat: {
                week: 'dd.[ MMMM][ yyyy]{ - dd. MMMM yyyy}'
            },
            axisFormat: 'tl', //rows - time
            columnFormat: {
                week: 'ddd dd.MM' //columns - day
            },
            timeFormat: 'HH:mm', //events
            
            year: t.firstDate.getFullYear(),
            month: t.firstDate.getMonth(),
            date: t.firstDate.getDate(),
            minTime: 6,
            maxTime: 18,
            
            monthNames: $.datepicker._defaults['monthNames'],
            monthNamesShort: $.datepicker._defaults['monthNamesShort'],
            dayNames: $.datepicker._defaults['dayNames'],
            dayNamesShort: $.datepicker._defaults['dayNamesShort'],
            
            dateFormatters: {
                tl  : function(d)   { return d.getHours() < 12 ? 'vormittag' : 'nachmittag' },
            },
            
            viewDisplay: function(view) {
                // enable/disable prev/next buttons
                var $btnPrev = $('> .fc-header .fc-button-prev', t.$calendarsContainer);
                var $btnNext = $('> .fc-header .fc-button-next', t.$calendarsContainer);
                
                if (view.start > t.firstDate) {
                    $btnPrev.removeClass('fc-state-disabled');
                } else {
                    $btnPrev.addClass('fc-state-disabled');
                }
                
                if (view.end < t.lastDate) {
                    $btnNext.removeClass('fc-state-disabled');
                } else {
                    $btnNext.addClass('fc-state-disabled');
                }
                
                // draw a selectHelper when hovering
                var colCnt = view.getColCnt();
                var colWidth = view.getColWidth();
                var dayTable = $('.fc-agenda-days', t.$calendarsContainer);
                var slotTable = $('.fc-agenda-slots', t.$calendarsContainer);
                var dayHead = dayTable.find('thead');
                var axisFirstCells = dayHead.find('th:first');
                axisFirstCells = axisFirstCells.add(slotTable.find('th:first'));
                var axisWidth = 0;
                axisFirstCells.each(function(i, _cell) {
                    axisWidth = Math.max(axisWidth, $(_cell).outerWidth());
                });
                
                $('.fc-agenda-slots td', t.$calendarsContainer).bind('mousemove', {view: view, colCnt: colCnt, colWidth: colWidth, dayTable: dayTable, slotTable: slotTable, dayHead: dayHead, axisFirstCells: axisFirstCells, axisWidth: axisWidth}, function(event) {
                    var col = Math.min(colCnt-1, Math.floor((event.pageX - dayTable.offset().left - axisWidth) / colWidth));
                    var start = new XDate(view.visStart).addDays(col);
                    if (start < t.firstAvailableDate) {
                        return;
                    }
                    var rowMatch = this.parentNode.className.match(/fc-slot(\d+)/);
                    var mins = parseInt(rowMatch[1]) * view.opt('slotMinutes');
                    var hours = Math.floor(mins/60);
                    start.setHours(hours);
                    start.setMinutes(mins%60 + view.getMinMinute());
                    
                    var busydate = t.busydates[start.toString('yyyy-MM-dd')];
                    if (busydate && ((start.getHours() == 6 && busydate['am']) || (start.getHours() == 12 && busydate['pm']))) {return;}
                    
                    t.fc.select(start, start.clone().addHours(6), false);
                });
                
                $('.fc-agenda-slots td', t.$calendarsContainer).bind('mouseleave', function(event) {
                    t.fc.unselect();
                });
            },
            dayClick: function(date, allDay, jsEvent, view) {
                t.fc.unselect();
                
                if (date < t.firstAvailableDate) {
                    return;
                }
                var start = new XDate(date);
                var startDateString = start.toString('yyyy-MM-dd');
                var end = start.clone().addHours(6);
                var busydate = t.busydates[startDateString];
                
                var event = null;
                if (t.fc.clientEvents('fc-userevent')[0]) {
                    event = t.fc.clientEvents('fc-userevent')[0];
                    if (event.start.toString('yyyy-MM-dd') == startDateString) {
                        if (start < event.start && !(busydate && busydate['am'])) {
                            event.start = start;
                        } else if (end > event.end && !(busydate && busydate['pm'])) {
                            event.end = end;
                        }
                        t.fc.updateEvent(event);
                    } else {
                        event = null;
                    }
                }
                
                if (event == null) {
                    if (busydate && ((start.getHours() == 6 && busydate['am']) || (start.getHours() == 12 && busydate['pm']))) {return;}
                    var event = {
                        id: 'fc-userevent',
                        title: 'belegt',
                        start: start,
                        end: end,
                        allDay: false,
                        className: 'fc-userevent'
                    }
                    t.fc.removeEvents('fc-userevent');
                    t.fc.renderEvent(event, true);
                }
                
                t.$fieldinputDate.val(startDateString);
                if (event.start.getHours() == 6) {
                    t.$fieldinputTimeAM.attr('checked', 'checked');
                } else {
                    t.$fieldinputTimeAM.removeAttr('checked');
                }
                t.$fieldinputTimeAM.change();
                
                if (event.end.getHours() == 18) {
                    t.$fieldinputTimePM.attr('checked', 'checked');
                } else {
                    t.$fieldinputTimePM.removeAttr('checked');
                }
                t.$fieldinputTimePM.change();
            }
        });
        t.fc = t.$calendarsContainer.data('fullCalendar');
        
        $.ajax({
            url: t.data('caldav_freebusy_url'),
            dataType: 'text',
            context: t,
            success: function(data) {
                var t = this;
                var ics = $.icalendar.parse(data);
                var ics_freebusy = [];
                if (ics.vfreebusy && ics.vfreebusy.freebusy) {
                    if ($.isArray(ics.vfreebusy.freebusy)) {
                        ics_freebusy = ics.vfreebusy.freebusy;
                    } else {
                        ics_freebusy.push(ics.vfreebusy.freebusy);
                    }
                }
                
                // fill busydates slots
                var period, startDate, startDateString, endDate, startHour, endHour, currentDate, currentDateString;
                for (var i=0; i<ics_freebusy.length; i++) {
                    period = ics_freebusy[i];
                    startDate = new XDate(period.start).clone().clearTime();
                    startDateString = startDate.toString('yyyy-MM-dd');
                    endDate = new XDate(period.end).clone().clearTime();
                    endDateString = endDate.toString('yyyy-MM-dd');
                    startHour = period.start.getHours();
                    endHour = period.end.getHours();
                    if (startDateString == endDateString) {
                        if (startHour < 12 && endHour > 6) {
                            if (t.busydates[startDateString]) {
                                t.busydates[startDateString]['am'] = true;
                            } else {
                                t.busydates[startDateString] = {am: true, pm: false};
                            }
                        }
                        if (startHour < 18 && endHour > 12) {
                            if (t.busydates[startDateString]) {
                                t.busydates[startDateString]['pm'] = true;
                            } else {
                                t.busydates[startDateString] = {am: false, pm: true};
                            }
                        }
                    } else {
                        if (startHour < 12) {
                            t.busydates[startDateString] = {am: true, pm: true};
                        } else if (startHour < 18) {
                            if (t.busydates[startDateString]) {
                                t.busydates[startDateString]['pm'] = true;
                            } else {
                                t.busydates[startDateString] = {am: false, pm: true};
                            }
                        }
                        
                        currentDate = startDate.clone();
                        while (currentDate < endDate) {
                            t.busydates[currentDate.toString('yyyy-MM-dd')] = {am: true, pm: true};
                            currentDate.addDays(1);
                        }
                        
                        
                        if (endHour > 12) {
                            t.busydates[currentDate.toString('yyyy-MM-dd')] = {am: true, pm: true};
                        } else if (endHour > 6) {
                            currentDateString = currentDate.toString('yyyy-MM-dd');
                            if (t.busydates[currentDateString]) {
                                t.busydates[currentDateString]['am'] = true;
                            } else {
                                t.busydates[currentDateString] = {am: true, pm: false};
                            }
                        }
                    }
                }
                
                // make events from busydates slots
                var currentDate = t.firstDate.clone();
                var currentDateString, eventStart, eventEnd, nextTimeFrame = 'am';
                while (currentDate <= t.lastDate) {
                    currentDateString = currentDate.toString('yyyy-MM-dd');
                    if (t.busydates[currentDateString]) {
                        if (nextTimeFrame == 'am' && t.busydates[currentDateString]['am']) {
                            eventStart = currentDate.clone().setHours(6);
                            nextTimeFrame = 'pm';
                        } else if (t.busydates[currentDateString]['pm']) {
                            eventStart = currentDate.clone().setHours(12);
                            nextTimeFrame = 'am';
                            currentDate.addDays(1);
                        } else {
                            nextTimeFrame = 'am';
                            currentDate.addDays(1);
                            continue;
                        }
                        
                        eventEnd = null;
                        while (currentDate <= t.lastDate) {
                            currentDateString = currentDate.toString('yyyy-MM-dd');
                            if (!t.busydates[currentDateString]) {
                                var eventEnd = currentDate.clone().addDays(-1).setHours(18);
                                nextTimeFrame = 'am';
                                currentDate.addDays(1);
                                break;
                            }
                            if (nextTimeFrame == 'am' && !t.busydates[currentDateString]['am']) {
                                var eventEnd = currentDate.clone().addDays(-1).setHours(18);
                                nextTimeFrame = 'pm';
                                break;
                            }
                            if (!t.busydates[currentDateString]['pm']) {
                                var eventEnd = currentDate.clone().setHours(12);
                                nextTimeFrame = 'am';
                                currentDate.addDays(1);
                                break;
                            }
                            nextTimeFrame = 'am';
                            currentDate.addDays(1);
                        }
                        if (eventEnd == null) {
                            var eventEnd = currentDate.clone().addDays(-1).setHours(18);
                        }
                        t.fc.renderEvent({
                            title: eventEnd.toString('HH:mm'),
                            start: new XDate(eventStart),
                            end: new XDate(eventEnd),
                            allDay: false
                        }, true);
                    } else {
                        currentDate.addDays(1);
                    }
                }
                
                var check_reservation_date = function() {
                    var reservationDate = new XDate(t.$fieldinputDate.val());
                    if (reservationDate.valid()) {
                        reservationDate = reservationDate.clearTime();
                        reservationDateString = reservationDate.toString('yyyy-MM-dd');
                        var busydate = t.busydates[reservationDateString];
                        var event = {
                            id: 'fc-userevent',
                            title: 'belegt',
                            allDay: false,
                            className: 'fc-userevent'
                        }
                        if (t.$fieldinputTimeAM.is(':checked')) {
                            if (busydate && busydate['am']) {
                                t.$fieldinputDate.val('');
                                t.$fieldinputTimeAM.removeAttr('checked');
                                t.$fieldinputTimePM.removeAttr('checked');
                                return;
                            }
                            event.start = reservationDate.clone().setHours(6);
                            if (t.$fieldinputTimePM.is(':checked')) {
                                if (busydate && busydate['pm']) {
                                    t.$fieldinputTimePM.removeAttr('checked');
                                    event.end = reservationDate.clone().setHours(12);
                                } else {
                                    event.end = reservationDate.clone().setHours(18);
                                }
                            } else {
                                event.end = reservationDate.clone().setHours(12);
                            }
                        } else if (t.$fieldinputTimePM.is(':checked')) {
                            if (busydate && busydate['pm']) {
                                t.$fieldinputDate.val('');
                                t.$fieldinputTimeAM.removeAttr('checked');
                                t.$fieldinputTimePM.removeAttr('checked');
                                return;
                            }
                            event.start = reservationDate.clone().setHours(12);
                            event.end = reservationDate.clone().setHours(18);
                        } else {
                            t.$fieldinputDate.val('');
                            t.$fieldinputTimeAM.removeAttr('checked');
                            t.$fieldinputTimePM.removeAttr('checked');
                            return;
                        }
                        t.fc.renderEvent(event, true);
                        
                        var gotoDate = event.start.clone();
                        var firstDay = gotoDate.getDay();
                        if (firstDay == 0) {
                            gotoDate.addDays(-6);
                        } else if (firstDay > 1) {
                            gotoDate.addDays(-(firstDay-1));
                        }
                        t.$calendarsContainer.fullCalendar('gotoDate', gotoDate.toDate());
                    }
                }
                check_reservation_date();
                
                t.addClass('loaded');
            }
        });
        
    }
    
    var $eventroom_reservation_form = $('form.form_eventroom_reservation');
    if ($eventroom_reservation_form.length > 0) {
        var $loading = $('<div class="loading"><span>...lade Kalender...</span></div>');
        $('> .functions', '#formfieldset_eventroom_reservation_reservation').append($loading);
        
        var $legend = $('<ul class="legend"><li class="free"><span class="color"></span><span class="label">frei</span></li><li class="event"><span class="color"></span><span class="label">belegt</span></li><li class="userevent"><span class="color"></span><span class="label">Ihre Reservierung</span></li></ul>');
        $('> .innercontent', '#formfieldset_eventroom_reservation_reservation').append($legend);
        
        var $calendarsContainer = $('<div class="calendars"></div>');
        $('> .innercontent', '#formfieldset_eventroom_reservation_reservation').append($calendarsContainer);
        
        $eventroom_reservation_form.EventroomReservationForm({
            $fieldinputDate: $('#field_input_eventroom_reservation_reservation_date'),
            $fieldinputTimeAM: $('#field_input_eventroom_reservation_reservation_time_am'),
            $fieldinputTimePM: $('#field_input_eventroom_reservation_reservation_time_pm'),
            $calendarsContainer: $calendarsContainer,
        });
    }
}

$(function() {
    // use jquery ui's datepicker to get locale stuff (month-, daynames, etc..)
    $.datepicker.setDefaults($.datepicker.regional[language_codes[lang]['iso-639-1']]);
    
    init_zoomlevel_modifier();
    init_teaser_accordion();
    init_lunch_reservation_form();
    init_room_reservation_form();
    init_eventroom_reservation_form();    
});


