YAHOO.namespace('Local.Home');
YAHOO.Local.Home.Tabs = (function() {
    var _D = YAHOO.util.Dom;
    var _E = YAHOO.util.Event;
    var _U = YAHOO.Local.util;
    var tab_widget_synched = false;
    return {

        linkTabWidget: function(dom_el) {
            if(typeof dom_el == 'string') { 
                this.widget_root_id = dom_el;
            } else if(typeof dom_el == 'object' && dom_el.id) {
                this.widget_root_id = dom_el.id;
            } else {
                throw new Error(dom_el + ' is not a valid DOM object or id');
            }

            this.homeTabs = new YAHOO.widget.TabView(this.widget_root_id, {orientation:'right', activeIndex:0});
            _D.setStyle(_D.get('yls-hm-tabs-nav'), 'display', 'block');
            _D.setStyle([_D.get('top-tab-corner'), _D.get('bot-tab-corner')], 'visibility', 'visible');
            _D.get('yls-hm-tabs-wrap').removeChild(_D.get('tab-load'));
            _D.setStyle(_D.get('yls-hm-tabs-wrap'), 'opacity', 1);

            var _tabs = this.homeTabs.get('tabs');
            if(YAHOO.lang.isObject(_tabs)) {
                var _tabs_length = _tabs.length;
                for(var i=0; i< _tabs_length; i+=1) {
                    // add click handler to stop rotation
                    _tabs[i].on('click', this.tabClickHandler); 
                } 
                _tabs = _tabs_length = null;

                this.tab_widget_synched = true;
                this.addPauseControl();
                this.startCycle(this.ROTATION_INTERVAL);
                this.cycle_counter = 1;
            }

            var _content = _D.get('yls-hm-tabs-wrap');
            _E.on(_content, 'mouseover', this.contentMouseOverHandler);
            _E.on(_content, 'mouseout', this.contentMouseOutHandler);
            _content = null;
        },
        tabClickHandler: function(e) {
            var T = YAHOO.Local.Home.Tabs;
            if(T.cycle_id && T.pause_button.firstChild.nodeValue === YAHOO.Local.data.PAUSE_BUTTON_TEXT) {
                T.endCycle();
                T.pause_button.replaceChild(document.createTextNode(YAHOO.Local.data.RESUME_BUTTON_TEXT), T.pause_button.firstChild);
                _D.replaceClass(T.pause_button, 'pause', 'resume');
            }
            T = null;
        },
        contentMouseOverHandler: function(e) {
            _E.stopEvent(e);
            var T = YAHOO.Local.Home.Tabs;
            if(T.cycle_id) {
                T.endCycle();
            }
            T = null;
        },
        contentMouseOutHandler: function(e) {
            var _rel_el = _E.getRelatedTarget(e);
            var _tabs_nav = _D.get('yls-hm-tabs-nav');
            if(_D.isAncestor(this, _rel_el) || this === _rel_el) {
                return;
            }
            var T = YAHOO.Local.Home.Tabs;
            if(T.pause_button.firstChild.nodeValue === YAHOO.Local.data.PAUSE_BUTTON_TEXT) {
                if(T.cycle_counter <= T.MAX_CYCLES) {
                    T.startCycle(T.ROTATION_INTERVAL);
                }
            }
            T = null;
        },
        selectNextTab: function() {
            var T = YAHOO.Local.Home.Tabs;
            T.activeIndex = T.homeTabs.get('activeIndex');
            T.homeTabs.getTab(T.activeIndex).set('active', false);
            if(T.activeIndex < (T.homeTabs.get('tabs').length - 1)) {
                T.activeIndex += 1;
            } else {
                T.activeIndex = 0;
                T.cycle_counter++;
                //console.log(T.cycle_counter);
                if(T.cycle_counter >= T.MAX_CYCLES) {
                    T.endCycle();
                }
            }
            T.homeTabs.set('activeIndex', T.activeIndex);
            T = null;
        },
        addPauseControl: function() {
            var _pause_link = document.createElement('button');
            _pause_link.appendChild(document.createTextNode(YAHOO.Local.data.PAUSE_BUTTON_TEXT));
            _pause_link.id = 'yls-hm-tabs-pause';
            _D.addClass(_pause_link, 'tabgraphic');
            _D.addClass(_pause_link, 'pause');
            YAHOO.util.Event.on(_pause_link, 'click', this.pauseClickHandler);

            var _pause_em = document.createElement('em');
            _pause_em.className = 'tabgraphic';
            _pause_em.appendChild(_pause_link);
            
            var _pause_wrapper = document.createElement('div');
            _pause_wrapper.id = 'yls-hm-tabs-pause-wrap';
            _pause_wrapper.className = 'tabgraphic';
            _pause_wrapper.appendChild(_pause_em);

            YAHOO.util.Dom.get('yls-hm-tabs-nav').appendChild(_pause_wrapper);
            this.pause_button = _pause_link;
            _pause_em = _pause_link = _pause_wrapper = null;
        },
        pauseClickHandler: function(e) {
            YAHOO.util.Event.stopEvent(e);
            var T = YAHOO.Local.Home.Tabs;
            if(this.firstChild.nodeValue === YAHOO.Local.data.PAUSE_BUTTON_TEXT) {
                T.endCycle();
                this.replaceChild(document.createTextNode(YAHOO.Local.data.RESUME_BUTTON_TEXT), this.firstChild);
                _D.replaceClass(this, 'pause', 'resume');
            } else if(this.firstChild.nodeValue === YAHOO.Local.data.RESUME_BUTTON_TEXT) {
                if(T.cycle_counter <= T.MAX_CYCLES) {
                    T.selectNextTab(); 
                    T.startCycle(T.ROTATION_INTERVAL);
                }
                this.replaceChild(document.createTextNode(YAHOO.Local.data.PAUSE_BUTTON_TEXT), this.firstChild);
                _D.replaceClass(this, 'resume', 'pause');
            }
            T = null;
        },
        startCycle: function(delay) {
            this.cycle_id = window.setInterval(YAHOO.Local.Home.Tabs.selectNextTab, delay);
        },
        endCycle: function() {
            window.clearInterval(this.cycle_id);
        },
        destroy: function() {
            YAHOO.util.Event.removeListener(this.pause_button, 'click');
        }
    }
})();
YAHOO.Local.Home.Tabs.ROTATION_INTERVAL = 7000;
YAHOO.Local.Home.Tabs.MAX_CYCLES = 50;


/**
 * The Browse by Category tree. This expands and collapses the sub-categories when clicking on the toggle arrows.
 * @class Browse
 */
YAHOO.Local.Home.Browse = {

    toggleSubCat: function(e) {
        var el = YAHOO.util.Event.getTarget(e);
        var mainCat = el.parentNode;
        if (mainCat.tagName.toLowerCase() == 'li') {
            var subCat = mainCat.getElementsByTagName('ul')[0];
            if (YAHOO.util.Dom.getStyle(subCat, 'display') == 'none') {
                YAHOO.util.Dom.setStyle(subCat, 'display', 'block');
                YAHOO.util.Dom.replaceClass(el, 'yls-hm-cat-collapsed', 'yls-hm-cat-expanded');
            } else {
                YAHOO.util.Dom.setStyle(subCat, 'display', 'none');
                YAHOO.util.Dom.replaceClass(el, 'yls-hm-cat-expanded', 'yls-hm-cat-collapsed');
            }
        }
    },

    addEvent: function() {
        var self = this;
        YAHOO.util.Event.on(YAHOO.util.Dom.getElementsByClassName('yls-hm-cat-arrow', 'span', 'yls-hm-browse-rt'), 'click', function(e) { self.toggleSubCat(e); });
    }

};


YAHOO.namespace('Local.Results');
/**
 * Handles the Review pop-up in the listing content
 * @class ReviewMorePop
 */
YAHOO.Local.Results.ReviewMorePop = {
    reviewers: null,
    morereviews: null,
    handleClick: function(e) {
        YAHOO.util.Event.preventDefault(e);
        if (!YAHOO.lang.isObject(YAHOO.Local.Results.ReviewPop)) {
            YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, YAHOO.util.Event.getTarget(e));
            var arrUrls = [YAHOO.Local.data.REVIEW_POP.js, YAHOO.Local.data.REVIEW_POP.css];
            if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
                arrUrls.unshift(YAHOO.Local.data.YUI.connection);
            }
            var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.Results.ReviewPop');
            file.onComplete.subscribe(function(type, args, obj){
               YAHOO.Local.Results.ReviewPop.showFirstReviewDetails(obj);
            }, YAHOO.util.Event.getTarget(e));
        } else {
            YAHOO.Local.util.InProgress.destroy();
            YAHOO.Local.Results.ReviewPop.showReviewDetails(YAHOO.util.Event.getTarget(e));
        }
    },

    addEvents: function() {
        var self = this;
        this.reviewers = YAHOO.util.Dom.getElementsByClassName('reviewer-img', 'a', 'yls-hm-reviews');
        this.morereviews = YAHOO.util.Dom.getElementsByClassName('reviewer-more', 'a', 'yls-hm-reviews');

        YAHOO.util.Event.removeListener(this.reviewers, 'click');
        YAHOO.util.Event.removeListener(this.morereviews, 'click');
        YAHOO.util.Event.on(this.reviewers, 'click', function(e) { self.handleClick(e); } );
        YAHOO.util.Event.on(this.morereviews, 'click', function(e) { self.handleClick(e); } );

    }
};

/**
 * Loads ajaxmap .js file and renders map location
 * Expects external data (YAHOO.Local.data.MAP):  width, height, lat, lon, zoom
 * @method handleInteractiveMap
 */
YAHOO.Local.Home.Map = (function() {
    var _D = YAHOO.util.Dom;
    var _E = YAHOO.util.Event;

    var _data = {};
    var _link = _D.get('yls-hm-loadmap');
    var _nhood_link = _D.get('yls-hm-maps-nhoodlink');
    var _other_maps_link = _D.get('yls-hm-maps-otherlink');
    var _container = _D.get('yls-hm-map');
    /**
     * For IE only...changes the position style of the Tab container.
     * The container is set to relative by default in the CSS, so the 'Loading' DIV can
     * position itself accordingly. After the loading div has completed the positioning
     * doesn't really matter, so we replace the default setting of 'relative' to 'static'.
     * Relative was causing IE6/7 to not render the Find Nearby or View Map menus to
     * overlay on top of AJAX api.
     *
     * @see bug id 1417562
     * @method _fixIEPosition
     * @private
     */
    function _fixIEPosition() {
        var isIE = (navigator.userAgent.toLowerCase().indexOf('msie')!=-1);
        if (isIE) {
            YAHOO.util.Dom.setStyle('yls-hm-tabs-wrap', 'position', 'static');
        }
    }

    return {
        /**
         * Removes the static map from the features container. Also, removes the 'Load Map' button which triggered this method.
         * @removeStaticMap
         */
        removeStaticMap: function() {
            if (_D.inDocument('yls-hm-mapstatic')) {
                _container.removeChild(_D.get('yls-hm-mapstatic'));
            }
            _E.removeListener('yls-hm-loadmap', 'click');
            _D.get('yls-hm-loadmap').innerHTML = '';
        },

        /**
         * Creates an ajax map and then removes the static map
         * @renderDynMap
         */
        renderDynMap: function() {
            var map = new YMap(_container, YAHOO_MAP_REG, new YSize(_data.width, _data.height));
            map.addZoomShort();
            map.addTypeControl();
            map.drawZoomAndCenter(new YGeoPoint(_data.lat, _data.lon), _data.zoom);
            map.setZoomRange(1,10);
            map.addOverlay(new YMarker(map.getCenterLatLon(), new YImage('http://l.yimg.com/a/i/us/map/gr/str_ico_s.gif ',new YSize(22,22)))); 
            
            this.removeStaticMap();
        },

        /**
         * Loads the ajax maps api into the document. After loading these components, fetchInteractive  calls renderDynMap.
         * @method fetchInteractive
         */
        fetchInteractive: function() {
            var arrUrls = [];
            _data = YAHOO.Local.data['MAP'];
            YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, 'yls-hm-loadmap');

            //ajaxapi requires dragdrop
            if (!YAHOO.lang.isObject(YAHOO.util.DragDrop)) {
                arrUrls.push(YAHOO.Local.data.YUI.dragDrop);
            }
            arrUrls.push(_data.js);
            var file = new YAHOO.Local.util.loadFile(arrUrls, 'YahooMapsAPIAjax');
            file.onComplete.subscribe(function(){
                this.renderDynMap();
                YAHOO.Local.util.InProgress.destroy();
            }, this, true);

            _fixIEPosition();
        },


        showNHoods: function() {
            var _nhood_list = _D.get('yls-hm-maps-neighborhoods');
            var _map_container = _D.get('yls-hm-map');
            var _map_coords = [_D.getX('yls-hm-maps-nhoodlink'), _D.getY(_map_container)];

            var _display = _D.getStyle(_nhood_list, 'display');
            if(_display === 'none' || YAHOO.lang.isNull(_display)) {
                _D.setStyle(_D.getElementsByClassName('yls-hm-maps-submenu'), 'display', 'none');
                if(!YAHOO.lang.isObject(_D.get('nhood-close'))) {
                    var _nhood_close = document.createElement('li');
                    _nhood_close.id = 'nhood-close';
                    _nhood_close.appendChild(document.createTextNode(YAHOO.Local.data.CLOSE_TEXT));
                    _nhood_list.appendChild(_nhood_close);
                    _E.on(_nhood_close, 'click', this.showNHoods);
                    _nhood_close = null;
                }
                _D.setStyle(_nhood_list, 'display', 'block');
                _D.setStyle(_nhood_list, 'zIndex', '2');
            } else {
                _D.setStyle(_nhood_list, 'display', 'none');
                _D.setStyle(_nhood_list, 'zIndex', '1');
            }
            _D.setXY(_nhood_list, _map_coords);

            _nhood_list = _map_container = _map_coords = _display = null;
        },
        showOtherMapLinks: function(link_el) {
            var _other_list = _D.get('yls-hm-maps-other');
            var _linkX = _D.getX(link_el);
            var _map_container = _D.get('yls-hm-map');
            var _mapY = _D.getY(_map_container);

            var _display = _D.getStyle(_other_list, 'display');
            if(_display === 'none' || YAHOO.lang.isNull(_display)) {
                _D.setStyle(_D.getElementsByClassName('yls-hm-maps-submenu'), 'display', 'none');
                if(!YAHOO.lang.isObject(_D.get('other-close'))) {
                    var _other_close = document.createElement('li');
                    _other_close.id = 'other-close';
                    _other_close.appendChild(document.createTextNode(YAHOO.Local.data.CLOSE_TEXT));
                    _other_list.appendChild(_other_close);
                    var _showOther = function() {
                        YAHOO.Local.Home.Map.showOtherMapLinks(link_el);
                    }
                    _E.on(_other_close, 'click', _showOther);
                    _other_close = null;
                }
                _D.setStyle(_other_list, 'display', 'block');
                _D.setStyle(_other_list, 'zIndex', '2');
            } else {
                _D.setStyle(_other_list, 'display', 'none');
                _D.setStyle(_other_list, 'zIndex', '1');
            }
            _D.setXY(_other_list, [_linkX, _mapY]);

            _other_list = _linkX = _map_container = _mapY = _display = null;
        },
        handleClick: function(e, obj) {
            _E.stopEvent(e);
            obj.fetchInteractive();
        },
        handleNHoodClick: function(e, obj) {
            _E.stopEvent(e);
            obj.showNHoods();
        },
        handleOtherMapsClick: function(e, obj) {
            _E.stopEvent(e);
            var _target_el = _E.getTarget(e);
            obj.showOtherMapLinks(_target_el);
            _target_el = null;
        },
        attachClickHandlers: function() {
            _E.addListener(_link, 'click', this.handleClick, this);
            _E.addListener('yls-hm-mapstatic', 'mousedown', this.handleClick, this);
            _E.addListener(_nhood_link, 'click', this.handleNHoodClick, this);
            _E.addListener(_other_maps_link, 'click', this.handleOtherMapsClick, this);
        }
    }
})();

/**
 * Handles the find nearby container pop-up. 
 * NOTE: For performance reasons, we use YAHOO.util.loadFile to load external FindNearBy javascript file.
 * @method handleFindNearBy
 */
YAHOO.Local.Home.handleFindNearBy = function(e) {
    YAHOO.util.Event.stopEvent(e);
    if(!YAHOO.lang.isObject(YAHOO.Local.Detail.FindNearBy)) {
        var file = new YAHOO.Local.util.loadFile([YAHOO.Local.data.FIND_NEARBY.js, YAHOO.Local.data.FIND_NEARBY.css], 'YAHOO.Local.Detail.FindNearBy');
        file.onComplete.subscribe(function(){
            YAHOO.Local.Detail.FindNearBy.init();
            YAHOO.util.Dom.setStyle(YAHOO.util.Dom.getElementsByClassName('yls-hm-maps-submenu'), 'display', 'none');
            YAHOO.Local.Detail.FindNearBy.control();
            var _form = YAHOO.util.Dom.get('yls-dt-findnearby');
            var _y = parseInt(YAHOO.util.Dom.getStyle(_form, 'top'));
            YAHOO.util.Dom.setStyle(_form, 'top', (_y - 4) + 'px');
            _form.className = 'yls-hm-maps-submenu';
        });
    } else {
        YAHOO.Local.Detail.FindNearBy.control();
        var _form = YAHOO.util.Dom.get('yls-dt-findnearby');
        var _y = parseInt(YAHOO.util.Dom.getStyle(_form, 'top'));
        YAHOO.util.Dom.setStyle(_form, 'top', (_y - 4) + 'px');
    }
};


YAHOO.Local.Home.ChangeLocation = { 

    toggle: function(e) {
        YAHOO.util.Event.preventDefault(e);
        var containerId = 'yls-cc-cont';
        if (YAHOO.util.Dom.getStyle(containerId, 'display') == 'block') {
            this.hide();
        } else {
            this.show();
        }
    },

    verify: function(e) {
        var el = YAHOO.util.Event.getTarget(e);

        var input = YAHOO.util.Dom.get('yls-cc-input');
        if (input.value == YAHOO.Local.data['CHANGE_LOCATION']) {
            input.value = '';
            YAHOO.util.Dom.removeClass(input, 'yls-gl-srchform-ghost');
        } else {
            input.value = YAHOO.Local.data['CHANGE_LOCATION'];
            YAHOO.util.Dom.addClass(input, 'yls-gl-srchform-ghost');
        }

    },

    show: function() {
        var containerId = 'yls-cc-cont';
        var xy = [YAHOO.util.Dom.getRegion('yls-cc-btn').left, YAHOO.util.Dom.getRegion('yls-cc-btn').bottom];
        YAHOO.util.Dom.setStyle(containerId, 'display', 'block');
        YAHOO.util.Dom.setXY(containerId, xy);
    },

    hide: function() {
        var containerId = 'yls-cc-cont';
        YAHOO.util.Dom.setStyle(containerId, 'display', 'none');
        YAHOO.util.Dom.addClass(YAHOO.util.Dom.get('yls-cc-input'), 'yls-gl-srchform-ghost');
        YAHOO.util.Dom.get('yls-cc-input').value = YAHOO.Local.data['CHANGE_LOCATION'];
    },

    addEvent: function() {
        var self = this;
        YAHOO.util.Event.on(['yls-cc-btn', 'yls-cc-close'], 'click', function(e) { self.toggle(e); });
        YAHOO.util.Event.on(document.body, 'click', function(e) {
            var el = YAHOO.util.Event.getTarget(e);
            if (!YAHOO.util.Dom.isAncestor('yls-cc-cont', el) && el.id != 'yls-cc-btn' && el.id != 'yls-cc-cont') {
                self.hide();
            }
        });
        YAHOO.util.Event.on('yls-cc-input', 'focus', this.verify);
    }

};

YAHOO.Local.Home.initPage = function() {
    YAHOO.Local.util.initGlobalComponents();

    YAHOO.Local.Results.ReviewMorePop.addEvents();
    if(YAHOO.lang.isObject(YAHOO.util.Dom.get('yls-hm-tabs'))) {
        YAHOO.Local.Home.Tabs.linkTabWidget("yls-hm-tabs");
    }
    YAHOO.namespace('Local.Detail');
    YAHOO.util.Event.on('yls-dt-findnearbyhdr', 'click', YAHOO.Local.Home.handleFindNearBy);
    YAHOO.Local.Home.Map.attachClickHandlers();

    if(YAHOO.util.Dom.get('yls-hm-browse-rt')) {
        YAHOO.Local.Home.Browse.addEvent();
    }

    if (YAHOO.util.Dom.inDocument('yls-cc-input')) {
        YAHOO.Local.Home.ChangeLocation.addEvent();
    }
};

