var geocoder;
var map;
var geoMarker = new Array();
var bounds;

function initialize(myLat, myLng, myZoom, markers) {
	var myLatLng = new google.maps.LatLng(myLat, myLng);
	var myOptions = {
		zoom: myZoom,
		center: myLatLng,
		scrollwheel: false,
		navigationControl: true,
		navigationControlOptions: {
			style: google.maps.NavigationControlStyle.ZOOM_PAN
		},
		mapTypeId: google.maps.MapTypeId.ROADMAP
	}

	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	updateZoom(map.getZoom());

	google.maps.event.addListener(map, 'zoom_changed', function() {
		updateZoom(map.getZoom());
	});

    geocoder = new google.maps.Geocoder();

	if (markers) {
		bounds = setMarkers(markers);
		
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var lngSpan = northEast.lng() - southWest.lng();
		var latSpan = northEast.lat() - southWest.lat();

		if (lngSpan || latSpan) {
			map.fitBounds(bounds);
		}
	}
}

function Gunload() {
}

function setMarkers(myMarkers) {
	var markers = myMarkers.split(";");
	var markerBounds = new google.maps.LatLngBounds();
	for (var i = 0; i < markers.length; i++) {
		setMarker(i, markers[i], markerBounds);
	}

	return markerBounds;
}

function setMarker(markerCounter, myMarker, markerBounds) {
	var marker = myMarker.split("|");
	var latlng = new google.maps.LatLng(Number(marker[0]), Number(marker[1]));
	if (marker[2] == 0) {
		setNonDraggableMarker(markerCounter, latlng);
	} else if (marker[2] == 1) {
		setDraggableMarker(markerCounter, latlng);
	} else if (marker[2] == 2) {
		setNonDraggableMarker(markerCounter, latlng);

		google.maps.event.addListener(geoMarker[markerCounter], 'dblclick', function() {
			document.location.href=marker[3];
		});
	} else if (marker[2] == 3) {
		setThumbnailMarker(markerCounter, latlng, marker[3], marker[4], true);
	}

	markerBounds.extend(latlng);
}

function updateMarkerPosition(markerCounter, latLng) {
	var geoLat = document.getElementById('geoLat');
	var geoLng = document.getElementById('geoLng');
	if (geoLat && geoLng) {
		geoLat.value = latLng.lat();
		geoLng.value = latLng.lng();
	}
}

function updateZoom(zoom) {
	var geoZoom = document.getElementById('geoZoom');
	if (geoZoom) {
		geoZoom.value = zoom;
	}
}

function setDraggableMarker(markerCounter, latLng) {
	if (geoMarker[markerCounter] != undefined) {
		geoMarker[markerCounter].setPosition(latLng);
		updateMarkerPosition(markerCounter, latLng);
	} else {
		geoMarker[markerCounter] = new google.maps.Marker({
			draggable: true,
			visible: true,
			map: map, 
			position: latLng
		});
				
		google.maps.event.addListener(geoMarker[markerCounter], 'drag', function() {
			updateMarkerPosition(markerCounter, geoMarker[markerCounter].getPosition());
		});

		google.maps.event.addListener(geoMarker[markerCounter], 'dragend', function() {
			updateLocation(markerCounter, geoMarker[markerCounter].getPosition());
		});

	}
	
	updateMarkerPosition(markerCounter, geoMarker[markerCounter].getPosition());
}

function setThumbnailMarker(id, latLng, title, filename, draggable) {
    // Create our "tiny" marker icon
	var image = new google.maps.MarkerImage(filename,
		new google.maps.Size(30, 36),
		new google.maps.Point(0, 0),
		new google.maps.Point(15, 36));

	var arrLatLng = latLng.split(",");
    var myLatLng = new google.maps.LatLng(arrLatLng[0],arrLatLng[1]);
    geoMarker[id] = new google.maps.Marker({
        position: myLatLng,
        map: map,
        icon: image,
		draggable: draggable,
		title: title
    });

	if (draggable) {
		var gps = document.getElementById("pictureGPS_" + id);
		gps.value = geoMarker[id].getPosition().lat() + ',' + geoMarker[id].getPosition().lng();

		google.maps.event.addListener(geoMarker[id], 'dragend', function() {
			var gps = document.getElementById("pictureGPS_" + id);
			gps.value = geoMarker[id].getPosition().lat() + ',' + geoMarker[id].getPosition().lng();
		});
	}
	
	bounds.extend(myLatLng);
}

function removeGoogleMapsMarker(id) {
	if (geoMarker[id]) {
		geoMarker[id].setMap(null);
	}
	
	var gps = document.getElementById("pictureGPS_" + id);
	if (gps) gps.value = '';
}

function setNonDraggableMarker(markerCounter, latLng) {
	if (geoMarker[markerCounter] != undefined) {
		geoMarker[markerCounter].setPosition(latLng);
		updateMarkerPosition(markerCounter, latLng);
	} else {
		geoMarker[markerCounter] = new google.maps.Marker({
			draggable: false,
			visible: true,
			map: map, 
			position: latLng
		});
	}
	
	updateMarkerPosition(markerCounter, geoMarker[markerCounter].getPosition());
}

function getShortLocation(location) {
	var found = false;
	var i = 0;
	var types;
	var localName;
	var subLocalName;
	var level1Name;
	var level2Name;
	
	var myAlert = "";

	while (!found && i < location.length) {
		types = location[i].types;
		for (j = 0; j < types.length; j++) {
			myAlert += location[i].short_name + ' (short_name) =' + types[j] + '\n';
			myAlert += location[i].long_name + ' (long_name) =' + types[j] + '\n';
			if (!subLocalName && types[j].indexOf('sublocality') == 0) {
				subLocalName = location[i].short_name;
			}
			else
			if (!level1Name && types[j].indexOf('administrative_area_level_1') == 0) {
				level1Name = location[i].long_name;
			}
			else
			if (!localName && types[j].indexOf('locality') == 0) {
				localName = location[i].short_name;
			}
			else
			if (!level2Name && types[j].indexOf('administrative_area_level_2') == 0) {
				level2Name = location[i].long_name;
			}
		}

		//found = (localName && subLocalName && level1Name && level2Name);

		if (!found) {		
			i++;
		}
	}

	//alert(myAlert);
	//alert('localName = ' + localName + '\n' +
	//      'subLocalName = ' + subLocalName + '\n' +
	//	  'level1Name = ' + level1Name + '\n' +
	//	  'level2Name = ' + level2Name);
	
	if (localName && !subLocalName) {
		return localName;
	}
	else
	if (subLocalName && localName != subLocalName) {
		return subLocalName + ' (' + localName + ')';
	}
	else
	if (subLocalName && localName == subLocalName) {
		return subLocalName;
	}
	else
	if (level1Name && !level1Name) {
		return level1Name;
	}
	else
	if (level2Name && level2Name != level1Name) {
		return level2Name + ' (' + level1Name + ')';
	}
	else
	if (level2Name && level1Name == level2Name) {
		return level2Name;
	}
	else return -1;
}

function updateLocation(markerCounter, latLng) {
	var location = document.getElementById("location");
    var geoLocation = document.getElementById("geoLocation");

    if (location && geocoder) {
      geocoder.geocode( { 'latLng': latLng, 'language': 'en'}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
			var myAlert = "";
			myAlert += results[0].address_components[0].short_name + '\n';
			
			var locationName = getShortLocation(results[0].address_components);
			if (locationName == '-1') {
				locationName = '';
			}
			location.value = locationName;
			if (geoLocation) {
				geoLocation.value = locationName;
			}
			//alert(myAlert);
        } else {
			alert("Please select a city on the map");
        }
      });
    }
}

function codeLocation(replace) {
	if (replace || (geoMarker[0] == undefined)) {
	
		var location = document.getElementById("location");
		var geoLocation = document.getElementById("geoLocation");

		if (location && location.value && geocoder) {
			geocoder.geocode( { 'address': location.value, 'language':'en' }, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {
					map.setCenter(results[0].geometry.location);
					setDraggableMarker(0, results[0].geometry.location);
					var locationName = getShortLocation(results[0].address_components);
					map.fitBounds(results[0].geometry.viewport);
					if (locationName == '-1') {
						updateLocation(0, geoMarker[0].getPosition());
					}
					location.value = locationName;
					if (geoLocation) {
						geoLocation.value = locationName;
					}
				} else {
					//alert("City '" + location.value + "' not found");
				}
			});
		}
	}
}
