/* &copy; Copyright TIFOR, Inc.; 2005-2007. Content and design by TIFOR, Inc. All Rights Reserverd
  revisions:
    7/03/2007 added popup directions
    6/29/2007 added GDirections
    6/27/2007 separated from index2.js
*/
 
  var gTour = [] ; // array of the tour markers
  var gTourPoly = [] ;  // array of google routes
  var gTourRoute = [] ;  // array of google directions
  var gTourSeconds = 0 ;
  var gTourMeters = 0 ;
  var gTourCopyrights ;
  var polyLine = null ;
  var polyPoints = [] ;
  var wayPoint = 1 ;
  var IS_MYMARKER = -3 ;
  var popUp = null ;
  var myMarker = null ;
  
function buildTourHtml() { 
  var html = '' ; 
  if(gTour.length == 0){ // no location in tour
    html = '<input type="checkbox" onClick="setTourStart()"/>Start your tour here<br>'  ;
    if(gMarkers[gMIndex].my_MyMarker){
      html += 'or change your tour starting location:<br/>' ;
    } else {   
      html += 'or from your starting address:<br/>' ;
    }    
    html += '<input id="pointdesc" type="text" size="45" maxlength="60" onChange="createTourWaypoint()"/>' ;
    if(msie){
      html += '<br/><input type="button" value="Submit"/>' ;
    }
    html += '<div style="font-size:xx-small">(1600 Amphitheatre Parkway Mountain View CA 94043)</div>' ;
  } else {
    var inTour = isInTour() ;
    var obj = objById('idtour') ;
    html = '' ;
    for(var i = 0 ; i < 70 ; i++)
      html += '&nbsp;' ; // to set min size for info window
    html += '<br/>'
    if(inTour == -1){ // not in the tour       
        html += '<input type="checkbox" onClick="addItineraryTo()">Next Stop on Tour'  ;
    } else {  // in tour 
      var tourStops = timesInTour(inTour) ;
      var br = '' ;
      if(tourStops < 2 && gMarkers[gMIndex].my_id != gTour[gTour.length -1].my_id){
        html += '<input type="checkbox" onClick="addItineraryTo()">Next Stop on Tour'  ;
        br = '<br/>' ;
      }    
      if(!inTour){ // first in tour
        html +=  br + '<input type="checkbox" onClick="cancelTour(); centerAndZoomMap()">Cancel Tour'  ;
        br = '<br/>' ;
      }
      if(inTour){ // not the first only last
        html += br + '<input type="checkbox" onClick="removeFromTour()">Remove from Tour'  ;
        br = '<br/>' ;
      } 
    }
  }
  //html += '</div>' ;
  return html ;
}

function createTourWaypoint(){
  if (gTour.length == 0)
    image = 'start' ;
  else
    image = 'orange' ;
  map.getInfoWindow().hide() ;
  var addr = objById('pointdesc').value ;
  if(addr == '')
    return ;
  loadingMessage(true) ;
  streetAddr(addr, image) ;
}


function cancelTour() {
  map.getInfoWindow().hide() ;
  if(!gTour.length)
    return ;
  for(var i = gTourPoly.length -1 ; i >= 0 ; i--)
    map.removeOverlay(gTourPoly[i]) ;
  clearTourDetails() ;
  var obj = objById('idtour') ;
  var i = obj.options.length ;
  for ( i-- ; i >= 0 ; i--){
    obj.options[i] = null ;
  }
  for(i = 0 ; i < gTour.length ; i++)
    gTour[i].my_inTour = false ;
  gTour = [] ;
  DisplayDirections() ;
}

function removeFromTour(){
  try{
    map.getInfoWindow().hide() ;
    // pop off all above the one to remove to tmp
    var tmpT = [] ;
    var tmpR = [] ;
    var tmpP = [] ;
    var index = lastInTour() ;
    gTour[index].my_inTour = false ;
    for(var i = 0 ; i < gTour.length ; i++){
      if(i != index)
        tmpT.push(gTour[i]) ;
      if(i < gTourPoly.length)
        map.removeOverlay(gTourPoly[i]) ;
    }
    gTour = tmpT ;
    clearTourDetails();
    for (var i = 0 ;i < gTour.length -1 ; i++)
      googleDir(i, i+1) ;
    // remove from directions window and tour select box
    objById('idtour').options[index] = null ;
    if(objById('idtour').options.length > 0 ){
      if (index == 0)
        objById('idtour').options[0].text = 'fr: ' + gMarkers[objById('idtour').options[0].value].my_name ;
    }
    centerOnTour() ;
  } catch(er) { alert(er) ; } 
}

function googleDirectionsFrom(){  // directions from this marker to next
  var idx = lastInTour() ;
  if(idx == -1){
    alert('not in tour') ;
    return ;
  }
  googleDir(idx - 1, idx) ;
  centerOnTour() ;
}

function googleDirectionsTo(){  // direction to this marker from previous
  if(isInTour() == -1)
    addItineraryTo() ;
  idx = isInTour() ;
  if(idx < 1){
    alert('Not in tour') ;
    return ;
  }
  googleDir(idx - 1 , idx) ;
  centerOnTour() ;
}

function googleDir(from, to){  // displays map & instruction in lower iframe
  map.getInfoWindow().hide() ;
  var a = [] ;
  a[0] = gTour[from].getPoint() ;
  a[1] = gTour[to].getPoint() ;
  var directions = new GDirections() ;
  directions.loadFromWaypoints(a, {getPolyline:true, getSteps:true, locale:"en_US"}) ; 
  GEvent.addListener(directions, "load", function() {
    gTourPoly.push(directions.getPolyline()) ;
    gTourRoute.push(directions.getRoute(0)) ;
    //logger(directions.getNumRoutes()) ;
    gTourMeters += directions.getDistance().meters ;
    gTourSeconds += directions.getDuration().seconds ;
    gTourCopyrights = directions.getCopyrightsHtml() ;
    map.addOverlay(gTourPoly[gTourPoly.length -1]) ;
    objById('travelInfo').innerHTML = travelInfo() ;
    if(objById('displayDirections').checked)
      DisplayDirections() ;  
  });
  GEvent.addListener(directions, "error", function() {
    alert(directions.getStatus()) ;    
  });
 // notify if directions are bad
  if(!gTour[to].my_google){
    alert(gTour[to].my_name + ' has reported errors in Google diretions. Call ahead for corrections.') ;
  } 
}

function addItineraryTo(){
  map.getInfoWindow().hide() ;
  if(gMarkers[gMIndex] == gTour[gTour.length - 1])
    return ;
  var obj = objById('idtour') ;
  gTour.push(gMarkers[gMIndex]) ;
  gMarkers[gMIndex].my_inTour = true ;
  obj.options[obj.options.length] = new Option(gMarkers[gMIndex].my_name, gMIndex) ;
  googleDir(gTour.length -2, gTour.length -1) ;
  centerOnTour() ;
}

function setTourStart(){
  map.getInfoWindow().hide() ;
  // this is the tour start
  gTour[0] = gMarkers[gMIndex] ;
  gMarkers[gMIndex].my_inTour = true ;
  var obj = objById('idtour') ;
  obj.options[0] = new Option(gMarkers[gMIndex].my_name, gMIndex)
  polyPoints[0] = [] ;
  polyPoints[0][0] = gTour[0].getPoint() ;
}

function doTourMarker(point, image){
  var marker ;
  if(myMarker != null){
    marker = myMarker ;
    myMarker.setPoint(point) ;
  } else {
    var icon = createStartEndIcon(image) ;
    marker = createMarker(point, icon) ;
    marker.my_pos = gMarkers.length ;
    marker.my_id = IS_MYMARKER ;
    marker.my_MyMarker = true ;
    map.addOverlay(marker) ;    
    //gMIndex = gMarkers.length // gMIndex is set from icons
    gMarkers[gMarkers.length] = marker ;
    myMarker = marker ;   
  }  
  marker.my_name = objById('pointdesc').value ;
  marker.my_other = '' ;
  if(image != 'start')
    if(objById('pointdesc').value == 'Waypoint ' + wayPoint)
      wayPoint++ ;
  marker.my_html = '<div style="width:350px"><div><font size=+1>' + marker.my_name + '</font>' + '</div>' ;
  marker.my_google = true ;
  if(image == 'start'){   
    obj = objById('idtour') ;    
    gTour[0] = marker ;
    obj.options[0] = new Option(marker.my_name, marker.my_pos) ;
    polyPoints[0] = [] ;
    polyPoints[0][0] = marker.getPoint() ;
  }
  addItineraryTo() ;
}

function MyTour(){ // called from html
  var obj = objById('idtour')
  var pos = obj.options[obj.selectedIndex].value ;
  myClick(pos) ;
  obj.options.selectedIndex = -1 ; // reset so if they close info window and click again it will pop up
}

function removePolyLine(){
  if(polyLine != null)
    map.removeOverlay(polyLine) ;
  polyLine = null ;
}


function streetAddr(addr, image){
  addr = addr.replace(/,/g, ' ') ;
  // get geocode
  var http='geocoder.php?q=' + escape(addr) ;
  if(msie){
      var d = new Date()
      http += '&msie=' + d.getTime() ;
    }
  var request = openRequest() ;

  request.open('GET', http, true) ;
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      // set up timeout for this function
      intervalID = window.setInterval("checkMyMarker()", 8000) ;
      if (request.status != 200) {      
        window.clearInterval(intervalID) ;
        alert('Unable to geocode ' + addr);
      } else {
      	window.clearInterval(intervalID) ;
        var xmlDoc = request.responseXML;
        if (!xmlDoc) {
          alert('Unable to geocode ' + addr);         
        } else {
          var result = xmlDoc.documentElement.getElementsByTagName('Message') ;
          //alert(result.length) ;
          if(result.length) {
            alert('Unable to geocode ' + addr) ;
          }
          result = xmlDoc.documentElement.getElementsByTagName('Result') ;
          if(result.length){
            var ans = result[0].getAttribute('precision') ;
            if(!ans){
              alert('Unalbe to geocode ' + addr);
            } else {
              var newP = new GLatLng(parseFloat(xmlDoc.getElementsByTagName('Latitude')[0].firstChild.data),parseFloat(xmlDoc.getElementsByTagName('Longitude')[0].firstChild.data)) ; 
              if(image != null){
              	doTourMarker(newP, image) ;
              	if(image != null && ans != 'address' )
                	alert('Sorry, not a very accurate Geocode conversion.' + "\n" + 'Placed as close as possible.') ;
              } else {
              	doOurLocation(newP) ;
              }
                            
            }            
          }
        }
      }
      loadingMessage(false) ;
    } // end state
  } ;
  request.send(null) ;
}

/* tour support functions */

function centerOnTour(){
  if(gTour.length < 2)
    return ;
  if(objById('centerTour').checked == false)
    return ;
  var tbounds = new GLatLngBounds() ;
  for(var i = 0 ; i < gTour.length ; i++)
    tbounds.extend(gTour[i].getPoint()) ;
  zoom = map.getBoundsZoomLevel(tbounds) ;
  zoom -- ;
  curCenter = new GLatLng((tbounds.getNorthEast().lat() - tbounds.getSouthWest().lat())/2 + tbounds.getSouthWest().lat(),
                      (tbounds.getNorthEast().lng() - tbounds.getSouthWest().lng())/2 + tbounds.getSouthWest().lng()) ;
  cenLat = curCenter.lat() ;
  cenLon = curCenter.lng() ;
  centerAndZoomMap() ;
}

function printDirections(){
  // here we want to do a pupup for printing
  ClosePopUp() ;
  
  var properties = 'channelmode=0,' ;
     properties += 'directories=0,' ;
     properties += 'fullscreen=0,' ;
     properties += 'height=700,' ;
     properties += 'width=700,' ;
     properties += 'location=0,' ;
     properties += 'menubar=1,' ;
     properties += 'resizeable=1,';
     properties += 'scrollbars=1,';
     properties += 'status=0,';
     properties += 'titlebar=0,';
     properties += 'toolbar=0,';
     properties += 'top=0' ;
      
  var disclaim = 'These directions are for planning purposes only.  You may find that ' ;
  disclaim += 'road conditions, weather, traffic, detours, or other events may cause travel time and distance to differ from ' ;
  disclaim += 'these calculations. Also, many vineyards are in rural areas where maps and directions are more prone to error. ' ;
  disclaim += 'You should confirm these directions with the wineries you are visiting.' ;
  var corrto = 'Please report map and direction discrepancies  ' ;
  corrto += 'so we can alert our other users (support@winesandtimes.com).' ;
  
    
  popUp = window.open('','_blank' ,properties);
  popUp.document.title = 'Wines and Times - Tour Directions' ; 
  if(msie){
    var html = '<div style="width:100%;background-color:#ccccff;border:1px solid black;left:5px;margin-bottom:5px;' ;
    html += 'text-align:center;color:black;font-family:Cezane, sans-serif;font-size:x-large">' ;
    html += 'Wines and Times</div>' ;
    html += '<div><h1>Wines and Wines and Times Tour Directions</h1>' ;
    html += '<h2>Estimated driving time and distance for your tour is ' + travelInfo() + '</h2>' ;
    popUp.document.write(html) ;
    popUp.document.write(buildMsieDirections(true))  ;
    popUp.document.write('<p>' + disclaim + '</p>') ;
    popUp.document.write('<p>' + corrto + '</p></div>') ;
    popUp.focus() ;
  } else {
    var div = document.createElement('div') ;
    div.style.width = '99%' ;
    div.style.backgroundColor= "#ccccff" ;
    div.style.border= "1px solid black" ;
    div.style.left= "5px" ;
    div.style.marginBottom= "5px" ;
    div.style.padding= "5px" ;
    div.style.top= "5px" ;
    div.style.textAlign= "center" ;
    div.style.color= "black" ;
    div.style.fontFamily= "Cezanne, sans-serif" ;
    div.style.fontSize= "x-large" ;
    div.appendChild(document.createTextNode('Wines and Times')) ;
    popUp.document.body.appendChild(div) ;
    div = document.createElement('div') ;
    var h1 = document.createElement('h1') ;
    h1.style.textAlign = 'center' ;
    h1.appendChild(document.createTextNode('Wines and Times Tour Directions')) ;
    div.appendChild(h1) ;
    var h2 = document.createElement('h2') ;
    var txt = 'Estimated driving time and distance for your tour is ' + travelInfo() ;
    h2.appendChild(document.createTextNode(txt)) ;
    div.appendChild(h2) ;
    popUp.document.body.appendChild(div) ;

    popUp.document.body.appendChild(buildDirections(true)) ;
  
    var p = document.createElement('p') ;
    p.appendChild(document.createTextNode(disclaim)) ; 
    popUp.document.body.appendChild(document.createElement('div').appendChild(p)) ;
    p = document.createElement('p') ;
    p.appendChild(document.createTextNode(corrto)) ; 
    popUp.document.body.appendChild(document.createElement('div').appendChild(p)) ;
  }   
  popUp.print() ;

}

function ClosePopUp(){
  if(popUp != null ){
    popUp.close() ;
    popUp = null ;
  }
}

function DisplayDirections(){
  if(gTourRoute.length && objById('displayDirections').checked){
     objById('map').style.marginRight = "14em" ;
     map.checkResize() ;
     objById('tourDirections').innerHTML = '' ;
     objById('tourD').style.visibility = 'visible' ;
     objById('tourD').style.width = '17em' ;
     if(msie)
       objById('tourDirections').innerHTML = buildMsieDirections(false) ;
     else
       objById('tourDirections').appendChild(buildDirections(false)) ;
     if(popUp != null){
       popUp.close() ;
       popUp = null ;
     }    
  } else {
    objById('tourD').style.visibility = 'hidden' ;
    objById('tourD').style.width = '0' ;
    objById('map').style.marginRight = "2px" ;
    map.checkResize() ;
  }
  centerAndZoomMap() ;
}

function buildDirections(forPopUp){
  // div that has start info
  var mdiv = document.createElement('div') ; 
  for(var i = 0 ; i < gTourRoute.length ; i++){   
    var d = setDirectionsFL() ;
    var td = document.createElement('td') ;
    td.style.textAlign = 'right' ;
    td.style.verticalAlign = 'top' ;
    td.appendChild(document.createTextNode('From:')) ;
	
    var tr = document.createElement('tr') ;
    tr.appendChild(td) ;
	
    td = document.createElement('td') ;
    if(forPopUp && gTour[i].my_id != IS_MYMARKER)
      td.appendChild(document.createTextNode(gTour[i].my_name + ' ' + gTour[i].my_phone)) ;
    else
      td.appendChild(document.createTextNode(gTour[i].my_name)) ;
    if(forPopUp && gTour[i].my_id != IS_MYMARKER){
      td.appendChild(document.createElement('br')) ;
      td.appendChild(document.createTextNode(gTour[i].my_address)) ;
      td.appendChild(document.createElement('br')) ;
      td.appendChild(document.createTextNode(gTour[i].my_city)) ;
    }
    tr.appendChild(td) ;
	
    var t = document.createElement('table') ;
    t.appendChild(tr) ;
	
    td = document.createElement('td') ;
    td.style.textAlign = 'right' ;
    td.style.verticalAlign = 'top' ;
    td.appendChild(document.createTextNode('To:')) ;
    tr = document.createElement('tr') ;
    tr.appendChild(td) ;
    td = document.createElement('td') ;
    if(forPopUp && gTour[i + 1].my_id != IS_MYMARKER)
      td.appendChild(document.createTextNode(gTour[i + 1].my_name + ' ' + gTour[i + 1].my_phone)) ;
    else
      td.appendChild(document.createTextNode(gTour[i + 1].my_name)) ;
    if(forPopUp && gTour[i + 1].my_id != IS_MYMARKER){ 
      if(!gTour[i + 1].my_google){
        td.appendChild(document.createElement('br')) ;
        var font = document.createElement('font') ;
        font.style.fontWeight = 'bold' ;
        font.appendChild(document.createTextNode(gTour[i + 1].my_name + ' reported that Google directions are not correct - call for corrections'))
        td.appendChild(font) ; 
      }  
      td.appendChild(document.createElement('br')) ;
      td.appendChild(document.createTextNode(gTour[i+ 1].my_address)) ;
      td.appendChild(document.createElement('br')) ;
      td.appendChild(document.createTextNode(gTour[i+ 1].my_city)) ;
    }
    tr.appendChild(td) ;
    t.appendChild(tr) ;
    d.appendChild(document.createElement('p').appendChild(t)) ;
    mdiv.appendChild(d) ;
    d = document.createElement('div') ;
    d.innerHTML = '<div style="text-align: right; padding-bottom: 0.3em;">' + gTourRoute[i].getSummaryHtml() + '</div>' ;
    mdiv.appendChild(d) ;   
    var html = buildHtmlSteps(forPopUp, i) ;    
    d = document.createElement('div') ;
    d.innerHTML = html ;
    mdiv.appendChild(d) ;
    d = setDirectionsFL() ;
    d.appendChild(document.createElement('p').appendChild(document.createTextNode('Arrive at ' + gTour[i+1].my_name))) ;
    mdiv.appendChild(d) ;
  }
  d = document.createElement('div') ;
  d.innerHTML = gTourCopyrights ;
  mdiv.appendChild(d) ;
  return mdiv ;
}

function buildHtmlSteps(forPopUp, i){
  var html = '<table style="margin: 0px; padding: 0px; border-collapse: collapse;">' ;
  for(var i1 = 0 ; i1 < gTourRoute[i].getNumSteps() ; i1++){
    if(forPopUp)
      html += '<tr>' ;
    else
      html += '<tr style="cursor: pointer;" onclick="showMapBlowup(' + gTourRoute[i].getStep(i1).getLatLng().lat() + ', ' + gTourRoute[i].getStep(i1).getLatLng().lng() + ')">' ;
    if(forPopUp){
      html += '<td style="vertical-align:top; font-size:smallest; font-weight:bold">' ;
      if(gTourRoute[i].getStep(i1).getDescriptionHtml().indexOf('right') > 1)
        html += '-->right' ;
      if(gTourRoute[i].getStep(i1).getDescriptionHtml().indexOf('left') > 1)
        html += '<--left' ;
      html += '</td>' ;
    }
    html += '<td style="border-top: 1px solid rgb(205, 205, 205); margin: 0px; padding: 0.3em 3px; vertical-align: top; text-align: right;">' ;
    html += parseInt(i1 + 1) + '.</td>' ;
    html += '<td style="border-top: 1px solid rgb(205, 205, 205); margin: 0px; padding: 0.3em 3px; vertical-align: top; width: 100%;">' ;
    html += gTourRoute[i].getStep(i1).getDescriptionHtml() + '</td>' ;
    html += '<td style="border-top: 1px solid rgb(205, 205, 205); margin: 0px; padding: 0.3em 3px 0.3em 0.5em; vertical-align: top; text-align: right;">' ;
    html += gTourRoute[i].getStep(i1).getDistance().html + '</td></tr>' ;
  }
  html += '</table>' ;
  return html ;
}

function buildMsieDirections(forPopUp){
  var html = '' ;
  for(var i = 0 ; i < gTourRoute.length ; i++){
    // from - to
    html += setMsieDirectionsFL() + '<span><table><tr><td align="right" valign="top">From:</td><td>' + gTour[i].my_name ;
    if (forPopUp && gTour[i].my_id != IS_MYMARKER){
      html += ' ' + gTour[i].my_phone  + '<br/>' + gTour[i].my_address + '<br/>' + gTour[i].my_city ;
    }
    html += '</td>' ;
    html += '<tr><td align="right" valign="top">To:</td><td>' + gTour[i + 1].my_name ;
    if(forPopUp &&  gTour[i + 1].my_id != IS_MYMARKER){
      html += ' ' + gTour[i + 1].my_phone  + '<br/>' ; 
      if(!gTour[i + 1].my_google){
        html += '<b>' + gTour[i + 1].my_name + 'reported that Google directions are not correct - call for corrections</b><br/>'
      }
      html += gTour[i + 1].my_address + '<br/>' + gTour[i + 1].my_city ;
    }
    html += '</td></tr></table></span></div>' ;
    html += buildHtmlSteps(forPopUp, i) ;
    // arrive
    html += setMsieDirectionsFL() + 'Arrive at ' +  gTour[i + 1].my_name + '</div>' ;
  }
  return html ;
}

function showMapBlowup(lat, lng){
  map.showMapBlowup(new GLatLng(parseFloat(lat), parseFloat(lng))) ;
}

function setDirectionsFL(){
  var d = document.createElement('div') ;
  d.style.border= "1px solid silver" ;
  d.style.margin= "10px 0px" ;
  d.style.backgroundColor= "rgb(238, 238, 238)" ;
  d.style.borderCollapse= "collapse" ;
  d.style.color= "rgb(0, 0, 0)" ;
  return d ;
}

function setMsieDirectionsFL() {
  var txt = '<div style="border: 1px solid silver;' ;
  txt += 'margin: 10px 0px;' ;
  txt += 'background-color: rgb(238,238,238);' ;
  txt += 'border-collapse: collapse;' ;
  txt += 'color: rgb(0,0,0)">' ;
  return txt ;
}

function travelInfo(){
  var meters = 0 ;
  var secs = gTourSeconds % 60 ;
  var minutes = (gTourSeconds - secs) / 60 ;
  var mins = minutes % 60 ;
  var hours = (minutes - mins) / 60 ;
  var html ;
  if(hours){
    html = hours + ' hr' ;
    if(hours > 1)
      html += 's' ;
    if(mins)
      html += ' ' + mins + ' min' ;
        if(mins > 1)
          html += 's' ;    
  } else {
    html = minutes + ' minutes' ;
  }
  var miles = Math.round((gTourMeters * .000621371192) * Math.pow(10,1))/Math.pow(10,1) ;
  html += ', ' + miles + ' miles' ;
  return html ;
  
}

function clearTourDetails(){
  gTourPoly = [] ;
  gTourRoute = [] ;
  gTourSeconds = 0 ;
  gTourMeters = 0 ;
  objById('travelInfo').innerHTML = '' ;
}
function isInTour(){
  for(var i = 0 ; i < gTour.length ; i++)
    if(gTour[i].my_id  == gMarkers[gMIndex].my_id)
      return i ;
  return -1 ;
}

function timesInTour(start){
  var times = 1 ;
  for(var i = start + 1 ; i < gTour.length ; i++)
    if(gTour[i].my_id  == gMarkers[gMIndex].my_id) 
      times ++ ;  
  return times ;
}

function lastInTour(){
  var i ;
  for (i = gTour.length -1 ; i >= 0 ; i--){
    if(gTour[i].my_id == gMarkers[gMIndex].my_id)
        return i ;
  }
  return -1  ;
}

