quickBooker = (function($) { function add(selector) { var $element = $(selector); $element.quickBooker(); return $element; } $.fn.quickBooker = function() { $(this).each(function() { var $container = $(this).find('.qb_container'); var id = $container.data('id'); var form = $container.find('#qb_form' + id); var loading = $container.find('#qb_loading' + id); $container.find('a').on('click', function(event) { event.preventDefault(); }); var widgetManager = (function() { var widgets = {}; var $html = $('html'); return { init: init, register: register, unRegister: unRegister, closeOtherWidgets: closeOtherWidgets }; function init() { $html.on('click', handleOutsideClick); } function register(key, hideFunction, $clearPropagation) { widgets[key] = hideFunction; if (typeof $clearPropagation !== 'undefined') { $clearPropagation.on('click', function(event) { event.stopPropagation(); }) } } function unRegister(key) { widgets[key] = null; } function closeOtherWidgets(key) { $.each(widgets, function(index, value) { if (index != key && value) { value(); } }); } function handleOutsideClick() { closeOtherWidgets('none'); } }()); widgetManager.init(); var hotel = (function() { var $hotel = $container.find('#qb_hotel_select' + id); var $select = $hotel.find('.dropdown_select').find('ul'); var $selected = $hotel.find('.dropdown_select').find('.selectHotelName'); var $input = $hotel.find('#qb_hotel_name' + id); var opened = false; return { init: init, $input: $input }; function init() { $hotel.on('click', handleToggleSelect); $select.on('click', 'a', handleChangeOption); widgetManager.register( 'hotel', function() {$select.slideUp(200);opened=false}, $hotel ); } function handleToggleSelect(event) { if (!opened) { widgetManager.closeOtherWidgets('hotel'); $select.slideToggle(200); opened = true; } event.preventDefault(); event.stopPropagation(); } function handleChangeOption(event) { var $element = $(this); if ($element.attr('data-name')) { $selected.html($element.html().slice(0, 50)); $input.val($element.data('name')); $select.slideToggle(200); opened = false; } event.stopPropagation(); event.preventDefault(); } }()); hotel.init(); var term = (function() { var format = "dd.mm.yyyy"; function formatDate(date) { return date.getDate() + '.' + (date.getMonth() + 1) + '.' + date.getFullYear(); } var dateSettings = { format: format, formatSubmit: format, clear: false, firstDay: 1 }; var checkOut = (function($container) { var $container = $container.find('#qb_date_to_container' + id); var $day = $container.find('.day'); var $month = $container.find('.month'); var $dateSelect = $container.find('.date_select'); var $dateInput = $container.find('#dateTo' + id); var $picker = $dateInput.pickadate(dateSettings).pickadate('picker'); // For some reason opening on change tab // Guarding if not opened through click or setMin var allowOpen = false; function allowOpenF() { allowOpen = true; } function disallowOpenF() { allowOpen = false; } function init() { widgetManager.register( 'dateTo', function() {close()}, $picker ); $picker.on({ set: setDatesSpan, open: checkOrigin }); $picker.set('min', new Date()); $picker.set('select', new Date()); $dateSelect.on('click', handleOpen); } function checkOrigin() { if (allowOpen) { disallowOpenF(); } else { close(); } } function open() { $picker.open(); } function close() { $picker.close(); } function handleOpen(event) { allowOpenF(); widgetManager.closeOtherWidgets('dateTo'); open(); event.preventDefault(); event.stopPropagation(); } function setDatesSpan(thing) { $day.html($picker.get('select', 'dd')); $month.html($picker.get('select', 'mmm')); } function setMin(min) { allowOpenF(); $picker.set('min', min); $dateInput.val(formatDate(min)); } function setDate(date) { $picker.set('select', date); } function setDateFromString(date) { var dateObject = new Date(date); setDate(dateObject); } return { init: init, setMin: setMin, open: open, close: close, setDateFromString: setDateFromString }; }($container)); var checkIn = (function($container) { var $container = $container.find('#qb_date_from_container' + id); var $day = $container.find('.day'); var $month = $container.find('.month'); var $dateSelect = $container.find('.date_select'); var $picker = $container.find('#dateFrom' + id).pickadate(dateSettings).pickadate('picker'); function init() { widgetManager.register( 'dateFrom', function() {close()}, $picker ); $picker.on({ set: updateDate, open: checkOut.close() }); $picker.set('min', new Date()); $picker.set('select', new Date()); $dateSelect.on('click', handleOpen); checkOut.close(); } function updateDate(thing) { if (thing.select) { $day.html($picker.get('select', 'dd')); $month.html($picker.get('select', 'mmm')); checkOut.setMin(getDate(1)); checkOut.open(); } } function handleOpen(event) { widgetManager.closeOtherWidgets('dateFrom'); $picker.open(); event.stopPropagation(); event.preventDefault(); } function close() { $picker.close(); } function setDate(date) { $picker.set('select', date); } function setDateFromString(date) { var dateObject = new Date(date); setDate(dateObject); checkOut.close(); } function getDate(addDays) { var date = $picker.get('select'); return new Date( date.year, date.month, date.date + addDays ) } return { init: init, getDate: getDate, close: close, setDateFromString: setDateFromString }; }($container, checkOut)); function init() { checkOut.init(); checkIn.init(); } return { init: init, checkIn: checkIn, checkOut: checkOut } }()); term.init(); var rooms = (function($container) { var $container = $container.find('#qb_room_select_container' + id); var $count = $container.find('.qb_count'); var $countInput = $container.find('#qb_rooms' + id); var $plus = $container.find('.qb_plus'); var $minus = $container.find('.qb_minus'); var changeHandlers = []; return { init: init, getCount: getCount, register: register }; function init() { $plus.on('click', handleAdd); $minus.on('click', handleRemove); } function handleAdd(event) { event.preventDefault(); var maxRooms = $count.data('max-rooms'); var roomsCount = $count.html(); if (Number(roomsCount) < Number(maxRooms)) { newRoomsCount = Number(roomsCount) + Number(1); $count.html(newRoomsCount); $countInput.val(newRoomsCount); $.each(changeHandlers, function(index, value) { value(newRoomsCount); }) } } function handleRemove(event) { event.preventDefault(); var roomCount = $count.html(); if ( Number(roomCount) > 1) { var newRoomCount = Number(roomCount) - Number(1); $count.html(newRoomCount); $countInput.val(newRoomCount); $.each(changeHandlers, function(index, value) { value(newRoomCount); }) } } function getCount() { return $count.html(); } function register(callback) { changeHandlers.push(callback); } }($container)); rooms.init(); var persons = (function($container) { var $selector = $container.find('#qb_person_room_selector' + id); var $active = $container.find('.qb_person_selector.active'); var $personSelectors = $container.find('.qb_person_selector'); var room = (function($container, $active) { var $room = $container.find('.qb_room_changer'); var $plus = $room.find('.qb_plus'); var $minus = $room.find('.qb_minus'); return { init: init }; function init() { rooms.register(handleRoomsCountChange); $plus.on('click', handleNext); $minus.on('click', handlePrevious); updateVisibleElements(); } function handleNext(event) { var self = $(this); event.preventDefault(); var maxRooms = self.parent('.qb_room_changer') .find('.qb_max_rooms') .data('max_rooms'); var roomCount = self.parent('.qb_room_changer') .find('.qb_active_room') .html(); if (Number(roomCount) < Number(maxRooms)) { var newRoomCount = Number(roomCount) + Number(1); setActive(newRoomCount); updateVisibleElements(); } } function handlePrevious(event) { var self = $(this); event.preventDefault(); var roomCount = self .parent('.qb_room_changer') .find('.qb_active_room') .html(); if (Number(roomCount) > 1) { var newRoomCount = Number(roomCount) - Number(1); setActive(newRoomCount); updateVisibleElements(); } } function handleRoomsCountChange(max) { var active = Number($active .find('.qb_room_changer') .find('.qb_active_room') .html() ); $personSelectors.each(function() { $(this).find('.qb_room_changer') .find('.qb_max_rooms') .html(max) .data('max_rooms', max); }); if (max < active) { setActive(max); } else { updateVisibleElements(); } } function setActive(count) { $active.toggleClass('active'); $active = $selector.find('#qb_persons_room_' + count + id); $active.toggleClass('active'); updateVisibleElements(); } function updateVisibleElements() { var max = rooms.getCount(); var min = 1; var actual = $active.find('.qb_room_changer') .find('.qb_active_room') .html(); if (actual == min) { $minus.css('visibility', 'hidden'); } if (actual > min) { $minus.css('visibility', 'visible'); } if (actual == max) { $plus.css('visibility', 'hidden'); } if (actual < max) { $plus.css('visibility', 'visible'); } if (min == max) { $room.css('visibility', 'hidden'); } if (max > min) { $room.css('visibility', 'visible'); } } }($container, $active, rooms)); room.init(); return { init: init }; function init() { room.init(); } }($container)); persons.init(); var promoCode = (function() { var loggedIn = false; var promoStatus = 'results'; var $toggleFormButton = $container.find('#qb_cs_toggle' + id); var $loginButton = $container.find('#promoLogIn' + id); var $logoutButton = $container.find('#promoLogOut' + id); var $form = $container.find('#qb_cs' + id); var $status = $container.find('#qb_cs_status' + id); var $codeInput = $container.find('#qb_cs_promocode' + id); return { $input: $codeInput, $form: $form, init: init, disableToggle: disableToggle, enableToggle: enableToggle, isLoggedIn: isLoggedIn, login: login, getPromoStatus: getPromoStatus, hideForm: hideForm, setDefault: setDefault }; function init() { $toggleFormButton.on('click', handleToggleForm); $loginButton.on('click', handleLogin); $logoutButton.on('click', handleLogout); widgetManager.register( 'promoCode', function() {promoCode.hideForm();}, $form ); } function disableToggle() { $toggleFormButton.off(); $toggleFormButton.on('click', function(event) {event.preventDefault()}); $toggleFormButton.addClass('disabled'); } function enableToggle() { $toggleFormButton.off(); $toggleFormButton.on('click', handleToggleForm); $toggleFormButton.removeClass('disabled'); } function isLoggedIn() { return loggedIn; } function getPromoStatus() { return promoStatus; } function hideForm() { $form.slideUp(); } function handleToggleForm(event) { if ($form.css('display') == 'block') { hideForm(); } else { widgetManager.closeOtherWidgets('promoCode'); $form.slideDown(); } widgetManager.closeOtherWidgets('promoCode'); event.preventDefault(); // TO stop scrolling on links event.stopPropagation(); } function verifyCode(code) { return $.ajax({type: "GET", headers: {"Content-type":"application/json"}, url: "http://booking.tmrhotels.com/api/verifyPromoCode", data: { promoCode: code}, crossDomain : true, dataType: "jsonp", jsonpCallback: 'promo', jsonp: 'callback' }); } function getSearchToken(hotelID, params) { return $.ajax({type: "GET", headers: {"Content-type":"application/json"}, url: "http://hotelapi.softsolutions.sk/horec/generateTokenForTmrHotel/" + hotelID, data: params, crossDomain : true, dataType: "jsonp", jsonpCallback: 'token', jsonp: 'callback' }); } function handleLogin() { loading.fadeIn(); verifyCode($codeInput.val()) .success(handleLoginSuccess) .error(handleLoginError); } function handleLoginSuccess(data) { if (data.status == 'OK') { login(); $form.show(); } else { $status.html(data.status.replace("neexistuje", '"' + $codeInput.val() + '"' + " neexistuje")); $codeInput.val(''); } loading.fadeOut(); } function login(code) { loggedIn = true; disableToggle(); goPass.disableToggle(); if (typeof code !== 'undefined') { $codeInput.val(code); } $status.html(form.data('tr_goodday')); $codeInput.prop('readonly', true); $logoutButton.show(); $loginButton.hide(); widgetManager.unRegister('promoCode'); promoStatus = 'promoResults'; } function handleLoginError(data) { $codeInput.html(data.status.replace("neexistuje", '"'+ $codeInput.val()+ '"' + " neexistuje")); $codeInput.val(''); loading.fadeOut(); } function handleLogout() { var selectedHotel = hotel.$input.val(); loggedIn = false; if ($.inArray(selectedHotel, ['all', 'vt', 'nt'])) { $urlRoute = {all: 'Tatry', vt: 'Vysoke_Tatry', nt: "Nizke_Tatry"}; form.attr('action', 'http://booking.tmrhotels.com/' + $urlRoute[selectedHotel] + '/upsell/'); } else { form.attr('action', 'http://booking.tmrhotels.com/' + selectedHotel + '/results/'); } $codeInput.prop('readonly', false); $codeInput.val(''); $status.html(''); enableToggle(); goPass.enableToggle(); widgetManager.register('promoCode', function() {hideForm();}); $logoutButton.hide(); $loginButton.show(); promoStatus = 'results'; } function setDefault(code) { login(code); $logoutButton.addClass('disabled'); $logoutButton.prop('disabled', 'disabled'); } }()); promoCode.init(); var goPass = (function(){ var loggedIn = false; var $toggleFormButton = $container.find('#qb_gopas_toggle' + id); var $toggleDescriptionButton = $container.find('#qb_gopass_toggle_content' + id); var $form = $container.find('#qb_gopass' + id); var $description = $container.find('#qb_gopass_discount_content' + id); var $loginButton = $container.find('#qb_gopass_login' + id); var $logoutButton = $container.find('#qb_gopass_logout' + id); var $codeInput = $container.find('#qb_gopass_code' + id); var $status = $container.find('#qb_gopass_status' + id); var $user = $container.find('#qb_gopass_user' + id); var $userFirstName = $container.find('#qb_gopass_firstName' + id); var $userLastName = $container.find('#qb_gopass_lastName' + id); var $userPoints = $container.find('#qb_gopass_points' + id); return { $input: $codeInput, $form: $form, init: init, disableToggle: disableToggle, enableToggle: enableToggle, isLoggedIn: isLoggedIn, hideForm: hideForm }; function init() { $toggleFormButton.on('click', handleToggleForm); $toggleDescriptionButton.on('click', handleToggleDescription); $loginButton.on('click', handleLogin); $logoutButton.on('click', handleLogout); widgetManager.register( 'goPass', function() {goPass.hideForm();}, goPass.$form ); } function disableToggle() { $toggleFormButton.off(); $toggleFormButton.on('click', function(event) {event.preventDefault()}); $toggleFormButton.addClass('disabled'); } function enableToggle() { $toggleFormButton.off(); $toggleFormButton.on('click', handleToggleForm); $toggleFormButton.removeClass('disabled'); } function isLoggedIn() { return loggedIn; } function hideForm() { $form.slideUp(); } function handleToggleForm(event) { if ($form.css('display') == 'block') { hideForm(); } else { widgetManager.closeOtherWidgets('goPass'); $form.slideDown(); if ($(document).width() <= 700) { $('html,body').animate({ scrollTop: $form.offset().top - 80 }, 200); } } event.preventDefault(); // TO stop scrolling on links event.stopPropagation(); } function handleToggleDescription() { if (document.body.clientWidth <= 1040) { if ($description.css('display') == 'block') { $description.slideUp(); } else { $description.slideDown(); } } } function verifyCode(code){ return $.ajax({type: "GET", headers: {"Content-type":"application/json"}, url: "http://booking.tmrhotels.com/api/verifyGopassCard", data: { gopassCardNumber: code}, crossDomain : true, dataType: "jsonp", jsonpCallback: 'goPass', jsonp: 'callback' }); } function handleLogin() { loading.fadeIn(); verifyCode($codeInput.val()) .success(handleLoginSuccess) .error(handleLoginError) } function handleLoginSuccess(data) { if (data.status == 'OK') { login(data.FirstName, data.LastName, data.points); } else { $status.html(data.status); } loading.fadeOut(); } function login(firstName, lastName, points) { loggedIn = true; $form.hide(); $user.show(); $userFirstName.html(firstName); $userLastName.html(lastName); $userPoints.html(points); disableToggle(); promoCode.disableToggle(); } function handleLoginError(data) { $status.html('Problém z pripojením.'); loading.fadeOut(); } function handleLogout() { $user.slideUp(); loggedIn = false; enableToggle(); promoCode.enableToggle(); $codeInput.val(''); event.preventDefault(); } }()); goPass.init(); $.fn.quickBooker.promoCode = promoCode; $.fn.quickBooker.checkIn = term.checkIn; $.fn.quickBooker.checkOut = term.checkOut; initQuickBooker(id, $container, form, hotel.$input, widgetManager, promoCode, goPass); }) }; return { add : add }; function initQuickBooker(id, $container, form, hotelName, widgetManager, promoCode, goPass) { // Cache DOM var roomSelectContainer = $container.find('#qb_room_select_container' + id); var destination = $container.find('#qb_destination' + id); var $langInput = $('#qb_lang' + id); var childSelects = form.find('.qb_child_select'); childSelects.on('click', function(e){ e.preventDefault(); e.stopPropagation(); // After click on body, closes $(this).parent('.qb_person_selector').find('.qb-children-age-selector').slideDown(500); widgetManager.closeOtherWidgets('childrenAgeSelector'); }); var childrenAgeSelector = form.find('.qb-children-age-selector'); childrenAgeSelector.on('input', 'input[type=number]', function() { var room = $(this).parent().parent().parent().find('.qb_active_room').html(); var childCount = 0; var maxChildrensCount = form.data('max_childrens_count'); for(var i = 1; i <= maxChildrensCount; i++) { childCount += Boolean(Number($(this).parent().parent().find('.qb-child-' + room + '-' + i).val())); } $(this).parent().parent().parent().find('.qb_child_select').find('.count').html(childCount); }); childrenAgeSelector.find('.qb-close-age-selector').on('click', function(e){ e.preventDefault(); $(this).parent('.qb-children-age-selector').slideUp(); $(this).parents('.qb_person_selector').find('.room_changer').show(); }); // persons count var personSelect = form.find('.person_select'); personSelect.find('.qb_plus').on('click', function(e){ e.preventDefault(); maxAdultsCount = $(this).parent('.person_select').find('.qb-room-actual-adult-count').data('max-adults'); roomCount = $(this).parent('.person_select').find('.qb-room-actual-adult-count').html(); if ( Number(roomCount) < Number(maxAdultsCount)) { newRoomCount = Number(roomCount) + Number(1); $(this).parent('.person_select').find('.qb-room-actual-adult-count').html(newRoomCount); $(this).parent('.person_select').find('.qb-room-adult-count').val(newRoomCount); } }); personSelect.find('.qb_minus').on('click', function(e) { e.preventDefault(); var roomCount = $(this).parent('.person_select').find('.qb-room-actual-adult-count').html(); if (Number(roomCount) > 1) { var newRoomCount = Number(roomCount) - Number(1); $(this).parent('.person_select').find('.qb-room-actual-adult-count').html(newRoomCount); $(this).parent('.person_select').find('.qb-room-adult-count').val(newRoomCount); } }); // Validate form submission $('#submit_form' + id).on('click', function(event) { console.log("Submit form"); // Require hotel if ($container.find('#qb_hotel_name' + id).val() == '') { event.preventDefault(); alert('Zvolte prosím hotel'); } // Remove unused Rooms var count = roomSelectContainer.find('.count'); var rooms = Number(count.html()); var maxRooms = Number(count.data('max-rooms')); for (var i = (rooms + 1); i <= maxRooms; i++) { $container.find('#qb_persons_room_' + i + id).find('input').each(function() { $(this).val(''); }); } // Generate action link var selectedHotel = hotelName.val(); // Remove gopass and promoCode if user not logged in if (!promoCode.isLoggedIn()) { promoCode.$input.val(''); } if (!goPass.isLoggedIn()) { goPass.$input.val(''); } var baseUrl = form.attr('action'); destination.val(selectedHotel); if (!(form.data('old') == 'old')) { if (selectedHotel == 'all' || selectedHotel == 'vt' || selectedHotel == 'nt') { $urlRoute = {all: 'Tatry', vt: 'Vysoke_Tatry', nt: "Nizke_Tatry"}; baseUrl += $urlRoute[selectedHotel] + (($langInput.val() != 'sk') ? ('/' + $langInput.val() + '/') : '/') + 'upsell/'; } else { baseUrl += selectedHotel + (($langInput.val() != 'sk') ? ('/' + $langInput.val() + '/') : '/') + promoCode.getPromoStatus() + '/'; } } else { console.log("Old"); baseUrl += promoCode.getPromoStatus() + '/'; } // Clean empty parameters var params = []; form.find('input').each(function() { var self = $(this); if (self.val() != '' && self.val() != '0') { var name = self.attr('name'); var value = self.val(); if (name != 'date_from_submit' && name != 'date_until_submit' && typeof name !== 'undefined') { params.push(self.attr('name') + '=' + encodeURIComponent(value)); } } }); if (selectedHotel == "Chalets_Jasna") { $.ajax({ type: 'GET', url: 'http://hotelapi.softsolutions.sk/horec/generateTokenForTmrHotel/2/?' + params.join('&'), crossDomain: true, async: false, success: function(responseData, textStatus, jqXHR) { window.open('http://booking.tmrhotels.com/' + selectedHotel + '/search/' + responseData.token); event.preventDefault(); event.stopPropagation(); }, error: function (responseData, textStatus, errorThrown) { } }); //redirectWindow.location; event.preventDefault(); event.stopPropagation(); } else { window.open(baseUrl + params.join('&')); event.preventDefault(); event.stopPropagation(); } }); widgetManager.register( 'childrenAgeSelector', function() {$('.qb-children-age-selector').slideUp();}, form.find('.qb-children-age-selector') ); } }(window.jQuery));