//-- extra

//var CalculateUndefinedBoundaries=true;
var CalculateUndefinedBoundaries=false;

var ZonesMainAddress='Boca Raton, FL';


function ShowZonesMainAddress() {
  SetAllZonesCentre(ZonesMainAddress,ZoomInitialLevelAllZones);
};


function SetAllZonesCentre(address, nZoom) {
  var lat=null,lon=null, pCentre=null;
  geocoder.getLatLng(
    address,
    function(point) {
      var where=point;
      //LocationsUseLatLon[ix]=true;
      if (!point) {
        //LocationsUseLatLon[ix]=false;
 	if (lon==null || lat==null) {
	  lat=0;
	  lon=0;
  	  pCentre='NOPOINT';
	  window.status='Zone Main Address: '+'NO MAP: '+address;
  	  //ShowLocationsPath(Locations.length);
  	  //-SetZoneCenter(zoneIx,pointsCount);
           //return;
         } else {
	};
	where=new GLatLng(lat,lon);
       } else { 
        //LocationsUseLatLon[ix]=true;
	lon=where.x;
    	lat=where.y;
      };

	pCentre=where;
        //alert('Zones Main address'+' '+' : '+where.x+' , '+where.y+' : '+address);
        window.status='Zones Main address'+' '+' : '+where.x+' , '+where.y+' : '+address;
        map.centerAndZoom(pCentre, nZoom);
  
    }
  );
}





var ZonesCenter=[];
var ZonesPoints=[];
var ZonesBox=[];
var ZonesBoundaries=[];
var ZonesMembersCount=[];
var ZonesTeamLeadersTxt=[];
var ZonesMeetingPlacesTxt=[];

function ZonesDisplayCERT() {
  var z=CERTzones;
    // Test
    //z=[CERTzones[0],CERTzones[1],CERTzones[2],CERTzones[10]];
    //z=[CERTzones[10],CERTzones[0],CERTzones[1],CERTzones[2]];
    //CERTzones=z;
  //alert(CERTmembersInactive);
  var html;
  GetZonesPoints();
  //-Locations=Locations4Zones(z);
  //alert(Locations);
  //alert('ZonesDisplay');
  //TripDisplay();
};


function ShowZones () {
/*
  var zones=[];
  for (var i=0;i<ZonesCenter.length;i++) {
    if (ZonesCenter[i]==null || ZonesCenter[i]==undefined) continue;
    zones[i]=CERTzones[i];
  };
  //var html=ZonesListHTML(zones);
  document.all.LocationsList.innerHTML=html;
*/
  ShowCurrentZones();
  if (ZonesCenter.length<CERTzones.length) return;
  for (var i=0;i<ZonesCenter.length;i++) {
    if (ZonesCenter[i]==null || ZonesCenter[i]==undefined) return;
  };

  // Create locations  
  //Location4Zone();
  Locations=Locations4Zones();

  TripDisplay();
  ShowTripData();
  ZoomToTrip();
};

function ShowCurrentZones () {
  var zones=[];
  var html='';
  //html=html+''+'\n';
  html=html+'<ol>'+'\n';
  for (var i=0;i<ZonesCenter.length;i++) {
    if (ZonesCenter[i]==null) continue;
    zones[i]=CERTzones[i];
    html=html+'<li>';
    //-html=html+ZoneColorHTML(i)+' ';
    html=html+zones[i];
    if (ZonesCenter[i]=='NOPOINT') 
      html=html+' '+'<font face="webdings" color="red" onClick="alert(\'No Map\')">x</font>'+'';
    html=html+' <small>['+ZonesMembersCount[i]+']</small>';
    //html=html+zones[i]+' ~ '+GetZoneColor(i);
    html=html+'</li>'+'\n';
  };
  for (var i=ZonesCenter.length;i<CERTzones.length;i++) {
    //if (ZonesCenter[i]==null) continue;
    html=html+'<li>';
    //-html=html+ZoneColorHTML(i)+' ';
    //html=html+' ~ '+GetZoneColor(i);
    html=html+'</li>'+'\n';
  };
  html=html+'</ol>'+'\n';
  //var html=ZonesListHTML(zones);
  //html='<small>'+html+'</small>';
  html='<small><small>'+html+'</small></small>';
  //document.all.LocationsList.innerHTML=html;
  SetElementHTML('LocationsList',html);
};



function Locations4Zones (ix) {
//function Locations4Zones (zonesIn) {
  //var zones=zonesIn;
  //if (zones==null) zones=CERTzones;
  var zones=CERTzones;
  var locs=[], ll=[];
  //ZonesCenter=[];
  var lat,lon, desc;
  for (var i=0;i<zones.length;i++) {
    //-if (ix!=null && ix !=i) continue; // only passed zone
    // 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 ];	
    //ll=FindLogLat4Zone(ix);
    ll=ZonesCenter[i];
    //if (ll==null || ll=='NOPOINT') continue;
//alert(i+'. '+zones[i]+'\n'+ll);
//alert(llx+'\n'+ll.y);
    if (ll!=null || ll=='NOPOINT') {
      lon=ll.x;
      lat=ll.y;
     } else {
      lon=null;
      lat=null;
    };
//alert(zz'');
    desc='';
    desc=desc+'<a href="javascript:showLocationDetails('+i+');">area</a> ';
    //desc=desc+'<a href="javascript:ShowZoneMap(\''+zones[i]+'\');">show zone members map</a>'+'<br/>'+ZonesMembersCount[i]+' members';
    //desc=desc+'<a href="javascript:ShowZoneMap(\''+zones[i]+'\');">show zone members map</a>';
    desc=desc+'<a href="javascript:ShowZoneMap(\''+zones[i]+'\');">members map</a>';
    desc=desc+'<br/>'+ZonesMembersCount[i]+' members';

//add team leader
    desc+=ZoneTeamLeaderDescriptionText(i);

//alert(i+'. '+CERTzones[i]+':'+ZonesFRS[i]+'\n\n'+ZonesFRS);
    if (ZonesFRS[i]!=null && ZonesFRS[i]!='') 
      desc=desc+'<br/>FRS Radio channel: '+ZonesFRS[i];

    locs[i]=[
	'zone_'+i,
	ZoneColorHTML(i)+' '+zones[i],
	'', // address
	'', // tel
	lon, //long
	lat, //lat
	//'<a href="javascript:ShowZoneMap(\''+zones[i]+'\');">show zone members map</a>'+'<br/>'+ZonesMembersCount[i]+' members', // html
	desc, // html
	'', // url
	0,0,0,0 // dateStart timeStart dateEnd timeEnd
    ];
  };
  return locs;
};

function ZoneTeamLeaderDescriptionText(i) {
  var html=''
    // Team Leaders
    if (ZonesTeamLeadersTxt[i]==null) return html; 
    if (ZonesTeamLeadersTxt[i].length>0) 
      html+='<br/>Team Leader: ';
    for (var j=0;j<ZonesTeamLeadersTxt[i].length;j++) {
      if (j!=0) html+=',';
      html+=' '+ZonesTeamLeadersTxt[i][j];
    };
  return html;
}; 


function GetZonesPoints() {
  var zones=CERTzones;
  //GetZoneMap(0);
  GetZoneMap();
  return;
/*
  for (var i=0;i<zones.length;i++) {
    // 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 ];	
    GetZoneMap(i);
  };
*/
};


function MeetingPlacesTxt (mp) {
  var mpt=[], html;
  for (var i=0;i<mp.length;i++) {
    html='';
//alert(mp[i].length+'\n\n'+mp[i][0]+'\n'+mp[i][1]+'\n'+mp[i][2]);
    html=html+mp[i][0];
    if (mp[i][1]!=null && mp[i][1]!=='') {
      html=html+'<br/>';
      html=html+mp[i][1];
    };
    mpt[mpt.length]=html;
  };
  return mpt;
};

function TeamLeadersTxt (tlIx,members) {
  var tl=[], html;
  for (var i=0;i<tlIx.length;i++) {
    html='';
    html=html+members[tlIx[i]][indexLastName];
    html=html+' ';
    html=html+members[tlIx[i]][indexFirstName];
    tl[tl.length]=html;
  };
  return tl;
};


var ZonesMembers=[];

function ZonesMembersData() {
  var members=CERTmembers;
  //alert(members);
  var zones=CERTzones;
  for (var i=0;i<zones.length;i++) {
    ZonesMembers[i]=[];
  };
  //var zone, zoneIx;
  var pctP=-1; 
  var zi=-1, currentZone='';
  //zi--;
  for (var i=0;i<members.length;i++) {
    member=members[i];
    //AddZoneMember(members[i]);
    if (member==null || member[indexZone].length==0) continue;
    if (currentZone!=member[indexZone]) {
      zi++;
      currentZone=member[indexZone];
    };
//if (!confirm(zi+' '+member[indexZone])) return;
    ZonesMembers[zi][ZonesMembers[zi].length]=member;
    pctP=showPercent('Members processing',i,members.length,pctP);
/*
var zp;
if (zp!=members[i][indexZone]) {
  alert(i+' '+members[i][indexZone]);
  window.status=i+' '+members[i][indexZone];
  zp=members[i][indexZone];
};
*/
  };
};

/*
function showPercent(text,i,n, pctPre) {
  var pct=Math.round(i/n*100);
  if (pct!=pctPre) {
    window.status=pct+'% '+text;    
  };
  return pct;
};
*/

function ZoneIx(zone) {
  var zones=CERTzones;
  for (var i=0;i<zones.length;i++) {
    if (zone==zones[i]) return i;
  };
  return -1;
};

function AddZoneMember(member) {
    if (member==null) return;
    var zone, zoneIx, n;
    zone=member[indexZone];
    zoneIx=ZoneIx(zone);
    if (zoneIx<0) return;
    //if (ZonesMembers[zoneIx]==null) {
    //  ZonesMembers[zoneIx]=[];
    //  n=0;
    // } else {
    //  n=ZonesMembers[zoneIx].length;
    //};
    n=ZonesMembers[zoneIx].length;
    ZonesMembers[zoneIx][n]=member;
};


function GetZoneMap(ixIn) {
  var ix=ixIn;
  if (ix==null) {
    ZonesMembersData();
    ix=0;
  };
  var zones=CERTzones;
  if (ix>=zones.length) return;
  var members=CERTmembers;
  var addrs=[];

//window.status=(ix+1)+'. '+zones[ix];
  //var ms=Members4Zone(members,zones[ix]);
  var ms=ZonesMembers[ix];
//alert(ms.length);
  //ZonesMembersCount[ix]=ms.length;
  ZonesMembersCount[ix]=MembersDataOnly(ms).length;

  ZonesFRS[ix]=GetZoneFRS(ms);
  var ZonesBoundariesArray=GetZoneBoundaries(ms,zones[ix]);
  //alert(zone[iz]+'\n'+ZonesBoundariesArray);
  ZonesBoundaries[ix]=ZoneBoundariesPoints(ZonesBoundariesArray);
//alert(ix+'. '+zones[ix]+':'+ZonesBoundaries[ix].length+'\n'+ZonesBoundaries[ix]);

//alert(zones[ix]+'\n'+ZonesBoundaries[ix].length);

  //ZonesTeamLeadersTxt[ix]=[];
  ZonesMeetingPlacesTxt[ix]=[];
  //alert(TeamLeadersIx(ms).length);
  ZonesTeamLeadersTxt[ix]=TeamLeadersTxt(SortTeamLeadersIx(TeamLeadersIx(ms),ms),ms);
//alert(MeetingPlaces(ms).length);
  ZonesMeetingPlacesTxt[ix]=MeetingPlacesTxt(MeetingPlaces(ms));


/*
  window.status=ix+'. '+zones[ix];
  var ms=[];
  ZonesMembersCount[ix]=0;
  ZonesFRS[ix]='';
  ZonesBoundaries[ix]=[];
  ZonesMeetingPlacesTxt[ix]=[];
  ZonesTeamLeadersTxt[ix]=[];
  var member, zone=zones[ix];
  for (var i=0;i<members.length;i++) {
    member=members[i];
    if (member!=null && member[indexZone]!=zone) continue;
    ms[ms.length]=member;
    if (member[indexLastName]!='') ZonesMembersCount[ix]++;
    if (member[indexZoneFRS]!='') ZonesFRS[ix]=member[indexZoneFRS];
    if (member[indexZoneBoundaries]!='') ZonesBoundaries[ix]=ZoneBoundariesPoints(GetZoneBoundaries([member],zone));
    if (member[indexMeetingPlace]!='') ZonesMeetingPlacesTxt[ix][ZonesMeetingPlacesTxt[ix].length]=[member[indexMeetingPlace],member[indexMeetingPlaceNote]];
    //if (member[indexTeamLeader]!='') ZonesTeamLeadersTxt[ix][ZonesTeamLeadersTxt[ix]]=[];
  };
  ZonesTeamLeadersTxt[ix]=TeamLeadersTxt(SortTeamLeadersIx(TeamLeadersIx(ms),ms),ms);
*/
  
  //alert(ms);
  window.status=(ix+1)+'. Starting: '+zones[ix]+' ['+ms.length+']';
  //alert(ix+'. Starting: '+zones[ix]+' ['+ms.length+']');
  ZonesPoints[ix]=[];
  for (var i=0;i<ms.length;i++) {
    //if(!confirm(ms[i])) return;
    addrs[i]=ms[i][indexAddress]+', '+ms[i][indexCity]+', '+ms[i][indexState]+', '+ms[i][indexZip];
    SetZonePoint(ix,i,addrs[i],ms.length);
  };
};


function SetZoneCenter(ix,pointN) {

  if (ZonesCenter[ix]!=null) return;

  if (ZonesPoints[ix]==null || ZonesPoints[ix].lenght<pointN) return;
  for (var i=0;i<pointN;i++) {
    if (ZonesPoints[ix][i]==null) return;
  };

  ZonesCenter[ix]='NOPOINT';

  var bounds = new GLatLngBounds();

  var ok=false;
  for (var i=0;i<pointN;i++) {
//alert(i+'. '+ZonesPoints[ix][i]);
    if (ZonesPoints[ix][i]!='NOPOINT')  {
      bounds.extend(ZonesPoints[ix][i]); 
//alert(ZonesPoints[ix][i]);
      //ZonesCenter[ix]=ZonesPoints[ix][i];
      ok=true;
    };
  };
  //map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds)); 
  if (ok) {
  //if (ZonesCenter[ix]!='NOPOINT') {
    ZonesCenter[ix]=bounds.getCenter();
    //TripDisplay();
    window.status=(ix+1)+'. '+CERTzones[ix]+' center: '+ZonesCenter[ix].x+' '+ZonesCenter[ix].y+' ['+pointN+']';
    //alert(CERTzones[ix]+' center: '+ZoneCenter[ix].x+' '+ZoneCenter[ix].y);

    //LocationsPathPoints[ix]=ZonesCenter[ix];
    // when finished go to the next zone
  // } else {
  //  LocationsPathPoints[ix]='NOPOINT';
  };

  DisplayZoneLine(ix);

  ShowZones();
  //setTimeout('ShowZones()',1000);
/*
  if (!confirm('next zone ?')) {
    var z=[];
    for (var i=0;i<=ix;i++) {
      z[i]=CERTzones[i];      
    };
    CERTzones=z;
    DisplayZoneLine(ix);
    ShowZones();
  };
*/
  GetZoneMap(ix+1);
  //setTimeout('GetZoneMap('+(ix+1)+')',1000);
};


function SetZonePoint(zoneIx,zonePointIx,address,pointsCount) {
  if (ZonesBoundaries[zoneIx]!=null && ZonesBoundaries[zoneIx].length>0) {
    //if (zonePointIx<ZonesBoundaries[zoneIx].length) {
    //  ZonesPoints[zoneIx][zonePointIx]=ZoneBoundaries[zoneIx][zonePointIx];
    // } else {
    //  ZonesPoints[zoneIx][zonePointIx]='NOPOINT';
    //};
    ZonesPoints[zoneIx]=ZonesBoundaries[zoneIx];
    //alert(zoneIx+'. point'+ZonesBoundaries[zoneIx].length);
    SetZoneCenter(zoneIx,ZonesBoundaries[zoneIx].length);
    //SetZoneCenter(zoneIx,pointsCount);
    return;
  };

  if (!CalculateUndefinedBoundaries) {
    ZonesPoints[zoneIx][zonePointIx]='NOPOINT';
    SetZoneCenter(zoneIx,pointsCount);
    return;
  };

  var lat,lon;
  geocoder.getLatLng(
    address,
    function(point) {
      var where=point;
      //LocationsUseLatLon[ix]=true;
      if (!point) {
        //LocationsUseLatLon[ix]=false;
 	if (lon==null || lat==null) {
	  lat=0;
	  lon=0;
//if (!confirm(CERTzones[zoneIx]+'\nNOPOINT\n'+zoneIx+' '+zonePointIx+'\n'+address)) document.location='';
  	  ZonesPoints[zoneIx][zonePointIx]='NOPOINT';
          //window.status=("Google maps API cannot Geolocate: \n"+address);
	  //window.status=zoneIx+'. {'+pointsCount+'} '+CERTzones[zoneIx]+' ['+zonePointIx+'] : '+"Google maps API cannot Geolocate: \n"+address;
	  window.status=zoneIx+'. '+CERTzones[zoneIx]+' ['+pointsCount+'] {'+zonePointIx+'} : '+'NO MAP: '+address;
  	  //ShowLocationsPath(Locations.length);
  	  SetZoneCenter(zoneIx,pointsCount);
           return;
         } else {
	};
	where=new GLatLng(lat,lon);
       } else { 
        //LocationsUseLatLon[ix]=true;
	lon=where.x;
    	lat=where.y;
      };

	//ZonePoints[ix][i][0]=lon;
	//ZonePoints[ix][i][1]=lat;

	ZonesPoints[zoneIx][zonePointIx]=where;

	//window.status=zoneIx+'. ['+pointsCount+'] '+CERTzones[zoneIx]+' ['+zonePointIx+'] : '+where.x+' , '+where.y+' '+address;
        window.status=zoneIx+'. '+CERTzones[zoneIx]+' ['+pointsCount+'] {'+zonePointIx+'} : '+where.x+' , '+where.y+' : '+address;

	SetZoneCenter(zoneIx,pointsCount);

    }
  );
}




function DisplayZoneLine(ix) {
  //var points=ZonesPoints[ix];
  var points=[];
  points=[]; 
  //alert(ix);
  var bounds=new GLatLngBounds();
  for (var i=0;i<ZonesPoints[ix].length;i++) {
    if (ZonesPoints[ix][i]=='NOPOINT') continue;
    points[points.length]=ZonesPoints[ix][i];
    bounds.extend(ZonesPoints[ix][i]);
  };
  var border=ZonesBoundaries[ix];
  if (border==null || border=='') border=[];
  if (border.length>0) {
    for (var i=0;i<border.length;i++) {
      points[points.length]=border[i];
      bounds.extend(border[i]);
    };
  };

  if (points.length<1) return;

//alert('border \n'+border);

  //points[points.length]=points[0];

/*
  points=[];
  var pSW=bounds.getSouthWest();
  var pNE=bounds.getNorthEast();
  points[0]=pSW;
  points[1]=new GLatLng(pSW.y,pNE.x);
  points[2]=pNE;
  points[3]=new GLatLng(pNE.y,pSW.x);
   points[4]=pSW;
  //alert(points);
*/
//alert(ix+'. '+border.length+'\n'+ZonesBoundaries[ix]);
  if (border.length<1) {
    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);
  };


 
  //alert('zoneline:\n'+points);
  //var line=new GPolyline(points);
  //var line=new GPolygon(points);
  //GPolygon(points, strokeColor?, strokeWeight?, strokeOpacity?, fillColor?, fillOpacity?)
  //var line=new GPolygon(points,GetZoneColor(ix),0.7,GetZoneColor(ix),0.4);
  var c=GetZoneColor(ix);
//alert(c);
  //var line=new GPolygon(points,c,3, 0.7 ,c, 0.4);
  var line=new GPolygon(border,c,3, 0.7 ,c, 0.4);
  //var line=new GPolygon(points);
  //var line=new GPolyline(points,c);
//alert('z:'+c);

  ZonesBox[ix]=line;
  map.addOverlay(line);
  //map.addOverlay(bounds);
  //map.addControl(bounds);

  //zoomToPolyLine(line);

  // display line for zone
  // display center tag for zone
};

function DisplayZonesLines() {
};

//var ZoneColors=['red','green','bule','yellow','orange','pink','brown','magenta','white','black','gray','silver','cyan','gold','navy'];
var ZoneColors=[];
function GetZoneColor(cx) {
  // Zone Color retrieve
  /*
  var c=null;
  var zd=CERTzonesData[cx];  
  if (zd!=null) c=zd[indexZoneColorZ];
  if (c!=null && c.length>0) return c;
  */
  var c=GetZoneColor4members(ZonesMembers[cx]);
  //if (ZoneColors.length==0) CreateZoneColors();
  var c=GetZoneColor4members(ZonesMembers[cx]);
  if (c!=null && c!='') return c; 
  CompleteZoneColors();
  //return one of the colors
  var ix=cx%ZoneColors.length;
  //var c=ZoneColors[ix];
  c=ZoneColors[ix];
  //alert(c); 
  return c;
};

function ZoneColorHTML(ix) {
  var html='';
  var c=GetZoneColor(ix);
  html=html+'';
  //html=html+'<span style="{background-color: '+c+' ; text-decoration:none}">&nbsp;&nbsp;&nbsp;&nbsp;</span>';
  //html=html+'<span style="{background-color: '+c+' ; text-decoration:none}"><font color="'+c+'">&nbsp;&nbsp;&nbsp;&nbsp;</font></span>';
  //html=html+'<span style="{background-color: '+c+' ; text-decoration:none}"><font color="'+c+'">area</font></span>';
  //html=html+'<span style="{background-color: '+c+' ; text-decoration:none}"><font color="'+c+'">[~]</font></span>';
  html=html+'<span style="background-color: '+c+' ; text-decoration:none"><font color="'+c+'">[~]</font></span>';
  return html
};


function CompleteZoneColors(nIn) {
  var n=nIn;
  if (n==null) n=CERTzones.length; 
  if (ZoneColors==null) ZoneColors=[];
  var zoneColors=ZoneColors;
  for (var i=ZoneColors.length;i<n;i++) {
    zoneColors[i]=RandomColor();
  };
  ZoneColors=zoneColors;
//ShowWindow(''+ZoneColors);
  return ZoneColors;
};


function CreateZoneColors(nIn) {
  var n=nIn;
  if (n==null) n=CERTzones.length; 
  ZoneColors=[];
  for (var i=0;i<n;i++) {
    ZoneColors[i]=RandomColor();
  };
  return ZoneColors;
};

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 ZonesListHTMLall(zones) {
  var html='';
  html=html+TripTitle+'<br/>';

  // CERT main page
  html=html+'<a href="'+ZonesPageMainURL+'" target="_blank">'+ZonesPageMainURLtext+'</a>'+'<br/>'; 
  // CERT maps page
  html=html+'<a href="'+ZonesMapsURL+'" target="_blank">'+'maps '+ZonesMapsURLtext+'</a>'+'<br/><br/>'; 


  if (CERTnote!=null && CERTnote!='') 
    html=html+CERTnote+'<br/>';
  html=html+'<ol>';
  for (var i=0;i<zones.length;i++) {
    html=html+'<li>';
    //html=html+'<a href="MapLocationSelectTxt.htm?Zone='+zones[i]+'">';
    //html=html+'<a href="JavaScript:alert(MembersNamesText(Members4Zone(CERTmembers,\''+zones[i]+'\')));alert(ZoneMembers2XMLtext("'+zones[i]+'",CERTmembers))">';
    //html=html+'<a href="JavaScript:alert(MembersNamesText(Members4Zone(CERTmembers,\''+zones[i]+'\')));">';
    //html=html+'<a href="JavaScript:alert(ZoneMembers2XMLtext(\''+zones[i]+'\',CERTmembers));">';
    html=html+'<a href="JavaScript:ShowZoneMap(\''+zones[i]+'\');">';
    html=html+ZoneColorHTML(i)+' ';
    html=html+zones[i]+' map';
    html=html+'</a>';
    if (ZonesCenter[i]=='NOPOINT') {
      html=html+' '+'<font face="webdings" color="red" onClick="alert(\'No Map\')">x</font>'+'';
    };
    html=html+'<br/>'+ZonesMembersCount[i]+' members';

    // Team Leaders
    html+=ZoneTeamLeaderDescriptionText(i);
    /*
    if (ZonesTeamLeadersTxt[i].length>0) 
      html=html+'<br/>Team Leader: ';
    for (var j=0;j<ZonesTeamLeadersTxt[i].length;j++) {
      if (j!=0) html=html+',';
      html=html+' '+ZonesTeamLeadersTxt[i][j];
    };
    */

    // FRS radio
    if (ZonesFRS[i]!=null && ZonesFRS[i]!='') 
      html=html+'<br/>FRS Radio channel: '+ZonesFRS[i];


    // Meeting Places
    if (ZonesMeetingPlacesTxt[i].length>0) 
      html=html+'<ul/>Meeting places';
    for (var j=0;j<ZonesMeetingPlacesTxt[i].length;j++) {
      html=html+'<li>'+ZonesMeetingPlacesTxt[i][j]+'</li>';
    };
    if (ZonesMeetingPlacesTxt[i].length>0) 
      html=html+'</ul>';

    //html=html+' <a href="JavaScript:alert(CERTzones['+i+']+\'\\nCenter:\'+ZonesCenter['+i+']+\'\\n\'+ZonesPoints['+i+']);">';
    //html=html+'points';
    //html=html+'</a>';
    html=html+'</li>';
  };
  html=html+'</ol>';
//alert(html);
  return html;
};

function ZoomToZonesPoints () {
  var points=[];
  var bounds = new GLatLngBounds();
  for (var i=0;i<ZonesPoints.length;i++) {
    for (var j=0;j<ZonesPoints[i].length;j++) {
      if (ZonesPoints[i][j]=='NOPOINT' || ZonesPoints[i][j]==null) continue;
      bounds.extend(ZonesPoints[i][j]); 
    };
  };
  showBoundsLine(bounds);
  map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds)); 
};


var boundsLineShown=false;
function showBoundsLine(bounds) {
  if (boundsLineShown) return;
  boundsLineShown=true;
//alert('showBoundsLine');
  var points=[];
  var pSW=bounds.getSouthWest();
  var pNE=bounds.getNorthEast();
  points[0]=pSW;
  points[1]=new GLatLng(pSW.y,pNE.x);
  points[2]=pNE;
  points[3]=new GLatLng(pNE.y,pSW.x);
  points[4]=pSW;
  //alert(points);

  //var line=new GPolyline(points);
  var line=new GPolyline(points,TripBorderColor);
  //var line=new GPolygon(points);
  //GPolygon(points, strokeColor?, strokeWeight?, strokeOpacity?, fillColor?, fillOpacity?)
  //var line=new GPolygon(points,GetZoneColor(ix),0.7,GetZoneColor(ix),0.4);
  //var c=GetZoneColor(ix);
//alert(c);
  //var line=new GPolygon(points,c,3, 0.7 ,c, 0.4);
  //var line=new GPolygon(points);
  //var line=new GPolyline(points,c);
//alert('z:'+c);

  map.addOverlay(line);
  //map.addOverlay(bounds);
  //map.addControl(bounds);

  //zoomToPolyLine(line);

  // display line for zone
  // display center tag for zone
};


function ShowOnlyZoneBox(ix) {
  for (var i=0;i<ZonesBox.length;i++) {
    //if (i==ix) continue;
    //alert(i+'. '+CERTzones[i]+'\n['+ZonesBox[i]+']');
    if (ZonesBox[i]!=null) map.removeOverlay(ZonesBox[i]);
  };
  if (ix!=null && ZonesBox[ix]!=null) 
    map.addOverlay(ZonesBox[ix]);
};

function ShowAllZoneBoxes() {
  ShowOnlyZoneBox(null);
  for (var i=0;i<ZonesBox.length;i++) {
    if (ZonesBox[i]==null) continue;
    map.addOverlay(ZonesBox[i]);
  };
};

function GetMarkerIndex(name) {
  var ix=null;
  for (var i=0;i<LocationsMarkers.length;i++) {
    if (LocationsMarkers[i].name==name) {
      ix=i;
      break;
    };
  };
  return ix;
};

/*
function infoWindowOptionsNZtemplate () {
};
infoWindowOptionsNZtemplate.onOpenFn= function () {
      var ix=GetMarkerIndex(name)
      //if (ix==null) return;
      ShowOnlyZoneBox(ix);
    };
infoWindowOptionsNZtemplate.onCloseFn= function () {
      ShowAllZoneBoxes();
    };

var infoWindowOptionsNZ = new infoWindowOptionsNZtemplate();
*/

function GetAllMembersEmails () {
};

function GetZonesFRS() {
  var zonesFRS=[];
  var zones=CERTzones;
  for (var i=0;i<zones.length;i++) {
    frs=GetZoneFRS(Members4Zone(CERTmembers,zones[i]));
    if (frs!=null && frs!='') {
      zonesFRS[i]=frs;
    };
    window.status=i+'. '+zones[i]+' FRS radio: '+frs;
  };
  ZonesFRS=zonesFRS;
  //alert(ZonesFRS);
  return zonesFRS;
};

function GetZonesFRStxt() {
  var zones=CERTzones;
  var txt='';
  //var txt='FRS radio channels'+'\n\n';
  var frs='';
  for (var i=0;i<zones.length;i++) {
    frs=ZonesFRS[i];
    if (frs!=null && frs!='') {
      txt=txt+zones[i]+': \t'+frs+'\n';
    };
    window.status=i+'. '+zones[i]+' FRS radio: '+frs;
  };
  if (txt=='') {
    txt='none'+'\n';
  };
  txt='FRS radio channels'+'\n\n'+txt;
//alert(txt);
  return txt;
};

function ShowZonesFRS() {
  var msg=GetZonesFRStxt();
  alert(msg);
};

function ShowInactiveMembers() {
  var members=CERTmembersInactive;
  var zone,member,tel,id;
  var txt='';
  for (var i=0;i<members.length;i++) {
    zone=members[i][indexZone];
    member=members[i][indexLastName]+' '+members[i][indexLastName];
    tel=members[i][indexPhoneHome]+', '+members[i][indexPhoneCell];
    id=members[i][indexId];
    txt=txt+zone+': \t['+id+'] \t'+member+' \t'+tel+'\n';
  };
  if (txt=='') {
    txt='none'+'\n';
  };
  txt='Inactive Members'+'\n\n'+txt;
  alert(txt);
};



// ShowLocationPath, display line
//  add first point to last to make line close area

//-- override

function DisplayAreaMark() {
};

function TripDisplay() {
  var locations=[];
  var connections=[];
  // Display Locations

  //-Locations=TripLocations2Locations(TripLocationsXML(TripXML));
  //-Connections=Trip2Connections(TripConnectionsXML(TripXML));

  //alert('Td: '+Connections);
  //alert(Locations);
  ShowLocations();

  //TripData=Trip2Trip(TripTripXML(TripXML));
  ShowTripData();
  // Display Connections
  ZoomToTrip();
};

var ZonesPageTitle;
var TripTitle=''
function ShowTripData() {
  //var tripTitle='Boca Raton CERT Zones';
  var tripTitle=ZonesPageTitle;
  TripTitle=tripTitle;
  //tripTitle='Trip: '+tripTitle;
  //document.all.TripTitle.innerHTML=tripTitle;
  SetElementHTML('TripTitle',tripTitle);
  //var desc=ZonesListHTML(CERTzones);
  var desc=ZonesListHTMLall(CERTzones);
  //document.all.TripDescription.innerHTML=desc;
  SetElementHTML('TripDescription',desc);
  ZoomToTrip();
};

function ZoomToTrip() {
  ZoomToZonesPoints();
};

/*
function ShowEmailsWindow() {
  var html='';
  //html=html+'';
  html=html+'<html>';
  html=html+'<head>';
  html=html+'<title>';
  //html=html+'CERT members email';
  html=html+ZoneEMailMembersTitle;
  html=html+'</title>';
  html=html+'</head>';
  html=html+'<body>';
  html=html+'<center>';
  html=html+'<table><tr><td align="left">';
  for (var i=0;i<EMails.length;i++) {
    html=html+'<a href="mailto:'+EMails[i]+'">'+EMails[i]+'</a>';
    html=html+'<br/>';
  };
  html=html+'</td></tr></table>';
  html=html+'</center>';
  html=html+'</body>';
  html=html+'</html>';

  var w=window.open();
  w.document.body.innerHTML=html;
};
*/




function LocationsListHTML (showExtra) {
	var html="";
	// zoom back to trip
	html=html+"<center>";
	//html=html+'<input type="button" value="Show Trip" onClick="ZoomToTrip()" />';
	html=html+'<input type="button" value="Re-Zoom" onClick="ZoomToTrip()" />';
	//html=html+'<br/><input type="button" value="All Zones" onClick="ShowAllZoneBoxes()" />';
	html=html+'<br/><a href="javascript:ShowAllZoneBoxes()">show all zones</a>';
	html=html+"</center>";
	html=html+"<br/>";
	//
	html=html+"<ol>";
	for (var i=0;i<Locations.length;i++) {
  	  html=html+"<li>";
          //-html=html+ZoneColorHTML(i)+' ';
          html=html+LocationListHTML(i,showExtra);
          //-html=html+' <small>['+ZonesMembersCount[i]+']</small>';
          //html=html+"<br/>";
	  html=html+"</li>";
        };
	html=html+"</ol>";

	//html=html+"<center>";
	//html=html+EMailsHTML('<font face="webdings" style="{text-decoration:none}">i </font>eMail members');
	//html=html+"</center>";
        if (EMails!=null && EMails.length>0) {
          html=html+'<center><a href="javascript:ShowEmailsWindow()">'+'<font face="webdings" style="{text-decoration:none}">i </font>all members eMail'+'</a></center>';
        };
        html=html+'<center><a href="javascript:RadioCheckPage()">Radio Check list</a></center>';
        //if (ZonesFRS!=null && ZonesFRS.length>0) {
          html=html+'<center><a href="javascript:ShowZonesFRS()">'+'<font face="webdings" style="{text-decoration:none}">i </font>Zones FRS radio'+'</a></center>';
        //};
        html=html+'<center><a href="javascript:ShowInactiveMembers()">'+'<font face="webdings" style="{text-decoration:none}">i </font>Inactive Members'+'</a></center>';

        html='<small><small>'+html+'</small></small>';

	return html;
};

    function showLocationDetails(ix)
    // Show a marker and open it's info window
    // show box for selected location
    {   
        if(LocationsPathPoints[ix]=='NOPOINT') {
          //alert('Google Maps CANNOT map\n'+Locations[ix][1]+'\n'+Locations[ix][2]);
          //alert("Google maps API cannot Geolocate: \n"+Locations[ix][1]+"\n"+Locations[ix][2]+"\nTel: "+Locations[ix][3]+"\n"+Locations[ix][6]);
          //alert("Google maps API cannot Geolocate: \n"+Locations[ix][1]+"\n"+Locations[ix][2]+"\nTel: "+Locations[ix][3]);
          if (confirm("No map area available for: \n"+Locations[ix][1]+"\n"+Locations[ix][2]+"\n\n"+"Show zone members map?")) {
            ShowZoneMap(Locations[ix][1]);
          };
          return;
        };
        map.closeInfoWindow(); // else get problems
        var marker = getMarkerIdent( Locations[ix][0] );
        //--eval(marker + ".openInfoWindowHtml(" + marker + ".html);");
        //LocationsMarkers[ix].openInfoWindowHtml(LocationsMarkers[ix].html);
        ShowOnlyZoneBox(ix);
        LocationsMarkers[ix].openInfoWindowHtml(LocationsMarkers[ix].html);
        //eval("GEvent.trigger(" + marker + ", click)");
    }


/*
function showLocation(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>"+LocationDescriptionHTML(ix)+"</div>";

  geocoder.getLatLng(
    address,
    function(point) {
      var where=point;
      if (!point) {
        LocationsUseLatLon[ix]=false;
 	if (lon==null || lat==null) {
	  lat=0;
	  lon=0;
          //alert("Google maps API cannot find: \n"+address+"\nusing lat="+lat+" lon="+lon);
          alert("Google maps API cannot Geolocate: \n"+address+"\nfix the address or use latitude longitude\n lat="+lat+" lon="+lon);
         } 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;

        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);
        //--eval(markerName + '.html = "' + html + '";');
        html="<div>"+LocationDescriptionHTML(ix)+"</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); }') );

        //am// eval("GEvent.addListener(" + markerName +", 'click', function() { " + markerName + ".openInfoWindowHtml(" + markerName + ".html);  } );");
        //am// eval("GEvent.addListener(" + markerName +", 'click', function() { " + markerName + ".openInfoWindowHtml(" + markerName + ".html); ShowOnlyZoneBox(ix); } );");
        //amev al("GEvent.addListener(" + markerName +", 'click', function() { " + markerName + ".openInfoWindowHtml(" + markerName + ".html,infoWindowOptionsNZ );  } );");

	//eval("GEvent.addListener(LocationsMarkers["+ix+"], 'click', function() { LocationsMarkers["+ix+"].openInfoWindowHtml(LocationsMarkers["+ix+"].html); } );" );
	eval("GEvent.addListener(LocationsMarkers["+ix+"], 'click', function() { LocationsMarkers["+ix+"].openInfoWindowHtml(LocationsMarkers["+ix+"].html,infoWindowOptionsNZ); } );" );

        //--eval("map.addOverlay(" + markerName + ");");
        map.addOverlay(LocationsMarkers[ix]);

	ShowLocationsPath(Locations.length);

    }
  );
}
*/

//-- /override


//-- /extra

