( function ( $ ) {
    'use strict';

    var maps = [];

    $( document ).ready( function () {
        $( '.gg_woo_feed-map-field-wrap' ).each( function () {
            initializeMap( $( this ) );
        } );
    } );

    function initializeMap( mapInstance ) {
        var searchInput = mapInstance.find( '.opal-map-search' );
        var mapCanvas = mapInstance.find( '.opal-map' );
        var latitude = mapInstance.find( '.opal-map-latitude' );
        var longitude = mapInstance.find( '.opal-map-longitude' );
        var latLng = new google.maps.LatLng( 54.800685, -4.130859 );
        var zoom = 5;

        // If we have saved values, let's set the position and zoom level
        if ( latitude.val().length > 0 && longitude.val().length > 0 ) {
            latLng = new google.maps.LatLng( latitude.val(), longitude.val() );
            zoom = 17;
        }

        // Map
        var mapOptions = {
            center: latLng,
            zoom: zoom
        };
        var map = new google.maps.Map( mapCanvas[ 0 ], mapOptions );

        latitude.on( 'change', function () {
            map.setCenter( new google.maps.LatLng( latitude.val(), longitude.val() ) );
        } );

        longitude.on( 'change', function () {
            map.setCenter( new google.maps.LatLng( latitude.val(), longitude.val() ) );
        } );

        // Marker
        var markerOptions = {
            map: map,
            draggable: true,
            title: 'Drag to set the exact location'
        };
        var marker = new google.maps.Marker( markerOptions );

        //if ( latitude.val().length > 0 && longitude.val().length > 0 ) {
        marker.setPosition( latLng );
        //	}

        // Search
        var autocomplete = new google.maps.places.Autocomplete( searchInput[ 0 ] );
        autocomplete.bindTo( 'bounds', map );

        google.maps.event.addListener( autocomplete, 'place_changed', function () {
            var place = autocomplete.getPlace();
            if ( !place.geometry ) {
                return;
            }

            if ( place.geometry.viewport ) {
                map.fitBounds( place.geometry.viewport );
            } else {
                map.setCenter( place.geometry.location );
                map.setZoom( 17 );
            }

            marker.setPosition( place.geometry.location );

            latitude.val( place.geometry.location.lat() );
            longitude.val( place.geometry.location.lng() );
        } );

        $( searchInput ).keypress( function ( event ) {
            if ( 13 === event.keyCode ) {
                event.preventDefault();
            }
        } );

        // Allow marker to be repositioned
        google.maps.event.addListener( marker, 'drag', function () {
            latitude.val( marker.getPosition().lat() );
            longitude.val( marker.getPosition().lng() );
        } );

        maps.push( map );
    }

    // Resize map when meta box is opened
    if ( typeof postboxes !== 'undefined' ) {
        postboxes.pbshow = function () {
            var arrayLength = maps.length;
            for ( var i = 0; i < arrayLength; i++ ) {
                var mapCenter = maps[ i ].getCenter();
                google.maps.event.trigger( maps[ i ], 'resize' );
                maps[ i ].setCenter( mapCenter );
            }
        };
    }

    // When a new row is added, reinitialize Google Maps
    $( '.cmb-repeatable-group' ).on( 'cmb2_add_row', function ( event, newRow ) {
        var groupWrap = $( newRow ).closest( '.cmb-repeatable-group' );
        groupWrap.find( '.gg_woo_feed-map-field-wrap' ).each( function () {
            initializeMap( $( this ) );
        } );
    } );

} )( jQuery );
