
var icon = new GIcon();
setDefaultIcon('pin_red');
icon.iconSize = new GSize(24, 24);
icon.shadowSize = new GSize(22, 20);
icon.iconAnchor = new GPoint(6,16);
icon.infoWindowAnchor = new GPoint(20,0);

var theMap;
var newMarker;
var infowindowlistener = null;

function load_map(controls) {
    if (GBrowserIsCompatible()) {
        theMap = new GMap2(document.getElementById("map"));
        theMap.setCenter(new GLatLng(51.25,10), 5);
        if (controls)
        {
            theMap.addControl(new GLargeMapControl());
            theMap.addControl(new GMapTypeControl());
            theMap.addControl(new GOverviewMapControl());
        }
    }
}

function setDefaultIcon(image)
{
  icon.image = "/images/"+image+".png";
}

function addSmallMapControl()
{
  theMap.addControl(new GSmallMapControl());
}

function setMapCenter(lat, lng, z)
{
    theMap.setCenter(new GLatLng(lat, lng), z);
}

function setMapCenterSpan(lat, lng, slat, slng)
{
    slat /= 2;
    slng /= 2;
    var bounds = new GLatLngBounds(new GLatLng(lat - slat, lng - slng), new GLatLng(lat + slat, lng + slng));
    setMapCenter(lat, lng, theMap.getBoundsZoomLevel(bounds)+1);
}

function setMapType(type)
{
    types = theMap.getMapTypes();
    for (i=0; i<types.length; i++)
    {
        if (types[i].getUrlArg() == type)
        {
            theMap.setMapType(types[i]);
            break;
        }
    }
}

function showMarker(marker)
{
  theMap.addOverlay(marker);
}

function removeMarker(marker)
{
  if (marker) {
    theMap.removeOverlay(marker);
  }
}

function addMarker(point)
{
    marker = new GMarker(point, icon);
    showMarker(marker);
    return(marker)
}

function buildMarker(lat,lng,text,rawtext,id,direction)
{
    marker = addMarker(new GLatLng(lat, lng))
    marker.pin_id=id;
    marker.text=text;
    marker.rawtext=rawtext;
    marker.direction=direction;
    return(marker);
}

function openWinDOM(marker,content)
{
    box=document.createElement('div');
    box.id='infobox';
    box.appendChild(content.cloneNode(true));
    marker.openInfoWindow(box);
    currentMarker=marker;
}

function openWin(marker)
{
  content='no content';
  if (marker.text) content=marker.text;
  if (marker.direction) content+="<div id='dir_icon'><a href='#' onClick='get_directions_to("+marker.getPoint().lat()+", "+marker.getPoint().lng()+");return false;'><img src='/images/car_compact_blue.png' alt='Directions to here...')</a></div>";
  marker.openInfoWindowHtml(content);
  currentMarker=marker
}

function resizeWin()
{
  //causes the window to be recreated so it resizes to fit current content
  if (winIsOpen()) moveWin(currentMarker);
}

function moveWin(marker)
{
  //This only works if you use ONE top level element when you open the window
  box = $('infobox');
  if(box == null) {
    box=document.createElement('div');
    box.id='infobox';
    box.appendChild($('editbox').cloneNode(true));
  }
  marker.openInfoWindow(box);
  currentMarker=marker
}

function closeWin()
{
  theMap.closeInfoWindow();
}

function winIsOpen()
{
  return(theMap && !theMap.getInfoWindow().isHidden());
}

function getCurrentMarker()
{
  if (winIsOpen())
    return currentMarker;
  else
    return null;
}

function moveMarker(marker,point)
{
  marker.setPoint(point);
}

function get_directions_to(lat, lng)
{
        if (start = prompt("Enter a postal code or address to start at", 'start...'))
        {
                window.open('http://maps.google.com/?q='+start+' to '+lat+','+lng);
        }
}


function addCreatePinListener()
{

    GEvent.addListener(theMap, "click", function(marker, point) {

      if (marker){
        if (marker==currentMarker)
                           {
                               openWinDOM(currentMarker,$('createbox'));
                               infoWindowCloseListener(cancel)
                           }
      }else{
         if (winIsOpen()) {
           moveMarker(currentMarker,point);
           moveWin(currentMarker);
           infoWindowCloseListener(cancel)
         }else{
           currentMarker=addMarker(point);
           currentMarker.adding=true;
                             openWinDOM(currentMarker,$('createbox'));
                             infoWindowCloseListener(cancel)
         }
      }
                       });
}

function infoWindowCloseListener(fn)
{
  infowindowlistener = GEvent.addListener(theMap.getInfoWindow(), 'closeclick', function() {
    removeInfoWindowListener();
    fn();
  });
}

function removeInfoWindowListener()
{
  if (infowindowlistener != null) {
    GEvent.removeListener(infowindowlistener);
    infowindowlistener = null;
  }
}

function addMovePinListener()
{

    GEvent.addListener(theMap, "click", function(marker, point) {
      if (marker)
                           {
                               openWinDOM();
                               return;
                           }

         moveMarker(currentMarker,point);
                           moveWin(currentMarker);
                       });
}

function addToggleViewListener()
{
    GEvent.addListener(theMap, "click", function(marker, point) {
            if (!marker) return;
                if (getCurrentMarker()!=marker)
                {
                  openWin(marker);
                }
                else
                {
                    closeWin();
                }
    });
}






function load_index() {
    load_map(true);

    addCreatePinListener();
}
function load_show(lat,lng,zoom,type,noinfo,controls)
{
    load_map(controls);
    theMap.setCenter(new GLatLng(lat, lng), parseInt(zoom));

    setMapType(type);

    addToggleViewListener();
    addMarkers();//function defined on page
}

function fillmapinfo(type)
{
    var c = getCurrentMarker().getPoint();
    $(type+'_pin_lat').value = c.lat();
    $(type+'_pin_long').value = c.lng();
    $(type+'_pin_zoom').value = theMap.getZoom();
    $(type+'_pin_map_type').value = theMap.getCurrentMapType().getUrlArg();
    if ($(type+'_pin_desc')) getCurrentMarker().rawtext = $(type+'_pin_desc').value
    //if ($('rawdesc')) newMarker.text=$('rawdesc').value;

    return true;
}

function addPin()
{
  closeWin();
        $('preview_pin_desc').innerHTML = '';
  GEvent.clearListeners(theMap, "click");
  $('add_pin_message').show();
  addCreatePinListener();
}

function backToEdit()
{
  $('preview_pin_desc').innerHTML = currentMarker.rawtext.replace(/</g,'&lt;').replace(/>/g,'&gt;');
  openWinDOM(currentMarker,$('createbox'));
}

function finishedAdd(params)
{
  $('add_pin_message').hide();
  removeInfoWindowListener()
  GEvent.clearListeners(theMap, "click");
  addToggleViewListener();
  m=getCurrentMarker();
  m.pin_id=params;
  m.text=$('infoshow').innerHTML;
  openWin(m);
  m.latO=null;
  m.lngO=null;
  m.adding=null;
}

function finishedDelete(params)
{
  GEvent.clearListeners(theMap, "click");
  addToggleViewListener();
  removeMarker(getCurrentMarker());
  closeWin();
}

function cancel()
{
  $('add_pin_message').hide();
  removeInfoWindowListener()
  GEvent.clearListeners(theMap, "click");
  addToggleViewListener();
  m=currentMarker;
  if (m.latO && m.lngO) {
    moveMarker(m,new GLatLng(m.latO, m.lngO));
    m.latO=null;
    m.lngO=null
  }
  if (m.adding) {
    closeWin();
    removeMarker(m);
  } else {
      openWin(m);
  }
}

function deletePin()
{
  if (m=getCurrentMarker()) {
    if (m.pin_id==-1) {
      alert('You cannot delete your first pin');
    }else{
      if (m.adding) {
        //delete marker that hasn't been saved
        m.adding=null;
        finishedDelete();
      }else{
        $('delete_pin_id').value = m.pin_id;
        openWinDOM(m,$('deletebox'));
      }
    }
  }else{
    alert('Select a pin to delete first');
  }
}

function finishedEdit(direction)
{
  GEvent.clearListeners(theMap, "click");
  addToggleViewListener();
  m=getCurrentMarker();
  m.text=$('infoshow').innerHTML
  m.direction=direction;
  openWin(m);
}

function editPin()
{
  if (currentMarker.adding) {
    alert('You must save your new pin before editing it')
    return;
  }
  if (m=getCurrentMarker()) {
    $('pin_id').value = m.pin_id;
    $('edit_pin_desc').innerHTML = m.rawtext.replace(/</g,'&lt;').replace(/>/g,'&gt;');
    $('pin_directions_icon').checked=(m.direction==1);
    if (m.pin_id==-1) {
      $('dir').show();
    }else{
      $('dir').hide();
    }
    m.latO=m.getPoint().lat();
    m.lngO=m.getPoint().lng();
    GEvent.clearListeners(theMap, "click");
    addMovePinListener();
    openWinDOM(m,$('editbox'));
  }else{
    alert('Select a pin to edit first');
  }
}

