﻿<?xml version="1.0" encoding="UTF-8" ?>
<Module>

 <ModulePrefs title="VolksNav(c) in Rocinha" 
             description="Rocinha can be the world\'s first slum with natural urban orientation"
              author="Henrique Koehler"
             author_email="volksnav@volksnav.de"
             screenshot= "http://www.volksnav.de/mapplet/SnapShot.jpg" 
             thumbnail="http://www.volksnav.de/mapplet/tn_smileyGrid.jpg"  
             height="150">

    <Require feature="sharedmap" />
    <Require feature="setprefs" />
  </ModulePrefs>
  
<UserPref  name="zoomState"   default_value="8"  datatype="hidden"/>

  <Content type="html">  <![CDATA[

    <script>

       var div1 = document.createElement('DIV');
       div1.innerHTML = '<h4>A Rocinha pode vir a ser a primeira favela do mundo a ter uma <br>orientação natural segundo www.VolksNav.com/Rocinha</h4>';
       var div2 = document.createElement('DIV');
       div2.innerHTML = '<h4>Endereços como p. ex. StatusQuo(c) RJO m7:10 r60 se baseiam no Cristo <br>e harmonizam com códigos de cruzamentos, pontos de parada, pontes etc.</h4>';
       var div3 = document.createElement('DIV');
       div3.innerHTML = '<h4>"m12" é a direção do Cristo pro norte, "m3" prá leste, etc.<br> Esse método divide a cidade em 12 setores "horarios". <br>Rocinha fica no setor m7.</h4>';
       var div4 = document.createElement('DIV');
       div4.innerHTML = '<h4>O raio é a distancia até o Cristo em passos de 100m.<br> "r60" significa 60 x 100m do Cristo</h4>';
       var div5 = document.createElement('DIV');
       div5.innerHTML = '<h4>Os setores são divididos em "minutos-horizonte". <br>A linha azul "m7:10" fica 10 x 100m "mais tarde" que a <br>direção "m7" que vai do Cristo em direcao Buenos Aires</h4>';
       var div6 = document.createElement('DIV');
       div6.innerHTML = '<h4>Cada cruzamento é o centro de um novo relogio, com o qual se pode numerar as casas.<br>P. ex. m7:14 r56 m10 r57 pode ser uma porta que se encontra a 57 metros<br>em direção m10 (sol poente) do cruzamento Gavea/Dionéia. </h4>';

       var tab1 = new GInfoWindowTab('Rocinha', div1);
 
       kenn="RJO"

       var poleLat= -( 22 + 57 / 60 + 6 / 3600);
      var poleLon= -(43  + 12 / 60 + 38 / 3600);
   
       var map = new GMap2();
      var position_marker = null;

         // UntenLinks
      var ullat = -(22 + 59/60 + 46/3600 ) ;   //  56 50 48
      var ullon = -(43 + 15/60 + 33/3600);  //  

      var centroLatIndoor = -(22 + 59/60 + 10/3600);   // 20
      var centroLonIndoor = -(43 + 15/60 + 1/3600);   //12  6
 
      var centro = new GLatLng(centroLatIndoor+0.003, centroLonIndoor+0.003);  
 
      map.setCenter(centro, 15);
//      map.setMapType(G_NORMAL_MAP);
        map.setMapType(G_SATELLITE_MAP);


        showTabs();
        overlayIndoor();

     var prefs = new _IG_Prefs(__MODULE_ID__);
     var message = document.getElementById("message");
 
          GEvent.addListener(map, "click", showPosition);

   function overlayIndoor(){

      var boundaries = new GLatLngBounds(new GLatLng(ullat,ullon), 
      new GLatLng(ullat+.0145 , ullon + .0215));// 16 15 14  // 24 23 22 21
      var oldmap = new GGroundOverlay("http://www.volksnav.de/Rocinha/Rocinha.png", boundaries);
      map.addOverlay(oldmap);
   }

     function resetCounter(){
       prefs.set("zoomState = ", 0);
       map.clearOverlays();
         zoom=12       
         drawGrid();
     }

     function incrementZoom() {
       var zoomState = prefs.getInt("zoomState");
       prefs.set("zoomState", zoomState + 1);

          map.clearOverlays();
          zoom=11
          drawGrid();
      }

function drawGrid () {

        overlayIndoor();

         var cosR =  Math.sin(poleLat*Math.atan(1) / 45)*Math.sin(poleLat * Math.atan(1) / 45) + Math.cos(poleLat*Math.atan(1) / 45)*Math.cos(poleLat * Math.atan(1) / 45) * Math.cos(( Math.atan(1) / 45));
         map.setCenter(centro, zoom);

           var points = [];
        for (var k = 1; k < 3; k++) {
 
         if(zoom < 11.5) {  var fator= 5  }//zoom/2.2  
         else {var fator=2} 

   var raioPeak = fator * k            //15;   //  15 km
   var Ry       = raioPeak /  111.18 
   var Rx       = raioPeak / ( 111.18 * Math.cos( poleLat * Math.atan(1) / 45)   )



           for (var i = 0; i < 73; i++) {
 
             var winkel= 360/72*Math.PI*i/180;
             var WoLat = poleLat + Ry * Math.cos(winkel);
             var WoLon = poleLon + Rx * Math.sin(winkel);
  
             points.push(new GLatLng(WoLat ,WoLon ));
           }
        }      // var k

    map.addOverlay(new GPolyline(points, "#ff0000", 2, 0.7));

   var raioPeak = fator * 3            //15;   //  15 km
   var radioy   = raioPeak /  111.18 
   var radiox   = raioPeak / ( 111.18 * Math.cos( poleLat * Math.atan(1) / 45)   )


   var polyline = new GPolyline([ new GLatLng(poleLat + radioy, poleLon),  new GLatLng(poleLat-radioy, poleLon) ], "#ff0000", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat + Math.sqrt(3)*radioy/2, poleLon + radiox/2), new GLatLng(poleLat - Math.sqrt(3)*radioy/2, poleLon - radiox/2) ], "#ff0000", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat + radioy/2, poleLon + radiox*0.866),new GLatLng(poleLat - radioy/2, poleLon - radiox*0.866) ], "#ff0000", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat , poleLon + radiox),new GLatLng(poleLat, poleLon-radiox)], "#ff0000", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy/2 , poleLon + radiox*.866),new GLatLng(poleLat+radioy/2 , poleLon - radiox*.866)], "#ff0000",1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy*.866 , poleLon + radiox*.5),new GLatLng(poleLat+radioy*.866 , poleLon - radiox*.5)], "#ff0000", 1, 1);   map.addOverlay(polyline);


   var polyline = new GPolyline([ new GLatLng(poleLat+ .96*radioy, poleLon+radiox*.5/3),new GLatLng(poleLat + Math.sqrt(3)*radioy/2/3, poleLon + radiox/2/3)   ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat+ .92*radioy, poleLon+radiox/3),new GLatLng(poleLat + Math.sqrt(3)*radioy/3, poleLon + radiox/3)   ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat - .96 *radioy, poleLon-radiox*.5/3),new GLatLng(poleLat - Math.sqrt(3)*radioy/2/3, poleLon - radiox/2/3)   ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat - .92 *radioy, poleLon-radiox/3),new GLatLng(poleLat - Math.sqrt(3)*radioy/3, poleLon - radiox/3)   ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy/6, poleLon+radiox*.866/3),new GLatLng(poleLat-radioy/6 , poleLon + radiox*.96)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy/3, poleLon+radiox*.866*2/3),new GLatLng(poleLat-radioy/3 , poleLon + radiox*.92)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat+radioy/6, poleLon-radiox*.866/3),new GLatLng(poleLat+radioy/6 , poleLon - radiox*.96)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat+radioy/3, poleLon-radiox*.866*2/3),new GLatLng(poleLat+radioy/3 , poleLon - radiox*.92)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat+ radioy/6, poleLon+radiox*.866/3),new GLatLng(poleLat + .76 * radioy, poleLon + radiox * 0.64) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat+ radioy/3, poleLon+radiox*2*.866/3),new GLatLng(poleLat + .65 * radioy, poleLon + radiox*0.77) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat- radioy/6, poleLon-radiox*.866/3),new GLatLng(poleLat - .76 *radioy, poleLon - radiox*0.64) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([ new GLatLng(poleLat- radioy/3, poleLon-radiox*2*.866/3),new GLatLng(poleLat - .65 * radioy, poleLon - radiox*0.77) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat, poleLon+radiox/3),new GLatLng(poleLat + radioy*.35, poleLon + radiox*.92) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat, poleLon+ 2* radiox / 3),new GLatLng(poleLat + radioy*.17, poleLon + radiox*.97) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat, poleLon - radiox/3),new GLatLng(poleLat - radioy*.35, poleLon - radiox*.93) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat, poleLon - 2* radiox / 3),new GLatLng(poleLat - radioy*.17, poleLon - radiox*.97) ], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy*.866/3, poleLon + radiox/6),new GLatLng(poleLat-radioy*.64 , poleLon + .76* radiox)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy*2*.866/3, poleLon + radiox/3),new GLatLng(poleLat-radioy*.77 , poleLon + .65 * radiox)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat+radioy*.866/3, poleLon - radiox/6),new GLatLng(poleLat+radioy*.64 , poleLon -  .76 * radiox )], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat+radioy*2*.866/3, poleLon - radiox/3),new GLatLng(poleLat+radioy*.77 , poleLon - .65 * radiox )], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy/3, poleLon),new GLatLng(poleLat-radioy*.93 , poleLon+radiox*.35)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat-radioy*2/3, poleLon),new GLatLng(poleLat-radioy*.97 , poleLon+radiox*.17)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat+radioy/3, poleLon),new GLatLng(poleLat+radioy * .93 , poleLon - radiox*.35)], "#0000ff", 1, 1);   map.addOverlay(polyline);
   var polyline = new GPolyline([new GLatLng(poleLat+radioy*2/3, poleLon),new GLatLng(poleLat+radioy * .97 , poleLon - radiox*.17)], "#0000ff", 1, 1);   map.addOverlay(polyline);

   var tinyIcon = new GIcon();

  if (zoom < 11.5) { tinyIcon.image = "http://www.volksnav.de/mapplet/r50.ico";}
  else  { tinyIcon.image = "http://www.volksnav.de/mapplet/r20.ico";}

   tinyIcon.iconSize = new GSize(25, 25);
   tinyIcon.iconAnchor = new GPoint(10, 10);

    var winkelR= 15*Math.PI/180;
    var WoLatR = poleLat - Ry * Math.cos(winkelR)/2;
    var WoLonR = poleLon - Rx * Math.sin(winkelR)/2;
    var pontoR = new GLatLng(WoLatR,WoLonR);

   map.addOverlay(new GMarker(pontoR, {icon:tinyIcon}));

   if(zoom < 11.5) {tinyIcon.image = "http://www.volksnav.de/mapplet/M25.ico";}
   else {tinyIcon.image = "http://www.volksnav.de/mapplet/M10.ico";}
   
    tinyIcon.iconSize = new GSize(25, 25);
   tinyIcon.iconAnchor = new GPoint(10, 10);

    var WoLatM = poleLat - Ry /1.5;
    var WoLonM = poleLon - Rx /4;
    var pontoM = new GLatLng(WoLatM,WoLonM);

   map.addOverlay(new GMarker(pontoM, {icon:tinyIcon}));

  }  // function drawGrid


function showTabs(){
       var tab2 = new GInfoWindowTab('endereço', div2);
       var tab3 = new GInfoWindowTab('setor/Hora', div3);
       var tab4 = new GInfoWindowTab('raio', div4);
       var tab5 = new GInfoWindowTab('minutos', div5);
       var tab6 = new GInfoWindowTab('house number', div6);

       map.openInfoWindowTabs(centro, [tab1, tab2,tab3, tab4, tab5, tab6])
}

function showPosition(marker, point) {

    if (typeof(point) == "undefined" || point == null) {  return;    }
    if (position_marker != null) { map.removeOverlay(position_marker); } 

        position_marker = new GMarker(point);

    var escala = 1111.8

   var cosR =  Math.sin(poleLat*Math.atan(1) / 45)*Math.sin(poleLat * Math.atan(1) / 45) + Math.cos(poleLat*Math.atan(1) / 45)*Math.cos(poleLat * Math.atan(1) / 45) * Math.cos(( Math.atan(1) / 45));
   var coordy = (point.lat().toString() - poleLat) * escala; 
   var coordx = (point.lng().toString() - poleLon) * Math.round(10*(Math.atan(-cosR / Math.sqrt(-cosR * cosR + 1)) + 2 * Math.atan(1))  * 45 * escala/ Math.atan(1) )/10 ;

   var  hipotenusa = Math.round( Math.sqrt(coordx * coordx + coordy * coordy) );
   var verhaeltnis = Math.abs(coordy)/Math.abs(coordx);

   if (verhaeltnis>=1.73 && coordx>0 && coordy>0) { HH=12; HM=Math.round(coordx); }
   else if (verhaeltnis < .577 && coordx>0 && coordy>0)  { HH=2; HM=Math.round( Math.abs(0.5 * coordx) - Math.abs(0.866 * coordy)); }
   else if (verhaeltnis<1.73 &&verhaeltnis>.577 && coordx>0 && coordy>0) { HH=1; HM=Math.round(Math.abs(0.866 * coordx) - Math.abs(0.5 * coordy)); }
   else if (verhaeltnis>=1.73 && coordx>0 && coordy<0) { HH=5; HM=Math.round(Math.abs(0.5 * coordy) - Math.abs(0.866 * coordx)); }
   else if (verhaeltnis<.577 && coordx>0 && coordy<0) { HH=3; HM=Math.round(Math.abs( coordy)); }
   else if (verhaeltnis<1.73 &&verhaeltnis>.577 && coordx>0 && coordy<0) { HH=4; HM=Math.round(Math.abs(0.866 * coordy) - Math.abs(0.5 * coordx)); }
   else if (verhaeltnis>=1.73 && coordx<0 && coordy<0) { HH=6; HM=Math.round(Math.abs(coordx)); }
   else if (verhaeltnis<.577 && coordx<0 && coordy<0) { HH=8; HM=Math.round(Math.abs(0.5 * coordx) - Math.abs(0.866 * coordy)); }
   else if (verhaeltnis<1.73 &&verhaeltnis>.577 && coordx<0 && coordy<0) { HH=7; HM=Math.round(Math.abs(0.866 * coordx) - Math.abs(0.5 * coordy)); }
   else if (verhaeltnis>=1.73 && coordx<0 && coordy>0) { HH=11; HM=Math.round(Math.abs(0.5 * coordy) - Math.abs(0.866 * coordx)); }
   else if (verhaeltnis<.577 && coordx<0 && coordy>0) { HH=9; HM=Math.round(Math.abs(coordy)); }
   else if (verhaeltnis<1.73 &&verhaeltnis>.577 && coordx<0 && coordy>0) { HH=10; HM=Math.round(Math.abs(0.866 * coordy) - Math.abs(0.5 * coordx)); }

    map.addOverlay(position_marker);

     if ( hipotenusa<= 100) {
         if ( HM > 0 && HM >= hipotenusa/2 && HH<12) { HH=HH+1; var posmsg = "StatusQuo(c) " + kenn + " m"+ HH + "   r" + hipotenusa + "<br>\n"; }
         else if ( (HM > 0 && HM >= hipotenusa/2) && (HH=12)) { HH=1; var posmsg = "StatusQuo(c) " + kenn + " m"+ HH + "   r" + hipotenusa + "<br>\n"; }
         else if ( HM > 0 && HM < hipotenusa/2) { var posmsg = "StatusQuo(c) "+ kenn +" m" + HH +  ":" + HM +"   r" + hipotenusa + "<br>\n"; }
         else if ( HM<1 ){ var posmsg = "StatusQuo(c) " + kenn + " m"+ HH + "   r" + hipotenusa + "<br>\n"; } 
     } 
     else if (hipotenusa >100) {
       var posmsg = "Raio maior que 10km! Nessa conversao simplificada, o<br>\n";
        posmsg += "código nao harmoniza com aparelhos de navegacao" ;
     }
          map.openInfoWindowHtml(point, posmsg);

}   // show position

    </script>
        <input type=button value="mostre grade r50/r100" onClick="incrementZoom();">
        <input type=button value="r20/r40" onClick="resetCounter();">
        <font size=-2>VolksNav.com/mapplet
        <br/n> <font size=3>
Clique em qualquer lugar do mapa para obter o CEP inteligente desse ponto.<font size=-1>(módo simplificado)<br/n>
A Convenção de Munique quantifica posiçoes em harmonia com a cartografia e aparelhos de navegacao. Detalhes veja o link acima.
Após alguns cliques no mapa em diversos níveis de zoom, clique no botoes e veja a primeira grade de localizacao zoomável sem limitacoes.   
        <div id="message" style="margin-top:1em"></span>
Exercicio: usando seu poder de imaginação, imagine a seguinte rota:  m1 r40  até   m5 r90<hr><font size=-2> Esse mapplet converte lat/lon 
a StatusQuo(c) de modo simplificado, toleravel até um raio de 10 km. Para conversoes profissionais, veja VolksNav.com/mapplet.
         <br>
Copyright 2009 VolksNav(c)  <a href="mailto:volksnav@volksnav.de">Henrique Koehler</a></font>

  ]]>
  </Content>
</Module>