
function drawDistrictPolygon(polygon, encodedLevels, latitude, longitude, title) 
{
    var pline = GPolyline.fromEncoded({color: "#0000FF",
                                      weight: 5,
                                      points: polygon,
                                      zoomFactor: 32,
                                      levels: encodedLevels,
                                      numLevels: 4
                                     });
    var label = new Label(new GLatLng(parseFloat(latitude), parseFloat(longitude)), title);
    
	map.addOverlay(pline);
	map.addOverlay(label);
}

function drawPointArea(latitude, longitude, radius, title) {
    
    var icon = new GIcon({image: "/images/point-selected-marker.gif"});
    icon.iconAnchor = new GPoint(15, 15);
    icon.iconSize = new GSize(31, 31);
    icon.infoWindowAnchor = new GPoint(12, 28);
    icon.infoShadowAnchor = new GPoint(12, 28);
	
    var point = new GLatLng(parseFloat(latitude), parseFloat(longitude));
    var marker = new GMarker(point, {"icon": icon, "clickable": false, "title": title});
    map.addOverlay(marker);
	    
    drawCircle(point.lat(), point.lng(), radius * 0.621371192);
}

function highlightPointMarker(latitude, longitude, title) {

    var icon = new GIcon({ image: "/images/point-selected-marker.gif" });
    icon.iconAnchor = new GPoint(15, 15);
    icon.iconSize = new GSize(31, 31);
    icon.infoWindowAnchor = new GPoint(12, 28);
    icon.infoShadowAnchor = new GPoint(12, 28);

    var point = new GLatLng(parseFloat(latitude), parseFloat(longitude));
    var marker = new GMarker(point, { "icon": icon, "clickable": false, "title": title });
    map.addOverlay(marker);
}

function setCenter(latitude, longitude, zoom) {
    
    var point = new GLatLng(parseFloat(latitude), parseFloat(longitude));
	map.setCenter(point, parseInt(zoom));
}

var activeAccPoint = null;
var activeAccId = null

function highlightAccMarker(accommodationId, latitude, longitude) {

    activeAccPoint = new GLatLng(parseFloat(latitude), parseFloat(longitude));
    activeAccId = accommodationId;
}


function loadAccMarkers(languageId, siteId, dateFrom, dateTill, rateId, districtId, latitude, longitude, radius, orderBy, page, pageSize, dateRangeSelectorOnPage) {

    var url = "/AccVertex.aspx?";
    
    url += "languageId=" + languageId;
    url += "&siteId=" + siteId;
        
    if (dateFrom != null)
        url += "&dateFrom=" + escape(dateFrom);
        
    if (dateTill != null)
        url += "&dateTill=" + escape(dateTill);
        
    if (rateId != null)
        url += "&rateId=" + rateId;
        
    if (districtId != null)
        url += "&districtId=" + districtId;
        
    if (latitude != null)
        url += "&latitude=" + latitude;
        
    if (longitude != null)
        url += "&longitude=" + longitude;
        
    if (longitude != null)
        url += "&radius=" + escape(radius);
        
    url += "&orderBy=" + orderBy;
    url += "&page=" + page;
    url += "&pageSize=" + pageSize;
        
    loadXmlDoc(url, function(xmlDoc) {
        processAccVertex(xmlDoc, rateId, districtId, dateFrom, dateTill, dateRangeSelectorOnPage);
    });
}

function getAccMarker(point) {
    
    if (accMarkers[point.lat()] == null)
        return null;

    if (accMarkers[point.lat()][point.lng()] == null)
        return null;

    return accMarkers[point.lat()][point.lng()];
}

function accItemClicked(accommodationId, latitude, longitude, dateFrom, dateTill) {
    
	var url = "AccMarkerInfo.aspx?"
	url += "accommodationId=" + accommodationId
	
	if (dateFrom != null)
        url += "&dateFrom=" + escape(dateFrom);
        
    if (dateTill != null)
        url += "&dateTill=" + escape(dateTill);

    var point = new GLatLng(parseFloat(latitude), parseFloat(longitude));

    var accMarker = getAccMarker(point);

    if (accMarker != null) 
	{
	    loadXmlDoc(url, updateAccMarkerInfoWindow, accMarker);
	}
	else 
	{
	    loadXmlDoc(url, showAccInfoWindow, point);
	}
	
	map.setCenter(point);
	
	return false;
}

function accMarkerClicked(marker, rateId, districtId, dateFrom, dateTill, dateRangeSelectorOnPage) {
    
	var point = marker.getLatLng();
	
	var url = "AccMarkerInfo.aspx?"
	url += "latitude=" + point.lat()
	url += "&longitude=" + point.lng();
	
	if (dateFrom != null)
        url += "&dateFrom=" + escape(dateFrom);
        
    if (dateTill != null)
        url += "&dateTill=" + escape(dateTill);
	
	if (rateId != null)
        url += "&rateId=" + rateId;
        
    if (districtId != null)
        url += "&districtId=" + districtId;

    if (activeAccId != null)
        url += "&activeAccId=" + activeAccId;

    url += "&dateRangeSelectorOnPage=" + dateRangeSelectorOnPage;
        
    loadXmlDoc(url, updateAccMarkerInfoWindow, marker);
}

function updateAccMarkerInfoWindow(xmlDoc, marker) {
		
	if (xmlDoc.documentElement != null) {
		
		var desNodes = xmlDoc.documentElement.getElementsByTagName('description');
		
		if (desNodes.length > 0 && desNodes[0].firstChild != null)
		{
			var div = document.createElement('div'); 
			div.innerHTML = GXml.value(desNodes[0]);
						
			marker.openInfoWindow(div, {maxWidth: '300'});
		}
	}
}

function showAccInfoWindow(xmlDoc, point) {
		
	if (xmlDoc.documentElement != null) {
		
		var desNodes = xmlDoc.documentElement.getElementsByTagName('description');
		
		if (desNodes.length > 0 && desNodes[0].firstChild != null)
		{
			map.openInfoWindowHtml(point, desNodes[0].firstChild.data, {maxWidth: '300'});
		}
	}
}

var accMarkers = new Array();

function processAccVertex(xmlDoc, rateId, districtId, dateFrom, dateTill, dateRangeSelectorOnPage) {
	

	if (xmlDoc.documentElement != null)
	{
		var items = xmlDoc.documentElement.getElementsByTagName("vertex");
		
		for (i = 0; i < items.length; i++) {
			
			var item = items[i];
			
			var lat = parseFloat(item.getElementsByTagName('latitude')[0].firstChild.data);
			var	lng = parseFloat(item.getElementsByTagName('longitude')[0].firstChild.data);
			var point = new GLatLng(lat, lng);

			var isActiveMarker = (activeAccPoint != null && activeAccPoint.lat() == point.lat() && activeAccPoint.lng() == point.lng());

			var img = (isActiveMarker) ? "/images/acc-highlighted-marker.gif" : "/images/acc-marker.gif";

			var icon = new GIcon({ image: img, shadow: "/images/acc-marker-shadow.png" });
			icon.iconAnchor = new GPoint(12, 28);
			icon.iconSize = new GSize(23, 28);
			icon.shadowSize = new GSize(38, 28);
			icon.infoWindowAnchor = new GPoint(12, 28);
			icon.infoShadowAnchor = new GPoint(12, 28);

			var marker = new GMarker(point, { 
			    "icon": icon,
			    "clickable": true,
			    "zIndexProcess": function() {
			        return (isActiveMarker) ? 100 : 50;
			    } 
			});

			map.addOverlay(marker);

			if (accMarkers[lat] == null)
			    accMarkers[lat] = new Array();
			    
			accMarkers[lat][lng] = marker;
			
			google.maps.Event.addListener(marker, 'click', function() {
                accMarkerClicked(this, rateId, districtId, dateFrom, dateTill, dateRangeSelectorOnPage);
            });
        }

        GEvent.trigger(this, "AccVertexProcessed");
	}
}


function loadPointMarkers() {
    loadXmlDoc("PointRSS.aspx", processPoints);
}

function processPoints(xmlDoc) {
	
	if (xmlDoc.documentElement != null)
	{
	    var items = xmlDoc.documentElement.getElementsByTagName("vertex");

	    for (var i = 0; i < items.length; i++) {
		
		    var item = items[i];
			var id = item.getElementsByTagName('id')[0].firstChild.data;
			var ttip = item.getElementsByTagName('title')[0].firstChild.data;
			var icon = item.getElementsByTagName('icon')[0].firstChild.data;
			var lat = parseFloat(item.getElementsByTagName('latitude')[0].firstChild.data);
			var lng = parseFloat(item.getElementsByTagName('longitude')[0].firstChild.data);
			var point_type_id = parseFloat(item.getElementsByTagName('point_type_id')[0].firstChild.data);

			//4, 5, 8: metro, tram, stop
			var zIndex = (point_type_id == 4 || point_type_id == 5 || point_type_id == 8) ? 10 : 20;
			
			var gpoint = new GLatLng(lat, lng)
			var gicon = new GIcon({image: icon});
			gicon.iconSize = new GSize(25, 25);
			gicon.iconAnchor = new GPoint(12, 12);
			gicon.infoWindowAnchor = new GPoint(12, 25);
			
			var marker = null;

			if (item.getElementsByTagName('ef_venue_id').length > 0) {

			    zIndex = 30;
			    
			    marker = new GMarker(gpoint, { icon: gicon,
			        title: ttip,
			        clickable: true,
			        type: "venue",
			        "zIndexProcess": function() { return zIndex; }});
			    marker.efVenueId = item.getElementsByTagName('ef_venue_id')[0].firstChild.data;
			    
			    google.maps.Event.addListener(marker, 'click', function() {
                    venueMarkerClicked(this);
                });

			}
			else {
			
			    marker = new GMarker(gpoint, { icon: gicon,
			        title: ttip, 
			        clickable: false,
			        "zIndexProcess": function() { return zIndex; } 
			    });
			}
			
			map.addOverlay(marker);
		}
	}
}

function venueMarkerClicked(marker) {
    
	var url = "VenueMarkerInfo.aspx?efVenueId=" + marker.efVenueId;
        
    loadXmlDoc(url, updateVenueMarkerInfoWindow, marker);
}

function updateVenueMarkerInfoWindow(xmlDoc, marker) {
		
	if (xmlDoc.documentElement != null) {
		
		var desNodes = xmlDoc.documentElement.getElementsByTagName('description');
		
		if (desNodes.length > 0 && desNodes[0].firstChild != null)
		{
			var div = document.createElement('div'); 
			div.innerHTML = GXml.value(desNodes[0]);
						
			marker.openInfoWindow(div, {maxWidth: '300'});
		}
	}
}



var map;

function initMap() {
	
	if (!GBrowserIsCompatible())	
		return false;
		
	map = new GMap2(document.getElementById("map")); 
	map.addControl(new GLargeMapControl());
	map.addControl(new GScaleControl());
	map.addControl(new GMapTypeControl());
	
	window.onunload = GUnload;
	
	return true;	
}