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

var pix_toll = 400;

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 icon_mira_path   = '/geodetica/icons/mirino.png';

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

//lucia
var num_layers = 3;
//var num_layers = 6;
//var layers_active = [false,true,true,true,false,false];
//var layers = ["trigonometrici","caposaldi","igm2","igm3","igm4","igm5"];
//var layers_str = "all";
var layers_active = [false,true,true];
var layers = ["trigonometrici","caposaldi","igm2 igm3 igm4 igm5"];
var layers_str = "caposaldi igm2 igm3 igm4 igm5";


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_legend_check(n){
    var i,f;

    layers_active[n] = ! layers_active[n];

    layers_str = "";
    f = true;
	//lucia
    for(i=0;i<num_layers;++i)
        if(layers_active[i]){
            if(f) f = false;
            else  layers_str += " ";
            layers_str += layers[i];
        }

    //window.alert(layers_str);
    var params = new Object();
    
    params.LAYERS=layers_str;
    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);
}

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

    mark2_lay.clearMarkers();
    mark2_lay.addMarker(new OpenLayers.Marker(ll.clone(),icon_mira.clone()));
}

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 i = 0;
   var layer_bm = 0;

    for(i=0;i<num_layers;++i)
	if(layers_active[i])
	    layer_bm |= (1<<i);

    var de =  map.getScale()/pix_toll;
    var f = parent.document.forms["lform"];
    f.layers.value = layer_bm;
    f.lon.value   = lonlat.lon;
    f.lat.value   = lonlat.lat;
    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.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 bound = new OpenLayers.Bounds(6514066, 3884917, 7604066, 5314917);
  var over_size = new OpenLayers.Size(69,80);

  var map_options = {
    maxExtent:        bound,
    restrictedExtent: bound,
    tileSize: 256,
    //numZoomLevels: 6,
    //resolutions: [2000,1000,300,150,45,10],
    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/igm95.map',
       //LAYERS: 'all' }, rocchini
       LAYERS: 'caposaldi igm2 igm3 igm4 igm5' }, //lucia
    {  tileSize: new OpenLayers.Size(256,256) }
  );
  base_lay.transitionEffect = 'resize';

  mark_lay  = new OpenLayers.Layer.Markers( "Stella" );
  mark2_lay = new OpenLayers.Layer.Markers( "Mirino" );

  map.addLayers([base_lay,mark_lay,mark2_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);
    }
  );

  map.zoomToMaxExtent();
}

