//čćžš
var DGoogleMap = {
    
    data: {}, //podaci za kartu
    options: {}, //opcije za kartu
    loadersActive: 0, //brojač poziva loadera
    mapTypes: { 'HYBRID':'Kombinirana', 'ROADMAP':'Cestovna', 'SATELLITE':'Satelit' },
    markers: new Array, //lista markera na mapi
    mapMarkersBoundrys: { 'n':-90, 'e':-90, 's':90, 'w':90 },
    
    /**
    * konstruktor
    */
    DGoogleMap : function()
    {
    },
    
    /**
    * dodavanje podaka
    */
    addData : function( data, label )
    {
        if( label )
        {
            DGoogleMap.data[label] = data;
        }
        else
        {
            DGoogleMap.data[ DGoogleMap.data.length ] = data;
        }
    },
    
    /**
    * postavljanje markera
    */
    setMarker : function( latLang, title, html, icon, expanded )
    {
        marker_index = DGoogleMap.markers.length;
        DGoogleMap.markers[marker_index] = { 'latLang': latLang, 'title': title, 'html': html, 'icon': icon, 'expanded': expanded, 'onMap': ( ( DGoogleMap.mapObject ) ? true : false ), 'markerRef': false };
        
        /**
        * latlang moze biti array ili google latlang
        */
        if( typeof latLang == 'object' )
        {
            if( typeof latLang['lat'] != 'function' )
            {
                latLang = new google.maps.LatLng( latLang['lat'], latLang['lng'] );
            }
            else if( typeof latLang['lat'] == 'function' )
            {
                latLang = new google.maps.LatLng( latLang.lat(), latLang.lng() );
            }
        }
        
        /**
        * praćenje granica markera
        */
        if( DGoogleMap.mapMarkersBoundrys['n']<latLang.lat() ) DGoogleMap.mapMarkersBoundrys['n'] = latLang.lat();
        if( DGoogleMap.mapMarkersBoundrys['s']>latLang.lat() ) DGoogleMap.mapMarkersBoundrys['s'] = latLang.lat();
        if( DGoogleMap.mapMarkersBoundrys['w']>latLang.lng() ) DGoogleMap.mapMarkersBoundrys['w'] = latLang.lng();
        if( DGoogleMap.mapMarkersBoundrys['e']<latLang.lng() ) DGoogleMap.mapMarkersBoundrys['e'] = latLang.lng();
        
        /**
        * ako nema objekta nemoj stavljat
        */
        if( !DGoogleMap.mapObject )
        {
            return;
        }
        
        /**
        * osnovni parametri markera
        */
        var marker_params = {
            position: latLang,
            map: DGoogleMap.mapObject,
            title: title,
            clickable: ( html ) ? true : false
        }
        
        /**
        * custom icon
        */
        if( icon )
        {
            marker_params['icon'] = icon;
        }
        
        /**
        * dodavanje markera
        */
        var marker = new google.maps.Marker( marker_params );
        
        if( html )
        {
            /**
            * dodavanje info prozora
            */
            var infoWindow = new google.maps.InfoWindow({ content: html, size: new google.maps.Size(200, 500) });
            /**
            * povezivanje markera i info prozora
            */
            google.maps.event.addListener( marker, 'click', function()
            {
              $(".gmnoprint").hide();
              infoWindow.open( DGoogleMap.mapObject, marker );
            });
            
            /**
            * auto prikaz info prozora
            */
            if( expanded )
            {
                infoWindow.open( DGoogleMap.mapObject, marker );
            }
        }
        DGoogleMap.markers[marker_index]['markerRef'] = marker;
        return marker;
    },
    
    /**
    * prebacivanje tipa mape
    */
    switchMapType : function ( type )
    {
        DGoogleMap.loaderShow();
        DGoogleMap.mapObject.set_mapTypeId( google.maps.MapTypeId[type] );
        DGoogleMap.setOption( 'mapTypeId', google.maps.MapTypeId[type] );
        DGoogleMap.loaderHide();
    },
    
    /**
    *
    */
    setOption : function ( optionLabel, optionValue )
    {
        DGoogleMap.options[ optionLabel ] = optionValue;
    },
    
    /**
    * prikaz mape
    */
    displayMap : function( jQuerySelector )
    {
        DGoogleMap.loaderShow();
        /**
        * ako vec ne postoji objekt onda ga napravit
        */
        if( !DGoogleMap.mapObject )
        {
            DGoogleMap.mapObject = new google.maps.Map( $( jQuerySelector ).get(0), DGoogleMap.options);
        }
        DGoogleMap.loaderHide();
        
        /**
        * prikaz markera
        */
        
        return ( DGoogleMap.mapObject ) ? true : false ;
    },
    
    /**
    * function displayMarkers
    */
    displayMarkers : function()
    {
        for( var marker in DGoogleMap.markers )
        {
            if( DGoogleMap.markers[marker]['onMap'] ) continue;
            DGoogleMap.markers[marker]['onMap'] = true;
            DGoogleMap.setMarker( DGoogleMap.markers[marker]['latLang'], DGoogleMap.markers[marker]['title'], DGoogleMap.markers[marker]['html'], DGoogleMap.markers[marker]['icon'], DGoogleMap.markers[marker]['expanded'] );
        }
    },
    
    /**
    * geocode za centriranje na županiju
    */
    centerToRegion : function( regionName )
    {
        DGoogleMap.loaderShow();
        results = DGoogleMap.geocodeAddress( regionName, DGoogleMap.centerToRegionCallback );
        DGoogleMap.loaderHide();
    },
    centerToRegionCallback : function ( results )
    {
        DGoogleMap.loaderShow();
        DGoogleMap.mapObject.set_center( results[0].geometry.location );
        DGoogleMap.mapObject.fitBounds( results[0].geometry.viewport );
        DGoogleMap.loaderHide();
    },
    
    /**
    * loader funkcije
    */
    loaderShow : function()
    {
        DGoogleMap.loadersActive++;
        $('#gMapLoader').show();
    },
    loaderHide : function()
    {
        DGoogleMap.loadersActive--;
        if( DGoogleMap.loadersActive < 1 )
        {
            DGoogleMap.loadersActive = 0;
            $('#gMapLoader').hide();
        }
    },
    
    /**
    * ispis toolbara
    */
    displayMapTypeToolbar : function( target )
    {
        var active_type = DGoogleMap.options['mapTypeId'].toUpperCase();
        
        for( var type in DGoogleMap.mapTypes )
        {
            $(target).append('<button name="'+type+'" class="'+( ( type == active_type ) ? 'active' : '' )+'">'+DGoogleMap.mapTypes[type]+'</button>');
        }
        
        $(target).find('button').bind('click', function(e)
        {
            $(this).parent().find('button').removeClass('active');
            DGoogleMap.switchMapType( this.name );
            $(this).addClass('active');
        });
    },
    
    fitMapToMarkers: function()
    {
        DGoogleMap.mapObject.fitBounds( new google.maps.LatLngBounds( new google.maps.LatLng(DGoogleMap.mapMarkersBoundrys['s']-0.05, DGoogleMap.mapMarkersBoundrys['w']-0.05), new google.maps.LatLng(DGoogleMap.mapMarkersBoundrys['n']+0.05, DGoogleMap.mapMarkersBoundrys['e']+0.05) ) );
    },
    
    /**
    * geocode adrese
    */
    geocodeAddress : function( address, callback )
    {
        DGoogleMap.loaderShow();
        geocoder = new google.maps.Geocoder();
        geocoder.geocode(
            { 'address': address}, function( results, status )
            {
                if ( status == google.maps.GeocoderStatus.OK )
                {
                    if ( status != google.maps.GeocoderStatus.ZERO_RESULTS )
                    {
                        DGoogleMap.loaderHide();
                        callback( results );
                    }
                    else
                    {
                        DGoogleMap.loaderHide();
                        return false;
                    }
                }
                else
                {
                    DGoogleMap.loaderHide();
                    return false;
                }
            }
        )
    },
    
    /**
    * generička funkcija za callback
    */
    callback : function( callback )
    {
        if( typeof callback == 'undefined' )
        {
            return '';
        }
        if( arguments.length > 1 )
        {
            return DGoogleMap.call_user_func_array( callback, argument.slice(1) );
        }
        else
        {
            return callback();
        }
    },
    
    
    /**
    * php ekvivalent, poziva cb i prosljedjuje mu parameters
    */
    call_user_func_array : function( cb, parameters )
    {
        var func;
        if (typeof cb == 'string') {
            if (typeof this[cb] == 'function') {
                func = this[cb];
            } else {
                func = (new Function(null, 'return ' + cb))();
            }
        } else if (cb instanceof Array) {
            func = eval(cb[0]+"['"+cb[1]+"']");
        }
        
        if (typeof func != 'function') {
            throw new Error(func + ' is not a valid function');
        }
        return func.apply(null, parameters);
    }

    
    
}


$(document).ready(function() {
    
    DGoogleMap.setOption( 'zoom', 7 );
    DGoogleMap.setOption( 'center', new google.maps.LatLng(45.1, 16.2) );
    DGoogleMap.setOption( 'mapTypeId', google.maps.MapTypeId.ROADMAP );
    
    $("#gmap").hide();
    
    if( DGoogleMap.markers.length > 0 )
    {
        bounds = new google.maps.LatLngBounds( new google.maps.LatLng(DGoogleMap.mapMarkersBoundrys['s']-1, DGoogleMap.mapMarkersBoundrys['w']-1), new google.maps.LatLng(DGoogleMap.mapMarkersBoundrys['n']+1, DGoogleMap.mapMarkersBoundrys['e']+1) );
        DGoogleMap.setOption( 'center', bounds.getCenter() );
        DGoogleMap.displayMap( "#gmap" );
        DGoogleMap.displayMarkers();
        $("#gmap").show();
        DGoogleMap.fitMapToMarkers();
    }
    else
    {
        DGoogleMap.displayMap( "#gmap" );
        DGoogleMap.displayMarkers();
        $("#gmap").show();
        DGoogleMap.fitMapToMarkers();
    }
});

