From: Laury GvR Date: Wed, 21 Jun 2017 15:58:35 +0000 (-0400) Subject: Adding the book now search widget script to theme X-Git-Tag: v1.0.0^2~16 X-Git-Url: http://cvs2.gaslightmedia.com/gitweb/?a=commitdiff_plain;h=2725ae047b000b753e63ee7bb7b4c223ff033d7d;p=WP-Themes%2Fgaylordmichigan.git Adding the book now search widget script to theme There are security issues with calling in the search_widget.js script for the booknow widget, so this commit sees it being included in the theme, with every instance of document.write therein replaced by inclusion through innerHTML. --- diff --git a/js/booknow/search_widget.js.php b/js/booknow/search_widget.js.php new file mode 100644 index 0000000..efb369e --- /dev/null +++ b/js/booknow/search_widget.js.php @@ -0,0 +1,1913 @@ +var lodging_box = document.getElementById('lodging_box'); +lodging_box.innerHTML = lodging_box.innerHTML + '\n' + + '\n' + + '\n' + + '\n' + + '
\n' + + '
\n' + + '
\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '
\n' + + ' \n' + + '
Check-In Date:
\n' + + '
\n' + + '
\n' + + ' \n' + + ' \n' + + '
\n' + + '
\n' + + ' \n' + + ' \n' + + '
Check-Out Date:
\n' + + '
\n' + + '
\n' + + ' \n' + + ' \n' + + '
\n' + + '
\n' + + ' \n' + + '
Select Lodging:
\n' + + '
\n' + + '
\n' + + '
\n' + + '
\n' + + ' \n' + + '
\n' + + '
\n' + + '\n'; +var jrDatePicker = function(params) { + // Define getElementsByClassName() for browsers that do not have this method defined (IE7). + if(typeof document.getElementsByClassName != 'function') { + document.getElementsByClassName = function() { + var elms = document.getElementsByTagName('*'); + var ei = new Array(); + for(i=0; i 11) { month = (month +3) % 12; year++; } + else { month += 3; } + break; + case '6M': + if((month + 6) > 11) { month = (month +6) % 12; year++; } + else { month += 6; } + break; + case '9M': + if((month + 9) > 11) { month = (month +9) % 12; year++; } + else { month += 9; } + break; + case '2Y': + year += 2; + break; + case '*': + year = 3125; + break; + default: // '1Y' is the default + year += 1; + } + return(new Date(year, month, date.getDate())); + }; + + var get_min_date = function(param_min_date) { + // Return a date object set to min_date. + // Acceptable parameter formats: 0, 3M, 6M, 9M, 1Y, 2Y, * (infinity) + var date = new Date(); + var month = date.getMonth(); + var year = date.getFullYear(); + + // If a Date object is passed in, use that. + if(param_min_date instanceof Date) { return(param_min_date); } + + switch(param_min_date) { + case '3M': + if((month - 3) < 0) { month = (month -3) % 12; year--; } + else { month -= 3; } + break; + case '6M': + if((month - 6) < 0) { month = (month -6) % 12; year--; } + else { month -= 6; } + break; + case '9M': + if((month - 9) < 0) { month = (month -9) % 12; year--; } + else { month -= 9; } + break; + case '1Y': + year -= 1; + break; + case '2Y': + year -= 2; + break; + case '*': + year = 1900; + break; + default: + break; // default is the current date + } + return(new Date(year, month, date.getDate())); + }; + + // jrDatePicker options and variables + var widget_number = params.widget_number || ''; + var MAX_CALENDARS = 2; + var dp_id_name = params.dp_id_name || ''; // selector id where to display the datepicker + var id_name = params.id_name || ''; // selector id where to populate a selected date + var locale = params.locale || 'en'; + var ondateselected_callback = (params.onDateSelected instanceof Function) ? params.onDateSelected : null; + var onclose_callback = (params.onClose instanceof Function) ? params.onClose : null; + var display_count = params.display_count || 1; + display_count = (display_count > MAX_CALENDARS) ? MAX_CALENDARS : display_count; + var close_onselect = params.close_onselect; + close_onselect = (close_onselect == undefined) ? true : close_onselect; + var max_date = get_max_date((params.max_date || '1Y')); // max date user can scroll forward to + var min_date = get_min_date((params.min_date || '*')); // min date user can scroll back to + + var currdate = new Date(); + var today = new Date(currdate.getFullYear(), currdate.getMonth(), currdate.getDate()); + var month_names = get_month_names(locale); // array of month names + var day_names = get_dow_names(locale); // array of day of week names + //var mn = currdate.getMonth(); // month 0 - 11 + //var yy = currdate.getFullYear(); // 4-digit year + var mn = (currdate.getTime() < min_date.getTime()) ? min_date.getMonth() : currdate.getMonth(); + var yy = (currdate.getTime() < min_date.getTime()) ? min_date.getFullYear() : currdate.getFullYear(); + + var citem = { + day: 0, + month: 0, + year: 1900, + first_dow: 0, + total_days: 0, + offset: 0, + multi_cal: '', + + markup: function(unique_id) { + var the_html = ''; + if(this.offset >= this.first_dow) { + var tmp_date = new Date(this.year, this.month, this.day); + var td_id = unique_id + this.month+ '_' + this.day + '_' + this.year; + if(tmp_date.valueOf() > max_date.valueOf()) { + the_html += '' + this.day + ''; + } + else if(tmp_date.valueOf() < min_date.valueOf()) { + the_html += '' + this.day + ''; + } + else if(tmp_date.valueOf() == today.valueOf()) { + the_html += '' + this.day + ''; + } + else { + the_html += '' + this.day + ''; + } + + if(this.day >= this.total_days) { this.first_dow = 999; } + } + else { the_html += ' '; } + this.offset++; + if(this.offset > this.first_dow) { this.day++; } + return(the_html); + } + }; + + var close_datepicker = function() { + if(close_onselect) { + document.getElementById(dp_id_name).innerHTML = ''; + if(id_name != '') { + document.getElementById(id_name).blur(); + } + + if(onclose_callback != undefined) { onclose_callback(); } + } + }; + + var select_date = function(mm, dd, yy) { + var the_month, the_day; + + mm++; // Note: mm is the month number 0 - 11 so always add 1. + if(mm < 10) { the_month = "0" + mm; } else { the_month = mm.toString(); } + if(dd < 10) { the_day = "0" + dd; } else { the_day = dd.toString(); } + + if(id_name != '') { + if(locale === 'en') { + document.getElementById(id_name).value = the_month + '/' + the_day + '/' + yy; + } + else { + document.getElementById(id_name).value = the_day + '/' + the_month + '/' + yy; + } + } + + if(ondateselected_callback != undefined) { ondateselected_callback(); } + close_datepicker(); + }; + + var month_inc = function() { + var scroll_date = new Date(yy, mn, today.getDate()); + if((scroll_date.getFullYear() == max_date.getFullYear()) && + (scroll_date.getMonth() >= max_date.getMonth())) { + return; + } + + if(mn < 11) { mn++; } + else { mn = 0; yy++; } + that.show(); + }; + + var month_dec = function() { + var scroll_date = new Date(yy, mn, today.getDate()); + if((scroll_date.getFullYear() == min_date.getFullYear()) && + (scroll_date.getMonth() <= min_date.getMonth())) { + return; + } + + if(mn > 0) { mn--; } + else { mn = 11; yy--; } + that.show(); + }; + + var dump_html = function(calendar_html) { + var the_html = ''; + for(var j=0; j') ch = '>
'; + else if(ch == ' ') ch = ' '; + the_html += ch; + } + the_html += '
'; + if(document.getElementById('htmldump') != null) + document.getElementById('htmldump').innerHTML = the_html; + }; + + + // Public methods + // + // Create an object literal (that) which includes properties and methods + // for public use. Any local variables defined outside of that{} or + // passed to jrDatePicker will remain private but still accessible + // from functions within that{}. + var that = { + version: '1.6.3', + + hide: function() { + close_datepicker(); + }, + + set_min_date: function(mdate) { + // This will override the min_date param. + if(mdate instanceof Date) { + min_date = mdate; + mn = (currdate.getTime() < min_date.getTime()) ? min_date.getMonth() : currdate.getMonth(); + yy = (currdate.getTime() < min_date.getTime()) ? min_date.getFullYear() : currdate.getFullYear(); + } + }, + + show: function() { + if(dp_id_name == undefined) return; + var calendar_html = ''; + var unique_id = 'jrdp_' + dp_id_name + '_'; + + + calendar_html = ''; + calendar_html += ''; + + for(i = 0; i < display_count; i++) { + citem.day = 1; + citem.month = mn; + citem.year = yy; + + if(i > 0) { + if(mn < 11) { citem.month = mn +1; } + else { citem.month = 0; citem.year = yy +1; } + } + + currdate.setDate(1); // set day of month to the 1st + currdate.setMonth(citem.month); // set the month + currdate.setFullYear(citem.year); // set to 4-digit year + + citem.offset = 0; + citem.first_dow = currdate.getDay(); // 0 - 6 (sun - sat) + citem.total_days = days_in_month(currdate.getMonth(), currdate.getFullYear()); + citem.multi_cal = (display_count > 1) ? '_multi' : ''; + + calendar_html += ''; + } + calendar_html += '
'; + calendar_html += ''; + + // This below snippet needs to eventually come out as it serves no purpose. + calendar_html += ' '; + // This above snippet needs to eventually come out as it serves no purpose. + + calendar_html += ' '; + calendar_html += ' '; + calendar_html += ' '; + calendar_html += ' '; + calendar_html += ' '; + + calendar_html += ' '; + for(var j = 0; j < 7; j++) { calendar_html += ''; } + calendar_html += ' '; + + var rows_printed = 0; + for(var j = 0; j < 6; j++) { + if(citem.first_dow == 999) { break; } + calendar_html += ' '; + for(var k = 0; k < 7; k++) { + calendar_html += citem.markup(unique_id); + } + calendar_html += ' '; + rows_printed++; + } + // Output empty rows if needed so we have a total of 6 rows printed. + for(var j = 0; j < (6-rows_printed); j++) { + calendar_html += ''; + for(var k = 0; k < 7; k++) { + calendar_html += ''; + } + calendar_html += ''; + } + calendar_html += '
'; + calendar_html += ' '; + calendar_html += ' '; + if(close_onselect) { + calendar_html += ' '; + } + else { calendar_html += ' '; } + calendar_html += '
'; + calendar_html += ' '; + calendar_html += ' '; + calendar_html += ' '; + calendar_html += '  
'; + calendar_html += '
'; + calendar_html += ' ' + month_names[citem.month] + ' ' + citem.year + ''; + calendar_html += '
' + day_names[j] + '
 
'; + calendar_html += '
'; + document.getElementById(dp_id_name).innerHTML = calendar_html; + + // Setup event listeners for elements. + // + // These methods replace the existing click event listener(s) on the element if there are any. + // Because this was essentially part of DOM 0, this method is very widely supported and requires + // no special cross–browser code; hence it is normally used to register event listeners dynamically. + for(var j = 0; j < i; j++) { + document.getElementById(unique_id + 'prevmonth' + citem.multi_cal + '_' + j).onclick = month_dec; + document.getElementById(unique_id + 'nextmonth' + citem.multi_cal + '_' + j).onclick = month_inc; + + document.getElementById(unique_id + 'prevmonth' + citem.multi_cal + '_' + j).style.display = 'block'; + document.getElementById(unique_id + 'nextmonth' + citem.multi_cal + '_' + j).style.display = 'block'; + } + + // Attach event listeners to the following events so that the datepicker + // will close when the user clicks outside of the calendar. + document.getElementsByTagName('body')[0].onmousedown = close_datepicker; + + document.getElementById('jrdp_' + dp_id_name).onmouseover = function(e) { + // IE 7-8 does not support event.currentTarget but does so for event.srcElement; + var target, target_id, ev = e || window.event; + var using_srcElement = false; + try { target = ev.currentTarget; } + catch(err) { target = ev.srcElement; using_srcElement = true; } + try { target_id = target.id; } + catch(err) { target_id = (target) ? target : 'jrdp_' + dp_id_name; } + if(target_id) { + //console.log('MOUSE OVER: target_id of triggered element: "' + target_id + '" using_srcElement: ' + using_srcElement); + document.getElementById(target_id).onmouseover = function() { + document.getElementsByTagName('body')[0].onmousedown = null; + }; + } + document.getElementsByTagName('body')[0].onmousedown = null; + }; + + document.getElementById('jrdp_' + dp_id_name).onmouseout = function(e) { + // IE 7-8 does not support event.currentTarget but does so for event.srcElement; + var target, target_id, ev = e || window.event; + var using_srcElement = false; + try { target = ev.currentTarget; } + catch(err) { target = ev.srcElement; using_srcElement = true; } + try { target_id = target.id; } + catch(err) { target_id = (target) ? target : 'jrdp_' + dp_id_name; } + if(target_id) { + //console.log('MOUSE OUT: target_id of triggered element: "' + target_id + '" using_srcElement: ' + using_srcElement); + document.getElementById(target_id).onmouseout = function() { + document.getElementsByTagName('body')[0].onmousedown = close_datepicker; + }; + } + document.getElementsByTagName('body')[0].onmousedown = close_datepicker; + }; + + // Bind event listeners to each day for the onclick event. Get an array of + // elements by the class name so we can get the element id name. + //var day_tds = document.querySelectorAll('.jrdp_calendar_day1' + citem.multi_cal); + var day_tds = document.getElementsByClassName('jrdp_calendar_day1' + widget_number + citem.multi_cal); + for(var i = 0; i < day_tds.length; i++) { + // The id is in the format of 'jrdp_idname_mm_dd_yy'. + // So if we split on the '_' then we can use the last three elements. + var items = day_tds[i].id.split('_'); + var mmtmp = items[items.length -3]; + var ddtmp = items[items.length -2]; + var yytmp = items[items.length -1]; + + var tmp_id = unique_id + mmtmp + '_' + ddtmp + '_' + yytmp; + + var s = 'document.getElementById("' + tmp_id + '").onclick = '; + s += 'function() { select_date(' + mmtmp + ',' + ddtmp + ',' + yytmp + '); };'; + + if(document.getElementById(tmp_id)) { + eval(s); + } + } + + // Check for the current day node because it will have a different class name. + //var curr_day_td = document.querySelectorAll('.jrdp_calendar_current_day' + citem.multi_cal); + var curr_day_td = document.getElementsByClassName('jrdp_calendar_current_day' + widget_number + citem.multi_cal); + if(curr_day_td.length > 0) { + var items = curr_day_td[0].id.split('_'); + var mmtmp = items[items.length -3]; + var ddtmp = items[items.length -2]; + var yytmp = items[items.length -1]; + + var tmp_id = unique_id + mmtmp + '_' + ddtmp + '_' + yytmp; + + var s = 'document.getElementById("' + tmp_id + '").onclick = '; + s += 'function() { select_date(' + mmtmp + ',' + ddtmp + ',' + yytmp + '); };'; + if(document.getElementById(tmp_id)) { + eval(s); + } + } + + // Uncomment the below to dump the html for debugging. Need an element with id='htmldump' + //dump_html(calendar_html); + } + }; + + return(that); +}; +lodging_box.innerHTML = lodging_box.innerHTML + '\n' + + '\n'; + +var flights_activated = 0; +var widget_filename = 'gaylordmichigan'; +var datepicker_last_date = '1Y'; + datepicker_last_date = (typeof(datepicker_last_date) == 'object') ? new Date(datepicker_last_date) : null; + +if(flights_activated) { + simpleAutocomplete.init(); +} + +var start_datepicker = jrDatePicker({ + dp_id_name: 'start-jrdatepicker', // selector id where to display the datepicker + id_name: 'start-date', // selector id where to populate a selected date + max_date: '1Y', + min_date: '0', + locale: 'en', + onDateSelected: function() { DatePicked('start-date', end_datepicker); } +}); + +var end_datepicker = jrDatePicker({ + dp_id_name: 'end-jrdatepicker', // selector id where to display the datepicker + id_name: 'end-date', // selector id where to populate a selected date + max_date: '1Y', + min_date: '0', + locale: 'en', + onDateSelected: function() { DatePicked('end-date'); } +}); + + + + + +if(document.getElementById('nights')) { document.getElementById('nights').onchange = DatePicked; } + +// Helper functions for tabs and extensions select list. +var create_input_element = function(id, value) { + if(!value) { value = '1'; } + // Create a hidden input element node and return it. + var node = document.createElement('input'); + node.setAttribute('id', id); + node.setAttribute('name', id); + node.setAttribute('value', value); + node.setAttribute('type', 'hidden'); + return(node); +} + +var remove_element_node = function(parent_node, id) { + if(document.getElementById(id)) { + parent_node.removeChild(document.getElementById(id)); + } +} + +var toggle_widget_tab = function(tab_id) { + // Toggle the selected tab. + document.getElementById('widget_tab_flights').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_activities').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_lodgings').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_packages').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_deals').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_restaurants').removeAttribute('class', 'active_tab'); + + // Toggle the selected custom tab + document.getElementById('widget_tab_activities_ctab').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_lodgings_ctab').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_packages_ctab').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_deals_ctab').removeAttribute('class', 'active_tab'); + document.getElementById('widget_tab_restaurants_ctab').removeAttribute('class', 'active_tab'); + + // Activate the proper tab. + if(document.getElementById(tab_id)) { + + var start_label_text, end_label_text; + switch(tab_id) { + case 'widget_tab_lodgings': + case 'widget_tab_lodgings_ctab': + ; + break; + case 'widget_tab_packages': + case 'widget_tab_packages_ctab': + ; + break; + case 'widget_tab_activities': + case 'widget_tab_activities_ctab': + ; + break; + case 'widget_tab_deals': + case 'widget_tab_deals_ctab': + ; + break; + case 'widget_tab_restaurants': + case 'widget_tab_restaurants_ctab': + ; + break; + case 'widget_tab_flights': + ; + break; + } + if(start_label_text) { + var jrs_start_label = document.getElementById("jrs_start_label"); + if(jrs_start_label) { jrs_start_label.innerHTML = start_label_text; } + } + if(end_label_text) { + var jrs_end_label = document.getElementById("jrs_end_label"); + if(jrs_end_label) { jrs_end_label.innerHTML = end_label_text; } + } + document.getElementById(tab_id).setAttribute('class', 'active_tab'); + } + + // Activate / Deactivate categories select lists when appropriate. + if(tab_id != 'widget_tab_lodgings' && tab_id != 'widget_tab_lodgings_ctab') { + if(document.getElementById('jrs_lodging_select_div')) { + document.getElementById('jrs_lodging_select_div').style.display = 'none'; + } + } + else { + if(document.getElementById('jrs_lodging_select_div')) { + document.getElementById('jrs_lodging_select_div').style.display = 'inline-block'; + } + } + + + + if(tab_id == 'widget_tab_flights'){ + var ac_input = document.getElementById("jrs_departure_airport_input"); + if(ac_input) ac_input.style.display = 'inline-block'; + } + else { + var ac_input = document.getElementById('jrs_departure_airport_input'); + if(ac_input) ac_input.style.display = 'none'; + } +}; + +var onclick_button_actions = function() { + jrs_search_button_update(); + + var asp_compat = 0; + if(asp_compat) { + submit_asp('https://gaylordmichigan.bookdirect.net/redirect_booking.php'); + return false; + } + + var ng_compat = 0; + if(ng_compat) { + var site_url = 'https://gaylordmichigan.bookdirect.net/redirect_booking.php' + active_tab_name() + '/'; + site_url = site_url.replace(/\/\/$/, '/'); + submit_ng(site_url, 'en'); + return false; + } + + // NOTE: this is for seetorontonow. Let's come up with a more generic way + // to do but this will suffice for now. + if(typeof ebConversionTracker == 'function') { + ebConversionTracker(); + } +} + +var active_tab_name = function() { + var widget_booking_form = document.getElementById('widget_booking_form'); + var jrs_calendar_form = document.getElementById('jrs_calendar_form'); + var parent_element = widget_booking_form ? widget_booking_form : jrs_calendar_form; + + if(document.getElementById('widget_tab_activities').getAttribute('class')) { + return 'activities'; + } else if(document.getElementById('widget_tab_activities_ctab').getAttribute('class')) { + return 'activities_ctab'; + } else if(document.getElementById('widget_tab_packages').getAttribute('class')) { + return 'packages'; + } else if(document.getElementById('widget_tab_packages_ctab').getAttribute('class')) { + return 'packages_ctab'; + } else if(document.getElementById('widget_tab_deals').getAttribute('class')) { + return 'deals'; + } else if(document.getElementById('widget_tab_deals_ctab').getAttribute('class')) { + return 'deals_ctab'; + } else if(document.getElementById('widget_tab_restaurants').getAttribute('class')) { + return 'restaurants'; + } else if(document.getElementById('widget_tab_restaurants_ctab').getAttribute('class')) { + return 'restaurants_ctab'; + } else if(document.getElementById('widget_tab_flights').getAttribute('class')) { + return 'flights'; + } else { + return ''; + } +}; + +var remove_tab_input_elements = function(parent_element) { + remove_element_node(parent_element, 'showSpecialsInit'); + remove_element_node(parent_element, 'showCustomSpecialsInit'); + remove_element_node(parent_element, 'showEventsInit'); + remove_element_node(parent_element, 'showCustomEventsInit'); + remove_element_node(parent_element, 'showRestaurantsInit'); + remove_element_node(parent_element, 'showCustomRestaurantsInit'); + remove_element_node(parent_element, 'showFlightsInit'); + remove_element_node(parent_element, 'showDealsInit'); + remove_element_node(parent_element, 'showCustomDealsInit'); + remove_element_node(parent_element, 'showCustomLodgingsInit'); +} + +var jrs_search_button_update = function() { + // Search through the ids to see which one has the 'active_tab' class. + var widget_booking_form = document.getElementById('widget_booking_form'); + var jrs_calendar_form = document.getElementById('jrs_calendar_form'); + var parent_element = widget_booking_form ? widget_booking_form : jrs_calendar_form; + var input_tag = null; + + // Note nothing to do for lodgings since it is the default. + if(parent_element) { + // clean up input elements + remove_tab_input_elements(parent_element); + + if(document.getElementById('widget_tab_activities').getAttribute('class')) { + input_tag = create_input_element('showEventsInit'); + } + else if(document.getElementById('widget_tab_activities_ctab').getAttribute('class')) { + input_tag = create_input_element('showCustomEventsInit', ''); + } + else if(document.getElementById('widget_tab_packages').getAttribute('class')) { + input_tag = create_input_element('showSpecialsInit'); + } + else if(document.getElementById('widget_tab_packages_ctab').getAttribute('class')) { + input_tag = create_input_element('showCustomSpecialsInit', ''); + } + else if(document.getElementById('widget_tab_deals').getAttribute('class')) { + input_tag = create_input_element('showDealsInit'); + } + else if(document.getElementById('widget_tab_deals_ctab').getAttribute('class')) { + input_tag = create_input_element('showCustomDealsInit', ''); + } + else if(document.getElementById('widget_tab_restaurants').getAttribute('class')) { + input_tag = create_input_element('showRestaurantsInit'); + } + else if(document.getElementById('widget_tab_restaurants_ctab').getAttribute('class')) { + input_tag = create_input_element('showCustomRestaurantsInit', ''); + } + else if(document.getElementById('widget_tab_flights').getAttribute('class')) { + input_tag = create_input_element('showFlightsInit'); + } + else if(document.getElementById('widget_tab_lodgings_ctab').getAttribute('class')) { + input_tag = create_input_element('showCustomLodgingsInit', ''); + } + + if(input_tag) { parent_element.appendChild(input_tag); } + } + + check_date_fields('1', '2'); +} + +var reset_campaign = function() { + // This function resets the campaign name back to its original form. + // It removes any widget extension name (tab name) appended to the campaign name. + var campaign = document.getElementById('campaign').value; + + if(campaign.indexOf('(widget)-lodgings') !== -1) { + var new_campaign = campaign.substring(0, campaign.indexOf('-lodgings')); + document.getElementById('campaign').value = new_campaign; + + } else if(campaign.indexOf('(widget)-specials') !== -1) { + var new_campaign = campaign.substring(0, campaign.indexOf('-specials')); + document.getElementById('campaign').value = new_campaign; + + } else if(campaign.indexOf('(widget)-deals') !== -1) { + var new_campaign = campaign.substring(0, campaign.indexOf('-deals')); + document.getElementById('campaign').value = new_campaign; + + } else if(campaign.indexOf('(widget)-activities') !== -1) { + var new_campaign = campaign.substring(0, campaign.indexOf('-activities')); + document.getElementById('campaign').value = new_campaign; + + } else if(campaign.indexOf('(widget)-restaurants') !== -1) { + var new_campaign = campaign.substring(0, campaign.indexOf('-restaurants')); + document.getElementById('campaign').value = new_campaign; + + } else if(campaign.indexOf('(widget)-flights') !== -1) { + var new_campaign = campaign.substring(0, campaign.indexOf('-flights')); + document.getElementById('campaign').value = new_campaign; + } +} + +var update_campaign = function(tab_name) { + reset_campaign(); + + var campaign = document.getElementById('campaign').value; + document.getElementById('campaign').value = campaign + '-' + tab_name; +} + +var display_checkout_field = function(display) { + display = display ? 'block' : 'none'; + document.getElementById('jrs_departure_input').style.display = display; +} + +// Attach event handler functions to the tabs. +if(document.getElementById('widget_tab_activities')) { + if(active_tab_name() == 'activities') { + display_checkout_field(true); + update_campaign('activities'); + } + + document.getElementById('widget_tab_activities').onclick = function() { + toggle_widget_tab('widget_tab_activities'); + display_checkout_field(true); + update_campaign('activities'); + }; +} +if(document.getElementById('widget_tab_activities_ctab')) { + if(active_tab_name() == 'activities_ctab') { + display_checkout_field(true); + update_campaign('activities'); + } + + document.getElementById('widget_tab_activities_ctab').onclick = function() { + toggle_widget_tab('widget_tab_activities_ctab'); + display_checkout_field(true); + update_campaign('activities'); + }; +} +if(document.getElementById('widget_tab_flights')) { + if(active_tab_name() == 'flights') { + display_checkout_field(true); + update_campaign('flights'); + } + + document.getElementById('widget_tab_flights').onclick = function() { + toggle_widget_tab('widget_tab_flights'); + display_checkout_field(true); + update_campaign('flights'); + }; +} +if(document.getElementById('widget_tab_lodgings')) { + if(active_tab_name() == '') { + display_checkout_field(true); + update_campaign('lodgings'); + } + + document.getElementById('widget_tab_lodgings').onclick = function() { + toggle_widget_tab('widget_tab_lodgings'); + display_checkout_field(true); + update_campaign('lodgings'); + }; +} +if(document.getElementById('widget_tab_lodgings_ctab')) { + if(active_tab_name() == '') { + display_checkout_field(true); + update_campaign('lodgings'); + } + + document.getElementById('widget_tab_lodgings_ctab').onclick = function() { + toggle_widget_tab('widget_tab_lodgings_ctab'); + display_checkout_field(true); + update_campaign('lodgings'); + }; +} +if(document.getElementById('widget_tab_packages')) { + if(active_tab_name() == 'packages') { + display_checkout_field(true); + update_campaign('specials'); + } + + document.getElementById('widget_tab_packages').onclick = function() { + toggle_widget_tab('widget_tab_packages'); + display_checkout_field(true); + update_campaign('specials'); + }; +} +if(document.getElementById('widget_tab_packages_ctab')) { + if(active_tab_name() == 'packages_ctab') { + display_checkout_field(true); + update_campaign('specials'); + } + + document.getElementById('widget_tab_packages_ctab').onclick = function() { + toggle_widget_tab('widget_tab_packages_ctab'); + display_checkout_field(true); + update_campaign('specials'); + }; +} +if(document.getElementById('widget_tab_deals')) { + if(active_tab_name() == 'deals') { + display_checkout_field(true); + update_campaign('deals'); + } + + document.getElementById('widget_tab_deals').onclick = function() { + toggle_widget_tab('widget_tab_deals'); + display_checkout_field(true); + update_campaign('deals'); + }; +} +if(document.getElementById('widget_tab_deals_ctab')) { + if(active_tab_name() == 'deals_ctab') { + display_checkout_field(true); + update_campaign('deals'); + } + + document.getElementById('widget_tab_deals_ctab').onclick = function() { + toggle_widget_tab('widget_tab_deals_ctab'); + display_checkout_field(true); + update_campaign('deals'); + }; +} +if(document.getElementById('widget_tab_restaurants')) { + if(active_tab_name() == 'restaurants') { + display_checkout_field(false); + update_campaign('restaurants'); + } + + document.getElementById('widget_tab_restaurants').onclick = function() { + display_checkout_field(false); + toggle_widget_tab('widget_tab_restaurants'); + update_campaign('restaurants'); + }; +} +if(document.getElementById('widget_tab_restaurants_ctab')) { + if(active_tab_name() == 'restaurants_ctab') { + display_checkout_field(false); + update_campaign('restaurants'); + } + + document.getElementById('widget_tab_restaurants_ctab').onclick = function() { + display_checkout_field(false); + toggle_widget_tab('widget_tab_restaurants_ctab'); + update_campaign('restaurants'); + }; +} + +// Assign an onclick event handler to the search button. +if(document.getElementById('jrs_search_submit_button')) { + document.getElementById('jrs_search_submit_button').onclick = onclick_button_actions; +} + +// This function is used to load non-blocking scripts. +function load_script(url, callback) { + // The callback function would be where analytics might be added. + // + var script = document.createElement('script') + script.type = 'text/javascript'; + + if(script.readyState) { // IE + script.onreadystatechange = function() { + if(script.readyState == 'loaded' || script.readyState == 'complete') { + script.onreadystatechange = null; + if(callback) { callback(); } + } + }; + } else { // Others + script.onload = function() { + if(callback) { callback(); } + }; + } + + script.src = url; + document.body.appendChild(script); +} +// widgets_jrdatepicker.js.php +function format_date(ms) { + var d = new Date(ms); + return zeropad((d.getMonth() +1), 2) + '/' + zeropad(d.getDate(), 2) + '/' + d.getFullYear(); // Jan = 0 +} + +function zeropad(num, zeros) { + var retval = ''; + var numstr = num.toString(); + for(var i = numstr.length; i < zeros; i++) { + retval += '0'; + } + retval += numstr; + return retval; +} + +function DatePicked(trigger, datepicker) { + var checkin_date = (document.getElementById('start-date')) ? document.getElementById('start-date').value : null; + var checkout_date = (document.getElementById('end-date')) ? document.getElementById('end-date').value : null; + var language = (document.getElementById('language')) ? document.getElementById('language').value : 'en'; + var nights = document.getElementById('nights'); + var oneDay = 1000*60*60*24; + var DSToffset = 1000*60*60*4; // Take into consideration daylight-savings time change. + var cindate, coutdate; + + // What triggered this function? + trigger = (trigger == 'start-date' || trigger == 'end-date') ? trigger : 'nights'; + + // Make format adjustments for locales. + if(language !== 'en') { + cindate = (checkin_date.match(/^\d{2}\/\d{2}\/\d{4}$/)) ? + new Date(checkin_date.split('/').reverse().join('/')) : null; + coutdate = (checkout_date.match(/^\d{2}\/\d{2}\/\d{4}$/)) ? + new Date(checkout_date.split('/').reverse().join('/')) : null; + } + else { + cindate = (checkin_date.match(/^\d{2}\/\d{2}\/\d{4}$/)) ? new Date(checkin_date) : null; + coutdate = (checkout_date.match(/^\d{2}\/\d{2}\/\d{4}$/)) ? new Date(checkout_date) : null; + } + + if(trigger == 'start-date' && cindate != null) { + var num_nights = (nights && !isNaN(nights.value)) ? parseInt(nights.value) : 1; + + // Customer can stay longer than min_stay; once nights are set use this + // value, until he resets by picking a different end date. The end-date + // picker gets its min-date reset to reflect min-stay. + var search_min_stay = 1; + var max_nights = Math.max(search_min_stay, num_nights); + + var max_checkout_date = new Date(cindate.getTime() + (oneDay * max_nights) + DSToffset); + var min_checkout_date = new Date(cindate.getTime() + (oneDay * search_min_stay) + DSToffset); + + if(language !== 'en') { + var dmy_date = zeropad(max_checkout_date.getDate(), 2) + '/' + + zeropad((max_checkout_date.getMonth() +1), 2) + '/' + + max_checkout_date.getFullYear(); + document.getElementById('end-date').value = dmy_date; + } else { + document.getElementById('end-date').value = format_date(max_checkout_date); + } + + // Set the minimum checkout date (minimum date selectable in datepicker). + coutdate = max_checkout_date; + if(datepicker) { + var mdate = new Date(min_checkout_date.getFullYear(), min_checkout_date.getMonth(), min_checkout_date.getDate()); + datepicker.set_min_date(mdate); + } + } + + if(cindate != null && coutdate != null && trigger != 'nights') { + var difference = parseInt((coutdate.getTime() - cindate.getTime()) / oneDay); + + if(nights) nights.value = difference; + + // Set the end-date to check-in date + nights. + var new_checkout_date = new Date(cindate.getTime() + (oneDay * difference) + DSToffset); + + if(datepicker_last_date && new_checkout_date.getTime() > datepicker_last_date.getTime()) { + var new_checkout_date = datepicker_last_date; + } + + if(language !== 'en') { + document.getElementById('end-date').value = zeropad(new_checkout_date.getDate(), 2) + '/' + + zeropad((new_checkout_date.getMonth() +1), 2) + '/' + + new_checkout_date.getFullYear(); + } else { + document.getElementById('end-date').value = format_date(new_checkout_date); + } + + } + else if(cindate != null && nights != null && trigger == 'nights') {//only fires on first entry + if(parseInt(nights.value) < 1) { + alert("You must select 1 or more nights."); + } + } + + if(language != 'en') { jrs_local_dates(); } + else { set_date_fields(); } +} + +function set_date_fields() { + var start_date = document.getElementById('start-date'); + var end_date = document.getElementById('end-date'); + var nights = document.getElementById('nights'); + + var sdate = (start_date) ? new Date(start_date.value) : null; + var edate = (end_date) ? new Date(end_date.value) : null; + + if(nights && sdate && edate) { + var ONE_DAY = 1000*60*60*24; + nights.value = parseInt((edate.getTime() - sdate.getTime()) / ONE_DAY); + } + + if(sdate) { + document.getElementById('sDay').value = zeropad(sdate.getDate(), 2); + document.getElementById('sMonth').value = zeropad((sdate.getMonth() +1), 2); + document.getElementById('sYear').value = sdate.getFullYear(); + } +} + +function submit_asp(site_url) { + // Not using jquery and need to encode the form elements (which jquery .serialize() would be used). + var form_data = ''; + var container = document.getElementById('jrs_calendar_form'); + var inputs = container.getElementsByTagName('input'); + for(var i = 0; i < inputs.length; ++i) { + // deal with inputs[index] element. + var name = inputs[i].name; + var value = inputs[i].value; + form_data += name + '=' + value + '&'; + } + + if(document.getElementById('lodgingID')) { + var categories = document.getElementById('lodgingID'); + var selected_value = categories.options[categories.selectedIndex].value; + form_data += 'lodgingID=' + selected_value + '&'; + } + + form_data = form_data.replace(/&$/, ''); // remove the last ampersand + + window.open(site_url + '?' + form_data); +} + +function to_YYYYMMDD(date_param, locale) { + // This function assumes that date_param is MM/DD/YYYY + // or DD/MM/YYYY depending upon the locale. + var result = '' + var d = date_param.split('/'); + if(d.length !== 3) { return result; } + if(!locale) { locale = 'en'; } + + if(locale === 'en') { + result = d[2].toString() + d[0].toString() + d[1].toString(); + } + else { + result = d[2].toString() + d[1].toString() + d[0].toString(); + } + + return result; +} + +function location_params() { + var form_data = ''; + var group_ids, region_group_ids, city_group_ids; + + group_ids = document.getElementById('jrs_location_group_id'); + if(group_ids) { + form_data += 'group_ids[]=' + group_ids.value + '&'; + } + + city_group_ids = document.getElementById('jrs_location_city_group_id'); + if(city_group_ids && city_group_ids.value) { + form_data += 'jrs_location_city_group_id=' + city_group_ids.value + '&'; + //document.getElementById('group_id').value = city_group_ids.value; + } + + if(city_group_ids && !city_group_ids.value) { + region_group_ids = document.getElementById('jrs_location_region_group_id_flex'); + if(region_group_ids && region_group_ids.value) { + form_data += 'jrs_location_region_group_id=' + region_group_ids.value + '&'; + } + } + + return form_data; +} + +function lodging_type_params() { + // Using a select list, there can be only one value however if there + // are multiple categories (lodging types) we would construct the + // following: category_ids[]=101&category_ids[]235&... + var form_data = ''; + var category_ids = document.getElementById('lodgingID'); + if(category_ids) { + form_data += 'category_ids[]=' + category_ids.value + '&'; + } + + var lodging_detail_id = document.getElementById('lodging_detail_id'); + if(lodging_detail_id) { + form_data += 'lodging_detail_id=' + lodging_detail_id.value + '&'; + } + return form_data; +} + +function submit_ng(site_url, locale) { + // This function is used to submit form data to our angular-js + // responsive template via querystring params. + + var form_data = ''; + var container = document.getElementById('jrs_calendar_form'); + var inputs = container.getElementsByTagName('input'); + if(!locale) { locale = 'en'; } + + // Encode the form elements like jquery .serialize() would do. + for(var i = 0; i < inputs.length; ++i) { + if(inputs[i].name === 'start-date') { + var checkin = to_YYYYMMDD(inputs[i].value, locale); + form_data += 'checkin=' + checkin + '&'; + } + else if(inputs[i].name === 'end-date') { + var checkout = to_YYYYMMDD(inputs[i].value, locale); + form_data += 'checkout=' + checkout + '&'; + } + } + + // We want checkin and checkout to be the first url params. + for(var i = 0; i < inputs.length; ++i) { + if(inputs[i].name === 'campaign') { + form_data += 'campaign=' + inputs[i].value + '&'; + } + else if(inputs[i].name === 'airport_code') { + form_data += 'airport_fragment=' + inputs[i].value + '&'; + } + } + + form_data += lodging_type_params(); + form_data += location_params(); + + if(locale !== 'en') { + form_data += 'locale=' + locale + '&'; + } + + form_data = form_data.replace(/&$/, ''); // remove last ampersand + + window.open(site_url + '?' + form_data); +} + +function jrs_local_dates() { + var now = new Date(); + var one_day = 1000*60*60*24; + var DSToffset = 1000*60*60*4; // Take into consideration daylight-savings time change. + + // Reverse a date in the format of dd/mm/yyyy into yyyy/mm/dd and get a Date object. + var checkin_date = new Date(document.getElementById('start-date').value.split('/').reverse().join('/')); + var checkout_date = new Date(document.getElementById('end-date').value.split('/').reverse().join('/')); + + document.getElementById('sDay').value = zeropad(checkin_date.getDate(), 2); + document.getElementById('sMonth').value = zeropad((checkin_date.getMonth() +1), 2); + document.getElementById('sYear').value = checkin_date.getFullYear(); + + var nights = Math.ceil((checkout_date.getTime() - DSToffset - checkin_date.getTime()) / (one_day)); + document.getElementById('nights').value = Math.max(nights, 1); +} + +function check_date_fields(start_date_offset, end_date_offset) { + // Set default start-date & end-date values using the offset parameters. + var start_date = (document.getElementById('start-date')) ? document.getElementById('start-date').value : ''; + var one_day = 1000*60*60*24; + var language = (document.getElementById('language')) ? document.getElementById('language').value : 'en'; + + // If date is valid return, else continue. + if(start_date.match(/^\d{2}\/\d{2}\/\d{4}$/)) { return; } + + // isNaN(null) returns false so check for null values. + if(start_date_offset == null || end_date_offset == null) { + start_date_offset = one_day; + end_date_offset = one_day * 2; + } + else { + start_date_offset = (isNaN(start_date_offset)) ? one_day : (parseInt(start_date_offset) * one_day); + end_date_offset = (isNaN(end_date_offset)) ? one_day : (parseInt(end_date_offset) * one_day); + } + + var curdate = new Date(); + var dsdate = new Date(curdate.getTime() + start_date_offset); // default start date + var dedate = new Date(curdate.getTime() + end_date_offset); // default end date + + if(language !== 'en') { + document.getElementById('start-date').value = zeropad(dsdate.getDate(), 2) + '/' + + zeropad((dsdate.getMonth() +1), 2) + '/' + + dsdate.getFullYear(); + document.getElementById('end-date').value = zeropad(dedate.getDate(), 2) + '/' + + zeropad((dedate.getMonth() +1), 2) + '/' + + dedate.getFullYear(); + } + else { + document.getElementById('start-date').value = zeropad((dsdate.getMonth() +1), 2) + '/' + + zeropad(dsdate.getDate(), 2) + '/' + + dsdate.getFullYear(); + document.getElementById('end-date').value = zeropad((dedate.getMonth() +1), 2) + '/' + + zeropad(dedate.getDate(), 2) + '/' + + dedate.getFullYear(); + } + DatePicked('nights', null); +} + load_script('//tag.yieldoptimizer.com/ps/ps?t=s&p=1824&pg=sh&si=517&shcy=Gaylord&shst=MI&shcr=United States&shid=&shod=&shna=1&ch=BookDirect'); + // Define functions +function track_event(action, label, value, boolean){ + if(typeof ga !== "function" || typeof __gaTracker !== "undefined") { return; } + //Event: WidgetLoad + if(AGA_on && action == 'WidgetLoad'){ + if(disable_WidgetLoad_event) { + // if the WidgetLoad event is disabled, + // we only track the JRS event. + ga('ga_jrs_tracker.send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + return; + } + if(GA_universal){ + ga('send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + ga('ga_jrs_tracker.send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + } else { + _gaq.push(['_trackEvent', 'BookDirect', action, label, value, boolean]); + ga('ga_jrs_tracker.send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + } + } else if (!AGA_on && action == 'WidgetLoad') { + ga('ga_jrs_tracker.send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + } + + //Event: WidgetSearch + if(AGA_on && action == 'WidgetSearch'){ + if(GA_universal) { + ga('send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + ga('ga_jrs_tracker.send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + } else { + _gaq.push(['_trackEvent', 'BookDirect', action, label, value, boolean]); + ga('ga_jrs_tracker.send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + } + } else if (!AGA_on && action == 'WidgetSearch') { + ga('ga_jrs_tracker.send', 'event', 'BookDirect', action, label, value, { nonInteraction: boolean }); + } +} + +function track_pageview(){ + if(typeof ga !== "function" || typeof __gaTracker !== "undefined") { return; } + // widget_filename set in search_widget_js.php + ga('ga_jrs_tracker.send', 'pageview', 'Widget/' + widget_filename); +} + +function convert_jrs_date(date){ + date = date.split('/'); + month = date[0]; + day = date[1]; + year = date[2]; + yymmdd = year+'/'+month+'/'+day; + return yymmdd; +} + +function days_between(date1, date2) { + // First we split the values to arrays date1[0] is the year, [1] the month and [2] the day + date1 = date1.split('/'); + date2 = date2.split('/'); + // Now we convert the array to a Date object, which has several helpful methods + date1 = new Date(date1[0], date1[1], date1[2]); + date2 = new Date(date2[0], date2[1], date2[2]); + // We use the getTime() method and get the unixtime (in milliseconds, but we want seconds, therefore we divide it through 1000) + date1_unixtime = parseInt(date1.getTime() / 1000); + date2_unixtime = parseInt(date2.getTime() / 1000); + // This is the calculated difference in seconds + var timeDifference = date2_unixtime - date1_unixtime; + // in Hours + var timeDifferenceInHours = timeDifference / 60 / 60; + // and finaly, in days :) + var timeDifferenceInDays = timeDifferenceInHours / 24; + return(timeDifferenceInDays); +} + +// Click submit button send ga info +function send_ga_info(){ + var date = new Date(); + var day = date.getDate(); + var month = date.getMonth()+1; + var year = date.getFullYear(); + var today = year+'/'+month+'/'+day; + var start_date=document.getElementById("start-date").value; + start_date = convert_jrs_date(start_date); + var proximity = days_between(today, start_date); + + var end_date=document.getElementById("end-date").value; + end_date = convert_jrs_date(end_date); + + var length_of_stay = days_between(start_date, end_date); + + track_event('WidgetSearch', 'Proximity: ' + proximity + + ' | checkin: ' + start_date + + ' | length of stay: ' + length_of_stay, 1, false); +} + +if (window.addEventListener) { + window.addEventListener('load', function() { + var element = document.getElementById('jrs_search_submit'); + element.addEventListener('click', send_ga_info, false); + }, false); +} else if (window.attachEvent) { + window.attachEvent('load', function() { + var element = document.getElementById('jrs_search_submit'); + element.attachEvent('onclick', send_ga_info); + }); +} + +var _gaq = _gaq || []; +AGA_on = false; +GA_universal = false; +disable_WidgetLoad_event = false; + + +//BEGIN Google Analytics Tracking Code +if(typeof ga == "undefined" && typeof __gaTracker == "undefined") { + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); +} +if(typeof ga == "function" && typeof __gaTracker == "undefined") { + // ga has to be a function and __gaTracker needs to be undefined. + ga('create', 'UA-7398746-42', { + 'name' : 'ga_jrs_tracker', + 'cookieName': '_ga_jrs'}); + + // Below we add cloneID to all GA widgets + // events when cloneID is present. + ga('ga_jrs_tracker.set', 'dimension1', '517'); + } +// Not tracking page view here. + +//END Google Analytics Tracking Code + +// Track page view for jrs +track_pageview(); +// Track page load event for client +track_event('WidgetLoad', widget_filename + '|' + window.location.href, 1, true); +lodging_box.innerHTML = lodging_box.innerHTML + ''; + + + + diff --git a/parts/top-bar.php b/parts/top-bar.php index ad8efb4..5ba0506 100644 --- a/parts/top-bar.php +++ b/parts/top-bar.php @@ -8,7 +8,7 @@