//console.log();

var map;
var markers = [];
var bounds;
var busIcon;
var markerPoint;
var locationIcon;
var locationMarker;

google.load("jquery", "1.3");
google.load("jqueryui", "1.7");
google.load("maps", "2");

function init(){
  if (window.navigator.userAgent.match(/iphone/i)){
    $("#sidebar").hide().css({width: "100%"});
    $("#main").css("margin-left", 0);
    $("#map-canvas").css("margin-left", 0);
    $("#footer").show();
    //window.setTimeout(function(){window.scrollTo(0, 1);}, 100);
  }
  else{
    $("#sidebar").accordion({ active: 1, header: "h2", autoHeight: false, alwaysOpen: false});
    $("#stops").accordion({ active: 0, header: "h3", autoHeight: false, alwaysOpen: false}).bind("accordionchange", routeChange);
  }
}

function checkLocation(){
  clientLocation = google.loader.ClientLocation;
  $("#location").text("in ").append($("<span id='in'>London</span>"));
  
  //if (clientLocation.address.city != "London")
    //$("#in").css({ textDecoration: "line-through", color: "red" }).after(clientLocation.address.city);
}

function storeMarker(lat, lng, marker){
  if (!markers[lat])
    markers[lat] = [];
  markers[lat][lng] = marker;
}

function getMarker(lat, lng){
  if (markers[lat] && markers[lat][lng])
    return markers[lat][lng];
}

function showStopInfo(point){
  markerPoint = point;
  
  map.panTo(point);
  
  streetViewDiv = '<div id="streetview-error"></div><div id="streetview"><p>Loading StreetView&hellip;</p></div>';
  
   map.showMapBlowup(point, {
    zoomLevel: 19,
    mapType: G_HYBRID_MAP, 
    maxContent: streetViewDiv,
    maxWidth: 500,
  });
    
  showNearby(point);
  
  //map.openInfoWindowHtml(point);
}

function infoOpened(point){
  google.maps.Event.addListener(map.getInfoWindow(), "maximizeend", showStreetView);
}

function showStreetView(e){
  var sv = new google.maps.StreetviewPanorama($("#streetview").get(0));
  google.maps.Event.addListener(sv, "error", svError);
  //sv.setLocationAndPOV(markerPoint, {});
  
  var panoClient = new GStreetviewClient(); 
  panoClient.getNearestPanorama(markerPoint, function(panoData){
    if (panoData.code != 200) {
        svError(panoData.code);
        return false;
    }
    sv.setLocationAndPOV(panoData.location.latlng, {});
  });
}

function svError(errorCode){
  var text;
  switch(errorCode){
    case 600: //google.maps.StreetviewPanorama.ErrorValues.NO_NEARBY_PANO:
      text = "StreetView isn't currently available for this location.";
    break;
    
    case 603: //google.maps.StreetviewPanorama.ErrorValues.FLASH_UNAVAILABLE:
      text = "Flash doesn't appear to be supported by your browser.";
    break; 
    
    default:
      text = "There was an error loading StreetView for this location.";
    break;
  }
  $("#streetview-error").text(text);
  $("#streetview").empty();
}

/*
function showRoutes(point){
  var ul = $("#routes");
  
  if (! ul.parent().hasClass("selected"))
    $("#sidebar").accordion("activate", 3);
  
  ul.html($("<li>Loading routes&hellip;</li>"));
      
  $.getJSON("/stop.php", { lat: point.lat(), lng: point.lng() }, function(data){ 
    ul.empty();     
    for (var i = 0; i < data.routes.length; i++)
      ul.append(
        $("<li/>").append(
          $("<a/>").text(data.routes[i]).attr("href", "/?route=" + data.routes[i])
        )
      );
  }); 
}
*/

function routeChange(e, ui){
  if (ui.newHeader.hasClass("ui-state-active")){
    map.clearOverlays();
    markers = [];
    addRoute();
  }
}

function geoWikiResponse(data){
  var ul = $("#wikipedia");
  ul.find("li").remove();
  
  if (data.status){
    ul.append($("<li class='error'/>").text("There was a problem loading nearby places."));
    return false;
  }
  
  //console.log(data);
  for (var i = 0, item; item = data.geonames[i++];)
    var li = ul.append(
      $("<li/>")
        .append(
          $("<a/>")
          .attr("href", "http://" + item.wikipediaUrl)
          .attr("title", item.summary)
          .text(item.title)
          .click(addWikipediaMarker)
          .data("geo", item)
        )
    );
}


function showNearby(point){
  var lat = point.lat();
  var lng = point.lng();
  
  //showStopInfo(point);
  
  if (! $("#wikipedia").parent().find(".ui-state-active").length)
    $("#sidebar").accordion("activate", 2);
  
  $("#wikipedia").empty().append($("<li/>").html("Loading&hellip;"));

  $.getJSON("http://ws.geonames.org/findNearbyWikipediaJSON?callback=?", { lat: lat, lng: lng, maxRows: 10, country: "uk", radius: "10" }, geoWikiResponse);
}

function displayMap(){
  map = new google.maps.Map2(document.getElementById("map-canvas"), {});
  map.setCenter(new google.maps.LatLng(51.5001524,-0.1262362), 15);
  
  
  if (window.navigator.userAgent.match(/iphone/i)){
    //window.scrollTo(0, 1);
  
    $("#zoom-in").click(function(){map.zoomIn();});
    $("#zoom-out").click(function(){map.zoomOut();});
    $("#sidebar-toggle").click(function(){ $("#sidebar").toggle(); $("#main").toggle(); });
    $("#locate-me").click(function(){moveToLocation();});
  }
  else {
    map.addControl(new google.maps.LargeMapControl());
  
    map.addMapType(G_PHYSICAL_MAP);
    map.addMapType(G_SATELLITE_3D_MAP);
    map.addControl(new google.maps.MenuMapTypeControl());
    //map.addControl(new google.maps.OverviewMapControl());
    map.enableScrollWheelZoom();
    map.enableContinuousZoom();
  
    google.maps.Event.addListener(map, "infowindowopen", infoOpened);
  }
   
  busIcon = new google.maps.Icon();
  busIcon.image = "http://chart.apis.google.com/chart?cht=mm&chs=24x24&chco=D1DDF2FF,8CB6D6FF,474A5FFF&ext=.png";
  busIcon.shadow = "shadow-chart.png";
  busIcon.iconSize = new google.maps.Size(24.0, 24.0);
  busIcon.shadowSize = new google.maps.Size(37.0, 24.0);
  busIcon.iconAnchor = new google.maps.Point(12.0, 12.0);
  busIcon.infoWindowAnchor = new google.maps.Point(12.0, 12.0);
  
  locationIcon = new google.maps.Icon(busIcon);
  locationIcon.image = "http://chart.apis.google.com/chart?cht=mm&chs=24x24&chco=6C56FFFF,D3E4FFFF,58677FFF&ext=.png";

  addRoute();
}

function moveToLocation(){
  //if (typeof Device.Location.init == "function") // PhoneGap
  if (Device.available) // PhoneGap
    Device.Location.init();
  else {
    if (google.loader.ClientLocation && google.loader.ClientLocation.address.region)
      gotLocation(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
    else 
      alert("Location not available");
  }
}

function gotLocation(lat,lng){
  alert(lat + ","  + lng);
  var point = new google.maps.LatLng(lat, lng);
  
  if (typeof locationMarker != "object"){
    locationMarker = new google.maps.Marker(point, {icon: locationIcon, title: "You Are Here"});
    map.addOverlay(locationMarker);
  }
  
  locationMarker.setLatLng(point);
  map.panTo(point);
}


function addRoute(){
  if (!$("#stops .route .ui-state-active").length)
    return;
    
  points = [];
  var prevpoint;
  
  //console.log(e);
  $("#stops .route .ui-state-active").parent().find("li .location").each(function(i){
    var item = $(this);
    var itemLink = item.next();
    
    var latlng = item.text().split(":");
    var lat = latlng[0];
    var lng = latlng[1];
    var point = new google.maps.LatLng(lat, lng);
          
    var title = itemLink.text();
    var marker = new google.maps.Marker(point, {icon: busIcon, title: title});
    
    map.addOverlay(marker);
    storeMarker(lat, lng, marker);    
    
    google.maps.Event.addListener(marker, "click", showStopInfo);
    
    var titleDiv = $("<p/>").text(title);
    var infoDiv = $("<div>").append(titleDiv).get(0);
    
    /*marker.bindInfoWindowHtml(infoDiv, { onOpenFn: function(i){
      loadStopInfo(lat, lng, i);
    }});*/
    
    
    itemLink.data("point", point);
    itemLink.click(function(e){
      e.preventDefault();
      var point = $(e.target).data("point");
      showStopInfo(point);
      //showRoutes(point);
      //showNearby(point);
      return false;
    });
        
    points.push(point);

    if (prevpoint)
      map.addOverlay(new google.maps.Polyline([prevpoint, point], "#336633", 2, 1)); // points, colour, thickness (px), opacity

    prevpoint = point;
  });
  
  bounds = new google.maps.LatLngBounds();
  for (var i = 0, item; item = points[i++];)
    bounds.extend(item);

  map.setZoom(map.getBoundsZoomLevel(bounds));
  map.panTo(bounds.getCenter());
}

function showWikipediaInfo(marker, wikipedia){
  var maxDiv = $("<div class='wiki'/>").html("Loading&hellip;").get(0);     
  marker.openInfoWindowHtml(
    $("<div class='text'/>").text(wikipedia.summary).append($("<p class='maximise-hint'>Maximise to read the full entry</p>")).get(0),
    { 
      maxContent: maxDiv, 
      maxTitle: wikipedia.title,
      maxWidth: 500
    }
  );

  var iw = map.getInfoWindow();
  google.maps.Event.addListener(iw, "maximizeclick", function(){
    $.getJSON("http://en.wikipedia.org/w/api.php?callback=?", { action:"parse", format:"json", redirects:"true", prop:"text", page: wikipedia.title}, function(data){
       $(maxDiv).html(data["parse"]["text"]["*"]);
    });
  });
}

function addWikipediaMarker(e){  
  e.preventDefault();
  var wikipedia = $(e.target).data("geo");
  var lat = wikipedia.lat;
  var lng = wikipedia.lng;
  
  //console.log(wikipedia);
  
  marker = getMarker(lat, lng);
  if (!marker){
    var point = new google.maps.LatLng(lat, lng);
    bounds.extend(point);
        
    var marker = new google.maps.Marker(point, {title: wikipedia.title});
    map.addOverlay(marker);
    storeMarker(lat, lng);
    
    GEvent.addListener(marker, "click", function(){ showWikipediaInfo(marker, wikipedia) });
  }

  map.panTo(point);  
  //map.setZoom(map.getBoundsZoomLevel(bounds));
  
  showWikipediaInfo(marker, wikipedia);
  
  return false;
}

