var geocoder = null;
var map = null;
var smallMap = false;

function initialize(latitude, longitude) {
	/*var textFiles = [
		"/google_files/layers/cgd.txt",
		"/google_files/layers/campo_pequeno.txt",
	  	"/google_files/layers/restaurantes.txt"
	];*/

	//parameters for tinyIcon function
	//Electronics freaks  know the numbering scheme
	var icons = ["black","brown","red","orange","yellow","green","blue","purple","gray","white"];
	
	//preload loop
	for(var color in icons){
		tinyImage(icons[color], true);
	}

	
	/**
	* GMap2.showBounds() method. Fit bounds to viewport with paddings.
	* @ author Esa 2008
	* @ param bounds_ GLatLngBounds()
	* @ param opt_options Optional options object {top, right, bottom, left, save}
	*/
	GMap2.prototype.showBounds = function(bounds_, opt_options){
		var opts = opt_options||{};
		opts.top = opt_options.top*1||0;
		opts.left = opt_options.left*1||0;
		opts.bottom = opt_options.bottom*1||0;
		opts.right = opt_options.right*1||0;
		opts.save = opt_options.save||true;
		opts.disableSetCenter = opt_options.disableSetCenter||false;
		var ty = this.getCurrentMapType();
		var port = this.getSize();
		if(!opts.disableSetCenter){
	 		var virtualPort = new GSize(port.width - opts.left - opts.right, port.height - opts.top - opts.bottom);
	   		this.setZoom(ty.getBoundsZoomLevel(bounds_, virtualPort));
	   		var xOffs = (opts.left - opts.right)/2;
	   		var yOffs = (opts.top - opts.bottom)/2;
	   		var bPxCenter = this.fromLatLngToDivPixel(bounds_.getCenter());
	   		var newCenter = this.fromDivPixelToLatLng(new GPoint(bPxCenter.x-xOffs, bPxCenter.y-yOffs));
	   		this.setCenter(newCenter);
	   		if(opts.save)this.savePosition();
		}
	  	var portBounds = new GLatLngBounds();
		portBounds.extend(this.fromContainerPixelToLatLng(new GPoint(opts.left, port.height-opts.bottom)));
		portBounds.extend(this.fromContainerPixelToLatLng(new GPoint(port.width-opts.right, opts.top)));
		return portBounds;
	}

	/**
	* parseCsv()
	* @return an array of GLatLng() objects
	* @param opt_options object {lat, lng} integers defining the csv cells of coordinates (default: {lat:1, lng:0})
	* @author Esa 2008
	*/
	String.prototype.parseCsv = function(opt_options){
		var results = [];
	  	var opts = opt_options||{};
	  	var iLat = opts.lat||1;
	  	var iLng = opts.lng||0;
	  	var lines = this.split("\n");
	  	for (var i=0; i<lines.length; i++) {
	    	var blocks = lines[i].split('"');
	    	//finding commas inside quotes. Replace them with '::::'
	    	for(var j=0;j<blocks.length;j++){
	      		if(j%2){
	        		blocks[j]=blocks[j].replace(/,/g,'::::');
	      		}
	    	}  //@author Esa 2008, keep this note.
	    	lines[i] = blocks.join("");
	    	var lineArray = lines[i].split(",");
	    	var lat = parseFloat(lineArray[iLat]);
	    	var lng = parseFloat(lineArray[iLng]);
	    	var point = new GLatLng(lat,lng);
	    	//after splitting by commas, we put hidden ones back
	    	for(var cell in lineArray){
	      		lineArray[cell] = lineArray[cell].replace(/::::/g,',');
	    	} //corrupted line step-over
	    	if(!isNaN(lat+lng)){
	     		point.textArray = lineArray;
	     		 results.push(point);
	    	}
		}
	 	return results;
	}

	if (GBrowserIsCompatible()) {
       	map = new GMap2(document.getElementById("map_canvas"));

    	if(latitude != "" && latitude != "0.0" && longitude != "" && longitude != "0.0" && latitude != undefined && longitude != undefined){
			var center = new GLatLng(latitude, longitude);
    		map.setCenter(center, 14);
    	}else{
	        var center = new GLatLng(38.7098930392604, -9.135475158691406);
	        map.setCenter(center, 6);
    	}

		var latLong = center.toString();
		try{latLong = latLong.replace("(", "");}catch(e){}
		try{latLong = latLong.replace(")", "");}catch(e){}
	  	lat = Trim(latLong.substring(0, latLong.indexOf(",")));
		long = Trim(latLong.substring(latLong.indexOf(",") + 1, latLong.length));   

   		try{document.getElementById("coordinates").innerHTML = "<span class='txtAzul'>Latitude:</span> " + lat + " <span class='txtAzul'>Longitude:</span> " + long;}catch(e){}
       	try{document.getElementById("coordenadas").value = center.toString();}catch(e){}       		
   		try{convertCoordinates(center.toString());}catch(e){}
        
		//Tipo de mapa
		//map.setMapType(G_NORMAL_MAP);
		//map.setMapType(G_SATELLITE_MAP);
		map.setMapType(G_HYBRID_MAP);
		//map.setMapType(G_DEFAULT_MAP_TYPES);
			
		//Para impedir que se possa arrastar o mapa
		//map.disableDragging();
		
		//Botões para deslocação no mapa
       	//map.addControl(new GSmallMapControl());       	
       	objGLargeMapControl = new GLargeMapControl();
       	map.addControl(objGLargeMapControl);
		
		//Botões para escolha do tipo de mapa
		objGMapTypeControl = new GMapTypeControl();
       	map.addControl(objGMapTypeControl);
		
		//Inicialização da pesquisa por endereço
		geocoder = new GClientGeocoder();

		if(smallMap){
			map.removeControl(objGLargeMapControl);
    	   	map.removeControl(objGMapTypeControl);
       		map.addControl(new GSmallMapControl());       	
   			var marker = new GMarker(center);
   			map.addOverlay(marker);
       	}else{		
			//Eventos para mover o marcador
			initializeMarker(map, center, true);
		}

   	}
}

function tinyImage(opt_color, opt_preload){
	var color = opt_color||"red";
	var src_ = "http://labs.google.com/ridefinder/images/mm_20_"+color+".png";
	if(opt_preload){
   		var preImage = new Image();
   		preImage.src = src_;
	}
	return  src_;
}  

function showAddress(address, zoom) {
	var zoom_size = parseInt(zoom);
	if (geocoder) {
    	geocoder.getLatLng(
       		address,
       		function(point) {
         		if (!point) {
           		//	alert("Lamentamos mas ainda não definimos as coordenadas de localização no mapa.\nIremos fazê-lo logo que possível. Por favor volte mais tarde.");
         		} else {
           			map.setCenter(point, zoom_size);
           			map.clearOverlays();
					initializeMarker(map, point, true);
         		}
       		}
     	);
	}
}

function initializeMarker(map, center, bolshowmarker) {
	var marker = new GMarker(center, {draggable: false});
	
	

	GEvent.addListener(marker, "dragstart", function() {
		map.closeInfoWindow();
		try{document.getElementById("message").innerHTML = "<b>Detectámos a alteração da localização.</b> As novas coordenadas serão guardadas quando gravar. Certifique-se que o marcador se encontra sobre a localização pretendida antes de gravar.";}catch(e){}
		try{document.getElementById("guarda_coordenadas").value = true;}catch(e){}
	});

	GEvent.addListener(marker, "dragend", function() {
   		var latLong = marker.getLatLng().toString();
		try{latLong = latLong.replace("(", "");}catch(e){}
		try{latLong = latLong.replace(")", "");}catch(e){}
	  	lat = Trim(latLong.substring(0, latLong.indexOf(",")));
		long = Trim(latLong.substring(latLong.indexOf(",") + 1, latLong.length));   
	
   		try{document.getElementById("coordinates").innerHTML = "<span class='txtAzul'>Latitude:</span> " + lat + " <span class='txtAzul'>Longitude:</span> " + long;}catch(e){}
   		try{document.getElementById("coordenadas").value = marker.getLatLng();}catch(e){}       		
   		try{convertCoordinates(marker.getLatLng().toString());}catch(e){}
   		
   		try{
	   		if(document.getElementById("marker_content").value != ""){	   		
	   			marker.openInfoWindowHtml(document.getElementById("marker_content").value);
   			}
   		}catch(e){}
	});
	if(bolshowmarker){
		map.addOverlay(marker);
	}
	
	try{
   		if(document.getElementById("marker_content").value != ""){	   		
   			marker.openInfoWindowHtml(document.getElementById("marker_content").value);
		}
	}catch(e){}
}

/////////////////////////////////////////////////////////////

/* Written by Sparky Spider (http://sparkyspider.blogspot.com/2006/12/javascript-object-convert-from-dms-to.html) */
function Coordinates() {
	// Properties

	this._latitude = 0;
	this._longitude = 0;
 
	this.LATITUDE = 0;
	this.LONGITUDE = 1;
	 
	// Constuctor
 
 	this.latitude = new DMSCalculator(this.LATITUDE, this);
 	this.longitude = new DMSCalculator(this.LONGITUDE, this);
 
 	// Methods
 
 	this.setLatitude = function setLatitude(lat) {
  		this._latitude = lat;
 	};
 
 	this.setLongitude = function setLongitude(lng) {
  		this._longitude = lng;
 	}  
 
 	this.getLatitude = function getLatitude() {
  		return this._latitude;
 	}

 	this.getLongitude = function getLongitude() {
  		return this._longitude;
 	}	
 
	// SubClasses
     
 	function DMSCalculator (coordSet, object) {
		var degrees = new Array (0, 0);
		var minutes = new Array (0, 0);
		var seconds = new Array (0, 0);
		var direction = new Array (' ', ' ');
		var lastValue = new Array (0, 0);
	  	var hundredths = new Array (0.0, 0.0);
  
		var calc = function calc(object) {
	   		var val = 0;
	  
	   		if (coordSet == object.LATITUDE) {
	    		val = object._latitude;
	   		} else {
	    		val = object._longitude;
	   		}
	   
	   		if (lastValue[coordSet] != val) {
	    
	    		lastValue[coordSet] = val;
	    
	    		if (val > 0) {
	     			direction[coordSet] = (coordSet == object.LATITUDE)?'N':'E';
	    		} else {
	     			direction[coordSet] = (coordSet == object.LATITUDE)?'S':'W';
	    		}
	    		val = Math.abs(val);
	    		degrees[coordSet] = parseInt (val);
	    		var leftover = (val - degrees[coordSet]) * 60;
	    		minutes[coordSet] = parseInt (leftover)
	    		leftover = (leftover - minutes[coordSet]) * 60;
	    		seconds[coordSet] = parseInt (leftover)
	    		hundredths[coordSet] = parseInt ((leftover - seconds[coordSet]) * 100);
	    
	   		}
  		}
     
  		this.getDegrees = function getDegrees() {
   			calc(object);
   			return degrees[coordSet];
  		}
  
  		this.getMinutes = function getMinutes() {
   			calc(object);
   			return minutes[coordSet];     
  		}
  
  		this.getSeconds = function getSeconds() {
   			calc(object);
   			return seconds[coordSet];     
  		}
   
  		this.getDirection = function getDirection() {
   			calc(object);
   			return direction[coordSet];       
  		}
  
  		this.getHundredths = function getHundredths() {
   			calc(object);
   			return hundredths[coordSet];
  		}
  
  		this.getSecondsDecimal = function getSecondsDecimal() {
   			calc(object);
   			return seconds[coordSet] + (hundredths[coordSet] / 100);
  		}
  
  		this.setDMS = function setDMS (degrees, minutes, seconds, direction) {
   			var val = degrees + (minutes / 60) + (seconds / 3600);
   			if (direction == 'W' || direction == 'S') {
    			val *=-1;
   			}
   			if (coordSet == object.LATITUDE) {
   	 			object._latitude = val;
   			} else {
    			object._longitude = val;
   			} 
  		} 
	} 
} 

function convertCoordinates(latLong) {
	var coords = new Coordinates();
  	//coords.longitude.setDMS(33, 46, 16.68, 'S');
  	//coords.latitude.setDMS(18, 44, 24.19, 'E');
  	//alert (coords.getLatitude() + ' ' + coords.getLongitude());

  	//coords.setLatitude (-33.7713);
  	//coords.setLongitude (18.7400527778);
  
	try{latLong = latLong.replace("(", "");}catch(e){}
	try{latLong = latLong.replace(")", "");}catch(e){}
  	lat = Trim(latLong.substring(0, latLong.indexOf(",")));
	long = Trim(latLong.substring(latLong.indexOf(",") + 1, latLong.length));   

    coords.setLatitude (lat);
  	coords.setLongitude (long);
  
  	DMSStringLat = coords.latitude.getDegrees() + ' ' + coords.latitude.getMinutes() + ' ' + coords.latitude.getSecondsDecimal() + ' ' + coords.latitude.getDirection();
  	DMSStringLng = coords.longitude.getDegrees() + ' ' + coords.longitude.getMinutes() + ' ' + coords.longitude.getSecondsDecimal() + ' ' + coords.longitude.getDirection();
  
  	try{document.getElementById("coordinates_gps").innerHTML = "<span class='txtAzul'>GPS:</span> " + DMSStringLat + " " + DMSStringLng;}catch(e){}
}

function searchAddress() {
	showAddress(document.getElementById("address").value, 15);	
}	

function setSmallMap(value){
	smallMap = value;
}

//BEGIN NEW CODE TO AVOID USING BODY TAG FOR LOAD/UNLOAD


	
//	 END NEW CODE TO AVOID USING BODY TAG FOR LOAD/UNLOAD
