(function($) {
    $.fn.ypscalendar = function(options) {
        /**
		 * Default settings
		 */
        var defaults = {
            startInput: '#arrivalPicker',
            endInput: '#departurePicker',
            dateFormat: 'd.m.yy',
            minDate: +1,
            maxDate: '+1y',
            range: +1,
			
            startAltDate: undefined,
            startAltMonth: undefined,
            startAltYear: undefined,
            startAltMonthYear: undefined,

            endAltDate: undefined,
            endAltMonth: undefined,
            endAltYear: undefined,
            endAltMonthYear: undefined
        };
		
        /**
		 * Initial setup
		 */
        var options = $.extend(defaults, options);
		
        /**
		 * Some dates...
		 */
        var today = new Date();
        var minStartDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + options.minDate);
        var minEndDate = new Date(minStartDate.getFullYear(), minStartDate.getMonth(), minStartDate.getDate() + options.range);
        var startDate = minStartDate;
        var endDate = minEndDate;
		
        /**
		 * Inputs
		 */
        var startInput = $(options.startInput);
        var endInput = $(options.endInput);
        var startAltInputs = {
            date: options.startAltDate ? $(options.startAltDate) : null,
            month: options.startAltMonth ? $(options.startAltMonth) : null,
            year: options.startAltYear ? $(options.startAltYear) : null,
            monthYear: options.startAltMonthYear ? $(options.startAltMonthYear) : null
        };
        var endAltInputs = {
            date: options.endAltDate ? $(options.endAltDate) : null,
            month: options.endAltMonth ? $(options.endAltMonth) : null,
            year: options.endAltYear ? $(options.endAltYear) : null,
            monthYear: options.endAltMonthYear ? $(options.endAltMonthYear) : null
        };

        /**
		 * Set minimal dates before show
		 */
        var setMinDate = function(input) {
            return {
                minDate: $(this).hasClass('first') ? minStartDate : minEndDate
                };
        }
		
        /**
		 * Set alt fields and correct min dates
		 */
        var onSelect = function(dateText, inst) {
            // selected date
            var d = new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay);
            // first or second input?
            if ($(this).hasClass('first')) {
                startDate = d;
                // set end minimal date = startDate + range
                minEndDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + options.range);
                if (minEndDate > endDate) {
                    // if minimal end date is after endDate - set endDate = minEndDate
                    endDate = minEndDate;
                    endInput.datepicker('setDate', endDate);
                    setAltFields(endAltInputs, endDate);
                }
            } else {
                endDate = d;
            }
            // fill alt fields
            setAltFields($(this).hasClass('first') ? startAltInputs : endAltInputs, d);
        }
		
        /**
		 * Fill alternative fields
		 */
        var setAltFields = function(altFields, date) {
            if (altFields.date) {
                altFields.date.val(date.getDate());
            }
            if (altFields.month) {
                altFields.month.val(date.getMonth() + 1);
            }
            if (altFields.year) {
                altFields.year.val(date.getFullYear());
            }
            if (altFields.monthYear) {
                altFields.monthYear.val(date.getMonth() + 1 + '-' + date.getFullYear());
            }
        }
			
        /**
		 * Main loop
		 */
        return this.each(function(){
            // bind datepicker
            $(this).datepicker({
                dateFormat: options.dateFormat,
                maxDate: options.maxDate,
                beforeShow: setMinDate,
                onSelect: onSelect
            });
			
            // default dates
            $(this).datepicker('setDate', $(this).hasClass('first') ? minStartDate : minEndDate);
            if ($(this).hasClass('first')) {
                setAltFields(startAltInputs, startDate);
            } else {
                setAltFields(endAltInputs, endDate);
            }
        });
    };
})(jQuery);
