/**
 * auEvents
 * @version 1.0
 *
 * Biblioteka do obłsugi zaproszen ( eventow )
 * @param {object} set - ustawienia
 */
function auEvents(set){
    var instance = this;
    ////console.log('auEvents::auEvents()');
    /*
     * @var months array miesiecy, bedzie sie zapelnial po zaladowaniu danego miesiaca, taka forma cache'a
     */
    this.months = new Array();
    /*
     * @var settings obiekt z ustawieniami
     */
    this.settings = {
        year : '2011',  // domyslny rok
        month : '1',    // domyslny miesiac
        language : 'pl', // domyslny jezyk
        next : '',      // next object
        previous : ''  // previous object
    }
    // zapisujemy podane ustawienia
    $.extend(this.settings, set);
    this.currentMonth = new auMonth(this.settings.month, this.settings.year)    
    this.settings.next.bind('click', nextMonth);
    this.settings.previous.bind('click', previousMonth);


    
    function nextMonth() {
        instance.settings.month =  instance.currentMonth.getNextMonth();
        instance.settings.year  =  instance.currentMonth.getNextYear();
        instance.getEvents(instance.settings.year,  instance.settings.month );
        return false;
    }

    function previousMonth() {
        instance.settings.month =  instance.currentMonth.getPreviousMonth();
        instance.settings.year  =  instance.currentMonth.getPreviousYear();
        instance.getEvents(instance.settings.year,  instance.settings.month );
        return false;
    }
    
    //    /*
    //     * @param {String} l - skrot jezykowy ( pl, en, ru )
    //     * @return void
    //     */
    //    this.loadLanguageFile = function(l) {
    //        var fileref=document.createElement('script')
    //        fileref.setAttribute("type","text/javascript")
    //        fileref.setAttribute("src", 'jscript/au-'+l+'-months.js');
    //        document.getElementsByTagName("head")[0].appendChild(fileref)
    //        ////console.log('jscript/au-'+l+'-months.js');
    //    }
    //    //ladujemy plik z jezykiem
    //    this.loadLanguageFile(this.settings.language);
    /*
     * Pobiera liste eventow z danego miesiaca
     * @param {int} y - Rok
     * @param {int} m - Miesiac
     * @return void
     */
    this.getEvents = function(y, m) {
        this.currentMonth = new auMonth(m,y);
        var currentMonth = this.currentMonth;
        $.get('zaproszenia/'+y+'/'+m+'.json', function(data){
            var o = $.parseJSON(data);
            if(o.code == '200') {
                var b = o.publicExchange.Zaproszenia;
                for(var i in b) {
                    var day = new auDay(i,y,m);
                    currentMonth.days[i] = day;
                    var c = b[i];
                    for(var j in c) {
                        day.events[j] = new auEvent(c[j].title, c[j].href, c[j].time, c[j].isExternal)
                    }
                }
            } else {
            ////console.log('auEvents::getEvents() # Couldnt fetch events array');
            }
            currentMonth.renderView();
        })
    ////console.log('auEvents::getEvents()')
    }   
    this.getEvents(this.settings.year, this.settings.month)
    $.get('zaproszenia/'+this.settings.year+'/'+this.settings.month+'/'+this.settings.day+'.json', function(data){
        var o = $.parseJSON(data);
        ////console.log(data);
        if(o.code == '200') {
            var b = o.publicExchange.Zaproszenia;                                    
            for(var i in b) {
                for(var z in b[i]) {
                    if(b[i][z].isExternal) {
                        $("#lastEvents").append('<li><a href="'+b[i][z].href+'" target="_blank">'+b[i][z].time+' '+b[i][z].title+'</a></li>')
                    } else {
                        $("#lastEvents").append('<li><a href="'+b[i][z].href+'">'+b[i][z].time+' '+b[i][z].title+'</a></li>')
                    }
                    
                }
            }
        ////console.log('auEvents::getEvents() # Couldnt fetch events array');
        }
    })
}
/*
 * Struktura miesiaca, przechowuje dane o danym miesiacu
 * @version 1.0
 * @param {int} mn - numer miesiaca
 * @param {String} title - nazwa miesiaca
 */
function auMonth(mn, year) {
    var o = new globalMonths();
    this.days = new Array();
    this.title = o.monthNames[mn]
    this.monthNb = mn;
    this.view = $('#events');
    this.view.html('');
    this.year = year
    this.zindex = 1000;
    this.titleContainer = $('#monthName');
    if(mn == '1') {
        this.delimiter = 'left';
    }
    if(mn == '12') {
        this.delimiter = 'right';
    }
    ////console.log('auMonth::auMonth() # '+mn);
    
    /**
     * Zwraca offset na podstawie pierwszego dnia miesiaca
     * @return int
     */
    this.getDayOffset =function() {
        var today =  new Date();
        today.setFullYear(this.year,(this.monthNb-1),'1');
        if((today.getDay()-1) < 0) {
            return 6;
        } else {
            return (today.getDay()-1);
        };
    }
    /*
     * Czy w danym miesiacu sa jakies eventy
     * @return Bool
     */
    this.hasEvents = function() {
        for(var i in this.days) {
            if(this.days[i].hasEvents()) {
                return true;
            }
        }
        return false;
    }

    this.getNextMonth = function() {
        if(this.delimiter == 'right') {
            return 1;
        } else {
            return parseInt(this.monthNb)+1;
        }
    }

    this.getPreviousMonth = function() {
        if(this.delimiter == 'left') {
            return 12;
        } else {
            return parseInt(this.monthNb)-1;
        }
    }

    this.getNextYear = function() {
        if(this.delimiter == 'right') {
            return parseInt(this.year)+1;
        } else {
            return this.year;
        }
    }

    this.getPreviousYear = function() {
        if(this.delimiter == 'left') {
            return parseInt(this.year)-1;
        } else {
            return this.year;
        }
    }

    /*
     * Zwraca ilosc dni w miesiacu
     * @return int
     */
    this.daysNumber = function() {
        return this.days.length;
    }

    this.renderView = function() {
        //        console.log(this.getDayOffset());
        this.view.append('<a href="#" class="day">P</a>');
        this.view.append('<a href="#" class="day">W</a>');
        this.view.append('<a href="#" class="day">Ś</a>');
        this.view.append('<a href="#" class="day">C</a>');
        this.view.append('<a href="#" class="day">P</a>');
        this.view.append('<a href="#" class="day">S</a>');
        this.view.append('<a href="#" class="day">N</a>');
        for(var z = 0;z < this.getDayOffset(); z++) {            
            this.view.append('<a href="#" class="day offset"> </a>');
        }
        for(var i in this.days) {
            var o = this.days[i].renderView();
            if(this.days[i].hasEvents()) {                
                if(this.compareDate(this.year, i) == 1) {
                    o.addClass('passed')
                } 
                if(this.compareDate(this.year, i) == -1) {
                    o.addClass('future');
                }
                if(this.compareDate(this.year, i) == 0) {                    
                    o.addClass('today');
                }
            }            
            if(this.compareDate(this.year, i) == 0) {                
                o.addClass('today');
            }
            o.css('z-index', this.zindex);
            this.zindex -=1;
            this.view.append(o);
        }
        this.titleContainer.html('<a href="zaproszenia/'+this.year+'/'+this.monthNb+'">'+this.title +' / '+ this.year+'</a>');
    }

    this.compareDate = function(y,d) {
        var today = new Date();
        var compared = new Date();
        compared.setFullYear(y, this.monthNb-1, d);
        //        console.log(today + '==' + compared);
        if(today > compared) {
            return 1;
        }         
        if(today < compared){
            return -1;
        }
        return 0;
    }
    
}
/*
 * Struktura przechowujaca dane o dniu
 * @version 1.0
 * @param {int} dn - numer dnia w miesiacu
 */
function auDay(dn,y,m) {
    this.dayNb = dn;
    this.events = new Array();
    this.view = $('<a href="" class="day"></a>');
    this.eventContainer = $('<div></div>');
    this.year = y;
    this.month = m;
    ////console.log(this);
    
    /*
     * Sprawdza czy w danym dniu jest jakis Event
     * @return bool
     */
    this.hasEvents = function() {
        if(this.events.length >0) {
            return true;
        } else {
            return false;
        }
    }

    this.renderView = function() {
        var events = this.events;
        var view = this.view;
        this.view.html(dn);
        if(this.hasEvents()) {
            this.view.attr('href', 'zaproszenia/'+this.year+'/'+this.month+'/'+this.dayNb);
            this.view.bind('mouseover', function(){
                view.find('span').show();
            //                view.find('span').slideDown('fast');
            })
            this.view.bind('mouseleave', function(){
                //                view.find('span').slideUp('fast');
                view.find('span').hide();
            })
            this.view.append('<span class="popupEvent"></span>');
            for(var i in events) {
                this.view.find('span').append(events[i].renderView());
            }
        }
        return this.view;

    }
    this.renderEvents = function() {
        for(var i in this.events) {
            this.eventContainer.append(this.events[i].renderView())
        }
    }

}
/*
 * Struktura przechowujaca dane o evencie
 * @version 1.0
 * @param {String} t - tytul
 * @param {String} h - link
 * @param {Time}   ti - godzina
 * @param {Bool}  ext - czy jest linkiem zewnetrznym
 */
function auEvent(t, h, ti, ext) {
    this.title =t;
    this.href= h;
    this.time = ti;
    this.isExternal = ext;
    this.view = '';
    ////console.log('auEvent::auEvent()');
    ////console.log(this);

    this.renderView = function() {
        var a = $('<a href="'+this.href+'">'+this.time+' '+this.title+'</a>');
        if(this.isExternal) {
            a.attr('target', '_blank');
        }
        this.view = a;
        return this.view;
    }
}

