Common MapTips
Common_MapTips_CSharp\JavaScript\CoincidentFeatureFunctions.js
 Copyright 2010 ESRI
 
 All rights reserved under the copyright laws of the United States
 and applicable international laws, treaties, and conventions.
 
 You may freely redistribute and use this sample code, with or
 without modification, provided you include the original copyright
 notice and use restrictions.
 
 See <a href="http://help.arcgis.com/en/sdk/10.0/usageRestrictions.htm">the use restrictions</a>.
 

ESRI.ADF.Graphics.GraphicFeatureGroup.prototype.add_coincidentFeaturesMouseOver = function(handler) {
    this.get_events().addHandler('coincidentFeaturesMouseOver', handler);
    if (!this._coincidentFeatureMouseOverEnabled)
    {
        for (var i = 0; i < this.getFeatureCount(); i++)
        {
            this.get(i).add_mouseOver(this._raiseCoincidentFeaturesEvent);
            this.get(i)._parentGroupID = this.get_id();
        }
        this._coincidentFeatureMouseOverEnabled = true;
    }
}
ESRI.ADF.Graphics.GraphicFeatureGroup.prototype.remove_coincidentFeaturesMouseOver = function(handler) {
    this.get_events().removeHandler('coincidentFeaturesMouseOver', handler);
    if (this._coincidentFeatureMouseOverEnabled)
    {
        for (var i = 0; i < this.getFeatureCount(); i++)
        {
            this.get(i).remove_mouseOver(this._raiseCoincidentFeaturesEvent);
        }
        this._coincidentFeatureMouseOverEnabled = false;
    }
}
ESRI.ADF.Graphics.GraphicFeatureGroup.prototype._raiseCoincidentFeaturesEvent = function(sender) {
    if (!sender._parentGroupID)
        return;
    
    if (!ESRI.ADF.Geometries.Point.isInstanceOfType(sender.get_geometry()))
        return;
        
    var graphicFeatureGroup = $find(sender._parentGroupID);
    var coincidentFeatures = graphicFeatureGroup.findCoincidentFeatures(sender);

        var eventArgs = { 'coincidentFeatures':coincidentFeatures }
        graphicFeatureGroup._raiseEvent('coincidentFeaturesMouseOver', eventArgs);
}

// Gets graphicFeatures from the passed-in graphicFeatureGroup that have centers that intersect the 
// symbol envelope of the passed-in graphicFeature
ESRI.ADF.Graphics.GraphicFeatureGroup.prototype.findCoincidentFeatures = function (graphicFeature) {
    var coincidentFeatures = new Array();

    // Get the envelope of the graphic feature's symbol
    var graphicFeatureEnvelope = graphicFeature.getScreenEnvelope(true);
    if (!graphicFeatureEnvelope)
        return;                
    
    // Find the graphic features in the current graphicFeatureGroup that have centers within the
    // symbol envelope of the moused over feature
    for (var i = 0; i < this.getFeatureCount(); i++)
    {
        var targetGraphicFeature = this.get(i);
        
        // Get the envelope of the center of the loop feature    
        var targetGraphicEnvelope = targetGraphicFeature.getScreenEnvelope(false);                   
        
        // If the symbol envelope of the passed-in feature and the center envelope of the loop
        // feature intersect, add the loop feature to the array of coincident features
        if (graphicFeatureEnvelope.intersects(targetGraphicEnvelope))
        {
            if (targetGraphicFeature.get_id() == graphicFeature.get_id())
                coincidentFeatures.splice(0, 0, targetGraphicFeature);
            else
                coincidentFeatures.push(targetGraphicFeature);
        }
    }
    
    return coincidentFeatures;
}

// Retrieves an envelope of either the graphicFeature's symbol or its center.  
// The bounds of the envelope are in screen pixels.
ESRI.ADF.Graphics.GraphicFeature.prototype.getScreenEnvelope = function(getSymbolEnvelope)
{
    var xMin;
    var xMax;
    var yMin;
    var yMax;
    
    // Check whether the passed-in graphicFeature has a symbol defined.  If so, use it to determine the
    // envelope.  If not, use the graphicFeature's HTML DOM element.
    var symbol = this.get_symbol();
    if (symbol)
    {
        // use the graphic feature's ADF MarkerSymbol
        var symbolWidth = symbol.get_width();
        var symbolHeight = symbol.get_height();
        if (getSymbolEnvelope)
        {
            // Get the bounds for the graphic feature's symbol
            xMin = symbol.offsetX;
            xMax = symbol.offsetX + symbolWidth;
            yMin = symbol.offsetY;
            yMax = symbol.offsetY + symbolHeight;
        }
        else
        {
            // Get the graphic feature's center point
            xMin = symbol.offsetX + (symbolWidth / 2);
            xMax = symbol.offsetX + (symbolWidth / 2);
            yMin = symbol.offsetX + (symbolHeight / 2);
            yMax = symbol.offsetX + (symbolHeight / 2);
        }
    }
    else
    {
        // use the graphic feature's HTML DOM element
        var graphicElement = this.get_graphicReference();
        if (!graphicElement)
            return;
                                  
        var graphicElementWidth = graphicElement.offsetWidth;
        var graphicElementHeight = graphicElement.offsetHeight;
        
        if (getSymbolEnvelope)
        {
            // Get the bounds for the graphic feature's symbol
            xMin = graphicElement.offsetLeft;
            xMax = graphicElement.offsetLeft + graphicElementWidth;
            yMin = graphicElement.offsetTop;
            yMax = graphicElement.offsetTop + graphicElementHeight;
        }
        else
        {
            // Get the graphic feature's center point
            xMin = graphicElement.offsetLeft + (graphicElementWidth / 2);
            xMax = graphicElement.offsetLeft + (graphicElementWidth / 2);
            yMin = graphicElement.offsetTop + (graphicElementHeight / 2);
            yMax = graphicElement.offsetTop + (graphicElementHeight / 2);
        }
    }

    // Return an envelope with the calculated bounds
    return new ESRI.ADF.Geometries.Envelope(xMin, yMin, xMax, yMax);
}