moveRuler = function() {
const mouse_x = x.invert(+d3.event.x);
let mouse_y = 0.5;
if(typeof(this)!='undefined'){
mouse_y = y.invert(d3.mouse(this)[1]);
};
const Y = serieY;
const X = serieX;
const path = d3.select('path.line');
const pathEl = path.node();
const pathLength = pathEl.getTotalLength();
const ruler = d3.select('.ruler');
const ruler_ox = +ruler.attr('x1');
const vruler = d3.select('.vruler');
const hruler = d3.select('.hruler');
const marker = d3.select('.marker');
const xlabel = d3.select('.xlabel');
const xlabelbg = d3.select('.xlabel-bg');
const ylabel = d3.select('.ylabel');
const ylabelbg = d3.select('.ylabel-bg');
const check_x = (mouse_x >= serieXExtent[0]) && (mouse_x <= serieXExtent[1]);
const check_y = (mouse_y >= serieYExtent[0]) && (mouse_y <= serieYExtent[1]);
if (check_x && check_y){
try {
ruler.attr('x1', d3.mouse(this)[0]).attr('x2', d3.mouse(this)[0]);
} catch (err) {
console.log(err);
ruler.attr('x1', +d3.event.x).attr('x2', +d3.event.x);
}
const pts = path_line_intersections(pathEl, pathLength, ruler);
if (pts.length>0){
marker.attr('cx', pts[0].x).attr('cy', pts[0].y);
hruler.attr('y1', pts[0].y).attr('y2', pts[0].y);
vruler.attr('x1', pts[0].x).attr('x2', pts[0].x);
ruler.attr('x1', pts[0].x).attr('x2', pts[0].x);
} else {
ruler.attr('x1', ruler_ox).attr('x2', ruler_ox);
}
const x_text = d3.format(',.1%')(x.invert(marker.attr('cx')));
const y_text = d3.format(',.1%')(y.invert(marker.attr('cy')));
xlabel.attr('x', +marker.attr('cx')).text(x_text);
xlabelbg.attr('x', +marker.attr('cx')-labelsize[0]/2);
ylabel.attr('y', +marker.attr('cy')+labelsize[1]/5).text(y_text);
ylabelbg.attr('y', +marker.attr('cy')-labelsize[1]/2);
marker.style('opacity',1);
hruler.style('opacity',1);
vruler.style('opacity',1);
ruler.style('opacity',1);
xlabel.style('opacity',1);
xlabelbg.style('opacity',1);
ylabel.style('opacity',1);
ylabelbg.style('opacity',1);
} else {
marker.style('opacity',0);
hruler.style('opacity',0);
vruler.style('opacity',0);
ruler.style('opacity',0);
xlabel.style('opacity',0);
xlabelbg.style('opacity',0);
ylabel.style('opacity',0);
ylabelbg.style('opacity',0);
}
}