
var Calendar = {//[
    callback: undefined,
    updateObject: undefined,
    startYear: undefined,
    startMonth: undefined,
    selectedYear: undefined,
    selectedMonth: undefined,
    strings: [],

    create: function(){//[
        new Insertion.Bottom( document.body,
              '<table id="calendar" style="display:none">'
            + '<tr><td class="prev" onclick="Calendar.prevMonth()">&nbsp;</td><td colspan="5" id="month">&nbsp;</td><td class="next" onclick="Calendar.nextMonth()">&nbsp;</td></tr>'
            + '<tr>' + Calendar.weekdays.map(function(n){return'<td class="wd">'+n+'</td>'}).join('') + '</tr>'
            + $R(0,5).map(function(r){return '<tr>'+$R(1,7).map(function(c){return'<td id="v'+(r*7+c)+'">&nbsp;</td>'}).join('')+'</tr>'}).join('')
            + '</table>'
        );
        Calendar.fillUp(Calendar.selectedYear,Calendar.selectedMonth,'');
    },//]
    display: function( e, callback ) {//[
        $('calendar').show();
        Calendar.callback = callback;
        Calendar.tmpJustShown = true;
//>alert(1)
//>        first=true;

        var dateValue = [];
        if ( e && e.getValue ) {
            dateValue = e.getValue().split('-');
            Calendar.updateObject = e;
        } else Calendar.updateObject = undefined;
        if ( !dateValue.any( function(e){ return isNaN(e); } ) && ( dateValue.length == 3 ) ) {
            Calendar.selectedMonth = dateValue[1]-1;
            Calendar.selectedYear = dateValue[0];
            Calendar.fillUp( dateValue[0], dateValue[1]-1, dateValue[2] );
        }
        Event.observe( document, 'click', Calendar.observeCal );
    },//]
    fillUp: function (cy,cm,hd) {//[
        now=new Date();
        sd=now.getDate();
        td=new Date();
        td.setDate(1);
        td.setFullYear(cy);
        td.setMonth(cm);
        cd=td.getDay();
        $('month').update( cy + '. ' + Calendar.monthNames[cm] + '.' );
        var maxDay = Calendar.monthDays[ cm ] + ( ( cy & 3 ) ? 1 : 0 );
        for(var d=1;d<=42;d++) {
            var field = $('v'+d);
            if ((d >= (cd -(-1))) && (d<=cd+maxDay)) {
                dip=((d-cd < sd)&&(cm==Calendar.startMonth)&&(cy==Calendar.startYear));
                htd=((hd!='')&&(d-cd==hd));

                if (dip)      field.className = 'denied';
                else if (htd) field.className = 'spec';
                else          field.className = 'default';

                if ( dip ) {
                    Event.stopObserving( field, 'mouseover', Calendar.observeFieldOver );
                    Event.stopObserving( field, 'mouseout', Calendar.observeFieldOut );
                    Event.stopObserving( field, 'click', Calendar.observeFieldClick );
                } else {
                    Event.observe( field, 'mouseover', Calendar.observeFieldOver );
                    Event.observe( field, 'mouseout', Calendar.observeFieldOut );
                    Event.observe( field, 'click', Calendar.observeFieldClick );
                }
                
                field.update( d - cd );
                Calendar.strings[d] = cy + '-' + ( cm + 1 ).toPaddedString(2)  + '-' + ( d - cd ).toPaddedString(2);
            } else {
                field.className = 'unused';
                field.update( '&nbsp;' )
                Event.stopObserving( field, 'mouseover', Calendar.observeFieldOver );
                Event.stopObserving( field, 'mouseout', Calendar.observeFieldOut );
                Event.stopObserving( field, 'click', Calendar.observeFieldClick );
            }
        }
    },//]
    nextMonth: function() {//[
        Calendar.selectedMonth++;
        if ( Calendar.selectedMonth == 12 ) {
            Calendar.selectedMonth = 0;
            Calendar.selectedYear++;
        }
        Calendar.fillUp( Calendar.selectedYear, Calendar.selectedMonth, '' );
    },//]
    prevMonth: function() {//[
        with ( Calendar ) {
            selectedMonth--;
            if ( selectedMonth == -1 ) {
                selectedMonth = 11;
                selectedYear--;
            }
            if ( selectedYear < startYear ||
                 selectedYear == startYear && selectedMonth < startMonth ) {
                selectedYear = startYear;
                selectedMonth = startMonth;
            }
            fillUp( Calendar.selectedYear, Calendar.selectedMonth, '' );
        }
    },//]
    observeCal: function( ev ) {//[
        var el = $( Event.element(ev) );
        var cal = el.up( '#calendar' );
        if ( !cal && el != $('calendar') && !Calendar.tmpJustShown ) {
            $( 'calendar' ).hide();
            Event.stop( ev );
            Event.stopObserving( document, 'click', Calendar.observeCal );
        }
        Calendar.tmpJustShown = false;
    },//]
    observeFieldOver: function( ev ) {//[
        $( Event.element( ev ) ).addClassName('hover');
    },//]
    observeFieldClick: function( ev ) {//[
        var el = $( Event.element( ev ) );
        var cb = Calendar.callback;
        if ( cb ) cb( Calendar.strings[ parseInt( el.id.replace(/^v/,'') ) ] );
        if ( Calendar.updateObject ) Calendar.updateObject.setValue( Calendar.strings[ parseInt( el.id.replace(/^v/,'') ) ] );
        $('calendar').hide();
    },//]
    observeFieldOut: function( ev ) {//[
        $( Event.element( ev ) ).removeClassName('hover');
    },//]

    monthNames: ['Jan','Feb','Márc','Ápr','Máj','Jún','Júl','Aug','Szept','Okt','Nov','Dec'],
    weekdays: ['V','H','K','Sz','Cs','P','Sz'],
    monthDays: [31,28,31,30,31,30,31,31,30,31,30,31]
}//]

Event.observe( window, 'load', function( ev ) {//[
    Calendar.tmpJustShown = false;
    var today = new Date();
    Calendar.startYear = Calendar.selectedYear = today.getFullYear();
    Calendar.startMonth = Calendar.selectedMonth = today.getMonth();
    Calendar.create();
} );//]


