vis.js is a dynamic, browser-based visualization library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

159 lines
4.9 KiB

/**
* Created by Alex on 10/3/2014.
*/
var moment = require('../module/moment');
exports.convertHiddenOptions = function(timeline) {
var hiddenTimes = timeline.options.hide;
if (Array.isArray(hiddenTimes) == true) {
for (var i = 0; i < hiddenTimes.length; i++) {
var dateItem = {};
dateItem.start = moment(hiddenTimes[i].start).toDate().valueOf();
dateItem.end = moment(hiddenTimes[i].end).toDate().valueOf();
timeline.body.hiddenDates.push(dateItem);
}
timeline.body.hiddenDates.sort(function(a,b) {return a.start - b.start;}); // sort by start time
}
else {
timeline.body.hiddenDates = [{
start:moment(hiddenTimes.start).toDate().valueOf(),
end:moment(hiddenTimes.end).toDate().valueOf()
}
];
}
}
exports.stepOverHiddenDates = function(timeStep, previousTime) {
var stepInHidden = false;
var currentValue = timeStep.current.valueOf();
for (var i = 0; i < timeStep.hiddenDates.length; i++) {
var startDate = timeStep.hiddenDates[i].start;
var endDate = timeStep.hiddenDates[i].end;
if (currentValue >= startDate && currentValue < endDate) {
stepInHidden = true;
break;
}
}
if (stepInHidden == true && currentValue < timeStep._end.valueOf() && currentValue != previousTime) {
timeStep.current = moment(endDate).toDate();
}
}
exports.toScreen = function(timeline, time, width) {
var hidden = exports.isHidden(time, timeline.body.hiddenDates)
if (hidden.hidden == true) {
time = hidden.startDate;
}
var res = exports.correctTimeForDuration(timeline.body.hiddenDates, timeline.range, time);
var duration = res.duration;
time = res.time;
var conversion = timeline.range.conversion(width, duration);
return (time.valueOf() - conversion.offset) * conversion.scale;
}
exports.toTime = function(body, range, x, width) {
var duration = exports.getHiddenDuration(body.hiddenDates, range);
var conversion = range.conversion(width, duration);
var time = new Date(x / conversion.scale + conversion.offset);
//var hidden = exports.isHidden(time, timeline.body.hiddenDates)
//if (hidden.hidden == true) {
// time = hidden.startDate;
//}
//time = exports.correctTimeForDuration(body.hiddenDates, range, time).time;
return time;
}
exports.getHiddenDuration = function(hiddenTimes, range) {
var duration = 0;
for (var i = 0; i < hiddenTimes.length; i++) {
var startDate = hiddenTimes[i].start;
var endDate = hiddenTimes[i].end;
// if time after the cutout, and the
if (startDate >= range.start && endDate < range.end) {
duration += endDate - startDate;
}
}
return duration;
}
exports.correctTimeForDuration = function(hiddenTimes, range, time) {
var duration = 0;
var timeOffset = 0;
time = moment(time).toDate().valueOf()
for (var i = 0; i < hiddenTimes.length; i++) {
var startDate = hiddenTimes[i].start;
var endDate = hiddenTimes[i].end;
// if time after the cutout, and the
if (startDate >= range.start && endDate < range.end) {
duration += (endDate - startDate);
if (time >= endDate) {
timeOffset += (endDate - startDate);
}
}
}
time -= timeOffset;
return {duration: duration, time:time, offset: timeOffset};
}
exports.snapAwayFromHidden = function(hiddenTimes, range, start, end, delta, zoom) {
zoom = zoom || false;
var newStart = start;
var newEnd = end;
for (var i = 0; i < hiddenTimes.length; i++) {
var startDate = hiddenTimes[i].start;
var endDate = hiddenTimes[i].end;
if (start >= startDate && start < endDate) { // if the start is entering a hidden zone
range.deltaDifference += delta;
if (range.previousDelta - delta > 0 && zoom == false || zoom == true && range.previousDelta - delta < 0) { // from the left
console.log("start from left, snap to right")
newStart = endDate + 1;
}
else { // from the right
console.log("start from right, snap to left")
newStart = startDate - 1;
}
return {newStart: newStart, newEnd: newEnd};
}
else if (end >= startDate && end < endDate) { // if the start is entering a hidden zone
range.deltaDifference += delta;
if (range.previousDelta - delta < 0) { // from the right
console.log("end from right, snap to left")
newEnd = startDate - 1;
}
else { // from the left
console.log("end from left, snap to right")
newEnd = endDate + 1;
}
return {newStart: newStart, newEnd: newEnd};
}
}
return false;
}
exports.isHidden = function(time, hiddenTimes) {
var isHidden = false;
for (var i = 0; i < hiddenTimes.length; i++) {
var startDate = hiddenTimes[i].start;
var endDate = hiddenTimes[i].end;
if (time >= startDate && time < endDate) { // if the start is entering a hidden zone
isHidden = true;
break;
}
}
return {hidden: isHidden, startDate: startDate, endDate: endDate};
}