// Controle do jBox
function setbox_handler(name, minx, miny, maxx, maxy, redraw) {
  document.mapserv.imgbox.value = minx + " " + miny + " " + maxx + " " + maxy;
  document.mapserv.imgxy.value = minx + " " + miny;
  verifica(document.mapserv);
  document.mapserv.submit();
  if (redraw) {
     document.mapserv.submit();
  }
}
function seterror_handler(message) {
  alert(message);
}

function setaimagem() {
  currentAction=document.mapserv.action.value;
  document[currentAction].src='/graphics/novo/'+[currentAction]+'_ativo.png';
  if (currentAction=='info') {
     document.mapserv.zoomdir.value=''
     document.mapserv.target='newmapserv';
     document.mapserv.mode.value='query'
  }
  else {
     document['info'].src='/graphics/novo/info.png';
  }
}

//Muda a imagem para botão pressionado
function mudaimagem(modo) {
  if (modo=='reload') {
     top.location.href='/';
  }
  currentAction=document.mapserv.action.value;
  document[currentAction].src='/graphics/novo/'+[currentAction]+'.png';
  document.mapserv.action.value=modo;
  document[modo].src='/graphics/novo/'+[modo]+'_ativo.png';
  if (modo=='info') {
     document.mapserv.zoomdir.value=''
     document.mapserv.target='newmapserv';
     document.mapserv.mode.value='query'
  }
}

// Abra uma nova janela se está em modo nquery
function verifica(form) {
   if (form.mode.value == "query") {
     window.open('carregando.html','newmapserv','dependent=no,status=no,width=785,height=460,scrollbars=auto,location=no,toolbar=no,resizable=yes,derectories=no,top=25,left=0');
   }
}   

// Monta o select dos tamanhos do mapa
function MapSize(size)	{  // constructor
   this.size = size;
}

var mapSize = new Array();
mapSize["464 X 348"] = new MapSize("464 348");
mapSize["500 X 375"]= new MapSize("500 375");
mapSize["600 X 450"] = new MapSize("600 450");
mapSize["700 X 525"] = new MapSize("700 525");
mapSize["800 X 600"] = new MapSize("800 600");

// Cria o select
function MapSize_place() {
   var s;
   for (name in mapSize) {
	s = "<option value='" + mapSize[name].size + "'";
	s+= (mapSize[name].size == (currMapSize)) ? " selected" : "";
	s+=  ">" + name;
	document.write(s);
   }
}

// Muda o foco para a janela principal
function janelaprincipal() {
  document.mapserv.target='_top';
  document.mapserv.mode.value=''; 
  return true;
}

function setazoomdir(valor) {
  janelaprincipal();
  document.mapserv.zoomdir.value=valor;
}

function resetaxy() {
  document.mapserv.imgxy.value="";
}

// Verifica escala para apresentacao do layer
function verificaescala(escala,item) {
  number=1000000;
  if (!item.checked) { return true; }
  escala=Math.round(escala);
  if (escala > number) {
     if (confirm('Este item será melhor visualizado com escala inferior à 1:1.000.000\nDeseja continuar mesmo assim?')) {
        mudaimagem('pan');
	setazoomdir(0);
        return true;
     }
     else {
        item.checked=false;
        return false;
     }
  }
  else { mudaimagem('pan'); setazoomdir(0); return true; }
}

function estadoinicial() {
  mudaimagem('info');
  setazoomdir(0);
  janelaprincipal();
}

function MM_showHideLayers() { //v3.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
    obj.visibility=v; }
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

/* 
    Calculo de LatLon Copyright 1997-1998 by Charles L. Taylor 
    Adaptações e conversão para graus, minutos e segundos by CIASC
*/
    var pi = 3.14159265358979;
    /* Ellipsoid model constants (actual values here are for WGS84) */
    var sm_a = 6378137.0;
    var sm_b = 6356752.314;
    var sm_EccSquared = 6.69437999013e-03;
    var UTMScaleFactor = 0.9996;

    // Converts degrees to radians.
    function DegToRad (deg) {
        return (deg / 180.0 * pi)
    }

    // Converts radians to degrees.
    function RadToDeg (rad) {
        return (rad / pi * 180.0)
    }

    /*
    * Computes the ellipsoidal distance from the equator to a point at a
    * given latitude.
    */
    function ArcLengthOfMeridian (phi) {
        var alpha, beta, gamma, delta, epsilon, n;
        var result;
        /* Precalculate n */
        n = (sm_a - sm_b) / (sm_a + sm_b);
        /* Precalculate alpha */
        alpha = ((sm_a + sm_b) / 2.0)
           * (1.0 + (Math.pow (n, 2.0) / 4.0) + (Math.pow (n, 4.0) / 64.0));
        /* Precalculate beta */
        beta = (-3.0 * n / 2.0) + (9.0 * Math.pow (n, 3.0) / 16.0)
           + (-3.0 * Math.pow (n, 5.0) / 32.0);
        /* Precalculate gamma */
        gamma = (15.0 * Math.pow (n, 2.0) / 16.0)
            + (-15.0 * Math.pow (n, 4.0) / 32.0);
        /* Precalculate delta */
        delta = (-35.0 * Math.pow (n, 3.0) / 48.0)
            + (105.0 * Math.pow (n, 5.0) / 256.0);
        /* Precalculate epsilon */
        epsilon = (315.0 * Math.pow (n, 4.0) / 512.0);
    	/* Now calculate the sum of the series and return */
	result = alpha
        * (phi + (beta * Math.sin (2.0 * phi))
            + (gamma * Math.sin (4.0 * phi))
            + (delta * Math.sin (6.0 * phi))
            + (epsilon * Math.sin (8.0 * phi)));
    	return result;
    }

    /*
    * Determines the central meridian for the given UTM zone.
    */
    function UTMCentralMeridian (zone) {
        var cmeridian;
        cmeridian = DegToRad (-183.0 + (zone * 6.0));
        return cmeridian;
    }

    /*
    * Computes the footpoint latitude for use in converting transverse
    * Mercator coordinates to ellipsoidal coordinates.
    */
    function FootpointLatitude (y) {
        var y_, alpha_, beta_, gamma_, delta_, epsilon_, n;
        var result;
        /* Precalculate n (Eq. 10.18) */
        n = (sm_a - sm_b) / (sm_a + sm_b);
        /* Precalculate alpha_ (Eq. 10.22) */
        /* (Same as alpha in Eq. 10.17) */
        alpha_ = ((sm_a + sm_b) / 2.0)
            * (1 + (Math.pow (n, 2.0) / 4) + (Math.pow (n, 4.0) / 64));
        /* Precalculate y_ (Eq. 10.23) */
        y_ = y / alpha_;
        /* Precalculate beta_ (Eq. 10.22) */
        beta_ = (3.0 * n / 2.0) + (-27.0 * Math.pow (n, 3.0) / 32.0)
            + (269.0 * Math.pow (n, 5.0) / 512.0);
        /* Precalculate gamma_ (Eq. 10.22) */
        gamma_ = (21.0 * Math.pow (n, 2.0) / 16.0)
            + (-55.0 * Math.pow (n, 4.0) / 32.0);
        /* Precalculate delta_ (Eq. 10.22) */
        delta_ = (151.0 * Math.pow (n, 3.0) / 96.0)
            + (-417.0 * Math.pow (n, 5.0) / 128.0);
        /* Precalculate epsilon_ (Eq. 10.22) */
        epsilon_ = (1097.0 * Math.pow (n, 4.0) / 512.0);
        /* Now calculate the sum of the series (Eq. 10.21) */
        result = y_ + (beta_ * Math.sin (2.0 * y_))
            + (gamma_ * Math.sin (4.0 * y_))
            + (delta_ * Math.sin (6.0 * y_))
            + (epsilon_ * Math.sin (8.0 * y_));
        return result;
    }
    
    /*
    * Converts x and y coordinates in the Transverse Mercator projection to
    * a latitude/longitude pair.  Note that Transverse Mercator is not
    * the same as UTM; a scale factor is required to convert between them.
    */
    function MapXYToLatLon (x, y, lambda0, philambda) {
        var phif, Nf, Nfpow, nuf2, ep2, tf, tf2, tf4, cf;
        var x1frac, x2frac, x3frac, x4frac, x5frac, x6frac, x7frac, x8frac;
        var x2poly, x3poly, x4poly, x5poly, x6poly, x7poly, x8poly;
        /* Get the value of phif, the footpoint latitude. */
        phif = FootpointLatitude (y);
        /* Precalculate ep2 */
        ep2 = (Math.pow (sm_a, 2.0) - Math.pow (sm_b, 2.0))
              / Math.pow (sm_b, 2.0);
        /* Precalculate cos (phif) */
        cf = Math.cos (phif);
        /* Precalculate nuf2 */
        nuf2 = ep2 * Math.pow (cf, 2.0);
        /* Precalculate Nf and initialize Nfpow */
        Nf = Math.pow (sm_a, 2.0) / (sm_b * Math.sqrt (1 + nuf2));
        Nfpow = Nf;
        /* Precalculate tf */
        tf = Math.tan (phif);
        tf2 = tf * tf;
        tf4 = tf2 * tf2;
        /* Precalculate fractional coefficients for x**n in the equations
           below to simplify the expressions for latitude and longitude. */
        x1frac = 1.0 / (Nfpow * cf);
        Nfpow *= Nf;   /* now equals Nf**2) */
        x2frac = tf / (2.0 * Nfpow);
        Nfpow *= Nf;   /* now equals Nf**3) */
        x3frac = 1.0 / (6.0 * Nfpow * cf);
        Nfpow *= Nf;   /* now equals Nf**4) */
        x4frac = tf / (24.0 * Nfpow);
        Nfpow *= Nf;   /* now equals Nf**5) */
        x5frac = 1.0 / (120.0 * Nfpow * cf);
        Nfpow *= Nf;   /* now equals Nf**6) */
        x6frac = tf / (720.0 * Nfpow);
        Nfpow *= Nf;   /* now equals Nf**7) */
        x7frac = 1.0 / (5040.0 * Nfpow * cf);
        Nfpow *= Nf;   /* now equals Nf**8) */
        x8frac = tf / (40320.0 * Nfpow);
        /* Precalculate polynomial coefficients for x**n.
           -- x**1 does not have a polynomial coefficient. */
        x2poly = -1.0 - nuf2;
        x3poly = -1.0 - 2 * tf2 - nuf2;
        x4poly = 5.0 + 3.0 * tf2 + 6.0 * nuf2 - 6.0 * tf2 * nuf2
        	- 3.0 * (nuf2 *nuf2) - 9.0 * tf2 * (nuf2 * nuf2);
        x5poly = 5.0 + 28.0 * tf2 + 24.0 * tf4 + 6.0 * nuf2 + 8.0 * tf2 * nuf2;
        x6poly = -61.0 - 90.0 * tf2 - 45.0 * tf4 - 107.0 * nuf2
        	+ 162.0 * tf2 * nuf2;
        x7poly = -61.0 - 662.0 * tf2 - 1320.0 * tf4 - 720.0 * (tf4 * tf2);
        x8poly = 1385.0 + 3633.0 * tf2 + 4095.0 * tf4 + 1575 * (tf4 * tf2);
        // Calculate latitude
        philambda[0] = phif + x2frac * x2poly * (x * x)
        	+ x4frac * x4poly * Math.pow (x, 4.0)
        	+ x6frac * x6poly * Math.pow (x, 6.0)
        	+ x8frac * x8poly * Math.pow (x, 8.0);
        	
        // Calculate longitude
        philambda[1] = lambda0 + x1frac * x
        	+ x3frac * x3poly * Math.pow (x, 3.0)
        	+ x5frac * x5poly * Math.pow (x, 5.0)
        	+ x7frac * x7poly * Math.pow (x, 7.0);
        return;
    }

    /*
    * Converts x and y coordinates in the Universal Transverse Mercator
    * projection to a latitude/longitude pair.
    */
    function UTMXYToLatLon (x, y, zone, southhemi, latlon) {
        var cmeridian;
        x -= 500000.0;
        x /= UTMScaleFactor;
        /* If in southern hemisphere, adjust y accordingly. */
        if (southhemi)
        y -= 10000000.0;
        y /= UTMScaleFactor;
        cmeridian = UTMCentralMeridian (zone);
        MapXYToLatLon (x, y, cmeridian, latlon);
        return;
    }
    
    /*
    * Called when the btnToGeographic button is clicked.
    * Adaptado por CIASC
    */
    function btnToGeographic_OnClick (x,y) {                                  
        latlon = new Array(2);
        minutos = new Array(2);
        segundos = new Array(2);
        zone=22; 
        southhemi = true;

        x=parseFloat(x);
        y=parseFloat(y);
        UTMXYToLatLon (x, y, zone, southhemi, latlon);
       
        latlon[0]=RadToDeg (latlon[0]);
        latlon[1]=RadToDeg (latlon[1]);
  
        minutos[0]=latlon[0] % 1;
        minutos[0]=minutos[0]*-60;
        segundos[0]=minutos[0] % 1;
        segundos[0]=segundos[0]*60;
	
        minutos[1]=latlon[1] % 1;
        minutos[1]=minutos[1]*-60;
        segundos[1]=minutos[1] % 1;
        segundos[1]=segundos[1]*60;

	latlon[0]=parseInt(latlon[0]);
	latlon[1]=parseInt(latlon[1]);
	minutos[0]=parseInt(minutos[0]);
	segundos[0]=parseInt(segundos[0]);
	minutos[1]=parseInt(minutos[1]);
	segundos[1]=parseInt(segundos[1]);

	if (minutos[0]<10) minutos[0]='0'+minutos[0];
	if (minutos[1]<10) minutos[1]='0'+minutos[1];
	if (segundos[0]<10) segundos[0]='0'+segundos[0];
        if (segundos[1]<10) segundos[1]='0'+segundos[1];

        window.status=' Latitude: '+latlon[0]+'° '+minutos[0]+'´ '+segundos[0]+'´´   Longitude: '+latlon[1]+'° '+minutos[1]+'´ '+segundos[1]+'´´';
    }
