Highlighting.vml = (navigator.userAgent.indexOf('MSIE') != -1);
Highlighting.displayVis = 'table-row';
Highlighting.hl_layer = new OpenLayers.Layer.Vector(Highlighting.elemId, { isFixed: false, reportError: true });
Highlighting.strokeWidth = 3;
Highlighting.strokeColor = 'red';

if (Highlighting.vml)
{
  Highlighting.displayVis = 'block';
}
Highlighting.hlRowGeomPairs = new Array();

Highlighting.updateViewBox = function()
{
  var hlElem = document.getElementById(Highlighting.elemId);
  if (hlElem && hlElem.childNodes.length > 0)
  {
    var me = MapTool.getMapExtRect();
    if (!Highlighting.vml)
    {
      var srLn = Highlighting.getSRLayerName();
      var layer = layerTree.getLayerByName(srLn);
      if (layer && layer.isVisibleAtScale())
      {
        var rects = hlElem.getElementsByTagNameNS('http://www.w3.org/2000/svg','rect');
        var ctid_buf = new Array();
        for (var i=0; i<rects.length; ++i)
        {
          var r = rects[i];
          var rx = parseFloat(r.getAttributeNS(null,'x'));
          var ry = parseFloat(r.getAttributeNS(null,'y')) * -1.0;
          var rwidth = parseFloat(r.getAttributeNS(null,'width'));
          var rheight = parseFloat(r.getAttributeNS(null,'height'));
          var rBox = new Rect2D(rx, ry, rx + rwidth, ry - rheight); 
          if (me.intersects(rBox))
          {
	    var ctid = r.id.match(/^geom_(\d+,\d+)$/)[1];
            ctid_buf.push(ctid);
          }
        }
  
        if (ctid_buf.length)
        {
          //alert('fetching ' + ctid_buf.length + ' of ' + rects.length + ' geometries: ' + ctid_buf.join(' '));
	  searchResultsPager.fetchFullGeometries(ctid_buf);
        }
      }

      var vbStr = me.minx + ' ' + (-1.0 * me.maxy) + ' ' + me.getWidth() + ' ' + me.getHeight();
      hlElem.setAttributeNS(null, 'viewBox', vbStr);
      if (layer)
      {
        var csStrokeWidth = Highlighting.scrnPxToCSUnit(layer.getSelStyle().stroke_width);
        for(var i=0; i<hlElem.childNodes.length; ++i)
        {
          hlElem.childNodes[i].setAttributeNS(null,'stroke-width',csStrokeWidth);
        }
      }
    } else {
      var mbr = new Rect2D(me);
      //mbr.scaleOrdsBy(Highlighting.vmlScaleUp);

      //var w = viewportWidth();
      //hlElem.style.left = w / 2.0 - (mbr.getCenterX() * w / mbr.getWidth());
      //var h = viewportHeight();
      //hlElem.style.top = h / 2.0 - (mbr.getCenterY() * h / mbr.getHeight());
      //hlElem.coordsize = mbr.getWidth() + ',' + mbr.getHeight(); 
      //hlElem.style.width = (mbr.getWidth() / Highlighting.vmlScaleUp) + 'px'; 
      //hlElem.style.height = (mbr.getHeight() / Highlighting.vmlScaleUp) + 'px';
    }
  }
}

Highlighting.getHLElem = function()
{
  if (!jQuery.browser.msie)
  {
    var hlll = ol_mapObj.getLayersByName(Highlighting.elemId);
    var hl = null;
    if (hlll.length > 0)
    {
      hl = hlll[0];
    }
    if (hl == null)
    {
      hl = new OpenLayers.Layer.Vector(Highlighting.elemId, { isFixed: false, reportError: true });
      ol_mapObj.addLayer(hl);
    }
  }

  var hlElem = document.getElementById(Highlighting.elemId);
  if (!hlElem)
  {
    var mw = parseInt(ol_mapObj.getSize().w);
    var mh = parseInt(ol_mapObj.getSize().h);
    if (!Highlighting.vml)
    {
      //var h = OpenLayers.Renderer.SVG(Highlighting.elemId + '_ol');

      hlElem = document.createElementNS("http://www.w3.org/2000/svg", "svg");
      hlElem.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
      hlElem.style.display = 'none';
      /*
      hlElem.setAttributeNS(null, 'width', mw + 'px');
      hlElem.setAttributeNS(null, 'height', mh + 'px');
      //hlElem.setAttributeNS(null, 'transform', 'matrix(1 0 0 -1 0 0)');
      hlElem.style.left = MapTool.mapImagePosX + 'px';
      hlElem.style.top = MapTool.mapImagePosY + 'px';
      */
    } else {
      hlElem = document.createElement('div');
      hlElem.style.display = 'none';

      /*
      var me = MapTool.getMapExtRect();

      hlElem = document.createElement('v:group');
      hlElem.ondragstart = function() { return false; }
      hlElem.onselectstart = function() { return false; }

      //var left = screenW / 2.0 - ((me.getCenterX() / me.getWidth()) * screenW);
      var left = DcoMap.leftOffset - 2;
      hlElem.style.left = left + 'px';

      //var top = screenH / 2.0 + ((me.getCenterY() / me.getHeight()) * screenH);
      var top = DcoMap.topOffset;
      hlElem.style.top = top + 'px';
      //hlElem.coordsize = me.getWidth() + ',' + me.getHeight();
      //hlElem.coordsize = ((screenW / viewportWidth()) * me.getWidth()) + ',' + ((screenH / viewportHeight()) * me.getHeight());
      hlElem.width = '1';
      hlElem.height = '1';
      hlElem.coordsize = '1 1';
      hlElem.style.width = 1 + 'px';
      hlElem.style.height = 1 + 'px';
      //hlElem.strokeweight = "0px"
      //hlElem.style.borderWidth = '0px';
      //hlElem.stroke = "false";
      //hlElem.style.margin = '0px';
      //hlElem.style.padding = '0px';

      var csMbr = document.createElement('v:shape');
      //csMbr.id = 'vml_bounding_shape';
      csMbr.ondragstart = function() { return false; }
      csMbr.onselectstart = function() { return false; }
      csMbr.style.width = mw + 'px'; //(mw * Highlighting.vmlScaleUp) + 'px';
      csMbr.style.height = mh + 'px'; //(mh * Highlighting.vmlScaleUp) + 'px';
      csMbr.width = '1';
      csMbr.height = '1';
      //csMbr.style.clip = 'rect(100px, 100px, 100px, 100px)';
      csMbr.coordsize = '1 1';
      //csMbr.strokeweight = "0px";
      //csMbr.stroke = "false";
      //csMbr.style.margin = '0px';
      //csMbr.style.padding = '0px';

      //alert(csMbr.style.width + ', ' + csMbr.style.height);

      //csMbr.setAttribute('fill','true');
      //csMbr.setAttribute('fillcolor', 'yellow');
      //csMbr.setAttribute('strokecolor', 'red');
      csMbr.style.backgroundColor = 'cyan';
      csMbr.style.filter = 'alpha(opacity=0.0)';
      //csMbr.style.zIndex = '-1';

      //csMbr.opacity = '0.01';
      //csMbr.style.visibility = 'hidden';
      //csMbr.onclick = function() { alert('hi') };
      // TODO: read coord sys bounds from... elsewhere
      //var cmc = [ -180, -90, 180, 90 ]; // coord sys bounds
      //var cmc = [ me.minx, me.miny, me.maxx, me.maxy ];
      var cmc = [ 0, 0, 1, 1 ];
      var cmc_str = ['M',cmc[0],cmc[1],'L',cmc[0],cmc[3],cmc[2],cmc[3],cmc[2],cmc[1],'X','E'].join(' ');

      csMbr.path = cmc_str;
      csMbr.position = "absolute";

      hlElem.appendChild(csMbr);

      addEventListenersToElem(hlElem);
      //hlElem.addEventListener('mousedown', function() { alert('hi2') }, false);
      */
    }
    hlElem.id = Highlighting.elemId;
    hlElem.style.position = 'absolute';

    /*
    if (!hlElem.setAttributeNS)
    {
      hlElem.setAttributeNS = function(ns, name, value)
      {
        return hlElem.setAttribute(name, value);
      }
    }
    */

    document.body.appendChild(hlElem);
  }
  return hlElem;
}

Highlighting.scrnPxToCSUnit = function(w_px)
{
  var me = MapTool.getMapExtRect();
  var scrnPxSize = me.getWidth() / parseFloat(ol_mapObj.getSize().w); //parseFloat(mapImage.width);
  return w_px * scrnPxSize;
}

Highlighting.csUnitToScrnPx = function(csu)
{
  return (parseFloat(mapImage.width) * csu) / MapTool.getMapExtRect().getWidth();
}

/*
Highlighting.getSRLayerName = function()
{
  return searchResultsPager.layerName;
}

Highlighting.getSRBranchName = function()
{
  return searchResultsPager.branchName;
}
*/

Highlighting.addGeometry = function(inp_d, branchName, layerName)
{
  //var smn = Highlighting.getSRBranchName(); //Dco.Identify.selectedMapName;
  //var srLn = Highlighting.getSRLayerName();
  var layer = LayerTree.root[branchName].getLayerByName(layerName);

  var svg_gt = null;
  if (layer.isTypePolygon() || layer.isTypeLine())
  {
    svg_gt = 'path';
  } else if (layer.isTypePoint()) {
    svg_gt = 'circle';
  }

  if (svg_gt == null) return;

  //var inp_d = inpGeomElem.getAttribute('d');

  /*
  var geomElem = document.createElementNS("http://www.w3.org/2000/svg", svg_gt);
  geomElem.setAttribute('xmlns', 'http://www.w3.org/2000/svg');

  var pstyle = layer.getSelStyle();

  if (svg_gt == 'path')
  {
    geomElem.setAttributeNS(null, 'd', inp_d);
  } else if (svg_gt == 'circle') {
    var m = inp_d.match(/^cx="(-?\d*\.?\d*)" cy="(-?\d*\.?\d*)"$/);
    if (m)
    {
      geomElem.setAttributeNS(null,'cx',m[1]);
      geomElem.setAttributeNS(null,'cy',m[2]);
      geomElem.setAttributeNS(null,'r',Highlighting.scrnPxToCSUnit(Math.ceil(pstyle.symbol_size / 2)));
    }
  }

  geomElem.setAttributeNS(null, 'fill', pstyle.fill ? pstyle.fill : 'none');
  geomElem.setAttributeNS(null, 'fill-opacity', pstyle.fill_opacity);
  if (pstyle.stroke)
  {
    geomElem.setAttributeNS(null, 'stroke',pstyle.stroke);
  }
  //geomElem.setAttributeNS(null, 'stroke-opacity', pstyle.stroke_opacity);
  geomElem.setAttributeNS(null, 'stroke-width', Highlighting.scrnPxToCSUnit(pstyle.stroke_width));

  geomElem.addEventListener('mouseover', Highlighting.hlByGeom, true);
  geomElem.addEventListener('mouseout', Highlighting.hlByGeom, true);

  var hlElem = Highlighting.getHLElem();

  hlElem.appendChild(geomElem);
  */

  /*
  var components = [];
  var inp_c = inp_d.split(/ ?M /);
  for (var c=0; c<inp_c.length; ++c)
  {
    var c_str = inp_c[c];
    if (c_str.length > 1)
    {
      var c_arr = inp_c[c].split(/ /);
      if (c_arr[0] == '')
      {
        c_arr.shift(); // remove first element if blank
      }
      if (c_arr[c_arr.length - 1] == 'Z')
      {
        c_arr.pop(); // remove last element if 'Z'
      }
      var c_out_arr = [];
      var x,y;
      for (var i=0; i<c_arr.length; ++i)
      {
        if (i % 2 == 0)
        {
          x = parseFloat(c_arr[i]);
	}
	else
	{
	  y = parseFloat(c_arr[i]) * -1.0;
	  c_out_arr.push(new OpenLayers.Geometry.Point(x,y));
	}
      }
      components.push(c_out_arr);
    }
  }
  */

  //var ord_arr = inp_d.split(/ *[M,Z ] */i);
  //if (ord_arr.length >= 5)
  //{
    /*
    var x, y;
    var pts = [];

    var num_coords = 0;
    for (var i=0; i<ord_arr.length; ++i)
    {
      var pathElem = ord_arr[i];
      if (pathElem == '' || pathElem == 'M')
      {
        continue;
      }

      if (++num_coords % 2 == 1)
      {
        x = parseFloat(pathElem);
      } else {
        y = parseFloat(pathElem) * -1.0;
        pts.push(new OpenLayers.Geometry.Point(x, y));
      }
    }
    */

    /*
    var ol_geomObj;
    if (layer.isTypePolygon())
    {
      var pgons = [];
      for (var i=0; i<components.length; ++i)
      {
        var lr = new OpenLayers.Geometry.LinearRing(components[i]);
        pgons.push(new OpenLayers.Geometry.Polygon([ lr ]));
      }
      ol_geomObj = new OpenLayers.Geometry.MultiPolygon(pgons);
    } else if (layer.isTypeLine()) {
      var ls = new OpenLayers.Geometry.LineString(pts);
      ol_geomObj = new OpenLayers.Geometry.MultiLineString([ ls ]);
    }
    */

    var ol_geomObj = OpenLayers.Geometry.fromWKT(inp_d);
    var f = new OpenLayers.Feature.Vector(ol_geomObj, null, { 'fillColor': 'transparent', 'fillOpacity': 0.0, 'strokeWidth': Highlighting.strokeWidth, 'strokeColor': Highlighting.strokeColor });
    Highlighting.hl_layer.addFeatures([f]);
  //}

  if (ol_mapObj && ol_mapObj.getLayersByName(Highlighting.elemId).length == 0)
  {
    ol_mapObj.addLayer(Highlighting.hl_layer);
  }

  //return geomElem;
}

Highlighting.elemHighlightEvent = function(e, row_id)
{
  var row_a = Highlighting.hlRowGeomPairs[row_id];
  var rowElem = row_a[0];
  var geomElem = document.getElementById(row_a[1].id);

  var ln = Highlighting.getSRLayerName();
  var pl = layerTree.getLayerByName(ln);
  var over = (e.type == 'mouseover');
  var nstyle = over ? pl.getHovStyle() : pl.getSelStyle();
  if (!Highlighting.vml)
  {
    geomElem.setAttributeNS(null, 'fill', nstyle.fill ? nstyle.fill : 'none');
    geomElem.setAttributeNS(null, 'fill-opacity', nstyle.fill_opacity);
    if (nstyle.stroke)
    {
      geomElem.setAttributeNS(null, 'stroke', nstyle.stroke);
    }
    //geomElem.setAttributeNS(null, 'stroke-opacity', nstyle.stroke_opacity);
    geomElem.setAttributeNS(null, 'stroke-width', Highlighting.scrnPxToCSUnit(nstyle.stroke_width)); 
  }

  rowElem.style.backgroundColor = over ? (nstyle.fill ? nstyle.fill : nstyle.stroke) : 'transparent';
}

/*
if (Highlighting.vml)
{
  Highlighting.elemHighlightEvent = function(e, row_id)
  {

  }
}
*/

Highlighting.hlByGeom = function(e)
{
  var geomElem = (e.target) ? e.target : e.srcElement;
  var row_id_a = geomElem.getAttributeNS(null,'id').match(/^geom_(\d+,\d+)$/);
  var row_id = row_id_a[1];
  Highlighting.elemHighlightEvent(e, row_id);
}

Highlighting.hlByTable = function(e)
{
  var rowElem = e.currentTarget ? e.currentTarget : e.srcElement;

  while(rowElem && rowElem.nodeName.toLowerCase() != 'table')
  {
    rowElem = rowElem.parentNode;
  }

  var row_id_a = rowElem.id.match(/^row_(\d+,\d+)$/);
  if (row_id_a)
  {
    var row_id = row_id_a[1];
    Highlighting.elemHighlightEvent(e, row_id);
  }
}

Highlighting.clear = function()
{
  Highlighting.hl_layer.destroyFeatures();
  Highlighting.hlRowGeomPairs = new Array();
}

