/* jQuery googleMap Copyright Dylan Verheul <dylan@dyve.net>
 * Licensed like jQuery, see http://docs.jquery.com/License
 */

var zindex = 1;
var markers = new Array();
var zoomNew = 0;

$.googleMap = {
	maps: {},
	marker: function(m) {
		if (!m) {
			return null;
		} else if (m.lat == null && m.lng == null) {
			return $.googleMap.marker($.googleMap.readFromGeo(m));
		} else {
            var markerObj = new Object();
            var markerIcon = new GIcon(G_DEFAULT_ICON);

            if (m.img && m.shd) {
                markerIcon.image = m.img;
                markerIcon.shadow = m.shd;
                markerIcon.iconSize = new GSize(20, 34);
	            markerIcon.shadowSize = new GSize(37, 34);
                set_zIndex(m.idx);
            }

            var markerOptions = { icon:markerIcon, zIndexProcess:get_zIndex};
            var marker = new GMarker(new GLatLng(m.lat, m.lng), markerOptions);

            markerObj.marker = marker;

            if (m.txt) {
				GEvent.addListener(marker, "click", function() {
    				marker.openInfoWindowHtml(m.txt);
  				});
                markerObj.infoWindow = m.txt;
            }

            if (m.zoom != "0") {
                zoomNew =m.zoom;
            }

            markers.push(markerObj);
            return marker;
		}
	},
	readFromGeo: function(elem) {
		var latElem = $(".latitude", elem)[0];
		var lngElem = $(".longitude", elem)[0];
        var txtElem = $(".text", elem)[0];
        var imgElem = $(".markerImg",elem)[0];
        var shdElem = $(".markerShd",elem)[0];
        var idxElem = $(".markerIdx",elem)[0];
        var zoomElem = $(".zoomMap",elem)[0];

        if (latElem && lngElem) {
            if (zoomElem) {
                return { lat:parseFloat($(latElem).attr("title")), lng:parseFloat($(lngElem).attr("title")), txt:$(txtElem).html(), img:$(imgElem).attr("title"), shd:$(shdElem).attr("title"), idx:$(idxElem).attr("title"), zoom:$(zoomElem).attr("title") }
            }
            else {
                return { lat:parseFloat($(latElem).attr("title")), lng:parseFloat($(lngElem).attr("title")), txt:$(txtElem).html(), img:$(imgElem).attr("title"), shd:$(shdElem).attr("title"), idx:$(idxElem).attr("title"), zoom:"0"}
            }            
		} else {
			return null;
		}
	},
	mapNum: 1
};

$.fn.googleMap = function(lat, lng, zoom, options) {

	// If we aren't supported, we're done
	if (!window.GBrowserIsCompatible || !GBrowserIsCompatible()) return this;

	// Default values make for easy debugging
	if (lat == null) lat = 40.396764;
	if (lng == null) lng = -3.713379;
	if (!zoom) zoom = 6;

	// Sanitize options
	if (!options || typeof options != 'object')	options = {};
	options.mapOptions = options.mapOptions || {};
	options.markers = options.markers || [];
	options.controls = options.controls || {};

	// Map all our elements
	return this.each(function() {
		// Make sure we have a valid id
		if (!this.id) this.id = "gMap" + $.googleMap.mapNum++;
		// Create a map and a shortcut to it at the same time
		var map = $.googleMap.maps[this.id] = new GMap2(this, options.mapOptions);
		// Center and zoom the map
       	map.setCenter(new GLatLng(lat, lng), zoom);
       	// Add controls to our map
       	for (var i = 0; i < options.controls.length; i++) {
	       	var c = options.controls[i];
	       	eval("map.addControl(new " + c + "());");
       	}
       	// If we have markers, put them on the map
       	var marker = null;
        var bounds = new GLatLngBounds();
        var i = 0;
        for (i; i < options.markers.length; i++) {
            if (marker = $.googleMap.marker(options.markers[i])) {
                map.addOverlay(marker);
                bounds.extend(marker.getPoint());
            }
        }
        if (i == 0){
            map.setCenter(new GLatLng(lat, lng), zoom);
        } else {
            map.setCenter(bounds.getCenter());
            if (zoomNew != 0) {
                map.setZoom(parseFloat(zoomNew));
            }
            else {
                map.setZoom(map.getBoundsZoomLevel(bounds));
            }
        }


    });

};

function createMarker(map, latlng, default_zoom) {
    var marker = new GMarker(new GLatLng(0,0), {draggable: true});

    GEvent.addListener(marker, "dragstart", function() {
        map.closeInfoWindow();
    });

    GEvent.addListener(marker, "dragend", function() {
        $("#coordY").val(marker.getLatLng().lat());
        $("#coordX").val(marker.getLatLng().lng());
    });

    map.addOverlay(marker);
    marker.setLatLng(latlng);
    map.setCenter(latlng, default_zoom);
    return marker;
}

function addMarker(point, overlay, map, default_zoom) {
    if (overlay) {
        if (overlay instanceof GMarker) {
            GEvent.trigger(overlay,"SingleRightClick");
        }
        else {
            if (point) {
                map.clearOverlays();
                marker = createMarker(map, map.fromContainerPixelToLatLng(point), default_zoom);
                $("#coordY").val(marker.getLatLng().lat());
                $("#coordX").val(marker.getLatLng().lng());
            }
        }
    }
}

function findcoord(map, lat, lng, default_zoom) {
    map.clearOverlays();
    marker = createMarker(map, new GLatLng(lat,lng), default_zoom);
    $("#coordY").val(marker.getLatLng().lat());
    $("#coordX").val(marker.getLatLng().lng());
}

function findDir(address, map, geocoder, default_zoom) {
    if (geocoder) {
        geocoder.getLatLng(address, function(latlng) {
            if (!latlng) {
              alert("Direccion no existe");
            } else {
              map.clearOverlays();
              marker = createMarker(map, latlng, default_zoom);
              $("#coordY").val(marker.getLatLng().lat());
              $("#coordX").val(marker.getLatLng().lng());
            }
        });
    }
}

function findGps(map, default_zoom, err_arr) {
    var latsign = 1;
    var lonsign = 1;
    var absglat = 0;
    var absglon = 0;
    var absmlat = 0;
    var absmlon = 0;
    var absslat = 0;
    var absslon = 0;
    var err = 0;

    latsign = $("#lat_gps_NS").val();
    coord_latg = $("#lat_gps_G").val();
    coord_latm = $("#lat_gps_M").val();
    coord_lats = $("#lat_gps_S").val();

    lonsign = $("#lng_gps_EW").val();
    coord_lngg = $("#lng_gps_G").val();
    coord_lngm = $("#lng_gps_M").val();
    coord_lngs = $("#lng_gps_S").val();

    if (coord_latg == "" && coord_latm == "" && coord_lats == "" && coord_lngg == "" && coord_lngm == "" && coord_lngs == "")
        err = 1;

    //Coordenadas de longitud
    if(coord_lngg < 0)
        lonsign = -1;

    absglon = Math.abs(Math.round(coord_lngg * 1000000.));  //integer
    absmlon = Math.abs(Math.round(coord_lngm * 1000000.));  //integer
    absslon = Math.abs(Math.round(coord_lngs * 1000000.));  //integer
    if((absglon > (180 * 1000000) || !absglon) && absglon != 0) {
        if (err == 0) {
            alert(err_arr[0]);
            $("#lng_gps_G").val("");
            err = 1;
        }
    }
    if(absmlon >= (60 * 1000000) || !absmlon) {
        if (err == 0) {
            alert(err_arr[1]);
            $("#lng_gps_M").val("");
            err = 1;
        }
    }
    if(absslon > (59.99999999 * 1000000) || !absslon) {
        if (err == 0) {
            alert(err_arr[2]);
            $("#lng_gps_S").val("");
            err = 1;
        }
    }
    //***********

    //Coordenadas de latitud
    if(coord_latg < 0)
        latsign = -1;

    absglat = Math.abs(Math.round(coord_latg * 1000000.));  //integer
    absmlat = Math.abs(Math.round(coord_latm * 1000000.));  //integer
    absslat = Math.abs(Math.round(coord_lats * 1000000.));	//integer

    if(absglat > (90 * 1000000) || !absglat) {
        if (err == 0) {
            alert(err_arr[3]);
            $("#lat_gps_G").val("");
            err = 1;
        }
    }
    if(absmlat >= (60 * 1000000) || !absmlat) {
        if (err == 0) {
            alert(err_arr[4]);
            $("#lat_gps_M").val("");
            err = 1;
        }
    }
    if(absslat > (59.99999999 * 1000000) || !absslat) {
        if (err == 0) {
            alert(err_arr[5]);
            $("#lat_gps_S").val("");
            err = 1;
        }
    }
    //***********

    if (err == 0) {

        lat = Math.round(absglat + (absmlat/60.) + (absslat/3600.) ) * latsign/1000000;
        lng = Math.round(absglon + (absmlon/60) + (absslon/3600) ) * lonsign/1000000;
        latsign=1;
        lonsign=1;

        map.clearOverlays();
        marker = createMarker(map, new GLatLng(lat,lng), default_zoom);
        $("#coordY").val(marker.getLatLng().lat());
        $("#coordX").val(marker.getLatLng().lng());
    }
}

function set_zIndex(value) {
    zindex = value;
}

function get_zIndex() {
    return zindex;
}


