/**
* @author Jorge Casas [jorgecasas@iternova.net]
* @version 1.1.4 - 20110527
* @package googlemaps 
**/

var gmarkers = [];
var gmaps = [];
var ginfowindow = [];
var gpolygon = [];
var gpolyline = [];
var gkmls = [];

/**
 * Abre bubble + streetview al clickar icono de listado externo
 * @param string markerID
 */
function sp_googlemaps_list_click(markerID){google.maps.event.trigger(gmarkers[markerID], "click");}
/**
 * Centra el mapa entorno a un marker
 */
function sp_googlemaps_center_marker(markerID, show_infowindow){icon = (typeof show_infowindow == 'undefined') ? false: show_infowindow;gmarkers[markerID].getMap().setCenter(gmarkers[markerID].getPosition());if(myPano!=undefined){myPano.setPosition(gmarkers[markerID].getPosition());};if(show_infowindow){if(active_infowindow){active_infowindow.close();}ginfowindow[markerID].open(gmarkers[markerID].getMap(),gmarkers[markerID]);active_infowindow = ginfowindow[markerID];}else{ginfowindow[markerID].close();}}
/**
 * Crea un marcador en el mapa
 */
function sp_googlemaps_create_marker(point, text, icon, markerID, direction, title, div){var marker = new google.maps.Marker({position: point,map: gmaps['map_'+div],icon: icon,title: title});gmarkers[markerID] = marker;infowindow_options = {content: text};infowindow = new google.maps.InfoWindow(infowindow_options);ginfowindow[markerID]=infowindow;google.maps.event.addListener(marker, 'click', function() {if(active_infowindow){active_infowindow.close();}infowindow.open(gmaps['map_'+div],marker);active_infowindow = infowindow;google.maps.event.addListener(gmaps['map_'+div],'click', function(event) {service.getPanoramaByLocation(event.latLng,50,function(result,status){if (status == google.maps.StreetViewStatus.OK) {myPano.setPosition(event.latLng);myPano.setVisible(true);}else{myPano.setVisible(false);}});});});}
/**
 * Mueve un marcador a una nueva posicion y lo crea si no existe
 */
function sp_googlemaps_move_marker(markerID,point,direction,title,text,icon,div){direction = (typeof direction == 'undefined') ? '': direction ;title = (typeof title == 'undefined') ? '': title ;text = (typeof text == 'undefined') ? '': text ;icon = (typeof icon == 'undefined') ? '': icon ;div = (typeof div == 'undefined') ? '': div ;if(gmarkers[markerID]==undefined){sp_googlemaps_create_marker(point,text,icon,markerID,direction,title,div);}else{gmarkers[markerID].setPosition(point);if(icon!='') gmarkers[markerID].setIcon(icon);	if(title!='') gmarkers[markerID].setTitle(title);if(text!='') ginfowindow[markerID].setContent(text);}}
/**
 * Actualiza un marcador en el mapa
 */
function sp_googlemaps_update_marker(marker,div){if(marker!=undefined && marker['lat']!=undefined){sp_googlemaps_move_marker(marker['markerID'],new google.maps.LatLng(marker['lat'],marker['lng']),marker['direction'],marker['title'],marker['text'],marker['img'],div);}}
/**
 * Oculta un marcador
 */
function sp_googlemaps_hide_marker(i){if(gmarkers[i]!=undefined){gmarkers[i].setVisible(false);}}
/**
 * Oculta varios marcadores pasandole un array con los ids 
 */
function sp_googlemaps_hide_marker_array(arraymarkers){	for(var x=0; x<arraymarkers.length; x++){sp_googlemaps_hide_marker(arraymarkers[x]);}}
/**
 * Muestra un marcador
 */
function sp_googlemaps_show_marker(i){if(gmarkers[i]!=undefined){gmarkers[i].setVisible(true);}}
/**
 * Muestra varios marcadores pasandole un array con los ids
 */
function sp_googlemaps_show_marker_array(arraymarkers){	for(var x=0; x<arraymarkers.length; x++){sp_googlemaps_show_marker(arraymarkers[x]);}}
/**
 * Elimina un marcador
 */
function sp_googlemaps_delete_marker(i){sp_googlemaps_hide_marker(i);delete gmarkers[i];}
/**
* Refresca un mapa moviendo los marcadores a las posiciones que se obtienen desde una url indicada
* Importante: hay que definir la variable arrayurl antes de la llamada a esta funcion
*/
function sp_googlemaps_refreshmap(div,step){if($('#'+div).length){sp_googlemaps_refreshmarkers(div,arrayurl);refreshId=setTimeout("sp_googlemaps_refreshmap('" + div + "','" + step + "')",step);}else{sp_googlemaps_stop_refresh();}}
/**
 * Iniciar el refresco de un mapa en el que se ha utilizado previamente la funcion sp_googlemaps_refreshmap
 */
function sp_googlemaps_start_refresh(div,step){sp_googlemaps_stop_refresh();sp_googlemaps_refreshmap(div,step);}
/**
 * Detiene el refresco de un mapa
 */
function sp_googlemaps_stop_refresh(){if(refreshId){clearTimeout(refreshId);}}
/**
* Mueve los marcadores de un mapa a las posiciones obtenidas desde una url que devuelve json
*/
function sp_googlemaps_refreshmarkers(div_id,arrayurl){if($(gmaps['map_positions']).length){for(var x=0; x<arrayurl.length; x++){var s = sp_ajax_get(arrayurl[x]);if(s!=undefined){var positions = JSON.parse(s);if(positions!=undefined){for(var y=0; y<positions.length; y++){sp_googlemaps_update_marker(positions[y],div_id);}}}}}}

/**
 * Crea poligono a partir de un array de markers
 */
function sp_googlemaps_polygon_create(div,polygonID,arraymarkers,color){
	var v = [];
	for(var x=0; x<arraymarkers.length; x++){
		v[x] = new google.maps.LatLng(arraymarkers[x]['lat'],arraymarkers[x]['lng']);
		sp_googlemaps_create_marker(v[x], '', sp_get_url()+'/core/googlemaps/images/blank.gif', 'polygonID_'+polygonID+'marker_'+x, 0, '', div);
	}
	gpolygon[polygonID] = new google.maps.Polygon({paths:v,strokeColor:color,strokeOpacity:0.9,strokeWeight:1,fillColor:color,fillOpacity:0.25});
	gpolygon[polygonID].setMap(gmaps['map_'+div]);
}

/**
 * Crea una polilinea a partir de un array de markers
 */
function sp_googlemaps_polyline_create(div,polylineID,arraymarkers,color){var v = [];for(var x=0; x<arraymarkers.length; x++){v[x] = new google.maps.LatLng(arraymarkers[x]['lat'],arraymarkers[x]['lng']);sp_googlemaps_update_marker(arraymarkers[x],div);}gpolyline[polylineID] = new google.maps.Polyline({path:v,strokeColor:color,strokeWeight:2,fillColor:color});gpolyline[polylineID].setMap(gmaps['map_'+div]);}
/**
* Redimensiona un mapa para adaptarlo a las dimensiones del contenedor
*/
function sp_googlemaps_resizemap(div_id){google.maps.event.trigger(gmaps['map_'+div_id], 'resize');}
/**
 * Redimensiona el StreetView para adaptarlo a las dimensiones del contenedor
 */
function sp_googlemaps_resizepano(){google.maps.event.trigger(myPano, 'resize');}
/**
* Actualiza el contenido de un tab dentro de un infowindow
*/
function sp_googlemaps_update_tab_content(markerID, tabID, content){
	var contenido = $(ginfowindow[markerID].getContent());
	$(contenido).find('div#'+tabID).html(content);
	ginfowindow[markerID].setContent('<div id="tabs_'+markerID+'">'+$(contenido).html()+'</div>');
}
/**
* Actualiza el contenido de un tab a partir de un json de markers
*/
function sp_googlemaps_update_tab_from_json(markerID, tabID, arrayurl){
	if(typeof arrayurl == 'object'){
		var content = '';
		for(var x=0; x<arrayurl.length; x++){
			var s = sp_ajax_get(arrayurl[x]);
			if(s!=undefined){
				var positions = JSON.parse(s);
				if(typeof positions == 'object'){
					for(var y=0; y<positions.length; y++){
						content+= positions[y]['text'];
					}
				}
			}
		}
		sp_googlemaps_update_tab_content(markerID, tabID, content);
	}
}
