/* Minification failed. Returning unminified contents.
(5437,35-36): run-time error JS1013: Syntax error in regular expression: ;
 */
define('accessibility', ['jquery'],
    function ($) {
        var init = function () {

            addTabindex();
            runAddAlternativeText();
        };

        var addTabindex = function () {
            $(".button-group a").attr('tabindex', 0);
            $(".button-group button").attr('tabindex', 0);
            $(".v__conv").removeAttr("role");

            $(".stackla-widget iframe").attr('tabindex', -1).attr('role', 'presentation').attr('aria-hidden', 'true');
        }

        var runAddAlternativeText = function () {
            var iterations = 0;

            var interval = setInterval(function () {

                var imagesList = addAlternativeText();

                if (iterations < 3) {

                    if (imagesList == 0)
                        iterations++;
                }
                else
                    clearInterval(interval);
            }, 1000);
        }

        var addAlternativeText = function () {
            var imagesList = $("img:not([alt])");

            if (imagesList.length > 0)
                imagesList.each(function () {
                    $(this).attr("alt", "");
                });

            return imagesList.length;
        }

        return {
            init: init
        };
  });;
define('actionBar', ['jquery', 'knockout', 'context', 'ViewModels/actionBarUi', 'utils',
        /* Dependencies without component accessible through variable */ 'jquery-foundation.datepicker', 'jquery-styles'],
    function ($, ko, context, actionBarUi, utils) {
        var init = function (dictionary, hotels, hotelsWithMeetingRooms, regionsWithMeetingRooms, defaultAction, options, activitiesList, timesList) {

            actionBarUi.selectedAction(defaultAction);

            //Room booking
            actionBarUi.roomBookingActionViewModel.dictionary(dictionary);
            actionBarUi.roomBookingActionViewModel.hotels(hotels);
            actionBarUi.roomBookingActionViewModel.isRoomSelectionEnabled(options.RoomBookingOptions.IsRoomSelectionEnabled);
            actionBarUi.roomBookingActionViewModel.isGuestSelectionEnabled(options.RoomBookingOptions.IsGuestSelectionEnabled);
            actionBarUi.roomBookingActionViewModel.isWhereSelectionEnabled(options.IsWhereSelectionEnabled);                        
            actionBarUi.roomBookingActionViewModel.defaultNumberOfAdultsPerRoom(options.RoomBookingOptions.DefaultNumberOfAdultsPerRoom);
            actionBarUi.roomBookingActionViewModel.defaultNumberOfChildrenPerRoom(options.RoomBookingOptions.DefaultNumberOfChildrenPerRoom);
            actionBarUi.roomBookingActionViewModel.regions(options.RoomBookingOptions.Regions);
            actionBarUi.roomBookingActionViewModel.init();
            
            //Activity booking
            actionBarUi.activityBookingActionViewModel.activitiesList(activitiesList);
            actionBarUi.activityBookingActionViewModel.timesList(timesList);
            actionBarUi.activityBookingActionViewModel.formUrl(options.ActivityBookingOptions.ActionBookingFormUrl);
            
            //MeetingRoom booking
            actionBarUi.meetingRoomBookingActionViewModel.hotels(hotelsWithMeetingRooms);
            actionBarUi.meetingRoomBookingActionViewModel.regions(regionsWithMeetingRooms);
            actionBarUi.meetingRoomBookingActionViewModel.formUrl(options.MeetingRoomBookingUrl);

            actionBarUi.init();

            isStickyEverytime();

            //Form Elements override
            var elements = $(".booking-form").find("select:not(.native-select), input[type=number]");
           
            $(document).ready(function () {
                elements.each(function () {
                    var self = $(this);
                    self.styler();
                });
            });


            applyLastSearchOptions();
        };

        var applyLastSearchOptions = function () {

            var roomBookingStr = $.cookie("roomBooking");
            var activityBookingStr = $.cookie("activityBooking");

            if (roomBookingStr != undefined) {

                var roomBookingContainer = $(".book-a-room");
                var roomBookingGlobal = $.parseJSON(roomBookingStr);
                var roomBooking = roomBookingGlobal.bookingSettings;

                if (roomBooking.ArrivingDate != undefined && roomBooking.ArrivingDate != null) {
                    var roomDate = roomBookingContainer.find(".room-arriving input");

                    actionBarUi.roomBookingActionViewModel.bookingAction.ArrivingDate(roomBooking.ArrivingDate);
                    roomDate.val(utils.date.toFormattedString(roomBooking.ArrivingDate, "DD-MMM-YYYY"));
                }

                if (roomBooking.NumberOfRooms != undefined && roomBooking.NumberOfRooms != null)
                    actionBarUi.roomBookingActionViewModel.bookingAction.NumberOfRooms(roomBooking.NumberOfRooms);

                if (roomBooking.Rooms != undefined && roomBooking.Rooms != null) {
                    actionBarUi.roomBookingActionViewModel.bookingAction.Rooms([]);

                    $.each(roomBooking.Rooms, function (i, item) {
                        actionBarUi.roomBookingActionViewModel.bookingAction.addRoom(item.NumberOfAdults, item.NumberOfChildren);
                    });
                }

                if (roomBooking.NumberOfNights != undefined && roomBooking.NumberOfNights != null)
                    actionBarUi.roomBookingActionViewModel.bookingAction.NumberOfNights(roomBooking.NumberOfNights);

                if (roomBooking.HotelId != undefined && roomBooking.HotelId != null) {
                    var roomHotel = roomBookingContainer.find(".room-where select");

                    actionBarUi.roomBookingActionViewModel.bookingAction.selectedWhereItem({ Id: roomBooking.HotelId });
                    actionBarUi.roomBookingActionViewModel.bookingAction.HotelId(roomBooking.HotelId);

                    roomHotel
                        .find("option:contains(" + roomBookingGlobal.hotelName + ")")
                        .attr('selected', true)
                        .trigger('refresh');
                }

            }

            if (activityBookingStr != undefined) {

                var activityBookingContainer = $(".book-activity");
                var activityBooking = $.parseJSON(activityBookingStr);
                var isAdults = false;
                var isChildren = false;

                if (activityBooking.activity != undefined && activityBooking.activity != null) {

                    var dropdownActility = activityBookingContainer.find(".activity-what select");

                    actionBarUi.activityBookingActionViewModel.activity.activity(activityBooking.activity);                   
                    dropdownActility.val(activityBooking.activity).trigger('refresh');
                }

                if (activityBooking.date != undefined && activityBooking.date != null) {
                    var activityDate = activityBookingContainer.find(".activity-when input");

                    actionBarUi.activityBookingActionViewModel.activity.date(activityBooking.date);
                    activityDate.val(utils.date.toFormattedString(activityBooking.date, "DD-MMM-YYYY"));
                }

                if (activityBooking.time != undefined && activityBooking.time != null) {

                    var dropdownTime = activityBookingContainer.find(".activity-time select");

                    actionBarUi.activityBookingActionViewModel.activity.time(activityBooking.time);
                    dropdownTime.val(activityBooking.time).trigger('refresh');

                }

                var activityBookingPersons = activityBookingContainer.find(".activity-persons");

                if (activityBooking.adults != undefined && activityBooking.adults != null) {
                    activityBookingPersons.find(".input.left input").val(activityBooking.adults);
                    actionBarUi.activityBookingActionViewModel.activity.numberOfAdults(activityBooking.adults);
                    isAdults = true; 
                }

                if (activityBooking.children != undefined && activityBooking.children != null) {
                    activityBookingPersons.find(".input.right input").val(activityBooking.children);
                    actionBarUi.activityBookingActionViewModel.activity.numberOfChildren(activityBooking.children);
                    isChildren = true;
                }

                if (isAdults && isChildren) {
                    var guests = +activityBooking.adults + +activityBooking.children;

                    activityBookingPersons.find("#activity-persons").text(guests);
                    activityBookingPersons.find(".total-persons").text(guests);
                }

                actionBarUi.selectedAction("book-an-activity");
                $("#like-to").val("book-an-activity").trigger('refresh');
            }
        }

        var isStickyEverytime = function () {
            var bookingBar = $(".booking-form-container");

            if (bookingBar.length > 0) {
                var parentContainer = bookingBar.parent();

                if (parentContainer.length > 0) {

                    var sibllingItem = parentContainer.siblings(".featured-carousel, .homepage-banner");

                    if (sibllingItem.length == 0)
                        parentContainer.addClass("sticky-everytime");
                }
            }
        }

        return {
            init: init
        };
    });;
define('addPlaceholder', ['jquery'],
    function () {
        var init = function () {
            dropdownPlaceholder = $("select.form-control option[value='$placeholder']");
            
            dropdownPlaceholder.val("");
        };

        return {
            init: init
        };
    });;
define('asyncDOMService', ['jquery'],
    function ($) {
        var asyncContents = [];

        var addContent = function (targetElementId, content) {
            asyncContents.push({ id: targetElementId, content: content });
        };

        var run = function () {
            $.each(asyncContents, function(index, value) {
                var htmlToAppend = $("<div/>").html(value.content).text();
                $(value.id).append(htmlToAppend);
            });                        
        };

        return {
            addContent: addContent,
            run: run
        };
    });;
define('binder', ['jquery', 'knockout', 'context', 'ViewModels/actionBarUi', 'ViewModels/cookieBarUi', 'ViewModels/eventEnquiryFormUi', 'ViewModels/generalEnquiryFormUi',
        'ViewModels/meetingRoomFormUi', 'ViewModels/jobApplicationFormUi', 'ViewModels/languageSelectorUi', 'ViewModels/searchBarUi', 'ViewModels/meetingRoomTableUi',
        'ViewModels/newsletterUi', 'ViewModels/siteRegionSwitchUi', 'ViewModels/filteredArticleUi'],
    function ($, ko, context, actionBarUi, cookieBarUi, eventEnquiryFormUi, generalEnquiryFormUi, meetingRoomFormUi, jobApplicationFormUi,
        languageSelectorViewModel, searchBarViewModel, meetingRoomTableUi, newsletterUi, siteRegionSwitchUi, filteredArticleUi) {
        
        ko.utils.domNodeDisposal.cleanExternalData = function () {
            // Do nothing. Now any jQuery data associated with elements will
            // not be cleaned up when the elements are removed from the DOM.
        };
        
        var applyClassWideBindings = function (className, viewModel, options) {
            $(className).each(function (index, element) {
                var deleteBindings = true;
                if (options && options.keepExistingBindings === true) {
                    deleteBindings = false;
                }

                if (deleteBindings) {
                    ko.cleanNode(element);
                }                
                
                ko.applyBindings(viewModel, element);                
            });
        };

        var applyAllBindings = function () {
            applyClassWideBindings('.newsletter-signup', newsletterUi);
            applyClassWideBindings('.booking-form-container', actionBarUi);
            applyClassWideBindings('.make-contact', context);
            applyClassWideBindings('.cookie-notification-wrapper', cookieBarUi);
            applyClassWideBindings('.event-enquiry-form', eventEnquiryFormUi);
            applyClassWideBindings('.general-enquiry-form-2', generalEnquiryFormUi);
            applyClassWideBindings('.meeting-room-form', meetingRoomFormUi);
            applyClassWideBindings('.job-application-form', jobApplicationFormUi);
            applyClassWideBindings('.languageSelector', languageSelectorViewModel);
            applyClassWideBindings('.site-search-form', searchBarViewModel);
            applyClassWideBindings('.meeting-room-table', meetingRoomTableUi);
            applyClassWideBindings('.site-region-switch-wrapper', siteRegionSwitchUi);
            applyClassWideBindings('.filtered-article', filteredArticleUi);
        };

        return {
            applyClassWideBindings: applyClassWideBindings,
            applyBindings: ko.applyBindings,
            applyAllBindings: applyAllBindings
        };
    });;
define('blogHelper', ['jquery', 'jquery-owlCarousel'],
    function ($) {
        var init = function () {

            articlesCarousel($(".articles-carousel .owl-carousel"));
            articlesFilter($(".articles-carousel .filter"));
            artilesLoading($(".articles-list"));
            wideImages($(".article-body"));
            clickItem($(".blog ._list .item"));

            setTimeout(updateWideImages, 1000);

            $(window).resize(function () {
                updateWideImages();
            });
        };

        var articlesCarousel = function ($element) {
            $element.owlCarousel({
                items: 1,
                navigation: true,
                navigationText: [$("<a class='arrow-left' hre=#></a>"), $("<a class='arrow-right' hre=#></a>")],
                rewindNav: true,
                autoplay: true,
                autoplayHoverPause: true,
                singleItem: true,
                autoHeight: true,
            });
        }

        var articlesFilter = function ($element) {
            var link = $element.find(".choosen-category");
            var list = $element.find(".categories-list");

            link.click(function () {

                if (!list.hasClass("active")) {
                    list.addClass("active");
                    $(this).addClass("active");
                }
                else {
                    list.removeClass("active");
                    $(this).removeClass("active");
                }

                return false;
            });

        }

        var artilesLoading = function ($element) {

          if ($element.length == 0) return;

          var container = $element.find(".container");
          var link = $element.find(".read-more");
          var count = link.data("count");

          if (link.length > 0) {
            
            var nextDataUrl = buildBlogLoadMoreRequests(link);

            updateReadMoreButton(nextDataUrl, link);          

            if (container.find(".item").length < count)
              link.hide();

            link.click(function () {

              var $self = $(this);
              var page = $(this).data("page");
              var dataUrl = buildBlogLoadMoreRequests($self);

              $.ajax({
                url: dataUrl
              })
              .done(function (data) {
                container.append(data);

                page++;
                $self.data("page", page);

                var nextDataUrl = buildBlogLoadMoreRequests($self);

                updateReadMoreButton(nextDataUrl, $self);
              });

              return false;
            });
          }
        }

        var buildBlogLoadMoreRequests = function ($button) {
    
          var requestType = $button.data("request-type");

          switch (requestType) {
            case 0: return;
            case 1: serviceName = "GetNextPageByParameters"; break;
            case 2: serviceName = "GetNextPageByDatasource"; break;
          }

          var serviceUrl = "/BlogApi/" + serviceName + "/";

          var category = $button.data("category");
          var count = $button.data("count");
          var datasource = $button.data("datasource");
          var page = $button.data("page");
          var nextDataUrl = "";

          if (count !== undefined && page !== undefined) {
            if (requestType === 1 && category !== undefined)
              nextDataUrl = serviceUrl + "/" + category + "/" + page + "/" + count;

            if (requestType === 2 && datasource !== undefined)
              nextDataUrl = serviceUrl + "/" + datasource + "/" + page + "/" + count;
          }

          return nextDataUrl;
        }

        var updateReadMoreButton = function (url, $button) {

            $.ajax({
                url: url
            }).done(function (data) {
                if ($(data).find(".item").length > 0)
                  $button.show();
                else
                  $button.hide();

            });
        }

        var wideImages = function ($element) {
            var imagesList = $element.find("img");
            var i = 0;

            imagesList.each(function () {

                var img = $(this);
                var parentNode = img.parent();

                if (parentNode.is(":first") || parentNode.prev().length == 0)
                    return true;

                if (i == 0) {
                    if (parentNode != undefined) {
                        var prevContent = parentNode.prevAll();

                        if (prevContent.length > 0) {

                            var prevConentHeight = 0;

                            prevContent.each(function () {
                                prevConentHeight += $(this).outerHeight(true);
                            });

                            if (prevConentHeight < 230)
                                return true;
                        }
                    }
                }

                var newParent = $("<p class='mode'></p>");
                var cloneImage = img.clone();

                newParent.css("height", img.height());
                newParent.append(cloneImage);

                parentNode.replaceWith(newParent);

                i++;
            });
        }

        var updateWideImages = function () {
            var imagesList = $(".article-body").find("img");

            imagesList.each(function () {

                var p = $(this).parent();

                if (p.text().length == 0)
                    p.css("height", $(this).height());
            });
        }

        var clickItem = function ($element) {
            $element.click(function () {
                window.location.href = $(this).find(".title").attr("href");
            });
        }

        return {
            init: init
        };
    });;
define('bookATable', ['jquery', 'context', 'foundation.datepicker.i18n.ttc', 'moment', 'jquery-foundation.datepicker'],
    function ($, context, datepickerHelper, moment) {

        var init = function () {

            var container = $(".book-a-table");

            if (container.length > 0) {
                var tooltipLink = container.find(".days-link");
                var dropdonws = container.find("select");
                var sendBtn = container.find("button.btn.submit");
                              
                initOverrides();
                initPrepopulation();
                initMobileAccordion();
                initDropdonwFields(dropdonws);
                initSearchSaving(sendBtn);
                initTooltip(tooltipLink, ".days-link");

                container.find("select, input").on("change", function () {
                    updateControls();
                });
            }
        }

        var initOverrides = function () {
            var sendBtn = $(".book-a-table button.submit");

            if (sendBtn.length > 0)
                sendBtn.text($("#booking-btn").val());

            $('#dmn-time option[value=""]').remove();
            $('.dmn-date-container').append('<i class="fa fa-calendar" aria-hidden="true"></i>');
        }

        var initMobileAccordion = function () {
            var ghostBtn = $(".book-a-table .ghost-submit");
            var contentContainer = $(".booking-area");
            var closeBtn = $(".book-a-table .close-popup");

            if(contentContainer.length > 0) {

                closeBtn.on("click", function () {

                    contentContainer.slideUp();
                    ghostBtn.show();

                    return false;
                });

                ghostBtn.on("click", function () {

                    contentContainer.slideDown();
                    ghostBtn.hide();

                    return false;
                });

            }
        }

        var initTooltip = function (tooltipLink, linkClass) {
            var container = $(tooltipLink.data("target"));

            if (container.length > 0) {

                tooltipLink.click(function () {
                    if ($(this).hasClass("active")) {
                        container.hide();
                        $(this).removeClass("active");
                    }
                    else {
                        container.show();
                        $(this).addClass("active");
                    }


                    return false;
                });

                $(document).on("click scroll", function (e) {
                    if (!$(e.target).closest("linkClass").length) {
                        container.hide();
                        $(linkClass).removeClass("active");
                    }
                });
            }
        }

        var initDropdonwFields = function (dropdonwField) {

            if (dropdonwField.length > 0) {
                var options = {
                    filePlaceholder: 'No file selected',
                    fileBrowse: 'Browse...',
                    fileNumber: 'Selected files: %s',
                    selectPlaceholder: 'Select...',
                    selectSearchNotFound: 'No matches found',
                    selectSearchPlaceholder: 'Search...'
                };

                dropdonwField.styler(options);
            }

        }

        var updateControls = function () {
            $(".book-a-table select").trigger('refresh');
        }

        var initSearchSaving = function (sendBtn) {
            if (sendBtn != undefined && sendBtn.length > 0) {

                sendBtn.on("click", function () {

                    if (DMN != undefined && DMN != null) {

                        var currentScope = DMN.getFormScope();
                        var searchObj = new Object();
                        console.log("saving");
                        searchObj.type = currentScope.getTypeDetails(currentScope.getType()).name;
                        searchObj.num_people = currentScope.numPeople;
                        searchObj.date = moment(currentScope.getDate()).format("YYYY-MM-DD");
                        searchObj.time = currentScope.time;
                        searchObj.duration = currentScope.duration;

                        $.cookie("NewBookATable", JSON.stringify(searchObj), { expires: 365, path: '/' });
                    }

                });

            }
        };

        var initPrepopulation = function () {

            var savedSearchStr = $.cookie("NewBookATable");

            if (savedSearchStr != null && savedSearchStr != undefined) {
                if (savedSearchStr.length > 0) {
                    var searchData = JSON.parse(savedSearchStr);

                    if (DMN != undefined && DMN != null) {

                        $.each(searchData, function (key, val) {
                            if (val != undefined && val != null) {
                                DMN.val(key, val);
                                updateControls();

                                if (!DMN.getFormScope().timesAvailable) {
                                    initDefaultValues();
                                    return false;
                                }
                            }
                        });

                    }
                }
            }

            else
                initDefaultValues();

        };

        var initDefaultValues = function () {

            if (DMN != undefined && DMN != null) {

                DMN.val("type", DMN.getFormScope().getBookingTypes()[0].name);

                var date = moment();
                DMN.val("date", date.format("YYYY-MM-DD"));

                while (!DMN.getFormScope().timesAvailable) {
                    date = date.add(1, 'day');
                    DMN.val("date", date.format("YYYY-MM-DD"));
                }

                DMN.val("num_people", 1);
                
                typeCounter = 0;

                while (!DMN.getFormScope().timesAvailable) {
                    DMN.val("type", DMN.getFormScope().getBookingTypes()[typeCounter].name);
                    typeCounter++;
                }

                var time = $.grep(DMN.getFormScope().getTimeOptions(), function (n, i) {
                    return n.available;
                });

                DMN.val("time", time[0].value);
                DMN.val("duration", DMN.getFormScope().getDurationOptions()[0].value);
            }

            updateControls();

        };       

        return {
            init: init
        };
    });;
define('btnClick', ['jquery'],
    function ($) {
        var init = function () {

            $(".button.complementary-background, .awards-accolades .button, #backToTop").click(defaultClick);
            $("button, a.button, .offer-ctas-gold-white .offer-cta-default").not(".complementary-background, #backToTop, .awards-accolades .button, .page-content.row.side-padding center button").click(extendedClick); 
            $('div.form-submit-border input[type=submit]').on("click", addGold);
            $('div.form-submit-border input[type=submit]').on("touchend", removeGold);

            function addGold() {
                if (window.location.hostname == "www.xigera.com") return;
                $(this).css({"backgroundColor": "#876729", "color": "#fff"});
            }

            function removeGold() {
                $(this).css({ "backgroundColor": "#fff", "color": "#876729" });;
            }

            function extendedClick(e) {

                // Remove any old one
                $(".ripple").remove();

                // Setup
                var posX = $(this).offset().left,
                    posY = $(this).offset().top,
                    buttonWidth = $(this).width(),
                    buttonHeight = $(this).height();

                // Add the element
                $(this).prepend("<span class='ripple'></span>");


                // Make it round!
                if (buttonWidth >= buttonHeight)
                    buttonHeight = buttonWidth;
                else
                    buttonWidth = buttonHeight;

                // Get the center of the element
                var x = e.pageX - posX - buttonWidth / 2;
                var y = e.pageY - posY - buttonHeight / 2;

                // Add the ripples CSS and start the animation
                $(".ripple").css({
                    width: buttonWidth,
                    height: buttonHeight,
                    top: y + 'px',
                    left: x + 'px'
                }).addClass("rippleEffect");

                var self = $(this);
                var timer = 1000;

                var removeRippleEffect = function () {
                    if (self != undefined)
                        self.find(".ripple").removeClass("rippleEffect");
                }

                setTimeout(removeRippleEffect, timer)
            }

            function defaultClick() {
                var self = $(this);
                self.addClass("click-mode");

                var touchMobile = function () {
                    self.removeClass("click-mode")
                }

                setTimeout(touchMobile, 1000);
            }
        };

        return {
            init: init
        };
    });;
define('carousel', ['jquery',
        /* Dependencies without component accessible through variable */'jquery-owlCarousel'],
    function ($) {                      
        var init = function (element, settings, isEditorMode) {
            applySettingTransformation(settings, isEditorMode);

            var carousel = $(element);

            setupCarousel(carousel, settings);
        };

        var applySettingTransformation = function(settings, isEditorMode) {
            //OwlCarousel requires a boolean if no transitions are used
            if (settings.transitionStyle.length == 0) {
                settings.transitionStyle = false;
            }
            //OwlCarousel requires a boolean if autoplay is disabled
            if (settings.autoPlay == 0) {
                settings.autoPlay = false;
            }
            if (settings.showStatus) {
                settings.afterAction = updateStatus;
            }
            if (settings.itemsDesktop) {
                settings.itemsDesktop = JSON.parse(settings.itemsDesktop);
            }
            if (settings.itemsDesktopSmall) {
                settings.itemsDesktopSmall = JSON.parse(settings.itemsDesktopSmall);
            }
            if (settings.itemsTablet) {
                settings.itemsTablet = JSON.parse(settings.itemsTablet);
            }
            if (settings.itemsTabletSmall) {
                settings.itemsTabletSmall = JSON.parse(settings.itemsTabletSmall);
            }
            if (settings.itemsMobile) {
                settings.itemsMobile = JSON.parse(settings.itemsMobile);
            }
            
            //Disble dragging in editor mode, so that content becomes editable
            if (isEditorMode) {
                settings.mouseDrag = settings.touchDrag = false;
            }
        };

        var setupCarousel = function (carousel, settings) {
            //Highlight selected item
            var highlightClass = getHighlightClass(carousel);
            if (highlightClass) {
                settings.afterInit = function (el) {
                    el.find(".owl-item").eq(0).addClass(highlightClass);
                };
            }

            //Synchronize carousel
            var syncronizedControlId = carousel.data("sync-control");
            if (syncronizedControlId) {
                var syncronizedControl = $("#" + syncronizedControlId);
                var originalAfterAction = settings.afterAction;
                settings.afterAction = function (el) {
                    if (originalAfterAction) {
                        originalAfterAction(el);
                    }

                    syncPosition(el, this.currentItem, syncronizedControl);
                };

                syncronizedControl.on("click", ".owl-item", function (e) {
                    e.preventDefault();
                    var number = $(this).data("owlItem");
                    highlightItem(syncronizedControl, number);
                    syncronizedControl.data("clicked-item", number);
                    carousel.trigger("owl.goTo", number);
                });

                carousel.on("mousedown", ".owl-item", function (e) {
                    syncronizedControl.removeData("clicked-item");
                });
            }

            $(carousel).find("div.item").css('display', 'block');

            carousel.owlCarousel(settings);
        };

        var updateStatus = function(el) {            
            var owlStatus = $(el[0]).siblings(".owl-pagination");
            owlStatus.find(".currentItem").text(this.owl.currentItem + 1);
            owlStatus.find(".allItems").text(this.owl.owlItems.length);
        };

        var getHighlightClass = function(control) {
            return control.data("selected-highlight");
        };

        var highlightItem = function(control, number) {
            var highlightClass = getHighlightClass(control);
            if (highlightClass) {
                control.find(".owl-item")
                .removeClass(highlightClass)
                .eq(number)
                .addClass(highlightClass);
            }
        };

        var syncPosition = function(el, currentItem, syncronizedControl) {                                                           
            if (syncronizedControl.data("owlCarousel") !== undefined) {
                center(currentItem, syncronizedControl);
            }
        };

        var center = function(number, syncronizedControl) {
            var sync2Visible = syncronizedControl.data("owlCarousel").owl.visibleItems;
            var clickedItemNumber = syncronizedControl.data("clicked-item");
            syncronizedControl.removeData("clicked-item");
            if (clickedItemNumber) {
                number = clickedItemNumber;
            }

            highlightItem(syncronizedControl, number);
           
            var found = false;
            for (var i in sync2Visible) {
                if (number === sync2Visible[i]) {
                    found = true;
                }
            }

            if (found === false) {
                if (number > sync2Visible[sync2Visible.length - 1]) {
                    syncronizedControl.trigger("owl.goTo", number - sync2Visible.length + 2);
                } else {
                    if (number - 1 === -1) {
                        number = 0;
                    }
                    syncronizedControl.trigger("owl.goTo", number);
                }
            } else if (number === sync2Visible[sync2Visible.length - 1]) {
                syncronizedControl.trigger("owl.goTo", sync2Visible[1]);
            } else if (number === sync2Visible[0]) {
                syncronizedControl.trigger("owl.goTo", number - 1);
            }
        };

        return {
            init: init            
        };
    });;
define('context', ['jquery'],
    function ($) {        
        return {
            constants: {
                more: entryDataContext.Dictionary['READMORE_MORE'],
                less: entryDataContext.Dictionary['READMORE_LESS'],
                invalidInput: entryDataContext.Dictionary['CONSTANTS_INVALID_INPUT']
            },
            messages: {
                formSubmissionFail: entryDataContext.Dictionary['MESSAGE_FORM_SUBMITTIONFAIL'],
                formSubmissionSuccess: entryDataContext.Dictionary['MESSAGE_FORM_SUBMITTIONSUCCESS'],
                formSubmissionSuccessButNewsletterFail: entryDataContext.Dictionary['MESSAGE_FORM_SUBMISSIONSUCCESS_NEWSLETTERFAIL'],
                newsletterSubscriptionFail: entryDataContext.Dictionary['MESSAGE_NEWSLETTERFORM_SUBSCRIPTIONFAIL'],
                newsletterSubscriptionSuccess: entryDataContext.Dictionary['MESSAGE_NEWSLETTERFORM_SUBSCRIPTIONSUCCESS'],
                pleaseWait: entryDataContext.Dictionary['MESSAGE_PLEASE_WAIT']                
            },
            buttonCaptions:{
                ok: entryDataContext.Dictionary['BUTTON_CAPTION_OK'],
            },
            phoneNumber: entryDataContext.ContactNumber,
            faxNumber: entryDataContext.FaxNumber,
            isHomePage: entryDataContext.IsHomePage,
            
            configuration: {
                gallery: {
                    selector: '.fancybox-media',
                    fancybox: {
                        padding: 0,                        
                        nextEffect: 'fade',
                        prevEffect: 'none',                                                
                        helpers: {
                            title: {
                                type: 'over'                                
                            },                            
                            media: {}
                        },
                        wrapCSS: 'fancybox-gallery-wrapper'
                    }
                }
            },
            
            cultureCode: entryDataContext.CultureCode
        };
    });;
define('cookieBar', ['jquery', 'ViewModels/cookieBarUi',
        /* Dependencies without component accessible through variable */'jquery-cookie'],
    function ($, cookieBarUi) {                        
        var init = function (isPageEditorMode) {
            //bindings are in Scripts/App/binder.js

            cookieBarUi.cookieName(isPageEditorMode ? 'consentCookie-editor' : 'consentCookie');
        };

        return {
          init: init  
        };
    });;
define('dataService', ['jquery', 'amplify', 'knockout', 'knockout-mapping',
        /* Dependencies without component accessible through variable */ 'requests'],
    function ($, amplify, ko, mapper) {
        var getBookingRedirectUrl = function(bookingActionModel) {
            return $.Deferred(function(def) {
                amplify.request({
                    resourceId: 'bookingRedirectUrl',
                    data: mapper.toJSON(bookingActionModel),
                    success: function(response) {
                        def.resolve(response);
                    },
                    error: function() {
                        def.reject();
                    }
                });
            }).promise();
        },
            getModifyBookingRedirectUrl = function(bookingActionModel) {
                return $.Deferred(function(def) {
                    amplify.request({
                        resourceId: 'bookingModifyRedirectUrl',
                        data: mapper.toJSON(bookingActionModel),
                        success: function(response) {
                            def.resolve(response);
                        },
                        error: function() {
                            def.reject();
                        }
                    });
                }).promise();
            },
            getQuoteRequestRedirectUrl = function(hotelId) {
                return $.Deferred(function(def) {
                    amplify.request({
                        resourceId: 'quoteRequestRedirectUrl',
                        data: hotelId,
                        success: function(response) {
                            def.resolve(response);
                        },
                        error: function() {
                            def.reject();
                        }
                    });
                }).promise();
            },
            getBookAMeetingHotelRedirectUrl = function (hotelId) {
                return $.Deferred(function(def) {
                    amplify.request({
                        resourceId: 'bookAMeetingHotelRedirectUrl',
                        data: hotelId,
                        success: function(response) {
                            def.resolve(response);
                        },
                        error: function() {
                            def.reject();
                        }
                    });
                }).promise();
            },
            signupToNewsletter = function(subscriptionModel) {
                return $.Deferred(function(def) {
                    amplify.request({
                        resourceId: 'signupToNewsletter',
                        data: mapper.toJSON(subscriptionModel),
                        success: function(response) {
                            evaluateResponse(response, def);
                        },
                        error: function() {
                            def.reject();
                        }
                    });
                }).promise();
            },
            submitEventEnquiryForm = function (formModel, settingId) {
                return $.Deferred(function(def) {
                    amplify.request({
                        resourceId: 'saveEventEnquiry',
                        data: mapper.toJSON({ enquiry: formModel, settingId: settingId }),
                        success: function (response) {
                            evaluateResponse(response, def);
                        },
                        error: function () {
                            def.reject();
                        }
                    });
                }).promise();
            },
            submitGeneralEnquiryForm = function (formModel, settingId) {
                return $.Deferred(function (def) {
                    amplify.request({
                        resourceId: 'saveGeneralEnquiry',
                        data: mapper.toJSON({ enquiry: formModel, settingId: settingId }),
                        success: function (response) {
                            evaluateResponse(response, def);
                        },
                        error: function () {
                            def.reject();
                        }
                    });
                }).promise();
            },
            submitMeetingRoomEnquiryForm = function (formModel, settingId) {
                return $.Deferred(function (def) {
                    amplify.request({
                        resourceId: 'saveMeetingRoomEnquiry',
                        data: mapper.toJSON({ enquiry: formModel, settingId: settingId }),
                        success: function (response) {
                            evaluateResponse(response, def);
                        },
                        error: function () {
                            def.reject();
                        }
                    });
                }).promise();
            },
            submitJobApplicationForm = function(formModel, settingId) {
                return $.Deferred(function (def) {
                    amplify.request({
                        resourceId: 'saveJobApplication',
                        data: mapper.toJSON({ jobApplication: formModel, settingId: settingId }),
                        success: function (response) {
                            evaluateResponse(response, def);
                        },
                        error: function () {
                            def.reject();
                        }
                    });
                }).promise();
            },
             loadArticles = function (dataSourceId, skipArticleCount, pageSize) {
                 return $.Deferred(function(def) {
                     amplify.request({
                         resourceId: 'loadAdditionalArticles',
                         data: mapper.toJSON({ dataSourceId: dataSourceId, skipArticleCount: skipArticleCount, pageSize: pageSize }),
                         success: function(response) {
                             def.resolve(response);
                         },
                         error: function() {
                             def.reject();
                         }
                     });
                 }).promise();
             };

        var evaluateResponse = function(response, def) {
            if (response === "OK") {
                def.resolve(response);
            } else {
                def.reject();
            }
        };

        return {
            getBookingRedirectUrl: getBookingRedirectUrl,
            getModifyBookingRedirectUrl: getModifyBookingRedirectUrl,
            getQuoteRequestRedirectUrl: getQuoteRequestRedirectUrl,
            getBookAMeetingHotelRedirectUrl: getBookAMeetingHotelRedirectUrl,
            signupToNewsletter: signupToNewsletter,
            submitEventEnquiryForm: submitEventEnquiryForm,
            submitGeneralEnquiryForm: submitGeneralEnquiryForm,
            submitMeetingRoomEnquiryForm: submitMeetingRoomEnquiryForm,
            submitJobApplicationForm: submitJobApplicationForm,
            loadArticles: loadArticles
        };
    });
;
define('filterHelper', ['underscore', 'Models/filterInfo', 'Models/filterGroup', 'Models/filterCategory', 'jquery', 'knockout', 'isotope', 'jquery-imagesLoaded'],
    function (_, FilterInfo, FilterGroup, FilterCategory, $, ko, Isotope, imagesLoaded) {
        var activeClass = 'active-filter';
        var activeFiltersIds = [];
        var buildFilterInfo = function(filterType, filterGroups) {
            var filterInfo = new FilterInfo();
            filterInfo.filterType(filterType);

            $.each(filterGroups, function (index, filterGroup) {
                var observableFilterGroup = new FilterGroup();
                observableFilterGroup.id = filterGroup.Id;
                observableFilterGroup.name = filterGroup.Name;

                $.each(filterGroup.Children, function (ix, filterCategory) {
                    var observableFilterCategory = new FilterCategory();
                    observableFilterCategory.id = filterCategory.Id;
                    observableFilterCategory.name = filterCategory.Name;
                    observableFilterCategory.value(filterCategory.Value);

                    observableFilterGroup.filterCategories().push(observableFilterCategory);
                });

                filterInfo.filterGroups().push(observableFilterGroup);
            });

            return filterInfo;
        };        
        
        var registerControls = function (element, controls) {
            var iso = new Isotope(element, { itemSelector: '.item' });

            if (controls) {
                $.each(controls, function (i, control) {
                    $(control).on('click', 'a', function () {
                        activateFilter(this);
                        doFilter(iso, control, getButtonFilterValue);
                        return false;
                    });

                    $(control).on('change', 'select', function () {
                        doFilter(iso, control, getDropdownFilterValue);
                    });
                });
            }

            iso.activeFilter = ko.observable('');            
            return iso;
        };
       
        var activateFilter = function (filterControl) {

            if ($(filterControl).hasClass(activeClass))
                $(filterControl).removeClass(activeClass);
            else
                $(filterControl).addClass(activeClass).siblings().removeClass(activeClass);
        };

        var getButtonFilterValue = function(id) {
            return $(id + ' a.' + activeClass).data('filter');
        };
        
        var getDropdownFilterValue = function (id) {
            var value = '';
            $.each($(id + ' select'), function(index, select) {
                value += select.value;
            });

            return value;
        };

        var getSelectedFilter = function (controlId, getControlValue) {
            return getControlValue(controlId);
        };

        var doFilter = function (iso, controlId, getControlValue) {
            if (!_.contains(activeFiltersIds, controlId))
                activeFiltersIds.push(controlId);

            var activeFiltersCategories = [];
            _.each(activeFiltersIds, function (filterId) { activeFiltersCategories.push(getSelectedFilter(filterId, getControlValue)); });
            var activeFilters = activeFiltersCategories.join("");
            iso.arrange({ filter: activeFilters });
            iso.activeFilter(activeFilters);
        };

        var append = function (iso, items) {
            var joinedItems = $(items.join());
            
            $(joinedItems).imagesLoaded(function () {
                iso.insert(joinedItems);
            });
        };
        
        var decorateItemsWithFilter = function (items, itemCssClass) {
            var html = $.map(items, function (value) {

                // There could be more than once filter category
                var filtercategories = "";
                var categories = value.FilterCategories;
                for (var y = 0; y < categories.length; y++) {
                    filtercategories = filtercategories + categories[y].Value + ' ';
                };

                // dynamically create Div and add style it it
                var div = document.createElement('div');
                div.innerHTML = value.Html;
                div.className = itemCssClass + " " + filtercategories;

                return div.outerHTML;
            });

            return html;
        };
        
        return {
            buildFilterInfo: buildFilterInfo,
            registerControls: registerControls,            
            activateFilter: activateFilter,
            getButtonFilterValue: getButtonFilterValue,
            getDropdownFilterValue: getDropdownFilterValue,
            getSelectedFilter: getSelectedFilter,
            append: append,
            decorateItemsWithFilter: decorateItemsWithFilter
        };
    });;
define('formInit', ['ViewModels/eventEnquiryFormUi', 'ViewModels/generalEnquiryFormUi', 'ViewModels/meetingRoomFormUi', 'ViewModels/jobApplicationFormUi', 'utils', 'queryStringHelper'],
    function (eventEnquiryFormUi, generalEnquiryFormUi, meetingRoomFormUi, jobApplicationFormUi, utils, queryStringHelper) {
        //bindings are in Scripts/App/binder.js

        var initEventEnquiryForm = function (formInitData) {
            initForm(eventEnquiryFormUi, formInitData);

            eventEnquiryFormUi.occasions(formInitData.occasions);
            eventEnquiryFormUi.extraOptions(formInitData.extraOptions);
            eventEnquiryFormUi.roomTypes(formInitData.roomTypes);
            eventEnquiryFormUi.redirectUrl(formInitData.redirectUrl);
            eventEnquiryFormUi.personSelectionRequired(formInitData.personSelectionRequired);            

            //Populate from QueryString
            var query = queryStringHelper.getQuery();
            var date = utils.date.parse(utils.stripHtml(query.date));
            eventEnquiryFormUi.selectedOccasionForDropDown(utils.stripHtml(query.activity));
            eventEnquiryFormUi.formData.ExtraOption(utils.stripHtml(query.time));
            eventEnquiryFormUi.formData.NumberOfAdults(utils.stripHtml(query.adults));
            eventEnquiryFormUi.formData.NumberOfChildren(utils.stripHtml(query.children));
            eventEnquiryFormUi.formData.Date(date);
        };
        
        var initGeneralEnquiryForm = function (formInitData) {            
            initForm(generalEnquiryFormUi, formInitData);
            
            generalEnquiryFormUi.enquiryTypes(formInitData.enquiryTypes);
            generalEnquiryFormUi.showPhoneNumber(formInitData.showPhoneNumber);            
        };
        
        var initMeetingRoomForm = function (formInitData) {
            initForm(meetingRoomFormUi, formInitData);
            meetingRoomFormUi.availableHotels(formInitData.availableHotels);            
            meetingRoomFormUi.isHotelSelectionVisible(formInitData.isHotelSelectionVisible);
            if (formInitData.availableHotels.length == 1) {
                meetingRoomFormUi.selectedHotel(formInitData.availableHotels[0]);
            }
            
            //Populate from QueryString
            var query = queryStringHelper.getQuery();
            if (query.room) {
                meetingRoomFormUi.setSelectedRoom(utils.stripHtml(query.room));
            }            
        };
        
        var initJobApplicationForm = function (formInitData) {
            initForm(jobApplicationFormUi, formInitData);
            jobApplicationFormUi.formData.JobId(formInitData.jobId);
            jobApplicationFormUi.informationSources(formInitData.informationSources);
            jobApplicationFormUi.attachmentSizeWarningMessage(formInitData.attachmentSizeWarningMessage);
            jobApplicationFormUi.attachmentMaxSizeMB(formInitData.attachmentMaxSizeMB);
            jobApplicationFormUi.formData.IsManagementJob = formInitData.isManagementJob;
            jobApplicationFormUi.redirectUrl(formInitData.redirectUrl);
        };
        
        var initForm = function (formViewModel, formInitData) {
            formViewModel.settingId(formInitData.settingId);
            formViewModel.titles(formInitData.titles);
            formViewModel.countries(formInitData.countries);

            if (formInitData.hasOwnProperty('showNewsletter') && formInitData.hasOwnProperty('newsletterSubscriptionDefaultValue')) {
                formViewModel.newsletterSubscriptionDefaultValue(formInitData.showNewsletter && formInitData.newsletterSubscriptionDefaultValue);
            }
        };

        return {
            initEventEnquiryForm: initEventEnquiryForm,
            initGeneralEnquiryForm: initGeneralEnquiryForm,
            initMeetingRoomForm: initMeetingRoomForm,
            initJobApplicationForm: initJobApplicationForm
        };
    });;
$(document).ready(function () {
    define('googleMapsInitializer', ['jquery'],
    function ($) {
        var isMapsApiLoaded = false;
        var def = $.Deferred(function () {
            if (isMapsApiLoaded) {
                def.resolve();
                return;
            }

            $(document).ready(function () {
                var apiKey = $("#GoogleMapApiKey").val();

                var script = document.createElement('script');
                script.type = 'text/javascript';
                script.src = 'https://maps.google.com/maps/api/js?key=' + apiKey + '&sensor=false&amp;libraries=geometry&amp;v=3.7&' +
                    'callback=googleMapsApiLoaded';
                document.body.appendChild(script);
            });
        });
        
        window.googleMapsApiLoaded = function() {
            isMapsApiLoaded = true;
            def.resolve();
        };
        
        return def.promise();
    });
});;
// Footer navigation dropdowns
define('hotelCollection', ['jquery'],
function ($) {     
    var w = $(window) || window;

    var adaptList = function () {
        $('.hotel-nav').children('li').each(function () {
            var self = $(this);
            var span = self.find('a');
            self.width(span.outerWidth());
        });
    }

    adaptList();

    $(window).resize(function () {
        adaptList();
    });
    
    $('.hotel-nav .hotel-region').on({
        keypress: function (event) {
            if (event.which == 32) {
                if (w.width() > 1024) {
                    var parent = $(this).parent();
                    parent.addClass('active');
                    parent.find('.sub-list').stop().slideDown();
                    parent.siblings('li').removeClass('active').find('.sub-list').hide();
                }
            }
        },
        mouseenter: function () {
            if (w.width() > 1024) {
                var parent = $(this).parent();
                parent.addClass('active');
                parent.find('.sub-list').stop().slideDown();
                parent.siblings('li').removeClass('active').find('.sub-list').hide();                
            }
        },

        click: function (e) {
            var parent = $(this).parent();

            if (w.width() <= 1024) {
                if (parent.hasClass('active')) {
                    parent.removeClass('active');
                    parent.find('.sub-list').stop().slideUp();
                } else {
                    parent.addClass('active');
                    parent.find('.sub-list').stop().slideDown();
                    parent.siblings('li').removeClass('active').find('.sub-list').hide();
                }
            }

            return false;
        }
    });

    w.on('scroll', function () {
        if ((w.scrollTop() + w.height()) < $('.hotel-nav').offset().top)
            $('.hotel-nav').children('li').removeClass('active').find('.sub-list').hide();
    });
});;
define('htmlContentInit', ['jquery', 'binder', 'context', 'jqueryBrowser', 'queryStringHelper', 'ViewModels/roomBookingActionUi', 'dataService', 'utils', 'Models/bookingAction',
/* Dependencies without component accessible through variable */'jquery-fitvids', 'jquery-fancybox'],
function ($, binder, context, jqueryBrowser, queryStringHelper, roomBookingActionViewModel, dataService, utils, bookingActionModel) {
    var initPage = function() {

        binder.applyBindings(context);

        $(document).ready(function () {

            $(".social-icons li span").tooltip({
                placement: "left",
                container: 'body',
                template: '<span class="tooltip tip-left" role="tooltip"><span class="nub"></span><span class="tooltip-inner"></span></span>'
            });

            var w = $(window) || window;
               
            if(jqueryBrowser.name == 'msie') {
                $("html").addClass('internet-explorer');
            }
            
            //header phone
            phoneToggle();

            //init tootipster
            $('.actionbar-promo .call-popup').tooltipster({
                trigger: 'click',
                distance: 30
            });

            // Drop down fix
            $('.has-dropdown .sub-menu li a').not('.language-item').click(function(e) {
                e.stopPropagation();
            });
                                
            // Mega menu fix
            var close_mega_menu;
            $('.has-megamenu, .mega-dropdown').on({
                mouseover: function () {
                    var self = $(this).hasClass('has-megamenu') ? $(this) : $(this).parent();
                    self.find('.mega-dropdown').css('left', 0);
                    clearTimeout(close_mega_menu);
                    return false;
                },

                mouseout: function () {
                    var self = $(this).hasClass('has-megamenu') ? $(this) : $(this).parent();

                    close_mega_menu = setTimeout(function () {
                        self.find('.mega-dropdown').css('left', -9999);
                    }, 200);

                    return false;
                }
            });                                                  

            // Off-canvas menu
            var offcanvas_menu = $('.right-off-canvas-menu');

            $('.right-off-canvas-toggle').on('click', function (e) {
                e.preventDefault();

                if (offcanvas_menu.hasClass('open')) {
                    offcanvas_menu.animate({ 'right': 0 }, 200).removeClass('open');
                    $('body').removeClass('move-left');
                } else {
                    offcanvas_menu.animate({ 'right': '219px' }, 200).addClass('open');
                    $('body').addClass('move-left');
                }
            });

            $('.exit-off-canvas').on('click', function (e) {
                offcanvas_menu.animate({ 'right': 0 }, 100).removeClass('open');
                $('body').removeClass('move-left');
            });

            // Mobile navigation menu
            var mobile_navigation = $('.offcanvas-navigation');

            $('li', mobile_navigation).on('click', function (e) {
                e.stopPropagation();
            });

            $('li.has-dropdown > a', mobile_navigation).on('click', function (e) {
                e.preventDefault();
                var child = $(this).siblings('.sub-menu').length ? $(this).siblings('.sub-menu') : $(this).siblings('.dropdown');
                child.slideToggle();
                child.prev('a').toggleClass('dropped');
            });

            w.on('resize', function () {

                $('.right-off-canvas-menu').foundation('offcanvas', 'close', 'move-right');

                scrolledBelow();
            });
                
            $('.book-online-button, .menu-close-button').on('click', function (e) {
                $('.right-off-canvas-menu').animate({ 'right': 0 }, 200).removeClass('open');
                $('.page-container, body').removeClass('move-left');

                if (!$(this).hasClass('menu-close-button')) {

                    var bookingBar = $('.booking-form');

                    if (bookingBar.length > 0) {
                        bookingBar.slideDown();
                        $('.book .button').addClass('active');
                    }
                    else {
                        var isWhereSelectionEnabled = ko.observable(false);
                        var bookingAction = new bookingActionModel(isWhereSelectionEnabled);

                        dataService.getBookingRedirectUrl(bookingAction)
                           .done(function (redirectUrl) {
                               utils.redirect(redirectUrl);
                           }).fail(function () {
                               console.log("getBookingRedirectUrl failed");
                           });
                    }
                    
                }              

            });

            $(".modify-booking-button").on('click', function (e) {
                roomBookingActionViewModel.modifyBooking();
            });
                
            //Article panel IE fix
            var articlesToAnimate = $(".lt-ie9 .article").not(".text-articles .article");
            articlesToAnimate.mouseenter(function () {
                $(".panel-footer", this).show();
                $(".panel-content-inner", this).hide();
            });

            articlesToAnimate.mouseleave(function () {
                $(".panel-content-inner", this).show();
                $(".panel-footer", this).hide();
            });
                
            //Section Accordions
            $('header.toggle').on('click', function () {
                toggleSection(this);
            });
                
            //Scroll tooltips with page                
            var social_icons = $('ul.social-icons', '.social-bar');

            function positionSocialIconTooltips(scroll) {
                scroll = scroll || false;

                $('li', social_icons).each(function () {
                    var self = $(this),
                        selector = self.children('span').data('selector'),
                        tooltip = $('.tooltip[data-selector=' + selector + ']'),
                        position = scroll ? (self.offset().top - parseInt(tooltip.css('margin-top'))) : self.offset().top;

                    tooltip.css('top', position);
                });
            }

            positionSocialIconTooltips();

            w.on('scroll', function () {
                positionSocialIconTooltips(true);
                scrolledBelow();
            });
                
            // FitVids instantiation
            $('.fitvids-video').fitVids();
                
            setupFancyBoxIframePopups();

            $('.book .button').click(function () {
                $(this).toggleClass('active');
            });

            scrolledBelow();

            //tripAdvisorImage();

            function scrolledBelow() {
                var scrollPos = $(document).scrollTop(),
                    winHeight = $(window).height();
                
                $('.booking-form #room-guests-dropdown').removeClass('scrolledBelow');

                if (scrollPos > 450) {
                    $('#backToTop').fadeIn();
                } else {
                    $('#backToTop').fadeOut();
                }               
                
            };

            var backToTop = $('<button id="backToTop"></button>');
            $('.page-footer').append(backToTop);
            $('#backToTop').click(function () {
                $('html, body').animate({
                    scrollTop: 0
                }, 1000);
            });

            $('.phone-dropdown-button').click(function () {
                $('.page-offcanvas').toggleClass('show-phone-dropdown');
            });

            tripAdvisorWidgets();

        });

        $(window).load(function () {
            if ($('.featured-carousel, .homepage-banner').length) {
                $('.icbe-pre-step').show();
            }
        });
    };

    var showBoundElements = function () {
        $('.bound-element').show();
    };
        
    var toggleSection = function(element) {
        if ($(window).width() <= 640) {
            event.preventDefault();
            var toggleClosed = $(element).siblings('.toggle-area').is(':hidden');
            var classToAdd = toggleClosed ? 'minus' : 'plus';
            var classToRemove = toggleClosed ? 'plus' : 'minus';

            $(element).children().first().addClass(classToAdd);
            $(element).children().first().removeClass(classToRemove);
            $(element).siblings('.toggle-area').stop().slideToggle(250);
        }
    };

    var setupFancyBoxIframePopups = function()
    {
        var fancyboxAnchors = $('a').filter(function() {
            var url = $(this).attr('href');
            if (queryStringHelper.urlHasQuerystringKey('iframe_fancybox', url))
                return true;
            else return false;
        });

        fancyboxAnchors.each(function () {
            $(this).addClass('fancybox.iframe');
            var url = $(this).attr('href');
                
            var fancyboxOptions = {
                width: queryStringHelper.getValue('fancybox_width', url),
                height: queryStringHelper.getValue('fancybox_height', url)
            };
            $(this).fancybox(fancyboxOptions);
        });
    };
    
    function tripAdvisorWidgets() {

        // Get the API URL from the page (injected from CMS)
        var ajaxurl = "/api/sitecore/Common/TripAdvisor";
        var reviewData = [];
        var dateString = "";

         //Get the JSON from the API call
        $.getJSON(ajaxurl, {
            cache: false,
            async: true,
            format: "json"
        }).done(function (data) {
            initTripAdvisor(data);
        }).fail(function (jqxhr, textStatus, error) {
            var err = textStatus + ", " + error;
            console.log("Request Failed: " + err);
        });

        // Do stuff with the data
        function initTripAdvisor(data) {
            reviewsWidgets(data);
            reviewsLister(data);
        }

        function reviewsWidgets(data) {

            // Homepage Banner Award widget
            var awardImg = $('<img alt="Trip Advisor" class="ta-award-img" src="' + data.awards[0].images.small + '" />');
            $('.trip-advisor-carousel-award, .ta-award-img-wrap').html(awardImg);

            $('.trust-symbols-area .home-banner-award a span').text(data.ranking_data.ranking_string);

            equalHeights($('.awardsSection > .columns'));

            // REVIEW WIDGET

            // Find the best review based on star rating
            var highestReview = 0;

            // Check that we have reviews
            // Set the review widget data
            if (data.reviews.length === 0) {
                $('.ta-widget').addClass('no-reviews');
            } else {
                $(data.reviews).each(function (i, el) {
                    if (el.rating > highestReview) {
                        reviewData = el;
                        highestReview = el.rating;
                    }
                });
            }
            
            // Get the data from the best review
            var reviewDate = reviewData.published_date.substring(0, 10);
            formatDataString(reviewDate);
            reviewDate = dateString;

            // Review widget
            // Inject the data from the best review
            $('.ta-review-widget .ta-title span').html(reviewData.title);
            $('.ta-review-widget .ta-user p').html(reviewData.user.username != null ? reviewData.user.username : "Anonymous");
            $('.ta-review-widget .ta-published-date').html(reviewDate);
            $('.ta-review-widget .ta-rating').html('<img alt="Trip Advisor" src="' + reviewData.rating_image_url + '"/>');
            $('.ta-review-widget .ta-review-content').attr('href', '/about/guest-reviews#' + reviewData.id);

            // Horizontal Review widget
            // Inject the average rating and total reveiw count
            $('.ta-review-widget-horizontal .review-count span').html(data.num_reviews);
            $('.ta-review-widget-horizontal .ta-rating').html('<img alt="Trip Advisor" src="' + data.rating_image_url + '"/>');

            $('.ta-review-widget-horizontal button').click(function(){
                console.log('Scrolling to reviews');
                $('html, body').animate({
                    scrollTop: $('.guest-reviews-wrap').offset().top - 200
                }, 1000);
            });
        }

        function reviewsLister(data) {

            $('#guestReviews').empty();

            $(data.reviews).each(function (i, el) {
                // Get the data from the best review
                var reviewDate = el.published_date.substring(0, 10);
                formatDataString(reviewDate);
                reviewDate = dateString;

                // Set defaults for when there is no data
                var username = el.user.username != null ? el.user.username : "Anonymous";
                var location = el.user.user_location.name != null ? el.user.user_location.name : "Unkown Location";
                var tripType = el.trip_type != null ? el.trip_type : "Unspecified";
                var ratingImgURL = el.rating_image_url;

                // Build review list item
                var reviewListItem = $(
                    '<div class="row review-list-item"><div class="small-12 medium-3 columns review-user-info">'
                    + '<p class="strong">' + username + '</p><p>' + location + '</p>'
                    + '<p class="strong">Trip Type:</p><p>' + tripType + '</p>'
                    + '</div><div class="small-12 medium-9 columns review-content"><a id="' + el.id + '" name="' + el.id + '"></a>'
                    + '<h4>"' + el.title + '"</h4><div class="ta-rating"><img alt="Trip Advisor" src="' + ratingImgURL + '"/></div><p class="review-list-date">' + reviewDate + '</p><p class="review-list-body">' + el.text + '</p>'
                    + '</div></div>'
                );

                // Append the list item to the guest reviews
                reviewListItem.appendTo('#guestReviews');
            });

            // Add url to button
            $('#trip-advisor-button.btn, .button.trip-advisor-button').attr('href', data.web_url);

            // When the review lister is built, we get the review id from url and scroll to the corresponding review
            // This is for when the corresponding review from the best review widget has been clicked 
            $(document).ready(function () {
                var review = $(location.hash);
                if (review.length) {
                    var reviewOffset = $(review).offset();
                    $('body, html').scrollTop(reviewOffset.top - 260);
                }                
            });

        }

        function formatDataString(datestring) {
            dateString = datestring;
            dateString = Date.parse(dateString);
            dateString = new Date(dateString);
            dateString = dateString.toDateString();
            dateString = dateString.slice(4);
            return dateString;
        }

    }

    function equalHeights(elements) {
        var allHeights = [],
            i = 0;
        for (i = 0; i < elements.length; i++) {
            var elementHeight = elements[i].clientHeight;
            allHeights.push(elementHeight);
        }
        for (i = 0; i < elements.length; i++) {
            elements[i].style.height = Math.max.apply(Math, allHeights) + 'px';
        }
    }

    function initVide() {

        var element = $('.homepage-banner');

        var instance = element.data('vide');

        if(instance !== undefined)
            instance.destroy();

        var paths = element.data("vide-desktop");
        
        if ($(window).width() < 1024)
            paths = element.data("vide-mobile");

        $('.homepage-banner').vide(paths);
    }

    function phoneToggle() {
        var link = jQuery(".phone-icon");
        var block = jQuery(".phone-area .phone");

        if (link.length > 0 && block.length > 0) {
            link.on("click", function () {
                block.toggleClass("active");
            });
        }
    }

    return {
        initPage: initPage,
        showBoundElements: showBoundElements
    };


});

;
define('instagramFeedProvider', ['jquery'],
    function ($) {
        var buildUrl = function(baseUrl, userId, clientId, numOfItems, callback) {
            var url = baseUrl + userId
                + '/media/recent?client_id=' + clientId
                + '&count=' + numOfItems
                + '&callback=' + callback;
            return url;
        };
        
        var getModel = function (result, options) {
            var imageDataArray = [];
            var maxNumberOfItems = 5;

            if (options.numberOfItems) {
                maxNumberOfItems = options.numberOfItems;
            }

            for (var i = 0; i < maxNumberOfItems; i++) {
                var imageData = result.data[i];
                imageDataArray.push(
                    {
                        link: imageData.link,
                        imgSrc: imageData.images[options.configSettings.resolution].url
                    });
            }
            return imageDataArray;
        };
        
        var getFeedData = function (options) {
            var apiUrl = buildUrl(options.configSettings.url,
                options.feedId,
                options.configSettings.clientId,
                options.numberOfItems);

            return $.Deferred(function (def) {
                $.ajax({
                    type: 'GET',
                    url: apiUrl,
                    success: function (data) {
                        def.resolve(getModel(data, options));
                    },
                    error: function () {
                        def.reject();
                    },
                    dataType: 'jsonp'
                });
            });
        };
        
        return{
            getFeedData: getFeedData
        };
    });;
define('koBindingHandlers', ['jquery', 'knockout', 'binder', 'context', 'utils', 'filterHelper', 'masonry', 'uiEffectHelper', 'jquery-imagesLoaded', 'carousel',
         'ViewModels/socialMediaFeedUi', 'foundation.datepicker.i18n.ttc',
        /* Dependencies without component accessible through variable */ 'jquery-foundation.datepicker', 'sticky', 'jquery-fancybox', 'jquery-fancybox-media', 'jquery.readmore'],
    function ($, ko, binder, context, utils, filterHelper, Masonry, uiEffectHelper, imagesLoaded, carousel, socialMediaFeedUi, datepickerHelper) {

        ko.bindingHandlers.toggleElement = {
            update: function(element, valueAccessor) {
                var value = ko.utils.unwrapObservable(valueAccessor());
                uiEffectHelper.toggleElement(element, value);
            }
        };
        
        ko.bindingHandlers.datepicker = {
            init: function (element, valueAccessor) {
                var options = datepickerHelper.getOptionsWithCultureSettings(context.cultureCode);
                
                options.closeIcon = 'X';
                options.closeButton = false;
                options.customClass = "wffm-calendar";

                options.onRender = function(date) {
                    var nowTemp = new Date();
                    var now = new Date(nowTemp.getFullYear(), nowTemp.getMonth(), nowTemp.getDate(), 0, 0, 0, 0);
                    return date.valueOf() < now.valueOf() ? 'disabled' : '';
                };
                
                $(element).fdatepicker(options).on('changeDate', function (obj) {
                    var observable = valueAccessor();
                    observable(obj.date);
                });
                
                updateDatepicker(element, valueAccessor);
            },
            update: function (element, valueAccessor) {
                updateDatepicker(element, valueAccessor);
            }            
        };

        var updateDatepicker = function (element, valueAccessor) {
            var dateValue = ko.utils.unwrapObservable(valueAccessor());
            if (utils.date.isValid(dateValue)) {
                $(element).fdatepicker('update', dateValue);
            }
        };
        
        ko.validation.makeBindingHandlerValidatable("datepicker");
        
        ko.bindingHandlers.sticky = {
            init: function(element, valueAccessor) {
                var value = ko.utils.unwrapObservable(valueAccessor());
                $(element).sticky(value);
            }
        };
        ko.virtualElements.allowedBindings.sticky = true;

        ko.bindingHandlers.masonry = {
            init: function(element, valueAccessor) {
                var settings = ko.utils.unwrapObservable(valueAccessor());
                new Masonry(element, settings);
            }
        };

        ko.bindingHandlers.stopBinding = {
            init: function() {
                return { controlsDescendantBindings: true };
            }
        };
        ko.virtualElements.allowedBindings.stopBinding = true;

        ko.bindingHandlers.phoneNumber = {
            update: function(element, valueAccessor) {                
                ko.bindingHandlers.text.update(element, valueAccessor);
                ko.bindingHandlers.tel.update(element, valueAccessor);
            }
        };

        ko.bindingHandlers.tel = {
            update: function(element, valueAccessor) {
                var phoneNumber = ko.utils.unwrapObservable(valueAccessor());
                ko.bindingHandlers.attr.update(element, function () {
                    phoneNumber = phoneNumber.replace('(0)', '');
                    return { href: 'tel:' + phoneNumber.replace(/[^0-9\+]/g, '') };
                });
            }
        };

        ko.bindingHandlers.showWhen = {
            update: function(elem, valueAccessor) {
                var shouldShow = ko.utils.unwrapObservable(valueAccessor());

                // Build an array of child elements
                var child = ko.virtualElements.firstChild(elem),
                    childElems = [];
                while (child) {
                    childElems.push(child);
                    child = ko.virtualElements.nextSibling(child);
                }

                if (shouldShow) {
                    $(childElems).show();
                } else {
                    $(childElems).hide();
                }
            }
        };
        ko.virtualElements.allowedBindings.showWhen = true;

        ko.bindingHandlers.readmore = {
            init: function(element, valueAccessor) {
                var settings = ko.utils.unwrapObservable(valueAccessor());
                var defaultSettings = {
                    speed: 75,
                    embedCSS: false,
                    moreLink: '<p class="plus"><a href="#">' + context.constants.more + '</a></p>',
                    lessLink: '<p class="minus"><a href="#">' + context.constants.less + '</a></p>'
                };

                $(element).readmore($.extend({}, defaultSettings, settings));
            }
        };

        ko.bindingHandlers.isotope = {
            init: function(element, valueAccessor) {
                var settings = ko.utils.unwrapObservable(valueAccessor());

                var listSettings = {
                    dataSourceId: settings.listParameters.dataSourceId,
                    pageSize: settings.listParameters.pagingOptions.pageSize,
                    enablePaging: settings.listParameters.pagingOptions.enablePaging,
                    itemCssClass: settings.listParameters.itemCssClass
                };

                var filterInfo = filterHelper.buildFilterInfo(settings.listParameters.filterType, settings.listParameters.filterGroups);
                binder.applyBindings(filterInfo, $('#' + settings.listParameters.filterControlId)[0]);

                var iso = filterHelper.registerControls(element, ['#' + settings.listParameters.filterControlId]);

                var loadItems = function () {
                    listSettings.skipArticleCount = iso.getItemElements().length;
                    
                    settings.getItems(listSettings).then(function (items) {
                        var boundFilterInfo = ko.dataFor($('#' + settings.listParameters.filterControlId).get(0));

                        var filterGroups = boundFilterInfo.filterGroups();
                        $.each(items.RenderedArticles, function (j, item) {
                            $.each(filterGroups, function(index, filterGroup) {
                                $.each(filterGroup.filterCategories(), function(ix, filterCategory) {
                                    var matchingCategories = $.grep(item.FilterCategories, function(category) {
                                        return category.Id === filterCategory.id || filterCategory.value().length == 0;
                                    });

                                    if (matchingCategories.length > 0) {
                                        filterCategory.visible(true);
                                    }
                                });
                            });
                        });
                        
                        var htmlItemsWithFilter = filterHelper.decorateItemsWithFilter(items.RenderedArticles, settings.listParameters.itemCssClass);
                        filterHelper.append(iso, htmlItemsWithFilter);
                        
                        if (items.HasMore == false) {
                            $(".filtered-article-more-button-div").hide();
                        }
                        
                    });
                };
                
                enablePagingButton(listSettings.enablePaging, loadItems, element);
                loadItems();
            }
        };
        
        var enablePagingButton = function (enablePaging, loadItems, element) {
            if (enablePaging) {
                $('<div/>', {
                    addClass: 'filtered-article-more-button-div',
                    html: $('<button/>', {
                        text: context.constants.more,
                        click: loadItems
                    })
                }).insertAfter(element);
            }
        };
            
        ko.bindingHandlers.fancybox = {
            init: function (element, valueAccessor) {                
                var settings = ko.utils.unwrapObservable(valueAccessor());
                $(element).find(settings.selector).fancybox(settings.fancybox);
            }
        };               

        ko.bindingHandlers.fancyboxWithFilter = {
            init: function (element, valueAccessor) {
                var settings = ko.utils.unwrapObservable(valueAccessor());
                ko.bindingHandlers.fancybox.init(element, valueAccessor);

                $(element).imagesLoaded().always(function (instance, image) {
                    var filter = filterHelper.registerControls(element, settings.controls);
                    filter.activeFilter.subscribe(function (activeFilter) {
                        if (activeFilter.length == 0) {
                            activeFilter = "all";
                        }
                        var filteredItems = $.map(filter.filteredItems, function (item) {
                            return item.element;
                        });
                        $(filteredItems).find(settings.selector).each(function () {
                            $(this).attr("rel", activeFilter);
                        });
                    });

                    return filter;
                });
            }
        };
        
        ko.bindingHandlers.visibleWithSlide = {           
            init: function (element, valueAccessor) {
                // On page load don't animate - just set the element visibility                
                var value = valueAccessor();
                $(element).stop().toggle(ko.utils.unwrapObservable(value));
            },
            update: function (element, valueAccessor) {                
                var value = valueAccessor();
                ko.utils.unwrapObservable(value) ? $(element).stop().slideDown() : $(element).stop().slideUp();
            }
        };
        ko.virtualElements.allowedBindings.visibleWithSlide = true;

        ko.bindingHandlers.hideSection = {
            init: function (element, valueAccessor) {
                var sectionSelector = valueAccessor();
                $(element).click(function () {
                    $(sectionSelector).slideUp(200);
                });
            }
        };

        ko.bindingHandlers.hideWhenScrollOrResize = {
          init: function (element) {
              $(window).on("scroll resize", function () {
                  $(element).slideUp(200);
              });
          }
        };

        ko.bindingHandlers.hideWhenClickAside = {
            init: function(element) {
                $(document).mouseup(function (e) {
                    var container = $(element);
                    if (!container.is(e.target) && container.has(e.target).length === 0)
                        $(container).slideUp(200);
                });
            }
        };

        ko.bindingHandlers.hideOnOutsideAction = {
            init: function (element) {
                ko.bindingHandlers.hideWhenClickAside.init(element);
                ko.bindingHandlers.hideWhenScrollOrResize.init(element);
            }
        };

        ko.bindingHandlers.showSibling = {
            init: function (element, valueAccessor) {
                var siblingSelector = valueAccessor();
                
                $(element).click(function (event) {
                    event.preventDefault();
                    $(element).siblings(siblingSelector).stop().fadeToggle(200);
                });
            }
        };
        
        ko.bindingHandlers.carousel = {
            init: function (element, valueAccessor) {
                var parameters = ko.utils.unwrapObservable(valueAccessor());
                
                carousel.init(element, parameters.setting, parameters.isEditorMode);
            }
        };
        
        ko.bindingHandlers.linkClick = {
            init: function (element, valueAccessor) {
                $(element).find("a").click(function () {
                    valueAccessor();
                });
            }
        };

        ko.bindingHandlers.imageFeed = {
            init: function (element, valueAccessor) {
                var initOptions = valueAccessor().options;
                var model = new socialMediaFeedUi();

                require([initOptions.feedProviderName], function (feedProvider) {
                    feedProvider.getFeedData(initOptions).done(function (imageDataArray) {
                        model.feedImages(imageDataArray);
                        binder.applyBindings(model, element.children[0]);
                    }).fail(function () {
                        console.log('loading feed from ' + initOptions.feedProviderName + ' failed');
                    });
                });
            }
        };

        ko.bindingHandlers.numeric = {
            init: function (element, valueAccessor) {
                $(element).on("keydown", function (event) {
                    // Allow: backspace, delete, tab, escape, and enter
                    if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                        // Allow: Ctrl+A
                        (event.keyCode == 65 && event.ctrlKey === true) ||
                        // Allow: home, end, left, right, up, down
                        (event.keyCode >= 35 && event.keyCode <= 40)) {
                        // let it happen, don't do anything
                        return;
                    }
                    // Ensure that it is a number and stop the keypress
                    if(event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                        event.preventDefault();
                    }
                });
                
                $(element).on("keyup", function (event) {
                    var value = parseInt($(element)[0].value);
                    var maxValue = parseInt($(element)[0].max);
                    var minValue = parseInt($(element)[0].min);

                    if (maxValue && value > maxValue) {
                        $(element)[0].value = maxValue;
                        $(element).change();
                    }
                    
                    if(value < minValue) {
                        $(element)[0].value = minValue;
                        $(element).change();
                    }
                });
                $(element).on("mousewheel", function () {});
            }
        };
        
    });
;
define('languageSelector', ['jquery', 'ViewModels/languageSelectorUi'],
    function ($, languageSelectorViewModel) {
        $(document).ready(function () {
            //bindings are in Scripts/App.binder.js
            
            //Language selector                
            var language_item = $('.language-item'),
                language_dropdown = language_item.find('.dropdown'),
                language_dropdown_clip = language_dropdown.css('clip');

            language_item.on('click', function (e) {
                if ($(this).hasClass('open')) {
                    $(this).removeClass('open');
                    language_dropdown.css('clip', language_dropdown_clip);
                    return;
                }

                $(this).addClass('open');
                language_dropdown.css('clip', 'auto');
            });
        });

        var setup = function(languages) {
            languageSelectorViewModel.languages(languages);
        };

        return {
            setup: setup
        };
    });;
define('locationMap', ['jquery', 'jqueryBrowser', 'maplace',
        /* Dependencies without component accessible through variable */ 'promise!googleMapsInitializer'],
    function ($, jqueryBrowser, maplace) {
        var init = function(mapParams, uniqueId) {
            mapParams.afterShow = function(index, location) {
                $('#info').html(location.html);
            };

            mapParams.map_div = "#" + uniqueId;

            loadMap(maplace, mapParams);
        };
        
        var loadMap = function (maplace, mapParameters) {
            if ($(mapParameters.map_div).length) {
                var cpLat = mapParameters.map_options.centrePointLat;
                var cpLon = mapParameters.map_options.centrePointLon;
                
                if (cpLat && cpLon) {
                    mapParameters.map_options.set_center = [cpLon, cpLat];
                }
                //if there is one single marker on the map, then center position must be set:
                else if($(mapParameters.locations).length == 1) {
                    mapParameters.map_options.set_center = [mapParameters.locations[0].lat, mapParameters.locations[0].lon];
                }

                //Map shouldn't be draggable on mobile - regardless of settings in Sitecore
                if (jqueryBrowser.mobile) {
                    mapParameters.map_options.draggable = false;
                }

                var map = new maplace(mapParameters);

                map.o.afterCreateMarker = function(index, location, marker) {
                    marker.zIndex = 10000 + index;
                    marker.icon.size = new google.maps.Size(location.icon.width, location.icon.height);
                    marker.icon.origin = new google.maps.Point(location.icon.originX, location.icon.originY);
                    marker.icon.anchor = new google.maps.Point(location.icon.anchorX, location.icon.anchorY);
                };

                map.Load();
            }
        };
   
        return {
            init: init
        };
});;
define('mapInitializer', ['jquery'],
    function ($) {
        var isMapsApiLoaded = false;
        var def = $.Deferred(function () {
            if (isMapsApiLoaded) {
                def.resolve();
                return;
            }

            loadMapApi();
        });

        function loadMapApi() {
            $(document).ready(function () {
                var script = document.createElement('script');
                script.type = 'text/javascript';
                script.src = 'http://maps.google.com/maps/api/js?sensor=false&amp;libraries=geometry&amp;v=3.7&' +
                    'callback=mapsApiLoaded';
                document.body.appendChild(script);
            });
        };

        var init = function () {
            return def.promise();
        };
        
        window.mapsApiLoaded = function () {
            isMapsApiLoaded = true;
            def.resolve();
        };

        return {
            init: init
        };
    });;
define('meetingRoomTable', ['ViewModels/meetingRoomTableUi', 'queryStringHelper', 'utils'],
    function (meetingRoomTableUi, queryStringHelper, utils) {
        //bindings are in Scripts/App/binder.js

        var init = function (initData) {
            meetingRoomTableUi.hotels(initData.hotels);
            
            //Populate from QueryString
            var query = queryStringHelper.getQuery();
            if (query.hotel) {
                meetingRoomTableUi.hotelFilter(utils.stripHtml(query.hotel));
            }
            if (query.location) {
                meetingRoomTableUi.locationFilter(utils.stripHtml(query.location));
            }            
            if (query.delegates) {
                meetingRoomTableUi.capacityFilter(utils.stripHtml(query.delegates));
            }
        };

        return {
            init: init
        };
    });;
define('menuOverlay', ['jquery'],
    function ($) {
        var init = function () {
            //variables initialization
            var $overlayContainerDesktop = $(".desktop.menu-overlay");
            var $overlayContainerMobile = $(".mobile.menu-overlay");
            var $topLinks = $('.desktop .content-list-menu-links li a');
            var $topSubmenuLinks = $('.desktop .menu-type-3 .content-top-submenu-links > li > a');
            var $topSubmenuListItems = $('.desktop .menu-type-3 .content-top-submenu-links > li');
            var $submenuLinks1 = $('.desktop .menu-type-1 .links-list .links-container li');
            var $submenuImages1 = $('.desktop .menu-type-1 .links-list .image-container .submenu-links-content');
            var $submenuLinks3 = $('.desktop .menu-type-3 .content-list-submenu-links > li');
            var OVERLAY_TYPE = {
                DESKTOP: 1,
                MOBILE: 2
            }

            //subscriptions
            $(".menu-row-desktop .hamburger")
                .click(showDesktopMenu);
            $(".desktop .menu-overlay-close")
                .click(hideDesktopMenu);
            $(".menu-row-mobile .hamburger")
                .click(showMobileMenu);
            $(".mobile .menu-overlay-close")
                .click(hideMobileMenu);

            $(window).resize(function () {
                //if overlay is visible we need to ensure we are showing to user correct one
                if ($(".menu-overlay").hasClass("is-opened")) {
                    if (window.innerWidth < 1024) {
                        hideDesktopMenu();
                        showMobileMenu();
                    } else {
                        hideMobileMenu();
                        showDesktopMenu();
                        aduptListSize();
                    }
                }
            });

            $topLinks.hoverIntent({
                timeout: 200,
                out: hoverOut,
                over: hoverIn
            });

            $submenuLinks1.hoverIntent({
                timeout: 200,
                out: hoverOutPreviewTemplate1Content,
                over: hoverInPreviewTemplate1Content
            });
            $submenuLinks3.hoverIntent({
                timeout: 200,
                out: hoverOutPreviewTemplate3Content,
                over: hoverInPreviewTemplate3Content
            });

            $topSubmenuLinks.hover(togglePreviewTemplate3);

            $(".mobile .content-list-menu-links li .arrow").click(toggleSubMenu);

            $(".mobile .hotels-menu-title").click(toggleHotelsMenuMobile);

            $(".desktop .hotels-menu-title").click(toggleHotelsMenuDesktop);

            var placeholderSearch = $(".desktop input.top-search").attr("placeholder");
            $(".desktop input.top-search").blur(function () {
                $(this).attr("placeholder", placeholderSearch);
            });
            
            //top level functions
            function showDesktopMenu() {
                var $overlayContainer = getOverlay(OVERLAY_TYPE.DESKTOP);
                showOverlay($overlayContainer);
                showLeftMenuLinks($overlayContainer);

                $("#designstudio-button").hide();
                $('.desktop .menu-overlay-content').jScrollPane();
                aduptListSize();
            }
            function showMobileMenu() {
                var $overlayContainer = getOverlay(OVERLAY_TYPE.MOBILE);
                showOverlay($overlayContainer);
                showLeftMenuLinks($overlayContainer);
                hideMobileMenuButton();
                $("#designstudio-button").hide();
            }
            function hideDesktopMenu() {
                var $overlayContainer = getOverlay(OVERLAY_TYPE.DESKTOP);
                hideOverlay($overlayContainer);
                hideLeftMenuLinks($overlayContainer);
                turnOffHotelsMenuDesktop();
                $("#designstudio-button").show();
            }
            function hideMobileMenu() {
                var $overlayContainer = getOverlay(OVERLAY_TYPE.MOBILE);
                hideOverlay($overlayContainer);
                hideLeftMenuLinks($overlayContainer);
                showMobileMenuButton();
                turnOffHotelsMenuMobile();
                $("#designstudio-button").show();
            }

            //low level functions (probably need to refactor a bit)
            function hideMobileMenuButton() {
                $(".hamburger-mobile, .menu-row-mobile .hamburger").hide();
                $(".mobile .menu-overlay-close").show();
            }
            function showMobileMenuButton() {
                $(".mobile .menu-overlay-close").hide();
                $(".hamburger-mobile, .menu-row-mobile .hamburger").show();
            }
            //for avoiding double scroll bars we turn off body scroll as there is overlay scroll. and turn it on when closing overlay
            function turnOffBodyScroll() {
                $("html").addClass("opened-menu");
            }
            function turnOnBodyScroll() {
                $("html").removeClass("opened-menu");
            }
            function toggleHotelsMenuMobile() {
                if (!$(".mobile .menu-overlay-content-bottom").hasClass("opened")) {
                    turnOnHotelsMenuMobile();
                } else {
                    turnOffHotelsMenuMobile();
                }
            }

            function toggleHotelsMenuDesktop() {
                if (!$(".desktop .menu-overlay-content-bottom").hasClass("opened")) {
                    turnOnHotelsMenuDesktop();
                } else {
                    turnOffHotelsMenuDesktop();
                }
            }

            function turnOnHotelsMenuDesktop() {
                var $desktopContainer = $(".desktop");
                //$desktopContainer.find(".overlay-left").css("overflow-y", "hidden");

                $desktopContainer.find(".menu-overlay-content-bottom")
                    .addClass("opened").one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend',
                        function (e) {
                            $(this).css("overflow", "auto");
                        }
                    );
                $desktopContainer.find(".menu-overlay-content").hide();
            }

            function turnOffHotelsMenuDesktop() {
                var $desktopContainer = $(".desktop");
                $desktopContainer.find(".menu-overlay-content-bottom")
                    .css("overflow", "hidden")
                    .removeClass("opened");
                $desktopContainer.find(".menu-overlay-content").show();

                //$desktopContainer.find(".overlay-left").css("overflow-y", "auto");
            }

            function turnOnHotelsMenuMobile() {
                var $mobileContainer = $(".mobile");

                $mobileContainer.find(".menu-overlay-content-bottom").addClass("opened");
                $mobileContainer.find(".mobile-menu-footer").addClass("active-hotels");
                $mobileContainer.find(".menu-overlay-content").addClass("hide");
            }

            function turnOffHotelsMenuMobile() {
                var $mobileContainer = $(".mobile");

                $mobileContainer.find(".menu-overlay-content-bottom").removeClass("opened").one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend',
                    function (e) {
                        $(this).css("position", "relative");
                    }
                );
                $mobileContainer.find(".menu-overlay-content").removeClass("hide");
                $mobileContainer.find(".mobile-menu-footer").removeClass("active-hotels");
                $mobileContainer.find(".overlay-left").css("overflow-y", "auto");
            }

            function showOverlay($overlayContainer) {
                turnOffBodyScroll();
                //cleanup searches on opening overlay
                hideSearchValidationMessage();
                $overlayContainer.show();
                setTimeout(function () {
                    $overlayContainer.addClass("is-opened");
                }, 100);
            }

            function hideOverlay($overlayContainer) {
                turnOnBodyScroll();
                $overlayContainer.removeClass("is-opened");
                $overlayContainer.find('.overlay-left').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend',
                    function (e) {
                        if (!$overlayContainer.hasClass('is-opened')) {
                            $overlayContainer.hide();
                        };
                    });
            } 

            function showLeftMenuLinks($overlayContainer) {
                $overlayContainer.find('.overlay-left .content-list-menu-links>li, .overlay-left .content-list-secondary-links>li').each(function (i) {
                    var link = $(this);
                    setTimeout(function () { link.addClass('nav-open'); }, (i + 1) * 75);
                });
            }

            function hideLeftMenuLinks($overlayContainer) {
                $overlayContainer.find('.overlay-left .content-list-menu-links>li, .overlay-left .content-list-secondary-links>li').each(function (i) {
                    var link = $(this);
                    setTimeout(function () { link.removeClass('nav-open'); }, (i + 1) * 25);
                });
            }

            function getOverlay(overlay_type) {
                var $overlayContainer;
                switch (overlay_type) {
                    case OVERLAY_TYPE.DESKTOP:
                        $overlayContainer = $overlayContainerDesktop;
                        break;
                    case OVERLAY_TYPE.MOBILE:
                        $overlayContainer = $overlayContainerMobile;
                        break;
                }
                return $overlayContainer;
            }

            function hideSearchValidationMessage() {
                $(".site-search-form .validationMessage").hide();
            }

            function togglePreviewTemplate3(e) {
                e.preventDefault();
                $topSubmenuListItems.removeClass("selected");
                $(this).parent().toggleClass("selected");
                $(this).parent().find(".content-list-submenu-links > li:first").addClass("selected");
            }

            //hovering the overlay items - DESKTOP only
            function hoverIn() {
                var menuID = $(this).data('menu-id');
                var targetContainer = $('#' + menuID);

                $topLinks.removeClass("active");
                $('.desktop .overlay-right .preview-menu').removeClass('displayed');
                $(this).addClass('active');

                targetContainer.addClass('displayed');
                var bgUrl = targetContainer.data("bg");
                $('.desktop .overlay-right').css("background-image", "url('" + bgUrl + "')");
                
                if (targetContainer.hasClass("menu-type-1")) {

                    var linksList = targetContainer.find(".links-container .content-list-submenu-links li");
                
                    if (linksList.length > 0) {
                        var firstLink = linksList.first();

                        linksList.removeClass("selected");

                        if (firstLink.length > 0)
                            firstLink.addClass("selected");
                    }

                    var containersList = targetContainer.find(".image-container .submenu-links-content");

                    if (containersList.length > 0) {
                        var firstContainer = containersList.first();

                        containersList.removeClass("selected");

                        if (firstContainer.length > 0)
                            firstContainer.addClass("selected");
                    }
                }

                aduptListSize();

            }
            function hoverOut() {
                //have no idea what could be put here :) 
                //$(this).removeClass('active');
            }

            function hoverInPreviewTemplate1Content(e) {
                $submenuLinks1.removeClass("selected");
                $submenuImages1.removeClass("selected");

                $(this).addClass("selected");

                var targetId = $(this).data("id");
                $("#" + targetId).addClass("selected");

            }
            function hoverOutPreviewTemplate1Content(e) {
            }

            function hoverInPreviewTemplate3Content(e) {
                $submenuLinks3.removeClass("selected");
                $(this).addClass("selected");
            }
            function hoverOutPreviewTemplate3Content(e) {
                $(this).removeClass("selected");
            }

            // clicking the overlay items - MOBILE only
            function toggleSubMenu() {
                $(this).parent().toggleClass("selected");
                return false;
            }

            function aduptListSize() {
                var container = $(".desktop .overlay-right .preview-menu.displayed");

                if (container.length > 0) {
                    var diff = container.find(".common-type-info").outerHeight(true);
                    var list = container.find(".links-list");

                    list.height(container.height() - diff - 40);
                }
            }
        };
        return {
            init: init
        };
    });;
define('navigationMenu', ['jquery'],
    function ($) {
        var init = function () {

            var $autocompleteSelector = $('.search-container.with-autocomplete > .site-search-form > input');
            var placeholderPhrase = $(".search-block > .search-container").find("input.top-search").attr("placeholder");
            var $headerSearch = $(".header-search-overlay");
            var $dsButton = $("#designstudio-button");
            var $headerSearchInput = $headerSearch.find(".top-search");
            var $searchInputs = $(".search-container .top-search");

            // phone button toggle
            $(".phone-area").click(function () {
                $(".menu-phone").toggleClass("phone-active");
                return false;
            });

            initLanguageSwithcer($(".menu-language-area"));

            $(window).on("scroll touchmove", function () {
                $('.menu-row-desktop').toggleClass('menu-sticky', $(document).scrollTop() > 0);
                if ($(document).scrollTop() > 0) {
                    $('.menu-mobile-header-links').fadeOut(400);
                } else {
                    $('.menu-mobile-header-links').fadeIn(400);
                }
            });

            $(".header-search-close-desktop").click(function () {
                closeSearchOverlay($dsButton, $headerSearch, $headerSearchInput, $searchInputs);
            });

            $(document).on('click', function (e) {
                if (!$(e.target).closest(".search-block, .search-area").length > 0 && $(".search-block").is(":visible")) {
                    closeSearchOverlay($dsButton, $headerSearch, $headerSearchInput, $searchInputs);
                }
            });

            $(".menu-overlay-close").click(function () {
                var searchInputs = $(".search-container .top-search");
                
                searchInputs.each(function () {
                    $(this).val("");
                    $(this).autocomplete("search", "");
                });
            });

            $(".search-area").click(function (e) {
                showSearchPlaceholder(placeholderPhrase);
                $dsButton.hide();
                $headerSearch.fadeIn(350);

                if ($(this).closest(".menu-row-desktop").length > 0) {
                    $headerSearchInput.focus();
                }

                return false;
            });

            $searchInputs.focus(function () {
                if($(this).val().length < 1) {
                    toggleQuickLinks($(this), true);
                }
            });

            $searchInputs.blur(function () {
                toggleQuickLinks($(this), false);
            });

            initAutocomplete($autocompleteSelector);

        };

        var showSearchPlaceholder = function (placeholderPhrase) {
            $(".search-block > .search-container").find(".validationMessage").hide();
            $(".search-container > .site-search-form > input.top-search").attr("placeholder", placeholderPhrase);
        }

        var initLanguageSwithcer = function ($element) {
            var $menuLangaugeArea = $(".menu-language-area");
            if ($menuLangaugeArea.length == 0) {
                return;
            }

            var link = $menuLangaugeArea.find(".flag.languageSelector, .arrow-item");
            if (!link) {
                return;
            }           

            link.click(handleLanguageSelectorClick);
        }

        var handleLanguageSelectorClick = function () {
            var $languageSelectorDropDown = $(".menu-language-area .dropdown.languageSelector");
            var $arrowContainer = $(".menu-language-area .arrow-item");
            if ($languageSelectorDropDown.length == 0 || $arrowContainer.length == 0) {
                return false;
            }

            var openedClassName = "opened";
            if ($languageSelectorDropDown.is(":visible")) {
                $languageSelectorDropDown.hide();
                $arrowContainer.removeClass(openedClassName);
            }
            else {
                $languageSelectorDropDown.show();
                $arrowContainer.addClass(openedClassName);
            }

            return false;
        }

        var toggleQuickLinks = function ($element, show) {

          if($element != undefined) {

            var quickLinks = $element.closest(".search-container").find(".quick-links");

            if (show)
              quickLinks.fadeIn();
            else
              quickLinks.fadeOut();

          }

        }

        var initAutocomplete = function ($autocompleteSelector) {
            if ($autocompleteSelector.length > 0) {

                var autocompleteDataStr = sessionStorage.autocompleteSource;

                if (autocompleteDataStr == undefined) {
                    $.ajax({
                        type: 'GET',
                        url: "/mvc/Menu/GetPredictiveSearchResults",
                        crossDomain: true,
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        jsonp: 'json.wrf',
                        success: function (data) {
                            sessionStorage.setItem('autocompleteSource', JSON.stringify(data));
                            populateAutocomplete($autocompleteSelector);
                        },
                        async: false,
                        cache: false
                    });
                }
                else
                    populateAutocomplete($autocompleteSelector);
            }
        }

        var populateAutocomplete = function ($autocompleteSelector) {

            var autocompleteData = JSON.parse(sessionStorage.autocompleteSource);

            $autocompleteSelector.each(function () {

                var predictiveSearch = $(this).autocomplete({
                    appendTo: $(this).closest(".search-container"),
                    position: { my: "left-38 top+12", at: "left bottom", collision: "none" },
                    autoFill: true,
                    source: function (request, response) {
                        var re = $.ui.autocomplete.escapeRegex(request.term);
                        var startsWithMatcher = new RegExp("^" + re, "i");

                        var startsWith = $.grep(autocompleteData, function (value) {
                            return startsWithMatcher.test(value.Text);
                        });

                        var containsMatcher = new RegExp(re, "i");
                        var contains = $.grep(autocompleteData, function (value) {
                            return $.inArray(value, startsWith) < 0 && (
                                containsMatcher.test(value.Text) || containsMatcher.test(value.Keywords))
                        });

                        var fullList = startsWith.concat(contains);

                        var fullSortedList = fullList.sort(function (a, b) {
                            return b.Score - a.Score;
                        });

                        response(fullSortedList.slice(0, 5));
                    },
                    select: function (event, ui) {
                        var value = ui.item.Text;
                        $(this).val(value);
                        return false;
                    },
                    open: function () {
                        toggleQuickLinks($(this), false);
                    },
                    close: function () {
                        toggleQuickLinks($(this), true);
                    }
                }).blur(function () {                   
                    if ($(this).val().length > 0)
                        $(this).autocomplete("search", $(this).val());
                });

                predictiveSearch.autocomplete("instance")._renderItem = function (ul, item) {
                    var re = new RegExp("(" + this.term + ")", "gi");
                    var template = "<strong>$1</strong>";
                    var searchLinkTpl = "/search?query=" + encodeURI(item.Text);
                    var label = item.Text.replace(re, template);
                    ul.addClass("search-links-list");

                    return $("<li class='search-link'>")
                        .append("<i class='fa fa-" + item.Icon + "'></i><a href='" + searchLinkTpl + "'>" + label + "</a><a href='" + item.Url + "'><i class='fa fa-external-link'></i></a>")
                        .appendTo(ul);
                };
            });
        }

        var closeSearchOverlay = function ($dsButton, $headerSearch, $headerSearchInput, $searchInputs) {

            $searchInputs.each(function () {
                $(this).val("");
                $(this).autocomplete("search", "");
            });

            $dsButton.show();
            $headerSearch.fadeOut(450);
            $headerSearchInput.blur();
        }

        return {
            init: init
        };
    });;
//TODO: Remove after switch to WFFM
define('newsletterForm', ['ViewModels/newsletterUi'],
    function (newsletterUi) {
        //bindings are in Scripts/App/binder.js

        var init = function (redirectUrl) {
            newsletterUi.redirectUrl(redirectUrl);
        };

        return {
            init: init
        };
    });;
define('offersFiltering', ['jquery'],
    function ($) {
        var init = function () {

            var container = $(".offer-container");

            if (container.length > 0) {
                initCarouselOffers();
                initListFiltering();
                initDropdownFiltering();
                SortCTAs();
            }
        };

        function initListFiltering() {
            $(".offer-filter-button").click(function () {
                var filter = $(this).data("filter");
                filterOffers(filter);
            });
        }

        function initDropdownFiltering() {
            $(".offering-filter .isotope-filter").change(function () {
                var filter = $(this).val();
                filterOffers(filter);
            });
        }

        function filterOffers(filter) {
            var allOffers = $(".offers-container .offer-container");
            var selectedOffers = allOffers;

            if (filter.length > 0) {
                selectedOffers = $(".offers-container .offer-container[data-category*='" + filter + "']");
            }

            selectedOffers.each(function () {
                $(this).delay(350).fadeIn(350);
            });

            allOffers.not(selectedOffers).each(function () {
                $(this).fadeOut(350);
            });
        }

        function initCarouselOffers() {

            var carousel = $('.offers-owl-carousel')

            carousel.trigger('initialized.owl.carousel').show();

            carousel.owlCarousel({
                items: 1,
                autoplay: 6000,
                pagination: false,
                itemsDesktop: [1220, 1],
                itemsDesktopSmall: [998, 1],
                itemsTablet: [780, 1],
                itemsMobile: [490, 1],
                navigation: true,
                navigationText: ["", ""]
            });
        }

        function SortCTAs() {
            if ($(".offer-ctas")[0]) {
                $(".offer-ctas").each(function () {
                    if ($(this).find("a").length == 1) {
                        $(this).find("a").addClass("small-centered");
                        $(this).find("a").removeClass("offer-cta-default-right");
                    }
                });
            }
        }
        
        return {
            init: init
        };
    });;
define('pinterestFeedProvider', ['jquery'],
    function ($) {
        
        var getModel = function (result, options) {
            var imageDataArray = [];
            var maxNumberOfItems = 5;
            var resolution = '237x';

            if (options.numberOfItems)
                maxNumberOfItems = options.numberOfItems;
            
            if (options.configSettings.resolution)
                resolution = options.configSettings.resolution;
            
            for (var i = 0; i < maxNumberOfItems; i++) {
                var value = result.data.pins[i];
                var src = value.images[resolution].url;
                imageDataArray.push(
                    {
                        link: 'https://www.pinterest.com/pin/'+ value.id,
                        imgSrc: src
                    });
            }
            return imageDataArray;
        };

        var getFeedData = function (pinterestOptions) {
            var apiUrl = pinterestOptions.configSettings.url.replace("{0:feedId}", pinterestOptions.feedId);
            
            return $.Deferred(function (def) {
                $.ajax({
                    type: 'GET',
                    url: apiUrl,
                    success: function (data) {
                        def.resolve(getModel(data, pinterestOptions));
                    },
                    error: function () {
                        def.reject();
                    },
                    dataType: 'jsonp'
                });
            });
        };

        return {
            getFeedData: getFeedData
        };
    });;
define('popupHelper', ['bootbox', 'context'],
    function (bootbox, context) {
        var alert = function (message, callback) {
            return bootbox.alert({
                message: '<h3>' + message + '</h3>',
                className: 'reveal-modal',
                closeButton: null,
                buttons: {
                    ok: {
                        label: context.buttonCaptions.ok
                    }
                },
                callback: callback
            });
        };

        var loadingPanel = function(message) {
            return bootbox.dialog({
                message: message,
                className: 'reveal-modal',
                closeButton: false,
                buttons: null
            });
        };

        var hide = function(box) {
            box.modal('hide');
        };
        
        return {
            alert: alert,
            loadingPanel: loadingPanel,
            hide: hide
        };
});
define('queryStringHelper', ['jquery',
        /* Dependencies without component accessible through variable */'jquery-queryParser'],
    function ($) {
        
        var getParsedQueryString = function (href, options) {
            var queryStringStartPosition = href.indexOf('?');
            if (href.indexOf('mailto:') == 0) {
                return '';
            }
            
            var hasQueryString = queryStringStartPosition > -1;
            var queryString = hasQueryString ? href.substring(queryStringStartPosition) : '';
            return $.parseQuery(queryString, options);
        };
        
        var setValue = function (key, value, url) {
            var queryString;
            
            if (!url) {
                url = $(location).attr('href');
                queryString = $.getQuery();
            }
            else queryString = getParsedQueryString(url);
            
            var queryStringStartIndex = url.indexOf('?');
            var hasQueryString = queryStringStartIndex > -1;

            queryString[key] = value;

            var updatedQueryString = '?' + $.param(queryString);

            return hasQueryString === true ? url.substring(0, queryStringStartIndex).concat(updatedQueryString) : url.concat(updatedQueryString);
        };

        var getValue = function (key, url) {
            var queryString;
            if (url) 
                queryString = getParsedQueryString(url);
            else 
                queryString = $.getQuery();
            
            return queryString[key];
        };
        
        var getQuery = function () {
            return $.getQuery();            
        };
        
        function urlHasQuerystringKey(key, url) {
            if (!url) {
                url = $(location).attr('href');
            }

            var parsedQueryString = getParsedQueryString(url, { tolerant: true });
            return parsedQueryString.hasOwnProperty(key);
        }

        return {            
            setValue: setValue,
            getValue: getValue,
            getQuery: getQuery,
            urlHasQuerystringKey: urlHasQuerystringKey
        };
    });;
define('requests', ['amplify'],
    function (amplify) {
        amplify.request.define('bookingRedirectUrl', 'ajax', {
            url: '/mvc/Booking/GetRedirectUrl',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
        
        amplify.request.define('bookingModifyRedirectUrl', 'ajax', {
            url: '/mvc/Booking/GetModifyBookingRedirectUrl',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
        
        amplify.request.define('quoteRequestRedirectUrl', 'ajax', {
            url: '/mvc/Booking/GetQuoteRequestRedirectUrl',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });

        amplify.request.define('bookAMeetingHotelRedirectUrl', 'ajax', {
            url: '/mvc/Booking/GetBookAMeetingHotelRedirectUrl',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });

        amplify.request.define('signupToNewsletter', 'ajax', {
            url: '/mvc/Newsletter/SignupToNewsletter',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
        
        amplify.request.define('saveEventEnquiry', 'ajax', {
            url: '/mvc/FormsApi/SaveEventEnquiry',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
        
        amplify.request.define('saveGeneralEnquiry', 'ajax', {
            url: '/mvc/FormsApi/SaveGeneralEnquiry',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
        
        amplify.request.define('saveMeetingRoomEnquiry', 'ajax', {
            url: '/mvc/FormsApi/SaveMeetingRoomEnquiry',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
        
        amplify.request.define('saveJobApplication', 'ajax', {
            url: '/mvc/FormsApi/SaveJobApplication',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
        
        amplify.request.define('loadAdditionalArticles', 'ajax', {
            url: '/mvc/ArticlesApi/LoadAdditionalArticles',
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json; charset=utf-8'
        });
    });;
define('searchBar', ['jquery', 'knockout', 'ViewModels/searchBarUi'],
    function ($, ko, searchBarViewModel) {
        //bindings are in Scripts/App/binder.js

        var setup = function (searchPageUrl) {
            searchBarViewModel.searchPageUrl(searchPageUrl);
        };

        return {
            setup: setup            
        };
    });;
define('uiEffectHelper', ['jquery', 'knockout'],
    function($, ko) {
        var toggleElement = function (element, toggleOptions) {
            var defaultDuration = 200;
            var options = toggleOptions;
            var duration = options.duration || defaultDuration;
            var target = element;
            var isFade = false;

            if (options) {
                if (options.withCss) {
                    target = options.withCss;
                } else if (options.withId) {
                    target = '#' + options.withId;
                }

                if (options.isFade)
                    isFade = true;
            }

            ko.applyBindingsToNode(element, {
                click: function() {
                    if (isFade === true)
                        $(target).fadeToggle(duration).toggleClass('open');
                    else
                        $(target).slideToggle(duration).toggleClass('open');
                }
            });
        };

        var toggleHeader = function (element, className) {

            changeHeader();
            
            $(window).scroll(function () {
                changeHeader();
            });

            function changeHeader() {

                if ($(this).scrollTop() > 1) {

                    if(!element.hasClass(className))
                        element.addClass(className);
                }
                else
                    element.removeClass(className);

            }
        };

        var toggleSearch = function (element, button) {

            $(button).click(function () {
                if (element.val().length == 0) {
                    element.toggleClass("open");
                }
            });
        };

        return {
            toggleHeader: toggleHeader,
            toggleElement: toggleElement,
            toggleSearch: toggleSearch
        };
    });;
define('utils', ['jquery', 'underscore', 'knockout', 'underscore.string', 'moment'],
    function ($, _, ko, _s, moment) {
        ko.subscribable.fn.subscribeChanged = function(callback) {
            var oldValue;
            this.subscribe(function(_oldValue) {
                oldValue = _oldValue;
            }, this, 'beforeChange');

            this.subscribe(function(newValue) {
                callback(oldValue, newValue);
            });
        };

        var inclusiveRange = function(start, end, step) {
            if (_.isUndefined(step))
                step = 1;
            return _.range(start, end + step, step);
        };

        var padList = function(array, digits, paddingchar) {
            var list = [];
            for (var i = 0; i < array.length; i++) {
                var item = array[i];
                list.push({
                    value: item,
                    text: _s.pad(item, digits, paddingchar)
                });
            }
            return list;
        };

        var redirect = function(redirectUrl) {
            var form = document.createElement("form");
            form.setAttribute('method', "post");
            form.setAttribute('action', redirectUrl);
            form.setAttribute('style', 'display:none;');

            var submitButton = document.createElement("input");
            submitButton.name = "send";
            submitButton.type = "submit";
            form.appendChild(submitButton);
            document.body.appendChild(form);

            form.submit();
        };

        var htmlRegExp = new RegExp("</?.+?>");
        var containsHtml = function(str) {
            return htmlRegExp.test(str);
        };

        var stripHtml = function(str) {
            if (!str) {
                return str;
            }

            return str.replace(htmlRegExp, '');
        };

        String.prototype.toBool = function() {
            return _s.toBoolean(this.toString());
        };

        var date = {
            isValid: function(dateObj) {
                return !_.isUndefined(dateObj) && moment(dateObj).isValid();
            },
            toFormattedString: function(dateObj, formatString) {
                if (!formatString)
                    formatString = "YYYY-MM-DD";

                if (!this.isValid(dateObj))
                    return undefined;

                return moment(dateObj).format(formatString);
            },
            parse: function (dateString, formatString) {
                if (!dateString)
                    return null;
                
                if (!formatString)
                    formatString = "YYYY-MM-DD";

                var momentDateObj = moment.utc(dateString, formatString);
                return momentDateObj._d;
            }
        };

        var isJson = function (str) {
            try {
                JSON.parse(str);
            } catch (e) {
                return false;
            }
            return true;
        }

        var hasClassContains = function ($element, classStr) {
            var className = '';
            $.each($element.attr('class').split(/\s+/), function (i, name) {
                if (name.indexOf(classStr) > -1) { // or name.indexOf('toaster') === 0
                    className = name;
                    return false;
                }
            });

            return className;
        }

        var isEmail = function(email) {
            var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            return regex.test(email);
        }

        return {
            inclusiveRange: inclusiveRange,
            redirect: redirect,
            containsHtml: containsHtml,
            stripHtml: stripHtml,
            padList: padList,
            isJson: isJson,
            hasClassContains: hasClassContains,
            date: date,
            isEmail: isEmail
        };
    });;
define('validationHelper', ['knockout', 'jquery',
        /* Dependencies without component accessible through variable */'knockout-validation', 'validationRules'],
    function (ko, jQuery) {

        var languageCulture = jQuery("html").attr("lang");

        if (languageCulture == "en")
            languageCulture = "en-US";

        ko.validation.locale(languageCulture);

        var init = function () {
            ko.validation.init({
                insertMessages: true,
                decorateInputElement: true,
                decorateElementOnModified: true,
                errorElementClass: 'validationError',
                insertMessages: true
            }, true);
        };

        var validate = function (obj, options) {
            var errors = ko.validation.group(obj, options);
            var isValid = errors().length === 0;
            if (!isValid) {
                errors.showAllMessages(true);
            }
            return isValid;
        };

        var reconfigure = function(target, configuration) {
            var ruleDefinitions = target.rules();
            var newRuleDefinitions = [];
            for (var def in ruleDefinitions) {
                var ruleDef = ruleDefinitions[def];

                if (configuration.hasOwnProperty(ruleDef.rule)) {
                    ruleDef.params = configuration[ruleDef.rule];
                }
                
                newRuleDefinitions.push(ruleDef);
            }
            
            target.rules(newRuleDefinitions);
        };

        return {
            init: init,
            validate: validate,
            reconfigure: reconfigure
        };
    });;
define('validationRules', ['knockout', 'context', 'utils',
        /* Dependencies without component accessible through variable */ 'knockout-validation'],
    function (ko, context, utils) {
        ko.validation.rules['xssSafe'] = {
            validator: function (val) {                
                if (val == null) {
                    return true;
                }

                return !utils.containsHtml(val);
            },
            message: context.constants.invalidInput
        };

        ko.validation.rules['notLess'] = {
            validator: function (val, otherVal) {
                return val >= otherVal;
            },
            message: "End time can't be less Start time"
        }

        ko.validation.rules['Greater'] = {
            validator: function (val, params) {

                if (params.StartHour() == params.EndHour())
                    return val > params.StartMinute();

                if (params.EndHour() > params.StartHour())
                    return val != undefined;
            },
            message: "End time can't be less or equal Start time"
        }

        ko.validation.registerExtenders();
    });;
define('wffmHelper', ['jquery', 'context', 'popupHelper', 'foundation.datepicker.i18n.ttc', 'utils', 'jquery-foundation.datepicker', 'chosen', 'jquery-styles'],
    function ($, context, popupHelper, datepickerHelper, utils) {

        var init = function () {

            initFailPopup();
            initRequestData();
            initDateField();
            initPlaceholder();
            initNewsletterPopup("#newsletter_popup_signup");

            initHelpFields();
            initSubscriptionToggle();
            initNumberField();
            initTimeField();

            initTooltipField($(".field-tooltip"));
            initCountryDependentfField($(".country-dependent"));

            multiSelectionDropDown($(".main-form select.form-control[multiple='multiple']"));
            initDynamicFields($(".dynamic-field select"));
            initDynamicLabels($(".dynamic-field select"));
            initTrigTravelAgentFields();
            initTrigHiddenAvoyaField();
            initAsDirectedTriger();
            prepopulateFormByUrl();
            initLabelReplaceToSpan();

            $(".form-group .checkbox input[type=checkbox]").styler();
        }

        var initFailPopup = function () {
            var elementClass = ".form-group.has-error.has-feedback.bg-warning";

            $(document).ajaxSuccess(function () {
                var errorContainer = $(elementClass);

                if (errorContainer.length != 0) {
                    var message = errorContainer.find(".list-group-item.list-group-item-warning");

                    if (message.length != 0)
                        popupHelper.alert(message.text());
                }

                errorContainer.remove();
            });
        };

        var initHelpFields = function () {
            var selector = "input.form-control.single-line, textarea.form-control";
            // this is the text which appears when clicking on the field
            $(selector).click(function () {
                // Show the help block for corresponding field excepting help-blocks for fields validation
                var $helpBlocks = $(this).siblings(".help-block:not(.field-validation-valid):not(.field-validation-error)");
                if ($helpBlocks.length > 0) {
                    if ($helpBlocks.text().length > 0) {
                        $helpBlocks.css({
                            opacity: 0,
                            //to make it "as in UX", simply change the below to display: table
                            display: 'inline-block'
                        }).animate({ opacity: 1 }, 300);
                    }
                }
            });

            $(selector).on("focusout", function () {
                //hiding help block for corresponding field excepting help-blocks for fields validation
                $(this).siblings(".help-block:not(.field-validation-valid):not(.field-validation-error)").fadeOut(200);
            });
        };

        var initSubscriptionToggle = function () {
            $(".aboutThisSubscriptionTitle").click(function () {
                $(".aboutThisSubscriptionBody").slideToggle();
                $(".aboutThisSubscriptionTitle").toggleClass("opened");
                return false;
            });
        }

        var initNewsletterPopup = function (popupModalId) {

            if ($.cookie('newletterPopupHasFired') || window.matchMedia('(max-width: 1023px)').matches) {
                return;
            }

            var popuptimeDefault = 3000;
            var popuptime = parseInt($(".popuptime > input.form-control").val());

            if (popuptime > 0) popuptimeDefault = popuptime;

            setTimeout(function () {
                $.fancybox($(popupModalId), { wrapCSS: 'wffm-fancybox', width: 720, autoSize: false, height: 'auto', padding: 0 });
            }, popuptimeDefault);

            $.cookie('newletterPopupHasFired', true, { expires: 365, path: '/' });
        }

        var initRequestData = function () {

            $(".page-url input[type='text']").each(function () {

                var url = document.referrer;
                var location = window.location.href;

                if (url.length == 0)
                    url = window.location.href;

                $(this).val(url);
            });;
        }

        var initPlaceholder = function () {

            $("input.form-control[type=text], select.form-control, textarea.form-control, input.form-control[type=email]").each(function () {

                var label = $(this).siblings("label.control-label");
                var labelText = label.text();

                $(this).attr({
                    "placeholder": labelText,
                    "aria-label": labelText.toLowerCase(),
                });

                label.remove();

            });

            $(".custom-control").each(function () {

                var labelText = $(this).closest(".row").find(".control-label").text();
                if (labelText.length > 0) {
                    $(this).attr("placeholder", labelText.replace("*", ""));
                }
            });
        }

        var initDateField = function () {
            var dateElement = $(".full-form .date-field input.single-line");

            if (dateElement.length > 0) {
                dateElement.each(function () {
                    $(this).attr('readonly', true);
                    $(this).prop('readonly', true);
                    $(this).attr("placeholder", $(this).siblings(".control-label").text());
                });

                var options = datepickerHelper.getOptionsWithCultureSettings(context.cultureCode);

                options.closeIcon = 'X';
                options.closeButton = false;
                options.customClass = "wffm-calendar";

                dateElement.fdatepicker(options);
            }
        }

        var initNumberField = function () {
            var numberElement = $(".full-form .number-field input.single-line");

            if (numberElement.length > 0) {
                numberElement.each(function () {
                    $(this).attr("type", "number");
                    $(this).attr("min", "0");
                });
            }
        }

        var initTimeField = function () {
            var timeControl = $(".full-form .time-field");

            if (timeControl.length > 0) {
                timeControl.each(function () {
                    var currentControl = $(this);
                    var secondaryTimeControl = currentControl.next(".secondary-time-field");

                    if (secondaryTimeControl.length > 0) {
                        secondaryTimeField = secondaryTimeControl.find(".form-control");

                        if (secondaryTimeField.length > 0) {
                            currentControl.append(secondaryTimeField);
                        }
                    }
                });
            }
        }

        var buildDropdonw = function ($element, values) {
            $.each(values, function () {
                $element.append("<option value=" + this + ">" + this + "</option>");
            });
        };

        var multiSelectionDropDown = function ($element) {
            if ($element.length > 0) {
                var options = {
                    placeholder_text: "Please Select"
                };
                $element.chosen(options);
            }
        }

        var initDynamicFields = function ($element) {

            $.each($element, function (i, item) {

                $(item).find("option").each(function (j, option) {
                    var value = $(option).attr("value").trim();
                    $(option).attr("value", value);
                });

                buildDynamicField($(item));
            });

            $element.change(function () {
                buildDynamicField($(this));
            });
        }

        var buildDynamicField = function ($el) {

            var value = $el.val();

            if (value != undefined && value != "") {

                if (utils.isJson(value)) {

                    var valObject = jQuery.parseJSON(value);

                    if ($el.parent().hasClass("hotel-source")) {

                        var id = valObject.EnquiryTypeFolderId;
                        var ajaxurl = "/api/sitecore/WFFMForms/GetEnquiryTypeList";

                        if (id != undefined && id != null) {

                            $.getJSON(ajaxurl, {
                                cache: false,
                                async: true,
                                format: "json",
                                id: id
                            }).done(function (data) {

                                var $enquiryTypeList = $(".target-email-source .form-control");

                                if ($enquiryTypeList != undefined) {

                                    $enquiryTypeList.empty();

                                    $.each(data, function (i, item) {
                                        
                                        var val = item.Value != "$placeholder" ? item.Value : "";

                                        $enquiryTypeList.append($("<option></option>")
                                            .attr("value", val).text(item.Key));
                                    });

                                    $enquiryTypeList.val("");
                                    $(".target-email .form-control").val("");
                                }


                            }).fail(function (jqxhr, textStatus, error) {
                                var err = textStatus + ", " + error;
                                console.log("Request Failed: " + err);
                            });

                        }

                    }

                    $.each(valObject, function (name, value) {
                        var hiddenField = $("." + name + " .form-control");

                        if (hiddenField.length > 0)
                            hiddenField.val(value);
                    });
                }
                else {

                    
                    var targetClassName = utils.hasClassContains($el.parent(), "-source");

                    if (targetClassName != undefined && targetClassName.length > 0) {
                        var simpleHiddenField = $("." + targetClassName.replace("-source", "") + " .form-control");

                        if (simpleHiddenField.length > 0) {

                            var currentVal = value.trim();

                            if (targetClassName != "target-email-source" || utils.isEmail(currentVal))
                                simpleHiddenField.val(currentVal);
                            else
                                simpleHiddenField.val("");
                        }
                    }
                }
            }
        }

        var initDynamicLabels = function ($element) {
            buildDynamicLabel($element);

            $element.change(function () {
                buildDynamicLabel();
            });
        }

        var buildDynamicLabel = function () {
            var controls = $(".dynamic-label label");

            if (controls.length > 0) {
                $.each(controls, function (i, item) {

                    var currentControl = $(item);
                    var label = currentControl.text();

                    if (label.indexOf("$") > -1)
                        currentControl.data("expression", label);

                    var re = new RegExp('[$][A-Za-z]+');
                    var defaultLabel = currentControl.data("expression");

                    if (defaultLabel != undefined) {
                        var token = defaultLabel.match(re);

                        if (token != null && token.length > 0) {
                            var targetControl = $(token[0].replace("$", "."));
                            var tokenVal = targetControl.find(".form-control").val();
                            var newVal = defaultLabel.replace(token[0], tokenVal);

                            var controlInner = currentControl.find("span");

                            if (controlInner.length > 0)
                                controlInner.text(newVal);
                            else
                                currentControl.text(newVal);

                            currentControl.css("visibility", "visible");
                        }
                    }
                });
            }
        }

        var initTrigTravelAgentFields = function () {

            var trigTravelAgentControl = $(".trig-travel-agent");
            var trigTravelAgentInput = trigTravelAgentControl.find("input[type='radio']");

            var trigShareAvoyaControl = $(".trig-share-avoya");
            var trigShareAvoyaInput = trigShareAvoyaControl.find("input[type='checkbox']");

            var shareAvoyaControl = $(".share-avoya");

            trigTravelAgentInput.change(function () {
                var currentItemVal = $(this).val();
                var showRelatedFields = currentItemVal == 0 ? true : false;

                if (showRelatedFields) {
                    trigShareAvoyaControl.show();
                    shareAvoyaControl.show();
                }
                else {
                    trigShareAvoyaControl.hide();
                    shareAvoyaControl.hide();
                }
            });

            trigShareAvoyaInput.change(function () {
                var currentItem = $(this);

                if (currentItem.is(":checked"))
                    shareAvoyaControl.hide();
                else
                    shareAvoyaControl.show();

            });
        }

        var initTooltipField = function ($element) {

            if (content != undefined) {

                $element.each(function () {
                    var currentElement = $(this);
                    var contentItem = currentElement.find(".help-block");

                    currentElement.tooltipster({
                        theme: 'tooltipster-forms'
                    })
                        .tooltipster('content', contentItem.text());
                });

            }

        }

        var initCountryDependentfField = function ($element) {
            var primaryCountries = ["GB", "US"];

            var geoLocationCountry = $("#AnalyticsCountry").val();
            var countryDropdown = $element.find("select");

            if (geoLocationCountry != null && geoLocationCountry != undefined && geoLocationCountry != "") {

                if ($.inArray(geoLocationCountry, primaryCountries) > -1) {

                    $.each(primaryCountries, function (i, item) {

                        var currentOption = countryDropdown.find("option[value='" + item + "']");

                        if (currentOption.length > 0)
                            currentOption.prependTo(countryDropdown);
                    });

                    countryDropdown.val(geoLocationCountry);
                }
            }
        }

        var initTrigHiddenAvoyaField = function () {
            var countryField = $(".form-group.country-field").find("select");

            processCoutryTriger(countryField);

            countryField.change(function () {
                processCoutryTriger($(this));
            });
        }

        var initLabelReplaceToSpan = function () {
            var labelsList = $(".radio, .checkbox").prev(".control-label");

            if (labelsList.length > 0) {
                labelsList.each(function () {
                    $(this).addClass("checkbox-label");

                    var newLabel = $('<span> ' + $(this).html() + '</span >').attr("class", $(this).attr("class"));

                    $(this).replaceWith(newLabel)
                });

            }
        }

        var processCoutryTriger = function ($dropdown) {
            var value = $dropdown.val();


            if (value != undefined && value != null) {

                var primaryCountries = ["CA", "US"];
                var $shareAvoya = $(".share-avoya.form-group").find("input[type='checkbox']");

                if ($.inArray(value, primaryCountries) > -1)
                    $shareAvoya.attr('checked', true).prop('checked', true);
                else
                    $shareAvoya.removeAttr('checked');
            }
        }

        var initAsDirectedTriger = function () {
            var link = $(".as-directed-triger-link");
            var section = $(".as-directed-triger-section .row");

            var triger = link.find("input[type=radio]");

            if (link.length > 0 && triger.length > 0) {

                triger.change(function () {

                    var expectedTriger = link.find("input[value='As Directed']");

                    state = expectedTriger.prop("checked");

                    if (state)
                        section.slideDown();
                    else
                        section.slideUp();

                    return false;
                });

            }
        }

        var prepopulateFormByUrl = function () {

            var forms = $(".full-form");
            var vals = getUrlVars();

            if (forms.length > 0 && vals.length > 0) {

                $.each(forms, function (i, form) {

                    $.each(vals, function (j, vari) {

                        var key = vari.key;
                        var val = vari.value;

                        var element = $(form).find("*[aria-label='" + key + "']");

                        if (element.length < 1) {

                            if (key == "activity") {
                                key = "treatment";
                                val = val.replace("+", " ");
                            }

                            if (vari.key == "adults" || vari.key == "children") {
                                key = "persons";

                                var list = $.grep(vals, function (elem) {
                                    return elem.key == "adults" || elem.key == "children";
                                });

                                val = list.reduce(function (a, b) { return a + parseInt(b.value) }, 0);
                            }

                            if (key.length)
                                element = $(form).find("*[aria-label='" + key + "']");
                        }

                        if (element.length > 0)
                            element.val(val);

                    });

                });

            }
        }

        var getUrlVars = function () {
            var vars = [], hash;
            var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

            for (var i = 0; i < hashes.length; i++) {
                hash = hashes[i].split('=');
                vars[i] = { key: hash[0], value: hash[1] };
            }

            return vars;
        }

        function isJson(str) {
            try {
                JSON.parse(str);
            } catch (e) {
                return false;
            }
            return true;
        }

        return {
            init: init
        };
    });;
define('Models/activity', ['knockout', 'validationHelper'],
    function (ko, validationHelper) {
        return function() {
            var self = this;
            self.activity = ko.observable().extend({ required: true });
            self.date = ko.observable().extend({ required: true });
            self.time = ko.observable().extend({ required: true });
            self.numberOfAdults = ko.observable(1);
            self.numberOfChildren = ko.observable(0);
            
            self.isValid = function () {
                return validationHelper.validate(self, { deep: true });
            };
        };
});;
define('Models/base64Attachment', ['knockout'],
    function (ko) {
        return function () {
            var self = this;
            self.FileName = ko.observable();
            self.Content = ko.observable();            
        };
    });;
define('Models/bookingAction', ['knockout', 'validationHelper', 'Models/room'],
    function (ko, validationHelper, roomModel) {
        return function (requireWhereId) {
            var self = this;
            self.requireWhereId = requireWhereId;
            
            self.whereRequired = function () {
                if (!self.requireWhereId())
                    return false;

                return (_.isUndefined(self.HotelId()) && _.isUndefined(self.RegionId()));
            };
            
            self.RegionId = ko.observable().extend({ required: { onlyIf: self.whereRequired } });
            self.HotelId = ko.observable().extend({ required: { onlyIf: self.whereRequired } });
            
            self.selectedWhereItem = ko.computed({
                read: function () {
                    if (!_.isUndefined(self.HotelId())) {
                        return self.HotelId();
                    } else if (!_.isUndefined(self.RegionId())) {
                        return self.RegionId();
                    } else return null;
                },
                write: function (value) {
                    if (_.contains(hotels(), value)) {
                        self.HotelId(value.Id);
                        self.RegionId(null);
                    } else if (_.contains(regions(), value)) {
                        self.RegionId(value.Id);
                        self.HotelId(null);
                    }
                },
                owner: this
            }).extend({ required: { onlyIf: self.whereRequired } });

            self.NumberOfNights = ko.observable(1).extend({ required: true });
            self.NumberOfRooms = ko.observable(1);
            self.Rooms = ko.observableArray([]);
            self.ArrivingDate = ko.observable().extend({ required: true });
            self.PromoCode = ko.observable();
            self.numberOfGuests = ko.computed(function () {
                return _.reduce(self.Rooms(), function(memo, num) {
                    return memo + num.NumberOfGuests();
                }, 0);
            });                        

            self.addRoom = function (numberOfAdults, numberOfChildren) {                
                var room = roomModel.createNew(self.Rooms().length + 1);
                room.NumberOfAdults(numberOfAdults);
                room.NumberOfChildren(numberOfChildren);
                self.Rooms.push(room);                
            };            

            self.removeRoom = function () {
                self.Rooms.pop();
            };            

            self.isValid = function() {
                return validationHelper.validate(self, { deep: true });
            };           
        };        
    });;
define('Models/eventEnquiry', ['knockout', 'Models/personalInfo', 'Models/reservationInfo', 'validationHelper'],
    function (ko, PersonalInfo, ReservationInfo, validationHelper) {
        return function () {
            var self = this;
            self.PersonalInfo = new PersonalInfo();
            self.IsAccomodationRequired = ko.observable(false);
            self.ReservationInfo = new ReservationInfo(self.IsAccomodationRequired);

            self.Occasions = ko.observableArray([]).extend({ required: true });
            self.Date = ko.observable().extend({ required: true });
            self.ExtraOption = ko.observable().extend({ xssSafe: true });
            self.NumberOfAdults = ko.observable().extend({ xssSafe: true });
            self.NumberOfChildren = ko.observable().extend({ xssSafe: true });
            self.SpecialRequirements = ko.observable().extend({ xssSafe: true });
            self.SubscribeToNewsLetter = ko.observable(false);

            self.isValidated = ko.observable(false);
            self.isValid = function () {
                self.isValidated(true);
                return validationHelper.validate(self, { deep: true });
            };            
        };
    });;
define('Models/filterCategory', ['knockout'],
    function (ko) {
        var filterGroup = function () {
            var self = this;
            self.id = '';
            self.name = '';
            self.value = ko.observable('');
            self.visible = ko.observable(false);
            self.dataFilter = ko.computed(function () {
                if (self.value().length == 0)
                    return '';

                return '.' + self.value();
            });
        };

        return filterGroup;
    });;
define('Models/filterGroup', ['knockout'],
    function (ko) {
        var filterGroup = function () {
            var self = this;
            self.id = '';
            self.name = '';
            self.filterCategories = ko.observableArray([]);
            self.visibleFilterCategories = function() {
                return $.grep(self.filterCategories(), function(category) {
                    return category.visible();
                });
            };
        };

        return filterGroup;
    });;
define('Models/filterInfo', ['knockout'],
    function (ko) {
        var filterInfo = function () {
            var self = this;
            self.filterType = ko.observable();
            self.filterGroups = ko.observableArray([]);
        };
               
        return filterInfo;
    });;
define('Models/generalEnquiry', ['knockout', 'Models/personalInfo', 'validationHelper'],
    function (ko, PersonalInfo, validationHelper) {
        return function () {
            var self = this;
            self.PersonalInfo = new PersonalInfo();            
            self.Message = ko.observable().extend({ xssSafe: true });
            self.EnquiryType = ko.observable().extend({ xssSafe: true });
            self.SubscribeToNewsLetter = ko.observable(false);
            
            self.isValidated = ko.observable(false);
            self.isValid = function () {
                self.isValidated(true);
                return validationHelper.validate(self, { deep: true });
            };
        };
    });;
define('Models/jobApplication', ['knockout', 'Models/personalInfo', 'Models/base64Attachment', 'validationHelper'],
    function (ko, PersonalInfo, Base64Attachment, validationHelper) {
        return function () {
            var self = this;
            self.JobId = ko.observable();            
            self.PersonalInfo = new PersonalInfo();
            self.SourceReference = ko.observable().extend({ xssSafe: true });
            self.Nationality = ko.observable().extend({ required: true, xssSafe: true });
            self.JobTypes = ko.observableArray([]);
            self.HasRightToWorkInTheCountry = ko.observable('');
            self.WorkPermitDetails = ko.observable().extend({ xssSafe: true });
            self.Notes = ko.observable().extend({ xssSafe: true });
            self.CurrentSalary = ko.observable().extend({ xssSafe: true });
            self.ExpectedSalary = ko.observable().extend({ xssSafe: true });
            self.CV = new Base64Attachment();

            self.IsManagementJob = ko.observable();
            
            self.WorkedForRch = ko.observable('');
            self.CustomerServiceExample = ko.observable().extend({ xssSafe: true });
            self.YourselfInTenYears = ko.observable().extend({ xssSafe: true });
            self.ReachYourGoal = ko.observable().extend({ xssSafe: true });
            self.CareerExpectations = ko.observable().extend({ xssSafe: true });
            self.StandOutFromApplicants = ko.observable().extend({ xssSafe: true });
            self.ApplicationInThreeWords = ko.observable().extend({ xssSafe: true });

            self.isValidated = ko.observable(false);
            self.isValid = function () {
                self.isValidated(true);
                return validationHelper.validate(self, { deep: true });
            };
        };
    });;
define('Models/meetingRoomEnquiry', ['knockout', 'Models/personalInfo', 'jquery', 'validationHelper'],
    function (ko, PersonalInfo, $, validationHelper) {
        return function () {
            var self = this;

            self.PersonalInfo = new PersonalInfo();
            self.SpecialRequirements = ko.observable().extend({ xssSafe: true });
            self.EventDate = ko.observable().extend({ xssSafe: true });
            self.StartHour = ko.observable().extend({ xssSafe: true });
            self.StartMinute = ko.observable().extend({ xssSafe: true });
            self.EndHour = ko.observable().extend({ xssSafe: true, notLess: self.StartHour });
            self.EndMinute = ko.observable().extend({ xssSafe: true, Greater: { StartHour: self.StartHour, StartMinute: self.StartMinute, EndHour: self.EndHour } });
            self.HotelName = ko.observable().extend({ xssSafe: true });
            self.Room = ko.observable().extend({ xssSafe: true });
            self.FunctionSetup = ko.observable().extend({ xssSafe: true });
            self.NumberOfAttendees = ko.observable().extend({ xssSafe: true, min: 1 });

            self.StartHour.extend({
                required: {
                    onlyIf: function () {
                        return self.StartMinute();
                    }
                }
            });
            self.StartMinute.extend({
                required: {
                    onlyIf: function () {
                        return self.StartHour();
                    }
                }
            });
            self.EndHour.extend({
                required: {
                    onlyIf: function () {
                        return self.EndMinute();
                    }
                }
            });
            self.EndMinute.extend({
                required: {
                    onlyIf: function () {
                        return self.EndHour();
                    }
                }
            });

            self.isValidated = ko.observable(false);
            self.isValid = function () {
                self.isValidated(true);
                return validationHelper.validate(self, { deep: true });
            };
        };
    });;
define('Models/personalInfo', ['knockout', 'validationHelper'],
    function (ko, validationHelper) {
        return function () {
            var self = this;
            self.Title = ko.observable().extend({ required: true, xssSafe: true });
            self.FirstName = ko.observable().extend({ required: true, xssSafe: true });
            self.LastName = ko.observable().extend({ required: true, xssSafe: true });
            self.EmailAddress = ko.observable().extend({ required: true, email: true });
            self.PhoneNumber = ko.observable().extend({ required: true, xssSafe: true });
            self.AddressLine1 = ko.observable().extend({ xssSafe: true });
            self.AddressLine2 = ko.observable().extend({ xssSafe: true });
            self.City = ko.observable().extend({ xssSafe: true });
            self.Country = ko.observable().extend({ xssSafe: true });
            self.Postcode = ko.observable().extend({ xssSafe: true });
            
            self.isValid = function () {
                return validationHelper.validate(self, { deep: true });
            };
        };        
    });;
define('Models/reservationInfo', ['knockout'],
    function (ko) {
        return function (isRequired) {
            var self = this;
            self.NumberOfRooms = ko.observable(1).extend({ required: isRequired, xssSafe: true });
            self.NumberOfAdults = ko.observable().extend({ xssSafe: true });
            self.NumberOfChildren = ko.observable().extend({ xssSafe: true });
            self.RoomType = ko.observable().extend({ xssSafe: true });
            self.ArrivingDate = ko.observable().extend({ required: isRequired, xssSafe: true });
            self.NumberOfNights = ko.observable(1).extend({ required: isRequired, xssSafe: true });

            self.isRequired = isRequired;
        };
    });;
define('Models/room', ['knockout'],
    function (ko) {
        var room = function() {
            var self = this;
            self.RoomNumber = ko.observable(1);
            self.NumberOfAdults = ko.observable(1);
            self.NumberOfChildren = ko.observable(0);
            self.NumberOfGuests = ko.computed(function () {
                return self.NumberOfAdults() + self.NumberOfChildren();
            });
        };
        
        room.createNew = function (roomNumber) {
            roomNumber = roomNumber || 1;            

            var newRoom = new room();
            newRoom.RoomNumber(roomNumber);
            
            return newRoom;
        };

        return room;
    });;
define('Models/subscriptionModel', ['knockout', 'validationHelper'],
    function (ko, validationHelper) {
        return function() {
            var self = this;
            self.EmailAddress = ko.observable("").extend({ required: true, email: true });
            self.FirstName = ko.observable("").extend({ required: true, xssSafe: true });
            self.LastName = ko.observable("").extend({ required: true, xssSafe: true });
            
            self.isValid = function () {
                return validationHelper.validate(self, { deep: true });
            };
        };
    });
;
define('ViewModels/actionBarUi', ['knockout', 'ViewModels/roomBookingActionUi', 'ViewModels/activityBookingActionUi', 'ViewModels/meetingRoomBookingActionUi'],
    function (ko, roomBookingActionViewModel, activityBookingActionViewModel, meetingRoomBookingActionViewModel) {
        var selectedAction = ko.observable(),
            isRoomBookingActionSelected = ko.computed(function() {
                return selectedAction() === 'book-a-room';
            }),
            isActivityBookingActionSelected = ko.computed(function() {
                return selectedAction() === 'book-an-activity';
            }),
            isMeetingBookingActionSelected = ko.computed(function() {
                return selectedAction() === 'book-a-meeting';
            }),
            isContactActionSelected = ko.computed(function() {
                return selectedAction() === 'make-contact';
            }),

            selectedActionChanged = function() {
                if (selectedAction() === 'modify-cancel-booking') {
                    roomBookingActionViewModel.modifyBooking();
                } else if (selectedAction() === 'request-a-quote') {
                    roomBookingActionViewModel.requestQuote();
                } else if (selectedAction() === 'book-a-meeting-in-hotel') {
                    roomBookingActionViewModel.bookAMeetingHotel();
                }
            },

            init = function() {
                selectedAction.subscribeChanged(selectedActionChanged);
            }; 

        return {
            selectedAction: selectedAction,
            isRoomBookingActionSelected: isRoomBookingActionSelected,
            isActivityBookingActionSelected: isActivityBookingActionSelected,
            isMeetingBookingActionSelected: isMeetingBookingActionSelected,
            isContactActionSelected: isContactActionSelected,
            roomBookingActionViewModel: roomBookingActionViewModel,
            activityBookingActionViewModel: activityBookingActionViewModel,            
            meetingRoomBookingActionViewModel: meetingRoomBookingActionViewModel,
            init : init
        };
    });;
define('ViewModels/activityBookingActionUi', ['knockout', 'utils', 'queryStringHelper', 'Models/activity', 'knockout-mapping'],
    function (ko, utils, queryStringHelper, activityModel, mapper) {
        var activity = new activityModel();
        var activitiesList = ko.observableArray([]),
            timesList = ko.observableArray([]),
            formUrl = ko.observable(),
            numberOfPersons = ko.computed(function () {
                return parseInt(activity.numberOfAdults(), 10) + parseInt(activity.numberOfChildren(), 10);
            }
            , this);

        var search = function () {
            if (activity.isValid()) {
                var url = formUrl();
                var date = utils.date.toFormattedString(activity.date());

                var searchObj = {
                    activity: activity.activity(),
                    date: date,
                    time: activity.time(),
                    adults: activity.numberOfAdults(),
                    children: activity.numberOfChildren()
                }

                $.cookie('activityBooking', mapper.toJSON(searchObj), { expires: 365, path: '/' });

                url = queryStringHelper.setValue('activity', activity.activity(), url);
                url = queryStringHelper.setValue('date', date, url);
                url = queryStringHelper.setValue('time', activity.time(), url);
                url = queryStringHelper.setValue('adults', activity.numberOfAdults(), url);
                url = queryStringHelper.setValue('children', activity.numberOfChildren(), url);
                
                window.location.replace(url);
                //utils.redirect(url);
            }
        };

        return {
            activity: activity,
            activitiesList: activitiesList,
            timesList: timesList,
            numberOfAdults: activity.numberOfAdults,
            numberOfChildren: activity.numberOfChildren,
            numberOfPersons: numberOfPersons,
            formUrl: formUrl,

            search: search
        };
    });;
define('ViewModels/cookieBarUi', ['knockout', 'jquery'],
    function (ko, $) {                
        var cookieName = ko.observable('consentCookie');
        var shouldHide = ko.observable(false);
        var cookieSet = ko.computed(function () {
            return cookieName().length > 0 && $.cookie(cookieName()) === 'yes';
        });
        var notificationExists = ko.computed(function () {
            return $(".cookie-notification-wrapper").length > 0;
        });
        var isVisible = ko.computed(function () {

            var page = $("html");
            var wpareModeClass = "with-policy-notification";
            var isVisible = notificationExists() && !shouldHide() && !cookieSet();

            if (isVisible)
                page.addClass(wpareModeClass);
            else
                page.removeClass(wpareModeClass);

            return isVisible;
        });        

        var createCookie = function () {
            $.cookie(cookieName(), 'yes', { expires: 365 });
            shouldHide(true);
        };

        return {
            isVisible: isVisible,
            createCookie: createCookie,
            cookieName: cookieName
        };
    });;
define('ViewModels/eventEnquiryFormUi', ['knockout', 'Models/eventEnquiry', 'utils', 'dataService', 'popupHelper', 'context'],
    function (ko, EventEnquiry, utils, dataService, popupHelper, context) {        
        var enquiry = new EventEnquiry();
        var settingId = ko.observable();
        var redirectUrl = ko.observable();

        var titles = ko.observableArray([]),
            countries = ko.observableArray([]),
            occasions = ko.observableArray([]),
            roomTypes = ko.observableArray([]),
            extraOptions = ko.observableArray([]),
            personSelectionRequired = ko.observable(false),
            selectedOccasionForDropDown = ko.observable().extend({ required: true }),
            isAccomodationRequiredForRadio = ko.computed({
                read: function() {
                    return this.IsAccomodationRequired().toString();
                },
                write: function(newValue) {
                    this.IsAccomodationRequired(newValue.toBool());
                },
                owner: enquiry
            }),
            newsletterSubscriptionDefaultValue = ko.observable(false),
            hasExtraOptions = ko.computed(function() {
                return extraOptions().length > 0;
            });

        selectedOccasionForDropDown.subscribe(function (newValue) {
            enquiry.Occasions([newValue]);
        });
        
        newsletterSubscriptionDefaultValue.subscribe(function (newValue) {
            enquiry.SubscribeToNewsLetter(newValue);
        });

        var occasionCheckListChanged = function(item, elem) {
            var $checkBox = $(elem.srcElement);
            var isChecked = $checkBox.is(':checked');
            var isAlreadySelected = enquiry.Occasions().indexOf(item) >= 0;

            if (isChecked && !isAlreadySelected) {
                enquiry.Occasions().push(item);
            }                
            else if (!isChecked && isAlreadySelected) {
                enquiry.Occasions().remove(item);
            }
            //Return to allow the Checkbox to process checked/unchecked
            return true;
        };        

        var submit = function () {
            if (enquiry.isValid()) {
                var loadingPanel = popupHelper.loadingPanel(context.messages.pleaseWait);
                dataService.submitEventEnquiryForm(enquiry, settingId).done(function () {
                    if (enquiry.SubscribeToNewsLetter() === true) {
                        dataService.signupToNewsletter(enquiry.PersonalInfo).done(function() {
                            if (redirectUrl()) {
                                window.location.href = redirectUrl();
                            } else {
                                popupHelper.alert(context.messages.formSubmissionSuccess);
                            }
                        }).fail(function() {
                            popupHelper.alert(context.messages.formSubmissionSuccessButNewsletterFail);
                        }).always(function() {
                            popupHelper.hide(loadingPanel);
                        });
                    } else {
                        popupHelper.hide(loadingPanel);
                        popupHelper.alert(context.messages.formSubmissionSuccess);
                    }
                }).fail(function () {
                    popupHelper.hide(loadingPanel);
                    popupHelper.alert(context.messages.formSubmissionFail);
                });                                
            }
        };

        var init = function() {
            enquiry.ExtraOption.extend({ required: hasExtraOptions });
            enquiry.NumberOfAdults.extend({ required: personSelectionRequired });
        };

        init();

        return {
            formData: enquiry,
            settingId: settingId,
            redirectUrl: redirectUrl,
            titles: titles,
            countries: countries,
            occasions: occasions,
            extraOptions: extraOptions,
            roomTypes: roomTypes,
            
            isAccomodationRequiredForRadio: isAccomodationRequiredForRadio,
            selectedOccasionForDropDown: selectedOccasionForDropDown,
            personSelectionRequired: personSelectionRequired,
            newsletterSubscriptionDefaultValue: newsletterSubscriptionDefaultValue,
            
            occasionCheckListChanged: occasionCheckListChanged,            
            submit: submit
        };
    });;
define('ViewModels/filteredArticleUi', ['jquery', 'knockout', 'dataService'],
    function ($, ko, dataService) {
        
        var loadArticles = function (settings) {
            return $.Deferred(function (def) {
                
                dataService.loadArticles(settings.dataSourceId, settings.skipArticleCount, settings.pageSize).done(function (response) {
                    def.resolve(response);
                    
                }).fail(function() {
                    def.reject();
                });
            }).promise();
        };
        
        return {
            loadArticles: loadArticles
        };
    });;
define('ViewModels/generalEnquiryFormUi', ['knockout', 'Models/generalEnquiry', 'dataService', 'popupHelper', 'context', 'validationHelper'],
    function (ko, GeneralEnquiry, dataService, popupHelper, context, validationHelper) {
        var enquiry = new GeneralEnquiry();
        var settingId = ko.observable();
        var redirectUrl = ko.observable();

        var titles = ko.observableArray([]),
            countries = ko.observableArray([]),
            enquiryTypes = ko.observableArray([]),
            showPhoneNumber = ko.observable(false),
            newsletterSubscriptionDefaultValue = ko.observable(false),            
            hasEnquiryTypes = ko.computed(function () {
                return enquiryTypes().length > 0;
            });
        
        newsletterSubscriptionDefaultValue.subscribe(function (newValue) {
            enquiry.SubscribeToNewsLetter(newValue);
        });

        var submit = function () {
            if (enquiry.isValid()) {
                var loadingPanel = popupHelper.loadingPanel(context.messages.pleaseWait);
                dataService.submitGeneralEnquiryForm(enquiry, settingId).done(function () {                    
                    if (enquiry.SubscribeToNewsLetter() === true) {
                        dataService.signupToNewsletter(enquiry.PersonalInfo).done(function () {
                            if (redirectUrl()) {
                                window.location.href = redirectUrl();
                            } else {
                                popupHelper.alert(context.messages.formSubmissionSuccess);
                            }
                        }).fail(function () {
                            popupHelper.alert(context.messages.formSubmissionSuccessButNewsletterFail);
                        }).always(function () {
                            popupHelper.hide(loadingPanel);
                        });
                    } else {
                        popupHelper.hide(loadingPanel);
                        popupHelper.alert(context.messages.formSubmissionSuccess);
                    }
                }).fail(function () {
                    popupHelper.hide(loadingPanel);
                    popupHelper.alert(context.messages.formSubmissionFail);
                });
            }
        };
        
        var init = function () {
            if (enquiry.PersonalInfo.PhoneNumber.length > 0) {
                validationHelper.reconfigure(enquiry.PersonalInfo.PhoneNumber, { required: showPhoneNumber });
                enquiry.EnquiryType.extend({ required: hasEnquiryTypes });
            }
        };

        init();

        return {
            formData: enquiry,
            settingId: settingId,
            redirectUrl: redirectUrl,
            titles: titles,
            countries: countries,
            enquiryTypes: enquiryTypes,
            showPhoneNumber: showPhoneNumber,
            newsletterSubscriptionDefaultValue: newsletterSubscriptionDefaultValue,
            
            submit: submit
        };
    });;
define('ViewModels/jobApplicationFormUi', ['knockout', 'utils', 'Models/jobApplication', 'dataService', 'popupHelper', 'context'],
    function (ko, utils, JobApplication, dataService, popupHelper, context) {
        var jobApplication = new JobApplication();
        var settingId = ko.observable();
        var redirectUrl = ko.observable();
        var cvFile = ko.observable();
        var attachmentMaxSizeMB = ko.observable();
        var attachmentSizeWarningMessage = ko.observable();

        var titles = ko.observableArray([]),
            countries = ko.observableArray([]),
            informationSources = ko.observableArray([]);

        var workedForRchForRadio = ko.computed({
            read: function () {
                return this.WorkedForRch().toString();
            },
            write: function (newValue) {
                this.WorkedForRch(newValue.toBool());
            },
            owner: jobApplication
        });
        
        var hasRightToWorkInTheCountryForRadio = ko.computed({
            read: function () {
                return this.HasRightToWorkInTheCountry().toString();
            },
            write: function (newValue) {
                this.HasRightToWorkInTheCountry(newValue.toBool());
            },
            owner: jobApplication
        });
        
        var jobTypeCheckListChanged = function (item, elem) {
            var $checkBox = $(elem.srcElement);
            var isChecked = $checkBox.is(':checked');
            var isAlreadySelected = jobApplication.JobTypes().indexOf(item) >= 0;

            if (isChecked && !isAlreadySelected) {
                jobApplication.JobTypes().push(item);
            }
            else if (!isChecked && isAlreadySelected) {
                jobApplication.JobTypes().remove(item);
            }
            //Return to allow the Checkbox to process checked/unchecked
            return true;
        };

        var submitForm = function (loadingPanel) {
            dataService.submitJobApplicationForm(jobApplication, settingId).done(function () {
                if (redirectUrl()) {
                    window.location.replace(redirectUrl());
                }
                else {
                    popupHelper.alert(context.messages.formSubmissionSuccess);
                }
            }).fail(function () {
                popupHelper.alert(context.messages.formSubmissionFail);
            }).always(function () {
                popupHelper.hide(loadingPanel);
            });
        };       

        var submit = function () {
            if (jobApplication.isValid()) {
                var loadingPanel = popupHelper.loadingPanel(context.messages.pleaseWait);

                var reader = new FileReader();
                reader.onload = function(readerEvt) {
                    var base64String = readerEvt.target.result;
                    if (base64String.length > attachmentMaxSizeMB() * 1048576) {
                        popupHelper.hide(loadingPanel);
                        popupHelper.alert(attachmentSizeWarningMessage());
                    }
                    else {
                        jobApplication.CV.Content(base64String);
                        jobApplication.CV.FileName(cvFile().name);

                        submitForm(loadingPanel);
                    }
                };

                if (cvFile()) {
                    reader.readAsDataURL(cvFile());
                } else {
                    submitForm(loadingPanel);
                }
            }
        };

        return {
            formData: jobApplication,
            cvFile: cvFile,
            settingId: settingId,
            redirectUrl: redirectUrl,
            titles: titles,
            countries: countries,
            informationSources: informationSources,
            hasRightToWorkInTheCountryForRadio: hasRightToWorkInTheCountryForRadio,
            attachmentMaxSizeMB: attachmentMaxSizeMB,
            attachmentSizeWarningMessage: attachmentSizeWarningMessage,

            submit: submit,
            jobTypeCheckListChanged: jobTypeCheckListChanged,
            workedForRchForRadio: workedForRchForRadio
        };
    });;
define('ViewModels/languageSelectorUi', ['knockout', 'queryStringHelper'],
    function (ko, queryStringHelper) {        
        var languages = ko.observableArray([]);
        var selectedLanguage = ko.computed(function () {
            var currentLanguageCode = queryStringHelper.getValue('sc_lang');

            var matchingItem = ko.utils.arrayFirst(languages(), function (item) {
                return item.Code === currentLanguageCode;
            });
            
            return matchingItem || { Code: '', DisplaName: '' };
        });

        var getLanguageUrl = function(languageCode) {
            return queryStringHelper.setValue('sc_lang', languageCode);
        };

        return {
            languages: languages,
            selectedLanguage: selectedLanguage,
            getLanguageUrl: getLanguageUrl
        };
    });;
define('ViewModels/meetingRoomBookingActionUi', ['knockout', 'validationHelper', 'utils', 'queryStringHelper'],
    function (ko, validationHelper, utils, queryStringHelper) {
        var hotels = ko.observableArray([]),
            regions = ko.observableArray([]),
            formUrl = ko.observable(),
            selectedHotel = ko.observable(),
            selectedRegion = ko.observable(),
            numberOfDelegates = ko.observable().extend({ required: true, min: 1 });                       
        
        var subscribeToHotelChange = function () {
            return selectedHotel.subscribe(function (newValue) {
                if (newValue && newValue.length > 0) {
                    regionSubscription.dispose();
                    selectedRegion('');
                    regionSubscription = subscribeToRegionChange();                    
                }
            });
        };

        var subscribeToRegionChange = function () {
            return selectedRegion.subscribe(function (newValue) {
                if (newValue && newValue.length > 0) {
                    hotelSubscription.dispose();
                    selectedHotel('');
                    hotelSubscription = subscribeToHotelChange();                    
                }
            });
        };

        var hotelSubscription = subscribeToHotelChange();
        var regionSubscription = subscribeToRegionChange();
        
        selectedHotel.extend({
            required: {
                onlyIf: function () {
                    return selectedRegion() === undefined;
                }
            }
        });

        selectedRegion.extend({
            required: {
                onlyIf: function () {
                    return selectedHotel() === undefined;
                }
            }
        });
        
        var isValidated = ko.observable(false);
        var isValid = function (viewData) {
            isValidated(true);
            return validationHelper.validate(viewData, { deep: true });
        };

        var search = function () {            
            if (isValid(this)) {
                var url = formUrl();

                url = queryStringHelper.setValue('hotel', selectedHotel(), url);
                url = queryStringHelper.setValue('location', selectedRegion(), url);
                url = queryStringHelper.setValue('delegates', numberOfDelegates(), url);

                utils.redirect(url);
            }
        };

        return {            
            hotels: hotels,
            regions: regions,
            selectedHotel: selectedHotel,
            selectedRegion: selectedRegion,
            numberOfDelegates: numberOfDelegates,
            formUrl: formUrl,

            search: search            
        };
    });;
define('ViewModels/meetingRoomFormUi', ['jquery', 'knockout', 'Models/meetingRoomEnquiry', 'dataService', 'popupHelper', 'context', 'utils', 'validationHelper'],
    function ($, ko, MeetingRoomEnquiry, dataService, popupHelper, context, utils, validationHelper) {
        var enquiry = new MeetingRoomEnquiry();
        var settingId = ko.observable();
        var redirectUrl = ko.observable();
        var isHotelSelectionVisible = ko.observable(false);

        var titles = ko.observableArray([]),
            countries = ko.observableArray([]),            
            availableHotels = ko.observableArray([]),            
            hours = utils.padList(utils.inclusiveRange(0, 23), 2, '0'),
            minutes = utils.padList(utils.inclusiveRange(0, 45, 15), 2, '0');

        var selectedHotel = ko.observable();
        selectedHotel.subscribe(function (newValue) {
            if (newValue) {
                enquiry.HotelName(newValue.Name);
            } else {
                enquiry.HotelName(null);
            }            
        });
        var selectedRoom = ko.observable();
        selectedRoom.subscribe(function (newValue) {
            if (newValue) {
                enquiry.Room(newValue.Name);
            } else {
                enquiry.Room(null);
            }            
        });

        var rooms = ko.computed(function () {
            if (selectedHotel()) {
                return selectedHotel().MeetingRooms;
            }
            return [];
        });
        var functionSetups = ko.computed(function () {
            if (selectedRoom()) {
                return selectedRoom().AvailableFunctionSetups;
            }
            return [];
        });

        var setSelectedRoom = function(roomName) {
            if (selectedHotel()) {
                var matchingRooms = $(selectedHotel().MeetingRooms).filter(function(index) {
                    return selectedHotel().MeetingRooms[index].Name === roomName;
                });

                if (matchingRooms.length > 0) {
                    selectedRoom(matchingRooms[0]);
                }
            }
        };

        var submit = function () {
            var isViewModelValid = validationHelper.validate(this);
            if (enquiry.isValid() && isViewModelValid) {
                var loadingPanel = popupHelper.loadingPanel(context.messages.pleaseWait);
                dataService.submitMeetingRoomEnquiryForm(enquiry, settingId).done(function () {
                    if (redirectUrl()) {
                        window.location.href = redirectUrl();
                    } else {
                        popupHelper.alert(context.messages.formSubmissionSuccess);
                    }
                }).fail(function () {                    
                    popupHelper.alert(context.messages.formSubmissionFail);
                }).always(function() {
                    popupHelper.hide(loadingPanel);
                });
            }
        };

        return {
            formData: enquiry,
            settingId: settingId,
            redirectUrl: redirectUrl,
            titles: titles,
            countries: countries,
            rooms: rooms,
            availableHotels: availableHotels,
            functionSetups: functionSetups,
            hours: hours,
            minutes: minutes,
            
            isHotelSelectionVisible: isHotelSelectionVisible,
            selectedHotel: selectedHotel,
            selectedRoom: selectedRoom,
            setSelectedRoom: setSelectedRoom,
                        
            submit: submit
        };
    });;
define('ViewModels/meetingRoomTableUi', ['knockout',
        /* Dependencies without component accessible through variable */ 'validationRules'],
    function (ko) {
        var hotelFilter = ko.observable();
        var locationFilter = ko.observable();
        var bedroomFilter = ko.observable().extend({min: 1});
        var setupFilter = ko.observable();
        var capacityFilter = ko.observable().extend({ min: 1 });

        var hotels = ko.observableArray([]);        

        var subscribeToHotelChange = function() {
            return hotelFilter.subscribe(function (newValue) {
                if (newValue && newValue.length > 0) {
                    locationSubscription.dispose();
                    locationFilter('');
                    locationSubscription = subscribeToLocationChange();
                }
            });
        };
        
        var subscribeToLocationChange = function () {
            return locationFilter.subscribe(function (newValue) {
                if (newValue && newValue.length > 0) {
                    hotelSubscription.dispose();
                    hotelFilter('');
                    hotelSubscription = subscribeToHotelChange();
                }
            });
        };

        var hotelSubscription = subscribeToHotelChange();
        var locationSubscription = subscribeToLocationChange();        

        var shouldShowHotel = function (hotel) {
            if (hotelFilter() && hotelFilter().length > 0 && hotel.Name != hotelFilter()) {
                return false;
            }
            
            if (locationFilter() && locationFilter().length > 0 && hotel.Region != locationFilter()) {
                return false;
            }
            
            if (setupFilter() && setupFilter().length > 0 && hotel.AllAvailableRoomFunctionSetups.indexOf(setupFilter()) < 0) {
                return false;
            }
            
            if (bedroomFilter() && bedroomFilter().length > 0 && hotel.NumberOfBedrooms < bedroomFilter()) {
                return false;
            }
            
            if (capacityFilter() && capacityFilter().length > 0) {
                var matchingRooms = $(hotel.MeetingRooms).filter(function(index) {
                    return hotel.MeetingRooms[index].MaxCapacity >= capacityFilter();
                });

                return matchingRooms.length > 0;
            }

            return true;
        };
        
        var shouldShowRoom = function (room) {
            if (setupFilter() && setupFilter().length > 0 && room.AvailableFunctionSetups.indexOf(setupFilter()) < 0) {
                return false;
            }
            
            if (capacityFilter() && capacityFilter().length > 0 && room.MaxCapacity < capacityFilter()) {
                return false;
            }
            
            return true;
        };

        var shouldShowNoResultMessage = function() {
            var hasVisibleHotel = false;
            $(hotels()).each(function (index, data) {
                if (shouldShowHotel(data)) {
                    hasVisibleHotel = true;
                    return false;
                }
            });

            return !hasVisibleHotel;
        };

        var getDisplayValue = function(number) {
            if (number < 1) {
                return '-';
            }

            return number;
        };

        return {
            hotelFilter: hotelFilter,
            locationFilter: locationFilter,
            bedroomFilter: bedroomFilter,
            setupFilter: setupFilter,
            capacityFilter: capacityFilter,
                        
            hotels: hotels,
            
            shouldShowHotel: shouldShowHotel,
            shouldShowRoom: shouldShowRoom,
            shouldShowNoResultMessage: shouldShowNoResultMessage,
            getDisplayValue: getDisplayValue
        };
    });;
define('ViewModels/newsletterUi', ['jquery', 'knockout', 'Models/subscriptionModel', 'dataService', 'popupHelper', 'context'],
    function ($, ko, Subscriber, dataService, popupHelper, context) {
        var subscriber = new Subscriber();
        var redirectUrl = ko.observable();

        var subscribe = function() {
            if (subscriber.isValid()) {
                var loadingPanel = popupHelper.loadingPanel(context.messages.pleaseWait);
                dataService.signupToNewsletter(subscriber).done(function() {
                    if (redirectUrl()) {
                        window.location.href = redirectUrl();
                    } else {
                        popupHelper.alert(context.messages.newsletterSubscriptionSuccess, function () {
                            ['FirstName', 'LastName', 'EmailAddress'].forEach(function (field) {
                              subscriber[field]('');
                              subscriber[field].clearError();
                            });
                            $.fancybox.close();
                        });
                    }
                }).fail(function() {
                    popupHelper.alert(context.messages.newsletterSubscriptionFail);
                }).always(function () {
                    popupHelper.hide(loadingPanel);
                });
            }
        };

        var popupModal = function (popupModalId, showDesktopNewsletterPopup, showMobileNewsletterPopup) {
            if ($.cookie('newletterPopupHasFired')) {
                return;
            }

            var mobile = ('ontouchstart' in window) && window.innerWidth < 550;

            // Mobile/Desktop canvas size check for newsletter popup 
            if (mobile && !showMobileNewsletterPopup || !mobile && !showDesktopNewsletterPopup)
                return; 
               

            setTimeout(function () {
                $.fancybox($(popupModalId), { width: 420, autoSize: false, height: 'auto' });
            }, 3000);

            $.cookie('newletterPopupHasFired', true, { expires: 365, path: '/' });
        };

        return {
            subscriber: subscriber,
            subscribe: subscribe,
            redirectUrl: redirectUrl,
            popupModal: popupModal
        };
    });
;
define('ViewModels/roomBookingActionUi', ['knockout', 'utils', 'validationHelper', 'dataService', 'Models/bookingAction', 'knockout-mapping'],
    function (ko, utils, validationHelper, dataService, bookingActionModel, mapper) {
        var isWhereSelectionEnabled = ko.observable(false);
        var bookingAction = new bookingActionModel(isWhereSelectionEnabled);        
        dictionary = ko.observable(),
        hotels = ko.observableArray([]),
        defaultNumberOfAdultsPerRoom = ko.observable(1),
        defaultNumberOfChildrenPerRoom = ko.observable(0),
        numberOfNightsList = ko.observable(1),
        numberOfRoomsList = ko.observableArray(utils.inclusiveRange(1, 5)),
        numberOfAdultsList = ko.observableArray(utils.inclusiveRange(1, 5)),
        numberOfChildrenList = ko.observableArray(utils.inclusiveRange(0, 5)),
        isRoomSelectionEnabled = ko.observable(false),
        isGuestSelectionEnabled = ko.observable(false),        
        regions = ko.observableArray([]),
        
        selectedWhereItem = ko.computed({
            read: function () {
                if (!_.isUndefined(bookingAction.HotelId())) {
                    return bookingAction.HotelId();                    
                }                    
                else if (!_.isUndefined(bookingAction.RegionId())) {
                    return bookingAction.RegionId();
                }
                else return null;
            },
            write: function (value) {
                if (_.contains(hotels(), value)) {
                    bookingAction.HotelId(value.Id);
                    bookingAction.RegionId(null);
                } else if (_.contains(regions(), value)) {
                    bookingAction.RegionId(value.Id);
                    bookingAction.HotelId(null);
                }
            },
            owner: this
        }).extend({ required: { onlyIf: bookingAction.whereRequired } });        
        
        var whereList = ko.computed(function() {
            var list = Array();

            if (hotels().length > 0) {                    
                list = list.concat(hotels());
            }

            if (regions().length > 0) {
                list.push(dictionary()["ROOMBOOKINGACTION_SELECTREGION_PLACEHOLDER"].Phrase);
                list = list.concat(regions());
            }
                
            return list;
        });

        var whereText = function(item) {                
            if (typeof(item) === "string")
                return item;                                    
            return " - " + item.Name;
        };
        
        var whereOptionsAfterRender = function (option, item) {
            ko.applyBindingsToNode(option, { disable: typeof (item) == "string" || _.isUndefined(item) }, item);
        };

        var numberOfGuests = ko.computed(function () {
            return bookingAction.numberOfGuests();
        });
        
        var updateRooms = function (currentNumberOfRooms, newNumberOfRooms) {            
            if (newNumberOfRooms > currentNumberOfRooms) {
                for (var i = currentNumberOfRooms; i < newNumberOfRooms; i++) {
                    bookingAction.addRoom(defaultNumberOfAdultsPerRoom(), defaultNumberOfChildrenPerRoom());
                }
            }
            else if (newNumberOfRooms < currentNumberOfRooms) {
                for (var j = currentNumberOfRooms; j > newNumberOfRooms; j--) {
                    bookingAction.removeRoom();
                }
            }
        };       

        var isValid = function (viewModel) {
            return validationHelper.validate(viewModel, { deep: true });
        };

        var search = function () {
          if (isValid(this)) {

              $.get("/?sc_trk=booking action bar");

              var searchObj = {
                  bookingSettings: bookingAction,
                  hotelName : null
              }
              
              var hotelDropdown = $("#room-where option:selected");

              if(hotelDropdown.length > 0)
                  searchObj.hotelName = hotelDropdown.text()

              $.cookie('roomBooking', mapper.toJSON(searchObj), { expires: 365, path: '/' });

                dataService.getBookingRedirectUrl(bookingAction)
                   .done(function (redirectUrl) {
                       var gobj = window[window.GoogleAnalyticsObject];
                       var tracker, linker;
                       tracker = gobj.getAll()[0];
                       linker = new window.gaplugins.Linker(tracker);
                       var gaLink = linker.decorate(redirectUrl)
                       console.log(gaLink);

                       window.location.replace(gaLink);
                   }).fail(function () {
                       console.log("getBookingRedirectUrl failed");
                   });
            }            
        };

        var modifyBooking = function () {
            dataService.getModifyBookingRedirectUrl(bookingAction)
                .done(function (redirectUrl) {
                    window.location.replace(redirectUrl);
                }).fail(function() {
                    console.log("getModifyBookingRedirectUrl failed");
                });
        };

        var requestQuote = function () {
            dataService.getQuoteRequestRedirectUrl(bookingAction.HotelId())
                .done(function (redirectUrl) {
                    window.location.replace(redirectUrl);
                }).fail(function() {
                    console.log("getQuoteRequestRedirectUrl failed");
                });
        };

        var bookAMeetingHotel = function () {
            dataService.getBookAMeetingHotelRedirectUrl(bookingAction.HotelId())
                .done(function (redirectUrl) {
                    window.location.replace(redirectUrl);
                }).fail(function () {
                    console.log("getBookAMeetingHotelRedirectUrl failed");
                });
        }

        var init = function() {
            bookingAction.NumberOfRooms.subscribeChanged(updateRooms);
            
            for (var i = 0; i < bookingAction.NumberOfRooms() ; i++) {
                bookingAction.addRoom(defaultNumberOfAdultsPerRoom(), defaultNumberOfChildrenPerRoom());
            }
        };        

        return {
            bookingAction: bookingAction,            
            hotels: hotels,                                    
            numberOfNightsList: numberOfNightsList,
            numberOfRoomsList: numberOfRoomsList,              
            numberOfAdultsList: numberOfAdultsList,
            numberOfChildrenList: numberOfChildrenList,
            isRoomSelectionEnabled: isRoomSelectionEnabled,
            isGuestSelectionEnabled: isGuestSelectionEnabled,
            isWhereSelectionEnabled: isWhereSelectionEnabled,            
            search: search,
            modifyBooking: modifyBooking,
            requestQuote: requestQuote,
            bookAMeetingHotel: bookAMeetingHotel,
            numberOfGuests: numberOfGuests,
            defaultNumberOfAdultsPerRoom: defaultNumberOfAdultsPerRoom,
            defaultNumberOfChildrenPerRoom: defaultNumberOfChildrenPerRoom,
            regions: regions,
            whereList : whereList,
            whereText: whereText,
            selectedWhereItem: selectedWhereItem,
            whereOptionsAfterRender: whereOptionsAfterRender,
            dictionary: dictionary,            
            init: init
        };
    });;
define('ViewModels/searchBarUi', ['knockout', 'underscore.string', 'queryStringHelper', 'validationHelper', 'jquery'],
    function (ko, _, queryStringHelper, validationHelper, jQuery) {
        var searchPageUrl = ko.observable('');
        var searchExpression = ko.observable('').extend({ required: true });

        jQuery(".top-search").data("placeholder", jQuery(".top-search").attr("placeholder"));

        jQuery(".top-search").focus(function (e) {
            jQuery(this).attr("placeholder", "");
            jQuery(this).parents(".site-search-form").find(".validationMessage").hide();
        });

        jQuery(document).on("click", ".site-search-form .validationMessage", function () {
            jQuery(this).hide();
            jQuery(this).parents(".site-search-form").find(".top-search").focus();
        });

        var search = function () {
            if (!_.isBlank(searchPageUrl())) {

                var searchTerm = searchExpression();
                var reg = /^[^]+$/;


                if (reg.test(searchTerm))
                    window.location = queryStringHelper.setValue('query', searchTerm, searchPageUrl());
                else {
                    var searchForm = jQuery(this.search.arguments[1].currentTarget).parents(".site-search-form");

                    searchForm.find(".top-search").attr("placeholder", "");
                    searchForm.find(".validationMessage").show();
                }
            }
        };

        var keyPress = function (data, event) {
            // Enter
            if (event.which == 13) {
                search();
                return false;
            }

            return true;
        };

        return {
            searchPageUrl: searchPageUrl,
            searchExpression: searchExpression,
            search: search,
            keyPress: keyPress
        };
    });;
define('ViewModels/siteRegionSwitchUi', ['knockout', 'jquery',
    /* Dependencies without component accessible through variable */ 'jquery-cookie'], function (ko, $) {
    var cookieName = 'ttc-siteRegionCookie';
    
    var cookieSet = ko.computed(function () {
        return cookieName.length > 0 && $.cookie(cookieName) === 'yes';
    });
    var isVisible = ko.computed(function () {
        return !cookieSet();
    });

    var createCookie = function () {
        $.cookie(cookieName, 'yes');
        
        return true;
    };
    
    return {
        isVisible: isVisible,
        createCookie: createCookie,
        cookieName: cookieName
    };
});;
define('ViewModels/socialMediaFeedUi', ['knockout'],
    function (ko) {
        return function () {
            var self = this;
            self.feedImages = ko.observableArray([]);
        };
});;
