$(document).ready(function(){
    objKalendarz.init();
});

/**
 * Kalendarz
 *
 * Pobieranie danych z xml'a i zarządzanie nimi.
 * 
 * @autor Tomasz Pietrzak
 */
objKalendarz = {

    url             : '/externals/xml/wydarzenia/%Y%_%m%.xml', // ścieżka do pliku xml
    limit           : 4, // liczba wyświetlanych wydarzeń na jednej stronie
    
    name_datepicker : 'event-calendar', // id - datepicker
    name_choices    : 'event-choice',   // id - rodzaje wydarzeń
    name_events     : 'event-items',    // id - html z wydarzeniami
    name_event      : 'event-line',     // id - html z niewypełnionym wydarzeniem
    name_header     : 'event-header',   // id - html z nagłówkiem

    // inicjowanie obiektu
    init: function()
    {
        // pobieranie aktualnej daty
        var date = new Date();

        objKalendarz.date = {
            month     : date.getMonth(),    // miesiąc
            year      : date.getFullYear(), // rok
            monthName : new Array( 'stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia' )
        }
        
        // inicjowanie kalendarza
        $('#'+objKalendarz.name_datepicker).datepicker(objKalendarz.config());

        // pobieranie dostępnych kategorii
        objKalendarz.choice = {};
        $('#'+objKalendarz.name_choices).find('li span.label').each(function(){
            objKalendarz.choice[ $(this).attr('class').substr(6) ] = true;

            $(this).parent().click(function(){
                objKalendarz.onChangeChoice(this);
            });
        });
        
        // pobieranie danych z xml'a
        objKalendarz.load();
    },

    // pobieranie danych z xml'a
    load : function()
    {
        // przygotowanie nazwy pliku
        var url = objKalendarz.url.replace(
            "%m%", objKalendarz.strpad( objKalendarz.date.month + 1 )
        ).replace(
            "%Y%", objKalendarz.date.year
        );

        // czyszczenie starych danych
        objKalendarz.data = {};

        // ajax
        $.ajax({
            type: "GET",
            url: url,
            dataType: "xml",
            success: objKalendarz.success
        });
    },
    
    // uzupełnianie do 2 cyfr
    strpad: function(val)
    {
        return (!isNaN(val) && val.toString().length==1)?"0"+val:val;
    },

    // pobieranie listy wydarzeń do wyświetlenia
    summary : function(day)
    {
        // czyszczenie tablicy
        objKalendarz.html = new Array();

        // z wybranego dnia
        if( day != undefined )
        {
            $('#'+objKalendarz.name_header).html('Wydarzenia z dnia ' + day + ' ' + objKalendarz.date.monthName[objKalendarz.date.month]);
            
            $(objKalendarz.data['d'+day].events).each(function(){
                if( objKalendarz.choice[ $(this)[0].type ] == true )
                    objKalendarz.html.push($(this)[0]);
            });

        }
        // z całego miesiąca
        else
        {
            $('#'+objKalendarz.name_header).html('Wydarzenia z całego miesiąca');
            
            for ( var d in objKalendarz.data )
            {
                $(objKalendarz.data[d].events).each(function(){
                    if( objKalendarz.choice[ $(this)[0].type ] == true )
                        objKalendarz.html.push($(this)[0]);
                });
            }
        }

        // generowanie html'a
        objKalendarz.showHtml();
    },

    /**
     * XML
     */

    success: function(xml)
    {
        var event;
        var events;

        $(xml).find('Calendar').find('Day').each(function(){

            events = [];
            $(this).find('Event').each(function(){
                event = {
                    type     : $(this).attr('type'),
                    title    : $(this).find('Title').text(),
                    summary  : $(this).find('Summary').text(),
                    url      : $(this).find('Url').text(),
                    imageSrc : $(this).find('ImageSrc').text(),
                    imageAlt : $(this).find('ImageAlt').text(),
                    caption  : $(this).find('Caption').text()
                }
                events.push(event);
            });

            objKalendarz.data['d'+$(this).attr('n')] = {
                concert : $(this).attr('concert'),
                movie   : $(this).attr('movie'),
                book    : $(this).attr('book'),
                theater : $(this).attr('theater'),
                exhibit : $(this).attr('exhibit'),
                events  : events
            }

        });

        // wydarzenia z miesiąca
        objKalendarz.summary();

        // wymuszenie ponownego renderowania się kalendarza - beforeShowDay
        $('#'+objKalendarz.name_datepicker).datepicker("refresh");
    },

    /**
     * HTML
     */
    
    // generowanie html dla poszczególneo wydarzenia
    showHtml: function()
    {
        var html, html2;
        
        // czyszczenie html z wydarzeniami
        $('#'+objKalendarz.name_events).html('');

        // przejście po wszystkich wydarzeniach
        for( var i in objKalendarz.html )
        {
            // główny kontener
            html = $('<div></div>').addClass('class-article');

            // obrazek
            html2 = $('<img />').attr('src', objKalendarz.html[i].imageSrc)
                                .attr('alt', objKalendarz.html[i].imageAlt);
            html2 = $('<a></a>').attr('href',  objKalendarz.html[i].url)
                                .attr('title', objKalendarz.html[i].title)
                                .html(html2);
            html2 = $('<div></div>').addClass('rollover')
                                    .html(html2);
            html2 = $('<div></div>').addClass('msk')
                                    .html(html2);
            html2 = $('<div></div>').addClass('attribute-image')
                                    .html(html2);
            $(html).append(html2);

            // nagłowek
            html2 = $('<a></a>').attr('href',  objKalendarz.html[i].url)
                                .attr('title', objKalendarz.html[i].title)
                                .text(objKalendarz.html[i].title);
            html2 = $('<h2></h2>').html(html2);
            $(html).append(html2);

            // opis
            html2 = $('<div></div>').addClass('attribute-short')
                                    .html(objKalendarz.html[i].summary);
            $(html).append(html2);

            html = $('<div></div>').addClass('content-view-line span-3')
                                   .html(html);

            // jeśli pierwszy element (z 4)
            if( parseInt(i)%4 == 0 )
                $(html).addClass('clear');
            if( parseInt(i)%4 == 3 )
                $(html).addClass('last');

            // przypisywanie do głównego bloku
            $('#'+objKalendarz.name_events).append(html);
        }
    },

    // generowanie stronicowania
    pagination: function()
    {
    },

    /**
     * Datepicker
     */
    
    // konfiguracja kalendarza (jQuery, datepicker)
    config: function()
    {
        config = {
            maxDate           : '+3m',
            minDate           : '-3m',
            hideIfNoPrevNext  : true,
            showOtherMonths   : true,
            
            beforeShowDay     : objKalendarz.beforeShowDay,
            onChangeMonthYear : objKalendarz.onChangeMonthYear,
            onSelect          : objKalendarz.onSelect
        };

        return config;
    },

    // generowania komórki dnia w miesiącu
    beforeShowDay: function(date)
    {
        var active  = false;
        var classname = '';

        // jesli pobrane dane
        if( objKalendarz.data != undefined )
            // czy aktualny miesiąc
            if( date.getMonth() == objKalendarz.date.month )
                // czy istnieje wydarzenie danego dnia
                if( objKalendarz.data['d'+objKalendarz.strpad(date.getDate())] != undefined )
                {
                    // sprawdzanie czy istnieją zaznaczone wydarzenia
                    // koncerty
                    if( objKalendarz.choice.concert == true && objKalendarz.data['d'+objKalendarz.strpad(date.getDate())].concert > 0 )
                        active = true;
                    // filmy
               else if( objKalendarz.choice.movie   == true && objKalendarz.data['d'+objKalendarz.strpad(date.getDate())].movie   > 0 )
                        active = true;
                    // książki
               else if( objKalendarz.choice.book    == true && objKalendarz.data['d'+objKalendarz.strpad(date.getDate())].book    > 0 )
                        active = true;
                    // teatr
               else if( objKalendarz.choice.theater == true && objKalendarz.data['d'+objKalendarz.strpad(date.getDate())].theater > 0 )
                        active = true;
                    // wyprawy
               else if( objKalendarz.choice.exhibit == true && objKalendarz.data['d'+objKalendarz.strpad(date.getDate())].exhibit > 0 )
                        active = true;
                }

        classname = 'ui-datepicker-day-'+date.getDate();
        if( active == true ) classname += ' ui-datepicker-day-active';
        return [active, classname];
    },

    // zmiana miesiąca na kalendarzu
    onChangeMonthYear: function(year, month)
    {
        objKalendarz.date.month = month - 1;
        objKalendarz.date.year  = year;

        // pobieranie nowego xml'a
        objKalendarz.load();
    },

    // zmiana miesiąca na kalendarzu
    onSelect: function(dateText)
    {
        // wyświetlanie zaznaczonych wydarzeń z danego dnia
        objKalendarz.summary(dateText.split('.')[0]);
    },

    // zmiana rodzaju wydarzenia
    onChangeChoice: function(inst)
    {
        if( $(inst).find('span.checkbox').hasClass('checked') )
        {
            $(inst).find('span.checkbox').removeClass('checked');
            objKalendarz.choice[ $(inst).find('span.label').attr('class').substr(6) ] = false;
        }
        else
        {
            $(inst).find('span.checkbox').addClass('checked');
            objKalendarz.choice[ $(inst).find('span.label').attr('class').substr(6) ] = true;
        }

        // ograniczenie wydarzeń do wybranych rodzaji
        objKalendarz.summary();
        
        // refresh
        $('#'+objKalendarz.name_datepicker).datepicker("refresh");
    }
}
