PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.6.4
VikBooking Hotel Booking Engine & PMS v1.6.4
1.8.16 1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 All 37 releases
vikbooking / admin / views / orders / tmpl / default.php

default.php in VikBooking Hotel Booking Engine & PMS 1.6.4, at admin/views/orders/tmpl/default.php

1,301 lines 54.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package VikBooking
4 * @subpackage com_vikbooking
5 * @author Alessio Gaggii - e4j - Extensionsforjoomla.com
6 * @copyright Copyright (C) 2018 e4j - Extensionsforjoomla.com. All rights reserved.
7 * @license GNU General Public License version 2 or later; see LICENSE
8 * @link https://vikwp.com
9 */
10
11 defined('ABSPATH') or die('No script kiddies please!');
12
13 $rows = $this->rows;
14 $allrooms = $this->allrooms;
15 $lim0 = $this->lim0;
16 $navbut = $this->navbut;
17 $orderby = $this->orderby;
18 $ordersort = $this->ordersort;
19
20 // list of IDs for which VCM should monitor the guest messages in the chat
21 $vcm_bids = array();
22
23 $dbo = JFactory::getDbo();
24 $app = JFactory::getApplication();
25
26 $vbo_app = VikBooking::getVboApplication();
27 $vbo_app->loadDatePicker();
28 $vbo_app->loadContextMenuAssets();
29
30 // JS lang def
31 JText::script('VBOGENINVOICES');
32 JText::script('VBCONFIRMGENINV');
33 JText::script('VBADMINNOTESTOGGLE');
34 JText::script('VBDASHUPRESONE');
35 JText::script('VBOCHANNEL');
36 JText::script('VBCOUPON');
37 JText::script('VBCUSTOMERNOMINATIVE');
38
39 $nowdf = VikBooking::getDateFormat(true);
40 if ($nowdf == "%d/%m/%Y") {
41 $df = 'd/m/Y';
42 } elseif ($nowdf == "%m/%d/%Y") {
43 $df = 'm/d/Y';
44 } else {
45 $df = 'Y/m/d';
46 }
47 $datesep = VikBooking::getDateSeparator(true);
48 $juidf = $nowdf == "%d/%m/%Y" ? 'dd/mm/yy' : ($nowdf == "%m/%d/%Y" ? 'mm/dd/yy' : 'yy/mm/dd');
49
50 $cid = VikRequest::getVar('cid', array());
51 $pcust_id = $app->getUserStateFromRequest("vbo.orders.cust_id", 'cust_id', 0, 'int');
52 $pconfirmnumber = VikRequest::getString('confirmnumber', '', 'request');
53 //Color tags
54 $colortags = VikBooking::loadBookingsColorTags();
55 $bctags_tip = '';
56 if (count($colortags) > 0) {
57 $bctags_tip = '<div class=\"vbo-blist-tip-bctag-subtip-inner\">';
58 foreach ($colortags as $ctagk => $ctagv) {
59 $bctags_tip .= '<div class=\"vbo-blist-tip-bctag-subtip-circle hasTooltip\" data-ctagkey=\"'.$ctagk.'\" data-ctagcolor=\"'.$ctagv['color'].'\" title=\"'.addslashes(JText::translate($ctagv['name'])).'\"><div class=\"vbo-blist-tip-bctag-subtip-circlecont\" style=\"background-color: '.$ctagv['color'].';\"></div></div>';
60 }
61 $bctags_tip .= '</div>';
62 }
63 //
64
65 if (empty($rows)) {
66 $rows = array();
67 ?>
68 <p class="warn"><?php echo JText::translate('VBNOORDERSFOUND'); ?></p>
69 <?php
70 if (defined('ABSPATH') && function_exists('wp_die')) {
71 /**
72 * In case of no bookings found, we check whether bookings can be imported from third party plugins.
73 *
74 * @wponly we do this only on WP.
75 *
76 * @since 1.3.5
77 */
78 $supported_plugins = VikBooking::canImportBookingsFromThirdPartyPlugins();
79 if ($supported_plugins !== false) {
80 $tpp_key = '';
81 foreach ($supported_plugins as $spkey => $spn) {
82 $tpp_key = $spkey;
83 break;
84 }
85 ?>
86 <div class="notice is-dismissible notice-info">
87 <div class="vbo-import-wrap">
88 <p>
89 <span><?php echo JText::sprintf('VBO_IMPBFROM_INTO_VBO', (isset($supported_plugins[$tpp_key]) ? $supported_plugins[$tpp_key] : '')); ?></span>
90 <a class="btn btn-success" href="admin.php?option=com_vikbooking&view=importbftpp"><?php echo JText::translate('VBO_IMPBFTPP_DOIMPORT_SHORT'); ?></a>
91 </p>
92 </div>
93 </div>
94 <?php
95 }
96 }
97 }
98
99 // filter by channel
100 $all_channels = array();
101 $q = "SELECT `channel` FROM `#__vikbooking_orders` WHERE `channel` IS NOT NULL GROUP BY `channel`;";
102 $dbo->setQuery($q);
103 $ord_channels = $dbo->loadAssocList();
104 if ($ord_channels) {
105 foreach ($ord_channels as $o_channel) {
106 $channel_parts = explode('_', $o_channel['channel']);
107 $channel_name = count($channel_parts) > 1 ? trim($channel_parts[1]) : trim($channel_parts[0]);
108 if (in_array($channel_name, $all_channels)) {
109 continue;
110 }
111 $all_channels[] = $channel_name;
112 }
113 }
114
115 // prepare modal
116 echo $vbo_app->getJmodalScript();
117 echo $vbo_app->getJmodalHtml('vbo-export-csv', JText::translate('VBCSVEXPORT'), '', 'width: 80%; height: 60%; margin-left: -40%; top: 20% !important;');
118 echo $vbo_app->getJmodalHtml('vbo-export-ics', JText::translate('VBICSEXPORT'), '', 'width: 80%; height: 60%; margin-left: -40%; top: 20% !important;');
119
120 $filters_set = false;
121
122 ?>
123
124 <script type="text/javascript">
125 function vboClearFilters() {
126 jQuery('#filter-bar, #vbo-search-tools-cont').find('input, select').val('');
127 jQuery('#adminForm').append('<input type=\'hidden\' name=\'limitstart\' value=\'0\' />');
128 document.getElementById('cust_id').value = '';
129 document.adminForm.submit();
130 }
131
132 function vboKeyupSearch(event) {
133 if (event && event.key && event.key == 'Enter') {
134 event.preventDefault();
135 document.adminForm.submit();
136 return;
137 }
138 }
139
140 function vboHandleSearchType(search_hint) {
141 if (!search_hint) {
142 search_hint = '';
143 } else {
144 search_hint += ': ';
145 }
146 jQuery('#confirmnumber').val(search_hint).focus();
147 }
148
149 jQuery(function() {
150 jQuery('.vbo-context-menu-searchtype').vboContextMenu({
151 placement: 'bottom-left',
152 buttons: [
153 {
154 icon: '<?php echo VikBookingIcons::i('search'); ?>',
155 text: Joomla.JText._('VBDASHUPRESONE'),
156 separator: false,
157 action: (root, config) => {
158 vboHandleSearchType('id');
159 },
160 },
161 {
162 icon: '<?php echo VikBookingIcons::i('search'); ?>',
163 text: Joomla.JText._('VBDASHUPRESONE') + ' (' + Joomla.JText._('VBOCHANNEL') + ')',
164 separator: false,
165 action: (root, config) => {
166 vboHandleSearchType('otaid');
167 },
168 },
169 {
170 icon: '<?php echo VikBookingIcons::i('user-tag'); ?>',
171 text: Joomla.JText._('VBCOUPON'),
172 separator: false,
173 action: (root, config) => {
174 vboHandleSearchType('coupon');
175 },
176 },
177 {
178 icon: '<?php echo VikBookingIcons::i('user'); ?>',
179 text: Joomla.JText._('VBCUSTOMERNOMINATIVE'),
180 separator: false,
181 action: (root, config) => {
182 vboHandleSearchType('name');
183 },
184 },
185 ],
186 });
187 });
188 </script>
189
190 <form action="index.php?option=com_vikbooking" method="post" name="adminForm" id="adminForm" class="vbo-allbookings-fm">
191
192 <div id="filter-bar" class="btn-toolbar vbo-btn-toolbar" style="width: 100%; display: inline-block;">
193 <div class="btn-group pull-right">
194 <a href="javascript: void(0);" onclick="vboOpenJModal('vbo-export-csv', 'index.php?option=com_vikbooking&task=csvexportprepare&tmpl=component');" class="vbcsvexport"><?php VikBookingIcons::e('table'); ?> <span><?php echo JText::translate('VBCSVEXPORT'); ?></span></a>
195 <a href="javascript: void(0);" onclick="vboOpenJModal('vbo-export-ics', 'index.php?option=com_vikbooking&task=icsexportprepare&tmpl=component');" class="vbicsexport"><?php VikBookingIcons::e('calendar'); ?> <span><?php echo JText::translate('VBICSEXPORT'); ?></span></a>
196 </div>
197 <div class="btn-group pull-left input-append">
198 <button type="button" class="btn btn-secondary vbo-context-menu-btn vbo-context-menu-searchtype">
199 <span class="vbo-context-menu-ico"><?php VikBookingIcons::e('sort-down'); ?></span>
200 </button>
201 <input type="text" name="confirmnumber" id="confirmnumber" autocomplete="off" placeholder="<?php echo JHtml::fetch('esc_attr', JText::translate('VBOFILTCONFNUMCUST')); ?>" value="<?php echo strlen($pconfirmnumber) ? JHtml::fetch('esc_attr', $pconfirmnumber) : ''; ?>" onkeyup="vboKeyupSearch(event);" size="30" />
202 <button type="submit" class="btn"><i class="icon-search"></i></button>
203 </div>
204 <?php
205 $cust_id_filter = false;
206 if (is_array($rows) && isset($rows[0]) && array_key_exists('customer_fullname', $rows[0])) {
207 //customer ID filter
208 $cust_id_filter = true;
209 }
210 ?>
211 <div class="btn-group pull-left input-append">
212 <a style="display: none;" id="vbo-unset-cust-filter" href="index.php?option=com_vikbooking&task=orders&cust_id=0"></a>
213 <div id="vbo-allbsearchcust-res" class="vbo-allbsearchcust-res" style="display: none;"></div>
214 <input type="text" id="customernominative" autocomplete="off" placeholder="<?php echo JText::translate('VBCUSTOMERNOMINATIVE'); ?>" value="<?php echo $cust_id_filter ? htmlspecialchars($rows[0]['customer_fullname']) : ''; ?>" size="30" />
215 <button type="button" class="btn" onclick="<?php echo $cust_id_filter ? 'document.location.href=jQuery(\'#vbo-unset-cust-filter\').attr(\'href\');' : 'document.getElementById(\'customernominative\').focus();'; ?>"><i class="<?php echo $cust_id_filter ? 'icon-remove' : 'icon-user'; ?>"></i></button>
216 </div>
217 <div class="btn-group pull-left">
218 <button type="button" class="btn" id="vbo-search-tools-btn" onclick="if(jQuery(this).hasClass('btn-primary')){jQuery('#vbo-search-tools-cont').hide();jQuery(this).removeClass('btn-primary');}else{jQuery('#vbo-search-tools-cont').show();jQuery(this).addClass('btn-primary');}"><?php echo JText::translate('JSEARCH_TOOLS'); ?> <span class="caret"></span></button>
219 </div>
220 <div class="btn-group pull-left">
221 <button type="button" class="btn" onclick="vboClearFilters();"><?php echo JText::translate('JSEARCH_FILTER_CLEAR'); ?></button>
222 </div>
223
224 <div id="vbo-search-tools-cont" class="js-stools-container-filters clearfix" style="display: none;">
225 <div class="btn-group pull-left">
226 <select name="channel">
227 <option value=""><?php echo JText::translate('VBCHANNELFILTER'); ?></option>
228 <?php
229 $pchannel = $app->getUserStateFromRequest("vbo.orders.channel", 'channel', '', 'string');
230 if (count($all_channels) > 0) {
231 $filters_set = !empty($pchannel) || $filters_set;
232 ?>
233 <option value="-1"<?php echo $pchannel == '-1' ? ' selected="selected"' : ''; ?>>- <?php echo JText::translate('VBORDFROMSITE'); ?></option>
234 <?php
235 foreach ($all_channels as $o_channel) {
236 ?>
237 <option value="<?php echo $o_channel; ?>"<?php echo $pchannel == $o_channel ? ' selected="selected"' : ''; ?>>- <?php echo ucwords($o_channel); ?></option>
238 <?php
239 }
240 }
241 ?>
242 </select>
243 </div>
244 <div class="btn-group pull-left">
245 <?php
246 $pidroom = $app->getUserStateFromRequest("vbo.orders.idroom", 'idroom', 0, 'int');
247 if (count($allrooms) > 0) {
248 $filters_set = !empty($pidroom) || $filters_set;
249 $rsel = '<select name="idroom"><option value="">'.JText::translate('VBROOMFILTER').'</option>';
250 foreach ($allrooms as $room) {
251 $rsel .= '<option value="'.$room['id'].'"'.(!empty($pidroom) && $pidroom == $room['id'] ? ' selected="selected"' : '').'>'.$room['name'].'</option>';
252 }
253 $rsel .= '</select>';
254 }
255 echo $rsel;
256 ?>
257 </div>
258 <?php
259 $pcategory_id = $app->getUserStateFromRequest("vbo.orders.category_id", 'category_id', 0, 'int');
260 if (count($this->categories)) {
261 $filters_set = !empty($pcategory_id) || $filters_set;
262 ?>
263 <div class="btn-group pull-left">
264 <select name="category_id">
265 <option value=""><?php echo JText::translate('VBOCATEGORYFILTER'); ?></option>
266 <?php
267 foreach ($this->categories as $catid => $catname) {
268 ?>
269 <option value="<?php echo $catid; ?>"<?php echo $catid == $pcategory_id ? ' selected="selected"' : ''; ?>><?php echo $catname; ?></option>
270 <?php
271 }
272 ?>
273 </select>
274 </div>
275 <?php
276 }
277 ?>
278 <div class="btn-group pull-left">
279 <select name="idpayment">
280 <option value=""><?php echo JText::translate('VBOFILTERBYPAYMENT'); ?></option>
281 <?php
282 $pidpayment = $app->getUserStateFromRequest("vbo.orders.idpayment", 'idpayment', 0, 'int');
283 $payment_filter = '';
284 if (!empty($pidpayment)) {
285 $filters_set = !empty($pidpayment) || $filters_set;
286 $payment_filter = '&amp;idpayment='.$pidpayment;
287 }
288 $q = "SELECT `id`,`name` FROM `#__vikbooking_gpayments` ORDER BY `name` ASC;";
289 $dbo->setQuery($q);
290 $allpayments = $dbo->loadAssocList();
291 foreach ($allpayments as $paym) {
292 ?>
293 <option value="<?php echo $paym['id']; ?>"<?php echo $paym['id'] == $pidpayment ? ' selected="selected"' : ''; ?>><?php echo $paym['name']; ?></option>
294 <?php
295 }
296 ?>
297 </select>
298 </div>
299 <div class="btn-group pull-left">
300 <select name="status">
301 <option value=""><?php echo JText::translate('VBOFILTERBYSTATUS'); ?></option>
302 <?php
303 $pstatus = $app->getUserStateFromRequest("vbo.orders.status", 'status', '', 'string');
304 $filters_set = !empty($pstatus) || $filters_set;
305 $status_filter = !empty($pstatus) ? '&amp;status='.$pstatus : '';
306 ?>
307 <optgroup label="<?php echo JText::translate('VBSTATUS'); ?>">
308 <option value="confirmed"<?php echo $pstatus == 'confirmed' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBCONFIRMED'); ?></option>
309 <option value="standby"<?php echo $pstatus == 'standby' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBSTANDBY'); ?></option>
310 <option value="cancelled"<?php echo $pstatus == 'cancelled' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBCANCELLED'); ?></option>
311 <option value="closure"<?php echo $pstatus == 'closure' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBDBTEXTROOMCLOSED'); ?></option>
312 <option value="inquiry"<?php echo $pstatus == 'inquiry' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_BTYPE_INQUIRY'); ?></option>
313 <option value="request"<?php echo $pstatus == 'request' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_BTYPE_REQUEST'); ?></option>
314 <option value="split_stay"<?php echo $pstatus == 'split_stay' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_SPLIT_STAY'); ?></option>
315 </optgroup>
316 <optgroup label="<?php echo JText::translate('VBOCHECKEDSTATUS'); ?>">
317 <option value="checkedin"<?php echo $pstatus == 'checkedin' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSIN'); ?></option>
318 <option value="checkedout"<?php echo $pstatus == 'checkedout' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSOUT'); ?></option>
319 <option value="noshow"<?php echo $pstatus == 'noshow' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSNOS'); ?></option>
320 <option value="none"<?php echo $pstatus == 'none' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBOCHECKEDSTATUSZERO'); ?></option>
321 </optgroup>
322 </select>
323 </div>
324 <div class="btn-group pull-left">
325 <?php
326 $dates_filter = '';
327 $pdatefilt = $app->getUserStateFromRequest("vbo.orders.datefilt", 'datefilt', 0, 'int');
328 $pdatefiltfrom = $app->getUserStateFromRequest("vbo.orders.datefiltfrom", 'datefiltfrom', '', 'string');
329 $pdatefiltto = $app->getUserStateFromRequest("vbo.orders.datefiltto", 'datefiltto', '', 'string');
330 if (!empty($pdatefilt) && (!empty($pdatefiltfrom) || !empty($pdatefiltto))) {
331 $filters_set = true;
332 $dates_filter = '&amp;datefilt='.$pdatefilt.(!empty($pdatefiltfrom) ? '&amp;datefiltfrom='.$pdatefiltfrom : '').(!empty($pdatefiltto) ? '&amp;datefiltto='.$pdatefiltto : '');
333 }
334 $datesel = '<select name="datefilt" onchange="vboToggleDateFilt(this.value);"><option value="">'.JText::translate('VBOFILTERBYDATES').'</option>';
335 $datesel .= '<option value="1"'.(!empty($pdatefilt) && $pdatefilt == 1 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEBOOK').'</option>';
336 $datesel .= '<option value="2"'.(!empty($pdatefilt) && $pdatefilt == 2 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEIN').'</option>';
337 $datesel .= '<option value="3"'.(!empty($pdatefilt) && $pdatefilt == 3 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEOUT').'</option>';
338 $datesel .= '</select>';
339 echo $datesel;
340 ?>
341 </div>
342 <div class="btn-group pull-left" id="vbo-dates-cont" style="display: <?php echo (!empty($pdatefilt) && (!empty($pdatefiltfrom) || !empty($pdatefiltto)) ? 'inline-block' : 'none'); ?>;">
343 <input type="text" id="vbo-date-from" placeholder="<?php echo JText::translate('VBNEWSEASONONE'); ?>" value="<?php echo $pdatefiltfrom; ?>" size="10" name="datefiltfrom" autocomplete="off" />&nbsp;-&nbsp;<input type="text" id="vbo-date-to" placeholder="<?php echo JText::translate('VBNEWSEASONTWO'); ?>" value="<?php echo $pdatefiltto; ?>" size="10" name="datefiltto" autocomplete="off" />
344 </div>
345 <div class="btn-group pull-left">
346 <button type="submit" class="btn"><i class="icon-search"></i> <?php echo JText::translate('VBPVIEWORDERSSEARCHSUBM'); ?></button>
347 </div>
348 </div>
349 </div>
350
351 <div class="table-responsive">
352 <table cellpadding="4" cellspacing="0" border="0" width="100%" class="table table-striped vbo-bookingslist-table">
353 <thead>
354 <tr>
355 <th width="20">
356 <input type="checkbox" onclick="Joomla.checkAll(this)" value="" name="checkall-toggle">
357 </th>
358 <th class="title center" width="20" align="center">
359 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=id&amp;vbordersort=<?php echo ($orderby == "id" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "id" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "id" ? "vbo-bookingslist-activesort" : "")); ?>">
360 <?php echo 'ID'.($orderby == "id" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "id" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
361 </a>
362 </th>
363 <th class="title left" width="110">
364 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=ts&amp;vbordersort=<?php echo ($orderby == "ts" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "ts" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "ts" ? "vbo-bookingslist-activesort" : "")); ?>">
365 <?php echo JText::translate('VBPVIEWORDERSONE').($orderby == "ts" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "ts" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
366 </a>
367 </th>
368 <th class="title left" width="200"><span><?php echo JText::translate('VBPVIEWORDERSTWO'); ?></span></th>
369 <th class="title center" width="100" align="center"><span><?php echo JText::translate('VBPVIEWORDERSTHREE'); ?></span></th>
370 <th class="title left" width="120"><span><?php echo JText::translate('VBPVIEWORDERSPEOPLE'); ?></span></th>
371 <th class="title left" width="110">
372 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=checkin&amp;vbordersort=<?php echo ($orderby == "checkin" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "checkin" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "checkin" ? "vbo-bookingslist-activesort" : "")); ?>">
373 <?php echo JText::translate('VBPVIEWORDERSFOUR').($orderby == "checkin" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "checkin" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
374 </a>
375 </th>
376 <th class="title left" width="110">
377 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=checkout&amp;vbordersort=<?php echo ($orderby == "checkout" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "checkout" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "checkout" ? "vbo-bookingslist-activesort" : "")); ?>">
378 <?php echo JText::translate('VBPVIEWORDERSFIVE').($orderby == "checkout" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "checkout" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
379 </a>
380 </th>
381 <th class="title center" width="60" align="center">
382 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=days&amp;vbordersort=<?php echo ($orderby == "days" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "days" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "days" ? "vbo-bookingslist-activesort" : "")); ?>">
383 <?php echo JText::translate('VBPVIEWORDERSSIX').($orderby == "days" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "days" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
384 </a>
385 </th>
386 <th class="title center" width="110" align="center">
387 <a href="index.php?option=com_vikbooking&amp;task=orders<?php echo ($cust_id_filter ? '&amp;cust_id='.$pcust_id : '').$dates_filter.$status_filter.$payment_filter; ?>&amp;vborderby=total&amp;vbordersort=<?php echo ($orderby == "total" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "total" && $ordersort == "ASC" ? "vbo-bookingslist-activesort" : ($orderby == "total" ? "vbo-bookingslist-activesort" : "")); ?>">
388 <?php echo JText::translate('VBPVIEWORDERSSEVEN').($orderby == "total" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "total" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
389 </a>
390 </th>
391 <th class="title center" width="30" align="center"><span>&nbsp;</span></th>
392 <th class="title center" width="50" align="center"><span>&nbsp;</span></th>
393 <th class="title center" width="100" align="center"><span><?php echo JText::translate('VBPVIEWORDERSEIGHT'); ?></span></th>
394 <th class="title center" width="100" align="center"><span><?php echo JText::translate('VBPVIEWORDERCHANNEL'); ?></span></th>
395 </tr>
396 </thead>
397 <?php
398 $currencysymb = VikBooking::getCurrencySymb(true);
399 $monsmap = array(
400 JText::translate('VBSHORTMONTHONE'),
401 JText::translate('VBSHORTMONTHTWO'),
402 JText::translate('VBSHORTMONTHTHREE'),
403 JText::translate('VBSHORTMONTHFOUR'),
404 JText::translate('VBSHORTMONTHFIVE'),
405 JText::translate('VBSHORTMONTHSIX'),
406 JText::translate('VBSHORTMONTHSEVEN'),
407 JText::translate('VBSHORTMONTHEIGHT'),
408 JText::translate('VBSHORTMONTHNINE'),
409 JText::translate('VBSHORTMONTHTEN'),
410 JText::translate('VBSHORTMONTHELEVEN'),
411 JText::translate('VBSHORTMONTHTWELVE')
412 );
413 $vcm_logos = VikBooking::getVcmChannelsLogo('', true);
414 $kk = 0;
415 $i = 0;
416 for ($i = 0, $n = count($rows); $i < $n; $i++) {
417 $row = $rows[$i];
418 if (!$row['closure']) {
419 array_push($vcm_bids, $row['id']);
420 }
421 $rooms = VikBooking::loadOrdersRoomsData($row['id']);
422 $peoplestr = '';
423 $guest_nums = [];
424 $room_names = array();
425 if (is_array($rooms)) {
426 $totadults = 0;
427 $totchildren = 0;
428 $totpets = 0;
429 foreach ($rooms as $rr) {
430 $totadults += $rr['adults'];
431 $totchildren += $rr['children'];
432 $totpets += $rr['pets'];
433 $room_names[] = $rr['room_name'];
434 if ($row['split_stay']) {
435 // do not sum the guests in case of split stay rooms
436 $totadults = $rr['adults'];
437 $totchildren = $rr['children'];
438 }
439 }
440 $guest_nums[] = $totadults . " " . ($totadults > 1 ? JText::translate('VBMAILADULTS') : JText::translate('VBMAILADULT'));
441 if ($totchildren > 0) {
442 $guest_nums[] = $totchildren . " " . ($totchildren > 1 ? JText::translate('VBMAILCHILDREN') : JText::translate('VBMAILCHILD'));
443 }
444 if ($totpets > 0) {
445 $guest_nums[] = $totpets . " " . ($totpets > 1 ? JText::translate('VBO_PETS') : JText::translate('VBO_PET'));
446 }
447 $peoplestr = implode(', ', $guest_nums);
448 }
449 $isdue = $row['total'];
450 $otachannel = '';
451 $otacurrency = '';
452 if (!empty($row['channel'])) {
453 $channelparts = explode('_', $row['channel']);
454 $otachannel = array_key_exists(1, $channelparts) && strlen($channelparts[1]) > 0 ? $channelparts[1] : ucwords($channelparts[0]);
455 $otachannelclass = $otachannel;
456 if (strstr($otachannelclass, '.') !== false) {
457 $otaccparts = explode('.', $otachannelclass);
458 $otachannelclass = $otaccparts[0];
459 }
460 $otacurrency = strlen($row['chcurrency']) > 0 ? $row['chcurrency'] : '';
461 }
462 //Customer Details
463 $custdata = $row['custdata'];
464 $custdata_parts = explode("\n", $row['custdata']);
465 if (count($custdata_parts) > 2 && strpos($custdata_parts[0], ':') !== false && strpos($custdata_parts[1], ':') !== false) {
466 //get the first two fields
467 $custvalues = array();
468 foreach ($custdata_parts as $custdet) {
469 if (strlen($custdet) < 1) {
470 continue;
471 }
472 $custdet_parts = explode(':', $custdet);
473 if (count($custdet_parts) >= 2) {
474 unset($custdet_parts[0]);
475 array_push($custvalues, trim(implode(':', $custdet_parts)));
476 }
477 if (count($custvalues) > 1) {
478 break;
479 }
480 }
481 if (count($custvalues) > 1) {
482 $custdata = implode(' ', $custvalues);
483 }
484 }
485 if (strlen($custdata) > 45) {
486 $custdata = substr($custdata, 0, 45)." ...";
487 }
488
489 // customer profile picture
490 $customer_avatar = null;
491
492 $q = "SELECT `c`.*,`co`.`idorder` FROM `#__vikbooking_customers` AS `c` LEFT JOIN `#__vikbooking_customers_orders` `co` ON `c`.`id`=`co`.`idcustomer` WHERE `co`.`idorder`=".$row['id'];
493 $dbo->setQuery($q, 0, 1);
494 $cust_country = $dbo->loadAssoc();
495 if ($cust_country) {
496 if (!empty($cust_country['first_name'])) {
497 $custdata = $cust_country['first_name'].' '.$cust_country['last_name'];
498 if (!empty($cust_country['country'])) {
499 if (file_exists(VBO_ADMIN_PATH.DS.'resources'.DS.'countries'.DS.$cust_country['country'].'.png')) {
500 $custdata .= '<img src="'.VBO_ADMIN_URI.'resources/countries/'.$cust_country['country'].'.png'.'" title="'.$cust_country['country'].'" class="vbo-country-flag vbo-country-flag-left"/>';
501 }
502 }
503 }
504 if (!empty($cust_country['pic'])) {
505 $customer_avatar = $cust_country['pic'];
506 }
507 }
508 $custdata = $row['closure'] > 0 || JText::translate('VBDBTEXTROOMCLOSED') == $row['custdata'] ? '<span class="vbordersroomclosed"><i class="'.VikBookingIcons::i('ban').'"></i> '.JText::translate('VBDBTEXTROOMCLOSED').'</span>' : $custdata;
509
510 if ($row['status'] == "confirmed") {
511 //$saystaus = "<span style=\"color: #4ca25a; font-weight: bold;\">".JText::translate('VBCONFIRMED')."</span>";
512 $saystaus = '<span class="label label-success vbo-status-label">'.JText::translate('VBCONFIRMED').'</span>';
513 } elseif ($row['status'] == "standby") {
514 //$saystaus = "<span style=\"color: #e0a504; font-weight: bold;\">".JText::translate('VBSTANDBY')."</span>";
515 $status_type = !empty($row['type']) ? JText::translate('VBO_BTYPE_' . strtoupper($row['type'])) : JText::translate('VBSTANDBY');
516 $saystaus = '<span class="label label-warning vbo-status-label">' . $status_type . '</span>';
517 } else {
518 //$saystaus = "<span class=\"vbordcancelled\">".JText::translate('VBCANCELLED')."</span>";
519 $saystaus = '<span class="label label-error vbo-status-label" style="background-color: #d9534f;">'.JText::translate('VBCANCELLED').'</span>';
520 }
521 $ts_info = getdate($row['ts']);
522 $ts_wday = JText::translate('VB'.strtoupper(substr($ts_info['weekday'], 0, 3)));
523 $checkin_info = getdate($row['checkin']);
524 $checkin_wday = JText::translate('VB'.strtoupper(substr($checkin_info['weekday'], 0, 3)));
525 $checkout_info = getdate($row['checkout']);
526 $checkout_wday = JText::translate('VB'.strtoupper(substr($checkout_info['weekday'], 0, 3)));
527 ?>
528
529 <tr class="row<?php echo $kk; ?>">
530 <td class="skip">
531 <input type="checkbox" id="cb<?php echo $i;?>" name="cid[]" value="<?php echo $row['id']; ?>" onclick="Joomla.isChecked(this.checked);">
532 </td>
533 <td class="center">
534 <a class="vbo-bookingid" href="index.php?option=com_vikbooking&amp;task=editorder&amp;cid[]=<?php echo $row['id']; ?>"><?php echo $row['id']; ?></a>
535 </td>
536 <td>
537 <a class="vbo-bookingslist-viewdet-link" href="index.php?option=com_vikbooking&amp;task=editorder&amp;cid[]=<?php echo $row['id']; ?>">
538 <div class="vbo-bookingslist-viewdet">
539 <div class="vbo-bookingslist-viewdet-open">
540 <?php VikBookingIcons::e('external-link'); ?>
541 </div>
542 <div class="vbo-bookingslist-viewdet-fulldate">
543 <div class="vbo-bookingslist-viewdet-date">
544 <?php
545 if (strpos($df, 'd') < strpos($df, 'm')) {
546 //assuming d/m/Y or similar
547 ?>
548 <span><?php echo $ts_info['mday']; ?></span>
549 <span><?php echo $monsmap[($ts_info['mon'] - 1)]; ?></span>
550 <?php
551 } else {
552 //assuming m/d/Y or similar
553 ?>
554 <span><?php echo $monsmap[($ts_info['mon'] - 1)]; ?></span>
555 <span><?php echo $ts_info['mday']; ?></span>
556 <?php
557 }
558 ?>
559 <span><?php echo $ts_info['year']; ?></span>
560 </div>
561 <div class="vbo-bookingslist-viewdet-time">
562 <span class="vbo-bookingslist-viewdet-wday"><?php echo $ts_wday; ?></span>
563 <span class="vbo-bookingslist-viewdet-hour"><?php echo date('H:i', $row['ts']); ?></span>
564 </div>
565 </div>
566 </div>
567 </a>
568 </td>
569 <td>
570 <?php
571 if (!empty($customer_avatar)) {
572 // build caption name
573 $avatar_caption = '';
574 if (isset($cust_country) && !empty($cust_country) && !empty($cust_country['first_name'])) {
575 $avatar_caption = $cust_country['first_name'] . ' ' . $cust_country['last_name'];
576 }
577 ?>
578 <div class="vbo-customer-info-box">
579 <div class="vbo-customer-info-box-name">
580 <?php echo $custdata; ?>
581 </div>
582 <div class="vbo-customer-info-box-avatar vbo-customer-avatar-small">
583 <span>
584 <img src="<?php echo strpos($customer_avatar, 'http') === 0 ? $customer_avatar : VBO_SITE_URI . 'resources/uploads/' . $customer_avatar; ?>" data-caption="<?php echo htmlspecialchars($avatar_caption); ?>" />
585 </span>
586 </div>
587 </div>
588 <?php
589 } else {
590 echo $custdata;
591 }
592 ?>
593 <span class="vbo-orders-review-link" style="display: none;" title="<?php echo addslashes(JText::translate('VBOSEEGUESTREVIEW')); ?>" data-bid="<?php echo $row['id']; ?>"></span>
594 </td>
595 <td class="center">
596 <?php
597 if (count($room_names) > 1) {
598 if ($row['split_stay']) {
599 ?>
600 <div class="vbo-booking-with-splitstay">
601 <span class="hasTooltip vbo-tip-small vbo-room-sharedcalendar vbo-booking-has-splitstay" title="<?php echo JHtml::fetch('esc_attr', JText::translate('VBO_SPLIT_STAY')); ?>"><?php VikBookingIcons::e('random'); ?></span>
602 <span class="hasTooltip vbo-tip-small vbo-bookingslist-numrooms" title="<?php echo implode(', ', $room_names); ?>"><?php echo $row['roomsnum']; ?></span>
603 </div>
604 <?php
605 } else {
606 ?>
607 <span class="hasTooltip vbo-tip-small vbo-bookingslist-numrooms" title="<?php echo implode(', ', $room_names); ?>"><?php echo $row['roomsnum']; ?></span>
608 <?php
609 }
610 } else {
611 ?>
612 <span class="vbo-bookingslist-roomname"><?php echo $row['roomsnum'] == 1 && count($room_names) > 0 ? $room_names[0] : $row['roomsnum']; ?></span>
613 <?php
614 $room_number = '';
615 if ($rooms && !empty($rooms[0]) && !empty($rooms[0]['roomindex']) && !empty($rooms[0]['params'])) {
616 // print the room number when it's just one room booked
617 $room_params = json_decode($rooms[0]['params'], true);
618 if (is_array($room_params) && !empty($room_params['features']) && is_array($room_params['features'])) {
619 // parse distinctive features
620 foreach ($room_params['features'] as $rind => $rfeatures) {
621 if ($rind != $rooms[0]['roomindex']) {
622 continue;
623 }
624 foreach ($rfeatures as $fname => $fval) {
625 if (strlen($fval)) {
626 $room_number = '#' . $fval;
627 break 2;
628 }
629 }
630 }
631 }
632 }
633 if ($room_number) {
634 ?>
635 <span class="vbo-bookingslist-roomunit"><?php echo $room_number; ?></span>
636 <?php
637 }
638 }
639 ?>
640 </td>
641 <td>
642 <?php echo $peoplestr; ?>
643 </td>
644 <td>
645 <div class="vbo-bookingslist-booktime vbo-bookingslist-booktime-checkin">
646 <div class="vbo-bookingslist-booktime-fulldate">
647 <div class="vbo-bookingslist-booktime-date">
648 <span><?php echo date(str_replace("/", $datesep, $df), $row['checkin']); ?></span>
649 </div>
650 <div class="vbo-bookingslist-booktime-time">
651 <span class="vbo-bookingslist-booktime-twrap">
652 <span class="vbo-bookingslist-booktime-wday"><?php echo $checkin_wday; ?></span>
653 <span class="vbo-bookingslist-booktime-hour"><?php echo date('H:i', $row['checkin']); ?></span>
654 </span>
655 <?php
656 if ($row['checked'] == 1) {
657 //checked in
658 ?>
659 <span class="vbo-bookingslist-booktime-checkedin"><i class="<?php echo VikBookingIcons::i('circle', 'hasTooltip'); ?>" title="<?php echo JText::translate('VBOCHECKEDSTATUSIN'); ?>"></i></span>
660 <?php
661 } elseif ($row['checked'] < 0) {
662 //no show
663 ?>
664 <span class="vbo-bookingslist-booktime-noshow"><i class="<?php echo VikBookingIcons::i('circle', 'hasTooltip'); ?>" title="<?php echo JText::translate('VBOCHECKEDSTATUSNOS'); ?>"></i></span>
665 <?php
666 }
667 ?>
668 </div>
669 </div>
670 </div>
671 </td>
672 <td>
673 <div class="vbo-bookingslist-booktime vbo-bookingslist-booktime-checkin">
674 <div class="vbo-bookingslist-booktime-fulldate">
675 <div class="vbo-bookingslist-booktime-date">
676 <span><?php echo date(str_replace("/", $datesep, $df), $row['checkout']); ?></span>
677 </div>
678 <div class="vbo-bookingslist-booktime-time">
679 <span class="vbo-bookingslist-booktime-twrap">
680 <span class="vbo-bookingslist-booktime-wday"><?php echo $checkout_wday; ?></span>
681 <span class="vbo-bookingslist-booktime-hour"><?php echo date('H:i', $row['checkout']); ?></span>
682 </span>
683 <?php
684 if ($row['checked'] == 2) {
685 //checked out
686 ?>
687 <span class="vbo-bookingslist-booktime-checkedout"><i class="<?php echo VikBookingIcons::i('circle', 'hasTooltip'); ?>" title="<?php echo JText::translate('VBOCHECKEDSTATUSOUT'); ?>"></i></span>
688 <?php
689 }
690 ?>
691 </div>
692 </div>
693 </div>
694 </td>
695 <td class="center">
696 <span class="vbo-bookingslist-numnights"><?php echo $row['days']; ?></span>
697 </td>
698 <td class="center">
699 <div class="vbo-bookingslist-total-wrap">
700 <div class="vbo-bookingslist-total-amount">
701 <span><?php echo strlen($otacurrency) > 0 ? $otacurrency : $currencysymb; ?></span>
702 <span><?php echo VikBooking::numberFormat($isdue); ?></span>
703 </div>
704 <?php
705 if (!is_null($row['totpaid'])) {
706 ?>
707 <div class="vbo-bookingslist-total-totpaid">
708 <span><?php echo $currencysymb; ?></span>
709 <span><?php echo VikBooking::numberFormat($row['totpaid']); ?></span>
710 <?php
711 if ($row['refund'] > 0) {
712 ?>
713 <span class="vbo-bookingslist-total-refunded">
714 <span><?php echo $currencysymb; ?></span>
715 <span><?php echo VikBooking::numberFormat($row['refund']); ?></span>
716 </span>
717 <?php
718 }
719 ?>
720 </div>
721 <?php
722 } elseif ($row['refund'] > 0) {
723 ?>
724 <div class="vbo-bookingslist-total-totpaid">
725 <span class="vbo-bookingslist-total-refunded">
726 <span><?php echo $currencysymb; ?></span>
727 <span><?php echo VikBooking::numberFormat($row['refund']); ?></span>
728 </span>
729 </div>
730 <?php
731 }
732 ?>
733 </div>
734 </td>
735 <td class="center">
736 <?php
737 $bcolortag = VikBooking::applyBookingColorTag($row, $colortags);
738 if (count($bcolortag) > 0) {
739 $bcolortag['name'] = JText::translate($bcolortag['name']);
740 ?>
741 <div class="vbo-colortag-circle hasTooltip" style="background-color: <?php echo $bcolortag['color']; ?>;" title="<?php echo $bcolortag['name']; ?>" data-ctagcolor="<?php echo $bcolortag['color']; ?>" data-bid="<?php echo $row['id']; ?>"></div>
742 <?php
743 }
744 ?>
745 </td>
746 <td class="center">
747 <?php
748 if (!empty($row['adminnotes'])) {
749 ?>
750 <span class="vbo-admin-tipsicon vbo-admin-notes-icn" data-bid="<?php echo $row['id']; ?>"><?php VikBookingIcons::e('sticky-note'); ?></span>&nbsp;
751 <div class="vbo-order-admin-notes-cnt" data-bid="<?php echo $row['id']; ?>" style="display: none;"><?php echo nl2br($row['adminnotes']); ?></div>
752 <?php
753 }
754 $invoice_path = implode(DIRECTORY_SEPARATOR, [VBO_SITE_PATH, 'helpers', 'invoices', 'generated', "{$row['id']}_{$row['sid']}.pdf"]);
755 echo (is_file($invoice_path) ? '<a class="hasTooltip vbo-admin-invoiceicon" href="'.VBO_SITE_URI.'helpers/invoices/generated/'.$row['id'].'_'.$row['sid'].'.pdf" target="_blank" title="' . htmlspecialchars(JText::translate('VBOINVDOWNLOAD')) . '"><i class="' . VikBookingIcons::i('invoice') . '"></i></a>' : '');
756 ?>
757 <span class="vbo-bookings-guestmessages-bubble-cont vbo-admin-tipsicon" style="display: none;" data-bid="<?php echo $row['id']; ?>">
758 <a href="index.php?option=com_vikbooking&task=editorder&cid[]=<?php echo $row['id']; ?>#messaging">
759 <i class="<?php echo VikBookingIcons::i('commenting'); ?>" data-message-count="0"></i>
760 </a>
761 </span>
762 </td>
763 <td class="center">
764 <?php echo $saystaus; ?>
765 </td>
766 <td class="center">
767 <?php
768 if (!empty($row['channel'])) {
769 //VBO 1.10: use of strtolower($otachannelclass) next to the class 'vbotasp' is deprecated. Fetch the OTA logo from VCM
770 $ota_logo_img = is_object($vcm_logos) ? $vcm_logos->setProvenience($otachannel, $row['channel'])->getLogoURL() : false;
771 if ($ota_logo_img !== false) {
772 ?>
773 <img src="<?php echo $ota_logo_img; ?>" class="vbo-channelimg-medium"/>
774 <?php
775 } else {
776 ?>
777 <span class="vbo-provenience"><?php echo $otachannel; ?></span>
778 <?php
779 }
780 } else {
781 ?>
782 <span class="vbo-provenience"><?php echo JText::translate('VBORDFROMSITE'); ?></span>
783 <?php
784 }
785 ?>
786 </td>
787 </tr>
788 <?php
789 $kk = 1 - $kk;
790
791 }
792 ?>
793
794 </table>
795 </div>
796 <input type="hidden" name="option" value="com_vikbooking" />
797 <input type="hidden" name="cust_id" id="cust_id" value="<?php echo !empty($pcust_id) ? $pcust_id : ''; ?>" />
798 <input type="hidden" name="task" value="orders" />
799 <input type="hidden" name="boxchecked" value="0" />
800 <?php echo JHtml::fetch('form.token'); ?>
801 <?php echo $navbut; ?>
802 </form>
803
804 <a style="display: none;" id="vcm-review-details-base" href="index.php?option=com_vikchannelmanager&task=reviews&revid="></a>
805
806 <script type="text/javascript">
807 if (jQuery.isFunction(jQuery.fn.tooltip)) {
808 jQuery(".hasTooltip").tooltip();
809 } else {
810 jQuery.fn.tooltip = function(){};
811 }
812 function vboToggleDateFilt(dtype) {
813 if (!(dtype.length > 0)) {
814 document.getElementById('vbo-dates-cont').style.display = 'none';
815 document.getElementById('vbo-date-from').value = '';
816 document.getElementById('vbo-date-to').value = '';
817 return true;
818 }
819 document.getElementById('vbo-dates-cont').style.display = 'inline-block';
820 return true;
821 }
822 var bctags_tip = "<?php echo $bctags_tip; ?>";
823 var applying_tag = false;
824 var bctags_tip_on = false;
825
826 jQuery(function() {
827
828 jQuery(document.body).on('click', '.vbo-colortag-circle', function() {
829 if (!jQuery(this).parent().find(".vbo-blist-tip-bctag-subtip").length) {
830 jQuery(".vbo-blist-tip-bctag-subtip").remove();
831 var cur_color = jQuery(this).attr("data-ctagcolor");
832 var cur_bid = jQuery(this).attr("data-bid");
833 jQuery(this).after("<div class=\"vbo-blist-tip-bctag-subtip\">"+bctags_tip+"</div>");
834 jQuery(this).parent().find(".vbo-blist-tip-bctag-subtip").find(".vbo-blist-tip-bctag-subtip-circle[data-ctagcolor='"+cur_color+"']").addClass("vbo-blist-tip-bctag-activecircle").css('border-color', cur_color);
835 jQuery(this).parent().find(".vbo-blist-tip-bctag-subtip").find(".vbo-blist-tip-bctag-subtip-circle").attr('data-bid', cur_bid);
836 jQuery(".vbo-blist-tip-bctag-subtip .hasTooltip").tooltip();
837 bctags_tip_on = true;
838 } else {
839 jQuery(".vbo-blist-tip-bctag-subtip").remove();
840 bctags_tip_on = false;
841 }
842 });
843
844 jQuery(document.body).on('click', '.vbo-blist-tip-bctag-subtip-circle', function() {
845 if (applying_tag === true) {
846 return false;
847 }
848 applying_tag = true;
849 var clickelem = jQuery(this);
850 var ctagkey = clickelem.attr('data-ctagkey');
851 var bid = clickelem.attr('data-bid');
852 //set opacity to circles as loading
853 jQuery('.vbo-blist-tip-bctag-subtip-circle').css('opacity', '0.6');
854 //
855 var jqxhr = jQuery.ajax({
856 type: "POST",
857 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=setbookingtag'); ?>",
858 data: {
859 tmpl: "component",
860 idorder: bid,
861 tagkey: ctagkey
862 }
863 }).done(function(res) {
864 applying_tag = false;
865 if (res.indexOf('e4j.error') >= 0 ) {
866 console.log(res);
867 alert(res.replace("e4j.error.", ""));
868 //restore loading opacity in circles
869 jQuery('.vbo-blist-tip-bctag-subtip-circle').css('opacity', '1');
870 } else {
871 var obj_res = JSON.parse(res);
872 jQuery(clickelem).closest(".vbo-blist-tip-bctag-subtip").parent().find(".vbo-colortag-circle").css("background-color", obj_res.color).attr('data-ctagcolor', obj_res.color).attr('data-original-title', obj_res.name);
873 jQuery(".vbo-blist-tip-bctag-subtip").remove();
874 bctags_tip_on = false;
875 }
876 }).fail(function() {
877 applying_tag = false;
878 alert("Request Failed");
879 //restore loading opacity in circles
880 jQuery('.vbo-blist-tip-bctag-subtip-circle').css('opacity', '1');
881 });
882 });
883
884 jQuery('.vbo-bookingslist-viewdet-link').click(function(e) {
885 if (e && e.target.tagName.toUpperCase() == 'I') {
886 //open the link in a new window
887 e.preventDefault();
888 window.open(jQuery(this).attr('href'), '_blank');
889 }
890 });
891
892 jQuery('#vbo-date-from').datepicker({
893 showOn: 'focus',
894 dateFormat: '<?php echo $juidf; ?>',
895 onSelect: function( selectedDate ) {
896 jQuery('#vbo-date-to').datepicker('option', 'minDate', selectedDate);
897 }
898 });
899
900 jQuery('#vbo-date-to').datepicker({
901 showOn: 'focus',
902 dateFormat: '<?php echo $juidf; ?>',
903 onSelect: function( selectedDate ) {
904 jQuery('#vbo-date-from').datepicker('option', 'maxDate', selectedDate);
905 }
906 });
907
908 //Search customer - Start
909 var vbocustsdelay = (function() {
910 var timer = 0;
911 return function(callback, ms) {
912 clearTimeout (timer);
913 timer = setTimeout(callback, ms);
914 };
915 })();
916
917 function vboCustomerSearch(words) {
918 jQuery("#vbo-allbsearchcust-res").hide().html("");
919 jQuery("#customernominative").addClass('vbo-allbsearchcust-loading-inp');
920 var jqxhr = jQuery.ajax({
921 type: "POST",
922 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=searchcustomer'); ?>",
923 data: {
924 kw: words,
925 nopin: 1,
926 tmpl: "component"
927 }
928 }).done(function(cont) {
929 if (cont) {
930 var obj_res = typeof cont === 'string' ? JSON.parse(cont) : cont;
931 jQuery("#vbo-allbsearchcust-res").html(obj_res[1]);
932 } else {
933 jQuery("#vbo-allbsearchcust-res").html("");
934 }
935 jQuery("#vbo-allbsearchcust-res").show();
936 jQuery("#customernominative").removeClass('vbo-allbsearchcust-loading-inp');
937 }).fail(function() {
938 jQuery("#customernominative").removeClass('vbo-allbsearchcust-loading-inp');
939 alert("Error Searching.");
940 });
941 }
942
943 jQuery("#customernominative").keyup(function(event) {
944 vbocustsdelay(function() {
945 var keywords = jQuery("#customernominative").val();
946 if (keywords.length > 1) {
947 if ((event.which > 96 && event.which < 123) || (event.which > 64 && event.which < 91) || event.which == 13) {
948 vboCustomerSearch(keywords);
949 }
950 } else {
951 if (jQuery("#vbo-allbsearchcust-res").is(":visible")) {
952 jQuery("#vbo-allbsearchcust-res").hide();
953 }
954 }
955 }, 600);
956 });
957
958 jQuery(document).on('click', '.vbo-custsearchres-entry', function() {
959 var customer_id = jQuery(this).attr('data-custid');
960 if (customer_id.length) {
961 document.location.href = 'index.php?option=com_vikbooking&task=orders&cust_id='+customer_id;
962 }
963 });
964 //Search customer - End
965
966 jQuery(document).keydown(function(e) {
967 if ( e.keyCode == 27 && bctags_tip_on === true ) {
968 jQuery(".vbo-blist-tip-bctag-subtip").remove();
969 bctags_tip_on = false;
970 }
971 if (e.keyCode == 13) {
972 //prevent form-submit by hitting enter
973 e.preventDefault();
974 return false;
975 }
976 });
977
978 jQuery(document).mouseup(function(e) {
979 if (!bctags_tip_on) {
980 return false;
981 }
982 if (jQuery(".vbo-blist-tip-bctag-subtip").length) {
983 var vbo_overlay_subtip_cont = jQuery(".vbo-blist-tip-bctag-subtip-inner");
984 if (!vbo_overlay_subtip_cont.is(e.target) && vbo_overlay_subtip_cont.has(e.target).length === 0) {
985 jQuery(".vbo-blist-tip-bctag-subtip").remove();
986 bctags_tip_on = false;
987 return true;
988 }
989 }
990 });
991
992 jQuery(".vbo-bookingslist-table tr td").not(".skip").click(function() {
993 //the checkbox for the booking is on the first TD of the row
994 var trcbox = jQuery(this).parent("tr").find("td").first().find("input[type='checkbox']");
995 if (!trcbox || !trcbox.length) {
996 return;
997 }
998 trcbox.prop('checked', !(trcbox.prop('checked')));
999 if (typeof Joomla !== 'undefined' && Joomla != null) {
1000 Joomla.isChecked(trcbox.prop('checked'));
1001 }
1002 });
1003
1004 jQuery(".vbo-bookingslist-table tr").dblclick(function() {
1005 if (document.selection && document.selection.empty) {
1006 document.selection.empty();
1007 } else if (window.getSelection) {
1008 var sel = window.getSelection();
1009 sel.removeAllRanges();
1010 }
1011 //the link to the booking details page is on the third TD of the row
1012 var olink = jQuery(this).find("td").first().next().next().find("a");
1013 if (!olink || !olink.length) {
1014 return;
1015 }
1016 document.location.href = olink.attr("href");
1017 });
1018
1019 <?php
1020 if ($filters_set) {
1021 ?>
1022 jQuery("#vbo-search-tools-btn").trigger("click");
1023 <?php
1024 }
1025 ?>
1026
1027 vcmCountGuestMessages();
1028
1029 setInterval(function() {
1030 vcmCountGuestMessages();
1031 }, 15000);
1032
1033 // load guest reviews
1034 jQuery.ajax({
1035 type: "POST",
1036 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=bookings_have_reviews'); ?>",
1037 data: {
1038 tmpl: "component",
1039 bids: <?php echo json_encode($vcm_bids); ?>
1040 }
1041 }).done(function(res) {
1042 try {
1043 var obj = JSON.parse(res);
1044 var base_link = jQuery('#vcm-review-details-base').attr('href');
1045 for (var bid in obj) {
1046 if (!obj.hasOwnProperty(bid)) {
1047 continue;
1048 }
1049 jQuery('.vbo-orders-review-link[data-bid="' + bid + '"]').html('<a href="' + base_link + obj[bid] + '" target="_blank"><?php VikBookingIcons::e('star'); ?></a>').fadeIn();
1050 }
1051 }
1052 catch(err) {
1053 console.error(err);
1054 }
1055 }).fail(function() {
1056 console.log('request failed for loading booking reviews');
1057 });
1058
1059 // zoom-able avatars
1060 jQuery('.vbo-customer-info-box-avatar').each(function() {
1061 var img = jQuery(this).find('img');
1062 if (!img.length) {
1063 return;
1064 }
1065 // register click listener
1066 img.on('click', function(e) {
1067 // stop events propagation
1068 e.preventDefault();
1069 e.stopPropagation();
1070
1071 // check for caption
1072 var caption = jQuery(this).attr('data-caption');
1073
1074 // build modal content
1075 var zoom_modal = jQuery('<div></div>').addClass('vbo-modal-overlay-block vbo-modal-overlay-zoom-image').css('display', 'block');
1076 var zoom_dismiss = jQuery('<a></a>').addClass('vbo-modal-overlay-close');
1077 zoom_dismiss.on('click', function() {
1078 jQuery('.vbo-modal-overlay-zoom-image').fadeOut();
1079 });
1080 zoom_modal.append(zoom_dismiss);
1081 var zoom_content = jQuery('<div></div>').addClass('vbo-modal-overlay-content vbo-modal-overlay-content-zoom-image');
1082 var zoom_head = jQuery('<div></div>').addClass('vbo-modal-overlay-content-head');
1083 var zoom_head_title = jQuery('<span></span>');
1084 if (caption) {
1085 zoom_head_title.text(caption);
1086 }
1087 var zoom_head_close = jQuery('<span></span>').addClass('vbo-modal-overlay-close-times').html('&times;');
1088 zoom_head_close.on('click', function() {
1089 jQuery('.vbo-modal-overlay-zoom-image').fadeOut();
1090 });
1091 zoom_head.append(zoom_head_title).append(zoom_head_close);
1092 var zoom_body = jQuery('<div></div>').addClass('vbo-modal-overlay-content-body vbo-modal-overlay-content-body-scroll');
1093 var zoom_image = jQuery('<div></div>').addClass('vbo-modal-zoom-image-wrap');
1094 zoom_image.append(jQuery(this).clone());
1095 zoom_body.append(zoom_image);
1096 zoom_content.append(zoom_head).append(zoom_body);
1097 zoom_modal.append(zoom_content);
1098 // append modal to body
1099 if (jQuery('.vbo-modal-overlay-zoom-image').length) {
1100 jQuery('.vbo-modal-overlay-zoom-image').remove();
1101 }
1102 jQuery('body').append(zoom_modal);
1103 });
1104 });
1105
1106 // open admin notes for a booking
1107 jQuery('.vbo-admin-notes-icn').click(function(e) {
1108 e.stopPropagation();
1109 var now_bid = jQuery(this).attr('data-bid');
1110 var hid_elm = jQuery('.vbo-order-admin-notes-cnt[data-bid="' + now_bid + '"]');
1111 if (!hid_elm || !hid_elm.length) {
1112 return;
1113 }
1114 VBOCore.displayModal({
1115 extra_class: 'vbo-modal-rounded',
1116 title: '<span class="label label-info">' + now_bid + '</span> ' + Joomla.JText._('VBADMINNOTESTOGGLE'),
1117 body: hid_elm.html(),
1118 });
1119 });
1120
1121 });
1122
1123 function vcmCountGuestMessages() {
1124 <?php
1125 // VCM Chat Guest Messages (if VCM is installed)
1126 if (count($vcm_bids) && is_file(VCM_SITE_PATH . DIRECTORY_SEPARATOR . 'helpers' . DIRECTORY_SEPARATOR . 'lib.vikchannelmanager.php')) {
1127 ?>
1128 var all_bids = <?php echo json_encode($vcm_bids); ?>;
1129 jQuery.ajax({
1130 type: "POST",
1131 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikchannelmanager&task=chat.count_unread_messages'); ?>",
1132 data: {
1133 tmpl: "component",
1134 id_order: all_bids
1135 }
1136 }).done(function(res) {
1137 var counters = JSON.parse(res);
1138 for (var bid in all_bids) {
1139 if (!all_bids.hasOwnProperty(bid)) {
1140 continue;
1141 }
1142 var booking_bubble = jQuery('.vbo-bookings-guestmessages-bubble-cont[data-bid="'+all_bids[bid]+'"]');
1143 if (!booking_bubble || !booking_bubble.length) {
1144 continue;
1145 }
1146 if (!counters.hasOwnProperty(all_bids[bid])) {
1147 // 0 messages to be read
1148 booking_bubble.find('i').attr('data-message-count', '0');
1149 booking_bubble.hide();
1150 continue;
1151 }
1152 booking_bubble.find('i').attr('data-message-count', counters[all_bids[bid]]);
1153 if (parseInt(counters[all_bids[bid]]) > 0) {
1154 booking_bubble.fadeIn();
1155 } else {
1156 booking_bubble.hide();
1157 }
1158 }
1159 }).fail(function() {
1160 console.error('AJAX request failed for counting guest messages from VCM');
1161 });
1162 <?php
1163 }
1164 ?>
1165 }
1166 </script>
1167 <?php
1168
1169 //Invoices
1170 $pconfirmgen = VikRequest::getInt('confirmgen', '', 'request');
1171 if (count($cid) > 0 && !empty($cid[0])) {
1172 $oldinvdate = '';
1173 $nextinvnum = VikBooking::getNextInvoiceNumber();
1174 $invsuff = VikBooking::getInvoiceNumberSuffix();
1175 $companyinfo = VikBooking::getInvoiceCompanyInfo();
1176 //if editing an invoice (re-creating an existing invoice for a booking), do not increment the invoice number
1177 if (count($cid) == 1) {
1178 //the generate invoice btn of the booking details page can pass the invoice notes field via hidden field. If not empty, update invoice notes for this id
1179 $pinvnotes = VikRequest::getString('invnotes', '', 'request', VIKREQUEST_ALLOWHTML);
1180 if (!empty($pinvnotes)) {
1181 $pinvnotes = strpos($pinvnotes, '<br') !== false ? $pinvnotes : nl2br($pinvnotes);
1182 $q = "UPDATE `#__vikbooking_orders` SET `inv_notes`=".$dbo->quote($pinvnotes)." WHERE `id`=".(int)$cid[0].";";
1183 $dbo->setQuery($q);
1184 $dbo->execute();
1185 }
1186 //
1187 $q = "SELECT `number`,`for_date` FROM `#__vikbooking_invoices` WHERE `idorder`=" . (int)$cid[0];
1188 $dbo->setQuery($q, 0, 1);
1189 $prev_data = $dbo->loadAssoc();
1190 if ($prev_data) {
1191 $oldinvdate = $prev_data['for_date'];
1192 $prev_inv_number = intval(str_replace($invsuff, '', $prev_data['number']));
1193 if ($prev_inv_number > 0) {
1194 $nextinvnum = $prev_inv_number;
1195 }
1196 }
1197 }
1198 //
1199 ?>
1200 <div class="vbo-info-overlay-block">
1201 <a class="vbo-info-overlay-close" href="javascript: void(0);"></a>
1202 <div class="vbo-info-overlay-content vbo-info-overlay-content-invoices">
1203 <?php
1204 if (count($cid) == 1) {
1205 ?>
1206 <div style="float: right;"></div>
1207 <?php
1208 }
1209 ?>
1210 <h4><?php echo JText::translate('VBOGENINVOICES') ?> (<?php echo count($cid); ?>)</h4>
1211
1212
1213 <div class="vbo-gen-invoices-helper" style="display: none;">
1214 <form action="index.php?option=com_vikbooking" method="post" id="vbo-geninv-form">
1215 <div class="vbo-calendar-cfield-entry">
1216 <label for="invoice_num"><?php echo JText::translate('VBINVSTARTNUM'); ?></label>
1217 <span><input type="number" min="1" size="4" value="<?php echo $nextinvnum; ?>" id="invoice_num" name="invoice_num" /></span>
1218 </div>
1219 <div class="vbo-calendar-cfield-entry">
1220 <label for="invoice_suff"><?php echo JText::translate('VBINVNUMSUFFIX'); ?></label>
1221 <span><input type="text" size="7" value="<?php echo $invsuff; ?>" id="invoice_suff" name="invoice_suff" /></span>
1222 </div>
1223 <div class="vbo-calendar-cfield-entry">
1224 <label for="invoice_date"><?php echo JText::translate('VBINVUSEDATE'); ?></label>
1225 <span>
1226 <select id="invoice_date" name="invoice_date">
1227 <?php
1228 if (!empty($oldinvdate)) {
1229 ?>
1230 <option value="<?php echo date($df, $oldinvdate); ?>"><?php echo date($df, $oldinvdate); ?></option>
1231 <?php
1232 }
1233 ?>
1234 <option value="<?php echo date($df, time()); ?>"><?php echo date($df, time()); ?></option>
1235 <option value="0"><?php echo JText::translate('VBINVUSEDATEBOOKING'); ?></option>
1236 </select>
1237 </span>
1238 </div>
1239 <div class="vbo-calendar-cfield-entry">
1240 <label for="company_info"><?php echo JText::translate('VBINVCOMPANYINFO'); ?></label>
1241 <span><textarea name="company_info" id="company_info" style="width: 98%; min-width: 98%; max-width: 98%; height: 70px;"><?php echo $companyinfo; ?></textarea></span>
1242 </div>
1243 <div class="vbo-calendar-cfield-entry">
1244 <label for="invoice_send"><i class="vboicn-envelop"></i><?php echo JText::translate('VBINVSENDVIAMAIL'); ?></label>
1245 <span><select id="invoice_send" name="invoice_send"><option value=""><?php echo JText::translate('VBNO'); ?></option><option value="1"><?php echo JText::translate('VBYES'); ?></option></select></span>
1246 </div>
1247 <div class="vbo-calendar-cfields-bottom">
1248
1249 </div>
1250 <?php
1251 foreach ($cid as $invid) {
1252 echo '<input type="hidden" name="cid[]" value="'.$invid.'" />';
1253 }
1254 if ($pconfirmgen > 0) {
1255 echo '<input type="hidden" name="confirmgen" value="'.$cid[0].'" />';
1256 }
1257 ?>
1258 <input type="hidden" name="option" value="com_vikbooking" />
1259 <input type="hidden" name="task" value="geninvoices" />
1260 </form>
1261 </div>
1262
1263 <script type="text/javascript">
1264 jQuery(function() {
1265
1266 // render modal to generate the invoice(s)
1267 var gen_invoices_modal_body = VBOCore.displayModal({
1268 suffix: 'invoices',
1269 extra_class: 'vbo-modal-rounded vbo-modal-tall',
1270 title: Joomla.JText._('VBOGENINVOICES') + ' (<?php echo count($cid); ?>)',
1271 footer_right: '<button type="button" class="btn btn-success" onclick="document.getElementById(\'vbo-geninv-form\').submit();"><i class="vboicn-file-text2"></i><?php echo JText::translate('VBOGENINVOICES'); ?></button>',
1272 <?php
1273 if (count($cid) === 1) {
1274 ?>
1275 footer_left: '<a href="index.php?option=com_vikbooking&task=editbusy&cid[]=<?php echo $cid[0]; ?>&frominv=1" class="btn vbo-config-btn"><?php echo JText::translate('VBINVEDITBINFO'); ?></a>',
1276 <?php
1277 }
1278 ?>
1279 onDismiss: () => {
1280 jQuery('#vbo-geninv-form').appendTo('.vbo-gen-invoices-helper');
1281 },
1282 });
1283
1284 // set modal content
1285 jQuery('#vbo-geninv-form').appendTo(gen_invoices_modal_body);
1286
1287 <?php
1288 if ($pconfirmgen > 0) {
1289 ?>
1290 // prompt for immediate generation
1291 if (confirm(Joomla.JText._('VBCONFIRMGENINV'))) {
1292 document.getElementById('vbo-geninv-form').submit();
1293 }
1294 <?php
1295 }
1296 ?>
1297 });
1298 </script>
1299 <?php
1300 }
1301