djConfig = { parseOnLoad: true };
google.load('dojo', '1.2.3');
google.load('maps', '2.x');
//google.load('earth', '1.x');
google.load('search', '1');
//google.load('jquery', '1');

var g_ge;
var g_earthDisabled = false;
var g_kmlObject;
var g_geocoder;
var g_weatherKml = null;
var g_map = null;
var gLocalSearch;
var gCurrentResults = [];
var gSelectedResults = [];
var showSearchBalloon = false;
var gSmallIcon = null;
var gUserIcon = null;
var smallSearchIcons = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'white', 'black'];
var smallSearchIconsIndex = 0;
var searchKeyWord = null;
var searcher; //second local searcher
var skiAreasKml;
var restaurantsKml;
var restaurants;
var lodgingKml;
var lodging;
var trafficCamsKml;
var trafficCams = [];
var alertsKml = null;
var speedKml = null;
var roadConditionsKml = null;
var photosGL;
var videosGL;
var wikipediaGL;
var webcamsGL;
var currentTarget = null;
var DS_map = null;
var trip_time_updater = null;
var delay_details_updater = null;
var onI70 = -103.0;
var offI70 = -107.0;
var tripDuration = 0;
var travelTimeLoaded = false;
var imRabbitsKml;
var tweetsKml;
var trafficGoogleInfo;
var weatherConditionsKml;
var weatherConditions = [];
var precipForecast24Kml = null;
var synopticsKml = null;
var snowGagesKml = null;
var radarImageKml = null;
var skiAreas = [];
var user_lat = null;
var user_lon = null;
var share_location = false;
var location_updater = null;
var user_position_timestamp = null;
var user_marker = null;

google.setOnLoadCallback(function() {
  dojo.require('dijit.layout.BorderContainer');
  dojo.require('dijit.layout.SplitContainer');
  dojo.require('dijit.layout.ContentPane');
  dojo.require('dijit.layout.AccordionContainer');
	dojo.require('dijit.layout.TabContainer');
  dojo.require('dijit.Tree');
  //dojo.require('dijit.CheckboxTree');
  dojo.require("dijit.form.CheckBox");
  dojo.require('dijit.form.Button');
  dojo.require('dijit.form.TextBox');
  dojo.require('dijit.form.ComboBox');

  dojo.require('dojo.data.ItemFileWriteStore');
  
  dojo.require('dojo.parser');
  dojo.require('dojo.cookie');
  dojo.require('dojo.fx');
 
  dojo.addOnLoad(function() {
 
		loadDynamicCss();
		onresize();
    // load checkboxtree
    var scpt = document.createElement('script');
    //scpt.src = 'http://earth-api-samples.googlecode.com/svn/trunk/demos/dom-tree/dijit.CheckboxTree.js';
    scpt.src = '/javascripts/dijit.CheckboxTree.js';
    document.body.appendChild(scpt);

      gSmallIcon = new google.maps.Icon();
      gSmallIcon.image = "http://labs.google.com/ridefinder/images/mm_20_yellow.png";
      gSmallIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
      gSmallIcon.iconSize = new google.maps.Size(12, 20);
      gSmallIcon.shadowSize = new google.maps.Size(22, 20);
      gSmallIcon.iconAnchor = new google.maps.Point(6, 20);
      gSmallIcon.infoWindowAnchor = new google.maps.Point(5, 1);

      gUserIcon = new google.maps.Icon();
      gUserIcon.image = "/images/user_location.png";
      gUserIcon.iconSize = new google.maps.Size(14,14);
      gUserIcon.iconAnchor = new google.maps.Point(7,7);
      gUserIcon.infoWindowAnchor = new google.maps.Point(7,7);
    
		// build map
		var mapOptions = {
			googleBarOptions : {
				style : "new",
				adsOptions: {
					client: "pub-6413037617019572",
					channel: "googlebar",
					adsafe: "high",
					language: "en"
				}
			}
		}
		g_map = new google.maps.Map2(document.getElementById("map3d"), mapOptions);


		g_map.addControl(new ResetButton(g_map));
		g_map.addControl(new ClearButton(g_map));


		g_map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(70,10)));
		g_map.addControl(new GOverviewMapControl(new GSize(150,150)));

		//add zoom control....
		var boxStyleOpts = { opacity: .2, border: "2px solid yellow" };
		var otherOpts = {
			buttonHTML: "<img src='/images/zoom-control-inactive.png' />",
			buttonZoomingHTML: "<img src='/images/zoom-control-active.png' />",
			buttonStartingStyle: {width: '17px', height: '17px'},
			overlayRemoveTime: 0 };
		g_map.addControl(new DragZoomControl(boxStyleOpts, otherOpts, {}),
			new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(27,7)));
    // add large map control under the zoom control since the large map control has different sizes...
		g_map.addControl(new GLargeMapControl3D(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7,32)));
 

    //g_map.addControl(new GLargeMapControl3D());
    //g_map.addControl(new GSmallMapControl());
    g_map.disableContinuousZoom();
		g_map.enableScrollWheelZoom();
		g_map.enableDoubleClickZoom();

		var gb = g_map.enableGoogleBar();

		// selectabel terrain map
		g_map.addMapType(G_PHYSICAL_MAP);
		var hControl = new GHierarchicalMapTypeControl();
		hControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "Labels", false);
		g_map.addControl(hControl);


		//link to DS directions
		DS_map = g_map;

		setupListeners();

		//setInitialView(dojo.cookie("zoom_level.cookie"), dojo.cookie("center_lat.cookie"), dojo.cookie("center_lon.cookie"));
		//setInitialView();

		// load geocoder
		g_geocoder = new GClientGeocoder();
    
	  // Initialize the local searcher
    gLocalSearch = new google.search.LocalSearch();
    gLocalSearch.setCenterPoint(g_map);
    gLocalSearch.setSearchCompleteCallback(null, OnLocalSearch);
		gLocalSearch.setResultSetSize(google.search.Search.LARGE_RESULTSET);


      var searchControl = new google.search.SearchControl();
      // Initialize a LocalSearch instance
      searcher = new google.search.LocalSearch(); // create the object
      searcher.setCenterPoint(g_map); // bind the searcher to the map
      // Create a SearcherOptions object to ensure we can see all results
      var options = new google.search.SearcherOptions(); // create the object
      options.setExpandMode(google.search.SearchControl.EXPAND_MODE_OPEN);
      // Add the searcher to the SearchControl
      searchControl.addSearcher(searcher , options);
      searchControl.setSearchCompleteCallback(searcher , OnLocalSearch2);
      // Draw the control
      searchControl.draw("searchControlContainer");

			//hookup the insta-mapper rabbits
      //imRabbitsKml = new GGeoXml("http://goi70.com/im_rabbits/network_link.kml");
			//setImRabbits();
      
			//tweetsKml = new GGeoXml("http://goi70.com/tweets/network_link.kml");
			//setTweets();

		//google traffic
		var trafficOptions = {incidents:true};
		trafficGoogleInfo = new GTrafficOverlay(trafficOptions);

	
			// Add CDOT Layers 
			// add cameras
      //trafficCamsKml = new GGeoXml("http://goi70.com/traffic_cams/network_link.kml");
			loadTrafficCams();
			//unloadTrafficCams();

      //trafficCamsKml = new GGeoXml("http://goi70.com/traffic_cams/kml.kml");
      //trafficCamsKml = new GGeoXml("http://localhost:3000/traffic_cams/kml.kml");
			//setTrafficCams();

			// Add the ski areas
			//kml version
      //skiAreasKml = new GGeoXml("http://realestate.vitacall.com/ski_areas/kml3/ski_areas.kml");
      //skiAreasKml = new GGeoXml("http://realestate.vitacall.com/ski_areas/network_link2/ski_areas.kml");
			//setSkiAreas();

			//json version
			loadSkiAreas();

			// add alerts
      alertsKml = new GGeoXml("http://goi70.com/alerts/network_link.kml");
			//setAlerts();

			// add speed
      speedKml = new GGeoXml("http://goi70.com/speed_segments/network_link.kml");
			//setSpeed();

			// add road conditions
      roadConditionsKml = new GGeoXml("http://goi70.com/road_conditions/network_link.kml");
			//setRoadConditions();

			loadTravelTime();

			initLayers();

			// Add restaurants
			//restaurantsKml = new GGeoXml("http://goi70.com/local_searches/1/network_link.kml"); 
			//restaurantsKml = new GGeoXml("http://localhost:3000/local_searches/2/kml.kml"); 
			//setRestaurants();
      //g_map.addOverlay(restaurantsKml);

			// Add lodging
			//lodgingKml = new GGeoXml("http://goi70.com/local_searches/2/network_link.kml"); 
			//setLodging();

 			photosGL = new GLayer("com.panoramio.all");
			setPhotos();

 			videosGL = new GLayer("com.youtube.all");
			setVideos();

 			wikipediaGL = new GLayer("org.wikipedia.en");
			setWikipedia();

 			webcamsGL = new GLayer("com.google.webcams");
			setWebcams();

			// Add weather conditions
/*
			//weatherConditionsKml = new GGeoXml("http://localhost:3000/weather_conditions/network_link.kml"); 
			weatherConditionsKml = new GGeoXml("http://goi70.com/weather_conditions/network_link.kml"); 
			setWeatherConditions();
*/
			loadWeatherConditions();

			
/*
      var myLocationKml = new GGeoXml("http://www.google.com/latitude/apps/badge/api?user=8677719243282708204&type=kml");
      g_map.addOverlay(myLocationKml);
*/
		
			setAdditionalLayers();

			//initial the trip time tab
			//initDrivingDirections();
			initDrivingDirectionsFromServer();
		
			setInitialViewFromServer();

			initLayerManager();

  });

// assuming our tabContainer has id="right"
dojo.subscribe("right-selectChild", function(child){
    //alert("A new child was selected: " + child.id);
		manageTabSelection(child);
});

  //dojo.byId('loaderInner').innerHTML += " done.";
  setTimeout(function hideLoader() {
    var loader = dojo.byId('loader');
    dojo.fadeOut({ node: loader, duration:800,
      onEnd: function() {
        loader.style.display = "none";
      }
    }).play();
  }, 950);

});

function refreshTraffic() {
	if(alertsKml != null) {
		g_map.removeOverlay(alertsKml);
    alertsKml = new GGeoXml("http://goi70.com/alerts/network_link.kml");
		setAlerts();
	}
	if(speedKml != null) {
		g_map.removeOverlay(speedKml);
    speedKml = new GGeoXml("http://goi70.com/speed_segments/network_link.kml");
		setSpeed();
	}
	if(roadConditionsKml != null) {
		g_map.removeOverlay(roadConditionsKml);
    roadConditionsKml = new GGeoXml("http://goi70.com/road_conditions/network_link.kml");
		setRoadConditions();
	}
	alert("Refresh complete");
}

function loadDynamicCss() {

	if(screen.height < '1025') {
//		document.write('<link href="stylesheets/i70-balloons-lowres.css" rel="stylesheet" type="text/css" />');
		getcss('stylesheets/i70-balloons-lowres.css');
	} else {
		getcss('stylesheets/i70-balloons.css');
//		document.write('<link href="stylesheets/i70-balloons.css" rel="stylesheet" type="text/css" />');
	}

}

function getcss(cssfile) {
	loadcss = document.createElement('link');
	loadcss.setAttribute("rel", "stylesheet");
	loadcss.setAttribute("type", "text/css");
	loadcss.setAttribute("href", cssfile);
	document.getElementsByTagName("head")[0].appendChild(loadcss);
}


function manageTabSelection(child) {
		dojo.cookie("layer_manager_tab.cookie", child.id, { expires: 7 });
		if(child.id == "trip_time_tab") {
			dojo.byId('right').style.width = "350px";  	
			var bc = dijit.byId('contentWrapper');
			bc.resize();
			tripTimeUpdater();
		} else {
			tripTimeUpdaterOff();
		}
		if(child.id == "notices_tab") {
			dojo.byId('right').style.width = "370px";  	
			var bc = dijit.byId('contentWrapper');
			bc.resize();
			url = '/tweets/notifications';

			showTripTimeSpinner();
			var request = new Ajax.Updater('', url, {asynchronous:true, evalScripts:true}); 
			/*
			var request = new Ajax.Request(url, {
				method: 'get',
				parameters: {},
				onComplete: getNotificationsCB
			});
			*/
		}
		if(child.id == "travel_planning_tab") {
			dojo.byId('right').style.width = "350px";  	
			var bc = dijit.byId('contentWrapper');
			bc.resize();
			var ap = dijit.byId("layer_manager_container");
			//ap.layout();
			ap.resize();
		}
}


function setInitialView(zoom_level, lat, lon) {
	g_map.closeInfoWindow();
	if(lat === undefined) {
		lat = 39.7;
	} else {
		lat = parseFloat(lat);
	}
	if(lon === undefined) {
		lon = -106.0;
	} else {
		lon = parseFloat(lon);
	}

	if (zoom_level === undefined) {
		var zl = dojo.cookie("zoom_level.cookie");
		if(zl) {
			g_map.setCenter(new google.maps.LatLng(lat, lon), parseInt(zl));
		} else {
			g_map.setCenter(new google.maps.LatLng(lat, lon), 9);
			dojo.cookie("zoom_level.cookie", 9, { expires: 7 });
		}
	} else {
		g_map.setCenter(new google.maps.LatLng(lat, lon), parseInt(zoom_level));
		dojo.cookie("zoom_level.cookie", zoom_level, { expires: 7 });
	}
}

var g_treeIdObjectMap = null;

function buildTreeUI(kmlObject) {
  delete g_treeIdObjectMap;
  g_treeIdObjectMap = {};
  
  var treeData = {
    identifier: 'id',
    label: 'name',
    items: []
  };
  
  // walk the loaded KML object DOM
  walkKmlDom(kmlObject, function(context) {
    // generate a random, unique ID for this node (Dojo requires a unique ID
    // per each node)
    var nodeId = Number(new Date()).toString() + Math.round(Math.random() * 99999).toString();
    g_treeIdObjectMap[nodeId] = this;
    
    // create the tree node for this item
    var treeNodeData = {
      id: nodeId,
      name: (this.getName() ? this.getName() : '<' + this.getType() + '>'),
      type: this.getType(),
      checked: this.getVisibility(),
      children: []
    };
    
    // add the tree node to the tree data hierarchy 
    context.current.push(treeNodeData);
    
    // all actual KML child nodes will be added to this tree nodes
    // children list
    context.child = treeNodeData.children;
  }, { rootContext: treeData.items });
  
  if (dijit.byId('tree'))
    dijit.byId('tree').destroy();
  
  // create the Dojo tree widget
  // and set its data to the hierarchy we just
  // built using walkKmlDom
  var treeDiv = document.createElement('div');
  treeDiv.style.height = '100%';
  dojo.byId('left').appendChild(treeDiv);
  
  var store = new dojo.data.ItemFileWriteStore({ data: treeData });
  
  var model = new dijit.tree.CheckboxForestStoreModel({
    store: store,
    labelAttr: 'name',
    typeAttr: 'type'
  });
  
  var tree = new dijit.CheckboxTree({
    id: 'tree',
    model: model
  }, treeDiv);
  
  // watch for changes in the 'checked' attribute and update feature visibility
  // accordingly
  dojo.connect(store, 'onSet', function(item, attribute, oldValue, newValue) {
    if (oldValue != newValue &&
        attribute == 'checked') {
      var kmlObject = g_treeIdObjectMap[store.getValue(item, 'id')];
      if (!kmlObject)
        return;
      
      kmlObject.setVisibility(newValue);
      
      if (newValue == true) {
        var c = kmlObject;
        while (c && 'setVisibility' in c) {
          c.setVisibility(newValue);
          c = c.getParentNode();
          //store.setValue(item, 'checked' 
        }
      }
    }
  });
  
  // when clicking a tree item, fly to it
  dojo.connect(tree, 'onClick', function(item) {
    if (item) {
      var kmlObject = g_treeIdObjectMap[store.getValue(item, 'id')];
      if (!kmlObject)
        return;
      
      flyToFeature(kmlObject);
    }
  });
  
  var oldGetIconClass = tree.getIconClass;
  tree.getIconClass = function(item, opened) {
    var cls = '';
    if (item) {
      var kmlObject = g_treeIdObjectMap[store.getValue(item, 'id')];
      if (kmlObject) {
        if ('getGeometry' in kmlObject && kmlObject.getGeometry()) {
          cls = kmlObject.getGeometry().getType();
        } else {
          cls = kmlObject.getType();
        }
      }
    }
    
    return cls + ' ' + oldGetIconClass.apply(tree, [item, opened]);
  };
  
  tree.getLabelClass = function(item, opened) {
    if (item && tree.model.mayHaveChildren(item)) {
      return 'folder';
    }
    
    return '';
  };
  
  expandTree();
}

function expandTree() {
  var tree = dijit.byId('tree');
  
  function expandChildNode(node) {
    dojo.forEach(node.getChildren(), function(c) { 
      tree._expandNode(c);
      expandChildNode(c);
    }, this);
  }
  
  expandChildNode(tree.rootNode);
}

function loadKml() {
  var url = dijit.byId('kml-url').getValue();
  
  google.earth.fetchKml(g_ge, url, function(kmlObject) {
    if (!kmlObject) {
      // show error
      alert('Error loading KML file');
      return;
    }
    
    if (g_kmlObject)
      g_ge.getFeatures().removeChild(g_kmlObject);
    
    g_kmlObject = kmlObject;
    g_ge.getFeatures().appendChild(g_kmlObject);
    flyToFeature(g_kmlObject);
    
    buildTreeUI(g_kmlObject);
  });
}

function flyToFeature(kmlFeature) {
  var aspectRatio = dojo.coords('center').w * 1.0 / dojo.coords('center').h;
  var lookAt = computeFitLookAt(g_ge, kmlFeature, aspectRatio);
  if (lookAt)
    g_ge.getView().setAbstractView(lookAt);
}

function submitLocation() {
  var search_address = dijit.byId('search-address').getValue();
  doGeocode(search_address, 14);
}

function doGeocode(address, zoom) {
	if(address == 'Reset View') {
		setInitialView(10);
	} else {
		if(zoom === undefined) {
			zoom = 14;
		}
	  $('to').setValue(address);
  	g_geocoder.getLatLng(address, function(point) {
			if (point) {
				flyToMapView(point.y, point.x, zoom);
			}
		});
	}
}

function flyToMapView(lat,lon, zoom) {
	g_map.setCenter(new google.maps.LatLng(lat,lon), zoom);
}

function flyToView(lat,lon,altitude,altitudeMode,heading,tilt,range) {
	var la = g_ge.createLookAt('');
	la.set(lat, lon, altitude, altitudeMode , heading, tilt, range);
	g_ge.getView().setAbstractView(la);
}

function flyToMessages(lat, lon, zoom) {
 	var on = dijit.byId('tweets').getValue();
	if(!on) {
		dijit.byId('tweets').attr('value',true);
 		dijit.byId('tweets').attr('checked',true);
		setTweets();
	}

	on = dijit.byId('im_rabbits').getValue();
	if(!on) {
		dijit.byId('im_rabbits').attr('value',true);
 		dijit.byId('im_rabbits').attr('checked',true);
		setImRabbits();
	}
	flyToMapView(lat, lon, zoom);
}

function loadBaseLayers() {
	g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BORDERS, true);
  g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_ROADS, true);
  g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BUILDINGS,true);
  g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_TERRAIN, true);
  loadWeather();
}

function loadWeather(){
  //google.earth.fetchKml(g_ge, "http://realestate.vitacall.com/cloud.kml", loadWeatherCB);
}
			
function loadWeatherCB(object) {
  if (!object) {
    alert("Weather failed to load");
    return;
  }
  g_weatherKml = object;
	g_weatherKml.setVisibility(false);
  g_ge.getFeatures().appendChild(g_weatherKml);
}

function setBoundaries() {
  var on = dijit.byId('boundaries').getValue();

  if(!on) {
	  g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BORDERS, false);
  } else {
  	g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BORDERS, true);
  }
}

function setBuildings() {
  var on = dijit.byId('buildings').getValue();

  if(!on) {
	  g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BUILDINGS, false);
  } else {
  	g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_BUILDINGS, true);
  }
}

function setTerrain() {
  var on = dijit.byId('terrain').getValue();

  if(!on) {
	  g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_TERRAIN, false);
  } else {
  	g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_TERRAIN, true);
  }
}

function setRoads() {
  var on = dijit.byId('roads').getValue();
  if(!on) {
	  g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_ROADS, false);
  } else {
  	g_ge.getLayerRoot().enableLayerById(g_ge.LAYER_ROADS, true);
  }
}


function setWeather() {
  var on = dijit.byId('weather').getValue();

  if(!on) {
	  g_weatherKml.setVisibility(false);
  } else {
	  g_weatherKml.setVisibility(true);
  }

}
	
function setDirections() {
  var panel = document.getElementById('right');
  panel.src = 'http://maps.google.com?daddr=9 Eagle Nest Lane, Lyons CO 80540';
}

function submitLocalSearch() {
	//gLocalSearch.setCenterPoint("Denver");
	// Clear the map and the old search well
	//clearLocalSearch();
	//gLocalSearch.execute(document.getElementById("search-category").value);
	//return false;
	searchKeyWord = document.getElementById("search-category").value
	doLocalSearch(searchKeyWord, 'local_search_box');
}

function unsubmitLocalSearch() {
	searchKeyWord = null;
	document.getElementById("search-category").value = "";
	clearLocalSearch();
	doLocalSearch("i70", 'local_search_box');
}

function setSmallSearchIconImage() {
	gSmallIcon.image = "http://labs.google.com/ridefinder/images/mm_20_" + smallSearchIcons[smallSearchIconsIndex] + ".png";
	smallSearchIconsIndex++;
	if(smallSearchIconsIndex > 7) {
		smallSearchIconsIndex = 0;
	}
}

function OnLocalSearch() {
	if (!gLocalSearch.results) return;
	var searchWell = document.getElementById("searchwell");

	setSmallSearchIconImage();

//	gCurrentResults = [];
	for (var i = 0; i < gLocalSearch.results.length; i++) {
		gCurrentResults.push(new LocalResult(gLocalSearch.results[i]));
	}
	if(showSearchBalloon) {
		if(gCurrentResults[0]) {
			var mkr = gCurrentResults[0].marker();
			if(mkr) {
				GEvent.trigger(mkr,'click');
			}
		}
		//showSearchBalloon = false;
	}	
/*
	var cursor = gLocalSearch.cursor;
	var curPage = cursor.currentPageIndex;
	for (var i = 0; i < cursor.pages.length; i++) {
		var page = cursor.pages[i];
	}
*/
/*
	var attribution = gLocalSearch.getAttribution();
	if (attribution) {
		documengetElementById("searchwell").appendChild(attribution);
	}
*/

	// move the map to the first result
	//var first = gLocalSearch.results[0];
	//g_map.panTo(new google.maps.LatLng(first.lat, first.lng));
}

function clearLocalSearch() {
	// Clear the map and the old search well
	var searchWell = document.getElementById("searchwell");
	searchWell.innerHTML = "";
	for (var i = 0; i < gCurrentResults.length; i++) {
		if (!gCurrentResults[i].selected()) {
			g_map.removeOverlay(gCurrentResults[i].marker());
		}
	}
	gCurrentResults = [];
}


function OnLocalSearch2() {
        g_map.clearOverlays();
        var results = searcher.results; // Grab the results array
        // We loop through to get the points
        for (var i = 0; i < results.length; i++) {
          var result = results[i]; // Get the specific result
          var markerLatLng = new google.maps.LatLng(parseFloat(result.lat),
                                                    parseFloat(result.lng));
          var marker = new google.maps.Marker(markerLatLng); // Create the marker
    
          // Bind information for the infoWindow aka the map marker popup
          marker.bindInfoWindow(result.html.cloneNode(true));
          result.marker = marker; // bind the marker to the result
          g_map.addOverlay(marker); // add the marker to the map
        }
    
        // Store where the map should be centered
        var center = searcher.resultViewport.center;
    
        // Calculate what the zoom level should be
        var ne = new google.maps.LatLng(searcher.resultViewport.ne.lat,
                                        searcher.resultViewport.ne.lng);
        var sw = new google.maps.LatLng(searcher.resultViewport.sw.lat,
                                        searcher.resultViewport.sw.lng);
        var bounds = new google.maps.LatLngBounds(sw, ne);
        var zoom = g_map.getBoundsZoomLevel(bounds, new google.maps.Size(350, 350));
    
        // Set the new center of the map
        // parseFloat converts the lat/lng from a string to a float, which is what
        // the LatLng constructor takes.
        g_map.setCenter(new google.maps.LatLng(parseFloat(center.lat),
                                             parseFloat(center.lng)),
                                             zoom);
}

function clearLocalSearch2() {
	g_map.clearOverlays();
}

    // A class representing a single Local Search result returned by the
    // Google AJAX Search API.
    function LocalResult(result) {
      this.result_ = result;
      this.resultNode_ = this.unselectedHtml();
      document.getElementById("searchwell").appendChild(this.resultNode_);
			var marker = this.marker(gSmallIcon);
      g_map.addOverlay(this.marker(gSmallIcon));
    }

    // Returns the GMap marker for this result, creating it with the given
    // icon if it has not already been created.
    LocalResult.prototype.marker = function(opt_icon) {
      if (this.marker_) return this.marker_;

      var marker = new google.maps.Marker(new google.maps.LatLng(parseFloat(this.result_.lat), parseFloat(this.result_.lng)), opt_icon);
      GEvent.bind(marker, "click", this, function() {
        marker.openInfoWindow(this.selected() ? this.selectedHtml() :
                                                this.unselectedHtml(),{suppressMapPan:true});
      });
      GEvent.bind(marker, "infowindowclose", this, function() {
				showSearchBalloon = false;
      });

      this.marker_ = marker;
      return marker;
    }

    // "Saves" this result if it has not already been saved
    LocalResult.prototype.select = function() {
      if (!this.selected()) {
        this.selected_ = true;

        // Remove the old marker and add the new marker
        g_map.removeOverlay(this.marker());
        this.marker_ = null;
        g_map.addOverlay(this.marker(G_DEFAULT_ICON));

        // Add our result to the saved set
        document.getElementById("selected").appendChild(this.selectedHtml());

        // Remove the old search result from the search well
        this.resultNode_.parentNode.removeChild(this.resultNode_);
      }
    }

    // Returns the HTML we display for a result before it has been "saved"
    LocalResult.prototype.unselectedHtml = function() {
      var container = document.createElement("div");
      container.className = "unselected";
      container.appendChild(this.result_.html.cloneNode(true));
			var l = document.createElement('div');
			var h = this.result_;
			var gto = h.lat + ", " + h.lng;

			l.innerHTML = "<br/><a href='#' onclick='goLocatedTripTime(null, \"" + gto + "\");'>Get Directions</a> - (first enter your<br/>location into the \'From\' box above)<br/><br/>";
			container.appendChild(l);

			l = document.createElement('div');
			l.innerHTML = "<a href='#' onclick='flyToMapView(" + h.lat + ", " + h.lng + ", 17);'>Zoom In To Here</a><br/>";
			container.appendChild(l);



      var saveDiv = document.createElement("div");
      saveDiv.className = "select";
      //saveDiv.innerHTML = "Save this location";
      GEvent.bindDom(saveDiv, "click", this, function() {
        g_map.closeInfoWindow();
        this.select();
        gSelectedResults.push(this);
      });
      container.appendChild(saveDiv);
      return container;
    }

    // Returns the HTML we display for a result after it has been "saved"
    LocalResult.prototype.selectedHtml = function() {
      return this.result_.html.cloneNode(true);
    }

    // Returns true if this result is currently "saved"
    LocalResult.prototype.selected = function() {
      return this.selected_;
    }

	function doLocalSearch(keyWord, id) {
		// Clear the map and the old search well
		//clearLocalSearch();

  	var on = dijit.byId(id).getValue();
  	if(!on) {
			clearLocalSearch();
		} 
		executeLocalSearches();
/*
		else {
			gLocalSearch.execute(keyWord);
	    //gLocalSearch.setCenterPoint(g_map);
  	  gLocalSearch.setCenterPoint("Wolcott, CO");
			gLocalSearch.execute(keyWord);

	    gLocalSearch.setCenterPoint("Avon, CO");
			gLocalSearch.execute(keyWord);

    	gLocalSearch.setCenterPoint("Edwards, CO");
			gLocalSearch.execute(keyWord);

  	  gLocalSearch.setCenterPoint("West Vail, CO");
			gLocalSearch.execute(keyWord);
 
	    gLocalSearch.setCenterPoint("Vail, CO");
			gLocalSearch.execute(keyWord);

    	gLocalSearch.setCenterPoint("Copper Mountain, CO");
			gLocalSearch.execute(keyWord);

  	  gLocalSearch.setCenterPoint("Breckenridge, CO");
			gLocalSearch.execute(keyWord);

	    gLocalSearch.setCenterPoint("Silverthorne, CO");
			gLocalSearch.execute(keyWord);

    	gLocalSearch.setCenterPoint("Dillon, CO");
			gLocalSearch.execute(keyWord);

  	 	gLocalSearch.setCenterPoint("Frisco, CO");
			gLocalSearch.execute(keyWord);

		  gLocalSearch.setCenterPoint("Georgetown, CO");
			gLocalSearch.execute(keyWord);
	  	gLocalSearch.setCenterPoint("Silver Plume, CO");
			gLocalSearch.execute(keyWord);
		  gLocalSearch.setCenterPoint("Dumont, CO");
			gLocalSearch.execute(keyWord);

	  	gLocalSearch.setCenterPoint("Empire, CO");
			gLocalSearch.execute(keyWord);

  	  gLocalSearch.setCenterPoint("Idaho Springs, CO");
			gLocalSearch.execute(keyWord);
		}
*/
		return false;
	}

	function executeLocalSearches() {
		executeLocalSearch('restaurants', 'restaurants');
		executeLocalSearch('lodging hotels motels', 'lodging');
		executeLocalSearch('shopping', 'shopping');
		executeLocalSearch('parking', 'parking');
		executeLocalSearch('gasoline', 'gas');
		executeLocalSearch('hiking', 'hiking');
		executeLocalSearch('swimming pool', 'pools');
		executeLocalSearch('parks', 'parks');
		executeLocalSearch('golf courses', 'golf_courses');
		executeLocalSearch('spas', 'spas');
		if(searchKeyWord != null) {
			gLocalSearch.execute(searchKeyWord);
		}
	}

	function executeLocalSearch(keyWord, id) {
  	on = dijit.byId(id).getValue();
  	if(on) {
			gLocalSearch.execute(keyWord);
		}
	}

	function setTrafficCams() {
  	var on = dijit.byId('traffic_cams').getValue();

	  if(!on) {
			g_map.closeInfoWindow();
      //g_map.removeOverlay(trafficCamsKml);
			showTrafficCams(false);
			dojo.cookie("traffic_cams.cookie", "off", { expires: 7 });
	  } else {
      //g_map.addOverlay(trafficCamsKml);
			showTrafficCams(true);
			dojo.cookie("traffic_cams.cookie", "on", { expires: 7 });
  	}
	}

	function setAlerts() {
  	var on = dijit.byId('alerts').attr('checked');

	  if(!on) {
      g_map.removeOverlay(alertsKml);
			document.getElementById('alerts_legend').style.display = 'none';
			dojo.cookie("alerts.cookie", "off", { expires: 7 });
	  } else {
      g_map.addOverlay(alertsKml);
			document.getElementById('alerts_legend').style.display = 'block';
			dojo.cookie("alerts.cookie", "on", { expires: 7 });
  	}
	}

	function setSpeed() {
  	var on = dijit.byId('traffic').attr('checked');

	  if(!on) {
      g_map.removeOverlay(speedKml);
			document.getElementById('traffic_legend').style.display = 'none';
			dojo.cookie("traffic.cookie", "off", { expires: 7 });
	  } else {
      g_map.addOverlay(speedKml);
			document.getElementById('traffic_legend').style.display = 'block';
			dojo.cookie("traffic.cookie", "on", { expires: 7 });
  	}
	}

	function setSpeedGoogle() {
  	var on = dijit.byId('traffic-google').attr('checked');

	  if(!on) {
      g_map.removeOverlay(trafficGoogleInfo);
			document.getElementById('traffic_google_legend').style.display = 'none';
			dojo.cookie("traffic_google.cookie", "off", { expires: 7 });
	  } else {
      g_map.addOverlay(trafficGoogleInfo);
			document.getElementById('traffic_google_legend').style.display = 'block';
			dojo.cookie("traffic_google.cookie", "on", { expires: 7 });
  	}
	}

	function setRoadConditions() {
  	var on = dijit.byId('road_conditions').attr('checked');
	  if(!on) {
			document.getElementById('road_conditions_legend').style.display = 'none';
      g_map.removeOverlay(roadConditionsKml);
			dojo.cookie("road_conditions.cookie", "off", { expires: 7 });
	  } else {
      g_map.addOverlay(roadConditionsKml);
			document.getElementById('road_conditions_legend').style.display = 'block';
			dojo.cookie("road_conditions.cookie", "on", { expires: 7 });
  	}
	}

	function initLayers() {
		var rc = dojo.cookie("road_conditions.cookie");
		if(rc == 'on') {
  		dijit.byId('road_conditions').attr('value',true);
  		dijit.byId('road_conditions').attr('checked',true);

  		dijit.byId('traffic').attr('value',false);
  		dijit.byId('traffic').attr('checked',false);

  		dijit.byId('traffic-google').attr('value',false);
  		dijit.byId('traffic-google').attr('checked',false);
		} else {

  		dijit.byId('road_conditions').attr('value',false);
  		dijit.byId('road_conditions').attr('checked',false);

			var rc2 = dojo.cookie("traffic.cookie");
			if(rc2 == 'on') {

	  		dijit.byId('traffic').attr('value',true);
  			dijit.byId('traffic').attr('checked',true);

	  		dijit.byId('traffic-google').attr('value',false);
  			dijit.byId('traffic-google').attr('checked',false);

			} else {
	
	  		dijit.byId('traffic-google').attr('value',true);
  			dijit.byId('traffic-google').attr('checked',true);

  			dijit.byId('traffic').attr('value',false);
	  		dijit.byId('traffic').attr('checked',false);

			}
		}
		setSpeed();
		setSpeedGoogle();
		setRoadConditions();

		rc = dojo.cookie("alerts.cookie");
		if(rc == 'on') {
  		dijit.byId('alerts').attr('value',true);
  		dijit.byId('alerts').attr('checked',true);
		} else {
  		dijit.byId('alerts').attr('value',false);
  		dijit.byId('alerts').attr('checked',false);
		}
		setAlerts();

		rc = dojo.cookie("traffic_cams.cookie");
		if(rc == 'off') {
  		dijit.byId('traffic_cams').attr('value',false);
  		dijit.byId('traffic_cams').attr('checked',false);
		} else {
  		dijit.byId('traffic_cams').attr('value',true);
  		dijit.byId('traffic_cams').attr('checked',true);
		}
		setTrafficCams();

	}

/* kml version
	function setSkiAreas() {
  	var on = dijit.byId('ski_areas').getValue();

	  if(!on) {
			g_map.closeInfoWindow();
      g_map.removeOverlay(skiAreasKml);
	  } else {
      g_map.addOverlay(skiAreasKml);
  	}
	}
*/

/* json version */
	function setSkiAreas() {
  	var on = dijit.byId('ski_areas').getValue();
	  if(!on) {
			g_map.closeInfoWindow();
			showSkiAreas(false);
			dojo.cookie("ski_areas.cookie", "off", { expires: 7 });
	  } else {
			showSkiAreas(true);
			dojo.cookie("ski_areas.cookie", "on", { expires: 7 });
  	}
	}

	function showSkiAreas(on) {
		for (var i = 0; i < skiAreas.length; i++) {
			if(on) {
				skiAreas[i].show();
			} else { 
				skiAreas[i].hide();
			}
		}
	}
	
	function setRestaurants() {
  	var on = dijit.byId('restaurants').getValue();

	  if(!on) {
      g_map.removeOverlay(restaurantsKml);
	  } else {
      g_map.addOverlay(restaurantsKml);
			//g_map.setZoom(11);
  	}
	}

	function setLodging() {
  	var on = dijit.byId('lodging').getValue();

	  if(!on) {
      g_map.removeOverlay(lodgingKml);
	  } else {
      g_map.addOverlay(lodgingKml);
			//g_map.setZoom(11);
  	}
	}

/* json version */
	function setWeatherConditions() {
  	var on = dijit.byId('weather_conditions').getValue();

	  if(!on) {
			g_map.closeInfoWindow();
      //g_map.removeOverlay(trafficCamsKml);
			showWeatherConditions(false);
			//dojo.cookie("traffic_cams.cookie", "off", { expires: 7 });
	  } else {
      //g_map.addOverlay(trafficCamsKml);
			showWeatherConditions(true);
			//dojo.cookie("traffic_cams.cookie", "on", { expires: 7 });
  	}
	}

/* kml version 
	function setWeatherConditions() {
  	var on = dijit.byId('weather_conditions').getValue();

	  if(!on) {
      g_map.removeOverlay(weatherConditionsKml);
	  } else {
      g_map.addOverlay(weatherConditionsKml);
  	}
	}
*/

	function showWeatherConditions(on) {
		for (var i = 0; i < weatherConditions.length; i++) {
			if(on) {
				weatherConditions[i].show();
			} else { 
				weatherConditions[i].hide();
			}
		}
	}
	





	function setPhotos() {
  	var on = dijit.byId('photos').getValue();

	  if(!on) {
      g_map.removeOverlay(photosGL);
	  } else {
      g_map.addOverlay(photosGL);
  	}
	}

	function setVideos() {
  	var on = dijit.byId('videos').getValue();

	  if(!on) {
      g_map.removeOverlay(videosGL);
	  } else {
      g_map.addOverlay(videosGL);
  	}
	}

	function setWikipedia() {
  	var on = dijit.byId('wikipedia').getValue();

	  if(!on) {
      g_map.removeOverlay(wikipediaGL);
	  } else {
      g_map.addOverlay(wikipediaGL);
  	}
	}

	function setWebcams() {
  	var on = dijit.byId('webcams').getValue();

	  if(!on) {
      g_map.removeOverlay(webcamsGL);
	  } else {
      g_map.addOverlay(webcamsGL);
  	}
	}

	function setImRabbits() {
  	var on = dijit.byId('im_rabbits').getValue();

	  if(!on) {
      g_map.removeOverlay(imRabbitsKml);
	  } else {
      g_map.addOverlay(imRabbitsKml);
  	}
	}

	function setTweets() {
  	var on = dijit.byId('tweets').getValue();

	  if(!on) {
      g_map.removeOverlay(tweetsKml);
	  } else {
      g_map.addOverlay(tweetsKml);
  	}
	}

	function getTrafficCamBalloon(inx,feature) {
			currentTarget = feature;
			//var url = '<%= url_for(:controller => :local_search_results, :action => :balloon, :only_path => false) %>';
			//var path = currentTarget.getSnippet();
			//var url = path + '/balloon';
			var url = '/traffic_cams/' + inx + '/html_balloon';
			//var request = new Ajax.Request('/chambers/417/members/'+id+'/balloon', {
			var request = new Ajax.Request(url, {
				method: 'get',
				parameters: {},
				onComplete: getTrafficCamBalloonCB
			});
	}

	function getTrafficCamBalloonCB(response) {
		//load up the balloon
		var et = currentTarget;
		//var opts = new GInfoWindowOptions();
		//opts.maxWidth = 350;
		//et.bindInfoWindow(response.responseText,opts)
		//et.bindInfoWindow(response.responseText)
		et.openInfoWindowHtml(response.responseText);
	}

	function loadSkiAreas() {
		//layers['ski_areas'] = new Array();
		//loadXmlOverlayWithHtmlBalloons("on","", "/ski_areas/overlay_xml", layers['ski_areas'], 'ski_areas', 'html_balloon',"ski_area_label");
		loadXmlOverlayWithHtmlBalloons("on","", "/ski_areas/overlay_xml", skiAreas, 'ski_areas', 'html_balloon',"ski_area_label");

		//skiAreas = layers['ski_areas'];

/*
		var newIcon;
		GDownloadUrl("/ski_areas/overlay_xml", function(data) {
			var ti;
			var name;
			var id;
			var url;
			var icon_url;
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				name = markers[i].getAttribute("name");
				id = markers[i].getAttribute("id");
				icon_url = markers[i].getAttribute("icon_url");
				url = '/ski_areas/' + id + '/html_balloon';

				newIcon = new GIcon();
				newIcon.image = icon_url;
				newIcon.iconSize = new GSize(31,31);
				newIcon.iconAnchor = new GPoint(16,16);
				newIcon.infoWindowAnchor = new GPoint(16,16);

				var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lon")));
				skiAreas.push(createHtmlMarker(name, id, latlng, newIcon, url, "ski_area_label",-40, 12));
				ti = skiAreas.length-1;
				g_map.addOverlay(skiAreas[ti]);
				//skiAreas[ti].hide();
			}
		});
*/
	}

	function openSkiAreaBalloon(name) {
		g_map.closeInfoWindow();
		for(var i = 0; i < skiAreas.length; i++) {
			if(skiAreas[i].getLabelText() == name) {
				GEvent.trigger(skiAreas[i], 'click');
				return;
			}
		}
	}

	function openTrafficCamBalloon(name) {
		g_map.closeInfoWindow();
		for(var i = 0; i < trafficCams.length; i++) {
			if(trafficCams[i].getLabelText() == name) {
				GEvent.trigger(trafficCams[i], 'click');
				return;
			}
		}
	}

	function openImRabbitBalloon(name) {
		g_map.closeInfoWindow();
		//imRabbitsKml
	}

	function openTweetBalloon(name) {
		g_map.closeInfoWindow();
	}

	function openWeatherConditionBalloon(id) {
		g_map.closeInfoWindow();
		for(var i = 0; i < weatherConditions.length; i++) {
			if(weatherConditions[i].getLabelId() == id) {
				GEvent.trigger(weatherConditions[i], 'click');
				return;
			}
		}
	}

	function loadWeatherConditions() {
		var newIcon;
		GDownloadUrl("/weather_conditions/overlay_xml", function(data) {
			var ti;
			var name;
			var id;
			var url;
			var icon_code;
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				name = markers[i].getAttribute("name");
				id = markers[i].getAttribute("id");
				icon_code = markers[i].getAttribute("icon_code");
				url = '/weather_conditions/' + id + '/html_balloon';

				newIcon = new GIcon();
				newIcon.image = "http://goi70.com/images/weather/icons/61x61/" + icon_code + ".png";
				newIcon.iconSize = new GSize(61,61);
				newIcon.iconAnchor = new GPoint(32,32);
				newIcon.infoWindowAnchor = new GPoint(32,32);

				var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lon")));
				weatherConditions.push(createHtmlMarker(name, id, latlng, newIcon, url, "weather_condition_label", -32, 24));
				ti = weatherConditions.length-1;
				g_map.addOverlay(weatherConditions[ti]);
				weatherConditions[ti].hide();
				weatherConditions[ti].setLabelId(id);
			}
		});
	}

	function loadTrafficCams() {
		loadXmlOverlay(dojo.cookie("traffic_cams.cookie"), "http://www.google.com/mapfiles/kml/pal4/icon57.png", "/traffic_cams/overlay_xml", trafficCams);
/*
		var rc = dojo.cookie("traffic_cams.cookie");

		var newIcon = new GIcon();
		newIcon.image = "http://www.google.com/mapfiles/kml/pal4/icon57.png";
		newIcon.iconSize = new GSize(32,32);
		newIcon.iconAnchor = new GPoint(16,16);
		newIcon.infoWindowAnchor = new GPoint(16,16);

		GDownloadUrl("/traffic_cams/overlay_xml", function(data) {
			var ti;
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				var name = markers[i].getAttribute("name");
				var id = markers[i].getAttribute("id");
				var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lon")));
				trafficCams.push(createMarker(name, id, latlng, newIcon));
				ti = trafficCams.length-1;
				trafficCams[ti].setLabelVisibility(false);
				g_map.addOverlay(trafficCams[ti]);
				if(rc == 'off') {
					trafficCams[ti].hide();
				}
			}
		});
*/
	}

	function createMarker(name, id, latlng, newIcon) {
		//var newIcon = mapIconMaker.createMarkerIcon({width: 32, height: 32, primaryColor: "#00ff00"});
		//var marker = new GMarker(latlng, {icon: newIcon});
		//var marker = new GMarker(latlng);


		var marker = new LabeledMarker(latlng, {"icon": newIcon, "clickable": true, "labelText": name, "labelOffset": new GSize(0,0), "labelClass": ""});

		GEvent.addListener(marker, 'click', function () {
			//marker.openInfoWindowHtml(html);
				var et;
				var desc;
				getTrafficCamBalloon(id,marker);
		});
		return marker;
	}


	function createHtmlMarker(name, id, latlng, newIcon, url, marker_class, label_offset_x, label_offset_y) {
		//var newIcon = mapIconMaker.createMarkerIcon({width: 32, height: 32, primaryColor: "#00ff00"});
		//var marker = new GMarker(latlng, {icon: newIcon});
		var marker = new LabeledMarker(latlng, {"icon": newIcon, "clickable": true, "labelText": name, "labelOffset": new GSize(label_offset_x, label_offset_y), "labelClass": marker_class});
		//var marker = new GMarker(latlng);
		GEvent.addListener(marker, 'click', function () {
			//marker.openInfoWindowHtml(html);
				var et;
				var desc;
				getHtmlBalloon(id,marker,url);
		});
		return marker;
	}
	
	function getHtmlBalloon(inx,feature, url) {
		currentTarget = feature;
		//var url = '<%= url_for(:controller => :local_search_results, :action => :balloon, :only_path => false) %>';
		//var path = currentTarget.getSnippet();
		//var url = path + '/balloon';
		//url = '/traffic_cams/' + inx + '/html_balloon';
		//var request = new Ajax.Request('/chambers/417/members/'+id+'/balloon', {
		var request = new Ajax.Request(url, {
			method: 'get',
			parameters: {},
			onComplete: getHtmlBalloonCB
		});
	}

	function getHtmlBalloonCB(response) {
		//load up the balloon
		var et = currentTarget;
		//var opts = new GInfoWindowOptions();
		//opts.maxWidth = 350;
		//et.bindInfoWindow(response.responseText,opts)
		//et.bindInfoWindow(response.responseText)
		et.openInfoWindowHtml(response.responseText);
	}


	
	function showTrafficCams(on) {
		for (var i = 0; i < trafficCams.length; i++) {
			if(on) {
				trafficCams[i].show();
			} else { 
				trafficCams[i].hide();
			}
		}
	}
	
	function unloadTrafficCams() {
		for (var i = 0; i < trafficCams.length; i++) {
			g_map.removeOverlay(trafficCams[i]);
		}
		trafficCams = [];
	}

	function onresize() {
		var clientHeight = document.documentElement.clientHeight;
		var bc = document.getElementById('banner-content');
		var banner_content_height = 156;
		//var banner_content_height = bc.getHeight();
		//var banner_content_height = $('banner-content').getHeight();
		var theight = clientHeight - banner_content_height; 
		var height_thresh = 550;
		if(screen.height < 1000) {
			height_thresh = 510;
		}
		if(theight < height_thresh) {
			theight = height_thresh;
		}
/*
		$('contentWrapper').setStyle({
			height: (theight).toString() + 'px' });
*/
		dojo.byId('contentWrapper').style.height = (theight).toString() + 'px';
	}
	
	function getTravelTime(travel_time, direction, east_lon, west_lon) {
		var request = new Ajax.Request('/speed_segments/get_trip_time_updaters', {
			method: 'get',
			parameters: {total_tt: 82, direction: direction, start_lon: east_lon, end_lon: west_lon, div_id: 'traffic-delay'},
			onComplete: getTTUpdatersCB
		});
	}

	function getTTUpdatersCB(response) {
  	dojo.byId('trip_time_updaters').innerHTML = response.responseText;
	}


	function getTravelTimeCB(response) {
  	//dojo.byId('right').style.width = "400px";
		dojo.byId('right').style.width = "400px";  	
		var bc = dijit.byId('contentWrapper');
		bc.resize();
  	dojo.byId('trip_time_content').innerHTML = response.responseText;
	}

	function getNotificationsCB(response) {
		dojo.byId('right').style.width = "475px";  	
		var bc = dijit.byId('contentWrapper');
		bc.resize();
  	dojo.byId('notices_content').innerHTML = response.responseText;
	}

	function goLocatedTripTime(from, to) {
		if(from != undefined) {
	  		$('from').setValue(from);
		}
		if(to != undefined) {
  			$('to').setValue(to);
		}
		goTripTime();
	}
	function goTripTime() {
		showTripTimeSpinner();
		DS_goDirections();
		var pane = dijit.byId('trip_time_tab');
		var tabs = dijit.byId('right');
		tabs.selectChild(pane);
		document.getElementById("driving-directions").style.display = "block";
		document.getElementById("driving-directions-button").style.display = "none";
		dijit.byId('driving_directions').attr('value','true');
 		dijit.byId('driving_directions').attr('checked','checked');

		hideTripTimeSpinner();
	}

	function setTripTimeDirection() {
		if(onI70 > offI70) { //west
			dijit.byId('trip_planning_west_bound').attr('value','true');
 			dijit.byId('trip_planning_west_bound').attr('checked','checked');
		} else {
			dijit.byId('trip_planning_east_bound').attr('value','true');
 			dijit.byId('trip_planning_east_bound').attr('checked','checked');
		}
	}

	function getTripTimeDirection() {
		var east = dijit.byId('trip_planning_east_bound').getValue();
		var west = dijit.byId('trip_planning_west_bound').getValue();
		if(east) {
			onI70 = -107.0;
			offI70 = -103.0;
			tripDuration = 0;
		} else {
			onI70 = -103.0;
			offI70 = -107.0;
			tripDuration = 0;
			}
		tripTimeUpdater();
	}	

	function tripTimeUpdater() {
		/*
		var chk = document.getElementById('i70-delay-details');
		if(!chk) {
			//alert('here');
		  //setTimeout(tripTimeUpdater, 100);
			return;
		}
		*/
		tripTimeUpdaterOff();
		loadTripTime();
		loadDelayDetails();
		setTripTimeDirection();
		var url = '/speed_segments/get_trip_time' + '?' + 'start_lon=' + onI70 + 
				'&end_lon=' + offI70 + '&total_tt=' + tripDuration;

		trip_time_updater = new PeriodicalExecuter(function() {new Ajax.Request(url, {asynchronous:true, evalScripts:true, onComplete:function(request){new Effect.Highlight('trip-time-timestamp');return false;} })}, 3600);


		var url2 = '/speed_segments/get_delay_details' + '?' + 'start_lon=' + onI70 + 
				'&end_lon=' + offI70 + '&total_tt=' + tripDuration;

		delay_details_updater = new PeriodicalExecuter(function() {new Ajax.Request(url2, {asynchronous:true, evalScripts:true})}, 3600);

	}

	function tripTimeUpdaterOff() {
		if(trip_time_updater) {
			trip_time_updater.stop();
			trip_time_updater = null;
		}
		if(delay_details_updater) {
			delay_details_updater.stop();
			delay_details_updater = null;
		}
	}

	function loadTravelTime() {
		showTripTimeSpinner();
		var url = '/speed_segments/travel_time' + '?' + 'start_lon=' + onI70 + '&end_lon=' + offI70 + '&total_tt=' + tripDuration;

			var request = new Ajax.Updater('trip_time_content', url, {asynchronous:true, evalScripts:true});
		hideTripTimeSpinner(); 
	}

	function loadTripTime() {
		showTripTimeSpinner();
		var url = '/speed_segments/get_trip_time' + '?' + 'start_lon=' + onI70 + 
				'&end_lon=' + offI70 + '&total_tt=' + tripDuration;
		var request = new Ajax.Updater('', url, {asynchronous:true, evalScripts:true}); 
		hideTripTimeSpinner(); 
	}

	function loadDelayDetails() {
		showTripTimeSpinner();
		var url = '/speed_segments/get_delay_details' + '?' + 'start_lon=' + onI70 + 
				'&end_lon=' + offI70 + '&total_tt=' + tripDuration;
		var request = new Ajax.Updater('', url, {asynchronous:true, evalScripts:true}); 
		hideTripTimeSpinner(); 
	}

	function clearDrivingDirections() {
		if(DS_directions) {
			DS_directions.clear();
		}
		onI70 = -103.0;
		offI70 = -107.0;
		tripDuration = 0;
		loadTravelTime();
		tripTimeUpdater();
		dijit.byId('driving_directions').attr('value',false);
 		dijit.byId('driving_directions').attr('checked',false);

//		$('from').value = '';
//		$('to').value = '';
	}

	function initDrivingDirections() {
		var frm = null;
		frm = dojo.cookie("driving_directions_from.cookie");
		var gto = null;
		gto = dojo.cookie("driving_directions_to.cookie");
		if(frm != null && gto != null) {
  		$('from').setValue(frm);
  		$('to').setValue(gto);
		}
	}

	function swapDrivingDirectionsFromTo() {
		var tmp = $('from').value;
		$('from').value = $('to').value;
		$('to').value = tmp;
		goTripTime();
	}

	function toggleDrivingDirections(id) {
 		var on = dijit.byId(id).getValue();
	  if(!on) {
      clearDrivingDirections();
	  } else {
      goTripTime();
  	}
	}

	function showTripTimeSpinner() {
		$('trip_time_spinner').style.display = 'inline';
		//document.getElementById('trip_time_spinner').style.display = 'block';
	}

	function hideTripTimeSpinner() {
		document.getElementById('trip_time_spinner').style.display = 'none';
	}

	function setRabbitStatus(id, onoff) {
		var url = '/im_rabbits/update_status/' + id;
		var request = new Ajax.Request(url, {
			method: 'put',
			asynchronouse:true,
			evalScripts:true,
			parameters: {active: onoff}
		});
		return false;
	}

	function setupListeners() {
		GEvent.addListener(g_map, 'zoomend', function(oldLevel, newLevel) {
			dojo.cookie("zoom_level.cookie", newLevel, { expires: 7 });
			clearLocalSearch();
			executeLocalSearches();
			return(false);
		});
		GEvent.addListener(g_map, 'moveend', function() {
			var ctr = g_map.getCenter();
			dojo.cookie("center_lat.cookie", ctr.lat(), { expires: 7 });
			dojo.cookie("center_lon.cookie", ctr.lng(), { expires: 7 });
			clearLocalSearch();
			executeLocalSearches();
			return(false);
		});
	}

	function set24HourPrecipForecast() {
		if(precipForecast24Kml == null) {
	  	precipForecast24Kml = new GGeoXml("http://www.hpc.ncep.noaa.gov/kml/qpf/QPF24hr_Day1_main.kml");

		}
  	var on = dijit.byId('24hour_precip_forecast').getValue();
	  if(!on) {
      g_map.removeOverlay(precipForecast24Kml);
	  } else {
			flyToMapView(40, -105, 4);
      g_map.addOverlay(precipForecast24Kml);
  	}
	}

	function setSynoptics() {
		if(synopticsKml == null) {
	  	synopticsKml = new GGeoXml("http://www.srh.noaa.gov/gis/kml/cod/susLink.kml");

		}
  	var on = dijit.byId('synoptics').getValue();
	  if(!on) {
      g_map.removeOverlay(synopticsKml);
	  } else {
      g_map.addOverlay(synopticsKml);
  	}
	}

	function setSnowGages() {
		return;
		if(snowGagesKml == null) {
	  	snowGagesKml = new GGeoXml("http://goi70.com/kml/snotelwithlabels.kmz");
		}
  	var on = dijit.byId('snow_gages').getValue();
	  if(!on) {
      g_map.removeOverlay(snowGagesKml);
	  } else {
      g_map.addOverlay(snowGagesKml);
  	}
	}

	function setRadarImage() {
		if(radarImageKml == null) {
	  	radarImageKml = new GGeoXml("http://goi70.com/kml/CO_Radar_data.kml");
		}
  	var on = dijit.byId('radar_image').getValue();
	  if(!on) {
   	  g_map.removeOverlay(radarImageKml);
	  } else {
			flyToMapView(40, -105, 8);
 	    g_map.addOverlay(radarImageKml);
 		}
	}

	function setAdditionalLayers() {
	  	g_map.addOverlay(new GGeoXml("http://goi70.com/kml/NorthDinosaurLot.kmz"));
	}

	function getSnowReport() {
		var url = '/ski_areas/ski_report/';
		var request = new Ajax.Request(url, {
			method: 'get',
			asynchronouse:true,
			evalScripts:true,
			parameters: {},
			onComplete: function(response) {
  			document.getElementById("snow_report").innerHTML = response.responseText;
			}
		});
		return false;
	}

	function toggleDivs(divon, divoff) {
  	document.getElementById(divoff).style.display = 'none';
  	document.getElementById(divon).style.display = 'inline';
	}

function ResetButton(map) {
    this.map = map;
    this.button = document.createElement("a");
}

ResetButton.prototype = new GControl();

ResetButton.prototype.initialize = function() {

    var map = this.map;

    this.button.className = "custom_reset_button";
    this.button.href = "javascript:;";
    this.button.title = "Rest the map view";
    this.button.innerHTML = "Reset";

    GEvent.addDomListener(this.button, "click", function() {
        setInitialView(10);
    });

    map.getContainer().appendChild(this.button);

    return this.button;

}

ResetButton.prototype.getDefaultPosition = function() {
    return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(130, 24));
}


function ClearButton(map) {
    this.map = map;
    this.button = document.createElement("a");
}

ClearButton.prototype = new GControl();

ClearButton.prototype.initialize = function() {

    var map = this.map;

    this.button.className = "custom_clear_button";
    this.button.href = "javascript:;";
    this.button.title = "Clear the map view";
    this.button.innerHTML = "Clear";

    GEvent.addDomListener(this.button, "click", function() {

			clearDrivingDirections();
			initLayers();


			dijit.byId('tweets').attr('value',false);
	 		dijit.byId('tweets').attr('checked',false);
			setTweets();

			dijit.byId('im_rabbits').attr('value',false);
	 		dijit.byId('im_rabbits').attr('checked',false);
			setImRabbits();

			dijit.byId('weather_conditions').attr('value',false);
	 		dijit.byId('weather_conditions').attr('checked',false);
			setWeatherConditions();

			dijit.byId('24hour_precip_forecast').attr('value',false);
	 		dijit.byId('24hour_precip_forecast').attr('checked',false);
			set24HourPrecipForecast();

			dijit.byId('synoptics').attr('value',false);
	 		dijit.byId('synoptics').attr('checked',false);
			setSynoptics();

			dijit.byId('radar_image').attr('value',false);
	 		dijit.byId('radar_image').attr('checked',false);
			setRadarImage();


			dijit.byId('restaurants').attr('value',false);
	 		dijit.byId('restaurants').attr('checked',false);

			dijit.byId('lodging').attr('value',false);
	 		dijit.byId('lodging').attr('checked',false);

			dijit.byId('shopping').attr('value',false);
	 		dijit.byId('shopping').attr('checked',false);

			dijit.byId('parking').attr('value',false);
	 		dijit.byId('parking').attr('checked',false);

			dijit.byId('gas').attr('value',false);
	 		dijit.byId('gas').attr('checked',false);

			dijit.byId('hiking').attr('value',false);
	 		dijit.byId('hiking').attr('checked',false);

			dijit.byId('pools').attr('value',false);
	 		dijit.byId('pools').attr('checked',false);

			dijit.byId('parks').attr('value',false);
	 		dijit.byId('parks').attr('checked',false);

			dijit.byId('golf_courses').attr('value',false);
	 		dijit.byId('golf_courses').attr('checked',false);

			dijit.byId('spas').attr('value',false);
	 		dijit.byId('spas').attr('checked',false);

			clearLocalSearch();
			doLocalSearch("i70", 'local_search_box');

			dijit.byId('ski_areas').attr('value',false);
	 		dijit.byId('ski_areas').attr('checked',false);
			setSkiAreas();

			dijit.byId('photos').attr('value',false);
	 		dijit.byId('photos').attr('checked',false);
			setPhotos();

			dijit.byId('videos').attr('value',false);
	 		dijit.byId('videos').attr('checked',false);
			setVideos();

			dijit.byId('wikipedia').attr('value',false);
	 		dijit.byId('wikipedia').attr('checked',false);
			setWikipedia();

			dijit.byId('webcams').attr('value',false);
	 		dijit.byId('webcams').attr('checked',false);
			setWebcams();

    });

    map.getContainer().appendChild(this.button);

    return this.button;

}

ClearButton.prototype.getDefaultPosition = function() {
    return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(72, 24));
}

function toggleShareLocation() {
	if(share_location) {
		share_location = false;
		user_lat = null;
		user_lon = null;
		user_position_timestamp = null;
		document.getElementById("user_location_off").style.display = "block";
		document.getElementById("user_location_on").style.display = "none";
		document.getElementById("user_location_spinner").style.display = "none";
		killUserMarker();
		//kill updaters
		if(location_updater) {
			clearTimeout(location_updater);
			location_updater = null;
		}
	} else {
		share_location = true;
		//start updaters
		//location_updater = setTimeout("getUserLocation()", 2*60*1000);
		document.getElementById("user_location_spinner").style.display = "block";
		getUserLocation();
	}
}

function getUserLocation() {
	if(share_location) {
		if(navigator.geolocation) {
			navigator.geolocation.getCurrentPosition( function(position) {
				user_lat = position.coords.latitude;
				user_lon = position.coords.longitude;
				user_position_timestamp = position.timestamp;
				setUserMarker(gUserIcon);
				flyToMapView(user_lat, user_lon, 14);
				location_updater = setTimeout("getUserLocation()", 2*60*1000);
				document.getElementById("user_location_spinner").style.display = "none";
				document.getElementById("user_location_off").style.display = "none";
				document.getElementById("user_location_on").style.display = "block";
//			alert("lat: " + lat + ", lon: " + lon);
			}, function(error) {
				toggleShareLocation();
			}, 
			{maximumAge:1000*60*30, timeout:0});

		}	else {
			toggleShareLocation();
		}
	}
}

function killUserMarker() {
	g_map.removeOverlay(user_marker);
	user_marker = null;
}

function setUserMarker(opt_icon) {
	if(user_marker) {
		updateUserMarker();
	} else {
		user_marker = new google.maps.Marker(new google.maps.LatLng(user_lat, user_lon), opt_icon);
		g_map.addOverlay(user_marker);
	}
}

function updateUserMarker() {
	user_marker.setPoint(GlatLng(user_lat, user_lon));
}

function messageLoadLatLon() {
	if(user_lat) {
		document.message_form.lat.value = user_lat;
	}
	if(user_lon) {
		document.message_form.lon.value = user_lon;
	}
	if(user_position_timestamp) {
		document.message_form.position_timestamp.value = user_position_timestamp;
	}
}

	/*
	*	loadXmlOverlay("traffic_cams.cookie", "http://www.google.com/mapfiles/kml/pal4/icon57.png", "/traffic_cams/overlay_xml", trafficCams);
	*/
	function loadXmlOverlay(onoff, image_url, overlay_url, layer_array) {
		//var rc = dojo.cookie(cookie);
		var rc = onoff;

		var newIcon = new GIcon();
		newIcon.image = image_url;
		newIcon.iconSize = new GSize(32,32);
		newIcon.iconAnchor = new GPoint(16,16);
		newIcon.infoWindowAnchor = new GPoint(16,16);

		GDownloadUrl(overlay_url, function(data) {
			var ti;
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				var name = markers[i].getAttribute("name");
				var id = markers[i].getAttribute("id");
				var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lon")));
				layer_array.push(createMarker(name, id, latlng, newIcon));
				ti = layer_array.length-1;
				layer_array[ti].setLabelVisibility(false);
				g_map.addOverlay(layer_array[ti]);
				if(rc == 'off') {
					layer_array[ti].hide();
				}
			}
		});
	}

	/*
	loadXmlOverlayWithHtmlBalloons(dojo.cookie("traffic_cams.cookie"), "", "/ski_areas/overlay_xml", skiAreas, 'ski_areas', 'html_balloon',"ski_area_label");
	*/ 
	function loadXmlOverlayWithHtmlBalloons(onoff, image_url, overlay_url, layer_array, controller, balloon_method, marker_class) {
		var newIcon;
		GDownloadUrl(overlay_url, function(data) {
			var ti;
			var name;
			var id;
			var url;
			var icon_url;
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				name = markers[i].getAttribute("name");
				id = markers[i].getAttribute("id");
				if(image_url != "") {
					icon_url = image_url;
				} else {
					icon_url = markers[i].getAttribute("icon_url");
				}
				url = '/ski_areas/' + id + '/html_balloon';
				//url2 = '/' + controller + '/' + id + '/' + balloon_method; 

				newIcon = new GIcon();
				newIcon.image = icon_url;
				newIcon.iconSize = new GSize(31,31);
				newIcon.iconAnchor = new GPoint(16,16);
				newIcon.infoWindowAnchor = new GPoint(16,16);

				var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lon")));
				layer_array.push(createHtmlMarker(name, id, latlng, newIcon, url, marker_class,-40, 12));
				ti = layer_array.length-1;
				g_map.addOverlay(layer_array[ti]);
				if(onoff == 'off') {
					layer_array[ti].hide();
				}
			}
		});
	}

/*
setlayer("traffic_cams.cookie", dijit.byId('traffic_cams').getValue(), skiAreas);
must map layer name onto a unique layer array
*/
	function setLayer(cookie, on, layer_array) {
	  if(!on) {
			g_map.closeInfoWindow();
			showLayer(false, layer_array);
			dojo.cookie(cookie, "off", { expires: 7 });
	  } else {
			showLayer(true, layer_array);
			dojo.cookie(cookie, "on", { expires: 7 });
  	}
	}

	function showLayer(on, layer_array) {
		for (var i = 0; i < layer_array.length; i++) {
			if(on) {
				layer_array[i].show();
			} else { 
				layer_array[i].hide();
			}
		}
	}
	

