poblados-colonizacion-colon.../docs/colonizacion-leaflet/js/leaflet.timedimension.util.js
2017-06-18 04:33:09 +02:00

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;
}
};