function _ei(i) { return document.getElementById(i); }  
   
function createXMLHttpRequest() {
  var ua;
  if(window.XMLHttpRequest) {
    try {
      ua = new XMLHttpRequest();
    } catch(e) {
      ua = false;
    }
  } else if(window.ActiveXObject) {
    try {
      ua = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
      ua = false;
    }
  }
  return ua;
} 

var req = createXMLHttpRequest();

function sendLineRequest(id) {
  req.open('get', 'src/funcline.php?id=' + id);
  req.onreadystatechange = handleResponse;
  req.send(null);
}

function handleResponse() {
  if(req.readyState == 4){
    var response = req.responseText;
    var update = new Array();
    
    if(response.indexOf('||' != -1)) {
      update = response.split('||');
      getLine(update);
    }
    _ei('loading').style.visibility = 'hidden';
  } //else
    //alert("loading" + req.readyState);
}

var validate_int_field = function(id, description) {
  var ele = _ei(id);
  var value = parseInt(ele.value);
  if (isNaN(value)) {
    alert(description + " must be an integer");
    return false;
  } if (value > 1000 || value < 1) {
    alert(description + " must be a valid Seattle transit route number between 1 and 999.");
    return false;
  }
  ele.value = value.toString();
  return true;
}

var validate_int = function(value, description) {
  value = parseInt(value);
  if (isNaN(value)) {
    alert(description + " must be an integer");
    return false;
  } if (value > 1000 || value < 1) {
    alert(description + " must be a valid Seattle transit route number between 1 and 999.");
    return false;
  }
  return true;
}
  
  
  
//<![CDATA[
  
// A function to create the marker and set up the event window
function createBusMarker(point,name,heading,route,updateTime) {
  var icon = new GIcon();
  var dir = "Unknown";

  if ((heading >= 315 && heading <= 360) || (heading >= 0 && heading < 45)) {
    dir = "North";
    icon.image = "img/iconz-north.png";
    icon.shadow = "img/shadow-iconz-north.png";
    icon.iconSize = new GSize(20.0, 42.0);
    icon.shadowSize = new GSize(42.0, 42.0);
    icon.iconAnchor = new GPoint(10.0, 42.0);
    icon.infoWindowAnchor = new GPoint(15.0, 32.0);
  } else if (heading >= 0 && heading < 135) {
    dir = "East";
    icon.image = "img/iconz-east.png";
    icon.shadow = "img/shadow-iconz-east.png";
    icon.iconSize = new GSize(28.0, 34.0);
    icon.shadowSize = new GSize(46.0, 34.0);
    icon.iconAnchor = new GPoint(10.0, 34.0);
    icon.infoWindowAnchor = new GPoint(15.0, 25.0);
  } else if (heading >= 0 && heading < 225) {
    dir = "South";
    icon.image = "img/iconz-south.png";
    icon.shadow = "img/shadow-iconz.png";
    icon.iconSize = new GSize(20.0, 34.0);
    icon.shadowSize = new GSize(38.0, 34.0);
    icon.iconAnchor = new GPoint(10.0, 34.0);
    icon.infoWindowAnchor = new GPoint(15.0, 25.0);
  } else if (heading >= 0 && heading < 315) {
    dir = "West";
    icon.image = "img/iconz-west.png";
    icon.shadow = "img/shadow-iconz-west.png";
    icon.iconSize = new GSize(28.0, 34.0);
    icon.shadowSize = new GSize(46.0, 34.0);
    icon.iconAnchor = new GPoint(18.0, 34.0);
    icon.infoWindowAnchor = new GPoint(23.0, 25.0);
  } else {
    icon.image = "img/iconz.png";
    icon.shadow = "img/shadow-iconz.png";
    icon.iconSize = new GSize(20.0, 34.0);
    icon.shadowSize = new GSize(38.0, 34.0);
    icon.iconAnchor = new GPoint(10.0, 34.0);
    icon.infoWindowAnchor = new GPoint(15.0, 25.0);
  }

  var marker = new GMarker(point, icon);
  var info = "<table class='businfo'><tr><td class='routeinfo'><span class='routenum'>Route " + route + "</span><br />";
  info += "<span class='labels'>Bus #" + name + "<br />";
  info += "Direction: " + dir + " (" + heading + "&deg;)<br />";

  if (updateTime < 0)
    info += "Update: n/a<br />"
  else if (updateTime < 1000*60) // within a minute, display in seconds
    info += "Updated: " + Math.round(updateTime/1000) + " sec ago<br />";
  else if (updateTime > 1000*60*9925) // weird update condition, try to normalize
    info += "Updated: " + (Math.round(updateTime/60000)-9928) + " min ago<br />";
  else // longer than a minute, display in minutes
    info += "Updated: " + Math.round(updateTime/60000) + " min ago<br />";


  info += "</span></td><td><img src='img/test_bus.jpg' align='right' /></td></tr></table>";
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(info);
  });
  return marker;
}



var myMap;
var myMarkers=[];
var myPolylines=[];
var refreshTimer=null;
var currentRoutes=null;
var serverTime=null;

// run when the page is first loaded
function load() {
  if (GBrowserIsCompatible()) {
    getMapSize();
    var map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(47.65, -122.25), 11);
    map.addControl(new GSmallMapControl());
    map.enableScrollWheelZoom();
    myMap = map;
    routeSubmit();
  
    GEvent.addListener(map, "moveend", function() {
        var zoomLevel = map.getZoom();
        var center = map.getCenter();
        _ei("debug").innerHTML = "zoom level = " + zoomLevel.toString() + "<br />\n" + "center = " + center.toString();
    });
    
  } else {
    _ei('forum_route').style.display = 'none';
  }
}

function removeOldMarkers() {
  for (var i=0; i<myMarkers.length; i++) {
    myMap.removeOverlay(myMarkers[i]);
  }
  myMarkers=[];
}

function removeOld() {
  for (var i=0; i<myPolylines.length; i++) {
    myMap.removeOverlay(myPolylines[i]);
  }
  myPolylines=[];
  removeOldMarkers();
}

function routeSubmit() {
  if (GBrowserIsCompatible()) {
    currentRoutes = _ei('route').value.split(",");
    removeOld();
    for (var i = 0; i < currentRoutes.length; i++) {
      //if (validate_int_field('route', 'The route number')) {
      if (validate_int(currentRoutes[i], 'The route numbers')) {
        clearTimeout(refreshTimer);
        _ei('loading').style.visibility = 'visible';
        
        //  var routeNum = _ei('route').value;
        currentRoutes[i] = parseInt(currentRoutes[i]);
        routeNum = currentRoutes[i];
        
        _ei('routeDisp').innerHTML = "Route " + routeNum;
        sendLineRequest(routeNum);
        getBuses(routeNum);
      }
    }
    refreshTimer = setTimeout("refreshBuses(currentRoutes)", 30000);
  }
  return false;
}

function getBuses(routeNum) {
  var map = myMap;
  //_ei('loading').style.visibility = 'visible';
  
  var serverTimeData = 'src/getServerTime.php';
  GDownloadUrl(serverTimeData, function(data, responseCode) {
      var xml = GXml.parse(data);
      var time = xml.documentElement
      serverTime = time.getAttribute("time");
    });
  
  var routeData = 'src/getRoutesBuses.php?route=' + routeNum;
  GDownloadUrl(routeData, function(data, responseCode) {
    var xml = GXml.parse(data);
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
        parseFloat(markers[i].getAttribute("lng")));
      var heading = markers[i].getAttribute("hed");
      var label = markers[i].getAttribute("label");
      var timeSinceLastUpdate = serverTime - markers[i].getAttribute("time");

      //      if (timeSinceLastUpdate > 1000*60*100)
      //continue;
      var marker = createBusMarker(point,label,heading,routeNum,
                                   timeSinceLastUpdate);
      myMarkers.push(marker);
      map.addOverlay(marker);
    }
  });
}

function refreshBuses(currentRoutes) {
  removeOldMarkers();
  for (var i = 0; i < currentRoutes.length; i++) {
    getBuses(currentRoutes[i]);
  }
  refreshTimer = setTimeout("refreshBuses(currentRoutes)", 30000);
}

function getLine(code) {
  var singleLine = null;
  if (myPolylines.length == 2) {
    singleLine = new GPolyline.fromEncoded({
      color: "#840A16",   id:"wholeRoute", 
      points: code[0],    levels: code[1],
      numLevels: code[2], zoomFactor: code[3]
    });    
  } else if (myPolylines.length == 1) {
    singleLine = new GPolyline.fromEncoded({
      color:"#0C3D04",    id:"wholeRoute", 
      points: code[0],    levels: code[1],
      numLevels: code[2], zoomFactor: code[3]
    });
  } else {
    singleLine = new GPolyline.fromEncoded({
      id:"wholeRoute", 
      points: code[0],    levels: code[1],
      numLevels: code[2], zoomFactor: code[3]
    });
  }
  myPolylines.push(singleLine);
  myMap.addOverlay(singleLine);
} 