
/* Globals */
var g_Map1;
var g_Map2;
var g_MenuItem=0; // Home
var g_Origin;       // Single origin Marker
var g_Destination=null;  // Single destination marker
var g_Waypoints = [];
var g_Center2=null;
var g_Infowindow;
var fusionLayer;  // Fusion Table Layer (TODO: should be an array)
var kmlLayer;  // KML/GeoRSS layer (TODO: should be an array)
var g_CurYear=0;
var g_Timer=0;
var g_Graph=null;
var timeHeight=40;  // Height of Timeline (px) when displayed
/* SIMILE Timeline globals */
var tl=null;
var resizeTimerID = null;
var eventSource;

function addslashes (str) {
    // Escapes single quote, double quotes and backslash characters in a string with backslashes  
    // 
    // version: 1109.2015
    // discuss at: http://phpjs.org/functions/addslashes    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Ates Goral (http://magnetiq.com)
    // +   improved by: marrtins
    // +   improved by: Nate
    // +   improved by: Onno Marsman    // +   input by: Denny Wardhana
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Oskar Larsson Högfeldt (http://oskar-lh.name/)
    // *     example 1: addslashes("kevin's birthday");
    // *     returns 1: 'kevin\'s birthday'    
    return (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');
}

function helpTopic(spn) {
  window.open("http://en.wikipedia.org/wiki/"+spn.title,"_blank");
}
function hideTimeline() {
  if (document.getElementById("timeline").style.display=="none")
    document.getElementById("timeline").style.display="";
  else
    document.getElementById("timeline").style.display="none";
  rightPane(0);
}

function getLatestSource(offset,count){
  if(bAjaxBusy==true)
    return;
  resetTabs();
  document.getElementById("workarea").scrollTop=0;
  surl="getSource.php?list=1&count=60";
  doAjax(surl,"workarea",false,"");
}

function doSearchSources(offset) {
  var sexpr="";
  if(bAjaxBusy==true)
    return;
  resetTabs();
  // Get values from search-form
  if(document.getElementById("findsource")) {
    sexpr=getFormValues(document.getElementById("findsource"));
  }
  if (offset==-1) {
     // New search : Load Search-form
     var surl="formSource.php";
  }
  else {
    if(sexpr)
      var surl="getSource.php?"+sexpr+"&find=1&totnum=0";
    else
      var surl="getSource.php?find=1&offset="+offset;
  }
  doAjax(surl,"workarea",false,"");
}
function listSource(offset) {
  if(bAjaxBusy==true)
    return;
  resetTabs();
  var surl="getSource.php?list=2&offset="+offset;
  document.getElementById("workarea").scrollTop=0;
  doAjax(surl,"workarea",false,"");
}
function getSourceByID(sid) {
  if(bAjaxBusy==true)
    return;
  resetTabs();
  var surl="getSource.php?sid="+sid;
  document.getElementById("workarea").scrollTop=0;
  doAjax(surl,"workarea",false,"");
  return;
}
function getSourceByCity(oid,layer) {
  if(bAjaxBusy==true)
    return;
  resetTabs();
  if (layer)
    layer="s100";
  var surl="getSource.php?list=1&oid="+oid;
  document.getElementById("workarea").scrollTop=0;
  doAjax(surl,"workarea",false,"");
}
function getSourceByKeyword(kid,target){
  if(bAjaxBusy==true)
    return;
  resetTabs();
  var surl="getSource.php?list=1&kid="+kid;
  document.getElementById("workarea").scrollTop=0;
  doAjax(surl,"workarea",false,"");
}
function getSourceByPerson(pid){
  if(bAjaxBusy==true)
    return;
  resetTabs();
  var surl="getSource.php?list=1&pid="+pid;
  document.getElementById("workarea").scrollTop=0;
  doAjax(surl,"workarea",false,"");
}
function getAuthorByID(aid){
  if(bAjaxBusy==true)
    return;
  resetTabs();
  var surl="getSource.php?list=1&aid="+aid;
  document.getElementById("workarea").scrollTop=0;
	doAjax(surl, "workarea", false,"");
  return;
}

/*** DATE/TIME CONTROL ***/
function changeTime(dir) {
  // TODO: Possibly have Julian day number in input type="hidden",return XML or JSON
  if(bAjaxBusy==true)
    return;
  var datestr = document.getElementById("nowdate").value;
  var surl="changeTime.php?dir="+dir+"&datestr="+datestr;
  doAjax(surl,"nowdate",false,"");
}

/********************************************/
function syncCalender(year,month,day){
  var datestr="";
  var oCal=document.getElementById("medcal");
  oCal.style.display=(oCal.style.display=="block")?"block":"block";
  if(year>0){
    datestr="0"+year;
    if (month > 0) {
      if (month <10)
        datestr=datestr+"-0"+month;
      else if (month > 9)
        datestr=datestr+"-"+month;
      
      if (day >0 && day < 10)
        datestr=datestr+"-0"+day;
      else if (day > 9)
        datestr=datestr+"-"+day;
      else  
        datestr=datestr+"-01";
    }
    else {
      datestr="0"+year+"-01-01";
      month=1;
    }
    // setTimeline(datestr);
    HandleMonth(year,month,day);
    
  }
}
function setCalYear(month) {
  var iYear=parseInt(document.getElementById("setyear").value);
  HandleMonth(iYear,month);
}
function showCalender() {
  var oCal=document.getElementById("medcal");
  oCal.style.display=(oCal.style.display=="block")?"none":"block";
}
function getLatestComment(offset,count,type) {
  document.getElementById("content").scrollTop=0;
  document.getElementById("map_canvas2").style.display="none";
  document.getElementById("map_layers").style.display="none";
  document.getElementById("book_canvas").style.display="none";
  surl="getLatestComment.php?offset="+offset+"&count="+count+"&type="+type;
  doAjax(surl,"workarea",false,"");
}
function onResize() {
  if (tl) {
    if (resizeTimerID == null) {
      resizeTimerID = window.setTimeout(function() {
      resizeTimerID = null;
      tl.layout();
      }, 500);
    }
  }
  if (document.getElementById("book_canvas").style.display=="block") {
    // workarea height may have changed.
    var cheight=document.getElementById("content").clientHeight-document.getElementById("workarea").clientHeight;
    document.getElementById("book_canvas").style.height=cheight-30+"px";
  }
}
function rightPane(delta) {
  // Change width of right pane
  if (delta==undefined)
    delta=0;
  else {
    var oWidth;
    var oAppMenu=document.getElementById("appmenu");
    var oResult=document.getElementById("result");
    var oContent=document.getElementById("content");
    document.getElementById("content").scrollTop=0;
    var cr=oResult.clientWidth;     
    if (delta > 100)
      oWidth=delta; // Custom width
    else {
      if (cr==40)
        oWidth=400;
      else {
        if (delta > 0) {
          // Increase
          oWidth= cr+delta;
        }
        else if (delta < 0) {
          // Decrease
          oWidth=(cr==400) ? 40 : cr+delta;
        }
        else {
          oWidth=cr;
        }
      }
    }
    
    if (oWidth == 40) {
      document.getElementById("content_menu").style.display="none";
      document.getElementById("content").style.display="none";
     }
     else {
      document.getElementById("content_menu").style.display="block";
      document.getElementById("content").style.display="block";
     }
    oAppMenu.style.width  = oWidth+"px";
    oResult.style.width   = oWidth+"px";
    oContent.style.width  = oWidth-40+"px"; // 30px
    var mapwidth=document.body.clientWidth-oWidth;
    var mapheight=document.body.clientHeight;
    if (document.getElementById("timeline").style.display=="none") {
      document.getElementById("map_canvas").style.top="0px";
    }
    else {
      mapheight-=timeHeight;
      document.getElementById("timeline").style.width=mapwidth-3+"px";
      document.getElementById("map_canvas").style.top=timeHeight+"px";
      if (g_Graph) {
        g_Graph.updateOptions({
          width: mapwidth
        });
      }
    }
    document.getElementById("map_canvas").style.width=mapwidth-3+"px";
    document.getElementById("map_canvas").style.height=mapheight+"px";
  }
  
  if (g_Map1)
    google.maps.event.trigger(g_Map1,'resize');
  
  if (g_MenuItem==3 && g_Map2)
    google.maps.event.trigger(g_Map2,'resize');
    
  onResize(); // Google Books issue
}
function setOpacity(idx,opacity){
  // Doesn't work
  var e=g_Map1.overlayMapTypes.getAt(idx);
  e.opacity=0.1;
  g_Map1.overlayMapTypes.setAt(idx, e);
}
function bgLayer() {
  if (!google)
    return;
  var e=g_Map1.overlayMapTypes.getAt(1);
  return(e.name);
}
function divLayer() {
  if (!google)
    return;
  var e=g_Map1.overlayMapTypes.getAt(2);
  if (e.name.charAt(0)=="d")
    return(e.name);
  else
    return("");
}
function activeLayer() {
  if (!google)
    return;
  var num=g_Map1.overlayMapTypes.getLength();
  var e=g_Map1.overlayMapTypes.getAt(num-1);
  return(e.name);
}
function checkLayer(layer) {
  var idx=0;
  g_Map1.overlayMapTypes.forEach(function(e, j) {
    if (e.name==layer)
      idx=j;
  });
  return(idx);
}
function removeOverlay(i) {
  // .clear() Removes all elements from the array.
  deleteDestination(0);
  deleteWaypoints(0);
  g_Map1.overlayMapTypes.removeAt(i); // pop() remove last
  listLayers();
}

function moveOverlay(index) {
  deleteDestination(0);
  deleteWaypoints(0);
  var e=g_Map1.overlayMapTypes.removeAt(index);
  g_Map1.overlayMapTypes.push(e);
  listLayers();
}
function getSymbol(id) {
  switch(id) {
  default:
    return("bullet_white2");
  case 1:
    return("bullet_red");
  case 2:
    return("bullet_darkblue");
  case 3:
    return("bullet_purple");
  case 4:
    return("bullet_orange");
  case 5:
    return("bullet_black");
  case 6:
    return("bullet_green");
  case 7:
    return("bullet_yellow");
  case 8:
    return("bullet_pink");
  case 9:
    return("bullet_blue");
  case 10:
    return("status_online");
  case 11:
    return("status_offline");
  case 12:
    return("target");
  case 13:
    return("target-green");
  case 14:
    return("target-blue");
  case 15:
    return("target-purple");
  case 16:
    return("target-black");
  case 17:
    return("ui-check-box-uncheck");
  case 18:
    return("ui-radio-button-uncheck");
  case 19:
    return("coin");
  case 20:
    return("Paris_m_1");
  case 21:
    return("Paris_m_2");
  case 22:
    return("Paris_m_3");
  case 23:
    return("Paris_m_4");
  case 24:
    return("Paris_m_5");
  case 25:
    return("Paris_m_6");
  case 26:
    return("Paris_m_7");
  case 27:
    return("Paris_m_8");
  case 28:
    return("Paris_m_9");
  case 29:
    return("Paris_m_10");
  case 30:
    return("Paris_rer_A");
  case 31:
    return("Paris_rer_B");
  case 32:
    return("Paris_rer_C");
  case 33:
    return("Paris_rer_D");
  case 34:
    return("Paris_rer_E");
  case 35:
    return("information");
  case 36:
    return("question");
  case 37:
    return("milestone");
  case 38:
    return("page");
  case 39:
    return("page_green");
  case 40:
    return("page_red");
  case 41:
    return("page_white");
  case 42:
    return("page_white_text");
  case 43:
    return("book");
  case 44:
    return("book_sepia");
  case 45:
    return("place_of_worship");
  case 46:
    return("place_of_worship2");
  case 47:
    return("christian");
  case 48:
    return("view_point");
  case 49:
    return("museum");
  case 50:
    return("archaeological");
  case 51:
    return("theatre");
  }
}
function listLayers() {
  // List layers
  if (!google)
    return;
  var num=g_Map1.overlayMapTypes.getLength();
  var e=g_Map1.overlayMapTypes.getAt(num-1);
  if (!e)
    return;
  document.getElementById("activeLayer").innerHTML=e.alt;
  var sText="<h3>Layers currently on the map</h3><p style='padding:0.5em;background:white;border:1px dotted #666'>";
  g_Map1.overlayMapTypes.forEach(function(e, j) {
    if (e.name=="inactive" || e.name == "hillshade" || e.name == "color-relief" || e.name=="soil" 
      || e.name=="climate" || e.name.charAt(0)=="d") {
      sText+="<img src='pics/map.png'> "+e.alt;
      if (parseInt(e.name.substring(4)) > 100)
        sText+=" <a href=\"javascript:removeOverlay("+j+")\" title=\"Remove this layer\">remove</a>";
    }
    else {
      // !!! string.substring(from, to)
      var symbol=parseInt(e.name.substring(2,4));
      var sImg=getSymbol(symbol);
      var sImage="<img src='pics/"+sImg+".png'>";
      sText+=sImage+" "+e.alt;
      if (e.name != "b0185270")
        sText+=" <a href=\"javascript:removeOverlay("+j+")\" title=\"Remove this layer\">remove</a>";
      if (j<num-1 && e.name.charAt(0)!="d" && e.name.charAt(0)!="w")
        sText+=' | <a href="javascript:moveOverlay('+j+')" title="Move this layer to top">move</a>';
    }
    // if (e.name.charAt(0)=="i" || e.name.charAt(0)=="t")
    // This will just work temporarilly
    // if (e.name=="t00031")
    //  sText+=" <a href='javascript:autoFrame("+j+",768,814)' title='Animate this layer'><img src='film.png'></a>";
    sText+="<br>";
  });
  sText=sText+"</p><p>Note: Only the topmost <em>point layer</em> is interactive, however, the internal order of point layers can be changed using the <u>move</u> option, meaning, any point layer can become interactive.";
  sText=sText+"</p>";
    
    // List fusion table-layer
    if (fusionLayer) {
      sText=sText+"<p>Fusion Table-Layer:<br>";
      sText+=" <a href='javascript:removeFusionLayer()' title='Remove this layer'>remove layer</a><br>";
      sText+="</p>";
    }
       
    // List kml-layers. Note: Metadata can only be retrieved when
    // the layer has loaded. There is no event to detect that.
    if (kmlLayer) {
      sText=sText+"<p>KML-Layer:<br>";
      var kmlMetaData=kmlLayer.getMetadata();
      sText+=kmlMetaData.name+" <a href='javascript:removeKmlLayer()' title='Remove this layer'>remove layer</a><br>";
      sText+="</p>";
    }
    document.getElementById("map_layers").innerHTML=sText;
}

function computeDistances(option2,option3) {
  var sText="<h3>Distances on active layer</h3>";
  if (option2==1) {
    var distlabel="km";
    var conv=1.000000000;
  }
  else if (option2==2) {
    var distlabel="mi";
    var conv=0.621371192;
  }
  else if (option2==3) {
    var distlabel="milia";
    var conv=0.675765169;
  }
  else if (option2==4) {
    var distlabel="leuga";
    var conv=0.449943757;
  }
  if (g_Origin && g_Destination) {
    var distance = google.maps.geometry.spherical.computeDistanceBetween(g_Origin.getPosition(), g_Destination.getPosition());
    var dist=distance/1000;
    var days=dist/option3;
    var dist=conv*dist;
    sText+="<p style='background:white;border:1px dotted #606060;padding:0.5em;'>";
    sText+="The distance between "+g_Origin.getTitle()+" and "+g_Destination.getTitle()+" is "+Math.round(dist)+" "+distlabel+" or "+Math.round(days)+" days à "+option3+" km.</p>";
  }
  if (g_Origin && g_Waypoints.length) {
    var totdist=0;
    var totdays=0;
    g_Origin.getTitle()
    sText+="<table><tr><td colspan='4'>Distance ("+distlabel+") along the path from <span class='white'>"+g_Origin.getTitle()+"</span> (origin)</td></tr>";
    sText+="<tr><td>Destination</td><td>Distance</td><td>Total distance</td><td>Days à "+option3+" km</td><td>Total days</td></tr>";
    for (var i in g_Waypoints) {
      if (i==0)
        var distance = google.maps.geometry.spherical.computeDistanceBetween(g_Origin.getPosition(),g_Waypoints[i].getPosition())/1000;
      else
        var distance = google.maps.geometry.spherical.computeDistanceBetween(g_Waypoints[i-1].getPosition(),g_Waypoints[i].getPosition())/1000;
      
      var days=distance/option3;
      distance=conv*distance;
      totdist+=distance;
      totdays+=days;
      sText+="<tr><td>"+g_Waypoints[i].getTitle()+"</td><td>"+Math.round(distance)+"</td><td>"+Math.round(totdist)+"</td><td>"+Math.round(days)+"</td><td>"+Math.round(totdays)+"</td></tr>";  
    }
  }
  sText+="</table><p>";
  if (g_Origin) {
    var oTitle=g_Origin.getTitle();
    var oLatLng=g_Origin.getPosition();
    sText+="<a href='javascript:renderDistance(\""+oTitle+"\","+option3+","+oLatLng.lng()+","+oLatLng.lat()+")'>Render distances from origin ("+oTitle+")</a>";
    // TODO: link: show on active layer all places | visible places with distances    
  }
  if (g_Destination) {
    var dTitle=g_Destination.getTitle();
    var dLatLng=g_Destination.getPosition();
    sText+="<br><a href='javascript:renderDistance(\""+dTitle+"\","+option3+","+dLatLng.lng()+","+dLatLng.lat()+")'>Render distances from destination ("+dTitle+")</a>";    
  }
  sText+="</p>";
  document.getElementById("map_layers").innerHTML=sText;
}
function showDistance(checked1) {
  // Load/Reload distance calculations and form 
  if(bAjaxBusy==true)
    return;
  g_MenuItem=9;
  // read option 2 and 3 from distance form, if visible
  var frm=document.getElementById("distance_frm");
  if (frm) {
    var len = frm.option2.length;
    for (i = 0; i <len; i++) {
      if (frm.option2[i].checked) {
        var checked2 = frm.option2[i].value
      }
    }
    var len = frm.option3.length;
    for (i = 0; i <len; i++) {
      if (frm.option3[i].checked) {
        var checked3 = frm.option3[i].value
      }
    }
  }
  else {
    // Set default values (or values from cockie)
    var checked2=1;
    var checked3=30;
  }
  // Erase form
  document.getElementById("workarea").innerHTML="";
  document.getElementById("map_layers").innerHTML="";
  document.getElementById("content").scrollTop=0;
  document.getElementById("map_canvas2").style.display="none";
  document.getElementById("map_layers").style.display="block";
  document.getElementById("book_canvas").style.display="none";
  
  //var layer=activeLayer();
  var surl="showDistance.php";
  surl+="?option1="+checked1;
  surl+="&option2="+checked2;
  surl+="&option3="+checked3;
  computeDistances(checked2,checked3);
  // Load/Reload form
  doAjax(surl, "workarea", false,"");
}
function fMouseMove1(location) {
  document.getElementById("status").innerHTML="Mouse at "+location.toUrlValue(5);
} 

function onMarker2(id,title,location){
  // Handles ALL clicks on markers on map 1 
  document.getElementById("status").innerHTML="Mouse click "+location.toUrlValue(5)+", zoom-level "+g_Map2.getZoom();
  setDestination(location.lat(),location.lng(),id,title);
}

function onMouse2(location) {
  // Handles ALL mouse clicks on map 2
  document.getElementById("status").innerHTML="Mouse click "+location.toUrlValue(5)+", zoom-level "+g_Map2.getZoom();
  var sMouse=location.toUrlValue();
  var layer=activeLayer();
  var zoomLevel = g_Map2.getZoom();
  var bounds=g_Map2.getBounds();
  var sViewport=bounds.toUrlValue();
  var surl="getSearch.php?mouse="+sMouse+"&maxcount=1&viewport="+sViewport+"&zoom="+zoomLevel+"&layer="+layer+"&xml=1";
  
  // Get closest place to mouse-click
    downloadUrl(surl, function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var name = markers[i].getAttribute("name");
      var id = markers[i].getAttribute("id");
      var cc = markers[i].getAttribute("cc");
      var point = new google.maps.LatLng(
        parseFloat(markers[i].getAttribute("lat")),
        parseFloat(markers[i].getAttribute("lng")));
    }
    if (id) {  
        // Set destination on map 1
        setDestination(point.lat(),point.lng(),id,name);
        // Center marker on map2 and load place info
        setCenter2(point,id,name);
        var surl="showMaps.php?layer="+layer+"&oid="+id;
        doAjax(surl, "workarea", false,"");
    }  
  });
}
function onMouse1(location){
  // Handles ALL mouse clicks on map 1 
    var sMouse=location.toUrlValue();
    if (g_MenuItem==13)
      var layer="d0002";  // Pagus
    else
      var layer=activeLayer();
    var zoomLevel = g_Map1.getZoom();
    // var bounds=g_Map1.getBounds();
    // var sViewport=bounds.toUrlValue();
    // request 1 closest marker only
    var surl="getSearch.php?mouse="+sMouse+"&maxcount=1&zoom="+zoomLevel+"&layer="+layer+"&xml=1";
    // DEBUG: document.getElementById("status").innerHTML=surl;
    // Get closest place to mouse-click
    downloadUrl(surl, function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var name = markers[i].getAttribute("name");
      var id = markers[i].getAttribute("id");
      var cc = markers[i].getAttribute("cc");
      var point = new google.maps.LatLng(
        parseFloat(markers[i].getAttribute("lat")),
        parseFloat(markers[i].getAttribute("lng")));
    }
    
    if (id) {
      document.getElementById("status").innerHTML="Mouse click "+location.toUrlValue(5)+", zoom-level "+g_Map1.getZoom();
      if (g_MenuItem==3) { 
        // Maps tab
        setDestination(point.lat(),point.lng(),id,name);
        setMap3(id,name,point);
      }
      else if (g_MenuItem==9) { 
        // Distance tab
        setDistance(id,name,point);
      }
      else if (g_MenuItem==13) {
        // Territory tab
        setDestination(point.lat(),point.lng(),id,name);
        document.getElementById("status").innerHTML="Pagus "+name;
        // getEvidence(layer,id,0,0,0);
      }
      else if (layer.charAt(0)=="s") { // source layer
        setDestination(point.lat(),point.lng(),id,name);
        getSourceByCity(id);
      }
      else if (layer.charAt(0)=="e") { // source layer
        setDestination(point.lat(),point.lng(),id,name);
        getExternal(layer,id);
      }
      else {
        setDestination(point.lat(),point.lng(),id,name);
        getEvidence(layer,id,0,0,0);
      }
    }
    else
      document.getElementById("status").innerHTML="No place clicked";
  });
}

function onMarker1(id,title,location){
  // Handles ALL clicks on Markers on map 1 
    document.getElementById("status").innerHTML="Mouse click "+location.toUrlValue(5)+", zoom-level "+g_Map1.getZoom();
    var layer=activeLayer();
    if (g_MenuItem==3) { // Maps tab
        setMap3(id,title,location);
    }
    else if (g_MenuItem==9) { // Distance tab
      ; // setDistance(id,name,location);
    }
    else if (layer.charAt(0)=="s") { // source layer
      getSourceByCity(id);
    }
    else if (layer.charAt(0)=="e") { // external data not in ort,ortidx
      getExternal(layer,id);
    }
    else {
      getEvidence(layer,id,0,0,0);
    }
}

function resetTabs() {
  document.getElementById("workarea").innerHTML="";
  document.getElementById("content").scrollTop=0;
  document.getElementById("map_canvas2").style.display="none";
  document.getElementById("map_layers").style.display="none";
  document.getElementById("book_canvas").style.display="none";
}

function quickSearch(layer) {
  var sOrigin="";
  var zoomLevel = g_Map1.getZoom();
  var bounds=g_Map1.getBounds();
  var sViewport=bounds.toUrlValue();
  if (g_Origin) {
    var oLatLng=g_Origin.getPosition();
    var sOrigin=oLatLng.toUrlValue();
  }
  if (layer=="active") {
    g_MenuItem=5; // Places tab: list places in current layer
    var layer=activeLayer();
    var surl="getSearch.php?viewport="+sViewport+"&origin="+sOrigin+"&zoom="+zoomLevel+"&layer="+layer;
  }
  else if (layer=="g0000") {
    g_MenuItem=13;  // territories tab: list pagus in current layer
    var surl="getSearch.php?viewport="+sViewport+"&origin="+sOrigin+"&zoom="+zoomLevel+"&layer="+layer;
  }
  else if (layer==null && document.getElementById("qsearch").value) {
    // Find any place in sources/literature
    var layer=activeLayer();
    var ss=urlencode(document.getElementById("qsearch").value);
    // Direct search, no viewport
    var surl="getSearch.php?formLayer="+layer+"&ss="+ss+"&match=2&fViewport=0"+"&zoom="+zoomLevel;
    if (sOrigin)
      surl+="&origin="+sOrigin;
  }
  else {
    document.getElementById("status").innerHTML="<img src='pics/exclamation.png'> <span class='warning'>Search expression empty</span>";
    return;
  }
  resetTabs();
  document.getElementById("status").innerHTML="";
  doAjax(surl, "workarea", false,"");
  return;
}

function doSearch(offset,order) {
  if (offset < 0) {
    g_MenuItem=4;
    // LOAD SEARCH FORM with active layer
    var layer=activeLayer();
    surl="showSearch.php?formLayer="+layer;
    document.getElementById("status").innerHTML="";
  }
  else {
    // Do SEARCH
    var sexpr="";
    var zoomLevel = g_Map1.getZoom();
    // Get viewport
    var bounds=g_Map1.getBounds();
    var sViewport=bounds.toUrlValue();
    var origin="";
    if (g_Origin) {
      var oLatLng=g_Origin.getPosition();
      var origin=oLatLng.toUrlValue();
    }
    // Get values from search form
    var ofrm = document.getElementById("searchform");
    if (ofrm) {  
      if (ofrm.ss.value.length==0) {
        document.getElementById("status").innerHTML="<span class='warning'>Search expression empty. No search was conducted.</span>";
        return;
      }
      sexpr=getFormValues(ofrm);
      var surl="getSearch.php";
      if(sexpr)
        surl+="?"+sexpr;
    }
    else{
      // Get values from cookies later,except order
      var surl="getSearch.php";
      if(order)
        surl+="?order="+order;
    }
    // both
    surl+="&zoom="+zoomLevel;
    surl+="&viewport="+sViewport;
    if (origin)
      surl+="&origin="+origin;
    document.getElementById("status").innerHTML="";
  }
  resetTabs();
  doAjax(surl, "workarea", false,"");
} // doSearch()

function toggleMenu(item,arg1) {
  // visibility:hidden | visible;
  // display:"none" | "block" | "inline"
  if(bAjaxBusy==true)
    return;
    
  var surl="";
  resetTabs();
  
  switch(item) {
  default:
  case 0: // Home
    g_MenuItem=item;
    surl="showHome.php";
    break;
  case 1: // Legend
    g_MenuItem=item;
    var layer=activeLayer();
    var bglayer=bgLayer();
    var divlayer=divLayer();
    surl="showLegend.php?bglayer="+bglayer+"&divlayer="+divlayer+"&layer="+layer;
    break;
  /*
  case 9: // Distance: implemented as showDistance()
    break;
  */
  case 11:  // Date and time dialog
    g_MenuItem=item;
    var layer=activeLayer();
    var datestr = document.getElementById("nowdate").value;
    surl="showTime.php?layer="+layer+"&datestr="+datestr;
    break;
  case 12:
    g_MenuItem=item;
    if (!arg1)
      arg1=activeLayer();
    surl="showLayerSettings.php?layer="+arg1;
    break;
  
  case 2: // Layers
    g_MenuItem=item;
    document.getElementById("map_layers").style.display="block";
    listLayers();
    if (arg1==1)
      ;
    else
      surl="showLayers.php";
    break;
  case 20: // KML-Layer
    g_MenuItem=item;
    document.getElementById("map_layers").style.display="block";
    listLayers();
    surl="showKML-Layer.php";
    break;
  case 3: // Maps
    g_MenuItem=item;
    document.getElementById("map_canvas2").style.display="block";
    // Insert topmost layer on map2
    // If there already is an overlay, remove it
    var num=g_Map2.overlayMapTypes.getLength();
    if (num > 0)
      g_Map2.overlayMapTypes.removeAt(0);
    var layer=activeLayer();
    insertOverlay2(layer,"",0);
    google.maps.event.trigger(g_Map2,'resize');
    surl="showMaps.php";
    if (layer !="")
      surl+="?layer="+layer;
    if (arg1 > 0) {
      surl+="&oid="+arg1;
    }
      
    break;
  case 4: // SHOW SEARCH FORM, moved to doSearch
  case 5: // List places, moved to quickSearch
  case 13: // List territories, moved to quickSearch
    break;  
  case 6: // Sources
    g_MenuItem=item;
    surl="showSources.php";
    break;
  case 7: // Timeline and animation settings
    if (item)
      g_MenuItem=item;
    var layer=activeLayer();
    surl="formTimeline.php?layer="+layer;
    break;
  case 8: // Timeline and animation settings
    if (item)
      g_MenuItem=item;
    alert("Not implemented at this point");
    return;
    surl="formExternal.php";
    break;
  } // end switch
  if (surl)
	 doAjax(surl, "workarea", false,"");
  return;
}
/**
 * Generate a sequence of QRST that match the tile requested by the parameters. 
 * The parameters are in the google maps tile numbering style, 
 * that differs from the geogarage tile numbering.
 */   
function genQrst(x, y, zoom) {
	var inc = 1 << zoom-1;
	var qrstString = "t";
	for (var i = zoom; i > 0; i--) {
		if ((x & inc) && (y & inc)) {
			qrstString += "s";
		} else if  ((x & inc) && ! (y & inc)) {
			qrstString += "r";
		} else if  (!(x & inc) && ! (y & inc)) {
			qrstString += "q";
		} else if  (!(x & inc) && (y & inc)) {
			qrstString += "t";
		}
		inc = inc >> 1;
	}
	return qrstString;
}

/**
 * Generate a path where a file corresponding to the string should located, 
 *  in GeoGarage quadtree storage structure. 
 */
function genPathFromQrst(qrstString) {
	var directoryElem = new Array();
	var strLength = qrstString.length;
	for (var i = 0; (i + 1) * 6 <= strLength; i++) {
		directoryElem.push(qrstString.substr(i * 6, 6));
	}
	var result = "";
	for (var i = 0; i < directoryElem.length; i++) {
		result += directoryElem[i] + "/";
	}
	return result + qrstString + ".png";
}

function getRandomInt (min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function getRandomChar(min,max) {
  var num=Math.floor(Math.random() * (max - min + 1)) + min;
  return(String.fromCharCode(num));
}

function getTEI(oid,sid,uri){
  if(bAjaxBusy==true)
    return;
  var surl="getTEI.php?oid="+oid+"&sid="+sid+"&uri="+uri;
	doAjax(surl, "workarea", false,"");
  return;
}

function getDoc(qid,tb,xid){
  if(bAjaxBusy==true)
    return;
  tb=(tb)?tb:0;
  xid=(xid)?xid:0;
  document.getElementById("content").scrollTop=0;
  surl="preview_xmltext.php?qid="+qid+"&tb="+tb+"&xid="+xid;
  doAjax(surl,"workarea",false,"");
}

function getTEI_ELEC(did,urknr,oid){
  if(bAjaxBusy==true)
    return;
  // if(numSplit>2)
  //  onWidth(2);
  document.getElementById("content").scrollTop=0;
  var surl="getTEI_ELEC.php?did="+did;
  if (urknr)
    surl+="&urknr="+urknr;
  if (oid)
    surl+="&oid="+oid;
	doAjax(surl, "workarea", false,"");
  return;
}
function embedGBS1(url,digid,pagnr,oid,urknr) {
  surl="http://"+url+"&output=embed";
  document.getElementById("content").scrollTop=0;
  // document.getElementById("status").innerHTML="Book-Viewer loading...";
  rightPane(600);
  document.getElementById("book_canvas").src=surl;  // Loading Google Books...
  document.getElementById("book_canvas").style.display="block";
  
  var wurl="embedGBS2.php?digid="+digid+"&pagnr="+pagnr;
  if (oid)
    wurl+="&oid="+oid;
  if (urknr)
    wurl+="&urknr="+urknr;  
  doAjax(wurl,"workarea",false,"");
}

function embedGBS2(digid,pagnr,oid,urknr){
  if(bAjaxBusy==true)
    return;
  // if(numSplit>2)
  //  onWidth(2);
  document.getElementById("content").scrollTop=0;
  var surl="embedGBS2.php?digid="+digid+"&pagnr="+pagnr;
  if (oid)
    surl+="&oid="+oid;
  if (urknr)
    surl+="&urknr="+urknr;  
  doAjax(surl,"workarea",false,"");
}

function embedTEI(digid,oid,urknr) {
  if(bAjaxBusy==true)
    return;
  // if(numSplit>2)
  //  onWidth(2);
  if (urknr=="")
    return;
  document.getElementById("content").scrollTop=0;
  var surl="embedTEI.php?digid="+digid+"&urknr="+urknr;
  if (oid)
    surl+="&oid="+oid;  
  doAjax(surl,"workarea",false,"");
}

function setMap2(oid,lat,lng,mapid) {
  // called from place evidence (lat,lng available) 
  // map 2 not visible
  // if mapid="" then same map last time (no change)
  /*
  resetTabs();
  g_MenuItem=3;
  if (oid==0) {
    oid=4156;
    var location= new google.maps.LatLng(48.8566667, 2.3509871); // Paris
  }
  else
  */
    var location = new google.maps.LatLng(lat,lng);
  if (mapid) {
    if (mapid=="satellite") {
     var currentzoom=g_Map2.getZoom();
     if (currentzoom < 16)
      g_Map2.setZoom(16);
      g_Map2.setMapTypeId(google.maps.MapTypeId.SATELLITE);
    }
    else
     g_Map2.setMapTypeId(mapid);
  }
  document.getElementById("map_canvas2").style.display="block";
  setCenter2(location,oid,""); // No title avilable
  g_Map2.setCenter(location); // Center map 2
  
  toggleMenu(3,oid);
}

function setMap3(oid,title,location) {
  // This is called from click on map 1 or marker 1
  // when map 2 is visible
  // set marker on map2, no title is available 
  setCenter2(location,oid,title);
  g_Map2.setCenter(location);
  var layer=activeLayer();
  var surl="showMaps.php?layer="+layer+"&oid="+oid;
  doAjax(surl, "workarea", false,"");
}

function getExternal(layer,oid) {
  if(bAjaxBusy==true)
      return;
  if (!layer)
    layer=activeLayer();
  resetTabs();
  
  // Open Search results pane
  g_MenuItem=5;
  document.getElementById("content").scrollTop=0;
  document.getElementById("map_layers").style.display="none";
  document.getElementById("book_canvas").style.display="none";
  document.getElementById("map_canvas2").style.display="none";
  document.getElementById("workarea").innerHTML="";

  var surl="getExternal.php?layer="+layer+"&oid="+oid;
  doAjax(surl, "workarea", false,"");
}

function getEvidence(layer,oid,year,offset,totnum) {
  // Get evidence in place for active layer
  if(bAjaxBusy==true)
      return;
  if (!year)
    year=0;
  if (!layer)
    layer=activeLayer();
  resetTabs();
  // Open Search results pane
  g_MenuItem=5;
  document.getElementById("content").scrollTop=0;
  document.getElementById("map_layers").style.display="none";
  document.getElementById("book_canvas").style.display="none";
  document.getElementById("map_canvas2").style.display="none";
  document.getElementById("workarea").innerHTML="";

  var surl="getEvidence.php?layer="+layer+"&oid="+oid+"&year="+year;
  
  if (offset > 0)
    surl=surl+"&offset="+offset;
  if (totnum > 0)
    surl=surl+"&totnum="+totnum;
  doAjax(surl, "workarea", false,"");
}

function autoFrame(idx,min,max) {
  // Start/Stop Animation
  if (g_Timer) {
    g_Timer=window.clearInterval(g_Timer);
    g_CurYear=0;
    document.getElementById("status").innerHTML="<strong>Animation stopped</strong>";
    var e=g_Map1.overlayMapTypes.removeAt(idx);
    insertOverlay1(e.name,e.alt,0);  // Restore layer
  }
  else {
    document.getElementById("status").innerHTML="<strong>Animation will start in 5 seconds</strong>";
    //1 deleteMarkers();
    var framerate=5000;
    g_CurYear=min-1;
    if (tl) {
      if (document.getElementById("timeline").style.display=="none") {
        // Show timeline if hidden
        document.getElementById("timeline").style.display=""; 
        rightPane(0); // Adjust map
      }
    }
    g_Timer=window.setInterval("insertAnim("+idx+","+max+")",framerate);
  }
}

function insertAnim(idx,max) {
  g_CurYear++;
  if (g_CurYear > max) {
    autoFrame(idx,0,0);
    return;
  }
  var e=g_Map1.overlayMapTypes.removeAt(idx);
  // var e=g_Map1.overlayMapTypes.pop();
  // document.getElementById("status").innerHTML="<strong>"+e.alt+": "+g_CurYear+"</strong>";
  // showTimeline(); // Update Timeline
  document.getElementById("status").innerHTML="Animation: "+g_CurYear;
  // setTimeline("0"+g_CurYear+"-01-01");
  var overlayFrancia = new google.maps.ImageMapType({
    opacity: 1.0,
    getTileUrl: function(coord, zoom) {
    return "tile.php?zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y+"&layer="+e.name+"&year="+g_CurYear;
    },
    name: e.name,
    alt: e.alt,
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  // g_Map1.overlayMapTypes.push(overlayFrancia);
  g_Map1.overlayMapTypes.insertAt(idx, overlayFrancia);
}
function insertInactive(idx,title) {
  var e=g_Map1.overlayMapTypes.getAt(idx);
  
  if (e && e.name=="inactive") {
    document.getElementById("status").innerHTML="<span class='warning'>Layer "+title+" is already inactive</span>";
    return;
  }
  removeOverlay(idx);
  var overlaySRTM = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
       return "";
    },
    minZoom: 3,
    name: "inactive",
    alt: title,
    opacity: 1.0,
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  g_Map1.overlayMapTypes.insertAt(idx, overlaySRTM);
  listLayers();
}

function insertBaselayer() {
  var overlayBase = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      var ymax = 1 << zoom;
		  var y = ymax - coord.y -1;
		  if (zoom > 10)
        return "pics/empty256.png";
      else if (zoom > 5)
        return "http://static.ahlfeldt.se/srtm/base/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
      else
       return "http://static.ahlfeldt.se/srtm/hs_gtopo30/"+zoom+"/"+coord.x+"/"+coord.y+".png"
    },
    minZoom: 3,
    name: "hillshade",
    alt: "Baselayer",
    opacity: 0.8, // 0.4-0.6
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  g_Map1.overlayMapTypes.insertAt(0, overlayBase);
  listLayers();
}

function insertHillshade() {
  var e=g_Map1.overlayMapTypes.getAt(0);
  if (e) {
    if (e.name=="hillshade") {
      document.getElementById("status").innerHTML="<img src='pics/exclamation.png'> <span class='warning'>Layer is already active</span>";
      return;
    }
    else
      removeOverlay(0);
  }
  
  var overlaySRTM = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      var ymax = 1 << zoom;
		  var y = ymax - coord.y -1;
		  if (zoom > 10)
        return; // "pics/empty256.png";
      else if (zoom > 6)
        return "http://static.ahlfeldt.se/srtm/hs_francia/"+zoom+"/"+coord.x+"/"+y+".png";
      else
       return "http://static.ahlfeldt.se/srtm/hs_gtopo30/"+zoom+"/"+coord.x+"/"+y+".png"
    },
    minZoom: 3,
    name: "hillshade",
    alt: "Hillshade",
    opacity: 0.2, // 0.4-0.6
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  g_Map1.overlayMapTypes.insertAt(0, overlaySRTM);
  listLayers();
}

function insertColorrelief() {
  removeOverlay(1);
  var overlaySRTM = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
    var ymax = 1 << zoom;
		var y = ymax - coord.y -1;
    if (zoom > 10)
      return; //  "pics/empty256.png";
    else if (zoom > 6)
      return "http://static.ahlfeldt.se/srtm/cr_francia/"+zoom+"/"+coord.x+"/"+y+".png";
    else
      return "http://static.ahlfeldt.se/srtm/cr_gtopo30/"+zoom+"/"+coord.x+"/"+y+".png"
    },
    alt: "Color-Relief",
	  name: "color-relief",
    minZoom: 3,
    opacity: 0.4, // 0.4-0.6
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  g_Map1.overlayMapTypes.insertAt(1, overlaySRTM);
  listLayers();
}

function insertSoil() {
  removeOverlay(1);
  var overlaySoil = new google.maps.ImageMapType({
    getTileUrl: function(tile, zoom) {
    var projection = g_Map2.getProjection();
      var zpow = Math.pow(2, zoom);
      var ul = new google.maps.Point(tile.x * 256.0 / zpow, (tile.y + 1) * 256.0 / zpow);
      var lr = new google.maps.Point((tile.x + 1) * 256.0 / zpow, (tile.y) * 256.0 / zpow);
      var ulw = projection.fromPointToLatLng(ul);
      var lrw = projection.fromPointToLatLng(lr);
      //The user will enter the address to the public WMS layer here.  The data must be in WGS84
      // LEGEND: http://geonetwork3.fao.org/ows/14116?REQUEST=GetLegendGraphic&SERVICE=WMS&FORMAT=image/png&VERSION=1.1.1&LAYER=world_soilmap
      var baseURL ="http://geonetwork3.fao.org/ows/14116?LAYERS=world_soilmap&TRANSPARENT=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image/png&SRS=EPSG:4326";
      var version = "1.1.1";
      var request = "GetMap";
      var format = "image/png"; //type of image returned  or image/jpeg
      //The layer ID.  Can be found when using the layers properties tool in ArcMap or from the WMS settings 
      var layers = "world_soilmap";
      //projection to display. This is the projection of google map. Don't change unless you know what you are doing.  
      //Different from other WMS servers that the projection information is called by crs, instead of srs
      var srs = "EPSG:4326";
      //With the 1.3.0 version the coordinates are read in LatLon, as opposed to LonLat in previous versions
      var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();
      var service = "WMS";
      //the size of the tile, must be 256x256
      var width = "256";
      var height = "256";
      //Some WMS come with named styles.  The user can set to default.
      var styles = "default";
      //Establish the baseURL.  Several elements, including &EXCEPTIONS=INIMAGE and &Service are unique to openLayers addresses.
      var url = baseURL +"&BBOX=" + bbox + "&WIDTH=" + width + "&HEIGHT=" + height;
      return url;
    },
    alt: "Soil",
	  name: "soil",
    minZoom: 3,
    opacity: 0.5, // 0.4-0.6
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  g_Map1.overlayMapTypes.insertAt(1, overlaySoil);
  listLayers();
}

function insertClimate(month,condition) {
  // cr_tmin1_16
  var zoom=g_Map1.getZoom();
  if (zoom > 7) {
    document.getElementById("status").innerHTML="<img src='pics/exclamation.png'> <span class='warning'>Climate data is only available for zoom 2-7</span>";
    alert("Climate data is only available for zoom 2-7. You are currently on zoom "+zoom);
    return;
  }
  var MonthStr=new Array("unknown", "January","February","Mars","April","May","June","July","August","September","October","November","December");
  var AltStr=new Array("mean Temperature","min Temperature","max Temperature","Precipitation")
  removeOverlay(1);
  var overlayClimate = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
    var ymax = 1 << zoom;
		var y = ymax - coord.y -1;
    if (zoom > 7) {
      document.getElementById("status").innerHTML="<img src='pics/exclamation.png'> <span class='warning'>No Climate tiles available</span>";
      return "pics/empty256.png";
    }
    else if (condition==1)
      return "http://static.ahlfeldt.se/srtm/cr_tmin"+month+"/"+zoom+"/"+coord.x+"/"+y+".png"
    else if (condition==2)
      return "http://static.ahlfeldt.se/srtm/cr_tmax"+month+"/"+zoom+"/"+coord.x+"/"+y+".png"
    else if (condition==3)
      return "http://static.ahlfeldt.se/srtm/cr_prec"+month+"/"+zoom+"/"+coord.x+"/"+y+".png"
    else
      return "http://static.ahlfeldt.se/srtm/cr_tmean"+month+"/"+zoom+"/"+coord.x+"/"+y+".png"
    },
    alt: MonthStr[month]+", "+AltStr[condition],
	  name: "climate",
    minZoom: 3,
    opacity: 0.4, // 0.3-0.6
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  g_Map1.overlayMapTypes.insertAt(1, overlayClimate);
  listLayers();
  
}

function removeKmlLayer() {
  kmlLayer.setMap(null);
  kmlLayer=null;
  listLayers();
}
function removeFusionLayer() {
  fusionLayer.setMap(null);
  fusionLayer=null;
  listLayers();
}

function closestNeighbours(layer,lat,lng,number) {
  var neighbourdiv = document.getElementById('workarea');
    // request 3 closest marker only
    var zoomLevel = g_Map1.getZoom();
    var bounds=g_Map1.getBounds();
    var sViewport=bounds.toUrlValue();
    var sMouse=lat+","+lng;
    var surl="getSearch.php?mouse="+sMouse+"&maxcount="+number+"&zoom="+zoomLevel+"&layer="+layer+"&xml=1";
    // Get closest 3 places to mouse-click
    downloadUrl(surl, function(data) {
      var xml = data.responseXML;
      var markers = xml.documentElement.getElementsByTagName("marker");
      var output="<p><strong>Closest neighbours (km)</strong><br>";
      for (var i = 0; i < markers.length; i++) {
        var name = markers[i].getAttribute("name");
        var id = markers[i].getAttribute("id");
        var dist = markers[i].getAttribute("dist");
        /*
        var cc = markers[i].getAttribute("cc");
        var point = new google.maps.LatLng(
        parseFloat(markers[i].getAttribute("lat")),
        parseFloat(markers[i].getAttribute("lng")));
        */
        output+="<a href='javascript:getEvidence(\"a0000\","+id+")'>"+name+"</a> ("+dist+"); ";
      }
      output+="</p>";
      neighbourdiv.innerHTML = output;    
    });
}

function insertKmlLayer(fPreserve,url) {
  // var bInfo=false;
  if (kmlLayer)
    removeKmlLayer();
  // if (layer)
  //  bInfo=true;
  kmlLayer = new google.maps.KmlLayer(url, {
  suppressInfoWindows: true,
  preserveViewport: fPreserve
  });
  
  kmlLayer.setMap(g_Map1);
  /*
  if (layer) {
    google.maps.event.addListener(kmlLayer, 'click', function(kmlEvent) {
      // var kmlMetaData=kmlLayer.getMetadata();
      // document.getElementById("status").innerHTML=kmlMetaData.name;
      var oid = kmlEvent.featureData.id;
      var oname=kmlEvent.featureData.name;
      getEvidence(layer,oid,0);
    });
  }
  */
  //add a click listener to the layer
  google.maps.event.addListener(kmlLayer, 'click', function(kmlEvent) {
    resetTabs();
    var kmlMetaData=kmlLayer.getMetadata();
    var featureData = kmlEvent.featureData; // .description;
    var latLng=kmlEvent.latLng;
    var sidediv = document.getElementById('workarea');
    output="<p><em>Note: Content from external GeoRSS / KML-layer</em></p>";
    output+="<div style='margin-left:0.5em;margin-right:0.5em'>";
    output+="<p><strong>Layername: "+kmlMetaData.name+"</strong><br>";
    output+=(kmlMetaData.description) ? "Description: "+kmlMetaData.description+"<br>" : "";
    output+=(kmlMetaData.author.name) ? "Author: "+kmlMetaData.author.name+"<br>" : "";
    output+="</p>";
    output+="<p><strong>Feature</strong><br>";
    output+="Lat/Lng: "+latLng.toUrlValue()+" | <a href=\"javascript:setCenter("+latLng.toUrlValue()+",0,0,'"+addslashes(featureData.name)+"')\">Center</a><br>";
    output+=(featureData.name) ? "Name: "+featureData.name :"";
    output+="</p>";
    if (featureData.description) {
      output+="<p>Description: "+featureData.description+"</p>";
    }
    else {
      if (featureData.snippet)
        output+="<p>Snippet: "+featureData.snippet+"</p>";
    } 
    output+="</div>";
    output+="<p><em>Note: End of external content</em></p>";
    output+="<p><strong>See also:</strong> ";
    output+="<a href='javascript:closestNeighbours(\"a0001\","+latLng.toUrlValue()+",3)' title='Closest neighbours in RFO database'>Closest neighbours</a> | ";
    output+="<a href='javascript:setMap2(0,"+latLng.toUrlValue()+",\"satellite\")' title='View this location in Google Maps'>Google Maps Satellite View</a> | ";
    output+="<a href='javascript:toggleMenu(20)'>KML-layer</a>";
    sidediv.innerHTML = output;
    // Set destination at latLng
  });

  google.maps.event.addListenerOnce(kmlLayer, 'status_changed', function() {
    var kmlStatus=kmlLayer.getStatus();
    document.getElementById("status").innerHTML="KML-layer: "+kmlStatus;
    if (kmlStatus!="OK") {
      alert("Error loading KML-document: "+kmlStatus);
      return false;
    }
    listLayers();    
  });
  
}

function insertFusionTable(layer,dsrcid) {
  // dsrcid=916891 
  // TODO: For non-related Fusion-tables we will have to know the name of the Geo-coded column as well
  // icons as columnname: measle_brown, measle_white, measle_grey,
  // measle_turquoise
  if (fusionLayer)
    removeFusionLayer();
  if (layer=="") {
    bInfo=false;
    var select="Location";
  }
  else {
    // Show InfoWindow on non-related Fusion-tables
    bInfo=true;
    if (dsrcid=="918586" || dsrcid=="916891" || dsrcid=="918807")
      var select="Location,id";
    else if (dsrcid=="1635784") // Pleiades
      var select="reprLatLong,id";
    else
      var select="lat,lng,id";
  }
  // TODO: Depending on zoom-level, we query different types (layer a1)
  if (layer=="a1")
    ;
  fusionLayer = new google.maps.FusionTablesLayer({
      suppressInfoWindows: bInfo,
      query: {
        select: select,
        from: dsrcid
      },
      FusionTablesMarkerOptions:{
        iconName: null
      }
    });
    // Renders the layer on the specified map. If map is set to null, the layer
    // will be removed. => We have to save layer as a Global!
    
    fusionLayer.setMap(g_Map1);
    
    //add a click listener to the layer
    google.maps.event.addListener(fusionLayer, 'click', function(e) {
      if (layer!="") {
        var id=e.row['id'].value;
        getEvidence(layer,id,0);
      }
  });
}
function setDistance(id,title,latLng) {
  // Set distance when distance form is visible
  var ofrm=document.getElementById("distance_frm");
  if (ofrm==null) {
    alert("Distance form not found");
    return;
  }
  // Default values
  var checked1=2;
  
  // Action: Read value from distance form
  var len = ofrm.option1.length;
  for (i = 0; i <len; i++) {
    if (ofrm.option1[i].checked) {
      checked1 = ofrm.option1[i].value
    }
  }
  if (checked1==1) {
    setOrigin(latLng.lat(),latLng.lng(),0,id,title);
    // checked1=1; // Next item should be destination
  }
  else if (checked1==2) {
    setDestination(latLng.lat(),latLng.lng(),id,title);
  }
  else if (checked1==3) {
    addWaypoint(latLng,id,title);
  }
  showDistance(checked1);
}

function addWaypoint(location,id,title) {
  // Only when distance for is visible
  var image = new google.maps.MarkerImage('pics/pin-yellow.png',
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(16, 16),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      new google.maps.Point(1,16));
  marker = new google.maps.Marker({
    position: location,
    map: g_Map1,
    icon: image,
    title: title
  });
  // icon: 'pics2/trp.png',
  g_Waypoints.push(marker);
  google.maps.event.addListener(marker, 'click', function(event) {
      onMarker1(id,title,event.latLng);
  });
}

function setCenter2(location,id,title) {
  // Purpose: set center marker on map 2 (from click map1, destination marker 
  // click map 2)
  if (g_Center2) {
    g_Center2.setMap(null);
  }
  /*
  if (id==0) {
    return;
  }
  */
  var layer=activeLayer();
  var image = new google.maps.MarkerImage('pics/pin-darkblue.png',
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(16, 16),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      new google.maps.Point(1,16));
  g_Center2 = new google.maps.Marker({
    position: location,
    draggable:false,
    map: g_Map2,
    icon: image,
    title:title
  });
  if (id > 0) {
    google.maps.event.addListener(g_Destination, "click", function(event) {
      onMarker2(id,title,event.latLng);
    });
  }
  
  // g_Map2.setCenter(location);
}

function setCenter(lat,lng,zoom,id,title) {
  // Purpose: set destination as center [and show an Infowindow]
  if (g_Destination) {
    g_Destination.setMap(null);
  }
  /*
  if (id==0) {
    return;
  }
  else
  */
    var location = new google.maps.LatLng(lat,lng);
  var image = new google.maps.MarkerImage('pics/pin-darkblue.png',
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(16, 16),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      new google.maps.Point(1,16));
  g_Destination = new google.maps.Marker({
    position: location,
    draggable:false,
    map: g_Map1,
    icon: image,
    title:title
  });
  
  if (id==0) {
    /*
    google.maps.event.addListener(g_Destination, "click", function(event) {
      onMarkerPopup1(id,title,event.latLng);
    });
    */
  }
  else {
    google.maps.event.addListener(g_Destination, "click", function(event) {
      onMarker1(id,title,event.latLng);
    });
  }
  g_Map1.setCenter(location);
  if (zoom > 5)
    g_Map1.setZoom(zoom);
  document.getElementById("status").innerHTML="New center at "+title;
}

function setOrigin(lat,lng,zoom,id,title) {
  // Purpose: set origin marker and center place [and show an Infowindow]
  if (g_Origin) {
    deleteOrigin(0);
  }
  if (id==0) {
    title="Paris";
    var location = new google.maps.LatLng(48.8566667, 2.3509871);
  }
  else
    var location = new google.maps.LatLng(lat,lng);
  var image = new google.maps.MarkerImage('pics/pin.png',
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(16, 16),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      new google.maps.Point(1,16));
  g_Origin = new google.maps.Marker({
    position: location,
    draggable:false,
    map: g_Map1,
    icon: image,
    title:title
  });
  
  google.maps.event.addListener(g_Origin, "click", function(event) {
    onMarker1(id,title,event.latLng);
  });
  g_Map1.setCenter(location);
  if (zoom > 2)
    g_Map1.setZoom(zoom);
  document.getElementById("origin").value=title;
}

function setDestination(lat,lng,id,title) {
  // set destination without center map
  if (g_Destination) {
    g_Destination.setMap(null);
  }
  var location = new google.maps.LatLng(lat,lng);
  var image = new google.maps.MarkerImage('pics/pin-darkblue.png',
      new google.maps.Size(16, 16),
      new google.maps.Point(0,0),
      new google.maps.Point(1,16));
  g_Destination = new google.maps.Marker({
    position: location,
    map: g_Map1,
    icon: image,
    title: title
  });
  google.maps.event.addListener(g_Destination, 'click', function(event) {
      onMarker1(id,title,event.latLng);
  });
}

function deleteDestination(fShow) {
  if (g_Destination) {
    g_Destination.setMap(null);
    g_Destination=null;
    if (fShow)
      showDistance(2);
  }
}
function deleteOrigin(del) {
  if (g_Origin) {
    g_Origin.setMap(null);
    g_Origin=null;
    if (g_Destination) {
      g_Destination.setMap(null);
      g_Destination=null;
    }
    if (g_Waypoints.length) {
      for (var i in g_Waypoints) {
        g_Waypoints[i].setMap(null);
      }
      g_Waypoints.length = 0;
    }
    if (del==1)
      showDistance(1);
  }
}
function deleteWaypoints(fShow) {
  if (g_Waypoints.length) {
    for (var i in g_Waypoints) {
      g_Waypoints[i].setMap(null);
    }
    g_Waypoints.length = 0;
    if (fShow)
      showDistance(3);
  }
}


function downloadUrl(url, callback) {
  var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest;
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    }
  };
  request.open('GET', url, true);
  request.send(null);
}
function doNothing() {}

function insertOverlay2(layer,alt,year) {
  var opac=1.0;
  var insPos=0;  
  var overlayFrancia = new google.maps.ImageMapType({
    opacity: opac,
    getTileUrl: function(coord, zoom) {
    return "tile.php?zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y+"&layer="+layer+"&year="+year+"&trans=2";
    },
    name: layer,
    alt: alt,
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  if (insPos > 0)
    g_Map2.overlayMapTypes.insertAt(insPos,overlayFrancia);  // insertAt(i,elem)
  else
    g_Map2.overlayMapTypes.push(overlayFrancia);  // insertAt(i,elem)
}
function renderDistance(origin,d,lng,lat) {
  var opac=0.4;
  var insPos=2;
  var layer="w000"+d;
  var d2=6*d; // six travel days, rest on sundays
  // var index=CheckDistanceLayer(layer);
  var overlayFrancia = new google.maps.ImageMapType({
    opacity: opac,
    getTileUrl: function(coord, zoom) {
    // DEBUG
    // var surl="showDistance.php?zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y+"&layer="+layer+"&lng="+lng+"&lat="+lat+"&trans=1";
    // doAjax(surl, "workarea", false,"");
    // return;
    return "tile.php?zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y+"&layer="+layer+"&lng="+lng+"&lat="+lat+"&trans=1";
    },
    name: layer,
    alt: "Distances from "+origin+" "+d2+" km (six days à "+d+" km)",
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  g_Map1.overlayMapTypes.insertAt(insPos,overlayFrancia);  // insertAt(i,elem)
  // listLayers();
}
function insertOverlay1(layer,alt,year) {
  // call with var symbol
  var option="0";
  var symbol="00";
  var ofrm=document.getElementById("layerform");
  if (ofrm!=null) {
    // Read some values from layerform
    // var smstr=getFormValues("layerform")
    var len = ofrm.content.length;
    for (i = 0; i <len; i++) {
      if (ofrm.content[i].checked) {
        option = ofrm.content[i].value
      }
    }
    // Get layer-symbol from custom combo
    var symbol=ccbGetStrValue("combo1");
  }
  else {
    option=layer.substring(1,2); 
    var symbol=layer.substring(2,4);
  }
  // var sexpr=(ss) ? urlencode(ss) : "";
  // !!! string.substring(from, to)
  var tb=layer.substring(0,1); // charAt(0);
  var pos=layer.indexOf("/");
  if (pos >= 0) {
    // Get xid and search string
    var xid=parseInt(layer.substring(4,pos));
    var sexpr=layer.substring(pos+1);
    // Error: alert(xid);
  }
  else {
    // No search string
    var xid=layer.substring(4); // to the end
    var sexpr="";
    // alert(xid);
  }
  var title=alt;
  
  if (tb=="t") {
    if (option==1)
      title+=" (itinerary)";
    else if (option==2)
      title+=" (recipients)";
    else if (option==3)
      title+=" (possessions)";
    else if (option==4)
      title+=" (confirmations)";
    else if (option==5)
      title+=" (mint)";
  }
  if (tb=="i") {
    if (option==1)
      title+=" (royal donations)";
    else if (option==2)
      title+=" (private donations)";
    else if (option==3)
      title+=" (church possessions)";    
  }
  
  if (sexpr)
    title+=" ("+sexpr+")";
  
  var opac=1.0;
  // Get time-period, content and symbol values from Layer settings, returns "00" if settings not shown
  // var layerform=document.getElementById("layerform");
  // Compose layer
  var layer1=tb+option+symbol+xid;
  if (sexpr)
    layer1+="/"+sexpr;
  document.getElementById("status").innerHTML="layer id: "+layer1;
  
  var insPos=0;
  if (!year) {
    year=0;
    var index=checkLayer(layer);
    if (index > 0) {
      // removeLayer(index);
      // <span class='warning'>
      document.getElementById("status").innerHTML="<img src='pics/exclamation.png'> <span class='warning'>Layer <em>"+alt+"</em> already on the map</span>";
      return;
    }
  }
  else if (year > 0) {
    // Animation: Remove topmost layer
    var num=g_Map1.overlayMapTypes.getLength();
    var e=g_Map1.overlayMapTypes.removeAt(num-1);
    // setTimeline("0"+year+"-01-01");
  }
  if (layer1=="b0185270")
    opac=0.9;
  if (layer1=="roads") {
    opac=0.6; // 0.8
    insPos=2;
  }
  if (tb=="d") {
    if (layer1=="d0002" || layer1=="d0001") {
      //  civitas,pagus
      opac=0.6;
      insPos=1;
      removeOverlay(1);
    }
    else {
      // Division d000yyy
      opac=0.15; // 0.15
      insPos=2;
    }
  }
  deleteDestination(0);
  deleteWaypoints(0);
  // Insert new overlay
  var overlayFrancia = new google.maps.ImageMapType({
    opacity: opac,
    getTileUrl: function(coord, zoom) {
    if (layer1=="b0185270")
      return "";
    else
      return "tile.php?zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y+"&layer="+layer1+"&year="+year+"&trans=1";
    },
    name: layer1,
    alt: title,
    tileSize: new google.maps.Size(256, 256),
    isPng: true
  });
  if (insPos > 0)
    g_Map1.overlayMapTypes.insertAt(insPos,overlayFrancia);  // insertAt(i,elem)
  else
    g_Map1.overlayMapTypes.push(overlayFrancia);  // insertAt(i,elem)
  
  listLayers();
  //1 showMarkers(year);
}

function WMSGetTileUrl(tile,zoom) {
  var projection = g_Map2.getProjection();
      var zpow = Math.pow(2, zoom);
      var ul = new google.maps.Point(tile.x * 256.0 / zpow, (tile.y + 1) * 256.0 / zpow);
      var lr = new google.maps.Point((tile.x + 1) * 256.0 / zpow, (tile.y) * 256.0 / zpow);
      var ulw = projection.fromPointToLatLng(ul);
      var lrw = projection.fromPointToLatLng(lr);
      //The user will enter the address to the public WMS layer here.  The data must be in WGS84
      // LEGEND: http://geonetwork3.fao.org/ows/14116?REQUEST=GetLegendGraphic&SERVICE=WMS&FORMAT=image/png&VERSION=1.1.1&LAYER=world_soilmap
      var baseURL ="http://geonetwork3.fao.org/ows/14116?LAYERS=world_soilmap&TRANSPARENT=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image/png&SRS=EPSG:4326";
      var version = "1.1.1";
      var request = "GetMap";
      var format = "image/png"; //type of image returned  or image/jpeg
      //The layer ID.  Can be found when using the layers properties tool in ArcMap or from the WMS settings 
      var layers = "world_soilmap";
      //projection to display. This is the projection of google map. Don't change unless you know what you are doing.  
      //Different from other WMS servers that the projection information is called by crs, instead of srs
      var srs = "EPSG:4326";
      //With the 1.3.0 version the coordinates are read in LatLon, as opposed to LonLat in previous versions
      var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();
      var service = "WMS";
      //the size of the tile, must be 256x256
      var width = "256";
      var height = "256";
      //Some WMS come with named styles.  The user can set to default.
      var styles = "default";
      //Establish the baseURL.  Several elements, including &EXCEPTIONS=INIMAGE and &Service are unique to openLayers addresses.
      var url = baseURL +"&BBOX=" + bbox + "&WIDTH=" + width + "&HEIGHT=" + height;
      return url;
}

function initialize() {
  var paris = new google.maps.LatLng(48.8566667, 2.3509871); // Paris
  var rfoMapType = new google.maps.ImageMapType({
	 getTileUrl: function(coord, zoom) {
    var ymax = 1 << zoom;
	  var y = ymax - coord.y -1;
    if (zoom > 10) {
      switch(getRandomInt(1,3)){
        case 1:  
          return "http://a.tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        case 2:
          return "http://b.tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        case 3:
          return "http://c.tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        }
    }
    else if (zoom > 5) // Baselayer
      return "http://static.ahlfeldt.se/srtm/hs_francia/"+zoom+"/"+coord.x+"/"+y+".png";
      // return "http://static.ahlfeldt.se/srtm/base/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
    else
      return "tile.php?zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y;
    // else
    //  return "pics/empty256.png";
	 },
	 tileSize: new google.maps.Size(256, 256),
	 isPng: true,
	 alt: "RFO layer",
	 name: "Francia",
	 minZoom: 6,
   maxZoom: 18,
	 overviewMapControl: true
  });
  // Cursor:'crosshair', not supported for mapOptions,only markers
  var mapOptions = {
        disableDefaultUI: true,
        zoomControl: true,
        scaleControl: true,
        zoomControlOptions: {
          style: google.maps.ZoomControlStyle.SMALL
        },
        zoom: 7,
  	  	center: paris,
  	  	mapTypeId: 'RFO' 	
  	};
  	/*
  	mapTypeControlOptions: {
  	  	  mapTypeIds: ['RFO', google.maps.MapTypeId.ROADMAP],
  	  	  style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
  	  	}
  	*/
	g_Map1 = new google.maps.Map(document.getElementById("map_canvas"),mapOptions);
	g_Map1.mapTypes.set('RFO',rfoMapType);
	g_Map1.setMapTypeId('RFO');
	
	// Insert Maptype Overlays 
  
  insertBaselayer();  // mapnik base tiles
  insertInactive(1,"(color-relief)");
  // insertHillshade();
  // insertColorrelief();
  
  // Event listeners on g_Map1
  
	google.maps.event.addListener(g_Map1, 'click', function(event) {
    onMouse1(event.latLng);
  });
  // Add invisible markers on layer a0 in current bounds of map
  
  google.maps.event.addListenerOnce(g_Map1, 'idle', function() {
    // Load default active layer
    insertOverlay1("b0185270","Civitates and Bishoprics",0);
  });
  
  google.maps.event.addListenerOnce(g_Map1, 'idle', function() {
    // Loads external parameters (zoom, center, layer, if any) or default layer
    insertOverlayOnload();
  });
  
  google.maps.event.addListener(g_Map1, 'tilesloaded', function() {
    var mapid1=g_Map1.getMapTypeId();
    var zoomLevel = g_Map1.getZoom();
    document.getElementById("status").innerHTML=mapid1+" tiles loaded at zoom-level "+zoomLevel;
  });
  	
	var options2 = {
    disableDefaultUI: true,
    zoomControl: true,
    center: paris,
    zoom: 12,
    zoomControlOptions: {
        style: google.maps.ZoomControlStyle.SMALL
      },
      mapTypeControl:true,
    mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}
  }
	
	g_Map2 = new google.maps.Map(document.getElementById("map_canvas2"), options2);
  
  /**
  * Map 2 mapTypes
  */

  var mapOSM = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      switch(getRandomInt(1,3)){
        case 1:  
          return "http://a.tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        case 2:
          return "http://b.tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        case 3:
          return "http://c.tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        }
    },
    tileSize: new google.maps.Size(256, 256),
    isPng: true,
    maxZoom: 18,
    name: "OSM",
    alt: "Open Streetmap tiles"
  });
  
  var mapLorraine = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      return "http://static.ahlfeldt.se/srtm/lorraine/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
    },
    tileSize: new google.maps.Size(256, 256),
    isPng: true,
    minZoom: 7,
    maxZoom: 16,
    name: "Lorraine",
    alt: "OSM-SRTM"
  });
  var mapCassini = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      var qrst=genQrst(coord.x, coord.y, zoom);
      var path=genPathFromQrst(qrst);
      var rndnum=getRandomInt (8, 10);
      return "http://tiles"+rndnum+"-proxy.geogarage.com/cassinige/"+path;
    },
    tileSize: new google.maps.Size(256, 256),
    isPng: true,
    maxZoom: 14,
    name: "Cassini",
    alt: "Cassini map of France"
  });
   
  /* OpenCycle Map Topo */
  
  var mapOpenCycle = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      switch(getRandomInt(1,3)){
        case 1:  
          return "http://a.tile.opencyclemap.org/cycle/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        case 2:
          return "http://b.tile.opencyclemap.org/cycle/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        case 3:
          return "http://c.tile.opencyclemap.org/cycle/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
        }
    },
    tileSize: new google.maps.Size(256, 256),
    isPng: true,
    maxZoom: 14,
    name: "OCM",
    alt: "OpenCycleMap.org"
  });
  
  /* NPL Warper-maps */
  var mapSpire = new google.maps.ImageMapType({
    getTileUrl: function(coord, zoom) {
      return "http://maps.nypl.org/warper/maps/tile/13909/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
    },
    tileSize: new google.maps.Size(256, 256),
    isPng: true,
    maxZoom: 14,
    name: "Spire (1716)",
    alt: "Spire tiles"
  });
  
  /* http://eusoils.jrc.ec.europa.eu/wms/wms.htm */
  var mapWMS = new google.maps.ImageMapType({
            alt: "WMS Layer from FAO-UN",
            getTileUrl: WMSGetTileUrl,
            isPng: false,
            maxZoom: 10,
            minZoom: 3,
            name: "soil",
            tileSize: new google.maps.Size(256, 256),
            credit: 'Credits: FAO-UN'
        });
  
  /**
  * set mapTypes to map2
  */
  g_Map2.mapTypes.set('osm', mapOSM);
  g_Map2.mapTypes.set('opencycle', mapOpenCycle);
  g_Map2.mapTypes.set('lorraine', mapLorraine);
  g_Map2.mapTypes.set('cassini', mapCassini);
  g_Map2.mapTypes.set('spire', mapSpire);
  g_Map2.mapTypes.set('soil', mapWMS);
  // g_Map2.mapTypes.set('mff', mapMFF);
  g_Map2.setMapTypeId(google.maps.MapTypeId.ROADMAP);

  g_Map2.setOptions({
    mapTypeControlOptions: {
      mapTypeIds: [
        'osm',
        'opencycle',
        'lorraine',
        'cassini',
        'spire',
        'soil',
        google.maps.MapTypeId.ROADMAP,
        google.maps.MapTypeId.TERRAIN,
        google.maps.MapTypeId.SATELLITE
      ],
      style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    }
  });
  google.maps.event.addListener(g_Map2, 'tilesloaded', function() {
    var mapid2=g_Map2.getMapTypeId();
     var zoomLevel = g_Map2.getZoom();
    document.getElementById("status").innerHTML=mapid2+" tiles loaded at zoom-level "+zoomLevel;
  });
  google.maps.event.addListener(g_Map2, 'click', function(event) {
    onMouse2(event.latLng);
  });
  setOrigin(0,0,0,0,"");
  
} // Initialize()

function loadScript() {
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=initialize";
  document.body.appendChild(script);
}

/* Custom Combobox functions */

function ccbExpand(btn) {
    var elem=document.getElementById('combo1').getElementsByClassName('combovalue');
    var combovalue=elem[0];
    var elem=document.getElementById('combo1').getElementsByClassName('options');
    var options=elem[0];
    if (options.style.display=="none")
      options.style.display="block";
    else
      options.style.display="none";
  }
function ccbOver(item) {
  item.className="overoption";
}
function ccbOut(item) {
  item.className="option";
}
function ccbSelect(item,num) {
  // An item was clicked
  var elem=document.getElementById('combo1').getElementsByClassName('combovalue');
  var combovalue=elem[0];
  combovalue.value=num;
  var elem=document.getElementById('combo1').getElementsByClassName('selected');
  elem[0].innerHTML=item.innerHTML;
  item.className="overOption";
  var elem=document.getElementById('combo1').getElementsByClassName('options');
  elem[0].style.display="none";
  document.getElementById('status').innerHTML="Combobox value changed to "+combovalue.value;
}
function ccbGetStrValue(id) {
  // An item was clicked
  var combo=document.getElementById(id);
  if (!combo)
    return("00");
  var elem=combo.getElementsByClassName('combovalue');
  if (parseInt(elem[0].value)<10)
    return("0"+elem[0].value.toString());
  else
    return(elem[0].value.toString());
}
/* end Custom Combobox functions */

function onLoad() { 
  initialize();
  setCalendar();
  HandleMonth(768,10)
  rightPane(0);  // Resizes map and menu-area
  // toggleMenu(0,0);  // Set welcome page
  getLatestComment(0,0,2); // Set News page in workarea
}
