/**
 * update markermanagers on map->moveend event
 */
function naMapMMUpdateMarkersCall(forced){
  var bounds = map.getBounds();
  var pNE = bounds.getNorthEast();
  var pSW = bounds.getSouthWest();
  var zoom = map.getZoom();
  var addToZoom = zoom - 5;
  if(addToZoom<1) addToZoom = 1;	
  
  //alert('zoom=' + zoom + '&neLat=' + pNE.lat() + '&neLng=' + pNE.lng() + '&swLat=' + pSW.lat() + '&swLng=' + pSW.lng());
  
  if(forced || l_zoom !=zoom || crossedBorders(pNE, pSW)){
		
	if($F("naGMapLocationsCheckbox")){

  		new Ajax.Request(globalBaseUrl + '/raw/getLocations4Map.php', {
			asynchronous:true, 
		    evalScripts:false,
		    parameters:'zoom=' + zoom + '&neLat=' + pNE.lat() + '&neLng=' + pNE.lng() + '&swLat=' + pSW.lat() + '&swLng=' + pSW.lng(), 
		    onLoading: naLoadingInfo(1),
		    onSuccess:function(request, json){
		        if(naMManagerLocations.getMarkerCount(20)>200){
		          naMManagerLocations.clearMarkers();
		          naMManagerLocationsIdsArr.clear();
		        }
		        naMManagerLocations.addMarkers(naMapMMMakeMarkersBatch(request.responseText,'loc'), addToZoom);
                naMManagerLocations.refresh();
                naLoadingInfo(0);
		    } 
	     });

	}


	if($F("naGMapUsersCheckbox")){
  		new Ajax.Request(globalBaseUrl + '/raw/getUsers4Map.php', {
			asynchronous:true, 
		    evalScripts:false,
		    parameters:'zoom=' + zoom + '&neLat=' + pNE.lat() + '&neLng=' + pNE.lng() + '&swLat=' + pSW.lat() + '&swLng=' + pSW.lng(), 
		    onLoading: naLoadingInfo(1),
		    onSuccess:function(request, json){
		        if(naMManagerUsers.getMarkerCount(20)>200){
		          naMManagerUsers.clearMarkers();
		          naMManagerUsersIdsArr.clear();
		        }
		        naMManagerUsers.addMarkers(naMapMMMakeMarkersBatch(request.responseText,'user'), addToZoom);
                naMManagerUsers.refresh();
                naLoadingInfo(0);
		    } 
	     });

	}


	if($F("naGMapEventsCheckbox")){
  		new Ajax.Request(globalBaseUrl + '/raw/getEvents4Map.php', {
			asynchronous:true, 
		    evalScripts:false,
		    parameters:'zoom=' + zoom + '&neLat=' + pNE.lat() + '&neLng=' + pNE.lng() + '&swLat=' + pSW.lat() + '&swLng=' + pSW.lng() + '&datespan=' + naMapShowEventsDate, 
		    onLoading: naLoadingInfo(1),
		    onSuccess:function(request, json){
		        if(naMManagerEvents.getMarkerCount(20)>200){
		          naMManagerEvents.clearMarkers();
		          naMManagerEventsIdsArr.clear();
		        }
		        naMManagerEvents.addMarkers(naMapMMMakeMarkersBatch(request.responseText,'event'), addToZoom);
                naMManagerEvents.refresh();
                naLoadingInfo(0);
		    } 
	     });

	}
		
	l_zoom = zoom;
	l_neLat = pNE.lat();
	l_neLng = pNE.lng();
	l_swLat = pSW.lat();
	l_swLng = pSW.lng();
  }//if
}


function naMapMMMakeMarkersBatch(result,type){
	var dom = GXml.parse(result);
  	var items = dom.getElementsByTagName(type)  
  	var batch = [];
  	for (var i=0; i < items.length; i++) {
  		var item = items[i];
  		var lat = item.getAttribute('lat');
  		var lng = item.getAttribute('lng');
  		var id = item.getAttribute('id');
        switch(type){
        	case 'loc':
        		if(naMManagerLocationsIdsArr.indexOf(id)=='-1'){
        			batch.push(createLocMarker(new GLatLng(lat, lng), id));
        			naMManagerLocationsIdsArr.push(id);
        		}
        		break;
        	case 'event':
        		if(naMManagerEventsIdsArr.indexOf(id)=='-1'){
        			batch.push(createEventMarker(new GLatLng(lat, lng), id));
        			naMManagerEventsIdsArr.push(id);
        		}
        		break;
        	case 'user':
        		if(naMManagerUsersIdsArr.indexOf(id)=='-1'){
       	  			var gender = item.getAttribute('gen');
 		 			var online = item.getAttribute('onl');
         			batch.push(createUserMarker(new GLatLng(lat, lng), id, gender, online));
         			naMManagerUsersIdsArr.push(id);
         		}
        		break;	
        }
    }
    return batch;
}


/**
 * check if map need update (borderbuffer crossed)
 */
function crossedBorders(pNE, pSW){
	var f = 4;
	
	if(l_zoom<10) f = 8;
	if(l_zoom<12) f = 6; 

  	var b_neLat = l_neLat + (l_neLat - l_swLat) / f;
  	var b_neLng = l_neLng + (l_neLng - l_swLng) / f;
  	var b_swLat = l_swLat - (l_neLat - l_swLat) / f;
  	var b_swLng = l_swLng - (l_neLng - l_swLng) / f;

  	if(pNE.lat() > b_neLat) return true;
  	if(pNE.lng() > b_neLng) return true;
  	if(pSW.lat() < b_swLat) return true;
  	if(pSW.lng() < b_swLng) return true;
  		  
  	return false;
}



/**
 * checkbox markermanger control
 */
function naMapMMControlsUpdate(el){
	if($(el).name == "naGMapEventsCheckbox"){
		if($(el).checked){
			naMapMMUpdateMarkersCall(true);
			$("naGMapEventsControls").show();
		}else{
			naMManagerEvents.clearMarkers();
			naMManagerEventsIdsArr.clear();
			$("naGMapEventsControls").hide();
		}
	}

	if($(el).name == "naGMapLocationsCheckbox"){
		if($(el).checked){
			naMapMMUpdateMarkersCall(true);
		}else{
			naMManagerLocations.clearMarkers();
			naMManagerLocationsIdsArr.clear();
		}
	}
	
	if($(el).name == "naGMapUsersCheckbox"){
		if($(el).checked){
			naMapMMUpdateMarkersCall(true);
		}else{
			naMManagerUsers.clearMarkers();
			naMManagerUsersIdsArr.clear();
		}
	}	
}

function naMapMMSetEventsDate(value){
	naMapShowEventsDate = value;
	naMManagerEvents.clearMarkers();
	naMManagerEventsIdsArr.clear();
	naMapMMUpdateMarkersCall(true);
}



/**
 * save the map parameters to user session
 */
function saveLastMapParametersToUserSession(){
	var center = map.getCenter();
    new Ajax.Request(saveMapParamsUrl, {
		asynchronous:true, 
		evalScripts:false,
		parameters:'lat=' + center.lat() + '&lng=' + center.lng() + '&zoom=' + map.getZoom() 
	});
}

/**
 * geocodes the address entered into the inputtext
 * and centeres the map at that location.
 */
function showLocationOnMap(address) {
  geocoder.getLocations(address, goToAddressOnMap);
}

function goToAddressOnMap(response) {
  if (!response || response.Status.code != 200) {
  	 alert('Adresse/Ort konnte leider nicht gefunden werden');
  } else {
    place = response.Placemark[0];
    point = new GLatLng(place.Point.coordinates[1],
                        place.Point.coordinates[0]);
    map.setCenter(point, 15);
  } 
}




//--- helper for creating markers ---

// create location marker
function createLocMarker(point, fkid) {
  markerOptions = { icon:naMapIconLoc };

  var marker = new GMarker(point, markerOptions);
  marker.value = fkid;
  
  GEvent.addListener(marker, "click", function() {
	  handleMarkerClicked(marker, 'getLocInfo'); 
  });
  
  return marker;
}

// create event marker
function createEventMarker(point, fkid) {
  markerOptions = { icon:naMapIconEvent };

  var marker = new GMarker(point, markerOptions);
  marker.value = fkid;
  
  GEvent.addListener(marker, "click", function() {
	  handleMarkerClicked(marker, 'getEventInfo'); 
  });
  
  return marker;
}

// create user marker
function createUserMarker(point, fkid, gender, online) {
  switch(gender){
  	case '1': 
  		if(online=='1')	markerOptions = { icon:naMapIconUserFOn };
  		else markerOptions = { icon:naMapIconUserFOff };
  		break;
  	case '2':
  		if(online=='1') markerOptions = { icon:naMapIconUserMOn };
  		else markerOptions = { icon:naMapIconUserMOff };
  		break;
  	default:
  		if(online=='1')	markerOptions = { icon:naMapIconUserFOn };
  		else markerOptions = { icon:naMapIconUserFOff };
  		break;
  }
  
  var marker = new GMarker(point, markerOptions);
  marker.value = fkid;
  
  GEvent.addListener(marker, "click", function() {
	  handleMarkerClicked(marker, 'getUserInfo'); 
  });
  
  return marker;
}


function addFkMarker(fktype, fkid, point){
  var fkmarker = null;
  switch(fktype){
    case 1:
    	fkmarker = createLocMarker(point, fkid); 
    	var action = 'getLocInfo';
    	break;
    case 2: 
    	fkmarker = createEventMarker(point, fkid); 
    	var action = 'getEventInfo';
    	break;
    case 3: 
    	fkmarker = createUserMarker(point, fkid, '1', '0'); 
    	var action = 'getUserInfo';
    	break;
    case 4: 
    	fkmarker = createUserMarker(point, fkid, '1', '1'); 
    	var action = 'getUserInfo';
    	break;
    case 5: 
    	fkmarker = createUserMarker(point, fkid, '2', '0'); 
    	var action = 'getUserInfo';    	
    	break;
    case 6: 
    	fkmarker = createUserMarker(point, fkid, '2', '1'); 
    	var action = 'getUserInfo';
    	break;
  }
  
  if(fkmarker){
  		map.addOverlay(fkmarker);
    	new Ajax.Request(globalBaseUrl + '/naGMaps/' + action + '/id/' + fkmarker.value, {
			asynchronous:true, 
			evalScripts:false, 
			onSuccess:function(request, json){
				fkmarker.openInfoWindowHtml(request.responseText);
			} 
	  	});
  }
}




function naMapCreateUserMarkerMe(point, fkid, gender){
  switch(gender){
  	case 1: 
  		markerOptions = { icon:naMapIconUserFMe };
  		break;
  	case 2:
  		markerOptions = { icon:naMapIconUserMMe };
  		break;
  	default:
  		markerOptions = { icon:naMapIconUserFMe };
  		break;
  }
  
  var marker = new GMarker(point, markerOptions);
  marker.value = fkid;
  
  GEvent.addListener(marker, "click", function() {
	  handleMarkerClicked(marker, 'getUserInfo'); 
  });
  
  return marker;	
}


function naMapCenterToUserPosition(){
	map.setCenter(naMapUserPosition, l_zoom);
}




// ajax request to get the info window
function handleMarkerClicked(marker, action){
/**  
  if(win_example1 != null){
  	win_example1.close();
  	win_example1 = null;
  }

  win_example1 = new Window({
  	className:'darkX', 
  	height:200, 
  	width:400,
  	hideEffect:Effect.Fade, 
  	resizable:false, 
  	showEffect:Effect.BlindDown, 
  	title:'Kurz - Info', 
  	url: globalBaseUrl + '/naGMaps/' + action + '/id/' +marker.value, 
  	draggable:false,
  	wiredDrag:false,
  	closable:          true,
    minimizable:       false,
    maximizable:       false,
    opacity:           0.9, 
  	zIndex:100});
  	win_example1.setStatusBar('&nbsp;');
  	win_example1.showCenter(false,405,130);
  	win_example1.setDestroyOnClose();
*/
	
	
	  new Ajax.Request(globalBaseUrl + '/naGMaps/' + action + '/id/' +marker.value, {
		asynchronous:true, 
		evalScripts:false, 
		onSuccess:function(request, json){
			marker.openInfoWindowHtml(request.responseText);
		} 
	  });
	
}



/**
 * init the icons
 */
function naInitMarkerIcons(){
	naMapIconLoc = new GIcon(G_DEFAULT_ICON);
  	naMapIconLoc.image = globalBaseUrl + '/images/shared/maps/dot.png';
  	naMapIconLoc.shadow = globalBaseUrl + '/images/shared/maps/shadow.png';
  	naMapIconLoc.iconSize = new GSize(20, 34);
	naMapIconLoc.shadowSize = new GSize(37, 34);
  	naMapIconLoc.infoWindowAnchor = new GPoint(9, 12);

	naMapIconEvent = new GIcon(G_DEFAULT_ICON);
  	naMapIconEvent.image = globalBaseUrl + '/images/shared/maps/dot-e.png';
  	naMapIconEvent.shadow = globalBaseUrl + '/images/shared/maps/shadow.png';
  	naMapIconEvent.iconSize = new GSize(20, 34);
	naMapIconEvent.shadowSize = new GSize(37, 34);
  	naMapIconEvent.infoWindowAnchor = new GPoint(9, 12);
  	
    naMapIconUserMOff = new GIcon(G_DEFAULT_ICON);
  	naMapIconUserMOff.image = globalBaseUrl + '/images/shared/maps/male-offline.png';
  	naMapIconUserMOff.shadow = globalBaseUrl + '/images/shared/maps/male-shadow.png';
  	naMapIconUserMOff.iconSize = new GSize(20, 34);
	naMapIconUserMOff.shadowSize = new GSize(37, 34);
  	naMapIconUserMOff.infoWindowAnchor = new GPoint(9, 12);
  	
    naMapIconUserMOn = new GIcon(G_DEFAULT_ICON);
  	naMapIconUserMOn.image = globalBaseUrl + '/images/shared/maps/male-online.png';
  	naMapIconUserMOn.shadow = globalBaseUrl + '/images/shared/maps/male-shadow.png';
  	naMapIconUserMOn.iconSize = new GSize(20, 34);
	naMapIconUserMOn.shadowSize = new GSize(37, 34);
  	naMapIconUserMOn.infoWindowAnchor = new GPoint(9, 12);
  	
    naMapIconUserFOff = new GIcon(G_DEFAULT_ICON);
  	naMapIconUserFOff.image = globalBaseUrl + '/images/shared/maps/female-offline.png';
  	naMapIconUserFOff.shadow = globalBaseUrl + '/images/shared/maps/female-shadow.png';
  	naMapIconUserFOff.iconSize = new GSize(20, 34);
	naMapIconUserFOff.shadowSize = new GSize(37, 34);
  	naMapIconUserFOff.infoWindowAnchor = new GPoint(9, 12);
  	
    naMapIconUserFOn = new GIcon(G_DEFAULT_ICON);
  	naMapIconUserFOn.image = globalBaseUrl + '/images/shared/maps/female-online.png';
  	naMapIconUserFOn.shadow = globalBaseUrl + '/images/shared/maps/female-shadow.png';
  	naMapIconUserFOn.iconSize = new GSize(20, 34);
	naMapIconUserFOn.shadowSize = new GSize(37, 34);
  	naMapIconUserFOn.infoWindowAnchor = new GPoint(9, 12);
  	
  	naMapIconUserFMe = new GIcon();
  	naMapIconUserFMe.image = globalBaseUrl + '/images/shared/maps/female-me.png';
  	naMapIconUserFMe.shadow = globalBaseUrl + '/images/shared/maps/female-me-shadow.png';
  	naMapIconUserFMe.iconSize = new GSize(20, 68);
  	naMapIconUserFMe.iconAnchor = new GPoint(9, 68);
	naMapIconUserFMe.shadowSize = new GSize(37, 68);
  	naMapIconUserFMe.infoWindowAnchor = new GPoint(9, 12);  	  	  	
  	
    naMapIconUserMMe = new GIcon();
  	naMapIconUserMMe.image = globalBaseUrl + '/images/shared/maps/male-me.png';
  	naMapIconUserMMe.shadow = globalBaseUrl + '/images/shared/maps/male-me-shadow.png';
  	naMapIconUserMMe.iconSize = new GSize(20, 68);
  	naMapIconUserMMe.iconAnchor = new GPoint(9, 68);
	naMapIconUserMMe.shadowSize = new GSize(37, 68);
  	naMapIconUserMMe.infoWindowAnchor = new GPoint(9, 12);  	  	  	
  	  	  	  	
}


function initNaLoadingInfo(){
	new Insertion.Top("naGMapAll", "<div id='naGMapLoadingInfo' class='naGMapOverlay' >Lade...<img src='" + globalBaseUrl + "/images/icons/ajax-loader.gif''></div>")
	$('naGMapLoadingInfo').hide();
} 

function naLoadingInfo(onoff){
	if(onoff<=0) naGMapActIndex--;
	if(onoff>=1) naGMapActIndex++;
	
	if(naGMapActIndex>=1) $('naGMapLoadingInfo').show(); 
	if(naGMapActIndex<=0) $('naGMapLoadingInfo').hide();
}

