﻿/* Copyright (c) Hoseasons Holidays Limited
 * Author: Chris O'Brien
 * Date: 16 October 2008
 */

/// <summary>
/// Make sure global namespace Hos for all hoseasons JavaScript is defined.
/// </summary>
if (typeof Hos == 'undefined') {
  Hos = {};
}

/// <summary>
/// Mini map.
/// </summary>
Hos.MiniMap = {

  /*activityMapData has the following JSON structure.
   [{
      'name': '',
      'description': '',
      'location': '',
      'postcode': '',
      'url': '',
      'latitude': '0.0',
      'longitude': '0.0',
      'categoryCode': 'FD'
   }] */
  activityMapData: [],
  map: null,
  activityCategoryCode: 'TV',
  activityOverlays: [],
  productTypeCode: 312,
  bMapLoaded: false,
  viewOnMapZoom: 13,
  _cruiseRouteLatLng: null,
  cruiseRouteLat: '52.7636',
  cruiseRouteLng: '1.51719',
  attractionsListId: 'attractionsList',
  _markerClickHandlers: [],

  mapLoad: function() {
    if (GBrowserIsCompatible()) {
      Hos.MiniMap.map = new GMap2(document.getElementById("map_canvas"));
      GEvent.addListener(Hos.MiniMap.map, "load", Hos.MiniMap.addLoadingReport);
      Hos.MiniMap.map.enableScrollWheelZoom();
      Hos.MiniMap.map.addControl(new GMapTypeControl());
      Hos.MiniMap.map.addControl(new GLargeMapControl());
      Hos.MiniMap.map.addControl(new GScaleControl());
      Hos.MiniMap.map.addMapType(G_PHYSICAL_MAP); 
      Hos.MiniMap.map.setMapType(G_PHYSICAL_MAP);
      G_PHYSICAL_MAP.getMinimumResolution = function() { return 7 };
      G_NORMAL_MAP.getMinimumResolution = function() { return 7 };
      G_SATELLITE_MAP.getMinimumResolution = function() { return 7 };
      G_HYBRID_MAP.getMinimumResolution = function() { return 7 };
      G_PHYSICAL_MAP.getMaximumResolution = function() { return 12 };
      G_NORMAL_MAP.getMaximumResolution = function() { return 12 };
      G_SATELLITE_MAP.getMaximumResolution = function() { return 12 };
      G_HYBRID_MAP.getMaximumResolution = function() { return 12 };
      Hos.MiniMap.CenterMap();
      Hos.MiniMap.PlotActivitiesOnMap();
      Hos.MiniMap.bMapLoaded = true;
    }
  },

  addLoadingReport: function() {
    // Text to display 
    var loadingText = 'Loading Map...';

    // Create a new element 
    var info = document.createElement('div');
    info.appendChild(document.createTextNode(loadingText));

    // Add an id to the element, in case you want to access it later 
    info.setAttribute('id', 'mapLoading');

    // Alternatively, you could apply the styles through a CSS stylesheet, using the #mapLoading selector 
    info.style.position = 'relative';
    info.style.padding = '2em';
    info.style.fontWeight = 'bold';
    info.style.fontSize = '12px';
    info.style.color = '#000';

    // Insert into map container 
    this.getContainer().insertBefore(info, this.getContainer().firstChild);
  },

  CenterMap: function() {
    Hos.MiniMap._cruiseRouteLatLng = new GLatLng(parseFloat(Hos.MiniMap.cruiseRouteLat), parseFloat(Hos.MiniMap.cruiseRouteLng));
    Hos.MiniMap.map.setCenter(Hos.MiniMap._cruiseRouteLatLng, 9);
  },

  PlotActivitiesOnMap: function() {
    var activityMapData = Hos.MiniMap.activityMapData;

    //Close any open info window.
    if (activityMapData.length > 0) {
      Hos.MiniMap.map.closeInfoWindow();
    }
    
    //Clear any existing activity overlays
    for (var k = 0; k < Hos.MiniMap.activityOverlays.length; k++) {
      Hos.MiniMap.map.removeOverlay(Hos.MiniMap.activityOverlays[k]);
    }
    Hos.MiniMap.activityOverlays = [];
    
    var attractionsListHTML = "";
    attractionsListHTML += Hos.MiniMap.addActivityListBeginning();
    var townRadioEnabled, foodRadioEnabled, natureRadioEnabled, historyRadioEnabled, cyclingRadioEnabled, daysOutRadioEnabled,
      gardensRadioEnabled, sportsRadioEnabled, beachesRadioEnabled = false;
    for (var k = 0; k < activityMapData.length - 1; k++) {
      switch(activityMapData[k].categoryCode) {
        case "TV": townRadioEnabled = true; break;
        case "FD": foodRadioEnabled = true; break;
        case "N": natureRadioEnabled = true; break;
        case "HH": historyRadioEnabled = true; break;
        case "CW": cyclingRadioEnabled = true; break;
        case "GDO": daysOutRadioEnabled = true; break;
        case "GC": gardensRadioEnabled = true; break;
        case "SA": sportsRadioEnabled = true; break;
        case "B": beachesRadioEnabled = true; break;        
      }
      if(activityMapData[k].categoryCode != Hos.MiniMap.activityCategoryCode) continue;
      var marker = Hos.MiniMap.createActivityMarker(activityMapData[k], k);
      Hos.MiniMap.map.addOverlay(marker);
      Hos.MiniMap.activityOverlays.push(marker);
      attractionsListHTML += Hos.MiniMap.addActivityListItem(marker, activityMapData[k], k);
    }
    document.getElementById('townRadio').disabled = !townRadioEnabled;
    document.getElementById('townImage').src = townRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/townVillageAttractions.png' : '../../Images/EUBoat/GoogleMapIcons/townVillageAttractionsGrey.png';
    document.getElementById('townLabel').className = townRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('foodRadio').disabled = !foodRadioEnabled;
    document.getElementById('foodImage').src = foodRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/foodDrink.png' : '../../Images/EUBoat/GoogleMapIcons/foodDrinkGrey.png';
    document.getElementById('foodLabel').className = foodRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('natureRadio').disabled = !natureRadioEnabled;
    document.getElementById('natureImage').src = natureRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/nature.png' : '../../Images/EUBoat/GoogleMapIcons/natureGrey.png';
    document.getElementById('natureLabel').className = natureRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('historyRadio').disabled = !historyRadioEnabled;
    document.getElementById('historyImage').src = historyRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/historyHeritage.png' : '../../Images/EUBoat/GoogleMapIcons/historyHeritageGrey.png';
    document.getElementById('historyLabel').className = historyRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('cyclingRadio').disabled = !cyclingRadioEnabled;
    document.getElementById('cyclingImage').src = cyclingRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/cyclingWalking.png' : '../../Images/EUBoat/GoogleMapIcons/cyclingWalkingGrey.png';
    document.getElementById('cyclingLabel').className = cyclingRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('daysOutRadio').disabled = !daysOutRadioEnabled;
    document.getElementById('daysOutImage').src = daysOutRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/greatDaysOut.png' : '../../Images/EUBoat/GoogleMapIcons/greatDaysOutGrey.png';
    document.getElementById('daysOutLabel').className = daysOutRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('gardensRadio').disabled = !gardensRadioEnabled;
    document.getElementById('gardensImage').src = gardensRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/gardensCountryside.png' : '../../Images/EUBoat/GoogleMapIcons/gardensCountrysideGrey.png';
    document.getElementById('gardensLabel').className = gardensRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('sportsRadio').disabled = !sportsRadioEnabled;
    document.getElementById('sportsImage').src = sportsRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/sportsActivities.png' : '../../Images/EUBoat/GoogleMapIcons/sportsActivitiesGrey.png';
    document.getElementById('sportsLabel').className = sportsRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    document.getElementById('beachesRadio').disabled = !beachesRadioEnabled;
    document.getElementById('beachesImage').src = beachesRadioEnabled ? '../../Images/EUBoat/GoogleMapIcons/beaches.png' : '../../Images/EUBoat/GoogleMapIcons/beachesGrey.png';
    document.getElementById('beachesLabel').className = beachesRadioEnabled ? 'attractionCategoryLabel' : 'attractionCategoryLabelDisabled';
    attractionsListHTML += Hos.MiniMap.addActivityListEnd();
    document.getElementById(Hos.MiniMap.attractionsListId).innerHTML = attractionsListHTML;
    
    if (Hos.MiniMap._cruiseRouteLatLng != null) {
      Hos.MiniMap.map.setCenter(Hos.MiniMap._cruiseRouteLatLng, 9);
    }
  },

  createActivityMarker: function(activityMapData, itemNumber) {
    var point = new GLatLng(activityMapData.latitude, activityMapData.longitude);
    var marker;
    marker = new GMarker(point, Hos.MiniMap.getActivityIcon(Hos.MiniMap.activityCategoryCode));
    var handler = Hos.MiniMap.createActivityMarkerHandler(marker, activityMapData.name, activityMapData.description,
      activityMapData.url, activityMapData.postcode);
    Hos.MiniMap._markerClickHandlers[itemNumber] = handler;
    GEvent.addListener(marker, "click", handler);
    return marker;
  },

  createActivityMarkerHandler: function(marker, name, description, url, postcode) {
    return function() {
      try {
        Hos.MiniMap.map.setCenter(marker.getLatLng());
        marker.openInfoWindowHtml('<div class="activityMapPopup" style="width:250px;"><h5>' + name
          + ' - ' + postcode + '</h5>'
          + '<p>' + description + '</p>'
          + '<p><a href="' + url + '" target="_new" onclick="Hos.MiniMap.viewActivityWebsiteClick(\'' + url + '\');return false">Visit Website</a></p></div>');
      }
      catch (Error) {
      }
      return false;
    };
  },

  viewActivityWebsiteClick: function(url) {
    window.open(url, "", "location=1,status=1,scrollbars=1,menubar=1,resizable=1,width=800,height=400");
  },

  getActivityIcon: function(activityCategoryCode) {
    var icon = new GIcon();
    if (Hos.MiniMap.activityCategoryCode == "FD") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/foodDrink.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else if (Hos.MiniMap.activityCategoryCode == "HH") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/historyHeritage.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else if (Hos.MiniMap.activityCategoryCode == "SA") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/sportsActivities.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else if (Hos.MiniMap.activityCategoryCode == "GDA") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/greatDaysOut.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else if (Hos.MiniMap.activityCategoryCode == "GC") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/gardensCountryside.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else if (Hos.MiniMap.activityCategoryCode == "B") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/beaches.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else if (Hos.MiniMap.activityCategoryCode == "CW") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/cyclingWalking.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else if (Hos.MiniMap.activityCategoryCode == "N") {
      icon.image = "../../Images/EUBoat/GoogleMapIcons/nature.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    } else { //Hos.MiniMap.activityCategoryCode == "TV" An if statement is not used here because this is used as the default.
      icon.image = "../../Images/EUBoat/GoogleMapIcons/townVillageAttractions.png";
      icon.iconAnchor = new GPoint(8, 8);
      icon.infoWindowAnchor = new GPoint(8, 0);
      icon.iconSize = new GSize(23, 23);
    }
    return icon;
  },
  
  // This markup is displayed below the list.
  addActivityListBeginning: function() {
    var html = "";
    if(Hos.MiniMap.activityCategoryCode == "FD") html += "<h3><img src='../../Images/Shared/InTheArea/foodDrink.jpg' />Food & Drink</h3>";
    else if(Hos.MiniMap.activityCategoryCode == "HH") html += "<h3><img src='../../Images/Shared/InTheArea/historyHeritage.jpg' />History & Heritage</h3>";
    else if(Hos.MiniMap.activityCategoryCode == "SA") html += "<h3><img src='../../Images/Shared/InTheArea/sportsActivities.jpg' />Sports & Activities</h3>";
    else if(Hos.MiniMap.activityCategoryCode == "GDA") html += "<h3><img src='../../Images/Shared/InTheArea/greatDaysOut.jpg' />Great Days Out </h3>";
    else if(Hos.MiniMap.activityCategoryCode == "GC") html += "<h3><img src='../../Images/Shared/InTheArea/gardensCountryside.jpg' />Gardens & Countryside</h3>";
    else if(Hos.MiniMap.activityCategoryCode == "B") html += "<h3><img src='../../Images/Shared/InTheArea/beaches.jpg' />Beaches</h3>";
    else if(Hos.MiniMap.activityCategoryCode == "CW") html += "<h3><img src='../../Images/Shared/InTheArea/cyclingWalking.jpg' />Cycling & Walking</h3>";
    else if(Hos.MiniMap.activityCategoryCode == "N") html += "<h3><img src='../../Images/Shared/InTheArea/nature.jpg' />Nature Reserves</h3>";
    else if(Hos.MiniMap.activityCategoryCode == "TV") html += "<h3><img src='../../Images/Shared/InTheArea/townAndVillage.jpg' />Town & Village Attractions</h3>";
    html += "<table>";
    return html;
  },
  
  addActivityListItem: function(marker, activityMapData, itemNumber) {
    var html = "";
    html = "<tr>\
      <td>\
        <b>" + activityMapData.name + ", " + activityMapData.location + "</b><br />"
        + activityMapData.description + "\
        <br/><br/>\
      </td>\
      <td align='center'>\
        <a id='showOnMap_" + itemNumber + "' href='#' onclick='Hos.MiniMap._markerClickHandlers[" + itemNumber + "]();return false;'><img src='../../Images/EUBoat/general/showOnMap.gif' border='0'/></a><br />\
        <a class='externalSiteLink' href='" + activityMapData.url + "' target='_new'>Visit Website</a>\
      </td>\
      </tr>";
    return html;
  },
  
  addActivityListEnd: function() {
    return "</table>";
  }

};

