var CircleOverlay = function(latLng, radius, strokeColor, strokeWidth, strokeOpacity, fillColor, fillOpacity)
{
    this.latLng = latLng;
    this.radius = radius;
    this.strokeColor = strokeColor;
    this.strokeWidth = strokeWidth;
    this.strokeOpacity = strokeOpacity;
    this.fillColor = fillColor;
    this.fillOpacity = fillOpacity;
    this.visible = true;
}

CircleOverlay.prototype = new GOverlay;

CircleOverlay.prototype.initialize = function(map)
{
    this.map = map;
    
    var me = this;
    
    GEvent.addListener(me.map, 'dragstart', function()
        {
            me.hide();
        }
    );
    
    GEvent.addListener(me.map, 'dragend', function()
        {
            me.show();
        }
    );
}

CircleOverlay.prototype.clear = function()
{
    if(this.polygon != null && this.map != null)
    {
        this.map.removeOverlay(this.polygon);
    }
}

CircleOverlay.prototype.redraw = function(force)
{
    if(!this.visible) return false;
    
    var d2r = Math.PI / 180;
    circleLatLngs = new Array();
    var circleLat = this.radius * 0.00000909344;
    var circleLng = circleLat / Math.cos(this.latLng.lat() * d2r);
    var numPoints = 40;
       
    for(var i = 0; i < numPoints + 1; i++)
    {
        var theta = Math.PI * (i / (numPoints / 2));
        var vertexLat = this.latLng.lat() + (circleLat * Math.sin(theta));
        var vertexLng = this.latLng.lng() + (circleLng * Math.cos(theta));
        var vertextLatLng = new GLatLng(vertexLat, vertexLng);
        circleLatLngs.push(vertextLatLng);
    }
       
    this.clear();
    this.polygon = new GPolygon(circleLatLngs, this.strokeColor, this.strokeWidth, this.strokeOpacity, this.fillColor, this.fillOpacity);
    this.map.addOverlay(this.polygon);
}

CircleOverlay.prototype.hide = function()
{
    this.visible = false;
    this.remove();
}

CircleOverlay.prototype.show = function()
{
    this.visible = true;
    this.redraw();
}

CircleOverlay.prototype.remove = function()
{
    this.clear();
}

CircleOverlay.prototype.containsLatLng = function(latLng)
{
   if(this.polygon.containsLatLng) {
       return this.polygon.containsLatLng(latLng);
   }
}

CircleOverlay.prototype.setRadius = function(radius)
{
    this.radius = radius;
}

CircleOverlay.prototype.setLatLng = function(latLng)
{
    this.latLng = latLng;
}

document.location.get = function(name)
{
    var s = this.search.substr(1).split('&');
    for(var i = 0; i < s.length; i++)
    {
        var part = s[i].split('=');
        
        if(part[0])
        {
            if(part[0] == name)
            {
                if(part[1])
                {
                    return unescape(unescape(part[1]));
                }
                else
                {
                    return true;
                }
            }
        }
    }
    
    return false;
}

/**** Rozszerzenie GMap2 ****/"" 

GMap2.prototype.setObserver = function(latlng, radius)
{
    $('#map-status span').text('0%');
    $('#map-status').fadeIn();
    
    var types = {
        lokale: 1,
        bankomaty: 0,
        kina: 0,
        teatry: 0
    };
    


    $('div.checkbox input').each(function(i, el)
        {
            types[$(el).attr('id').split('-')[1]] = el.checked ? 1 : 0;
        }
    );
    
    var markerCreated = false;
       
    if(radius) this.observerRadius = radius;
    if(latlng) this.observerLatLng = latlng;
    
    if(!this.markerManager) this.markerManager = new MarkerManager(this);
    
    this.markerManager.clearMarkers();
        
    if(!this.observerMarker)
    {
        this.observerMarker = new GMarker(this.observerLatLng, {draggable: true, icon: MapIcons.observer});
        var me = this;
        
        GEvent.addListener(this.observerMarker, 'dragstart', function()
            {
                me.toClickMarkerLatLng = false;
            }
        );

        GEvent.addListener(this.observerMarker, 'dragend', function(p)
            {
                var latlng = new GLatLng(p.y, p.x);
                me.setObserver(latlng);
                me.setCenter(latlng);
            }
        );
        
        GEvent.addListener(this.observerMarker, 'mousedown', function()
            {
                me.observerMarker.closeInfoWindow();
            }
        );
        
        GEvent.addListener(this, 'dragend', function()
            {
                me.setObserver(me.getCenter());
            }
        );
        
        markerCreated = true;
   }

   if(!this.observerOverlay)
   {
       this.observerOverlay = new CircleOverlay(this.observerLatLng, this.observerRadius, "#336699", 1, 1, '#336699', 0.25);
       this.addOverlay(this.observerOverlay);
   }
   else
   {
       this.observerOverlay.setLatLng(this.observerLatLng);
       this.observerOverlay.setRadius(this.observerRadius);
       this.observerOverlay.redraw();
   }

   if(markerCreated) this.addOverlay(this.observerMarker);
   
   this.observerMarker.setLatLng(this.observerLatLng);

   var me = this;
   var params = {lat: this.observerLatLng.y, lng: this.observerLatLng.x, radius: this.observerRadius};
   
   for(var key in types)
   {
       params[key] = types[key];
   }
   
   $.post('/ajax-mapa/', params, function(r)
       {
            eval(r);
            
            if(Points) 
            {
                for(var i = 0; i < Points.length; i++)
                {
                    $('#map-status span').text(Math.round((i/(Points.length-1))*100)+'%');
                    
                    me._observerAddMarker(Points[i]);
                }
                
                me.markerManager.refresh();
                
                if(me.toClickMarkerLatLng)
                {
                    var m = me.markerManager.getMarker(me.toClickMarkerLatLng.y, me.toClickMarkerLatLng.x, me.getZoom());
                    
                    m.hide();
                    GEvent.trigger(m, 'click');
                    
                    me.toClickMarkerLatLng = false;
                }
            }
            
            setTimeout(function() { $('#map-status').fadeOut(); }, 500);
       }
   );
}

GMap2.prototype.openObserverWelcomeWindow = function()
{
    this.observerMarker.openInfoWindowHtml('Cześć!<br />Przeciągnij mnie w miejsce, w którego okolicy chcesz poszukać<br />restauracji. Dodatkowo możesz użyć suwaka (w górnym lewym<br />rogu mapki), aby okreslić promień wyszukiwania.');
}

GMap2.prototype._observerAddMarker = function(point)
{
    var marker = new GMarker(new GLatLng(point.lat, point.lng), {icon: MapIcons[point.type]});
    
    var me = this;
    
    GEvent.addListener(marker, 'click', function()
        {
            var dform = document.createElement('div');
            var dform_text = document.createElement('div');
            var dform_input = document.createElement('input');
            var dform_button = document.createElement('input');
            
            dform_text.innerHTML = 'Adres początkowy:';
            dform_input.type = 'text';
            dform_button.type = 'button';
            dform_button.value = 'Pokaż';
            
            dform.appendChild(dform_text);
            dform.appendChild(dform_input);
            dform.appendChild(dform_button);
            
            if((m = document.location.get('m')) && (u = document.location.get('u')))
            {
                dform_input.value = m+', '+u;
            }
            
            dform_button.onclick = function()
            {
                var sidebar = document.getElementById('map-sidebar');
                var sidebarContent = document.getElementById('map-sidebar-content');
                var sidebarClose = document.getElementById('map-sidebar-close-link');
                
                if(!me.directions) 
                {
                    sidebarClose.onclick = function()
                    {
                        me.directions.clear();
                        sidebar.style.display = 'none';
                        map.getContainer().style.width = '1000px';
                        return false;
                    }
                    me.directions = new GDirections(me, sidebarContent);
                    GEvent.addListener(me.directions, 'addoverlay', function()
                        {
                            sidebar.style.display = 'block';
                            me.getContainer().style.width = '680px';
                        }
                    );
                }
                
                me.directions.load('from: '+dform_input.value+' to: '+point.lat+' '+point.lng);
                marker.closeInfoWindow();
                dform_input.value = '';
            }
            
            if(dform_input.value != '') dform_button.onclick();
            
            var infotab = {title: '', content: ''};
            
            switch(point.type)
            {
                case 'lokal':
                    var legend = point.options.ilosc_miejsc > 0 ? ('<span class="icon-seets">'+point.options.ilosc_miejsc+'</span>') : '';
                    
                    if(point.options.udogodnienia_dzieci == 1)  legend += '<img src="/_i/smaki/icons/ico_smaki_02.gif" />';
                    if(point.options.udogodnienia_matki == 1)   legend += '<img src="/_i/smaki/icons/ico_smaki_13.gif" />';
                    if(point.options.zwierzeta == 1)            legend += '<img src="/_i/smaki/icons/ico_smaki_03.gif" />';
                    if(point.options.sala_niepalacy == 1)       legend += '<img src="/_i/smaki/icons/ico_smaki_04.gif" />';
                    if(point.options.zakaz_palenia == 1)        legend += '<img src="/_i/smaki/icons/ico_smaki_05.gif" />';
                    if(point.options.ogrodek == 1)              legend += '<img src="/_i/smaki/icons/ico_smaki_06.gif" />';
                    if(point.options.internet == 1)             legend += '<img src="/_i/smaki/icons/ico_smaki_07.gif" />';
                    if(point.options.dostawa == 1)              legend += '<img src="/_i/smaki/icons/ico_smaki_08.gif" />';
                    if(point.options.parking == 1)              legend += '<img src="/_i/smaki/icons/ico_smaki_09.gif" />';
                    if(point.options.ceny == 1)                 legend += '<img src="/_i/smaki/icons/ico_smaki_10.gif" />';
                    if(point.options.ceny == 2)                 legend += '<img src="/_i/smaki/icons/ico_smaki_11.gif" />';
                    if(point.options.ceny == 3)                 legend += '<img src="/_i/smaki/icons/ico_smaki_12.gif" />';

                    infotab.title = 'Lokal';
                    infotab.content = '<div style="width:250px"></div><b><a href="'+point.pageUrl+'">'+point.nazwa+'</a></b>'+
                            '<br />'+point.adres+'<br /><br />'+legend+'<br /><br />'+
                            (Math.round(point.distance) > 0 ? 'Odległość: '+Math.round(point.distance)+' m.<br /><br />' : '')+
                            '<a href="#" onclick="map.setObserver(new GLatLng('+point.lat+', '+point.lng+')); return false">Pokaż lokale w pobliżu</a>'+
                            ' | <a href="'+point.pageUrl+'">Przejdź do lokalu</a>';
                break;
                case 'bankomat':
                    infotab.title = 'Bankomat';
                    infotab.content = '<b>Bankomat '+point.nazwa+'</b>'+
                            '<br />'+point.adres+'<br /><br />'+
                            (Math.round(point.distance) > 0 ? 'Odległość: '+Math.round(point.distance)+' m.<br /><br />' : '');
                break;
                case 'teatr':
                    var nazwa = (point.nazwa.toLowerCase().indexOf('teatr') == -1 ? 'Teatr ' : '')+point.nazwa;
                    
                    infotab.title = 'Teatr';
                    infotab.content = '<b>'+nazwa+'</b>'+
                            '<br />'+point.adres+'<br /><br />'+
                            (Math.round(point.distance) > 0 ? 'Odległość: '+Math.round(point.distance)+' m.<br /><br />' : '')+
                            'WIK: <a href="'+point.wikMiejsce+'" onclick="window.open(this.href); return false">'+nazwa+'</a>';
                break;
                case 'kino':
                    var nazwa = (point.nazwa.toLowerCase().indexOf('kino') == -1 ? 'Kino ' : '')+point.nazwa;
                    
                    infotab.title = 'Kino';
                    infotab.content = '<b>'+nazwa+'</b>'+
                            '<br />'+point.adres+'<br /><br />'+
                            (Math.round(point.distance) > 0 ? 'Odległość: '+Math.round(point.distance)+' m.<br /><br />' : '')+
                            'WIK: <a href="'+point.wikMiejsce+'" onclick="window.open(this.href); return false">'+nazwa+'</a>';
                break;
            }
            
            var tabs = [
                new GInfoWindowTab(infotab.title, infotab.content),
                new GInfoWindowTab('Jak dojechać', dform)
            ];
            
            marker.openInfoWindowTabsHtml(tabs,  {maxWidth: 400});
        }
    );
    
    this.markerManager.addMarker(marker, 1);
}

GMap2.prototype.clickMarker = function(latlng)
{
    this.toClickMarkerLatLng = latlng;
}