	var isMapActive = false;
	var map;
	var geocoder;
	var marker;
	var geoFields = Array('country', 'region', 'region-district', 'city', 'city-district', 'street', 'house-num', 'house-num-slash');
	if (!realtType)
		var realtType = 'flat';
	
	var mapCallbacks = new Array();
		
	var baseIcon = new GIcon();
	baseIcon.iconSize = new GSize(22, 23);
	baseIcon.iconAnchor = new GPoint(0, 23);
	baseIcon.infoWindowAnchor = new GPoint(10, 10);
	
	function setRequired(field, state) {
		var fieldObj = $('#'+field);
		if (state == false) {
			fieldObj.removeClass('req');
			var row = fieldObj.closest('tr:not(.notParent)');
			row.find('td.legend .reqired').remove();
			row.find('.bold').removeClass('bold');
		} else {
			if (!fieldObj.hasClass('req')) {
				fieldObj.addClass('req');
			}
			var row = fieldObj.closest('tr:not(.notParent)');
			if (row.find('td.legend .reqired').size() < 1) {
				row.find('td.legend span:not(.reqired, .bold)').addClass('bold');
				row.find('td.legend').prepend($('<span class="reqired">*</span>'));
			}
		}
	}
	
	function killGMap(){
		isMapActive = false;
		$('#lat, #lng').attr('disabled','disabled');
		setRequired('house-num', true);
  		if (realtType == 'land') 
  			setRequired('street', true);
	}
	
	function setMarker(latlng) {
		var itemIcon = new GIcon(baseIcon);
		itemIcon.image = urlRoot+"templates/prototype/img/"+realtType+".png";
		
		marker = new GMarker(latlng, { icon:itemIcon });
      	GEvent.addListener(marker, "click", function(overlay,latlng) {
      		var latlngInputs = $('#lat, #lng');
      		latlngInputs.attr('disabled','disabled');
      		latlngInputs.val('');
      		marker = false;
      		setRequired('house-num', true);
      		if (realtType == 'land') {
      			setRequired('street', true);
      		}
      	});
      	$('#lat').val(latlng.lat());
      	$('#lng').val(latlng.lng());
      	$('#lat, #lng').attr('disabled','');
    	map.addOverlay(marker);
    	setRequired('house-num', false);
    	if (realtType == 'land') {
  			setRequired('street', false);
  		}
	}
	
	function initializeGMap() {
      if (GBrowserIsCompatible()) {
        if (!geocoder) geocoder = new GClientGeocoder();
      	if (!map) {
        	map = new GMap2(document.getElementById("mapCanvas"), {draggableCursor: 'pointer', draggingCursor: 'pointer'});
        	showAddress(map,geocoder,Lang.getVar("STR_UKRAINE"));
	        map.setUIToDefault();
	        map.disableScrollWheelZoom();
	        GEvent.addListener(map, "click", function(overlay,latlng) {
	          	map.clearOverlays();
	          	setMarker(latlng);
	        });
        }
        showAddressByFormData(map,geocoder, function() { 
	        if ($('#lat').val().length > 0 && $('#lng').val().length > 0 ) {
	        	$('#lat, #lng').attr('disabled','');
	        	map.clearOverlays();
	        	var coords = new GLatLng($('#lat').val(), $('#lng').val());
	        	setMarker(coords);
	        	map.setCenter(coords);
	        }
        });
        isMapActive = true;
      }
      if (typeof(mapCallbacks['onShow']) == 'function') mapCallbacks['onShow'].call();
    }
    function showAddressByFormData(map,geocoder,callback){
        var address = '';
        var i;
        for (i in geoFields) {
        	var value = $('select#'+geoFields[i]+':visible option:selected').text();
        	var delimiter = ', ';
        	if (geoFields[i] == 'country' && value == '') value = Lang.getVar("STR_UKRAINE");
        	else if (geoFields[i] == 'street') {
        		value = (typeof($('#'+geoFields[i]).val()) == 'undefined' ? '' : $('#'+geoFields[i]).val());
        		delimiter = ' ';
        	}
        	else if (geoFields[i] == 'house-num') {
        		value = (typeof($('#'+geoFields[i]).val()) == 'undefined' ? '' : $('#'+geoFields[i]).val());
        		delimiter = '';
        	}
        	else if (geoFields[i] == 'house-num-slash') {
        		var field = $('#'+geoFields[i]);
        		value = (typeof(field.val()) == 'undefined' || field.val().length < 1 ? '' : '/'+field.val());
        		delimiter = '';
        	}
        	if (value.length > 0 && value.indexOf('...') == '-1') address += value + delimiter;
        }
        //alert(address);
        showAddress(map,geocoder,address,callback);
    }
    function showAddress(map,geocoder,address,callback) {
    	var tabAccuracy = new Array(2,4,6,10,12,13,16,16,17);
    	geocoder.getLocations(
		    address,
		    function(response) {
		      if (response.Status.code==200) {
		      	place = response.Placemark[0];
		        accuracy = place.AddressDetails.Accuracy;
		        map.setCenter(new GLatLng(place.Point.coordinates[1],
		        				          place.Point.coordinates[0]), tabAccuracy[accuracy]);
		      }
		      if (typeof(callback) == 'function') callback.call();
		    }
		);
    }
    
    var mapCheckbox = $('#showOnMap');
	mapCheckbox.change(function(){
		if ($(this).is(':checked')) {
			$('#showOnMapRow').show();
			initializeGMap();
		}
		else {
			$('#showOnMapRow').hide();
			killGMap();
		}
	});
	mapCheckbox.click(function(){$(this).change();});
	
	var i;
	var fieldsSelector = '';
	for (i in geoFields) fieldsSelector += '#'+geoFields[i]+', ';
	
	$(fieldsSelector).change(function(){
		if (isMapActive) {
			showAddressByFormData(map,geocoder);
		}
	});
	
	$(function(){
		if (mapCheckbox.is(':checked')) mapCheckbox.change();
		if (dst) {
			var mapMarginFix = function(){
				var rightTopEditBlock = $('.top-right-block');
				var mapCanvas = $('#showOnMapRow>td>p:visible');
				if (rightTopEditBlock.size() > 0 && mapCanvas.size() > 0) {
					var blockBootomY = rightTopEditBlock.position().top + rightTopEditBlock.height();
					if (blockBootomY > mapCanvas.position().top) {
						mapCanvas.css('margin-top', parseInt(blockBootomY - mapCanvas.position().top)+'px');
					}
				}
			};
			mapMarginFix.call();
			mapCallbacks['onShow'] = mapMarginFix;
			dst.addAllFieldsChangeCallback(mapMarginFix);
			dst.addFieldShowCallback(mapMarginFix);
		}
	});
	