﻿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() {
    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");
            ActivityAddToCart(ActivityId, ActivityOptionId, SelectedDate)
            break;
        }
    }
}

// activity cart list methods
function ActivityAddToCart(ActivityId, ActivityOptionId, SelectedDate) {
    var chkAddToCart = document.getElementById("chkAddToCart_" + ActivityId + "_" + ActivityOptionId + "_" + SelectedDate);
    if (!chkAddToCart.checked) {
        ActivityRemoveFromCart(ActivityId, ActivityOptionId, SelectedDate);
        return;
    }

    // get number of adults
    var ddlActivityAdults = document.getElementById("ddlActivityAdults_" + ActivityId);
    var NumberOfAdults = ddlActivityAdults.options[ddlActivityAdults.selectedIndex].value;
    // get number of children
    var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
    var NumberOfChildren = ddlActivityChilds.options[ddlActivityChilds.selectedIndex].value;

    // 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 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;
            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;
                            breakLoop = true;
                            break;
                        }
                    }
                }
                if (breakLoop) break;
            }
        }
        if (breakLoop) break;
    }

    ChangeAddToCartStyle(chkAddToCart);

    ShowActivityCartList(1, ActivityId, ActivityOptionId, SelectedDate, NumberOfAdults, NumberOfChildren, ActivityName, ActivityOptionName, Currency, PricePerAdult, PricePerChild, AdultAvailability, ChildAvailability, TaxPerAdult, TaxPerChild, LocalToSystemConversionRate, IsFreeSale, AdaptorInstanceName, CityName, UnitLabel, IsAdultChild, DiscountAmountPerAdult, DiscountAmountPerChild);
}

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 ActivityId = checkbox.getAttribute("ActivityId");
        var ddlActivityAdults = document.getElementById("ddlActivityAdults_" + ActivityId);
        var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
        ddlActivityAdults.disabled = checkbox.checked;
        ddlActivityChilds.disabled = checkbox.checked;
    }
}

function ShowActivityCartList(AddToCart, ActivityId, ActivityOptionId, SelectedDate, NumberOfAdults, NumberOfChildren, ActivityName, ActivityOptionName, Currency, PricePerAdult, PricePerChild, AdultAvailability, ChildAvailability, TaxPerAdult, TaxPerChild, LocalToSystemConversionRate, IsFreeSale, AdaptorInstanceName, CityName, UnitLabel, IsAdultChild, DiscountAmountPerAdult, DiscountAmountPerChild) {
    // 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'
	]
    });

    //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,
        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
    }, 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 chkAddToCart = document.getElementById('chkAddToCart_' + ActivityId + '_' + ActivityOptionId + '_' + SelectedDate);
        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_" + ActivityId);
                var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
                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'
	]
    });

    //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);
        }
    }
}

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++) {
        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 ddlActivityAdults = document.getElementById("ddlActivityAdults_" + ActivityId);
                var ddlActivityChilds = document.getElementById("ddlActivityChilds_" + ActivityId);
                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) {
    // 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 SelectActivityDate(ActivityId) {
    var ddlActivityAvailableDates = document.getElementById('ddlActivityAvailableDates_' + ActivityId);
    var selectedDate = ddlActivityAvailableDates.options[ddlActivityAvailableDates.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 = '';
    }
    
    // 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;
}
