( function($) {
    var _capa_mapa;
    var _opciones;
    var _mapa;
    var _puntos = [];
    var _direction_service = new google.maps.DirectionsService();
    var _direction_display = new google.maps.DirectionsRenderer({
        suppressMarkers: true
    });
    var _ultimo_como_llegar = false;
    
    $.fn.gmaps = function(opciones, args) {
        _capa_mapa = this[0];
        
        if (typeof(opciones) == 'string') {
            return eval(opciones)(args);
        } else {
            _opciones_default = {
                    tipo_vista_mapa         : google.maps.MapTypeId.SATELLITE,
                    mostrar_street_view     : true,
                    scroll_raton_activado   : false,
                    zoom                    : 12,
                    centro                  : new google.maps.LatLng(40.463667, -3.74922),
                    scrollwheel             : false
            };
            _opciones = jQuery.extend(_opciones_default , opciones);
            init();
        }        
    }
    
    // Inicializamos mapa
    function init() {
        _mapa = new google.maps.Map(document.getElementById($(_capa_mapa).attr('id')), {
            mapTypeId           : _opciones.tipo_vista_mapa,
            streetViewControl   : _opciones.mostrar_street_view,
            scrollwheel         : _opciones.scrollwheel,
            zoom                : _opciones.zoom,
            center              : _opciones.centro,
            scrollwheel         : _opciones.scrollwheel
        });
        _direction_display.setMap(_mapa);
    }
    
    // Agregamos una marca en el array de marcas...
    function agregar_marca(opc) {
        var opc_default = {
            longitud        : '',
            latitud         : '',
            contenido_globo : '',
            icono           : ''
        };
        opc = jQuery.extend(opc_default, opc);
        _puntos.push(opc);
    }
        
    // Dibujamos los distintos puntos de interés
    function dibuja_marcas(opc) {
        $.map(_puntos, function(punto) {

             var marca = new google.maps.Marker({
                 position    : new google.maps.LatLng(punto.longitud, punto.latitud),
                 map         : _mapa,
                 icon        : punto.icono
             });
             
             if (punto.contenido_globo != '') {
                 var info_window = new google.maps.InfoWindow({ content: punto.contenido_globo });
                 google.maps.event.addListener(marca, 'click', function() {
                     info_window.close();
                     info_window = new google.maps.InfoWindow({ content: punto.contenido_globo });
                     info_window.open(_mapa, marca)
                 });
             }
        });
        
        try {
            if (opc.encuadrar) _encuadrar();
        } catch(error) {
            _encuadrar();
        }
        
    }
    
    // Colocamos el zoom justo para hacer caber todos los puntos
    function _encuadrar() {
        var bounds = new google.maps.LatLngBounds();
        $.map(_puntos, function(punto) {
           bounds.extend(new google.maps.LatLng(punto.longitud, punto.latitud)); 
        });
        _mapa.fitBounds(bounds);
    }
    
    // Trazamos una ruta de como llegar entre dos puntos
    function como_llegar(opc, tipo_ruta) {
        
        if (tipo_ruta == undefined) {
            // Si la distancia es inferior a 2 kilómetros, la ruta se calcula a pie. En caso
            // contrario se calcula en coche.
            if (opc.distancia < 2) var ruta = google.maps.DirectionsTravelMode.WALKING;
            else var ruta = google.maps.DirectionsTravelMode.DRIVING;            
        } else {
            ruta = tipo_ruta;
        }
        
        if (opc.indicador_ruta != undefined) {
            $(opc.indicador_ruta).show();
            $(opc.indicador_ruta).removeClass('tipo_ruta_pie');
            $(opc.indicador_ruta).removeClass('tipo_ruta_bus');
            $(opc.indicador_ruta).removeClass('tipo_ruta_coche');
            if (ruta == 'WALKING') {
                $(opc.indicador_ruta).addClass('tipo_ruta_pie');
            } else if (ruta == 'DRIVING') {
                $(opc.indicador_ruta).addClass('tipo_ruta_coche');
            } else {
                $(opc.indicador_ruta).addClass('tipo_ruta_bus');
            }
        }
        
        _ultimo_como_llegar = opc;
        
        var request = {
            origin              : new google.maps.LatLng(opc.origen.longitud, opc.origen.latitud), 
            destination         : new google.maps.LatLng(opc.destino.longitud, opc.destino.latitud),
            travelMode          : ruta,
            optimizeWaypoints   : true
        };
        
        // Realizamos la petición
        _direction_service.route(request, function(response, status) {
            if (status == google.maps.DirectionsStatus.OK) {
                _direction_display.setDirections(response);
                
                // Colocamos la información de como llegar...
                $(opc.ul_detalle).find('li').remove();
                var route = response.routes[0];
                $.map(route.legs[0].steps, function(instruccion) {
                    $('<li/>').html(instruccion.instructions + ' <span class="distancia">['+instruccion.distance.text+']</span>').appendTo(opc.ul_detalle);
                });
            }
        });
    }
    
    // De una ruta mostrada, cambiamos el tipo.
    function cambiar_tipo_ruta(tipo) {
        if (tipo == 0) { // Pie
            var ruta = google.maps.DirectionsTravelMode.WALKING;
        } else if (tipo == 1) { // Coche
            var ruta = google.maps.DirectionsTravelMode.DRIVING;
        }
        
        
        como_llegar(_ultimo_como_llegar, ruta);

    }
    
    
})(jQuery);
