in webui/js/ponymail.js [1433:1559]
function datePickerDouble(seedPeriod) {
// This basically takes a date-arg and doubles it backwards
// so >=3M becomes =>6M etc. Also returns the cutoff for
// the original date and the span in days of the original
let dbl = seedPeriod
let tspan = 1
let dfrom = new Date()
let dto = new Date()
// datepicker range?
if (seedPeriod && seedPeriod.search && seedPeriod.search(/=/) != -1) {
// Less than N units ago?
if (seedPeriod.match(/lte/)) {
let m = seedPeriod.match(/lte=(\d+)([dMyw])/)
dbl = "lte=" + (parseInt(m[1]) * 2) + m[2]
// N months ago
if (m[2] == "M") {
dfrom.setMonth(dfrom.getMonth() - parseInt(m[1]), dfrom.getDate())
}
// N days ago
if (m[2] == "d") {
dfrom.setDate(dfrom.getDate() - parseInt(m[1]))
}
// N years ago
if (m[2] == "y") {
dfrom.setYear(dfrom.getFullYear() - parseInt(m[1]))
}
// N weeks ago
if (m[2] == "w") {
dfrom.setDate(dfrom.getDate() - (parseInt(m[1]) * 7))
}
// Calc total duration in days for this time span
tspan = parseInt((dto.getTime() - dfrom.getTime() + 5000) / (1000 * 86400))
}
// More than N units ago?
if (seedPeriod.match(/gte/)) {
let m = seedPeriod.match(/gte=(\d+)([dMyw])/)
dbl = "gte=" + (parseInt(m[1]) * 2) + m[2]
// Can't really figure out a timespan for this, so...null!
// This also sort of invalidates use on the trend page, but meh..
tspan = null
dfrom = null
// Months
if (m[2] == "M") {
dto.setMonth(dto.getMonth() - parseInt(m[1]), dto.getDate())
}
// Days
if (m[2] == "d") {
dto.setDate(dto.getDate() - parseInt(m[1]))
}
// Years
if (m[2] == "y") {
dto.setYear(dto.getFullYear() - parseInt(m[1]))
}
// Weeks
if (m[2] == "w") {
dto.setDate(dto.getDate() - (parseInt(m[1]) * 7))
}
}
// Date range?
if (seedPeriod.match(/dfr/)) {
// Find from and to
let mf = seedPeriod.match(/dfr=(\d+)-(\d+)-(\d+)/)
let mt = seedPeriod.match(/dto=(\d+)-(\d+)-(\d+)/)
if (mf && mt) {
// Starts at 00:00:00 on from date
dfrom = new Date(parseInt(mf[1]), parseInt(mf[2]) - 1, parseInt(mf[3]), 0, 0, 0)
// Ends at 23:59:59 on to date
dto = new Date(parseInt(mt[1]), parseInt(mt[2]) - 1, parseInt(mt[3]), 23, 59, 59)
// Get duration in days, add 5 seconds to we can floor the value and get an integer
tspan = parseInt((dto.getTime() - dfrom.getTime() + 5000) / (1000 * 86400))
// double the distance
let dpast = new Date(dfrom)
dpast.setDate(dpast.getDate() - tspan)
dbl = seedPeriod.replace(/dfr=[^|]+/, "dfr=" + (dpast.getFullYear()) + '-' + (dpast.getMonth() + 1) + '-' + dpast.getDate())
} else {
tspan = 0
}
}
}
// just N days?
else if (parseInt(seedPeriod).toString() == seedPeriod.toString()) {
tspan = parseInt(seedPeriod)
dfrom.setDate(dfrom.getDate() - tspan)
dbl = "lte=" + (tspan * 2) + "d"
}
// Specific month?
else if (seedPeriod.match(/^(\d+)-(\d+)$/)) {
// just a made up thing...(month range)
let mr = seedPeriod.match(/(\d+)-(\d+)/)
if (mr) {
// Same as before, start at 00:00:00
dfrom = new Date(parseInt(mr[1]), parseInt(mr[2]) - 1, 1, 0, 0, 0)
// end at 23:59:59
dto = new Date(parseInt(mr[1]), parseInt(mr[2]), 0, 23, 59, 59)
// B-A, add 5 seconds so we can floor the no. of days into an integer neatly
tspan = parseInt((dto.getTime() - dfrom.getTime() + 5000) / (1000 * 86400))
// Double timespan
let dpast = new Date(dfrom)
dpast.setDate(dpast.getDate() - tspan)
dbl = "dfr=" + (dpast.getFullYear()) + '-' + (dpast.getMonth() + 1) + '-' + dpast.getDate() + "|dto=" + (dto.getFullYear()) + '-' + (dto.getMonth() + 1) + '-' + dto.getDate()
} else {
tspan = 0
}
}
return [dbl, dfrom, dto, tspan]
}