﻿
// FIX that take into account the position in the document
//(vs. in the browser window as before).
dojo.global.esri.Map.prototype.reposition = function () {
  var pos = dojo.coords(this.container, true),
    brdr = dojo._getBorderExtents(this.container);

  this.position.setX(pos.x + brdr.l);
  this.position.setY(pos.y + brdr.t);
  this.onReposition(this.position.x, this.position.y);
}

function recalculate(evt) {
  var graphic = map.getLayer('printMarker').graphics[0];
  var extentPoints = evt.shape.getTransformedBoundingBox();
  // Create a new screen-based extent using the previous screen extent and the offset
  var newScreenExtent = new esri.geometry.Extent(
      extentPoints[3].x,
      extentPoints[3].y,
      extentPoints[1].x,
      extentPoints[1].y);
  // Draw the new geometry onscreen
  var rect = esri.geometry.toMapGeometry(
    map.extent,
    map.width,
    map.height,
    newScreenExtent);
  updateGraphicGeometry(graphic, rect, map.getLayer('printMarker'));

}

dojo.require("dojox.gfx.move");

function updateGraphicGeometry(graphic, geometry, graphicLayer) {
  // IE7 errors when we update a graphic's geometry, so for IE7, we recreate the graphic
  createPrintPaneGraphic(graphicLayer, geometry);
//  if (Ext.isIE7) {
//    //graphicLayer.graphics[0] && graphicLayer.graphics[0]
//    createPrintPaneGraphic(graphicLayer, geometry);
//  } else {
//    graphic.setGeometry(geometry);
//  }
}
var mv;
function createPrintPaneGraphic(graphicLayer, geometry) {
  graphicLayer.clear();
  graphicLayer.add(
    new esri.Graphic(geometry,
      new esri.symbol.SimpleFillSymbol(
        esri.symbol.SimpleFillSymbol.STYLE_SOLID,
        // Outline style
        new esri.symbol.SimpleLineSymbol(
          esri.symbol.SimpleLineSymbol.STYLE_SOLID,
          new dojo.Color([255, 0, 0]),
        2),
        // Fill color
        new dojo.Color([80, 80, 80, 0.25])
      )
    ), null, null
  );


  mv = new dojox.gfx.Moveable(map.getLayer('printMarker').graphics[0].getDojoShape());

  dojo.connect(mv, 'onMoveStop', recalculate);
}

function drawPrintArea(centerPoint) {
  var printMarkerLayer;
  locationSearchWindow && locationSearchWindow.hide();
  Mapping.Ext.Esri.Marker && Mapping.Ext.Esri.Marker.hidePopUp();
  // If we don't have a printLayer yet, create it
  if (Ext.each(map.graphicsLayerIds, function (item) { return item != 'printMarker'; }) > -1) {
    printMarkerLayer = map.getLayer('printMarker');
    printMarkerLayer.clear();
  } else {
    printMarkerLayer = new esri.layers.GraphicsLayer({ displayOnPan: false, id: 'printMarker' });
    map.addLayer(printMarkerLayer);
  }
  prevScreenExtent = new esri.geometry.Extent(0, 456, 709, 0);
  prevScreenExtent = prevScreenExtent.centerAt(
    esri.geometry.toScreenGeometry(
      map.extent,
      map.width,
      map.height,
      centerPoint));
  // Create a rectangle for our output image size on the map
  var rect = esri.geometry.toMapGeometry(
    map.extent,
    map.width,
    map.height,
    prevScreenExtent);
  // Add the printer pane layer
  createPrintPaneGraphic(printMarkerLayer, rect);

  dojo.connect(map, 'onZoomEnd', function (extent, zoomFactor, anchor, level) {
    //redraw the shape on screen at the same physical screen point after a zoom
    prevScreenExtent && map.getLayer('printMarker') && map.getLayer('printMarker').graphics[0] &&
      updateGraphicGeometry(
        map.getLayer('printMarker').graphics[0],
        esri.geometry.toMapGeometry(map.extent, map.width, map.height, prevScreenExtent), 
        map.getLayer('printMarker'));
  });
}

function showPrintWindow() {
    //Turn off the parcels result layer
    hoverOff();
  // create the print window if it doesn't exist
  (Ext.getCmp('printWindow') && Ext.getCmp('printWindow').show()) || CreatePrintWindow();
  drawPrintArea(Mapping.Ext.Esri.Marker.getLocation());
}

function CreatePrintWindow() {
  var printWindow = new Ext.Window({
    height: 350,
    width: 300,
    closeAction: 'hide',
    items: [
      {
        xtype: 'container',
        contentEl: 'printWindowContent'
      }, {
        xtype: 'container',
        layout: 'hbox',
        layoutConfig: {
          padding: '5',
          pack: 'center',
          flex: 1,
          align: 'middle'
        },
        defaults: {margins: '0 5 0 0'},
        items: [{
          xtype: 'button',
          text: 'Generate Report',
          handler: getFloodRiskReport
        }, {
          xtype: 'button',
          text: 'Reset Print Pane',
          handler: showPrintWindow
        }, {
          xtype: 'button',
          text: 'Close Print Pane',
          handler: function () { map.getLayer('printMarker').clear(); }
        }]
    }],
    id: 'printWindow',
    resizable: false,
    title: 'Flood Risk Report'
  });

  printWindow.on('show', function() {
    var xOffset = 
      Ext.getCmp('masterViewport').getWidth() - Ext.getCmp('printWindow').getWidth() - 5;
    var yOffset = 
      Ext.getCmp('masterViewport').getHeight() - Ext.getCmp('printWindow').getHeight() - 10;
    Ext.getCmp('printWindow').setPosition([parseInt(xOffset),yOffset]);
  });
  printWindow.on('hide', function () {
    map.getLayer('printMarker').clear();
  });

  printWindow.show();
}
