//Variable for map
var globalMap = null;
//Template for GMaps balloon
var infoTempl = new Template('<div class="bocadillo">'
		+ '<p class="titulo">#{type} in #{location} (#{area})</p>'					 
		+ '<a href="#{link}"><img src="#{image}"/></a>'
		+ '<ul><li>'
		+ '<b>Reference</b>: #{ref}</li><li>' 
		+ '<b>Bedrooms</b>: #{n_dorm}</li><li>' 
		+ '<b>Bathrooms</b>: #{n_bath}</li><li>'
		+ '<b>Price</b>: #{price} &euro;</li><li>'
		+ '<a href="#{link}>More details&hellip;</a></li></ul></div>');

//Properties on map
var propertiesMap = [];

//Marker for edition in cms
var editMarker = null;

// Marker for centering 
var centerLatLng = null;

//Loader for map
function loadMap() {
	//Default center
	centerLatLng = new GLatLng(38.190704, -0.944824);
	var map = $('map');
	if(!Object.isElement(map)) {
		return;
	}
	var type = $('type');
	if(Object.isElement(type) && type.present()) {
		//Check if we are in a "details page" and must not show map
		var detailsMap = false;
		if((detailsMap = Object.isElement($('ref_id'))) && !$('ref_id').present()) {
			//We are in a "details page" but there are no coordinates to show
			return;
		}
		
		// If detailsMap is false, we are in a category listing, else, in a details page 
		loadTypeMap($F(type), Object.isElement($('lang')) ? $F('lang'): '', detailsMap);
		return;
	}
	
	// Map initialization for home
	globalMap = new GMap2(map, {
		size : new GSize(550, 350)
	});
	GEvent.addListener(globalMap, 'load', function() {
		new Ajax.Request('ajax_properties.php', {
			onSuccess : loadIntoMap
		});
	});
	globalMap.setUIToDefault();
	globalMap.setCenter(centerLatLng, 8);
}


//Loads the objects into the map from ajax response
function loadIntoMap(t) {
	var props = t.responseText.evalJSON();
	var i = -1;
	var pMap;
	var marker;
	var p;
	var icon = new GIcon();
	icon.image = '/images/icons/map_icon.png';
    icon.iconAnchor = new GPoint(0, 0);
    icon.infoWindowAnchor = new GPoint(25 >> 1, 25 >> 1);
    var latlng = null;
	while (++i < props.length) {
		p = props[i];
		if (!Object.isArray(propertiesMap[p.type])) {
			propertiesMap[p.type] = [];
		}
		pMap = propertiesMap[p.type];
		marker = new GMarker(latlng = new GLatLng(p.lat, p.lng), {'icon': icon});
		marker.bindInfoWindowHtml(infoTempl.evaluate(p));
		pMap[pMap.length] = marker;
		globalMap.addOverlay(marker);
	}

	// If there is only one element, center map to it
	if(props.length == 1) {
		if(globalMap.isLoaded()) {
			globalMap.panTo(latlng);
		}
		else {
			centerMarker = latlng;
		}
	}
}

//Loader for map editor in CMS
function loadEditMap() {
	var lng = $$('input[name="longitud"]').first();
	var lat = $$('input[name="latitud"]').first();

	//Map initialization for editor
	globalMap = new GMap2($('map'), {
		size : new GSize(713, 350)
	});

	var initPoint;
	var lngVal = parseFloat($F(lng));
	var latVal = parseFloat($F(lat));
	
	var setLatLng = function(latlng) {
		lat.value = latlng.lat();
		lng.value = latlng.lng();
	};
	
	//If element has no position, put marker on click, else load marker
	if((lat.present() && lng.present()) && (lngVal !== .0 && latVal !== .0)) {
		initPoint = new GLatLng(latVal, lngVal);
		
		GEvent.addListener(globalMap, 'load', function() {
			editMarker = new GMarker(initPoint, {draggable: true});
			GEvent.addListener(editMarker, 'dragend', setLatLng);
			globalMap.addOverlay(editMarker);
		});
	}
	else {
		initPoint = new GLatLng(38.190704, -0.944824);
		var listener = null;
		GEvent.addListener(globalMap, 'load', function() {
			listener = GEvent.addListener(globalMap, 'click', 
				function(overlay, latlng, overlaylatlng) {
					editMarker = new GMarker(latlng, {draggable: true});
					GEvent.addListener(editMarker, 'dragend', setLatLng);
					GEvent.removeListener(listener);
					setLatLng(latlng);
					globalMap.addOverlay(editMarker);
				}
			);
		});
	}

	globalMap.setUIToDefault();
	globalMap.setCenter(initPoint, 8);
}

function loadTypeMap(type, lang, detailsMap) {
	var map = new Element('div', {'id': 'map'});
	//If we are in "details page", map goes into specifications section
	var ol = $('objectList');
	if(detailsMap) {
		ol = $$('#objectList table');
		ol = ol.first().parentNode;
	}
	else {
		ol = $('objectList');
	}

	if(!Object.isElement(ol)) {
		return;
	}
	ol.insert(map, {position: 'after'});	

	//Map initialization for details page
	if(detailsMap) {
		globalMap = new GMap2(map, {
			size : new GSize(550, 350)
		});
	}
	else
	//Map initialization for listing
	{
		globalMap = new GMap2(map, {
			size : new GSize(550, 350)
		});
	}

	var params = 
	{
		'type': type, 
		'lang': lang, 
		'sql' :Object.isElement($('sql')) ? $F('sql') : '',
		'rt': Object.isElement($('rt')) ? $F('rt') : '',
		'id': Object.isElement($('ref_id')) ? $F('ref_id') : ''
	};
	
	GEvent.addListener(globalMap, 'load', function() {
		new Ajax.Request('ajax_properties.php', {
			parameters: params,
			onSuccess : loadIntoMap
		});
	});
	globalMap.setUIToDefault();
	globalMap.setCenter(centerLatLng, 8);
}