import { makeGetSet } from '../moment/get-set'; import { addFormatToken } from '../format/format'; import { addUnitAlias } from './aliases'; import { addUnitPriority } from './priorities'; import { addRegexToken, match1to2, match2, match3to4, match5to6 } from '../parse/regex'; import { addParseToken } from '../parse/token'; import { HOUR, MINUTE, SECOND } from './constants'; import toInt from '../utils/to-int'; import zeroFill from '../utils/zero-fill'; import getParsingFlags from '../create/parsing-flags';

// FORMATTING

function hFormat() {

return this.hours() % 12 || 12;

}

function kFormat() {

return this.hours() || 24;

}

addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat);

addFormatToken('hmm', 0, 0, function () {

return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);

});

addFormatToken('hmmss', 0, 0, function () {

return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
    zeroFill(this.seconds(), 2);

});

addFormatToken('Hmm', 0, 0, function () {

return '' + this.hours() + zeroFill(this.minutes(), 2);

});

addFormatToken('Hmmss', 0, 0, function () {

return '' + this.hours() + zeroFill(this.minutes(), 2) +
    zeroFill(this.seconds(), 2);

});

function meridiem (token, lowercase) {

addFormatToken(token, 0, 0, function () {
    return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
});

}

meridiem('a', true); meridiem('A', false);

// ALIASES

addUnitAlias('hour', 'h');

// PRIORITY addUnitPriority('hour', 13);

// PARSING

function matchMeridiem (isStrict, locale) {

return locale._meridiemParse;

}

addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('k', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('kk', match1to2, match2);

addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6);

addParseToken(['H', 'HH'], HOUR); addParseToken(['k', 'kk'], function (input, array, config) {

var kInput = toInt(input);
array[HOUR] = kInput === 24 ? 0 : kInput;

}); addParseToken(['a', 'A'], function (input, array, config) {

config._isPm = config._locale.isPM(input);
config._meridiem = input;

}); addParseToken(['h', 'hh'], function (input, array, config) {

array[HOUR] = toInt(input);
getParsingFlags(config).bigHour = true;

}); addParseToken('hmm', function (input, array, config) {

var pos = input.length - 2;
array[HOUR] = toInt(input.substr(0, pos));
array[MINUTE] = toInt(input.substr(pos));
getParsingFlags(config).bigHour = true;

}); addParseToken('hmmss', function (input, array, config) {

var pos1 = input.length - 4;
var pos2 = input.length - 2;
array[HOUR] = toInt(input.substr(0, pos1));
array[MINUTE] = toInt(input.substr(pos1, 2));
array[SECOND] = toInt(input.substr(pos2));
getParsingFlags(config).bigHour = true;

}); addParseToken('Hmm', function (input, array, config) {

var pos = input.length - 2;
array[HOUR] = toInt(input.substr(0, pos));
array[MINUTE] = toInt(input.substr(pos));

}); addParseToken('Hmmss', function (input, array, config) {

var pos1 = input.length - 4;
var pos2 = input.length - 2;
array[HOUR] = toInt(input.substr(0, pos1));
array[MINUTE] = toInt(input.substr(pos1, 2));
array[SECOND] = toInt(input.substr(pos2));

});

// LOCALES

export function localeIsPM (input) {

// IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
// Using charAt should be more compatible.
return ((input + '').toLowerCase().charAt(0) === 'p');

}

export var defaultLocaleMeridiemParse = /[ap].?m?.?/i; export function localeMeridiem (hours, minutes, isLower) {

if (hours > 11) {
    return isLower ? 'pm' : 'PM';
} else {
    return isLower ? 'am' : 'AM';
}

}

// MOMENTS

// Setting the hour should keep the time, because the user explicitly // specified which hour he wants. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. export var getSetHour = makeGetSet('Hours', true);