﻿var pagingParams = { pageIndex: 1, pageSize: 10, totalResults: 0, counter: 0, getTotalPages: function() { return Math.ceil(this.totalResults / this.pageSize); } };
var store;
var dataView;
var storeCart;
var dataViewCart;
var SearchForAvailability = false;
var SearchForAvailabilityInProgress = false;
var ModifySearchParameters = false;
var recordsNumber;

function PreparePage() {
   // debugger;
    pagingParams.pageSize = AsyncActivitySearchResultsPageSize;
    LoadActivitiesResults();
}

var renderActivityCartInProgress = false;
function AddToCartButtonClick(tableObj) {
    if (renderActivityCartInProgress) return;
    renderActivityCartInProgress = true;
    var checkboxes = tableObj.getElementsByTagName("input");
    for (var index = 0; index < checkboxes.length; index++) {
        if (checkboxes[index].parentNode.style.display == "" && checkboxes[index].style.display == "") {
            // check/uncheck the checkbox
            checkboxes[index].checked = !checkboxes[index].checked;
            var ActivityId = checkboxes[index].getAttribute("ActivityId");
            var ActivityOptionId = checkboxes[index].getAttribute("ActivityOptionId");
            var SelectedDate = checkboxes[index].getAttribute("SelectedDate");
            var adultCountPerOption = checkboxes[index].getAttribute("adultCountPerOption");
            ActivityAddToCart(ActivityId, ActivityOptionId, SelectedDate, adultCountPerOption)
            break;
        }
    }
}

// activity cart list methods
function ActivityAddToCart(ActivityId, ActivityOptionId, SelectedDate, adultCountPerOption) {

    var act_Opt_id = ActivityId + "_" + ActivityOptionId + "_" + SelectedDate;
    
    var chkAddToCart = document.getElementById("chkAddToCart_" + act_Opt_id);
    if (!chkAddToCart.checked) {
        ActivityRemoveFromCart(ActivityId, ActivityOptionId, SelectedDate);
        return;
    }

    // get number of adults
    var ddlActivityAdults = document.getElementById("ddlActivityAdults_" + (adultCountPerOption == 'true' ? act_Opt_id : ActivityId));
    
    var NumberOfAdults = ddlActivityAdults.options[ddlActivityAdults.selectedIndex].value;
    // get number of children
    var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + (adultCountPerOption == 'true' ? act_Opt_id : ActivityId));
    var NumberOfChildren = ddlActivityChilds.options[ddlActivityChilds.selectedIndex].value;


    var captainSelected = false; 
    if(adultCountPerOption == 'true') {
        var cbxIsCaptain = document.getElementById("cbxIsCaptain_" + act_Opt_id);
        captainSelected = cbxIsCaptain!=null && cbxIsCaptain.checked;
     };

    // get activity info by id
    var ActivityName;
    var ActivityOptionName;
    var Currency;
    var PricePerAdult;
    var PricePerChild;
    var TaxPerAdult;
    var TaxPerChild;
    var LocalToSystemConversionRate;
    var AdultAvailability;
    var ChildAvailability;
    var IsFreeSale;
    var AdaptorInstanceName;
    var CityName;
    var UnitLabel;
    var IsAdultChild;
    var DiscountAmountPerAdult;
    var DiscountAmountPerChild;
    var CategoryId;
    var Rating;
    var HasGroupingByHours;

    var PricePerAdultCaptain;
    var TaxPerAdultCaptain;
    var DiscountAmountPerAdultCaptain;
    var CaptainActivityOptonId;
    var AvailabilityMode;
    var OptionTypeId;
    
    var breakLoop = false;
    for (var index = 0; index < store.data.items.length; index++) {
        var ActivityObj = store.data.items[index].json;
        if (ActivityId == ActivityObj.Id) {
            ActivityName = ActivityObj.Name;
            IsFreeSale = ActivityObj.IsFreeSale;
            AdaptorInstanceName = ActivityObj.AdaptorInstanceName;
            CityName = ActivityObj.CityName;
            UnitLabel = ActivityObj.UnitLabel;
            IsAdultChild = ActivityObj.IsAdultChild;
            CategoryId = ActivityObj.Category.Id;
            Rating = ActivityObj.Rating;
            HasGroupingByHours = ActivityObj.HasGroupingByHours;

            for (var optIndex = 0; optIndex < ActivityObj.ActivityOptions.length; optIndex++) {
                var ActivityOptionsObj = ActivityObj.ActivityOptions[optIndex];
                
                if (SelectedDate == ActivityOptionsObj.Date) {
                    for (var pdIndex = 0; pdIndex < ActivityOptionsObj.PricingDetails.length; pdIndex++) {
                        var PricingDetailsObj = ActivityOptionsObj.PricingDetails[pdIndex];
                        if (ActivityOptionId == PricingDetailsObj.Id) {
                            ActivityOptionName = PricingDetailsObj.Name;
                            PricePerAdult = PricingDetailsObj.PricePerAdult;
                            PricePerChild = PricingDetailsObj.PricePerChild;
                            TaxPerAdult = PricingDetailsObj.TaxPerAdult;
                            TaxPerChild = PricingDetailsObj.TaxPerChild;
                            Currency = PricingDetailsObj.Currency;
                            AdultAvailability = PricingDetailsObj.AdultAvailability;
                            ChildAvailability = PricingDetailsObj.ChildAvailability;
                            LocalToSystemConversionRate = PricingDetailsObj.LocalToSystemConversionRate;
                            DiscountAmountPerAdult = PricingDetailsObj.DiscountAmountPerAdult;
                            DiscountAmountPerChild = PricingDetailsObj.DiscountAmountPerChild;
                            PricePerAdultCaptain = PricingDetailsObj.PricePerAdultCaptain;
                            TaxPerAdultCaptain = PricingDetailsObj.TaxPerAdultChildCaptain;
                            DiscountAmountPerAdultCaptain = PricingDetailsObj.DiscountAmountPerAdultCaptain;
                            CaptainActivityOptonId = PricingDetailsObj.CaptainActivityOptonId;
                            AvailabilityMode = PricingDetailsObj.AvailabilityMode;
                            OptionTypeId = PricingDetailsObj.OptionTypeId;
                            breakLoop = true;
                            break;
                        }
                    }
                }
                if (breakLoop) break;
            }
        }
        if (breakLoop) break;
    }

    ChangeAddToCartStyle(chkAddToCart);

    ShowActivityCartList(1, ActivityId, ActivityOptionId, SelectedDate, CategoryId, Rating, NumberOfAdults, NumberOfChildren, ActivityName, ActivityOptionName, Currency,
    PricePerAdult, PricePerChild, AdultAvailability, ChildAvailability, TaxPerAdult, TaxPerChild, LocalToSystemConversionRate,
    IsFreeSale, AdaptorInstanceName, CityName, UnitLabel, IsAdultChild,
     DiscountAmountPerAdult, DiscountAmountPerChild, HasGroupingByHours, captainSelected, CaptainActivityOptonId, PricePerAdultCaptain, TaxPerAdultCaptain, DiscountAmountPerAdultCaptain, AvailabilityMode, OptionTypeId);
}   

function ActivityRemoveFromCart(ActivityId, ActivityOptionId, SelectedDate) {
    var chkAddToCart = document.getElementById("chkAddToCart_" + ActivityId + "_" + ActivityOptionId + "_" + SelectedDate);
    if (chkAddToCart != null) {
        chkAddToCart.checked = false;
        ChangeAddToCartStyle(chkAddToCart);
    }
    ShowActivityCartList(-1, ActivityId, ActivityOptionId, SelectedDate);
}

function ChangeAddToCartStyle(checkbox) {
    if (checkbox.parentNode.style.display == "" && checkbox.style.display == "") {
        checkbox.parentNode.parentNode.parentNode.parentNode.parentNode.className = checkbox.checked ? "add_tocart_on" : "add_tocart_off";
        var act_opt_id = checkbox.getAttribute("ActivityId") +  "_" + checkbox.getAttribute("ActivityOptionId") + "_" + checkbox.getAttribute("SelectedDate");
        var ActivityId = checkbox.getAttribute("adultCountPerOption") == 'true' ? act_opt_id :  checkbox.getAttribute("ActivityId") ;
        
        var ddlActivityAdults = document.getElementById("ddlActivityAdults_" + ActivityId);
        var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
        
        ddlActivityAdults.disabled = checkbox.checked;
        ddlActivityChilds.disabled = checkbox.checked;
        if (checkbox.getAttribute("adultCountPerOption") == 'true') {

            var cap = document.getElementById("cbxIsCaptain_" + ActivityId);
            if (cap)
                document.getElementById("cbxIsCaptain_" + ActivityId).disabled = checkbox.checked;
        }
    }
}

function ShowActivityCartList(AddToCart, ActivityId, ActivityOptionId, SelectedDate, CategoryId, Rating, NumberOfAdults, NumberOfChildren, ActivityName, ActivityOptionName, Currency, PricePerAdult, PricePerChild, AdultAvailability, ChildAvailability, TaxPerAdult, TaxPerChild, LocalToSystemConversionRate, IsFreeSale, AdaptorInstanceName, CityName, UnitLabel, IsAdultChild, DiscountAmountPerAdult, DiscountAmountPerChild, HasGroupingByHours, CaptainSelected, CaptainActivityOptonId, PricePerAdultCaptain, TaxPerAdultCaptain, DiscountAmountPerAdultCaptain, AvailabilityMode, OptionTypeId) {
    // reload the activity cart list
    // get data using AJAX and reload the cart list without page reload
    var proxy = new Ext.data.HttpProxy(new Ext.data.Connection({ url: UrlBase + 'Handlers/ActivityServices.ashx', timeout: 200000, method: 'GET' }));
    proxy.addListener('loadexception', function(scope, options, response, error) {
        CancelAsyncPostBack();
    });

    var reader = new Ext.data.JsonReader({ root: 'ActivityCartItems', fields: [
	'Id', 'Name', 'NameForURL', 'Price', 'ActivityOptionId', 'CategoryName', 'SelectedDate', 'FormatedSelectedDate', 'StringSelectedDate', 'NumberOfAdults', 'NumberOfChildren', 'IsFreeSale', 'AdaptorInstanceName', 'CityName', 'UnitLabel',
	 'IsAdultChild', 'HasGroupingByHours', 'CaptainSelected', 'CaptainActivityOptonId', 'PricePerAdultCaptain', 'TaxPerAdultCaptain', 'DiscountAmountPerAdultCaptain'
	]
    });

    //We want to preprocess data before reader creates records
    reader.readRecords = reader.readRecords.createInterceptor(PreProcessDataCartItems);

    storeCart = new Ext.data.Store({
        proxy: proxy,
        reader: reader
    });

    //Create data view and conect it to store
    if (dataViewCart == null) {
        dataViewCart = new Ext.DataView({
            store: storeCart,
            tpl: Ext.XTemplate.from('ActivityCartItemsTemplate'),
            renderTo: 'activityCartItemsSearchResults',
            itemSelector: '',
            emptyText: ''
        });
    }
    else {
        dataViewCart.store = storeCart;
    }

    //Load Results from the server
    LoadActivityCartItemsResults({ AddToCart: AddToCart,
        ActivityId: ActivityId,
        CategoryId: CategoryId,
        Rating: Rating,
        ActivityOptionId: ActivityOptionId,
        SelectedDate: SelectedDate,
        NumberOfAdults: NumberOfAdults,
        NumberOfChildren: NumberOfChildren,
        ActivityName: ActivityName,
        ActivityOptionName: ActivityOptionName,
        Currency: Currency,
        PricePerAdult: PricePerAdult,
        PricePerChild: PricePerChild,
        TaxPerAdult: TaxPerAdult,
        TaxPerChild: TaxPerChild,
        LocalToSystemConversionRate: LocalToSystemConversionRate,
        AdultAvailability: AdultAvailability,
        ChildAvailability: ChildAvailability,
        IsFreeSale: IsFreeSale,
        AdaptorInstanceName: AdaptorInstanceName,
        CityName: CityName,
        UnitLabel: UnitLabel,
        IsAdultChild: IsAdultChild,
        DiscountAmountPerAdult: DiscountAmountPerAdult,
        DiscountAmountPerChild: DiscountAmountPerChild,
        HasGroupingByHours: HasGroupingByHours,
        CaptainSelected:CaptainSelected,
        CaptainActivityOptonId:CaptainActivityOptonId,
        PricePerAdultCaptain:PricePerAdultCaptain,
        TaxPerAdultCaptain:TaxPerAdultCaptain,
        DiscountAmountPerAdultCaptain: DiscountAmountPerAdultCaptain,
        AvailabilityMode: AvailabilityMode,
        OptionTypeId: OptionTypeId
    }, true);
}

function PreProcessDataCartItems(activityCartItemsData) {
    for (var index = 0; index < activityCartItemsData.ActivityCartItems.length; index++) {
        activityCartItemsData.ActivityCartItems[index].NameForURL = FixForUrlRewrite(activityCartItemsData.ActivityCartItems[index].Name);
        activityCartItemsData.ActivityCartItems[index].StringSelectedDate = activityCartItemsData.ActivityCartItems[index].FormatedSelectedDate.replace(/ /g, "_").replace(/./g, "_").replace(/,/g, "_");
    }

    return true;
}

function LoadActivityCartItemsResults(Params, skipWaiting) {
    //We want to fire data refresh event only after we called paging filter on the store.
    storeCart.suspendEvents();
    storeCart.load({
        params: Params,
        callback: RenderActivityCartItemsPage
    });
}

var ActivityCartOffsetHeight;

function RenderActivityCartItemsPage(records, options, success) {
    var bookItButtons = document.getElementsByName("bookItButton");
    if (success && records.length != 0) {
        Ext.get('activityCartItemsErrorLabel').hide();
        Ext.get('activityCartItemsSearchResults').show();
        Ext.get('activityCartTotal').show();

        for (var index = 0; index < bookItButtons.length; index++)
            bookItButtons[index].style.display = '';

        //We want that DataView will fire events to handle client side filtering.
        storeCart.resumeEvents();
        //Manualy refresh dataview to show data recived from the server.
        dataViewCart.refresh();

        if (storeCart.reader.jsonData != null) {
            Ext.get('cartTotal').dom.innerHTML = storeCart.reader.jsonData.Total;
            if (storeCart.reader.jsonData.TotalSavings == '') {
                Ext.get('trCartSavings').dom.style.display = 'none';
            } else {
                Ext.get('trCartSavings').dom.style.display = '';
                Ext.get('cartSavings').dom.innerHTML = storeCart.reader.jsonData.TotalSavings;
            }

            if (storeCart.reader.jsonData.TotalAwarded == '') {
                Ext.get('trCartAwarded').dom.style.display = 'none';
            } else {
                Ext.get('trCartAwarded').dom.style.display = '';
                Ext.get('cartAwarded').dom.innerHTML = storeCart.reader.jsonData.TotalAwarded;
            }
        }

        var overflowDivCartItems = document.getElementById('overflowDivCartItems');
        if (records.length >= 5) {
            if (records.length == 5) {
                ActivityCartOffsetHeight = overflowDivCartItems.offsetHeight;
            }
            if (ActivityCartOffsetHeight == null) ActivityCartOffsetHeight = 150;
            overflowDivCartItems.style.overflow = "auto";
            overflowDivCartItems.style.height = ActivityCartOffsetHeight + "px";
        }
        else {
            overflowDivCartItems.style.overflow = "hidden";
            overflowDivCartItems.style.height = "";
        }

        // trigger tooltip assignment
        var infoTargetElems = document.getElementsByName("infoTarget");
        var infoSourceElems = document.getElementsByName("infoSource");
        for (var index = 0; index < infoTargetElems.length; index++) {
            var targetElId = infoTargetElems[index].id;
            var sourceElId = targetElId + "_source";
            eval("info_" + infoTargetElems[index].id + " = new SimpleToolTip('info_" + infoTargetElems[index].id + "', '" + targetElId + "', '" + sourceElId + "');");
            eval("info_" + infoTargetElems[index].id).Init();
        }
    }
    else {
        Ext.get('activityCartItemsErrorLabel').show();
        Ext.get('activityCartItemsSearchResults').hide();
        Ext.get('activityCartTotal').hide();
        Ext.get('trCartSavings').dom.style.display = 'none';
        Ext.get('trCartAwarded').dom.style.display = 'none';

        for (var index = 0; index < bookItButtons.length; index++)
            bookItButtons[index].style.display = 'none';
    }

    if (IsDetailsPage && !SExecuted && SActivity != null && SDate != null && SOption != null) {
        SExecuted = true;
        try {
            SetDateAndCategory(SActivity, SDate, SOption);
        } catch (ex) { /* not necesary to treat because some dates might not exists into the search results */ }
    }
    else {
        UpdateAddToCartCheckBoxByCartItems();
    }

    renderActivityCartInProgress = false;
}

function UpdateAddToCartCheckBoxByCartItems() {
    // deselect all 'add to cart' checkboxes
    var chkAddToCartButtons = document.getElementsByName("chkAddToCart");
    for (var cIndex = 0; cIndex < chkAddToCartButtons.length; cIndex++) {
        chkAddToCartButtons[cIndex].checked = false;
        ChangeAddToCartStyle(chkAddToCartButtons[cIndex]);
    }

    if (storeCart.reader.jsonData == null) return;
    // loop the cart items and check each found checkbox (add to cart checkbox for activity)
    for (var index = 0; index < storeCart.reader.jsonData.ActivityCartItems.length; index++) {
        var ActivityId = storeCart.reader.jsonData.ActivityCartItems[index].Id;
        var ActivityOptionId = storeCart.reader.jsonData.ActivityCartItems[index].ActivityOptionId;
        var SelectedDate = storeCart.reader.jsonData.ActivityCartItems[index].SelectedDate;
        var hasGroupingByHours = storeCart.reader.jsonData.ActivityCartItems[index].HasGroupingByHours;
        var isCaptain = storeCart.reader.jsonData.ActivityCartItems[index].CaptainSelected;

        var act_opt_id = ActivityId + '_' + ActivityOptionId + '_' + SelectedDate;

        var chkAddToCart = document.getElementById('chkAddToCart_' + act_opt_id);
        if (chkAddToCart != null) {
            chkAddToCart.checked = true;
            if (chkAddToCart.parentNode.style.display == "" && chkAddToCart.style.display == "") {
                ChangeAddToCartStyle(chkAddToCart);
                var NumberOfAdults = storeCart.reader.jsonData.ActivityCartItems[index].NumberOfAdults;
                var NumberOfChildren = storeCart.reader.jsonData.ActivityCartItems[index].NumberOfChildren;
                var ddlActivityAdults = document.getElementById("ddlActivityAdults_" + (hasGroupingByHours? act_opt_id : ActivityId));
                var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + (hasGroupingByHours ? act_opt_id : ActivityId));
                if (hasGroupingByHours) {
                    var cbxIsCaptain = document.getElementById("cbxIsCaptain_" + act_opt_id);
                    if (cbxIsCaptain)
                        cbxIsCaptain.checked = isCaptain;
                }
                SetSelectedValue(ddlActivityAdults, NumberOfAdults);
                SetSelectedValue(ddlActivityChilds, NumberOfChildren);
            }
        }
    }
}

function SetSelectedValue(select, value) {
    for (var index = 0; index < select.options.length; index++) {
        select.options[index].selected = false;
        if (select.options[index].value == value) {
            select.options[index].selected = true;
        }
    }
}

function LoadActivitiesResults(actparams) {
    if (!IsDetailsPage) {
        Ext.get('paging').setVisibilityMode(Ext.Element.DISPLAY);
        Ext.get('pagingBottom').setVisibilityMode(Ext.Element.DISPLAY);
        Ext.get('errorLabel').setVisibilityMode(Ext.Element.DISPLAY);
        Ext.get('rowSearchResultsCategories').setVisibilityMode(Ext.Element.DISPLAY);
        Ext.get('narrowResults').setVisibilityMode(Ext.Element.DISPLAY);
        Ext.get('errorMessage').setVisibilityMode(Ext.Element.DISPLAY);
        Ext.get('filterMessage').setVisibilityMode(Ext.Element.DISPLAY);
    }

    var params = actparams ? { FromDate: actparams.checkInDate, ToDate: actparams.checkOutDate} : null;

    //Prepare data store
    var proxy = new Ext.data.HttpProxy(new Ext.data.Connection({ url: UrlBase + 'Handlers/ActivityServices.ashx', timeout: 200000, method: 'GET', extraParams: params }));
    proxy.addListener('loadexception', function(scope, options, response, error) {
        CancelAsyncPostBack();
    });

    var reader = new Ext.data.JsonReader({ root: 'Activities', fields: [
	'Id', 'Name', 'NameForURL', 'DestId', 'Desc', 'Thumb', 'Rating', 'IndexPerCat', 'ChildMinAge', 'ChildMaxAge',
	'CallToAction', 'IsFreeSale', 'PerLabel', 'CityName', 'Category', 'ActivityOptions', 'AdaptorInstanceName',
	'IsLoyaltyEnabled', 'IsSearchByPoints', 'ShowClubPricesDetails', 'HasGroupingByHours', 'Dates', 'TimesDefault'
	]
    });

    //We want to preprocess data before reader creates records
    reader.readRecords = reader.readRecords.createInterceptor(PreProcessData);

    store = new Ext.data.Store({
        proxy: proxy,
        reader: reader
    });

    var TemplateSource = "ActivityResultsTemplate";
    if (IsDetailsPage && TabName == "SeatingChart") {
        TemplateSource = "ActivityResultsTemplateForSeatSelection";
    }

    //Create data view and conect it to store
    dataView = new Ext.DataView({
        store: store,
        tpl: Ext.XTemplate.from(TemplateSource),
        renderTo: 'activitySearchResults',
        itemSelector: '',
        emptyText: ''
    });

    if (ModifySearchParameters) {
        // reset results
        LoadActivityResults({ ModifySearchParameters: true, IsDetailsPage: true, QueryStringActivityId: QueryStringActivityId }, false);
    }
    else {
        // load results from the server
        // if search for availability then send search parameters
        if (SearchForAvailability) {
            // details page without pricing, just availability
            LoadActivityResults({ IsDetailsPage: IsDetailsPage, SearchForAvailability: true, QueryStringActivityId: QueryStringActivityId }, false);
        }
        else {
            if (IsDetailsPage)
            // details page with pricing
                LoadActivityResults({ IsDetailsPage: true, QueryStringActivityId: QueryStringActivityId }, false);
            else
            // search results page
                LoadActivityResults({ IsDetailsPage: false }, false);
        }
    }
    ShowHideSpeedBook();
}

function ShowHideSpeedBook() {
    if (typeof(thinSearchboxClientID) == 'undefined')
        return;

    if (typeof(hideSpeedBook) == 'undefined')
        return;

    var tr = document.getElementById(thinSearchboxClientID);

    if (typeof (tr) == 'undefined')
        return;
        
    if (!hideSpeedBook) {
        tr.style.display = '';
        hideSpeedBook = null;
    }
    else {
        tr.style.display = 'none';
        hideSpeedBook = null;
    }
}

function PreProcessData(activitiesData) {
    for (var index = 0; index < activitiesData.Activities.length; index++) {
        activitiesData.Activities[index].NameForURL = FixForUrlRewrite(activitiesData.Activities[index].Name);
    }

    return true;
}

function LoadActivityResults(Params, skipWaiting) {
    if (!skipWaiting && !IsDetailsPage) {
        var iTimeoutID = setTimeout(ShowWaitingPopUp, 500);
        Params.iTimeoutID = iTimeoutID;
    }

    //We want to fire data refresh event only after we called paging filter on the store.
    store.suspendEvents();
    store.load({
        params: Params,
        callback: RenderActivityPage
    });
}

function RenderActivityPage(records, options, success) {

    Ext.get('searchResultsDiv').show();

    if (!success || records.length == 0) {
        if (typeof (modifySearch) == 'function')
            modifySearch();
    }

    // call this function whenever activity page renders
    // send 'true' if number of results is positive
    if (typeof (RenderActivityPageResultsEvent) == 'function')
        RenderActivityPageResultsEvent(success && records.length != 0)

    if (success && records.length != 0) {
        if (!IsDetailsPage) {
            Ext.get('errorLabel').hide();
            Ext.get('rowSearchResultsCategories').show();
            Ext.get('narrowResults').show();

            InitHeader(store.reader.jsonData.Categories);
            InitFilter(store.reader.jsonData.Categories);

            pagingFilter.dataFilter = function(record, id) { return true; };

            if (IsPageLoadedFromDetails) {
                // apply the previous filter, if exists into the cookie
                var ActivitiesSelectedCategories = readCookie("ActivitiesSelectedCategories");
                var ActivitiesSelectedStarRatings = readCookie("ActivitiesSelectedStarRatings");
                var ActivitiesSearchText = readCookie("ActivitiesSearchText");
                ActivitiesSearchText = ActivitiesSearchText == null ? "" : ActivitiesSearchText;
                if (ActivitiesSelectedCategories != null && ActivitiesSelectedStarRatings != null && ActivitiesSearchText != null) {
                    // remove categories from 'Go to' list
                    var ddlActivitiesCategories = document.getElementById('ddlActivitiesCategories');
                    while (ddlActivitiesCategories.options.length > 0)
                        ddlActivitiesCategories.remove(ddlActivitiesCategories.options.length - 1);

                    // select categories, stars, set search text
                    var C_txtSearchText = document.getElementById('txtActivitySearch');
                    C_txtSearchText.value = ActivitiesSearchText;

                    var elemsActivitiesCategories = document.getElementsByName("chkActivitiesCategories");
                    var List_ActivitiesSelectedCategories = ActivitiesSelectedCategories.split(',');
                    for (var i = 0; i < elemsActivitiesCategories.length; i++) {
                        elemsActivitiesCategories[i].checked = false;
                        if (List_ActivitiesSelectedCategories.indexOf(elemsActivitiesCategories[i].value) > -1) {
                            elemsActivitiesCategories[i].checked = true;
                        }
                    }

                    var List_ActivitiesSelectedStarRatings = ActivitiesSelectedStarRatings.split(',');
                    if (List_ActivitiesSelectedStarRatings.length < 5) {
                        var chkStarsAll = document.getElementById("chkStarsAll");
                        chkStarsAll.checked = false;
                        var elemsStarRating = document.getElementsByName("chkStarRating");
                        for (var i = 0; i < elemsStarRating.length; i++) {
                            elemsStarRating[i].checked = false;
                            if (List_ActivitiesSelectedStarRatings.indexOf(elemsStarRating[i].value) > -1) {
                                elemsStarRating[i].checked = true;
                            }
                        }
                    }

                    // filter results
                    pagingFilter.dataFilter = function(record, id) {
                        var output = (ActivitiesSelectedCategories.indexOf(record.get('Category').Id) > -1
                            && ActivitiesSelectedStarRatings.indexOf(record.get('Rating')) > -1
                            && record.get('Name').toLowerCase().indexOf(ActivitiesSearchText) > -1)

                        // populate categories 'Go to' list
                        if (output) {
                            if (!optionExists(ddlActivitiesCategories, record.get('Category').Id)) {
                                var elOptNew = document.createElement('option');
                                elOptNew.text = record.get('Category').Name;
                                elOptNew.value = record.get('Category').Id;
                                ddlActivitiesCategories.options.add(elOptNew);
                            }
                        }

                        return output;
                    };
                }
            }
            else {
                eraseCookie("ActivitiesSelectedCategories");
                eraseCookie("ActivitiesSelectedStarRatings");
                eraseCookie("ActivitiesSearchText");
            }

            store.filterBy(pagingFilter.dataFilter);

            SetRecords(store.getCount().toString());

            if (store.getCount() > 0) {
                pagingParams.totalResults = store.getCount();
                pagingParams.counter = 0;
                if (pagingParams.getTotalPages() > 1) {
                    if (IsPageLoadedFromDetails) {
                        var ActivitiesPageIndex = readCookie("ActivitiesPageIndex");
                        pagingParams.pageIndex = parseInt(ActivitiesPageIndex != null ? ActivitiesPageIndex : 1);
                    }
                    Ext.get('paging').show();
                    Ext.get('pagingBottom').show();
                    store.filterBy(pagingFilter);
                }
                // add the page index to cookie
                // use it when came back to search results page
                eraseCookie("ActivitiesPageIndex");
                createCookie("ActivitiesPageIndex", pagingParams.pageIndex, 1);
                InitPaging(pagingParams);
            }
            else {
                Ext.get('errorLabel').show();
                Ext.get('rowSearchResultsCategories').hide();
                Ext.get('errorMessage').hide();
                Ext.get('filterMessage').show();
                Ext.get('paging').hide();
                Ext.get('pagingBottom').hide();
            }
        }

        // visible only on details page when no availability
        if (document.getElementById("tableAvailability") != null) {
            document.getElementById("tableAvailability").style.display = 'none';
            document.getElementById("availabilityNoResults").style.display = 'none';
            // show the seating chart (is was set visible on the first place)
            if (document.getElementById(tabSeatingChartClientID) != null)
                document.getElementById(tabSeatingChartClientID).style.display = '';
        }

        Ext.get('activitySearchResults').show();

        //We want that DataView will fire events to handle client side filtering.
        store.resumeEvents();
        //Manualy refresh dataview to show data recived from the server.
        dataView.refresh();

        InitAdultLists();
        InitSeatMap();
    }
    else {
        if (!IsDetailsPage) {
            SetRecords("0");
            ShowError();
        }
        else {
            document.getElementById("tableAvailability").style.display = '';
            if (SearchForAvailabilityInProgress) {
                document.getElementById("availabilityNoResults").style.display = '';
            }
            document.getElementById('activitySearchResults').innerHTML = '';
            document.getElementById('activitySearchResults').style.display = 'none';
        }
    }

    if (typeof (stopWaiting) != 'undefined')
        stopWaiting();

    if (!IsDetailsPage) FloatTopDiv();

    // Load Cart List
    ShowActivityCartList(0);

    if (SearchForAvailabilityInProgress) SearchForAvailabilityInProgress = false;

    if (options.params.iTimeoutID != null) {
        clearTimeout(options.params.iTimeoutID);
        CancelAsyncPostBack();
    }
}

function SetRecords(records) {
    document.getElementById('spanActivitiesSearchResults').innerHTML = records;
}

function InitSeatMap() {
    if (IsDetailsPage && TabName == "SeatingChart" && store.data.items.length == 1) {
        // Show seat control
        var ActivityId = store.data.items[0].json.Id;
        //        var ActivityOptionId = store.data.items[0].json.ActivityOptions[0].PricingDetails[0].Id;
        var SelectedDate = store.data.items[0].json.ActivityOptions[0].Date;
        showSeats(ActivityId, true, null, SelectedDate, false);
    }
}

function InitAdultLists() {
    for (var index = 0; index < store.data.items.length; index++) {
        if (store.data.items[index].json.HasGroupingByHours) {
            var ActivityId = store.data.items[index].json.Id;
            for (var indexO = 0; indexO < store.data.items[index].json.ActivityOptions.length; indexO++) {
                for (var indexP = 0; indexP < store.data.items[index].json.ActivityOptions[indexO].PricingDetails.length; indexP++) {
                    var pricingDetails = store.data.items[index].json.ActivityOptions[indexO].PricingDetails[indexP];
                    var AdultAvailability = pricingDetails.AdultAvailability;
                    var ChildAvailability = pricingDetails.ChildAvailability;
                    var av_optid = ActivityId + "_" + pricingDetails.Id + "_" + store.data.items[index].json.ActivityOptions[indexO].Date;
                    SetAdultAvailabilityList(av_optid, AdultAvailability, ChildAvailability);
                    if (ChildAvailability == 0) {
                        // change 'adult' text to 'person' text
                        var AdultsText = document.getElementById("Adults_" + av_optid);
                        var ChildsText = document.getElementById("Childs_" + av_optid);
                        var PerPersonText = document.getElementById("PerPerson_" + av_optid);
                        AdultsText.style.display = 'none';
                        PerPersonText.style.display = '';

                        // hide the child list
                        var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + av_optid);
                        if (IsDetailsPage && TabName == "SeatingChart") {
                            spanActivityChilds = document.getElementById("spanActivityChilds_" + ActivityId);
                            spanActivityChilds.style.display = 'none';
                            ddlActivityChilds.style.display = 'none';
                          
                        }
                        else {
                            ddlActivityChilds.parentNode.style.display = 'none';
                            ChildsText.style.display = 'none';
                        }
                    } 
                }
            }
        } else {
            var ActivityId = store.data.items[index].json.Id;
            var AdultAvailability = store.data.items[index].json.ActivityOptions[0].PricingDetails[0].AdultAvailability;
            var ChildAvailability = store.data.items[index].json.ActivityOptions[0].PricingDetails[0].ChildAvailability;
            SetAdultAvailabilityList(ActivityId, AdultAvailability, ChildAvailability);

            // check if have child availability for any of the category
            var ChildExists = false;
            for (var indexP = 0; indexP < store.data.items[index].json.ActivityOptions[0].PricingDetails.length; indexP++) {
                if (store.data.items[index].json.ActivityOptions[0].PricingDetails[indexP].ChildAvailability > 0) {
                    ChildExists = true;
                    break;
                }
            }
            if (!ChildExists) {
                // change 'adult' text to 'person' text
                var AdultsText = document.getElementById("Adults_" + ActivityId);
                var PerPersonText = document.getElementById("PerPerson_" + ActivityId);
                AdultsText.style.display = 'none';
                PerPersonText.style.display = '';

                // hide the child list
                var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
                if (IsDetailsPage && TabName == "SeatingChart") {
                    spanActivityChilds = document.getElementById("spanActivityChilds_" + ActivityId);
                    spanActivityChilds.style.display = 'none';
                    ddlActivityChilds.style.display = 'none';
                }
                else {
                    ddlActivityChilds.parentNode.style.display = 'none';
                }
            }

        }
    }
}

function HasChildAvailabilityPerDate(ActivityId, Date, OptionId) {
    var ChildExists = false;
    for (var index = 0; index < store.data.items.length; index++) {
        if (ActivityId == store.data.items[index].json.Id) {
            for (var indexA = 0; indexA < store.data.items[index].json.ActivityOptions.length; indexA++) {
                if (Date == store.data.items[index].json.ActivityOptions[indexA].Date) {
                    for (var indexP = 0; indexP < store.data.items[index].json.ActivityOptions[indexA].PricingDetails.length; indexP++) {
                        if (OptionId == null || OptionId == store.data.items[index].json.ActivityOptions[indexA].PricingDetails[indexP].Id) {
                            if (store.data.items[index].json.ActivityOptions[indexA].PricingDetails[indexP].ChildAvailability > 0) {
                                ChildExists = true;
                                break;
                            }
                        }
                    }
                    break;
                }
            }
            break;
        }
    }
    return ChildExists;
}

function InitHeader(headerParams) {
    var template = Ext.XTemplate.from('headerTemplate');
    template.overwrite('activitiesCategories', headerParams);
}

function InitFilter(headerParams) {
    var template = Ext.XTemplate.from('filterTemplate');
    template.overwrite('activitiesFilterCategories', headerParams);
}

function pagingFilter(record, id) {

    if (pagingFilter.dataFilter) {
        if (!pagingFilter.dataFilter(record, id))
            return false;
        else
            recordsNumber++;
    }

    pagingParams.counter++;
    pagingParams.totalResults = pagingParams.counter;
    var lastRecordIndex = pagingParams.pageIndex * pagingParams.pageSize;
    var firstRecordIndex = lastRecordIndex - pagingParams.pageSize;

    return pagingParams.counter > firstRecordIndex && pagingParams.counter <= lastRecordIndex;
}

function ShowPage(pageIndex) {
    pagingParams.counter = 0;
    pagingParams.pageIndex = pageIndex;
    store.filterBy(pagingFilter);

    InitPaging(pagingParams);
    if (store.getCount() == 0) {
        Ext.get('errorLabel').show();
        Ext.get('rowSearchResultsCategories').hide();
        Ext.get('errorMessage').hide();
        Ext.get('filterMessage').show();
        Ext.get('paging').hide();
        Ext.get('pagingBottom').hide();
    }
    else {
        Ext.get('errorLabel').hide();
        Ext.get('rowSearchResultsCategories').show();

        // add the page index to cookie
        // use it when came back to search results page
        eraseCookie("ActivitiesPageIndex");
        createCookie("ActivitiesPageIndex", pageIndex, 1);
    }

    InitAdultLists();

    // check 'add to cart' checkboxes depending on the cart items
    UpdateAddToCartCheckBoxByCartItems();
}

function InitPaging(pagingParams) {
    if (pagingParams.getTotalPages() == 1) {
        Ext.get('paging').hide();
        Ext.get('pagingBottom').hide();
    }
    else {
        pagingParams.PagingArray = [];
        for (var i = 1; i <= pagingParams.getTotalPages(); i++) {
            pagingParams.PagingArray.push(i);
        }
        var template = Ext.XTemplate.from('pagingTemplate');
        template.overwrite('paging', pagingParams);
        template.overwrite('pagingBottom', pagingParams);
        Ext.get('paging').show();
        Ext.get('pagingBottom').show();
    }
}

function ShowAllCategories() {
    var elems = document.getElementsByName("chkActivitiesCategories");
    for (var i = 0; i < elems.length; i++) {
        elems[i].checked = true;
    }

    FilterResults();
}

function ClearAllCategories() {
    var elems = document.getElementsByName("chkActivitiesCategories");
    for (var i = 0; i < elems.length; i++) {
        elems[i].checked = false;
    }

    FilterResults();
}

function FilterByStarRating(all) {
    var chkStarsAll = document.getElementById("chkStarsAll");
    var elemsStarRating = document.getElementsByName("chkStarRating");

    // when all is selected deselect the others
    if (all && chkStarsAll.checked) {
        for (var i = 0; i < elemsStarRating.length; i++) {
            elemsStarRating[i].checked = false;
        }
    }
    // when star is selected deselect the all star
    else {
        chkStarsAll.checked = false;
    }

    FilterResults();
}

var txtSearchText = "";
function FilterByText() {
    // get text searched information
    txtSearchText = document.getElementById('txtActivitySearch').value;

    FilterResults();
}

function FilterResults() {
    var elemsActivitiesCategories = document.getElementsByName("chkActivitiesCategories");
    var selectedCategories = [];
    for (var i = 0; i < elemsActivitiesCategories.length; i++) {
        if (elemsActivitiesCategories[i].checked) {
            selectedCategories.push(parseInt(elemsActivitiesCategories[i].value));
        }
    }

    var elemsStarRating = document.getElementsByName("chkStarRating");
    var chkStarsAll = document.getElementById('chkStarsAll');
    var selectedStarRatings = [];
    for (var i = 0; i < elemsStarRating.length; i++) {
        if (elemsStarRating[i].checked || chkStarsAll.checked) {
            selectedStarRatings.push(parseInt(elemsStarRating[i].value));
        }
    }

    // remove categories from 'Go to' list
    var ddlActivitiesCategories = document.getElementById('ddlActivitiesCategories');
    while (ddlActivitiesCategories.options.length > 0)
        ddlActivitiesCategories.remove(ddlActivitiesCategories.options.length - 1);

    // add the filter parameters to cookie
    // use it when came back to search results page
    eraseCookie("ActivitiesSelectedCategories");
    createCookie("ActivitiesSelectedCategories", selectedCategories.length == 0 ? "-1" : selectedCategories, 1);
    eraseCookie("ActivitiesSelectedStarRatings");
    createCookie("ActivitiesSelectedStarRatings", selectedStarRatings.length == 0 ? "-1" : selectedStarRatings, 1);
    eraseCookie("ActivitiesSearchText");
    createCookie("ActivitiesSearchText", txtSearchText.toLowerCase(), 1);

    // filter results
    pagingFilter.dataFilter = function(record, id) {
        var output = (selectedCategories.indexOf(record.get('Category').Id) > -1
            && selectedStarRatings.indexOf(record.get('Rating')) > -1
            && record.get('Name').toLowerCase().indexOf(txtSearchText.toLowerCase()) > -1)

        // populate categories 'Go to' list
        if (output) {
            if (!optionExists(ddlActivitiesCategories, record.get('Category').Id)) {
                var elOptNew = document.createElement('option');
                elOptNew.text = record.get('Category').Name;
                elOptNew.value = record.get('Category').Id;
                ddlActivitiesCategories.options.add(elOptNew);
            }
        }

        return output;
    };

    // calculate the total records inside the paging filter
    recordsNumber = 0;

    // reset page index
    // also filter the results
    ShowPage(1);

    SetRecords(recordsNumber);

    window.location.href = window.location.href.split("#")[0] + "#top";
}

function optionExists(lst, val) {
    response = false;
    for (var i = 0; i < lst.length; i++) {
        if (lst.options[i].value == val) {
            response = true;
            break;
        }
    }
    return response;
}

function FilterByCategory() {
    FilterResults();
}

function ShowError() {
    Ext.get('errorLabel').show();
    Ext.get('rowSearchResultsCategories').hide();
    Ext.get('filterMessage').hide();
    Ext.get('errorMessage').show();
    Ext.get('paging').hide();
    Ext.get('pagingBottom').hide();
    Ext.get('narrowResults').hide();
}

function ChangeCategory(ActivityId, Date, CategoryId) {
    // unhide selected category adult availability info
    // hide all - need to speed up
    //var adultAvailabilityControls = document.getElementsByTagName("span");
    var adultAvailabilityControls = document.getElementById('adultAvailability_' + ActivityId).getElementsByTagName("span");
    for (var index = 0; index < adultAvailabilityControls.length; index++) {
        if (adultAvailabilityControls[index].id.indexOf("adultAvailability_" + ActivityId + "_") == 0) {
            adultAvailabilityControls[index].style.display = 'none';
        }
    }

    if (IsDetailsPage && TabName == "SeatingChart") {
        var containerChild = document.getElementById('tbody_' + ActivityId + '_' + Date + '_PChild');
        var containerChildSpans = containerChild.getElementsByTagName('span');
        for (var i = 0; i < containerChildSpans.length; i++) {
            containerChildSpans[i].style.display = 'none';
        }

        var containerAdult = document.getElementById('tbody_' + ActivityId + '_' + Date + '_PAdult');
        var containerAdultSpans = containerAdult.getElementsByTagName('span');
        for (var i = 0; i < containerAdultSpans.length; i++) {
            containerAdultSpans[i].style.display = 'none';
        }

        // show selected one
        var PAdult = document.getElementById('tbody_' + ActivityId + '_' + Date + '_C' + CategoryId + "_PAdult");
        if (PAdult) PAdult.style.display = '';
        var PChild = document.getElementById('tbody_' + ActivityId + '_' + Date + '_C' + CategoryId + "_PChild");
        if (PChild) PChild.style.display = '';
    }

    // show category specific adult availability
    var adultAvailability = document.getElementById("adultAvailability_" + ActivityId + "_" + Date + "_" + CategoryId);
    adultAvailability.style.display = '';
    adultAvailability.parentNode.style.display = '';

    // unhide selected add to cart button
    // hide all - need to speed up
    //var chkAddToCartControls = document.getElementsByTagName("input");
    var chkAddToCartControls = document.getElementById('chkAddToCart_' + ActivityId).getElementsByTagName("input");
    for (var index = 0; index < chkAddToCartControls.length; index++) {
        if (chkAddToCartControls[index].id.indexOf("chkAddToCart_" + ActivityId + "_") == 0) {
            chkAddToCartControls[index].style.display = 'none';
        }
    }

    // show add to cart button specific
    var chkAddToCart = document.getElementById("chkAddToCart_" + ActivityId + "_" + CategoryId + "_" + Date);
    chkAddToCart.style.display = '';
    chkAddToCart.parentNode.style.display = '';

    // need to call this method because session might expire and cart items don not exists anymore
    // check 'add to cart' checkboxes depending on the cart items
    UpdateAddToCartCheckBoxByCartItems();

    ChangeAddToCartStyle(chkAddToCart);

    SetAdultAvailabilityList(ActivityId, adultAvailability.getAttribute('AdultAvailability'), adultAvailability.getAttribute('ChildAvailability'));

    if (chkAddToCart.checked) {
        // set correct number of adults and children
        // loop the cart items and find adults and children number of checked item (ActivityId, CategoryId, Date)
        if (storeCart.reader.jsonData == null) return;
        for (var index = 0; index < storeCart.reader.jsonData.ActivityCartItems.length; index++) {
            if (storeCart.reader.jsonData.ActivityCartItems[index].Id == ActivityId
                && storeCart.reader.jsonData.ActivityCartItems[index].ActivityOptionId == CategoryId
                && storeCart.reader.jsonData.ActivityCartItems[index].SelectedDate == Date) {
                var NumberOfAdults = storeCart.reader.jsonData.ActivityCartItems[index].NumberOfAdults;
                var NumberOfChildren = storeCart.reader.jsonData.ActivityCartItems[index].NumberOfChildren;
                var hasGroupingByHours = storeCart.reader.jsonData.ActivityCartItems[index].HasGroupingByHours;
                var isCaptain = storeCart.reader.jsonData.ActivityCartItems[index].CaptainSelected;

                var act_opt_id = ActivityId + '_' + ActivityOptionId + '_' + SelectedDate;

                var ddlActivityAdults = document.getElementById("ddlActivityAdults_" + hasGroupingByHours ? act_opt_id : ActivityId);
                var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + hasGroupingByHours ? act_opt_id : ActivityId);
                if (hasGroupingByHours) {
                    document.getElementById("cbxIsCaptain_" + act_opt_id).checked = isCaptain;
                }
                SetSelectedValue(ddlActivityAdults, NumberOfAdults);
                SetSelectedValue(ddlActivityChilds, NumberOfChildren);
            }
        }
    }

    // change 'adult' text to 'person' text
    var AdultsText = document.getElementById("Adults_" + ActivityId);
    var PerPersonText = document.getElementById("PerPerson_" + ActivityId);
    // hide the child list
    var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
    var tmpCatId = null;
    if (IsDetailsPage && TabName == "SeatingChart") {
        tmpCatId = CategoryId;
    }
    if (HasChildAvailabilityPerDate(ActivityId, Date, tmpCatId)) {
        AdultsText.style.display = '';
        PerPersonText.style.display = 'none';
        if (IsDetailsPage && TabName == "SeatingChart") {
            spanActivityChilds = document.getElementById("spanActivityChilds_" + ActivityId);
            spanActivityChilds.style.display = '';
            ddlActivityChilds.style.display = '';
        }
        else {
            ddlActivityChilds.parentNode.style.display = '';
        }
    }
    else {
        AdultsText.style.display = 'none';
        PerPersonText.style.display = '';
        if (IsDetailsPage && TabName == "SeatingChart") {
            spanActivityChilds = document.getElementById("spanActivityChilds_" + ActivityId);
            spanActivityChilds.style.display = 'none';
            ddlActivityChilds.style.display = 'none';
        }
        else {
            ddlActivityChilds.parentNode.style.display = 'none';
        }
    }
}

function SetAdultAvailabilityList(ActivityId, AdultAvailability, ChildAvailability, ActivityOptionId) {
    // populate adults drop down
    var ddlActivityAdults = document.getElementById("ddlActivityAdults_" + ActivityId);
    var previousActivityAdultsSelectedIndex = ddlActivityAdults.selectedIndex;
    while (ddlActivityAdults.options.length > 0)
        ddlActivityAdults.remove(ddlActivityAdults.options.length - 1);

    for (var index = 0; index < AdultAvailability; index++) {
        var elOptNew = document.createElement('option');
        elOptNew.text = (index + 1);
        elOptNew.value = (index + 1);
        if (previousActivityAdultsSelectedIndex == index) elOptNew.selected = true;
        ddlActivityAdults.options.add(elOptNew);
    }

    var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
    var previousActivityChildsSelectedIndex = ddlActivityChilds.selectedIndex;
    // add child options
    while (ddlActivityChilds.options.length > 0)
        ddlActivityChilds.remove(ddlActivityChilds.options.length - 1);

    // add also 0
    for (var index = -1; index < ChildAvailability; index++) {
        var elOptNew = document.createElement('option');
        elOptNew.text = (index + 1);
        elOptNew.value = (index + 1);
        if (previousActivityChildsSelectedIndex == (index + 1)) elOptNew.selected = true;
        ddlActivityChilds.options.add(elOptNew);
    }
}

function SetDateAndCategory(ActivityId, Date, CategoryId) {
    //select date
    var ddlActivityAvailableDates = document.getElementById('ddlActivityAvailableDates_' + ActivityId);
    if (ddlActivityAvailableDates == null) return;
    for (var i = 0; i < ddlActivityAvailableDates.options.length; i++) {
        if (ddlActivityAvailableDates.options[i].value == Date) {
            ddlActivityAvailableDates.options[i].selected = true;
            break;
        }
    }
    SelectActivityDate(ActivityId);

    // select category
    var categories = document.getElementsByName("Radio_" + ActivityId + "_" + Date);
    for (var catIndex = 0; catIndex < categories.length; catIndex++) {
        if (categories[catIndex].value == CategoryId) {
            categories[catIndex].checked = true;
            break;
        }
    }
    ChangeCategory(ActivityId, Date, CategoryId);
}

function findActivityObj(ActivityId)
{
    for (var index = 0; index < store.data.items.length; index++) {
        var ActivityObj = store.data.items[index].json;
        if (ActivityObj.Id == ActivityId)
            return ActivityObj;
    }
    return null;
}

function SelectActivityDate(ActivityId, isTimeChanged) {
    var ddlActivityAvailableDates = document.getElementById('ddlActivityAvailableDates_' + ActivityId);
    var selectedDate = ddlActivityAvailableDates.options[ddlActivityAvailableDates.selectedIndex].value;

    var activity = findActivityObj(ActivityId);

    if (activity.HasGroupingByHours) {
        var ddlTimes = document.getElementById('ddlActivityAvailableTimes_' + ActivityId);

        ddlTimes.style.display = '';

        if (isTimeChanged != 'true') {

                var dateTimes = null;
                while (ddlTimes.childNodes.length > 0) {
                    ddlTimes.removeChild(ddlTimes.childNodes[0]);
                }
                for (var optIndex = 0; optIndex < activity.Dates.length; optIndex++) {
                    var cdate = activity.Dates[optIndex];
                    if (selectedDate == cdate.Date) {
                        dateTimes = cdate.DateTimes;
                        break;
                    }
                }
                for (var i = 0; i < dateTimes.length; i++) {

                    ddlTimes.options[ddlTimes.options.length] = new Option(dateTimes[i].TimeFormatted, dateTimes[i].DateTime);
                    ddlTimes.selectedIndex = 0;
                }
        }

        selectedDate = ddlTimes.options[ddlTimes.selectedIndex].value;
    }

    // hide all - need to sped up
    var tbodys = document.getElementsByTagName('tbody');
    for (var i = 0; i < tbodys.length; i++) {
        if (tbodys[i].id.indexOf('tbody_' + ActivityId + '_') == 0) {
            tbodys[i].style.display = 'none';
            if (IsDetailsPage && TabName == "SeatingChart") {
                var PAdult = document.getElementById(tbodys[i].id + "_PAdult");
                if (PAdult) PAdult.style.display = 'none';
                var PChild = document.getElementById(tbodys[i].id + "_PChild");
                if (PChild) PChild.style.display = 'none';
            }
        }
    }
    
    // hide all club prices
    var divs = document.getElementsByTagName('div');
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].id.indexOf('clubprice_' + ActivityId + '_') == 0
            || divs[i].id.indexOf('pointsCost_' + ActivityId + '_') == 0
            || divs[i].id.indexOf('pointsAwarded_' + ActivityId + '_') == 0) 
        {
            divs[i].style.display = 'none';
        }
    }

    // show selected one
    var tbody = document.getElementById('tbody_' + ActivityId + '_' + selectedDate);
    tbody.style.display = '';
    if (IsDetailsPage && TabName == "SeatingChart") {
        var PAdult = document.getElementById(tbody.id + "_PAdult");
        if (PAdult) PAdult.style.display = '';
        var PChild = document.getElementById(tbody.id + "_PChild");
        if (PChild) PChild.style.display = '';
    }

    var clubprices = document.getElementById('clubprice_' + ActivityId + '_' + selectedDate);
    if (clubprices) {
        clubprices.style.display = '';
    }
    var pointsCostPrices = document.getElementById('pointsCost_' + ActivityId + '_' + selectedDate);
    if (pointsCostPrices) {
        pointsCostPrices.style.display = '';
    }
    var pointsAwardedPrices = document.getElementById('pointsAwarded_' + ActivityId + '_' + selectedDate);
    if (pointsAwardedPrices) {
        pointsAwardedPrices.style.display = '';
    }
    if (!activity.HasGroupingByHours) {
        // get the first category from the data source
        var categories = document.getElementsByName("Radio_" + ActivityId + "_" + selectedDate);
        for (var catIndex = 0; catIndex < categories.length; catIndex++) {
            if (catIndex == 0) {
                categories[catIndex].checked = true;
                ChangeCategory(ActivityId, selectedDate, categories[catIndex].value);

                if (IsDetailsPage && TabName == "SeatingChart") {
                    // Show seat control
                    showSeats(ActivityId, true, categories[catIndex].value, selectedDate, false);
                }
            }
            else {
                categories[catIndex].checked = false;
            }
        }
    }

}

function GoToCategory(Id) {
    // search for the page where this category activities starts
    // go to that page, then follow location in page, use #
    // time consuming - need smarter way
    // search in this page for activity with selected category
    pagingParams.counter = 0;
    pagingParams.pageIndex = 1;
    store.filterBy(pagingFilter);
    for (var pageIndex = 1; pageIndex <= pagingParams.getTotalPages(); pageIndex++) {
        var categoryFound = false;
        for (var index = 0; index < store.data.items.length; index++) {
            if (store.data.items[index].json.Category.Id == Id) {
                categoryFound = true;
                break;
            }
        }

        if (categoryFound) {
            ShowPage(pageIndex);
            break;
        }

        pagingParams.counter = 0;
        pagingParams.pageIndex = pageIndex + 1;
        store.filterBy(pagingFilter);
    }

    window.location.href = window.location.href.split("#")[0] + "#Category" + Id;
}

function IsFirstActivity(ActivityId, CategoryId) {
    for (var index = 0; index < store.data.items.length; index++) {
        var CatId = store.data.items[index].json.Category.Id;
        var ActId = store.data.items[index].json.Id;
        if (CategoryId == CatId) {
            if (ActId == ActivityId) return true;
            else return false;
        }
    }

    return false;
}

function IsLastActivity(ActivityId, CategoryId) {
    var IsLast = false;
    for (var index = 0; index < store.data.items.length; index++) {
        var CatId = store.data.items[index].json.Category.Id;
        var ActId = store.data.items[index].json.Id;
        if (CategoryId == CatId) {
            if (ActId == ActivityId) IsLast = true;
            else if (IsLast) {
                IsLast = false;
                break;
            }
        }
    }

    return IsLast;
}

function FixForUrlRewrite(str) {
    var myRegExp = new RegExp("\\s|:|\\\\|/|\\?|\"|<|>|&|\\.{1,5}|\'", "g");
    return str.replace(myRegExp, "-");
}

function SearchAvailability(actparams) {
    SearchForAvailability = true;
    SearchForAvailabilityInProgress = true;
    LoadActivitiesResults(actparams);
    SearchForAvailability = false;
}

function SimpleToolTip(Id, targetObjId, sourceObjId) {
    this.Id = Id;

    this.ie = document.all;
    this.ns6 = document.getElementById && !document.all;
    this.enabletip = false;
    this.targetObj = document.getElementById(targetObjId);
    this.sourceObj = document.getElementById(sourceObjId);

    this.offsetfromcursorX = 7;
    this.offsetfromcursorY = -(this.sourceObj.offsetHeight + 25);

    this.offsetdivfrompointerX = 13;
    this.offsetdivfrompointerY = 13;

    this.Init = function() {
        var Id = this.Id;
        this.targetObj.onmouseover = function() { eval(Id + ".ddrivetip()") };
        this.targetObj.onmouseout = function() { eval(Id + ".hideddrivetip()") };
        this.addOnMouseMoveEvent(function(e) { eval(Id + ".positiontip(e)") });
    }

    this.ietruebody = function() {
        return (document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
    }

    this.ddrivetip = function() {
        if (this.ns6 || this.ie) {
            this.enabletip = true;
            return false;
        }
    }

    this.positiontip = function(e) {
        if (this.enabletip) {
            var nondefaultpos = false;
            var curX = (this.ns6) ? e.pageX : event.clientX + this.ietruebody().scrollLeft;
            var curY = (this.ns6) ? e.pageY : event.clientY + this.ietruebody().scrollTop;
            //Find out how close the mouse is to the corner of the window
            var winwidth = this.ie && !window.opera ? this.ietruebody().clientWidth : window.innerWidth - 20;
            var winheight = this.ie && !window.opera ? this.ietruebody().clientHeight : window.innerHeight - 20;

            var rightedge = this.ie && !window.opera ? winwidth - event.clientX - this.offsetfromcursorX : winwidth - e.clientX - this.offsetfromcursorX;
            var bottomedge = this.ie && !window.opera ? winheight - event.clientY - this.offsetfromcursorY : winheight - e.clientY - this.offsetfromcursorY;

            var leftedge = (this.offsetfromcursorX < 0) ? this.offsetfromcursorX * (-1) : -1000;

            //if the horizontal distance isn't enough to accomodate the width of the context menu
            if (rightedge < this.sourceObj.offsetWidth) {
                //move the horizontal position of the menu to the left by it's width
                this.sourceObj.style.left = curX - this.sourceObj.offsetWidth + "px";
                nondefaultpos = true;
            }
            else if (curX < leftedge) {
                this.sourceObj.style.left = "5px";
            }
            else {
                //position the horizontal position of the menu where the mouse is positioned
                var scrollingCart = document.getElementById("scrollingCart");
                if (scrollingCart != null && scrollingCart.style.position == 'absolute') {
                    var absolutePos = (curX + this.offsetfromcursorX - this.offsetdivfrompointerX) - getLeft(scrollingCart);
                    this.sourceObj.style.left = absolutePos + "px";
                }
                else {
                    this.sourceObj.style.left = curX + this.offsetfromcursorX - this.offsetdivfrompointerX + "px";
                }
            }

            //same concept with the vertical position
            if (bottomedge < this.sourceObj.offsetHeight) {
                this.sourceObj.style.top = curY - this.sourceObj.offsetHeight - this.offsetfromcursorY + "px";
                nondefaultpos = true;
            }
            else {
                var scrollingCart = document.getElementById("scrollingCart");
                if (scrollingCart != null && scrollingCart.style.position == 'absolute') {
                    var absolutePos = (curY + this.offsetfromcursorY + this.offsetdivfrompointerY) - getTop(scrollingCart);
                    this.sourceObj.style.top = absolutePos + "px";
                }
                else {
                    this.sourceObj.style.top = curY + this.offsetfromcursorY + this.offsetdivfrompointerY + "px";
                }
            }
            this.sourceObj.style.visibility = "visible";
        }
    }

    this.hideddrivetip = function() {
        if (this.ns6 || this.ie) {
            this.enabletip = false;
            this.sourceObj.style.visibility = "hidden";
            this.sourceObj.style.top = "-1000px";
        }
    }

    this.addOnMouseMoveEvent = function(func) {
        var oldOnMouseMove = document.onmousemove;
        if (typeof document.onmousemove != 'function') {
            document.onmousemove = func;
        }
        else {
            document.onmousemove = function(e) {
                if (oldOnMouseMove) {
                    oldOnMouseMove(e);
                }
                func(e);
            }
        }
    }
}

var isIE = (navigator.userAgent.toLowerCase().indexOf("msie") == -1) ? false : true;
var isSafari = (isIE || navigator.userAgent.toLowerCase().indexOf("safari") == -1) ? false : true;
var isFF = (isIE || isSafari || navigator.userAgent.toLowerCase().indexOf("firefox") == -1) ? false : true;
var isOpera = (isIE || isSafari || isFF || navigator.userAgent.toLowerCase().indexOf("opera") == -1) ? false : true;

getTop = function(obj) {
    var pos = 0;

    if (isFF == true) {
        var arrUsedElements = new Array();
        var oInitialObj = obj;
    }

    if (obj.offsetParent) {
        while (obj.offsetParent) {
            if (obj.nodeName != "TR" || isSafari == false) {
                pos += obj.offsetTop - (obj.nodeName != "TR" ? obj.scrollTop : 0);
            } else {
                pos += obj.firstChild.offsetTop - obj.firstChild.scrollTop;
            }
            if (isIE || isOpera) {
                if (!isNaN(parseInt(obj.currentStyle.borderTopWidth))) {
                    pos += parseInt(obj.currentStyle.borderTopWidth);
                }

            }

            if (isFF == true) {
                arrUsedElements.push(obj);
            }
            obj = obj.offsetParent;
        }
    }
    else if (obj.y) {
        pos += obj.y;
    }

    if (isFF == true && arrUsedElements.length > 0) {
        obj = oInitialObj;
        while (obj.parentNode) {
            if (obj.nodeName == "DIV" && obj.style.position != "absolute" && obj.style.position != "relative" && obj.style.position != "fixed") {
                var bAlreadyUsed = false;
                for (var j = 0; j < arrUsedElements.length; j++) {
                    if (arrUsedElements[j] == obj) {
                        bAlreadyUsed = true;
                        break;
                    }
                }

                if (bAlreadyUsed == false) {
                    pos -= obj.scrollTop;
                }
            }

            obj = obj.parentNode;
        }
    }

    return pos;
}

getLeft = function(obj) {
    var pos = 0;

    if (isFF == true || isOpera == true) {
        var arrUsedElements = new Array();
        var oInitialObj = obj;
    }

    if (obj.offsetParent) {
        while (obj.offsetParent) {
            if (obj.nodeName != "TR" || isSafari == false) {
                pos += obj.offsetLeft - (obj.nodeName != "TR" ? obj.scrollLeft : 0);
            } else {
                pos += obj.firstChild.offsetLeft - obj.firstChild.scrollLeft;
            }

            if (isIE || isOpera) {
                if (!isNaN(parseInt(obj.currentStyle.borderLeftWidth))) {
                    pos += parseInt(obj.currentStyle.borderLeftWidth);
                }
            }

            if (isFF == true || isOpera == true) {
                arrUsedElements.push(obj);
            }

            obj = obj.offsetParent;
        }
    }
    else if (obj.x) {
        pos += obj.x;
    }

    if ((isFF == true || isOpera == true) && arrUsedElements.length > 0) {
        obj = oInitialObj;
        while (obj.parentNode) {
            if (obj.nodeName == "DIV" && obj.style.position != "absolute" && obj.style.position != "relative" && obj.style.position != "fixed") {
                var bAlreadyUsed = false;
                for (var j = 0; j < arrUsedElements.length; j++) {
                    if (arrUsedElements[j] == obj) {
                        bAlreadyUsed = true;
                        break;
                    }
                }

                if (bAlreadyUsed == false) {
                    pos -= obj.scrollLeft;
                }
            }

            obj = obj.parentNode;
        }
    }

    return pos;
}

function FloatTopDiv() {
    var startY = 30;
    var ns = (navigator.appName.indexOf("Netscape") != -1);
    var d = document;
    var scrollingCart = document.getElementById("scrollingCart");
    var loadedTop = getTop(scrollingCart);

    function ml(id) {
        var el = d.getElementById ? d.getElementById(id) : d.all ? d.all[id] : d.layers[id];
        if (d.layers) el.style = el;
        el.sP = function(y) {
            this.style.top = y;
        };
        el.y = startY;

        return el;
    }

    window.stayTopLeft = function() {
        var pY = ns ? pageYOffset : document.body.scrollTop;
        if (loadedTop - document.body.scrollTop < startY || loadedTop < scrollingCart.style.top.replace("px", "")) {
            scrollingCart.style.position = "absolute";
            ftlObj.y += (pY + startY - ftlObj.y) / 8;
            ftlObj.sP(ftlObj.y);
        }
        else {
            scrollingCart.style.position = "";
            loadedTop = getTop(scrollingCart);
        }

        setTimeout("stayTopLeft()", 10);
    }

    ftlObj = ml("scrollingCart");
    stayTopLeft();
}

function ShowMovie(VideoID) {
    for (var videoIndex = 0; videoIndex < moviesConstant.length; videoIndex++) {
        if (moviesConstant[videoIndex].VideoID == VideoID) {
            // set title
            document.getElementById("videoTitle").innerHTML = moviesConstant[videoIndex].Title;

            // set embeded movie
            var width = '398px';
            var height = '256px';
            var flashvars = {};
            var params = {
                allowFullScreen: true,
                allowscriptaccess: 'always'
            };

            swfobject.embedSWF(moviesConstant[videoIndex].Url, "movieHolder", width, height, "9.0.0",
	                    null, flashvars, params);

            break;
        }
    }
}

function createCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}

function EventAfterTabActivated(ActivityId, ActivityOptionId) {
    var ddlActivityAvailableDates = document.getElementById('ddlActivityAvailableDates_' + ActivityId);
    var SelectedDate = ddlActivityAvailableDates.options[ddlActivityAvailableDates.selectedIndex].value;
    ChangeCategory(ActivityId, SelectedDate, ActivityOptionId);
}

function showSeats(productID, isReadOnly, hotelRoomTypeID, date, showPassengers) {
    showSeatMap(
    {
        isReadOnly: isReadOnly,
        renderTo: 'divActivitySeatMap',
        productID: productID,
        hotelRoomTypeID: hotelRoomTypeID,
        date: date,
        showPassengers: showPassengers,
        onAfterTabActivated: EventAfterTabActivated,
        IsDetailsPage: true
    });

    CancelAsyncPostBack();
}

function ModifySearchParams() {
    ModifySearchParameters = true;
    LoadActivitiesResults();
    ModifySearchParameters = false;
}

function ProcessOptionSelection(tbBtn, maxGuestsPerPlan, ddlActivityAdultsId, ddlActivityChildsId, chkAddToCartId, trActivityErrorId) {
    var a = document.getElementById(ddlActivityAdultsId);
    var c = document.getElementById(ddlActivityChildsId);
    var b = document.getElementById(chkAddToCartId);
    var err = document.getElementById(trActivityErrorId);
    if (parseInt(a ? a.options[a.selectedIndex].value : 0) + parseInt(c ? c.options[c.selectedIndex].value : 0) <= maxGuestsPerPlan) {
        err.style.display = 'none';
        AddToCartButtonClick(tbBtn);
    } else {
        err.style.display = '';
    }
}
