var google_loaded = false;
var google_map = false;

var geocoder;
var address;

var points = Array();
var points_count = 0;
var region_bounds = Array();

var map_click_func = false;
var def_place = false;
var def_marker = false;

var points_loaded = false;

region_bounds["bottom"] = 55.6;
region_bounds["left"] = 37.4;
region_bounds["top"] = 55.9;
region_bounds["right"] = 37.8;

var default_center = Array();
default_center["lat"] = 55.753854;
default_center["lng"] = 37.620739;
var default_zoom = 12;

var point_area = 0.005 / 2;

function windowHeight() {
    // Standard browsers (Mozilla, Safari, etc.)
	if (self.innerHeight)                
		return self.innerHeight;        
	// IE 6        
	if (document.documentElement && document.documentElement.clientHeight)                
		return document.documentElement.clientHeight;        
	// IE 5        
	if (document.body)                
		return document.body.clientHeight;        
	// Just in case.         
	return 0;
}

//
//
function handleResize() {        
	var height = windowHeight() - 180;        
	document.getElementById('map').style.height = height + 'px';        
}

function load_google() {
	if (GBrowserIsCompatible()) {
		google_map = new GMap2(document.getElementById("map"));
		google_map.addControl(new GLargeMapControl());
		google_map.addControl(new GMapTypeControl());
		google_map.enableContinuousZoom();
		GEvent.addListener(google_map, "click", MapClicked);
		google_loaded = true;
		window.onunload = GUnload;
		geocoder = new GClientGeocoder();
	}
}

var marker_to_show = false;

function is_null( mixed_var ) {
    return ( mixed_var === null );
} 

function get_xml_element(xml, name) {
	element = xml.documentElement.getElementsByTagName(name)[0].firstChild;
	if (is_null(element))
		return '';
	else
		return element.data;
}


function showDetails(marker) {
	var title;
	var uid;
	var short_text;
	if (marker.value != undefined) {
		var id = points[marker.value]["point_id"];
		marker_to_show = marker;
		GDownloadUrl("/modules/geoplaces/get_places.php?action=place&id="+id, function(data, responseCode) {
			var xml = GXml.parse(data);
		 	title = get_xml_element(xml, "title");
			short_text = get_xml_element(xml, "short");
		    marker_to_show.openInfoWindowHtml(
			    '<div class="map_details"><strong>' + title + '</strong><br />' +
			    short_text + '<br /><br />' +
			    '<a href="/geoplaces/place/'+id+'/">Подробнее...</a></div>'
			)
		});
	}
}

function MapClicked(marker, point) {
	if (marker) {
		showDetails(marker);
		//alert(marker.value);
	} else {
		if (map_click_func) map_click_func(marker, point);
		//getAddress(marker, point);
	}
}

function map_center(latitude, longitude, zoom) {
	if (google_loaded) {
       google_map.setCenter(new GLatLng(latitude, longitude), zoom);
	}
}

/*
function getAddress(overlay, latlng) {
  if (latlng != null) {
    address = latlng;
    geocoder.getLocations(latlng, showAddress);
  }
}

function showAddress(response) {
  //google_map.clearOverlays();
  if (!response || response.Status.code != 200) {
    alert("Status Code:" + response.Status.code);
  } else {
    place = response.Placemark[0];
    point = new GLatLng(place.Point.coordinates[1],
                        place.Point.coordinates[0]);
    marker = new GMarker(point);
    google_map.addOverlay(marker);
    marker.openInfoWindowHtml(
    //'<b>orig latlng:</b>' + response.name + '<br/>' + 
    //'<b>latlng:</b>' + place.Point.coordinates[0] + "," + place.Point.coordinates[1] + '<br>' +
    //'<b>Status Code:</b>' + response.Status.code + '<br>' +
    //'<b>Status Request:</b>' + response.Status.request + '<br>' +
    '<b>Address:</b> ' + place.address
	)
  }
}
*/

function init_index() {
	init_map(0);
}

function init_place() {
	init_map(def_point);
}

function init_loaded(def_point_id) {
	if (points_loaded) {
		if (def_point_id==0) {
			handleResize();
			load_google();
			
			var lsc = new google.maps.LocalSearch(); 
			google_map.addControl(new google.maps.LocalSearch());
			
			//var boundaries = new GLatLngBounds(new GLatLng(region_bounds["bottom"],region_bounds["left"]), new GLatLng(region_bounds["top"],region_bounds["right"]));
			//zoom = google_map.getBoundsZoomLevel(boundaries);
		    //google_map.setCenter(new GLatLng((region_bounds["bottom"] + region_bounds["top"])/2, (region_bounds["left"] + region_bounds["right"])/2), zoom);
		    google_map.setCenter(new GLatLng(default_center["lat"], default_center["lng"]), default_zoom);
		} else {
			load_google();
			var boundaries = new GLatLngBounds(new GLatLng(def_place["latitude"]-point_area, def_place["longitude"]-point_area), new GLatLng(def_place["latitude"]+point_area, def_place["longitude"]+point_area));
			zoom = google_map.getBoundsZoomLevel(boundaries);
		    google_map.setCenter(new GLatLng(def_place["latitude"], def_place["longitude"]), zoom);
		}
		//var myLayer = new GLayer("org.wikipedia.ru");    
		//google_map.addOverlay(myLayer);
		
		place_points(def_point_id);
	} else {
		setTimeout("init_loaded("+def_point_id+")", 100);
	}

}
function init_map(def_point_id) {
	load_places(def_point_id);
	init_loaded(def_point_id)
}

function load_places(def_point_id) {
	var place=false;
	GDownloadUrl("/modules/geoplaces/get_places.php", function(data, responseCode) {
		var xml = GXml.parse(data);
	 	var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i = 0; i < markers.length; i++) {
			id = parseFloat(markers[i].getAttribute("id"));
			register_point( markers[i].getAttribute("title"),
							parseFloat(markers[i].getAttribute("lat")),
							parseFloat(markers[i].getAttribute("lng")),
							id,
							parseFloat(markers[i].getAttribute("user"))
						)
			if (id==def_point_id) {
				def_place = points[points_count-1];
			}
		}
		points_loaded = true;
	});
}

function register_point(vlabel, latitude, longitude, point_id, user) {
	points[points_count] = Array();
	points[points_count]["label"] = vlabel;
	points[points_count]["latitude"] = latitude;
	points[points_count]["longitude"] = longitude;
	points[points_count]["point_id"] = point_id;
	points[points_count]["user"] = user;
	points_count++;
}

function place_points(def_point_id) {
	var tinyIcon = new GIcon();
	tinyIcon.image = "/img/map_2.png";
	tinyIcon.shadow = "/img/map_shadow.png";
	tinyIcon.iconSize = new GSize(19, 15);
	tinyIcon.shadowSize = new GSize(25, 15);
	tinyIcon.iconAnchor = new GPoint(9, 7);
	tinyIcon.infoWindowAnchor = new GPoint(5, 1);

	//tinyIcon.image = "/img/building.png";
	//tinyIcon.shadow = "/img/building_shadow.png";
	//tinyIcon.iconSize = new GSize(16, 16);
	//tinyIcon.shadowSize = new GSize(24, 16);
	//tinyIcon.iconAnchor = new GPoint(8, 16);
	//tinyIcon.infoWindowAnchor = new GPoint(5, 3);

	tinyIcon2 = new GIcon(tinyIcon);
	tinyIcon2.image = "/img/map_1.png";
	//tinyIcon.image = "/img/building.png";
	
	//var ret_marker = false;
	for (i=0; i<points_count; i++) {
		point = new GLatLng(points[i]["latitude"], points[i]["longitude"]);
		markerOptions = { 	"icon":(points[i]["point_id"]!=def_point_id)?tinyIcon2:tinyIcon, 
							"clickable": true,
							"draggable": false
						};
		marker = new GMarker(point, markerOptions);
		marker.value = i; //points[i]["point_id"];
		google_map.addOverlay(marker);
		if (points[i]["point_id"]==def_point_id) def_marker = marker;
	}
}

