/**
 * @fileoverview Provides methods for Yahoo! Local detail page
 * @namespace YAHOO.Detail
 */

YAHOO.namespace('Local.Detail');


/**
 * Handles the show/hide state of the 'Send To' container
 * @method handleSendTo
 * @param e {Event}: The mouse event
 */
YAHOO.Local.Detail.handleSendTo = function(e) {
        var el = YAHOO.util.Event.getTarget(e);
        var xy = [YAHOO.util.Dom.getRegion('yls-dt-sendto').left, YAHOO.util.Dom.getRegion('yls-dt-sendto').bottom];
        var container = YAHOO.util.Dom.get('yls-dt-sendopts');
        if (YAHOO.util.Dom.getStyle(container, 'display') == 'none' && el.id === 'yls-dt-sendto') {
              YAHOO.util.Dom.setStyle(container, 'display', 'block');
              YAHOO.util.Dom.setXY(container, xy);
        } else {
              YAHOO.util.Dom.setStyle(container, 'display', 'none');
        }
};


/**
 * Handles the creation of 'Send To Phone' container
 * @method handleSendToPhone
 * @param e {Event}: The mouse event to prevent browser default behavior
 */
YAHOO.Local.Detail.handleSendToPhone = function(e) {
    YAHOO.util.Event.preventDefault(e);
    YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, YAHOO.util.Dom.get('yls-dt-sendto'));
    if (!YAHOO.lang.isObject(YAHOO.Local.SendToPhone)) {
        var arrUrls = [YAHOO.Local.data.SEND_TO_PHONE.js, YAHOO.Local.data.SEND_TO_PHONE.css];
        if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
            arrUrls.push(YAHOO.Local.data.YUI.connection);
        }
        var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.SendToPhone');
        file.onComplete.subscribe(function(){
              YAHOO.Local.SendToPhone.create(YAHOO.Local.data.LISTING_ID, 'yls-dt-sendto');
        });
    } else {
        YAHOO.Local.SendToPhone.create(YAHOO.Local.data.LISTING_ID, 'yls-dt-sendto');
    }
};


/**
 * Hanldes the browser print prompt for 'Send to Printer'.
 * @method handleSendToPrinter
 * @param e {Event}: The mouse event
 */
YAHOO.Local.Detail.handleSendToPrinter = function(e) {
    YAHOO.util.Event.preventDefault(e);
    window.print();
};


/**
 * Handles the 'Save to Local' container pop-up.
 * YAHOO.util.loadFile to load external 'Save to Local' javascript and css file. 
 * @method handleSaveToLocal
 */
YAHOO.Local.Detail.handleSaveToLocal = function() {
    if (!YAHOO.Local.data['IS_LOGGEDIN']) {
        YAHOO.Local.Detail.Login.redirectToLogin('rsaved');
    }
    var el = YAHOO.util.Dom.get('yls-dt-save');
    if(!YAHOO.lang.isObject(YAHOO.Local.SaveToLocal)) {
        var arrUrls = [YAHOO.Local.data.SAVE_TO_LOCAL.js, YAHOO.Local.data.SAVE_TO_LOCAL.css];
        if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
            arrUrls.push(YAHOO.Local.data.YUI.connection);
        }
        if (!YAHOO.lang.isObject(YAHOO.util.Anim)) {
            arrUrls.push(YAHOO.Local.data.YUI.animation);
        }
        var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.SaveToLocal');
        file.onComplete.subscribe(function(){
            YAHOO.Local.SaveToLocal.create(YAHOO.Local.data.LISTING_ID, el, false, false);
        });
    } else {
        YAHOO.Local.SaveToLocal.create(YAHOO.Local.data.LISTING_ID, el, false, false);
    }
};


/**
 * Add events to the user recommend (thumbs up/down) buttons. 
 * YAHOO.util.loadFile to load external UserRecommend javascript file.
 * @method addUserRecommendEvent
 */
YAHOO.Local.Detail.addUserRecommendEvent = function() {
    var addEvent = function(el) {
        YAHOO.util.Event.on(el, 'click', function(e){
            if (!YAHOO.Local.data['IS_LOGGEDIN']) {
                location.href = YAHOO.Local.data['LOGIN_URL'];
                return;
            }
            var element = YAHOO.util.Event.getTarget(e);
            var arrUrls = [YAHOO.Local.data.USER_RECOMMEND.js];
               if(!YAHOO.lang.isObject(YAHOO.Local.UserRecommend)) {
                   if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
                       arrUrls.push(YAHOO.Local.data.YUI.connection);
                   }
                   var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.UserRecommend');
                   file.onComplete.subscribe(function(){
                       YAHOO.Local.UserRecommend.send(element);
                    });
               } else {
                   YAHOO.Local.UserRecommend.send(element);
               }
          });
    };
    //Grab all the active 'rc' (thumb) buttons and add event
    YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('yls-rc-active', 'span', 'yls-dt-content'), addEvent, 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.Detail.handleFindNearBy = function() {
    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.Local.Detail.FindNearBy.control();
        });
    } else {
        YAHOO.Local.Detail.FindNearBy.control();
    }
};


/**
 * Add event to the review's 'add comments' toggle. This enables the expand/collapse functionality.
 * AddComment also pulls the coreId container (from DOM Id 'ft') into the 'add comment' UI. When user 
 * is done with adding a comment, we move it back to DOM id 'ft'.
 * @class AddComment
 */
YAHOO.Local.Detail.AddComment = function() {
    /**
     * The container which we move coreId to 
     * @property _coreIdContainer
     * @type object
     * @private
     */
    var _coreIdContainer = null;
    /**
     * Returns the FORM element based from descendent 
     * @param el {DOM Element}: The descendent of FORM 
     * @method _getFormElement
     * @return {DOM Element || null}: the FORM element or null.  
     * @private
     */
    function _getFormElement(el) {
        while (!YAHOO.lang.isNull(el) && !YAHOO.lang.isUndefined(el.tagName) && el.tagName.toLowerCase() != 'form') {
            el = el.parentNode;
        }
        if (!YAHOO.lang.isNull(el) && YAHOO.lang.isUndefined(el.tagName)) {
            el = null;
        }
        return el;
    }


    return {
        /**
         * Moves the yIdSignDiv (core id container) back to its original parent.
         * @method moveCoreIdBack 
         */
        moveCoreIdBack: function() {
            var coreId = YAHOO.util.Dom.get('yIdSignDiv');
            if(!YAHOO.lang.isObject(coreId)) {return;} // so being signed out doesn't cause an error
            var parent = coreId.parentNode; //comment container
            if(coreId && parent.id != 'ft' && !YAHOO.Local.Detail.isCoreIdLocked) {
                var toggleContainer = coreId.parentNode.parentNode; //textarea container
                parent.removeChild(coreId);
                YAHOO.util.Dom.setStyle(coreId, 'display', 'none');
                YAHOO.util.Dom.get('ft').appendChild(coreId);
            }
        },
        /**
         * Move the yIdSignDiv (core id container) which appends itself to the _coreIdContainer 
         * @method moveCoreTo
         */
        moveCoreIdTo: function() {
            var coreId = YAHOO.util.Dom.get('yIdSignDiv');
            if(coreId && !YAHOO.Local.Detail.isCoreIdLocked) {
                var parent = coreId.parentNode;
                parent.removeChild(coreId);
                _coreIdContainer.appendChild(coreId);
                YAHOO.util.Dom.setStyle(coreId, 'display', 'block');
                var toggleContainer = coreId.parentNode.parentNode;
                YAHOO.util.Dom.setStyle(toggleContainer, 'display', 'block');
             }
        },
        /**
         * Moves the yIdSignDiv (core id container) back to its original parent.
         * @method changeBtnStateOn 
         * @param el {DOM Element} (optional): The 'add comment' DOM element we want to turn 'on'. If no el is passed, we loop thru all the 'add comment' links and turn them 'off'.
         */
        changeBtnStateOn: function(el) {
            if (el) {
                if(YAHOO.util.Dom.hasClass(el, 'yls-dt-addcommentoff')) {
                    YAHOO.util.Dom.replaceClass(el, 'yls-dt-addcommentoff', 'yls-dt-addcomment');
                } else {
                    YAHOO.util.Dom.replaceClass(el, 'yls-dt-addcomment', 'yls-dt-addcommentoff');
                }
            } else {
                var turnOff = function(el) { 
                    YAHOO.util.Dom.replaceClass(el, 'yls-dt-addcommentoff', 'yls-dt-addcomment');
                };
                YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('yls-dt-addcommentoff', 'span', 'yls-dt-content'), turnOff);
            }  
        },
        /**
         * Turns 'off' all 'add comment' buttons and move the yId container to 'ft' (to make sure the items are in their default state).
         * Then we determine which 'add comment' container to turn 'on' based on targeted mouse event.
         * @param e {Event}: The mouse event. 
         * @param self {Object}: Reference to this module 
         * @method toggle 
         */
        toggle: function(e, self) {
            YAHOO.util.Event.stopPropagation(e);
            var el = YAHOO.util.Event.getTarget(e);

            if (YAHOO.util.Dom.hasClass(el, 'yls-dt-addcomment') && !YAHOO.Local.data['IS_LOGGEDIN']) {
                YAHOO.Local.Detail.Login.redirectToLogin('comment', el.id, el.id + '-bm');
                return;
            }

            var parentFormEl = _getFormElement(el);
            var allCommentForms = YAHOO.util.Dom.getElementsByClassName('yls-dt-commentformbdy', 'div', 'yls-dt-reviews');

            if ((YAHOO.Local.Detail.AddComment.currentForm && YAHOO.util.Dom.isAncestor(YAHOO.Local.Detail.AddComment.currentForm, el) && el.tagName.toLowerCase() !== 'button') || YAHOO.util.Dom.isAncestor('yIdNicknameChanger_c', el) || YAHOO.util.Dom.isAncestor('yIdPhotoChooser_c', el) || (allCommentForms.length < 1)) {
                return;
            }

            YAHOO.util.Dom.setStyle(allCommentForms, 'display', 'none');

            if (parentFormEl && !YAHOO.util.Dom.hasClass(el, 'yls-dt-addcomment') || YAHOO.util.Dom.isAncestor('yIdNicknameChanger_c', el)) {
                //user clicked cancel button
                if(YAHOO.util.Dom.hasClass(el, 'yls-ac-cancel')) {
                    YAHOO.util.Event.preventDefault(e);
                    YAHOO.util.Dom.setStyle(el.parentNode, 'display', 'none');
                    self.changeBtnStateOn();
                } else if(YAHOO.util.Dom.hasClass(el, 'yls-dt-addcommentoff')) {
                    YAHOO.util.Event.stopEvent(e);
                    var _getCommentFormDiv = function(obj) {
                        while(obj.nextSibling) {
                            if(obj.nextSibling.nodeType === 1 && YAHOO.util.Dom.hasClass(obj.nextSibling, 'yls-dt-commentformbdy')) {
                                return obj.nextSibling;
                            } else {
                                obj = obj.nextSibling; 
                            }
                        }
                    };
                    var _comment_form = _getCommentFormDiv(el.parentNode);
                    YAHOO.util.Dom.setStyle(_comment_form, 'display', 'none');
                    self.changeBtnStateOn();
                    return;
                } else {
                    return;
                }
            }
            if (YAHOO.lang.isUndefined(self)) { //document.body clicked
                self = this;
            }

            self.moveCoreIdBack();
            self.changeBtnStateOn(false);
            _coreIdContainer = YAHOO.util.Dom.getElementsByClassName('yls-dt-coreidcont', 'div', parentFormEl)[0];
            _coreIdDiv = YAHOO.util.Dom.get('yIdSignDiv');
            //turn 'on' this comment form 
            if (_coreIdContainer && _coreIdDiv) {
                if (_coreIdDiv.parentNode!=_coreIdContainer && !YAHOO.util.Dom.hasClass(el, 'yls-ac-cancel') && parentFormEl) {
                    self.moveCoreIdTo();
                    self.changeBtnStateOn(el);
                    self.currentForm = _coreIdContainer.parentNode;
                }
            }
        },
        /**
         * Add click event to the 'add comment' butttons and document.body
         * @method addEvents 
         */
        addEvents: function() {
            var self = this;
            var addEvent = function(el) {
                YAHOO.util.Event.on(el, 'click', self.toggle, self);
            };
 
            //Grab all active comment 'cancel' buttons in the document and add event
            YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('yls-ac-cancel', 'button', 'yls-dt-content'), addEvent);

            //Grab all the 'add comment' buttons in the document and add event
            YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('yls-dt-addcomment', 'span', 'yls-dt-content'), addEvent);

            var addValidation = function(el) {
                YAHOO.util.Event.on(el, 'click', self.validateForm, self.getFormElement(el));
            };
            var addErrorRemoval = function(el) {
                YAHOO.util.Event.on(el, 'click', self.removeErrorMsg, self.getFormElement(el));
            };

            //Grab all form submit buttons and add validation
            YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('yls-gl-btnhlite', 'button', 'yls-dt-reviews'), addValidation);
            //Grab all form cancel buttons and add error removal 
            YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('yls-ac-cancel', 'button', 'yls-dt-reviews'), addErrorRemoval);

            YAHOO.util.Event.on(document.body, 'click', function(e) {
                YAHOO.util.Event.stopPropagation(e);
                self.toggle(e);
            });
        },

        getFormElement: function(el) {
            return _getFormElement(el);
        },

        validateForm: function(e, myForm) {
            YAHOO.util.Event.stopEvent(e);
            var self = myForm;
            if(self['comment'].value == '') {
                var textarea = self.getElementsByTagName('textarea')[0];
                var error_msgs = YAHOO.util.Dom.getElementsByClassName('yls-gl-error', 'p',  textarea.parentNode);
                var error_msg = (error_msgs.length > 0) ? error_msgs[0] : null;
                if(YAHOO.lang.isNull(error_msg)) {
                    error_msg = document.createElement('p');
                    YAHOO.util.Dom.addClass(error_msg, 'yls-gl-error');
                    YAHOO.util.Dom.addClass(error_msg, 'yls-gl-palette1');
                    textarea.parentNode.insertBefore(error_msg, textarea);
                }
                error_msg.innerHTML = YAHOO.Local.data.ADD_COMMENTS.ERROR_MSG;
                return;
            } else {
               // Make XHR to set CoreId (Only apply to IdPicker - State A)
               // If return 'ok' then continue submit
               // if not, then display error msg
                if (typeof(self['yIdAliasSelect']) != 'undefined') {
                    var _form_data = { 'yIdAliasSelect':self['yIdAliasSelect'].value, 'yIdNicknameInput':self['yIdNicknameInput'].value };
                    YAHOO.Local.util.updateCoreId(self, _form_data, function(oForm, _responseData) {
                        if (_responseData.status == 'OK') {
                            oForm.submit();
                        } else {
                            var oIdPicker = YAHOO.util.Dom.get('yIdSignDiv');
                            var error_msgs = YAHOO.util.Dom.getElementsByClassName('yls-gl-error', 'p',  oIdPicker.parentNode);
                            var error_msg = (error_msgs.length > 0) ? error_msgs[0] : null;
                            if (YAHOO.lang.isNull(error_msg)) {
                                error_msg = document.createElement('p');
                                YAHOO.util.Dom.addClass(error_msg, 'yls-gl-error');
                                YAHOO.util.Dom.addClass(error_msg, 'yls-gl-palette1');
                                oIdPicker.parentNode.insertBefore(error_msg, oIdPicker);
                            }
                            error_msg.innerHTML = _responseData.errormsg;
                        }
                    });
                } else {
                    self.submit();
                }
            }
        },

        removeErrorMsg: function(e, myForm) {
            var self = myForm; 
            var error_msgs = YAHOO.util.Dom.getElementsByClassName('yls-gl-error', 'p',  self.parentNode);
            var error_msg = (error_msgs.length > 0) ? error_msgs[0] : null;
            for (var i = 0; i < error_msgs.length; i++) {
                if (!YAHOO.lang.isNull(error_msgs[i])) {
                    error_msg.parentNode.removeChild(error_msgs[i]);
                }
            }
        },

        openComment: function(rvwid) {
            if(YAHOO.lang.isString(rvwid)) {
                var allCommentForms = YAHOO.util.Dom.getElementsByClassName('yls-dt-commentformbdy', 'div', 'yls-dt-reviews');
                YAHOO.util.Dom.setStyle(allCommentForms, 'display', 'none');

                var rvwlink = YAHOO.util.Dom.get(rvwid);
                if(YAHOO.lang.isArray(rvwlink)) {
                    rvwlink = rvwlink[rvwlink.length - 1];
                }

                var parentFormEl = _getFormElement(rvwlink);

                this.moveCoreIdBack();
                this.changeBtnStateOn(false);
                _coreIdContainer = YAHOO.util.Dom.getElementsByClassName('yls-dt-coreidcont', 'div', parentFormEl)[0];
                //turn 'on' this comment form 
                if (_coreIdContainer) {
                    if (!_coreIdContainer.hasChildNodes() && !YAHOO.util.Dom.hasClass(rvwlink, 'yls-ac-cancel') && parentFormEl) {
                        this.moveCoreIdTo();
                        this.changeBtnStateOn(rvwlink);
                        this.currentForm = _coreIdContainer.parentNode;
                    }
                }
            }
        }
    };
}();


/**
 * Handles the 'sort by' SELECT field for reviews. Reloads the current page with the new parameter (sortreviews=).
 * If 'sortreview' already exists in the url, we'll replace it with the new value (for clean-up purposes).
 * This way we don't get multiple 'sortreview' name/values in the address bar.
 * @method handleSortBy
 * @param e {Event}: The mouse event of the 'sort by' SELECT field
 */
YAHOO.Local.Detail.handleSortBy = function(e) {
    var el = YAHOO.util.Event.getTarget(e);
    var url = document.location + '';
    url = url.replace('#reviews','');
    var newUrl = '';
    var cgisep = (url.indexOf('?') >= 0) ? '&' : '?';
    var hasSortReview = (url.search(/[?|&]sortreviews=/i) != '-1');
    if (el.value) {
        if (!hasSortReview) {
            newUrl = url + cgisep+'sortreviews=' + el.value;
        } else {
            newUrl = url.replace(/([?|&])sortreviews=[0-9]/i, "$1sortreviews=" + el.value);
        }
        newUrl = newUrl.replace(/[?|&]from=[0-9]+/i, '');
        document.location.href = newUrl + '#reviews';
    }
};

/**
 * Loads add-tag.js, connection.js and displays the add tag form
 * @method handleAddTag
 */
YAHOO.Local.Detail.handleAddTag = function() {
    if (!YAHOO.Local.data['IS_LOGGEDIN']) {
        YAHOO.Local.Detail.Login.redirectToLogin('addtags');
    }
    var arrUrls = [];
    YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, 'yls-dt-addtag');
    //add tag requires yui connection
    if (!YAHOO.lang.isObject(YAHOO.Local.AddTag)) {
        if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
            arrUrls.push(YAHOO.Local.data.YUI['connection']);
        }
        arrUrls.push(YAHOO.Local.data['ADD_TAG'].js);
        var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.AddTag');
        file.onComplete.subscribe(function(){
            YAHOO.Local.AddTag.show();
            YAHOO.Local.util.InProgress.destroy();
        });
    } else {
        YAHOO.Local.AddTag.show();
        YAHOO.Local.util.InProgress.destroy();
    }
};




/**
 * Loads add-tag.js, connection.js and deletes the 'clicked' tag 
 * @method handleAddTag
 */
YAHOO.Local.Detail.handleDeleteTag = function(e) {
    YAHOO.util.Event.stopEvent(e);
    var closeEl = YAHOO.util.Event.getTarget(e);
    var tagEl = YAHOO.util.Dom.get(closeEl.id.replace(/yls-dt-tags-x/,'yls-dt-tags-tag'));
    var arrUrls = [];
    YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, 'yls-dt-addtag');
    //add tag requires yui connection
    if (!YAHOO.lang.isObject(YAHOO.Local.AddTag)) {
        if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
            arrUrls.push(YAHOO.Local.data.YUI['connection']);
        }
        arrUrls.push(YAHOO.Local.data['ADD_TAG'].js);
        var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.AddTag');
        file.onComplete.subscribe(function(){
            YAHOO.Local.AddTag.deleteTag(tagEl, closeEl);
            YAHOO.Local.util.InProgress.destroy();
        });
    } else {
        YAHOO.Local.AddTag.deleteTag(tagEl, closeEl);
        YAHOO.Local.util.InProgress.destroy();
    }
};


YAHOO.Local.Detail.handleAddPhotos = function(e) {
    var arrUrls = [];
    YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, 'yls-dt-addphoto');
    //add photos requires yui connection
    if (!YAHOO.lang.isObject(YAHOO.Local.Photos)) {
        if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
            arrUrls.push(YAHOO.Local.data.YUI['connection']);
        }
        arrUrls.push(YAHOO.Local.data['ADD_PHOTOS'].js);
        var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.Photos');
        file.onComplete.subscribe(function(){
            YAHOO.Local.util.InProgress.destroy();
        });
    } else {
        YAHOO.Local.Photos.dialog.show();
        YAHOO.Local.util.InProgress.destroy();
    }
};

/**
 * This checks for YAHOO.Local.Reviews, NOT YAHOO.Local.Detail.Reviews, which is for the "first review" form
 */
YAHOO.Local.Detail.handleWriteReview = function() {
    if(YAHOO.Local.data.IS_LOGGEDIN) {
        var arrUrls = [];
        YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, 'yls-dt-writereview');
        if (!YAHOO.lang.isObject(YAHOO.Local.Reviews)) {
            if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
                arrUrls.push(YAHOO.Local.data.YUI['connection']);
            }
            arrUrls.push(YAHOO.Local.data['WRITE_REVIEW'].js);
            var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.Reviews');
            file.onComplete.subscribe(function(){
                //console.log('Photos JS loaded');
                YAHOO.Local.util.InProgress.destroy();
            });
        } else {
            YAHOO.Local.Reviews.showDialog();
            YAHOO.Local.Reviews.checkEdit();
            YAHOO.Local.util.InProgress.destroy();
        }
    } else {
        if(!YAHOO.util.Dom.inDocument('yls-dt-reviewform-first') && !YAHOO.util.Dom.inDocument('yls-dt-noreview')) {
            YAHOO.Local.Detail.Login.redirectToLogin('review');
        } else {
            YAHOO.Local.Detail.Login.redirectToLogin();
        }
    }
};



/**
 * Lock for Core Id modules
 */
YAHOO.Local.Detail.isCoreIdLocked = false;


/**
 * When a user is not logged in and they try to access a pop up (which requires them to be signed in),
 * we redirect them to login.yahoo.com and add a 'open=<popup name>' to .done via redirectToLogin method. After the user has logged in,
 * they get redirected back to us. At this point, Local.data['OPEN'] gets defined via PHP. If it is defined,
 * we call openPopUp method, to reopen the pop up the user previously clicked on.
 *
 * @class Login 
 */
YAHOO.Local.Detail.Login = {
    /**
     * Redirects to login url with 'open' appended to URL
     * @param openType {String}: The 'open' value or module name we want to open.
     * @method redirectToLogin
     */
    redirectToLogin: function(openType) {
        //determine correct deliminator if query string exists
        var deliminator = (location.search) ? '&' : '?'; 

        if(arguments.length > 1) {
            location.href = YAHOO.Local.data['LOGIN_URL'] + encodeURIComponent(deliminator + 'open=' + openType + '&review_id=' + arguments[1] + '#' + arguments[2]);
        } else if(arguments.length > 0) {
            location.href = YAHOO.Local.data['LOGIN_URL'] + encodeURIComponent(deliminator + 'open=' + openType + '#' + openType);
        } else {
            location.href = YAHOO.Local.data['LOGIN_URL'];
        }
        return;
    },

    /**
     * This function tests which module we want to open and calls the correct method.
     * @method openPopUp
     */
    openPopUp: function(openType) {
        switch (openType) {
            case 'addtags':
                YAHOO.Local.Detail.handleAddTag();
                break;
            case 'rsaved':
                YAHOO.Local.Detail.handleSaveToLocal();
                break;
            case 'review':
                YAHOO.Local.Detail.handleWriteReview();
                break;
            case 'photo':
                YAHOO.Local.Detail.handleAddPhotos();
                break;
            case 'comment':
                YAHOO.Local.Detail.AddComment.openComment(YAHOO.Local.data['OPEN_ID']);
                break;
            default:
                // do nothing
                break;
         }
    }
};

/**
 * The view changes link when the business info has been changed by the community.
 * @class ViewChanges
 */
YAHOO.Local.Detail.ViewChanges = {

    submitVote: function(e) {
        YAHOO.util.Event.stopEvent(e);
        var _agree_form = this.parentNode;
        var _agree_data = this.id.split(':');
        var _form_data = '?user_vote.php?src=' + _agree_data[0] + '&src_id=' + _agree_data[1] + '&agree=' + _agree_data[2] + '&gid=' + _agree_data[3];
        var _method = 'GET';
        var _action = _agree_form.getAttribute('action') + '?yws_path=' + encodeURIComponent(_form_data); 

        var _success = function(obj) {
            var _msg = document.createElement('p');
            _msg.appendChild(document.createTextNode(YAHOO.Local.data.CORRECTION_RESPONSE));
            obj.argument.parentNode.replaceChild(_msg, obj.argument);    
            _msg = null;
        };
        var _failure = function(obj) { 
            var _msg = document.createElement('p');
            _msg.appendChild(document.createTextNode(YAHOO.Local.data.CORRECTION_ERROR));
            _msg.className = 'yls-gl-error';
            obj.argument.parentNode.insertBefore(_msg, obj.argument);    
            _msg = null;
        };
        var _callback = {
            success: _success,
            failure: _failure,
            argument: _agree_form
        };

        var cObj = new YAHOO.Local.util.requestObject(_method, _action, _callback);
    },

    toggle: function(e) {
        var el = YAHOO.util.Event.getTarget(e);
        var container = YAHOO.util.Dom.get('yls-dt-viewchanges-cont');
        if (YAHOO.util.Dom.getStyle(container, 'display') == 'none' && el.id == 'yls-dt-viewchanges') {
            var y = YAHOO.util.Dom.getRegion('yls-dt-viewchanges').bottom + 5;
            YAHOO.util.Dom.setStyle(container, 'display', 'block');
            YAHOO.util.Dom.setY(container, y);

            var buttons = container.getElementsByTagName('button');
            var len = buttons.length;
            for(var i = 0; i < len; i++) {
                var click_handler = YAHOO.util.Event.getListeners(buttons[i], 'click');
                if(!click_handler) {
                    YAHOO.util.Event.on(buttons[i], 'click', YAHOO.Local.Detail.ViewChanges.submitVote); 
                }
                click_handlers = null;
            }
            buttons = len = null;
        } else {
            YAHOO.util.Dom.setStyle(container, 'display', 'none');
        }
    }

};


YAHOO.Local.Detail.UpdateBiz = {
	
    isMapView: false,
    container: YAHOO.util.Dom.get('yls-dt-updatebiz-cont'),

    hide: function() {
        YAHOO.util.Dom.setStyle(this.container, 'display', 'none');
    },

    show: function() {
	var self = this;
	var containerParent = this.container.parentNode;
	if(containerParent.id != 'yls-gl-pg' && ! self.isMapView){
            containerParent.removeChild(this.container);
            YAHOO.util.Dom.get('yls-gl-pg').appendChild(this.container);
        }
        var xy = [YAHOO.util.Dom.getRegion('yls-dt-edit').left, YAHOO.util.Dom.getRegion('yls-dt-edit').bottom];
        YAHOO.util.Dom.setStyle(this.container, 'display', 'block');
        YAHOO.util.Dom.setXY(this.container, xy);
    },

    toggle: function() {
        var container = YAHOO.util.Dom.get('yls-dt-updatebiz-cont');
        if (YAHOO.util.Dom.getStyle(container, 'display') === 'none') {
            this.show();
        } else {
            this.hide();
        }
    },

    addEvent: function(isMapView) {
        var self = this;
	self.isMapView = isMapView;
        YAHOO.util.Event.on(['yls-dt-edit', 'yls-dt-updatebiz-close'], 'click', function(e) { 
            YAHOO.util.Event.preventDefault(e);
            self.toggle();
        });
    }
};

/**
 * Toggles the 'Add info here' container located in the overview section of detail page.
 * @class AddInfo
 */
YAHOO.Local.Detail.AddInfo = {

    isMapView: false,
    container: YAHOO.util.Dom.get('yls-dt-addinfo-cont'),

    hide: function() {
        YAHOO.util.Dom.setStyle(this.container, 'display', 'none');
    },

    show: function(trigger) {
	var self = this;
	var containerParent = this.container.parentNode;
        if(containerParent.id != 'yls-gl-pg' && ! self.isMapView){
            containerParent.removeChild(this.container);
            YAHOO.util.Dom.get('yls-gl-pg').appendChild(this.container);
        }
        var xy = [YAHOO.util.Dom.getRegion(trigger).left, YAHOO.util.Dom.getRegion(trigger).bottom];
        YAHOO.util.Dom.setStyle(this.container, 'display', 'block');
        YAHOO.util.Dom.setXY(this.container, xy);
    },

    toggle: function(e) {
        var trigger = YAHOO.util.Event.getTarget(e);
        var container = YAHOO.util.Dom.get('yls-dt-addinfo-cont');
        if (YAHOO.util.Dom.getStyle(container, 'display') === 'none') {
            this.show(trigger);
        } else {
            this.hide();
        }
    },

    addEvent: function(isMapView) {
        var self = this;
	self.isMapView = isMapView;
        YAHOO.util.Event.on(['yls-dt-addinfo-sub', 'yls-dt-addinfo', 'yls-dt-addinfo-close'], 'click', function(e) {
            YAHOO.util.Event.preventDefault(e);
            self.toggle(e);
        });
    }
};




/**
 * Generic delete confirmation (TODO: Replace DeleteCollection/DeleteItem functions with call to this) 
 */
YAHOO.Local.Detail.Confirm = {
    /**
     * Creates confirmation dialog
     * @method createConfDialog
     * @param dataObjRef  The reference to the messages in YAHOO.Local.data JSON obj in page  
     */
    createConfDialog: function(e, dataObjRef) {
        YAHOO.util.Event.stopEvent(e);

        var dialogHTML = function() {
            var data = YAHOO.Local.data[dataObjRef];
            var a = ['<h4>', data.HEADER, '</h4>', '<p>', data.MESSAGE, '</p>', '<button type="submit" id="yls-dt-confirm-submit" class="yls-gl-btnhlite">', data.BUTTON_TEXT[0], '</button><button class="yls-gl-btn" id="yls-dt-confirm-cancel">', data.BUTTON_TEXT[1], '</button>'];
            return a.join(' ');
        };

        var container = YAHOO.util.Dom.get('yls-dt-confirm-dialog'); 
        if(!YAHOO.lang.isObject(container) || container.tagName.toLowerCase() !== 'div') {
            container = document.createElement('div');
            container.id = 'yls-dt-confirm-dialog';
        }
        container.innerHTML = dialogHTML();

        var xy = [YAHOO.util.Dom.getRegion(this).left, YAHOO.util.Dom.getRegion(this).bottom];
        YAHOO.util.Dom.addClass(container, 'yls-gl-litebox');
        YAHOO.util.Dom.addClass(container, 'yls-dt-conf-cont'); 
        YAHOO.util.Dom.get('yls-gl-pg').appendChild(container);
        YAHOO.util.Dom.setXY(container, xy);

        YAHOO.util.Event.on('yls-dt-confirm-cancel', 'click', function() {
            YAHOO.Local.Detail.Confirm.destroyConfDialog();
        });
        YAHOO.util.Event.on('yls-dt-confirm-submit', 'click', function(e, link_el) {
            window.location.replace(link_el.href);
        }, this);
        container = null;
        YAHOO.util.Event.on(document.body, 'click', function() {
            YAHOO.Local.Detail.Confirm.destroyConfDialog();
        });
    },
    /**
     * Generic delete confirmation (TODO: Replace DeleteCollection/DeleteItem functions with call to this) 
     * @method destroyConfDialog
     */
    destroyConfDialog: function() {
        var container = YAHOO.util.Dom.get('yls-dt-confirm-dialog'); 
        if(YAHOO.lang.isObject(container) && container.tagName.toLowerCase() === 'div') {
            YAHOO.util.Event.purgeElement(container, true);
            container.parentNode.removeChild(container);
        }
        container = null; 
    }
};

/* BEGIN In-page Review Code */
// TODO: Should be included in either global.js or details.js?
(function() {
    // IE6-specific code to eliminate background image flicker
    if( document.uniqueID && !window.XMLHttpRequest && document.execCommand ){
        YAHOO.util.Event.addListener(window,'load',function(){    
            try { 
                document.execCommand("BackgroundImageCache", false, true); 
            } catch(e) {}
        });
    }
})();

/**
* RateReview encapsulates Rating and Reviewing 
* @module ratereview
* @title RateReview
* @requires yahoo, dom, event, dialog, Local.util
*/
YAHOO.namespace('Local.RateReview');

/**
 * Helper function to parse the integer from the className
 * @method   getEndingInt
 * @param    str {String} The classname (or other string) from which a valid integer should be extracted
 * @returns  {Integer}
 */
YAHOO.Local.RateReview.getEndingInt = function(str) {
    var _len = str.length;
    var _tmp_str = '';
    for(var i = _len - 1; i >= 0; i-=1) {
        var _char = str.charAt(i);
        if(YAHOO.lang.isNumber(parseInt(_char))) {
            _tmp_str = _char + _tmp_str; 
        }
    }
    _len = null;
    return parseInt(_tmp_str);
};

/**
 * Helper function to remove '+' when decoding URIs
 * @method   decodeURI
 * @param    enc_str {String} The encoded string
 * @returns  enc_str {String} The decoded string
 */ 
YAHOO.Local.RateReview.decodeURI = function(enc_str) {
    enc_str = enc_str.replace(/\+/g,' ');
    enc_str = decodeURIComponent(enc_str);
    return enc_str;
};

/**
* RateObj creates a rating object for inclusion on a page.  Many may be instantiated.
* <pre>
* var myRateObj = new YAHOO.Local.RateObj('yls-rr-rate');
* </pre>
* @namespace YAHOO.Local.RateReview
* @constructor
* @param {String} root_el        The element ID representing the module <em>OR</em> 
* @param {HTMLElement} root_el   The element object representing the module
*/
YAHOO.Local.RateReview.RateObj = function(root_el) {
    // PRIVATE members for shortcuts
    var _D = YAHOO.util.Dom;
    var _E = YAHOO.util.Event;

    if(typeof root_el === 'string') {
        this.root_el = _D.get(root_el);
    } else {
        this.root_el = root_el;
    }
    this.head = _D.getElementsByClassName('hd', 'div', this.root_el);
    this.star_block = _D.getElementsByClassName('star-block', 'fieldset', this.root_el)[0];

    // Cache objects to keep current and last classes for easy access
    this.cached_click = {star:'star0', head:'default'};
    this.cached_hover = {star:'star0', head:'default'};

    _D.addClass(this.star_block, this.cached_click.star);
    _D.addClass(this.head, this.cached_click.head);

    var _radio_buttons = this.star_block.getElementsByTagName('input');
    _D.generateId(_radio_buttons);  // to avoid naming conflicts when many rate objects are on a page

    var _labels = this.root_el.getElementsByTagName('label');
    var _labels_length = _labels.length;
    this.labels = {};
    for(var i = 0; i < _labels_length; i += 1) {
        _labels[i].htmlFor = _radio_buttons[i].id;
        this.labels['star' + (i + 1)] = _labels[i];
    }
    _labels = _labels_length = null;
    _radio_buttons = null;

    // attach handlers to this instance's block of stars
    _E.on(this.star_block, 'mouseover', this.mouseOverHandler, this, true);
    _E.on(this.star_block, 'mouseout', this.mouseOutHandler, this, true);
    _E.on(this.star_block, 'click', this.clickHandler, this, true);
};

// Shared instance methods
YAHOO.Local.RateReview.RateObj.prototype = {
    // [EVENT HANDLERS]
    mouseOverHandler: function(e) {
        var _E = YAHOO.util.Event;
        _E.stopEvent(e);
        var target_el = _E.getTarget(e, true);
        this.mouseOver(target_el);
        _E = target_el = null;
    },
    mouseOutHandler: function(e) {
        var _E = YAHOO.util.Event;
        _E.stopEvent(e);
        var related_el = _E.getRelatedTarget(e, true);
        this.mouseOut(related_el);
        _E = related_el = null;
    },
    clickHandler: function(e) {
        var _E = YAHOO.util.Event;
        _E.stopEvent(e);
        var target_el = _E.getTarget(e, true);
        this.setRating(target_el);
        _E = target_el = null;
    },
    // [METHODS]
    mouseOver: function(obj) {
        var _D = YAHOO.util.Dom;
        for(prop in this.labels) {
            _D.removeClass(this.labels[prop], 'hover');
        }
        if(obj === this.star_block || _D.isAncestor(this.star_block, obj)) {
            var _rating = (obj === this.star_block) ? 'star0' : obj.className;

            _D.replaceClass(this.star_block, this.cached_hover.star, _rating);
            _D.replaceClass(this.head, this.cached_hover.head,'hidden');
            _D.addClass(this.labels[_rating], 'hover');

            this.cached_hover.star = _rating;
            this.cached_hover.head = 'hidden';

            _rating = null;
        }
        _D = obj = null;
    },
    mouseOut: function(obj) {
        var _D = YAHOO.util.Dom;

        for(prop in this.labels) {
            _D.removeClass(this.labels[prop], 'hover');
        }

        if(obj !== this.star_block && (!_D.isAncestor(this.star_block, obj))) {
            _D.replaceClass(this.star_block, this.cached_hover.star, this.cached_click.star);
            _D.replaceClass(this.head, this.cached_hover.head, this.cached_click.head);

            this.cached_hover.star = this.cached_click.star;
            this.cached_hover.head = this.cached_click.head;

            if(this.cached_click.star !== 'star0') {
                _D.addClass(this.labels[this.cached_click.star], 'hover');
            }
        }
        _D = obj = null;
    },
    setRating: function(obj) {
        var _input_tmp = obj.getElementsByTagName('input');
        if(_input_tmp.length > 0) {
            _input_tmp[0].checked = true;
        }
        var _D = YAHOO.util.Dom;
        if(obj !== this.star_block && _D.isAncestor(this.star_block, obj)) {
            this.cached_click.star = obj.className;
            this.cached_click.head = 'hidden';
        } else {
            this.cached_click.head = 'default';
            this.cached_click.star = 'star0';
        }
        _D = obj = null;
        this.setRatingValue(YAHOO.Local.RateReview.getEndingInt(this.cached_click.star));
    },
    setRatingValue: function(val){
        if(YAHOO.lang.isObject(this.ratingValueInput) && this.ratingValueInput != null) {
            this.ratingValueInput.value = val;
        }
    },
    resetRating: function() {
        var _D = YAHOO.util.Dom;
        _D.replaceClass(this.star_block, this.cached_click.star, 'star0');
        for(prop in this.labels) {
            _D.removeClass(this.labels[prop], 'hover');
        }
        var _radio_inputs = this.star_block.getElementsByTagName('input');
        for(var i = 0; i < _radio_inputs.length; i++) {
            _radio_inputs[i].defaultChecked = false;
        }
        this.setRating(); //calling with no argument should reset the val
        _D = null;
    },
    /**
     * Functions for when the parent object is hidden, but message isn't
     */
    hideDefaultMsg: function() {
       YAHOO.util.Dom.replaceClass(this.head, 'default', 'hidden');
    },
    showDefaultMsg: function() {
       YAHOO.util.Dom.replaceClass(this.head, 'hidden', 'default');
    },
    destroy: function() {
        this.root_el = null;
        this.head = null;
        YAHOO.util.Event.purgeElement(this.star_block, true);
        this.star_block = null;

        this.labels = null;
        this.cached_click = null;
        this.cached_hover = null; 
    },
    toString: function() {
        return 'YAHOO.Local.RateReview.RateObj: ' + this.root_el.id;
    }
};

YAHOO.Local.Detail.Reviews = (function() {
    // [PRIVATE]
    var _D = YAHOO.util.Dom;
    var _E = YAHOO.util.Event;
    var _U = YAHOO.Local.util;
    return {
        initPage: function() {
            this.ratestars_root_el = YAHOO.util.Dom.getElementsByClassName('yls-rr-rate', 'div', 'yls-dt-reviewform-first')[0];
            this.review_rateobj = new YAHOO.Local.RateReview.RateObj(this.ratestars_root_el);

            this.moveCoreIdInfo('show');
            this.attachHandlers();
        },
        keyUpHandler: function(e) {
            YAHOO.util.Event.stopEvent(e);
            // here, 'this' is element on which the keyup is invoked
            YAHOO.Local.Detail.Reviews.adjustCharCount(this);
        },
    adjustCharCount: function(obj) {
        var _counter = _D.get('yls-rr-char-count');
        _counter.innerHTML = 4000 - parseInt(obj.value.length);
        _counter = null;
    },
        validateData: function(e) {
            var _form = _D.get('yls-dt-reviewform-first').getElementsByTagName('form')[0];
            var _rating_els = _form['rating'];
            var self = _form;
         
            var _user_rating = 0;
            if(_rating_els.length > 0) {
                var _len = _rating_els.length;
                for(var i = 0; i < _len; i++) {
                    if(_rating_els[i].checked) {
                        _user_rating = parseInt(_rating_els[i].value);
                    }
                }
            }
            var _review_text = _D.get('yls-rr-review-text').value;

            var _error_head = _D.get('yls-rr-error-head');
            var _error_rate = _D.get('yls-rr-error-rate');
            var _error_review = _D.get('yls-rr-error-review');

            this.isValid = true;
            _error_head.style.display = 'none';
            _error_rate.style.display = 'none';
            _error_review.style.display = 'none';

            if(!YAHOO.lang.isNumber(_user_rating) || _user_rating === 0) {
                this.isValid = false;
                _error_head.style.display = 'block';
                _error_rate.innerHTML = YAHOO.Local.data.WRITE_REVIEW.ERROR_MSG.NO_RATING;
                _error_rate.style.display = 'block';
            }
            if(_review_text.length == 0) {
                this.isValid = false;
                _error_head.style.display = 'block';
                _error_review.innerHTML = YAHOO.Local.data.WRITE_REVIEW.ERROR_MSG.NO_REVIEW;
                _error_review.style.display = 'block';
            } else if(_review_text.length < 50 || _review_text.length > 4000) {
                this.isValid = false;
                _error_head.style.display = 'block';
                _error_review.innerHTML = YAHOO.Local.data.WRITE_REVIEW.ERROR_MSG.CHAR_COUNT;
                _error_review.style.display = 'block';
            }

            _form_data = _review_text = _user_rating = null;
            _error_head = _error_rate = _error_review = null;

            if (this.isValid) {
                if (typeof(self['yIdAliasSelect']) != 'undefined') {
                    var _form_data = { 'yIdAliasSelect':self['yIdAliasSelect'].value, 'yIdNicknameInput':self['yIdNicknameInput'].value };
                    YAHOO.Local.util.updateCoreId(self, _form_data, function(oForm, _responseData) {
                        if (_responseData.status == 'OK') {
                            oForm.submit();
                        } else {
                            var oIdPicker = YAHOO.util.Dom.get('yIdSignDiv');
                            var error_msgs = YAHOO.util.Dom.getElementsByClassName('yls-gl-error', 'p',  oIdPicker.parentNode);
                            var error_msg = (error_msgs.length > 0) ? error_msgs[0] : null;
                            if (YAHOO.lang.isNull(error_msg)) {
                                error_msg = document.createElement('p');
                                YAHOO.util.Dom.addClass(error_msg, 'yls-gl-error');
                                YAHOO.util.Dom.addClass(error_msg, 'yls-gl-palette1');
                                oIdPicker.parentNode.insertBefore(error_msg, oIdPicker);
                                error_msg.style.display = 'block';
                            }
                            error_msg.innerHTML = _responseData.errormsg;
                        }
                    });
                } else {
                    _form.submit();
                }
            }
        },
        cancelReview: function(e) {
            if(window.location.search.indexOf('done=') != -1) {
                var _idx = window.location.search.indexOf('done=') + 5;
                var _substr = window.location.search.substring(_idx);
                var _newloc = _substr.split('&')[0];
                window.location = decodeURIComponent(_newloc);
                _idx = _substr = _newloc = null;
            } else if(window.location.search.indexOf('id=') != -1) {
                var _idx = window.location.search.indexOf('id=');
                var _substr = window.location.search.substring(_idx);
                var _eidparm = _substr.split('&')[0];
                window.location = 'details?' + _eidparm;
                _idx = _substr = _eidparm = null;
            } else {
                window.location = window.location.protocol + '//' + window.location.host;
            }
        },
        setRating: function(rating_int) {
                var _user_rating = rating_int;
                var _rating_idx = _user_rating - 1;
                var _user_rating_input = _D.getElementsByClassName('rating-star', 'input', this.ratestars_root_el)[_rating_idx];
                var _star_block = this.ratestars_root_el.getElementsByTagName('fieldset')[0];

                _D.replaceClass(this.review_rateobj.head, 'default', 'hidden');

                _D.replaceClass(_star_block, 'star0', 'star' + _user_rating);
                _user_rating_input.checked = true;
                this.review_rateobj.setRating(_user_rating_input.parentNode);
                this.review_rateobj.cached_hover.star = 'star' + _user_rating;
                
                _D.addClass(this.review_rateobj.labels['star' + _user_rating], 'hover');
                
                _user_rating = _rating_idx = _user_rating_input = _star_block = null;
        },
    moveCoreIdInfo: function(evType) {
        var _core_id_div = _D.get('yIdSignDiv');
            if(YAHOO.lang.isObject(_core_id_div)){
                var _parent_node = _core_id_div.parentNode;
                var _review_id = _D.getElementsByClassName('review-identity', 'div', 'yls-dt-reviewform-first')[0]; 
            var _page_foot = _D.get('ft');
            var _target_node;
            if(evType.toLowerCase() === 'show' && _parent_node === _page_foot){
                _target_node = _review_id;
                    _D.setStyle(_core_id_div, 'display', 'block'); 
                    if(!YAHOO.Local.Detail.isCoreIdLocked) {
                        YAHOO.Local.Detail.isCoreIdLocked = true;
                    }
            } else if(evType.toLowerCase() === 'hide' && _parent_node === _review_id) {
            _target_node = _page_foot;
                    _D.setStyle(_core_id_div, 'display', 'none'); 
                    if(YAHOO.Local.Detail.isCoreIdLocked) {
                        YAHOO.Local.Detail.isCoreIdLocked = false;
                    }
            }
               _parent_node.removeChild(_core_id_div);
               _target_node.appendChild(_core_id_div); 
               _parent_node = _review_id = _page_foot = _target_node = null;
        }
            _core_id_div = null;
    },
        attachHandlers: function() {
        this.review_text = _D.get('yls-rr-review-text');
        _E.on(this.review_text, 'keyup', this.keyUpHandler, this.review_text, true);
            this.submit_button = _D.get('yls-dt-rr-post');
            this.cancel_button = _D.get('yls-dt-rr-cancel');
            _E.on(this.submit_button, 'click', this.validateData);
        }
    }
})();
/* END In-page Review Code */


YAHOO.Local.Detail.toggleWhatsThis = function(e, isMapView) {
    var el = YAHOO.util.Event.getTarget(e);
    var cont = YAHOO.util.Dom.get('yls-dt-whatsthis');
    if(el.id === 'yls-dt-cs-what' && YAHOO.util.Dom.getStyle(cont, 'display') == 'none') {
        var region = YAHOO.util.Dom.getRegion(el);
        YAHOO.util.Dom.setStyle(cont, 'display', 'block');
	if(isMapView){
	    YAHOO.util.Dom.setY(cont, region.bottom + 2);
	} else {
            YAHOO.util.Dom.setXY(cont, [region.left - 275, region.bottom + 2]);
	}
    } else {
        YAHOO.util.Dom.setStyle(cont, 'display', 'none');
    }
};

/**
 * This handles the pop-up window for YSM and Service Magic links.
 * We check if the YSM or Service Magic container exists in page. If it exists, we
 * loop thru the <li> tags and add a pointer css style and add click handlers to 
 * open a new window.
 * @class YSM
 */
YAHOO.Local.Detail.YSM = {

    /**
     * Opens a window
     * @method popWindow
     * @param url {String}: The url the popup opens.
     * @param name {String}: The window name or target.
     * @param width {Int}: The width of the popup window.
     * @param height {Int}: The height of the popup window.
     * @param featureIdx {String}: The window properties.
     */
    popWindow: function(url, name, width, height, featureIdx) {
        var o = null, args = arguments;
        var idx = parseInt(featureIdx);

        if(!YAHOO.lang.isNumber(idx)) {
            idx = 0;
        }

        if(!YAHOO.lang.isNumber(parseInt(width))) {
            width = 750;
        }

        if(!YAHOO.lang.isNumber(parseInt(height))) {
            height = 500;
        }

        var feats = ['width=', width, ',height=', height];
        feats[feats.length] = (',scrollbars=' + ((idx & 1) ? 1 : 0));
        feats[feats.length] = (',resizable=' + ((idx & 2) ? 1 : 0));
        feats[feats.length] = (',toolbar=' + ((idx & 4) ? 1 : 0));
        feats[feats.length] = (',status=' + ((idx & 8) ? 1 : 0));
        feats[feats.length] = (',location=' + ((idx & 16) ? 1 : 0));
        feats[feats.length] = (',menubar=' + ((idx & 32) ? 1 : 0));

        if(args.length >= 6){
            feats[feats.length] = (document.layers) ? ',screenX='+args[5] : ',left='+args[5];
        }

        if(args.length >= 7){
            feats[feats.length] = (document.layers) ? ',screenY='+args[6] : ',top='+args[6];
        }

        feats = feats.join('');

        o = window.open(url, name, feats);

        if(o) {
            o.focus();
        }

        return o;
    },

    /**
     * Add onclick event to <li> in the Category Sponsor container.
     * @method addEvent
     * @param container {DOM Element}: The container (parent node) of Category Sponsor.
     * We perform tasks of the container's children.
     */
    addEvent: function(container) {

        var items = container.getElementsByTagName('li');
        var images = container.getElementsByTagName('img');

        YAHOO.util.Dom.setStyle(items, 'cursor', 'pointer');

        //set cursor to default, so image does not look clickable
        YAHOO.util.Dom.setStyle(images, 'cursor', 'default');

        var linkSponsor = function(e) {
            YAHOO.util.Event.preventDefault(e);
            var el = YAHOO.util.Event.getTarget(e);
            var li = null;

            //for YSM ditto task, if user clicks on image, don't call popWindow
            if (el.tagName.toLowerCase() == 'img') {
                return false;
            }

            if (el.tagName.toLowerCase() != 'li') {
                var getLI = function() {
                    var element = el;
                    while (element.tagName.toLowerCase() != 'li') {
                        element = element.parentNode;
                    }
                    return element;
                };
                li = getLI();
            } else {
                li = el;
            }
            var href = li.getAttribute('link'); //get the url from 'link=' attribute
            YAHOO.Local.Detail.YSM.popWindow(href, 'ad', 750, 500, 63);
        };

        YAHOO.util.Event.on(items, 'click', linkSponsor);

   }
};

/**
 * This is used to display confirmation message to the user that
 * their review has been submitted.
 * After a user has submitted a review, we reload the detail page with 
 * querystring rvwconf=1. This flag will write 'yls-dt-review-conf' DOM element
 * to the page via PHP. If the element is written to document, we create YUI Dialog
 * of the element to display to the user.
 * @namespace YAHOO.Local.Detail 
 * @class ReviewConfirmation
 * @static
 */
YAHOO.Local.Detail.ReviewConfirmation = {

    /**
     * Creates a YUI overlay container with review confirmation text
     * @property oConfirmCont
     * @type Object
     * @static
     */
    oConfirmCont: YAHOO.util.Dom.get('yls-dt-review-conf'),

    /**
     * Creates a YUI overlay container with review confirmation text
     * @method createDialog
     * @return {Void}
     * @static
     */
    createDialog: function() {
        var oDialog = new YAHOO.widget.Dialog(this.oConfirmCont, {
            width:'20em',
            close:true,
            draggable:false,
            visible:false,
            fixedcenter:true,
            iframe:true,
            modal:true
        });
        oDialog.render(document.body);
        YAHOO.util.Dom.setStyle(this.oConfirmCont, 'display', 'block');

        //add standard dialog style 
        YAHOO.util.Dom.addClass(this.oConfirmCont, 'yls-gl-dialog');
        oDialog.show();
    },

    /**
     * Initialize ReviewConfirmation and check if CONFIRMATION was written to
     * the page.
     * @method init
     * @return {Void}
     * @static
     */
    init: function() {
        if (this.oConfirmCont) {
            this.createDialog();
        }
    }
};

/*
 * Adds event handler for click on "Get directions" link.
 * Loads css and js files for managing Inline Directions and intializes it 
 * @method addEvents
 */
YAHOO.Local.Detail.initInlineDirections = function() {
    var getDirectionLinks = YAHOO.util.Dom.getElementsByClassName('yls-dt-get-directions','a');
    YAHOO.util.Event.on(getDirectionLinks, 'click', function(e){
        YAHOO.util.Event.preventDefault(e);
        var  target = YAHOO.util.Event.getTarget(e);
        if(!YAHOO.lang.isObject(YAHOO.Local.util.GetDirections)) {
            var file = new YAHOO.Local.util.loadFile([YAHOO.Local.data.INLINE_DIRECTIONS.js, YAHOO.Local.data.INLINE_DIRECTIONS.css], 'YAHOO.Local.util.GetDirections');
            file.onComplete.subscribe(function(){
                YAHOO.Local.util.GetDirections.init(e, target, false);
            });
        } else {
            YAHOO.Local.util.GetDirections.init(e, target, false); 
        }
    });
};

/**
 * Handles the photos slideshow on details page
 * @class Slideshow
 **/
YAHOO.Local.Detail.Slideshow ={

    /**
     * Current photo displayed in slideshow
     * @property current
     * @type String
     * @public 
     **/
    current: 0,
    
    /** 
     * Array of all photos in slideshow
     * @property photos
     * @type Object
     * @public
     **/ 
    photos: 0,

    /** 
     * Count of photos in slideshow 
     * @property size
     * @type Integer 
     * @public
     **/    
    size: 0,

    /**
     * Next picture link
     * @property next
     * @type Object html <a> element
     * @public
     **/
    next: '',
  
    /**
     * Previous picture link
     * @property next
     * @type Object html <a> element
     * @public
     **/
    prev: '',

    /**
     * Handles the click on next/prev link and changes photos in slideshow accordingly
     * @method changeSlide
     * @public
     * @return void
     * @param e (Object) YUI event object
     * @param slideshow (Object) object of Slideshow class
     * @param action (String) whether user clicked on next, prev or image link
     **/
    changeSlide: function(e, slideshow, action){
	YAHOO.util.Event.preventDefault(e);
        YAHOO.util.Dom.removeClass(slideshow.photos[slideshow.current], 'current');
	YAHOO.util.Dom.removeClass('yls-dt-photo-' + slideshow.current, 'selected');
	var next = 0;
	switch(action){
	    case 'next' :
		next = slideshow.current + 1;	
		break;
	    case 'prev' :
		next = slideshow.current - 1;
		break;
	    case 'selected':
		next = 0;
		break;
  	    default:
	 	next = parseInt(action.replace('yls-dt-photo-',''));		
		break;
	} 
        slideshow.current = next;
        if(slideshow.current < 0) {
            slideshow.current = slideshow.size - 1;
        }
        if(slideshow.current > slideshow.size - 1) {
            slideshow.current = 0;
        }
        YAHOO.util.Dom.addClass(slideshow.photos[slideshow.current], 'current');
	YAHOO.util.Dom.addClass('yls-dt-photo-' + slideshow.current, 'selected');
	slideshow.toggleDeleteLink(slideshow);
	slideshow.createNav(slideshow);
    },

    /**
     * Handles the click on share photo link 
     * @method sharePhoto
     * @public
     * @return void
     * @param e (Object) YUI event object
     * @param slideshow (Object) object of Slideshow class
     **/
    sharePhoto: function(e, slideshow) {
	YAHOO.util.Event.preventDefault(e);
	window.location.href = YAHOO.Local.data.PHOTOS_LINKS['photo_' + slideshow.current]['share'];	
    },

    /**
     * Handles the click on flag photo link  
     * @method flagPhoto
     * @public
     * @return void
     * @param e (Object) YUI event object
     * @param slideshow (Object) object of Slideshow class
     **/
    flagPhoto: function(e, slideshow) {
	YAHOO.util.Event.preventDefault(e);
        window.location.href = YAHOO.Local.data.PHOTOS_LINKS['photo_' + slideshow.current]['flag'];
    },

    /**
     * Deletes the photo and refreshes the page when photo is deleted successfully  
     * @method deletePhoto
     * @public
     * @return void
     * @param e (Object) YUI event object
     * @param slideshow (Object) object of Slideshow class
     **/
    deletePhoto: function(e, slideshow) {
	YAHOO.util.Event.preventDefault(e);
	if(! YAHOO.Local.data.PHOTOS_LINKS['photo_' + slideshow.current]['delete']){
	    YAHOO.util.Dom.get('yls-dt-deletephoto-conf').innerHTML = YAHOO.Local.data.VIEW_PHOTOS.DELETE_NO_PERMISSION;
	    return;
        }
	var photo_id = YAHOO.Local.data.PHOTOS_LINKS['photo_' + slideshow.current]['delete']; 
	var form_data = 'procaction=del_photo';
        form_data += '&eid=' + YAHOO.Local.data.LISTING_ID;
        form_data += '&photo_id=' + photo_id;
        form_data += '&dbwrite=1';
	var callback = {
            success: function(o){
		var photo_data = eval(o.responseText);
		if(YAHOO.lang.isObject(photo_data)) {
		   var pid = slideshow.current == 0 ? slideshow.size - 2 : slideshow.current - 1; 
		   window.location.href = YAHOO.Local.data.VIEW_PHOTOS.REDIRECT_URL + '&pid=' + pid + '&photodelete=1' + '#photos';
		}
	    },
            failure:''
        };
        var cObj = YAHOO.util.Connect.asyncRequest('POST', '/annotations_handler.php', callback, form_data);
    },

    /**
     * Confirms the user if he really wants to delete the photo  
     * @method deletePhoto
     * @public
     * @return void
     * @param e (Object) YUI event object
     **/
    confirmPhotoDelete: function(e) {
	YAHOO.util.Event.preventDefault(e);
	if(YAHOO.util.Dom.inDocument('yls-dt-deletephoto-conf')) {
	    YAHOO.util.Dom.setStyle('yls-dt-deletephoto-conf', 'display', 'block');
	} else {
	    var el = document.createElement('div');
	    el.id = 'yls-dt-deletephoto-conf';
	    YAHOO.util.Dom.addClass(el, 'yls-gl-litebox');
	    el.innerHTML = YAHOO.Local.data.VIEW_PHOTOS.DELETE_CONFIRM_HTML;
	    document.body.appendChild(el);
	    var deleteRegion = YAHOO.util.Dom.getRegion('yls-dt-deletephoto');
	    YAHOO.util.Dom.setXY(el, [deleteRegion.left, deleteRegion.top-90]);
	}
    },

    /**
     * Adds event handlers for click on all links in photos slideshow  
     * @method addEvents
     * @public
     * @return void
     * @param slideshow (Object) object of Slideshow class
     **/
    addEvents: function(slideshow){
	var photos = YAHOO.util.Dom.getElementsByClassName('yls-dt-photo', 'li', 'yls-dt-photos-control');
	var nextLinks = YAHOO.util.Dom.getElementsByClassName('yls-dt-slideshow-next', 'a' ,'yls-dt-content');
	var prevLinks = YAHOO.util.Dom.getElementsByClassName('yls-dt-slideshow-prev', 'a' ,'yls-dt-content');
	
	if(slideshow.size > 1){
	    YAHOO.util.Event.on(photos, 'click', function(e){
	        var id = YAHOO.util.Event.resolveTextNode(this).id;
	        slideshow.changeSlide(e, slideshow, id);
	    });

	    YAHOO.util.Event.on(slideshow.next, 'mouseover', function(e){
		YAHOO.util.Dom.addClass(slideshow.next, 'hover');
            });

            YAHOO.util.Event.on(slideshow.next, 'mouseout', function(e){
                YAHOO.util.Dom.removeClass(slideshow.next, 'hover');
            });

            YAHOO.util.Event.on(slideshow.prev, 'mouseover', function(e){
                YAHOO.util.Dom.addClass(slideshow.prev, 'hover');
            });

            YAHOO.util.Event.on(slideshow.prev, 'mouseout', function(e){
                YAHOO.util.Dom.removeClass(slideshow.prev, 'hover');
            });

	    YAHOO.util.Event.on(nextLinks, 'click', function(e){
	        slideshow.changeSlide(e, slideshow, 'next');
            });

	    YAHOO.util.Event.on(prevLinks, 'click', function(e){
                slideshow.changeSlide(e, slideshow, 'prev');
            });
	}

        YAHOO.util.Event.on('yls-dt-photo-selected', 'click', function(e){
  	        slideshow.changeSlide(e, slideshow, 'selected');	
	});

	YAHOO.util.Event.on('yls-dt-sharephoto', 'click', function(e){
	    slideshow.sharePhoto(e, slideshow);
	});

        YAHOO.util.Event.on('yls-dt-flagphoto', 'click', function(e){
            slideshow.flagPhoto(e, slideshow);
        });

	YAHOO.util.Event.on('yls-dt-deletephoto', 'click', function(e){
            slideshow.confirmPhotoDelete(e);
        });

	YAHOO.util.Event.on('yls-photodel-yes', 'click', function(e){
            slideshow.deletePhoto(e, slideshow);
        });

	YAHOO.util.Event.on('yls-photodel-cancel', 'click', function(e){
	    YAHOO.util.Event.preventDefault(e);
	    YAHOO.util.Dom.setStyle('yls-dt-deletephoto-conf', 'display', 'none');
        });
    },


    /**
     * Overlays the next/ and previous links on top of image  
     * @method createNav
     * @public
     * @return void
     * @param slideshow (Object) object of Slideshow class
     **/
    createNav: function(slideshow) {
	if(slideshow.next == '' || slideshow.prev  == '') {
	    slideshow.next = YAHOO.util.Dom.get('yls-dt-slideshow-next-btn');
	    slideshow.prev = YAHOO.util.Dom.get('yls-dt-slideshow-prev-btn');
	}
	var slideRegion = YAHOO.util.Dom.getRegion('yls-dt-photos-slideshow');
	var photoY = YAHOO.util.Dom.getY('yls-dt-slide-img-' + slideshow.current);
	
	var photoHeight = YAHOO.util.Dom.getStyle('yls-dt-slide-img-' + slideshow.current, 'height');
	
        YAHOO.util.Dom.setXY(slideshow.prev, [slideRegion.left, photoY]);
	YAHOO.util.Dom.setXY(slideshow.next, [slideRegion.right - 46, photoY]);

	YAHOO.util.Dom.setStyle([slideshow.prev, slideshow.next], 'height', photoHeight);
    },

    /**
     * Shows the "Remove Photo" link only if user has permission to delete photo, hides the link otherwise  
     * @method toggleDeleteLink
     * @public
     * @return void
     * @param e (Object) YUI event object
     * @param slideshow (Object) object of Slideshow class
     **/
    toggleDeleteLink: function(slideshow){
	var deleteUrl = YAHOO.Local.data.PHOTOS_LINKS['photo_' + slideshow.current]['delete'];
 	if(! deleteUrl) {
	    if(YAHOO.util.Dom.inDocument('yls-dt-deletephoto-li') && YAHOO.util.Dom.getStyle('yls-dt-deletephoto-li', 'display') == 'inline'){
		YAHOO.util.Dom.setStyle('yls-dt-deletephoto-li', 'display', 'none');
	    }
	} else {
            if(YAHOO.util.Dom.inDocument('yls-dt-deletephoto-li')) {
	        if(YAHOO.util.Dom.getStyle('yls-dt-deletephoto-li', 'display') == 'none'){
	            YAHOO.util.Dom.setStyle('yls-dt-deletephoto-li', 'display', 'inline');
	        }
            } else {
	        var listItem = document.createElement('li');
	        listItem.id = 'yls-dt-deletephoto-li';
	        listItem.innerHTML = YAHOO.Local.data.VIEW_PHOTOS.DELETE_LINK;
	        YAHOO.util.Dom.get('yls-dt-photos-options').appendChild(listItem);
	    }
	}
    },

    /**
     * Initializes the image slideshow
     * @method init
     * @public
     * @return void
     **/
    init: function(){
        // We pass objecr of Slideshow class to all the methods 
    	var slideshow = this;	
    	slideshow.current = parseInt(YAHOO.Local.data.CURRENT_PHOTO);
    	slideshow.photos = YAHOO.util.Dom.getElementsByClassName('yls-dt-slide', 'li', 'yls-dt-photos-slideshow');
    	slideshow.size = slideshow.photos.length;
    	slideshow.toggleDeleteLink(slideshow);	
    	if(slideshow.size > 1) {
    	    YAHOO.util.Dom.addClass('yls-dt-slideshow-nav', 'js-enabled');
    	    slideshow.createNav(slideshow);
        }
        slideshow.addEvents(slideshow);
    }
};

/**
 * Initialize detail page components
 * @method initPage
 */
YAHOO.Local.Detail.initPage = function() {
    var self = this;
 
    var isMapView = YAHOO.util.Dom.hasClass('yls-dt', 'mapview');  

    if(isMapView) {
        YAHOO.Local.DetailsExpandedMap.loadExpandedMap();
        YAHOO.Local.DetailsExpandedMap.addEvents();
    } else {
        var expandMapLink = document.createElement('a');
        expandMapLink.id = 'yls-dt-expandmap';
        expandMapLink.setAttribute('href', YAHOO.Local.data['EXPAND_MAP'].link);
        expandMapLink.innerHTML = 'Expand Map';
        YAHOO.util.Dom.insertBefore(expandMapLink, 'yls-dt-findnearbyhdr');

        // Add marker image to map	
        var mapStatic = YAHOO.util.Dom.get('yls-dt-mapstatic');
        var mapXY = YAHOO.util.Dom.getXY(mapStatic);
        var mapMarker = YAHOO.util.Dom.get('yls-dt-mapmarker')
        YAHOO.util.Dom.setStyle(mapMarker, 'display', 'block');
        //marker to always appear at center of map image. So we calculate the center of image and also consider height and width of marker image to correctly position it
        YAHOO.util.Dom.setXY(mapMarker, [mapXY[0] + 136 , mapXY[1] + 114] );

        // Clicking on map image and map marker should open expanded map view
        YAHOO.util.Event.on(mapStatic, 'click', function(e){
            window.location.href = YAHOO.Local.data['EXPAND_MAP'].link;
        });
        YAHOO.util.Event.on(mapMarker, 'click', function(e){
            window.location.href = YAHOO.Local.data['EXPAND_MAP'].link;
        });
    }
 
    YAHOO.Local.util.initGlobalComponents();

    if(YAHOO.util.Dom.inDocument('yls-dt-photos-slideshow')){
	YAHOO.Local.Detail.Slideshow.init();
    }

    if(YAHOO.util.Dom.inDocument('yls-dt-photodelete-conf')){
	YAHOO.util.Event.on('yls-photodel-conf-close', 'click', function(e){
	    YAHOO.util.Dom.setStyle('yls-dt-photodelete-conf', 'display', 'none');
	    if(YAHOO.util.Dom.inDocument('yls-dt-addphoto-msg')){
		YAHOO.util.Dom.setStyle('yls-dt-addphoto-msg', 'display', 'block');
	    }
	});
    }

    if(YAHOO.util.Dom.inDocument('yls-dt-cs-what')) {
        YAHOO.util.Event.on(['yls-dt-cs-what', 'yls-dt-what-close'], 'click', function(e) {
           YAHOO.util.Event.preventDefault(e);
           YAHOO.Local.Detail.toggleWhatsThis(e, isMapView);
        });
    }

    this.addUserRecommendEvent();
    if(! isMapView) {
        this.AddComment.addEvents();
    }

    if (!YAHOO.lang.isUndefined(YAHOO.Local.data['OPEN'])) {
        YAHOO.Local.Detail.Login.openPopUp(YAHOO.Local.data['OPEN']);
    }

    YAHOO.util.Event.on('yls-dt-addtag', 'click', function() { self.handleAddTag(); });

    YAHOO.util.Event.on(YAHOO.util.Dom.getElementsByClassName('yls-dt-tagsublnk', 'a', 'yls-dt-tagscont'), 'click', function(e) { self.handleDeleteTag(e); });

    YAHOO.util.Event.on('yls-dt-sortby', 'change', function(e) { self.handleSortBy(e); });

    YAHOO.util.Event.on('yls-dt-save', 'click', function(e) {
        YAHOO.util.Event.preventDefault(e);
        self.handleSaveToLocal();
    });

    YAHOO.util.Event.on('yls-dt-sendto', 'click', function(e) { self.handleSendTo(e); });
    YAHOO.util.Event.on('yls-dt-sendtophone', 'click', function(e) { self.handleSendToPhone(e); });
    YAHOO.util.Event.on('yls-dt-sendtoprint', 'click', function(e) { self.handleSendToPrinter(e); });
    YAHOO.util.Event.on('yls-dt-findnearbyhdr', 'click', this.handleFindNearBy);


    YAHOO.util.Event.on(['yls-dt-writereview', 'yls-dt-writereviewsub'], 'click', function(e) {
        YAHOO.util.Event.preventDefault(e);
        if(!YAHOO.util.Dom.inDocument('yls-dt-reviewform-first')) {
            self.handleWriteReview();
        } else {
            location = '#first-reviewer-form';
        }
    });

    if(YAHOO.util.Dom.get('yls-dt-first-review')) {
        YAHOO.util.Event.on('yls-dt-first-review', 'click', function(e) {
            YAHOO.util.Event.stopEvent(e);
            self.handleWriteReview();
        });
    }

    if(YAHOO.util.Dom.inDocument('yls-dt-reviewform-first')) {
        YAHOO.Local.Detail.Reviews.initPage();
    }

    this.UpdateBiz.addEvent(isMapView);

    this.AddInfo.addEvent(isMapView);

    YAHOO.util.Event.on(['yls-dt-addphoto', 'yls-dt-upload'], 'click', function(e) {YAHOO.util.Event.stopEvent(e); YAHOO.Local.Detail.AddComment.toggle(e); self.handleAddPhotos(); });

    //delete review comment  
    var delcomments = YAHOO.util.Dom.getElementsByClassName('yls-dt-delete-comment', 'a', 'yls-dt-main');
    if(delcomments.length > 0) {
        YAHOO.util.Event.on(delcomments, 'click', YAHOO.Local.Detail.Confirm.createConfDialog, 'DELETE_COMMENT');
    }

    //delete review  
    var delreviews = YAHOO.util.Dom.getElementsByClassName('yls-dt-delete-review', 'a', 'yls-dt-main');
    if(delreviews.length > 0) {
        YAHOO.util.Event.on(delreviews, 'click', YAHOO.Local.Detail.Confirm.createConfDialog, 'DELETE_REVIEW');
    }

    var container = YAHOO.util.Dom.get('yls-dt-smagic') || YAHOO.util.Dom.get('yls-dt-ysm');
    if (container) {
         YAHOO.Local.Detail.YSM.addEvent(container);
    }

    //add event for document.body. closes liteboxes when user clicks outside of litebox.
    YAHOO.util.Event.on(document.body, 'click', function(e) {
        var el = YAHOO.util.Event.getTarget(e);

        if (el.id != 'yls-dt-sendto' && el.id != 'yls-dt-sendopts') {
            self.handleSendTo(e);
        }

        if (!YAHOO.util.Dom.isAncestor('yls-dt-updatebiz-cont', el) && el.id != 'yls-dt-updatebiz-cont' && el.id != 'yls-dt-edit') {
            self.UpdateBiz.hide();
        }

        if (el.id != 'yls-dt-cs-what' && el.id != 'yls-dt-whatsthis') {
            self.toggleWhatsThis(e);
        }

        if (el.id != 'yls-dt-viewchanges' && el.id != 'yls-dt-viewchanges-cont' && !YAHOO.util.Dom.isAncestor('yls-dt-viewchanges-cont', el)) {
            self.ViewChanges.toggle(e);
        }


        if (el.id != 'yls-dt-addinfo' && el.id != 'yls-dt-addinfo-sub' && !YAHOO.util.Dom.isAncestor('yls-dt-addinfo-cont', el)) {
            YAHOO.Local.Detail.AddInfo.hide();
        }
    });

    if (YAHOO.util.Dom.inDocument('yls-dt-viewchanges')) {
        YAHOO.util.Event.on(['yls-dt-viewchanges', 'yls-dt-viewchanges-close'], 'click', function(e) { 
            YAHOO.util.Event.preventDefault(e);
            self.ViewChanges.toggle(e);
        });
    }
    
    //Calls addEvents function in global.js to add events to click on "get directions" link for inline directions
    YAHOO.Local.Detail.initInlineDirections();

    //Checks if we need to show review confirmation message 
    YAHOO.Local.Detail.ReviewConfirmation.init();
};
