var calendar = {
    view : {
        _pages : null,
        curmonth : 0,
        curyear : 0,
        init : function()
        {
            try {
                var myCal = $('container_calendar').firstDescendant();
                if (myCal) {
                    myParts = myCal.id.split("_");
                    calendar.view.curmonth = parseInt(myParts[1]);
                    calendar.view.curyear = parseInt(myParts[2]);

                    calendar.view._pages = new Page('container_calendar');
                    calendar.view._pages.init();

                    var myCaption = 'calendar_'+myParts[1]+'_'+myParts[2]+'_caption';
                    if ($(myCaption)) {
                        var d = new Date();

                        calendar.view.loadNext();

                        var myElementId = calendar.view.getId(myParts[1], myParts[2]);
                        var myNext = Builder.node('a',{id:myElementId+'_nav_next',style:'float:right; font-weight:bold; cursor: pointer', title:'Maand verder'});
                        myNext.innerHTML = '&raquo;';
                        $(myCaption).insert({'top':myNext});
                        Event.observe(myNext,'click',calendar.view.nextPage);

                        // Do we need to add navigation for the previous page?
                        if (calendar.view.curyear > d.getFullYear() || (calendar.view.curyear == d.getFullYear() && calendar.view.curmonth > (d.getMonth()+1))) {
                            calendar.view.loadPrev();
                            var myPrev = Builder.node('a',{id:myElementId+'_nav_prev',style:'float:left; font-weight:bold; cursor: pointer', title:'Maand terug'});
                            myPrev.innerHTML = '&laquo;';
                            $(myCaption).insert({'top':myPrev});
                            Event.observe(myPrev,'click',calendar.view.prevPage);
                        }
                    } 
                }
            } catch(e) { window.alert(e);}
        },
        getId : function(myMonth, myYear) {
            myMonth = parseInt(myMonth);
            if (myMonth < 10) {myMonth = "0"+myMonth.toString();} else {myMonth = myMonth.toString();}
            return('calendar_'+myMonth+'_'+myYear);
        },
        loadNext : function() {
            var newmonth = calendar.view.curmonth + 1;
            var newyear = calendar.view.curyear;
            if (newmonth > 12) {
                newyear++;
                newmonth = 1;
            }
            calendar.view.load(newmonth, newyear);
        },
        loadPrev : function() {
            var newmonth = calendar.view.curmonth - 1;
            var newyear = calendar.view.curyear;
            if (newmonth < 1) {
                newyear--;
                newmonth = 12;
            }
            calendar.view.load(newmonth, newyear);
        },
        load : function(myMonth, myYear) {
            // Don't load pages with data from the past
            var d = new Date();
            if (myYear < d.getFullYear() || (myYear == d.getFullYear() && (myMonth-1) < d.getMonth())) {
                return;
            }

            myMonth = myMonth.toString();
            // Don't load pages that we already have
            var newPage = calendar.view.getId(myMonth, myYear);
            if ($(newPage)) {
                return;
            } else {
                calendar.view.create(myMonth, myYear);
            }

            // Request the next page
            var url = "index.php?m=calendar&e=getPage&month="+myMonth+"&year="+myYear+"&output=json";
            var reqmethod = "GET";
            var myAjax = new Ajax.Request(
                url,
                {
                    method: reqmethod,
                    onComplete: getResponse
                }
            );
        },
        insert : function(pageData) {
            try {
                var myMonth = pageData.month;
                var myYear = pageData.year;
                var myElementId = calendar.view.getId(myMonth,myYear);

                if ($(myElementId)) {
                    calendar.view.update(myMonth, myYear, pageData.events);
                } else {
                    calendar.view.create(myMonth, myYear);
                    calendar.view.update(myMonth, myYear, pageData.events);
                }
            } catch(e) { window.alert(e);}
            return true;
        },
        create : function(myMonth, myYear) {
            var nlmonths = new Array("januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december");
            var myElementId = calendar.view.getId(myMonth, myYear);
            if ($(myElementId)) return;

            // Create a calendar for this month
            var d = new Date();
            d.setDate(1);
            d.setMonth((parseInt(myMonth)-1));
            d.setFullYear(parseInt(myYear));

            var myPage = Builder.node('div');

            var myTable = Builder.node('table', {id:myElementId, className:'calendar'});

            var myCaption = Builder.node('caption', {id:myElementId+'_caption'});
            myTable.appendChild(myCaption);

            var dNow = new Date();

            var myNext = Builder.node('a',{id:myElementId+'_nav_next',style:'float:right; font-weight:bold; cursor: pointer', title:'Maand verder'});
            myNext.innerHTML = '&raquo;';
            myCaption.appendChild(myNext);
            Event.observe(myNext,'click',calendar.view.nextPage);

            // Do we need to add navigation for the previous page?
            if (d.getFullYear() > dNow.getFullYear() || (d.getFullYear() == dNow.getFullYear() && d.getMonth() > dNow.getMonth())) {
                var myPrev = Builder.node('a',{id:myElementId+'_nav_prev',style:'float:left; font-weight:bold; cursor: pointer;', title:'Maand terug'});

                myPrev.innerHTML = '&laquo;';
                myCaption.appendChild(myPrev);
                Event.observe(myPrev,'click',calendar.view.prevPage);
            }

            var myCaptionLink = Builder.node('a', {href:'index.php?m=calendar'});
            myCaptionLink.innerHTML = nlmonths[d.getMonth()]+' '+parseInt(myYear);
            myCaption.appendChild(myCaptionLink);

            var myThead = Builder.node('thead');
            myThead.innerHTML = "<tr><th>zo</th><th>ma</th><th>di</th><th>wo</th><th>do</th><th>vr</th><th>za</th></tr>";
            myTable.appendChild(myThead);

            var myTbody = Builder.node('tbody');

            var trows = new Array();
            var tcells = new Array();

            var checkpoint = 0;

            var cellMonth = parseInt(myMonth);
            cellMonth = "0"+cellMonth.toString();
            while ((parseInt(myMonth)-1) == d.getMonth() && checkpoint < 60) {
                if (tcells.length%7 == 0) {
                    trows.push(Builder.node('tr'));
                    myTbody.appendChild(trows[trows.length-1]);
                }

                if (d.getDay() == tcells.length%7) {
                    tcells.push(Builder.node('td',{},[
                      Builder.node('div',{id:'table_calendar_'+d.getDate()+''+cellMonth+''+d.getFullYear()},d.getDate())
                    ]));
                    trows[trows.length-1].appendChild(tcells[tcells.length-1]);
                    d.setDate(d.getDate()+1);
                } else {

                    tcells.push(Builder.node('td',{},[
                      Builder.node('div')
                    ]));
                    trows[trows.length-1].appendChild(tcells[tcells.length-1]);
                }
                checkpoint++;
            }

            myTable.appendChild(myTbody);
            myPage.appendChild(myTable);

            var myP = Builder.node('p',{className:'right'});
            var myPLink = Builder.node('a',{href:'index.php?m=calendar'});
            myPLink.innerHTML = "AGENDA &#187;";
            myP.appendChild(myPLink);
            myPage.appendChild(myP);

            // Determine the position of this month within the slider
            var months = $$('table.calendar');
            var position = -1;
            var myDateParts = months[0].id.split("_");
            if (myDateParts[2] < myYear || (myDateParts[2] == myYear && parseInt(myDateParts[1]) < parseInt(myMonth))) {
                // This month needs to be inserted after the 1st month. But where?
                for (i=0;i<months.length;i++) {
                    var myDateParts = months[i].id.split("_");
                    position = i;
                    if (myDateParts[2] > myYear || (myDateParts[2] == myYear && parseInt(myDateParts[1]) > parseInt(myMonth))) {
                        break;
                    }
                }
            }

            calendar.view._pages.newPage(position,myPage);
            return true;
        },
        update : function(myMonth, myYear, myEvents) {
            var myElementId = calendar.view.getId(myMonth, myYear);
            myMonth = parseInt(myMonth);
            if (myMonth < 10) {
                myMonth = "0"+myMonth.toString();
            }
            for (i=1;i<32;i++) {
                var divId = 'table_calendar_'+i+myMonth+myYear;
                if ($(divId)) {
                    $(divId).innerHTML = '';
                    var myLink = false;
                    if (myEvents[i]) {
                        if (myEvents[i].length == 1) {
                            myLink = Builder.node('a', {href:'index.php?m=calendar&calid='+myEvents[i][0].calid, title:myEvents[i][0].time+' '+escape(myEvents[i][0].title)},i);
                        } else if (myEvents[i].length > 1) {
                            var myDay = i;
                            if (i < 10) myDay = "0"+myDay.toString();
                            myLink = Builder.node('a', {href:'index.php?m=calendar#calendar_date_'+myDay+myMonth+myYear, title:'Meerdere evenementen'},i);
                        }
                    }
                    if (myLink) {
                        $(divId).appendChild(myLink);
                    } else {
                        $(divId).innerHTML = i;
                    }
                } 
            }

            return true;
        },
        nextPage : function() {
            // Check if the page exists
            var newmonth = calendar.view.curmonth + 1;
            var newyear = calendar.view.curyear;
            if (newmonth > 12) {
                newyear++;
                newmonth = 1;
            }
            var myElementId = calendar.view.getId(newmonth, newyear);

            calendar.view.curmonth = parseInt(newmonth);
            calendar.view.curyear = parseInt(newyear);

            if ($(myElementId)) {
                // Page exists, so display it
                calendar.view._pages.next();
            } else {
                // Create page before displaying it
                calendar.view.create(newmonth, newyear);
                calendar.view._pages.next();
                calendar.view.load(newmonth, newyear);
            }

            // Look a page ahead
            newmonth++;
            if (newmonth > 12) {
                newyear++;
                newmonth = 1;
            }

            myElementId = calendar.view.getId(newmonth, newyear);
            if ($(myElementId)) {
                return true;
            } else {
                calendar.view.create(newmonth, newyear);
                calendar.view.load(newmonth, newyear);
                return true;
            }
        },
        prevPage : function() {
            // Check if the page exists
            var newmonth = calendar.view.curmonth - 1;
            var newyear = calendar.view.curyear;
            if (newmonth < 1) {
                newyear--;
                newmonth = 12;
            }
            var myElementId = calendar.view.getId(newmonth, newyear);

            calendar.view.curmonth = parseInt(newmonth);
            calendar.view.curyear = parseInt(newyear);

            if ($(myElementId)) {
                // Page exists, so display it
                calendar.view._pages.prev();
            } else {
                // Create page before displaying it
                calendar.view.create(newmonth, newyear);
                calendar.view._pages.prev();
                calendar.view.load(newmonth, newyear);
            }

            // Look a page back
            newmonth--;
            if (newmonth < 1) {
                newyear--;
                newmonth = 12;
            }

            myElementId = calendar.view.getId(newmonth, newyear);
            if ($(myElementId)) {
                return true;
            } else {
                calendar.view.create(newmonth, newyear);
                calendar.view.load(newmonth, newyear);
                return true;
            }
        }
    },
    event : {
        reqDelete : function(calid, title)
        {
            if (confirm('Weet je zeker dat je het evenement \''+title+'\' wilt verwijderen?')) {
                var url = "index.php?m=calendar&c=edit&e=delete&calid="+calid+"&output=json";
                var reqmethod = "GET";

                var myAjax = new Ajax.Request(
                    url,
                    {
                        method: reqmethod,
                        onComplete: getResponse
                    }
                );

                return false;
            } else {
                return false;
            }
        },
        remove : function(calid)
        {
            new Effect.SlideUp('calendar_event_'+calid,{afterFinish: function() {$('calendar_event_'+calid).remove()}});
        }
    }
}
Event.observe(window, 'load', calendar.view.init, false);
