var property_markers = new Array(); 
var city_markers = new Array();

var temp_property_markers = new Array(); 
var temp_city_markers = new Array();

var temp_map = null;
var map = null;
var last_clicked_city = null;
var last_clicked_country = null;
var selected_marker = null;



// the function load parameters from server
// and adds markers to the map 
function getLocationMarkers(slug, type, slected_lat, selected_lon)
{

	switch(type)
	{
	case 'city':
		if(slug != last_clicked_country)
		{
			last_clicked_country = slug;
		
			// clear others cities and propertys
			for( key in city_markers)
			{
				map.removeOverlay(city_markers[key]);
				delete city_markers[key];
			}					
			for( key in property_markers)
			{
				map.removeOverlay(property_markers[key]);
				delete property_markers[key];
			}				
		}	
		break;
	
	case 'property':
		if(slug != last_clicked_city)
		{
		
			last_clicked_city = slug;				
			
			// clear property from others cities
			for( key in property_markers)
			{
				map.removeOverlay(property_markers[key]);
				delete property_markers[key];
			}			
		}
		break;
	}
	
	jQuery.post(novrealty.ajaxurl, {'location' : slug , 'type' : type, 'action' : 'novrealty_map_markers'}, function(response)
	{ 
		// add loaded markers to the map
		if(jQuery('status', response).text() == "OK")
		{
			var screen = new GLatLngBounds();
			screen.extend(new google.maps.LatLng(slected_lat, selected_lon));
			jQuery('marker', response).each(
			function()
			{
				// get parameters from response XML
				lat = parseFloat(jQuery(this).find('location > lat').text());
				lon = parseFloat(jQuery(this).find('location > lon').text());
				title = jQuery(this).find('title').text();
				description = jQuery(this).find('description').text();
				zoom = parseInt(jQuery(this).find('zoom').text(),10);
				type = jQuery(this).find('type').text();
				slug = jQuery(this).find('slug').text();
				link = jQuery(this).find('link').text();
				image = jQuery(this).find('image').text()
			
				var parameters = [lat, lon, type, title, description, zoom, slug, link, image];
				screen.extend(new google.maps.LatLng(lat,lon));
				
				// set marker				
				novSetMarker(map, parameters);
			});
			
			// set center and zoom 
			if(!screen.isEmpty())
			{
				center = screen.getCenter();
				zoom = map.getBoundsZoomLevel(screen);	
				map.setZoom(zoom-1);
				map.panTo(center);				
			}
			
		}
	});
}
// function trying to init google map and return it
// or return false
function novInitGMap(map_element, lat, lon, zoom)
{
	// default zoom is 13;
	zoom = zoom || 13;
	try
	{
	var map = new google.maps.Map2(map_element);
		map.setCenter(new google.maps.LatLng(lat,lon), zoom);
		
	geocoder = new GClientGeocoder();
		return map;
	}
	catch(e){ return false; }		

}			
// function sets marker on map
// in Lat Lon coords
function novSetMarker(map, parameters)
{
		// parameters is Array
		// parameters[0] = Lat
		// parameters[1] = Lon
		// parameters[2] = type
		// parameters[3] = Title
		// parameters[4] = description
		// parameters[5] = zoom
		// parameters[6] = slug
		// parameters[7] = link
		// parameters[8] = image
	
	
		type = parameters[2];		
		if(!type) type = 'property';
		var marker = null;
		
			
		switch(type)
		{
		
		// create Country Marker
		case 'country':
			
			
			// create icon for country marker
			var country_icon = new GIcon(G_DEFAULT_ICON);
			country_icon.image = novrealty.markers_path + "marker_country.png";
			marker_options = { icon:country_icon };
			
			// add marker to map
			marker = new GMarker(new google.maps.LatLng(parameters[0], parameters[1]),marker_options);
			map.addOverlay(marker);

			var html = '<div style="width:210px; padding-right:10px;" class="marker-popup">'+
			'<span class="cap"><a href="'+parameters[7] +'" >'+ parameters[3] +'</a></span>'+
			'<p><span class="browse">'+
				novrealty.browse_properties_in_country + ' <a href="#" onclick="getLocationMarkers(\''+parameters[6]+'\',\'city\', \''+parameters[0]+'\', \''+parameters[1]+'\' );return false">'+ parameters[3] +' ' + novrealty.using_the_map + '</a> ' + novrealty.or_as  + ' <a href="'+parameters[7] +'" >' + novrealty.browse_the_list + '</a>'+
			'</span></p></div>';
			marker.bindInfoWindowHtml(html);
		break;
		
		
		// create City Marker
		case 'city':
		
			// create icon for city marker
			var country_icon = new GIcon(G_DEFAULT_ICON);
			country_icon.image = novrealty.markers_path + "marker_city.png";
			marker_options = { icon:country_icon };
			
			// add marker to map
			marker = new GMarker(new google.maps.LatLng(parameters[0], parameters[1]), marker_options);
			map.addOverlay(marker);
			
			// add city marker to array
			city_markers.push(marker);	

			var html = '<div style="width:210px; padding-right:10px;" class="marker-popup">'+
			'<span class="cap"><span class="gray">' + parameters[4] + '</span>, <a href="'+parameters[7] +'" >'+ parameters[3] +'</a></span>'+
			'<p><span class="browse">'+
				novrealty.browse_properties_in_city + ' <a href="#" onclick="getLocationMarkers(\''+parameters[6]+'\',\'property\', \''+parameters[0]+'\', \''+parameters[1]+'\' );return false">'+ parameters[3] + ' ' + novrealty.using_the_map + '</a> ' + novrealty.or_as  + ' <a href="'+ parameters[7] + '" >' + novrealty.browse_the_list + '</a>' +
			'</span></p></div>';
			marker.bindInfoWindowHtml(html);
			
			break;
		
		
		// create Property Marker
		case 'property':
		
			// create property marker icon
			var country_icon = new GIcon(G_DEFAULT_ICON);
			country_icon.image = novrealty.markers_path +"marker_property.png";
			country_icon.shadow = novrealty.markers_path +"property_shadow.png";
			country_icon.iconSize = new GSize(24,34);
			marker_options = { icon:country_icon };
			
			
			// add marker to map
			var marker = new GMarker(new google.maps.LatLng(parameters[0], parameters[1]), marker_options);
			map.addOverlay(marker);
			
			// add info block to the marker
			var html = '<div style="width:210px; padding-right:10px;" class="marker-popup">'+
			'<span><span class="cap"><a href="'+parameters[7] +'" >'+ parameters[3] +'</a></span><p><span class="browse"><img src="'+ parameters[8] +'" width="70" height="70" class="thumb" />'+ parameters[4] +'<br /><a class="premalink" href="'+parameters[7] +'" >'+ novrealty.more_info +' »</a></span></p></div>';
			marker.bindInfoWindowHtml(html);
			
			// add the marker to map
			property_markers.push(marker);			
			map.addOverlay(marker);
			
			// add action "Click" to the current marker 			
			GEvent.addListener(marker, "click", function(marker)
			{
				map.panTo(new google.maps.LatLng(parameters[0],parameters[1]));
			});	
		break;
		}
}

// function inits google map from html code
function  novGoogleMapInit(element)
{

		// get viewport parameters from html tags
		var txtLat = jQuery(element).find("ul.viewport .lat").text();
		var txtLon = jQuery(element).find("ul.viewport .lon").text();
		
		var err_message = jQuery(element).find("ul.viewport .error-message").text()

		// if lon or lat is not difined 
		// show error
		if(txtLat == '' || txtLat == '' )
		{
			jQuery(element).html('<p>'+err_message+'</p>');	
			return -1;
		}
			
		// convert coords from text to float
		var viewport_lat  = parseFloat(txtLat);
		var viewport_lon  = parseFloat(txtLon);
		var viewport_zoom = parseInt(jQuery(element).find("ul.viewport .zoom").text());
						

		// init google map
		map = novInitGMap(jQuery(element).children('.map-container').get(0),  viewport_lat , viewport_lon, viewport_zoom);	
		map.setZoom(8);
		// if map is not initalized return false
		if(!map)return false;

		// get markers from html tags
		var markers = jQuery(element).find("ul.markers li");

		view = new GLatLngBounds();
		// set each maerker
		markers.each(function()
		{		
				
				// get markers coords, title and description
				var marker_lon   = parseFloat(jQuery(this).find(".lon").text());
				var marker_lat	 = parseFloat(jQuery(this).find(".lat").text());
				var marker_type  = jQuery(this).find(".type").text();
				var marker_title = jQuery(this).find(".title").text();
				var marker_zoom  = parseInt(jQuery(this).find(".zoom").text());
				var marker_description = jQuery(this).find(".description").text();
				var marker_slug = jQuery(this).find(".slug").text();
				var marker_link = jQuery(this).find(".link").text();
										
				var parameters = [marker_lat, marker_lon, marker_type, marker_title, marker_description, marker_zoom, marker_slug, marker_link];
				
				// set marker		
				novSetMarker(map, parameters);
				view.extend(new google.maps.LatLng(marker_lat, marker_lon));
		});				
		
		if(!view.isEmpty())
		{
			zoom = map.getBoundsZoomLevel(view);
			center = view.getCenter();
			
			map.setZoom(zoom);
			map.panTo(center);		
		}
}
jQuery(document).ready(function()
{	
	jQuery(".nov-map").each(function() { novGoogleMapInit(this); return false; });
	
	// Expand map 
	jQuery('.expand-map').click(function()
	{
		var width = jQuery(document).width();
		var height = jQuery(document).height();
	
		// create google maps large box
		
		jQuery('#overlay').css({'opacity': '0.7', 'width' : width, 'height' : height});
		jQuery('#large-map-wraper').html('<div class="large-map-header"><a class="close-map" href="#">' + novrealty.close + '</a></div><div id="map-wraper"></div>');
		
		jQuery('#map-wraper').css({'width' : jQuery('#large-map-wraper').width() - 20, 'height' : jQuery('#large-map-wraper').height() - 90});
		jQuery('.large-map-header').css('width' , jQuery('#large-map-wraper').width() - 20);
		
		
		jQuery('#overlay').fadeIn(300,function()
		{
			jQuery('#large-map-wraper').show(100);
			// save small map parameters 
			temp_map = map;
			temp_property_markers = property_markers;
			temp_property_markers = city_markers;
		
			//property_markers = new array();
			//city_markers = new array();
			
			var params = {
				action : 'novrealty_map_markers',
				location : 'world',
				type : 'country'
			};
			
			jQuery.post(novrealty.ajaxurl, params, function(response)
			{
				
				map = novInitGMap(jQuery('#map-wraper').get(0),  '55.680200' , '37.570850', 8);	
				map.setZoom(8);
				// if map is not initalized return false
				if(!map)return false;

				var screen = new GLatLngBounds();
				if(jQuery('status', response).text() == "OK")
				{
					jQuery('marker', response).each(
					function()
					{
						// get parameters from response XML
						lat = parseFloat(jQuery(this).find('location > lat').text());
						lon = parseFloat(jQuery(this).find('location > lon').text());
						title = jQuery(this).find('title').text();
						description = jQuery(this).find('description').text();
						zoom = parseInt(jQuery(this).find('zoom').text(),10);
						type = jQuery(this).find('type').text();
						slug = jQuery(this).find('slug').text();
						link = jQuery(this).find('link').text();
						image = jQuery(this).find('image').text()
					
						var parameters = [lat, lon, type, title, description, zoom, slug, link, image];
						screen.extend(new google.maps.LatLng(lat,lon));
						
						// set marker		
						novSetMarker(map, parameters);
					});
					
					// set center and zoom 
					if(!screen.isEmpty())
					{
						center = screen.getCenter();
						zoom = map.getBoundsZoomLevel(screen);	
						map.setZoom(zoom);
						map.panTo(center);				
					}				
				}			
			});
		});
	});
	jQuery('.close-map').live("click",function()
	{
		//get saved small map parameters 
		map = temp_map;	
		property_markers = temp_property_markers;
		property_markers = temp_city_markers;
		
		//close large map
		jQuery('#large-map-wraper').hide(100, function ()
		{
			jQuery('#overlay').fadeOut(300);
		});
	});
});

