
// we want to make sure that the hover state images don't need to load on the actual hover
var preload = [
    "/img/global/sitebar/link-hover-l.gif",
    "/img/global/sitebar/link-hover-r.gif",
    "/img/global/sitebar/dropdown-top.png",
    "/img/global/sitebar/dropdown-bottom.png",
    "/img/global/th3/subitem-bottom-border.gif"
];
setTimeout(function() {
    preload.each(function(img) {
        new Element('img', { 'src': (window.CRS) ? '/static'+img:img });
    });
}, 10);

document.observe('dom:loaded', function(e) {
    $$('ol#sitenav > li').each(function(el) {
        new Tablet.HoverElement(el, {hasActive:true, cssHover:true});
    });
    if ($('subnav')) {
        $$('ol#subnav li.hoverparent').each(function(el) {
            new Tablet.HoverElement(el);
        });
    }
    // this search thing is no longer here
    // var sitebar = $('sitebar');
    // if (sitebar) {
    //     var frm = sitebar.down('form.findlocation');
    //     if (frm) {
    //         var npt = frm.down('[name=ftl]');
    //         
    //         if (npt) {
    //             var sbmt = npt.next('input.hoverelement');
    //             if (sbmt) {
    //                 npt.observe('focus', function(e) {
    //                     sbmt.activate();
    //                 });
    //                 
    //                 npt.observe('blur', function(e) {
    //                     sbmt.deactivate();
    //                 });
    //             }
    //         }
    //     }
    // }
});

Tablet = Tablet || {};

Tablet.Ajaxificator = Class.create({
    initialize: function(link) {
        this.link = $(link);
        this.options = Object.extend({
            auth: false,
            handle401:false,
            beforeStart: function() {},
            ajaxOptions: {}
        }, arguments[1] || {});

        this.initializeEvents();
    },
    initializeEvents: function() {
        Event.observe(this.link, 'click', this.clickHandler.bind(this));
    },
    unloadEvents: function() {
        Event.stopObserving(this.link, 'click');
    },
    clickHandler: function(event) {
        this.options.beforeStart.apply(this, []);
        if (!this.options.auth) {
            this.ajaxHandler();
        } else {
            this.authHandler();
        }
        event.stop();
    },
    deniedHandler: function(resp) {
        var message = '';
        if (resp.headerJSON && resp.headerJSON.message) {
            message = resp.headerJSON.message;
        }
        // check for message back from server
        
        Tablet.EnterSite.pane.page('loginForm', {
            onShow:function() {
                var action = {action:this.ajaxHandler.bind(this), args:[this]};
                Tablet.EnterSite.setManeuver(null, action); // sending null will create one automatically
            }.bind(this),
            message:message
        });
    },
    ajaxHandler: function() {
        var respFunctions = {};
        if (this.options.handle401) {
            respFunctions = {
                on401:this.deniedHandler.bind(this),
                on403:this.deniedHandler.bind(this)
            };
        }
        var options = Object.extend(respFunctions, this.options.ajaxOptions);
        new Ajax.Request(
            this.link.href, 
            options
        );
    },
    authHandler: function() {
        // man there's a lot of binding going on here
        Tablet.EnterSite.isRecognized({
            onSuccess:this.ajaxHandler.bind(this),
            onDenied:function(resp) {
                var message = '';
                // check for message back from server
                
                Tablet.EnterSite.pane.page('loginForm', {
                    onShow:function() {
                        var action = {action:this.ajaxHandler.bind(this), args:[this]};
                        Tablet.EnterSite.setManeuver(null, action); // sending null will create one automatically
                    }.bind(this)
                });
            }.bind(this)
        });
    }
});

var emailBox;
// after content of layer is set, set behavior of form post
// function updateEmailForm() {
//     friendEmailForm = document.getElementById('friendEmailForm');
//     if (friendEmailForm) {
//         friendEmailForm.observe('submit', function(e) { processEmailForm(this); Event.stop(e); });
//     }
// }
// process form by ajax instead of normal behavior
function processEmailForm(emailForm) {
    new Ajax.Request(
        emailForm.getAttribute('action'),{
            method: 'post', 
            onSuccess: processEmailResponse.bindAsEventListener(this), 
            parameters:Form.serialize(emailForm, true)
        }
    );
  
  return false;
}
// call processInfo to reset content of email layer
function processEmailResponse(resp) {
    emailBox.setPageContent('emailpage', resp.transport.responseText);
}

document.observe('dom:loaded', function(e) {

    var shareLinks = $$('a.emailpage');
    if (shareLinks.size() > 0) {
        emailBox = new Tablet.Pane('', {
            pageReset: true
        });
        
        shareLinks.each(function(link) {
            link.observe('click', function(e) {

                new Ajax.Request(link.href, {
                    method:'get',
                    onSuccess:function(transport) {
                        emailBox.setContent(transport);
                        emailBox.show();
                    }
                });
            
                Event.stop(e);
            });
        });
    }
  
});

Tablet.PageTabs = Class.create({
    initialize:function(list) {
        this.list = list;
        this.options = Object.extend({
            onNewPage:null,
            onShowPage:null,
            hasActive:false,
            bookmarkable:false,
            useShim:false,
            pgPrefix:'pg-',
            pageContainer:null
        }, arguments[1] || {});
        this.shim = null;
        this.pages = $A();
        
        this.tabs = $A(list.getElementsByTagName('LI'));
        this.links = [];
        for (var j=0;j<this.tabs.length;j++) {
            var links = this.tabs[j].getElementsByTagName('A');
            for (var i=0;i<links.length;i++) {
                this.links.push(links[i]);
            }
        }
        
        var link, tabCount = this.tabs.size();
        for (var i=0;i<tabCount;i++) {
            tab = this.tabs[i];
            new Tablet.HoverElement(tab, {hasActive:this.options.hasActive});
            link = tab.down('a');
            if (link) {
                new Tablet.PageTabLink(link, this);
                var page = $(link.hash.replace('#', ''));
                if (page) {
                    if (!tab.hasClassName('active')) {
                        // not doing display:none because that messes with any google maps drawing
                        page.setStyle({position:'absolute', top:'-9999px', 
                            height:'10px', overflow:'hidden', display:'none'});
                    }
                    else {
                        // this is basically showing this page
                        if (typeof this.options.onNewPage === 'function') {
                            this.options.onNewPage(page);
                        }
                    }
                    this.pages.push(page);
                }
            }
        }
        
        var initPage = window.location.hash.replace('#', '').replace(
            this.options.pgPrefix, '');
        var pageLink;
        
        if (initPage.length > 0) {
            pageLink = this.links.find(function(el) {
                return el.hash.replace('#', '') == initPage;
            });
        }
        else if (this.links.length > 0) {
            pageLink = this.links[0];
        }
        
        if (this.options.useShim) {
            var shim = new Element('div', {'class':'shim'});
            var parent = this.options.pageContainer || this.list.parentNode;
            parent.insert(shim);
            this.shim = shim;
        }
        // if (pageLink) {
        //     this.showPage(pageLink, false);
        // }
    },
    activateTab: function(linkTab) {
        this.tabs.invoke('deactivate', 'active');
        linkTab.activate();
    },
    showPageContent: function(link, section) {
        var selected = this.pages.find(function(el) {
            return el.id == section;
        });
        
        if (selected && (selected.getStyle('display') === 'none' || selected.getStyle('position') === 'absolute')) {
            selected.setStyle({display:'block', opacity:'0', 
                position:'relative', left:'', top:'', height:'', overflow:'',
                zIndex:2});
            selected.removeClassName('staged');
            
            var targetEl = selected.down(link.hash);
            if (!targetEl && (this.list.viewportOffset()[1] < 0 || this.list.viewportOffset()[1] > (
                    document.viewport.getScrollOffsets()[1] + document.viewport.getHeight()))) {
                new Effect.ScrollTo(this.list, {offset:-20, duration:0.1});
            }
            
            new Effect.Appear(selected, {
                duration:0.4,
                afterFinish:function(e) {
                    if (targetEl && (targetEl.viewportOffset()[1] < 0 || 
                            targetEl.viewportOffset()[1] > (
                            document.viewport.getScrollOffsets()[1] + document.viewport.getHeight()))) {
                        new Effect.ScrollTo(targetEl, {offset:-20, duration:0.1});
                    }
                }
            });
        }
        
        if (this.shim) {
            this.shim.removeClassName('loading');
        }
        
        if (typeof this.options.onNewPage === 'function') {
            this.options.onNewPage(selected);
        }
        
        if (this.options.bookmarkable) {
            window.location.hash = this.options.pgPrefix + section;
        }
    },
    onNewContent: function() {
        var link = arguments[0];
        var section = arguments[1];
        var resp = arguments[2];
        if (resp.responseText) {
            if (this.options.pageContainer) {
                Element.insert(this.options.pageContainer, 
                    {top:resp.responseText});
            }
            else {
                Element.insert(this.list, {after:resp.responseText});
            }
            var page = $(section);
            if (page) {
                this.pages.push(page);
            }
            this.showPageContent(link, section);
        }
    },
    showPage: function(link, click) {
        if (typeof link === 'string') {
            link = this.links.find(function(el) {
                return (el.hash.replace('#', '') === link.replace('#', ''));
            });
        }
        if (typeof link === 'undefined' || !link) { return false; }
        click = (typeof click !== 'undefined') ? click : true;
        var section = link.hash.replace('#', '');
        var linkTab = link.up('li');
        if (this.tabs.indexOf(linkTab) < 0) {
            linkTab = null;
        }
        
        if (!linkTab) {
            var tabLink = this.links.find(function(el) {
                return el.hash.replace('#', '') === section;
            });
            
            if (tabLink) {
                linkTab = tabLink.up('li');
            }
            else {
                // we're dealing with a link to an element inside a page
                var el = $(section);
                if (el) {
                    var pg = el.up('div.page');
                    if (pg) {
                        section = pg.id;
                        tabLink = this.links.find(function(el) {
                            return el.hash.replace('#', '') === section;
                        });
                        if (tabLink) {
                            linkTab = tabLink.up('li');
                        }
                    }
                }
            }
        }
        
        if (linkTab && !linkTab.hasClassName('active') || !click) {
            this.activateTab(linkTab);
            // this.pages.invoke('setStyle', {position:'absolute', left:'-9000px'});
            this.pages.invoke('setStyle', {display:'none'});
            if (this.shim) {
                this.shim.addClassName('loading');
            }
            
            if ($(section)) {
                this.showPageContent(link, section);
            }
            else {
                if (this.shim) {
                    this.shim.addClassName('loading');
                }
                var getUrl = link.protocol + '//' + link.hostname + '/' + link.pathname.replace(/^\//gi, '') + link.search + '&bust=' + Tablet.buster();
                new Ajax.Request(getUrl, {
                    method:'get',
                    onSuccess:this.onNewContent.bind(this, link, section)
                });
            }
        }
    }
});

Tablet.PageTabLink = Class.create({
    initialize:function(link, pageTabs) {
        this.link = link;
        this.pageTabs = pageTabs;
        this.options = Object.extend({}, arguments[1] || {});
        this.handler = this.click.bind(this);
        Event.observe(this.link, 'click', this.handler);
    },
    click:function(e) {
        Event.stop(e);
        this.pageTabs.showPage(this.link, true);
    }
});
var Tablet = Tablet || {};
Tablet.Hotel = (function() {
    var map, guidemap, pageList, favoriteconfirm, sharelinks, pageTabs, pagelinks, 
        aboutLayer, guidessnapshot, tablettunes, rl, selectsort;
    var initMap = function() {
        if (data && data.hotels) {
            var hotel = data.hotels[0];
            map = new Tablet.Map('g_map', {
                controls:['smallzoom']
            });
            map.addPoint(hotel.latitude, hotel.longitude);
            var zoom = hotel.zoom || null;
            map.centerAndZoom(zoom);
        }
        else {
            $('g_map').remove();
        }
    };
    
    var initGuideMap = function() {
        if ($('guidemap') && data && data.hotels) {
            var hotel = data.hotels[0];
            guidemap = new Tablet.Map('guidemap');
            guidemap.addPoint(hotel.latitude, hotel.longitude, {importance:1});
            
            var recs = $A($('recommendations').getElementsByClassName('recommendation'));
            var lat, lng;
            recs.each(function(el, index) {
                lat = el.down('span.latitude').innerHTML;
                lng = el.down('span.longitude').innerHTML;
                guidemap.addPoint(lat, lng, index+1);
                el = null;
            });
            guidemap.centerAndZoom();
        }
    };
    
    var addAsFavorite = function(link) {
        new Ajax.Request(
            link.href,
            {
                method: 'post', 
                onSuccess:function(response) {
                    var hotel = link.parentNode.parentNode;
                    if (hotel) {
                        hotel.addClassName('favorite');
                    }
                    showFavoriteConfirm();
                },
                on401:function(response) {
                    // open login layer, on login, do something
                    Tablet.EnterSite.pane.page('loginForm', {
                        onShow:function() {
                            action = {action:addAsFavorite, args:[link]};
                            Tablet.EnterSite.setManeuver(null, action);
                        }
                    });
                }
            }
        );
    };
    
    var showFavoriteConfirm = function() {
        if (typeof favoriteconfirm === 'undefined') {
            favoriteconfirm = $('favoriteconfirm');
        }
        
        new Effect.Appear(favoriteconfirm, {duration:0.4});
        setTimeout(function() {
            new Effect.Fade(favoriteconfirm, {duration:0.4});
        }, 3000);
    };
    
    var initSlideOut = function(link, block, duration) {
        var moveLeft = 0;
        var effectDuration = 0.6;
        
        block.addClassName('sliding');
        moveLeft = block.offsetWidth;
        
        var unhideAt = (block.getDimensions()['width'] - 
            block.up().getDimensions()['width']);
        
        var slideOut = function(block, unhideAt) {
            new Effect.Morph(block, {
                style:{left:'-'+moveLeft+'px'},
                duration:effectDuration,
                afterUpdate:function(ef) {
                    if (unhideAt && (-ef.element.positionedOffset()[0]) > unhideAt) {
                        ef.element.setStyle({visibility:'visible'});
                        ef.element.addClassName('out');
                        unhideAt = false;
                    }
                }
            });
        };
        
        var slideIn = function(block, unhideAt) {
            new Effect.Morph(block, {
                style:{left:'0px'},
                duration:effectDuration,
                afterUpdate:function(ef) {
                    if (unhideAt && (-ef.element.positionedOffset()[0]) <= unhideAt) {
                        ef.element.setStyle({visibility:'hidden'});
                        ef.element.removeClassName('out');
                        unhideAt = false;
                    }
                }
            });
        };
        
        link.observe('click', function(e) {
            Event.stop(e);
            
            var blockLeft = block.getStyle('left');
            
            if (parseInt(blockLeft.replace('px')) < 0) {
                slideIn(block, unhideAt);
            }
            else {
                slideOut(block, unhideAt);
            }
        });
        
        var close = block.down('p.close a');
        if (close) {
            close.observe('click', function(e) {
                Event.stop(e);
                slideIn(block, unhideAt);
            });
        }
    };

    var attachEventToClass = function(klass, handler) {
        $A(document.getElementsByClassName(klass)).each(function(el) {
            Event.observe(el, 'click', handler);
            el = null;
        });
    };
    
    var shareWindows = {
        'facebook':'height=436,width=646',
        'delicious':'width=700,height=400',
        'linkedin':'width=520,height=570'
    };
    
    var openNewWindow = function(link) {
        var options = shareWindows[link.className] || '';
        if (options) {
            options = 'toolbar=0,status=0,scrollbars=yes,resizable=yes,' + options;
        }
        window.open(link.href,link.className,options);
        toggleShareLinks(true);
    };
    
    var toggleShareLinks = function(close) {
        sharelinks = sharelinks || $('sharelinks');
        if (close || sharelinks.visible()) {
            new Effect.Fade(sharelinks, {duration:0.4});
        }
        else {
            new Effect.Appear(sharelinks, {duration:0.4});
        }
    };
    
    var updateHelpfulCount = function(src, response) {
        if (src) {
            var parentLi = src.parentNode.parentNode;
            var helpful = parentLi.getElementsByClassName('helpful');
            if (helpful && helpful[0] && helpful[0].tagName === 'P') {
                helpful = helpful[0];
                var helpfulCount = Tablet.getElementByClassName(helpful, 'count', 'SPAN');
                var count;
                if (response.headerJSON) {
                    if (response.headerJSON.msg) {
                        helpful.update(response.headerJSON.msg);
                    }
                    else if (response.headerJSON.helpfulCount) {
                        count = response.headerJSON.helpfulCount;
                    }
                    else {
                        count = helpfulCount.innerHTML;
                        count = count + 1;
                    }
                }
                if (helpfulCount) {
                    helpfulCount.update(count);
                }
                if (helpful.hasClassName('empty')) {
                    helpful.setStyle({display:'none'});
                    helpful.removeClassName('empty');
                    new Effect.Appear(helpful, {duration:0.2});
                }
                helpful.addClassName('updated');
            }
        }
    };
    
    var activateHelpfulButtons = function() {
        $A(document.getElementsByClassName('helpful')).each(function(el) {
            if (el.tagName === 'A') {
                new Tablet.HoverElement(el);
                var onSuccess = function(response) {
                    updateHelpfulCount(this, response);
                }.bind(el);
                el.ajaxificator = new Tablet.Ajaxificator(el, {
                    handle401: true,
                    ajaxOptions: {
                        onSuccess: onSuccess 
                    }
                });
            }
            el = null;
        });
    };
    
    var initReviewContent = function() {
        rl = new Tablet.FilteredList('reviews', {
              formId:'reviewpaging',
              listId:'ol.itemlist',
              pagesId:'#reviews ol.pagelinks',
              pageNpt:'page',
              fading:true,
              bookmarkable:false,
              onRefresh:function() {
                  activateHelpfulButtons();
              }
          });

          selectsort = new Tablet.SelectBox('selectsort', {
              onItemSelect:function(e) {
                  Event.stop(e);
                  $('reviewpaging')['page'].value = 1;
                  rl.refresh();
                  return false;
              }
          });
          
          activateHelpfulButtons();
    };
    
    var initGuidesContent = function() {
        if (!guidemap) {
            Event.onGoogleLoad(initGuideMap);
        }
        if (!guidessnapshot) {
            guidessnapshot = $('guidessnapshot');
        }
        new Effect.Fade(guidessnapshot, {
            duration:0.4,
            afterFinish:function(e) {
                tablettunes.setStyle({display:'none'});
                tablettunes.addClassName('active');
                new Effect.Appear(tablettunes, {
                    duration:0.4
                });
            }
        });
    };
    
    return {
        init:function() {
            if (!hasFlash) {
                var splash = $('splash');
                splash.removeClassName('hasflash');
                splash.addClassName('static');
            }
            
            pageContainer = $('pages');
            pageList = Tablet.getElementByClassName(pageContainer.parentNode, 'pages', 'OL');
            if (pageList) {
                pageTabs = new Tablet.PageTabs(pageList, {
                    hasActive:true,
                    bookmarkable:false,
                    useShim:true,
                    pgPrefix:'',
                    pageContainer:pageContainer,
                    onNewPage:function(page) {
                        if (!tablettunes) {
                            tablettunes = Tablet.getElementByClassName($('complement'), 'tablettunes');
                        }
                        if (page.id === 'reviews') {
                            initReviewContent();
                        }
                        if (page.id === 'recommendations') {
                            initGuidesContent();
                        }
                        else if (guidessnapshot) {
                            // the only we want to hide the guides snapshot
                            // and show tablettunes is if we've done the reverse
                            new Effect.Appear(guidessnapshot, {
                                duration:0.4,
                                afterFinish:function(e) {
                                    new Effect.Fade(tablettunes, {
                                        duration:0.4
                                    });
                                }
                            });
                        }
                    }
                });
                pagelinks = $A(document.getElementsByClassName('pagelink')).select(function(el) {
                    return el.tagName === 'A';
                });
                pagelinks.each(function(el) {
                    // TODO: I kind of want to send the page that should be shown here too
                    new Tablet.PageTabLink(el, pageTabs);
                    el = null;
                });
            }
            
            var hash = location.hash.replace('#', '');
            if (hash !== '') {
                pageTabs.showPage(hash);
            }
            
            var code = $('entercode');
            if (code) {
                $A(code.getElementsByTagName('input')).each(function(el) {
                    if (el.getAttribute('type') === 'text') {
                        new Tablet.TextInput(el);
                    }
                });
            }
            
            attachEventToClass('addfavorite', function(e) {
                Event.stop(e);
                addAsFavorite(this);
            });

            attachEventToClass('printpage', function(e) {
                Event.stop(e);
                window.print();
            });
            
            attachEventToClass('sharepage', function(e) {
                Event.stop(e);
                toggleShareLinks();
            });
            
            sharelinks = $('sharelinks');
            if (sharelinks) {
                $A(sharelinks.getElementsByTagName('A')).each(function(el) {
                    Event.observe(el, 'click', function(e) {
                        Event.stop(e);
                        openNewWindow(this);
                    });
                });
            }
            
            var viewoffers = $('viewoffers');
            var specialoffers = $('specialoffers');
            
            if (viewoffers && specialoffers) {
                initSlideOut(viewoffers, specialoffers);
            }
            
            var viewplus = $A(document.getElementsByClassName('viewplus'));
            var plus = $('plusprivileges');
            
            if (viewplus && plus) {
                viewplus.each(function(link) {
                    initSlideOut(link, plus);
                });
            }
            
            var viewscoredetail = $('viewscoredetail');
            var hidescoredetail = $('hidescoredetail');
            var scoredetail = $('scoredetail');
            if (scoredetail) {
                if (viewscoredetail) {
                    Event.observe(viewscoredetail, 'click', function(e) {
                        Event.stop(e);
                        scoredetail.setStyle({display:'none'});
                        scoredetail.parentNode.addClassName('expand');
                        new Effect.Appear(scoredetail, {duration:0.4});
                    });
                }
                
                if (hidescoredetail) {
                    Event.observe(hidescoredetail, 'click', function(e) {
                        Event.stop(e);
                        new Effect.Fade(scoredetail, {
                            duration:0.4,
                            afterFinish:function(e) {
                                scoredetail.parentNode.removeClassName('expand');
                            }
                        });
                    });
                }
            }
            
            Event.onGoogleLoad(initMap);
            
            if ($('reviews')) {
                initReviewContent();
            }
            
            var reviewlinks = [];
            var recentreviews = $('recentreviews');
            if (recentreviews) {
                reviewlinks = reviewlinks.concat(
                    $A(recentreviews.getElementsByTagName('A')));
            }
            var helpfulreviews = $('helpfulreviews');
            if (helpfulreviews) {
                reviewlinks = reviewlinks.concat(
                    $A(helpfulreviews.getElementsByTagName('A')));
            }
            reviewlinks.each(function(el) {
                el = $(el);
                el.observe('click', function(e) {
                    Event.stop(e);
                    
                    if ($('reviews')) {
                        if (el.descendantOf(helpfulreviews)) {
                            selectsort.setValue('helpful');
                            rl.refresh();
                        }
                        else {
                            selectsort.setValue('recent');
                            rl.refresh();
                        }
                        pageTabs.showPage(el.hash.replace('#', ''));
                    }
                    else {
                        pageTabs.showPage(el);
                    }
                });
            });
            
            pagelinks = $A();
            var pagelist = $A(document.getElementsByClassName('pagelinks'));
            if (pagelist) {
                pagelist.each(function(list) {
                    $A(list.getElementsByTagName('A')).each(function(link) {
                        new Tablet.HoverElement(link.parentNode);
                        link = null;
                    });
                    list = null;
                });
            }
            
            var adjustText = $A(document.getElementsByClassName('adjusttext'));
            if (adjustText.size() > 0) {
                var contain;
                adjustText.each(function(el) {
                    contain = el.up('div.page');
                    
                    $A(el.getElementsByTagName('A')).each(function(link) {
                        // trying to get up to #glance
                        new Tablet.HoverElement(link, {
                            hasActive:true, 
                            cssHover:true
                        });
                        link.observe('click', function(e) {
                            Event.stop(e);
                            var newClass = '';
                            if (link.hasClassName('bigger')) {
                                contain.removeClassName('smaller');
                                contain.addClassName('bigger');
                            }
                            else {
                                contain.removeClassName('bigger');
                                contain.addClassName('smaller');
                            }

                        });
                    });
                    contain.addClassName('smaller');
                });
            };
            
            var aboutLink = $('aboutreviews');
            if (aboutLink) {
                aboutLayer = new Tablet.Pane('talkPreview');
                aboutLink.observe('click', function(e) {
                    Event.stop(e);
                    aboutLayer.show();
                });
            }
            
        }
    };
})();


document.observe('dom:loaded', function() {
    Tablet.Hotel.init();
});

var hasFlash = false;
if (typeof swfobject !== 'undefined') {
    if (swfobject.getFlashPlayerVersion().major > 0) {
        hasFlash = true;
    }
}