﻿/* 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>
/// Maxi map.
/// </summary>
Hos.MiniMap = {

  map: null,
  productMapData: null,
  activityMapData: null, //List of activities separated by *. Each activity has its properties separated by commas.
  activityCategoryCode: null,
  activityOverlays: [],
  productTypeCode: 0,
  bMapLoaded: false,
  viewOnMapZoom: 13,
  _cottageLatLng: null,

  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.addControl(new GMapTypeControl());
      Hos.MiniMap.map.addControl(new GLargeMapControl());
      Hos.MiniMap.map.addControl(new GScaleControl());
      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.PlotPointOnMap();
      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);
  },

  PlotPointOnMap: function() {
    var productMapDataArray = Hos.MiniMap.productMapData.split("^");
    Hos.MiniMap._cottageLatLng = new GLatLng(parseFloat(productMapDataArray[1]), parseFloat(productMapDataArray[2]));
    Hos.MiniMap.map.setCenter(Hos.MiniMap._cottageLatLng, 9);
    var Markerpoint = new GMarker(Hos.MiniMap._cottageLatLng, Hos.MiniMap.getSiteIcon());
    var Handler = Hos.MiniMap.createMarkerClickHandler(Markerpoint, productMapDataArray[3], productMapDataArray[4], productMapDataArray[6], productMapDataArray[7], productMapDataArray[8]);
    GEvent.addListener(Markerpoint, "click", Handler);
    Hos.MiniMap.map.addOverlay(Markerpoint);
    GEvent.trigger(Markerpoint, "click");
  },

  PlotActivitiesOnMap: function() {
    var activityDataArray = Hos.MiniMap.activityMapData.split("*");
    var geodataArray = [];

    //Close any open info window.
    if (Hos.MiniMap.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 = [];

    //geodataArray is populated with the data [0-name,1-description,2-url,3-latitude,4-longitude,5-radialDistance,6-categoryCode].
    for (var i = 0; i < activityDataArray.length - 1; i++) {
      geodataArray = activityDataArray[i].split("^");
      var latitude = parseFloat(geodataArray[3]);
      var longitude = parseFloat(geodataArray[4]);
      var marker = Hos.MiniMap.createActivityMarker(geodataArray[3], geodataArray[4], geodataArray[0], geodataArray[1], geodataArray[2],
        geodataArray[5], geodataArray[6]);
      Hos.MiniMap.map.addOverlay(marker);
      Hos.MiniMap.activityOverlays.push(marker);
    }
    if (Hos.MiniMap._cottageLatLng != null) {
      Hos.MiniMap.map.setCenter(Hos.MiniMap._cottageLatLng, 9);
    }
  },

  createActivityMarker: function(lat, lng, name, description, url, distance, categoryCode) {
    var point = new GLatLng(lat, lng);
    var marker;
    marker = new GMarker(point, Hos.MiniMap.getActivityIcon(categoryCode));
    var handler = Hos.MiniMap.createActivityMarkerHandler(marker, name, description, url, distance);
    GEvent.addListener(marker, "click", handler);
    return marker;
  },

  createActivityMarkerHandler: function(marker, name, description, url, distance) {
    return function() {
      try {
        Hos.MiniMap.map.setCenter(marker.getLatLng());
        marker.openInfoWindowHtml('<div class="activityMapPopup" style="width:250px;"><h5>' + name
          + ' - ' + distance + ' miles away.</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");
  },

  getSiteIcon: function() {
    var icon = new GIcon();
    switch (Hos.MiniMap.productTypeCode) {
      case 315:
        icon.image = "../../Images/UKCottage/GoogleMapIcons/Complex.png";
        icon.iconAnchor = new GPoint(16, 16);
        icon.infoWindowAnchor = new GPoint(16, 0);
        icon.iconSize = new GSize(33, 28);
        break;
      default:
        icon.image = "../../Images/WWApartment/GoogleMapIcons/Complex.png";
        icon.iconAnchor = new GPoint(16, 16);
        icon.infoWindowAnchor = new GPoint(16, 0);
        icon.iconSize = new GSize(56, 72);
        break;
    }
    return icon;
  },

  getActivityIcon: function(activityCategoryCode) {
    var icon = new GIcon();
    if (Hos.MiniMap.activityCategoryCode == "FD") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/foodDrink.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else if (Hos.MiniMap.activityCategoryCode == "HH") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/historyHeritage.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else if (Hos.MiniMap.activityCategoryCode == "SA") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/sportsActivities.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else if (Hos.MiniMap.activityCategoryCode == "GDA") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/greatDaysOut.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else if (Hos.MiniMap.activityCategoryCode == "GC") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/gardensCountryside.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else if (Hos.MiniMap.activityCategoryCode == "B") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/beaches.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else if (Hos.MiniMap.activityCategoryCode == "CW") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/cyclingWalking.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else if (Hos.MiniMap.activityCategoryCode == "N") {
      icon.image = "../../Images/UKCottage/GoogleMapIcons/nature.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    } else { //Hos.MiniMap.activityCategoryCode == "TV" An if statement is not used here because this is used as the default.
      icon.image = "../../Images/UKCottage/GoogleMapIcons/townVillageAttractions.png";
      icon.iconAnchor = new GPoint(16, 16);
      icon.infoWindowAnchor = new GPoint(16, 0);
      icon.iconSize = new GSize(41, 42);
    }
    return icon;
  },

  createMarkerClickHandler: function(marker, siteName, image, introText, minPrice, uniqueSellingPoints) {
    //Clip intro text.
    introText = introText.substring(0, 85) + "...";

    return function() {
      marker.openInfoWindowHtml('<table id="balloon"><tr><td><span id="balloonTitle">' + siteName
          + '</span><br/><span id="weeklyPriceFrom">Weekly prices <br> starting from </span><span id="minPrice">' + minPrice
          + '</span><p id="introText">' + introText + '</p></td><td><img id="searchResultImage" src=' + image
          + '></td></tr><tr ><td><div id="viewComplex"><a href="#" onclick="showComplexOrInfoTab();return false;">Read more>></a></div></td></tr></table>');
      return false;
    };
  }

};
