var TCalendar = Class.create({

    initialize: function() {
        this.togglerElement = $(arguments[0]);
        this.options = Object.extend({
            dateRangeStart: '1970-01-01',
            dateRangeEnd: '2038-01-19'
        }, arguments[1] || { });

        //this.selectedDate = new Date();
        this.leftDate = new Date();
        this.rightDate = new Date();

        this.months = $w("Január Február Március Április Május Június Július Augusztus Szeptember Október November December");
        this.days = $w("V H K Sz Cs P Sz");


        if(this.options.dateRangeStart){
            this.dateRangeStart = this._str2Date(this.options.dateRangeStart);
        }
        if(this.options.dateRangeEnd){
            this.dateRangeEnd = this._str2Date(this.options.dateRangeEnd);
        }

        this.tCalendarContainer = this._buildCalendarContainer();

        //mellekattintasra eltuntetes (ha nem a naptaron tortent a kattintas, akkor rejtjuk el)
        Event.observe( document, 'click', function(e){
            if(Prototype.Browser.Opera){
                if(!$(e.target).descendantOf(this.tCalendarContainer) && !$(e.target).descendantOf(this.togglerElement) && $(this.tCalendarContainer).visible()){
                    $(this.tCalendarContainer).hide();
                }
            }else{
                if(!$(e.target).descendantOf(this.tCalendarContainer) && e.target != this.togglerElement && $(this.tCalendarContainer).visible()){
                    $(this.tCalendarContainer).hide();
                }
            }

        }.bind(this), true);

        //esemenykezelo a nyito/csuko gombhoz
        this.togglerElement.observe('click', this._tCalendarToggle.bind(this, this.togglerElement))

        //esemenykezelo a bezaras gombhoz
        this.tCalendarContainer
            .down('.btnCloseCont a.btnClose')
            .observe('click', this._tCalendarClose.bind(this,this.tCalendarContainer));
        //esemenykezelok az elozo/kovetkezo honap nyilakhoz (duplakattintas is)
        this.tCalendarContainer
            .down('.calendarRight .btnNext')
            .observe('click', this._setNextMonth.bind(this));
        this.tCalendarContainer
            .down('.calendarRight .btnNext')
            .observe('dblclick', this._setNextMonth.bind(this));
        this.tCalendarContainer
            .down('.calendarLeft .btnPrev')
            .observe('click', this._setPrevMonth.bind(this));
        this.tCalendarContainer
            .down('.calendarLeft .btnPrev')
            .observe('dblclick', this._setPrevMonth.bind(this));

    },

    setCalendar: function(d) {
        //d datumra beallitja a bal oldali naptarat
        //jobb oldalon a kovetkezo honapot mutatja
        //this.selectedDate = d;
        this.leftDate = d;
        this.rightDate = this._nextMonth(this.leftDate);
        this.leftCalInstance = this._buildLeftCalendar();
        this.rightCalInstance = this._buildRightCalendar();
        this._updateTitles();

    },

    _updateElements: function(d) {
        $(this.options.inputYear).value = d.getFullYear();
        $(this.options.inputMonth).value = (d.getMonth()+1).toPaddedString(2);
        $(this.options.inputDate).value = d.getDate().toPaddedString(2);
    },

    _updateSelectedDateFromInput: function() {
        if(this.options.fullDateInput){
            this.selectedDate = this._str2Date($(this.options.fullDateInput).value);
        }else{
            if(this.options.inputYear && this.options.inputMonth && this.options.inputDate){
                var y = Number($(this.options.inputYear).value);
                var m = Number($(this.options.inputMonth).value)-1;
                var d = Number($(this.options.inputDate).value);

                y = (y >= 1970 && y <=2038) ? y : undefined;
                m = (m >= 0 && m <= 11) ? m : undefined;
                d = (d >= 1 && d <= 31) ? d : undefined;

                if(y && m && d){
                    this.selectedDate = new Date(y, m, d);
                }else{
                }

            }else{
                var yInputElement = $(this.togglerElement).up().down('input.tCalendarYear');
                var mInputElement = $(this.togglerElement).up().down('input.tCalendarMonth');
                var dInputElement = $(this.togglerElement).up().down('input.tCalendarDate');
                if(yInputElement && mInputElement && dInputElement){
                    this.selectedDate = new Date(this._str2Date(yInputElement.value, mInputElement.value, dInputElement.value));
                }else{
                    //this.selectedDate = new Date();
                }
            }
        }
    },

    _nextMonth: function(d) {
        var d = new Date(d.getFullYear(), d.getMonth(), d.getDate());
        if(d.getMonth() < 11){
            d.setMonth(d.getMonth()+1);
        }else{
            d.setFullYear(d.getFullYear()+1);
            d.setMonth(0);
        }
        return d;
    },

    _prevMonth: function(d) {
        var d = new Date(d.getFullYear(), d.getMonth(), d.getDate());
        if(d.getMonth() > 0){
            d.setMonth(d.getMonth()-1);
        }else{
            d.setFullYear(d.getFullYear()-1);
            d.setMonth(11);
        }
        return d;
    },

    _str2Date: function(str) {
        var dElements = str.split('-');
        var d = new Date();
        d.setFullYear(Number(dElements[0]));
        d.setMonth(Number(dElements[1])-1);
        d.setDate(Number(dElements[2]));
        d.setHours(0);
        d.setMinutes(0);
        d.setSeconds(0);
        d.setMilliseconds(0);
        return d;
    },

    _buildCalendarContainer: function() {
        var tCalendarContainer = new Element('div', { 'class': 'tCalendar', 'style': 'display:none;' });

        var html = '';
        html += '  <div class="contentTop">';
        html += '    <div class="btnCloseCont"><a href="#" class="btnClose" onclick="return false;">Bezárás</a></div>';
        html += '  </div>';
        html += '  <div class="contentBottom">';
        html += '    <div class="calendarLeft">';
        html += '      <div class="calheaderCont">';
        html += '        <a href="#" class="btnPrev" onclick="return false;"><span>Előző hónap</span></a>';
        html += '        <div class="title"></div>';
        html += '      </div>';
        html += '      <div class="caltableCont"></div>';
        html += '    </div>';
        html += '    <div class="calendarRight">';
        html += '      <div class="calheaderCont">';
        html += '        <a href="#" class="btnNext" onclick="return false;"><span>Következő hónap</span></a>';
        html += '        <div class="title"></div>';
        html += '      </div>';
        html += '      <div class="caltableCont"></div>';
        html += '    </div>';
        html += '  </div>';

        tCalendarContainer.innerHTML = html;
        this.togglerElement.insert({ 'after' : tCalendarContainer });

        return tCalendarContainer;
    },

    _buildLeftCalendar: function() {
        var leftCalInstance = new SimpleCalendar(this.tCalendarContainer.down('.calendarLeft .caltableCont'), {
            initialDate: this.leftDate,
            selectedDate: this.selectedDate ? this.selectedDate : undefined,
            dateRangeStart: this.dateRangeStart,
            dateRangeEnd: this.dateRangeEnd,
            weekdaystart: 1,
            onCalChange: function(d){
                if(this.rightCalInstance.selectedDateElement){
                    this.rightCalInstance.selectedDateElement.removeClassName('dayselected');
                }
                this.selectedDate = new Date(d);
                this.rightCalInstance.options.selectedDate = new Date(d);
                this._updateElements(d);
            }.bind(this)
        });
        return leftCalInstance;
    },

    _buildRightCalendar: function() {
        var rightCalInstance = new SimpleCalendar(this.tCalendarContainer.down('.calendarRight .caltableCont'), {
            initialDate: this.rightDate,
            selectedDate: this.selectedDate ? this.selectedDate : undefined,
            dateRangeStart: this.dateRangeStart,
            dateRangeEnd: this.dateRangeEnd,
            weekdaystart: 1,
            onCalChange: function(d) {
                if(this.leftCalInstance.selectedDateElement){
                    this.leftCalInstance.selectedDateElement.removeClassName('dayselected');
                }
                this.selectedDate = new Date(d);
                this.leftCalInstance.options.selectedDate = new Date(d);
                this._updateElements(d);
            }.bind(this)
        });
        /* if(rightCalInstance.selectedDateElement){
            rightCalInstance.selectedDateElement.removeClassName('dayselected');
        } */

        return rightCalInstance;
    },

    _tCalendarToggle: function(linkElement) {
        var linkElement = $(linkElement);
        var tCalendarCont = linkElement.up().getElementsByClassName('tCalendar')[0];

        if(tCalendarCont.style.display == 'block'){
            tCalendarCont.style.display = 'none';
        }else{
            //focusDiv.addClassName('focused');
            if(navigator.appVersion.indexOf('MSIE 6') != -1){
                //nem tudom miert pont ennyi, de mukodik
                var xPos = 15;
                var yPos = 8;
            }else if(navigator.appVersion.indexOf('MSIE 7') != -1){
                var xPos = linkElement.offsetLeft+35;
                var yPos = 8;
            }else{
                var xPos = linkElement.offsetLeft+35;
                var yPos = linkElement.offsetTop-6;
            }
            tCalendarCont.style.left = xPos + "px";
            tCalendarCont.style.top = yPos + "px";
            tCalendarCont.style.display = 'block';

            /* */
            this._updateSelectedDateFromInput();
            if(this.selectedDate){
                this.setCalendar(new Date(this.selectedDate));
            }else{
                this.setCalendar(new Date());
            }

        }
    },

    _tCalendarClose: function(tCalendarContainer) {
        this.tCalendarContainer.hide();
    },

    _updateTitles: function() {
        var leftCalTitle = this.tCalendarContainer.down('.calendarLeft .title');
        var rightCalTitle = this.tCalendarContainer.down('.calendarRight .title');

        leftCalTitle.innerHTML = this.leftDate.getFullYear() + ' ' + this.months[this.leftDate.getMonth()];
        rightCalTitle.innerHTML = this.rightDate.getFullYear() + ' ' + this.months[this.rightDate.getMonth()];
    },

    _setNextMonth: function() {
        this.leftCalInstance.nextMonth();
        this.rightCalInstance.nextMonth();
        this._updateTitles();
    },

    _setPrevMonth: function() {
        this.leftCalInstance.prevMonth();
        this.rightCalInstance.prevMonth();
        this._updateTitles();
    }

});