// JavaScript Document

/* 

firmdale hotel booker

*/





var DatePicker = {


  version: 0.31,





  /* Configuration options */





  // if false, hide last row if empty


  constantHeight: true,





  // show select list for year?


  useDropForYear: false,





  // show select list for month?


  useDropForMonth: false,





  // number of years before current to show in select list


  yearsPriorInDrop: 10,





  // number of years after current to show in select list


  yearsNextInDrop: 10,





  // The current year


  year: new Date().getFullYear(),


  


  // The first day of the week (0=Sunday, 1=Monday, ...)


  firstDayOfWeek: 0,





  // show only 3 chars for month in link


  abbreviateMonthInLink: true,





  // show only 2 chars for year in link


  abbreviateYearInLink: false,





  // eg 1st


  showDaySuffixInLink: false,





  // eg 1st; doesn't play nice w/ month selector


  showDaySuffixInCalendar: false,





  // px size written inline when month selector used


  largeCellSize: 22,





  // if set, choosing a day will send the date to this URL, eg 'someUrl?date='


  urlBase: null,





  // show a cancel button to revert choice


  showCancelLink: true,





  // stores date before datepicker to revert to when cancelling


  _priorDate: [],


  _priorMonthYear: [],





  months: 'January,February,March,April,May,June,July,August,September,October,November,December'.split(','),





  days: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),





  /* Method declarations */





  toggleDatePicker: function (id) {


    var calendar = this.findCalendarElement(id);


    if (calendar.style.display == 'block') {  // If showing, hide


      calendar.style.display = 'none';


      if (id == 'a') {


        refreshWeekday(0);  


        updateDepartureDropdown(); 


      } else {


        refreshWeekday(1);  


      }


    } else {                                  // Else, show


      calendar.style.display = 'block';


      this._priorDate[id] = document.getElementById(id+'D').value;


      this._priorMonthYear[id] = document.getElementById(id+'MY').value;


      this.writeCalendar(id);


    }


  },





  cancel: function (id) {


    document.getElementById(id+'D').value = this._priorDate[id];


    document.getElementById(id+'MY').value = this._priorMonthYear[id];    


    this.findCalendarElement(id).style.display = 'none';


  },





  // mitigate clipping when new month has less days than selected date


  unclipDates: function (d1, d2) {


    if (d2.getDate() != d1.getDate()) {


      d2 = new Date(d2.getFullYear(), d2.getMonth(), 0);


    }





    return d2;


  },





  // change date given an offset from the current date as a number of months (+-)


  changeCalendar: function (id, offset) {


    var d1 = this.getSelectedDate(id), d2;


    if (offset % 12 == 0) { // 1 year forward / back (fix Safari bug)


      d2 = new Date (d1.getFullYear() + offset / 12, d1.getMonth(), d1.getDate() );


    } else if (d1.getMonth() == 0 && offset == -1) {// tiptoe around another Safari bug


      d2 = new Date (d1.getFullYear() - 1, 11, d1.getDate() );


    } else {


      d2 = new Date (d1.getFullYear(), d1.getMonth() + offset, d1.getDate() );


    }





    d2 = this.unclipDates(d1, d2);


    ansi_date = d2.getFullYear() + '/' + (d2.getMonth() + 1) + '/' + d2.getDate();


    this.setDate(id, ansi_date);


    this.writeCalendar(id);


  },





  setDate: function (id, ansiDate) {





    var d_day  = (this.showDaySuffixInLink ? this.formatDay(ansiDate.split('/')[2]) : ansiDate.split('/')[2]);


    var d_year = (this.abbreviateYearInLink ? ansiDate.split('/')[0].substring(2,4) : ansiDate.split('/')[0]);


    var d_mon  = Number(ansiDate.split('/')[1]);





//    if (this.abbreviateMonthInLink) { d_mon = d_mon.substring(0, 3); }


    document.getElementById(id+'D').value = d_day;








    monthYear = document.getElementById(id+'MY')


    for (var i=0; i < monthYear.options.length; i++ ) {


        dateString = monthYear.options[i].value


        dateList = dateString.split('/')


        month = dateList.shift()


        year = dateList.shift()


        if (month == d_mon) {


            if (year == d_year) {


            document.getElementById(id+'MY').selectedIndex = i


            break }


            } 


        }


  },





  pickDate: function (id, ansi_date) {


    this.setDate(id, ansi_date);


    this.toggleDatePicker(id);


    if (this.urlBase) {


      document.location.href = this.urlBase + ansi_date


    }


  },





  getMonthName: function(monthNum) { //anomalous


    return this.months[monthNum];


  },





  dateFromAnsiDate: function (ansi_date) {


    return new Date(ansi_date.split('/')[0], Number(ansi_date.split('/')[1]) - 1, ansi_date.split('/')[2])


  },





  ansiDateFromDate: function(date) {


    alert( date.getFullYear() + '/' + (date.getMonth()+1) + '/' + date.getDate() );


  },





  dateFromForms: function (id) {





    var monthYear = document.getElementById(id+'MY').value


    dateList = monthYear.split('/')


    chosenMonth = parseInt(dateList.shift())


    chosenYear = parseInt(dateList.shift())


    var chosenDay = parseInt(document.getElementById(id+'D').value)


    if (isNaN(chosenDay)) { return chosenDay }


    return new Date(chosenYear, chosenMonth-1, chosenDay, 0, 0, 0, 0)


  },





  getSelectedDate: function (id) {


    if (document.getElementById(id+'D').value == '') return new Date(); // default to today if no value exists


    return this.dateFromForms(id);


  },





  makeChangeCalendarLink: function (id, label, offset) {


    return ('<a href="#" onclick="DatePicker.changeCalendar(\''+id+'\','+offset+'); return false;">' + label + '</a>');


  },





  formatDay: function (n) {


    var x;


    switch (String(n)){


      case '1' :


      case '21': case '31': x = 'st'; break;


      case '2' : case '22': x = 'nd'; break;


      case '3' : case '23': x = 'rd'; break;


      default:


        x = 'th';


    }





    return n + x;


  },





  writeMonth: function (id, n) {


    if (this.useDropForMonth) {


      var opts = '';


      for (i in this.months) {


        sel = (i == this.getSelectedDate(id).getMonth() ? 'selected="selected" ' : '');


        opts += '<option ' + sel + 'value="'+ i +'">' + this.getMonthName(i) + '</option>';


      }





      return '<select onchange="DatePicker.selectMonth(\'' + id + '\', this.value)">' + opts + '</select>';


    } else {


      return this.getMonthName(n)


    }


  },





  writeYear: function (id, n) {


    if (this.useDropForYear) {


      var min = this.year - this.yearsPriorInDrop;


      var max = this.year + this.yearsNextInDrop;


      var opts = '';


      for (i = min; i < max; i++) {


        sel = (i == this.getSelectedDate(id).getFullYear() ? 'selected="selected" ' : '');


        opts += '<option ' + sel + 'value="'+ i +'">' + i + '</option>';


      }





      return '<select onchange="DatePicker.selectYear(\'' + id + '\', this.value)">' + opts + '</select>';


    } else {


      return n


    }


  },





  selectMonth: function (id, n) {


    d = this.getSelectedDate(id)


    d2 = new Date(d.getFullYear(), n, d.getDate())


    d2 = this.unclipDates(d, d2)


    this.setDate(id, d2.getFullYear() + '/' + (Number(n)+1) + '/' + d2.getDate() )


    this.writeCalendar(id)


  },





  selectYear: function (id, n) {


    d = this.getSelectedDate(id)


    d2 = new Date(n, d.getMonth(), d.getDate())


    d2 = this.unclipDates(d, d2)


    this.setDate(id, n + '/' + (d2.getMonth()+1) + '/' + d2.getDate() )


    this.writeCalendar(id)


  },





  writeCalendar: function (id) {


    var date = this.getSelectedDate(id);


    var firstWeekday = new Date(date.getFullYear(), date.getMonth(), 1).getDay();


    var lastDateOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();





    // To grey out dates in past


    var firstDateOfMonth = new Date(date.getFullYear(), date.getMonth(), 1)


    var now = new Date();


    var today = new Date(now.getFullYear(), now.getMonth(), now.getDate())


    if (firstDateOfMonth < today) {


        var greyOutPastDates = true;


    } else {


        var greyOutPastDates = false;


    }


    


    var day  = 1; // current day of month





    // not quite entirely pointless: fix Safari display bug with absolute positioned div


    // this.findLinkElement(id).innerHTML = this.findLinkElement(id).innerHTML;





    var o = '<table cellspacing="1">'; // start output buffer


    o += '<thead><tr>';





    // month buttons


    o +=


      '<th style="text-align:left">' + this.makeChangeCalendarLink(id,'&lt;',-1) + '</th>' +


      '<th colspan="5">' + this.writeMonth(id, date.getMonth()) + '</th>' +


      '<th style="text-align:right">' + this.makeChangeCalendarLink(id,'&gt;',1) + '</th>';


    o += '</tr><tr>';





    // year buttons


    o +=


      '<th colspan="2" style="text-align:left">' + this.makeChangeCalendarLink(id,'&lt;&lt;',-12) + '</th>' +


      '<th colspan="3">' + this.writeYear(id,  date.getFullYear()) + '</th>' +


      '<th colspan="2" style="text-align:right">' + this.makeChangeCalendarLink(id,'&gt;&gt;',12) + '</th>';


    o += '</tr><tr class="day_labels">';





    // day labels


    for(var i = 0; i < this.days.length; i++) {


      o += '<th>' + this.days[(i+this.firstDayOfWeek) % 7] + '</th>';


    }


    o += '</tr></thead>';





    if (this.showCancelLink) {


      o += '<tfoot><tr><td colspan="7"><div class="cancel_butt"><a href="#" onclick="DatePicker.cancel(\''+id+'\')">[x] cancel</a></div></td></tr></tfoot>';


    }





    // day grid


    o += '<tbody>';


    for(rows = 1; rows < 7 && (this.constantHeight || day < lastDateOfMonth); rows++) {


      o += '<tr>';


      for(var day_num = 0; day_num < this.days.length; day_num++) {


        var translated_day = (this.firstDayOfWeek + day_num) % 7


        if ((translated_day >= firstWeekday || day > 1) && (day <= lastDateOfMonth) ) {


          args = [id, (date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + day)];


          style = (this.selectMonth ? ' style="width: ' + this.largeCellSize + 'px"' : '');


          


          cls = '';


          


          if (greyOutPastDates == true) {


              if (day < today.getDate()) {


                  cls = ' class="past"'


              }


          }


          


          o +=


            '<td' + cls + style + '>' + // link : each day


            "<a href=\"#\" onclick=\"DatePicker.pickDate('" + args.join("','") + "'); return false;\">" + day + '</a>' +


            '</td>';


          day++;


        } else {


          o += '<td>&nbsp;</td>';


        }


      }





      o += '</tr></tbody>';


    }





    o += '</table>';





    this.findCalendarElement(id).innerHTML = o;


  },





  findCalendarElement: function(id) {


    return document.getElementById('_' + id + '_calendar');


  },





  findLinkElement: function(id) {


    return document.getElementById('_' + id + '_link');


  }


};





// Date picker end





document.write('<form id="bookingForm" name="datesForm" id="booking_control" onSubmit="jumpToUrl(); return false"><table id="booking_control"><tr><td id="booking_control_td_left"><p><span id="arriving" class="daylabelsplain" style="padding-top: 4px;">Arriving :</span><br />')





function validate(f) {


    if (f.hotelId.value == '') {


        return false;


    } else {


        var oldAction = f.action;


        if (oldAction.subString(-(f.hotelId.value.length), -1) != f.hotelId.value.length) {


            f.action = oldAction + f.hotelId.value + '/'; }


        return true;


    }


}





function createWeekdays() {


    days = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")


    return (days) }





function checkDate(arrivalOrDeparture) {


    if (!arrivalOrDeparture) {


        var ddPrefix="a"


    } else {


        var ddPrefix="d"


    }


    var dateSelect = document.forms.datesForm.elements[ddPrefix+"D"]


    if (dateSelect.selectedIndex == 0)


    {


        dateSelect.selectedIndex = 1


    } }





// arrivalOrDeparture is a boolean: 0=arr; 1=dep


// langCode is a string: "en","fr",etc


function refreshWeekday(arrivalOrDeparture)


{


    if (!arrivalOrDeparture) {


        var ddPrefix="a"


        var outputText= "Arriving :"


        var labelDivId="arriving"


    } else {


        var ddPrefix="d"


        var outputText= "Leaving :"


        var labelDivId="leaving" }


    var weekdaysArray = createWeekdays()


    var els = document.forms.datesForm.elements


    var thisDate = selectedDate(els, ddPrefix)


    if (!isNaN(thisDate) && typeof(thisDate.getDay()) != "undefined") {


        rewriteText(labelDivId, outputText+weekdaysArray[thisDate.getDay()])


    } else {


        rewriteText(labelDivId, outputText)


    }


}





function rewriteText(divId, text) {


    if (document.layers) {


        var obj = document.layers[divId].document;


        obj.open();


        obj.write(text);


        obj.close();


    }


    else if (document.all) {


        document.all[divId].innerHTML = text;


    }


    else if (document.documentElement) {


        document.getElementById(divId).innerHTML = text;


    }


}





function selectedDate(els, ddPrefix) {


    var monthYear = els[ddPrefix+"MY"].options[els[ddPrefix+"MY"].selectedIndex].value


    dateList = monthYear.split('/')


    chosenMonth = parseInt(dateList.shift())


    chosenYear = parseInt(dateList.shift())


    var chosenDay = parseInt(els[ddPrefix+"D"].options[els[ddPrefix+"D"].selectedIndex].value)


    if (isNaN(chosenDay)) { return chosenDay}


    var thisDate = new Date(chosenYear, chosenMonth-1, chosenDay, 0, 0, 0, 0)


    return (thisDate)


    }





function updateDepartureDropdown() {


    var els = document.forms.datesForm.elements


    var newArrDate = selectedDate(els, "a")


    var newDepDate = new Date(newArrDate.getFullYear(), newArrDate.getMonth(), newArrDate.getDate()+1)


    els['dD'].selectedIndex = newDepDate.getDate() - 1


    var depMonthYear = els['dMY']


    for (var i=0; i < depMonthYear.options.length; i++ ) {


        dateString = depMonthYear.options[i].value


        dateList = dateString.split('/')


        month = dateList.shift()


        year = dateList.shift()


        if (month == newDepDate.getMonth() + 1) {


            if (year == newDepDate.getFullYear()) {


            els['dMY'].selectedIndex = i


            break }


            } 


        }


    refreshWeekday(1);            


    }





function refreshWeekdays() {


    refreshWeekday(0);


    refreshWeekday(1);


    }





    /* This added because whenever the current date is the 31st of a month, adding +1 to the month


       skips the next month (it probably adds 31 days internally.  Added by Rush. */


function addOneMonthWorkAround (startDate)


{


    var todaysDate = new Date();


        if ((todaysDate.getDate() == 31) && 


        (startDate.getMonth() == todaysDate.getMonth()) &&


        (startDate.getFullYear() == todaysDate.getFullYear()) &&


        (startDate.getDate() == todaysDate.getDate())


       )


    {


        startDate.setDate(startDate.getDate()+1);


    }


    else


    {


        startDate.setMonth(startDate.getMonth()+1);    


    }    





    return startDate;


}





// Populate today's date


document.write('<select name="aD" id="aD" onChange="updateDepartureDropdown();refreshWeekday(0);" class="drop">')





var selDate = new Date();


// Commented out so default date is current date.


// selDate.setDate(selDate.getDate() + 14);


var tomorrowDate = new Date(selDate.getFullYear(), selDate.getMonth(), selDate.getDate()+1)


for (i = 1; i <= 31; i++)


    if (i == selDate.getDate()) {


    document.write('<option selected="selected" value="'+i+'">'+i+'</option>') }


    else {


    document.write('<option value="'+i+'">'+i+'</option>') }


    


var month_names = new Array(12)


month_names[0] = "Jan"


month_names[1] = "Feb"


month_names[2] = "Mar"


month_names[3] = "Apr"


month_names[4] = "May"


month_names[5] = "Jun"


month_names[6] = "Jul"


month_names[7] = "Aug"


month_names[8] = "Sep"


month_names[9] = "Oct"


month_names[10] = "Nov"


month_names[11] = "Dec"





document.write('</select>')


document.write(' <select name="aMY" id="aMY" onChange="updateDepartureDropdown();refreshWeekday(0);" class="drop">')





var startDate = new Date();


startDate.setDate(1);


for (i = 0; i <= 17; i++) {


    if (startDate.getMonth() == selDate.getMonth() && startDate.getFullYear() == selDate.getFullYear()) 


    {


        document.write('<option selected="selected" value="'+(startDate.getMonth()+1)+'/'+startDate.getFullYear()+'">'+month_names[startDate.getMonth()]+' ' + startDate.getFullYear() + '</option>') 


    }


    else 


    {


        document.write('<option value="'+(startDate.getMonth()+1)+'/'+startDate.getFullYear()+'">'+month_names[startDate.getMonth()]+' ' + startDate.getFullYear() + '</option>') 


    }


    startDate = addOneMonthWorkAround(startDate);


}





document.write('</select>')


document.write('<a href="#" onclick="DatePicker.toggleDatePicker(\'a\'); return false;"><img src="/media/_images/buttonCalendar.gif" alt="Calendar" title="Click to Launch Calendar" align="top" border="0" height="15" width="24"></a></p></td><td id="booking_control_td_right"><div id="_a_calendar" class="date_picker" style="display:none"></div><p class="daylabelsplain" style="padding-top: 4px;">Adults<br /><select name="nA" class="reservation_pax_select"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select></p></td></tr><tr><td><p><span id="leaving" class="daylabelsplain" style="padding-top: 4px;">Leaving :</span><br/>')


document.write('<select name="dD" id="dD" class="drop">')





for(i = 1; i <= 31; i++)


    if (i == tomorrowDate.getDate()) {


    document.write('<option selected="selected" value="'+i+'">'+i+'</option>') }


    else {


    document.write('<option value="'+i+'">'+i+'</option>') }





document.write('</select>')


document.write(' <select name="dMY" id="dMY" class="drop">')





var startDate = new Date();


startDate.setDate(1);


for (i = 0; i <= 17; i++) {


    if (startDate.getMonth() == tomorrowDate.getMonth() && startDate.getFullYear() == tomorrowDate.getFullYear()) {


    document.write('<option selected="selected" value="'+(startDate.getMonth()+1)+'/'+startDate.getFullYear()+'">'+month_names[startDate.getMonth()]+' ' + startDate.getFullYear() + '</option>') }


    else {


    document.write('<option value="'+(startDate.getMonth()+1)+'/'+startDate.getFullYear()+'">'+month_names[startDate.getMonth()]+' ' + startDate.getFullYear() + '</option>') }


    startDate = addOneMonthWorkAround(startDate);


}

document.write('</select><a href="#" onclick="DatePicker.toggleDatePicker(\'d\'); return false;"><img src="/media/_images/buttonCalendar.gif" alt="Calendar" title="Click to Launch Calendar" align="top" border="0" height="15" width="24"></a></p></td><td><div id="_d_calendar" class="date_picker" style="display:none"></div><p class="daylabelsplain" style="padding-top: 4px;">Children<br /><select name="nC" class="reservation_pax_select"><option value="0">0</option><option value="1">1</option><option value="2">2</option></select></p></td></tr><tr><td><p style="padding:3px 0;"><select name="hotelId" class="drop"><option value="">Select a Hotel </option><option value="12416">Charlotte Street Hotel</option><option value="12420">Covent Garden Hotel</option><option value="25650">Crosby Street Hotel</option><option value="17965">Haymarket Hotel</option><option value="19198">Knightsbridge Hotel</option><option value="19197">Number Sixteen</option><option value="12448">The Soho Hotel</option><option value="">All Hotels</option></select></p></td>')


// arrive and depart dates - US format

function arriveDate () {
  arrive = document.getElementById('aMY').value
  return arrive.replace('/','/'+document.getElementById('aD').value+'/')
}

function departDate () {
  depart = document.getElementById('dMY').value
  return depart.replace('/','/'+document.getElementById('dD').value+'/')
}
  
document.write('<td><p style="padding:3px 0;">')  

function getUrl () {

  var url = "";
  var url = 'http://gc.synxis.com/rez.aspx?Chain=5154&AltDest=firmdale_be&template=GCO&shell=GCO&locale=en-US&start=1&arrive='+arriveDate()+'&depart='+departDate();

  //var uk_url = 'http://gc.synxis.com/rez.aspx?Dest=firmdale&template=firmdale&shell=firmdale&Chain=5154&AltDest=firmdale_be&template=GCO&shell=GCO&locale=en-US&arrive='+arriveDate()+'&depart='+departDate() 
  //var usa_url = 'http://gc.synxis.com/rez.aspx?Dest=firmdale&template=firmdale&shell=firmdale&Chain=5154&AltDest=firmdale_be&template=GCO&shell=GCO&locale=en-US&arrive='+arriveDate()+'&depart='+departDate() 
  
  // Amendment - 13/08/08
  // create array of hotel srcs
  // to add these to query string for tracking
  var HotelSrc = [];
  HotelSrc[12416] = 'charlotte'
  HotelSrc[12420] = 'covent'
  HotelSrc[25650] = 'crosby'
  HotelSrc[17965] = 'haymarket'
  HotelSrc[19198] = 'knightsbridge'
  HotelSrc[19197] = 'number16'
  HotelSrc[12448] = 'soho'
  
  if (document.forms.bookingForm.hotelId.value == '') {
    // no specific hotel selected
    url = 'https://gc.synxis.com/rez.aspx?Chain=5154&Dest=firmdale&template=firmdale&shell=firmdale&start=1&locale=en-US&src=firmdale&arrive='+arriveDate()+'&depart='+departDate();
  }
  /*else if(document.forms.bookingForm.hotelId.value == '25650')
  {
    // usa hotel
    url = usa_url + '&hotel='+document.forms.bookingForm.hotelId.value + '&src=crosby'
    //url = usa_url + '&src=crosby'
  }*/
  else
  {
    url = url + '&hotel='+document.forms.bookingForm.hotelId.value
    
    // add src if we have one
    if (HotelSrc[document.forms.bookingForm.hotelId.value] != '')
      url += '&src='+HotelSrc[document.forms.bookingForm.hotelId.value]
  }
  
  url += '&adult='+document.forms.bookingForm.nA.value
  url += '&child='+document.forms.bookingForm.nC.value
  
  return url
}

//document.write('<form id="submitForm" action="'+url+'" method="post"><input class="reservation_submit" type="submit" value="GO"  /></form>')
document.write('<input class="reservation_submit" type="submit" value="GO"  /></p></td></tr></table></form>')

function jumpToUrl () {
  window.location=getUrl()
  return false
}

refreshWeekdays();

