//google.load("jquery", "1.3.1");
//google.load("jqueryui", "1.5.3");
google.load("earth", "1");


sattrack.vars = {
    "rightbar": {
        "expand": true
    },
    "fallbackcity" : "Copenhagen",
    settings : {
        coord : {}
    }
};

//Contains all Google Earth objects embedded in the viewer.
sattrack.vars.ge = {
  "initialized" : false  
};

google.setOnLoadCallback(function() {
    sattrack.instance.bootstrap();
    //Bootstrap page
});


function querySt(ji) {
hu = window.location.search.substring(1);
gy = hu.split("&");
for (i=0;i<gy.length;i++) {
ft = gy[i].split("=");
if (ft[0] == ji) {
return ft[1];
}
}
}


//Namespaced sattrack instance
sattrack.instance = function() {

    /*Internal Functions */
    function roundNumber(num, dec) {
        var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
        return result;
    }
    


    function toggleDescriptionExpand() {
        /*
        Expands the discription panel.
        */
        var stat = $("#status_super");
        var disc = {
            "handle": $("#description_handle"),
            "wrapper": $("#description_wrapper")
        };

        if (sattrack.vars.rightbar.expand) {
            sattrack.vars.rightbar.discorg = {};
            sattrack.vars.rightbar.discorg.htop = disc.handle.css("top");
            sattrack.vars.rightbar.discorg.wtop = disc.wrapper.css("top");
            sattrack.vars.rightbar.discorg.h = disc.wrapper.css("height");

            sattrack.vars.rightbar.discorg.maxheight = (parseInt(disc.wrapper.css("top"),10) - parseInt($("#status_wrapper").css("top"),10)) + disc.wrapper.height();


            sattrack.vars.rightbar.htop = $("#status_handle").css("top");
            sattrack.vars.rightbar.wtop = $("#status_wrapper").css("top");

            disc.handle.css("top", sattrack.vars.rightbar.htop);
            disc.wrapper.css("top", sattrack.vars.rightbar.wtop);

            disc.wrapper.css("height", $("#right").height() - 7);
            stat.hide();
            sattrack.vars.rightbar.expand = false;
            disc.handle.css("background-image", "url('/img/overview/handle_desc_contract.png')");
        }
        else {
            stat.show();

            disc.handle.css("top", sattrack.vars.rightbar.discorg.htop);
            disc.wrapper.css("top", sattrack.vars.rightbar.discorg.wtop)
            .css("height", sattrack.vars.rightbar.discorg.h);
            sattrack.vars.rightbar.expand = true;
            disc.handle.css("background-image", "url('/img/overview/handle_desc_expand.png')");
        }
    }

    /* Public Methods */
    return {
        bootstrap: function() {
            sattrack.getKML_URL_emb = sattrack.rooturl; // + "/overview";
            ge = null;
            pi = 3.14159265;
            radtodeg = 180.0 / pi;
            sattrack.usrline = false;
            // don't show user line as default
            sattrack.instance.getState();
            google.earth.createInstance("map3d", sattrack.ge.initCallback, sattrack.ge.failureCallback);
            sattrack.instance.minimize();
            var timer = setInterval("sattrack.instance.onPulse()", 10000);
            //Update stats
            sattrack.instance.eventHandlers();
        },
        onPulse: function() {
            sattrack.instance.getState();
        },
        eventHandlers: function() {
            $("#sat").change(function() {
                if ($(this).val() != "none") {
                    window.location = sattrack.getKML_URL_emb + "?sNumber=" + $(this).val();
                }
            });

            $(window).resize(function() {
                sattrack.instance.minimize();
            });

            $("div.satname").click(function() {
                //Find bird on GE.
                sattrack.ge.findSat();
            });
            $("#description_handle").click(function() {
                toggleDescriptionExpand();
            });


            // Show / Hide settings panel
            $("#show_settings").click(function() {
                $("#stat").hide();
                $("#settings").show();
            });
            
            $("#settings_done").click(function() {
                $("#settings").hide();
                $("#stat").show();
                updateSettings($("#options")[0]);
            });


            // Show / Hide settings panel
            $("#show_help").click(function() {
                $("#description").hide();
                $("#help").show();
            });
            
            $("#help_done").click(function() {
                $("#help").hide();
                $("#description").show();

            });


            $("#options").change(function() {updateSettings(this);});

            var updateSettings = function(parent) {
                  var options = ge.getOptions();
                  var form = parent;

                  // options.setStatusBarVisibility(form.statusbar.checked);
                  options.setGridVisibility(form.grid.checked);
                  // options.setOverviewMapVisibility(form.overview.checked);
                  // options.setScaleLegendVisibility(form.scaleLegend.checked);
                  options.setAtmosphereVisibility(form.atmosphere.checked);
                  // options.setMouseNavigationEnabled(form.mouseNav.checked);

                  if (form.nav.checked) {
                    ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);
                  } else {
                    ge.getNavigationControl().setVisibility(ge.VISIBILITY_HIDE);
                  } 
                  
                  if ($("#mylat").attr("value") != stats.loc.lat ) {
                      sattrack.vars.settings.coord.latitude = $("#mylat").attr("value");
                  }
                  if ($("#mylon").attr("value") != stats.loc.lon ) {
                      sattrack.vars.settings.coord.longitude = $("#mylon").attr("value");
                  }
                  sattrack.instance.getState();
            };
            

            $("#range").live("click",
            function() {

                //Draw line bewteen user and satellite on click
                if (sattrack.usrline) {
                    sattrack.ge.satUserLine(false);
                } else {
                    sattrack.ge.satUserLine(true);
                    sattrack.instance.getState();
                }
            });

            $("#sun").live("click",
            function() {

                sattrack.ge.toggleSun();
            });

            $("#horizon").live("click",
            function() {

                if (sattrack.locus) {
                    sattrack.ge.horizon(false);
                } else {
                    sattrack.ge.horizon(true);
                    sattrack.instance.getState();
                }
            });

            $("#expand").click(function() {
                if (sattrack.vars.minimize) {
                    sattrack.instance.mode("minimize", true);
                    
                } else {
                    sattrack.instance.mode("minimize", false);
                    sattrack.instance.getState();

                }

            });
        },
        minimize: function() {
            // if ($(window).width() < 1000) {
            //     sattrack.instance.mode("minimize", false);
            // } else {
            //     sattrack.instance.mode("minimize", true);
            // }
            if (true) {};
            
            
            if (querySt("zoom") == "true") {
                sattrack.instance.mode("minimize", false);
            } else {
            sattrack.instance.mode("minimize", true);
            }
            /* DO THIS NICELY....  

                Find some cool way to signal that the box can be expanded...

            */
            // if ($("#description_wrapper").height() < $("#description_wrapper")[0].scrollHeight) {
            //     $("#description_wrapper").css("overflow", "auto");
            // 
            // } else {
            //     $("#description_wrapper").css("overflow", "hidden");
            // 
            // }
        },
        mode: function(element, mode) {
            switch (element)
            {
            case "minimize":
                if (!mode) {
                    //Hide
                    $("#right").hide();
                    // Change full-screen icon
                    $("#expand").css("background-image", "url('/img/overview/handle_right_contract.png')");
                    $("#sat_selector").hide();
                    $("#map3d_container").width($(window).width() - 30)
                    .height($(window).height() - 30);
                    $("div.overview-02_").hide();
                    $("body").css("background-image", "none");
                    $("div.dtulogo").hide();
                    $("#left").css("top", "12px");
                    sattrack.vars.minimize = true;


                } else {
                    //Show
                    sattrack.ge.toggleLogo();
                    $("#right").show();
                    $("#expand").css("background-image", "url('/img/overview/handle_right_expand.png')");
                    $("div.overview-02_").show();
                    $("body").css("background-image", "url(/img/overview/overview_01.png)");
                    $("div.dtulogo").show();
                    $("#left").css("top", "134px");

                    sattrack.vars.minimize = false;
                    // Maximize area
                    var map = $("#map3d_container");
                    var right = $("#right");
                    map.width($(window).width() - (40 + right.width()));
                    $("#sat_selector").show();
                    map.height($(window).height() - (25 + parseInt($("#left").css("top"),10)));
                    $("#description_wrapper").height($(window).height() - (33 + parseInt($("#right").css("top"),10) + $("#status_super").height()));
                }
                break;
            }
        },
        getState: function() {
            if (sattrack.vars.settings.coord.latitude || sattrack.vars.settings.coord.longitude) {
                
                position = '{"lat" : "' + sattrack.vars.settings.coord.latitude + '", "lon" : "' + sattrack.vars.settings.coord.longitude + '"}';
                var pchange = true;

            } else 	if (google.loader.ClientLocation){
	                position = '{"lat" : "' + google.loader.ClientLocation.latitude + '", "lon" : "' + google.loader.ClientLocation.longitude + '"}';

	        }  else {
                position = '{"city" : "' + sattrack.vars.fallbackcity + '"}';  
            }
            
            
            $.getJSON(sattrack.rooturl + '/tracker/getStatistics',
            {
                position: position,
                sNumber: sattrack.sNumber
            },
            function(json) {
                stats = json;

				var ecl = (json.sat.eclipsed== "True") ? "Ja" : "Nej";
                var stat = '<table class="stats">' +
                "<tr><td title='Satellittens breddegrad.'>Breddegrad:</td><td class='data'>" + json.sat.slattitude + "</td></tr>" +
                "<tr><td titlke'Satellittens Længdegrad.'>Længdegrad:</td><td class='data'>" + json.sat.slongitude + "</td></tr>" +
                "<tr><td title='Satellittens hastighed relativ til Jorden'>Hastighed [km/s]:</td><td class='data'>" + roundNumber(json.sat.velocity /1000, 3) + "</td></tr>" +
                //"<tr><td>Right Ascension:</td><td class='data'>" + json.sat.ra + "</td></tr>"+
                //"<tr><td>Declination:</td><td class='data'>" + json.sat.dec + "</td></tr>"+
                //"<tr><td>Azimuth:</td><td class='data'>" + json.sat.az + "</td></tr>"+
                //"<tr><td>Altitude:</td><td class='data'>" + json.sat.alt + "</td></tr>"+
                "<tr><td class='feature' id='horizon' title='Satellittens højde over Jorden.  |  Klik for at vise fra hvilket område man kan se satellitten.'>Højde over Jorden [km]:</td><td class='data'>" + roundNumber(json.sat.elevation / 1000.0, 2) + "</td></tr>" +
                "<tr><td class='feature' id='range' title='Afstanden fra din estimerede position til satellitten  |  Klik for at tegne en linje mellem din position og satellitten.'>Afstand fra dig [km]:</td><td class='data'>" + roundNumber(json.sat.range / 1000, 0, 2) + "</td></tr>" +
                "<tr><td title='.'>Omløb pr dag:</td><td class='data'>" + roundNumber(json.sat.rev, 2) + "</td></tr>" +
                "<tr><td title=''>Omløb nr:</td><td class='data'>" + roundNumber(json.sat.orbit, 2) + "</td></tr>" +
                "<tr><td class='feature' id='sun' title='Befinder satellittens sig på den mørke side af Jorden  | Klik for at aktivere Dag/Nat skygge (BETA)'>I Jordens skygge?</td><td class='data'>" + ecl + "</td></tr>" +
                
                '</table>';
                $("#status").empty().append(stat);
                // Set name
                $("div.satname").empty().append(sattrack.prettyname);

                // if line between ser and bird is show, update:
                if (sattrack.usrline) {
                    sattrack.ge.satUserLine(true);
                }
                // if locus is shown, update:
                if (sattrack.locus) {
                    sattrack.ge.horizon(true);
                }

                // IF expanded add logo to GE.
                if (sattrack.vars.minimize) {
                    sattrack.ge.toggleLogo(true);
                } else {
                    sattrack.ge.toggleLogo(false);
                }
                if (pchange) {
                    sattrack.ge.findUser();
                };



            });
        }
    };
}();


//Google earth instance
sattrack.ge = function() {
    return {
        initCallback: function(object) {
            ge = object;
            ge.getWindow().setVisibility(true);

            google.earth.fetchKml(ge, sattrack.rooturl + "/tracker?sNumber=" + sattrack.sNumber, sattrack.ge.fetchKMLCallback);
            ginit = true;
        },
        fetchKMLCallback: function(object) {
            if (!object) {
                if (confirm("Ude af stand til at indsamle satellitdata, vil du prøve igen?")) window.location.reload();
                return;
            } else {
                sattrack.vars.ge.kml = object;
                ge.getFeatures().appendChild(sattrack.vars.ge.kml);
                sattrack.ge.findSat();
                sattrack.ge.findUser();
                //sattrack.ge.drawHorizon();
            }
        },
        findSat: function() {
            //Go to satellite once...
            if (typeof(stats) != "undefined") {
                //console.log(stats.sat.longitude * radtodeg+ "  " + stats.sat.lattitude * radtodeg);
                // look at the point 0.5 degrees (both latitude and longitude) away from the
                // current camera focus point
                
                var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
                lookAt.setLatitude(stats.sat.lattitude * radtodeg);
                lookAt.setLongitude(stats.sat.longitude * radtodeg);

                var ele = parseFloat(stats.sat.elevation);
                
                lookAt.setAltitude(ele);

                // lookAt.setRange(4000);
                
                ge.getView().setAbstractView(lookAt);

            }
        },
        findUser: function() {
            //Puts a pin in the location of the user
            // create icon style for the placemark
            
            if (sattrack.vars.ge.userloc) {
                ge.getFeatures().removeChild(sattrack.vars.ge.userloc);
            };
            
            var icon = ge.createIcon('');
            icon.setHref('http://maps.google.com/mapfiles/kml/paddle/red-circle.png');
            var style = ge.createStyle('');
            style.getIconStyle().setIcon(icon);

            // create a point geometry
            var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
            var point = ge.createPoint('');

            point.setLatitude(stats.loc.lat * radtodeg);
            point.setLongitude(stats.loc.lon * radtodeg);

            // create the point placemark and add it to Earth
            var pointPlacemark = ge.createPlacemark('');
            pointPlacemark.setName('Din Position');
			if (sattrack.vars.settings.coord.latitude || sattrack.vars.settings.coord.longitude){
                pointPlacemark.setDescription('Bruger-angivet position: <br>Breddegrad: ' + sattrack.vars.settings.coord.longitude + ' <br>Længdegrad: ' + sattrack.vars.settings.coord.latitude + '<br><br>Næste overflyvning:<br>Transit: ' + stats.sat.transit_time + '<br>Opgang: ' + stats.sat.rise_time + '<br>Nedgang: ' + stats.sat.set_time);
            
			} else if (google.loader.ClientLocation)   {
                pointPlacemark.setDescription('Du befinder dig i nærheden af: ' + google.loader.ClientLocation.address.city + ", " + google.loader.ClientLocation.address.country + '<br><br>Næste overflyvning:<br>Transit: ' + stats.sat.transit_time + '<br>Opgang: ' + stats.sat.rise_time + '<br>Nedgang: ' + stats.sat.set_time);
            
            } else {
                pointPlacemark.setDescription('Det var ikke muligt at bestemme din position.<br>Valgt by: ' + sattrack.vars.fallbackcity + '<br>Næste overflyvning:<br>Transit: ' + stats.sat.transit_time + '<br>Opgang: ' + stats.sat.rise_time + '<br>Nedgang: ' + stats.sat.set_time);
            }

            pointPlacemark.setGeometry(point);
            pointPlacemark.setStyleSelector(style);
            sattrack.vars.ge.userloc = pointPlacemark;
            ge.getFeatures().appendChild(sattrack.vars.ge.userloc);
            
            

            
            $("#mylat").attr("value", stats.loc.lat*radtodeg);
            $("#mylon").attr("value", stats.loc.lon*radtodeg);
            //delete by:
            // ge.getFeatures().removeChild(sattrack.vars.ge.userloc);

        },
        satUserLine: function(toggle) {
            if (toggle) {
                sattrack.usrline = true;
            } else if (!toggle) {
                sattrack.srline = false;
                if (sattrack.vars.ge.userline)
                ge.getFeatures().removeChild(sattrack.vars.ge.userline);
                return;
            }
            //Draws a line between the observer and the satellite
            var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
            lookAt.setLatitude(stats.sat.lattitude * radtodeg);
            lookAt.setLongitude(stats.sat.longitude * radtodeg);
            var lat = lookAt.getLatitude();
            var lng = lookAt.getLongitude();

            // first create inner and outer boundaries
            // outer boundary is a square
            var outerBoundary = ge.createLinearRing('');
            var coords = outerBoundary.getCoordinates();
            coords.pushLatLngAlt(lat, lng, 0);

//            coords.pushLatLngAlt(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude, 0);
            coords.pushLatLngAlt(stats.loc.lat * radtodeg,stats.loc.lon * radtodeg, 0);

            // create the polygon and set its boundaries
            var polygon = ge.createPolygon('');
            polygon.setOuterBoundary(outerBoundary);
            //polygon.getInnerBoundaries().appendChild(innerBoundary);
            // create the polygon placemark and add it to Earth
            var polygonPlacemark = ge.createPlacemark('');
            polygonPlacemark.setGeometry(polygon);
            if (sattrack.vars.ge.userline)
            ge.getFeatures().removeChild(sattrack.vars.ge.userline);
            ge.getFeatures().appendChild(polygonPlacemark);

            sattrack.vars.ge.userline = polygonPlacemark;

            if (!sattrack.vars.ge.userline.getStyleSelector()) {
                sattrack.vars.ge.userline.setStyleSelector(ge.createStyle(''));
            }

            var lineStyle =
            sattrack.vars.ge.userline.getStyleSelector().getLineStyle();
            lineStyle.setWidth(lineStyle.getWidth() + 2);
            var c = lineStyle.getColor();
            c.setA(255);
            c.setB(0);
            c.setG(0);
            c.setR(0);
        },
        failureCallback: function(object) {
            ginit = false;
            
            //alert("Google Earth failed to load, please try to reload the page.");
        },

        toggleSun: function() {
            //Toggle sun light and shadow
            if (ge.getSun().getVisibility()) {
                ge.getSun().setVisibility(false);
            } else {
                ge.getSun().setVisibility(true);
            }

        },
        toggleLogo: function(state) {
            // Show DTU Space logo.
            if (sattrack.vars.ge.logo && !state) {
                ge.getFeatures().removeChild(sattrack.vars.ge.logo);
                sattrack.vars.ge.logo = null;
                return;
            } else if (!ge || !state) {
                return;
            } else if (sattrack.vars.ge.logo && state) {
                return;
            }
            // Show embedded DTU Icon
            // create an image for the screen overlay
            var icon = ge.createIcon('');
            icon.setHref(sattrack.rooturl + '/img/dtuspace.png');

            // create the screen overlay
            sattrack.vars.ge.logo = ge.createScreenOverlay('');
            sattrack.vars.ge.logo.setIcon(icon);

            // Set the point inside the overlay that is used as the positioning
            // anchor point.
            sattrack.vars.ge.logo.getOverlayXY().setXUnits(ge.UNITS_FRACTION);
            sattrack.vars.ge.logo.getOverlayXY().setYUnits(ge.UNITS_FRACTION);
            sattrack.vars.ge.logo.getOverlayXY().setX(0);
            sattrack.vars.ge.logo.getOverlayXY().setY(1);

            sattrack.vars.ge.logo.getScreenXY().setXUnits(ge.UNITS_FRACTION);
            sattrack.vars.ge.logo.getScreenXY().setYUnits(ge.UNITS_FRACTION);
            sattrack.vars.ge.logo.getScreenXY().setX(0);
            sattrack.vars.ge.logo.getScreenXY().setY(1);


            // Set object's size in pixels.
            sattrack.vars.ge.logo.getSize().setXUnits(ge.UNITS_PIXELS);
            sattrack.vars.ge.logo.getSize().setYUnits(ge.UNITS_PIXELS);
            sattrack.vars.ge.logo.getSize().setX(286);
            sattrack.vars.ge.logo.getSize().setY(73);


            // add the screen overlay to Earth
            ge.getFeatures().appendChild(sattrack.vars.ge.logo);
        },
        horizon: function(toggle) {
            if (toggle) {
                sattrack.locus = true;
            } else if (!toggle) {
                if (sattrack.vars.ge.footprint)
                ge.getFeatures().removeChild(sattrack.vars.ge.footprint);
                sattrack.locus = false;
                return;
            }
            // Draw the circle indicating the area where it's possible to observe the satellite
            // The geometry is screwed at the poles... (need to implement proper circle function)
            function makeCircle(radius) {
                var center = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
                center.setLatitude(stats.sat.lattitude * radtodeg);
                center.setLongitude(stats.sat.longitude * radtodeg);
                var ring = ge.createLinearRing('');
                var steps = 40;
                var pi2 = Math.PI * 2.0;

                for (var i = 0; i < steps; i++) {
                    var lat = center.getLatitude() + radius * Math.cos(i / steps * pi2);
                    var lng = center.getLongitude() + radius * Math.sin(i / steps * pi2);
                    ring.getCoordinates().pushLatLngAlt(lat, lng, 0);
                }

                return ring;
            }

            // create the KmlPolygon and its outer boundary (a KmlLinearRing)
            var polygon = ge.createPolygon('');

            var radiusEarth = 6370.0;
            var elevationSat = stats.sat.elevation / 1000.0;
            //Kilde http://www.asc-csa.gc.ca/eng/educators/resources/orbital/activity_tracks_key.asp
            var d = radiusEarth * Math.tan(Math.acos(radiusEarth / (radiusEarth + elevationSat)));

            // HUSK AT RADIUS VIST ER EN UNDERLIG TING HER... kender ikke enhederne
            polygon.setOuterBoundary(makeCircle(0.01 * d));

            // create the polygon placemark and add it to Earth
            var polygonPlacemark = ge.createPlacemark('');
            polygonPlacemark.setGeometry(polygon);
            if (sattrack.vars.ge.footprint)
            ge.getFeatures().removeChild(sattrack.vars.ge.footprint);
            ge.getFeatures().appendChild(polygonPlacemark);


            // persist the placemark for other interactive samples
            // window.placemark = polygonPlacemark;
            sattrack.vars.ge.footprint = polygonPlacemark;

            if (!sattrack.vars.ge.footprint.getStyleSelector()) {
                sattrack.vars.ge.footprint.setStyleSelector(ge.createStyle(''));
            }

            var lineStyle =
            sattrack.vars.ge.footprint.getStyleSelector().getLineStyle();
            lineStyle.setWidth(lineStyle.getWidth());
            lineStyle.getColor().set('00000000');
            var polyColor =
            sattrack.vars.ge.footprint.getStyleSelector().getPolyStyle().getColor();
            polyColor.setA(180);
            polyColor.setB(0);
            polyColor.setG(0);
            polyColor.setR(60);

        }
    };
}();


// Google maps instance
sattrack.gm = function() {
    return {};
} ();

