using System;
using System.Collections.ObjectModel;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web.UI;
using System.Web.UI.WebControls;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WebEdition;

public partial class Sample : System.Web.UI.Page, ICallbackEventHandler
{
    private string columnValue = string.Empty;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;
            Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);
            Map1.OnClientClick = "mapClientClick";

            WorldMapKitLayer worldLayer = new WorldMapKitLayer();
            ShapeFileFeatureLayer shapeLayer = new ShapeFileFeatureLayer(Server.MapPath(@"/Data/FriscoHotels.shp"));
            shapeLayer.Open();
            shapeLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.StandardColors.Red, 12,GeoColor.StandardColors.Black,1);
            shapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            shapeLayer.DrawingFeatures += new EventHandler(shapeLayer_DrawingFeatures);

            Map1.StaticOverlay.Layers.Add("WorldMapLayer", worldLayer);
            Map1.DynamicOverlay.Layers.Add("ShapeLayer", shapeLayer);
            Map1.CurrentExtent = shapeLayer.GetBoundingBox();

            DataTable data = GetDataTable(shapeLayer);
            GridView1.DataSource = data;
            GridView1.DataBind();

            InMemoryFeatureLayer highLightLayer = new InMemoryFeatureLayer();
            highLightLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.FromHtml("#2E9AFE"), 13, GeoColor.StandardColors.Black, 2);
            highLightLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            Map1.DynamicOverlay.Layers.Add("HighLightLayer", highLightLayer);
            Map1.DynamicOverlay.TransitionEffect = TransitionEffect.Stretching;
        }
    }

    void shapeLayer_DrawingFeatures(object sender, DrawingFeaturesEventArgs e)
    {
        InMemoryFeatureLayer highLightLayer = (InMemoryFeatureLayer)Map1.DynamicOverlay.Layers["HighLightLayer"];

        if (highLightLayer.InternalFeatures.Count > 0)
        {
            Feature feature = highLightLayer.InternalFeatures[0];
            var featuresToRemove = e.FeaturesToDraw.Where(f => f.Id == feature.Id);
            if (featuresToRemove.Count() > 0)
            {
                e.FeaturesToDraw.Remove(featuresToRemove.ElementAt(0));
            }
        }
    }

    public string GetCallbackResult()
    {
        return columnValue;
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        Collection features = new Collection();
        ShapeFileFeatureLayer shapeLayer = (ShapeFileFeatureLayer)Map1.DynamicOverlay.Layers["ShapeLayer"];
        shapeLayer.Open();
        string columnName = shapeLayer.FeatureSource.GetColumns()[0].ColumnName;
        if (eventArgument.StartsWith("^"))
        {
            string[] lonLat = eventArgument.TrimStart('^').Split(',');

            float lon = 0;
            float lat = 0;
            if (float.TryParse(lonLat[0], NumberStyles.Number, CultureInfo.InvariantCulture, out lon)
                && float.TryParse(lonLat[1], NumberStyles.Number, CultureInfo.InvariantCulture, out lat))
            {
                PointShape point = new PointShape(lon, lat);
                features = shapeLayer.QueryTools.GetFeaturesNearestTo(point, GeographyUnit.DecimalDegree, 1, new string[] { columnName }, 1, DistanceUnit.Kilometer);
            }
        }
        else
        {
            features = shapeLayer.QueryTools.GetFeaturesByColumnValue(columnName, eventArgument);
        }

        InMemoryFeatureLayer highLightLayer = (InMemoryFeatureLayer)Map1.DynamicOverlay.Layers["HighLightLayer"];
        highLightLayer.InternalFeatures.Clear();
        if (features.Count > 0)
        {
            highLightLayer.InternalFeatures.Add(features[0].Id, features[0]);
            columnValue = features[0].ColumnValues[columnName];
        }
    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        e.Row.Attributes.Add("onclick", "callServer('" + Server.HtmlDecode(e.Row.Cells[0].Text) + "')");
    }

    private static DataTable GetDataTable(ShapeFileFeatureLayer shapeLayer)
    {
        DataTable data = new DataTable();
        Collection columns = shapeLayer.FeatureSource.GetColumns();
        foreach (var item in columns)
        {
            data.Columns.Add(item.ColumnName);
        }

        Collection features = shapeLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
        foreach (var item in features)
        {
            DataRow row = data.NewRow();
            foreach (var keyValuePaire in item.ColumnValues)
            {
                row[keyValuePaire.Key] = keyValuePaire.Value;
            }
            data.Rows.Add(row);
        }
        return data;
    }
}