// JavaScript Document

//Coordinate su cui viene centrata la mappa
var START_LAT=41.600000;
var START_LNG=13.252258;
//Coordinate STS
var STS_LAT=37.509726;
var STS_LNG=15.029297;

var GRAIN=7;
var isMarkerInfoWindowClosed=true;
var urlResult=null;
var iw=null;
var selectedTab=0;


var map=null;
var minimapControl=null;
var marker=null;
var geocoder=null;
var clickListener=null;


    function OnMapClickOver(overlay,position){
            if (marker && position && !(overlay instanceof GMarker)){
                marker.setLatLng(position);
                urlResult=null;
                map.panTo(position);
                UpdateCoordinate();
                GetPointSPs();
            }

    }

    function OnMapZoomEnd(oldL,newL){
        document.getElementById("zoom").value = newL;
    }

    function CheckMinimap() {
        if (minimapControl){
          var minimap = minimapControl.getOverviewMap();
          if (minimap) {
                  var gmType=map.getCurrentMapType();

                  minimap.setCenter(map.getCenter());
                  minimap.setMapType(gmType);
          } else {
            setTimeout("CheckMinimap();",100);
          }
        }
    }

    //function OnMaprDragStart(){
    //    marker.closeInfoWindow();
    //}

    function CreateMap(){
        //Crea la mappa visualizzandola nel blocco div omonimo
        map= new GMap2(document.getElementById("map"));
         //Coordinate iniziali su cui viene centrata la mappa

        MapHeight();

        var zoom=parseInt(document.getElementById("zoom").value);
        var lng=parseFloat(document.getElementById("lng").innerHTML);
        var lat=parseFloat(document.getElementById("lat").innerHTML);
        lng=isNaN(lng)?START_LNG:lng;
        lat=isNaN(lat)?START_LAT:lat;

        map.setCenter(new GLatLng(lat,lng), zoom);

        //Setta il tipo di mappa
        map.setMapType(G_HYBRID_MAP);
        //Attiva le funzionalitą di zoom
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();
        map.addMapType(G_PHYSICAL_MAP);
        //Aggiunta dei controlli alla mappa
        map.addControl(new GLargeMapControl());
        map.addControl(new GHierarchicalMapTypeControl()); //GMapTypeControl()
        map.addControl(new GScaleControl());

        minimapControl=new GOverviewMapControl(new GSize(160,160));
        
        map.addControl(minimapControl);

        iw=map.getInfoWindow();

        CheckMinimap();

        new GKeyboardHandler(map);

        clickListener=GEvent.bind(map, "click",this, OnMapClickOver);
        GEvent.bind(map, "zoomend", this,  OnMapZoomEnd);
        //GEvent.bind(map, "maptypechanged",this,CheckMinimap);
        //GEvent.bind(map, "dragstart",this,OnMaprDragStart);


    }

    function OnMarkerDragEnd(){
        urlResult=null;
        var position = marker.getPoint();
        map.panTo(position);
        UpdateCoordinate();
        GetPointSPs();
    }

    function OnMarkerDrag(){
        UpdateCoordinate();
    }

    function OnMarkerDragStart(){
        marker.closeInfoWindow();
    }

     function OnMarkerInfoWindowClose(){
         isMarkerInfoWindowClosed=true;

     }

     function OnMarkerInfoWindowBeforeclose(){
        selectedTab=iw.getSelectedTab();
     }

     function OnMarkerInfoWindowOpen(){
         //iw.selectTab(selectedTab);
         setTimeout("iw.selectTab(selectedTab);",2000);
     }

     function OnMouseOverMarker(){
         if (marker  && isMarkerInfoWindowClosed && urlResult)
                //GetPointSPs();
                OpenInfoWindow(urlResult);
     }

    function CreateMarker(){
        var lng=parseFloat(document.getElementById("lng").innerHTML);
        var lat=parseFloat(document.getElementById("lat").innerHTML);

        lng=isNaN(lng)?STS_LNG:lng;
        lat=isNaN(lat)?STS_LAT:lat;
        //Crea oggetto latlog
        var latlog=new GLatLng(lat,lng);
        //Crea il marker
        marker=new GMarker(latlog,{draggable: true});

        //Aggiunge il marker alla mappa
        map.addOverlay(marker);

        GEvent.bind(marker, "dragstart", this, OnMarkerDragStart);
        GEvent.bind(marker, "drag", this, OnMarkerDrag);
        GEvent.bind(marker, "dragend", this, OnMarkerDragEnd);
        GEvent.bind(marker, "infowindowclose", this, OnMarkerInfoWindowClose);
        GEvent.bind(marker, "infowindowopen", this, OnMarkerInfoWindowOpen);
        GEvent.bind(marker, "infowindowbeforeclose", this, OnMarkerInfoWindowBeforeclose);

        GEvent.bind(marker, "click", this, OnMouseOverMarker);

        //return latlog;
    }

    function OpenInfoWindow(msg){
        if (marker){
                var headerMin='<div><iframe frameborder="0" scrolling="no" width="400" height="200" src="';//340
                var trailerMin='">iframe non supportato dal browser</iframe></div>';
                //var minCon=headerMin+msg+trailerMin;
                //var maxCon='<div><iframe frameborder="0" width="650" height=500" src="'+msg+trailerMin;
                //marker.openInfoWindowHtml(minCon);
                var tabs=[
                        new GInfoWindowTab('Grafico',headerMin+msg+'&tab=0'+trailerMin),
                        new GInfoWindowTab('Tabella',headerMin+msg+'&tab=1'+trailerMin),
			new GInfoWindowTab('Info',headerMin+msg+'&tab=2'+trailerMin)                   
                ];
                marker.openInfoWindowTabsHtml(tabs);
                        
                //,{maxContent: maxCon ,maxTitle: "Parametri Spettrali"}
                isMarkerInfoWindowClosed=false;
        }
        
    }

    function UpdateCoordinate(){
        if(marker){
                var coordinate=marker.getLatLng();
                //Scrivo nel blocco div corripondente le coordinate
                //this.document.getElementById("message").innerHTML = latlog.toString();
                document.getElementById("lat").innerHTML = coordinate.lat().toFixed(GRAIN);
                document.getElementById("lng").innerHTML = coordinate.lng().toFixed(GRAIN);
        }

    }

    function CreateGeocoder(){
        geocoder=new GClientGeocoder();
	geocoder.setBaseCountryCode("it"); 
    }

    function RetriveAddress(address){
        if (geocoder) {
          geocoder.getLatLng(
            address,
            function(position) {
              if (!position) {
                alert("L'Indirizzo "+ address+ " non e' stato trovato! \nProvare ad aggiungere il codice postale.");
              } else {
                var maxZoom=map.getCurrentMapType().getMaximumResolution();
                map.setCenter(position, maxZoom-2);
                marker.setLatLng(position);
                urlResult=null;
                UpdateCoordinate();
                GetPointSPs();
              }
            }
          );
        }
    }

    function UpdateField(id,value){
        document.getElementById(id).innerHTML = value;
    }

    function EnableInput(enable){
            inputEnalbled=enable;
            document.getElementById("nominal_life").disabled=!enable;
            document.getElementById("utility_class").disabled=!enable;
            document.getElementById("cat_soil").disabled=!enable;
            document.getElementById("cat_topog").disabled=!enable;
            document.getElementById("smorz").disabled=!enable;
            document.getElementById("fact_struct").disabled=!enable;
            document.getElementById("addr").disabled=!enable;
            document.getElementById("find").disabled=!enable;

            if (enable){
                clickListener=GEvent.bind(map, "click",this, OnMapClickOver);
                marker.enableDragging();
            }else{
                GEvent.removeListener(clickListener);
                marker.disableDragging();
            }
    }

    function GetPointSPs(){
        var lng=document.getElementById("lng").innerHTML;
        var lat=document.getElementById("lat").innerHTML;
        var vn=document.getElementById("nominal_life").value;
        var cu=document.getElementById("utility_class").value;
        var ct=document.getElementById("cat_soil").value;

        var st=parseFloat(document.getElementById("cat_topog").value);

        var smorz=parseFloat(document.getElementById("smorz").value);

        var q=parseFloat(document.getElementById("fact_struct").value);

        var zoom=document.getElementById("zoom").value;


        var url='http://www.stsweb.it/phpscripts/STSWebApplication/compute.php';

        UpdateField("message",'<img src="img/testo.jpg">');

        EnableInput(false);



        GDownloadUrl(url, function(data){
                var xml=GXml.parse(data);

                var errors=xml.documentElement.getElementsByTagName("ERROR");

                if (errors==null){
                   alert('Errore del Server');
                   EnableInput(true);
                   return;
                }else{
                   EnableInput(true);
                   UpdateField("message",'<img src="img/testosts.jpg">');
                }

                var code=errors[0].getAttribute("code");

                switch (code){
                        case "1": alert('Coordinate non valide!'); return;
                        case "2": alert('Errore durante il calcolo!'); return;
                        default:;
                }

                var spss=xml.documentElement.getElementsByTagName("SPS");
                var l=spss.length;

                urlResult='http://www.stsweb.it/phpscripts/STSWebApplication/infoWindow.php?';
                    urlResult+='ct='+ct+'&st='+st.toString()+'&smorz='+smorz.toString()+'&q='+q.toString();

                for (var i = 0; i < l; i++){
                        var tr=spss[i].getAttribute("tr");
                        var ag=spss[i].getAttribute("ag");
                        var fo=spss[i].getAttribute("fo");
                        var tc=spss[i].getAttribute("tc");

                        id=i+1;
                        urlResult+='&tr'+id.toString()+'='+tr;
                        urlResult+='&ag'+id.toString()+'='+ag;
                        urlResult+='&fo'+id.toString()+'='+fo;
                        urlResult+='&tc'+id.toString()+'='+tc;
                }
                
                OpenInfoWindow(urlResult);

                //////////////////////////////

        },'lng='+lng+'&lat='+lat+'&vn='+vn+'&cu='+cu+'&ct='+ct+'&st='
                +st.toString()+'&smorz='+smorz.toString()+'&q='+q.toString()
                +'&zoom='+zoom);


    }

    function Result(){
                var tab=document.getElementById("tab").value;
                if (tab==0){
                  var id=0;


                  var ddt=4/500;
                  var np=500;

                  var d1 = [];
                  var d2 = [];
                  var d3 = [];
                  var d4 = [];
                  var d5 = [];

                  var ct=document.getElementById("cat_soil").value;

                  var st=parseFloat(document.getElementById("cat_topog").value);

                  var smorz=parseFloat(document.getElementById("smorz").value);

                  var q=parseFloat(document.getElementById("fact_struct").value);

                  for (var i = 0; i < 4; i++){
                          id=i+1;

                          var tr=parseFloat(document.getElementById("tr"+id.toString()).value);
                          var ag=parseFloat(document.getElementById("ag"+id.toString()).value);
                          var fo=parseFloat(document.getElementById("fo"+id.toString()).value);
                          var tc=parseFloat(document.getElementById("tc"+id.toString()).value);


                          for (var j=0;j<np;j++){
                              var x=j*ddt;
                              var y=f(tr,ag,fo,tc,x,ct,st,smorz,1)

                              switch (i){
                                  case 0: d1.push([x, y]); break;
                                  case 1: d2.push([x, y]); break;
                                  case 2:{
                                          d3.push([x, y]);
                                          if (q>1.0){
                                                  y=f(tr,ag,fo,tc,x,ct,st,smorz,q);
                                                  d5.push([x, y]);
                                          }
                                          break;
                                  }
                                  case 3: d4.push([x, y]); break;
                                  default:;
                              }

                          }
                  }

                  if (q>1.0){
                    $.plot($("#placeholder"), [
                            { label: "Operativit&aacute",  data: d1},
                            { label: "Danno",  data: d2},
                            { label: "Salvag. Vita",  data: d3},
                            { label: "Collasso",  data: d4},
                            { label: "Salvag. Vita Prog.",  data: d5}


                    ],
                           {
                            xaxis: { ticks: 8 },
                            yaxis: { ticks: 6}
                           }
                    );
                  }else{
                    $.plot($("#placeholder"), [
                            { label: "Operativit&aacute",  data: d1},
                            { label: "Danno",  data: d2},
                            { label: "Salvag. Vita",  data: d3},
                            { label: "Collasso",  data: d4}
                    ],
                           {
                            xaxis: { ticks: 8 },
                            yaxis: { ticks: 6}
                           }
                    );
                  }

                }

    }


    function onChangeSelectBox(){
        GetPointSPs();
    }




    function f(tr,ag,fo,tc,x,ct,st,smorz,q){
            var vertical=false;

            var cc;

            if (vertical){
                cc=1.0;
            }else{
                switch (ct){
                       case "2": cc=1.10 *Math.pow(tc,-0.20);break;
                       case "3": cc=1.05 *Math.pow(tc,-0.33);break;
                       case "4": cc=1.25 *Math.pow(tc,-0.50);break;
                       case "5": cc=1.15 *Math.pow(tc,-0.40);break;
                       default: cc=1.0;
                }
            }
            var newtc=vertical?0.15:tc*cc;

            var newtb=vertical?0.05:newtc/3;

            var newtd=vertical?1.0:4*ag+1.6;

            var fv=1.35*fo*Math.pow(ag,0.50);

            var ss;

            if (vertical){
                ss=1.0;
            }else{
                switch (ct){
                       case "2":{
                                ss=1.40-0.40*fo*ag;
                                if (ss<1)
                                        ss=1;
                                if (ss>1.2)
                                        ss=1.2;

                                break;
                       }
                       case "3":{
                                ss=1.70-0.60*fo*ag;
                                if (ss<1)
                                        ss=1;
                                if (ss>1.5)
                                        ss=1.5;
                                break;
                       }
                       case "4":{
                                ss=2.40-1.50*fo*ag;
                                if (ss<0.90)
                                        ss=0.90;
                                if (ss>1.8)
                                        ss=1.8;
                                break;
                       }
                       case "5":{
                                ss=2.00-1.10*fo*ag;
                                if (ss<1)
                                        ss=1;
                                if (ss>1.6)
                                        ss=1.6;
                                break;
                       }
                       default: ss=1.0;
                }
            }


            var s=ss*st;

            var eta=q>1?(1/q):(Math.sqrt(10/(5+smorz)));

            var ff=vertical?fv:fo;

            var y=ag*s*ff*eta;

            //Sostituito ff con fo
            if (x<=newtb)
                    y*=(x/newtb+1/(eta*fo)*(1-x/newtb));
            if ((x>newtb) && (x<=newtc))
                    y*=1;
            if ((x>newtc) && (x<=newtd))
                    y*=(newtc/x);
            if (x>newtd)
                    y*=(newtc*newtd/Math.pow(x,2));

            return y;

    }

    function load() {
      if (GBrowserIsCompatible()) {
        CreateMap();
        CreateMarker();
        CreateGeocoder();
        UpdateCoordinate();
        GetPointSPs();
      }else{
        alert('Google Maps č incompatibile con il browser utilizzato!')
      }

    }

    function Disclaimer(){
        var bW = screen.width;
        var bH = screen.height;
        var disW = 350;
        var disH = 350;

        var left = (bW-disW)/2;
        var top = (bH-disH)/2;

        window.open('disclaimer.html','popup','scrollbars=1,width=' + disW + ',height='+disH+',top='+top+',left='+left);
    }

   function MapHeight(){
        var heigthTop=document.getElementById("top").offsetHeight;
        var heigthBottom=document.getElementById("bottom").offsetHeight;
        var heightForm = document.formsps.offsetHeight;
        var mapHeight=heightForm-heigthTop-heigthBottom;

        if (mapHeight<350)
                mapHeight=350;

        document.getElementById("map").style.height=mapHeight-15+'px';

        if (map) {
                map.checkResize();
        }
   }

