function init(longitude, latitude, level) {  
	map = new VMapEngine(document.getElementById('map'));  
	map.setCenter(new VGeoPoint(longitude, latitude), level);  
	map.initialize();  
	VEvents.addListener ("enddrag", eventEndDrag);
	VEvents.addListener ("zoomchange", eventZoomChange);
	VEvents.addListener ("mouseclick", eventMouseClick);
	lUserPoints = new VLayer ();
	map.addLayer (lUserPoints);
	
	$('#button_zoom_in').css ('top', '40px');
	$('#button_zoom_out').css ('top', '225px');
	$('#ruller_div_0').parent ().css ('top', '57px');
	updatePrintLink ();
}

function eventEndDrag () {
	loadPoints ();
	updatePrintLink ();
	$('#mapLinkContainer').slideUp ();
}

function eventZoomChange () {
	loadPoints ();
	updatePrintLink ();
	$('#mapLinkContainer').slideUp ();
}

function eventMouseClick (point) {
	mapClick (point);
	updatePrintLink ();
	$('#mapLinkContainer').slideUp ();
}

function updatePrintLink () {
	var center = map.getCenter ();
	var lat = center.convertToGeoPoint ().getLatitude ();
	var lng = center.convertToGeoPoint ().getLongitude ();
	var zoom = map.getZoomIndex ();
	$('#printLink').attr ('href', '/map/print/?lat='+lat+'&lng='+lng+'&z='+zoom);
	$('#directLink').attr ('value', 'http://rybalka.com/map/?lat='+lat+'&lng='+lng+'&z='+zoom);
}

function mapClick (point) {
	if (mode == 1) {
		addPointToMap (point);
	}
}

function addPointToMap (point) {
	var marker = new VMarkerIcon (38, 37, '/images/map/pin.png');
    var mapMarker = new VMarker (point, marker);
    mapMarker.setDraggable (true);
    var infoWindow = new VInfoWindow('Создание метки', '<div id="userPoint'+userPointsCount+'">Название:<br /><input type="text" maxlength="35" id="title'+userPointsCount+'" class="input_braun_contact" style="width: 236px;"><br />Описание:<br /><textarea style="width: 236px;" maxlength="200" onkeyup="return ismaxlength(this)" onkeyup="return ismaxlength(this)" id="description'+userPointsCount+'"></textarea><input type="button" class="button" value="Сохранить" id="save'+userPointsCount+'" onClick="savePoint ('+userPointsCount+');">&nbsp;<input type="button" class="button" value="Отмена" onClick="cancelPoint ('+userPointsCount+');" id="cancel'+userPointsCount+'"></div>');
    infoWindow.setScrollOnOpen (true);
    infoWindow.show (point);
	infoWindow.setSize(VInfoWindow.MEDIUM);
	mapMarker.bindInfoWindow(infoWindow);
	map.addMarker (mapMarker);
    map.repaintMap ();
    userPointsMarkers [userPointsCount] = mapMarker;
    userPointsCount++;
    addPoint ();
}

function newInfoWindow (title, description) {
	var infoWindow = new VInfoWindow(title, description);
	infoWindow.setSize(320,100);
	return infoWindow;
}

function editPoint (id) {
	var marker = userPointsMarkers [id];
	var info = userPointsInfo [id];
	var infoWindow = new VInfoWindow('Создание метки', '<div id="userPoint'+id+'">Название:<br /><input type="text" maxlength="35" id="title'+id+'" class="input_braun_contact" style="width: 236px;" value="'+info.title+'"><br />Описание:<br /><textarea style="width: 236px;" maxlength="200" id="description'+id+'">'+info.description+'</textarea><input type="button" class="button" value="Сохранить" onClick="savePoint ('+id+');" id="save'+id+'">&nbsp;<input type="button" class="button" value="Отмена" id="cancel'+id+'" onClick="cancelPoint ('+id+');"></div>');
    infoWindow.setScrollOnOpen (true);
    infoWindow.show (marker.getPoint ());
	infoWindow.setSize(VInfoWindow.MEDIUM);
	marker.bindInfoWindow(infoWindow);
}

function savePoint (id) {
	var title = $.trim ($('#title'+id).attr ('value'));
	var description = $.trim ($('#description'+id).attr ('value'));
	var coords = userPointsMarkers [id].getPoint ().convertToGeoPoint ();
	var code = '';
	
	if (typeof (userPointsInfo [id]) != 'undefined' && userPointsInfo [id] !== null) {
		code = userPointsInfo [id].edit_code;
	}
	
	$('#save'+id).attr ('disabled', 'true');
	$('#cancel'+id).attr ('disabled', 'true');
	
	if (title != '') {
		$.post('/map/addpoint/', {'title': title, 'description': description, 'latitude': coords.getLatitude (), 'longitude': coords.getLongitude (), 'code' : code, 'zoom': map.getZoomIndex ()}, function (data, status) {
			if (status == "success") {
				if (data.error == 0) {
					var infoWindow = newInfoWindow (data.title, data.description+'<br />Ссылка: <a href="http://rybalka.com/map/temp/'+data.code+'/">http://rybalka.com/map/temp/'+data.code+'/</a></a><br /><a href="javascript://" onClick="editPoint ('+id+');">Редактировать</a>');
					var marker = userPointsMarkers [id];
					infoWindow.show (marker.getPoint ());
					marker.bindInfoWindow (infoWindow);
					userPointsInfo [id] = data;
				}
			}
		},
		"json"
		);
	}
	else {
		alert ('Вы забыли указать название точки!');
	}
}

function cancelPoint (id) {
	if (typeof (userPointsInfo [id]) != 'undefined' && userPointsInfo [id] !== null) {
		var data = userPointsInfo [id];
		var infoWindow = newInfoWindow (data.title, data.description+'<br />Ссылка: <a href="http://rybalka.com/map/temp/'+data.code+'/">http://rybalka.com/map/temp/'+data.code+'/</a></a><br /><a href="javascript://" onClick="editPoint ('+id+');">Редактировать</a>');
		var marker = userPointsMarkers [id];
		infoWindow.show (marker.getPoint ());
		marker.bindInfoWindow (infoWindow);
		userPointsInfo [id] = data;
	}
	else {
		var marker = userPointsMarkers [id];
		marker.closeInfoWindow ();
		marker.hide ();
		map.repaintMap ();
	}
}

function drawPoint (point) {
	var geoPoint = new VGeoPoint (point.lo, point.la);
    var marker = new VMarkerIcon (37, 34, '/images/map/point.png');
    var mapMarker = new VMarker (geoPoint, marker);
    mapMarker.setHint (point.title);
    var pointInfo = '';
    if (point.photo != 0) {
    	pointInfo += '<a href="javascript://" onClick="loadinfo ('+point.id+');"><img border="0" src="/images/points/'+point.id+'/'+point.photo+'_t.jpg" width="'+point.i_w+'" height="'+point.i_h+'"></a>';
    }
    
    pointInfo += '<div class="pointDescription">'+point.description + '<br /><a href="javascript://" onClick="loadinfo ('+point.id+');">подробнее</a></div>';
    pointInfo += '<br /><div class="fl"><b>Автор:</b> <a target="_blank" href="http://'+point.domain+'.rybalka.com/">'+point.username+'</a></div>';
    
    if (loggedIn) {
    	pointInfo += '<div class="fr"><a href="javascript://" onClick="'+(point.f ? 'delete' : 'add')+'Favorite ('+point.id+', 2, this);" style="outline:none;" class="'+(point.f ? 'in_' : '')+'favorite" title="'+(point.f ? 'удалить из избранного' : 'в избранное')+'"></a></div>';
    }
    
    pointInfo += '<div class="clear"></div>';
    var infoWindow = new VInfoWindow(point.title, pointInfo);
    if (point.photo) {
    	infoWindow.setSize(240, 200);
    }
    else {
    	infoWindow.setSize(240, 90);
    }
	mapMarker.bindInfoWindow(infoWindow);
    if (showPoint == point.id) {
    	infoWindow.setScrollOnOpen (false);
    	showPoint = 0;
    	infoWindow.show (geoPoint);
    }
	
	lUserPoints.addMarker (mapMarker);
    map.repaintMap ();
}

function loadPoints () {
	if (map.getZoomIndex () >= showPointsZoomIndex) {
		var mVisible = map.getClientRect ();
		var geoMin = mVisible.getMinPoint ().convertToGeoPoint ();
		var geoMax = mVisible.getMaxPoint ().convertToGeoPoint ();
		var geoMinLatitude = geoMin.getLatitude ();
		var geoMinLongitude = geoMin.getLongitude ();
		var geoMaxLatitude = geoMax.getLatitude ();
		var geoMaxLongitude = geoMax.getLongitude ();
		$.get ('/map/points/', {'min_la': geoMinLatitude, 'min_lo': geoMinLongitude, 'max_la': geoMaxLatitude, 'max_lo': geoMaxLongitude}, function (data, status) {
			if (status == 'success') {
				var point = false;
				for (i = 0; i < data.points.length; i++) {
					point = data.points[i];
					if (typeof (systemPoints [point.id]) == 'undefined' || systemPoints [point.id] === null) {
						systemPoints [point.id] = point;
						drawPoint (point);
					}
				}
			}
			
			if (showUserPoints && !lUserPoints.isVisible ()) {
				lUserPoints.show();
			}
			else if (!showUserPoints && lUserPoints.isVisible ()) {
				lUserPoints.hide ();
			}
		},
		"json");
	}
	else {
		if (lUserPoints.isVisible ())
			lUserPoints.hide ();
	}
}

function showHideUserpoints () {
	showUserPoints = showUserPoints ? false : true;
	if (showUserPoints) {
		$('#hidePoints').attr ('title', 'скрыть точки');
		$('#showhidebutton').attr ('src', '/images/mapHide.gif');
	}
	else {
		$('#hidePoints').attr ('title', 'показать точки');
		$('#showhidebutton').attr ('src', '/images/mapHidepress.gif');
	}
	
	if (showUserPoints && map.getZoomIndex () >= showPointsZoomIndex && !lUserPoints.isVisible ()) {
		lUserPoints.show ();
	}
	else {
		if (lUserPoints.isVisible ())
			lUserPoints.hide ();
	}
}

function addPoint () {
	if (mode == 1) {
		mode = 0;
		$('#addpointbutton').attr ('src', '/images/mapAdd.gif');
	}
	else {
		mode = 1;
		$('#addpointbutton').attr ('src', '/images/mapAddpress.gif');
	}
}

function ismaxlength(obj){
	var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
		if (obj.getAttribute && obj.value.length>mlength)
			obj.value=obj.value.substring(0,mlength);
}

function viewTempPoint (longitude, latitude, title, description) {
	var marker = new VMarkerIcon (38, 37, '/images/map/pin.png');
	var geoPoint = new VGeoPoint (longitude, latitude);
    var mapMarker = new VMarker (geoPoint, marker);
    var infoWindow = new VInfoWindow(title, description);
    infoWindow.setScrollOnOpen (false);
    infoWindow.show (geoPoint.convertToLocalPoint ());
	infoWindow.setSize(VInfoWindow.MEDIUM);
	mapMarker.bindInfoWindow(infoWindow);
	map.addMarker (mapMarker);
    map.repaintMap ();
}

function navigateTo (id, title) {
	$.post ('/map/search/', {'id':id}, function (data, status){
		if (status == 'success') {
			if (data.error == 0) {
				map.setZoomIndex (5);
				var point = new VGeoPoint (data.lng, data.lat);
				map.setCenter(point, 6);
				var marker = new VMarkerIcon (27, 35, '/images/map/arrow.png');
			    var arrow = new VMarker (point, marker);
			    map.addMarker (arrow);
				arrow.setHint (title);
				arrow.setPoint (point.convertToLocalPoint());
				map.repaintMap ();
			}
		}
	},
	"json");
}

function mapSearch () {
	var str = $('#search').attr ('value');
	if ($('#results').html () != '')
		$('#results').slideUp (100);
	$.post ('/map/search/', {'str':str}, function (data, status) {
		if (status == "success") {
			if (typeof (data.lat) != 'undefined' && data.lat !== null) {
				map.setZoomIndex (5);
				var point = new VGeoPoint (data.lng, data.lat);
				map.setCenter(point, 6);
				var marker = new VMarkerIcon (27, 35, '/images/map/arrow.png');
			    var arrow = new VMarker (point, marker);
			    map.addMarker (arrow);
				arrow.setPoint (point.convertToLocalPoint());
				map.repaintMap ();
			}
			else {
				var content = '';
				for (i = 0; i < data.length; i++) {
					current = data [i];
					content += '<div><a href="javascript://" onClick="navigateTo ('+current.id+', \''+current.title+'\');">'+current.title+'</a></div>';
				}
				$('#results').html (content);
				$('#results').slideDown ();
			}
		}
	},
	"json");
}