var VGEO = function() {
 return {
   init : function() {
  try {
    var url = "http://veloroutes.org/m/lbs/";
    var icon = "http://veloroutes.org/favicon.ico";
    var msg = "Auto-location requires Google Gears.";

   VGEO.isApple = VGEO.getIsApple();
   if(!VGEO.isApple){VGEO.isBerry = VGEO.getIsBerry();}
    if (!VGEO.isBerry && !VGEO.isApple && (!window.google || !google.gears)) {
	var agent = VGEO.getUA();
	var type = '';
	if(agent){if(agent.match(/android|linux/i)){type='linux'}
	 else if(agent.match(/mac[\s\S]+safari/i)){type='mac-safari'}
         else if(agent.match(/mac[\s\S]+firefox/i)){type='mac-firefox'}
         else if(agent.match(/iemobile/i)){type='wince'}
	 else if(agent.match(/windows/i)){type='win'}
	}

	VGEO.doUrch('/outgoing/googlegears/'+type);
	if(type != ''){
          if(confirm(msg)){
		location.href="http://gears.google.com/?platform="+type;
          }
	}
	else {
         if(confirm(msg)){location.href = "http://gears.google.com/?action=install" +
          "&return="+escape(url) + "&icon_src="+escape(icon) + "&name="+escape(name);//+"&message="+escape(msg);
	 }
        }
    }
    if(VGEO.isApple) {
      VGEO.geo = navigator.geolocation ? navigator.geolocation : window.geolocation;
    }
    else if (VGEO.isBerry) {
    }
    else if(!this.geo){
      if(google && google.gears){
	VGEO.geo = google.gears.factory.create('beta.geolocation',null);
      }
    }
  }catch(e){alert("ERROR: " + e); VGEO.doUrch('/m/lbs/init/error/',e); }
}, //init
getIsBerry: function() {
 return(window.blackberry);
},
getIsApple: function() {
  var ret = false;
  var agent = VGEO.getUA();
  if(agent.match(/iphone/i) || agent.match(/ipod/i)) { ret = true; }
  return ret;
},
getUA:function(){
 if(navigator){return navigator.userAgent}
 return '';
},
doUrch : function(url,e) {
 urchinTracker(url + (e ? e.message.replace(/ /g,'+') : ''));
},
getMyLocation: function(keyword) {
   try {
    var geo = VGEO.geo;
    if(!geo){return}

    if(keyword){VGEO.term=keyword} 

    function handleError(err) {
     var fb = VGEO.getElem("feedback");
    if(fb){fb.innerHTML="Error during geolocation: " + err.message;}
    }

    var fb = VGEO.getElem("feedback");
    if(fb){fb.innerHTML="Acquiring location...";}
   
    function updateLocation(pos) {
      if(VGEO.isBerry) { 
        if(!blackberry.location.latitude || !blackberry.location.longitude) { alert("Error: could not get GPS location."); }
        VGEO.setCenter(blackberry.location.latitude,blackberry.location.longitude);
        blackberry.location.removeLocationUpdate();
	return;
      }
      var lat = pos.coords.latitude;
      var lon = pos.coords.longitude;
      VGEO.setCenter(lat,lon);
     }
 
    var opts = {gearsRequestAddress:true,enableHighAccuracy:false}; 
    if(VGEO.isApple){
     if(geo){
      geo.getCurrentPosition(updateLocation, handleError);
     }
    } else if (VGEO.isBerry) {
      if(!blackberry.location.GPSSupported) { alert("Error: Your BlackBerry's GPS functionality must be enabled.");return; }
       blackberry.location.onLocationUpdate(updateLocation);
       blackberry.location.setAidMode(2);
       blackberry.location.refreshLocation();
    } else {
     if(geo){
     geo.getCurrentPosition(updateLocation, handleError,opts);
     }
     else {
	VGEO.setCenter(0,0);
	if(fb){fb.innerHTML="Error getting location."}
     }
    }
  }
  catch(e){alert("Error updating location: " + e); VGEO.doUrch('/m/lbs/updateLocation/error',e);}
},
setSearchCenter: function(ll) {
var ls = VGEO.getLS();
ls.setCenterPoint(ll);
},
getLS : function() {
 if(!VGEO.ls && google.search){
  var ls = new google.search.LocalSearch();
  ls.setSearchCompleteCallback(VGEO,VGEO.searchCB);
  VGEO.ls = ls;
 }
 return VGEO.ls;
},
doSearch : function() {
 var sel = VGEO.getElem("sel");
 var item = sel.options[sel.selectedIndex];
 if(item){
   //VGEO.getMyLocation();
   VGEO.setSearch(item.value);
 }
},
setSearch : function(kw) {
 //if(!kw || kw == ""){kw=VGEO.term}
 if(kw.match(/bike/i)){kw="bicycle shop"}
 else if(kw.match(/food1/i)){kw="convenience store"}//, gas station, food"}
 else if(kw.match(/food2/i)){kw="food"}
 else if(kw.match(/gas/i)){kw="gas station"}
 else if(kw.match(/hotel/i)){kw="lodging"}
 //if(kw.match(/coffee/i)){}
//pizza

 VGEO.term = kw;
 var ls = VGEO.getLS();
 if(VGEO.ls){VGEO.ls.execute(kw);}
},
searchCB: function() {
 var image = "/images/";
 var term = VGEO.term;
  if(term && term.match(/bicycle|bike/)){image += 'bike'}
  else if(term && term.match(/conven/)){image += 'food'}
  else if(term && term.match(/food/)){image += 'rfood'}
  else if(term && term.match(/gas/)){image += 'gas'}
  else if(term && term.match(/lodging/)){image += 'hotel'}
  else if(term && term.match(/coffee/)){image+='coffee'}
  else if(term && term.match(/pizza/)){image+='pizza'}
  else { image += 'biz' }
  image += '.png';
  var i = 0;
  var list=[];
  var bightml = '';

  //avoid mouse-trap when adding HTML to page
  var e = VGEO.getElem("map_canvas");
  e.height=e.offsetHeight;
   
  var bounds = new google.maps.LatLngBounds();
  bounds.extend(VGEO.currLoc);
  var ls = VGEO.getLS();
  for(i in ls.results) {
   var lbs = ls.results[i];
   var pos = new google.maps.LatLng(lbs.lat,lbs.lng);
   /*properties of lbs: lat,lng,staticMapUrl,title,url,addressLines,accuracy,titleNoFormatting*/
   bounds.extend(pos);

   var dist = VGEO.calcDist(VGEO.currLoc.lat(),VGEO.currLoc.lng(), lbs.lat, lbs.lng);
    if(dist){dist=dist.toFixed(1)}
    else{dist='?'}
    var html = '<div><a target="about:blank" href="' + lbs.url + '">'+lbs.titleNoFormatting+"</a> ("+dist+" miles)<br/>" + lbs.addressLines[0];
    var here = VGEO.currLoc.lat() + "," + VGEO.currLoc.lng();
    var num =  lbs.phoneNumbers[0].number;
    html += "<br/><a href=\"tel:"+num+"\">"+num+"</a>";
     html += '<br/><a target="about:blank" href="http://maps.google.com/maps?f=d&dirflg=w&daddr=' + escape(lbs.addressLines[0]+", "+lbs.addressLines[1]) + "&saddr=" + escape(here) + "\">Directions</a>";
     html += "&nbsp;&nbsp;<a target=\"about:blank\" href=\"http://maps.google.com/maps?daddr=" + escape(lbs.addressLines[0]+", "+lbs.addressLines[1]) + "&saddr="+escape(here)+"\">(by car)</a>";
   html += "</div>";
    var info = new google.maps.InfoWindow({content:html});

     var marker = new google.maps.Marker({
      position: pos,
      title: lbs.titleNoFormatting +" @ " + lbs.addressLines[0]+" "+lbs.addressLines[1],
      map: VGEO.map,
     icon: image
  });

  if(!ls.results || !ls.results.length){bightml="No nearby services found."}
 //list[marker]=info;
   google.maps.event.addListener(marker, 'click', function() {info.open(VGEO.map,marker);});

  bightml += "<hr/>"+html;
  info.setPosition(marker.position);
  }//for

 VGEO.map.fitBounds(bounds);

 /*for(mkr in list) {
  var info = list[mkr];
 alert(info.content+", "+ info.position);
  google.maps.event.addListener(mkr, 'click', function() {info.open(VGEO.map,mkr);}); 
   info.setPosition(mkr.position);
 }*/

 var e = VGEO.getElem('results');
 e.innerHTML=bightml;
},
calcDist : function(a,b,c,d) {
if(a==c&&b==d){return 0.0}
return 3963*Math.acos(Math.sin(b/57.2958)*Math.sin(d/57.2958)+Math.cos(b/57.2958)*Math.cos(d/57.2958)*Math.cos(c/57.2958-a/57.2958));
},
setCenter : function(lat,lon) {
 if(!VGEO.map) { 
  VGEO.map = new google.maps.Map(VGEO.getElem('map_canvas')); 
 }
 var ll = new google.maps.LatLng(lat,lon);
 var html = "<b>Your location</b>:<br/><b>Latitude:</b> " + ll.lat() + "<br/><b>Longitude:</b> " + ll.lng();
  var image = '/images/wifi.png';
  var marker = new google.maps.Marker({
      position: ll,
      map: VGEO.map,
      icon: image,
     title: ll.lat()+","+ll.lng()
  });

  var info = new google.maps.InfoWindow({content:html});
     
   google.maps.event.addListener(marker, 'click', function() {info.open(VGEO.map,marker);});

 VGEO.map.setCenter(ll);
 VGEO.setSearchCenter(ll);
 VGEO.currLoc = ll;

 if(!VGEO.term){VGEO.term="bike shops"}
 VGEO.setSearch(VGEO.term);//"bike shops");

 var fb = VGEO.getElem("feedback");
 if(fb){fb.innerHTML="Location: " + lat + "," + lon}

 VGEO.doUrch('/m/lbs/geolocate');
},
isDef : function(type) {
  return type != 'undefined' && type != 'unknown';
},
getElem : function(id) {
  if (VGEO.isDef(typeof document.getElementById)) {
     return document.getElementById(id);
  } else if (VGEO.isDef(typeof document.all)) {
     return document.all[id];
  } else {
    return null;
  }
}
}//return
}();//VGEO
//eof

