Application = function() {
  
  return {
    
    init : function() {
      var self = Application;
      
      window.onResize = self.sizeWindow();
      
      if (GBrowserIsCompatible()) {
        self.updateTime = 15000;
        //Read XML Docs     
        self.etaFeed = self.loadXMLDoc("bart_eta.xml"); //needed for launchDateTime only
        
        self.launchDateTime();
        self.launchMap();
        self.launchStations();

        self.sizeWindow();
      
        setInterval(self.update, self.updateTime);
        setInterval(self.updateClock, 1000);
        
      }
    },
    
  sizeWindow : function(){
    frame = document.getElementById("map_canvas");
    
    if( typeof( window.innerWidth ) == 'number' ) {
        //Non-IE
        var windowheight = window.innerHeight;
      } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
        //IE 6+ in 'standards compliant mode'
        var windowheight = document.documentElement.clientHeight;
      } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
        //IE 4 compatible
        var windowheight = document.body.clientHeight;
      }
    
    
    frame.style.height = (windowheight - 120) + "px";
  },

    loadXMLDoc : function(dname) {
      var self = Application;
      
      var xmlDoc;

      if (window.XMLHttpRequest){
        xmlDoc=new window.XMLHttpRequest();
        xmlDoc.open("GET",dname,false);
        xmlDoc.send("");
        return xmlDoc.responseXML;
      }

      // IE 5 and IE 6

      else {
        window.location = 'http://getfirefox.com';
      }

    },

    stripHTML : function(oldString) {
      var self = Application;
      
      var newString = "";
      var inTag = false;
      for(var i = 0; i < oldString.length; i++) {

        if(oldString.charAt(i) == '<') inTag = true;
        if(oldString.charAt(i) == '>') {
          if(oldString.charAt(i+1)=="<")
          {
            //dont do anything
          }
          else
          {
            inTag = false;
            i++;
          }
        }
        if(!inTag) newString += oldString.charAt(i);
      }
      return newString;
    },

    launchDateTime : function() {
      var self = Application;
      
      var date = self.etaFeed.getElementsByTagName("date")[0].childNodes[0].nodeValue;
      var time = self.etaFeed.getElementsByTagName("time")[0].childNodes[0].nodeValue;
      document.getElementById("last_updated").innerHTML = "Data as of " + time.replace(" PDT","") + " on " + date;

    },

    launchMap : function() { 
      var self = Application;
      self.map = new GMap2(document.getElementById("map_canvas")); 
      self.map.setCenter(new GLatLng(37.779224, -122.313831), 11);
      self.map.setUIToDefault();

  // Load Google Transit Layer
    var gTransitTileUrlTemplate = 'http://mt1.google.com/vt/lyrs=m@121,transit|vm:1&hl=en&opts=r&x={X}&y={Y}&z={Z}';
    var tileLayerOverlay = new GTileLayerOverlay(
      new GTileLayer(null, null, null, {
        tileUrlTemplate: gTransitTileUrlTemplate, 
        isPng:true,
        opacity:1
      })
    );
    
    self.map.addOverlay(tileLayerOverlay);
      
    },

    launchStations : function() { 

        var self = Application;
    Stations = new GGeoXml("http://whereisbart.com/KML/stations.kml?"+(new Date()).getTime());
    GEvent.addListener(Stations,"load",function(){self.launchTrains();});
    self.map.addOverlay(Stations);

    },

    launchTrains : function() { 
  
    var self = Application;
    var oDestinations = ["DUBL","FRMT","MLBR","PITT","SFIA","DALY","TFTH","CONC","MONT","BAYF","RICH"];
    self.TrainOverlays = new Array();
    for(var i = 0; i<oDestinations.length; i++){
      self.TrainOverlays[i] = new GGeoXml("http://whereisbart.com/KML/"+oDestinations[i]+".kml?"+(new Date()).getTime());
      self.map.addOverlay(self.TrainOverlays[i]); 
    }   
    },

    update : function() {
  
      var self = Application;
    self.updateTime = 15000;
      
    for(i=0;i<self.TrainOverlays.length;i++){self.map.removeOverlay(self.TrainOverlays[i]);}
      self.launchTrains();
    },

    updateClock : function() {
      var self = Application;
      self.updateTime -= 1000;
      document.getElementById("clock").firstChild.nodeValue = "Time until next update " + self.updateTime / 1000 + " seconds";
    }
    
  };

}();

$(Application.init);
