PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.16
VikBooking Hotel Booking Engine & PMS v1.8.16
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 / trackings / tmpl / default.php

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

867 lines 38.8 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 $lim0 = $this->lim0;
15 $navbut = $this->navbut;
16 $orderby = $this->orderby;
17 $ordersort = $this->ordersort;
18
19 $vbo_app = VikBooking::getVboApplication();
20 $vbo_app->loadSelect2();
21 $vbo_app->loadDatePicker();
22
23 $nowdf = VikBooking::getDateFormat(true);
24 if ($nowdf == "%d/%m/%Y") {
25 $df = 'd/m/Y';
26 } elseif ($nowdf == "%m/%d/%Y") {
27 $df = 'm/d/Y';
28 } else {
29 $df = 'Y/m/d';
30 }
31 $datesep = VikBooking::getDateSeparator(true);
32 $juidf = $nowdf == "%d/%m/%Y" ? 'dd/mm/yy' : ($nowdf == "%m/%d/%Y" ? 'mm/dd/yy' : 'yy/mm/dd');
33
34 $dates_filter = '';
35 $pdatefilt = $this->datefilt;
36 $pdatefiltfrom = $this->datefiltfrom;
37 $pdatefiltto = $this->datefiltto;
38 if ((!empty($pdatefiltfrom) || !empty($pdatefiltto))) {
39 $dates_filter = JHtml::fetch('esc_attr', '&amp;datefilt='.$pdatefilt.(!empty($pdatefiltfrom) ? '&amp;datefiltfrom='.$pdatefiltfrom : '').(!empty($pdatefiltto) ? '&amp;datefiltto='.$pdatefiltto : ''));
40 }
41 $pactive_tab = VikRequest::getString('vbo_active_tab', 'vbo-trackings-tabcont-list', 'request');
42
43 ?>
44 <script type="text/javascript">
45 jQuery(function() {
46 jQuery('.vbo-trackings-togglesubrow-cont').click(function() {
47 var toggler = jQuery(this).find('i.vbo-trackings-togglesubrow');
48 var elem = toggler.closest('.vbo-trackings-table-body-row').find('.vbo-trackings-table-body-subrow');
49 elem.slideToggle(400, function() {
50 if (elem.is(':visible')) {
51 toggler.removeClass('fa-chevron-down').addClass('fa-chevron-up');
52 } else {
53 toggler.removeClass('fa-chevron-up').addClass('fa-chevron-down');
54 }
55 });
56 });
57 jQuery('.vbo-trackings-table-body-row').dblclick(function() {
58 if (jQuery(this).find('.vbo-trackings-table-body-subrow').is(':visible')) {
59 e.preventDefault();
60 return;
61 }
62 jQuery(this).find('.vbo-trackings-togglesubrow-cont').trigger('click');
63 });
64 jQuery('#vbo-date-from').datepicker({
65 showOn: 'focus',
66 dateFormat: '<?php echo $juidf; ?>',
67 <?php echo ($this->mindate > 0 ? 'minDate: "'.date(str_replace('%', '', $nowdf), $this->mindate).'", ' : '').($this->maxdate > 0 ? 'maxDate: "'.date(str_replace('%', '', $nowdf), $this->maxdate).'", ' : ''); ?>
68 onSelect: function( selectedDate ) {
69 jQuery('#vbo-date-to').datepicker('option', 'minDate', selectedDate);
70 }
71 });
72 jQuery('#vbo-date-to').datepicker({
73 showOn: 'focus',
74 dateFormat: '<?php echo $juidf; ?>',
75 <?php echo ($this->mindate > 0 ? 'minDate: "'.date(str_replace('%', '', $nowdf), $this->mindate).'", ' : '').($this->maxdate > 0 ? 'maxDate: "'.date(str_replace('%', '', $nowdf), $this->maxdate).'", ' : ''); ?>
76 onSelect: function( selectedDate ) {
77 jQuery('#vbo-date-from').datepicker('option', 'maxDate', selectedDate);
78 }
79 });
80 jQuery('#vbo-date-from-trig, #vbo-date-to-trig').click(function() {
81 var jdp = jQuery(this).prev('input.hasDatepicker');
82 if (jdp.length) {
83 jdp.focus();
84 }
85 });
86 jQuery('.vbo-trackings-tab').click(function() {
87 var newtabrel = jQuery(this).attr('data-vbotab');
88 var oldtabrel = jQuery(".vbo-trackings-tab-active").attr('data-vbotab');
89 if (newtabrel == oldtabrel) {
90 return;
91 }
92 jQuery(".vbo-trackings-tab").removeClass("vbo-trackings-tab-active");
93 jQuery(this).addClass("vbo-trackings-tab-active");
94 jQuery("." + oldtabrel).hide();
95 jQuery("." + newtabrel).fadeIn();
96 jQuery("#vbo_active_tab").val(newtabrel);
97 });
98 jQuery(".vbo-trackings-tab[data-vbotab='<?php echo JHtml::fetch('esc_attr', $pactive_tab); ?>']").trigger('click');
99 });
100 </script>
101
102 <form action="index.php?option=com_vikbooking" method="post" name="adminForm" id="adminForm">
103
104 <div id="filter-bar" class="btn-toolbar vbo-btn-toolbar vbo-trackings-filters" style="width: 100%; display: inline-block;">
105 <div class="btn-group pull-right">
106 <a class="btn" href="index.php?option=com_vikbooking&task=trkconfig"><?php VikBookingIcons::e('cogs'); ?> <?php echo JText::translate('VBTRKSETTINGS'); ?></a>
107 </div>
108 <div class="btn-group pull-left input-append">
109 <input type="text" id="vbo-date-from" placeholder="<?php echo JText::translate('VBNEWSEASONONE'); ?>" value="<?php echo JHtml::fetch('esc_attr', $pdatefiltfrom); ?>" size="14" name="datefiltfrom" onfocus="this.blur();" />
110 <button type="button" class="btn" id="vbo-date-from-trig"><i class="icon-calendar"></i></button>
111 </div>
112 <div class="btn-group pull-left input-append">
113 <input type="text" id="vbo-date-to" placeholder="<?php echo JText::translate('VBNEWSEASONTWO'); ?>" value="<?php echo JHtml::fetch('esc_attr', $pdatefiltto); ?>" size="14" name="datefiltto" onfocus="this.blur();" />
114 <button type="button" class="btn" id="vbo-date-to-trig"><i class="icon-calendar"></i></button>
115 </div>
116 <div class="btn-group pull-left">
117 <?php
118 $datesel = '<select name="datefilt">';
119 $datesel .= '<option value="1"'.(!empty($pdatefilt) && $pdatefilt == 1 ? ' selected="selected"' : '').'>'.JText::translate('VBTRKFILTTRKDATES').'</option>';
120 $datesel .= '<option value="2"'.(!empty($pdatefilt) && $pdatefilt == 2 ? ' selected="selected"' : '').'>'.JText::translate('VBTRKBOOKINGDATES').'</option>';
121 $datesel .= '<option value="3"'.(!empty($pdatefilt) && $pdatefilt == 3 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEIN').'</option>';
122 $datesel .= '<option value="4"'.(!empty($pdatefilt) && $pdatefilt == 4 ? ' selected="selected"' : '').'>'.JText::translate('VBOFILTERDATEOUT').'</option>';
123 $datesel .= '</select>';
124 echo $datesel;
125 ?>
126 </div>
127 <div class="btn-group pull-left">
128 <span style="font-size: 15px;">&nbsp;</span>
129 </div>
130 <div class="btn-group pull-left">
131 <select name="countryfilt" id="countryfilt">
132 <option value=""><?php echo JText::translate('VBCOUNTRYFILTER'); ?></option>
133 <?php
134 $pcountryfilt = VikRequest::getString('countryfilt', '', 'request');
135 foreach ($this->countries as $c) {
136 ?>
137 <option value="<?php echo JHtml::fetch('esc_attr', $c['country']); ?>"<?php echo $c['country'] == $pcountryfilt ? ' selected="selected"' : ''; ?>><?php echo $c['country_name']; ?></option>
138 <?php
139 }
140 ?>
141 </select>
142 </div>
143 <div class="btn-group pull-left">
144 <span style="font-size: 15px;">&nbsp;</span>
145 </div>
146 <div class="btn-group pull-left">
147 <select name="referrer" style="max-width: 170px;">
148 <option value=""><?php echo JText::translate('VBREFERRERFILTER'); ?></option>
149 <?php
150 $preferrer = VikRequest::getString('referrer', '', 'request');
151 foreach ($this->referrers as $r) {
152 $say_referrer = !strcasecmp($r['referrer'], 'googlehotel') ? 'Google Hotel' : $r['referrer'];
153 $say_referrer = !strcasecmp($say_referrer, 'googlevr') ? 'Google VR' : $say_referrer;
154 $say_referrer = strpos($say_referrer, 'http') === false ? ucwords($say_referrer) : $say_referrer;
155 ?>
156 <option value="<?php echo JHtml::fetch('esc_attr', $r['referrer']); ?>"<?php echo $r['referrer'] == $preferrer ? ' selected="selected"' : ''; ?>><?php echo $say_referrer; ?></option>
157 <?php
158 }
159 ?>
160 </select>
161 </div>
162 <div class="btn-group pull-left">
163 <span style="font-size: 15px;">&nbsp;</span>
164 </div>
165 <div class="btn-group pull-left">
166 <button type="submit" class="btn"><i class="icon-search"></i> <?php echo JText::translate('VBTRKFILTRES'); ?></button>
167 </div>
168 <div class="btn-group pull-left">
169 <button type="button" class="btn" onclick="jQuery('#filter-bar').find('input, select').val('');document.adminForm.submit();"><?php echo JText::translate('JSEARCH_FILTER_CLEAR'); ?></button>
170 </div>
171 </div>
172
173 <?php
174 if (!(int)VikBookingTracker::loadSettings('trkenabled')) {
175 ?>
176 <p class="err"><?php echo JText::translate('VBTRKDISABLED'); ?></p>
177 <?php
178 }
179 if (empty($rows)) {
180 ?>
181 <p class="warn"><?php echo JText::translate('VBNOTRACKINGS'); ?></p>
182 <?php
183 } else {
184 // gather all the IPs with missing geo information
185 $missing_ips = array();
186 foreach ($rows as $row) {
187 if (empty($row['geo']) && !empty($row['ip'])) {
188 $missing_ips[$row['id']] = $row['ip'];
189 }
190 }
191 if (count($missing_ips)) {
192 ?>
193 <script type="text/javascript">
194 jQuery(function() {
195 var jqxhr = jQuery.ajax({
196 type: "POST",
197 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=getgeoinfo'); ?>",
198 data: {
199 tmpl: "component",
200 ips: <?php echo json_encode($missing_ips); ?>
201 }
202 }).done(function(res) {
203 if (res.indexOf('e4j.error') >= 0 ) {
204 console.log(res);
205 } else {
206 var obj_res = JSON.parse(res);
207 for (var i in obj_res) {
208 if (!obj_res.hasOwnProperty(i)) {
209 continue;
210 }
211 if (obj_res[i].hasOwnProperty('geo') && jQuery('#geo-'+i).length) {
212 jQuery('#geo-'+i).text(obj_res[i]['geo']);
213 }
214 if (obj_res[i].hasOwnProperty('country') && jQuery('#country-'+i).length) {
215 jQuery('#country-'+i).text(obj_res[i]['country']);
216 }
217 if (obj_res[i].hasOwnProperty('country') && obj_res[i].hasOwnProperty('country3') && !vboCountryHasVal(obj_res[i]['country3'])) {
218 jQuery('#countryfilt').append('<option value="'+obj_res[i]['country3']+'">'+obj_res[i]['country']+'</option>');
219 }
220 }
221 }
222 }).fail(function() {
223 console.log("getgeoinfo Request Failed");
224 });
225 });
226 function vboCountryHasVal(c3) {
227 var hasval = false;
228 jQuery('#countryfilt option').each(function(k, v) {
229 if (jQuery(v).attr('value') == c3) {
230 hasval = true;
231 return false;
232 }
233 });
234
235 return hasval;
236 }
237 </script>
238 <?php
239 }
240 ?>
241
242 <div class="vbo-trackings-outer-response">
243 <div class="vbo-trackings-tabs">
244 <div class="vbo-trackings-tab vbo-trackings-tab-active" data-vbotab="vbo-trackings-tabcont-list"><?php echo JText::translate('VBTRKVISITORS'); ?></div>
245 <div class="vbo-trackings-tab" data-vbotab="vbo-trackings-tabcont-stats"><?php echo JText::translate('VBTRKCONVRATES'); ?></div>
246 </div>
247 <div class="vbo-trackings-tabcont-list" style="display: block;">
248 <div class="vbo-trackings-table">
249 <div class="vbo-trackings-table-head">
250 <div class="vbo-trackings-table-head-inner">
251 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-chevron"></div>
252 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-ckb">
253 <input type="checkbox" onclick="Joomla.checkAll(this)" value="" name="checkall-toggle">
254 </div>
255 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-id">
256 <a href="index.php?option=com_vikbooking&amp;task=trackings<?php echo $dates_filter; ?>&amp;vborderby=id&amp;vbordersort=<?php echo ($orderby == "id" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "id" && $ordersort == "ASC" ? "vbo-list-activesort" : ($orderby == "id" ? "vbo-list-activesort" : "")); ?>">
257 ID<?php echo ($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>')); ?>
258 </a>
259 </div>
260 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-lastdt">
261 <a href="index.php?option=com_vikbooking&amp;task=trackings<?php echo $dates_filter; ?>&amp;vborderby=lastdt&amp;vbordersort=<?php echo ($orderby == "lastdt" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "lastdt" && $ordersort == "ASC" ? "vbo-list-activesort" : ($orderby == "lastdt" ? "vbo-list-activesort" : "")); ?>">
262 <?php echo JText::translate('VBTRKLASTDT').($orderby == "lastdt" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "lastdt" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
263 </a>
264 </div>
265 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-customer">
266 <span><?php echo JText::translate( 'VBOCUSTOMER' ); ?></span>
267 </div>
268 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-country">
269 <a href="index.php?option=com_vikbooking&amp;task=trackings<?php echo $dates_filter; ?>&amp;vborderby=country&amp;vbordersort=<?php echo ($orderby == "country" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "country" && $ordersort == "ASC" ? "vbo-list-activesort" : ($orderby == "country" ? "vbo-list-activesort" : "")); ?>">
270 <?php echo JText::translate('ORDER_STATE').($orderby == "country" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "country" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
271 </a>
272 </div>
273 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-geo">
274 <a href="index.php?option=com_vikbooking&amp;task=trackings<?php echo $dates_filter; ?>&amp;vborderby=geo&amp;vbordersort=<?php echo ($orderby == "geo" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "geo" && $ordersort == "ASC" ? "vbo-list-activesort" : ($orderby == "geo" ? "vbo-list-activesort" : "")); ?>">
275 <?php echo JText::translate('VBTRKGEOINFO').($orderby == "geo" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "geo" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
276 </a>
277 </div>
278 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-dt">
279 <a href="index.php?option=com_vikbooking&amp;task=trackings<?php echo $dates_filter; ?>&amp;vborderby=dt&amp;vbordersort=<?php echo ($orderby == "dt" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "dt" && $ordersort == "ASC" ? "vbo-list-activesort" : ($orderby == "dt" ? "vbo-list-activesort" : "")); ?>">
280 <?php echo JText::translate('VBTRKFIRSTDT').($orderby == "dt" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "dt" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
281 </a>
282 </div>
283 <div class="vbo-trackings-table-head-cell center vbo-trackings-table-cell-published">
284 <a href="index.php?option=com_vikbooking&amp;task=trackings<?php echo $dates_filter; ?>&amp;vborderby=published&amp;vbordersort=<?php echo ($orderby == "published" && $ordersort == "ASC" ? "DESC" : "ASC"); ?>" class="<?php echo ($orderby == "published" && $ordersort == "ASC" ? "vbo-list-activesort" : ($orderby == "published" ? "vbo-list-activesort" : "")); ?>">
285 <?php echo JText::translate('VBTRKPUBLISHED').($orderby == "published" && $ordersort == "ASC" ? '<i class="'.VikBookingIcons::i('sort-asc').'"></i>' : ($orderby == "published" ? '<i class="'.VikBookingIcons::i('sort-desc').'"></i>' : '<i class="'.VikBookingIcons::i('sort').'"></i>')); ?>
286 </a>
287 </div>
288 </div>
289 </div>
290
291 <div class="vbo-trackings-table-body">
292 <?php
293 $kk = 0;
294 $i = 0;
295 for ($i = 0, $n = count($rows); $i < $n; $i++) {
296 $row = $rows[$i];
297 $customer_info = JText::translate('VBOANONYMOUS');
298 if (!empty($row['first_name']) || !empty($row['last_name'])) {
299 $customer_info = $row['first_name'].' '.$row['last_name'];
300 $check_country = $row['country'];
301 if (empty($check_country) && !empty($row['c_country'])) {
302 $check_country = $row['c_country'];
303 }
304 if (!empty($check_country)) {
305 if (file_exists(VBO_ADMIN_PATH.DS.'resources'.DS.'countries'.DS.$check_country.'.png')) {
306 $customer_info .= '<img src="'.VBO_ADMIN_URI.'resources/countries/'.$check_country.'.png'.'" title="'.$check_country.'" class="vbo-country-flag vbo-country-flag-left"/>';
307 }
308 }
309 }
310 $dt_info = getdate(strtotime($row['dt']));
311 $lastdt_info = getdate(strtotime($row['lastdt']));
312 ?>
313 <div class="vbo-trackings-table-body-row">
314 <div class="vbo-trackings-table-head-cell vbo-trackings-table-cell-chevron vbo-trackings-togglesubrow-cont">
315 <?php VikBookingIcons::e('chevron-down', 'vbo-trackings-togglesubrow'); ?>
316 </div>
317 <div class="vbo-trackings-table-body-cell vbo-trackings-table-cell-ckb">
318 <input type="checkbox" id="cb<?php echo $i;?>" name="cid[]" value="<?php echo JHtml::fetch('esc_attr', $row['id']); ?>" onclick="Joomla.isChecked(this.checked);">
319 </div>
320 <div class="vbo-trackings-table-body-cell vbo-trackings-table-cell-id">
321 <div class="vbo-trackings-table-body-hidden-lbl">ID</div>
322 <?php echo $row['id']; ?>
323 </div>
324 <div class="vbo-trackings-table-body-cell vbo-trackings-table-cell-lastdt">
325 <div class="vbo-trackings-table-body-hidden-lbl"><?php echo JText::translate('VBTRKLASTDT'); ?></div>
326 <div class="vbo-trackings-dtonly">
327 <?php echo date(str_replace("/", $datesep, $df), strtotime($row['lastdt'])); ?>
328 </div>
329 <div class="vbo-trackings-timeonly">
330 <span class="vbo-trackings-wday"><?php echo JText::translate('VB'.strtoupper(substr($lastdt_info['weekday'], 0, 3))); ?></span>
331 <span class="vbo-trackings-time"><?php echo date('H:i', strtotime($row['lastdt'])); ?></span>
332 </div>
333 </div>
334 <div class="vbo-trackings-table-body-cell vbo-trackings-table-cell-customer">
335 <div class="vbo-trackings-table-body-hidden-lbl"><?php echo JText::translate('VBOCUSTOMER'); ?></div>
336 <?php echo $customer_info; ?>
337 </div>
338 <div class="vbo-trackings-table-body-cell vbo-trackings-table-cell-country" id="country-<?php echo $row['id']; ?>">
339 <div class="vbo-trackings-table-body-hidden-lbl"><?php echo JText::translate('ORDER_STATE'); ?></div>
340 <?php echo !empty($row['country_name']) ? $row['country_name'] : '-----'; ?>
341 </div>
342 <div class="vbo-trackings-table-body-cell vbo-trackings-table-cell-geo" id="geo-<?php echo $row['id']; ?>">
343 <div class="vbo-trackings-table-body-hidden-lbl"><?php echo JText::translate('VBTRKGEOINFO'); ?></div>
344 <?php echo !empty($row['geo']) ? $row['geo'] : '-----'; ?>
345 </div>
346 <div class="vbo-trackings-table-body-cell vbo-trackings-table-cell-dt">
347 <div class="vbo-trackings-table-body-hidden-lbl"><?php echo JText::translate('VBTRKFIRSTDT'); ?></div>
348 <div class="vbo-trackings-dtonly">
349 <?php echo date(str_replace("/", $datesep, $df), strtotime($row['dt'])); ?>
350 </div>
351 <div class="vbo-trackings-timeonly">
352 <span class="vbo-trackings-wday"><?php echo JText::translate('VB'.strtoupper(substr($dt_info['weekday'], 0, 3))); ?></span>
353 <span class="vbo-trackings-time"><?php echo date('H:i', strtotime($row['dt'])); ?></span>
354 </div>
355 </div>
356 <div class="vbo-trackings-table-body-cell center vbo-trackings-table-cell-published">
357 <div class="vbo-trackings-table-body-hidden-lbl"><?php echo JText::translate('VBTRKPUBLISHED'); ?></div>
358 <a href="index.php?option=com_vikbooking&amp;task=modtracking&amp;cid[]=<?php echo $row['id']; ?>"><?php echo ($row['published'] ? "<i class=\"".VikBookingIcons::i('check', 'vbo-icn-img')."\" style=\"color: #099909;\" title=\"".JText::translate('VBTRKMAKENOTAVAIL')."\"></i>" : "<i class=\"".VikBookingIcons::i('times-circle', 'vbo-icn-img')."\" style=\"color: #ff0000;\" title=\"".JText::translate('VBTRKMAKEAVAIL')."\"></i>"); ?></a>
359 </div>
360
361 <div class="vbo-trackings-table-body-subrow">
362 <div class="vbo-tracking-info-container">
363 <?php
364 $tot_infos = count($row['infos']);
365 foreach ($row['infos'] as $k => $info) {
366 $trkdata = json_decode($info['trkdata']);
367 $trkdata = !is_object($trkdata) ? (new stdClass) : $trkdata;
368 $is_subidentifier = false;
369 $is_opening = false;
370 if (!isset($row['infos'][($k - 1)]) || $info['identifier'] != $row['infos'][($k - 1)]['identifier']) {
371 // open identifier because previous is different or not set (this is the first record)
372 $is_opening = true;
373 echo '<div class="vbo-tracking-identifier-container">'."\n";
374 } elseif (isset($row['infos'][($k - 1)]) && $info['identifier'] == $row['infos'][($k - 1)]['identifier']) {
375 $is_subidentifier = true;
376 }
377 ?>
378 <div class="vbo-tracking-info-details<?php echo $is_subidentifier ? ' vbo-tracking-info-details-continue' : ''; ?><?php echo !empty($info['idorder']) ? ' vbo-tracking-info-hasconversion' : ''; ?>">
379 <?php
380 $device = '';
381 if ($is_opening) {
382 if ($info['device'] == 'C') {
383 // computer
384 $device = '<i class="'.VikBookingIcons::i('desktop', 'vbo-tracking-i-desktop').'"></i>';
385 } elseif ($info['device'] == 'S') {
386 // smartphone
387 $device = '<i class="'.VikBookingIcons::i('mobile', 'vbo-tracking-i-mobile').'"></i>';
388 } elseif ($info['device'] == 'T') {
389 // tablet
390 $device = '<i class="'.VikBookingIcons::i('tablet', 'vbo-tracking-i-tablet').'"></i>';
391 }
392 }
393 if (!empty($device)) {
394 ?>
395 <div class="vbo-tracking-info-device-cont">
396 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBTRKDEVICE'); ?></div>
397 <span class="vbo-tracking-info-device"><?php echo $device; ?></span>
398 </div>
399 <?php
400 } else {
401 ?>
402 <div class="vbo-tracking-info-device-cont"></div>
403 <?php
404 }
405 ?>
406 <div class="vbo-tracking-info-dt-cont">
407 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBTRKTRACKTIME'); ?></div>
408 <?php
409 if (!$is_subidentifier) {
410 $subdt_info = getdate(strtotime($info['trackingdt']));
411 ?>
412 <div class="vbo-tracking-info-dtonly">
413 <?php echo date(str_replace("/", $datesep, $df), strtotime($info['trackingdt'])); ?>
414 </div>
415 <div class="vbo-tracking-info-timeonly">
416 <span class="vbo-tracking-info-wday"><?php echo JText::translate('VB'.strtoupper(substr($subdt_info['weekday'], 0, 3))); ?></span>
417 <span class="vbo-tracking-info-time"><?php echo date('H:i', strtotime($info['trackingdt'])); ?></span>
418 </div>
419 <?php
420 } else {
421 $diff_info = VikBookingTracker::datesDiff($info['trackingdt'], $row['infos'][($k - 1)]['trackingdt']);
422 $diff_type = JText::translate('VBTRKDIFFSECS');
423 if ($diff_info['type'] == 'minutes') {
424 $diff_type = JText::translate('VBTRKDIFFMINS');
425 } elseif ($diff_info['type'] == 'hours') {
426 $diff_type = JText::translate('VBCONFIGONETENEIGHT');
427 }
428 ?>
429 <span class="vbo-tracking-info-aftertime" title="<?php echo date(str_replace("/", $datesep, $df).' H:i:s', strtotime($info['trackingdt'])); ?>">+ <?php echo $diff_info['diff'] . ' ' . $diff_type; ?></span>
430 <?php
431 }
432 ?>
433 </div>
434 <div class="vbo-tracking-info-dates-cont">
435 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBTRKBOOKINGDATES'); ?></div>
436 <div class="vbo-tracking-info-dates-in">
437 <span class="vbo-tracking-info-lbl">
438 <?php echo JText::translate('VBPICKUPAT'); ?>
439 </span>
440 <span class="vbo-tracking-info-val">
441 <?php
442 $tsdt = strtotime($trkdata->checkin);
443 $time_info = getdate($tsdt);
444 echo JText::translate('VB'.strtoupper(substr($time_info['weekday'], 0, 3))) . ', ' . date(str_replace("/", $datesep, $df), $tsdt);
445 ?>
446 </span>
447 </div>
448 <div class="vbo-tracking-info-dates-out">
449 <span class="vbo-tracking-info-lbl">
450 <?php echo JText::translate('VBRELEASEAT'); ?>
451 </span>
452 <span class="vbo-tracking-info-val">
453 <?php
454 $tsdt = strtotime($trkdata->checkout);
455 $time_info = getdate($tsdt);
456 echo JText::translate('VB'.strtoupper(substr($time_info['weekday'], 0, 3))) . ', ' . date(str_replace("/", $datesep, $df), $tsdt);
457 ?>
458 </span>
459 </div>
460 <?php
461 if (isset($trkdata->nights)) {
462 ?>
463 <div class="vbo-tracking-info-dates-out">
464 <span class="vbo-tracking-info-lbl">
465 <?php echo JText::translate('VBPVIEWORDERSSIX'); ?>
466 </span>
467 <span class="vbo-tracking-info-val">
468 <?php echo $trkdata->nights; ?>
469 </span>
470 </div>
471 <?php
472 }
473 ?>
474 </div>
475 <?php
476 if (isset($trkdata->party)) {
477 ?>
478 <div class="vbo-tracking-info-party-cont">
479 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBQUICKRESGUESTS'); ?></div>
480 <?php
481 foreach ($trkdata->party as $numroom => $guests) {
482 ?>
483 <div class="vbo-tracking-info-party-room">
484 <span class="vbo-tracking-info-lbl">
485 <?php echo JText::translate('VBMAILROOMNUM').$numroom; ?>
486 </span>
487 <span class="vbo-tracking-info-val">
488 <?php echo $guests->adults." ".($guests->adults > 1 ? JText::translate('VBMAILADULTS') : JText::translate('VBMAILADULT')).($guests->children > 0 ? ", ".$guests->children." ".($guests->children > 1 ? JText::translate('VBMAILCHILDREN') : JText::translate('VBMAILCHILD')) : ""); ?>
489 </span>
490 </div>
491 <?php
492 }
493 ?>
494 </div>
495 <?php
496 }
497 if (isset($trkdata->rooms) || isset($trkdata->rplans)) {
498 ?>
499 <div class="vbo-tracking-info-roomsrates-cont">
500 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBTRKROOMSRATES'); ?></div>
501 <?php
502 if (isset($trkdata->rooms)) {
503 ?>
504 <div class="vbo-tracking-info-rooms">
505 <?php
506 if (isset($trkdata->rindex) && is_array($trkdata->rindex)) {
507 $rindexes = array_filter($trkdata->rindex);
508 if (count($rindexes)) {
509 // display all indexes booked, even the empty ones
510 ?>
511 <div class="vbo-tracking-info-rooms-room">
512 <span class="vbo-tracking-info-lbl">
513 <?php echo JText::translate('VBODISTFEATURERUNIT') . ' ' . implode(', ', $trkdata->rindex); ?>
514 </span>
515 </div>
516 <?php
517 }
518 }
519 foreach ($trkdata->rooms as $idroom => $units) {
520 ?>
521 <div class="vbo-tracking-info-rooms-room">
522 <span class="vbo-tracking-info-lbl">
523 <?php echo (isset($this->rooms[$idroom]) ? $this->rooms[$idroom] : '?').($units > 1 ? ' (x'.$units.')' : ''); ?>
524 </span>
525 </div>
526 <?php
527 }
528 ?>
529 </div>
530 <?php
531 }
532 if (isset($trkdata->rplans)) {
533 ?>
534 <div class="vbo-tracking-info-rplans">
535 <?php
536 foreach ($trkdata->rplans as $idprice => $units) {
537 ?>
538 <div class="vbo-tracking-info-rplans-room">
539 <span class="vbo-tracking-info-lbl">
540 <?php echo (isset($this->prices[$idprice]) ? $this->prices[$idprice] : '?').($units > 1 ? ' (x'.$units.')' : ''); ?>
541 </span>
542 </div>
543 <?php
544 }
545 ?>
546 </div>
547 <?php
548 }
549 ?>
550 </div>
551 <?php
552 }
553 if (!empty($info['idorder'])) {
554 if ($info['status'] == "confirmed") {
555 $saystaus = '<span class="label label-success vbo-status-label">'.JText::translate('VBCONFIRMED').'</span>';
556 } elseif ($info['status'] == "standby") {
557 $saystaus = '<span class="label label-warning vbo-status-label">'.JText::translate('VBSTANDBY').'</span>';
558 } else {
559 $saystaus = '<span class="label label-error vbo-status-label">'.JText::translate('VBCANCELLED').'</span>';
560 }
561 ?>
562 <div class="vbo-tracking-info-booking-cont">
563 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBTRKBOOKCONV'); ?></div>
564 <?php echo $saystaus; ?>
565 <a href="index.php?option=com_vikbooking&task=editorder&cid[]=<?php echo $info['idorder']; ?>" target="_blank"><?php VikBookingIcons::e('external-link'); ?> <?php echo $info['idorder']; ?></a>
566 </div>
567 <?php
568 } else {
569 /**
570 * Check if some extra tracking data for special referres (set by VCM) should be displayed.
571 *
572 * @since 1.15.0 (J) - 1.5.0 (WP)
573 */
574 $extra_trk_props = array();
575 $common_props = VikBookingTracker::$common_trk_props;
576 foreach ($trkdata as $trk_prop => $trk_val) {
577 if (!is_string($trk_prop) || !is_scalar($trk_val) || in_array($trk_prop, $common_props)) {
578 continue;
579 }
580 $say_trk_prop = ucwords(str_replace('_', ' ', $trk_prop));
581 $extra_trk_props[$say_trk_prop] = $trk_val;
582 }
583 if (count($extra_trk_props)) {
584 // display the extra tracking properties
585 ?>
586 <div class="vbo-tracking-info-booking-cont">
587 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBOGUESTEXTRANOTES'); ?></div>
588 <div class="vbo-tracking-info-extra-props">
589 <?php
590 foreach ($extra_trk_props as $trk_prop => $trk_val) {
591 ?>
592 <div class="vbo-tracking-info-extra-prop">
593 <span class="vbo-tracking-info-extra-prop-name"><strong><?php echo $trk_prop; ?></strong></span>
594 <span class="vbo-tracking-info-extra-prop-val"><?php echo $trk_val; ?></span>
595 </div>
596 <?php
597 }
598 ?>
599 </div>
600 </div>
601 <?php
602 }
603 }
604 if (!empty($info['referrer'])) {
605 /**
606 * The tracking referrer may be equal to a channel available in VCM. Try to get its logo.
607 *
608 * @since 1.15.0 (J) - 1.5.0 (WP)
609 */
610 $referrer_logo = VikBooking::getVcmChannelsLogo($info['referrer']);
611 if ($referrer_logo === false) {
612 $say_referrer = strpos($info['referrer'], 'http') === false ? ucwords($info['referrer']) : $info['referrer'];
613 $referrer_logo = '<span><i class="' . VikBookingIcons::i('globe') . '"></i> ' . $say_referrer . '</span>';
614 } else {
615 $referrer_logo = '<span class="vbo-tracking-info-referrer-logo"><img src="' . $referrer_logo . '"/></span>';
616 }
617 ?>
618 <div class="vbo-tracking-info-booking-referrer">
619 <div class="vbo-tracking-info-subrow-lbl"><?php echo JText::translate('VBTRKREFERRER'); ?></div>
620 <?php echo $referrer_logo; ?>
621 </div>
622 <?php
623 }
624 if (isset($trkdata->msg)) {
625 ?>
626 <div class="vbo-tracking-info-search-results">
627 <?php
628 foreach ($trkdata->msg as $msg) {
629 $msg_type = strtolower($msg->type);
630 $msg_icon = '<i class="'.VikBookingIcons::i('info-circle').'"></i>';
631 if ($msg_type == 'success') {
632 $msg_icon = '<i class="'.VikBookingIcons::i('check-circle').'"></i>';
633 } elseif ($msg_type == 'warning') {
634 $msg_icon = '<i class="'.VikBookingIcons::i('exclamation-triangle').'"></i>';
635 } elseif ($msg_type == 'error') {
636 $msg_icon = '<i class="'.VikBookingIcons::i('times-circle').'"></i>';
637 }
638 ?>
639 <div class="vbo-tracking-info-search-result vbo-tracking-info-search-result-<?php echo $msg_type; ?>">
640 <p><?php echo $msg_icon . ' ' . $msg->text; ?></p>
641 </div>
642 <?php
643 }
644 ?>
645 </div>
646 <?php
647 }
648 ?>
649 </div>
650 <?php
651 if (!isset($row['infos'][($k + 1)]) || $info['identifier'] != $row['infos'][($k + 1)]['identifier']) {
652 // close current identifier because next is different
653 echo '</div>'."\n";
654 }
655 }
656 ?>
657 </div>
658 </div>
659 </div>
660 <?php
661 $kk = 1 - $kk;
662 }
663 ?>
664 </div>
665 </div>
666 </div>
667 <?php
668 // calculate most demanded nights, conversion rates, best referrers, average LOS
669 $demands_nights = array();
670 $demands_count = array();
671 $referrer_count = array();
672 $totidentifiers = array();
673 $totbookings = array();
674 $los_pool = array();
675 foreach ($this->stats_data as $stat) {
676 if (!empty($stat['referrer'])) {
677 if (!isset($referrer_count[$stat['referrer']])) {
678 $referrer_count[$stat['referrer']] = 0;
679 }
680 $referrer_count[$stat['referrer']]++;
681 }
682 if (!isset($totidentifiers[$stat['identifier']])) {
683 // total identifiers
684 $totidentifiers[$stat['identifier']] = 1;
685 }
686 if (!empty($stat['idorder']) && !isset($totbookings[$stat['identifier']])) {
687 // one conversion per tracking identifier
688 $totbookings[$stat['identifier']] = $stat['idorder'];
689 }
690 // loop through the nights of this tracking info record
691 $in_ts = strtotime($stat['checkin']);
692 $in_info = getdate($in_ts);
693 $out_ts = strtotime($stat['checkout']);
694 $out_dt = date('Y-m-d', $out_ts);
695 $in_dt = date('Y-m-d', $in_info[0]);
696 $now_los = 0;
697 while ($in_dt != $out_dt) {
698 if (!($in_ts < $out_ts)) {
699 // prevent any possible loop in case of records with invalid data
700 break;
701 }
702 $now_los++;
703 if (!isset($demands_nights[$in_dt])) {
704 $demands_nights[$in_dt] = 0;
705 }
706 // increase the requests for this night
707 $demands_nights[$in_dt]++;
708 if (!isset($demands_count[$in_dt])) {
709 $demands_count[$in_dt] = array();
710 }
711 if (!in_array($stat['idtracking'], $demands_count[$in_dt])) {
712 // push this visitor (tracking) ID to the counter for this night
713 array_push($demands_count[$in_dt], $stat['idtracking']);
714 }
715 // update next loop
716 $in_info = getdate(mktime(0, 0, 0, $in_info['mon'], ($in_info['mday'] + 1), $in_info['year']));
717 $in_dt = date('Y-m-d', $in_info[0]);
718 }
719 array_push($los_pool, $now_los);
720 }
721
722 // sort most demanded nights and best referrers
723 arsort($demands_nights);
724 arsort($referrer_count);
725
726 // count values that could be 0
727 $cnt_tot_idfs = count($totidentifiers);
728 $cnt_tot_idfs = $cnt_tot_idfs > 0 ? $cnt_tot_idfs : 1;
729 $cnt_los_pool = count($los_pool);
730 $cnt_los_pool = $cnt_los_pool > 0 ? $cnt_los_pool : 1;
731
732 // average conversion rate: 100 : totidentifiers = x : totbookings
733 $avg_conv_rate = 100 * count($totbookings) / $cnt_tot_idfs;
734 $avg_conv_rate = round($avg_conv_rate, 2);
735 $avg_conv_colr = '#550000'; //black-red
736 if ($avg_conv_rate > 33 && $avg_conv_rate <= 66) {
737 $avg_conv_colr = '#ff4d4d'; //red
738 } elseif ($avg_conv_rate > 66 && $avg_conv_rate < 100) {
739 $avg_conv_colr = '#ffa64d'; //orange
740 } elseif ($avg_conv_rate >= 100) {
741 $avg_conv_colr = '#2a762c'; //green
742 }
743
744 // average length of stay
745 $avg_los = array_sum($los_pool) / $cnt_los_pool;
746 $avg_los = round($avg_los, 1);
747 ?>
748 <div class="vbo-trackings-tabcont-stats" style="display: none;">
749 <div class="vbo-trackings-chart-bestnights">
750 <h4><?php echo JText::translate('VBTRKMOSTDEMNIGHTS'); ?></h4>
751 <?php
752 // the 14 most demanded nights
753 $max = 14;
754 $ind = 0;
755 foreach ($demands_nights as $dt => $tot) {
756 $dt_info = getdate(strtotime($dt));
757 ?>
758 <div class="vbo-trackings-chart-container" id="vbo-trackings-chart-container-<?php echo $dt; ?>">
759 <span class="vbo-trackings-chart-date"><?php echo JText::translate('VB'.strtoupper(substr($dt_info['weekday'], 0, 3))); ?>, <?php echo date(str_replace("/", $datesep, $df), $dt_info[0]); ?></span>
760 <div class="vbo-trackings-chart-cont">
761 <div class="vbo-trackings-chart-totreqs">
762 <span class="vbo-trackings-chart-tot"><?php echo $tot; ?></span>
763 <span class="vbo-trackings-chart-txt"><?php echo JText::translate('VBTRKREQSNUM'); ?></span>
764 </div>
765 <div class="vbo-trackings-chart-totviss">
766 <span class="vbo-trackings-chart-tot"><?php echo count($demands_count[$dt]); ?></span>
767 <span class="vbo-trackings-chart-txt"><?php echo JText::translate('VBTRKVISSNUM'); ?></span>
768 </div>
769 </div>
770 </div>
771 <?php
772 $ind++;
773 if ($ind >= $max) {
774 break;
775 }
776 }
777 ?>
778 </div>
779
780 <div class="vbo-trackings-chart-middle">
781
782 <div class="vbo-trackings-chart-avgvals">
783 <div class="vbo-trackings-chart-avgval-container">
784 <h4><?php echo JText::translate('VBTRKAVGVALS'); ?></h4>
785 <div class="vbo-trackings-chart-avgval-listcont">
786 <div class="vbo-trackings-avgval">
787 <div class="vbo-trackings-avgval-det">
788 <h5><?php echo JText::translate('VBTRKTOTVISS'); ?></h5>
789 <div class="vbo-trackings-chart-avgviss">
790 <span class="vbo-trackings-chart-tot"><?php echo count($totidentifiers); ?></span>
791 </div>
792 </div>
793 </div>
794 <div class="vbo-trackings-avgval">
795 <div class="vbo-trackings-avgval-det">
796 <h5><?php echo JText::translate('VBCUSTOMERTOTBOOKINGS'); ?></h5>
797 <div class="vbo-trackings-chart-totres">
798 <span class="vbo-trackings-chart-tot"><?php echo count($totbookings); ?></span>
799 </div>
800 </div>
801 </div>
802 <div class="vbo-trackings-avgval">
803 <div class="vbo-trackings-avgval-det">
804 <h5><?php echo JText::translate('VBTRKAVGLOS'); ?></h5>
805 <div class="vbo-trackings-chart-avglos">
806 <span class="vbo-trackings-chart-tot"><?php echo $avg_los; ?></span>
807 </div>
808 </div>
809 </div>
810 <div class="vbo-trackings-avgval">
811 <div class="vbo-trackings-avgval-det">
812 <h5><?php echo JText::translate('VBTRKAVGCONVRATE'); ?> <?php echo $vbo_app->createPopover(array('title' => JText::translate('VBTRKAVGCONVRATE'), 'content' => JText::translate('VBTRKAVGCONVRATEHELP'))); ?></h5>
813 <div class="vbo-trackings-chart-avgconvrate">
814 <span class="vbo-trackings-chart-tot" style="color: <?php echo $avg_conv_colr; ?>;"><?php echo $avg_conv_rate; ?></span>
815 <span class="vbo-trackings-chart-pcent">%</span>
816 </div>
817 </div>
818 </div>
819 </div>
820 </div>
821 </div>
822 <?php
823 if (count($referrer_count)) {
824 ?>
825 <div class="vbo-trackings-chart-referrers">
826 <h4><?php echo JText::translate('VBTRKBESTREFERRERS'); ?></h4>
827 <?php
828 // the 5 best referrers
829 $max = 5;
830 $ind = 0;
831 foreach ($referrer_count as $name => $tot) {
832 ?>
833 <div class="vbo-trackings-chart-referrer">
834 <span class="vbo-trackings-chart-date"><?php echo $name; ?></span>
835 <div class="vbo-trackings-chart-cont">
836 <div class="vbo-trackings-chart-totreqs">
837 <span class="vbo-trackings-chart-tot"><?php echo $tot; ?></span>
838 <span class="vbo-trackings-chart-txt"><?php echo JText::translate('VBTRKVISSNUM'); ?></span>
839 </div>
840 </div>
841 </div>
842 <?php
843 $ind++;
844 if ($ind >= $max) {
845 break;
846 }
847 }
848 ?>
849 </div>
850 <?php
851 }
852 ?>
853 </div>
854
855 </div>
856 </div>
857 <?php
858 }
859 ?>
860 <input type="hidden" name="vbo_active_tab" id="vbo_active_tab" value="">
861 <input type="hidden" name="option" value="com_vikbooking" />
862 <input type="hidden" name="task" value="trackings" />
863 <input type="hidden" name="boxchecked" value="0" />
864 <?php echo JHtml::fetch('form.token'); ?>
865 <?php echo $navbut; ?>
866 </form>
867