// Map global
var map;

// Creates a google map and adds the necessary controls
function initGMap(mapstate) {
  // Set up the map, map type and controls
  map = new GMap2(document.getElementById("map"));
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.addControl(new GScaleControl());
  map.addControl(new GOverviewMapControl());
  map.addMapType(G_PHYSICAL_MAP);
  ads = new GAdsManager(map,  
      "ca-pub-0003504581558958", 
      {channel: '6191432192', maxAdsOnMap: 5, minZoomLevel: 5}
  );
  ads.enable();

  if (mapstate) {
    maptype = maptypeStringToEnum(mapstate['type']);
    if (mapstate.center) {
      map.setCenter(new GLatLng(parseFloat(mapstate.center.lat), parseFloat(mapstate.center.lng)), parseInt(mapstate.zoom), maptype);
    } else {
      // Real bounds get set in loadData, but setMapType doesnt seem to work unless it is positioned
      map.setCenter(new GLatLng(44,-115), 8, maptype);
    }
  } else {
    map.setCenter(new GLatLng(44.4,-114.6), 7, G_PHYSICAL_MAP);
  }
}
  

// Converts string version of maptype to constant used by GMap interface
function maptypeStringToEnum(maptype) {
  if (maptype == 'Satellite') {
	return G_SATELLITE_MAP;
}
if (maptype == 'Map')  {
    return G_NORMAL_MAP;
  } 
  if (maptype == 'Hybrid')  {
    return G_HYBRID_MAP;
  }
  return G_PHYSICAL_MAP;
}

// Converts GMap maptype constant into string (serialize)
function maptypeEnumToString(maptype) {
  if (maptype == G_SATELLITE_MAP) {
	return "Satellite";
  }
if (maptype == G_NORMAL_MAP) {
    return "Map";
  }
  if (maptype == G_HYBRID_MAP) {
    return "Hybrid";
  }
  if (maptype == G_PHYSICAL_MAP) {
    return "Physical";
  }
  return '';
}


// Return the current state of the map view
function getMapstate() {
  var mapstate = {};
  mapstate['type'] = maptypeEnumToString(map.getCurrentMapType());
  mapstate['zoom'] = map.getZoom();
  var bounds = map.getBounds();
  mapstate['sw'] = {'lat':bounds.getSouthWest().lat(), 'lng':bounds.getSouthWest().lng()};
  mapstate['ne'] = {'lat':bounds.getNorthEast().lat(), 'lng':bounds.getNorthEast().lng()};
  mapstate['center'] = {'lat':map.getCenter().lat(), 'lng':map.getCenter().lng()};
  mapstate['detail'] = zoomDetail[map.getZoom()];
  return mapstate;
}



// Resize functions
// TODO some values are hardwired and should really be retrieved from the DOM so CSS can define all values

var resize = false;
var mousePos = null;
var maxwidth = 0;
document.onmouseup = mouseUp;
document.onmousemove = mouseMove;

function mapResize(ev) {
  ev = ev || window.event;
  mousePos = mouseCoords(ev);
  maxwidth = document.body.clientWidth - 300;
  if (maxwidth > 0) {
    resize = true;
    $('mapresize').setStyle({backgroundColor: '#8A8'});
  }
}

function mouseUp(ev){
  if (resize) {
    $('mapresize').setStyle({backgroundColor: '#fff'});
    resize = false;
    map.checkResize();
    mapPan();
  }
}

function mouseMove(ev){
  if (resize) {
    ev = ev || window.event;
    var newPos = mouseCoords(ev);

    var delta = newPos.x - mousePos.x;
    var newwidth = parseInt($('panel').style.width) - delta;
    newwidth = min(maxwidth, max(200, newwidth));
    $('panel').style.width = newwidth + "px";
    $('mapresize').style.right = newwidth + "px";
    $('main').style.right = (newwidth + 6) + "px";

    mousePos = newPos;
    return false;
  }
}

function mouseCoords(ev){
  if(ev.pageX || ev.pageY){
    return {x:ev.pageX, y:ev.pageY};
  }
  return {
    x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
    y:ev.clientY + document.body.scrollTop  - document.body.clientTop
  };
}

function userSaveLocation() {
  $('panellinks').update("<img src='/images/progress.gif'>");
  new Ajax.Request("/map/ajax_save_location", {
    asynchronous: true,
    parameters:flatten({mapstate:mapstate}),
    evalScripts: true
  });
}
