defaultNS.ModuleMap = function(){

    // definice ikony byt
    var iconBlue = new GIcon();
    iconBlue.image = baseUrl + '/public/image/default/mm_20_blue.png';
    iconBlue.shadow = baseUrl + '/public/image/default/mm_20_shadow.png';
    iconBlue.iconSize = new GSize(12, 20);
    iconBlue.shadowSize = new GSize(22, 20);
    iconBlue.iconAnchor = new GPoint(6, 20);
    iconBlue.infoWindowAnchor = new GPoint(5, 1);
    
    // definice ikony rodinný dům
    var iconRed = new GIcon();
    iconRed.image = baseUrl + '/public/image/default/mm_20_red.png';
    iconRed.shadow = baseUrl + '/public/image/default/mm_20_shadow.png';
    iconRed.iconSize = new GSize(12, 20);
    iconRed.shadowSize = new GSize(22, 20);
    iconRed.iconAnchor = new GPoint(6, 20);
    iconRed.infoWindowAnchor = new GPoint(5, 1);
    
    // definice ikony rekreační objekt    
    var iconPurple = new GIcon();
    iconPurple.image = baseUrl + '/public/image/default/mm_20_purple.png';
    iconPurple.shadow = baseUrl + '/public/image/default/mm_20_shadow.png';
    iconPurple.iconSize = new GSize(12, 20);
    iconPurple.shadowSize = new GSize(22, 20);
    iconPurple.iconAnchor = new GPoint(6, 20);
    iconPurple.infoWindowAnchor = new GPoint(5, 1);
    
    // definice ikony činžovní dům    
    var iconYellow = new GIcon();
    iconYellow.image = baseUrl + '/public/image/default/mm_20_yellow.png';
    iconYellow.shadow = baseUrl + '/public/image/default/mm_20_shadow.png';
    iconYellow.iconSize = new GSize(12, 20);
    iconYellow.shadowSize = new GSize(22, 20);
    iconYellow.iconAnchor = new GPoint(6, 20);
    iconYellow.infoWindowAnchor = new GPoint(5, 1);
    
    // definice ikony komerční nemovitost    
    var iconWhite = new GIcon();
    iconWhite.image = baseUrl + '/public/image/default/mm_20_white.png';
    iconWhite.shadow = baseUrl + '/public/image/default/mm_20_shadow.png';
    iconWhite.iconSize = new GSize(12, 20);
    iconWhite.shadowSize = new GSize(22, 20);
    iconWhite.iconAnchor = new GPoint(6, 20);
    iconWhite.infoWindowAnchor = new GPoint(5, 1);
    
    
    // definice ikony pozemek
    var iconGreen = new GIcon();
    iconGreen.image = baseUrl + '/public/image/default/mm_20_green.png';
    iconGreen.shadow = baseUrl + '/public/image/default/mm_20_shadow.png';
    iconGreen.iconSize = new GSize(12, 20);
    iconGreen.shadowSize = new GSize(22, 20);
    iconGreen.iconAnchor = new GPoint(6, 20);
    iconGreen.infoWindowAnchor = new GPoint(5, 1);
    
    // definice ikony ostatní    
    var iconBlack = new GIcon();
    iconBlack.image = baseUrl + '/public/image/default/mm_20_black.png';
    iconBlack.shadow = baseUrl + '/public/image/default/mm_20_shadow.png';
    iconBlack.iconSize = new GSize(12, 20);
    iconBlack.shadowSize = new GSize(22, 20);
    iconBlack.iconAnchor = new GPoint(6, 20);
    iconBlack.infoWindowAnchor = new GPoint(5, 1);
    
    // pole ikon identifikator odpovídá poli kind v tabulce estate_common
    var customIcons = [];
    
    customIcons[1] = iconBlue;
    customIcons['1toggle'] = iconBlue;
    
    customIcons[2] = iconRed;
    customIcons['2toggle'] = iconRed;
    
    customIcons[3] = iconPurple;
    customIcons['3toggle'] = iconPurple;
    
    customIcons[4] = iconYellow;
    customIcons['4toggle'] = iconYellow;
    
    customIcons[5] = iconWhite;
    customIcons['5toggle'] = iconWhite;
    
    customIcons[6] = iconGreen;
    customIcons['6toggle'] = iconGreen;
    
    customIcons[7] = iconBlack;
    customIcons['7toggle'] = iconBlack;
    
    
    var toGeocode = [];
    var geocodeDone = 0;
    var oneMarkerOnly = false;
    var cookieProvider = new Ext.state.CookieProvider({
        path: '/',
        expires: new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 30))
    });
    Ext.state.Manager.setProvider(cookieProvider);
    
    // výhledá souřadnic na zkl. adresy
    geocode = function(){
        if (geocodeDone < toGeocode.length) {
            geocoder.getLocations(toGeocode[geocodeDone].address, addAddressToMap);
        }
    };
    
    // po najetí kurzoru ukáže info liší se od google bubliny
    showInfo = function(_input){
    
        // pokud div pro info neexistuje v dom vytvoří jej
        if (!Ext.get('helper')) {
            Ext.DomHelper.append(Ext.get('sb-content'), {
                id: 'helper',
                cn: [{
                    tag: 'div'
                }]
            });
        }
        Ext.fly('helper').show();
        Ext.fly('helper').update(_input.title);
        
        // nastaví pozici div mtgt_ je předpona id obrázku značícího bod na mapě
        // pozice info se vztahuje k pozici tohoto bodu
        Ext.fly('helper').setXY([Ext.get('mtgt_' + _input.id).getX() + 15, Ext.get('mtgt_' + _input.id).getY() + 15]);
    };
    
    // skryje info
    hideInfo = function(){
        Ext.fly('helper').hide();
    };
    
    // po najetí kurzoru ukáže detail liší se od google bubliny
    showDetail = function(_input){
        oneMarkerOnly ? map.panTo(_input.point) : false;
        
        // pokud div pro info neexistuje v dom vytvoří jej
        if (!Ext.get('mapDetail')) {
            Ext.DomHelper.append(Ext.get(document.body), {
                id: 'mapDetail',
                title: _l10n('mMap_mapDetailTilte'),
                cn: [{
                    tag: 'div'
                }]
            });
            
            // nastaví možnost drag div s detail nemovitosti
            var ddEl = new Ext.dd.DD(Ext.get('mapDetail'));
            ddEl.setOuterHandleElId(document.body);
            
        }
        
        // před samotným zobrazením detailu je potřeba získat data
        // která jsou podrobnější než ta uložena v _input
        var o = {
            url: baseUrl + '/default/estate/detail/',
            method: 'GET',
            
            // volání ukončeno data načtena
            // TODO provést vyhdnocení response
            callback: function(options, success, response){
            
                // překlad druhu nemovitosti na text
                // TODO vyřešit překlad dat z json obdobně jak v php obecnou fcí
                var kindToTranslate = [_l10n('mMap_flat'), _l10n('mMap_villa'), _l10n('mMap_recreationalBuilding'), _l10n('mMap_apartmentBuilding'), _l10n('mMap_commercialEstate'), _l10n('mMap_lot'), _l10n('mMap_other')];
                
                var obj = Ext.decode(response.responseText);
                
                // pokud v file existuje alespoň jedna fotografie
                // nastav jí k případnému přidání do remember panelu
                photo = '';
                Ext.each(obj.file, function(file){
                    if (file.clue == 'image') {
                        photo = file.file;
                    }
                });
                
                // sestavování objektu na zkl. kterého se postaví dom obsah prvku s detailem nemovitosti
                toDomHelper = {
                    cn: []
                };
                toDomHelper.cn.push({
                    tag: 'h2',
                    html: obj.data.title
                }, {
                    tag: 'a',
                    href: '#',
                    title: _l10n('mMap_close'),
                    onclick: "Ext.get('mapDetail').hide();",
                    html: _l10n('mMap_close')
                }, {
                    tag: 'span',
                    html: ' | '
                }, {
                    tag: 'a',
                    id: 'rememberOnMap' + _input.id,
                    href: '#',
                    title: _l10n('mMap_rememberOnMapTitle'),
                    onclick: "defaultNS.ModuleRemember().rememberEstateAdd({id: " + _input.id + ", photo: '" + photo + "', url: '" + obj.data.url + "', title: '" + obj.data.title + "', el: this});",
                    html: _l10n('mMap_rememberOnMap')
                });
                
                // v případě že se jedná o náhled na mapě všech nemovitostí přidej
                // odkaz na stránku obsahující další data
                if (!oneMarkerOnly) {
                    toDomHelper.cn.push({
                        tag: 'span',
                        html: ' | '
                    }, {
                        tag: 'a',
                        href: baseUrl + '/' + languageUrl + '/nemovitost/' + obj.data.url,
                        title: _l10n('mMap_closeMapShowDetail'),
                        html: _l10n('mMap_moreInformation')
                    });
                }
                
                toDomHelper.cn.push({
                    tag: 'dl',
                    cn: [{
                        tag: 'dt',
                        html: _l10n('mMap_kind')
                    }, {
                        tag: 'dd',
                        html: kindToTranslate[obj.data.kind - 1]
                    }, {
                        tag: 'dt',
                        html: _l10n('mMap_area')
                    }, {
                        tag: 'dd',
                        html: obj.data.area.split('|')[1]
                    }, {
                        tag: 'dt',
                        html: _l10n('mMap_municipality')
                    }, {
                        tag: 'dd',
                        html: obj.data.municipality.split('|')[1]
                    }, {
                        tag: 'dt',
                        html: _l10n('mMap_neighbourhood')
                    }, {
                        tag: 'dd',
                        html: obj.data.neighbourhood.split('|')[1]
                    }, {
                        tag: 'dt',
                        html: _l10n('mMap_street')
                    }, {
                        tag: 'dd',
                        html: obj.data.street.split('|')[1]
                    }, {
                        tag: 'dt',
                        html: _l10n('mMap_postalCode')
                    }, {
                        tag: 'dd',
                        html: obj.data.postal_code
                    }]
                }, {
                    tag: 'br',
                    cls: 'cleaner'
                });
                
                // pokud existují pro nemovitost fotografie zobraz je
                if (obj.file.length > 0) {
                    Ext.each(obj.file, function(file){
                        if (file.clue == 'image') {
                            toDomHelper.cn.push({
                                tag: 'img',
                                src: baseUrl + '/public/upload/image/small/' + file.file
                            });
                        }
                        if (file.clue == 'attachment') {
                            toDomHelper.cn.push({
                                tag: 'a',
                                href: baseUrl + '/public/upload/attachment/' + file.file,
                                title: _l10n('mMap_closeMapShowAttachment'),
                                html: file.file
                            }, {
                                tag: 'br',
                                cls: 'cleaner'
                            });
                        }
                    });
                    
                }
                
                // vždy nový dom jinak dochází k připisování k stávajícímu obsahu
                Ext.DomHelper.overwrite(Ext.get('mapDetail'), toDomHelper);
                
                Ext.get('mapDetail').show();
                
                defaultNS.ModuleRemember().markRemember({
                    select: 'a[id^=rememberOnMap]',
                    cmd: 'existTrue'
                });
                
            },
            scope: this,
            params: {
                json: true,
                title: _input.id + '-' + _input.kind
            }
        };
        Ext.Ajax.request(o);
        
        // nastaví pozici div mtgt_ je předpona id obrázku značícího bod na mapě
        // pozice mapDetail se vztahuje k pozici tohoto bodu
        Ext.fly('mapDetail').setXY([Ext.get('mtgt_' + _input.id).getX() + 15, Ext.get('mtgt_' + _input.id).getY() + 15]);
    };
    
    // skryje detail
    hideDetail = function(){
        Ext.get('mapDetail').hide();
    };
    
    function mapCustomControl(_input){
    };
    mapCustomControl.prototype = new GControl();
    mapCustomControl.prototype.initialize = function(map, x){
        cn = [{
            id: 'mapCustomControlFilter',
            tag: 'div',
            html: _l10n('mMap_customControlFilter')
        }, {
            id: 'mapCustomControlMapTypeMap',
            tag: 'div',
            html: _l10n('mMap_customControlMapTypeMap')
        }, {
            id: 'mapCustomControlMapTypeSatellite',
            tag: 'div',
            html: _l10n('mMap_customControlMapTypeSatellite')
        }, {
            id: 'mapCustomControlMapTypeHybrid',
            tag: 'div',
            html: _l10n('mMap_customControlMapTypeHybrid')
        }, {
            id: 'mapCustomControlMapTypeTerrain',
            tag: 'div',
            html: _l10n('mMap_customControlMapTypeTerrain')
        }];
        oneMarkerOnly ? cn.shift() : false;
        mapCustomControlContainer = Ext.DomHelper.append(Ext.get('sb-content'), {
            id: 'mapCustomControlContainer',
            cn: cn
        });
        
        if (!oneMarkerOnly) {
            GEvent.addDomListener(Ext.getDom('mapCustomControlFilter'), 'click', function(){
                Ext.get('mapFilterPanel').toggle();
            });
        }
        GEvent.addDomListener(Ext.getDom('mapCustomControlMapTypeMap'), 'click', function(){
            map.setMapType(G_NORMAL_MAP);
        });
        GEvent.addDomListener(Ext.getDom('mapCustomControlMapTypeSatellite'), 'click', function(){
            map.setMapType(G_SATELLITE_MAP);
        });
        GEvent.addDomListener(Ext.getDom('mapCustomControlMapTypeHybrid'), 'click', function(){
            map.setMapType(G_HYBRID_MAP);
        });
        GEvent.addDomListener(Ext.getDom('mapCustomControlMapTypeTerrain'), 'click', function(){
            map.setMapType(G_PHYSICAL_MAP);
        });
        
        Ext.select('#mapCustomControlContainer div').hover(function(evt, target){
            var el = Ext.get(target);
            el.addClass('labelOver');
        }, function(evt, target){
            var el = Ext.get(target);
            el.removeClass('labelOver');
        });
        
        return mapCustomControlContainer;
    };
    
    addAddressToMap = function(response){
    
        // zpoždění
        var delay = 0;
        
        // příliš mnoho požadavků z dané ip nebo příliš mnoho najednou
        if (response.Status.code == 620) {
        
            // příliš rychle nastav zpoždění
            delay = 500;
        }
        else {
            if (response.Status.code == 200) {
            
                // souřadnice získané z adresy
                place = response.Placemark[0];
                point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
                
                // ostatní údaje pro danou adresu
                _input = toGeocode[geocodeDone];
                
                // doplníme o souřadnice
                _input['point'] = point;
                
                /*Ext.Ajax.request({
                 url: baseUrl + '/administration/map/update-map/',
                 params: {
                 id: _input.id,
                 latitude: point.lat(),
                 longitude: point.lng()
                 },
                 success: function(response, opts){
                 console.dir(response.responseText);
                 },
                 failure: function(response, opts){
                 console.log('server-side failure with status code ' + response.status);
                 }
                 });*/
                var marker = createMarker(_input);
                map.addOverlay(marker);
                
                // adresa k zobrazeni je pouze jedna zobrazíme její detail
                toGeocode.length == 1 ? GEvent.trigger(marker, 'click') : false;
            }
            
            // posun na další adresu taktéž zajistí přeskočení špatného statusu
            geocodeDone += 1;
        }
        window.setTimeout(geocode, delay);
    };
    
    // vytvoří bod na mapě a nastaví jeho vlastnosti
    createMarker = function(_input){
        var marker = new GMarker(_input.point, customIcons[_input.kind]);
        marker.id = _input.id;
        if (!(_input && _input.direct)) {
            //var html = '<b>' + _input.title + '</b> <br/>' + _input.address;
            GEvent.addListener(marker, 'click', function(){
                //marker.openInfoWindowHtml(html);
                //console.log(html);
                showDetail(_input);
            });
            GEvent.addListener(marker, 'dblclick', function(point){
            
                // vrátí souřadnice bodu
                //console.log(point.toUrlValue());
                
                // umístí bod na střed mapy
                map.panTo(_input.point);
            });
            GEvent.addListener(marker, 'mouseover', function(){
                showInfo(_input);
                marker.setImage(customIcons[_input.kind + 'toggle'].image);
            });
            GEvent.addListener(marker, 'mouseout', function(){
                hideInfo();
                marker.setImage(customIcons[_input.kind].image);
            });
        }
        return marker;
    };
    createFilterPanel = function(){
        // pokud div pro panel neexistuje v dom vytvoří jej
        if (!Ext.get('mapFilterPanel')) {
            Ext.DomHelper.append(Ext.get(document.body), {
                id: 'mapFilterPanel',
                title: _l10n('mMap_moveByButtonPressDrag'),
                cn: [{
                    tag: 'div',
                    cn: [{
                        tag: 'h2',
                        html: _l10n('mMap_filterPanelSetup')
                    }, {
                        tag: 'a',
                        href: '#',
                        title: _l10n('mMap_close'),
                        onclick: "Ext.get('mapFilterPanel').toggle();",
                        html: _l10n('mMap_close')
                    }, {
                        tag: 'span',
                        html: ' | '
                    }, {
                        tag: 'a',
                        href: '#',
                        title: _l10n('mMap_checkAll'),
                        onclick: "defaultNS.ModuleMap().kindFilterEstateAll();",
                        html: _l10n('mMap_checkAll')
                    }, {
                        tag: 'h3',
                        cn: [{
                            tag: 'a',
                            href: '#',
                            title: _l10n('mMap_kindFilterToggle'),
                            onclick: "Ext.get('kindFilter').toggle();",
                            html: _l10n('mMap_kindFilterToggle')
                        }]
                    }, {
                        tag: 'table',
                        id: 'kindFilter',
                        cn: [{
                            tag: 'tr',
                            cn: [{
                                tag: 'td',
                                cn: [{
                                    tag: 'input',
                                    type: 'checkbox',
                                    id: 'selectionKind1',
                                    name: 'selectionKind1',
                                    onclick: "defaultNS.ModuleMap().kindFilterEstate(1);"
                                }, {
                                    tag: 'label',
                                    'for': 'selectionKind1',
                                    html: _l10n('mMap_flat')
                                }, {
                                    tag: 'br'
                                }, {
                                    tag: 'input',
                                    type: 'checkbox',
                                    id: 'selectionKind2',
                                    name: 'selectionKind2',
                                    onclick: "defaultNS.ModuleMap().kindFilterEstate(2);"
                                }, {
                                    tag: 'label',
                                    'for': 'selectionKind2',
                                    html: _l10n('mMap_villa')
                                }, {
                                    tag: 'br'
                                }, {
                                    tag: 'input',
                                    type: 'checkbox',
                                    id: 'selectionKind3',
                                    name: 'selectionKind3',
                                    onclick: "defaultNS.ModuleMap().kindFilterEstate(3);"
                                }, {
                                    tag: 'label',
                                    'for': 'selectionKind3',
                                    html: _l10n('mMap_recreationalBuilding')
                                }, {
                                    tag: 'br'
                                }, {
                                    tag: 'input',
                                    type: 'checkbox',
                                    id: 'selectionKind4',
                                    name: 'selectionKind4',
                                    onclick: "defaultNS.ModuleMap().kindFilterEstate(4);"
                                }, {
                                    tag: 'label',
                                    'for': 'selectionKind4',
                                    html: _l10n('mMap_apartmentBuilding')
                                }, {
                                    tag: 'br'
                                }]
                            }, {
                                tag: 'td',
                                cn: [{
                                    tag: 'input',
                                    type: 'checkbox',
                                    id: 'selectionKind5',
                                    name: 'selectionKind5',
                                    onclick: "defaultNS.ModuleMap().kindFilterEstate(5);"
                                }, {
                                    tag: 'label',
                                    'for': 'selectionKind5',
                                    html: _l10n('mMap_commercialEstate')
                                }, {
                                    tag: 'br'
                                }, {
                                    tag: 'input',
                                    type: 'checkbox',
                                    id: 'selectionKind6',
                                    name: 'selectionKind6',
                                    onclick: "defaultNS.ModuleMap().kindFilterEstate(6);"
                                }, {
                                    tag: 'label',
                                    'for': 'selectionKind6',
                                    html: _l10n('mMap_lot')
                                }, {
                                    tag: 'br'
                                }, {
                                    tag: 'input',
                                    type: 'checkbox',
                                    id: 'selectionKind7',
                                    name: 'selectionKind7',
                                    onclick: "defaultNS.ModuleMap().kindFilterEstate(7);"
                                }, {
                                    tag: 'label',
                                    'for': 'selectionKind7',
                                    html: _l10n('mMap_other')
                                }, {
                                    tag: 'br'
                                }]
                            }]
                        }]
                    }]
                }]
            });
            
            // nastaví možnost drag div s filtrováním mapy
            var ddEl = new Ext.dd.DD(Ext.get('mapFilterPanel'));
            
        }
    };
    
    // inicializace mapy
    createMap = function(_input){
        oneMarkerOnly = _input && _input.id ? true : false;
        if (GBrowserIsCompatible()) {
        
            // nastav checbox pro filtrování druh nemovitosti
            kindFilterEstate.setup();
            
            map = new GMap2(Ext.getDom('sb-content'));
            
            // nastaví jako default mapový podklad podobný topografickým mapám
            // zejmána z důvodu vyniknutí šedých ovladacích prvků
            map.setMapType(G_PHYSICAL_MAP);
            
            map.setCenter(new GLatLng(49.8412715, 18.2902483), 13);
            geocoder = new GClientGeocoder();
            
            // přepínání mezi druhy map a v případě že se nejedná o detail tak i filtrování druhu nemovistosti
            // vlastní byl zvolen pro jednotnost stylu tlačítek jina by šlo použít map.addControl(new GMapTypeControl());
            map.addControl(new mapCustomControl(_input), new GControlPosition(G_ANCHOR_TOP_RIGHT));
            
            // měřítko mapy
            map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(100, 10)));
            
            // vlastnosti přiblížení
            var boxStyleOpts = {
                opacity: .2,
                border: "2px dotted #FFAD00"
            };
            var otherOpts = {
                buttonHTML: "<img src='" + baseUrl + "/public/image/default/zoom-control-inactive.png' alt='Zapne přiblížení na zkl. stisku tl. myši a současného tažení' title='Zapne přiblížení na zkl. stisku tl. myši a současného tažení' />",
                buttonZoomingHTML: "<img src='" + baseUrl + "/public/image/default/zoom-control-active.png' alt='Vypne přiblížení' title='Vypne přiblížení' />",
                buttonStartingStyle: {
                    width: '17px',
                    height: '17px'
                },
                overlayRemoveTime: 0
            };
            map.addControl(new DragZoomControl(boxStyleOpts, otherOpts, {}), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(27, 7)));
            
            // přidá ovládací prvky mapy pod ovládaní přiblížení
            map.addControl(new GLargeMapControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 32)));
            
            // jedná se o zobrazení jedné adresy formou statického odkazu
            // další kód již neni vykonán
            if (_input && _input.direct) {
                toGeocode.push(_input);
                geocode();
                return true;
            }
            
            // pokud se změní viditelná oblast přenačti body
            GEvent.addListener(map, 'dragend', function(){
                loadMarker(_input);
            });
            GEvent.addListener(map, 'zoomend', function(){
                loadMarker(_input);
            });
            
            map.enableScrollWheelZoom();
            map.enableDoubleClickZoom();
            
            // načtení bodů při první incializaci mapy
            loadMarker(_input);
            
            // pouze příklad kreslení vrstvy průhledného čtverce
            var point = [];
            var mapBound = map.getBounds();
            point.push(mapBound.getSouthWest());
            point.push(new GLatLng(mapBound.getSouthWest().lat(), mapBound.getNorthEast().lng()));
            point.push(mapBound.getNorthEast());
            point.push(new GLatLng(mapBound.getNorthEast().lat(), mapBound.getSouthWest().lng()));
            point.push(mapBound.getSouthWest());
            var polygon = new GPolygon(point, '#ff0000', 2, 1, '#ff0000', 0.3);
            //map.addOverlay(polygon);
        }
    };
    loadMarker = function(_input){
        if (disableIE6()) {
            return false;
        }
        
        // vyčistí mapu např. od bodů
        // důležité zejméne v připadě kdy se nově zobrazena plocha překrývá
        // body by byly zobrazeny opakovaně
        map.clearOverlays();
        
        var zoom = map.getZoom();
        var mapBound = map.getBounds();
        var sW = mapBound.getSouthWest().toUrlValue();
        var nE = mapBound.getNorthEast().toUrlValue();
        var param = {
            id: _input && _input.id ? _input.id : 0,
            
            // sort() je důležitý neb mysql filtr na kind IN ('1,2')
            // není totéž co kind IN ('2,1')
            kind: oneMarkerOnly ? '' : kindToFilter.sort().join(','),
            sW: sW,
            nE: nE,
            zoom: zoom
        };
        param = Ext.urlEncode(param);
        GDownloadUrl(baseUrl + '/administration/map/get-marker/?' + param, function(data){
            var xml = GXml.parse(data);
            var markers = xml.documentElement.getElementsByTagName('marker');
            for (var i = 0; i < markers.length; i++) {
                var id = markers[i].getAttribute('id');
                var title = markers[i].getAttribute('title');
                var address = markers[i].getAttribute('address');
                var kind = markers[i].getAttribute('kind');
                _input = {
                    id: id,
                    title: title,
                    address: address,
                    kind: kind
                };
                
                latitude = parseFloat(markers[i].getAttribute('latitude'));
                longitude = parseFloat(markers[i].getAttribute('longitude'));
                
                
                // zeměpisná šířka 0 a délka 0 odpovídá lokaci v africkém moři u gabon
                // tam pozemky nejsou
                if (latitude > 0 || longitude > 0) {
                    var point = new GLatLng(latitude, longitude);
                    _input['point'] = point;
                    var marker = createMarker(_input);
                    map.addOverlay(marker);
                    oneMarkerOnly ? GEvent.trigger(marker, 'click') : false;
                }
                else {
                
                    // souřadnice neexistují přídá objekt do pole k jejich dohledání
                    // v podstatě mrtvá větev nelze kombinovat body s souřadnicemi společně
                    // s omezením bodů na zkl. getBounds()
                    toGeocode.push(_input);
                }
            }
            
            // dohledej správné souřadnice pokud je zeměpisná šířka 0 a délka 0 tj.
            geocode();
        });
    };
    kindFilterEstate = {
        setup: function(){
            if (!oneMarkerOnly) {
            
                // zkusíme vzít filr z cookie
                kindToFilter = cookieProvider.get('kindToFilter');
                
                // pro každý z checbox
                Ext.each(Ext.select('#mapFilterPanel input').elements, function(el){
                
                    // pokud cookie existuje
                    if (kindToFilter) {
                    
                        // zjisti zda daný druh nemovistoi je nastaven k filtrování v cookie
                        // pokud ano checkbox zaškrtni pokud ne odškrtni
                        el.checked = kindToFilter.indexOf(parseInt(Ext.get(el).id.split('selectionKind')[1], 10)) > -1 ? true : false;
                        
                    }
                    else {
                    
                        // cookie neexistuje zaškrtni vše
                        el.checked = true;
                    }
                });
                
                // cookie neexistuje vše zaškrtnuto je třeba nastavit pole pro filtr
                if (!kindToFilter) {
                    kindToFilter = [1, 2, 3, 4, 5, 6, 7];
                    cookieProvider.set('kindToFilter', kindToFilter);
                }
            }
        },
        addToFilter: function(kind){
        
            // druh nemovitosti je nastaven k filtrování pak jej odeber jinak přidej do pole
            kindToFilter.indexOf(kind) > -1 ? kindToFilter.remove(kind) : kindToFilter.push(kind);
            
            // pole ulož do cookie
            cookieProvider.set('kindToFilter', kindToFilter);
            
            // načti body
            // fce si automaticky vezme druhy k filtrování z pole
            loadMarker();
        },
        kindFilterEstateAll: function(){
        
            // pro každý z checbox
            Ext.each(Ext.select('#mapFilterPanel input').elements, function(el){
                console.log(kindToFilter);
                kind = parseInt(Ext.get(el).id.split('selectionKind')[1], 10);
                //console.log(kind);
                if (kindToFilter.indexOf(kind) > -1) {
                    el.checked = false;
                    kindToFilter.remove(kind);
                }
                else {
                    el.checked = true;
                    kindToFilter.push(kind);
                }
            });
            
            // pole ulož do cookie
            cookieProvider.set('kindToFilter', kindToFilter);
            //console.log(cookieProvider.get('kindToFilter'));
            
            loadMarker();
        }
    };
    return {
    
        // veřejně přistupný alias pro nastavení filtru pro druh nemovitosti
        kindFilterEstate: kindFilterEstate.addToFilter,
        kindFilterEstateAll: kindFilterEstate.kindFilterEstateAll,
        
        // zobrazí bod či body na mapě
        // _input může obsahovat id
        // showEstateOnMap() i showEstateOnMap({id:1})
        showEstateOnMap: function(_input){
            Shadowbox.open({
                player: 'html',
                content: '',
                height: 900,
                width: 900,
                options: {
                    onFinish: function(item){
                        createMap(_input);
                    },
                    onClose: function(){
                    
                        // na zavření modalního okna mapy
                        // pokud je detail nemovitosti odeber z dom
                        Ext.get('mapDetail') ? Ext.get('mapDetail').hide() : false;
                        
                        // skryj nastavení mapy
                        Ext.get('mapFilterPanel').hide();
                    }
                }
            });
        },
        init: function(config){
            createFilterPanel();
            //console.log('init ok');
        }
    };
};
