﻿var Qs_Form_Element_Date = {

    timeoutHandle : null,
    eventTimeout : 1000,

    message: new Qs_Message({
        'eng': {
        },
        'uk': {
        }
    }),
    options: {},

    init: function (id, options)
    {
        var element = document.getElementById('_' + id);
        if (!element) {
            alert('Qs_Form_Element_Date. Can not find element with id = _' + id);
            return false;
        }
        if (!element.tagName || element.tagName != 'INPUT') {
            alert('Qs_Form_Element_Date. Element (id = _' + id + ') is not "input"');
            return false;
        }
        if (element.type != 'text') {
            alert('Qs_Form_Element_Date. Element (id = _' + id + ') type is not "text"');
            return false;
        }
        options.onChangeMonthYear = Qs_Form_Element_Date.onChangeMonthYear;
        $('#_' + id).datepicker(options);
        var format = Qs_Form_Element_Date.getElementOption(id, 'dateFormat');
        format = format.replace(/y/g, 'yy');
        $('#_' + id).attr('maxlength', format.length);
        if ($('#_' + id).attr('disabled')) {
            $('#_' + id).next('.ui-datepicker-trigger').hide();
        }
        $(element).qtip({
            content: 'Date is in wrong format. Example: ' + $.datepicker.formatDate(Qs_Form_Element_Date.getElementOption(id, 'dateFormat'), new Date()),
            prerender: true,
            position: {
                corner: {
                    target: 'topMiddle',
                    tooltip: 'bottomMiddle'
                }
            },
            show: {when:false},
            hide: {when:false},
            style: {
                name : 'red',
                tip  : true,
                width: 320
            }
        });
        $(element).keyup(Qs_Form_Element_Date.onKeyUp);
        $(element).change(Qs_Form_Element_Date.onChange);
    },

    getElementOptions: function (id)
    {
        return $('#_' + id).datepicker('option');
    },

    getElementOption: function (id, name)
    {
        return $('#_' + id).datepicker('option', name);
    },

    setElementOption: function (id, name, value)
    {
        $('#_' + id).datepicker('option', name, value);
    },

    setElementOptions: function (id, options)
    {
        for (var option in options) {
            Qs_Form_Element_Date.setOption(id, option, options[option]);
        }
    },

    callMethod: function (id, method, value)
    {
        return $('#_' + id).datepicker(method, value);
    },

    onKeyUp: function ()
    {
        Qs_Form_Element_Date.textChanged(this);
    },

    onChange: function ()
    {
        Qs_Form_Element_Date.textChanged(this);
    },

    textChanged: function (element)
    {
        clearTimeout(Qs_Form_Element_Date.timeoutHandle);
        Qs_Form_Element_Date.timeoutHandle = setTimeout(
            function(){Qs_Form_Element_Date.dateChanged(element);},
            Qs_Form_Element_Date.eventTimeout
        );
    },

    dateChanged: function (element)
    {
        Qs_Form_Element_Date.normalizeDate(element);
        var id = $(element).attr('id').substring(1);
        var value = $('#_' + id).val();
        try {
            if (Qs_Form_Element_Date.isValidDate(value)) {
                $(element).removeClass('error');
                var formatted = $.datepicker.parseDate(Qs_Form_Element_Date.getElementOption(id, 'dateFormat'), value);
                Qs_Form_Element_Date.callMethod(id, 'setDate', formatted);
                Qs_Form_Element_Date.hideTip(element);
            } else {
                if (value != '') {
                    $(element).addClass('error');
                    Qs_Form_Element_Date.showTip(element);
                }
                $('#' + id).val(value);
            }
        } catch (e) {
            $('#' + id).val(value);
        }
    },
    
    showTip: function (element)
    {
        $(element).qtip('show');
    },
    
    hideTip: function (element)
    {
        $(element).qtip('hide');
    },
    
    normalizeDate: function (element)
    {
        var id = $(element).attr('id').substring(1);
        var format = Qs_Form_Element_Date.getElementOption(id, 'dateFormat').replace(/y/g, 'yy');
        var delimiters = format.replace(/[mdy]/gi, '');
        var delimiter = delimiters.charAt(0);
        for (var i = 0; i < element.value.length; i++) {
            if (format.charAt(i) == delimiter && element.value.charAt(i) != delimiter) {
                element.value = element.value.substring(0, i) + delimiter + element.value.substring(i);
            }
        }
        if (element.value.length > format.length) {
            element.value = element.value.substring(0, format.length);
        }
    },
    
    isValidDate: function (txtDate)
    {
        var objDate;
        var mSeconds;
        if (txtDate.length != 10)  {
            return false;
        }
        var day   = txtDate.substring(3,5)  - 0;
        var month = txtDate.substring(0,2)  - 1;
        var year  = txtDate.substring(6,10) - 0;
        if (txtDate.substring(2,3) != '/' || txtDate.substring(5,6) != '/' || year < 999 || year > 3000) {
            return false;
        }
        mSeconds = (new Date(year, month, day)).getTime();
        objDate = new Date();
        objDate.setTime(mSeconds);
        if (objDate.getFullYear() != year)  return false;
        if (objDate.getMonth()    != month) return false;
        if (objDate.getDate()     != day)   return false;
        return true;
    },
    
    onChangeMonthYear: function (year, month, inst)
    {
        var date = new Date(year, month - 1,  inst.currentDay);
        var id = inst.input.attr('id');
        $('#' + id).datepicker('setDate', date);
    }
    
}


