/******************************************
 * (C) 20008 Istituto Geografico Milirare *
 * Tutti i diritti riservati.             *
 ******************************************/

var icon_size        = new OpenLayers.Size(24,24);
var icon_offset      = new OpenLayers.Pixel(-(icon_size.w/2), -(icon_size.h/2));
var icon_star_path   = '/ware/icons/star.png';

var wfs_url          = "/ware/igm_wfs.php?";

var icon_star = new OpenLayers.Icon(icon_star_path,icon_size,icon_offset);
	    
var map = 0;
var base_lay = 0;
var mark_lay = 0;
var wfs_lay  = 0;
var last_x = -1;
var last_y = -1;
var isdrag =  0;

function padint2( x )
{
         if(x == 0) return "00";
    else if(x < 10) return "0"+x;
    else            return     x;
}

function padint3( x )
{
         if(x == 0) return "000";
    else if(x < 10) return "00"+x;
    else if(x <100) return "0" +x;
    else            return      x;
}

function padint4( x )
{
         if(x ==  0) return "0000";
    else if(x <  10) return "000"+x;
    else if(x < 100) return "00" +x;
    else if(x <1000) return "0"  +x;
    else             return       x;
}

        // Sessadeci to sessegesi (stringa)
function sed2ses( x )
{
    var degreeChar = '\u00b0';

    x = x *180/3.1415926535897932384626433832795;
    var g  = Math.floor(x);
    var t1 = ( x-g)*60;
    var m  = Math.floor(t1);
    var t2 = (t1-m)*60;
    var s  = Math.floor(t2);
    return padint2(g)+ degreeChar +padint2(m)+"'"+padint2(s)+"''";
}

var gflati;
var gflongi;
var isdrag = 0;

function fitalia( NORD,EST )
{
  var CI  = 6399593.6259;
  var CIM = CI * 0.9985;
  var EPRIMOQ = 0.006739496775;

  var RY      = EST  - 7000000.0;
  var FIPRIMO = NORD / 6366197.0;
  var RNU     = CIM / Math.pow(1.0 + EPRIMOQ *
                      Math.pow(Math.cos(FIPRIMO),2),0.5);
  var RA1     = Math.sin(2 * FIPRIMO);
  var RA2     = RA1 * Math.pow(Math.cos(FIPRIMO),2);
  //var RA2     = RA1 * Math.pow(Math.cos(FIPRIMO),3);
  var RJEI2   = FIPRIMO + RA1 / 2.0;
  var RJEI4   = (3 * RJEI2 + RA2) / 4.0;
  var RJEI6   = (5 * RJEI4 + RA2 * Math.pow(Math.cos(FIPRIMO),2)) / 3.0;
  var RALFA   = EPRIMOQ * 3.0 / 4.0;
  var RBETA   = Math.pow(RALFA,2) * 5 /  3.0;
  var RGAMMA  = Math.pow(RALFA,3) * 35 / 27.0;
  var BFIPRIMO= CIM * (FIPRIMO - RALFA * RJEI2 + RBETA * RJEI4 -
                RGAMMA * RJEI6);
  var APICCOLA= RY / RNU;
  var BPICCOLA= (NORD - BFIPRIMO) / RNU;
  var RZETA   = EPRIMOQ * Math.pow(APICCOLA,2) *
                Math.pow( Math.cos(FIPRIMO),2 ) / 2.0;
  var RCSI    = APICCOLA * (1 - RZETA / 3);
  var RETA    = BPICCOLA * (1 - RZETA) + FIPRIMO;
  var DELTALONGI = Math.atan(((Math.exp(RCSI) - Math.exp(-RCSI)) / 2.0) /
                   Math.cos(RETA));
  var RTAU       = Math.atan(Math.cos(DELTALONGI) * Math.tan(RETA));

  gflati = FIPRIMO + (1 + EPRIMOQ * Math.pow(Math.cos(FIPRIMO),2) -
           1.5 * EPRIMOQ * Math.sin(FIPRIMO) * Math.cos(FIPRIMO) *
           (RTAU - FIPRIMO)) * (RTAU - FIPRIMO);
  gflongi = DELTALONGI + 0.2094395103;
}

var g_est  = 0;
var g_nord = 0;

function revfitalia(LATI,LONGI)
{
  var CI = 6399593.6259;
  var EPRIMOQ = 0.006739496775;
  var CENTER  = 12;
  var ORIGIN  = 7000000;
  var RIDU    = 0.9985;

  var DELTALONGI = LONGI - CENTER;
  LATI = LATI * Math.PI / 180;
  DELTALONGI = DELTALONGI * Math.PI / 180;

  var NU    = (CI * RIDU) / Math.sqrt(1 + EPRIMOQ * Math.pow(Math.cos(LATI),2));
  var ARGO1 = Math.cos(LATI) * Math.sin(DELTALONGI);
  var CSI   = (Math.log((1 + ARGO1) / (1 - ARGO1))) / 2;
  var ZETAG = EPRIMOQ * Math.pow(CSI,2) * Math.pow(Math.cos(LATI),2) / 2;
  var ETA   = Math.atan(Math.tan(LATI) / Math.cos(DELTALONGI)) - LATI;
  var ESTP  = CSI * NU * (1 + ZETAG / 3);

  g_est = ESTP + ORIGIN;

  var ALFA  = EPRIMOQ * 3 / 4;
  var BETA  = Math.pow(ALFA,2) * 5 / 3;
  var GAMMA = Math.pow(ALFA,3) * 35 / 27;
  var A101  = Math.sin(LATI) * Math.cos(LATI);
  var A102  = 2 * A101 * Math.pow(Math.cos(LATI),2);
  var JEI2  = LATI + A101;
  var JEI4  = (3 * JEI2 + A102) / 4;
  var JEI6  = (5 * JEI4 + A102 * ( Math.pow(Math.cos(LATI),2))) / 3;
  var BFI   = RIDU * CI * (LATI - ALFA * JEI2 + BETA * JEI4 - GAMMA * JEI6);

  g_nord = ETA * NU * (1 + ZETAG) + BFI;
}


function do_set_base(p)
{
	var params = new Object();
	params.MAP="mapserv.conf/" + p;
	base_lay.mergeNewParams(params);
}

function vai_a(x,y)
{
    var ll = new OpenLayers.LonLat(x,y);
    map.panTo(ll);

    mark_lay.clearMarkers();
    mark_lay.addMarker(new OpenLayers.Marker(ll.clone(),icon_star.clone()));
}

function do_coord( la,lo )
{
   revfitalia(la,lo);
   var ll = new OpenLayers.LonLat(g_est,g_nord);
   map.panTo(ll);
// gianna
    mark_lay.clearMarkers();
    mark_lay.addMarker(new OpenLayers.Marker(ll.clone(),icon_star.clone()));
   spatial_query(ll);
}

function do_evid(gid)
{
   var params = new Object();
   params.featureid = "catalogo.prodotto." + gid;
   wfs_lay.mergeNewParams(params);
}

function do_mousemove( lonlat )
{
    if(isdrag==0)
	{
	  fitalia(lonlat.lat,lonlat.lon);
          var f = parent.document.forms["squery_for"];
	  f.lon.value = sed2ses(gflongi);
	  f.lat.value = sed2ses(gflati);
	}
}

function do_mousedown( xy, lonlat )
{
    isdrag = 1;
    last_x = xy.x;
	last_y = xy.y;
}

function spatial_query( lonlat )
{
  var de = 50;	// TODO
  var f = parent.document.forms["squery_for"];

  f.lmask.value = parent.get_legend_mask();
  f.modo.value  = 1;	// modo click
  f.minx.value  = lonlat.lon-de;
  f.maxx.value  = lonlat.lon+de;
  f.miny.value  = lonlat.lat-de;
  f.maxy.value  = lonlat.lat+de;
  f.lonp.value  = lonlat.lon;
  f.latp.value  = lonlat.lat;
  f.submit();
}

function do_mouseup( xy, lonlat )
{
    isdrag = 0;
    if(xy.x == last_x && xy.y == last_y)
        spatial_query(lonlat);
}

function init()
{
  var bound = new OpenLayers.Bounds(6511228, 3977944, 7609228, 5257944);

  var map_options = {
    maxExtent:        bound,
    restrictedExtent: bound,
    tileSize: 256,
    numZoomLevels: 5,
    resolutions: [2000,1000,300,150,45],
    units: 'm',
    controls: []        // Cancello i controlli di default
  };
  map = new OpenLayers.Map('map',map_options);

  base_lay = new OpenLayers.Layer.MapServer(
    "base",
    "/cgi-bin/mapserv",
    {  MAP: 'mapserv.conf/ware_base.map' },
    {  tileSize: new OpenLayers.Size(256,256) }
  );

  base_lay.transitionEffect = "resize";

  wfs_lay = new OpenLayers.Layer.WFS("wfs", wfs_url,
  {
    'FEATUREID': 'catalogo.prodotto.-1',
    maxfeatures: '64'
  }, {ratio:1.25, minZoomLevel:0});

/*
  wfs_lay.preFeatureInsert= function(feature)
  {
    feature.style.fillOpacity="0.6";
    feature.style.strokeWidth="1";
    feature.style.strokeColor="black";  
  }
*/

  mark_lay = new OpenLayers.Layer.Markers( "Markers" );

  map.addLayers([base_lay,wfs_lay,mark_lay]);

  map.addControl(new OpenLayers.Control.PanZoomBar());
  map.addControl(new OpenLayers.Control.KeyboardDefaults());
  map.addControl(new OpenLayers.Control.MouseDefaults());


  var over_lay = new OpenLayers.Layer.Image(
    "base_over",
    "/ware/italia.png",
    bound,
    new OpenLayers.Size(100, 116)
  );
  over_lay.setIsBaseLayer(true);
  var option_map_over = {
    units: 'm',
    maxExtent: bound
  };
  var options_over = {
    layers:   [over_lay],
    size:     new OpenLayers.Size(100, 116),
    maxRatio: 10000000,
    minRectSize: 2,
    mapOptions: option_map_over
  };
  map.addControl(new OpenLayers.Control.OverviewMap(options_over));


  map.events.register("mousedown", map,
    function(e) { 
      var lonlat = map.getLonLatFromViewPortPx(e.xy);
      do_mousedown(e.xy,lonlat);
    }
  );

  map.events.register("mouseup", map,
    function(e) { 
      var lonlat = map.getLonLatFromViewPortPx(e.xy);
      do_mouseup(e.xy,lonlat);
    }
  );

  map.events.register("mousemove", map,
    function(e) { 
      var lonlat = map.getLonLatFromViewPortPx(e.xy);
      do_mousemove(lonlat);
    }
  );

  var fo = parent.document.forms["squery_for"];
  if(fo.startx.value!=0)
  {
    var ll = new OpenLayers.LonLat(fo.startx.value,fo.starty.value);
    map.setCenter(ll,3,false,true);
  } 
  else
  {
    map.zoomToMaxExtent();
  }
}

/*
function init_orig()
{
  wfs_lay.preFeatureInsert= function(feature)
  {
    feature.style.fillOpacity="0.6";
    feature.style.strokeWidth="1";
    feature.style.strokeColor="black";  
  }
  map.zoomToMaxExtent();
}
*/

