// vim: et:ts=4:sw=4:sts=4:ft=javascript

/*@
Ox.TimeInput <f:Ox.Element> TimeInput Object
    () ->              <f> TimeInput Object
    (options) ->       <f> TimeInput Object
    (options, self) -> <f> TimeInput Object
    options <o> Options object
        ampm <b|false> 24h/ampm
        seconds <b|false> show seconds
        milliseconds <b|false> show milliseconds
        value <d> value, defaults to current time
    self    <o> shared private variable
@*/

Ox.TimeInput = function(options, self) {

    // fixme: seconds get set even if options.seconds is false
    self = self || {};
    var that = Ox.Element({}, self)
            .defaults({
                ampm: false,
                seconds: false,
                milliseconds: false,
                value: Ox.formatDate(new Date(), '%T'),
                ///*
                width: {
                    hours: 32,
                    minutes: 32,
                    seconds: 32,
                    milliseconds: 40,
                    ampm: 32
                }
                //*/
            })
            .options(options || {});

    if (self.options.milliseconds) {
        self.options.seconds = true;
        if (self.options.value.indexOf('.') == -1) {
            self.options.value += '.000';
        }
    }

    self.date = getDate();
    self.values = getValues();

    self.$input = {
        hours: Ox.Input({
            autocomplete: (self.options.ampm ? Ox.range(1, 13) : Ox.range(0, 24)).map(function(i) {
                return Ox.pad(i, 2);
            }),
            autocompleteReplace: true,
            autocompleteReplaceCorrect: true,
            id: 'hours',
            textAlign: 'right',
            value: self.values.hours,
            width: self.options.width.hours
        }),
        minutes: Ox.Input({
            autocomplete: Ox.range(0, 60).map(function(i) {
                return Ox.pad(i, 2);
            }),
            autocompleteReplace: true,
            autocompleteReplaceCorrect: true,
            id: 'minutes',
            textAlign: 'right',
            value: self.values.minutes,
            width: self.options.width.minutes
        }),
        seconds: Ox.Input({
            autocomplete: Ox.range(0, 60).map(function(i) {
                return Ox.pad(i, 2);
            }),
            autocompleteReplace: true,
            autocompleteReplaceCorrect: true,
            id: 'seconds',
            textAlign: 'right',
            value: self.values.seconds,
            width: self.options.width.seconds
        }),
        milliseconds: Ox.Input({
            autocomplete: Ox.range(0, 1000).map(function(i) {
                return Ox.pad(i, 3);
            }),
            autocompleteReplace: true,
            autocompleteReplaceCorrect: true,
            id: 'milliseconds',
            textAlign: 'right',
            value: self.values.milliseconds,
            width: self.options.width.milliseconds
        }),
        ampm: Ox.Input({
            autocomplete: ['AM', 'PM'],
            autocompleteReplace: true,
            autocompleteReplaceCorrect: true,
            id: 'ampm',
            value: self.values.ampm,
            width: self.options.width.ampm
        })
    };

    that = Ox.InputGroup(Ox.extend(self.options, {
            inputs: Ox.merge([
                self.$input.hours,
                self.$input.minutes,
            ], self.options.seconds ? [
                self.$input.seconds
            ] : [], self.options.milliseconds ? [
                self.$input.milliseconds
            ] : [], self.options.ampm ? [
                self.$input.ampm
            ] : []),
            separators: Ox.merge([
                {title: ':', width: 8},
            ], self.options.seconds ? [
                {title: ':', width: 8}
            ] : [], self.options.milliseconds ? [
                {title: '.', width: 8}
            ] : [], self.options.ampm ? [
                {title: '', width: 8}
            ] : []),
            width: 0
            //width: self.options.width || 128
        }), self)
        .bindEvent('change', setValue);

    setValue();

    function getDate() {
        return new Date('1970/01/01 ' + (
            self.options.milliseconds ?
            self.options.value.substr(0, self.options.value.length - 4) :
            self.options.value
        ));
    }

    function getValues() {
        self.date = getDate();
        return {
            ampm: Ox.formatDate(self.date, '%p'),
            hours: Ox.formatDate(self.date, self.options.ampm ? '%I' : '%H'),
            milliseconds: self.options.milliseconds ? self.options.value.substr(-3) : '000',
            minutes: Ox.formatDate(self.date, '%M'),
            seconds: Ox.formatDate(self.date, '%S')
        };
    }

    function setValue() {
        self.options.value = Ox.formatDate(new Date('1970/01/01 ' + [
            self.$input.hours.options('value'),
            self.$input.minutes.options('value'),
            self.options.seconds ? self.$input.seconds.options('value') : '00'
        ].join(':') + (self.options.ampm ? ' ' + self.$input.ampm.options('value') : '')),
            (self.options.seconds? '%T' : '%H:%M')) +
            (self.options.milliseconds ? '.' + self.$input.milliseconds.options('value') : '');
        //Ox.Log('Form', 'SETVALUE', self.options.value);
    }

    function setValues() {
        self.values = getValues();
        Ox.forEach(self.$input, function(v, k) {
            self.$input[k].options({
                value: self.values[k]
            });
        });
    }

    self.setOption = function(key, value) {
        if (key == 'value') {
            setValues();
        }
    };

    return that;

};
