﻿/// <reference name="MicrosoftAjax.js"/>
/// <reference assembly="AjaxControlToolkit" name="AjaxControlToolkit.Common.Common.js"/>
/// <reference assembly="AppGeo.Web.Extensions" name="AppGeo.Web.Extensions.ArgumentEncoder.js"/>
/// <reference assembly="AppGeo.Web.Extensions" name="AppGeo.Web.Extensions.QueryString.js"/>
/// <reference assembly="AppGeo.Web.Extensions" name="AppGeo.Web.Extensions.Net.WebRequestQueue.js"/>
/// <reference assembly="AppGeo.Web.Extensions" name="AppGeo.Web.Extensions.UI.CheckBox.js"/>
/// <reference assembly="AppGeo.Web.Extensions" name="AppGeo.Web.Extensions.UI.GridView.js"/>
/// <reference assembly="AppGeo.Web.Extensions" name="AppGeo.Web.Extensions.UI.InfoBar.js"/>
/// <reference assembly="AppGeo.Web.Extensions" name="AppGeo.Web.Extensions.UI.ToolMenu.js"/>
/// <reference path="~/Scripts/HealthNet.js"/>

/// <summary>Code-behind for Map.aspx</summary>

function pageLoad(sender, args) {
  if (!args.get_isPartialLoad()) {
    HealthFacilitiesSvc.set_defaultFailedCallback(Svc_failed);
    
    initializeComponents();
    processQueryString();
    
    if (_selectedId.length > 0) {
      webRequests.queue(HealthFacilitiesSvc, "GetDetails", {id: _selectedId});
      
      if (isGetDirections()) {
        $find("menuTabs").set_selectedIndex(1);
      } else {
        $find("menuTabs").set_selectedIndex(0);
      }
    } else {
      $find("menuTabs").set_selectedIndex(2);
    }
    
    if (_criteria.addr.length > 0) {
      geocoder.getLatLng(_criteria.addr, geocoder_getLatLng_succeeded);
    }
    
    webRequests.queue(HealthFacilitiesSvc, "SearchInteractive", {criteria: _criteria, getAll: false});
    webRequests.queue(HealthFacilitiesSvc, "SearchInteractive", {criteria: _criteria, getAll: false}, HealthFacilitiesSvc_SearchInteractiveAll_succeeded);
  }

  initializeDomElements();
}

function pageUnload(sender, args) {
  GUnload();
}

function initializeComponents() {
  // chkServiceTypeAdult
  $create(Ag.UI.CheckBox, null, {checkedChanged: chkServiceType_checkedChanged}, null, $get("chkServiceTypeAdult"));
  
  // chkServiceTypeChildren
  $create(Ag.UI.CheckBox, null, {checkedChanged: chkServiceType_checkedChanged}, null, $get("chkServiceTypeChildren"));
  
  // geocoder
  geocoder = new GClientGeocoder();
  
  // gvInteractiveResults
  var gvInteractiveResults = $create(InteractiveResultsView, {alternatingRowCssClass: "AlternatingRow"}, null, null, $get("gvInteractiveResults"));
  gvInteractiveResults.set_headerIds(new Array("colInteractiveResultsName", "colInteractiveResultsAddress"));

  // infoBar
  infoBar = $create(Ag.UI.InfoBar, null, null, null, $get("infoBar"));
  
  // mapMain
  mapMain = new GMap2($get("mapMain"));
  GEvent.addListener(mapMain, "infowindowopen", mapMain_infowindowopen);
  GEvent.addListener(mapMain, "moveend", mapMain_moveend);
  mapMain.enableScrollWheelZoom();
  mapMain.addControl(new GLargeMapControl());
  mapMain.setCenter(new GLatLng(39.15, -94.50), 10);
  mapMain.addControl(new GMapTypeControl());
  mapMain.addControl(new GScaleControl());

  // menuTabs
  var menuTabs = $create(Ag.UI.ToolMenu, {id: "menuTabs", hoverCssClass: "MapTabItemHover", selectedCssClass: "MapTabItemSelected"}, null, null);
  menuTabs.addItem("optDetails");
  menuTabs.addItem("optDirections");
  menuTabs.addItem("optInteractive");
  menuTabs.addItem("optNewSearch");
  menuTabs.add_selectedIndexChanged(menuTabs_selectedIndexChanged);

  // txtDirectionsStart
  $create(AjaxControlToolkit.TextBoxWatermarkBehavior, {id: "txtDirectionsStart", WatermarkCssClass: "MapDirectionsWatermark", WatermarkText: ScriptResources.txtDirectionsStart_WatermarkText}, null, null, $get("txtDirectionsStart"));

  // webRequests
  webRequests = $create(Ag.Net.WebRequestQueue, {id: "webRequests"}, {requestsQueued: webRequests_requestsQueued});

  // _criteria
  _criteria = new CriteriaClient();
  
  // _directions
  _directions = new GDirections(mapMain, $get("pnlDirectionsResults"));
  GEvent.addListener(_directions, "error", directions_error);
  GEvent.addListener(_directions, "load", directions_load);

  // _searchResultMarkers
  _searchResultMarkers = new Array();
  
  // _tabPositions
  _tabPositions = new Array();
  _tabPositions["optDirections"] = {center: mapMain.getCenter(), zoom: mapMain.getZoom()};
  _tabPositions["optInteractive"] = {center: mapMain.getCenter(), zoom: mapMain.getZoom()};
}

function initializeDomElements() {
  // cmdChangeLanguage
  $addHandler($get("cmdChangeLanguage"), "click", cmdChangeLanguage_click);
  
  // cmdDirectionsLoad
  var cmdDirectionsLoad = $get("cmdDirectionsLoad");
  cmdDirectionsLoad.value = ScriptResources.cmdDirectionsLoad_Value;
  $addHandler(cmdDirectionsLoad, "click", cmdDirectionsLoad_click);
  
  // cmdPrint
  $addHandler($get("cmdPrint"), "click", cmdPrint_click);
  
  // txtDirectionsStart
  $addHandler($get("txtDirectionsStart"), "keypress", txtDirectionsStart_keypress);
}

function processQueryString() {
  /// <remarks>
  /// We must check the checkboxes behind the scenes to avoid firing the events.
  /// </remarks>
  _queryString = new Ag.QueryString();
  var allKeys = _queryString.get_allKeys();
  
  if (Array.contains(allKeys, "q")) {
    Ag.ArgumentEncoder.decode(_queryString.q, _criteria);
    
    $find("txtDirectionsStart").set_Text(_criteria.addr);
    
    if (_criteria.st.indexOf("a") >= 0) {
      $get("chkServiceTypeAdult").checked = true;
    }
    
    if (_criteria.st.indexOf("c") >= 0) {
      $get("chkServiceTypeChildren").checked = true;
    }
  }
  
  if (Array.contains(allKeys, "id")) {
    _selectedId = _queryString.id;
  }
}

// Service Callbacks

function Svc_failed(error) {
  alert(error.get_message());
}

function HealthFacilitiesSvc_GetDetails_succeeded(result) {
  var selectedTabId = $find("menuTabs").get_selectedId();

  $get("lblDetailsName").innerHTML = result.Name;
  $get("lblDetailsAddress").innerHTML = result.Address;
  $get("lblDetailsAddress2").innerHTML = result.Address2;
  $get("lblDetailsPhone").innerHTML = result.Phone;
  $get("lblDetailsFax").innerHTML = result.Fax;
  
  var lnkDetailsURL = $get("lnkDetailsURL");
  lnkDetailsURL.href = result.URL;
  lnkDetailsURL.innerHTML = result.URL.replace(/http:\/\//, "");
  
  $get("lblDetailsHours").innerHTML = result.Hours;
  $get("lblDetailsServices").innerHTML = result.Services;
  $get("lblDetailsInHouseServices").innerHTML = result.InHouseServices;
  $get("lblDetailsCoverage").innerHTML = result.Coverage;
  
  $common.setVisible($get("dvDetails"), (selectedTabId != "optDirections"));
  
  if (_selectedMarker != null) {
    mapMain.removeOverlay(_selectedMarker);
    // TODO: Remove handlers from overlay?
    delete(_selectedMarker);
  }

  _directions.clear();
  $get("lblDirectionsEndName").innerHTML = result.Name;
  $get("lblDirectionsEnd").innerHTML = result.Address + "<br />" + result.Address2;
  _endAddress = result.Address + "," + result.Address2;
  _endAddress = _endAddress.replace(/ /g, "+");

  if (!isNaN(result.Location.lat) && !isNaN(result.Location.lng)) {
    var location = new GLatLng(result.Location.lat, result.Location.lng);
    
    var noShadow = new GIcon(G_DEFAULT_ICON, makeUrl("/Images/MarkerYellowDot.png"));
    noShadow.printShadow = null;
    
    var markerOptions = {clickable: false, icon: noShadow};
    _selectedMarker = new GMarker(location, markerOptions);
    mapMain.addOverlay(_selectedMarker);
    
    switch (selectedTabId) {
      case "optDetails":
        Sys.Debug.trace("GetDetails - setCenter");
        mapMain.setCenter(_selectedMarker.getLatLng(), DetailsZoom);
        break;
      
      case "optInteractive":
        _selectedMarker.hide();
        break;
    }
  } else {
    alert(ScriptResources.alert_GetDetails);
  }
  
  if (selectedTabId == "optDirections") {
    loadDirections();
  }
}

function HealthFacilitiesSvc_GetDirectionsSearchText_succeeded(result) {
  _directions.load(result);
}

function HealthFacilitiesSvc_SearchInteractive_succeeded(result) {
  var gvInteractiveResults = $find("gvInteractiveResults");
  gvInteractiveResults.set_dataSource(result);
  gvInteractiveResults.dataBind();
}

function HealthFacilitiesSvc_SearchInteractiveAll_succeeded(result) {
  // TODO: Test that this does not crash
  for (var i = 0; i < _searchResultMarkers.length; i++) {
    mapMain.removeOverlay(_searchResultMarkers[i]);
    delete(_searchResultMarkers[i]);
  }

  Array.clear(_searchResultMarkers);
  
  var menuTabs = $find("menuTabs");
  var bZoom = (menuTabs.get_selectedId() == "optInteractive");
  var minLat = NaN;
  var minLng = NaN;
  var maxLat = NaN;
  var maxLng = NaN;
  
  for (var i = 0; i < result.length; i++) {
    if (result[i].Location != null) {
      var location = new GLatLng(result[i].Location.lat, result[i].Location.lng);

      var markerIcon = null;
      if (_selectedId.length > 0 && _selectedId == result[i].ID) {
        markerIcon = new GIcon(G_DEFAULT_ICON, makeUrl("/Images/MarkerYellowDot.png"));
      } else if (result[i].Result) {
        markerIcon = new GIcon(G_DEFAULT_ICON, makeUrl("/Images/MarkerRedDot.png"));
      } else {
        markerIcon = new GIcon(G_DEFAULT_ICON, makeUrl("/Images/MarkerGray.png"));
      }
      
      var markerOptions = {icon: markerIcon};
      var marker = new GMarker(location, markerOptions);
      marker.tag = result[i];
      Array.add(_searchResultMarkers, marker);
      GEvent.addListener(marker, "click", cmdInteractiveMarker_click);
      mapMain.addOverlay(marker);
      
      if ($find("menuTabs").get_selectedId() != "optInteractive") {
        marker.hide();
      }
      
      if (bZoom && result[i].Result) {
        if (isNaN(minLat)) {
          minLat = result[i].Location.lat;
          minLng = result[i].Location.lng;
          maxLat = result[i].Location.lat;
          maxLng = result[i].Location.lng;
        } else {
          minLat = Math.min(minLat, result[i].Location.lat);
          minLng = Math.min(minLng, result[i].Location.lng);
          maxLat = Math.max(maxLat, result[i].Location.lat);
          maxLng = Math.max(maxLng, result[i].Location.lng);
        }
      }
    }
  }
  
  if (!isNaN(minLat)) {
    var bounds = new GLatLngBounds(new GLatLng(minLat, minLng), new GLatLng(maxLat, maxLng));
    var zoomLevel = mapMain.getBoundsZoomLevel(bounds);
    mapMain.setCenter(bounds.getCenter(), zoomLevel);
  }
}

// Google Events

function cmdInteractiveMarker_click() {
  _selectedId = this.tag.ID;
  selectInteractiveMarker();
  
  webRequests.queue(HealthFacilitiesSvc, "GetDetails", {id: _selectedId});
  
  this.openInfoWindowHtml(this.tag.InfoWindowHtml);
}

function directions_error() {
  /// <summary>If there is an error with a specific address, resort to lat/lng</summary>
  var status = _directions.getStatus();
  if (status.code == 602) {
    webRequests.queue(HealthFacilitiesSvc, "GetDirectionsSearchText", {startAddress: $find("txtDirectionsStart").get_Text(), endAddress: _endAddress});
  } else {
    alert(ScriptResources.alert_Directions);
  }
}

function directions_load() {
  if (_addrMarker != null) {
    _addrMarker.hide();
  }
  
  if (_selectedMarker != null) {
    _selectedMarker.hide();
  }
}

function geocoder_getLatLng_succeeded(point) {
  if (point != null) {
    if (_addrMarker != null) {
      mapMain.removeOverlay(_addrMarker);
      delete(_addrMarker);
    }
    
    var arrow = new GIcon(G_DEFAULT_ICON, makeUrl("/Images/arrow.png"));
    arrow.shadow = makeUrl("/Images/arrowshadow.png");
    arrow.iconSize = new GSize(23, 34);
    var markerOptions = {clickable: false, icon: arrow};
    
    _addrMarker = new GMarker(point, markerOptions);
    mapMain.addOverlay(_addrMarker);
    if ($find("menuTabs").get_selectedId() != "optInteractive") {
      _addrMarker.hide();
    }
  }
}

function mapMain_infowindowopen() {
  if ($find("menuTabs").get_selectedId() == "optDirections") {
    if (Sys.Browser.agent === Sys.Browser.InternetExplorer) {
      // TODO: Kludge to make the MapBlowup appear in IE
      window.resizeBy(1, 0);
      window.resizeBy(-1, 0);
    }
  }
}

function mapMain_moveend() {
  var menuTabs = $find("menuTabs");
  if (menuTabs != null && menuTabs.get_selectedId() != "optDetails") {
    Sys.Debug.trace("moveend - " + menuTabs.get_selectedId());
    _tabPositions[menuTabs.get_selectedId()].center = mapMain.getCenter();
    _tabPositions[menuTabs.get_selectedId()].zoom = mapMain.getZoom();
  }
}

// AJAX Events

function chkServiceType_checkedChanged(sender, args) {
  _criteria.st = "";
  if ($find("chkServiceTypeAdult").get_checked()) {
    _criteria.st += "a";
  }
  if ($find("chkServiceTypeChildren").get_checked()) {
    _criteria.st += "c";
  }

  webRequests.queue(HealthFacilitiesSvc, "SearchInteractive", {criteria: _criteria, getAll: false});
  webRequests.queue(HealthFacilitiesSvc, "SearchInteractive", {criteria: _criteria, getAll: false}, HealthFacilitiesSvc_SearchInteractiveAll_succeeded);
}

function menuTabs_selectedIndexChanged(sender, args) {
  var selectedId = sender.get_selectedId();
  
  if (_selectedId.length == 0) {
    if (selectedId == "optDetails" || selectedId == "optDirections") {
      infoBar.setInfo("Warning", ScriptResources.infoBar_SelectClinic);
      sender.set_selectedIndex(2);
      return;
    }
  }
  
  switch (selectedId) {
    case "optDetails":
    case "optDirections":
    case "optInteractive":
      setTabData(selectedId);
      setTabMap(selectedId);
      break;
    
    case "optNewSearch":
      window.location.href = makeUrl("/Search.aspx?hl=" + hl);
      break;
  }
}

function webRequests_requestsQueued(sender, args) {
  infoBar.clearInfo();
}

// DOM Events

function cmdChangeLanguage_click(e) {
  /// <summary>Hook this up within each page</summary>
  hl = (hl == "en" ? "es" : "en");

  var t = "i";
  if ($find("menuTabs").get_selectedId() == "optDirections") {
    t = "d";
  }
  
  if (_selectedId.length > 0) {
    var urlFormat = "/Map.aspx?id={0}&t={1}&q={2}&hl={3}";
    window.location.href = makeUrl(String.format(urlFormat, _selectedId, t, Ag.ArgumentEncoder.encode(_criteria), hl));
  } else {
    var urlFormat = "/Map.aspx?t={0}&q={1}&hl={2}";
    window.location.href = makeUrl(String.format(urlFormat, t, Ag.ArgumentEncoder.encode(_criteria), hl));
  }
}

function cmdDirectionsLoad_click(e) {
  loadDirections();
}

function cmdInteractiveDirections_click(e) {
  $find("menuTabs").set_selectedIndex(1);
  $get("txtDirectionsStart").focus();
}

function cmdInteractiveMoreInfo_click(e) {
  $find("menuTabs").set_selectedIndex(0);
}

function cmdInteractiveResult_click(e) {
  var dataItem = e.target.tag;
  
  _selectedId = dataItem.ID;
  selectInteractiveMarker();
  
  webRequests.queue(HealthFacilitiesSvc, "GetDetails", {id: _selectedId});
  
  var location = new GLatLng(dataItem.Location.lat, dataItem.Location.lng);
  mapMain.openInfoWindowHtml(location, dataItem.InfoWindowHtml);
}

function cmdPrint_click(e) {
  switch ($find("menuTabs").get_selectedId()) {
    case "optDetails":
    case "optInteractive":
      window.print();
      break;
    
    case "optDirections":
      var startAddress = $find("txtDirectionsStart").get_Text().replace(/ /g, "+");
      var printUrl = String.format("http://maps.google.com/maps?f=d&saddr={0}&daddr={1}&pw=2&hl={2}", startAddress, _endAddress, hl);
      window.open(printUrl, "_blank");
      break;
      
    default:
      break;
  }
}

function form_submit(e) {
  /// <summary>Don't do anything, this app doesn't submit</summary>
}

function txtDirectionsStart_keypress(e) {
  if (e.charCode == Sys.UI.Key.enter) {
    e.preventDefault();
    loadDirections();
  }
}

// Public Methods

function isGetDirections() {
  /// <summary>Return true if this is a directions request</summary>
  if (Array.contains(_queryString.get_allKeys(), "t")) {
    return (_queryString.t == "d");
  } else {
    return false;
  }
}

function loadDirections() {
  var startAddress = $find("txtDirectionsStart").get_Text();
  if (startAddress.length <= 0) {
    alert(ScriptResources.prompt_StartingAddress);
    return;
  }
  
  if (_endAddress.length <= 0) {
    alert(ScriptResources.alert_SelectClinicInteractive);
    return;
  }
  
  var searchText = String.format("from: {0} to: {1}", startAddress, _endAddress);
  _directions.load(searchText);
}

function selectInteractiveMarker() {
  /// <summary>Marker for _selectedId turns yellow, all others turn red</summary>
  for (var i = 0; i < _searchResultMarkers.length; i++) {
    if (_searchResultMarkers[i].tag.ID == _selectedId) {
      _searchResultMarkers[i].setImage(makeUrl("/Images/MarkerYellowDot.png"));
    } else if (_searchResultMarkers[i].tag.Result) {
      _searchResultMarkers[i].setImage(makeUrl("/Images/MarkerRedDot.png"));
    } else {
      _searchResultMarkers[i].setImage(makeUrl("/Images/MarkerGray.png"));
    }
  }
}

function setDirectionsVisible(visible) {
  var status = _directions.getStatus();
  if (status) {
    if (_directions.getStatus().code == G_GEO_SUCCESS) {
      if (visible) {
        _directions.getPolyline().show();

        var marker = _directions.getMarker(0);
        if (marker != null) {
          marker.show();
        }

        marker = _directions.getMarker(1);
        if (marker != null) {
          marker.show();
        }
      } else {
        _directions.getPolyline().hide();

        var marker = _directions.getMarker(0);
        if (marker != null) {
          marker.hide();
        }

        marker = _directions.getMarker(1);
        if (marker != null) {
          marker.hide();
        }
      }
    }
  }
}

function setInteractiveVisible(visible) {
  /// <summary>Show or hide search result markers</summary>
  /// <param name="visible" type="Boolean">new marker visibility</param>
  for (var i = 0; i < _searchResultMarkers.length; i++) {
    if (visible) {
      _searchResultMarkers[i].show();
    } else {
      _searchResultMarkers[i].hide();
    }
  }
}

function setTabData(selectedId) {
  /// <summary>Data and panel-related tab changes</summary>
  
  switch (selectedId) {
    case "optDetails":
      $common.setVisible($get("pnlInteractive"), false);
      $common.setVisible($get("lblDirectionsHeader"), false);
      $common.setVisible($get("lblInteractiveHeader"), false);
      
      $common.setVisible($get("pnlDirections"), false);
      
      if (_selectedMarker != null) {
        $common.setVisible($get("dvDetails"), true);
      }
  
      $common.setVisible($get("pnlDetails"), true);
      $common.setVisible($get("lblDetailsHeader"), true);
      break;
      
    case "optDirections":
      $common.setVisible($get("pnlInteractive"), false);
      $common.setVisible($get("lblDetailsHeader"), false);
      $common.setVisible($get("lblInteractiveHeader"), false);
      
      $common.setVisible($get("dvDetails"), false);
      $common.setVisible($get("pnlDirections"), true);
  
      $common.setVisible($get("pnlDetails"), true);
      $common.setVisible($get("lblDirectionsHeader"), true);
      break;
    
    case "optInteractive":
      $common.setVisible($get("pnlDetails"), false);
      $common.setVisible($get("lblDetailsHeader"), false);
      $common.setVisible($get("lblDirectionsHeader"), false);
      
      $common.setVisible($get("pnlInteractive"), true);
      $common.setVisible($get("lblInteractiveHeader"), true);
      break;
      
    default:
      break;
  }
}

function setTabMap(selectedId) {
  /// <summary>Map-related tab changes</summary>
  switch (selectedId) {
    case "optDetails":
      mapMain.closeInfoWindow();
      
      if (_addrMarker != null) {
        _addrMarker.hide();
      }
      
      setInteractiveVisible(false);
      setDirectionsVisible(false);
      
      var cellSize = $common.getSize($get("cellMapContent"));
      var panelSize = $common.getSize($get("pnlDetails"));
      cellSize.width -= panelSize.width;
      cellSize.height = panelSize.height;
      $common.setSize($get("mapMain"), cellSize);
      mapMain.checkResize();

      if (_selectedMarker != null) {
        mapMain.setCenter(_selectedMarker.getLatLng(), DetailsZoom);
        _selectedMarker.show();
      }
      break;
      
    case "optDirections":
      mapMain.closeInfoWindow();
      
      if (_addrMarker != null && _directions.getStatus().code == G_GEO_SUCCESS) {
        _addrMarker.hide();
      }
      
      if (_selectedMarker != null && _directions.getStatus().code == G_GEO_SUCCESS) {
        _selectedMarker.hide();
      }
      
      setInteractiveVisible(false);
      
      var cellSize = $common.getSize($get("cellMapContent"));
      var panelSize = $common.getSize($get("pnlDetails"));
      cellSize.width -= panelSize.width;
      cellSize.height = panelSize.height;
      $common.setSize($get("mapMain"), cellSize);
      mapMain.checkResize();

      mapMain.setCenter(_tabPositions["optDirections"].center, _tabPositions["optDirections"].zoom);

      if (_addrMarker != null && _directions.getStatus() != G_GEO_SUCCESS) {
        _addrMarker.show();
      }
      
      if (_selectedMarker != null && _directions.getStatus() != G_GEO_SUCCESS) {
        _selectedMarker.show();
      }

      setDirectionsVisible(true);      
      break;
      
    case "optInteractive":
      mapMain.closeInfoWindow();
      
      if (_selectedMarker != null) {
        _selectedMarker.hide();
      }

      setDirectionsVisible(false);      
      
      var cellSize = $common.getSize($get("cellMapContent"));
      var panelSize = $common.getSize($get("pnlInteractive"));
      cellSize.width = panelSize.width;
      cellSize.height -= panelSize.height;
      $common.setSize($get("mapMain"), cellSize);
      mapMain.checkResize();

      mapMain.setCenter(_tabPositions["optInteractive"].center, _tabPositions["optInteractive"].zoom);
      
      if (_addrMarker != null) {
        _addrMarker.show();
      }

      setInteractiveVisible(true);
      break;
      
    default:
      break;
  }
}

// Public Constants

var DetailsZoom = 15;
var DirectionsPrintFormat = "http://maps.google.com/maps?f=d&hl=en&saddr={0}&daddr={1}&pw=2";

// Public Fields

var _directions = null;
var geocoder = null;
var infoBar = null;
var mapMain = null;
var webRequests = null;

// Private Fields

var _criteria = null;
var _addrMarker = null;
var _endAddress = "";
var _queryString = null;
var _selectedId = "";
var _selectedMarker = null;
var _searchResultMarkers = null;
var _tabPositions = null;

if (typeof(Sys) !== "undefined") {
  Sys.Application.notifyScriptLoaded();
}
