
/**
 *	ivisited.net — Google map functions
 *	API V3
 *	
 *	Netstar 2011 (c)
*/

var map;
var markersArray = [];
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var overlay;
var map_initial_center_pix_x = 0;
var map_initial_center_pix_y = 0;
var current_marker_index = -1;
var stroke_color = '';

// directions
var markerOptions
var polylineOptions;
var rendererOptions;

// marker icons
var default_marker_icon = "/images/icons/map/cluster5.png";
var default_marker_shadow = "/images/icons/map/shadow1.png";

/* constant definitions */
var MAX_ROUTE_POINTS = 10;

function simple_map(obj_id, latitude, longtitude, zoom, marker, map_type) 
{
	var map_type_id = google.maps.MapTypeId.ROADMAP;
	if(map_type) map_type_id = map_type;
	
    var myLatlng = new google.maps.LatLng(latitude, longtitude);
    var mapTypeControlOptions = {
    	style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    }
    var myOptions = {
      zoom: zoom,
      center: myLatlng,
      mapTypeId: map_type_id,
      mapTypeControlOptions: mapTypeControlOptions,
      scrollwheel: false
    }
    var map = new google.maps.Map(document.getElementById(obj_id), myOptions);
    
    if(marker) {
    	var m1 = new google.maps.Marker({
			position: myLatlng, 
			icon: default_marker_icon,
			shadow: default_marker_shadow,
        	map: map
    	});
    }
    
    return map;
}

function default_map(obj_id, latitude, longtitude, zoom, marker, map_type) 
{
	var map_type_id = google.maps.MapTypeId.ROADMAP;
	if(map_type) map_type_id = map_type;
	
    var myLatlng = new google.maps.LatLng(latitude, longtitude);
    var myOptions = {
      zoom: zoom,
      center: myLatlng,
      mapTypeId: map_type_id,
      scrollwheel: false
    }
    var map = new google.maps.Map(document.getElementById(obj_id), myOptions);
    
    if(marker) {
    	var m1 = new google.maps.Marker({
			position: myLatlng, 
			draggable: true, 
			animation: google.maps.Animation.DROP,
			icon: default_marker_icon,
			shadow: default_marker_shadow,
        	map: map
    	});
    	
	  	google.maps.event.addListener(m1, 'dragstart', function(event) {
    		my_marker_dragstart(event.latLng);
    		//map.setCenter(event.latLng);
  		});
  		
	  	google.maps.event.addListener(m1, 'dragend', function(event) {
    		my_marker_dragend(event.latLng);
    		map.setCenter(event.latLng);
  		});
    }
    
    return map;
}

function simple_map_rmenu(obj_id, latitude, longtitude, zoom, map_type) 
{
	DannoOverlay = function () { };
	DannoOverlay.prototype = google.maps.OverlayView.prototype;
	DannoOverlay.prototype.classname = 'DannoOverlay';
	DannoOverlay.prototype.draw = function () { };
	DannoOverlay.prototype.onAdd = function () { };
	DannoOverlay.prototype.onRemove = function () { };
	
	var map_type_id = google.maps.MapTypeId.ROADMAP;
	if(map_type) map_type_id = map_type;
	
    var myLatlng = new google.maps.LatLng(latitude, longtitude);
    var mapTypeControlOptions = {
    	style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    }
    var myOptions = {
      zoom: zoom,
      center: myLatlng,
      mapTypeId: map_type_id,
      mapTypeControlOptions: mapTypeControlOptions,
      scrollwheel: false
    }
    var map2 = new google.maps.Map(document.getElementById(obj_id), myOptions);
    
	overlay = new DannoOverlay;
	overlay.setMap(map2);
	
	map_initial_center_pix_x = Math.round(map2.getDiv().clientWidth / 2);
	map_initial_center_pix_y = Math.round(map2.getDiv().clientHeight / 2);
    
    return map2;
}

/*function simple_map_info(obj_id, latitude, longtitude, zoom, info_message, map_type) 
{
	var map_type_id = google.maps.MapTypeId.ROADMAP;
	if(map_type) map_type_id = map_type;
	
    var myLatlng = new google.maps.LatLng(latitude, longtitude);
    var myOptions = {
      zoom: zoom,
      center: myLatlng,
      mapTypeId: map_type_id,
      scrollwheel: false
    }
    var map = new google.maps.Map(document.getElementById(obj_id), myOptions);
    
    if(info_message) {
    	var infowindow = new google.maps.InfoWindow({
    	    content: info_message
    	});
    	var marker = new google.maps.Marker({
			position: myLatlng, 
			icon: default_marker_icon,
			shadow: default_marker_shadow,
        	map: map
    	});
    	infowindow.open(map,marker);
    }
    
    return map;
}*/

function map_item_add(obj_id, latitude, longtitude, zoom, map_type)
{
	DannoOverlay = function () { };
	DannoOverlay.prototype = google.maps.OverlayView.prototype;
	DannoOverlay.prototype.classname = 'DannoOverlay';
	DannoOverlay.prototype.draw = function () { };
	DannoOverlay.prototype.onAdd = function () { };
	DannoOverlay.prototype.onRemove = function () { };
    
	var map_type_id = google.maps.MapTypeId.ROADMAP;
	if(map_type) map_type_id = map_type;
	
    var myLatlng = new google.maps.LatLng(latitude, longtitude);
    var mapTypeControlOptions = {
    	style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    }
    var myOptions = {
      zoom: zoom,
      center: myLatlng,
      mapTypeId: map_type_id,
      mapTypeControlOptions: mapTypeControlOptions,
      scrollwheel: false
    }
    map = new google.maps.Map(document.getElementById(obj_id), myOptions);
    
	overlay = new DannoOverlay;
	overlay.setMap(map);
	
	map_initial_center_pix_x = Math.round(map.getDiv().clientWidth / 2);
	map_initial_center_pix_y = Math.round(map.getDiv().clientHeight / 2);
    
  	google.maps.event.addListener(map, 'click', function(event) {
  		closeMarkerMenu();
    	addMarker(event.latLng);
  	});
  	google.maps.event.addListener(map, 'rightclick', function(event) {
    	closeMarkerMenu();
  	});
  	google.maps.event.addListener(map, 'center_changed', function(event) {
    	closeMarkerMenu();
  	});
  	google.maps.event.addListener(map, 'zoom_changed', function(event) {
    	closeMarkerMenu();
  	});
  	/*google.maps.event.addListener(map, 'maptypeid_changed', (function(map) {
  		return function(event)
  		{
  			setStrokeColor(map);
  		}
  	})(map));*/
  	
	stroke_color = setStrokeColor(map);
	
	markerOptions = {
		visible: false/*,
		icon: '/images/icons/map/cluster5.png',
		shadow: '/images/icons/map/shadow1.png'*/
	};
	
	polylineOptions = {
		strokeColor: stroke_color,
		strokeOpacity: 0.8,
		strokeWeight: 4
	};
	
	rendererOptions = {
	  	/*draggable: true,*/
	  	preserveViewport: true,
	  	markerOptions: markerOptions,
	  	polylineOptions: polylineOptions
	};
  	
  	directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
  	directionsDisplay.setMap(map);
    
    return map;
}

function setStrokeColor(map)
{
	if(map.mapTypeId == 'roadmap') return '#606672';
	else return '#6380b9';
}

function addMarker(location, pos, moid)
{
	if(markersArray.count() >= MAX_ROUTE_POINTS) {
		alert('You can add maximum ' + MAX_ROUTE_POINTS + ' routing points! It\'s a Google constraint.');
		return;
	}
	
	var marker_index = -1;
	
	marker = new google.maps.Marker({
		position: location, 
		draggable: true, 
		map: map, 
		icon: default_marker_icon,
		shadow: default_marker_shadow,
		animation: google.maps.Animation.DROP,
		map_item_id: moid
	});
	
	if(pos > 0) { // insert
		markersArray.splice(pos, 0, marker);
		
		insertMarkerData(pos);
		
		for(i = 0; i < markersArray.count(); i++) {
			c_marker = markersArray[i];
			
			google.maps.event.clearListeners(c_marker);
			
			/*google.maps.event.addListener(c_marker, 'click', function(event) {
	    		alert('left');
  			});*/
		    
	  		google.maps.event.addListener(c_marker, 'rightclick', (function(i) {
	        	return function(event)
        		{
        			if(i != current_marker_index) closeMarkerMenu();
            		openMarkerMenu(i);
        		};
    		})(i));
		  	
	  		google.maps.event.addListener(c_marker, 'dragstart', function(event) {
	    		closeMarkerMenu();
  			});
  			
	  		google.maps.event.addListener(c_marker, 'dragend', (function(i) {
        		return function(event)
	        	{
        			saveMarkerData(i);
	  				showRoute();
        		};
    		})(i));
		}
	}
	else { // add
		markersArray.push(marker);
		
		marker_index = markersArray.count() - 1;
		
		if(!moid) saveMarkerData(marker_index);
		
		/*google.maps.event.addListener(marker, 'click', function(event) {
    		alert('left');
  		});*/
	    
	  	google.maps.event.addListener(marker, 'rightclick', (function(marker_index) {
        	return function(event)
        	{
	  			if(marker_index != current_marker_index) closeMarkerMenu();
            	openMarkerMenu(marker_index);
        	};
    	})(marker_index));
	  	
	  	google.maps.event.addListener(marker, 'dragstart', function(event) {
    		closeMarkerMenu();
  		});
	  	
	  	google.maps.event.addListener(marker, 'dragend', (function(marker_index) {
        	return function(event)
        	{
        		saveMarkerData(marker_index);
	  			showRoute();
        	};
    	})(marker_index));
	}
  	
  	showRoute();
}

function insertMarkerIntoArray(location, pos)
{	
	marker = new google.maps.Marker({
		position: location, 
		draggable: true, 
		map: map, 
		icon: default_marker_icon,
		shadow: default_marker_shadow,
		animation: google.maps.Animation.DROP
	});
	
	markersArray.splice(pos, 0, marker);
	
	var marker_index = pos;
	
	google.maps.event.addListener(marker, 'rightclick', (function(marker_index) {
    return function(event) {
		if(marker_index != current_marker_index) closeMarkerMenu();
         	openMarkerMenu(marker_index);
    	};
   	})(marker_index));
   	
   	google.maps.event.addListener(marker, 'dragstart', function(event) {
    	closeMarkerMenu();
  	});
  	
  	google.maps.event.addListener(marker, 'dragend', (function(marker_index) {
  		return function(event) {
  			saveMarkerData(marker_index);
  			showRoute();
  		};
  	})(marker_index));
  	
  	//showRoute();
}

function showRoute()
{
	if(markersArray.count() < 1) return;
	
	var waypts = [];
	for(var i = 1; i < markersArray.count() - 1; i++) {
		waypts.push({
			location: markersArray[i].position,
			stopover: true
		});
	}
	
	var request = {
		origin: markersArray[0].position, 
		destination: markersArray[markersArray.count() - 1].position,
		waypoints: waypts,
		/*optimizeWaypoints: true,*/
		travelMode: google.maps.DirectionsTravelMode.WALKING
	};
	
	directionsService.route(request, function(response, status) {
		if(status == google.maps.DirectionsStatus.OK) {
			directionsDisplay.setDirections(response);
		}
	});
}

function openMarkerMenu(marker_index)
{
	var marker = markersArray[marker_index];
	
	var status = $('#marker_menu').css( 'display' );
	if(status == 'none') {
		var c = overlay.getProjection().fromLatLngToDivPixel(marker.getPosition());
		var c3 = overlay.getProjection().fromLatLngToDivPixel(map.getCenter());
		
		var cx = $('#map_to_add').offset().left;
		var cy = $('#map_to_add').offset().top;
		var c1 = 16;
		var c2 = -32;
		
		$('#marker_menu').css( 'left', c.x + cx + c1 - c3.x + map_initial_center_pix_x + 'px' );
		$('#marker_menu').css( 'top', c.y + cy + c2 - c3.y + map_initial_center_pix_y + 'px' );
		$('#marker_menu').css( 'display', 'block' );
		
		current_marker_index = -1;
		
		for(i = 0; i < markersArray.count(); i++) {
			if(markersArray[i].position == marker.position) current_marker_index = i;
		}
	}
	else closeMarkerMenu(marker);
	
	return false;
}

function closeMarkerMenu()
{
	$('#marker_menu').css( 'display', 'none' );
	
	return false;
}

function deleteMarker()
{
	markersArray[current_marker_index].setMap();
	
	google.maps.event.clearListeners(markersArray[current_marker_index]);
	
	deleteMarkerData(current_marker_index);
	
	markersArray.splice(current_marker_index, 1);
	
	for(i = 0; i < markersArray.count(); i++) {
		c_marker = markersArray[i];
		
		google.maps.event.clearListeners(c_marker);
		
		/*google.maps.event.addListener(c_marker, 'click', function(event) {
	   		alert('left');
  		});*/
	    
	 	google.maps.event.addListener(c_marker, 'rightclick', (function(i) {
	       	return function(event)
       		{
       			if(i != current_marker_index) closeMarkerMenu();
           		openMarkerMenu(i);
       		};
    	})(i));
	  	
	 	google.maps.event.addListener(c_marker, 'dragstart', function(event) {
	   		closeMarkerMenu();
  		});
	  	
	  	google.maps.event.addListener(c_marker, 'dragend', (function(i) {
        	return function(event)
        	{
        		saveMarkerData(i);
	  			showRoute();
        	};
    	})(i));
	}
	
	closeMarkerMenu();
	
	showRoute();
	
	return false;
}

function insertMarker()
{
	new_position = new google.maps.LatLng(markersArray[current_marker_index].position.lat(), markersArray[current_marker_index].position.lng() + MARKER_ZOOM_SHIFT[map.getZoom()]);
	
	closeMarkerMenu();
	
	addMarker(new_position, current_marker_index + 1);
	
	return false;
}

function placeMarkers()
{
	//alert('ok');
	//markersArray = item_objects;
	
	showRoute();	
}

function getMapDataCenter(mo)
{
	var c;
	var rv = new Array();
	c = mo.getCenter() ;
	rv[0] = c.lat();
	rv[1] = c.lng();
	rv[2] = mo.getZoom();
	
	return rv;
}

function setMapCenter()
{
	map.setCenter(markersArray[current_marker_index].getPosition());
	
	return false;
}

function setCMapCenter(cmap, latlng)
{
	cmap.setCenter(latlng);
	
	return false;
}

function openAddPhotoBox()
{
	closeMarkerMenu();
	
	var marker = markersArray[current_marker_index];
	
	var c = overlay.getProjection().fromLatLngToDivPixel(marker.getPosition());
	var c3 = overlay.getProjection().fromLatLngToDivPixel(map.getCenter());
	
	var cx = $('#map_to_add').offset().left;
	var cy = $('#map_to_add').offset().top;
	var c1 = 16;
	var c2 = -32;
	
	$('#add_photo_box').css( 'left', c.x + cx + c1 - c3.x + map_initial_center_pix_x + 'px' );
	$('#add_photo_box').css( 'top', c.y + cy + c2 - c3.y + map_initial_center_pix_y + 'px' );
	$('#add_photo_box').css( 'display', 'block' );
	
	return false;
}

function closeAddPhotoBox()
{
	$('#add_photo_box').css( 'display', 'none' );
	
	return false;
}

function openPhotosBox()
{
	closeMarkerMenu();
	
	var marker = markersArray[current_marker_index];
	
	var c = overlay.getProjection().fromLatLngToDivPixel(marker.getPosition());
	var c3 = overlay.getProjection().fromLatLngToDivPixel(map.getCenter());
	
	var cx = $('#map_to_add').offset().left;
	var cy = $('#map_to_add').offset().top;
	var c1 = 16;
	var c2 = -32;
	
	$('#photos_preview_box').load('/item/ajax1');
	
	$('#photos_preview_box').css( 'left', c.x + cx + c1 - c3.x + map_initial_center_pix_x + 'px' );
	$('#photos_preview_box').css( 'top', c.y + cy + c2 - c3.y + map_initial_center_pix_y + 'px' );
	$('#photos_preview_box').css( 'display', 'block' );
	
	return false;
}

function closePhotosBox()
{
	$('#photos_preview_box').css( 'display', 'none' );
	
	return false;
}








