map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));
function showResults(idResults, evt) {
for (var i = 0, il = idResults.length; i < il; i++) {
var graphic = idResults;
graphic.feature.setInfoTemplate(sustaintemplate);
}
map.infoWindow.setContent(updatePopup(graphic));
//map.graphics.clear();
//Set the infoWindow to open at the top right of the point at all times
map.infoWindow.setFixedAnchor(esri.dijit.InfoWindow.ANCHOR_UPPERRIGHT);
//Determine the upper right, and center, coordinates of the map
var maxPoint = new esri.geometry.Point(map.extent.xmax, map.extent.ymax)
var centerPoint = new esri.geometry.Point(map.extent.getCenter());
//Convert these to screen coordinates
var maxPointScreen = map.toScreen(maxPoint);
var centerPointScreen = map.toScreen(centerPoint);
//Subtract the size of the infoWindow, including a buffer.
//This will show whether the infoWindow would spill out of the current view.
var xDiff = Math.abs(maxPointScreen.x - evt.screenPoint.x) - 470;
var yDiff = Math.abs(maxPointScreen.y - evt.screenPoint.y) - 490;
//If required, recalculate a new centerpoint which accounts for the infoWindow
if (xDiff < 0) { centerPointScreen.x -= xDiff; }
if (yDiff < 0) { centerPointScreen.y += yDiff; }
//Pan the map to the new centerpoint (in Map coordinates)
centerPoint = map.toMap(centerPointScreen);
map.centerAt(centerPoint);
//Display the infoWindow at the original point clicked
map.infoWindow.show(evt.screenPoint, esri.dijit.InfoWindow.ANCHOR_UPPERRIGHT);
}Thanks Alex, that actually saved me a lot of time. I adapted it to a function which measures how close a DOMElement is to the map extent boundaries:
getElementDistanceFromExtent: function(element) {
if (!$ic.isNotNullObject(element)) return false;
var posElementInfo = dojoDomGeometry.position(element);
var maxPoint = new Point(this.map.extent.xmax, this.map.extent.ymax);
var minPoint = new Point(this.map.extent.xmin, this.map.extent.ymin);
var centerPoint = new Point(this.map.extent.getCenter());
var maxPointScreen = screenUtils.toScreenGeometry(this.map.extent, this.map.width, this.map.height, maxPoint);
var minPointScreen = screenUtils.toScreenGeometry(this.map.extent, this.map.width, this.map.height, minPoint);
var distXmax = maxPointScreen.x - (posElementInfo.x + posElementInfo.w);
var distXmin = posElementInfo.x - minPointScreen.x;
var distYmax = minPointScreen.y - (posElementInfo.y + posElementInfo.h);
var distYmin = posElementInfo.y - maxPointScreen.y;
return { distXmax: distXmax, distXmin: distXmin, distYmax: distYmax, distYmin: distYmin };
}