var map;
var geocoder;
var hotelIcons = new Array();

YAHOO.namespace('map');
YAHOO.map.init = function()
{
  map = new google.maps.Map2(document.getElementById(configMap.mapDataID));
  map.clearOverlays();
  map.setCenter(new GLatLng(configMap.defaultLatitude, configMap.defaultLongitude), configMap.zoom);
  setIcons();

  if(typeof hotels != 'undefined')
  {
	  for(var i = 0; i < hotels.length; i++)
	  {
	    point = new google.maps.LatLng(hotels[i].lat, hotels[i].lng);
	    map.addOverlay(createMarker(point, hotels[i]));
	  }
  }

  map.setUIToDefault();
  map.enableRotation();
}

function reloadMap()
{
	if(map && typeof hotels != 'undefined')
	{
		var Dom         = YAHOO.util.Dom;
		var stars       = new Array (2, 3, 4, 5);
		var amenities   = new Array (1, 2, 3, 4);
		activeAmenities = new Array();
		activeStars = new Array();
		show            = false;
		i               = 0;
		fromPrice   = Dom.get('pfrom')?parseInt(Dom.get('pfrom').innerHTML.replace('$','')):0;
    toPrice     = Dom.get('pto')?parseInt(Dom.get('pto').innerHTML.replace('$','')):0;
    fromStar    = Dom.get('sfrom')?parseInt(Dom.get('sfrom').innerHTML):0;
    toStar      = Dom.get('sto')?parseInt(Dom.get('sto').innerHTML):0;

		for(var y = 0; y < stars.length; y++)
    {
    	if(!Dom.get('sfrom') && !Dom.get('sto'))
      {
	      star = YAHOO.util.Dom.get('s' + stars[y]);
	      if(star && star.checked)
	      {
	      	activeStars[i++] = star.value;
	      }
      }
      else
      {
      	if(stars[y] >= fromStar && stars[y] <= toStar)
      	{
      		activeStars[i++] = stars[y];
      	}
      }
    }

    i = 0;

    for(var y = 0; y < amenities.length; y++) {
    	amenity = YAHOO.util.Dom.get('a' + amenities[y]);
      if(amenity && amenity.checked) {
        activeAmenities[i++] = amenity.value;
      }
    }

    map.clearOverlays();

		for(var i = 0; i < hotels.length; i++)
	  {
      if (activeStars.length)
      {
		  	for(var y = 0; y < activeStars.length; y++)
		    {
		    	category = parseInt(hotels[i].cat);
        	if(parseInt(activeStars[y]) == category)
          {
            show = true;
          }
		    }
      }

      if(activeAmenities.length)
      {
      	c = 0;
      	for(var y = 0; y < activeAmenities.length; y++)
        {
          amenity = eval('hotels[i].a' + activeAmenities[y]);
          if(amenity == false) c++;
        }
        if(c > 0 || (activeStars.length &&  show == false)) show = false;
        else if(c == 0) show = true;
      }

	    price = parseInt(hotels[i].pr);

	    if(((!activeAmenities.length && !activeStars.length) || show == true) &&
	         price >= fromPrice && price <= toPrice)
	    {
	    	point = new google.maps.LatLng(hotels[i].lat, hotels[i].lng);
        map.addOverlay(createMarker(point, hotels[i]));
	    }

	    show = false;
	  }
	}
}

function setIcons()
{
	var base = new GIcon(G_DEFAULT_ICON);
  for(i = 0; i < configMap.icon.length; i++)
  {
  	base.image = configMap.icon[i];
    hotelIcons[i+1] = new GIcon(base);
  }
}

function createMarker(point, hotel)
{
  var marker = new GMarker(point, hotelIcons[hotel.cat]);
  marker.id = hotel.id;

  (function(marker, hotel){
    // Build content for short info.
    var hotelName = hotel.nm;
    if (hotel.cat > 0) {
      hotelName += ' <strong style="color:red;font-size:14px;">' + hotel.cat + '<sup>*</sup></strong>';
    }
    var html = hotelName + '<br/><br/>' + hotel.ads;

    GEvent.addListener(marker, 'mouseover', function(){marker.openExtInfoWindow(map, "mapHotelWnd", html, {beakOffset: 0});});
    //GEvent.addListener(map, 'mouseout', function(){ marker.closeExtInfoWindow(map); });
    GEvent.addListener(marker, 'click', function(){ fullHotelData(this.getLatLng(), hotel.id, marker); });
  })(marker, hotel);
  return marker;
}

/**
 * Full hotel data callback.
 *
 * @param {GLatLng} Coordinates.
 * @param {id} Hotel id.
 * @param {Gmarker} Marker object.
 */
function fullHotelData(latlng, id, marker)
{
  marker.closeExtInfoWindow(map);
  marker.openExtInfoWindow(map, "mapHotelWnd", 'Loading...', {beakOffset: 0});

  var oCityCallback = {
    success: function(o)
    {
      if (! YAHOO.lang.JSON.isValid(o.responseText)) {
        marker.openExtInfoWindow(map, "mapHotelWnd", 'Load data is faulty', {beakOffset: 3});
        return;
      }

      var result = YAHOO.lang.JSON.parse(o.responseText);

      if(typeof result.hotel != 'undefined')
      {
        var hotel  = result.hotel;
        var body;

        body =  '<div>';
        body += '<strong>' + hotel.nm + '</strong>';

        if(hotel.cat)
        {
           body += '&nbsp; <img src="' + configMap.categoryImgUrl + hotel.cat + '.gif" alt=""/>';
        }

        body += '</div><div style="height: 200px; overflow-y: scroll">';
        body += '<div>' + hotel.ads + '</div><br/>';

        if (hotel.img) {
           body += '<div align="center"><img src="' + hotel.img + '"/ style="margin:5px;" alt=""></div>';
        }

        var rateHotelForm = viewRateForm(hotel);
        var bodyContent = body + '<div>' + hotel.des + '</div></div>';
        if (null != rateHotelForm && null != rateHotelForm.html) bodyContent += rateHotelForm.html;
        marker.openExtInfoWindow(map, "mapHotelWnd", bodyContent, { beakOffset: 0 });

        if (null != rateHotelForm && null != rateHotelForm.script) {
          for (var ix in rateHotelForm.script){
            eval(rateHotelForm.script[ix].text);
          }
        }
      }
      else
      {
        marker.openExtInfoWindow(map, "mapHotelWnd", 'Load data is faulty', {beakOffset: 3});
      }
    }
  }

   YAHOO.util.Connect.asyncRequest('GET', configMap.hotelUrl + '?hid=' + id + '&' + new Date().getTime(), oCityCallback);
}

/**
 * Return html-code for view rate hotel buttom.
 *
 * @param {Array} Hotel data.
 */
function viewRateForm(hotel)
{
  var frm =  YAHOO.util.Dom.get('get_rate_tiny_form');
  if (null == frm) return null;

  // Collect script of the form.
  var scripts = YAHOO.util.Selector.query('#get_rate_tiny_form script');

  var node = null;
  if (null != (node = YAHOO.util.Dom.get('avail_hotel_code'))) {
    node.value = hotel.hc;
  }

  if (null != (node = YAHOO.util.Dom.get('avail_chain_code'))) {
    node.value = hotel.cc;
  }

  return {html: frm.innerHTML, script: scripts};
}

YAHOO.util.Event.onDOMReady(YAHOO.map.init);
