/**
 * Haalt data uit een XML file en gebruikt deze om een datepicker dynamisch te vullen.
 * @requires Prototype
 * @author Romke v/d Meulen <r.vd.meulen@iwink.nl>
 */

//Opgehaalde kalender data
var calendar;

//Initieel weergegeven maand/jaar
var startDate;

//Huidig weergegeven maand/jaar
var dispDate;

/**
 *  initialiseert de kalender
 */
function initializeCalendar(dataFile)
{
    //Zet alle waarden naar standaard
    resetCalendar();
    //Haal data op
    new Ajax.Request(dataFile,
      { method: 'get',
        onSuccess: function(transport){

            //Data succesvol opgehaald
            calendars = transport.responseXML.getElementsByTagName('calendar');

            //Bewaar data
            if (calendars.length)
                calendar = transport.responseXML.getElementsByTagName('calendar')[0];

            //Geef data weer
            displayCalendar();
            //Activeer volgende/vorige maand links
            $('dp-nav-next-month').observe('click',nextMonth);
            $('dp-nav-prev-month').observe('click',prevMonth);
        }
      });
}

/**
 *  Zet naar volgende maand en geef weer
 */
function nextMonth()
{
    dispDate.setMonth(dispDate.getMonth() + 1);
    displayCalendar();
    return false;
}

/**
 *  Zet naar vorige maand en geef weer
 */
function prevMonth()
{
    dispDate.setMonth(dispDate.getMonth() - 1);
    displayCalendar();
    return false;
}

/**
 *  Laadt de maand in en geeft links waar overeenkomstige data gevonden
 */
function displayCalendar()
{
    emptyCalendar();
    loadCalendar();
    loadLinks();
}

/**
 *  Plaatst links bij elke dag waarvoor een item bestaat in de data
 */
function loadLinks()
{
    date = calendar.childNodes[1]; //Neem het tweede item uit calendar (eerste is een summary)
    for (i = 0; i < calendar.childNodes.length - 1; i++)
    {
        if(
            (date.nodeType == 1) //Item is een Element en
            &&
            ((year = date.childNodes[0].firstChild.nodeValue) == dispDate.getFullYear() + '')
            && //is hetzelfde jaar en
            (
                ((month = date.childNodes[1].firstChild.nodeValue) == (dispDate.getMonth() + 1) + '')
                ||
                ((month = date.childNodes[1].firstChild.nodeValue) == '0' + (dispDate.getMonth() + 1))
            ) //is dezelfde maand, dan:
          )
            //maak een link aan voor dit item
            makeLink(date.childNodes[2].firstChild.nodeValue,
                     date.childNodes[3].firstChild.nodeValue,
                     date.childNodes[4].firstChild.nodeValue);
        date = date.nextSibling;
    }
}

/**
 *  Maakt in de geladen kalender een link voor een gegeven dag naar een item
 **/
function makeLink(date,title,target)
{
    $('calendar-date-' + date).update('<a href="' + target + '" title="' + title + '">' + date + '</a>');
}

/**
 *  Laadt de maand in
 */
function loadCalendar()
{
    //Welke maand geven we weer
    month = dispDate.getMonth();

    //Start nummeren met 1
    date = 1;

    //Begin bij kolom van juiste weekdag
    pos = dispDate.getDay();

    var runningCopy = new Date(dispDate);

    //Voor alle velden zolang de dag nog binnen deze maand valt
    while( runningCopy.getMonth() == month )
    {
        if($('dp-calendar-data').childElements().length - 1 < Math.floor(pos / 7))	//Niet genoeg plaats: voeg een rij toe
            addCalendarRow();

        //Vul het bijbehorende veld in
        $('dp-calendar-data').childElements()[Math.floor(pos / 7)].childElements()[pos % 7].update(date + '').id = 'calendar-date-' + date;

        //Volgende dag
        runningCopy.setDate(runningCopy.getDate() + 1);
        date++; pos++;
    }

    //Pas de titel aan
    displayTitle();
}

/**
 *  Neemt de naam van de weergegeven maand als titel van de kalender
 */
function displayTitle()
{
    title = "";
    switch(dispDate.getMonth())
    {
        case 0:  title = "Januari"; 	break;
        case 1:  title = "Februari"; 	break;
        case 2:  title = "Maart"; 		break;
        case 3:  title = "April"; 		break;
        case 4:  title = "Mei"; 		break;
        case 5:  title = "Juni"; 		break;
        case 6:  title = "Juli"; 		break;
        case 7:  title = "Augustus"; 	break;
        case 8:  title = "September"; 	break;
        case 9:  title = "October"; 	break;
        case 10: title = "November"; 	break;
        case 11: title = "December"; 	break;
        default: title = "Kalender"; 	break;
    }
    title = (title == "Kalender" ? title : title + ' - ' + dispDate.getFullYear());
    $('dp-calendar-title').update(title);
}

/**
 *  Voeg een extra rij aan de kalender toe
 */
function addCalendarRow()
{
    //Maak een nieuwe tr
    newRow = new Element('tr');

    //Geef de tr zeven td's
    for(i = 0; i < 7; i++)
        newRow.insert(new Element('td'));

    //Voeg de nieuwe tr in aan het eind van dp-calendar-data
    $('dp-calendar-data').insert(newRow);
}

/**
 *  Haal een rij van de kalender weg
 */
function dropCalendarRow()
{
    //Zoek alle rijen op
    rows = $('dp-calendar-data').childElements();

    //Verwijder laatste element
    rows[rows.length - 1].remove();

}

/**
 *  Zet alle waarden naar een zinnige standaard
 */
function resetCalendar()
{
    //Leeg de kalender
    emptyCalendar();

    //Zet maand en jaar naar huidig
    dispDate = new Date(startDate);
    dispDate.setDate(1);
}

/**
 *  Leeg alle cellen en herzet de titel
 */
function emptyCalendar()
{
    //Standaard titel van de kalender
    $('dp-calendar-title').innerHTML = "Kalender";

    while($('dp-calendar-data').childElements().length > 0)
        dropCalendarRow();
}

