﻿/******************************************************************************
*
*       implementación de tipos de RaceTracker
*
******************************************************************************/
function RaceTracker() { };

RaceTracker_ERROR = 2;
RaceTracker_WARN = 2;
RaceTracker_INFO = 1;
RaceTracker_DEBUG = 0;
RaceTracker_VERBOSE = -1;

RaceTracker_DebugLevel = RaceTracker_INFO;

function RaceTracker_log(sMiss, level) {

    if (level >= RaceTracker_DebugLevel) alert(sMiss);

}

function Popup(sURL) {
    try {
        sURL = sURL.replace("http://", "");
        sURL = "http://" + sURL;
        var v = window.open(sURL, "_sl", "");
    } catch (err) {
    }
}

function RaceTracker_dumpObject(o, tablevel, sPrefix) {
    var s = "";
    var tablevel_ = tablevel || 0;
    var sPrefix_ = sPrefix || "";

    for (var field in o) {
        for (var i = 0; i < tablevel_; i++)
            s += "   ";

        s += sPrefix_ + field + "=>";

        if (typeof (o[field]) == "object") {
            s += "\r\n" + RaceTracker_dumpObject(o[field], tablevel_ + 1, sPrefix_ + field + ".");
        } else {
            s += o[field] + "\r\n";
        }
    }
    return s;
}


function RaceTracker_maps() { };



/******************************************************************************
*
*       implementación de una capa de texto para GMaps
*
******************************************************************************/

function RaceTracker_maps_TextLayer(text, position, width, height, opt_anchor, opt_textsize, opt_fontweight, opt_color, opt_center) {
    this.text_ = text;
    this.position_ = position;
    this.width_ = width;
    this.height_ = height;
    this.anchor_ = opt_anchor || new google.maps.Point(0, 0);
    this.textsize_ = opt_textsize || 10;
    this.fontweight_ = opt_fontweight || "normal";
    this.color_ = opt_color || "#000000";
    this.center_ = opt_center || true;
    RaceTracker_log(RaceTracker_dumpObject(this), RaceTracker_VERBOSE);
}

function RaceTracker_maps_defineRaceTrackerTypes() {


    RaceTracker_maps_TextLayer.prototype = new GOverlay();

    RaceTracker_maps_TextLayer.prototype.initialize = function(map) {

        var div = document.createElement("div");
        div.style.border = "none";
        div.style.position = "absolute";
        div.style.fontSize = this.textsize_ + "px";
        div.style.fontWeight = this.fontweight_;
        div.style.color = this.color_;
        if (this.center_)
            div.style.textAlign = "center";

        div.innerHTML = this.text_;
        map.getPane(G_MAP_MARKER_PANE).appendChild(div);

        this.map_ = map;
        this.div_ = div;
    }

    RaceTracker_maps_TextLayer.prototype.remove = function() {
        this.div_.parentNode.removeChild(this.div_);
    }

    RaceTracker_maps_TextLayer.prototype.copy = function() {
        return new RaceTracker_maps_TextLayer(this.text_, this.position_, this.width_, this.height_, this.anchor_,
        this.textsize_, this.fontweight_, this.color_, this.center_);
    }

    RaceTracker_maps_TextLayer.prototype.redraw = function(force) {

        if (!force) return;

        var center = this.map_.fromLatLngToDivPixel(this.position_);

        // Now position our DIV based on the DIV coordinates of our bounds
        this.div_.style.width = this.width_ + "px";
        this.div_.style.height = this.height_ + "px";
        this.div_.style.left = (center.x + this.anchor_.x) + "px";
        this.div_.style.top = (center.y + this.anchor_.y) + "px";
    }
};


/******************************************************************************
*
*       Funciones comunes para google maps y google earth
*
******************************************************************************/

var tout = null;
var tout2 = null;
var retries = 0;
var retries2 = 0;

/******************************************************************************
*
*       Funciones para google maps
*
******************************************************************************/

var Layers2d = new Object();
var TiposCapasGMaps = new Object();

TiposCapasGMaps['Linea'] = "LINEA";
TiposCapasGMaps['Icono'] = "ICONO";
TiposCapasGMaps['Texto'] = "TEXTO";
TiposCapasGMaps['Panoramio'] = "PANORAMIO";


var map = null;
google.load("maps", "2")

function loadMapa(sIDElemento, sOptions) {

    //limpiaCapaHTML(sIDElemento);

    $().ready(function() { recursiveDelayedLoadMapa(sIDElemento, sOptions); });

}

///La carga del documento se produce antes que la de silverlight
function recursiveDelayedLoadMapa(sIDElemento, sOptions) {

    if (tout != null) clearTimeout(tout);

    if (document.getElementById(sIDElemento)) {
        map = new google.maps.Map2(document.getElementById(sIDElemento), sOptions);

        map.setCenter(new google.maps.LatLng(42.4419, 2.1419), 10);
        map.addMapType(G_PHYSICAL_MAP);
        map.setMapType(G_HYBRID_MAP);

        map.enableScrollWheelZoom();
        var mapControl = new google.maps.MapTypeControl();
        map.addControl(mapControl);
        var zoomControl = new google.maps.LargeMapControl();
        map.addControl(zoomControl);
        
        retries = 0;
        tout = null;
        RaceTracker_maps_defineRaceTrackerTypes();

    } else {
        if (retries++ < 40)
            tout = setTimeout("recursiveDelayedLoadMapa('" + sIDElemento + "','" + sOptions + "')", 200);
        //        else
        //            alert("Error cargando mapa, pruebe a recargar la página");
    }
}

function panMap2d(sParams) {
    RaceTracker_log(sParams, RaceTracker_VERBOSE);
    eval("var oParams = " + sParams + ";");
    RaceTracker_log(RaceTracker_dumpObject(oParams), RaceTracker_DEBUG);

    map.panTo(new google.maps.LatLng(oParams.Lat, oParams.Lng));

}

///Añade una capa al mapa.
///El nombre sirve para guardarla en la coleccion de capas para luego operar con ella por nombre
///tipo determina el tipo de la capa, de este parametreo depende el procesado de oParams 
///oParams son los datos específicos que necesita la capa del tipo que se va a generar
function addLayer2d(sName, sType, sParams) {
    RaceTracker_log(sName + "\r\n" + sType + "\r\n" + sParams, RaceTracker_VERBOSE);
    var overlay = null;

    switch (sType) {
        case TiposCapasGMaps.Linea:
            overlay = procesaPolyLine(sParams);
            //map.panTo(overlay.getVertex(Math.floor(overlay.getVertexCount() / 2)));
            break;
        case TiposCapasGMaps.Icono:
            overlay = procesaIcono(sParams);
            //map.panTo(overlay.getVertex(Math.floor(overlay.getVertexCount() / 2)));
            break;
        case TiposCapasGMaps.Texto:
            overlay = procesaTexto(sParams);
            break;
        case TiposCapasGMaps.Panoramio:
            overlay = new google.maps.Layer(sParams);
            break;
        default:
            break;
    }

    if (overlay != null) {
        Layers2d[sName] = overlay;
        map.addOverlay(overlay);
    }
}

///Elimina una capa del mapa
///sName es el nombre con que se ha guardado la capa en la colección de capas
function removeLayer2d(sName) {
    RaceTracker_log(sName, RaceTracker_VERBOSE);
    if (Layers2d[sName] != null) {
        try {
            map.removeOverlay(Layers2d[sName]);
        } catch (e) {
            ; //alert(e);
        }
        Layers2d[sName] = null;
    }
}

/// Procesa los parametros de entrada y devulve una capa de tipo polyline
/// sParams es un objecto json con la siguiente estructura:
/// Puntos: [{lat:number,lng:number}]
/// Color: color html:String
/// Weight: grueso de la linea:number
/// Opacity: transparencia de la linea:number
function procesaPolyLine(sParams) {
    RaceTracker_log(sParams, RaceTracker_VERBOSE);
    eval("var oParams=" + sParams + ";");
    RaceTracker_log(RaceTracker_dumpObject(oParams), RaceTracker_DEBUG);

    var poly = null;

    if (oParams.EncodedPoints && oParams.EncodedLevels) {
        //if (false){
        //alert(oParams.EncodedPoints + "\r\n" + oParams.EncodedLevels);
        poly = new google.maps.Polyline.fromEncoded({
            color: oParams.Color,
            weight: oParams.Weight,
            opacity: oParams.Opacity,
            points: oParams.EncodedPoints,
            levels: oParams.EncodedLevels,
            zoomFactor: 18,
            numLevels: 1
        });

    } else {

        var gPuntos = new Array();
        for (var i in oParams.Puntos) {
            gPuntos.push(new google.maps.LatLng(oParams.Puntos[i].lat.replace(",", "."), oParams.Puntos[i].lng.replace(",", ".")));
        }
        poly = new google.maps.Polyline(gPuntos, oParams.Color, oParams.Weight, oParams.Opacity);
        //        polylineEncoder = new PolylineEncoder();
        //        poly = polylineEncoder.dpEncodeToGPolyline(gPuntos, oParams.Color, oParams.Weight, oParams.Opacity);
        //        alert(oParams.EncodedPoints + "\r\n" + oParams.EncodedLevels);

    }

    return poly;
}

/// Procesa los parametros de entrada y devulve una capa de tipo Marker
/// sParams es un objecto json con la siguiente estructura:
/// icono: es un objeto con los parametros del icono
///     Icon.Image: ruta de la image:string
///     Icon.Shadow: ruta de la sombra de la iamgen
///     Icon.Size.Width: ancho del icono:number
///     Icon.Size.Height: alto del icono:number
///     Icon.Anchor.X: x del anchor del icono
///     Icon.Anchor.Y: y del anchor del icono
/// LatLng: es un objeto con la latitud y la longitud
///     LatLng.Lat: Latitud:number
///     LatLng.Lng: Longitud:number
function procesaIcono(sParams) {
    RaceTracker_log(sParams, RaceTracker_VERBOSE);
    eval("var oParams=" + sParams + ";");
    RaceTracker_log(RaceTracker_dumpObject(oParams), RaceTracker_DEBUG);

    var icono = new GIcon(G_DEFAULT_ICON);
    icono.image = oParams.Icon.Image;
    icono.shadow = oParams.Icon.Shadow;
    icono.iconSize = new google.maps.Size(oParams.Icon.Size.Width, oParams.Icon.Size.Height);
    //icono.shadowSize = new google.maps.Size(oParams.Icon.ShadowSize.Width, oParams.Icon.ShadowSize.Height);
    icono.iconAnchor = new google.maps.Point(oParams.Icon.Anchor.X, oParams.Icon.Anchor.Y);
    var markerOptions = { icon: icono };
    var marcador = new google.maps.Marker(new google.maps.LatLng(oParams.LatLng.Lat, oParams.LatLng.Lng), markerOptions);

    //alert(icono.bindInfoWindowHtml);
    if (oParams.Icon.Ballon != "") {
        google.maps.Event.addListener(marcador, "mouseover", function() {
            marcador.openInfoWindowHtml(oParams.Icon.Ballon);
            //marcador.openInfoWindowHtml("<span style=\"background-color:yellow\">manolo</span>");
        });
    }
    
    if (oParams.Icon.NavigateUri != "") {
        google.maps.Event.addListener(marcador, "click", function() {
            navigateTo(oParams.Icon.NavigateUri);
        });
    }

    return marcador;

}

function navigateTo(sUri) {
    var current = window.location + "";
    current = current.substring(0, current.lastIndexOf("/") + 1);
    current = current + sUri;
    window.location = current;
}

function procesaTexto(sParams) {
    RaceTracker_log(sParams, RaceTracker_VERBOSE);
    eval("var oParams = " + sParams + ";");
    RaceTracker_log(RaceTracker_dumpObject(oParams), RaceTracker_DEBUG);

    return new RaceTracker_maps_TextLayer(oParams.Text,
        new google.maps.LatLng(oParams.LatLng.Lat, oParams.LatLng.Lng), oParams.Size.Width, oParams.Size.Height,
        new google.maps.Point(oParams.Anchor.X, oParams.Anchor.Y), oParams.TextSize, oParams.FontWeight, oParams.Color, oParams.Center
        );

}

/******************************************************************************
*
*       Funciones para google earth
*
******************************************************************************/
var map3D = null;
google.load("earth", "1");

function loadMapa3D(sIDElemento, sOptions) {
    $().ready(function() { recursiveDelayedLoadMapa3D(sIDElemento, sOptions); });
}

function recursiveDelayedLoadMapa3D(sIDElemento, sOptions) {

    if (tout != null) clearTimeout(tout);

    if (document.getElementById(sIDElemento)) {

        google.earth.createInstance(sIDElemento, initCB, failureCB);

        retries = 0;
        tout = null;
    } else {
        if (retries++ < 40)
            tout = setTimeout("recursiveDelayedLoadMapa3D('" + sIDElemento + "','" + sOptions + "')", 200);
        //        else
        //            alert("Error cargando mapa, pruebe a recargar la página");
    }
}

function initCB(object) {
    map3D = object;
    map3D.getWindow().setVisibility(true);

    //    if (map3D != null) {
    //        var la = map3D.createLookAt('');
    //        la.set(41.2, 2.14, 10, map3D.ALTITUDE_RELATIVE_TO_GROUND,
    //               0, 0, 4000);
    //        map3D.getView().setAbstractView(la);
    //    }
}

function failureCB(object) {
    ; //alert('Error Loading map');
}

var CommonKMLLoaded = false;

function loadTour(sTourURL) {
    if (!map3D) {
        if (retries2 > 80) {
            //alert('Error loading map,');
            return;
        }
        retries2++;
        tout2 = setTimeout('loadTour("' + sTourURL + '")', 200);
        return;
    }
    retries2 = 0;
    clearTimeout(tout2);

    if (!CommonKMLLoaded) {
        loadCommonObjects("http://mds.liveRaceTracker.com/RaceTrackerMDS/globaltracks.kml");
        CommonKMLLoaded = true;
    }

    loadTourCallback(sTourURL);
}

function loadCommonObjects(sObjectsURL) {
    google.earth.fetchKml(map3D, sObjectsURL, function(kmlObject) {
        if (!kmlObject) {
            // wrap alerts in API callbacks and event handlers
            // in a setTimeout to prevent deadlock in some browsers
            setTimeout(function() {
                //alert('Bad or null KML.');
            }, 0);
            return;

        }
        map3D.getFeatures().appendChild(kmlObject);
    });
}

function loadTourCallback(sTourURL) {
    RaceTracker_log(sTourURL, RaceTracker_VERBOSE);

    //RaceTracker_log("El tour proporcionado por el sistema es " + sTourURL + "\r\nSe ha cambiado por uno estático para que puede ser accedido por google", RaceTracker_INFO);
    //window.open(sTourURL, "_Tour", "", true);

    //sTourURL = "http://adsl.diprotech.com:1863/e43dd992-eabc-4cb0-9f93-09edc33fcc81.kmz";

    map3D.getNavigationControl().setVisibility(map3D.VISIBILITY_AUTO);

    // add some layers
    map3D.getLayerRoot().enableLayerById(map3D.LAYER_BORDERS, true);
    map3D.getLayerRoot().enableLayerById(map3D.LAYER_ROADS, true);

    // create the tour by fetching it out of a KML file

    google.earth.fetchKml(map3D, sTourURL, function(kmlObject) {
        if (!kmlObject) {
            // wrap alerts in API callbacks and event handlers
            // in a setTimeout to prevent deadlock in some browsers
            setTimeout(function() {
                //alert('Bad or null KML.');
            }, 0);
            return;

        }

        tour = kmlObject;
        map3D.getFeatures().appendChild(tour);
        map3D.getTourPlayer().setTour(tour);
        //map3D.getTourPlayer().setTour(tour);
        //map3D.getTourPlayer().play();

    });

}


