// some gmaps vars:
var lastMarkerLocation = null;
var debug = [];

var mapdata = [];
var markers = [];

var curlat = false;
var curlng = false;
var allowedBounds = null;
var aberration = 0.2; // this value is a good choice for germany (?!)


var use_panorama = false;
var panoramafx = null;

var current_latlng = null;

window.addEvent('domready', function()
{
    if ($('map') && GBrowserIsCompatible())
    {
        use_panorama = ($('panorama'));
        
        var lat = 52.35091275849595;
        var lng = 4.910802841186523;
    
        // get preset coordinates
        var mapcontainer = $('map');
        
        var add_message = (mapcontainer.hasClass('addmarker') && $('marker_latlng') !== null);

        var zoom = defaultzoom;
        
        if (curlat && curlng)
        {
            lat = curlat;
            lng = curlng;
        }
        
        if (mapcontainer.hasClass('closezoom'))
        {
            zoom = closezoom;
        }
        
        // set amstel starting coords
        var latlng = new GLatLng(lat,lng);
        var pov = {'yaw': 0};
        
        var minlat = 52.28519907597961;
        var maxlat = 52.37570397280555;
        var minlng = 4.887199401855469;
        var maxlng = 4.931488037109375;
        
        var lefttop     = new GLatLng(minlat, maxlng);
        var righttop    = new GLatLng(maxlat, maxlng);
        var rightbottom = new GLatLng(maxlat, minlng);
        var leftbottom  = new GLatLng(minlat, minlng);
        
        allowedBounds = new GLatLngBounds(leftbottom, righttop);
    
        // create map object
        map = create_map(mapcontainer, latlng, zoom, !mapcontainer.hasClass('disabled'), mapcontainer.hasClass('showsatellite'));
        
        // Get the list of map types
        var mt = map.getMapTypes();

        // Overwrite the getMinimumResolution() and getMaximumResolution() methods
        
        if (!mapcontainer.hasClass('nolimit'))
        {
            for (var i=0; i<mt.length; i++) {
                mt[i].getMinimumResolution = function() {return 12;}
                //mt[i].getMaximumResolution = function() {return maxRes;}
            }
        }
        
        /*
        var points = [  
             lefttop
            ,righttop
            ,rightbottom
            ,leftbottom
            ,lefttop
        ]; 
        var polyline = new GPolyline(points, '#666666', 1, 0.7); 
        map.addOverlay(polyline); 
        */

        if (mapcontainer.hasClass('singleicon') == true)
        {
            var icon = create_icon(category_id);
            var marker = create_marker(latlng, icon, false, false);
            map.addOverlay(marker);
        }
        else if (mapdata.length > 0)
        {
            mapdata.each(function(messages, main_category_id)
            {
                if(messages)
                {
                  markers[main_category_id] = [];
                  messages.each(function(message, index)
                  {
                      var marker = create_message_marker(message);
                      markers[main_category_id].push(marker);
                      map.addOverlay(marker);

                  });
                }
            });
        }
        
        // create panorama object
        if (use_panorama)
        {
            panoramafx = new Fx.Slide('panorama');
            
            panorama = create_panorama($('panorama'), latlng, pov);
            GEvent.addListener(panorama, "error", handleNoFlash);   
            GEvent.addListener(panorama, "initialized", update_dummy);
            GEvent.addListener(panorama, "yawchanged", rotate_dummy); 
        
            // create streetview client (to get info about nearest panorama, etc.)
            client = create_streetview_client();
            
            // create guy for first-person viewing/navigation
            dummy = new GMarker(latlng, {icon: create_dummy(), draggable: true});
            GEvent.addListener(dummy, "dragend", update_panorama);
            
            GEvent.addListener(dummy, 'drag', function(latlng) {
                  var curlat = latlng.lat();
                  var curlng = latlng.lng();
                  
                  if(curlat>maxlat){dummy.setLatLng(new GLatLng(maxlat,curlng));curlat=maxlat;}
                  if(curlat<minlat){dummy.setLatLng(new GLatLng(minlat,curlng));curlat=minlat;}
                  
                  if(curlng<minlng){dummy.setLatLng(new GLatLng(curlat,minlng));}
                  if(curlng>maxlng){dummy.setLatLng(new GLatLng(curlat,maxlng));}
            });
            
            map.addOverlay(dummy);

            //rotate_dummy(panorama.getPOV());
            
            // find initial vista
            update_panorama((curlat && curlng)? new GLatLng(curlat,curlng):new GLatLng(52.350609661431754,4.909475147724152));

            map.addOverlay(new GStreetviewOverlay());
        }
        
        if ($('add_message'))
        {
            var add_message = $('add_message');
            add_message.addEvent('click', function()
            {
               //var current_latlng = map.getCenter();
               add_message.href = add_message.href + '?lat=' + current_latlng.lat() + '&lng=' + current_latlng.lng();
            });
        }
        
        if ($('add_submit'))
        {
            var add_submit = $('add_submit');
            add_submit.addEvent('click', function()
            {
                var postbase = this.form.action.substr(0, this.form.action.indexOf('?'));
                this.form.action = postbase + '?lat=' + current_latlng.lat() + '&lng=' + current_latlng.lng();
                
                
                //return false;
            });
        }
        
        // when adding a message, let's put a single marker on the map
        if (add_message == true)
        {
            var marker = create_default_marker(latlng, true);
            GEvent.addListener(marker, "dragend", update_hidden);
            GEvent.addListener(marker, 'drag', function(latlng) {
                  var curlat = latlng.lat();
                  var curlng = latlng.lng();
                  
                  if(curlat>maxlat){marker.setLatLng(new GLatLng(maxlat,curlng));curlat=maxlat;}
                  if(curlat<minlat){marker.setLatLng(new GLatLng(minlat,curlng));curlat=minlat;}
                  
                  if(curlng<minlng){marker.setLatLng(new GLatLng(curlat,minlng));}
                  if(curlng>maxlng){marker.setLatLng(new GLatLng(curlat,maxlng));}
            });
            update_hidden(latlng);
            map.addOverlay(marker);
        }
        
        if (mapcontainer.hasClass('addperson'))
        {
            var marker = create_default_marker(latlng, true);
            GEvent.addListener(marker, "dragend", update_hidden);
            update_hidden(latlng);
            map.addOverlay(marker);
        }
        
        if (mapcontainer.hasClass('showuserloc'))
        {
            dummy = new GMarker(latlng, {icon: create_dummy(), draggable: false});
            map.addOverlay(dummy);
        }
        
        if ($('legend'))
        {
            $('legend').getElements('li input[type=checkbox]').each(function(el)
            {
                var img = $('ic_'+el.value);
                
                var savedstate = Cookie.read('ic_'+el.value);
                if (savedstate)
                {
                    el.checked = (savedstate == 1);
                    toggle_marker(el, img);
                }

                el.addEvent('click', function()
                {
                    toggle_marker(el, img);
                    Cookie.write('ic_'+el.value, (el.checked == true? 1 : 0), {duration: 10});
                });
                
                if (!markers[el.value])
                {
                    img.setStyle('opacity', 0.5);
                }
            });
        }
    }
 
    $$('.subselect').each(function(parent)
    {
        parent.addEvent('change', function()
        {
            checksub(parent);
            //checkother(parent);
        });
        
        checksub(parent, true);
        //checkother(parent);
    });
    
    $$('.checkother').each(function(parent)
    {
        parent.addEvent('change', function()
        {
            checkother(parent);
        });
        checkother(parent);
    });
    
    $$('div.fadeout').each(function(el)
    {
      (function(){el.tween('height',el.offsetHeight,0);}).delay(2000, this);
    });

});

function toggle_marker(el, img)
{
    if (markers[el.value])
    {
        markers[el.value].each(function(marker)
        {
            if (el.checked == true)
            {
                marker.show();
                img.setStyle('opacity', 1);
            }
            else
            {
                marker.hide();
                img.setStyle('opacity', 0.5);
            }
        });
    }
}

function update_hidden(latlng)
{
    current_latlng = latlng;
    $('marker_latlng').set('value', latlng.lat() + ',' + latlng.lng());
}

function rotate_dummy(yaw)
{
    var imagecount = 16;
    var angles_per_image = 360 / imagecount;
    if (yaw < 0)
    {
        yaw += 360;
    }
    var current_image = Math.round(yaw / angles_per_image) % imagecount;
    var url = "http://maps.gstatic.com/mapfiles/cb/man_arrow-" + current_image + ".png";
    dummy.setImage(url);
    
    //debug.push('yaw: ' + yaw);
}

function update_dummy(GStreetviewLocation)
{
    dummy.setLatLng(GStreetviewLocation.latlng);
    
    //debug.push('lat: ' + GStreetviewLocation.lat);
    //debug.push('lng: ' + GStreetviewLocation.lat);
}

function update_panorama(latlng)
{
    current_latlng = latlng;
    client.getNearestPanorama(latlng, update_dummy_and_panorama);
}

function update_dummy_and_panorama(response)
{
    
    if (response.code == 200)
    {
        dummy.setLatLng(response.Location.latlng);
        panorama.setLocationAndPOV(response.Location.latlng);
        
        panoramafx.slideIn();
        $('pnotice').setStyle('display', 'none');
    }
    else
    {
        panoramafx.slideOut();
        $('pnotice').setStyle('display', 'block');
    }
}

function update_map(latlng)
{
    map.setLocationAndPOV(latlng);
}

function handleNoFlash(errorCode)
{
  /*
  if (errorCode == FLASH_UNAVAILABLE)
  {
    alert("Error: Flash doesn't appear to be supported by your browser");
    return;
  }
  */
}  

function checksub(parent, autoselect)
{
  autoselect = autoselect || false;

  if (parent.value == '' || parent.value == 'other')
  {
    hide_sub(parent);
  }
  else
  {
    fill_sub(parent, autoselect);
  }
  
  var child = $(parent.id + '_sub');
  if (child.hasClass('checkother'))
  {
    checkother(child);
  }
}

function checkother(parent)
{
  var target = $('div_' + parent.id.substr(parent.id.indexOf('_')+1) + '_other');
  if (target)
  {
    if (parent.value == 'other')
    {
      target.setStyle('display', 'block');
    }
    else
    {
      target.setStyle('display', 'none');
      cleanup(target);
    }
  }
}

function hide_sub(parent)
{
  var id = 'sub_' + parent.id.substr(4);
  if ($(id))
  {
    $(id).setStyle('display', 'none');
    cleanup($(id));
  }
}

function fill_sub(parent, autoselect)
{
  var target_div = 'sub_' + parent.id.substr(parent.id.indexOf('_')+1);
  var selected_parent = parent.value;
  var selected_child = (autoselect == true && parent.selected_child)? parent.selected_child : 0;

  if ($(target_div))
  {
    $(target_div).setStyle('display', 'block');

    var target_select = $(target_div).getElement('select');
    target_select.set('html', '');

    // add "default" option
    target_select.grab(new Element('option', {'value':'','html':'Maak een keuze'}));
    if (parent.foobar[selected_parent].length > 0)
    {
      parent.foobar[selected_parent].each(function(child)
      {
        target_select.grab(new Element('option', {'value':child[0],'html':child[1],'selected':((selected_child == child[0])? true : false)}));
      });
    }
  }
}