using System;
using System.Collections.ObjectModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Printing;
using System.Web.UI;
using PdfSharp;
using PdfSharp.Pdf;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WebEdition;
using System.Web.UI.WebControls;
using System.Text;

namespace CSSamples.Samples
{
    public partial class Sample : System.Web.UI.Page
    {
        #region add PrinterLayer Elements

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                SetupMapWithBlankPage();
                AddMapLayer();
                AddTitleLayer();
            }
        }

        private void SetupMapWithBlankPage()
        {
            Map1.MapTools.Logo.Enabled = false;
            Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));

            Map1.MapUnit = GeographyUnit.Meter;

            PagePrinterLayer pagePrinterLayer = new PagePrinterLayer(PrinterPageSize.AnsiA, PrinterOrientation.Portrait);
            pagePrinterLayer.Open();

            Map1.ZoomLevelSet = new PrinterZoomLevelSet(Map1.MapUnit, PrinterHelper.GetPointsPerGeographyUnit(Map1.MapUnit));
            Map1.CurrentExtent = pagePrinterLayer.GetBoundingBox();
            Map1.CurrentScale = PrinterHelper.GetPointsPerGeographyUnit(Map1.MapUnit) * 2;

            LayerOverlay printerInteractiveOverlay = new LayerOverlay();
            printerInteractiveOverlay.Name = "PageOverlay";
            printerInteractiveOverlay.Layers.Add("PageLayer", pagePrinterLayer);
            Map1.CustomOverlays.Add(printerInteractiveOverlay);

            pagePrinterLayer.Close();
        }

        private void AddMapLayer()
        {
            RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
            ShapeFileFeatureLayer worldMapLayer = new ShapeFileFeatureLayer(MapPath(@"~\SampleData\Countries02.shp"));
            worldMapLayer.FeatureSource.Projection = new Proj4Projection(Proj4Projection.GetDecimalDegreesParametersString(), Proj4Projection.GetGoogleMapParametersString());
            worldMapLayer.FeatureSource.Projection.Open();
            worldMapLayer.Open();

            Collection features = worldMapLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
            worldMapLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            worldMapLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            MapPrinterLayer mapPrinterLayer = new MapPrinterLayer();
            mapPrinterLayer.BackgroundMask = new AreaStyle(new GeoPen(GeoColor.StandardColors.Black, 1));
            mapPrinterLayer.MapUnit = GeographyUnit.Meter;
            mapPrinterLayer.MapExtent = worldMapLayer.GetBoundingBox();
            worldMapLayer.Close();

            mapPrinterLayer.SetPosition(8, 7, pageBoundingbox.GetCenterPoint().X, pageBoundingbox.GetCenterPoint().Y + 1, PrintingUnit.Inch);
            mapPrinterLayer.Layers.Add(worldMapLayer);

            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            printerInteractiveOverlay.Layers.Add("mapPrinterLayer", mapPrinterLayer);
        }

        private void AddTitleLayer()
        {
            RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
            LabelPrinterLayer labelPrinterLayer = new LabelPrinterLayer();

            labelPrinterLayer.Text = "Population > 70 Million";
            labelPrinterLayer.Font = new GeoFont("Arial", 10, DrawingFontStyles.Bold);
            labelPrinterLayer.TextBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
            labelPrinterLayer.PrinterWrapMode = PrinterWrapMode.AutoSizeText;

            PointShape labelCenter = new PointShape();
            labelCenter.X = pageBoundingbox.UpperRightPoint.X - pageBoundingbox.Width / 2;
            labelCenter.Y = pageBoundingbox.UpperLeftPoint.Y - .5;
            labelPrinterLayer.SetPosition(5, 1, labelCenter, PrintingUnit.Inch);

            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            printerInteractiveOverlay.Layers.Add("title", labelPrinterLayer);
        }

        private void AddGridLayer()
        {
            RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
            DataGridPrinterLayer dataGridPrinterLayer = new DataGridPrinterLayer();
            dataGridPrinterLayer.TextFont = new GeoFont("Arial", 8);
            dataGridPrinterLayer.TextHorizontalAlignment = TextHorizontalAlignment.Left;

            dataGridPrinterLayer.DataTable = new DataTable();
            dataGridPrinterLayer.DataTable.Columns.Add("FIPS_CNTRY");
            dataGridPrinterLayer.DataTable.Columns.Add("CNTRY_NAME");
            dataGridPrinterLayer.DataTable.Columns.Add("LONG_NAME");
            dataGridPrinterLayer.DataTable.Columns.Add("POP_CNTRY");

            ShapeFileFeatureLayer postgreLayer = (((MapPrinterLayer)GetPageOverlay().Layers["mapPrinterLayer"]).Layers[0]) as ShapeFileFeatureLayer;

            postgreLayer.Open();
            RectangleShape _boundingbox = postgreLayer.FeatureSource.GetBoundingBox();
            Collection features = postgreLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
            postgreLayer.Close();

            int pageSize = 0;
            foreach (Feature feature in features)
            {
                if (pageSize < 11 && int.Parse(feature.ColumnValues["POP_CNTRY"]) > 70000000)
                {
                    pageSize++;

                    dataGridPrinterLayer.DataTable.Rows.Add(new object[4] { feature.ColumnValues["FIPS_CNTRY"], feature.ColumnValues["CNTRY_NAME"], feature.ColumnValues["LONG_NAME"], feature.ColumnValues["POP_CNTRY"] });
                }
            }

            dataGridPrinterLayer.SetPosition(8, 2.5, pageBoundingbox.GetCenterPoint().X, pageBoundingbox.GetCenterPoint().Y - 4, PrintingUnit.Inch);

            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            if (printerInteractiveOverlay.Layers.Contains("grid"))
            {
                string script = @"alert('We have added a data grid!');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
            }
            else
            {
                printerInteractiveOverlay.Layers.Add("grid", dataGridPrinterLayer);
            }
        }

        private void AddLogoImage()
        {
            GeoImage compassGeoImage = new GeoImage(MapPath(@"~\SampleData\Compass.png"));
            ImagePrinterLayer imagePrinterLayer = new ImagePrinterLayer(compassGeoImage);

            RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
            imagePrinterLayer.SetPosition(.75, .75, pageBoundingbox.GetCenterPoint().X + 3.5, pageBoundingbox.GetCenterPoint().Y - 2.0, PrintingUnit.Inch);

            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            if (printerInteractiveOverlay.Layers.Contains("logo"))
            {
                string script = @"alert('We have added an image!');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
            }
            else
            {
                printerInteractiveOverlay.Layers.Add("logo", imagePrinterLayer);
            }
        }

        private void AddScaleLineLayer()
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();

            MapPrinterLayer mapPrinterLayer = (MapPrinterLayer)printerInteractiveOverlay.Layers["mapPrinterLayer"];

            ScaleLinePrinterLayer scaleLinePrinterLayer = new ScaleLinePrinterLayer(mapPrinterLayer);
            scaleLinePrinterLayer.MapUnit = GeographyUnit.Meter;

            RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
            scaleLinePrinterLayer.SetPosition(1.25, .25, pageBoundingbox.GetCenterPoint().X - 3.25, pageBoundingbox.GetCenterPoint().Y - 2.25, PrintingUnit.Inch);

            if (printerInteractiveOverlay.Layers.Contains("ScaleLineLayer"))
            {
                string script = @"alert('We have added a scale line!');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
            }
            else
            {
                printerInteractiveOverlay.Layers.Add("ScaleLineLayer", scaleLinePrinterLayer);
            }
        }

        private void AddLabelLayer()
        {
            StringBuilder noteSpace = new StringBuilder();
            noteSpace.Append("Notes: ");
            for (int i = 0; i < 160; i++)
            {
                noteSpace.Append("_ ");
            }


            LabelPrinterLayer labelPrinterLayer = new LabelPrinterLayer();
            //Setup the text and the font..
            labelPrinterLayer.Text = noteSpace.ToString();
            labelPrinterLayer.Font = new GeoFont("Arial", 14, DrawingFontStyles.Regular);
            labelPrinterLayer.TextBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
            labelPrinterLayer.PrinterWrapMode = PrinterWrapMode.WrapText;

            RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
            double noteSpaceWidth = 3.6;
            labelPrinterLayer.SetPosition(noteSpaceWidth, 2, pageBoundingbox.LowerLeftPoint.X + 0.25 + noteSpaceWidth / 2 + 4.3, pageBoundingbox.LowerLeftPoint.Y + 1.5, PrintingUnit.Inch);

            // Find the PrinterInteractiveOverlay so we can add the new LabelPrinterLayer
            LayerOverlay printerInteractiveOverLay = GetPageOverlay();
            if (printerInteractiveOverLay.Layers.Contains("label"))
            {
                string script = @"alert('We have added a label!');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
            }
            else
            {
                printerInteractiveOverLay.Layers.Add("label", labelPrinterLayer);
            }
        }

        #endregion

        #region Helper Methods

        private LayerOverlay GetPageOverlay()
        {
            foreach (var item in Map1.CustomOverlays)
            {
                if (item.Name == "PageOverlay")
                {
                    return (item as LayerOverlay);
                }
            }
            return null;
        }

        private RectangleShape GetPageBoundingBox(PrintingUnit unit)
        {
            PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)GetPageOverlay().Layers["PageLayer"];
            return pagePrinterLayer.GetPosition(unit);
        }

        private PageSize GetPdfPageSize(PrinterPageSize pageSize)
        {
            PageSize pdfPageSize = PageSize.Letter;
            switch (pageSize)
            {
                case PrinterPageSize.AnsiA:
                    pdfPageSize = PageSize.Letter;
                    break;
                case PrinterPageSize.AnsiB:
                    pdfPageSize = PageSize.Ledger;
                    break;
                case PrinterPageSize.AnsiC:
                    pdfPageSize = PageSize.A2;
                    break;
                case PrinterPageSize.AnsiD:
                    pdfPageSize = PageSize.A1;
                    break;
                case PrinterPageSize.AnsiE:
                    pdfPageSize = PageSize.A0;
                    break;
                case PrinterPageSize.Custom:
                    throw new NotSupportedException();
                default:
                    throw new NotSupportedException();
            }
            return pdfPageSize;
        }

        private PaperSize GetPrintPreviewPaperSize(PagePrinterLayer pagePrinterLayer)
        {
            PaperSize printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
            switch (pagePrinterLayer.PageSize)
            {
                case PrinterPageSize.AnsiA:
                    printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
                    break;
                case PrinterPageSize.AnsiB:
                    printPreviewPaperSize = new PaperSize("AnsiB", 1100, 1700);
                    break;
                case PrinterPageSize.AnsiC:
                    printPreviewPaperSize = new PaperSize("AnsiC", 1700, 2200);
                    break;
                case PrinterPageSize.AnsiD:
                    printPreviewPaperSize = new PaperSize("AnsiD", 2200, 3400);
                    break;
                case PrinterPageSize.AnsiE:
                    printPreviewPaperSize = new PaperSize("AnsiE", 3400, 4400);
                    break;
                case PrinterPageSize.Custom:
                    printPreviewPaperSize = new PaperSize("Custom Size", (int)pagePrinterLayer.CustomWidth, (int)pagePrinterLayer.CustomHeight);
                    break;
                default:
                    break;
            }

            return printPreviewPaperSize;
        }

        #endregion

        #region Export Buttons

        protected void btnToBitmap_Click(object sender, EventArgs e)
        {
            PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)(GetPageOverlay().Layers["PageLayer"]);

            Bitmap bitmap = null;
            try
            {
                pagePrinterLayer.Open();
                bitmap = new Bitmap((int)pagePrinterLayer.GetBoundingBox().Width, (int)pagePrinterLayer.GetBoundingBox().Height);

                GdiPlusGeoCanvas gdiPlusGeoCanvas = new GdiPlusGeoCanvas();
                gdiPlusGeoCanvas.BeginDrawing(bitmap, pagePrinterLayer.GetBoundingBox(), Map1.MapUnit);

                Collection labelsInAllLayers = new Collection();
                foreach (Layer item in GetPageOverlay().Layers)
                {
                    PrinterLayer printerLayer = (PrinterLayer)item;
                    printerLayer.Open();
                    printerLayer.IsDrawing = true;
                    if (!(printerLayer is PagePrinterLayer))
                    {
                        printerLayer.Draw(gdiPlusGeoCanvas, labelsInAllLayers);
                    }
                    printerLayer.IsDrawing = false;
                    printerLayer.Close();
                }

                gdiPlusGeoCanvas.EndDrawing();
                pagePrinterLayer.Close();
                string filename = MapPath(@"~\SampleData\PrintingResults.bmp");
                bitmap.Save(filename);
                Process.Start(filename);
            }
            catch (Exception ex)
            {
                string script = @"alert('" + ex.Message + " " + ex.StackTrace + "');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
            }
            finally
            {
                if (bitmap != null) { bitmap.Dispose(); }
                GetPageOverlay().Redraw();
            }
        }

        protected void btnToPDF_Click(object sender, EventArgs e)
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            PagePrinterLayer pagePrinterLayer = printerInteractiveOverlay.Layers["PageLayer"] as PagePrinterLayer;

            PdfDocument pdfDocument = null;
            PdfPage pdfPage = null;

            try
            {
                pdfDocument = new PdfDocument();
                pdfPage = pdfDocument.AddPage();
                pdfPage.Orientation = pagePrinterLayer.Orientation == PrinterOrientation.Portrait ? PageOrientation.Portrait : PageOrientation.Landscape;
                pdfPage.Size = GetPdfPageSize(pagePrinterLayer.PageSize);

                PdfGeoCanvas pdfGeoCanvas = new PdfGeoCanvas();
                pagePrinterLayer.Open();
                pdfGeoCanvas.BeginDrawing(pdfPage, pagePrinterLayer.GetBoundingBox(), Map1.MapUnit);
                pagePrinterLayer.Close();

                Collection labelsInAllLayers = new Collection();
                foreach (Layer item in printerInteractiveOverlay.Layers)
                {
                    PrinterLayer printerLayer = item as PrinterLayer;
                    printerLayer.Open();
                    printerLayer.IsDrawing = true;
                    if (!(printerLayer is PagePrinterLayer))
                    {
                        printerLayer.Draw(pdfGeoCanvas, labelsInAllLayers);
                    }
                    printerLayer.IsDrawing = false;
                    printerLayer.Close();
                }

                pdfGeoCanvas.EndDrawing();

                string filename = MapPath(@"~\SampleData\PrintingResults.pdf");
                pdfDocument.Save(filename);
                Process.Start(filename);
            }
            catch (Exception ex)
            {
                string script = @"alert('" + ex.Message + " " + ex.StackTrace + "');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
            }
            finally
            {
                if (pdfDocument != null) { pdfDocument.Dispose(); }
                printerInteractiveOverlay.Redraw();
            }
        }

        protected void btnToPrinter_Click(object sender, EventArgs e)
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            PagePrinterLayer pagePrinterLayer = printerInteractiveOverlay.Layers["PageLayer"] as PagePrinterLayer;

            PrintDocument printDocument = new PrintDocument();
            printDocument.DefaultPageSettings.Landscape = true;
            if (pagePrinterLayer.Orientation == PrinterOrientation.Portrait)
            {
                printDocument.DefaultPageSettings.Landscape = false;
            }

            printDocument.DefaultPageSettings.PaperSize = GetPrintPreviewPaperSize(pagePrinterLayer);

            PrinterGeoCanvas printerGeoCanvas = new PrinterGeoCanvas();
            printerGeoCanvas.DrawingArea = new Rectangle(0, 0, Convert.ToInt32(printDocument.DefaultPageSettings.PrintableArea.Width), Convert.ToInt32(printDocument.DefaultPageSettings.PrintableArea.Height));
            pagePrinterLayer.Open();
            printerGeoCanvas.BeginDrawing(printDocument, pagePrinterLayer.GetBoundingBox(), Map1.MapUnit);
            pagePrinterLayer.Close();

            Collection labelsInAllLayers = new Collection();
            foreach (Layer item in printerInteractiveOverlay.Layers)
            {
                PrinterLayer printerLayer = item as PrinterLayer;
                printerLayer.Open();
                printerLayer.IsDrawing = true;
                if (!(printerLayer is PagePrinterLayer))
                {
                    printerLayer.Draw(printerGeoCanvas, labelsInAllLayers);
                }
                printerLayer.IsDrawing = false;
                printerLayer.Close();
            }

            printerGeoCanvas.EndDrawing();
            printerInteractiveOverlay.Redraw();
        }

        #endregion

        #region Pan & Zoom Buttons

        protected void btnZoomIn_Click(object sender, EventArgs e)
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerInteractiveOverlay.Layers["mapPrinterLayer"]));
            if (!mapPrinterLayer.IsOpen)
            {
                mapPrinterLayer.Open();
            }

            ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
            double newScale = ZoomLevelSet.GetLowerZoomLevelScale(ExtentHelper.GetScale(mapPrinterLayer.MapExtent, (float)mapPrinterLayer.GetBoundingBox().Width, mapPrinterLayer.MapUnit), zoomLevelSet);
            mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);

            printerInteractiveOverlay.Redraw();
        }

        protected void btnZoomOut_Click(object sender, EventArgs e)
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerInteractiveOverlay.Layers["mapPrinterLayer"]));
            if (!mapPrinterLayer.IsOpen)
            {
                mapPrinterLayer.Open();
            }

            ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
            double newScale = ZoomLevelSet.GetHigherZoomLevelScale(ExtentHelper.GetScale(mapPrinterLayer.MapExtent, (float)mapPrinterLayer.GetBoundingBox().Width, mapPrinterLayer.MapUnit), zoomLevelSet);
            mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);

            printerInteractiveOverlay.Redraw();
        }

        protected void btnPan_Click(object sender, EventArgs e)
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();

            MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerInteractiveOverlay.Layers["mapPrinterLayer"]));

            if (sender == btnPanNorth)
            { mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Up, 30); }
            else if (sender == btnPanWest)
            { mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Left, 30); }
            else if (sender == btnPanEast)
            { mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Right, 30); }
            else if (sender == btnPanSouth)
            { mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Down, 30); }

            printerInteractiveOverlay.Redraw();
        }

        #endregion

        #region Combo Boxes & ContextMenu

        protected void lisSize_SelectedIndexChanged(object sender, EventArgs e)
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)printerInteractiveOverlay.Layers["PageLayer"];

            string selectText = lisSize.SelectedItem.Text;
            if (selectText.StartsWith("ANSI A"))
                pagePrinterLayer.PageSize = PrinterPageSize.AnsiA;
            else if (selectText.StartsWith("ANSI B"))
                pagePrinterLayer.PageSize = PrinterPageSize.AnsiB;
            else if (selectText.StartsWith("ANSI C"))
                pagePrinterLayer.PageSize = PrinterPageSize.AnsiC;
            else if (selectText.StartsWith("ANSI D"))
                pagePrinterLayer.PageSize = PrinterPageSize.AnsiD;
            else if (selectText.StartsWith("ANSI E"))
                pagePrinterLayer.PageSize = PrinterPageSize.AnsiE;

            printerInteractiveOverlay.Redraw();
        }

        protected void lisOrientation_SelectedIndexChanged(object sender, EventArgs e)
        {
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)printerInteractiveOverlay.Layers["PageLayer"];

            string selectText = lisOrientation.SelectedItem.Text;
            if (selectText.ToUpper() == "LANDSCAPE")
            {
                pagePrinterLayer.Orientation = PrinterOrientation.Landscape;
            }
            else if (selectText.ToUpper() == "PORTRAIT")
            {
                pagePrinterLayer.Orientation = PrinterOrientation.Portrait;
            }

            printerInteractiveOverlay.Redraw();
        }

        protected void lisPercentage_SelectedIndexChanged(object sender, EventArgs e)
        {
            String zoomString = lisPercentage.SelectedItem.Text;
            double currentZoom = Double.Parse(zoomString.Replace("%", ""));
            Map1.CurrentScale = PrinterHelper.GetPointsPerGeographyUnit(Map1.MapUnit) / (currentZoom / 100);

            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            printerInteractiveOverlay.Redraw();
        }

        #endregion

        #region ToolBox

        protected void btnAddContrl_Click(object sender, ImageClickEventArgs e)
        {
            ImageButton btn = sender as ImageButton;
            if (btn == btnAddLabel)
            {
                AddLabelLayer();
            }
            else if (btn == btnAddImage)
            {
                AddLogoImage();
            }
            else if (btn == btnAddScaleLine)
            {
                AddScaleLineLayer();
            }
            else if (btn == btnAddScaleBar)
            {
                string script = @"alert('Not Implemented!');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
            }
            else if (btn == btnAddGrid)
            {
                AddGridLayer();
            }
            LayerOverlay printerInteractiveOverlay = GetPageOverlay();
            printerInteractiveOverlay.Redraw();
        }

        #endregion
    }
}