/**
 * @requires OpenLayers/Control.js
 * @requires OpenLayers/Handler/Box.js
 */
var Dco = function() { };

Dco.Identify = OpenLayers.Class(OpenLayers.Control, {
    type: OpenLayers.Control.TYPE_TOOL,

    startBox: function (xy) {
        OpenLayers.Handler.Box.prototype.startBox.apply(this, arguments);
        var ib = OpenLayers.Util.createDiv('idBox', this.dragHandler.start);
	ib.className = this.boxDivClassName;
	ib.style.border = 'green 1px solid';
	ib.style.backgroundColor = 'lightgreen';
	ib.style.opacity = 0.5;
	ib.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
        Dco.Identify.idBox = ib;
	this.map.viewPortDiv.appendChild(ib);
        var mwPx = parseFloat($('#map').css('width'));
        this.mapScaleDenom = MapTool.getMapExtRect().getScaleDenom(mwPx);
    },

    draw: function() {
        this.handler = new OpenLayers.Handler.Box( this,
                            {done: this.identifyArea}, {keyMask: this.keyMask} );
        var callbacks = {
            "down": this.startBox,
            "move": this.moveBox,
            "out":  this.removeBox,
            "up":   this.endBox
        };
        this.handler.dragHandler.callbacks.down = this.startBox;
        this.handler.dragHandler.callbacks.move = this.moveBox;

	//this.events.register("activate", { object: this, element: null }, Dco.Identify.addIdButtons);
	//this.events.register("deactivate", { object: this, element: null }, Dco.Identify.removeIdButtons);

    },

    moveBox: function (xy) {
        var startX = this.dragHandler.start.x;
        var startY = this.dragHandler.start.y;
        var deltaX = Math.abs(startX - xy.x);
        var deltaY = Math.abs(startY - xy.y);

	// tolerance between drawing box vs. point
        if (this.zoomBox.style.display === 'none')
	{
          if (deltaX > 8 || deltaY > 8)
	  {
            this.zoomBox.style.display = '';
	    Dco.Identify.idBox.style.display = '';
	    /*
	    $(document.body).append('<img src="http://reportallusa.com/images/red_star.gif" width="9" height="9" style="position: absolute; top: ' + (xy.y - 4) + 'px; left: ' + (xy.x + 4) + 'px; z-index: ' + (this.map.Z_INDEX_BASE["Popup"] + 1)  + '" />');
	    */
	  }
	}
	else if (deltaX < 8 && deltaY < 8)
	{
          this.zoomBox.style.display = 'none';
	  Dco.Identify.idBox.style.display = 'none';
	}

        this.zoomBox.style.width = Math.max(1, deltaX) + "px";
        this.zoomBox.style.height = Math.max(1, deltaY) + "px";
        var minX = Math.min(xy.x, startX);
        this.zoomBox.style.left = minX + "px";
        var minY = Math.min(xy.y, startY);
        this.zoomBox.style.top = minY + "px";

        var maxX = Math.max(xy.x, startX);
        var maxY = Math.max(xy.y, startY);

        this.idRect = new Rect2D(minX, minY, maxX, maxY);
      
        var lMaxScaleDenom = Dco.Identify.selectedLayer.maxscale;
        if (lMaxScaleDenom != -1)
        {
          if (lMaxScaleDenom < this.mapScaleDenom)
          {
            var mwPx = parseFloat(ol_mapElem.style.width);
            var mhPx = parseFloat(ol_mapElem.style.height);
            var maxAreaPx = Math.pow(lMaxScaleDenom / this.mapScaleDenom, 2) * mwPx * mhPx;
      
            var zArea = deltaX * deltaY;
      
            if (zArea > maxAreaPx)
            {
              var sqPMaZa = Math.sqrt(maxAreaPx) / Math.sqrt(zArea);
              this.idRect.maxx = this.idRect.minx + deltaX * sqPMaZa;
              this.idRect.maxy = this.idRect.miny + deltaY * sqPMaZa;
      
              //window.status = 'deltaX: ' + deltaX + ', deltaY: ' + deltaY + ', maxAreaPx: ' + maxAreaPx + ', idRect area: ' + this.idRect.getWidth() * this.idRect.getHeight();
      
              if (xy.x > minX)
              {
                this.idRect.incrementXBy(deltaX - this.idRect.getWidth());
              }
              if (xy.y > minY)
              {
                this.idRect.incrementYBy(deltaY - this.idRect.getHeight());
              }
	    }
          }
        }
      
        this.idRect.positionElemAt(Dco.Identify.idBox, 0, 0);

    },

    /**
     * Method: zoomBox
     *
     * Parameters:
     * position - {<OpenLayers.Bounds>} or {<OpenLayers.Pixel>}
     */
    identifyArea: function (position) {
        position = null; // ignore drawn box pos

        var ibs = Dco.Identify.idBox.style;
        var minX = parseInt(ibs.left);
        var maxX = minX + ((ibs.width != "") ? parseInt(ibs.width) : 0);
        var maxY = parseInt(ibs.top);
        var minY = maxY + ((ibs.height != "") ? parseInt(ibs.height) : 0);

        this.map.viewPortDiv.removeChild(Dco.Identify.idBox);
        Dco.Identify.idBox = null;

        var minXY = this.map.getLonLatFromPixel(new OpenLayers.Pixel(minX, minY));
        var maxXY = this.map.getLonLatFromPixel(new OpenLayers.Pixel(maxX, maxY));

        var pr = new Rect2D(minXY.lon, minXY.lat, maxXY.lon, maxXY.lat);

        Dco.Identify.spatialSearch(pr);   
    },

    CLASS_NAME: "Dco.Identify"
});

Dco.Identify.selectedLayer = null;
Dco.Identify.selectedMapName = null;

/*
Dco.Identify.setSelectedLayer = function(e)
{
  var sl = null;

  var ct = e.currentTarget ? e.currentTarget : e.srcElement;
  var sRowElem = ct.parentNode.parentNode;
  var lidMatch = sRowElem.id.match(/^lRow_(.*)$/);
  if (lidMatch.length > 1)
  {
    sl = lidMatch[1];
  }

  if (Dco.Identify.selectedLayer)
  {
    var pre = Dco.Identify.selectedLayer.getRowElement();
    var prevIdIcon = pre.childNodes[pre.childNodes.length - 1].childNodes[0];
    prevIdIcon.src = prevIdIcon.src.replace(/_on\.png$/,'_off.png');
  }

  Dco.Identify.selectedLayer = layerTree.getLayerByName(sl.replace(/_/g,' '));

  var idIcon = sRowElem.childNodes[sRowElem.childNodes.length - 1].childNodes[0];
  idIcon.src = idIcon.src.replace(/_off\.png$/,'_on.png');
}

Dco.Identify.addIdButtons = function(e)
{
  var ils = layerTree.getConnectionTypeDbLayers().layerArr;
  for (var i=0; i<ils.length; ++i)
  {
    var layer = ils[i];
    var lre = layer.getRowElement();
    var idIcon = document.createElement('img');
    idIcon.width = idIcon.height = '15';
    idIcon.title = 'Identify elements in this layer';

    idIcon.src = 'images/map_buttons/Identify_off.png';

    addEventListenersToElem(idIcon);

    var td = document.createElement('td');
    $(td).addClass('identify_cell');

    td.appendChild(idIcon);

    lre.appendChild(td);

    idIcon.addEventListener('mousedown', Dco.Identify.setSelectedLayer, false);
    //td.style.cursor = 'help';
  }

  var fakeEv = new Object();
  var sl = Dco.Identify.selectedLayer;
  if (!sl)
  {
    sl = layerTree.getLayerByName('Parcels');
  }
  var selRow = sl.getRowElement();
  fakeEv.currentTarget = selRow.childNodes[selRow.childNodes.length - 1].childNodes[0];
  Dco.Identify.setSelectedLayer(fakeEv);
 
}

Dco.Identify.removeIdButtons = function(e)
{
  var id_cells = $("#layerForm .identify_cell");
  for (var i=0; i<id_cells.length; ++i)
  {
    var idIconTd = $(id_cells[i]);
    var idIcon = idIconTd.children("img")[0];
    idIcon.removeEventListener('mousedown', Dco.Identify.setSelectedLayer, false);
    idIconTd.remove();
  }
}
*/

Dco.Identify.spatialSearch = function (projRect)
{
  // expand query area by tiny amount if width or height == 0
  var x_eq = (projRect.minx == projRect.maxx);
  var y_eq = (projRect.miny == projRect.maxy);
  var epsilon = Math.pow(2,-31);
  if (x_eq && !y_eq)
  {
    projRect.maxx += epsilon;
  } else if (!x_eq && y_eq) {
    projRect.maxy += epsilon;
  }

  var mapName = Dco.Identify.selectedMapName;
  var layerName = Dco.Identify.selectedLayer.name; 

  var ll_spn = map_bounds_to_ll_spn();
  var url = "/map?mapName=" + mapName + "&layerName=" + layerName + "&spatial_intersect=" + projRect.toWKT() + "&ll=" + ll_spn[0] + "&spn=" + ll_spn[1];

  // get layers which have been toggled
  t_lyr = [];
  var branches = LayerTree.getNonBaseBranches();
  for (var i=0; i<branches.length; ++i)
  {
    var branch = branches[i];
    for (var j=0; j<branch.getLength(); ++j)
    {
      var layer = branch.getLayerById(j);
      if (layer.status != layer.default_status)
      {
        t_lyr.push('layer_[' + branch.getMapName() + '][' + layer.name + ']=' + layer.status);
      }
    }
  }
  if (t_lyr.length > 0)
  {
    url += '&' + t_lyr.join('&');
  }

  // get default basemap
  var bm = LayerTree.getBaseBranches();
  var def_bm_n = bm[bm.length - 1].getMapName();
  if (ol_mapObj.baseLayer.name !== def_bm_n)
  {
    url += '&basemap=' + ol_mapObj.baseLayer.name; 
  }

  url += '&default_tool=Identify';

  location.href = url;

}

Dco.Identify.get_dropdown_table = function(target)
{
  var tbl_elem = $('#cur_toolbar_menu');
  if (tbl_elem.length == 0)
  {
    var btn_xy = $(target).offset(); //element_offset(target);
    var tbl = document.createElement('table');
    tbl.id = 'cur_toolbar_menu';
    tbl.setAttribute('class', 'toolbarMenu');
    tbl.setAttribute('className', 'toolbarMenu');
    tbl.style.top = (parseInt(btn_xy.top) + parseInt($(target).height())) + 'px';
    tbl.style.left = btn_xy.left + 'px';

    var tbody = document.createElement('tbody');

    var m = '';
    var sln = null;
    if (Dco.Identify.selectedLayer)
    {
      sln = Dco.Identify.selectedLayer.name;
    }

    var l_names = new Object();

    for(var mapfile in LayerTree.root)
    {
      var branch = LayerTree.root[mapfile];

      for (var i=0; i<branch.getLength(); ++i)
      {
        var layer = branch.getLayerById(i);
        if (layer.isConnectionTypeDb() && !layer.isTypeAnnotation() && layer.isStatusVis())
        {
          if (!l_names[layer.name])
          {
            l_names[layer.name] = 1;
            var tr = document.createElement('tr');
            var ln = layer.name;
            if (ln == sln)
            {
              tr.style.backgroundColor = 'rgb(250, 250, 230)';
	      tr.style.fontWeight = 'bold';
            }
            /*
            if (layer.isVisibleAtScale())
            {
              tr.style.color = 'gray';
            }
            */

            var td = document.createElement('td');
            td.id = "idrow:" + mapfile + ":" + layer.name;
            var icon_elem = layer.buildIconElement();
            if (icon_elem != null)
            {
              td.appendChild(icon_elem);
            }
            td.appendChild(document.createTextNode(layer.name));
            tr.appendChild(td);

            tbody.appendChild(tr);
          }
        }
      }
    }

    tbl.appendChild(tbody);

    document.body.appendChild(tbl);

    tbl_elem = $('#cur_toolbar_menu');

    addEventListenersToElem(tbl);
    tbl.addEventListener('mouseover', MapToolbarEvent.mouseover, false);
    tbl.addEventListener('mouseout', MapToolbarEvent.mouseout, false);
    tbl.addEventListener('click', MapToolbarEvent.activate, false);
  }
  var tbl_w = tbl_elem.width();
  var doc_w = $(window).width();
  // - 20 is for scrollbar width
  var new_left = Math.min(parseInt(tbl_elem.css('left')), doc_w - tbl_w - 20) + 'px';
  tbl_elem.css('left', new_left);
  tbl_elem.css('display','');
  return tbl_elem.get(0);
}
