// Trip.js
// Author: Nicola Zordan 2/8/2007 11:11 Nicola@Zordan.net


// GoogleMap
    
    // set map intial location and zoom level
    //var pCentre = new GPoint(-3.515453, 50.725046);
    var pCentre = new GPoint(0, 0);
    //var nZoom = 5;
    var nZoom = 19;

    // the map object
    var map;

    var geocoder = new GClientGeocoder();

    //    map = new GMap(document.getElementById("map"));
    //    //map.addControl(new GSmallMapControl());
    //    map.addControl(new GLargeMapControl());
    //    map.addControl(new GMapTypeControl());
    //	map.setMapType(G_HYBRID_TYPE);
    //    map.centerAndZoom(pCentre, nZoom);
    //    //map.centerAndZoom(pCentre, nZoom);


// /GoogleMap

// Icons

   // Create a "tiny" marker icons (should be properties of map
	var iconHome = new GIcon();
	iconHome.image = "home.gif";
	iconHome.shadow = "mm_20_shadow.png";
	iconHome.iconSize = new GSize(12, 20);
	iconHome.shadowSize = new GSize(22, 20);
	iconHome.iconAnchor = new GPoint(6, 20);
	iconHome.infoWindowAnchor = new GPoint(5, 1);
	var iconYellow = new GIcon();
	iconYellow.image = "mm_20_yellow.png";
	iconYellow.shadow = "mm_20_shadow.png";
	iconYellow.iconSize = new GSize(12, 20);
	iconYellow.shadowSize = new GSize(22, 20);
	iconYellow.iconAnchor = new GPoint(6, 20);
	iconYellow.infoWindowAnchor = new GPoint(5, 1);

// /Icons

// Marker

    function getMarkerIdent(name)
    // Generate a name for the marker.
    // we add the markers as properties of the map object and use eval() to make it work
    {
        return "map." + name;
    }


    function addMarker (name, lon, lat, html)
    // Add a marker to the map
    // eval() is used to add properties to the map and marker objects
    // Note: could be more efficent as 1 eval and would prefer to be able to set via a reference created with a single eval
    {

        var iconName = "iconHome";
        var markerName = getMarkerIdent( name );
        eval(markerName + "= new GMarker( new GPoint(" + lat + "," + lon +"), " + iconName + ");");
        eval(markerName + '.html = "' + html + '";');
        eval("GEvent.addListener(" + markerName +", 'click', function() { " + markerName + ".openInfoWindowHtml(" + markerName + ".html); });");
        eval("map.addOverlay(" + markerName + ");");
    }


    function showMarker(name)
    // Show a marker and open it's info window
    {   
        map.closeInfoWindow(); // else get problems
        var marker = getMarkerIdent( name );
        eval(marker + ".openInfoWindowHtml(" + marker + ".html);");
        //eval("GEvent.trigger(" + marker + ", click)");
    }


// /Marker


// Address


function showAddress0(address) {
  geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        alert(address + " not found");
      } else {
        map.setCenter(point, 13);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(address);
      }
    }
  );
}


function showAddress(name,address,html,lat,lon) {
  geocoder.getLatLng(
    address,
    function(point) {
      var where=point;
      if (!point) {
        alert("Google maps API cannot find: \n"+address+"\nusing lat="+lat+" long="+lon);
	where=new GPoint(lat,lon);
      };
      /* } else { */
	/*
        map.setCenter(point, 13);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(address);
	*/
        var iconName = "iconHome";
        var markerName = getMarkerIdent( name );
        //eval(markerName + "= new GMarker( point, " + iconName + ");");
        eval(markerName + "= new GMarker( where, " + iconName + ");");
        eval(markerName + '.html = "' + html + '";');
        eval("GEvent.addListener(" + markerName +", 'click', function() { " + markerName + ".openInfoWindowHtml(" + markerName + ".html); });");
        eval("map.addOverlay(" + markerName + ");");
      /* } */
    }
  );
}


// /Address


//
var Locations=[];
    // //Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", dateStart, timeStart, dateEnd, timeEnd ];	
    // Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", dateStart, timeStart, dateEnd, timeEnd, image, pushpinImage ];	
var Connections=[];
    // Connections[Connections.length]=[index, name, text, (url), (transportType), (company), (id), (dateStart), (timeStart), (dateEnd), (timeEnd), (duration), (description) ];
var TripData=[];
    // TripData=[ name, text, (url), (imageURL), (dateStart), (timeStart), (dateEnd), (timeEnd), tel ];
var Areas=[];
    // Areas[Areas.length]=["id","name","tel","description", "detailsURL", dateStart, timeStart, dateEnd, timeEnd, image, pushpinImage, [Location, Location, ...],opacity ];	


// Locations
var ix;
ix=0;
var locationIndexId=ix++; 	//0
var loactionIndexName=ix++;	//1
var loactionIndexAddress=ix++;	//2
var loactionIndexTel=ix++;	//3
var loactionIndexLongitude=ix++;	//4
var loactionIndexLatitude=ix++;	//5
var loactionIndexDescription=ix++;	//6
var loactionIndexDetailsURL=ix++;	//7
var loactionIndexDateStart=ix++;	//8
var loactionIndexTimeStart=ix++;	//9
var loactionIndexDateEnd=ix++;	//10
var loactionIndexTimeEnd=ix++;	//11	
var loactionIndexImageUrl=ix++;	//12	

    //var Locations=[];
    //Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", "ImageUrl" ];	
    Locations[Locations.length]=["Boca2","Boca Raton FL Miami area USA 2","1111 S Ocean blvd #216, Boca Raton, FL, 33432-7603, USA","+1-561-620-4868", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 11" ];
    Locations[Locations.length]=["Boca1","Boca Raton FL Miami area USA 1","950 Ponce De Leon rd #108, Boca Raton, FL, 33432-7603, USA","+1-561-620-4868", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 10"  ];
    //Locations[Locations.length]=["Bristol","Bristol UK","38 Upper Belgrave road, Bristol, BS8-2XN, UK","+44-845-600-7010", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 10"  ];
    Locations[Locations.length]=["Bristol","Bristol UK","38 Upper Belgrave Rd , Bristol, City of Bristol, BS8 , UK","+44-845-600-7010",  -2.617235, 51.470103, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 9"  ];
    //Locations[Locations.length]=["Bristol","Bristol UK","38 upper Belgrave, Bristol, England","+44-845-600-7010", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 8b"  ];
    //--Locations[Locations.length]=["Bristol","Bristol UK","London","+44-845-600-7010", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 8a"  ];
    Locations[Locations.length]=["NewYork","New York USA","770 Anderson avenue #19C, Cliffside Park, NJ, 07010, USA","+1-201-965-6760", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 7"  ];
    //Locations[Locations.length]=["Denver3","Denver USA 3","9609 South University boulevard, PO Box 260376, Highlands Ranch, CO, 8163-0376, USA","+1-801-315-6048", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 7b"  ];
    //-Locations[Locations.length]=["Denver3","Denver USA 3","9609 South University boulevard, Highlands Ranch, CO, 8163-0376, USA","+1-801-315-6048", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 7a"  ];
    Locations[Locations.length]=["Denver2","Denver USA 2","6036/A Blue Ridge drive, Highlands Ranch, CO, 80126, USA","+1 303 807 6951", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 6"  ];
    Locations[Locations.length]=["Atlanta","Altanta USA","475 Buckhead Avenue #2210, Atlanta, GA, 30305, USA","", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 5"  ];
    Locations[Locations.length]=["Denver1","Denver USA 1","9959 East Peakview Avenue #Y204, Englewood, CO, 80111, USA","+1 303 807 6951", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 4"  ];
    Locations[Locations.length]=["SanFrancisco","San Francisco USA","719, 38th Avenue #4, San Francisco, CA, 94121, USA","+1 415 613 5872", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 3"  ];
    Locations[Locations.length]=["Milan","Milan Italy","viale Lunigiana 15, Milano, MI, I-20125, Italy","+39 02 66986967", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 2"  ];
    Locations[Locations.length]=["Venice","Venice Italy","viale Bissuola 93, Mestre, VE, I-30100, Italy","+39 041 5341993", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 1"  ];
    Locations[Locations.length]=["Valdagno","Valdagno VI Italy","via Tegnan 11, Valdagno (Vicenza), I-36078, Italy","+39 0445 402484", 50.728257, -3.538530, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 0"  ];


//var geocoder = new GClientGeocoder();

var LocationsMarkers=[];
var LocationsUseLatLon=[];


var PushpinStartStop=true;
var PushpinImageStart='dd-start.png'; // green pushpin with arrow in it 
var PushpinImageStop='dd-end.png'; // red pushpin with square in it 
//var PushpinImageDefault=null; // google default
var PushpinImageDefault='marker.png'; // red pushpin with dot in it
    PushpinImageDefault='blue-dot.png'; // blue pushpin with dot in it
    PushpinImageDefault='marker-blue.png'; // blue pushpin with dot in it

//var InvalidGeoPointMessage='Google maps API cannot Geolocate';
//var InvalidGeoPointMessage='Cannot Geolocate';
var InvalidGeoPointMessage=null;
var InvalidGeoPoint='NOPOINT';
function showLocation(ix) {
  if (ix>=Locations.length) return;
  var id,name,address,tel,html,lat,lon, description,image, pushpinImage;
  id=Locations[ix][0];
  name=Locations[ix][1];
  address=Locations[ix][2];
   //if (address==null || address=='') address=name;
  tel=Locations[ix][3];
  lon=Locations[ix][4];
  lat=Locations[ix][5];
   if ((address==null || address=='') && ((lon==null || lon=='') && (lat==null || lat==''))) {
     //alert('address from name: ['+name+']');
     address=name;
   };
   // else alert('address NOT from name ['+name+']['+address+'] ['+lon+']['+lat+']');
  description=Locations[ix][6];
  if (description==null) description="";
  image=Locations[ix][12];
  pushpinImage=Locations[ix][13];
  if (pushpinImage==null || pushpinImage=='') {
    pushpinImage=PushpinImageDefault;
    if (PushpinStartStop) {
      if (ix==0) pushpinImage=PushpinImageStart;
      if (ix==(Locations.length-1)) pushpinImage=PushpinImageStop;
    };
  };
  /*
  //html="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html="<div>";
  html+="<b>"+name+"</b>";
  html+="<br/>"+address;
  if (description!=null && description.length>0) {
    html+="<br/>"+description;
  };
  //html+="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html+="</div>";
  */
  //-html="<div>"+LocationDescriptionHTML(ix)+"</div>";

  geocoder.getLatLng(
    address,
    function(point) {
      var where=point;
      if (!point) {
        LocationsUseLatLon[ix]=false;
 	//if (lon==null || lat==null) {
 	if (lon==null || lat==null || lon=='' || lat=='') {
	  lat=0;
	  lon=0;
          //alert("Google maps API cannot find: \n"+address+"\nusing lat="+lat+" lon="+lon);
  	  LocationsPathPoints[ix]=InvalidGeoPoint;
          //alert("Google maps API cannot Geolocate: \n"+address+"\nfix the address or use latitude longitude\n lat="+lat+" lon="+lon);
          //alert("Google maps API cannot Geolocate: ["+(ix+1)+"] "+name+"\n"+address+"\nfix the address or use latitude longitude");
          if (InvalidGeoPointMessage!=null)
            alert(InvalidGeoPointMessage+" ["+(ix+1)+"] "+name+"\n"+address+"\nfix the address or use latitude longitude");
  	  ShowLocationsPath(Locations.length);
          //showLocation(ix+1);
          //setTimeout('showLocation('+(ix+1)+')',100);
          setTimeout('showLocation('+(ix+1)+')',100);
	  return;
          //where=InvalidGeoPoint;
         } else {
	};
 	//where=new GPoint(lat,lon);
	//where=new GPoint(lon,lat);
	where=new GLatLng(lat,lon);
       } else { 
        LocationsUseLatLon[ix]=true;
	lon=where.x;
    	lat=where.y;
      };

	//-Locations[ix][4]=lon;
	//-Locations[ix][5]=lat;

	LocationsPathPoints[ix]=where;

	/*
        map.setCenter(point, 13);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(address);
	*/

        var iconName = "iconHome";
        var markerName = getMarkerIdent( id );
        //eval(markerName + "= new GMarker( point, " + iconName + ");");
        //-eval(markerName + "= new GMarker( where, " + iconName + ");");
	//--eval(markerName + "= new GMarker( where );");
        //LocationsMarkers[ix]=new GMarker(where);
        var thisMarker=null;
        if (pushpinImage==null) {
          thisMarker=new GMarker(where);
         } else {
          var thisIcon=new GIcon(G_DEFAULT_ICON);
          thisIcon.image=pushpinImage;
          thisMarker=new GMarker(where,thisIcon);
          LocationsMarkers[ix]=new GMarker(where,thisIcon);
        };
        LocationsMarkers[ix]=thisMarker;
        /*
        if (where!=InvalidGeoPoint) {
          LocationsMarkers[ix]=new GMarker(where);
         } else {
          LocationsMarkers[ix]=[];
        };
        */
        //--eval(markerName + '.html = "' + html + '";');
        //html="<div>"+LocationDescriptionHTML(ix)+"</div>";
        html="<div><small>"+LocationDescriptionHTML(ix)+"</small></div>";
	LocationsMarkers[ix].html=html;
        //--eval("GEvent.addListener(" + markerName +", 'click', function() { " + markerName + ".openInfoWindowHtml(" + markerName + ".html); });");
	//alert(ix+'. '+markerName+'\n'+LocationsMarkers[ix]);
	//+GEvent.addListener(LocationsMarkers[ix], 'click', eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }') );
        //+alert('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }'+'\n'+eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }'));
	//GEvent.addListener(LocationsMarkers[ix], 'click', eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }') );
	eval("GEvent.addListener(LocationsMarkers["+ix+"], 'click', function() { LocationsMarkers["+ix+"].openInfoWindowHtml(LocationsMarkers["+ix+"].html); } );" );
        //--eval("map.addOverlay(" + markerName + ");");
        map.addOverlay(LocationsMarkers[ix]);
      /* } */

	ShowLocationsPath(Locations.length);

        //showLocation(ix+1);
        //setTimeout('showLocation('+(ix+1)+')',100);
        setTimeout('showLocation('+(ix+1)+')',100);

    }
  );
}

function showLocation0(ix) {
  var id,name,address,tel,html,lat,lon, description;
  id=Locations[ix][0];
  name=Locations[ix][1];
  address=Locations[ix][2];
  tel=Locations[ix][3];
  lon=Locations[ix][4];
  lat=Locations[ix][5];
  description=Locations[ix][6];
  if (description==null) description="";
  /*
  //html="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html="<div>";
  html+="<b>"+name+"</b>";
  html+="<br/>"+address;
  if (description!=null && description.length>0) {
    html+="<br/>"+description;
  };
  //html+="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html+="</div>";
  */
  //-html="<div>"+LocationDescriptionHTML(ix)+"</div>";

  geocoder.getLatLng(
    address,
    function(point) {
      var where=point;
      if (!point) {
        LocationsUseLatLon[ix]=false;
 	//if (lon==null || lat==null) {
 	if (lon==null || lat==null || lon=='' || lat=='') {
	  lat=0;
	  lon=0;
          //alert("Google maps API cannot find: \n"+address+"\nusing lat="+lat+" lon="+lon);
  	  LocationsPathPoints[ix]=InvalidGeoPoint;
          //alert("Google maps API cannot Geolocate: \n"+address+"\nfix the address or use latitude longitude\n lat="+lat+" lon="+lon);
          //alert("Google maps API cannot Geolocate: ["+(ix+1)+"] "+name+"\n"+address+"\nfix the address or use latitude longitude");
          if (InvalidGeoPointMessage!=null)
            alert(InvalidGeoPointMessage+" ["+(ix+1)+"] "+name+"\n"+address+"\nfix the address or use latitude longitude");
  	  ShowLocationsPath(Locations.length);
	  return;
          //where=InvalidGeoPoint;
         } else {
	};
 	//where=new GPoint(lat,lon);
	//where=new GPoint(lon,lat);
	where=new GLatLng(lat,lon);
       } else { 
        LocationsUseLatLon[ix]=true;
	lon=where.x;
    	lat=where.y;
      };

	//-Locations[ix][4]=lon;
	//-Locations[ix][5]=lat;

	LocationsPathPoints[ix]=where;

	/*
        map.setCenter(point, 13);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(address);
	*/

        var iconName = "iconHome";
        var markerName = getMarkerIdent( id );
        //eval(markerName + "= new GMarker( point, " + iconName + ");");
        //-eval(markerName + "= new GMarker( where, " + iconName + ");");
	//--eval(markerName + "= new GMarker( where );");
        LocationsMarkers[ix]=new GMarker(where);
        /*
        if (where!=InvalidGeoPoint) {
          LocationsMarkers[ix]=new GMarker(where);
         } else {
          LocationsMarkers[ix]=[];
        };
        */
        //--eval(markerName + '.html = "' + html + '";');
        //html="<div>"+LocationDescriptionHTML(ix)+"</div>";
        html="<div><small>"+LocationDescriptionHTML(ix)+"</small></div>";
	LocationsMarkers[ix].html=html;
        //--eval("GEvent.addListener(" + markerName +", 'click', function() { " + markerName + ".openInfoWindowHtml(" + markerName + ".html); });");
	//alert(ix+'. '+markerName+'\n'+LocationsMarkers[ix]);
	//+GEvent.addListener(LocationsMarkers[ix], 'click', eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }') );
        //+alert('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }'+'\n'+eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }'));
	//GEvent.addListener(LocationsMarkers[ix], 'click', eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }') );
	eval("GEvent.addListener(LocationsMarkers["+ix+"], 'click', function() { LocationsMarkers["+ix+"].openInfoWindowHtml(LocationsMarkers["+ix+"].html); } );" );
        //--eval("map.addOverlay(" + markerName + ");");
        map.addOverlay(LocationsMarkers[ix]);
      /* } */

	ShowLocationsPath(Locations.length);

    }
  );
}


function ShowLocations0() {
	ShowLocationsList();
	for (var i=0;i<Locations.length;i++) {
	  //alert([Locations[i][0], Locations[i][4],Locations[i][5], "<div><b>"+Locations[i][1]+"</b><br/>"+Locations[i][2]+"<br/>Tel: "+Locations[i][3]+"</div>"]);
          //addMarker(Locations[i][0], Locations[i][4],Locations[i][5], "<div><b>"+Locations[i][1]+"</b><br/>"+Locations[i][2]+"<br/>Tel: "+Locations[i][3]+"</div>");           
	  //showAddress(Locations[i][0],Locations[i][2],"<div><b>"+Locations[i][1]+"</b><br/>"+Locations[i][2]+"<br/>Tel: "+Locations[i][3]+"</div>",Locations[i][4],Locations[i][5]);
	  showLocation(i);
	  //AddLocation(i);
        };
	//ShowLocationsList();
};


function ShowLocations() {
	ShowLocationsList();
	showLocation(0);
};


var DebugLoopCount=0;
function DebugLoop(text, ix) {
  DebugLoopCount++;
  alert('['+DebugLoopCount+']\n'+text);
};

var ShowTripPath=true;
var ShowTripBorder=true;

var ShowLocationPathDrawn=false;
function ShowLocationsPath(lenExpected,force) {
  if (force!=null) ShowLocationPathDrawn=false;
  if (ShowLocationPathDrawn==true) return;
  //alert(LocationsPathPoints.length+" ~ "+lenExpected+"\n"+LocationsPathPoints);
  if (LocationsPathPoints.length<lenExpected) return;
  for (var i=0;i<LocationsPathPoints.length;i++) {
    if (LocationsPathPoints[i]==null) {
      //alert("found "+i+" null point");
      return;
    };
  };  
//  if (ShowLocationPathDrawn==true) return;
  ShowLocationPathDrawn=true;
//DebugLoop('ShowLocationsPath '+lenExpected+'\n'+LocationsPathPoints+'\n'+force+':'+ShowLocationPathDrawn);
  var points=LocationsPathPointsValid();
  //LocationsPath=new GPolyline(LocationsPathPoints);
  LocationsPath=new GPolyline(points);
  if (ShowTripPath)
    map.addOverlay(LocationsPath);

  //LocationsPath.F.title='test title';

  //showPolyLineBorder(LocationsPathPoints);
  //zoomToPolyLine(LocationsPathPoints);
  if (ShowTripBorder)
    showPolyLineBorder(points);
  //-zoomToPolyLine(points);
  ZoomToTrip();
   ShowLocationsList();
  //ShowLocationPathDrawn=true;
};


function LocationsPathPointsValid() {
  //InvalidGeoPoint
  var validPoints=[];
  for (var i=0;i<LocationsPathPoints.length;i++) {
    if (LocationsPathPoints[i]==null || LocationsPathPoints[i]==InvalidGeoPoint) 
      continue;
    validPoints[validPoints.length]=LocationsPathPoints[i]
  };  
  return validPoints;
};


function zoomToPolyLine(pl) {
  if (pl.length<1) return pl; // if no points do not zoom
  var bounds = new GLatLngBounds();
  //var bounds = new GBounds();
  for (var i=0;i<pl.length;i++) {
    //alert(i+'. \n'+pl[i]+'\n'+bounds);
    bounds.extend(pl[i]); 
  };  
  //alert(bounds);
  map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds)); 
  return pl;
};


//var TripBorderColor='#0000FF';  // Blue (default )
var TripBorderColor='#FFFF00'; // Yellow
var BorderPath=null;
function showPolyLineBorder(pl, plColor) {

  var color=plColor;
  if (color==null) color=TripBorderColor;
  if (color==null) return []; //no border if color is null

  var bounds = new GLatLngBounds();
  //var bounds = new GBounds();
  for (var i=0;i<pl.length;i++) {
    //alert(i+'. \n'+pl[i]+'\n'+bounds);
    bounds.extend(pl[i]); 
  };  
  //alert(bounds);
  //map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds)); 
  //return pl;

  var border=[];

  var pSW=bounds.getSouthWest();
  var pNE=bounds.getNorthEast();
  border[0]=pSW;
  border[1]=new GLatLng(pSW.y,pNE.x);
  border[2]=pNE;
  border[3]=new GLatLng(pNE.y,pSW.x);
   border[4]=pSW;
  //alert(points);
  var line=new GPolyline(border, color);
  TripBorderPath=line;
  map.addOverlay(line);
  return border;
};

function ShowLocationsList () {
  //document.all.LocationsList.innerHTML=LocationsListHTML();
  SetElementHTML('LocationsList',LocationsListHTML());
};


var LocationsPathPoints=[];
var LocationsPath=null;
var ReZoomLabel='Re-Zoom';
function ShowLocationsPath0() {
	var points=[],point=null,lat,lon;
	var color=null, weight=null, opacity=null;
	for (var i=0;i<Locations.length;i++) {
	  lat=Locations[i][4];
	  lon=Locations[i][5];
    	  //point=new GPoint(lat,lon);
    	  point=new GLatLng(lat,lon);
	  points[points.length]=point;
//alert(points.length);
        };
	LocationsPath=new GPolyline(points,color,weight,opacity);
        //eval("map.addOverlay(LocationsPath);");
        map.addOverlay(LocationsPath);
};

function LocationsListHTML (showExtra) {
	var html="";

	html+="<center>";
	//html+='<input type="button" value="Show Trip" onClick="ZoomToTrip()" />';
	//html+='<input type="button" value="Zoom to Trip" onClick="ZoomToTrip()" />';
	//html+='<input type="button" value="Re-Zoom" onClick="ZoomToTrip()" />';
	html+='<input type="button" value="'+ReZoomLabel+'" onClick="ZoomToTrip()" />';
	html+="</center>";

	html+="<ol>";
	for (var i=0;i<Locations.length;i++) {
  	  html+="<li>";
          html+=LocationListHTML(i,showExtra);
          //html+="<br/>";
	  html+="</li>";
        };
	html+="</ol>";
	// zoom back to trip
	//html+="<br/>";

        html+=AreasListHTML(showExtra);

	return html;
};


function LocationListHTML (ix,showExtra) {
  var html="";
  //if (Locations[ix]==null) return html;
  //html+="<a href='javascript: showLocationDetails(\""+ix+"\")'>"+Locations[ix][1]+"</a>";
  //html+="<a href='javascript: showLocationDetails("+ix+")'>"+Locations[ix][1]+"</a>";
  html+="<a href='javascript: showLocationDetails("+ix+")'>";
  if (LocationsPathPoints[ix]==InvalidGeoPoint)
    html+='<font color="red">'; 
  html+=Locations[ix][1];
  if (LocationsPathPoints[ix]==InvalidGeoPoint)
    html+='</font>'; 
  html+="</a>";
  //if (Locations[ix][12]!=null && Locations[ix][12].length>0) {
  //  html+='<img src="'+Locations[ix][12]+'" height="100" border="0" align="left"/>';
  //};
  if (showExtra!=null && Locations[ix][7]!=null && Locations[ix][7].length>0) {
    html+='<br/><small><a href="'+Locations[ix][7]+'" target="_blank">details</a></small>';
  };
  if (showExtra!=null && Connections[ix]!=null) {
    html+='<br/>'+ConnectionDescriptionHTML(ix);
    //html+='<br/>'+'<table><tr><td>'ConnectionDescriptionHTML(ix)+'</td></tr></table>';
  };
  //html+="<br/>";
  return html;
};

function URLnoBlanks(url) {
  var r=url;
  //return url;
  //return url.replace(/ /g,'%20');
  //return url.replace(/ /g,'%20');
  //return url.replace(/ /g,'+');
  r=r.replace(/\t/g,'%20');
  r=r.replace(/ /g,'%20');
  r=r.replace(/#/g,'%23');
  return r;
}; 

function LocationDescriptionHTML (ix) {
  var html="";
  //if (Locations[ix]==null) return html;
  var id,name,address,tel,html,lat,lon, description, detailsURL,imageUrl;
  id=Locations[ix][0];
  name=Locations[ix][1];
  address=Locations[ix][2];
  tel=Locations[ix][3];
  lon=Locations[ix][4];
  lat=Locations[ix][5];
  //alert(Locations[ix]+'\n'+lon+'\n'+lat);
  description=Locations[ix][6];
  // description=(''+description).replace(/\n/g,'<br/>\n');
  detailsURL=Locations[ix][7];
  dateStart=Locations[ix][8];
  timeStart=Locations[ix][9];
  dateEnd=Locations[ix][10];
  timeEnd=Locations[ix][11];
  imageUrl=Locations[ix][12];
  //description=Locations[ix][6];
  // http://maps.google.com/maps?&ll=35.962446,-77.817535
  var LatLonURL='';
//alert(ix+'.'+name+'\n'+LocationsUseLatLon[ix]+'\n'+(LocationsUseLatLon[ix]==false)+'\n'+lat+'\n'+lon);
  if (lat!=null && lat!='' && lon!=null && lon!='') {
  //if (LocationsUseLatLon[ix]==false) {
  //if (lat!=null && LocationsUseLatLon[ix]==false) {
    LatLonURL='http://maps.google.com/maps?&ll='+lat+','+lon+'';
   } else {
    //var addressMap=address;
    //addressMap=address.replace(/ /g,'%20');
    //LatLonURL='http://maps.google.com/maps?&q='+addressMap;
    //LatLonURL='http://maps.google.com/maps?&q='+address;
    LatLonURL='http://maps.google.com/maps?f=q&hl=en&q='+address;
    if (address=='') LatLonURL+=name;
    //alert(LatLonURL);
  };
  LatLonURL=URLnoBlanks(LatLonURL);
  //alert(LatLonURL);
  //var LatLonIcon='LNPRidlûüýþw~ë';
  var LatLonText='i';
  var LatLonHTML='<a href='+LatLonURL+' target="_blank"><font face="webdings" style="{text-decoration: none;}">'+LatLonText+'</font></a>';
  //var LatLonTextShow='l';
  //LatLonHTML+='<a href="javascript:alert(\'Latitude, Longitude:\\n'+lat+', '+lon+'\')"><font face="webdings" style="{text-decoration: none;}">'+LatLonTextShow+'</font></a>';
  if (lat!=null && lat!='' && lon!=null && lon!='') {
  //if (LocationsUseLatLon[ix]==false) {
    LatLonHTML+=' <br/>['+'<a href='+LatLonURL+' target="_blank" style="text-decoration:none;">'+lat+', '+lon+'</a>'+']';
  }

  if (description==null) description="";
  //html="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html="";
  html+='<table 0border="1"><tr><td><big>';
//alert(imageUrl+'\n'+Locations[ix]);
  if (imageUrl!=null && imageUrl.length>0) {
    html+='<img src="'+imageUrl+'" height="100" border="0" align="left" style="{margin-right: 2px;}" />';
    //html+='</td><td>';
  };
  if (detailsURL!=null && detailsURL.length>0) {
    //html+='<br/><a href="'+detailsURL+'" target="_blank">details</a>';
    html+='<a href="'+detailsURL+'" target="_blank">';
  };
  html+="<b>"+name+"</b>";
  if (detailsURL!=null && detailsURL.length>0) {
    //html+='<br/><a href="'+detailsURL+'" target="_blank">details</a>';
    html+='</a>';
  };
  if (dateStart!=null && dateStart.length>0) {
    html+=' '+dateStart;
  };
  if (timeStart!=null && timeStart.length>0) {
    html+=' '+timeStart;
  };
  if ((dateEnd!=null && dateEnd.length>0) || (timeEnd!=null && timeEnd.length>0)) {
    html+=' - ';
  };
  if (dateEnd!=null && dateEnd.length>0) {
    //html+=' - '+dateEnd;
    html+=' '+dateEnd;
  };
  if (timeEnd!=null && timeEnd.length>0) {
    html+=' '+timeEnd;
  };
  html+=" "+LatLonHTML;

  //html+="<br/>"+address;
  if (address!=null && address.length>0) {
    html+="<br/>"+address;
  };
  if (tel!=null && tel.length>0) {
    html+="<br/>Tel: "+tel;
  };
  if (description!=null && description.length>0) {
    //html+="<br/>"+description;
    html+="<br/>"+description.replace(/\n/g,'<br/>\n');
  };
  //if (detailsURL!=null && detailsURL.length>0) {
  //  html+='<br/><a href="'+detailsURL+'" target="_blank">details</a>';
  //};
  if (Connections[ix]!=null) {
    //html+='<br/>'+ConnectionDescriptionHTML(ix);
    //html+='<br/>'+'<table><tr><td>'+ConnectionDescriptionHTML(ix)+'</td></tr></table>';
    html+='</big></td></tr><tr><td><big>';
    html+=ConnectionDescriptionHTML(ix);
  };
  //html+="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html+='</big></td></tr></table>';
  html+="";
  html="<small>"+html+"</small>";
  return html;
};

    function showLocationDetails (ix)
    // Show a marker and open it's info window
    {   
        if (LocationsPathPoints[ix]==InvalidGeoPoint) {
          var id,name,address,tel,html,lat,lon, description;
          id=Locations[ix][0];
          name=Locations[ix][1];
          address=Locations[ix][2];
          tel=Locations[ix][3];
          lon=Locations[ix][4];
          lat=Locations[ix][5];
          description=Locations[ix][6];
          // description=(''+description).replace(/\n/g,'<br/>\n');
          //alert(InvalidGeoPointMessage+' ['+ix+']');
          //alert('Cannot map point'+' ['+ix+']');
          //alert('Cannot map point'+' ['+(ix+1)+']');
          //alert(InvalidGeoPointMessage+" ["+(ix+1)+"] "+name+"\n"+address+"\nfix the address or use latitude longitude");
          alert('Cannot map'+" ["+(ix+1)+"] "+name+"\n"+address+"\nfix the address or use latitude longitude");
          return;
        };
        map.closeInfoWindow(); // else get problems
        var marker = getMarkerIdent( Locations[ix][0] );
        //--eval(marker + ".openInfoWindowHtml(" + marker + ".html);");
        LocationsMarkers[ix].openInfoWindowHtml(LocationsMarkers[ix].html);
        //eval("GEvent.trigger(" + marker + ", click)");
    }



// /Locations

// Connections
ix=0;
var connectionIndexIndex=ix++;	//0
var connectionIndexName=ix++;	//1
var connectionIndexText=ix++;	//2
var connectionIndexDetailsUrl=ix++;	//3
var connectionIndexTransportType=ix++;	//4
var connectionIndexCompany=ix++;	//5
var connectionIndexId=ix++;	//6
var connectionIndexDateStart=ix++;	//7
var connectionIndexTimeStart=ix++;	//8
var connectionIndexDateEnd=ix++;	//9
var connectionIndexTimeEnd=ix++;	//10
var connectionIndexDuration=ix++;	//11
var connectionIndexDescription=ix++;	//12
var connectionIndexImageUrl=ix++;	//13


    // Connections[Connections.length]=[index, name, text, (url), (transportType), (company), (id), (dateStart), (timeStart), (dateEnd), (timeEnd), (duration), (description), [points] ];
function ConnectionDescriptionHTML (ix) {
  var html="";
  //if (Locations[ix]==null) return html;
  var id,name,points=[],html, description, index, text,url,transportType,company,transportId,dateStart,timeStart,dateEnd,timeEnd, duration,imageUrl;
  var fromL, toL;
  fromL=Locations[ix][1];
  toL='';
  if (ix<Locations.length) toL=Locations[ix+1][1];
  index=Connections[ix][0];
  name=Connections[ix][1];
  text=Connections[ix][2];
  url=Connections[ix][3];
  transportType=Connections[ix][4];
  company=Connections[ix][5];
  transportID=Connections[ix][6];
  dateStart=Connections[ix][7];
  timeStart=Connections[ix][8];
  dateEnd=Connections[ix][9];
  timeEnd=Connections[ix][10];
  duration=Connections[ix][11];
  description=Connections[ix][12];
  // description=(''+description).replace(/\n/g,'<br/>\n');
  imageUrl=Connections[ix][13];
  if (description==null) description="";

/*
alert(
'index:['+index+']\n'+
'name:['+name+']\n'+
'text:['+text+']\n'+
'url:['+url+']\n'+
'transportType:['+transportType+']\n'+
'company:['+company+']\n'+
'transportID:['+transportID+']\n'+
'dateStart:['+dateStart+']\n'+
'timeStart:['+timeStart+']\n'+
'dateEnd:['+dateEnd+']\n'+
'timeEnd:['+timeEnd+']\n'+
'duration:['+duration+']\n'+
'description:['+description+']\n'
);
*/

  points=Connections[ix][13];
  //html="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html="";
  if (imageUrl!=null && imageUrl.length>0) {
    html+='<img src="'+imageUrl+'" height="100" border="0" align="left" style="{margin-right: 2px;}" />';
  };
  if (url!=null && url.length>0) {
    //html+='<br/><a href="'+url+'" target="_blank">connection details</a>';
    html+='<a href="'+url+'" target="_blank">';
  };
  html+="from <b>"+fromL+"</b> to <b>"+toL+"</b>";
  if (url!=null && url.length>0) {
    //html+='<br/><a href="'+url+'" target="_blank">connection details</a>';
    html+='</a>';
  };

  html+="<br><b>"+name+"</b>";
  //if (url!=null && url.length>0) {
  //  html+='<br/><a href="'+url+'" target="_blank">connection details</a>';
  //};
  html+='<br/>';
  if (transportType!=null && transportType.length>0) {
    html+=' '+transportType;
  };
  if (company!=null && company.length>0) {
    html+=' '+company;
  };
  if (transportID!=null && transportID.length>0) {
    html+=' '+transportID;
  };
  if (dateStart!=null && dateStart.length>0) {
    html+=' '+dateStart;
  };
  if (timeStart!=null && timeStart.length>0) {
    html+=' '+timeStart;
  };
  if ((dateEnd!=null && dateEnd.length>0) || (timeEnd!=null && timeEnd.length>0)) {
    html+=' - ';
  };
  if (dateEnd!=null && dateEnd.length>0) {
    //html+=' - '+dateEnd;
    html+=' '+dateEnd;
  };
  if (timeEnd!=null && timeEnd.length>0) {
    html+=' '+timeEnd;
  };
  if (duration!=null && duration.length>0) {
    html+=' duration '+duration;
  };
  if (text!=null && text.length>0) {
    html+="<br/>"+text;
  };
  if (description!=null && description.length>0) {
    //html+="<br/>"+description;
    html+="<br/>"+description.replace(/\n/g,'<br/>\n');
  };
  //html+="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html+="";
  html="<small>"+html+"</small>";
  return html;
};


/*
//Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a" ];	
//var Connections=[ ['indexStart','name', points[], 'description' ], ...  ];
var Connections=[];
var ConnectionsMarkers=[];
var ConnectionsMarkersHTML=[];

function ConnectionsFromLocations() {
	var connection, points,point,pline,lat,lon;
	Connections=[];	
	for (var i=0;i<Locations.length-1;i++) {
          connection=[];
	  connection[0]="connection_"+Locations[i][0];
	  connection[1]=""+Locations[i][1]+" - "+Locations[i+1][1];
	  points=[];
	  // from
	  lon=Locations[i][4];
	  lat=Locations[i][5];
    	  point=new GLatLng(lat,lon);
	  points[points.length]=point;
	  // to
	  lon=Locations[i][4];
	  lat=Locations[i][5];
    	  point=new GLatLng(lat,lon);
	  points[points.length]=point;

	  pline=new GPolyline(points);

	  connection[2]=pline;
	
	  connection[3]="no description";
	  Connections[Connections.length]=connection;
        };
};

function showConnection(ix) {
//var Connections=[ ['indexStart','name', points[], 'description' ], ...  ];
  var id,name,pline, description, html;
  id=Connections[ix][0];
  name=Connections[ix][1];
  pline=Locations[ix][2];
  description=Locations[ix][3];
  if (description==null) description="";
  html="<div>"+ConnectionDescriptionHTML(ix)+"</div>";

  //LocationsPath=new GPolyline(points,color,weight,opacity);
        //eval("map.addOverlay(LocationsPath);");

  ConnectionsMarkers[ix]=pline;
  ConnectionsMarkersHTML[ix]=pline;

  //+GEvent.addListener(LocationsMarkers[ix], 'click', eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }') );
  //+alert('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }'+'\n'+eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }'));
  //GEvent.addListener(LocationsMarkers[ix], 'click', eval('function() { LocationsMarkers['+ix+'].openInfoWindowHtml(LocationsMarkers['+ix+'].html); }') );
  //-eval("GEvent.addListener(ConnectionsMarkers["+ix+"], 'click', function() { ConnectionsMarkers["+ix+"].openInfoWindowHtml(ConnectionsMarkersHTML["+ix+"]); } );" );
  //eval("GEvent.addListener(ConnectionsMarkers["+ix+"], 'mouseover', function() { ConnectionsMarkers["+ix+"].openInfoWindowHtml(ConnectionsMarkersHTML["+ix+"]); } );" );
  map.addOverlay(ConnectionsMarkers[ix]);
  
  //ConnectionsMarkers[ix].F.title=html;
  ConnectionsMarkers[ix].F.title='polyline description: '+ix;

}

function ShowConnections() {
	//ConnectionsFromLocations()
	for (var i=0;i<Locations.length;i++) {
	  //alert([Locations[i][0], Locations[i][4],Locations[i][5], "<div><b>"+Locations[i][1]+"</b><br/>"+Locations[i][2]+"<br/>Tel: "+Locations[i][3]+"</div>"]);
          //addMarker(Locations[i][0], Locations[i][4],Locations[i][5], "<div><b>"+Locations[i][1]+"</b><br/>"+Locations[i][2]+"<br/>Tel: "+Locations[i][3]+"</div>");           
	  //showAddress(Locations[i][0],Locations[i][2],"<div><b>"+Locations[i][1]+"</b><br/>"+Locations[i][2]+"<br/>Tel: "+Locations[i][3]+"</div>",Locations[i][4],Locations[i][5]);
	  showLocation(i);
	  //AddLocation(i);
        };
	//ShowLocationsList();
};


function ConnectionDescriptionHTML (ix) {
  var html="";
  //if (Locations[ix]==null) return html;
  var id,name,points=[],html, description;
  id=Connections[ix][0];
  name=Connections[ix][1];
  points=Connections[ix][2];
  description=Locations[ix][6];
  if (description==null) description="";
  //html="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html="";
  html+="<b>"+name+"</b>";
  if (description!=null && description.length>0) {
    //html+="<br/>"+description;
    html+="<br/>"+description.replace(/\n/g,'<br/>\n');
  };
  //html+="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html+="";
  html="<small>"+html+"</small>";
  return html;
};
*/

// /Connections

// TripData
ix=0;
var tripIndexName=ix++;	//0
var tripIndexText=ix++;	//1
var tripIndexDetailsUrl=ix++;	//2
var tripIndexImageUrl=ix++;	//3
var tripIndexdateStart=ix++;	//4
var tripIndexTimeStart=ix++;	//5
var tripIndexDateEnd=ix++;	//6
var tripIndexTimeEnd=ix++;	//7
var tripIndexTel=ix++;	//8


    // TripData=[ name, text, (url), (imageURL), (dateStart), (timeStart), (dateEnd), (timeEnd) ];
function TripDataHTML () {
  var html="";
  //if (Locations[ix]==null) return html;
  var id,name,text,html,url,imageURL,dateStart,timeStart,dateEnd,timeEnd, description;
  name=TripData[0];
  text=TripData[1];
  url=TripData[2];
  imageURL=TripData[3];
  dateStart=TripData[4];
  timeStart=TripData[5];
  dateEnd=TripData[6];
  timeEnd=TripData[7];
  description=TripData[8];
  if (description==null) description="";
  //html="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html="";
  //html+="Trip: <b>"+name+"</b>";
  //html+="trip: ";

  if (url!=null && url.length>0) {
    //html+='<br/><a href="'+url+'" target="_blank">trip details</a>';
    html+='<a href="'+url+'" target="_blank">';
  };
  html+="<b>"+name+"</b>";
  if (url!=null && url.length>0) {
    html+='</a>';
  };
  html+='<br/>';
  if (dateStart!=null && dateStart.length>0) {
    html+=' '+dateStart;
  };
  if (timeStart!=null && timeStart.length>0) {
    html+=' '+timeStart;
  };
  if ((dateEnd!=null && dateEnd.length>0) || (timeEnd!=null && timeEnd.length>0)) {
    html+=' - ';
  };
  if (dateEnd!=null && dateEnd.length>0) {
    //html+=' - '+dateEnd;
    html+=' '+dateEnd;
  };
  if (timeEnd!=null && timeEnd.length>0) {
    html+=' '+timeEnd;
  };

  if (description!=null && description.length>0) {
    //html+="<br/>"+description;
    html+="<br/>"+description.replace(/\n/g,'<br/>\n');
  };

  if (text!=null && text.length>0) {
    //html+='<br/>'+text;
    html+="<br/>"+text.replace(/\n/g,'<br/>\n');
  };
  //if (url!=null && url.length>0) {
  //  html+='<br/><a href="'+url+'" target="_blank">trip details</a>';
  //};
  if (imageURL!=null && imageURL.length>0) {
    html+='<br/><img src="'+imageURL+'"/>';
  };

  //html+="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  //html+=LocationsListHTML(true);
  //-html+='<ol>';
  for (i=0;i<Locations.length;i++) {
    //-html+='<li>';
    //-html+='<big>';
    html+='<table><tr><td valign="top">'+(i+1)+'.</td><td>';
    html+=LocationDescriptionHTML(i);
//alert(LocationDescriptionHTML(i));
    html+='</td></tr></table>';
    //-html+='</big>';
    //-html+='</li>';
  };
  //html+='</ol>';
  html+="";
  //html="<small>"+html+"</small>";
  return html;
};

function ShowTripData() {
  var tripTitle=TripData[0];
  //tripTitle='Trip: '+tripTitle;
  //document.all.TripTitle.innerHTML=tripTitle;
  SetElementHTML('TripTitle',tripTitle);
  //document.all.TripDescription.innerHTML=TripDataHTML();
  SetElementHTML('TripDescription',TripDataHTML());
};


// /TripData


// RandomPolyLine

function RandomPolyline() {
  var bounds = map.getBounds();
  var southWest = bounds.getSouthWest();
  var northEast = bounds.getNorthEast();
  var lngSpan = northEast.lng() - southWest.lng();
  var latSpan = northEast.lat() - southWest.lat();

  // Add a polyline with five random points. Sort the points by
  // longitude so that the line does not intersect itself.
  var points = [];
  for (var i = 0; i < 5; i++) {
    points.push(new GLatLng(southWest.lat() + latSpan * Math.random(),
                          southWest.lng() + lngSpan * Math.random()));
  }
  points.sort(function(p1, p2) {
    return p1.lng() - p2.lng();
  });
  map.addOverlay(new GPolyline(points));
};

// /RandomPolyLine

// LoadPage not

    function onLoad0()
    {
        // create the map in the 'map' div
        map = new GMap(document.getElementById("map"));
        //map.addControl(new GSmallMapControl());
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
	//map.setMapType(G_HYBRID_TYPE);
	map.setMapType(G_HYBRID_MAP);
        map.centerAndZoom(pCentre, nZoom);
        //map.centerAndZoom(pCentre, nZoom);


	//ShowLocations();
	//ShowLocationsPath();
	TripDisplay();

        // Open info window for a marker
        //showMarker("mHele");
    };

// /LoadPage not


// Trip
    
//Trip: xml, or javascript or text
// - id, name, dateStart, dateEnd
// - Locations
// -- id, name, address, (lat), (lon), description
// --- accomodation 
// --- activities
// - Connections (between locations) (n-1 locations)
// -- transport, time,  
// --- transport
// --- 
// - notes (attached to Location or Connection)
// -- Description, url, te
// --- pictures
// --- Diary entries

var TripTXT;

var TripXML;
//if ((TripXML==null || TripXML=='') && (TripTXT==null || TripTXT=='')) TripXML='Trip.xml';


var Trip=new Object();
Trip.Locations=[];
Trip.Connections=[];
Trip.Trip=[];
Trip.Areas=[];

//var TripXMLdocument=null;
var TripXMLdocument;
// ?TripXMLdocument=window.opener.TripXMLdocument;

function GetTripXML(url, pathIn) {
  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml;
//alert('txd:'+TripXMLdocument+'\n'+(TripXMLdocument==null));
  if (TripXMLdocument==null) {
    //xml = new ActiveXObject("Microsoft.XMLDOM");
    xml=GetXMLDOM();
//alert('txd:'+xml.load);
    //-var xml = new ActiveXObject("Msxml2.DOMDocument.3.0");
    xml.async = false;
    //-xml.async = 'false';
    //xml.load(path+url);
    //-xml.load(path+url);
    //-xml=xmlLoad(path+url,xml);
    xml=xml_load(path+url,xml);
//alert(xml.xml);
    TripXMLdocument=xml;
   } else {
    xml=TripXMLdocument;
  };
//alert(xml.xml);
  return xml;
};


TripLocationsXSL='Trip2Locations.xsl';
// //[[index, name, address, tel, (lat), (long), text, (url), (dateStart), (timeStart), (dateEnd), (timeEnd)]]
// [[index, name, address, tel, (lat), (long), text, (url), (dateStart), (timeStart), (dateEnd), (timeEnd), (image),(pushpinImage)]]
function TripLocationsXML(url,pathIn) {
  var locationsJS="";
  var locations=[];
  // load locations xsl

  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml=GetTripXML(url,pathIn);
/*
  if (TripXMLdocument==null) {
    xml = new ActiveXObject("Microsoft.XMLDOM");
    //-var xml = new ActiveXObject("Msxml2.DOMDocument.3.0");
    xml.async = false;
    xml.load(path+url);
    TripXMLdocument=xml;
   } else {
    xml=TripXMLdocument;
  };
*/
  // Load XSL
  //var xsl = new ActiveXObject("Microsoft.XMLDOM");
  var xsl=GetXMLDOM();
  //-var xsl = new ActiveXObject("Msxml2.DOMDocument.3.0");
  xsl.async = false;
  //alert(path+ClientsTest2MenuXSL);
  xsl.load(path+TripLocationsXSL);
  //var xsl=LoadXMLfile(path+TripLocationsXSL);
  //alert(siteMap2MenuXSL+'\n'+xsl.text);
  //alert(domainsURL+'\n'+xml.xml);
  //transform xml with xsl to JS
  //locationsJS=locationsJS+xml.transformNode(xsl);
   
  //var xslTxt=TEXTload(path+TripLocationsXSL);
//alert(xslTxt);
  //xsl=String2XML(xslTxt);

  var xslt=locationsJS+TransformXML4XSL(xml,xsl);
  //var xslt=TransformXML4XSLfile(xml, path+TripLocationsXSL);
//alert(xslt);
  locationsJS=locationsJS+xslt;

  //alert(locationsJS);

  locations=eval(locationsJS);

  locations=LocationsDescriptionFix(locations);
  Trip.Locations=locations;
  return Trip.Locations;
};

function LocationsDescriptionFix(locs) {
  var l,d;
  for (var i=0;i<locs.length;i++) {    
    l=locs[i];
    if (l==null) continue;
    //d=l[6];
    //d=d.replace(/&lt;/g,'<');
    //d=d.replace(/&gt;/g,'>');
    //l[6]=d;
    l[6]=XML2HTMLtxt(l[6]);
  };
  return locs;
};

function XML2HTMLtxt (txt) {
  var html=txt;
  if (html==null) return '';
  html=html.replace(/&lt;/g,'<');
  html=html.replace(/&gt;/g,'>');
  return html;
};


TripConnectionsXSL='Trip2Connections.xsl';
// [[index, name, text, (url), (transportType), (company), (id), (dateStart), (timeStart), (dateEnd), (timeEnd), (duration), (description) ]]
function TripConnectionsXML(url,pathIn) {
  var connectionsJS="";
  var connections=[];
  // load locations xsl

  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml=GetTripXML(url,pathIn);
  // Load XSL
  //var xsl = new ActiveXObject("Microsoft.XMLDOM");
  var xsl=GetXMLDOM();
  //-var xsl = new ActiveXObject("Msxml2.DOMDocument.3.0");
  xsl.async = false;
  //alert('['+path+TripConnectionsXSL+']');
  xsl.load(path+TripConnectionsXSL);
  //alert(xsl.xml);
  //alert(siteMap2MenuXSL+'\n'+xsl.text);
  //alert(domainsURL+'\n'+xml.xml);
  //transform xml with xsl to JS
  //connectionsJS=connectionsJS+xml.transformNode(xsl);
  connectionsJS=connectionsJS+TransformXML4XSL(xml,xsl);
//alert(connectionsJS);
  //alert(locationsJS);

  connections=eval(connectionsJS);
//alert(connections);
  Trip.Connections=connections;
  return Trip.Connections;
};


TripTripXSL='Trip2Trip.xsl';
// [ name, text, (url), (imageURL), (dateStart), (timeStart), (dateEnd), (timeEnd) ]]
function TripTripXML(url,pathIn) {
  var tripJS="";
  var trip=[];
  // load locations xsl

  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml=GetTripXML(url,pathIn);
  // Load XSL
  //var xsl = new ActiveXObject("Microsoft.XMLDOM");
  var xsl=GetXMLDOM();
  //-var xsl = new ActiveXObject("Msxml2.DOMDocument.3.0");
  xsl.async = false;
  //alert(path+ClientsTest2MenuXSL);
  xsl.load(path+TripTripXSL);
  //alert(siteMap2MenuXSL+'\n'+xsl.text);
  //alert(domainsURL+'\n'+xml.xml);
  //transform xml with xsl to JS
  //tripJS=tripJS+xml.transformNode(xsl);
  tripJS=tripJS+TransformXML4XSL(xml,xsl);
  //alert(locationsJS);

  trip=eval(tripJS);
  Trip.Trip=trip;
  return Trip.Trip;
};




function TripLocationsTXT (url, pathIn) {
  var locationsJS="";
  var locations=[];
  // load locations xsl

  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // TODO: Load TXT 
  var lines=[];

  //
  var tripName, tripDateFrom, tripDateTo;
  if (lines.length>0) tripName=lines[0];
  if (lines.length>1) {
    var dates=lines[1].split();
    if (dates.length>0) tripDateFrom=dates[0];
    if (dates.length>1) tripDateTo=dates[1];
  };

  var location=[];
  var id, name, dateFrom, dateTo, address, description, lat, lon;
  var i=0;
  i=3;
  while (i<lines.lenght) {
    id='loation'+(locations.length+1);
    name=lines[i++];
    if (i>=lines.length) break;
    dateFrom=lines[i++];
    dateTo=dateFrom;
    if (i>=lines.length) break;
    address=lines[i++];
    if (i>=lines.length) break;
    description=lines[i++];
    if (i>=lines.length) break;
    lat=parseFloat(lines[i++]);
    if (isNAN(lat)) lat=null;
    if (i>=lines.length) break;
    lon=parseFloat(lines[i++]);
    if (isNAN(lon)) lon=null;
    // -- id, name, address, (lat), (lon), description
    locations[locations.length]=[id,name,address,lat,lon,description];
    i++; // blank line
  };  

  //-locationsJS=locationsJS+xml.transformNode(xsl);
  //alert(locationsJS);

  //-locations=eval(locationsJS);
  Trip.Locations=locations;
  return Trip.Locations;
}


function TripLocations2Locations (tl) {
  var l=[];
  if (tl==null) return l;
  for (var i=0;i<tl.length-1;i++) {
    //l[tl[i][0]]=[ tl[i][1], tl[i][2], tl[i][3], tl[i][4], tl[i][5], tl[i][6] ];
    //l[tl[i][0]-1]=[ tl[i][1], tl[i][2], tl[i][3], tl[i][4], tl[i][5], tl[i][6] ];
    //Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsUrl" ];	
    // -- id, name, address, tel, (lat), (lon), description, detailsURL, dateStart timeStart dateEnd timeEnd
//alert(i+'. '+tl[i][0]+' '+tl[i][1]+'\n'+tl[i][2]+" no tel "+'\n'+tl[i][3]+' @ '+tl[i][4]+'\n'+tl[i][5]+' '+tl[i][6] );
    //l[tl[i][0]-1]=[ markerId(tl[i][0]), tl[i][1], tl[i][2], "no tel", tl[i][3], tl[i][4], tl[i][5] ];
    //-l[tl[i][0]-1]=[ markerId(tl[i][0]), tl[i][1], tl[i][2], tl[i][3], tl[i][4], tl[i][5], tl[i][6], tl[i][7],  tl[i][8],tl[i][9],tl[i][10],tl[i][11], ];
    //l[tl[i][0]-1]=[ markerId(tl[i][0]), tl[i][1], tl[i][2], tl[i][3], tl[i][4], tl[i][5], tl[i][6], tl[i][7],  tl[i][8],tl[i][9],tl[i][10],tl[i][11], tl[i][12],];
    l[tl[i][0]-1]=[ markerId(tl[i][0]), tl[i][1], tl[i][2], tl[i][3], tl[i][4], tl[i][5], tl[i][6], tl[i][7],  tl[i][8],tl[i][9],tl[i][10],tl[i][11], tl[i][12],tl[i][13],];
  };
  return l;
};

function Trip2Connections(cs) {
  var c=[];
  if (cs==null) return c;
  for (var i=0;i<cs.length-1;i++) {
    c[cs[i][0]-1]=cs[i];
  };
  return c;
};


var NewTrip= [ '', '', '', '', '', '', '', '' ];
// [ name, text, (url), (imageURL), (dateStart), (timeStart), (dateEnd), (timeEnd) ]

function Trip2Trip(td) {
  if (td==null) return NewTrip;
  return td;
};


function markerId(index) {
  return "tripLocation"+index;
};

/*
TripConnectionsXSL='TripConnections.xsl';
Trip.Connections=[];
// [[indexLocationStart, name, html]]
function TripConnections(xml) {
};
*/


function TripDisplay() {
  var locations=[];
  var connections=[];
  // Display Locations

  Locations=TripLocations2Locations(TripLocationsXML(TripXML));
  Connections=Trip2Connections(TripConnectionsXML(TripXML));
  Areas=Trip2Areas(TripAreasXML(TripXML));

  //alert('Td: '+Connections);
  //alert(Locations);
  ShowAreas();
  ShowLocations();

  TripData=Trip2Trip(TripTripXML(TripXML));
  ShowTripData();

  // Display Connections
  //ZoomToTrip();

};


function ZoomToTrip() {
  //zoomToPolyLine(LocationsPathPoints);
  var points=LocationsPathPointsValid();
  if (AreasBoundaries.length>0) {
    var b;
    for (var i=0;i<AreasBoundaries.length;i++) {
      if (AreasBoundaries[i]==null) continue;
      b=AreasBoundaries[i].getBounds();
      points[points.length]=b.getSouthWest();
      points[points.length]=b.getNorthEast();
    };
  };
  zoomToPolyLine(points);
};


// Override: avoid use of xls for Firefox compatibility
// no xsl

function TripConnectionsXML(url,pathIn) {
  // load locations xsl

  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml=GetTripXML(url,pathIn);

  // build connection
  return TripConnectionsXMLdoc(xml);
};

function TripConnectionsXMLdoc(xml) {
  var connections=[];
  //var lXML=xml.getElementsByTagName('Connections/Connection');
  var lXML=xml.getElementsByTagName('Connection');

    // Connections[Connections.length]=[index, name, text, (url), (transportType), (company), (id), (dateStart), (timeStart), (dateEnd), (timeEnd), (duration), (description) ];
  var l,lts,lt,index, name, text, url, transportType, company,id, ds,ts,de,te, duration, description, imageUrl;
  for (i=0;i<lXML.length;i++) {
    l=lXML[i];
    index, name, text, url, transportType, company, ds,ts,de,te, duration, description;    
    index=l.getAttribute('indexStartLocation');
    name=l.getAttribute('Name');
    text=getElementByTagName(l,'Address');
    url=getElementByTagName(l,'DetailsURL');
    lts=l.getElementsByTagName('Transportation');
    if (lts!=null && lts.length>0) {
      lt=lts[0];
      transportType=lt.getAttribute('transportType');
      company=lt.getAttribute('transportCompany');
      id=lt.getAttribute('transportID');
      ds=lt.getAttribute('dateStart');
      ts=lt.getAttribute('timeStart')
      de=lt.getAttribute('dateEnd');
      te=lt.getAttribute('timeEnd');
      duration=lt.getAttribute('duration');
      description=getElementByTagName(lt,'Description');
      imageUrl=getElementByTagName(l,'ImageURL');
     } else {
      transportType='';
      company='';
      id='';
      ds='';
      ts='';
      de='';
      te='';
      duration='';
      description='';
      imageUrl='';
    };
    connections[connections.length]=[index, name, text, url, transportType, company, id, ds,ts,de,te, duration, description,imageUrl];    
//alert(i+'. '+connections[connections.length-1]);
  }
  connections[connections.length]=null;    

  //alert('connections:'+connections.length)

  //connections=LocationsDescriptionFix(locations);
  Trip.Connections=connections;
  return Trip.Connections;
};

function TripTripXML(url,pathIn) {
  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml=GetTripXML(url,pathIn);
  
  return TripTripXMLdoc(xml);

};


function TripTripXMLdoc(xml) {
  var trip=[];
  var name,description,DetailsURL,ImageURL,ds,ts,de,te;
  var lXML=xml.getElementsByTagName('Trip');
  var l=lXML[0];
//alert('ttxd:'+xml+'\n'+l);
  if (l==null) return;
  name=l.getAttribute('Name');
  description=getElementByTagName(l,'Description');
  DetailsURL=getElementByTagName(l,'DetailsURL');
  ImageURL=getElementByTagName(l,'ImageURL');
  ds=l.getAttribute('dateStart');
  ts=l.getAttribute('timeStart')
  de=l.getAttribute('dateEnd');
  te=l.getAttribute('timeEnd');
  var trip=[name,description,DetailsURL,ImageURL,ds,ts,de,te];
  return trip;
};


function TripLocationsXML(url,pathIn) {
  // load locations xsl

  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml=GetTripXML(url,pathIn);

  // build locations
  return TripLocationsXMLdoc(xml);

};

function TripLocationsXMLdoc(xml) {
  var locations=[];
  //var lXML=xml.getElementsByTagName('Locations/Location');
  var lXML=xml.getElementsByTagName('Location');

    // Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", dateStart, timeStart, dateEnd, timeEnd ];	
    // Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", dateStart, timeStart, dateEnd, timeEnd, image, pushpinImage ];	
  var l,id,name,address,tel, lat,lon, desc, detUrl, ds,ts,de,te,notes,imageUrl,pushpinImage;
  for (i=0;i<lXML.length;i++) {
    l=lXML[i];
    id=l.getAttribute('index');
    name=l.getAttribute('Name');
    address=getElementByTagName(l,'Address');
    tel=getElementByTagName(l,'Tel');
    lat=l.getAttribute('latitude');
    lon=l.getAttribute('longitude');
    notes=getElementByTagName(l,'Notes');
    desc=getElementByTagName(l,'Description');
    detUrl=getElementByTagName(l,'DetailsURL');
    ds=l.getAttribute('dateStart');
    ts=l.getAttribute('timeStart')
    de=l.getAttribute('dateEnd');
    te=l.getAttribute('timeEnd');
    imageUrl=getElementByTagName(l,'ImageURL');
    pushpinImageUrl=l.getAttribute('pushpinImage');

    locations[locations.length]=[id,name,address,tel, lat,lon, desc, detUrl, ds,ts,de,te,imageUrl,pushpinImageUrl];    
//alert(i+'. '+locations[locations.length-1]);
  }
  locations[locations.length]=null;    

  //alert('locations:'+locations.length)

  locations=LocationsDescriptionFix(locations);
  Trip.Locations=locations;
  return Trip.Locations;
};


// Areas


function TripAreasXML(url,pathIn) {
  // load locations xsl

  var path=pathIn;
  if (path==null) path='';
// LOAD XML domains
  // Load XML 
  var xml=GetTripXML(url,pathIn);

  // build locations
  return TripAreasXMLdoc(xml);

};

function TripAreasXMLdoc(xml) {
  var areas=[];
  //var lXML=xml.getElementsByTagName('Areas/Area');
  var zXML=xml.getElementsByTagName('Area');

    // Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", dateStart, timeStart, dateEnd, timeEnd ];	
    // Areas[Areas.length]=["id","name","tel","description", "detailsURL", dateStart, timeStart, dateEnd, timeEnd, image, pushpinImage, color, [[ix, "address",longitude,latitude, pointDescription], ...], opacity ];	
  var z,id,name,address,tel, lat,lon, desc, detUrl, ds,ts,de,te,notes,imageUrl,pushpinImage, points, pXML, p, pDescription, color, pId,opacity,pointsJS;
  for (i=0;i<zXML.length;i++) {
    z=zXML[i];
    id=z.getAttribute('index');
    name=z.getAttribute('Name');
    tel=getElementByTagName(z,'Tel');
    notes=getElementByTagName(z,'Notes');
    desc=getElementByTagName(z,'Description');
    detUrl=getElementByTagName(z,'DetailsURL');
    ds=z.getAttribute('dateStart');
    ts=z.getAttribute('timeStart')
    de=z.getAttribute('dateEnd');
    te=z.getAttribute('timeEnd');
    imageUrl=getElementByTagName(z,'ImageURL');
    pushpinImageUrl=z.getAttribute('pushpinImage');
    color=z.getAttribute('color');
    if (color==null) color=RandomColor();
    opacity=z.getAttribute('opacity');
    if (opacity==null) opacity=AreasDefaultOpacity;

    points=[];
    pointsListJS=getElementByTagName(z,'PointsList');
    //alert(i+'. ['+pointsListJS+']');

    if (pointsListJS!=null && pointsListJS!=undefined && pointsListJS!='') {
      var pointsListArray=eval(pointsListJS);
      //alert(pointsListArray);
      for (var j=0;j<pointsListArray.length;j++) {
        pId=(j+1);
        address=null;
        p=pointsListArray[j];
        lat=p[0];
        lon=p[1];
        pDescription=null;
        points[points.length]=[pId,address,lat,lon,pDescription];      
      };
//alert(points);
     } else {
      //pXML=z.getElementsByTagName('Location');
      pXML=z.getElementsByTagName('Point');
      for (var j=0;j<pXML.length;j++) {
        p=pXML[j];
        pId=p.getAttribute('index');
        address=getElementByTagName(p,'Address');
        lat=p.getAttribute('latitude');
        lon=p.getAttribute('longitude');
        pDescription=getElementByTagName(p,'Description');
        //points[points.length]=[j,address,lat,lon,pDescription]      
        points[points.length]=[pId,address,lat,lon,pDescription]      
      };
    };

    areas[areas.length]=[id,name,tel, desc, detUrl, ds,ts,de,te,imageUrl,pushpinImageUrl, color, points, opacity];    
//alert(i+'. '+locations[locations.length-1]);
  }
  areas[areas.length]=null;    

  //alert('locations:'+locations.length)

  areas=AreasDescriptionFix(areas);
  Trip.Areas=areas;
  return Trip.Areas;
};


function AreasDescriptionFix(areas) {
  var z,d,p,ps;
  for (var i=0;i<areas.length;i++) {    
    z=areas[i];
    if (z==null) continue;
    //d=l[6];
    //d=d.replace(/&lt;/g,'<');
    //d=d.replace(/&gt;/g,'>');
    //l[6]=d;
    z[3]=XML2HTMLtxt(z[3]);
    ps=z[12];
//alert(ps);
    if (ps==null) ps=[];
    for (var j=0;j<ps.length;j++) {
      p=ps[j];
      if (p==null) p=[];
      p[4]=XML2HTMLtxt(p[4]);
    };
  };
  return areas;
};

var AreasBoundaries=[];
AreasBoundariesPoint=[];
//var AreasBoundariesPoints=[];
function ShowAreas (areasIn) {
  var areas=areasIn;
  if (areas==null) areas=Areas;
  for (var i=0;i<areas.length;i++) {
    ShowArea(i,areas);
  };
  return AreasBoundaries;
};

function AreaBoundariesPoints(boundaryArray) {
  //var pArray=[];
  var pArray=[];
  //alert('zoneBoundary \n'+boundaryArray);
  if (boundaryArray==null || boundaryArray.length<1) return pArray;
  //pArray=[];
  var lat,lon, point;
  for (var i=0;i<boundaryArray.length;i++) {
    lat=boundaryArray[i][2];
    lon=boundaryArray[i][3];
    point=new GLatLng(lat,lon);
    pArray[pArray.length]=point;
  };
  pArray[pArray.length]=pArray[0];
  return pArray;
};


var AreasDefaultBorderOpacity=0.7;
var AreasDefaultOpacity=0.4;
function ShowArea(ix,areasIn) {
  var areas=areasIn;
  if (areas==null) areas=Areas;
  var border=AreaBoundariesPoints(areas[ix][12]);
  if (border==null || border.length<1) return null;

  var borderPoint0=border[0];

  var color=areas[ix][11];
  var opacity=areas[ix][13];
  //var line=new GPolygon(points);
  //var line=new GPolyline(points,color);
  //var line=new GPolygon(points,c,3, 0.7 ,c, 0.4);
  //var line=new GPolygon(border,color,3, 0.7 ,color, 0.4);
  //var line=new GPolygon(border,color,3, 0.7 ,color, opacity);
  var polygon=new GPolygon(border,color,3, AreasDefaultBorderOpacity ,color, opacity);

  AreasBoundaries[ix]=polygon;
  map.addOverlay(polygon);

  AreasBoundariesPoint[ix]=borderPoint0;
  // Add point to map with Zone description.
  showAreaMarker(ix);
    
  return AreasBoundaries[ix];
};

var AreasMarkers=[];
var PushpinAreaImageDefault='marker-area.png'; // blue pushpin with dot in it
function showAreaMarker(ix) {
        var id='AreaMarker_'+ix;
        var iconName = "iconHome";
        var markerName = getMarkerIdent( id );
        var thisMarker=null;
        var where=AreasBoundariesPoint[ix];
        var pushpinImage=Areas[ix][10];
        if (pushpinImage==null) pushpinImage=PushpinAreaImageDefault;
        if (pushpinImage==null) {
          thisMarker=new GMarker(where);
         } else {
          var thisIcon=new GIcon(G_DEFAULT_ICON);
          thisIcon.image=pushpinImage;
          thisMarker=new GMarker(where,thisIcon);
          LocationsMarkers[ix]=new GMarker(where,thisIcon);
        };
        AreasMarkers[ix]=thisMarker;
        html="<div><small>"+AreaDescriptionHTML(ix)+"</small></div>";
	AreasMarkers[ix].html=html;
	eval("GEvent.addListener(AreasMarkers["+ix+"], 'click', function() { AreasMarkers["+ix+"].openInfoWindowHtml(AreasMarkers["+ix+"].html); } );" );
        map.addOverlay(AreasMarkers[ix]);
};


function Trip2Areas (as) {
  var a=[];
  if (as==null) return a;
  for (var i=0;i<as.length-1;i++) {
    a[as[i][0]-1]=as[i];
  };
  return a;
};

function RandomColor() {
 //return '#AABBCC';
  var color, r, g, b;
  var rc;
  var hexValues=[0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'];
  rc1=Math.floor(Math.random()*hexValues.length);
  rc2=Math.floor(Math.random()*hexValues.length);
  r=''+hexValues[rc1]+hexValues[rc2];
  rc1=Math.floor(Math.random()*hexValues.length);
  rc2=Math.floor(Math.random()*hexValues.length);
  g=''+hexValues[rc1]+hexValues[rc2];
  rc1=Math.floor(Math.random()*hexValues.length);
  rc2=Math.floor(Math.random()*hexValues.length);
  b=''+hexValues[rc1]+hexValues[rc2];
  color='#'+r+g+b;
  return color;
};



function AreasListHTML (showExtra) {
	var html="";
        if (Areas.length<1) return html;
/*
	// zoom back to trip
	html+="<center>";
	//html+='<input type="button" value="Re-Zoom" onClick="ZoomToTrip()" />';
	html+='<br/><a href="javascript:ShowAllAreas()">show all areas</a>';
	html+="</center>";
	html+="<br/>";
*/
	//
	html+="<ul>";
	//html+="Areas";
	html+='Areas <a href="javascript:Zoom2Areas()" 0href="javascript:ShowAllAreas()">zoom</a>';
	for (var i=0;i<Areas.length;i++) {
  	  html+="<li>";
          html+=AreaColorHTML(i)+' ';
          html+=AreaListHTML(i,showExtra);
	  html+="</li>";
        };
	html+="</ul>";

        //html='<small><small>'+html+'</small></small>';

	return html;
};

function AreaColorHTML(ix) {
  var html='';
  //var a=Areas[ix];
  //if (a==null) return '';
  //var color=a[11];
  var color=Areas[ix][11];
  html+='';
  html+='<span style="background-color: '+color+' ; text-decoration:none"><font color="'+color+'">[~]</font></span>';
  return html
};


function AreaListHTML(ix,showExtra) {
  var html="";
  html+="<a href='javascript: showAreaDetails("+ix+")'>";
  //if (LocationsPathPoints[ix]==InvalidGeoPoint)
  //  html+='<font color="red">'; 
  html+=Areas[ix][1];
  //if (LocationsPathPoints[ix]==InvalidGeoPoint)
  //  html+='</font>'; 
  html+="</a>";
  if (showExtra!=null && Locations[ix][4]!=null && Locations[ix][4].length>0) {
    html+='<br/><small><a href="'+Locations[ix][4]+'" target="_blank">details</a></small>';
  };
  //html+="<br/>";
  return html;
};


    function showAreaDetails(ix)
    // Show a marker and open it's info window
    // show box for selected location
    {   
        // Zoom to Area
        //Zoom2Area(ix);
/* */
        //var bounds= new GLatLngBounds();
        var bounds;
        var ab=AreasBoundaries[ix];
//alert(ab.getVertexCount());
        if (ab!=null) {
          bounds= ab.getBounds();
          map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
        };
/* */
        var marker=AreasMarkers[ix];

        map.closeInfoWindow(); // else get problems
        marker.openInfoWindowHtml(marker.html);
/*
        //var marker = getMarkerIdent( Areas[ix][0] );
        //--eval(marker + ".openInfoWindowHtml(" + marker + ".html);");
        LocationsMarkers[ix].openInfoWindowHtml(AreasMarkers[ix].html);
*/
/*
        var txt=AreaTextDetail(ix);
        //alert(txt);
        //var cmd="alert('"+txt.replace(/\n/g,'\\n')+"')";
        //var txtE="'"+txt.replace(/\n/g,'\\n')+"'";
        var txtE=txt.replace(/\n/g,'\\n');
        var cmd="alert('"+txtE+"')";
        var url=Areas[ix][4];
        if (url!==null && url!='') {
          //if (confirm(txt)) window.open(url);
          //txtE+='\\n\\n'+url+'\\n\\nOpen details page ?';
          txtE+='\\n\\nOpen details page ?';
          cmd="if (confirm('"+txtE+"')) window.open('"+url+"')";
        };
        setTimeout(cmd,100);
*/
    }


function AreaTextDetail (ix) {
  var txt='';
  var area=Areas[ix];
  if (area==null) return txt;
  //txt+='';
  //  areas[areas.length]=[id,name,tel, desc, detUrl, ds,ts,de,te,imageUrl,pushpinImageUrl, color, points];    
  var id,name,tel, desc, detUrl, ds,ts,de,te,imageUrl,pushpinImageUrl, color, points,opacity;
  var i=0;
  id=area[i++];
  name=area[i++];
  tel=area[i++];
  desc=area[i++];
  detUrl=area[i++];
  ds=area[i++];
  ts=area[i++];
  de=area[i++];
  te=area[i++];
  imageUrl=area[i++];
  pushpinImageUrl=area[i++];
  color=area[i++];
  points=area[i++];
  opacity=area[i++];
  txt+=name+'\n\n';
  if (desc!=null && desc!='') txt+=desc+'\n';
  if (tel!=null && tel!='') txt+='Tel '+tel+'\n';
  if (detUrl!=null && detUrl!='') txt+=detUrl+'\n';
  if (ds!=null || ts!=null) {
    txt+='start: ';
    if (ds==null) ds='';
    if (ts==null) ts='';
    txt+=ds+' '+ts+'\n';
  };
  if (de!=null || te!=null) {
    txt+='end: ';
    if (de==null) de='';
    if (te==null) te='';
    txt+=de+' '+te+'\n';
  };
  if (imageUrl!=null && imageUrl!='') txt+='image: '+imageUrl+'\n';
  //if (pushpinImageUrl!=null && pushpinImageUrl!='') txt+='pushpin: '+pushpinImageUrl+'\n';
  //if (color!=null && color!='') txt+='color: '+color+'\n';
  //if (points!=null) txt+='points: '+points+'\n';
  return txt;
};

function AreaDescriptionHTML(ix) {
  var html="";
  var area=Areas[ix];
  if (area==null) return html;
  //  areas[areas.length]=[id,name,tel, desc, detUrl, ds,ts,de,te,imageUrl,pushpinImageUrl, color, points,opacity];    
  var id,name,tel, desc, detUrl, ds,ts,de,te,imageUrl,pushpinImageUrl, color, points,opacity;
  var i=0;
  id=area[i++];
  name=area[i++];
  tel=area[i++];
  description=area[i++];
  detailsURL=area[i++];
  dateStart=area[i++];
  timeStart=area[i++];
  dateEnd=area[i++];
  timeEnd=area[i++];
  imageUrl=area[i++];
  pushpinImageUrl=area[i++];
  color=area[i++];
  points=area[i++];
  opacity=area[i++];
  var lat,lon;

  var p=AreasBoundariesPoint[ix];
//alert(p);
  lat=p.lat();
  lon=p.lng();

  var LatLonURL='';
    LatLonURL='http://maps.google.com/maps?&ll='+lat+','+lon+'';
  LatLonURL=URLnoBlanks(LatLonURL);
  //alert(LatLonURL);
  //var LatLonIcon='LNPRidlûüýþw~ë';
  var LatLonText='i';
  var LatLonHTML='<a href='+LatLonURL+' target="_blank"><font face="webdings" style="{text-decoration: none;}">'+LatLonText+'</font></a>';
  //var LatLonTextShow='l';
  //LatLonHTML+='<a href="javascript:alert(\'Latitude, Longitude:\\n'+lat+', '+lon+'\')"><font face="webdings" style="{text-decoration: none;}">'+LatLonTextShow+'</font></a>';
  //-  LatLonHTML+=' <br/>['+'<a href='+LatLonURL+' target="_blank" style="text-decoration:none;">'+lat+', '+lon+'</a>'+']';

  if (description==null) description="";
  html="";
  html+='<table 0border="1"><tr><td><big>';
//alert(imageUrl+'\n'+Locations[ix]);
  if (imageUrl!=null && imageUrl.length>0) {
    html+='<img src="'+imageUrl+'" height="100" border="0" align="left" style="{margin-right: 2px;}" />';
    //html+='</td><td>';
  };
  html+=AreaColorHTML(ix)+' ';
  if (detailsURL!=null && detailsURL.length>0) {
    //html+='<br/><a href="'+detailsURL+'" target="_blank">details</a>';
    html+='<a href="'+detailsURL+'" target="_blank">';
  };
  html+="<b>"+name+"</b>";
  if (detailsURL!=null && detailsURL.length>0) {
    //html+='<br/><a href="'+detailsURL+'" target="_blank">details</a>';
    html+='</a>';
  };
  if (dateStart!=null && dateStart.length>0) {
    html+=' '+dateStart;
  };
  if (timeStart!=null && timeStart.length>0) {
    html+=' '+timeStart;
  };
  if ((dateEnd!=null && dateEnd.length>0) || (timeEnd!=null && timeEnd.length>0)) {
    html+=' - ';
  };
  if (dateEnd!=null && dateEnd.length>0) {
    //html+=' - '+dateEnd;
    html+=' '+dateEnd;
  };
  if (timeEnd!=null && timeEnd.length>0) {
    html+=' '+timeEnd;
  };
  html+=" "+LatLonHTML;

/*
  //html+="<br/>"+address;
  if (address!=null && address.length>0) {
    html+="<br/>"+address;
  };
*/
  if (tel!=null && tel.length>0) {
    html+="<br/>Tel: "+tel;
  };
  if (description!=null && description.length>0) {
    //html+="<br/>"+description;
    html+="<br/>"+description.replace(/\n/g,'<br/>\n');
  };
  //html+="<div><b>"+name+"</b><br/>"+address+"<br/>Tel: "+tel+"<br/><a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a></div>";
  html+='</big></td></tr></table>';
  html+="";
  html="<small>"+html+"</small>";
  return html;
};


function Zoom2Areas () {
  if (AreasBoundaries.length<1) return;
  var bounds=AreasBoundaries[0].getBounds();
    var ab,b;
    for (var i=1;i<AreasBoundaries.length;i++) {      
      ab=AreasBoundaries[i];
      //if (ab==null) continue;
      b=ab.getBounds();
      bounds.extend(b.getSouthWest());
      bounds.extend(b.getNorthEast());
    };
  map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
  //return bounds;
  return;
};


/*
function Zoom2Area (ixIn) {
  if (AreasBoundaries.length<1) return;
  var ix=ixIn;
  if (ix==null) ix=0;
  //var area=AreasBoundaries[0];
  if (AreasBoundaries[ix]==null) return;
  var bounds=AreasBoundaries[ix].getBounds();
  if (ixIn==null) {
    var ab,b;
    for (var i=1;i<AreasBoundaries.length;i++) {      
      ab=AreasBoundaries[i];
      if (ab==null) continue;
      b=ab.getBounds();
      bounds.extend(b.getSouthWest());
      bounds.extend(b.getNorthEast());
    };
  };
  map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
  //return bounds;
  return;
};
*/



// //Areas


//--


function getElementByTagName(l,name) {
  var r='';
  var es=l.getElementsByTagName(name);
  if (es==null || es.length<1) return r;
  var e=es[0];
  r='';
  if (e.text != null) r=r+e.text;
  if (e.textContent != null) r=r+e.textContent;
//alert(r);
  return r;
};




// /Trip

var mapHeightWindowPercent=75;
function resizeMap() { 
        var mapDiv = document.getElementById("map");   
        var height=document.documentElement.clientHeight ;
        height=Math.round(height*mapHeightWindowPercent/100);
        mapDiv.style.height = height +'px'; 
        if (map!=null) map.checkResize();
} 


