/* &copy; Copyright TIFOR, Inc.; 2005-2007. Content and design by TIFOR, Inc. All Rights Reserverd
  revisions:
    6/28-7/03 fixes, changes
                added dispDiv showing what current selections are
                re-opens info windows on date change
                printable directions
                printable map
                
    7/03/2007 changed from .my_iconState to isHidden()
    7/03/2007 locked live version to 2.82
    7/03/2007 finished GDirections and Local Search Control changes
    6/28/2007 split off sections of the main js code
    6/28/2007 started index2 branch for GDirections and Local Search Control
    2/23/2007 added close of overview map when info window opens
    2/23/2007 added scrolling to other weeks events
    1/15/2007 added ability to add new location from different ip
    9/13/2006 added edit for '204.116.141.31'
    9/06/2006 added FindAWinery
    8/27/2006 added Wine Trail Events
    8/27/2006 reopened info window on a zoomInOn()
    8/12/2006 added link to individual winery
    8/06/2006 added unescape() to address
    8/05/2006 added a zoom into selected location
    8/04/2006 changed meta desc, keywords, and title
 */

//some globals 
  var gMarkers =[];
  var gGroups =[];
  var gMIndex = 0 ;
  
  var map = '' ;
  var savedMarkers =[];
  var savedPointers =[]; 
  var cenLat = 39.760000 ;
  var cenLon = -97.998407 ;
  var zoom = 4 ;
  var cal = null ;
  var bounds = null ;
  var dataBounds = null ;
  var curCenter = null ;
  var tooltip ;
  var intervalID = null ;
  var aboutDiv = null ;
  var msgDiv = null ;
  var dispDiv = null ;
  var requestingData = true ;
  var moreRequest = '' ;
  var zoomingToMarker = 0 ;
  var IS_GROUP = -2 ;
  var firstTime = true ;
  var todaysWeek = -1 ;
  var markerTypes = 'all' ;
  var markersOpen = ' markers' ;
  // var state is brought in with php
  // var lockey and changesConfirmed are brough in with php
  // var ch is brough in with php

// only called from html body element
function loadMap(){

  Resized() ;
  // to make html more compliant with strict xhtml remove the target attribute of href's
  if (document.getElementsByTagName){
    var anchors = document.getElementsByTagName("a");
    for (var i=0; i<anchors.length; i++){
     var anchor = anchors[i];
     if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external")
       anchor.target = "_blank";
    }
  }else{
    alert('not compliant') ;
  }
  setUpMap() ;
  // set up tooltip div
  tooltip = document.createElement("div");
      // attach it to the map div
  map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);
      // hide it
  tooltip.style.visibility="hidden";

  // set in the how to, feedback & faq
  var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10)) ;
  pos.apply(objById('howto')) ;
  objById('howto').style.visibility = 'visible' ;
  objById('headr').appendChild(objById('howto')) ;
  pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,10)) ;
  pos.apply(objById('findusa')) ;
  objById('headr').appendChild(objById('findusa')) ;
  objById('findusa').style.visibility = 'visible' ;
  // set up my edits
  if(rac){
    pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(10,45)) ;
    pos.apply(objById('wcb')) ;
    objById('map').appendChild(objById('wcb')) ;
    objById('wcb').style.visibility = 'visible' ;
    objById('google_ad').innerHTML = 'Google Adware here' ;  
  }

  savedMarkers['green']=[];
  savedMarkers['blue']=[];
  savedMarkers['gray']=[];
  savedMarkers['yellow']=[];
  savedMarkers['purple']=[];
  savedMarkers['group']=[];
  savedPointers['green']= 0 ;
  savedPointers['blue']= 0 ;
  savedPointers['gray']= 0 ;
  savedPointers['yellow']= 0 ;
  savedPointers['purple']= 0 ;
  savedPointers['group']= 0 ;
  setUpCalendar() ;
  requestData() ;
  objById('displayDirections').checked = false ; 
  DisplayDirections() ; // needed to get firefox to expand map for printing
}

function Resized(){
  if(msie)
    return ;
  var ch = objById('map').style.height ;
  var nh = Math.max(windowHeight() -135, 680) + 'px' ;
  if(ch != nh){
    objById('map').style.height = nh ;
    objById('tourDirections').style.height= nh ;
  }
}

function setUpMap(){
    map = new GMap2(objById("map"),{draggableCursor: 'default', draggingCursor: 'move'}) ;
    map.addControl(new GLargeMapControl()) ;
    map.addControl(new GMapTypeControl()) ;
    var options ={resultList: google.maps.LocalSearch.RESULT_LIST_SUPPRESS};
    var lsc = new google.maps.LocalSearch(); 
    map.addControl(new google.maps.LocalSearch(options));
    //map.addControl(new google.maps.LocalSearch());
    var ovMap = new GOverviewMapControl() ;
    map.addControl(ovMap) ;
    
    GEvent.addListener(map, "click", function(overlay, point){
      if(msgDiv != null)
        msgDiv.style.visibility = 'hidden' ;
      if(findDiv != null){
        CloseFind() ;
      }
      if(!overlay && (passDiv != null || newDiv != null)){
        ClosePass() ;
      }
      if (overlay){
        if(overlay.my_name){
          if(overlay.my_pos == IS_GROUP){
            loadingMessage(true) ;
            zoomIn(overlay) ;
          }else{
            dispInfoWindow(overlay.my_pos);
          }
        }
      }
    });

    GEvent.addListener(map, "infowindowclose", function(){
      if(map.getInfoWindow().isHidden()){
        map.panTo(curCenter) ;
      }
	});

    GEvent.addListener(map, "dragend", function(){
      if(map.getInfoWindow().isHidden())
        if (!requestingData && map.getInfoWindow().isHidden()){         
          centerDataCheck() ;
        }     	
    });
    
    GEvent.addListener(map, "moveend", function(){
      if(map.getInfoWindow().isHidden())
        if(state != 'all') 
          if (!requestingData && map.getInfoWindow().isHidden()){
            centerDataCheck() ;
          }             
    });
    
    GEvent.addListener(map, "zoomend", function(){
      if(state != 'all')
        if (!requestingData && !zoomingToMarker){
          document.body.style.cursor = 'wait' ;
          zoom = map.getZoom() ;
          centerDataCheck() ;
          document.body.style.cursor = 'auto' ;
        }
    });
    map.enableDoubleClickZoom() ;
}

function hideInfoWindow(){
  if(msgDiv != null)
    msgDiv.style.visibility = 'hidden' ;
  if(!map.getInfoWindow().isHidden())
    map.getInfoWindow().hide() ;
}

/* marker info window display functions */
function dispInfoWindow(idx){
  try{
    gMIndex = idx ;
    if (state == 'all'){
      getState(gMarkers[gMIndex].my_abbrev, gMarkers[gMIndex].my_name) ;
      return ;
    }
    var secondTab = 'Tour' ;
    if(gMarkers[gMIndex].my_MyMarker){ // is it the marker I made
      var tourHtml = buildTourHtml() ;
      gMarkers[gMIndex].openInfoWindowHtml(gMarkers[gMIndex].my_html + tourHtml) ;
    }else{    
      var addHtml = buildAddlHtml() ;
      if(gMarkers[gMIndex].my_HrsSArray[0].match('next event') == null && gMarkers[gMIndex].my_memb == null){
        tourHtml = buildTourHtml() ;
      }else{
				if(gMarkers[gMIndex].my_memt == 'blue'){
      		secondTab = 'Wineries' ;
      		tourHtml = 'Multi-Winery tasting room for:' ;
      	}else{
        	secondTab = 'Members' ;
       	  tourHtml = 'For Wine Trails select an individual winery for your tour' ;
        	tourHtml += '<br>note: Not all members participate in all functions - check with member' ;
      	}
        if(gMarkers[gMIndex].my_memb != null){
          tourHtml += '<div style="height:9em;margin-left:1em;overflow:auto">' ;
          for(i = 0 ; i < gMarkers[gMIndex].my_memb.length ; i++){
            if(i)
              tourHtml += '<br/>' ;
            tourHtml += '<a href="javascript:fromWT(' + gMarkers[gMIndex].my_memn[i]+ ')">' + gMarkers[gMIndex].my_memb[i]+ '</a>' ;
          }
          tourHtml += '</div>' ;
        }
      }
      if(isInTour() == -1){
				if(gMarkers[gMIndex].my_memt == 'blue'){
      		gMarkers[gMIndex].openInfoWindowTabsHtml(
          	[new GInfoWindowTab('Times', '<div style="width:415px">' + gMarkers[gMIndex].my_link + addHtml + '</div>'),
         		 new GInfoWindowTab('Tour', gMarkers[gMIndex].my_link + buildTourHtml()),
         		 new GInfoWindowTab(secondTab, gMarkers[gMIndex].my_link + tourHtml),
          	 new GInfoWindowTab('Contact', gMarkers[gMIndex].my_html)]);
      	}else{
     	   gMarkers[gMIndex].openInfoWindowTabsHtml(
    	     [new GInfoWindowTab('Times', gMarkers[gMIndex].my_link + addHtml),
   	        new GInfoWindowTab(secondTab, gMarkers[gMIndex].my_link + tourHtml),
   	        new GInfoWindowTab('Contact', gMarkers[gMIndex].my_html)]);
				}        
       }else{
       	if(gMarkers[gMIndex].my_memt == 'blue'){
       		gMarkers[gMIndex].openInfoWindowTabsHtml(
          	[new GInfoWindowTab('Tour', gMarkers[gMIndex].my_link + buildTourHtml()),
         		 new GInfoWindowTab('Times', '<div style="width:415px">' + gMarkers[gMIndex].my_link + addHtml + '</div>'),
         		 new GInfoWindowTab(secondTab, gMarkers[gMIndex].my_link + tourHtml),
          	 new GInfoWindowTab('Contact', gMarkers[gMIndex].my_html)]);
       	}else{
      	  gMarkers[gMIndex].openInfoWindowTabsHtml(
   	      [new GInfoWindowTab(secondTab, gMarkers[gMIndex].my_link + tourHtml),
   	        new GInfoWindowTab('Times', gMarkers[gMIndex].my_link + addHtml),
   	        new GInfoWindowTab('Contact', gMarkers[gMIndex].my_html)]);
   	   	}        
      }
    }
    
  }catch(er){ alert('dispInfoWindow: ' + er) ; }
  if(changesConfirmed){
    alert('Your changes were previously confirmed.  Use the Change Information under the Contact tab for additional changes') ;
    changesConfirmed = false ;
  }
}

function myClick(i){
  dispInfoWindow(i) ;
  if(gMarkers[gMIndex].isHidden()){
    toggleMarker(true) ;
  }  
}

function toggleMarker(onOff){
  if (gMarkers[gMIndex].my_MyMarker)
    return ;
  if (!gMarkers[gMIndex].getPoint().lat())
    return ;
  if (!onOff){ // if off just do so!
    if (!gMarkers[gMIndex].isHidden()){
      gMarkers[gMIndex].hide() ;
    }
    return ;
  }
  if (onOff && gMarkers[gMIndex].isHidden()){
    gMarkers[gMIndex].show() ;
  }
}

function buildAddlHtml(){
  var html = '' ;
    // put in current hours string
  if (!gMarkers[gMIndex].my_MyMarker){  // a location marker
    var w = cal.date.getWeekNumber() ;
    if(!gMarkers[gMIndex].my_HrsSArray[w])
      w = 0 ;
    if(gMarkers[gMIndex].my_HrsSArray[w].match('Festival') == null && gMarkers[gMIndex].my_HrsSArray[w].match('Trail') == null){
      html += '<div style="text-align:left">Times for week <b>' ;
      html += getWeekOf() ;
      html +=  '</b><div style="text-align:left">' ;  
      html += '<b>' + gMarkers[gMIndex].my_HrsSArray[w]+ '</b>' ;
      if(gMarkers[gMIndex].my_AlsoBy && gMarkers[gMIndex].my_HrsSArray[w].match('By appoint') == null)
        html += '<br>Also by appointment' ;
    }else{
      html += '<div style="text-align:left">' ;
      html += '<b>' + gMarkers[gMIndex].my_HrsSArray[w]+ '</b>' ;
    }
    html += '</div>' ;
    // now the event string
    if(gMarkers[gMIndex].my_EvtArray.length || gMarkers[gMIndex].my_recurEventsArray.length)
      html += buildEvents() ;
    else
      html += 'events not known, check website' ;
    if(gMarkers[gMIndex].my_wtm != null){
    	var type = '' ;   
      for(var i = 0 ; i < gMarkers[gMIndex].my_wtm.length ; i++){
      	if(type != gMarkers[gMIndex].my_wtmt[i]){
      		type = gMarkers[gMIndex].my_wtmt[i];
      		if(type == 'A')
      			html += '<br>Member of (check for association events):' ;
      		else
      			html += '<br>Taste our wines at:' ;
      	}
        html+= '<br><a href="javascript:fromWT(' + gMarkers[gMIndex].my_memn[i]+ ')">' + gMarkers[gMIndex].my_wtm[i]+ '</a>' ;
      }
    }
    html += '<div style="font-style:italic;font-size:xx-small">' ;
    if(gMarkers[gMIndex].my_confirmed == ''){
      html += 'Information not confirmed - contact vineyard' ;
    }else{
      html += 'Information confirmed ' + gMarkers[gMIndex].my_confirmed ;
    }
    html += '<br/><input type="button" onClick="loadingMessage(true) ; zoomInOn()" value="Zoom in on this location"/>' ; 
    html += '</div>' ;
    html += '</div>' ;
    // where to go from here
    //html += '<br/>' ;
  }
  return html ;
}

function recurInWeek(w){
  for(var i = 0 ; i < gMarkers[gMIndex].my_recurEventsArray.length ; i++){
    var weeks = gMarkers[gMIndex].my_recurEventsArray[i].split('^', 2) ;
    var bweek = parseInt(weeks[0]) ;
    var lweek = parseInt(weeks[1]) ;
    if(bweek <= w && lweek >= w)
      return true ;
  }
  return false ;
}

function futureRecur(w){
  var txt = '' ;
  var wdays = new Array('Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur') ;
  for (var i = 0 ; i < gMarkers[gMIndex].my_recurEventsArray.length ; i++){
    var data = gMarkers[gMIndex].my_recurEventsArray[i].split('^') ;
    var bweek = parseInt(data[0]) ;
    var lweek = parseInt(data[1]) ;
    if(lweek > w){
      txt += '<br/>&nbsp;&diams; ' + wdays[parseInt(data[5])]+ 'days ' ;
      if(bweek > w)
        txt += data[2]+ ' ' ;
      txt +=  'through ' + data[3]+ ' <i>' + data[4]+ '</i>' ;
    }
  }
  return txt ;
}

function curRecur(w){
  var txt = '' ;
  var wdays = new Array('Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur') ;
  for (var i = 0 ; i < gMarkers[gMIndex].my_recurEventsArray.length ; i++){
    var data = gMarkers[gMIndex].my_recurEventsArray[i].split('^') ;
    var bweek = parseInt(data[0]) ;
    var lweek = parseInt(data[1]) ;
    if(bweek <= w && lweek >= w){
      txt += '<br/>&nbsp;&diams; ' + wdays[parseInt(data[5])]+ 'day ' ;
      txt +=  '<i>' + data[4]+ '</i>' ;
    }
  }
  return txt ;
}

function buildEvents(){
  var html = '<div>' ;
  var sWeekText = '' ;
  var w = cal.date.getWeekNumber() ;
  if(gMarkers[gMIndex].my_EvtArray[w]|| recurInWeek(w)){  // event in week selected
    html += '<div>Events in selected week:' ;
    if(gMarkers[gMIndex].my_EvtArray[w]){
      sWeekText = gMarkers[gMIndex].my_EvtSArray[w];
      html += '<br/>&nbsp;&bull;<i>' + sWeekText + '</i>' ;
    }
    html += curRecur(w) ;
    html += '</div>';    
  }else{
    html += '<div>No events in selected week' ;
  }
 // do other events 
  var firstLine = true ;
  var pText = futureRecur(w) ;
  if(pText.length){
    firstLine = false ;
    html += '<div>Events in other weeks:<div style="height:6em; overflow:auto">' + pText.replace('<br/>','') ;
  }
  var i = todaysWeek ;
  pText = '' ;
  while( i != -1){
    if(gMarkers[gMIndex].my_EvtArray[i])
      if(stringMatch(gMarkers[gMIndex].my_EvtSArray[i], pText) == false && stringMatch(gMarkers[gMIndex].my_EvtSArray[i], sWeekText) == false){
      //if(pText.indexOf(gMarkers[gMIndex].my_EvtSArray[i]) == -1){
        pText = '<br/><i>' + gMarkers[gMIndex].my_EvtSArray[i]+ '</i>' ;  
        if(firstLine){
          firstLine = false ;
          html += '<div>Events in other weeks:<div style="max-height:6em;overflow:auto">' ;
          pText = pText.replace('<br/>', '') ;
        }
        html += pText ;
      }
    i = (i + 1) % 54 ;
    if(i == todaysWeek)
      i = -1
  }
  html += '</div></DIV></div>' ;    
  return html ;
}


function checkMyMarker(){
  window.clearInterval(intervalID) ;
  loadingMessage(false) ;
  alert('Unable to geocode address') ;
}

function zoomInOn(){
  hideInfoWindow() ;
  zoom = parseInt(zoom + ((17 -zoom)/2)) ;
  if(zoom  > 17)
    zoom = 17 ;
  cenLat = gMarkers[gMIndex].getPoint().lat() ;
  cenLon = gMarkers[gMIndex].getPoint().lng() ;
  zoomingToMarker = 1 ;
  centerAndZoomMap() ;
  zoomingToMarker = 0 ;
  loadingMessage(false) ;
  dispInfoWindow(gMIndex) ;

}

function checkForMarker(id){
  var fid = -1 ;
  for (gMIndex = 0 ; gMIndex < gMarkers.length ; gMIndex++){
    if(gMarkers[gMIndex].my_id == gTour[id].my_id){
      gMarkers[gMIndex].my_inTour = true ;
      fid = gMIndex ;
      break ;
    }
  }
  if(fid == -1){
    fid = gMarkers.length ;
    gMarkers.push(gTour[id]) ;
    gMarkers[fid].my_pos = fid ;
    gMarkers[fid].my_inTour = true ;
  }
  return fid ;
}

function checkAgainstTypes(){
  if(!objById('idAm').checked && !objById('idEu').checked && !objById('idMe').checked)
    return false ;
  var onScreen = whatsOnScreen() ;
  if(!onScreen.length)
    return false ;
  var wineType = gMarkers[gMIndex].wtype ; 
  for(var i = 0 ; i < wineType.length ; i++){
    if (onScreen.indexOf(wineType.charAt(i)) != -1){
      return true ;  
    }
  }
  return false ;
}

function UpdateDisplay(){ // called from html when wine types changes
  if(!whatsOnScreen().length){
    displayMessage('Please select a wine type!') ;
    return ;
  }
  checkCalendar() ;
}

function whatsOnScreen(){
  var onScreen = '' ;
  if (objById('idAm').checked == true) onScreen += "A" ; 
  if (objById('idEu').checked == true) onScreen += "E" ; 
  if (objById('idMe').checked == true) onScreen += "MF" ;
  if(onScreen == 'AEMF')
    markerTypes = 'all' ;
  else
    markerTypes = 'Selected Wine Type(s)' ; 
  return onScreen ;
}
 // picks up click and opens info window

function VineyardSelect(){ // called from html
  var obj = objById('idselect') ;
  var selectedIndex = obj.selectedIndex ;
  if(state == 'all'){
    gMIndex = obj.options[selectedIndex].value ;
    getState(gMarkers[gMIndex].my_abbrev, gMarkers[gMIndex].my_name) ;
    return ;
  }
  if (selectedIndex){
    if(obj.options[selectedIndex].value < 0){
      alert(obj.options[selectedIndex].text + ' is not on map due to incomplete information') ;     
    }else{
      myClick(obj.options[selectedIndex].value) ;
    }
    obj.options.selectedIndex = 0 ;
  }  
}

/* screen display functions */
function resetSelections(){
  map.getInfoWindow().hide();
  resetWineType() ;
  resetDisplayDay() ;
  resetEventSelection() ;
  markerTypes = 'all' ;
  markersOpen = ' markers' ;
}

function resetWineType(){
  objById('idAm').checked = true ;
  objById('idEu').checked = true ;
  objById('idMe').checked = true ;  
  if(state == 'all' || !gMarkers.length){
    objById('idAm').disabled = true ;
    objById('idEu').disabled = true ;
    objById('idMe').disabled = true ;
  }else{
    objById('idAm').disabled = false ;
    objById('idEu').disabled = false ;
    objById('idMe').disabled = false ;
  }
}
function resetDisplayDay(){
  objById('openDay').checked = false ;
  objById('openWeek').checked = false ;
  objById('openAll').checked = true ;
  if (state == 'all' || !gMarkers.length){
    objById('openDay').disabled = true ;
    objById('openWeek').disabled = true ;
    objById('openAll').disabled = true ;
  }else{
    objById('openDay').disabled = false ;
    objById('openWeek').disabled = false ;
    objById('openAll').disabled = false ; 
  }
}
function resetEventSelection(){
  objById('eventWeek').checked = false ;
  objById('eventDay').checked = false ;
  if(state == 'all' || !gMarkers.length){
    objById('eventWeek').disabled = true ;
    objById('eventDay').disabled = true ;
  }else{
    objById('eventWeek').disabled = false ;
    objById('eventDay').disabled = false ;  
  }
  if(msgDiv != null)
    msgDiv.style.visibility = 'hidden' ;
}

function SetOpenDay(){  // called from html
  if(objById('openDay').checked){
    objById('eventWeek').checked = false ;
    objById('eventDay').checked = false ;
    objById('openWeek').checked = false ;
    objById('openAll').checked = false ;
    checkCalendar() ;
  }else{ // when unchecked set open week
    objById('openWeek').checked = true ;
    SetOpenWeek() ;
  }
}

function SetOpenWeek(){  // called from html
  if(objById('openWeek').checked){
    objById('openDay').checked = false ;
    objById('openAll').checked = false ;
    objById('eventDay').checked = false ;
    objById('eventWeek').checked = false ;
    checkCalendar() ;
  }else{ // when unchecked set open day
    objById('openDay').checked = true ;
    SetOpenDay() ;
  }
  
}

function SetOpenAll(){  // called from html
  if(objById('openAll').checked){
    objById('openDay').checked = false ;
    objById('openWeek').checked = false ;
    objById('eventDay').checked = false ;
    objById('eventWeek').checked = false ;
    checkCalendar() ;
  }else{ // when unchecked set open week
    objById('openWeek').checked = true ;
    SetOpenWeek() ;
  }
}

function SetEventWeek(){ // called from html
  if(objById('eventWeek').checked){
    objById('eventDay').checked = false ;
    objById('openDay').checked = false ;
    objById('openWeek').checked = false ;
    objById('openAll').checked = false ;
  }else{
    objById('openDay').checked = false ;
    objById('openAll').checked = true ;
    objById('openWeek').checked = false ;
  }
  checkCalendar() ;
}


function SetEventDay(){ //called from html
  today = new Date() ;
  if(objById('eventDay').checked){
    objById('eventWeek').checked = false ;
    objById('openDay').checked = false ;
    objById('openWeek').checked = false ;
    objById('openAll').checked = false ;
  }else{
    objById('openDay').checked = false ;
    objById('openAll').checked = true ;
    objById('openWeek').checked = false ;
  }
  
  checkCalendar() ;
}


function centerAndZoomMap(){
  map.setCenter(new GLatLng(parseFloat(cenLat), parseFloat(cenLon)), parseFloat(zoom));
}


function buildSidebar(){
  if(state == 'all'){ 
    bounds = new GLatLngBounds() ;
    if(dispDiv != null)
      dispDiv.style.visibility = 'hidden' ; 
  }else{
    onViewScreen() ;
  }
  var selObj = objById('idselect') ;

  for(var i = selObj.options.length -1 ; i >= 0 ; i--)
    selObj.options[i]= null ; 
  selObj.options.selectedIndex = 0 ;
  if(msgDiv != null)
    msgDiv.style.visibility = 'hidden' ;
  if (state == 'all'){
    selObj.options[0]= new Option('- Select State -', '') ;
  }else{
    selObj.options[0]= new Option('- Vineyards/Wineries -', '') ;
  }
  for (gMIndex=0 ; gMIndex < gMarkers.length ; gMIndex++){
    if(gMarkers[gMIndex].my_MyMarker)
      continue ;
    if (gMarkers[gMIndex].getPoint().lat() != 0){
      selObj.options[gMIndex + 1 ]= new Option(gMarkers[gMIndex].my_name, gMIndex) ;
      if(state == 'all')
        //if(gMarkers[gMIndex].my_name != 'Alaska' && gMarkers[gMIndex].my_name != 'Hawaii'){
          bounds.extend(gMarkers[gMIndex].getPoint()) ;
        //}
    }else{
      selObj.options[gMIndex + 1 ]= new Option(gMarkers[gMIndex].my_name, -1) ;
    }
  }
  if(gTour.length){
    tourObj = objById('idtour') ;
    i = tourObj.options.length ;
    for ( i-- ; i >= 0 ; i--){
      tourObj.options[i]= null ;
    }
    for (i = 0 ; i < gTour.length ; i++){ // set up tour
      if(gTour[i].my_id == IS_MYMARKER){ // user defined marker
        gTour[i].show() ;
        gTour[i].my_pos = gMarkers.length ;
        gMarkers[gMarkers.length]= gTour[i];
      }else{
        gTour[i].my_inTour = false ;
        gMIndex = checkForMarker(i) ;
        toggleMarker(true)        
        gTour[i]= gMarkers[gMIndex];
      }
      tourObj.options[i]= new Option(gTour[i].my_name, gTour[i].my_pos) ;    
    }
  }else{
    if(myMarker != null){
      myMarker.my_pos = gMarkers.length ;
      gMarkers[gMarkers.length]= myMarker ;
      myMarker.show() ;
    }
  }
  //if (state != 'all'){
   zoom = map.getBoundsZoomLevel(bounds) ;
   if(state != 'all' && zoom <= 3) zoom = 4 ; // if too large the mouseovers do not work
   curCenter = new GLatLng((bounds.getNorthEast().lat() - bounds.getSouthWest().lat())/2 + bounds.getSouthWest().lat(),
                      (bounds.getNorthEast().lng() - bounds.getSouthWest().lng())/2 + bounds.getSouthWest().lng()) ;
   cenLat = parseFloat(curCenter.lat()) ;
   cenLon = parseFloat(curCenter.lng()) ;
   //centerAndZoomMap() ;
   if(gMarkers.length)
     resetSelections() ;   
  //}
  loadingMessage(false) ;
  
  if(lockey != ''){
		if(lockey != -1){
	    var ret = findIdInMarkers(lockey) ;    
	    lockey = '' ;
	    if(ret !=  -1){
	      curCenter = gMarkers[ret].getPoint() ;
	      cenLat = curCenter.lat() ;
	      cenLon = curCenter.lng() ;
	      zoom = 12 ;
	      centerAndZoomMap() ;
	      bounds = map.getBounds() ;
	      myClick(ret) ; 
	    }else{
	      centerAndZoomMap() ;
	    }
		}else{
			// here from looking up by address
			// need zoom to show all
			zoom = map.getBoundsZoomLevel(bounds) + 1;
			map.setZoom(zoom) ;
			lockey = '' ;
		}  
  }else{
    	centerAndZoomMap() ;
  }
  requestingData = false ;
}

function getState(abbrev, name){
  loadingMessage(true) ; 
  requestingData = true ; 
  state = abbrev ;
  bounds = new GLatLngBounds() ;
  bounds.extend(new GLatLng(gMarkers[gMIndex].my_nelat, gMarkers[gMIndex].my_nelon)) ;
  bounds.extend(new GLatLng(gMarkers[gMIndex].my_swlat, gMarkers[gMIndex].my_swlon)) ;
  zoom = map.getBoundsZoomLevel(bounds) ;
  curCenter = new GLatLng((bounds.getNorthEast().lat() - bounds.getSouthWest().lat())/2 + bounds.getSouthWest().lat(),
                      (bounds.getNorthEast().lng() - bounds.getSouthWest().lng())/2 + bounds.getSouthWest().lng()) ; 
  cenLat = curCenter.lat() ;
  cenLon = curCenter.lng() ;
  centerAndZoomMap() ;
  centerData() ;
}

function centerDataCheck(){
  curCenter = map.getCenter() ;
  cenLat = parseFloat(curCenter.lat()) ;
  cenLon = parseFloat(curCenter.lng()) ;
  if(dataBounds == null){
    centerData() ;
    return ;
  }
  bounds = map.getBounds() ;
  if(!dataBounds.containsBounds(bounds)){
    centerData() ;
  }
}

function zoomIn(marker){
  // add up all the groups shown and decide how much to zoom in 
  bounds = map.getBounds() ;
  var tot = 0 ;
  for (gMIndex = 0 ; gMIndex < gMarkers.length ; gMIndex++){
    if (bounds.contains(gMarkers[gMIndex].getPoint()))
      tot ++ ;
  }
  for (gMIndex = 0 ; gMIndex < gGroups.length ; gMIndex++){
    if ( bounds.contains(gGroups[gMIndex].getPoint()))
      tot = parseInt(tot) + parseInt(gGroups[gMIndex].my_count) ;
  }
  
  if(tot > 70){
    bounds = new GLatLngBounds(marker.my_corner[0], marker.my_corner[2]) ;
    zoom = map.getBoundsZoomLevel(bounds) ;
  }else{
    zoom = map.getZoom() ;
  }
  cenLat = marker.getPoint().lat() ;
  cenLon = marker.getPoint().lng() ;
  zoom = map.getZoom() + 1 ;
  zoomingToMarker = 1 ;
  centerAndZoomMap() ;
  zoomingToMarker = 0 ;
  // get next zoom extents
  var px = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getCenter(),parseFloat(zoom + 1));
  var gpSW = new GPoint(px.x - 784/2, px.y + 530/2) ;
  var gpNE = new GPoint(px.x + 784/2, px.y - 530/2) ;
  var latlngSW = map.getCurrentMapType().getProjection().fromPixelToLatLng(gpSW,parseFloat(zoom + 1), true) ;
  var latlngNE = map.getCurrentMapType().getProjection().fromPixelToLatLng(gpNE,parseFloat(zoom + 1), true) ;
  moreRequest = '&count=' + marker.my_count + '&nn=' + latlngNE.toUrlValue() + '&ns=' + latlngSW.toUrlValue() ;
  centerData() ;
}

function centerData(){ 
  loadingMessage(true) ;
  requestingData = true ;
  var t = .5
  bounds = map.getBounds();
  dataBounds = new GLatLngBounds() ;
  dataBounds.extend(new GLatLng(bounds.getNorthEast().lat() + (bounds.getNorthEast().lat() - bounds.getSouthWest().lat()) * t ,
              bounds.getSouthWest().lng() - (bounds.getNorthEast().lng() - bounds.getSouthWest().lng()) * t)) ;
  dataBounds.extend(new GLatLng(bounds.getSouthWest().lat() - (bounds.getNorthEast().lat() - bounds.getSouthWest().lat()) * t ,
              bounds.getNorthEast().lng() + (bounds.getNorthEast().lng() - bounds.getSouthWest().lng()) * t)) ;

  requestData() ;
}

function Rld(){ // called from html reload page
  if(gTour.length){
    var msg = 'Returning to US Map will cancel your tour.' ;
    msg += "\nTry 'Find A Winery or Fesitval' for long distance tours.\n" ;
    msg += 'Cancel Tour?' ;
    if(!confirm(msg))
      return ;
  }
  if(requestingData)
    return ;
  state = 'all' ; 
  requestData() ;
}

/* initialization functions */
function requestData(){
  loadingMessage(true) ; 
  objById('usa').style.visibility = 'visible' ;
  if(state == 'all'){
   // cancelTour() ;
    cenLat = 39.760000 ;
    cenLon = -97.998407 ;
    zoom = 3 ;
    objById('usa').style.visibility = 'hidden' ;
    map.disableDragging();
    objById('MapKey').innerHTML='' ;
  }else{
    map.enableDragging();
    var ht = 'Icon Key - <img src="../images/mm_20_green.png">Vineyard/Winery' ;
    ht += '<img src="../images/mm_20_blue.png">Multi-WInery Tasting Room' ;
    ht += '<img src="../images/mm_20_yellow.png">Wine Festival/Event' ;
    ht += '<img src="../images/mm_20_purple.png">Wine Trail/Association' ;
    ht += '<img src="../images/mm_20_gray.png">Incomplete information' ;
    ht += '<img src="../images/dd-group.png">Group - click to zoom' ;
    objById('MapKey').innerHTML= ht ; 
  }
  map.getInfoWindow().hide();
  centerAndZoomMap() ;
  tooltip.style.visibility="hidden" ;
  for(gMIndex = 0 ; gMIndex < gGroups.length ; gMIndex++){
    gGroups[gMIndex].hide() ;
    if(rac)
      map.removeOverlay(gGroups[gMIndex].my_polyline) ;
  }
  for(gMIndex = 0 ; gMIndex < gMarkers.length ; gMIndex++)
    gMarkers[gMIndex].hide() ;
  gGroups =[];
  gMarkers =[];
  savedPointers['green']= 0 ;
  savedPointers['blue']= 0 ;
  savedPointers['gray']= 0 ;
  savedPointers['yellow']= 0 ;
  savedPointers['group']= 0 ;
  if(myMarker != null)
    myMarker.hide() ;  
  dataRequest() ;  
}

function dataRequest(){
  requestingData = true  ;
  gMIndex = 0 ;
  var request = openRequest() ;
  var http = '' ;
  if(lockey != ''){
  	if(lockey != -1)
    	http = 'buildIndMapData.php?state=' + state  + '&lockey=' + lockey ;
    else
    	http = 'buildLocMapData.php?coord=' + escape(new GLatLng(parseFloat(cenLat), parseFloat(cenLon)).toUrlValue()) ;
  }else{
    http = 'buildMapData02.php?zoom=' + zoom + '&state=' + state  ;
    if(dataBounds != null)
      http += '&dne=' + dataBounds.getNorthEast().toUrlValue() + '&dsw=' + dataBounds.getSouthWest().toUrlValue() ;
    if(bounds != null)
      http += '&mne=' + bounds.getNorthEast().toUrlValue() + '&msw=' + bounds.getSouthWest().toUrlValue() ;
    http += moreRequest ;
    moreRequest = '' ;
  }
  if(msie){
		var d = new Date()
		http += '&msie=' + d.getTime() ;
  }
  request.open("GET", http, true) ;
  request.onreadystatechange = function(){
    if (request.readyState == 4){
    	if (request.status == 200){
      var xmlDoc = request.responseXML ;
      var xmlData = xmlDoc.documentElement.getElementsByTagName('correction') ;
      if(xmlData.length)
        state = xmlData[0].getAttribute('newstate') ;
      if(state != 'all'){
        xmlData = xmlDoc.documentElement.getElementsByTagName('state') ;
        var newZoom = xmlData[0].getAttribute('newzoom') ;
        if(newZoom != 0){
          if(newZoom == 1){
            zoom++ ;
            map.zoomIn();
          }
        }
        if(xmlData[0].getAttribute('lp'))
          lockey = xmlData[0].getAttribute('lp') ;
        if(xmlData[0].getAttribute('stateId'))
          state = xmlData[0].getAttribute('stateId') ;
        dataBounds = new GLatLngBounds() ;
        dataBounds.extend(new GLatLng(parseFloat(xmlData[0].getAttribute('newdnelat')) ,  parseFloat(xmlData[0].getAttribute('newdnelng')))) ;
        dataBounds.extend(new GLatLng(parseFloat(xmlData[0].getAttribute('newdswlat')) ,  parseFloat(xmlData[0].getAttribute('newdswlng')))) ; 
        bounds = new GLatLngBounds() ;
        bounds.extend(new GLatLng(parseFloat(xmlData[0].getAttribute('newmnelat')) ,  parseFloat(xmlData[0].getAttribute('newmnelng')))) ;
        bounds.extend(new GLatLng(parseFloat(xmlData[0].getAttribute('newmswlat')) ,  parseFloat(xmlData[0].getAttribute('newmswlng')))) ;
        if(xmlData[0].getAttribute('bunch') == "2")
          resetSelections() ;
      }
      var markers = xmlDoc.documentElement.getElementsByTagName("marker") ;      
      for (var xml = 0 ; xml < markers.length ; xml++){	    
        var point = new GLatLng(parseFloat(markers[xml].getAttribute('lat')), parseFloat(markers[xml].getAttribute('lon'))) ;                
        var icolor = markers[xml].getAttribute("icolor") ;
        var marker = createAMarker(point, icolor) ;
        var label = unescape(markers[xml].getAttribute('name')) ;
        if(state == 'all'){
          var abbrev = markers[xml].getAttribute('abbrev') ;  // all
          marker.my_html = '<div><input type="button" onclick="getState(' + "'" + abbrev + ',' + label + "'" + ')" value="zoom to ' + label + '"/>' ;
          marker.my_html += "</div>" ;
          marker.my_abbrev = abbrev ;
          marker.my_count = markers[xml].getAttribute('count') ;
          marker.my_nelat = markers[xml].getAttribute('nelat') ;
          marker.my_nelon = markers[xml].getAttribute('nelon') ;
          marker.my_swlat = markers[xml].getAttribute('swlat') ;
          marker.my_swlon = markers[xml].getAttribute('swlon') ; 
          marker.my_other = '<br>' + markers[xml].getAttribute('count') + ' vineyards/wineries' ;      
        }else{
          marker.my_other = '' ;
          marker.my_id = markers[xml].getAttribute('id') ;
          marker.my_phone = markers[xml].getAttribute('phone') ;
          var facility = markers[xml].getAttribute('facility') ;
          var winetype = markers[xml].getAttribute('wtype') ;
          var http = unescape(markers[xml].getAttribute('http').replace('xxx', 'www')) ;
          var onlyBy = markers[xml].getAttribute('only') ;
          marker.my_confirmed = markers[xml].getAttribute('confirmed') ;
            // build the html
          marker.my_html = '<div style="text-align:center"><font size=+1>' ;
          marker.my_link = '<div style="text-align:center"><font size=+1>' ;
          if (http){
            marker.my_link += '<a href="http://' + http + '" target="_blank">' + label + '</a>' ;
            marker.my_html += '<a href="http://' + http + '" target="_blank">' + label + '</a>' ;
          }else{
            marker.my_html += label ;
            marker.my_link += label;
          }
          marker.my_html += '</font>' ;
          if(facility != ''){
            marker.my_html += ' <span class = "facility"> ' ;
            for(var i = 0 ; i < facility.length ; i++)           
              marker.my_html += '' + facility.charAt(i) ;
            marker.my_html += ' </span>' ;
          }
          marker.my_link = marker.my_html  + '</div><div> ' ;
          marker.my_html += '</div><div style="font-size: small">'				        
          if (marker.my_phone != '')
            marker.my_html += marker.my_phone + '<br/>' ;
          marker.my_address = unescape(markers[xml].getAttribute('address')) ;
          marker.my_html += marker.my_address + '<br/>' ;
          marker.my_city = markers[xml].getAttribute('city')
          marker.my_html += marker.my_city ;
          if(markers[xml].getAttribute('admin') == 'yes'){
          	marker.my_html += '<br/>' + unescape(markers[xml].getAttribute('cnt')) ;
						marker.my_html += '<br/>' + unescape(markers[xml].getAttribute('ema')) ;
						if(markers[xml].getAttribute('ns') != ''){
							if(parseInt(markers[xml].getAttribute('ns'),10))
								marker.my_html += '<br/>Newsletter' ;
						}
						if(markers[xml].getAttribute('uname') != ''){
								marker.my_html += '<br/>' + unescape(markers[xml].getAttribute('uname')) ;
						}
          }

          marker.wtype = winetype ;
          if (markers[xml].getAttribute('google') == 1)
            marker.my_google = true ;
          else
            marker.my_google = false ;
          if (markers[xml].getAttribute('also') == '1')
            marker.my_AlsoBy = true ;
          else
            marker.my_AlsoBy = false ;
          marker.my_MyMarker = false ;
          marker.my_inTour = false ;
            // do the hours
          var hrs = markers[xml].getElementsByTagName("newhrs") ;
          marker.my_HrsArray = null ;
          marker.my_HrsSArray = null ;
          for(var i = 0 ; i < hrs.length ; i++){
            if(!i){
              marker.my_HrsArray = new Array() ;
              marker.my_HrsSArray = new Array() ;
            }
            var w = parseInt(hrs[i].getAttribute('week')) ;
            marker.my_HrsArray[w]= hrs[i].getAttribute('opendays') ;
            marker.my_HrsSArray[w]= unescape(decodeURIComponent(hrs[i].getAttribute('hstring'))) ;
            if(onlyBy == '1' &&  hrs[i].getAttribute('opendays') == '0000000'){
              marker.my_HrsArray[w]= '1111111' ;
              marker.my_HrsSArray[w]= 'By appointment, check website' ;
            }         
          }
            // do the events
          marker.my_EvtArray = new Array() ;
          var evts = markers[xml].getElementsByTagName('event') ;
          marker.my_EvtSArray = null ;
          for (i = 0 ; i < evts.length ; i++){
            if(!i){
              marker.my_EvtSArray = new Array() ;
            }
            w = parseInt(evts[i].getAttribute('week')) ;
            marker.my_EvtArray[w]= evts[i].getAttribute('days') ;
            marker.my_EvtSArray[w]= unescape(decodeURIComponent(evts[i].getAttribute('html'))) ;    
          }
            // do the recurring events
          marker.my_recurEventsArray = new Array() ;
          evts = markers[xml].getElementsByTagName('recurevent') ;
          for (i = 0 ; i < evts.length ; i++){
            var str = evts[i].getAttribute('begweek') + '^' + evts[i].getAttribute('endweek') + '^' ;
            str += evts[i].getAttribute('begday') + '^' + evts[i].getAttribute('endday') + '^' ;
            str += unescape(decodeURIComponent(evts[i].getAttribute('html'))) + '^';   
            str += evts[i].getAttribute('weekday')  ;
            marker.my_recurEventsArray.push(str) ;
          }
          // do winetrail members and memberships
          marker.my_memb = null ;
          evts = markers[xml].getElementsByTagName('wm') ; // members
          for(i = 0 ; i < evts.length ; i++){
            if(!i){
              marker.my_memb = new Array() ;
              marker.my_memn = new Array() ;
              marker.my_memt = icolor ;
            }
            marker.my_memb.push(unescape(evts[i].getAttribute('name'))) ;
            marker.my_memn.push(evts[i].getAttribute('id')) ;
          }
          marker.my_wtm = null ;
          evts = markers[xml].getElementsByTagName('wt') ; // member of
          for(i = 0 ; i < evts.length ; i++){
            if(!i){
              marker.my_wtm = new Array() ;
              marker.my_wtmt = new Array() ;
              marker.my_memn = new Array()
            }
            marker.my_wtm.push(unescape(evts[i].getAttribute('name'))) ;
            marker.my_memn.push(evts[i].getAttribute('id')) ;
            marker.my_wtmt.push(evts[i].getAttribute('type')) ;
          }
        } // end of location data              
        if(marker.my_memb == null || icolor == 'purple') // not tasting rooms
        	marker.my_html += '<br><br><INPUT type="button" onclick="ChangeWinery()" value="Change Information"/>' ;
        marker.my_html += "</div>" ;

        marker.my_point = point ;
        marker.my_name =  label ;       
        gMarkers.push(marker) ;
        marker.my_pos = gMarkers.length -1 ; 
        if (marker.getPoint().lat() != 0){
          //map.addOverlay(marker) ;
          if(state != 'all') // display based on open times
            dispByCalSelection(cal.date.getWeekNumber(), cal.date.getDay()) ;
        }
        gMIndex++ ; // for dispByCalSelection function
        
      }// end markers loop
      var groups = xmlDoc.documentElement.getElementsByTagName("group") ;      
      for (var xml = 0 ; xml < groups.length ; xml++){	    
        var point = new GLatLng(parseFloat(groups[xml].getAttribute('lat')), parseFloat(groups[xml].getAttribute('lon'))) ; 
        var count = groups[xml].getAttribute('count') ;
        var icon = createStartEndIcon('group') ;       
        //var marker = createMarker(point, icon) ;
        marker = createAMarker(point, 'group') ; 
        marker.my_point = point ;
        marker.my_pos = IS_GROUP ;
        marker.my_corner =[];
        marker.my_corner[0]= new GLatLng(parseFloat(groups[xml].getAttribute('swlat')), parseFloat(groups[xml].getAttribute('swlon'))) ;// sw
        marker.my_corner[1]= new GLatLng(parseFloat(groups[xml].getAttribute('nelat')), parseFloat(groups[xml].getAttribute('swlon'))) ;// nw
        marker.my_corner[2]= new GLatLng(parseFloat(groups[xml].getAttribute('nelat')), parseFloat(groups[xml].getAttribute('nelon'))) ;// ne
        marker.my_corner[3]= new GLatLng(parseFloat(groups[xml].getAttribute('swlat')), parseFloat(groups[xml].getAttribute('nelon'))) ;// se
        marker.my_polyline = new GPolyline(marker.my_corner, '#808080', 1, .5) ;
        if(rac)
          map.addOverlay(marker.my_polyline) ;
        marker.my_name = count + ' vineyards/wineries ' ;
        marker.my_other = '<br>click to zoom' ;
        marker.my_count = count ;
        //map.addOverlay(marker);
        gGroups.push(marker) ;        
      }
      request = null ;
      buildSidebar() ;
    	}// end 200           
    }// end ready state
  }; // end function
  request.send(null) ;  
}

function createIconImage(icolor){
  if(icolor == 'group') 
    return(createStartEndIcon(icolor)) ;
  var icon = new GIcon();
  icon.image = '../images/mm_20_' + icolor + '.png' ;
  icon.shadow = '../images/mm_20_shadow.png';
  icon.iconSize = new GSize(12, 20);
  icon.shadowSize = new GSize(22, 20);
  icon.iconAnchor = new GPoint(6, 20);
  icon.infoWindowAnchor = new GPoint(5, 1);
  return icon ;
}

function createStartEndIcon(type){
  if(type == 'orange')
    return createIconImage(type) ;
  var icon = new GIcon();
  icon.image = '../images/dd-' + type + '.png' ;
  icon.shadow = '../images/shadow50.png' ;
  icon.iconSize = new GSize(20,34);
  icon.shadowSize = new GSize(37, 34);
  icon.iconAnchor = new GPoint(9, 34);
  icon.infoWindowAnchor = new GPoint(9, 2);
  return icon ;
}

function createAMarker(point, color){
  var marker ;
  while(savedPointers[color]!= savedMarkers[color].length && savedMarkers[color][savedPointers[color]].my_inTour){
    savedPointers[color]++ ;    
  }
  if(savedPointers[color]== savedMarkers[color].length){
     marker = createMarker(point, createIconImage(color)) ;
     savedMarkers[color][savedPointers[color]]= marker ;
     if (point.lat() != 0)
       map.addOverlay(marker)
  }else{
     marker = savedMarkers[color][savedPointers[color]];
     marker.setPoint(point) ;
     if (point.lat() != 0)
       marker.show() ;    
  }
  savedPointers[color]++ ;
  return marker ; 
}

function createMarker(point, icon){
  try{
    var marker = new GMarker(point, icon) ;
        
    GEvent.addListener(marker,"mouseover", function(){
      showTooltip(marker) ;
    });        
        
    GEvent.addListener(marker,"mouseout", function(){
      tooltip.style.visibility="hidden" ;
    });
    
    return marker ;
  }catch(er){ alert (er) ; return null ; }
}

function showTooltip(marker){
  tooltip.innerHTML = '<div class="tooltip" style="white-space: nowrap ;">' + marker.my_name + marker.my_other + '</div>' ;
  
  var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
  var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
  var anchor=marker.getIcon().iconAnchor;
  var width=marker.getIcon().iconSize.width;
  var height=tooltip.clientHeight;
  var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height)); 
  pos.apply(tooltip);
 
  tooltip.style.visibility="visible" ;
}

function AboutMap(){
  if(firstTime)
    ClearLoadMessage() ;
  var text = '<div style="width:500px; padding-left: 8px; padding-top:3px; padding-right:3px">' ; 
  text += '<div style="float:right; font-size:smaller"><input type="button" onClick="closeAbout()" value="X"/></div>' ;
  text += '<br/>WINES and TIMES offers features that allow you to plan a tour that suits your unique taste.' ;
  text += '<br/><br>SELECT WINES: Check boxes at top of screen to select <i>European</i> (Vitis vinifera/hybrids) varieties, <i>American</i> (muscadine, Niagra, Concord, etc.)' ;
  text += ', or <i>Meads/Fruit</i> wines (honey, fruit, etc.).';
  text += '<p>SELECT TIMES: Current week is shown on calendar at right.  You can select the week or day of your choice.' ;
  text += ' Corresponding times will show for selected wineries.  Be sure to re-check your tour winery times after changing the calendar.'
  text += "<p>SELECT EVENTS: Don't miss a festival, concert, or special tasting during your selected dates." ;
  text += '<br/><br>SELECT ICON: Mouse over displays state overview or winery name; click for details.  Use the pop-up balloon tour tab to create ' ;
  text += ' your personalized tour with Google directions.' ;
  text += '<br/><br/>Facilities codes: <span class="facility">T</span> for tasting, <span class="facility">W</span>' ;
  text += ' for winery, <span class="facility">V</span> for vineyard, and <span class="facility">R</span> for restaurant.' ;
  text += '<br><br>Google Map controls:' ;
  text += '<br>&#149; to Zoom in and out, use the "+" and "-" controls.' ;
  text += '<br>&#149; to Move the map in large steps, use the arrow buttons.' ;
  text += '<br>&#149; to Move the map in small steps, click and drag the map.' ;
  text += '<br>&#149; to Re-call original center, use the Refresh Map button.' ;
  text += '<br>&#149; to Center on a new point, double click on any area on the map.' ;
  text += '<br/><br/></div>' ;
 
  if(aboutDiv == null){ 
    aboutDiv = document.createElement("div");
    aboutDiv.setAttribute("id","aboutDiv");
    aboutDiv.style.border="1px #006699 solid";
    aboutDiv.style.backgroundColor="#ffffff";
      // move it to the map div
    objById("map").appendChild(aboutDiv);
    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10, 10)) ;
    pos.apply(objById("aboutDiv")) ;
  }
  aboutDiv.innerHTML = text ; 
  aboutDiv.style.visibility="visible";
}

function displayMessage(msg){
  if(msgDiv == null){
    msgDiv = document.createElement("div");
    msgDiv.setAttribute("id","msgDiv");
    msgDiv.style.border="1px #006699 solid";
    msgDiv.style.backgroundColor="#ff3333";
      // move it to the map div
    objById("map").appendChild(msgDiv);
    var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(40, 40)) ;
    pos.apply(objById("msgDiv")) ;
  }
  msgDiv.innerHTML = msg ;
  msgDiv.style.visibility = 'visible' ;

}

function closeAbout(){
  aboutDiv.style.visibility="hidden";
}

/* calendar functions */
function setUpCalendar(){
  try{
  var today = new Date() ;
  var years = new Array(2) ;
  years[0]= today.getFullYear() ;
  years[1]= years[0]+ 1 ;
  cal = new Calendar(1, null, calDateChanged, calOnClose);
  cal.weekNumbers = false ;
  cal.showsOtherMonths = true ;
  cal.setRange(years[0], years[1]);
  cal.setDateStatusHandler(this.getDateStatus) ;
  cal.create(objById('calendar'));
  todaysWeek = cal.date.getWeekNumber() ;
  }catch(er){ alert('in setUpCalendar ' + er) ; }
}

function calOnClose(){
  cal = null ;
  //alert('CALENDAR closed!!!!') ;
  objById('calendar').innerHTML = '' ;
  setUpCalendar() ;
}

function getDateStatus(date, y, m, d){
  var today = new Date() ;
  if(date.getYear() > today.getYear())
    if(date.getMonth() > today.getMonth())
      return true ;
    else
      return false ;
  if(date.getFullYear() < today.getFullYear())
    return true ;
  if(date.getMonth() > today.getMonth())
    return false ;
  if(date.getMonth() < today.getMonth())
    return true ;
  if(date.getDate() < today.getDate())
    return true ;
  return false ;
}

function displayByEventSelection(){
  if(msgDiv != null)
    msgDiv.style.visibility = 'hidden' ;
  resetWineType() ;
  centerAndZoomMap();
  var viewBounds = map.getBounds() ; 
  var someDisplayed = false ;
  var week = cal.date.getWeekNumber() ; 
  var day = cal.date.getDay() ;
  for(gMIndex = 0 ; gMIndex < gMarkers.length; gMIndex++){
    if(gMarkers[gMIndex].my_MyMarker)
      break ;
    var flag = false ;
    if(gMarkers[gMIndex].my_EvtArray[week]&& viewBounds.contains(gMarkers[gMIndex].getPoint())){     
      if(!objById('eventDay').checked)
        flag = true ;
      else
        if(gMarkers[gMIndex].my_EvtArray[week].charAt(day) == '1')
          flag = true ;
    }
    toggleMarker(flag) ;
    if(!someDisplayed && flag)
      someDisplayed = true ;   
  }
  if(!someDisplayed){
    var t = 'No locations in map view area have events ' ;
    if(objById('eventDay').checked)
      t += 'on ' + getFmtDateSelected() ;
    else
      t += 'in week ' + getWeekOf() ;
    displayMessage(t) ;
  }
}

function checkCalendar(){
  map.getInfoWindow().hide() ;
  if(msgDiv != null)
    msgDiv.style.visibility = 'hidden' ;
  if(objById('eventDay').checked || objById('eventWeek').checked){
    displayByEventSelection() ;
  }else{
    displayByCalSelection(cal.date.getWeekNumber(), cal.date.getDay()) ;
  }
  onViewScreen() ;
}

function displayByCalSelection(week, day){
  if(msgDiv != null)
    msgDiv.style.visibility = 'hidden' ;
  //try{ 
  var someDisplayed = false ;
  var vBounds = map.getBounds() ;
  for(gMIndex = 0 ; gMIndex < gMarkers.length ; gMIndex++){   
    if(gMarkers[gMIndex].my_MyMarker)
      continue ;
    if(!vBounds.contains(gMarkers[gMIndex].getPoint()))
      continue ;
    var flag = dispByCalSelection(week, day, vBounds) ;
    if(!someDisplayed && flag)
      someDisplayed = true ;
  }
  if(!someDisplayed){
    var t = 'No locations in map view area are open ' ;
    if(objById('openDay').checked)
      t += 'on ' + getFmtDateSelected() ;
    else
      t += 'in week ' + getWeekOf() ;
    if(whatsOnScreen() != 'AEMF')
      t += ' for selected wine types' ;
    displayMessage(t) ;
  }else{
    if(objById('openDay').checked)
      markersOpen = ' open on ' + getFmtDateSelected() ;
    else if(objById('openWeek').checked)
      markersOpen = ' open in week ' + getWeekOf() ;
    else
      markersOpen = ' markers' ;
  }
  //}catch(er){ alert('in displayByCalSelection ' + er) ; }
}

function dispByCalSelection(week, day, vBounds){
    var w = week ;
    var flag = true ;
    if(!gMarkers[gMIndex].my_HrsArray[w])
      w = 0 ;
    if(objById('openDay').checked){ 
      if(gMarkers[gMIndex].my_HrsArray[w].charAt(day) == '0')
        flag = false ;
    }else if(objById('openWeek').checked){
      if(gMarkers[gMIndex].my_HrsArray[w]== '0000000')
        flag = false ;
    }else{
      flag = true ;
    }
    if(flag)
      flag = checkAgainstTypes() ;
    toggleMarker(flag) ;
    return flag ;
}

function calDateChanged(calendar){
  var infoOpen = map.getInfoWindow().isHidden() ;
  var idx = gMIndex ;
  if(objById('eventDay').checked || objById('eventWeek').checked)
    displayByEventSelection() ;
  else
    displayByCalSelection(calendar.date.getWeekNumber(), calendar.date.getDay()) ;
  if(!infoOpen)
    dispInfoWindow(idx) ;
}

function getWeekOf(){
  var day = cal.date.getDay() ;
  var offset = 0 ;
  if(!day)
    offset = 6
  else
    offset = day - 1 ;
  var fow = new Date(cal.date) ;
  fow.setDate(fow.getDate() - offset) ;
  var txt = fow.print('%m/%d/%y')  + '-' ;
  fow.setDate(fow.getDate() + 6) ;
  return txt + fow.print('%m/%d/%y') ;
}

function getFmtDateSelected(){
  return cal.date.print('%m/%d/%y') ;
}

function FeedbackForm(){
  window.open("feedback.html")
}

function Faq(){
  window.open("faq.php")
}

function loadingMessage(display){
  if(display)
    objById('load').style.visibility = 'visible' ;
  else
    if(!firstTime)
      objById('load').style.visibility = 'hidden' ;
    else
      if(state != 'all')
        ClearLoadMessage() ;   
}

function ClearLoadMessage(){
  var obj = objById('load') ;
  obj.style.visibility = 'hidden' ;
  obj.style.opacity = .75;
  obj.style.filter = 'alpha(opacity=75)';
  var txt = 'Loading ... mention <i>Wines and Times</i> on your visits<br/><br>' ;
  txt += 'Display only wineries of interest using the calendar with Wines/Times/Event check boxes' ;
  obj.innerHTML= txt ;
  firstTime = false ;
}

function onViewScreen(){
  var t = 'Displaying' ;
  if(objById('openAll').checked && (!objById('eventWeek').checked || !objById('eventDay').checked)){
    t+= ' all' ;
    t +=  ' locations ' ;
  }else{
    t +=  ' locations ' ;
    if(!objById('eventWeek').checked && !objById('eventDay').checked){
      t += ' open ' ;
      if(objById('openDay').checked)
        t += 'on ' + getFmtDateSelected() ;
      else
        t += 'in week  ' + getWeekOf() ;
    }else{
      if(objById('eventWeek').checked)
        t += ' having events in week ' + getWeekOf() ;
      if(objById('eventDay').checked)
        t+= ' having events on ' +  getFmtDateSelected() ;
    }
  }
  // 
  if(markerTypes != 'all')
    t += ' with ' + markerTypes ;
  if(dispDiv == null){
    dispDiv = document.createElement("div");
    dispDiv.setAttribute("id","dispDiv");
   // dispDiv.style.border="1px #006699 solid";
    dispDiv.style.backgroundColor="#ffff33";
    dispDiv.style.filter = 'alpha(opacity=75)';
    //dispDiv.style.filter.alpha.opacity=50 ;
    dispDiv.style.MozOpacity=0.75 ;
    objById("map").appendChild(dispDiv);
    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(47, 7)) ;
    pos.apply(objById("dispDiv")) ;      
  }
  dispDiv.innerHTML = t ;
  dispDiv.style.visibility = 'visible' ;
}

function fromWT(id){
  var t = findIdInMarkers(id) ;
  if(t >= 0){
    myClick(t) ;
  }else{
    requestingData = true ;
    lockey = id ;
    requestData() ;
  }
}

function EditWinery(){
  document.location.replace('locationEdit.php?key=' + gMarkers[gMIndex].my_id) ;
}

function NewLocation(type){
  document.location.replace(type) ;
}


// end of file

