| 130 | } |
| 131 | |
| 132 | function getInterval(d, y) { |
| 133 | var b = d.brush; |
| 134 | var active = b.filterSpecified; |
| 135 | var closestInterval = NaN; |
| 136 | var out = {}; |
| 137 | var i; |
| 138 | |
| 139 | if(active) { |
| 140 | var height = d.height; |
| 141 | var intervals = b.filter.getConsolidated(); |
| 142 | var pixIntervals = unitToPx(intervals, height); |
| 143 | var hoveredInterval = NaN; |
| 144 | var previousInterval = NaN; |
| 145 | var nextInterval = NaN; |
| 146 | for(i = 0; i <= pixIntervals.length; i++) { |
| 147 | var p = pixIntervals[i]; |
| 148 | if(p && p[0] <= y && y <= p[1]) { |
| 149 | // over a bar |
| 150 | hoveredInterval = i; |
| 151 | break; |
| 152 | } else { |
| 153 | // between bars, or before/after the first/last bar |
| 154 | previousInterval = i ? i - 1 : NaN; |
| 155 | if(p && p[0] > y) { |
| 156 | nextInterval = i; |
| 157 | break; // no point continuing as intervals are non-overlapping and sorted; could use log search |
| 158 | } |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | closestInterval = hoveredInterval; |
| 163 | if(isNaN(closestInterval)) { |
| 164 | if(isNaN(previousInterval) || isNaN(nextInterval)) { |
| 165 | closestInterval = isNaN(previousInterval) ? nextInterval : previousInterval; |
| 166 | } else { |
| 167 | closestInterval = (y - pixIntervals[previousInterval][1] < pixIntervals[nextInterval][0] - y) ? |
| 168 | previousInterval : nextInterval; |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | if(!isNaN(closestInterval)) { |
| 173 | var fPix = pixIntervals[closestInterval]; |
| 174 | var region = getRegion(fPix, y); |
| 175 | |
| 176 | if(region) { |
| 177 | out.interval = intervals[closestInterval]; |
| 178 | out.intervalPix = fPix; |
| 179 | out.region = region; |
| 180 | } |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | if(d.ordinal && !out.region) { |
| 185 | var a = d.unitTickvals; |
| 186 | var unitLocation = d.unitToPaddedPx.invert(y); |
| 187 | for(i = 0; i < a.length; i++) { |
| 188 | var rangei = [ |
| 189 | a[Math.max(i - 1, 0)] * 0.25 + a[i] * 0.75, |