function createMarker(objJsonData) {
	
	var objIcon 				= new GIcon();
	objIcon.image 				= baseUrl + "img/" + objJsonData.markericon;
	objIcon.shadow 				= baseUrl + "img/shadow.png";
	objIcon.iconSize 			= new GSize(16, 28);
//	objIcon.iconSize 			= new GSize(20, 34);
	objIcon.shadowSize 			= new GSize(40, 28);
	objIcon.iconAnchor 			= new GPoint(6, 20);
	objIcon.infoWindowAnchor 	= new GPoint(5, 1);
	
	/*objIcon.iconSize = new GSize(12, 20);
	objIcon.shadowSize = new GSize(22, 20);
	objIcon.iconAnchor = new GPoint(6, 20);
	objIcon.infoWindowAnchor = new GPoint(5, 1);*/
	
	var nspMarkerOptions = { icon:objIcon };
	var objMarkerPoint	= new GLatLng(objJsonData.latitude, objJsonData.longitude);
	
	var objMarker 		= new GMarker(objMarkerPoint, nspMarkerOptions);
	
	GEvent.addListener(objMarker, "click", function() {
		
		$('WaitingLabel').show();
		
		var strUrl = baseUrl + "mapdata/locationinfo" 
			+ "/h/" + objJsonData.coordshash
			+ "/n/" + $('NetworkSelection').value
			+ "/b/" + $('BandSelection').value
			+ "/v/" + $('ViewMode').value;
		
		GDownloadUrl(strUrl, function(MarkerData, responseCode) {
			objMarker.openInfoWindowHtml(MarkerData);
			$('WaitingLabel').hide();
	    });
		
	});
	
	return objMarker;
	
}

function closeSearchResults() {
	$('search_results').innerHTML = '';
	$('search_results').hide();
	$('search_results_title').hide();
	$('toolbox_title').show();
	$('toolbox').show();
}

function displayMarkers(objMap, SearchAddress) {
	getCurrentViewCoords(objMap);
    loadJson(objMap, SearchAddress);
}

function displaySearchPoint(objMap, SearchAddress) {
	var objIcon = new GIcon();
	objIcon.image			= 'http://maps.google.com/mapfiles/kml/pal3/icon52.png';
	objIcon.shadow			= '';
	objIcon.iconSize		= new GSize(32,32);
	objIcon.iconAnchor		= new GPoint(16,16);
	objIcon.infoWindowAnchor= new GPoint(16,16);
	
	var objBounds 	= objMap.getBounds();
	var objMarker 	= new GMarker(objBounds.getCenter(), {icon: objIcon, title: SearchAddress});
	var output 		= '<div id="search_bubble"><p><strong>Odnaleziona lokalizacja:</strong><br /><small>' + SearchAddress + '</small></p><p class="gpsinfo">GPS: ' + objBounds.getCenter().lat() + ',' + objBounds.getCenter().lng() + '</p></div>';
	
	objMap.addOverlay(objMarker);
	objMarker.openInfoWindowHtml(output);	
}

function displayResultCount(ResultCount) {
	
	var resultCountThreshold = 500;
	
	$('ResultsCount').innerHTML 	= ResultCount;
    $('ResultsCount').style.color 	= ResultCount == resultCountThreshold ? 'red' : 'black';
    $('ResultsCount').title 		= ResultCount == resultCountThreshold ? 'Liczba wyświetlonych lokalizacji sztywno ograniczona do ' + resultCountThreshold : '';
	
    if (ResultCount == 0) {
    	$('ExportLocationsButton').hide();
    } else {
    	$('ExportLocationsButton').show();
    }
}

function disableSelectors() {
	
	$('WaitingLabel').show();
	$('NetworkSelection').disabled 		= true;
	$('BandSelection_GSM').disabled 	= true;
//	$('BandSelection_GSM900').disabled 	= true;
//	$('BandSelection_GSM1800').disabled = true;
	$('BandSelection_UMTS').disabled 	= true;
	$('BandSelection_CDMA').disabled 	= true;
	$('ViewMode').disabled 				= true;
	
}

function enableSelectors() {
	
	$('NetworkSelection').disabled  	= false;
	$('BandSelection_GSM').disabled 	= false;
//	$('BandSelection_GSM900').disabled 	= false;
//	$('BandSelection_GSM1800').disabled = false;
	$('BandSelection_UMTS').disabled 	= false;
	$('BandSelection_CDMA').disabled 	= false;
	$('ViewMode').disabled 				= false;
	$('WaitingLabel').hide();
	
}

function exportLocations() {
    var strUrl = baseUrl + "mapdata/export" 
    + "/ne/" + $('NeLatLng').value 
    + "/sw/" + $('SwLatLng').value
    + "/n/" + $('NetworkSelection').value
    + "/b/" + $('BandSelection').value
    + "/v/" + $('ViewMode').value;

    window.location = strUrl;
}

function getCurrentViewCoords(objMap) {

	var objBounds = objMap.getBounds();
	var intZoom = objMap.getBoundsZoomLevel(objBounds);
	var objCLat = objBounds.getCenter().lat();
	var objCLng = objBounds.getCenter().lng();
	var objNELat = objBounds.getNorthEast().lat();
	var objNELng = objBounds.getNorthEast().lng();
	var objSWLat = objBounds.getSouthWest().lat();
	var objSWLng = objBounds.getSouthWest().lng();
	var zoomThreshold = 11;
	
	$("Zoom").value 					= intZoom;
	$("ZoomDisplay").innerHTML 			= intZoom;
	$("CLatLng").value 					= objCLat + "," + objCLng;
	$("NeLatLng").value 				= objNELat + "," + objNELng;
	$("SwLatLng").value 				= objSWLat + "," + objSWLng;
	$("DirectMapLink").value 			= baseUrl + "gps/ll/" + objCLat + "," + objCLng + "/z/" + intZoom;
	
	$("ZoomDisplay").style.color 	= intZoom < zoomThreshold ? 'red' : 'black';
	$("ZoomDisplay").title 			= intZoom < zoomThreshold ? 'Lokalizacje są wyświetlane od poziomu zbliżenia ' + zoomThreshold : '';
	
	return true;
	
}

function getMarkersFromJson(JsonInput, objMap) {
	
	objMap.clearOverlays();
	
	if (JsonInput != 'undefined' && JsonInput != null && JsonInput != '') {
	
		var objJsonData = eval("(" + JsonInput + ")");
		
		for (var i = 0; i < objJsonData.markers.length; i++) {
			var objMarker = createMarker(objJsonData.markers[i]);
			objMap.addOverlay(objMarker);
		}
		
		displayResultCount(objJsonData.markers.length);
	
	} else {
    
        enableSelectors();
        displayResultCount(0);
    
    }
	
}

function loadJson(objMap, SearchAddress) {
	
	if ($('Zoom').value >= 11) {
		
		disableSelectors();
		
		var strUrl = baseUrl + "mapdata/json" 
			+ "/ne/" + $('NeLatLng').value 
			+ "/sw/" + $('SwLatLng').value
			+ "/n/" + $('NetworkSelection').value
			+ "/b/" + $('BandSelection').value
			+ "/v/" + $('ViewMode').value;

		GDownloadUrl(strUrl, function(JsonData, responseCode) {
			getMarkersFromJson(JsonData, objMap);
			enableSelectors();
			
			// dodaj marker z rezultatem wyszukiwania, jeśli jest zdefiniowany
			if (SearchAddress) {
				displaySearchPoint(objMap, SearchAddress);
			}
	    });
    
	} else {
		
		objMap.clearOverlays();
		displayResultCount(0);
		
	}
	
}

function deg2dms(coordinate, latlng)
{
    // jeśli nie określono argumentu to nie wykonujemy funkcji
    if (latlng != 'lat' && latlng != 'lng') return;

    coordinate = Math.abs(coordinate);

    var d = Math.floor(coordinate);
    var s = ((coordinate - Math.floor(coordinate)) * 3600);
    var m = Math.floor(s / 60);

    s = (s - m * 60).toFixed(2);

    if (s < 10)
        s = '0' + s;
    if (m < 10)
        m = '0' + m;

    if (latlng == 'lat')
        var suffix = coordinate > 0 ? 'N' : 'S';
    else
        var suffix = coordinate > 0 ? 'E' : 'W';

    return d + '&ordm;' + m + '\'' + s + '\'\' ' + suffix;
}

function loadMap(InitLat, InitLng, InitZoom) {
    
	resizeMap();
	
	if (GBrowserIsCompatible()) {
		
		var objMap 			= new GMap2($('map'));
		
		var dstFrom = 0;
		var dstTo;
		var dstPoly = 0;
		
		if (InitLat > 0 && InitLng > 0) {
			
			var objInitCenter 	= new GLatLng(InitLat,InitLng);
			var objMinZoom 		= InitZoom;
			
		} else {
		
			var objInitCenter 	= new GLatLng(52.162264178512686,18.610839843749996);
			var objInitSW 		= new GLatLng(48.80686346108517,13.82080078125);
			var objInitNE 		= new GLatLng(54.99022172004893,24.58740234375);
			var objInitBounds 	= new GLatLngBounds(objInitSW, objInitNE);
			var objInitViewSize = new GSize($('map').getWidth(), $('map').getHeight());
			var objMinZoom 		= objMap.getBoundsZoomLevel(objInitBounds, objInitViewSize);

		}
		
		objMap.setUIToDefault();
		objMap.addControl(new GOverviewMapControl());
		objMap.addMapType(G_PHYSICAL_MAP);
		objMap.enableScrollWheelZoom();
		
		objMap.setCenter(objInitCenter, objMinZoom);
        displayMarkers(objMap);

        GEvent.addListener(objMap, "zoomend", function() {
        	displayMarkers(objMap);
        });
        
        GEvent.addListener(objMap, "dragend", function() {
        	displayMarkers(objMap);
        });
        
        GEvent.addListener(objMap, "mousemove", function(point) {
		
			var dist = '';
			if(dstFrom != 0) {
				dstTo = point;
				if(dstPoly != 0) {
					objMap.removeOverlay(dstPoly);
				}
				dstPoly = new GPolyline([dstFrom,dstTo], "#ff0000", 3);
				objMap.addOverlay(dstPoly);
				
				var polLen = dstPoly.getLength();
				var ta = Math.floor(polLen/550);
				if(ta > 63)	ta = 'max';
				
				dist = '<strong>' + (polLen/1000).toFixed(2) + ' km / TA=' + ta + '</strong>';
				
				$('DistanceMeasure').innerHTML = dist;
			}
			
			var lat = point.lat().toFixed(6);
			var lng = point.lng().toFixed(6);
			var lat2 = deg2dms(point.lat(), 'lat');
			var lng2 = deg2dms(point.lng(), 'lng');
			var geo_coord_info = lat + ' ' + lng + ' &hArr; ' + lat2 + ' ' + lng2;
			
			$('geo_coord').innerHTML = geo_coord_info;
			
		});
		
		GEvent.addListener(objMap, "singlerightclick", function(a,b,overlay) {
			if (overlay) {
				if (overlay instanceof GMarker) {
					if(dstFrom == overlay.getLatLng()) {
						dstFrom = 0;
						objMap.removeOverlay(dstPoly);
					} else {
						dstFrom = overlay.getLatLng();
					}
				} else {
					dstFrom = 0;
					objMap.removeOverlay(dstPoly);			
				}
			}
		});
        
        return objMap;
        		
    } else {
    	
    	return false;
    	
    }
	
}

function setBandSelection() {
	
	var strBand = "";
	
	if ($('BandSelection_GSM').checked == true) {
		strBand = strBand + "GSM,";
	}
	
//	if ($('BandSelection_GSM900').checked == true) {
//		strBand = strBand + "GSM900,";
//	}
	
//	if ($('BandSelection_GSM1800').checked == true) {
//		strBand = strBand + "GSM1800,";
//	}
	
	if ($('BandSelection_UMTS').checked == true) {
		strBand = strBand + "UMTS,";
	}
	
	if ($('BandSelection_CDMA').checked == true) {
		strBand = strBand + "CDMA,";
	}
	
	$('BandSelection').value = strBand;
	
}


function setViewMode(Mode) {
	
	$('UpdatedDate_Uke').hide();
	$('UpdatedDate_Btsearch').hide();
	$('UpdatedDate_ToCheck').hide();
	
	if (Mode == '' || Mode == 'News') {
		$('UpdatedDate_Uke').show();
	} else {
		$('UpdatedDate_' + Mode).show();
	}
	
}


function searchMap(SearchAddress) {
	
	// jeśli zapytanie jest numeryczne, pewnie chodzi o bezpośrednie koordynaty
	var numberCheck = SearchAddress.substring(0, 2);
	
	if (parseInt(numberCheck)) {
		
		var commaCheck 	= SearchAddress.indexOf(",");
		var tabCheck 	= SearchAddress.indexOf("\t");
		
		if (commaCheck > 0) {
			var searchCoords = SearchAddress.split(",");
		} else if (tabCheck > 0) {
			var searchCoords = SearchAddress.split("\t");
		} else {
			var searchCoords = SearchAddress.split(" ");
		} 
		
		if (searchCoords == 'undefined') {
			alert('Podana lokalizacja nie została odnaleziona.');
			return false;
		}
		
		var objPointFound = new GLatLng(parseFloat(searchCoords[0]), parseFloat(searchCoords[1]));
		
		objMap.setCenter(objPointFound, 15);
		displayMarkers(objMap, SearchAddress);
		
	} else {
	
		var objGeocoder = new GClientGeocoder();
		
		// dokleić ', Polska' do frazy, jeśli nie istnieje
		var suffixCheck = SearchAddress.toLowerCase().indexOf('polska');
		if (suffixCheck === -1) SearchAddress += ', Polska';
		
		objGeocoder.getLocations(SearchAddress, function(SearchResults) {
			
			if (SearchResults.Status.code == G_GEO_SUCCESS) {
				
				if (SearchResults.Placemark.length > 1) {
					
					var output = '';
					output += '<ul>';
					for (var j = 0; j < SearchResults.Placemark.length; j++) {
						var coordsFound = SearchResults.Placemark[j].Point.coordinates;
						output += '<li><a href="javascript:void(0);" onclick="objMap.setCenter(new GLatLng(' + parseFloat(coordsFound[1]) + ',' + parseFloat(coordsFound[0]) + '), 15); displayMarkers(objMap, \'' + SearchResults.Placemark[j].address + '\'); return false;">' + SearchResults.Placemark[j].address + '</a>';
					}
					output += '</ul>';
					
					$('toolbox').hide();
					$('toolbox_title').hide();
					$('search_results_title').show();
					$('search_results').show();
					$('search_results').innerHTML = output;
					
				} else {
					
					closeSearchResults();
					
				}

				// zawsze wyświetl pierwszy rezultat wyszukiwania
				coordsFound 	= SearchResults.Placemark[0].Point.coordinates;
				objPointFound 	= new GLatLng(parseFloat(coordsFound[1]), parseFloat(coordsFound[0]));
				strAddressFound	= SearchResults.Placemark[0].address != '' ? SearchResults.Placemark[0].address : SearchAddress;
				
				objMap.setCenter(objPointFound, 15);
				displayMarkers(objMap, strAddressFound);
				
			} else {
				
				alert('Podana lokalizacja nie została odnaleziona.');
				
			}
			
		});
	
	}
		
}

function resizeMap(init) {

	var viewportWidth 	= document.viewport.getWidth();
	var viewportHeight 	= document.viewport.getHeight();

	var mapTop		= 120;
	var mapHeight 	= viewportHeight - mapTop;

	$('map').style.position = 'absolute';
	$('map').style.width 	= '80%';
	$('map').style.height 	= mapHeight + 'px';
	$('map').style.left 	= 'auto';
	$('map').style.top 		= 'auto';
	$('map').style.right 	= '0px';
	$('map').style.bottom 	= '0px';
	
	$('panel').style.position 	= 'absolute';
	$('panel').style.width 		= '20%';
	$('panel').style.height 	= mapHeight + 'px';
	$('panel').style.left 		= '0px';
	$('panel').style.top 		= 'auto';
	$('panel').style.right 		= 'auto';
	$('panel').style.bottom 	= '0px';
	
}


function setDefaultView() {
	
	var requestUrl = '/mapdata/setdefault/ll/' + $("CLatLng").value + '/z/' + $("Zoom").value
	
	new Ajax.Request(requestUrl, { 
		onSuccess: function(transport) {
			if (200 == transport.status) {
				$('DefaultViewLink').hide();
				$('DefaultViewMsg').show();
			}
			setTimeout(function() { $('DefaultViewLink').show(); $('DefaultViewMsg').hide(); }, 2000);
		}
	});
	
}

// map resizer

if (window.attachEvent) { // IE
    window.attachEvent("onresize", function() { resizeMap(); if (this.objMap) { this.objMap.checkResize(); } });
} else {
    window.addEventListener("resize", function() { resizeMap(); this.objMap.checkResize(); }, false);
}
