YAHOO.namespace('yaHotel');

/**
 * Set text error for field.
 *
 * @param {String} field Field name
 * @param {String} error Error text
 * @param {Boolean} clean Clean flag
 */
YAHOO.yaHotel.setError = function(field, error, clean)
{
  var node = null;
  var nodeId = field.replace(/\w+\[(\w+)\]/, '$1') + '_error';
  
  if (null != (node = YAHOO.util.Dom.get(nodeId)))
  {
    if (undefined != clean)
    {
      node.innerHTML = '';
      YAHOO.util.Dom.replaceClass(node, 'show', 'hidden');
    }
    else {
      node.innerHTML = error;
      YAHOO.util.Dom.replaceClass(node, 'hidden', 'show');
    }
  }
}

/**
 * Form validator.
 * @return {Boolean}
 */
YAHOO.yaHotel.validateForm = function(form)
{
  var cntError = 0, cinDate = coutDate = cityNode = null;

  // Search fields for validate.
  for (var i = 0; i < form.elements.length; i++)
  {
    var eName = null;
    if ('undefined' != form.elements[i].name)
    {
      // Skip hidden fields.
      if ('hidden' == form.elements[i].type) continue;

      // Clean error.
      eName = new String(form.elements[i].name);
      YAHOO.yaHotel.setError(eName, '', true);

      // Search check in check out date fields
      if (eName.match(/check_in/i)) cinNode = form.elements[i].name;
      if (eName.match(/check_out/i)) coutNode = form.elements[i].name;

      // Search city name field.
      if (eName.match(/ref_point/i)) cityNode = form.elements[i].name;
    }
  }

  if (null == cinNode || null == coutNode) { return false; }

  // Validate check in date.
  if (isNaN(Date.parse(form.elements[cinNode].value))) {
    YAHOO.yaHotel.setError(cinNode, 'Set Check in date.');
    cntError++;
  }
  else cinDate = new Date(form.elements[cinNode].value);

  // Validate check out date.
  coutDate = new Date(form.elements[coutNode].value);
  if (isNaN(Date.parse(form.elements[coutNode].value))) {
    YAHOO.yaHotel.setError(coutNode, 'Set Check out date.');
    cntError++;
  }
  else {
    cinDate = new Date(form.elements[cinNode].value);
    if (coutDate <= cinDate) {
      YAHOO.yaHotel.setError(coutNode, 'Please correct Check out date. It cannot be earlier than Check in date.');
      cntError++;
    }
  }

  // Validate city name.
  if ('' == form.elements[cityNode].value)
  {
    YAHOO.yaHotel.setError(cityNode, 'Set city name');
    cntError++;
  }

  return (0 == cntError);
}

/**
 * Callback for validate search form.
 *
 * @param form Form for check.
 */
function checkForm(form) { return YAHOO.yaHotel.validateForm(form); }

/**
 * Toggle (show/close) expand box
 * with values of review.
 *
 * @param {Int} rid Review unique id.
 */
function toggleHotelReview(rid)
{
  if (isNaN((rid = parseInt(rid)))) return false;

  var boxid = 'review' + rid + '_values';
  var expanderid = 'review' + rid + '_expander';
  var boxstyle = YAHOO.util.Dom.getStyle(boxid, 'display');

  switch(boxstyle) {
    case 'none':
      YAHOO.util.Dom.setStyle(boxid, 'display', 'block');
      YAHOO.util.Dom.addClass(expanderid, 'expandOn');
    break;

    case 'block':
      YAHOO.util.Dom.setStyle(boxid, 'display', 'none');
      YAHOO.util.Dom.removeClass(expanderid, 'expandOn');
    break;
  }

  return true;
}

function selectMap(url, id)
{
	if(id == 'm' && !YAHOO.util.Dom.hasClass(id, 'moscowAct'))
	{
		linkM = YAHOO.util.Dom.get('ml');
		linkM.innerHTML = 'Moscow hotels';
		linkP = YAHOO.util.Dom.get('pl');
    linkP.innerHTML = 'St. Petersburg';
    imgMap = YAHOO.util.Dom.get('map_img');
    imgMap.src = '/images/moscow.map.jpg';

		YAHOO.util.Dom.replaceClass('m', 'moscow', 'moscowAct');
		YAHOO.util.Dom.replaceClass('p', 'piter piterAct', 'piter');
	}
	else if(id == 'p' && !YAHOO.util.Dom.hasClass(id, 'piterAct'))
	{
		linkM = YAHOO.util.Dom.get('ml');
    linkM.innerHTML = 'Moscow';
    linkP = YAHOO.util.Dom.get('pl');
    linkP.innerHTML = 'St. Petersburg hotels';
    imgMap = YAHOO.util.Dom.get('map_img');
    imgMap.src = '/images/st.petersburg.map.jpg';

		YAHOO.util.Dom.replaceClass('m', 'moscowAct', 'moscow');
    YAHOO.util.Dom.replaceClass('p', 'piter', 'piter piterAct');
	}

  linkSbm = YAHOO.util.Dom.get('sbm');
  linkSbm.href = url;
}

/**
 * Callback for init Autosuggest field.
 */
function initHotelCityAutosuggest(namespace)
{
  var stDs = new YAHOO.util.LocalDataSource(YAHOO.ajax.Data.cites, {responseSchema:{fields : ['cites']}});
  var options={forceSelection:false,useShadow:true,animSpeed:0,queryDelay:0,queryMatchSubset:true,queryMatchContains:false,maxResultsDisplayed:20,minQueryLength:2,typeAhead:false,allowBrowserAutocomplete:false,generateRequest:function(query){return '?q='+query;},doBeforeExpandContainer:function(oTextbox,oContainer,sQuery,aResults){var pos=YAHOO.util.Dom.getXY(oTextbox);pos[1]+=YAHOO.util.Dom.get(oTextbox).offsetHeight+2;YAHOO.util.Dom.setXY(oContainer,pos);return true;}};
  var cityStAc = new YAHOO.widget.AutoComplete('hotel_ref_point', namespace + '_text', stDs, options);
}

/**
 * Default callback for calendar select.
 */
function defaultHotelSelectCal(type, args, obj)
{
  var dates = args[0];
  var date = dates[0];
  setFieldDate(obj.id + '_val', this.toDate(dates[0]));
  obj.hide();
}

/**
 * Callback for calendar in yaVisaHistoryPageForm
 */
function searchHotelSelectCalHandler(type, args, obj)
{
  var dates = args[0];
  var date = dates[0];
  var selDate = this.toDate(dates[0]);

  var id_parts = obj.id.match(/(check_(?:in|out))(\d+)/i);
  var cnode = (id_parts.length ? id_parts[1] : obj.id);
  var cix = (id_parts.length ? id_parts[2] : '');

  switch(cnode)
  {
    case 'check_in':
      var cout = 'check_out' + cix;
      var validDateMin = YAHOO.widget.DateMath.add(selDate, 'D', 1);
      eval('\
      YAHOO.' + cout + '.cal.cfg.setProperty("MINDATE", validDateMin); \
      YAHOO.' + cout + '.cal.setYear(validDateMin.getFullYear()); \
      YAHOO.' + cout + '.cal.setMonth(validDateMin.getMonth()); \
      YAHOO.' + cout + '.cal.cfg.setProperty("MAXDATE", YAHOO.widget.DateMath.add(YAHOO.' + cout + '.cal.cfg.getProperty("MINDATE"), "Y", 3)); \
      YAHOO.' + cout + '.cal.render();');
    break;
  }

  setFieldDate(obj.id + '_val', selDate);
  obj.hide();
}

/**
 * Callback for change rooms value.
 */
function changeRoomsValue(event)
{
  var iMaxFields = 2;

  var trg = YAHOO.util.Event.getTarget(event);
  var iRooms = trg.options[trg.selectedIndex].value;

  var nodes = null;
  for (var i = 0; i < iMaxFields; i++)
  {
    nodes = YAHOO.util.Selector.query('#mapHotelWnd_contents #guest_' + i);
    if (nodes.length)
    {
      if (i < iRooms) YAHOO.util.Dom.setStyle(nodes, 'display', '');
      else YAHOO.util.Dom.setStyle(nodes, 'display', 'none');
      return true;
    }

    nodes = YAHOO.util.Selector.query('#guest_' + i);
    if (i < iRooms) YAHOO.util.Dom.setStyle(nodes, 'display', '');
    else YAHOO.util.Dom.setStyle(nodes, 'display', 'none');
  }
}

/**
 * 
 */
function changeTab(tab)
{
  YAHOO.util.Event.onDOMReady((function()
  {
    if ('object' !== typeof(YAHOO.changeTab))
    {
      YAHOO.namespace("changeTab");
      YAHOO.changeTab.changeHandler = null;
      YAHOO.changeTab.max = 10;
      YAHOO.changeTab.tabs = [];
      YAHOO.changeTab.carousel = null;

      // Recieve menu nodes.
      var nodes = YAHOO.util.Selector.query('ul.placeInfo li');
      for(var i = 1; i <= nodes.length; i++) YAHOO.changeTab.tabs.push(i);

      for(i = 1; i <= YAHOO.changeTab.max; i++)
      {
        var tabNode;
        if (null == (tabNode = YAHOO.util.Dom.get('tab' + i))) continue;

        switch(i)
        {
          // Init google map.
          case 2: YAHOO.yaHotelCity.initializeGM(); break;

          // Init corousel.
          case 4:
            YAHOO.changeTab.carousel = new YAHOO.widget.Carousel("images", {isCircular: true, numVisible: 1})
            YAHOO.changeTab.carousel.render();
            YAHOO.changeTab.carousel.show();
          break;
        }
      }

      YAHOO.changeTab.changeHandler = function(tab){
        YAHOO.util.Dom.setStyle('t' + tab, 'display', 'block');
        YAHOO.util.Dom.replaceClass('tab' + tab, ' ', 'active');
        for (i = 1; i <= YAHOO.changeTab.max; i++)
        {
          if (i != tab) {
            YAHOO.util.Dom.setStyle('t' + i, 'display', 'none');
            YAHOO.util.Dom.replaceClass('tab' + i, 'active', ' ');
          }
        }
      }
      return YAHOO.changeTab.changeHandler(tab);
    }
  }));
  
  return ('object' == typeof(YAHOO.changeTab) && YAHOO.changeTab.changeHandler) ? YAHOO.changeTab.changeHandler(tab) : null;
}

function displayTravelInfo(id)
{
	var aid = 'a' + id;
	var id = 't' + id;

	var display = YAHOO.util.Dom.getStyle(id, 'display');
	var linkTxt = document.getElementById(aid);

  if(display == 'none')
  {
  	linkTxt.innerHTML = 'Close traveler info';
    YAHOO.util.Dom.setStyle(id, 'display', 'block');
  }
  else
  {
  	linkTxt.innerHTML = 'Add traveler info';
    YAHOO.util.Dom.setStyle(id, 'display', 'none');
  }
}

function displayTravelInfo2(id)
{
	var display = YAHOO.util.Dom.getStyle('t' + id, 'display');

  if(display == 'none')
  {
    YAHOO.util.Dom.setStyle('t' + id, 'display', 'block');
    YAHOO.util.Dom.replaceClass('l' + id, 'show', 'show showOn');
  }
  else
  {
    YAHOO.util.Dom.setStyle('t' + id, 'display', 'none');
    YAHOO.util.Dom.replaceClass('l' + id, 'show showOn', 'show');
  }
}

function roomCancel(url, roomID)
{
	 var agree = confirm("Are you sure you wish to continue?");
   if (!agree) return false;

   document.getElementById('orderStatus' + roomID).innerHTML = '<span style="color:green;font-weight:bold">processing...</span>';

   var signature = new Date();
   YAHOO.util.Connect.asyncRequest('GET', url + '?' + signature.getTime(), callbackCancel);
}

function initSlider2(label, args, obj)
{
   var Dom  = YAHOO.util.Dom,
   ffilter  = Dom.get(obj.formID),
   from     = Dom.get(obj.fromID),
   to       = Dom.get(obj.toID),
   slider;

   if(obj.itemFrom && parseInt(obj.itemFrom) > 0)
   {
     obj.initVals[0] = obj.itemFrom * obj.scaleFactor / obj.scaleConvert;
   }

   if(obj.itemTo && parseInt(obj.itemTo) > 0)
   {
     obj.initVals[1] = obj.itemTo * obj.scaleFactor / obj.scaleConvert;
   }

   slider = new YAHOO.widget.Slider.getHorizDualSlider('slider' + obj.itemName, 'min' + obj.itemName, 'max' + obj.itemName, obj.range, obj.tickSize, obj.initVals);

   slider.minRange = obj.minThumbDistance;
   slider.minVal = obj.initVals[0];
   slider.maxVal = obj.initVals[1];

   var convert = function(val) {
      return Math.round((val / obj.scaleFactor) * obj.scaleConvert);
   };

   var update = function() {
     from.innerHTML = obj.itemSymbol + convert(slider.minVal);
     to.innerHTML   = obj.itemSymbol + convert(slider.maxVal);
     if(ffilter)
     {
	     ffilter['filter[' + obj.itemName + '_from]'].value = convert(slider.minVal);
	     ffilter['filter[' + obj.itemName + '_to]'].value = convert(slider.maxVal);
     }
   };

   if(!ffilter)
   {
	   var end = function() {
	      reloadMap();
	   }
	   slider.subscribe("slideEnd", end);
   }

   slider.subscribe("change", update);
   slider.subscribe("ready", update);

 }


