/**
  * Display
  */
 public function display($tpl = null)
 {
     // load data
     $this->month = CHLibDate::getMonth(substr($this->search->start_date, 0, -3));
     $this->months_list = CHLibDate::getMonthsList();
     $this->availability = $this->get('Availability');
     // check availability
     if (!$this->availability || $this->availability->errors->errors) {
         // errors view
         $this->setLayout('errors');
     }
     // rooms with extras
     if (isset($this->availability->results)) {
         $this->rooms_with_extras = [];
         $rooms_with_extras = [];
         foreach ($this->availability->results->search_rooms as $search_room) {
             foreach ($search_room->available_rooms as $available_room) {
                 if (count($available_room->extras)) {
                     $rooms_with_extras[] = (int) $available_room->room_id;
                 }
             }
         }
         $this->rooms_with_extras = array_values(array_unique($rooms_with_extras));
     }
     // extend view
     $this->extendView();
     // display the view
     parent::display($tpl);
 }
 /**
  * Get the availability data for a hotel
  */
 public function getCalendar()
 {
     // hotel_id
     $hotel_id = $this->getHotelId();
     if (!$hotel_id) {
         throw new Exception(CHClient::string('error_resource_not_found'), 404);
     }
     // load search
     $search = CHClient::getSearch();
     // get month start and end dates
     $default_month = substr($search->start_date, 0, -3);
     $month_date = $this->app->getUserStateFromRequest('chclient.month', 'month', $default_month, 'string');
     // init calendar object
     $calendar = new stdClass();
     $calendar->month = CHLibDate::getMonth($month_date);
     $calendar->months_list = CHLibDate::getMonthsList();
     // get ari from api
     $request = (object) ['hotel_id' => $hotel_id, 'start_date' => $calendar->month->start, 'end_date' => $calendar->month->end, 'currency' => $search->currency, 'lang' => JFactory::getLanguage()->getTag()];
     $api_request = $this->apiRequest('ari_get', $request);
     // check for errors
     if ($api_request->errors->errors) {
         return $api_request;
     }
     // finalise calendar object
     $calendar->ari = $api_request->response;
     return $calendar;
 }
 /**
  * Display
  */
 public function display($tpl = null)
 {
     // load app
     $this->app = CHClient::getApp();
     // get the booking info
     $this->booking = $this->get('Booking');
     // no booking found
     if (!$this->booking) {
         $this->setLayout('errors');
         parent::display($tpl);
         return;
     }
     // processing booking
     if ($this->booking->booking_status >= 40) {
         return $this->displayProcessing();
     }
     // new booking analytics tracking
     $this->new_booking = false;
     if ($this->app->getUserState('chclient.new_booking', false)) {
         $this->new_booking = (object) ['booking_id' => $this->booking->booking_id, 'hotel' => $this->booking->hotel->title, 'total' => $this->booking->amounts->total, 'currency' => $this->booking->currency];
         $this->new_booking->rooms = [];
         foreach ($this->booking->rooms as $room) {
             $new_booking_room = (object) ['title' => $room->title, 'reference' => $room->reference, 'total' => $room->amounts->total];
             $this->new_booking->rooms[] = $new_booking_room;
         }
         $this->app->setUserState('chclient.new_booking', null);
     }
     // determine free cancellation
     $this->data = (object) [];
     $this->data->free_cancellation = 1;
     $this->data->deadline = '';
     $deadline = 00;
     foreach ($this->booking->rooms as $room) {
         $rate_deadline = CHLIbdate::sqlToInt($room->rate->deadline);
         if ($rate_deadline > $deadline) {
             $this->data->deadline = $room->rate->deadline;
         }
         if (!in_array($room->rate->conditions, ['pay_at_hotel', 'deposit_refundable', 'prepay_refundable'])) {
             $this->data->free_cancellation = 0;
         }
     }
     if ($this->data->free_cancellation) {
         $this->data->free_cancellation = CHLibDate::isGreater($this->data->deadline, CHLibDate::dateToSql(false));
     }
     // print voucher ?
     if ($this->booking && CHLib::input()->get('print')) {
         return $this->printVoucher();
     }
     // set document title
     $this->document->setTitle(CHClient::string('your_booking') . ' - ' . $this->booking->booking_id);
     // display
     parent::display($tpl);
 }
 /**
  * Get Availability
  */
 public function getAvailability()
 {
     // init request
     $search = $this->search;
     $search->hotels_ids = $this->getHotelsIds();
     $api_request = $this->apiRequest('search_results', $search);
     if (!$api_request) {
         return false;
     }
     // prepare availability object
     $availability = (object) [];
     $availability->errors = $api_request->errors;
     $availability->request = $api_request->request->data;
     if (isset($api_request->app)) {
         $availability->app = $api_request->app;
         $availability->app->voucher_text_html = CHLibDisplay::convertMarkdownToHtml($availability->app->voucher_text);
     }
     // inventory tasks
     if (isset($api_request->response->inventory)) {
         // prepare hotel info
         $availability->hotel = CHInventory::prepare($api_request->response->inventory[0]);
         // update inventory db
         foreach ($api_request->response->inventory as $inventory) {
             $this->_db->setQuery("DELETE FROM `#__chclient_inventory` WHERE id = {$inventory->id}")->execute();
             $insert = (object) ['id' => $inventory->id, 'title' => $inventory->title, 'slug' => $inventory->slug, 'data' => json_encode($inventory)];
             $this->_db->insertObject('#__chclient_inventory', $insert, 'id');
         }
     }
     // check for errors
     if ($api_request->errors->errors) {
         // init calendar object
         if (isset($api_request->response->month_ari)) {
             $calendar = new stdClass();
             $calendar->month = CHLibDate::getMonth(substr($search->start_date, 0, -3));
             $calendar->months_list = CHLibDate::getMonthsList();
             $calendar->ari = $api_request->response->month_ari;
             $availability->calendar = $calendar;
         }
         return $availability;
     }
     // prepare the info
     $availability->results = $api_request->response->results[0];
     $availability->month_ari = $api_request->response->month_ari;
     return $availability;
 }
        if ($room->rate->conditions == 'pay_at_hotel') {
            echo '<br><span class="ch-text-block ch-text-green">' . CHClient::string('pay_later') . '</span>';
        }
    }
    // non_refundable
    if ($room->non_refundable) {
        echo '<br><i class="uk-icon-calendar-times-o"></i> &nbsp;&nbsp;<span class="ch-text-block">' . CHClient::string('non_refundable') . '</span>';
    }
    // special_conditions
    if ($room->special_conditions) {
        echo '<br><i class="uk-icon-calendar-times-o"></i> &nbsp;&nbsp;<span class="ch-text-block">' . CHClient::string('special_conditions') . '</span>';
    }
    // tip
    $rate_tip = '<strong>' . CHClient::string('cancellation') . '</strong>: ' . $room->rate->cancellation_policy;
    if ($room->free_cancellation) {
        $rate_tip .= '<br>' . CHClient::sprintf('free_cancellation_before', CHLibDate::dateToDisplay($room->rate->deadline, false));
    }
    $rate_tip .= '<br><strong>' . CHClient::string('prepayment') . '</strong>: ' . CHClient::string(CHClientDisplay::ratePrepayment($room->rate->conditions));
    echo ' <i class="uk-icon-info-circle" data-uk-tooltip title="' . $rate_tip . '"></i>';
    ?>
						<br>
						<i class="uk-icon-users"></i> &nbsp;&nbsp;<?php 
    echo CHClientDisplay::roomGuests($room->party->adults, $room->party->children, $room->party->babies);
    ?>
						<?php 
    if (isset($room->party->children) && $room->party->children) {
        ?>
							<i class="uk-icon-info-circle" data-uk-tooltip title="<?php 
        echo CHClient::sprintf('hotel_ages', $this->availability->results->ages->child, $this->availability->results->ages->adult);
        ?>
"></i>
">
					</div>
				</div>
			</div>

			<!-- checkout -->
			<div class="uk-form-row">
				<label class="uk-form-label" for="ch-search-checkout"><?php 
echo CHClient::string('checkout');
?>
</label>
				<div class="uk-form-controls">
					<div class="uk-form-icon">
						<i class="uk-icon-calendar"></i>
						<input id="ch-search-checkout" class="uk-form-width-small ch-datepicker" type="text"  readonly data-ch-datepicker data-ch-search-checkout value="<?php 
echo CHLibDate::dateToLocale($search->end_date);
?>
">
					</div>
				</div>
			</div>

			<!-- rooms -->
			<div class="uk-form-row ch-search-row-rooms">
				<label class="uk-form-label" for="ch-search-rooms"><?php 
echo CHClient::string('rooms');
?>
</label>
				<div class="uk-form-controls">
					<select id="ch-search-rooms" class="uk-form-width-small" data-ch-search-rooms>
						<?php 
if ($confirmed && $this->data->free_cancellation) {
    ?>
		<h3><?php 
    echo CHClient::string('cancellation');
    ?>
</h3>
		<?php 
    if ($this->data->free_cancellation) {
        ?>
			<div class="uk-text-center">
				<p class="uk-margin uk-margin-bottom-remove"><a data-uk-modal href="#ch-modal-cancel" class="uk-button uk-button-danger uk-width-8-10"><i class="uk-icon-times-circle"></i> <?php 
        echo CHClient::string('cancel_your_booking');
        ?>
</a></p>
				<p class="uk-margin-small uk-text-muted uk-text-small"><?php 
        echo CHClient::sprintf('free_cancellation_before', '<br>' . CHLibDate::dateToDisplay($this->data->deadline, false));
        ?>
 23:59 <?php 
        echo $booking->hotel->timezone;
        ?>
</p>
			</div>
		<?php 
    }
    ?>
		<?php 
    if (!$this->data->free_cancellation) {
        ?>
			<p class="uk-alert uk-alert-warning"><?php 
        echo CHClient::string('cancellation_request_tip');
        ?>
			<strong><i class="uk-icon-calendar-check-o"></i> <?php 
echo CHClient::numstring($search->nights, 'nights');
?>
</strong>
			<small>
				<br><?php 
echo CHClient::string('checkin');
?>
: <?php 
echo CHLibDate::dateToDisplay($search->start_date);
?>
				<br><?php 
echo CHClient::string('checkout');
?>
: <?php 
echo CHLibDate::dateToDisplay($search->end_date);
?>
				<?php 
if (count($search->party) == 1) {
    ?>
					<br><?php 
    echo CHClient::sprintf('room_for', CHClientDisplay::roomGuests($search->party[0]->adults, count($search->party[0]->children)));
    ?>
				<?php 
}
?>
			</small>
		</p>

		<?php 
if (count($search->party) > 1) {
				<form class="uk-form" action="<?php 
echo JRoute::_('index.php?Itemid=' . $this->params->get('Itemid'));
?>
" data-ch-promo-form>

					<fieldset>

						<legend><?php 
echo CHClient::string('book_now');
?>
</legend>

						<div class="uk-form-icon uk-margin uk-margin-small-right">
							<i class="uk-icon-calendar"></i>
							<input id="ch-search-checkin" class="ch-datepicker uk-form-large" type="text" readonly data-ch-datepicker data-ch-promo-checkin value="<?php 
echo CHLibDate::dateToLocale($search->start_date);
?>
">
						</div>
						<select name="nights" class="uk-form-large uk-margin uk-margin-small-right">
							<?php 
for ($i = $this->promo->minstay; $i <= $this->promo->maxstay; $i++) {
    ?>
								<option><?php 
    echo CHClient::numstring($i, 'nights');
    ?>
</option>
							<?php 
}
?>
						</select>
 /**
  * Render month row
  */
 static function monthRow($first, $last, $month, $rooms, $ari, $filter_room = false, $start_empty_days = 0, $end_empty_days = 0)
 {
     $html = [];
     $today_int = CHLibDate::getDate()->format('Ymd');
     $currency = isset($ari->currency) ? CHLibDisplay::currencySymbol($ari->currency) : '';
     foreach ($rooms as $room) {
         // check room
         if ($filter_room && $room->id != $filter_room) {
             continue;
         }
         // prepare available & rates keys
         $room_ari = isset($ari->ari) ? CHLibData::getObjectFromList($ari->ari, $room->id, 'room_id') : 0;
         // generate html
         if (!$filter_room) {
             $title = '<div class="uk-vertical-align-middle">' . $room->title . '</div>';
             $html[] = '<div class="uk-vertical-align ch-month-cell ch-month-cell-row ch-month-cell-title">' . $title . '</div>';
         }
         // empty rows
         for ($i = 0; $i < $start_empty_days; $i++) {
             $html[] = '<div class="ch-month-cell ch-month-cell-row"></div>';
         }
         foreach ($month->dates as $date) {
             // month rows
             $day = $date->day;
             if ($day < $first || $day > $last) {
                 continue;
             }
             // get day data
             $date_int = str_replace('-', '', $date->date);
             $rate = '-';
             $aclass = '';
             $is_not_in_past = $date_int >= $today_int;
             if ($room_ari) {
                 $has_availability = isset($room_ari->availability[$day - 1]);
                 $has_rate_and_is_not_zero = isset($room_ari->rates[0]->rate[$day - 1]) && $room_ari->rates[0]->rate[$day - 1] > 0;
                 if ($is_not_in_past && $has_availability && $has_rate_and_is_not_zero) {
                     $rate = CHLibDisplay::money($room_ari->rates[0]->rate[$day - 1], $currency);
                     $available = $room_ari->availability[$day - 1];
                     $aclass = 'ch-month-cell-span-available-' . ($available ? $available > 2 ? 'ok' : 'low' : 'no');
                 }
             }
             // cells
             $html[] = '<div class="ch-month-cell ch-month-cell-row ch-month-cell-day-' . $date->day_week . '">';
             $html[] = '<small class="uk-text-muted ch-month-cell-span ch-month-cell-span-available ' . $aclass . '">' . $rate . '</small>';
             $html[] = '</div>';
         }
         // empty rows
         for ($i = 0; $i < $end_empty_days; $i++) {
             $html[] = '<div class="ch-month-cell ch-month-cell-row"></div>';
         }
     }
     return implode("\n", $html);
 }
 /**
  * Determine free cancellation
  * @param type $conditions
  * @param type $deadline
  */
 public static function freeCancellation($conditions, $deadline)
 {
     if (!in_array($conditions, ['pay_at_hotel', 'deposit_refundable', 'prepay_refundable'])) {
         return false;
     }
     return CHLibDate::isGreater(CHLibDate::sqlToInt($deadline), CHLibDate::dateToSql(false));
 }
    }
    ?>
				<br><strong><?php 
    echo CHClient::string('cancellation_policy');
    ?>
</strong>: <?php 
    echo $this->escape($room->rate->cancellation_policy);
    ?>
				<?php 
    if ($deadline) {
        ?>
					<br><strong><?php 
        echo CHClient::string('cancellation_deadline');
        ?>
</strong>: <span class="ch-booking-text-green"><?php 
        echo CHLibDate::dateToDisplay($room->rate->deadline);
        ?>
 23:59 [<?php 
        echo $hotel->timezone;
        ?>
]</span>
				<?php 
    }
    ?>
			</p>

		</div>

	</div>

	<hr>