//  Definice zaklanich promennych

var map;
var centerPoint     = false;
var mapRadius       = false;
var startLat        = 49.83089628828897;
var startLng        = 15.413818359375;
var startZoom       = 7;
var addressID       = 0;
var gmMarkersCount  = 0;
var gmMarkers       = [];
var gmDB            = [];
var gmoDB           = [];
var mapBounds;
var baseIcon;
var gmIcon;
var gmPolygon       = false;
var mapRadius;
var showRadius;


//  Funkce pro zruseni vybrane znacky

function clearMarker( iID ) {
    if( gmMarkers[iID].handle != null ) GEvent.removeListener( gmMarkers[iID].handle );
    if( gmMarkers[iID].marker != null ) map.removeOverlay( gmMarkers[iID].marker );
    delete gmMarkers[iID].marker;
    delete gmMarkers[iID];
    return;
}


//  Funkce pro zruseni starych znacek

function clearOldMarkers() {

    map.removeOverlay(gmPolygon);

    if ( ! gmMarkers ) {
        gmMarkersCount = 0;
        return;
    }

    nGmMarkers = [];
    for (var i in gmMarkers) {
        if ( jQuery.inArray( gmMarkers[i].id, gmDB ) == -1 ) {
            clearMarker(i);
        } else {
            if ( gmMarkers[i].id != null ) {
                nGmMarkers[nGmMarkers.length] = gmMarkers[i];
            }
        }
    }

    gmMarkers = nGmMarkers;

}


//  Funkce pro zruseni vsech znacek

function clearMarkers() {

    if ( ! gmMarkers ) {
        gmMarkersCount = 0;
        return;
    }

    for ( i = 0; i < gmMarkers.length; i++ ) {
        clearMarker(i);
    }

    gmMarkersCount  = 0;
    gmMarkers       = [];

}


//  Funkce pro zobrazeni detailu znacky

function displayPoint( id, mPoint ){

    $('#showDetail').load( '/modules/maps/detail.php', 'id=' + id, function( sHTML ){
        $('#showDetail').fadeIn();
        if ( centerPoint == true ) {
            map.panTo( mPoint );
        }
    });

}


//  Funkce pro vytvoreni znacky

function createMarker( mPoint, id ) {
    gmIcon.image = "http://" + window.location.hostname + "/public/images/design/icons/map_point.png";
    var cMarker = new GMarker( mPoint, gmIcon );
    var cHandle = GEvent.addListener( cMarker, "click", function() {
        displayPoint( id, mPoint );
    });

    gmMarkers[gmMarkersCount] = new Object();
    gmMarkers[gmMarkersCount].marker = cMarker;
    gmMarkers[gmMarkersCount].id=id;
    gmMarkersCount++;

    return cMarker;

}


//  Funkce pro nacteni pozic - kontroluje, jestli jsou pozice jiz zobrazene

function checkLoadMarkers() {
    if ( gmMarkersCount < 50 ) loadMarkers();
}


//  Funkce pro nacteni pozic v definovanem radiusu

function loadMarkersRadius( iRadius ) {
    if ( ! isNaN( parseFloat( iRadius ) ) || parseFloat( iRadius ) > 0 ) {
        $('#showradius').attr({'checked':true});
    } else {
        if ( $('#showradius').is(':checked') ) {
            alert( "Musíte zadat číselný rádius v km, který chcete zobrazit." )
        }
    }
    loadMarkers();
}


//  Funkce pro zruseni radiusu

function clearRadius() {
    if ( ! $('#showradius').is(':checked') ) {
        $('#radius').val('');
        loadMarkers();
    }
}


//  Funkce pro nacteni pozic podle nalezene adresy

function loadMarkersSearch( sAddress ) {
    var geocoder = new GClientGeocoder();
    geocoder.getLocations( sAddress, function(response){
        if (!response || response.Status.code != 200) {
            alert( "Hledaná adresa \"" + sAddress + "\" nebyla nalezena." )
        } else {
            place       = response.Placemark[0];
            point       = new GLatLng( place.Point.coordinates[1], place.Point.coordinates[0] );
            accuracy    = place.AddressDetails.Accuracy;
            zoom        = setZoom(accuracy);
            map.setCenter( point, zoom );
            map.setZoom(map.getBoundsZoomLevel(bounds));

            loadMarkers();
        }
    } );
}


//  Funkce pro nastaveni urovne zoomovani

function setZoom( iAccuracy ) {
    iDefault    = startZoom;
    if ( iAccuracy < 2 ) return iDefault;
    else if ( iAccuracy < 4 ) return iDefault + 3;
    else if ( iAccuracy < 6 ) return iDefault + 6;
    else if ( iAccuracy < 8 ) return iDefault + 8;
    else if ( iAccuracy <= 9  ) return iDefault + 9;
}


//  Funkce pro nacteni pozic

function loadMarkers() {

    gmoDB       = gmDB;
    gmDB        = [];
    var mCenter = map.getBounds();
    if( mapBounds ) delete mapBounds;
    mapBounds   = new GLatLngBounds();
    var mZoom   = map.getZoom();
    var mSW     = mCenter.getSouthWest();
    var mNE     = mCenter.getNorthEast();
    var cCenter = map.getCenter();

    if ( $('#showradius').is(':checked') && ! isNaN( parseFloat( $('#radius').val() ) ) && parseFloat( $('#radius').val() ) > 0 ) {
        mapRadius = parseFloat( $('#radius').val() );
    } else {
        mapRadius = false;
    }

    dataURL = "/modules/maps/xml.php?sw=" + mSW + "&ne=" + mNE + "&zoom=" + mZoom + "&center=" + cCenter + "&radius=" + mapRadius;

    if ( mapRadius != false ) {
        $('#showRadius span').text(mapRadius);
        $('#showRadius').show();
        showRadius  = mapRadius;
        mapRadius = false;
    } else {
        if ( gmPolygon != false ) map.removeOverlay(gmPolygon);
        gmPolygon  = false;
        showRadius = false;
        $('#showRadius').hide();
    }

    GDownloadUrl( dataURL, function( data, responseCode ) {

        xmlDoc = GXml.parse( data );

        if ( xmlDoc == null ) {
        } else {

            var domMarkers = xmlDoc.documentElement.getElementsByTagName("Marker");
            for (var i = 0; i < domMarkers.length; i++) {

                var id      = domMarkers[i].getAttribute("id");
                var lat     = domMarkers[i].getAttribute("mx");
                var lng     = domMarkers[i].getAttribute("my");
                var mPoint  = new GLatLng( parseFloat(lat), parseFloat(lng) );

                gmDB[gmDB.length]=id;

                if ( jQuery.inArray( id, gmoDB ) == -1 ) {
                    mMark   = createMarker( mPoint, id );
                    if( mMark != null ) {
                        map.addOverlay( mMark );
                    }
                    delete mPoint;
                    mapBounds.extend( mPoint );
                    lat = lng = mMark = mPoint = id = null;
                }
            }

            clearOldMarkers();
            if ( showRadius != false ) {
                drawCircle(cCenter.y, cCenter.x, showRadius, "#96BF11", 1, 0.75, "#96BF11",0.25);
            }

            var domCount = xmlDoc.documentElement.getElementsByTagName("Count");
            if ( domCount.length == 1 ) {
                var itemS   = domCount[0].getAttribute("show");
                var itemT   = domCount[0].getAttribute("total");
            } else {
                var itemS   = "-";
                var itemT   = "-";
            }

            $('#countS').text( itemS );
            $('#countT').text( itemT );

            domCount = null;
            domMarkers = null;
            xmlDoc = null;

        }

    })

}


//  Vykresleni radiusu

function drawCircle( lat, lng, radius, strokeColor, strokeWidth, strokeOpacity, fillColor, fillOpacity ) {

    var center = map.getCenter();
    var bounds = new GLatLngBounds();
    var Cpoints = Array();

    with (Math) {
        var d = radius/6378.8;    // radians
        var lat1 = (PI/180)* center.lat(); // radians
        var lng1 = (PI/180)* center.lng(); // radians

        for (var a = 0 ; a < 361 ; a++ ) {
            var tc = (PI/180)*a;
            var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
            var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
            var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
            var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
            Cpoints.push(point);
            bounds.extend(point);
        }

        if (d < 1.5678565720686044) {
            gmPolygon = new GPolygon( Cpoints, strokeColor, strokeWidth, strokeOpacity, fillColor, fillOpacity );
        }
        else {
            gmPolygon = new GPolygon( Cpoints, strokeColor, strokeWidth, strokeOpacity, fillColor, fillOpacity );
        }
        map.addOverlay( gmPolygon );
    }

}


//  Funkce pro nacteni google maps

function loadGMap() {

    if (GBrowserIsCompatible()) {

        map = new GMap2( document.getElementById("map") );

        map.addControl(new GMapTypeControl());
        map.addControl(new GLargeMapControl());
        map.addControl(new GScaleControl());
        map.addControl(new GOverviewMapControl());

        map.enableContinuousZoom();
        map.enableScrollWheelZoom();
        map.setCenter(new GLatLng( startLat, startLng ), startZoom );

        gbIconBase = new GIcon();
        gbIconBase.iconSize = new GSize(25, 30);
        gbIconBase.iconAnchor = new GPoint(25,30);
        gmIcon = new GIcon(gbIconBase);

        map.setUIToDefault();

        /*GEvent.addListener(map, "dragend", function() {
            loadMarkers();
        });*/

        /*GEvent.addListener(map, "zoomend", function() {
            loadMarkers();
        });*/

        //map.enableDoubleClickZoom();
        if ( $('#address').val() != '' ) {
            loadMarkersSearch($('#address').val());
        } else {
            loadMarkers();
        }

    } else {
        alert("Omlouváme se Vám, ale Váš prohlížeč neumožňuje pracovat s Google Maps API");
    }

}


//  Zakresleni ikonky na jednoduchou mapu

function loadAddressMarker(lat,lng,id) {
    var mPoint  = new GLatLng( parseFloat(lat), parseFloat(lng) );
    var mMark   = createMarker( mPoint, id );
    if( mMark != null ) {
        map2.addOverlay( mMark );
    }
    lat = lng = mMark = mPoint = id = null;
}

//  Funkce pro zobrazeni jednoduche mapy

function loadAddressGMap(){
    if (GBrowserIsCompatible()) {

        var iID = parseInt( $('#addressID').text() );
        $.ajax({
            type:     'GET',
            dataType: 'json',
            url:      '/maps/index/coords',
            data:     'id='+iID+'',
            success:  function ( data ) {
                if( data != "" ){
                    var aCoord = String(data).split('|');
                    map2 = new GMap2( document.getElementById("addressMap"));
                    //map2.addControl(new GMapTypeControl());
                    map2.addControl(new GLargeMapControl());
                    map2.enableContinuousZoom();
                    map2.enableScrollWheelZoom();

                    showMarker = true;
                    showZoom = 14;
                    if (parseFloat(aCoord[0]) == 0) {
                        aCoord[0] = startLat;
                        showMarker = false;
                        showZoom = 7;
                    }
                    if (parseFloat(aCoord[1]) == 0) {
                        aCoord[1] = startLng;
                        showMarker = false;
                        showZoom = 7;
                    }

                    map2.setCenter(new GLatLng( aCoord[0], aCoord[1] ), showZoom );

                    gbIconBase = new GIcon();
                    gbIconBase.iconSize = new GSize(25, 30);
                    gbIconBase.iconAnchor = new GPoint(25,30);
                    gmIcon = new GIcon(gbIconBase);

                    if (showMarker == true) {
                        loadAddressMarker(aCoord[0],aCoord[1],iID);
                    }
                }else{
                    $('#addressMap').css('display','none');
                }
            }
        });

    } else {
        alert("Omlouváme se Vám, ale Váš prohlížeč neumožňuje pracovat s Google Maps API");
    }
}


//  Nacteni nastaveni

//$(document).ready( function() {
//    loadGMap();
//});

