var geocoder;
var map;
var marker;
var zoomIn;
var zoomOut;
var errored = false;
var error;
var fieldset;
var droppedPin;

window.addEvents({
    'domready': function ()
    {
        
        // Clean up Google garbage when the page closes
        if(window.GBrowserIsCompatible())
        {
            window.addEvent('unload',function (){ GUnload();});
        
            // Create all the elements we'll need for the Google Map
            // Starting with the fieldset, legend and intro para
            var fieldset = new Element('div',{'id':'map-wrapper'});
            legend = new Element('h3',{ 'html':'Set your location'});
            fieldset.grab(legend);
            
            para = new Element('p',
                {
                    'html':     "Enter the name of your road and your postcode in the search box below. If the pin is not in the right place, click and drag it to the correct point on the map.",
                    'class':    "intro"
                }
            );
            fieldset.grab(para);
            
            // Create the form elements that do the searching
            searchContainer = new Element('p',{'class':'fields' });
            searchLabel = new Element('label', {'html':'Search:&nbsp;'});
            searchInput = new Element('input',
                {
                    'type':     'text',
                    'name':     'search-field',
                    'id':       'search-field'
                }
            );
            
            searchInput.addEvent('keypress',
                function (ev)
                {
                    if(ev.key == 'enter')
                    {
                        ev.preventDefault();
                    }
                }
            );
            searchLabel.grab(searchInput);
            searchLabel.appendText(' ');
            searchContainer.grab(searchLabel);
            
            searchButton = new Element('input',
                {
                    'type':     'submit',
                    'name':     'searchButton',
                    'id':       'search-button',
                    'class':    'button search',
                    'value':    '> Search'
                }
            );
        
            searchContainer.grab(searchButton);
            fieldset.grab(searchContainer);
        
            // Zoom controls
            zoomIn = new Element('button',
                {
                    'name':     'zoomin',
                    'html':     '+ Zoom',
                    'class':    'button'
                }
            );
            
            zoomOut = new Element('button',
                {
                    'name':     'zoomout',
                    'html':     '- Zoom',
                    'class':    'button'
                }
            );
        
            zoomControls = new Element('span',{'class':'zoom-container'});
            zoomControls.grab(zoomIn,'bottom');
            zoomControls.appendText(' ');
            zoomControls.grab(zoomOut,'bottom');
            
            searchContainer.grab(zoomControls,'top');
            
            // Map Div
            mapDiv = new Element('div',{'id':'map'});
            mapDiv.setStyle('display','block');
            fieldset.grab(mapDiv);
            
            // Build the Google Map
            map = new GMap2(mapDiv);
            map.setCenter(new GLatLng(54.648413,-4.921875),5);
            map.enableContinuousZoom();
            
            zoomIn.addEvent('click',
                function (ev)
                {
                    ev.preventDefault();
                    map.zoomIn();
                }
            );

            zoomOut.addEvent('click',
                function (ev)
                {
                    ev.preventDefault();
                    map.zoomOut();
                }
            );
        
            // Hidden latitude/longitude elements
            if($('latitude') && $('longitude'))
            {
                lat = $('latitude');
                lng = $('longitude');
                gotPoint = true;
            }
            else
            {
                lat = new Element('input',
                    {
                        'type':     'hidden',
                        'name':     'latitude',
                        'id':       'latitude'
                    }
                );
                lng = new Element('input',
                    {
                        'type':     'hidden',
                        'name':     'longitude',
                        'id':       'longitude'
                    }
                );
                fieldset.grab(lat);
                fieldset.grab(lng);
                gotPoint = false;
            }
        
            // Insert the stuff we just created in to the DOM, replacing the placeholder
            fieldset.replaces($('map-placeholder'));
            map.checkResize();
            if(gotPoint)
            {
                point = new GLatLng(lat.get('value'),lng.get('value'));
                marker = new GMarker(point, {draggable: true});
                map.addOverlay(marker);
                droppedPin = true;
                GEvent.addListener(marker, 'dragend', function ()
                {
                    newPoint = setLatLng(marker.getLatLng().lat(), marker.getLatLng().lng());
                    map.panTo(newPoint);
                });
                map.setCenter(point,13);
            }
            else
            {
                map.setCenter(new GLatLng(54.648413,-4.921875),5);
            }
            geocoder = new GClientGeocoder();
            
            GEvent.addListener(map,'moveend',
                function ()
                {
                    if(map.getZoom() >= 7)
                    {
                        if(!droppedPin)
                        {
                            dropPin = new Element('button',
                                {
                                    'id':           'drop-pin',
                                    'html':         'Drop pin'
                                }
                            );
                        
                            zoomControls.appendText(' ','top');
                            zoomControls.grab(dropPin,'top');
                            addRoundedCorners(dropPin);
                            dropPin.addEvent('click',
                                function (ev)
                                {
                                    map.clearOverlays();
                                    ev.preventDefault();
                                    centre = map.getCenter();
                                    marker = new GMarker(centre, {draggable: true});
                                    setLatLng(centre.lat(), centre.lng());
                                    map.addOverlay(marker);
                                    GEvent.addListener(marker, 'dragend', function ()
                                    {
                                        newPoint = setLatLng(marker.getLatLng().lat(), marker.getLatLng().lng());
                                        map.panTo(newPoint);
                                    });
                                }
                            );
                        }
                        droppedPin = true;
                    }
                    else
                    {
                        if(droppedPin)
                        {
                            if($defined($('drop-pin')))
                            {
                                $('drop-pin').destroy();
                            }
                            droppedPin = false;
                        }
                    }
                }
            );
            
            
            // Add an event to the search button we just created to trigger the API search
            searchButton.addEvent('click',
                function (ev)
                {
                    ev.preventDefault();
                    geocoder.setBaseCountryCode('uk');
                    pos = fieldset.getPosition();
                    dimensions = fieldset.getSize();
                    yOffset = Math.round(pos.y - ((window.getSize().y - dimensions.y)/2));

                    if(!Browser.Engine.webkit)
                    {
                        // scroll = new Fx.Scroll(window);
                        // scroll.start(0,yOffset).start();
                    }
                    
                    r = new Request.JSON({
                        'url':      responder,
                        'link':     'cancel',
                        onSuccess:  function (response)
                        {
                            if($defined(response.error) && response.error)
                            {
                                if(!errored)
                                {
                                    errored = true;
                                    error = new Element('p',
                                        {
                                            'html':     "Whoops, I can't find that address. Make sure your postcode has a space between the first and last part, and if that still doesn't work, just try putting in the name of your road and the town you live in.",
                                            'id':       'error-message'
                                        }
                                    );
                                
                                    error = error.inject(document.getElement('p.fields'),'before');
                                }
                                error.highlight('#F91C01');
                                return false;
                            }
                            if($('error-message'))
                            {
                                $('error-message').dispose();
                            }
                            errored = false;
                            map.setZoom(13);
                            point = new GLatLng(response.latitude,response.longitude);
                            map.panTo(point);
                            map.clearOverlays();
                            var marker = new GMarker(point, {draggable: true});
                            setLatLng(marker.getPoint().lat(), marker.getPoint().lng());
                            GEvent.addListener(marker, 'dragend', function ()
                            {
                                newPoint = setLatLng(marker.getPoint().lat(), marker.getPoint().lng());
                                map.panTo(newPoint);
                            });
                            map.addOverlay(marker);
                        }
                    }).get({
                        'action':       'doGoogleGeocode',
                        'term':         $('search-field').get('value')
                    });
                }
            );          
            
        }
        addRedArrow();
        roundCorners();
    },
    'load': function ()
    {
        if($defined($('update-done')))
        {
            $('update-done').highlight('#F91C01');
        }
    }
});

var RecaptchaOptions = {
   theme: 'custom',
   lang: 'en',
   custom_theme_widget: 'recaptcha_widget'
};