mirror of
https://github.com/medialab-prado/poblados-colonizacion-colonias-penitenciarias.git
synced 2024-12-27 04:51:22 +01:00
198 lines
6.8 KiB
JavaScript
198 lines
6.8 KiB
JavaScript
/*
|
|
* L.TimeDimension.Util
|
|
*/
|
|
|
|
L.TimeDimension.Util = {
|
|
getTimeDuration: function(ISODuration) {
|
|
if (nezasa === undefined) {
|
|
throw "iso8601-js-period library is required for Leatlet.TimeDimension: https://github.com/nezasa/iso8601-js-period";
|
|
}
|
|
return nezasa.iso8601.Period.parse(ISODuration, true);
|
|
},
|
|
|
|
addTimeDuration: function(date, duration, utc) {
|
|
if (utc === undefined) {
|
|
utc = true;
|
|
}
|
|
if (typeof duration == 'string' || duration instanceof String) {
|
|
duration = this.getTimeDuration(duration);
|
|
}
|
|
var l = duration.length;
|
|
var get = utc ? "getUTC" : "get";
|
|
var set = utc ? "setUTC" : "set";
|
|
|
|
if (l > 0 && duration[0] != 0) {
|
|
date[set + "FullYear"](date[get + "FullYear"]() + duration[0]);
|
|
}
|
|
if (l > 1 && duration[1] != 0) {
|
|
date[set + "Month"](date[get + "Month"]() + duration[1]);
|
|
}
|
|
if (l > 2 && duration[2] != 0) {
|
|
// weeks
|
|
date[set + "Date"](date[get + "Date"]() + (duration[2] * 7));
|
|
}
|
|
if (l > 3 && duration[3] != 0) {
|
|
date[set + "Date"](date[get + "Date"]() + duration[3]);
|
|
}
|
|
if (l > 4 && duration[4] != 0) {
|
|
date[set + "Hours"](date[get + "Hours"]() + duration[4]);
|
|
}
|
|
if (l > 5 && duration[5] != 0) {
|
|
date[set + "Minutes"](date[get + "Minutes"]() + duration[5]);
|
|
}
|
|
if (l > 6 && duration[6] != 0) {
|
|
date[set + "Seconds"](date[get + "Seconds"]() + duration[6]);
|
|
}
|
|
},
|
|
|
|
subtractTimeDuration: function(date, duration, utc) {
|
|
if (typeof duration == 'string' || duration instanceof String) {
|
|
duration = this.getTimeDuration(duration);
|
|
}
|
|
var subDuration = [];
|
|
for (var i = 0, l = duration.length; i < l; i++) {
|
|
subDuration.push(-duration[i]);
|
|
}
|
|
this.addTimeDuration(date, subDuration, utc);
|
|
},
|
|
|
|
parseAndExplodeTimeRange: function(timeRange) {
|
|
var tr = timeRange.split('/');
|
|
var startTime = new Date(Date.parse(tr[0]));
|
|
var endTime = new Date(Date.parse(tr[1]));
|
|
var duration = tr.length > 2 ? tr[2] : "P1D";
|
|
|
|
return this.explodeTimeRange(startTime, endTime, duration);
|
|
},
|
|
|
|
explodeTimeRange: function(startTime, endTime, ISODuration, validTimeRange) {
|
|
var duration = this.getTimeDuration(ISODuration);
|
|
var result = [];
|
|
var currentTime = new Date(startTime.getTime());
|
|
var minHour = null,
|
|
minMinutes = null,
|
|
maxHour = null,
|
|
maxMinutes = null;
|
|
if (validTimeRange !== undefined) {
|
|
var validTimeRangeArray = validTimeRange.split('/');
|
|
minHour = validTimeRangeArray[0].split(':')[0];
|
|
minMinutes = validTimeRangeArray[0].split(':')[1];
|
|
maxHour = validTimeRangeArray[1].split(':')[0];
|
|
maxMinutes = validTimeRangeArray[1].split(':')[1];
|
|
}
|
|
while (currentTime < endTime) {
|
|
if (validTimeRange === undefined ||
|
|
(currentTime.getUTCHours() >= minHour && currentTime.getUTCHours() <= maxHour)
|
|
) {
|
|
if ((currentTime.getUTCHours() != minHour || currentTime.getUTCMinutes() >= minMinutes) &&
|
|
(currentTime.getUTCHours() != maxHour || currentTime.getUTCMinutes() <= maxMinutes)) {
|
|
result.push(currentTime.getTime());
|
|
}
|
|
}
|
|
this.addTimeDuration(currentTime, duration);
|
|
}
|
|
if (currentTime >= endTime){
|
|
result.push(endTime.getTime());
|
|
}
|
|
return result;
|
|
},
|
|
|
|
parseTimeInterval: function(timeInterval) {
|
|
var parts = timeInterval.split("/");
|
|
if (parts.length != 2) {
|
|
throw "Incorrect ISO9601 TimeInterval: " + timeInterval;
|
|
}
|
|
var startTime = Date.parse(parts[0]);
|
|
var endTime = null;
|
|
var duration = null;
|
|
if (isNaN(startTime)) {
|
|
// -> format duration/endTime
|
|
duration = this.getTimeDuration(parts[0]);
|
|
endTime = Date.parse(parts[1]);
|
|
startTime = new Date(endTime);
|
|
this.subtractTimeDuration(startTime, duration, true);
|
|
endTime = new Date(endTime);
|
|
} else {
|
|
endTime = Date.parse(parts[1]);
|
|
if (isNaN(endTime)) {
|
|
// -> format startTime/duration
|
|
duration = this.getTimeDuration(parts[1]);
|
|
endTime = new Date(startTime);
|
|
this.addTimeDuration(endTime, duration, true);
|
|
} else {
|
|
// -> format startTime/endTime
|
|
endTime = new Date(endTime);
|
|
}
|
|
startTime = new Date(startTime);
|
|
}
|
|
return [startTime, endTime];
|
|
},
|
|
|
|
parseTimesExpression: function(times) {
|
|
var result = [];
|
|
if (!times) {
|
|
return result;
|
|
}
|
|
if (typeof times == 'string' || times instanceof String) {
|
|
var timeRanges = times.split(",");
|
|
var timeRange;
|
|
var timeValue;
|
|
for (var i=0, l=timeRanges.length; i<l; i++){
|
|
timeRange = timeRanges[i];
|
|
if (timeRange.split("/").length == 3) {
|
|
result = result.concat(this.parseAndExplodeTimeRange(timeRange));
|
|
} else {
|
|
timeValue = Date.parse(timeRange);
|
|
if (!isNaN(timeValue)) {
|
|
result.push(timeValue);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
result = times;
|
|
}
|
|
return result.sort(function(a, b) {
|
|
return a - b;
|
|
});
|
|
},
|
|
|
|
intersect_arrays: function(arrayA, arrayB) {
|
|
var a = arrayA.slice(0);
|
|
var b = arrayB.slice(0);
|
|
var result = [];
|
|
while (a.length > 0 && b.length > 0) {
|
|
if (a[0] < b[0]) {
|
|
a.shift();
|
|
} else if (a[0] > b[0]) {
|
|
b.shift();
|
|
} else /* they're equal */ {
|
|
result.push(a.shift());
|
|
b.shift();
|
|
}
|
|
}
|
|
return result;
|
|
},
|
|
|
|
union_arrays: function(arrayA, arrayB) {
|
|
var a = arrayA.slice(0);
|
|
var b = arrayB.slice(0);
|
|
var result = [];
|
|
while (a.length > 0 && b.length > 0) {
|
|
if (a[0] < b[0]) {
|
|
result.push(a.shift());
|
|
} else if (a[0] > b[0]) {
|
|
result.push(b.shift());
|
|
} else /* they're equal */ {
|
|
result.push(a.shift());
|
|
b.shift();
|
|
}
|
|
}
|
|
if (a.length > 0) {
|
|
result = result.concat(a);
|
|
} else if (b.length > 0) {
|
|
result = result.concat(b);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
};
|