/**
 * @private
 */
Ext.define('Ext.calendar.form.TimeField', {
    extend: 'Ext.field.Select',
    xtype: 'calendar-timefield',
 
    config: {
        increment: 15,
        format: 'g:i A',
        minValue: null,
        maxValue: null
    },
 
    initialize: function() {
        this.callParent();
        this.refreshOptions();
    },
 
    updateMinValue: function() {
        if (!this.isConfiguring) {
            this.refreshOptions();
        }
    },
 
    updateMaxValue: function() {
        if (!this.isConfiguring) {
            this.refreshOptions();
        }
    },
 
    applyValue: function(value) {
        var record = null,
            h, m, range, len, i, item, d;
 
        if (value) {
            if (value.isModel) {
                value = value.data.value;
            }
 
            h = value.getHours();
            m = value.getMinutes();
 
            range = this.getStore().getRange();
 
            for (= 0, len = range.length; i < len; ++i) {
                item = range[i];
                d = item.data.value;
                
                if (=== d.getHours() && m === d.getMinutes()) {
                    record = item;
                    
                    break;
                }
            }
        }
        
        return record;
    },
 
    updateValue: function(value) {
        if (value && value.isModel) {
            this.setSelection(value);
            this.setInputValue(value.data.text);
        }
    },
 
    getValue: function() {
        var value = this.callParent();
        
        if (value && value.isModel) {
            value = value.data.value;
        }
        
        return value;
    },
 
    privates: {
        initDate: new Date(2008, 0, 1),
 
        refreshOptions: function() {
            var me = this,
                D = Ext.Date,
                min = me.getMinValue(),
                max = me.getMaxValue(),
                increment = me.getIncrement(),
                format = me.getFormat(),
                current = D.clone(this.initDate),
                options = [],
                end;
 
            if (max) {
                end = D.clone(current);
                end.setHours(max.getHours());
                end.setMinutes(max.getMinutes());
            }
            else {
                end = D.add(current, D.DAY, 1);
            }
 
            if (min) {
                current.setHours(min.getHours());
                current.setMinutes(min.getMinutes());
            }
 
            while (current < end) {
                options.push({
                    value: current,
                    text: D.format(current, format)
                });
                current = D.add(current, D.MINUTE, increment, true);
            }
            
            me.setOptions(options);
        }
    }
});