var pointsOnMap;
$(function() {
    function highlightLine(line) {
        $('tr.mapResultItem').removeClass('active');
        line.addClass('active');
        var id = line.attr( 'property_id' );
        $('#scroll_'+id).focus();
    }
    
    function activateLine() {
        var line = $(this);
        // highlightLine( line );
        pointsOnMap.showProperty( line.attr( 'property_id' ) );
    }
    
    
    window.pointsList = {};
    
    pointsOnMap = {

        currentRequest: null,
        needRefineResults: true,
        needRefreshTable: true,
        
        abort: function () {
            if (pointsOnMap.currentRequest != null) {
                pointsOnMap.currentRequest.abort ();
                pointsOnMap.currentRequest = null;
            }
        },
        
        refreshMap: function( points ) {
            map.clearOverlays();
            window.pointsList = {};
            var index = 1;
            
            for( var i in points ) {
                var point = points[i];
                
                // var pointIsShown = !empty( window.pointsList[ point.id ] );
                // if( pointIsShown ) continue;

                var marker = addSearchMarker( point.lat, point.lng, index, 
                    tinyPropertyBlock(point, currency_sign)
                );
                
                GEvent.addListener(marker, "click", function() {
                    highlightLine( $( 'tr#row_' + this.id ) )
                });
                
                marker.id = point.id;
                window.pointsList[ point.id ] = marker;
                index++;
            }
            
        },
        
        showProperty: function( id ) {
            if( !id || empty( window.pointsList[ id ] ) ) return false;
            var marker = window.pointsList[ id ];
            GEvent.trigger( marker, 'click' );
        },
        
        refreshTable: function( points ) {
            var table = $('table#points-list');
            var k = 1;
            var str = '';
            for( var i in points ) {
                var point = points[i];
                str += '<tr id="row_'+ point.id +'" property_id="'+ point.id +
                    '" class="mapResultItem ' + ( k%2 ? 'odd' : 'even' ) + '">\n';

                str += '<td class="number"><span>'+k+'</span></td>';
                str += '<td class="name">' + point.title + '<br/><input type="text" style="width:0px; height: 0px; border: none; margin: 0; padding: 0;" id="scroll_'+ point.id +'" /></td>';
                str += '<td class="rate">'+point.price_min +' - '+point.price_max+'</td>';
                str += '<td class="rating">' + point.rating_round + ' <span class="star_active_one" title="'+point.rating+'"></span></td>';
                str += '<td class="sleeps">' + point.sleeps + '</td>';
                str += '<td class="bedrooms">' + point.bedrooms + '</td>';

                str += '</tr>';
                k++;
            }
            table.html(str);
            $('tr.mapResultItem').click( activateLine );
        },
        
        updateData: function (points) {
            
            if (pointsOnMap.needRefreshTable) {
                pointsOnMap.refreshTable (points);
            };
            pointsOnMap.refreshMap (points);
        },
        
        refreshRates: function (rates) {
            $('#rates-slider').slider ('option', 'max',rates.max);
            $('#rates-slider').slider ('option', 'min', rates.min);

            var minVal = $('#rates-slider-min').val ();
            var maxVal = $('#rates-slider-max').val ();
            
            if (minVal < rates.min || minVal > rates.max) {
                $('#rates-slider-min').attr ('value', rates.min);
            }

            if (maxVal < rates.min || maxVal > rates.max) {
                $('#rates-slider-max').attr ('value', rates.max);
            }
        },
        
        update: function() {
return;
            globalLoader.setMessage(lang('Loading')+'...').show();
            pointsOnMap.abort();
            //WaitDialog.show();
            var bounds = map.getBounds();
            var sw = bounds.getSouthWest()
            var ne = bounds.getNorthEast()
            
            if (pointsOnMap.needRefineResults) {
                RefineResults.fields.lat1 = sw.lat();
                RefineResults.fields.lat2 = ne.lat();
                RefineResults.fields.lng1 = sw.lng();
                RefineResults.fields.lng2 = ne.lng();
                RefineResults.url = '/search/map';
                var data = RefineResults.collectData();
                data['is_refine_results'] = 1;
            }
            else {
                var data = {
                        'lat1': sw.lat (),
                        'lat2': ne.lat (),
                        'lng1': sw.lng (),
                        'lng2': ne.lng (),
                        'countryId': countryId,
                        'is_refine_results': 0
                };
                countryId = 0;
            };
            
            pointsOnMap.currentRequest = $.getJSON( '/search/map', data, pointsOnMap.process );
        },
        
        process: function( data, status ) {
            globalLoader.hide();
            if ( 'success' != status ) return false;

            //if ( empty( data )  ) return false;
            
            if ( !empty( data.error )  ) {
                alert( data.error );
                return false;
            }
            
            //if ( empty( data.points )  ) return false;

            if (!empty (data.rates)) {
                pointsOnMap.refreshRates (data.rates);
            }
            
            if (pointsOnMap.needRefreshTable) {
                pointsOnMap.refreshTable( data.points );
            };
            
            pointsOnMap.refreshMap( data.points );
            
            pointsOnMap.currentRequest = null;
            globalLoader.hide();
        }
    };
    
    //map.setZoom(8);
    
    //XXX comment required what this logic does
    if (typeof directoryMap != 'undefined' && directoryMap != null) {
        pointsOnMap.needRefineResults = false;
        
        GEvent.addListener(map, 'zoomend', pointsOnMap.update );
        GEvent.addListener(map, 'dragend', pointsOnMap.update );
        pointsOnMap.update();
    }
    else if (typeof mapView != 'undefined' && mapView != null) {
        //map.setZoom(10);
        pointsOnMap.updateData ( points );
        
        if (pointsOnMap.needRefineResults) {
            RefineResults.callback = pointsOnMap.updateData;
        };
    }
    else {
        GEvent.addListener(map, 'zoomend', pointsOnMap.update );
        GEvent.addListener(map, 'dragend', pointsOnMap.update );
        pointsOnMap.update();
        
        if (pointsOnMap.needRefineResults) {
            RefineResults.callback = pointsOnMap.process;
        };
    }
});
