﻿// script to the support the main map view on Default.apx 

var _layers = [];
var _viewDate = new Date();
var _hasPageLoadPanned = false;
var _trackmemap;
var _enableDataLayers = true;
var _queryUser = null;
var _zoomToUser = null;

var mapModeOnSigninDialog;
var g_omniFlightSuite = ""; // fixes undefined error in ve6

function page_load() 
{
    var calendarExt = $find("calendarExt");
    var searchExt = $find("searchExt");
    var layerManagerExt = $find("layerManagerExt");

    var args = getQueryParams();
    if(args["user"]) _queryUser = _zoomToUser = args["user"];

    calendarExt.add_collapseComplete(resizePanels);
    calendarExt.add_expandComplete(resizePanels);
    searchExt.add_collapseComplete(resizePanels);
    searchExt.add_expandComplete(resizePanels);

    if (layerManagerExt != null) 
    {
        layerManagerExt.add_collapseComplete(resizePanels);
        layerManagerExt.add_expandComplete(resizePanels);
    }
    
    var LoginPanelPopupExt = $find("header_profile_LoginView_LoginPanelPopupExt");
    if (LoginPanelPopupExt != null) {
      LoginPanelPopupExt.add_shown(
        function() {
          $get("header_profile_LoginView_Login1_UserName").focus();
        });
      LoginPanelPopupExt.add_showing(
        function() {
          mapModeOnSigninDialog = _trackmemap.getMapMode();
          if (mapModeOnSigninDialog === "3D") {
            _trackmemap.setMapMode("2D");
          }
        });
    }
}

function map_created(map) {
    _trackmemap = map;
   
    page_resize();
    
    _trackmemap.showDashboardPanel();
    
    _trackmemap.addPrePointBubbleShow(map_prePointBubbleShow);
    _trackmemap.addPreDoerBubbleShow(map_preDoerBubbleShow);
    _trackmemap.addOnMapChangeView(map_viewchanged);
    
    _center = _trackmemap.getMapCenter();
    
    if (_enableDataLayers === true) {
      setTimeout("loadLayers()", 300);
    }
    
    var today = new Date();
    var thisMonth = today.getMonth();
    var thisYear = today.getYear();
    var calendar = createTimeLine(thisMonth, thisYear);
    $get("calendar").appendChild(calendar);
}

function onCancelSigninDialog() {
  if (mapModeOnSigninDialog !== _trackmemap.getMapMode()) {
    if (mapModeOnSigninDialog === "3D") {
      _trackmemap.setMapMode("3D");
    }
  }
}

function onLoginAttempt() {
  var input = $get("mapPermaLink");
  if (input !== null) {
    input.value = _trackmemap.getPermaLink();
  }
}

function loadLayers() 
{
    var concoctionId = $get("CurrentConcoctionId");
    var args = { concoctionId : concoctionId.value };
    var apiRequest = new TrackMe.Api.Request("concoctionLayers", "concoctions/getLayers", args ); 
    apiRequest.doRequest("processLoadLayers");
}

function processLoadLayers(concoction) 
{
  var layers = concoction.layers;
    var previousPanel = null;

    for (var l in layers) 
    {
        var layer = layers[l];

        if (!findLayer(layer.id))
        {
            var shortcutNumber = l;
            if (shortcutNumber >= 3) shortcutNumber++;
            var p = createInfoNode(layer.id + "_panel", layer.name, "Ctrl+Alt+" + shortcutNumber,
                function(panel) { //onShow
                    var view = _trackmemap.getViewRegion();
                    requestLayer(panel.layer, view);
                },
                function(panel) { //onClose
                    var layer = panel.layer;
                    removeLayerItems(layer);
                }
            );
            layer.panel = p;
            p.layer = layer;
            Array.add(_layers, layer);
        }
    }

    TrackMe.setObjInnerText("viewName", concoction.name);
    TrackMe.setObjInnerText("viewNameLabel", concoction.name);
    $get("CurrentConcoctionId").value = concoction.id;

    updateView();
    resizePanels();
}

function map_viewchanged(eventArgs) 
{
  if (_layers != null && _enableDataLayers === true) 
    {
        setTimeout("updateView()", 500);
    }

    _center = _trackmemap.getMapCenter();
    _hasPageLoadPanned = true;

    if (_pendingShowBubbleDoer) 
    {
        setTimeout("showPendingDoerBubble()", 500);
    }
}

function showPendingDoerBubble()
{
    // if a doer has been clicked in the list, because the view gets changed need to find 
    // which doer it was in the new view
    var doer = _trackmemap.findDoerById(_pendingShowBubbleDoer.getId());
    if (doer) 
    {
        _pendingShowBubbleDoer = null;
       doer.showBubble();
    }
}

function updateView() 
{
    if (_hasPageLoadPanned === true) 
    {
        var view = _trackmemap.getViewRegion();

        for(var l in _layers) 
        {
            var layer = _layers[l];
            requestLayer(layer, view);
        }
    } 
    else 
    {
        setTimeout("updateView()", 100);
    }
}

function requestLayer(layer, view) 
{
  if ((layer.panel.isClosed !== true) && (layer.datasets)) 
  {
        for (var ds in layer.datasets) 
        {
            var dataset = layer.datasets[ds];
            
            var url = dataset.dataUrl;
            url += ((url.indexOf("?") == -1) ? "?" : "&"); 
            url += "lat1=" + view.topLeft.getLatitude();
            url += "&lng1=" + view.topLeft.getLongitude();
            url += "&lat2=" + view.bottomRight.getLatitude();
            url += "&lng2=" + view.bottomRight.getLongitude();
            url += "&date=" + _viewDate.getFullYear() + "-" + (_viewDate.getMonth() + 1) + "-" + _viewDate.getDate();
            url += "&lid=" + layer.id;
            url += "&ds=" + ds;
            if(_queryUser)
            {
                url += "&user=" + _queryUser;
            }

            var request = new JsonRequest("layer_" + layer.id + "_" + ds, url);
            request.doRequest("processLayerData");
        }
    }
}

function processLayerData(updatedLayer)
{
    var layer = findLayer(updatedLayer.id)

    if (layer != null) 
    {
        if (updatedLayer.replyType === "DataUrls") 
        {
            layer.datasets = updatedLayer.datasets;
            requestLayer(layer, _trackmemap.getViewRegion());
        } 
        else if (updatedLayer.replyType === "Error") 
        {
            var li = document.createElement("li");
            li.className = "error";
            li.appendChild(document.createTextNode(updatedLayer.msg));
            layer.panel.addListItem(li);
        } 
        else 
        {
            updateLayer(layer, updatedLayer);
            if(_zoomToUser)
            {
                zoomToDoer(_zoomToUser);
                _zoomToUser = null; // only want to do it once
            }
        }
    }
}
            
function updateLayer(layer, newLayer)
{
    newLayer.panel = layer.panel; // necessary??
    if (!layer.panel.isClosed) 
    {
        for(var ds in newLayer.datasets)
        {
            var dataset = newLayer.datasets[ds];
            updateLayerDataset(layer, layer.datasets[dataset.id], dataset);
        }
    }
}

function updateLayerDataset(layer, existingDataset, newDataset)
{
    if(!existingDataset.map) existingDataset.map = {};
    
    var existingDoers = buildLookupTable(existingDataset.map.Doers, "nn");
    var existingPois = buildLookupTable(existingDataset.map.PointsOfInterest, "id");
    var existingRoutes = buildLookupTable(existingDataset.map.Routes, "id");

    var newDoers = buildLookupTable(newDataset.map.Doers, "nn");
    var newPois = buildLookupTable(newDataset.map.PointsOfInterest, "id");
    var newRoutes = buildLookupTable(newDataset.map.Routes, "id");
    
    // Check existing items against new dataset and either update them if they still exist
    // or remove them if they are no longer in the dataset
    for(var d in existingDoers)
    {
        var existingDoer = existingDoers[d];
        if(!newDoers.hasOwnProperty(existingDoer.nn))
        {
          MapHelper.removeDoer(_trackmemap, existingDoer);
          removeDoerPanelItem(layer.panel, existingDoer);
        }
        else
        {
            // update Doer 
            // MapHelper.updateDoer(_trackmemap, d, newDoers[d]);
        }
    }
    for(var p in existingPois)
    {
       var existingPoi = existingPois[p];
        if(!newPois.hasOwnProperty(existingPoi.id))
        {
            //_trackmemap.removePointOfInterest(existingPoi.id);
            MapHelper.removePoi(_trackmemap, existingPoi);
            removePoiPanelItem(layer.panel, existingPoi);
        }
        else
        {
            // update Poi
        }
    }
    for(var r in existingRoutes)
    {
       var existingRoute = existingRoutes[r];
        if(!newRoutes.hasOwnProperty(existingRoute.id))
        {
           //_trackmemap.removeRouteById(existingRoute.id);
           MapHelper.removeRoute(_trackmemap, existingRoute);
           removeRoutePanelItem(layer.panel, existingRoute);
        }
        else
        {
            // update Route
        }
    }
    
    // add new items
    for(var d in newDoers)
    {
        var newDoer = newDoers[d];
        if(!existingDoers.hasOwnProperty(newDoer.nn))
        {
            MapHelper.addDoer(_trackmemap, newDoer);
            addDoerPanelItem(layer.panel, newDoer);
        }
    }
    for(var p in newPois)
    {
        var newPoi = newPois[p];
        if(!existingPois.hasOwnProperty(newPoi.id))
        {
            MapHelper.addPoi(_trackmemap, newPoi);
            addPoiPanelItem(layer.panel, newPoi);
        }
    }
    for(var r in newRoutes)
    {
        var newRoute = newRoutes[r];
        if(!existingRoutes.hasOwnProperty(newRoute.id))
        {
            MapHelper.addRoute(_trackmemap, newRoute);
            addRoutePanelItem(layer.panel, newRoute);
        }
    }
    
    if(!_hasPageLoadPanned)
    {
        MapHelper.autoZoom(_trackmemap);
        _hasPageLoadPanned = true;
    }
   
    // replace the existing map with the new one
    existingDataset.map = newDataset.map;
}

function removeLayerItems(layer)
{
    for(var ds in layer.datasets)
    {
        var dataset = layer.datasets[ds];
        for (var type in dataset.map) 
        {
            var items = dataset.map[type];
            for(var i in items)
            {
                var item = items[i];
                
                if (type == "Doers") 
                {
                    var doer = _trackmemap.findDoerById(item.nn);
                    MapHelper.removeDoer(_trackmemap, doer);
                    removeDoerPanelItem(layer.panel, item);
                }
                else if (type == "PointsOfInterest") 
                {
                    var pt = _trackmemap.findPointById(item.id);
                    MapHelper.removePoi(_trackmemap, pt);
                    var route = _trackmemap.findRouteById(item.id);
                    if (route) { MapHelper.removeRoute(_trackmemap, route); }
                    removePoiPanelItem(layer.panel, item);
                }
                else if (type == "Routes") {
                    var route = _trackmemap.findRouteById(item.id);
                    MapHelper.removeRoute(_trackmemap, route);
                    removeRoutePanelItem(layer.panel, item);
                }
            }
        }
        dataset.map = {};
    }
}
   

function addDoerPanelItem(panel, doer)
{
    var li = document.createElement("li");
    li.id = panel.id + "_li_doer_" + makeValidHTMLId(doer.nn);
    li.className = doer.pt ? "doer" : "doer_offline";
    li.style.listStyleImage = "url(api/v1/images/profileImage.ashx?user=" + doer.nn + "&size=20x20)";

    var a = document.createElement("a");
    a.setAttribute("href", "javascript:doerClick(\'" + doer.nn + "\')");
    a.setAttribute("title", doer.nn);
    var text = doer.nn;
    if(doer.nn.indexOf("___") != -1) 
    {
        var time = text.substring(text.indexOf("___") + 3);
        var hours = time.substring(0, time.indexOf("_"));
        var mins = time.substring(time.indexOf("_") + 1);
        text = text.substring(0, text.indexOf("___")) + " at " + hours + ":" + mins;
    }

    a.appendChild(document.createTextNode(text));
    li.appendChild(a);
    panel.addListItem(li);
}

function removeDoerPanelItem(panel, doer)
{
    var li = $get(panel.id + "_li_doer_" + makeValidHTMLId(doer.nn));
    if(li) li.parentNode.removeChild(li);
}

function addRoutePanelItem(panel, route)
{
    var li = document.createElement("li");
    li.id = panel.id + "_li_route_" + makeValidHTMLId(route.id);
    li.className = "route"; // huh??

    var a = document.createElement("a");
    a.setAttribute("href", "javascript:routeClick(\'" + route.id + "\')");
    a.appendChild(document.createTextNode(route.ext.name.substr(0,20)));
    a.setAttribute("title", route.ext.name);
    li.appendChild(a);
    li.appendChild(a);
    panel.addListItem(li);
}

function removeRoutePanelItem(panel, route)
{
    var li = $get(panel.id + "_li_route_" + makeValidHTMLId(route.id));
    if(li) li.parentNode.removeChild(li);
}

function addPoiPanelItem(panel, poi)
{
    var li = document.createElement("li");
    li.id = panel.id + "_li_poi_" + makeValidHTMLId(poi.id);
    li.className = "poi"; 
    if(poi.iu)
    {
        li.style.listStyleImage = "url(" + poi.iu + ")";
    }
    var a = document.createElement("a");
    a.setAttribute("href", "javascript:pointClick(\'" + poi.id + "\')");
    if (poi.dtt) 
    {
      a.appendChild(document.createTextNode(poi.dtt.substr(0,20)));
      a.setAttribute("title", poi.dtt);
    } 
    else 
    {
      a.appendChild(document.createTextNode(poi.n));
      a.setAttribute("title", poi.n);
    }
    li.appendChild(a);
    li.appendChild(a);
    panel.addListItem(li);
}

function removePoiPanelItem(panel, poi)
{
    var li = $get(panel.id + "_li_poi_" + makeValidHTMLId(poi.id));
    if(li) li.parentNode.removeChild(li);
}


function setMapStartSize() {
  var form = document.forms[0];
  var formHeight = form.clientHeight;
  var formWidth = form.clientWidth;

  if (formHeight > 350) {
    var header = $get("header");
    var content = $get("content");
    var footer = $get("footer");
    var info = $get("infoPanel");

    if (window.innerHeight) {
      var h = window.innerHeight;
    } else {
      var h = TrackMe.GetInnerSize()[1];
    }

    if (BrowserDetect.browser === "Firefox") {
      $get("mapArea").style.height = (h - header.clientHeight - footer.clientHeight) + "px";
      content.style.width = formWidth - info.offsetWidth - 20 + "px";
      
      $get("mainMap").style.height = $get("mapArea").clientHeight;
    }
  }
}

var _center;
function page_resize() {
  var form = document.forms[0];
  var formHeight = form.clientHeight;
  var formWidth = form.clientWidth;

  if (formHeight > 350) {
    var header = $get("header");
    var content = $get("content");
    var footer = $get("footer");
    var info = $get("infoPanel");
    var mapArea = $get("mapArea");

    if (window.innerHeight) {
      var h = window.innerHeight;
    } else {
      var h = TrackMe.GetInnerSize()[1];
    }
    
    content.style.height = (h - header.clientHeight - footer.clientHeight) - 1 + "px";

    if (BrowserDetect.browser === "Firefox") {
      content.style.width = formWidth - info.offsetWidth - 20 + "px";
      $get("mapArea").style.height = (h - header.clientHeight - footer.clientHeight) + "px";
    } else {
      content.style.width = formWidth - info.offsetWidth + "px";
    }
    
    info.style.height = parseInt(content.style.height) + "px";
    
    resizePanels();

    if (_trackmemap != null) {
      var currentMapSize = _trackmemap.getMapSize();
      if (currentMapSize == null) return;
      if (parseInt(currentMapSize.getWidth()) != parseInt(mapArea.offsetWidth) || 
          parseInt(currentMapSize.getHeight()) != parseInt(mapArea.clientHeight)) {
        if (_hasPageLoadPanned == true) {
          _trackmemap.resizeMap(mapArea.offsetWidth, mapArea.clientHeight);
          if (_center != null) {
            _trackmemap.setMapCenter(_center);
          }
        } else {
          _hasPageLoadPanned = true;
          
          map_viewchanged(null);
        }
      } else {
        _hasPageLoadPanned = true;
      }
    }
  }
}

function resizePanels() {
  var info = $get("infoPanel");
  var layerPanel = $get("layersPanel");
  
  layerPanel.style.height = parseInt(info.style.height) - "80" + "px";
  var layersExt = $find("layersExt");
  var calendarExt = $find("calendarExt");
  var searchExt = $find("searchExt");
  
  if (layersExt != null) {
    var height = parseInt(info.style.height) - "102" - parseInt(searchExt._element.offsetHeight) - parseInt(calendarExt._element.offsetHeight);
    height = height + "px";
    
    layerPanel.style.height = height;
    layersExt.set_ExpandedSize = height;
  }
}

function zoomToPoint(id) {
  var point = _trackmemap.findPointById(id);
  
  if (point) {
    point.hideBubble();
    _trackmemap.setMapCenter(point.getLatLng(), 14);
    //point.showBubble();
  }
}

function zoomToDoer(id) {
  var point = _trackmemap.findDoerById(id);
  
  if (point) {
    point.hideBubble();
    _trackmemap.setMapCenter(point.getLatLng(), 14);
    point.showBubble();
  }
}

function map_prePointBubbleShow(sender, args) {
  if (_trackmemap.getType() === "TrackMe.Mapping.GMap") {
    args.htmlContent = "<div class='bubbleContent'>" + args.htmlContent + "</div>";
  } else {
    args.htmlContent = "<div class='bubbleContent'>" + args.htmlContent + "<div class='bubbleTools'><a href='javascript://' onclick='zoomToPoint(\"" + args.point.getId() + "\")'>Zoom to</a></div></div>";
  }

  args.showMapTab = false;
}

function map_preDoerBubbleShow(sender, args) 
{
  var bubbleTools = "<div class='bubbleTools'><ul class='horizontal'>";
  if (typeof(args.doer.ext.immeHtml) !== "undefined") {
    bubbleTools = bubbleTools + "<li>" + args.doer.ext.immeHtml + "</li><li>|</li>";
  }
  bubbleTools = bubbleTools + "<li><a href='javascript://' onclick='zoomToDoer(\"" + args.doer.getId() + "\")'>Zoom to</a></li></div>";
  args.htmlContent = "<div class='bubbleContent'>" + args.htmlContent + bubbleTools + "</div>";
  args.showMapTab = false;
}

var _pendingShowBubbleDoer;
function doerClick(username) 
{
    _trackmemap._setBubblePoint(null);
    var doer = _trackmemap.findDoerById(username);

    if (doer) 
    {
        _trackmemap.setMapCenter(doer.getLatLng()); // , 18);
        var doerLatLng = doer.getLatLng();
        var mapCenter = _trackmemap.getMapCenter();
        if ((Math.abs(doerLatLng.getLatitude() - mapCenter.getLatitude()) < 0.000001) && 
            (Math.abs(doerLatLng.getLongitude() - mapCenter.getLongitude())  < 0.000001))
        {
            doer.showBubble();
        } 
        else 
        {
            _pendingShowBubbleDoer = doer;
        }
    }
}

function routeClick(routeId) {
  _trackmemap.focusOnRoute(routeId);
}

function pointClick(pointId) {
  var point = _trackmemap.findPointById(pointId);
  if (point) {
    if (!_trackmemap.isInViewRegion(point.getLatLng())) {
      _trackmemap.setMapCenter(point.getLatLng(), 12);
    }
    point.showBubble();
  }
  else
  {
    point = _trackmemap.findRouteById(pointId);
    if(point)
    {
        _trackmemap.setMapCenter(point.getPoints()[0]); 
    }
  }
}

function createInfoNode(id, title, shortcutKeys, onShow, onClose, onMinimise) {
  var wrapper = document.createElement("ul");
  wrapper.setAttribute("id", id.replace(' ', ''));
  var listHeader = wrapper.appendChild(document.createElement("lh"));
  var closeImage = listHeader.appendChild(document.createElement("img"));
  listHeader.appendChild(document.createTextNode(title));
  closeImage.setAttribute("src", "ui/images/common/down-arrow-small.gif");
  closeImage.setAttribute("alt", "show/hide");
  closeImage.style.cursor = "pointer";
  closeImage.style.marginRight = "2px";
  $addHandler(closeImage, "click", function() {
    if (wrapper.isClosed === true) {
      wrapper.show();
      closeImage.setAttribute("src", "ui/images/common/down-arrow-small.gif");
      closeImage.style.paddingRight = "0px";
    } else {
      wrapper.close();
      closeImage.setAttribute("src", "ui/images/common/right-arrow-small.gif");
      closeImage.style.paddingRight = "5px";
    }
  });
  
  $get("layersPanel").appendChild(wrapper);
  
  wrapper.isClosed = false;
  
  wrapper.show = function() {
    wrapper.isClosed = false;
    
    if (typeof(onShow) !== "undefined" && onShow !== null) {
      onShow.call(this, wrapper);
    }
  };
  
  wrapper.close = function() {
    wrapper.isClosed = true;
    TrackMe.removeChildrenFromNode(wrapper, "LI");
    
    if (typeof(onClose) !== "undefined" && onClose !== null) {
      onClose.call(this, wrapper);
    }
  };
  
  wrapper.clearListItems = function() {
    TrackMe.removeChildrenFromNode(wrapper, "LI");
  };
  
  wrapper.addListItem = function(li) {
    wrapper.appendChild(li);
  };
  
  return wrapper;
}

findLocation = function(textBoxId) {
  var where = $get(textBoxId).value;
  
  if (where.length == 0) {
    return;
  }
  
  _trackmemap.findAddress(where, 
    function(results) {
      var searchResults = $get('searchResults');
      TrackMe.removeChildrenFromNode(searchResults);
      var list = searchResults.appendChild(document.createElement("ul"));
      var listHeader = list.appendChild(document.createElement("lh"));
      listHeader.appendChild(document.createTextNode("Results"));
      
      function createResultItem(name, latlng) {
        var r = list.appendChild(document.createElement("li"));
        r.className = "address";
        var link = r.appendChild(document.createElement("a"));
        link.appendChild(document.createTextNode(name.substr(0,28)));
        link.setAttribute("title", name);
        link.setAttribute("href", "javascript:_trackmemap.setMapCenter(new TrackMe.Mapping.SLatLng(" + latlng.getLatitude() + "," + latlng.getLongitude() + "),10);");
      }
      
      for (var r in results) {
        var result = results[r];
        createResultItem(result.name, result.latlng);
      }
      
      resizePanels();
    });
};

function day_onclick(e) {
  _viewDate = e != null ? e.target.date : event.srcElement.date;
  var calendarHeader = $get("calendarHeader");
  TrackMe.removeChildrenFromNode(calendarHeader);
    
  var today = new Date();
  if (_viewDate.getMonth() == today.getMonth() && _viewDate.getFullYear() == today.getFullYear()) {
    if (_viewDate.getDate() == today.getDate()) {
      calendarHeader.appendChild(document.createTextNode("Today"));
    } else if (_viewDate.getDate() == today.getDate()-1) {
      calendarHeader.appendChild(document.createTextNode("Yesterday"));
    } else {
      calendarHeader.appendChild(document.createTextNode(_viewDate.format("dd MMM yyyy")));
    }
  } else {
    calendarHeader.appendChild(document.createTextNode(_viewDate.format("dd MMM yyyy")));
  }
  updateView();
}

function changeYear(v) {
  var cal = $get("calendar");
  var currentCalendar = cal.childNodes[0];
  TrackMe.removeChildrenFromNode(cal);
  
  var newCalendar = createTimeLine(currentCalendar.currentMonth, currentCalendar.currentYear + v);
  cal.appendChild(newCalendar);
  resizePanels();
}

function changeMonth(v) {
  var cal = $get("calendar");
  var currentCalendar = cal.childNodes[0];
  TrackMe.removeChildrenFromNode(cal);
  
  var newMonth = currentCalendar.currentMonth + v;
  var newYear = currentCalendar.currentYear;
  if (currentCalendar.currentMonth === 0 && v < 0) {
    newMonth = 11;
    newYear = currentCalendar.currentYear - 1;
  } else if (currentCalendar.currentMonth === 11 && v > 0) {
    newMonth = 0;
    newYear = currentCalendar.currentYear + 1;
  }
  var newCalendar = createTimeLine(newMonth, newYear);
  cal.appendChild(newCalendar);
  resizePanels();
}

var en_months = ["January","February","March","April","May","June","July","August","September","October","November","December"];
var days_in_month = [31,28,31,30,31,30,31,31,30,31,30,31];
var days_in_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

function createTimeLine(month, year) {
  var wrapper = document.createElement("div");
  var scale = wrapper.appendChild(document.createElement("table"));
  scale.className = "calendar";
  wrapper.currentMonth = month;
  wrapper.currentYear = year;
    
  var tbody = scale.appendChild(document.createElement("TBODY"));
  var monthRow = tbody.appendChild(document.createElement("TR"));
    
  var today = new Date();

  var monthCell = monthRow.appendChild(document.createElement("TD"));
  monthCell.className = "months";
  
  var todayLink = document.createElement("a");
  todayLink.setAttribute("href", "javascript://today");
  todayLink.date = new Date(year, today.getMonth(), today.getDate());
  todayLink.onclick = day_onclick;
  todayLink.appendChild(document.createTextNode("today"));
  
  var monthIndex = month;
  var numDays = days_in_month[month];
  monthCell.colSpan = 7;
  monthCell.appendChild(document.createTextNode(en_months[monthIndex] + " " + year + " - "));
  monthCell.appendChild(todayLink);

  var dayRow = tbody.appendChild(document.createElement("TR"));
  for (var day=0; day < 7; day++) {
    var dayCell = dayRow.appendChild(document.createElement("TH"));
    dayCell.appendChild(document.createTextNode(days_in_week[day].substr(0,1)));
  }
  
  var dateRow = tbody.appendChild(document.createElement("TR"));
  var totalCells = 0;
  for(var day=1; day <= numDays; day++) {
    var thisDate = new Date(year, monthIndex, day);
    
    if (totalCells % 7 == 0) {
      var dateRow = tbody.appendChild(document.createElement("TR"));
    }
    
    if (day === 1) {
      for (var i=1; i<thisDate.getDay(); i++) {
        var blankDay = dateRow.appendChild(document.createElement("TD"));
        totalCells++;
      }
    }
    
    totalCells++;
    
    var dayCell = dateRow.appendChild(document.createElement("TD"));
    
    if (today.getDate() === day && today.getMonth() === month && today.getYear() === year) {
      dayCell.className = "days today";
    } else {
      dayCell.className = "days";
    }

    var dayLink = dayCell.appendChild(document.createElement("A"));
    dayLink.setAttribute("href", "javascript://");
    dayLink.setAttribute("id", "dayLink_" + year + "_" + (monthIndex + 1) + "_" + day);
    dayLink.date = thisDate;
    dayLink.onclick = day_onclick;
    dayLink.setAttribute("title", thisDate.format("dd MMM yyyy"));
    dayLink.appendChild(document.createTextNode(day));
    dayLink.className = "days";
  }

  return wrapper;
}

function buildLookupTable(objects, keyMember)
{
    var table = new Object();
    if(objects)
    {
        for(var i in objects)
        {
            var obj = objects[i];
            var key = obj[keyMember]
            table[key] = obj;
        }
    }
    return table
}

function findLayer(layerId)
{
    for (var l in _layers)  
    {
        if (_layers[l].id == layerId) 
        {
            return _layers[l];
        }
    }
    return null;
}

function immeClick(url) {
  window.open(url, "_blank", "width=450, height=600, menubar=no, toolbar=no, menubar=no");
}

function shareView(svc) {
  window.open(svc + encodeURIComponent(_trackmemap.getPermaLink() + "&cid=" + $get("CurrentConcoctionId").value), "_blank");
}
 
// Set up global window handlers
$addHandler(this, "resize", page_resize);
Sys.Application.add_load(page_load);

if (typeof(Sys) !== 'undefined') {
  Sys.Application.notifyScriptLoaded();
}