var map = null;
var geocoder = null;
var center;
var zoom = 15;
var loaded_markers = new Array();
var sat_map_type = false;
var last_zi = 1000;
var current_cloud = null;
var now_worked = false;
var map_suggest_timer;
var place_to_show = null;
var a_place_to_show = null;
var map_type = 'main';
var current_user = 0;

var tpl_c  = '<div class="mcloud_c"><div class="mcb">{NAME}</div><span class="mcloud_c_m"></span></div>';
var tpl_v  = '<div class="mcloud_cmp"><div class="mcb">{NAME}</div><span class="mcloud_c_m"></span></div>';
var tpl_p  = '<div class="mcloud_csp"><div class="mcb">{NAME}</div><span class="mcloud_c_m"></span></div>';
var tpl_pd = '<div class="mcloud_cspd"><div class="mcb">{NAME}</div><span class="mcloud_c_m"></span></div>';
var tpl_ub = '<div class="mcloud_cub"><div class="mcb">{NAME}</div><span class="mcloud_c_m"></span></div>';
var tpl_uw = '<div class="mcloud_cuw"><div class="mcb">{NAME}</div><span class="mcloud_c_m"></span></div>';

//////=================================

function Cloud ( type, point, data )
{
	this.type_    = type;
	this.center_  = point;
	this.data_    = data;
}

Cloud.prototype = new GOverlay();

Cloud.prototype.initialize = function ( map )
{
    var cloud = null;
    
    switch ( this.type_ )
    {
        case 'small':
            switch ( this.data_.p_map )
            {
                case '0':
                    cloud = tpl_c.replace ( '{NAME}', this.data_.name );
                    break;
                
                case '3':
                    cloud = tpl_pd.replace ( '{NAME}', this.data_.name );
                    break;
                    
                case '2':
                    cloud = tpl_p.replace ( '{NAME}', this.data_.name );
                    break;
                    
                case '1':
                    cloud = tpl_v.replace ( '{NAME}', this.data_.name );
                    break;
            }
            break;
        
        case 'user':
            switch ( this.data_.ut )
            {
                case 'best':
                    cloud = tpl_ub.replace ( '{NAME}', this.data_.name );
                    break;
                    
                case 'worst':
                    cloud = tpl_uw.replace ( '{NAME}', this.data_.name );
                    break;
            }
            break;
                
        case 'one':
            var cont = $( tpl_c );
            cont.find ( 'div.mcb' ).html ( '<div class="map_place_name mpno"><a href="/site/all/main/' + this.data_.id + '/">' + this.data_.name + '</a></div>' + this.data_.address );
            break;
    }

    if ( typeof ( cont ) != 'undefined' )
    {
        var domel = cont.get ( 0 );
    } else {
        var domel = $( cloud ).get ( 0 );
    }

    this.map_   = map;
	this.domel_ = domel;
	
	this.block_ = $( this.domel_ ).find ( 'div.mcb' ).get ( 0 );
	this.mk_    = $( this.domel_ ).find ( 'span.mcloud_c_m' ).get ( 0 );

	if ( this.type_ == 'small' || this.type_ == 'user' )
	{
        GEvent.addDomListener ( this.block_, 'mouseover', function () {
        	$( domel ).css ( 'zIndex', last_zi );
        	last_zi++;
        } );
        
        GEvent.addDomListener ( this.mk_, 'mouseover', function () {
        	$( domel ).css ( 'zIndex', last_zi );
        	last_zi++;
        } );
	}

    var id = this.data_.id;

    if ( this.type_ == 'small' || this.type_ == 'user' )
    {
        this.add_click_event();
    }
    
	map.getPane( G_MAP_MARKER_PANE ).appendChild ( domel );
}

Cloud.prototype.remove = function ()
{
	$( this.domel_ ).remove();
}

Cloud.prototype.add_click_event = function ()
{
    var data = this.data_;
    
    $( this.block_ )
        .bind ( 'click', function () {
            BindClick ( data.id );
        } );
        
    $( this.mk_ )
        .bind ( 'click', function () {
            BindClick ( data.id );
        } );
}

Cloud.prototype.copy = function ()
{
	return new Cloud ( this.center_, this.content_ );
}

Cloud.prototype.redraw = function ( force )
{
	if (!force) return;
	
	var height = $( this.domel_ ).height();
	var width  = $( this.domel_ ).width();
	var pix = map.fromLatLngToDivPixel ( this.center_ );
	
	if ( this.data_.p_map == '1' )
	{
	    var hm = 22;
	} else {
	    var hm = 1;
	}
	
	this.domel_.style.width = width + 'px';
    this.domel_.style.left  = ( pix.x - width / 2 + 1 ) + 'px';
    this.domel_.style.top   = ( pix.y - height + hm ) + 'px';
    
    this.domel_.style.visibility = 'visible';
}

function MyZoomControl () {}
		
MyZoomControl.prototype = new GControl();

MyZoomControl.prototype.initialize = function ( map )
{
	var container = document.createElement ( 'div' );
	
	$( container ).css ( { background: '#c8c8a4', padding: '6px 6px 1px 6px', border: '1px #aaaa7d solid', borderTop: '0', borderLeft: '0' } );
	
	var zoomInDiv = document.createElement ( 'div' );
	this.setButtonStyle_ ( zoomInDiv, 'plus' );
	container.appendChild ( zoomInDiv );
	GEvent.addDomListener ( zoomInDiv, 'click', function() {
	    if ( map.getZoom () < 17 && map_type == 'main' ) ClearOverlays ();
		map.zoomIn ();
	} );

	var zoomOutDiv = document.createElement ( 'div' );
	this.setButtonStyle_ ( zoomOutDiv, 'minus' );
	container.appendChild ( zoomOutDiv );
	GEvent.addDomListener ( zoomOutDiv, 'click', function () {
	    if ( map.getZoom () > 1 && map_type == 'main' ) ClearOverlays ();
		map.zoomOut ();
	} );

	map.getContainer().appendChild ( container );
	return container;
}

MyZoomControl.prototype.getDefaultPosition = function ()
{
	return new GControlPosition ( G_ANCHOR_TOP_LEFT, new GSize ( 0, 0 ) );
}

MyZoomControl.prototype.setButtonStyle_ = function ( button, type )
{
	button.style.backgroundImage = 'url(/images/' + type + '.gif)';
	button.style.width 			 = '32px';
	button.style.height 		 = '33px';
	button.style.cursor 		 = 'pointer';
	button.style.marginBottom    = '5px';
}

function MyMapTypeControl ( around )
{
    this.around = around ? true : false;
}
		
MyMapTypeControl.prototype = new GControl();

MyMapTypeControl.prototype.initialize = function ( map )
{
	var container = document.createElement ( 'div' );
	
	$( container ).css ( { background: '#c8c8a4', padding: '6px 6px 6px 3px', border: '1px #aaaa7d solid', borderTop: '0', borderRight: '0' } );
	
	var mt_m = document.createElement ( 'div' );
	var mt_s = document.createElement ( 'div' );
	
	$( mt_m )
	    .css ( { cursor: 'pointer', background: '#fff', float: 'left', border: '1px #000 solid', marginLeft: '4px' } )
	    .attr ( 'id', 'map_type_button' )
	    .append ( '<div style="text-align: center; font-weight: bold; padding: 1px 0 2px 0; width: 60px; border: 1px #0062be solid;">Карта</div>' );
	$( mt_s )
	    .css ( { cursor: 'pointer', background: '#fff', float: 'left', border: '1px #000 solid', marginLeft: '4px' } )
	    .attr ( 'id', 'satellite_type_button' )
	    .append ( '<div style="text-align: center; padding: 1px 0 2px 0; width: 120px; border: 1px #fff solid;">Вид из космоса</div>' );
	
    GEvent.addDomListener ( mt_s, 'click', function () {
		map.setMapType ( G_SATELLITE_MAP );
		$( mt_s ).find ( 'div' ).css ( { fontWeight: 'bold', border: '1px #0062be solid' } );
		$( mt_m ).find ( 'div' ).css ( { fontWeight: 'normal', border: '1px #fff solid' } );
	} );
	
	GEvent.addDomListener ( mt_m, 'click', function () {
		map.setMapType ( G_NORMAL_MAP );
		$( mt_m ).find ( 'div' ).css ( { fontWeight: 'bold', border: '1px #0062be solid' } );
		$( mt_s ).find ( 'div' ).css ( { fontWeight: 'normal', border: '1px #fff solid' } );
	} );

	if ( this.around )
	{
	    var mt_a = document.createElement ( 'div' );
	
    	$( mt_a )
    	    .css ( { cursor: 'pointer', background: '#fff', float: 'left', border: '1px #000 solid', marginLeft: '4px' } )
    	    .append ( '<div style="text-align: center; padding: 1px 0 2px 0; width: 160px; border: 1px #fff solid;">Показать все рестораны</div>' );
    	
    	container.appendChild ( mt_a );

        GEvent.addDomListener ( mt_a, 'click', function () {
            var reg = /site\/all\/main/;
            if ( reg.test ( window.location.pathname ) )
            {
                var place_id = window.location.pathname;
                    place_id = place_id.replace ( '/site/all/main/', '' );
                    place_id = place_id.replace ( '/map/', '' );
                    
        		window.location = '/map/' + place_id + '/';
            } else {
                window.location = '/map/';
            }
    	} );
    	
    	container.appendChild ( mt_a );
	}
	
	container.appendChild ( mt_m );
	container.appendChild ( mt_s );
	
	map.getContainer().appendChild ( container );
	return container;
}

MyMapTypeControl.prototype.getDefaultPosition = function ()
{
	return new GControlPosition ( G_ANCHOR_TOP_RIGHT, new GSize ( 0, 0 ) );
}

//////===============================

function BindClick ( id )
{
    $( loaded_markers[id].marker.block_ ).unbind ( 'click' );
    $( loaded_markers[id].marker.mk_    ).unbind ( 'click' );
    
    SetCloudPreWidth ( id );
    
    loaded_markers[id].marker.block_.style.cursor = 'default';
    
	$( loaded_markers[id].marker.block_ ).html ( '<div class="mc_ajax_indicator">Загрузка</div>' );
    loaded_markers[id].marker.redraw ( true );

    CloseCurrentCloud();
    current_cloud = id;
    
    if ( map_type == 'user' )
    {
        var sdata = {
            id: id,
            user: current_user
        };
        
        var f = 'u';
    } else {
        var sdata = {
            id: id
        };
        
        var f = '';
    }
    
    client_request ( 'places', 'get_' + f + 'point_data', '', 'GET', sdata, 'AfterGetPointData' );
}

function SetCloudPreWidth ( id )
{
    loaded_markers[id].marker.domel_.style.visibility = 'hidden';
    loaded_markers[id].marker.domel_.style.width = 'auto';
}

function AfterGetPointData ( data )
{
    SetCloudPreWidth ( data.place.id );
    
    var type = '';
    if ( data.place.type )
    {
        type = '<div><span>' + data.place.type + '</span></div>';
        type = '<div class="cloud_place_types">' + type + '</div>';
    }

    var photo    = data.place.photo > 0 ? '/pic/places/' + data.place.id + '/' + data.place.photo + '_r.jpg' : '/images/rc_default.gif';
    var rating   = data.place.rating > 0 ? '<img src="/images/r_ico.gif" class="icon_pos_2" height="10" width="13"> ' + data.place.rating : '';
    var opinions = data.place.opinions > 0 ? ' <img src="/images/opinions_ico.gif" class="icon_pos_2" height="10" width="12"> <a href="/site/all/main/' + data.place.id + '/opinions/">' + data.place.opinions + '</a>' : '';
    var price    = '<span class="dc_price_icons"><img src="/images/price_' + data.place.price + '.gif" width="39" height="11" /></span>';
    
    if ( rating || opinions )
    {
        price += ' <span>|</span> ';
    }
    
    if ( map_type != 'user' )
    {
        var cooking = '';
    
        if ( data.place.cooking )
        {
            cooking = '<div><span>кухня:</span> ' + data.place.cooking + '</div>';
            cooking = '<div class="cloud_place_types">' + cooking + '</div>';
        }
        
        $( loaded_markers[data.place.id].marker.block_ ).html ( '<table cellpadding="0" cellsapcing="0"><tr><td valign="top"><a href="/site/all/main/' + data.place.id + '/"><img src="' + photo + '" width="52" height="52" border="0" /></a><div style="margin-top: 5px; text-align: left;"><a href="javascript:void(0);" onclick="ZoomTo(' + loaded_markers[data.place.id].marker.data_.lat + ', ' + loaded_markers[data.place.id].marker.data_.lng + ', ' + loaded_markers[data.place.id].marker.data_.id + ');"><img src="/images/zoom.gif" width="16" height="16" /></a></div></td><td class="map_pib" valign="top">' + type + '<div class="map_place_name"><a href="/site/all/main/' + data.place.id + '/">' + data.place.name + '</a></div><div class="place_icons_2">' + price + rating + opinions + '</div><div class="cloud_address">' + data.place.address + '</div>' + cooking + '</td></tr></table>' );
    } else {
        if ( data.place.reason != '' )
        {
            var reason = '<div class="cloud_reason"><span>Считаю ' + ( loaded_markers[data.place.id].marker.data_.ut == 'best' ? 'хорошим' : 'плохим' ) + ' потому, что: </span>' + data.place.reason + '</div>';
        } else {
            var reason = '';
        }
        
        $( loaded_markers[data.place.id].marker.block_ ).html ( '<table cellpadding="0" cellsapcing="0"><tr><td valign="top"><a href="/site/all/main/' + data.place.id + '/"><img src="' + photo + '" width="52" height="52" border="0" /></a><div style="margin-top: 5px; text-align: left;"><a href="javascript:void(0);" onclick="ZoomTo(' + loaded_markers[data.place.id].marker.data_.lat + ', ' + loaded_markers[data.place.id].marker.data_.lng + ', ' + loaded_markers[data.place.id].marker.data_.id + ');"><img src="/images/zoom.gif" width="16" height="16" /></a></div></td><td class="map_pib" valign="top">' + type + '<div class="map_place_name"><a href="/site/all/main/' + data.place.id + '/">' + data.place.name + '</a></div><div class="place_icons_2">' + price + rating + opinions + '</div>' + reason + '</td></tr></table>' );
    }
	
    $( loaded_markers[data.place.id].marker.domel_ ).append ( '<img src="/images/small_close.gif" width="9" height="9" class="mcloud_close" />' );

    loaded_markers[data.place.id].marker.redraw ( true );
        
    $( loaded_markers[data.place.id].marker.domel_ )
        .find ( 'img.mcloud_close' )
        .bind ( 'click', function () {
            SetCloudPreWidth ( data.place.id );
            
            loaded_markers[data.place.id].marker.block_.style.cursor = 'pointer';
            
            $( loaded_markers[data.place.id].marker.domel_ )
                .find ( 'img.mcloud_close' )
                .remove ();
            
            $( loaded_markers[data.place.id].marker.block_ ).html ( data.place.name );
            
            loaded_markers[data.place.id].marker.redraw ( true );
            current_cloud = null;
            
            setTimeout ( function () { loaded_markers[data.place.id].marker.add_click_event(); }, 30 );
        } );
}

function ZoomTo ( lat, lng, id )
{
    place_to_show = id;
    
    center = new GLatLng ( lat, lng );
    map.setCenter ( center, 17 );
}

function ClearOverlays ()
{
    map.clearOverlays();
    loaded_markers = new Array();
}

function CloseCurrentCloud ()
{
    if ( current_cloud && loaded_markers[current_cloud] )
    {
        SetCloudPreWidth ( current_cloud );
        
        loaded_markers[current_cloud].marker.block_.style.cursor = 'pointer';
        
        $( loaded_markers[current_cloud].marker.domel_ )
            .find ( 'img.mcloud_close' )
            .remove ();
        
        $( loaded_markers[current_cloud].marker.block_ ).html ( $( loaded_markers[current_cloud].marker.block_ ).find ( 'div.map_place_name' ).text() );
       
        loaded_markers[current_cloud].marker.redraw ( true );
        loaded_markers[current_cloud].marker.add_click_event ();
    }
}

function FilterMap ( type )
{
    $( '#google_map' ).append ( '<div id="map_ajax_i">Загрузка меток на карте</div>' );
    
    if ( type == 'Zoom' )
    {
        now_worked = true;
    }
    
	var bounds    = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    
    var data = {
    	xl: southWest.lat (),
    	yl: southWest.lng (),
    	xr: northEast.lat (),
    	yr: northEast.lng ()
    };
    
    client_request ( 'places', 'get_points', '', 'POST', data, 'After' + type + 'Map', false, 'map_filter' );
}

function ClearFilter ()
{
    //document.getElementById ( 'map_filter' ).reset();
    $( '#map_filter > input:hidden' ).val ( 0 );
    $( 'select[@name="metro"]' ).val ( 0 );
}

function ShowPlaces ()
{
    GEvent.addListener ( map, 'moveend', function () {
        if ( !now_worked )
        {
		    FilterMap ( 'Move' );
        }
	} );
	
	GEvent.addListener ( map, 'zoomend', function () {
	    now_worked = true;
		FilterMap ( 'Zoom' );
	} );
	
	if ( sat_map_type )
	{
	    map.setCenter ( center, zoom );
	} else {
	    map.setCenter ( center, zoom );
	}
}

function ShowUserPlaces ( id )
{
    $( '#google_map' ).append ( '<div id="map_ajax_i">Загрузка меток на карте</div>' );

    GEvent.addListener ( map, 'moveend', function () {
        CheckPlaceToShow();
	} );
	
	GEvent.addListener ( map, 'zoomend', function () {
	    CheckPlaceToShow();
	} );
    
    var data = {
        id: id
    };
    
    client_request ( 'users', 'get_points', '', 'GET', data, 'AfterShowUserPlaces' );
}

function CheckPlaceToShow ()
{
    if ( place_to_show )
	{
	    CloseCurrentCloud();
	    
	    current_cloud = place_to_show;
	    place_to_show = null;
	    
	    $( loaded_markers[current_cloud].marker.block_ ).unbind ();
        $( loaded_markers[current_cloud].marker.mk_    ).unbind ();
        
        SetCloudPreWidth ( current_cloud );
    	$( loaded_markers[current_cloud].marker.block_ ).html ( '<div class="mc_ajax_indicator">Загрузка</div>' );
        loaded_markers[current_cloud].marker.redraw ( true );
        
        loaded_markers[current_cloud].marker.block_.style.cursor = 'default';
        
        if ( map_type == 'user' )
        {
            var sdata = {
                id: current_cloud,
                user: current_user
            };
            
            var f = 'u';
        } else {
            var sdata = {
                id: current_cloud
            };
            
            var f = '';
        }
        
        client_request ( 'places', 'get_' + f + 'point_data', '', 'GET', sdata, 'AfterGetPointData' );
	}
}

function AfterShowUserPlaces ( data )
{
    $( '#map_ajax_i' ).remove();
    
	for ( var i = 0; i < data.points.length; i++ )
	{
		loaded_markers[data.points[i].id] = [];
		
		loaded_markers[data.points[i].id].lat = data.points[i].lat;
		loaded_markers[data.points[i].id].lng = data.points[i].lng;
		
		var point = new GLatLng ( data.points[i].lat, data.points[i].lng );
		
		loaded_markers[data.points[i].id].marker = CreateCloudMarker ( 'user', point, data.points[i] );
		
		map.addOverlay ( loaded_markers[data.points[i].id].marker );
	}
	
	if ( a_place_to_show )
	{
	    place_to_show = a_place_to_show;
	    a_place_to_show = null;
	    
        map.setCenter ( center, 17 );
	}
}

function SetMapCenter ( lat, lng, zoom_i )
{
    center = new GLatLng ( lat, lng );
    
    if ( sat_map_type )
    {
        zoom = zoom_i ? zoom_i : 17;
        map.setCenter ( center, zoom );
        map.setMapType ( G_SATELLITE_MAP );
        $( '#satellite_type_button > div' ).css ( { border: '1px #0062be solid', fontWeight: 'bold' } );
		$( '#map_type_button > div'       ).css ( { border: '1px #fff solid', fontWeight: 'normal' } );
    } else {
        zoom = zoom_i ? zoom_i : 15;
        map.setCenter ( center, zoom );
    }
}

function GetMap ()
{
	if ( GBrowserIsCompatible () )
	{
		map = new GMap2 ( document.getElementById( 'google_map' ) );

		if ( map_type == 'one' || map_type == 'user' )
		{
		    var ar = true;
		} else {
		    var ar = false;
		}
		
		map.addControl ( new MyZoomControl () );
		map.addControl ( new MyMapTypeControl ( ar ) );
		
		if ( map_type == 'main' || map_type == 'user' ) {
		    map.addControl ( new GOverviewMapControl ( new GSize ( 200, 160 ) ) );
		    if ( !geocoder )
    		{
    			geocoder = new GClientGeocoder();
    		}
		}
	}
}

function CreateCloudMarker ( type, point, data )
{
    var reg = /secret/;
    
    if ( reg.test ( window.location.href ) )
    {
        var n_marker = new GMarker ( point, { draggable: true } );
    
        GEvent.addListener ( n_marker, 'mouseover', function () {
    		ShowCloud( data.name );
        } );
        
        GEvent.addListener ( n_marker, 'mouseout', function () {
    		HideCloud();
        } );
    
    	GEvent.addListener ( n_marker, 'dragend', function () {
    		setTimeout ( function () {
    			var latlng = n_marker.getLatLng();
    		
    			var ndata = {
    					lat : latlng.lat(),
    					lng : latlng.lng(),
    					id  : data.id
    				};
    			
    			client_request ( 'places', 'save_main_place_coords', '', 'GET', ndata );
    		}, 1000 );
    	} );
    
    	return n_marker;
    } else {
        var vcloud = new Cloud ( type, point, data );
    	return vcloud;
    }
}

function CreatePlaceCloudMarker ( lat, lng, name, address, id )
{
    var data = {
        name: name,
        address: address,
        id: id,
        p_map: '0'
    };
    
    var point = new GLatLng ( lat, lng );
    current_cloud = new Cloud ( 'one', point, data );

    map.addOverlay ( current_cloud );
}

function AfterZoomMap ( data )
{
    ClearOverlays();
    
    $( '#map_ajax_i' ).remove();
    
	for ( var i = 0; i < data.points.length; i++ )
	{
		loaded_markers[data.points[i].id] = [];
		
		loaded_markers[data.points[i].id].lat = data.points[i].lat;
		loaded_markers[data.points[i].id].lng = data.points[i].lng;
		
		var point = new GLatLng ( data.points[i].lat, data.points[i].lng );
		
		loaded_markers[data.points[i].id].marker = CreateCloudMarker ( 'small', point, data.points[i] );
		
		map.addOverlay ( loaded_markers[data.points[i].id].marker );
	}
	
	CheckPlaceToShow();
	
	now_worked = false;
}

function AfterMoveMap ( data )
{
	var bounds    = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();

    $( '#map_ajax_i' ).remove();
    
    var j = 0;
    
	for ( var key in loaded_markers )
	{
	    if ( loaded_markers[key] )
	    {
    	    if ( loaded_markers[key].lat < southWest.lat () || loaded_markers[key].lng < southWest.lng () || loaded_markers[key].lat > northEast.lat () || loaded_markers[key].lng > northEast.lng () )
    	    {   
    	        map.removeOverlay ( loaded_markers[key].marker );
    	        loaded_markers[key] = null;
    	        delete ( loaded_markers[key] );
    	    } else {
    	        j++;
    	    }
	    }
	}
	
	for ( var i = 0; i < data.points.length; i++ )
	{
	    if ( j >= 50 && window.location.search != '?megamap' )
		{
		    break;
		}
		
		if ( !loaded_markers[data.points[i].id] )
		{
			loaded_markers[data.points[i].id] = [];
			
			loaded_markers[data.points[i].id].lat = data.points[i].lat;
			loaded_markers[data.points[i].id].lng = data.points[i].lng;
			
			var point = new GLatLng ( data.points[i].lat, data.points[i].lng );
			
			loaded_markers[data.points[i].id].marker = CreateCloudMarker ( 'small', point, data.points[i] );
			
			map.addOverlay ( loaded_markers[data.points[i].id].marker );
			
			j++;
		}
	}
	
	CheckPlaceToShow();
}

function GetMapSearch ()
{
    var str = $( '#map_suggest' ).val();
    
    if ( str.length >= 2 )
    {
        $( '#map_bsubmit' )
            .hide()
            .after ( '<img src="/images/ajax.gif" width="43" height="11" id="map_asubmit" />' );
        $( '#map_suggest' ).attr ( 'disabled', 'disabled' );
        
        document.getElementById ( 'map_filter' ).reset();
        $( 'select[@name="metro"]' ).val ( 0 );
        
        //google street search
        $( '#map_street_results' ).html ( '' );
        var html = '';
        var fp   = 0;
        
        var address = 'Russia, Saint-Petersburg, ' + str;
	
    	geocoder.getLocations (
    		address,
    		function ( response )
    		{
    		    if ( response.Status['code'] == 200 )
    		    {
    		        for ( var key = 0; key < response.Placemark.length; key++ )
    		        {
    		            if ( response.Placemark[key].AddressDetails.Accuracy >= 6 )
    		            {
    		                if ( html == '' )
    		                {
    		                    fp = key;
    		                }

    		                if ( typeof ( response.Placemark[key].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea ) != 'undefined' )
    		                {
    		                    var name = response.Placemark[key].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare['ThoroughfareName'];
    		                } else {
    		                    var name = response.Placemark[key].AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare['ThoroughfareName'];
    		                }
    		                
    		                html += '<div class="map_street_row"><a href="javascript:void(0);" onclick="ClearFilter(); SetMapCenter ( ' + response.Placemark[key].Point.coordinates[1] + ', ' + response.Placemark[key].Point.coordinates[0] + ' );">' + name + '</a></div>';
    		            } else {
    		                html += '<div class="map_street_row"><a href="javascript:void(0);" onclick="ClearFilter(); SetMapCenter ( ' + response.Placemark[key].Point.coordinates[1] + ', ' + response.Placemark[key].Point.coordinates[0] + ' );">' + response.Placemark[key].AddressDetails.AddressLine[0] + '</a></div>';
    		            }
    		        }
    		        
    		        if ( html == '' )
    		        {
    		            $( '#map_street_results' ).html ( '' );
    		        } else {
    		            $( '#map_street_results' ).html ( '<div class="black_bold">Улицы:</div>' + html );
    		            //SetMapCenter ( response.Placemark[fp].Point.coordinates[1], response.Placemark[fp].Point.coordinates[0] );
    		        }
    		    } else {
    		        $( '#map_street_results' ).html ( '' );
    		    }
    		}
    	);
        //end google street search
        
        //place search
        $( '#map_suggest_results' ).html ( '' );
        
        var data = {
            str: str
        };
        
        client_request ( 'map', 'get_suggest', '', 'GET', data, 'AfterGetMapSearch' );
    }
}

function AfterGetMapSearch ( data )
{
    $( '#map_asubmit' ).remove();
    $( '#map_bsubmit' )
        .show();
    $( '#map_suggest' ).removeAttr ( 'disabled' );
        
    var html = '';
    var fp   = 0;
    
    if ( data.rows.length > 0 )
    {
        for ( var i = 0; i < data.rows.length; i++ )
        {
            if ( html == '' )
            {
                fp = i;
            }
            
            html += '<div class="map_suggest_row"><a href="javascript:void(0);" onclick="ClearFilter(); ZoomTo(' + data.rows[i].lat + ', ' + data.rows[i].lng + ', ' + data.rows[i].id + ');">' + data.rows[i].name + '</a><div class="small_gray">' + data.rows[i].address + '</div></div>';
        }
        
        $( '#map_suggest_results' ).html ( '<div class="black_bold">Рестораны:</div>' + html );
        ZoomTo ( data.rows[fp].lat, data.rows[fp].lng, data.rows[fp].id );
    } else {
        $( '#map_suggest_results' ).html ( '<div class="black_bold">Рестораны:</div>Ничего не найдено' );
    }
}

function ShowOCPlaces ()
{
    ClearFilter();
    $( '#map_filter > input[@name="oc"]' ).val ( 1 );
    SetMapCenter ( 59.934032, 30.340033, 10 );
}

function ShowBanquetPlaces ()
{
    ClearFilter();
    $( '#map_filter > input[@name="banquet"]' ).val ( 1 );
    SetMapCenter ( 59.934032, 30.340033, 12 );
}

function ShowRatingPlaces ()
{
    ClearFilter();
    $( '#map_filter > input[@name="rating"]' ).val ( 1 );
    SetMapCenter ( 59.934032, 30.340033, 12 );
}

function ShowRecommendPlaces ()
{
    ClearFilter();
    $( '#map_filter > input[@name="recommend"]' ).val ( 1 );
    SetMapCenter ( 59.934032, 30.340033, 12 );
}