/**
 * DatePicker functions
 *
 * @params {jQuery} $
 * @class DatePickerInit
 */
function DatePickerInit($) {
    'use strict';

    /**
     * Initialize
     *
     * @returns {void}
     */
    this.initialize = function() {
        addDatePicker();
    };

    /**
     * Add datepicker to date fields
     *
     * @returns {void}
     * @private
     */
    var addDatePicker = function() {
        if ($.fn.datetimepicker) {
            $('input[type="date"]').each(function() {
                var $this = $(this);
                // stop javascript datepicker, if browser supports type="date" or "datetime-local" or "time"
                if ($this.prop('type') === 'date' || $this.prop('type') === 'datetime-local' || $this.prop('type') === 'time') {
                    if ($this.data('datepicker-force')) {
                        // rewrite input type
                        $this.prop('type', 'text');
                        $this.val($(this).data('date-value'));
                    } else {
                        // get date in format Y-m-d H:i for html5 date fields
                        if ($(this).data('date-value')) {
                            var prefillDate = getDatetimeForDateFields($(this).data('date-value'), $(this).data('datepicker-format'), $this.prop('type'));
                            if (prefillDate !== null) {
                                $(this).val(prefillDate);
                            }
                        }

                        // stop js datepicker
                        return;
                    }
                }

                var datepickerStatus = true;
                var timepickerStatus = true;
                if ($this.data('datepicker-settings') === 'date') {
                    timepickerStatus = false;
                } else if ($this.data('datepicker-settings') === 'time') {
                    datepickerStatus = false;
                }

                // create datepicker
                $this.datetimepicker({
                    format: $this.data('datepicker-format'),
                    timepicker: timepickerStatus,
                    datepicker: datepickerStatus,
                    lang: 'en',
                    i18n:{
                        en:{
                            months: $this.data('datepicker-months').split(','),
                            dayOfWeek: $this.data('datepicker-days').split(',')
                        }
                    }
                });
            });
        }
    };

    /**
     * Convert date format for html5 date fields
     *      31.08.2014 => 2014-08-31
     *
     * @param {string} value
     * @param {string} format
     * @param {string} type
     * @returns {string|null}
     * @private
     */
    var getDatetimeForDateFields = function(value, format, type) {
        var formatDate = Date.parseDate(value, format);
        if (formatDate === null) {
            return null;
        }
        var date = new Date(formatDate);
        var valueDate = date.getFullYear() + '-';
        valueDate += ('0' + (date.getMonth() + 1)).slice(-2) + '-';
        valueDate += ('0' + date.getDate()).slice(-2);
        var valueTime = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
        var valueDateTime = valueDate + 'T' + valueTime;

        if (type === 'date') {
            return valueDate;
        }
        if (type === 'datetime-local') {
            return valueDateTime;
        }
        if (type === 'time') {
            return valueTime;
        }
        return null;
    };
}

jQuery(document).ready(function($) {
    'use strict';
    var DatePickerInit = new window.DatePickerInit($);
    DatePickerInit.initialize();
});
