if (typeof F10 == "undefined") {
    /**
     * The F10 global namespace object.  If F10 is already defined, the
     * existing F10 object will not be overwritten so that defined
     * namespaces are preserved.
     * @class F10
     * @static
     */
    var F10 = {};
}

/**********************************************************************
 *
 * global constants
 *
 **********************************************************************/
F10.FORM_URL_USER_COMMENT = "/ajax/submit_user_comment.f10";
F10.FORM_URL_USER_COMMENT_DELETE = "/ajax/submit_user_comment_delete.f10";

F10.FORM_URL_FRIEND_DECLINE = "/ajax/submit_friend_decline.f10";
F10.FORM_URL_FRIEND_DELETE = "/ajax/submit_friend_delete.f10";
F10.FORM_URL_UPDATE_MY_LIST_RATING = "/ajax/update_my_list_rating.f10";
F10.FORM_URL_SEARCH_RESULTS="/ajax/search_results.f10";

F10.FORM_URL_ACCT_COMP_FRIEND_INVITE="/account/component/submit_friend_invite.f10";
F10.FORM_URL_ACCT_COMP_FRIEND_ACCEPT="/account/component/submit_friend_accept.f10";
F10.FORM_URL_ACCT_COMP_FRIEND_DECLINE="/account/component/submit_friend_decline.f10";
F10.FORM_URL_ACCT_COMP_FRIEND_DELETE="/account/component/submit_friend_delete.f10";


/**********************************************************************
 *
 * form functions
 *
 **********************************************************************/
F10.form = {
    /**
     * Exec a one time check on all textareas in the document that have
     * maxlength set.
     */
    checkAllTextAreaMaxLengths: function() {
        var textAreas = document.getElementsByTagName('textarea');

        for (var i=0; i<textAreas.length; i++) {
            var textArea = textAreas[i];
            if (textArea.getAttribute('maxlength')) {
                F10.form.limitTextAreaLength(textArea, textArea.getAttribute('maxlength'));
            }
        }
    },

    limitTextAreaLength: function(textArea, maxLength) {
        var fieldLength = 0;

        if (textArea.value.length > maxLength) {
            textArea.value = textArea.value.substring(0,maxLength);
        }
        fieldLength = textArea.value.length;

        var formFieldLengthCounters = YAHOO.util.Dom.getElementsByClassName("maxlength-counter", "*", textArea.parentNode);
        for (var i=0; i<formFieldLengthCounters.length; i++) {
            var formFieldLengthCounter = formFieldLengthCounters[i];
            formFieldLengthCounter.innerHTML = fieldLength + " of " + maxLength;
            if (fieldLength >= maxLength) {
                YAHOO.util.Dom.addClass(formFieldLengthCounter, "text-alert");
            } else {
                YAHOO.util.Dom.removeClass(formFieldLengthCounter, "text-alert");
            }
        }
    },

    checkTextAreaMaxLength: function(e) {
        var elTarget = YAHOO.util.Event.getTarget(e);
        while (elTarget != null && elTarget.id != "container") {
            if (elTarget.type == 'textarea' && elTarget.getAttribute('maxlength')) {
                var maxLength = elTarget.getAttribute('maxlength');
                F10.form.limitTextAreaLength(elTarget, maxLength);
                break;
            } else {
                elTarget = elTarget.parentNode;
            }
        }
    },

    clearFormElementHelpText: function(e, args) {
        var formElement = YAHOO.util.Dom.get(args.formElement);
        var helpText = args.helpText;
        if (formElement.value == helpText) {
            formElement.value='';
            formElement.style.color='';
        }
    },
    setFormElementHelpText: function(e, args) {
        var formElement = YAHOO.util.Dom.get(args.formElement);
        var helpText = args.helpText;
        if (formElement.value == '') {
            formElement.value=helpText;
            formElement.style.color='#999999';
        }
    },
    setFormElementInlineHelpText: function(formElement, helpText, clickButton) {
        if (YAHOO.util.Dom.get(formElement) != null) {
            var args = {formElement:formElement, helpText:helpText};
            F10.form.setFormElementHelpText(null, args);
            YAHOO.util.Event.addListener(formElement, "blur", F10.form.setFormElementHelpText, args);
            YAHOO.util.Event.addListener(formElement, "focus", F10.form.clearFormElementHelpText, args);
            YAHOO.util.Event.addListener(YAHOO.util.Dom.get(formElement).form, "submit", F10.form.clearFormElementHelpText, args);
            if (clickButton != null) {
                YAHOO.util.Event.addListener(clickButton, "click", F10.form.clearFormElementHelpText, args);
            }
        }
    },


    initFormElementInlineHelpTexts: function() {
        for (var i=0; i<document.form.length; i++) {
            for (var i=0; j<form.elements.length; j++) {
                var formElement = form.elements[j];
                if (formElement.type == 'textarea' || formElement.type == 'text') {
                    if (formElement.getAttribute('helptext')) {
                        F10.form.setFormElementInlineHelpText(formElement, formElement.getAttribute('helptext'));
                    }
                }
            }
        }
    },


    clearFormElementHelpTextsForForm: function(formId) {
        var form = YAHOO.util.Dom.get(formId);

        if (form.type = 'form') {
            for (var i=0; i<form.elements.length; i++) {
                var formElement = form.elements[i];
                if (formElement.type == 'textarea' || formElement.type == 'text') {
                    if (formElement.getAttribute('helptext')) {
                        var args = {formElement:formElement, helpText:formElement.getAttribute('helptext')};
                        F10.form.clearFormElementHelpText(null, args);
                    }
                }
            }
        }
    }
};

/**********************************************************************
 *
 * util
 *
 **********************************************************************/
F10.util = {
    hideIt: function(node) {
        YAHOO.util.Dom.addClass(node, "hide");
    },
    showIt: function(node) {
        YAHOO.util.Dom.removeClass(node, "hide");
    },
    fadeAndRemove: function(node, callback) {
        var fadeOut = new YAHOO.util.Anim(node, {
                opacity: {from: .99, to: 0}
            }, 1, YAHOO.util.Easing.easeOut);
        fadeOut.onComplete.subscribe(function() {
            node.parentNode.removeChild(node);
            if (callback != null) {
                callback();
            }
        });
        fadeOut.animate();
    },
    submittingOverlayShow: function(node) {
        var nodeId = node.id;
        if (nodeId == null) {
            nodeId = ""; // should make it some rand #
        }
        var submittingOverlay = new YAHOO.widget.Overlay("submittingOverlay-" + nodeId, {
            visible:false,
            effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.25}
        });
        submittingOverlay.setBody(YAHOO.util.Dom.get("submittingOverlayTemplate").innerHTML);
        submittingOverlay.render(document.body);

        submittingOverlay.cfg.setProperty("context", [node, "tl", "tl"]);
        submittingOverlay.show();
        return submittingOverlay;
    },
    /** TODO: make it an overlay that fades **/
    submittingOverlayHide: function(submittingOverlay) {
        submittingOverlay.hide();
        submittingOverlay.destroy();
    },
    submitFailedShow: function(node) {
        /* create and show the submit failed node */
        var submitFailed = document.createElement("div");
        YAHOO.util.Dom.generateId(submitFailed);
        submitFailed.innerHTML = YAHOO.util.Dom.get("submitFailedTemplate").innerHTML;
        node.insertBefore(submitFailed, node.firstChild);
    }
};

/**********************************************************************
 *
 * modalDialog
 *
 **********************************************************************/
 F10.modalDialog = {
    createAsDialog: function(dialogDomId, dialogButtons) {
        var dialogDomNode = YAHOO.util.Dom.get(dialogDomId);

        dialogDomNode.panelObj = new YAHOO.widget.SimpleDialog(dialogDomId, {
            width:"300px",
            visible:false,
            effect:{effect:YAHOO.widget.ContainerEffect.FADE,
                    duration:0.25},
            fixedcenter:true,
            modal:true,
            draggable:false });

        if (dialogButtons != null) {
            dialogDomNode.panelObj.cfg.queueProperty("buttons", dialogButtons);
        }
        dialogDomNode.panelObj.render(document.body);
        YAHOO.util.Dom.removeClass(dialogDomNode, "hide");
    },

    show: function(dialogDomId) {
        YAHOO.util.Dom.get(dialogDomId).panelObj.show();
    },

    hide: function(dialogDomId) {
        YAHOO.util.Dom.get(dialogDomId).panelObj.hide();
    },

    initConfirmDeleteUserComment: function() {
        var myButtons = [ { text:"OK",
                            handler:F10.userComment.deleteUserComment,
                            isDefault:true },
                          { text:"Cancel",
                            handler:function(){this.hide();} } ];
        F10.modalDialog.createAsDialog("modalConfirmDeleteUserComment", myButtons);
    },

    initConfirmUserProfileDeleteFriend: function() {
        var myButtons = [ { text:"OK",
                            handler:F10.userProfile.deleteFriend,
                            isDefault:true },
                          { text:"Cancel",
                            handler:function(){this.hide();} } ];
        F10.modalDialog.createAsDialog("modalConfirmUserProfileDeleteFriend", myButtons);
    },

    initConfirmUserProfileDeclineFriend: function() {
        var myButtons = [ { text:"OK",
                            handler:F10.userProfile.declineFriend,
                            isDefault:true },
                          { text:"Cancel",
                            handler:function(){this.hide();} } ];
        F10.modalDialog.createAsDialog("modalConfirmUserProfileDeclineFriend", myButtons);
    }
};

/**********************************************************************
 *
 * favoriteList
 *
 **********************************************************************/
F10.favoriteList = {
    showMemo: function(e, listItem) {
        /* show item memo and memo hide icon */
        var itemMemo = YAHOO.util.Dom.getElementsByClassName("item-memo", "*", listItem);
        F10.util.showIt(itemMemo);
        var memoHide = YAHOO.util.Dom.getElementsByClassName("memo-hide", "*", listItem);
        F10.util.showIt(memoHide);
        /* hide memo show icon */
        var memoShow = YAHOO.util.Dom.getElementsByClassName("memo-show", "*", listItem);
        F10.util.hideIt(memoShow);
    },
    hideMemo: function(e, listItem) {
        /* hide item memo and memo hide icon */
        var itemMemo = YAHOO.util.Dom.getElementsByClassName("item-memo", "*", listItem);
        F10.util.hideIt(itemMemo);
        var memoHide = YAHOO.util.Dom.getElementsByClassName("memo-hide", "*", listItem);
        F10.util.hideIt(memoHide);
        /* show memo show icon */
        var memoShow = YAHOO.util.Dom.getElementsByClassName("memo-show", "*", listItem);
        F10.util.showIt(memoShow);
    }
};


/**********************************************************************
 *
 * favoriteListManage
 *
 **********************************************************************/
F10.FAVORITE_LIST_MANAGE_MODIFIED = 0;
F10.DDProxy = function(id, sGroup, config) {

    F10.DDProxy.superclass.constructor.call(this, id, sGroup, config);

    this.logger = this.logger || YAHOO;
    var el = this.getDragEl();
    YAHOO.util.Dom.setStyle(el, "opacity", 0.67); // The proxy is slightly transparent

    this.goingUp = false;
    this.lastY = 0;
};
YAHOO.lang.extend(F10.DDProxy, YAHOO.util.DDProxy, {

    startDrag: function(x, y) {
        this.logger.log(this.id + " startDrag");

        // make the proxy look like the source element
        var srcEl = this.getEl();
        var proxyEl = this.getDragEl();

        YAHOO.util.Dom.setStyle(srcEl, "backgroundColor", "#CCC");

        proxyEl.innerHTML = srcEl.innerHTML;
        YAHOO.util.Dom.setStyle(proxyEl, "color", YAHOO.util.Dom.getStyle(srcEl, "color"));
        YAHOO.util.Dom.setStyle(proxyEl, "backgroundColor", YAHOO.util.Dom.getStyle(srcEl, "backgroundColor"));
        YAHOO.util.Dom.setStyle(proxyEl, "border", "2px solid gray");

    },

    endDrag: function(e) {
        var srcEl = this.getEl();
        var proxyEl = this.getDragEl();

        // Show the proxy element and animate it to the src element's location
        YAHOO.util.Dom.setStyle(proxyEl, "visibility", "");
        YAHOO.util.Dom.setStyle(srcEl, "backgroundColor", "");
        var a = new YAHOO.util.Motion(
            proxyEl, {
                points: {
                    to: YAHOO.util.Dom.getXY(srcEl)
                }
            },
            0.2,
            YAHOO.util.Easing.easeOut
        )

        // Hide the proxy and show the source element when finished with the animation
        a.onComplete.subscribe(function() {
                YAHOO.util.Dom.setStyle(proxyEl, "visibility", "hidden");
                YAHOO.util.Dom.get(proxyEl).innerHTML = "";
                YAHOO.util.Dom.setStyle(srcEl, "visibility", "");
            });
        a.animate();
    },

    onDragDrop: function(e, id) {

        // If there is one drop interaction, the li was dropped either on the list,
        // or it was dropped on the current location of the source element.
        if (YAHOO.util.DragDropMgr.interactionInfo.drop.length === 1) {

            // The position of the cursor at the time of the drop (YAHOO.util.Point)
            var pt = YAHOO.util.DragDropMgr.interactionInfo.point;

            // The region occupied by the source element at the time of the drop
            var region = YAHOO.util.DragDropMgr.interactionInfo.sourceRegion;

            // Check to see if we are over the source element's location.  We will
            // append to the bottom of the list once we are sure it was a drop in
            // the negative space (the area of the list without any list items)
            if (!region.intersect(pt)) {
                var destEl = YAHOO.util.Dom.get(id);
                var destDD = YAHOO.util.DragDropMgr.getDDById(id);
                destEl.appendChild(this.getEl());
                destDD.isEmpty = false;
                YAHOO.util.DragDropMgr.refreshCache();
            }
        }

        F10.favoriteListManage.favoriteListMarkedAsChanged(); // as far as we're concerned, list has been modified
        F10.favoriteListManage.rebuildDNDList();
    },

    onDrag: function(e) {

        // Keep track of the direction of the drag for use during onDragOver
        var y = YAHOO.util.Event.getPageY(e);

        if (y < this.lastY) {
            this.goingUp = true;
        } else if (y > this.lastY) {
            this.goingUp = false;
        }

        this.lastY = y;
    },

    onDragOver: function(e, id) {

        var srcEl = this.getEl();
        var destEl = YAHOO.util.Dom.get(id);

        // We are only concerned with list items, we ignore the dragover
        // notifications for the list.
        if (destEl.nodeName.toLowerCase() == "li") {
            var orig_p = srcEl.parentNode;
            var p = destEl.parentNode;

            if (this.goingUp) {
                p.insertBefore(srcEl, destEl); // insert above
            } else {
                p.insertBefore(srcEl, destEl.nextSibling); // insert below
            }

            YAHOO.util.DragDropMgr.refreshCache();
        }
    }
});

F10.favoriteListManage = {

    positionScrollingRightHandPanel: function(e) {
        if (YAHOO.env.ua.ie == 0) {
            // only do for non-ie
            var ADDITIONAL_Y_OFFSET = 10;
            var scrollFromTop = YAHOO.util.Dom.getDocumentScrollTop()
            var bodyOffsetFromTop = YAHOO.util.Dom.get("bd").offsetTop;

            var scrollingRightHandPanel = YAHOO.util.Dom.get("scrollingRightHandPanel");

            if(scrollFromTop > bodyOffsetFromTop - ADDITIONAL_Y_OFFSET){
                scrollingRightHandPanel.style.position="fixed";
                scrollingRightHandPanel.style.width=(scrollingRightHandPanel.parentNode.offsetWidth)+"px";
                scrollingRightHandPanel.style.top=ADDITIONAL_Y_OFFSET+"px";
            } else {
                scrollingRightHandPanel.style.position="relative";
                scrollingRightHandPanel.style.width="auto";
                scrollingRightHandPanel.style.top="0";
            }
        }
    },

    getAjaxSearchResultsForForm: function() {
        YAHOO.util.Connect.setForm("ajaxSearchForm");
        F10.favoriteListManage.getAjaxSearchResults("POST", F10.FORM_URL_SEARCH_RESULTS);
    },


    getAjaxSearchResultsForLink: function(url) {
        YAHOO.util.Connect.resetFormState();
        F10.favoriteListManage.getAjaxSearchResults("GET", url);
    },

    getAjaxSearchResults: function(httpMethod, url) {
        var ajaxSearchCallback = {
            success: function (oResponse) {
                YAHOO.util.Dom.get("ajaxSearchResultsPanel").innerHTML = oResponse.responseText;
                YAHOO.util.Dom.get("ajaxSearchForm:submit").disabled = false;

                var foundNodes = YAHOO.util.Dom.getElementsByClassName("search-result", "*", "ajaxSearchResultsPanel");

                if (foundNodes.length > 0) {
                    YAHOO.util.Dom.addClass("ajaxSearchFormPanel", "border-bottom-grey");
                } else {
                    YAHOO.util.Dom.removeClass("ajaxSearchFormPanel", "border-bottom-grey");
                }

                /** add moveSelectionToDDList event listeners to each of the add buttons **/
                for (var i=0; i<foundNodes.length; i++) {
                    var foundNode = foundNodes[i];
                    var addButtons = YAHOO.util.Dom.getElementsByClassName("add-button", "*", foundNode);
                    YAHOO.util.Event.addListener(addButtons, "click", F10.favoriteListManage.moveSelectionToDDList, foundNode.id);
                }

                /** if any of the found items are already in our list, then grey them out **/
                var existingItemContextElements = [];
                var foundInputHiddenItemIds = YAHOO.util.Dom.getElementsBy(function(el) {
                        return (el.type == "hidden");
                    },
                    "input", "ajaxSearchResultsPanel");

                var existingInputHiddenItemIds = YAHOO.util.Dom.getElementsBy(function(el) {
                        return (el.type == "hidden");
                    },
                    "input", "listItemPanel");

                for (var i=0; i<foundInputHiddenItemIds.length; i++) {
                    var foundItem = foundInputHiddenItemIds[i];
                    var foundItemId = foundItem.value;

                    for (var j=0; j<existingInputHiddenItemIds.length; j++) {
                        var existingItemId = existingInputHiddenItemIds[j].value;
                        if (existingItemId == foundItemId) {
                            /** existing same as found, find found's parent, grey it out and remove its listeners **/
                            for (var k=0; k<foundNodes.length; k++) {
                                var foundNode = foundNodes[k];
                                if (YAHOO.util.Dom.isAncestor(foundNode, foundItem)) {
                                    YAHOO.util.Dom.setStyle(foundNode, "opacity", "0.5");
                                    YAHOO.util.Event.purgeElement(foundNode, true);
                                    existingItemContextElements[existingItemContextElements.length] = foundNode;
                                    foundNode.title = foundNode.getAttribute('existingmessage');
                                }
                            }
                        }
                    }
                }

                /** add the tooltip for greyed out nodes **/
                new YAHOO.widget.Tooltip("ttExistingItemButton", {
                    context:existingItemContextElements } );

                /** add the tooltip for nodes that don't qualify for this list **/
                new YAHOO.widget.Tooltip("ttDoesntQualifyItemButton", {
                    context:YAHOO.util.Dom.getElementsByClassName("error-button", "*", "ajaxSearchResultsPanel") } );
            },
            failure: function (oResponse) {
                /** handle an unsuccessful request **/
                YAHOO.util.Dom.get("ajaxSearchResultsPanel").innerHTML = "Couldn't retrieve search results.  Please try again.";
            }
        }

        YAHOO.util.Dom.get("ajaxSearchForm:submit").disabled=true;
        YAHOO.util.Dom.get("ajaxSearchResultsPanel").innerHTML = "Searching...";
        YAHOO.util.Connect.asyncRequest(httpMethod, url, ajaxSearchCallback);
    },

    rebuildDNDList: function() {
        F10.favoriteListManage.rebuildItemNumsAndOnlyTop10WillPub();
        F10.favoriteListManage.showHideInfoNeed10Items();
        F10.favoriteListManage.rebuildDeleteButtons();
        F10.favoriteListManage.rebuildMemoShowHide();
        F10.favoriteListManage.enableDisableFormElements();
    },

    rebuildItemNumsAndOnlyTop10WillPub: function() {
        var listItems = YAHOO.util.Dom.getElementsByClassName("list-item-editable", "div", "listItemPanel");

        if (listItems.length > 0) {
            YAHOO.util.Dom.addClass("listFormButtonsTop", "border-bottom-grey");
        } else {
            YAHOO.util.Dom.removeClass("listFormButtonsTop", "border-bottom-grey");
        }

        /** start off by hiding the onlyTop10WillPublish div **/
        F10.util.hideIt("onlyTop10WillPublish");

        // redo item #'s and onlyTop10WillPublish div
        for(var i=0; i<listItems.length; i++){
            var listItem = listItems[i];

            if (i == 10) {
                /** we've shown 10 list items, so surface the
                onlyTop10WillPublish div and shove it inline here **/
                YAHOO.util.Dom.insertBefore("onlyTop10WillPublish", listItem.parentNode);
                F10.util.showIt("onlyTop10WillPublish");
            }

            var itemNumbers = YAHOO.util.Dom.getElementsByClassName("list-item-number", "div", listItem);
            for (var j=0; j<itemNumbers.length; j++) {
                itemNumbers[j].innerHTML = (i+1) + ".";
            }

            var topButton = YAHOO.util.Dom.getElementsByClassName("favorite-list-manage-move-to-top-button", "div", listItem);
            if (i == 0) {
                F10.util.hideIt(topButton);
            } else {
                F10.util.showIt(topButton);
            }
        }
    },

    showHideInfoNeed10Items: function() {
        var numListItems = YAHOO.util.Dom.getElementsByClassName("list-item-editable", "div", "listItemPanel").length;
        /** determine whether or not to show listFormControlsBottom **/
        if (numListItems < 4) {
            F10.util.hideIt("listFormControlsBottom");
            F10.util.showIt("stepOneStepTwo");
        } else {
            F10.util.showIt("listFormControlsBottom");
            F10.util.hideIt("stepOneStepTwo");
        }
        /** determine whether or not to show "need 10 items" info message **/
        var infoNeed10Items = YAHOO.util.Dom.getElementsByClassName("info-need-10-items");
        if (numListItems >= 10) {
            F10.util.hideIt(infoNeed10Items);
        } else {
            F10.util.showIt(infoNeed10Items);
        }
    },

    rebuildDeleteButtons: function() {
        /** recalculate the tooltip and onclick for the delete buttons that
             are in listItemPanel **/
        var deleteButtonContextElements = [];
        var deleteButtons = YAHOO.util.Dom.getElementsByClassName("delete-button", "*", "listItemPanel");
        var listItems = YAHOO.util.Dom.getElementsByClassName("list-item-editable", "div", "listItemPanel");
        for(var i=0; i<deleteButtons.length; i++){
            var deleteButton = deleteButtons[i];
            if (listItems.length > i) {
                var listItem = listItems[i];
                deleteButtonContextElements[deleteButtonContextElements.length] = deleteButton;
                YAHOO.util.Event.purgeElement(deleteButton);/** clean up before we add **/
                YAHOO.util.Event.addListener(deleteButton, "click", removeListItemDialog, listItem.parentNode);
            }
        }
        new YAHOO.widget.Tooltip("ttDeleteButton", {
            context:deleteButtonContextElements } );
    },

    showMemoEditable: function(e, listItem) {
        var itemMemo = YAHOO.util.Dom.getElementsByClassName("list-item-memo-editable", "*", listItem);
        F10.util.showIt(itemMemo);
        var memoShow = YAHOO.util.Dom.getElementsByClassName("list-item-memo", "*", listItem);
        F10.util.hideIt(memoShow);
        var memoShowNew = YAHOO.util.Dom.getElementsByClassName("list-item-memo-new", "*", listItem);
        F10.util.hideIt(memoShowNew);
    },

    hideMemoEditable: function(e, listItem) {
        var itemMemo = YAHOO.util.Dom.getElementsByClassName("list-item-memo-editable", "*", listItem);
        F10.util.hideIt(itemMemo);

        var memoTextAreas = YAHOO.util.Dom.getElementsBy(function(el) {
                return (el.type == "textarea");
            }, "*", listItem);
        if (memoTextAreas.length > 0) {
            var memoTextValue = memoTextAreas[0].value;
            if (memoTextValue.length > 0) {
                memoTextValue = memoTextValue.replace(/^\s+|\s+$/g,''); //trim leading and trailing whitespaces
            }
            if (memoTextValue.length > 0) {
                memoTextValue.replace(/^\s+|\s+$/g,''); //trim leading and trailing whitespaces
                if (memoTextValue.length > 100) {
                    memoTextValue = memoTextValue.substring(0,97) + "...";
                }
                var memoReadonlys = YAHOO.util.Dom.getElementsByClassName("list-item-memo-readonly", "*", listItem);
                if (memoReadonlys.length > 0) {
                    memoReadonlys[0].innerHTML = memoTextValue;
                }

                var memoShow = YAHOO.util.Dom.getElementsByClassName("list-item-memo", "*", listItem);
                F10.util.showIt(memoShow);
            } else {
                var memoShowNew = YAHOO.util.Dom.getElementsByClassName("list-item-memo-new", "*", listItem);
                F10.util.showIt(memoShowNew);
            }
        }
    },

    rebuildMemoShowHide: function() {
        /** recalculate the memo-show/hide functionality for each item **/
        var listItems = YAHOO.util.Dom.getElementsByClassName("list-item-editable", "div", "listItemPanel");
        for(var i=0; i<listItems.length; i++){
            var listItem = listItems[i];
            var memoShow = YAHOO.util.Dom.getElementsByClassName("list-item-memo-show", "*", listItem);
            YAHOO.util.Event.purgeElement(memoShow);/** clean up before we add **/
            YAHOO.util.Event.addListener(memoShow, "click", F10.favoriteListManage.showMemoEditable, listItem);
            YAHOO.util.Event.addListener(memoShow, "click", F10.favoriteListManage.favoriteListMarkedAsChanged);
            var memoHide = YAHOO.util.Dom.getElementsByClassName("list-item-memo-hide", "*", listItem);
            YAHOO.util.Event.purgeElement(memoHide);/** clean up before we add **/
            YAHOO.util.Event.addListener(memoHide, "click", F10.favoriteListManage.hideMemoEditable, listItem);
        }
    },

    enableDisableFormElements: function() {
        var numListItems = YAHOO.util.Dom.getElementsByClassName("list-item-editable", "div", "listItemPanel").length;
        var saveAndPublishButtons = document.getElementsByName("method:saveAndPublish");
        for(var i=0; i<saveAndPublishButtons.length; i++){
            var saveAndPublishButton = saveAndPublishButtons[i];
            if (numListItems < 10) {
                saveAndPublishButton.disabled=true;
            } else {
                saveAndPublishButton.disabled=false;
            }
        }

        var saveAsDraftButtons = document.getElementsByName("method:saveAsDraft");
        for(var i=0; i<saveAsDraftButtons.length; i++){
            var saveAsDraftButton = saveAsDraftButtons[i];
            if (numListItems < 1) {
                saveAsDraftButton.disabled=true;
            } else {
                saveAsDraftButton.disabled=false;
            }
        }
    },

    moveSelectionToDDList: function(e, selNodeId) {
        /** push the window down to "bottom" **/
        window.location.hash="bottom";

        /** get a handle on select node editable, clone it and add it to the list panel **/
        var selNodeEditable = YAHOO.util.Dom.get(selNodeId + "_editable");
        var newLN = selNodeEditable.cloneNode(true);
        newLN.id = "";
        YAHOO.util.Dom.generateId(newLN);


        var newLI = document.createElement("li");
        YAHOO.util.Dom.generateId(newLI);
        YAHOO.util.Dom.addClass(newLI, "small-list-editable");
        newLI.appendChild(newLN);
        YAHOO.util.Dom.get("listItemPanel").appendChild(newLI);


        /** fade the selected node out of the search panel **/
        var fadeOut = new YAHOO.util.Anim(selNodeId, {
                opacity: {from: .99, to: 0}
            }, 1, YAHOO.util.Easing.easeOut);
        fadeOut.onComplete.subscribe(function() {
            var el = this.getEl();
            el.parentNode.removeChild(el);
        });
        fadeOut.animate();

        /** fade the editable node in on the list panel **/
        var fadeIn = new YAHOO.util.Anim(newLN.id, {
                opacity: {from: 0, to: .99}
            }, 1, YAHOO.util.Easing.easeIn);
        fadeIn.onStart.subscribe(function() {
            var el = this.getEl();
            el.style.opacity = 0;
            el.style.visibility = "visible";
            el.style.display = "block";
        });
        fadeIn.animate();

        F10.favoriteListManage.addListItemToDDList(newLI);

        F10.favoriteListManage.favoriteListMarkedAsChanged(); // as far as we're concerned, list has been modified
        F10.favoriteListManage.rebuildDNDList();
    },

    addListItemToDDList: function(listItemNode) {
        // do this when adding a list item to DD list
        if (!YAHOO.util.DragDropMgr.isDragDrop(listItemNode.id)) {
            var ddNode = new F10.DDProxy(listItemNode.id, "flavgroup");
            ddNode.addInvalidHandleClass("form-field");
            ddNode.addInvalidHandleClass("delete-button");
        }
    },





    favoriteListManageActionTrigger: function(e) {
        var elTarget = YAHOO.util.Event.getTarget(e);
        while (elTarget != null && elTarget.id != "container") {

            if (YAHOO.util.Dom.hasClass(elTarget, "favorite-list-manage-move-to-top-button")) {
                var listItemNode = YAHOO.util.Dom.getAncestorByClassName(elTarget, "small-list-editable");
                F10.favoriteListManage.moveListItemToTop(listItemNode);
                break;

            } else {
                elTarget = elTarget.parentNode;
            }
        }
    },


    moveListItemToTop: function(listItemNode) {
        var listItems = YAHOO.util.Dom.getElementsByClassName("small-list-editable", "li", "listItemPanel");
        var listItemParent = listItems[0].parentNode;


        var fadeOut = new YAHOO.util.Anim(listItemNode, {
                opacity: {from: .99, to: 0}
            }, 1, YAHOO.util.Easing.easeOut);
        fadeOut.onComplete.subscribe(function() {
            window.location='#top';
            listItemParent.insertBefore(listItemNode, listItems[0]);
            F10.favoriteListManage.rebuildDNDList();
        });
        fadeOut.animate();


        /** fade the listItemNode out before we move it **/
        var fadeOut = new YAHOO.util.Anim(listItemNode, {
                opacity: {from: .99, to: 0}
            }, .5, YAHOO.util.Easing.easeOut);
        fadeOut.onComplete.subscribe(function() {
            listItemParent.insertBefore(listItemNode, listItems[0]);
            F10.favoriteListManage.favoriteListMarkedAsChanged(); // as far as we're concerned, list has been modified
            F10.favoriteListManage.rebuildDNDList();
            window.location='#top';

            /** fade the listItemNode back in at the top **/
            var fadeIn = new YAHOO.util.Anim(listItemNode, {
                    opacity: {from: 0, to: .99}
                }, .5, YAHOO.util.Easing.easeIn);
            fadeIn.animate();
        });
        fadeOut.animate();
    },




    favoriteListMarkedAsChanged: function() {
        if (F10.FAVORITE_LIST_MANAGE_MODIFIED == 0) {
            FAVORITE_LIST_MANAGE_MODIFIED = 1;
            mess = "Leaving now means that changes to your Favorite 10 will not be saved."
            YAHOO.util.Event.addListener(window, 'beforeunload', function(e){
                    if (YAHOO.env.ua.webkit == 0) {
                        e.returnValue = mess;
                    } else {
                        return mess;
                    }
                });
            // http://discuss.joelonsoftware.com/default.asp?design.4.357494.18
            // if (YAHOO.env.ua.ie == 0) {
        }
    },

    favoriteListMarkedAsNotChanged: function() {
        FAVORITE_LIST_MANAGE_MODIFIED = 0;
        YAHOO.util.Event.purgeElement(window);

    }

};


 /**********************************************************************
 *
 * listRating
 *
 **********************************************************************/
F10.LIST_ID = 0;
F10.LIST_RATING_MY_RATING = 0;
F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY = [];
F10.LIST_RATING_MY_RATING_STARS_ARRAY = [];

F10.listRating = {

    rebuildMyRatingRollover: function() {
        var myRatingNode = YAHOO.util.Dom.getElementsByClassName("my-rating");

        YAHOO.util.Event.addListener(myRatingNode, "mouseout",
            function(e) {
                /** if the related target was a child of this, then don't do anything **/
                var relatedTarget = (e.relatedTarget) ? e.relatedTarget : e.toElement;
                if (relatedTarget != null) {
                    while (relatedTarget.parentNode != null) {
                        if (relatedTarget == this) {
                            return;
                        };
                        relatedTarget = relatedTarget.parentNode;
                    }
                }

                /** mouseout took place when mouse actually left layer
                     handle event **/
                F10.listRating.updateMyRatingStars(e, F10.LIST_RATING_MY_RATING, false);

                /** we're done, so halt event bubbling **/
                YAHOO.util.Event.stopPropagation(e);
            });

        /** cache the rating stars and rating description nodes so we don't have
             to crawl the dom every time they change **/
        F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY = [];
        F10.LIST_RATING_MY_RATING_STARS_ARRAY = [];
        F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY[F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY.length] = YAHOO.util.Dom.getElementsByClassName("my-rating-desc");
        for (var thisRating = 1; thisRating <= 5; thisRating++) {
            F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY[F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY.length] = YAHOO.util.Dom.getElementsByClassName("my-rating-desc-" + thisRating);
            F10.LIST_RATING_MY_RATING_STARS_ARRAY[F10.LIST_RATING_MY_RATING_STARS_ARRAY.length] = YAHOO.util.Dom.getElementsByClassName("my-rating-" + thisRating);
        }

        /** attach mouseover and click event listeners to the rating stars **/
        for(var thisRating = 1; thisRating <= 5; thisRating++){
            var ratingStar = F10.LIST_RATING_MY_RATING_STARS_ARRAY[thisRating - 1];
            YAHOO.util.Event.addListener(ratingStar, "mouseover", F10.listRating.updateMyRatingStars, thisRating);
            YAHOO.util.Event.addListener(ratingStar, "click", F10.listRating.submitMyRating, thisRating);
        }
    },

    submitMyRating: function(e, rating) {
        F10.LIST_RATING_MY_RATING = rating;

        var submitMyRatingCallback = {
            success: function (oResponse) {
                    var listRatingComps = YAHOO.util.Dom.getElementsByClassName("list-rating-comp");

                    for (var i = 0; i < listRatingComps.length; i++ ) {
                        listRatingComps[i].innerHTML = oResponse.responseText;
                    }

                    F10.listRating.rebuildMyRatingRollover();
            },
            failure: function (oResponse) {
                /** handle an unsuccessful request **/
                var listRatingComps = YAHOO.util.Dom.getElementsByClassName("list-rating-comp");

                for (var i = 0; i < listRatingComps.length; i++ ) {
                    listRatingComps[i].innerHTML = "Error processing ratings updates.";
                }
            }
        }

        YAHOO.util.Connect.asyncRequest('POST', F10.FORM_URL_UPDATE_MY_LIST_RATING, submitMyRatingCallback, "listId=" + F10.LIST_ID + "&myListRatingValue=" + F10.LIST_RATING_MY_RATING);
    },

    updateMyRatingStars: function(e, rating, showValueDesc) {
        /** hide all "my-rating-desc" nodes **/
        for (var i = 0; i < F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY.length; i++) {
            var myRatingDescsToHide = F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY[i];

            for (var j = 0; j < myRatingDescsToHide.length; j++) {
                myRatingDescsToHide[j].style.visibility = "hidden";
                myRatingDescsToHide[j].style.display = "none";
            }
        }

        /** show indigo or empty star accordingly **/
        for(var thisRating = 1; thisRating <= 5; thisRating++){
            var ratingStars = F10.LIST_RATING_MY_RATING_STARS_ARRAY[thisRating - 1];

            if (rating >= thisRating) { /** rating is greater than or equal to the current rating, so whole star **/
                YAHOO.util.Dom.replaceClass(ratingStars, "rating-star-empty", "rating-star-indigo");

            } else { /** show blank star **/
                YAHOO.util.Dom.replaceClass(ratingStars, "rating-star-indigo", "rating-star-empty");
            }
        }

        /** unhide only the "my-rating-desc" node that should be shown **/
        var myRatingDescs = F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY[0];
        if (showValueDesc != false) {
            myRatingDescs = F10.LIST_RATING_MY_RATING_DESCRIPTIONS_ARRAY[rating];
        }
        for (var i = 0; i < myRatingDescs.length; i++) {
            myRatingDescs[i].style.visibility = "visible";
            myRatingDescs[i].style.display = "inline";
        }

        /** we're done, so halt event bubbling **/
        YAHOO.util.Event.stopPropagation(e);
    }
};

/**********************************************************************
 *
 * userComment
 *
 **********************************************************************/
F10.USER_COMMENT_FOR_DELETE = null;

F10.userComment = {

    userCommentActionTrigger: function(e) {
        var elTarget = YAHOO.util.Event.getTarget(e);
        while (elTarget != null && elTarget.id != "container") {

            if (YAHOO.util.Dom.hasClass(elTarget, "user-comment-delete-button")) {
                F10.USER_COMMENT_FOR_DELETE = elTarget;
                F10.modalDialog.show("modalConfirmDeleteUserComment");
                break;

            } else if (YAHOO.util.Dom.hasClass(elTarget, "user-comment-edit-button")) {
                F10.userComment.editUserComment(elTarget);
                break;

            } else {
                elTarget = elTarget.parentNode;
            }
        }
    },

    submitUserComment: function(userCommentId) {
        var commentNode = YAHOO.util.Dom.get("userComment-" + userCommentId);
        var formId = "userCommentForm-" + userCommentId;
        var submittingOverlay = F10.util.submittingOverlayShow(commentNode);

        /* set up callback */
        var submitUserCommentCallback = {
            success: function (oResponse) {
                /* render the comment with new content */
                oResponse.argument.commentNode.parentNode.innerHTML = oResponse.responseText;
                F10.form.checkAllTextAreaMaxLengths();
                /* destroy submitting overlay */
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(commentNode);

                /* re-enable the submit button(s) */
                var submitButtons = YAHOO.util.Dom.getElementsByClassName("user-comment-form-submit", "*", commentNode);
                for (var i = 0; i < submitButtons.length; i++ ) {
                    submitButtons[i].disabled = false;
                }
                /* destroy submitting overlay */
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {commentNode:commentNode, submittingOverlay:submittingOverlay}
        }

        /* disable the submit button(s) */
        var submitButtons = YAHOO.util.Dom.getElementsByClassName("user-comment-form-submit", "*", formId);
        for (var i = 0; i < submitButtons.length; i++ ) {
            submitButtons[i].disabled = true;
        }

        /* attach the form, get the url and make the request */
        YAHOO.util.Connect.setForm(formId);
        var formURL = F10.FORM_URL_USER_COMMENT;
        YAHOO.util.Connect.asyncRequest("POST", formURL, submitUserCommentCallback);
    },

    submitUserCommentDelete: function(userCommentDeleteNode) {
        //var commentNode = YAHOO.util.Dom.get("userComment-" + userCommentId);
        var userCommentId = userCommentDeleteNode.id.replace("userCommentDelete", "");
        var submittingOverlay = F10.util.submittingOverlayShow(userCommentDeleteNode);

        var deleteUserCommentCallback = {
            success: function (oResponse) {
                var userCommentNode = YAHOO.util.Dom.getAncestorByClassName(userCommentDeleteNode, "user-comment");
                F10.util.fadeAndRemove(userCommentNode);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(userCommentDeleteNode);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {userCommentDeleteNode:userCommentDeleteNode, submittingOverlay:submittingOverlay}
        }

        YAHOO.util.Connect.asyncRequest('POST', F10.FORM_URL_USER_COMMENT_DELETE, deleteUserCommentCallback, "userComment.userCommentId=" + userCommentId);
    },

    deleteUserComment: function() {
        F10.userComment.submitUserCommentDelete(F10.USER_COMMENT_FOR_DELETE);
        F10.modalDialog.hide("modalConfirmDeleteUserComment");
    },

    cancelUserComment: function(userCommentId) {
        var userComment = YAHOO.util.Dom.get("userComment-" + userCommentId);
        /* hide editable comment */
        var userCommentEdits = YAHOO.util.Dom.getElementsByClassName("user-comment-edit", "*", userComment);
        for(var i=0; i<userCommentEdits.length; i++){
            var userCommentEdit = userCommentEdits[i];
            F10.util.hideIt(userCommentEdit);
        }
        /* show readonly comment */
        var userCommentReads = YAHOO.util.Dom.getElementsByClassName("user-comment-read", "*", userComment);
        for(var i=0; i<userCommentReads.length; i++){
            var userCommentRead = userCommentReads[i];
            F10.util.showIt(userCommentRead);
        }
    },

    editUserComment: function(userCommentEditButton) {
        var userComment = YAHOO.util.Dom.getAncestorByClassName(userCommentEditButton, "user-comment");
        /* hide readonly comment */
        var userCommentReads = YAHOO.util.Dom.getElementsByClassName("user-comment-read", "*", userComment);
        for(var i=0; i<userCommentReads.length; i++){
            var userCommentRead = userCommentReads[i];
            F10.util.hideIt(userCommentRead);
        }
        /* show editable comment */
        var userCommentEdits = YAHOO.util.Dom.getElementsByClassName("user-comment-edit", "*", userComment);
        for(var i=0; i<userCommentEdits.length; i++){
            var userCommentEdit = userCommentEdits[i];
            F10.util.showIt(userCommentEdit);
        }
    }
};

/**********************************************************************
 *
 * userFriend
 *
 **********************************************************************/
 F10.userFriend = {
    getUserFriendIdFromDomId: function(userFriendDomId) {
        var userFriendId = userFriendDomId.replace("userFriendId", "");
        return userFriendId;
    },

    getFriendIdFromDomId: function(friendDomId) {
        var friendId = friendDomId.replace("friendId", "");
        return friendId;
    },

    getNumberOfFriends: function() {
        var friends = YAHOO.util.Dom.getElementsByClassName("friend", "div", "tabFriends");
        return friends.length;
    },

    getNumberOfInvitesFromMe: function() {
        var invitations = YAHOO.util.Dom.getElementsByClassName("user-friend", "div", "tabInvitesFromMe");
        return invitations.length;
    },

    getNumberOfInvitesForMe: function() {
        var invitations = YAHOO.util.Dom.getElementsByClassName("user-friend", "div", "tabInvitesForMe");
        return invitations.length;
    },

    reWriteFriendTabHeaders: function() {
        var tabFriendsHeader = YAHOO.util.Dom.get("tabFriendsHeader");
        tabFriendsHeader.innerHTML = tabFriendsHeader.innerHTML.replace(/\(.*\)/, "(" + F10.userFriend.getNumberOfFriends() + ")");

        var tabInvitesFromMeHeader = YAHOO.util.Dom.get("tabInvitesFromMeHeader");
        tabInvitesFromMeHeader.innerHTML = tabInvitesFromMeHeader.innerHTML.replace(/\(.*\)/, "(" + F10.userFriend.getNumberOfInvitesFromMe() + ")");

        var tabInvitesForMeHeader = YAHOO.util.Dom.get("tabInvitesForMeHeader");
        tabInvitesForMeHeader.innerHTML = tabInvitesForMeHeader.innerHTML.replace(/\(.*\)/, "(" + F10.userFriend.getNumberOfInvitesForMe() + ")");
    },

    submitFriendDecline: function(userFriendNode) {
        var userFriendId = F10.userFriend.getUserFriendIdFromDomId(userFriendNode.id);
        var submittingOverlay = F10.util.submittingOverlayShow(userFriendNode);

        var deleteUserFriendCallback = {
            success: function (oResponse) {
                F10.util.fadeAndRemove(userFriendNode, F10.userFriend.reWriteFriendTabHeaders);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(userFriendNode);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {userFriendNode:userFriendNode, submittingOverlay:submittingOverlay}
        }

        YAHOO.util.Connect.asyncRequest('POST', F10.FORM_URL_FRIEND_DECLINE, deleteUserFriendCallback, "userFriendId=" + userFriendId);
    },

    submitFriendDelete: function(friendNode) {
        var friendId = F10.userFriend.getFriendIdFromDomId(friendNode.id);
        var submittingOverlay = F10.util.submittingOverlayShow(friendNode);

        var deleteFriendCallback = {
            success: function (oResponse) {
                F10.util.fadeAndRemove(friendNode, F10.userFriend.reWriteFriendTabHeaders);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(friendNode);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {friendNode:friendNode, submittingOverlay:submittingOverlay}
        }

        YAHOO.util.Connect.asyncRequest('POST', F10.FORM_URL_FRIEND_DELETE, deleteFriendCallback, "friendId=" + friendId);
    }
};



/**********************************************************************
 *
 * userProfile
 *
 **********************************************************************/
F10.USER_PROFILE_FRIEND_FOR_DELETE = null;
F10.USER_PROFILE_FRIEND_FOR_DECLINE = null;
F10.userProfile = {

    friendActionTrigger: function(e) {
        var elTarget = YAHOO.util.Event.getTarget(e);
        while (elTarget != null && elTarget.id != "container") {
            if (elTarget.id == "inviteMessageText") {
                F10.userProfile.showInviteMessage();
                break;
            } else if (YAHOO.util.Dom.hasClass(elTarget, "delete-button")) {
                F10.USER_PROFILE_FRIEND_FOR_DELETE = elTarget;
                F10.modalDialog.show("modalConfirmUserProfileDeleteFriend");
                break;
            } else if (YAHOO.util.Dom.hasClass(elTarget, "decline-button")) {
                F10.USER_PROFILE_FRIEND_FOR_DECLINE = elTarget;
                F10.modalDialog.show("modalConfirmUserProfileDeclineFriend");
                break;
            } else if (YAHOO.util.Dom.hasClass(elTarget, "accept-button")) {
                F10.userProfile.submitFriendAccept(elTarget);
                break;
            } else {
                elTarget = elTarget.parentNode;
            }
        }
    },

    deleteFriend: function() {
        F10.userProfile.submitFriendDelete(F10.USER_PROFILE_FRIEND_FOR_DELETE);
        F10.modalDialog.hide("modalConfirmUserProfileDeleteFriend");
    },

    declineFriend: function() {
        F10.userProfile.submitFriendDecline(F10.USER_PROFILE_FRIEND_FOR_DECLINE);
        F10.modalDialog.hide("modalConfirmUserProfileDeclineFriend");
    },

    showInviteMessage: function() {
        YAHOO.util.Dom.removeClass("inviteMessageText", "div-link");
        F10.util.showIt("inviteMessageForm");
    },

    submitFriendInvite: function() {
        var userFriendComponent = YAHOO.util.Dom.get("userFriendComponent");
        var submittingOverlay = F10.util.submittingOverlayShow(userFriendComponent);

        var inviteFriendCallback = {
            success: function (oResponse) {
                oResponse.argument.userFriendComponent.innerHTML = oResponse.responseText;
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(userFriendComponent);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {userFriendComponent:userFriendComponent, submittingOverlay:submittingOverlay}
        }

        /* attach the form, get the url and make the request */
        YAHOO.util.Connect.setForm("friendInviteForm");
        YAHOO.util.Connect.asyncRequest("POST", F10.FORM_URL_ACCT_COMP_FRIEND_INVITE, inviteFriendCallback);
    },

    submitFriendAccept: function(userFriendNode) {
        var userFriendId = F10.userFriend.getUserFriendIdFromDomId(userFriendNode.id.replace("Accept", ""));
        var userFriendComponent = YAHOO.util.Dom.get("userFriendComponent");
        var submittingOverlay = F10.util.submittingOverlayShow(userFriendNode);

        var acceptUserFriendCallback = {
            success: function (oResponse) {
                oResponse.argument.userFriendComponent.innerHTML = oResponse.responseText;
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(userFriendComponent);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {userFriendComponent:userFriendComponent, submittingOverlay:submittingOverlay}
        }

        YAHOO.util.Connect.asyncRequest('POST', F10.FORM_URL_ACCT_COMP_FRIEND_ACCEPT, acceptUserFriendCallback, "userFriendId=" + userFriendId);
    },

    submitFriendDecline: function(userFriendNode) {
        var userFriendId = F10.userFriend.getUserFriendIdFromDomId(userFriendNode.id);
        var userFriendComponent = YAHOO.util.Dom.get("userFriendComponent");
        var submittingOverlay = F10.util.submittingOverlayShow(userFriendNode);

        var declineUserFriendCallback = {
            success: function (oResponse) {
                oResponse.argument.userFriendComponent.innerHTML = oResponse.responseText;
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(userFriendComponent);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {userFriendComponent:userFriendComponent, submittingOverlay:submittingOverlay}
        }

        YAHOO.util.Connect.asyncRequest('POST', F10.FORM_URL_ACCT_COMP_FRIEND_DECLINE, declineUserFriendCallback, "userFriendId=" + userFriendId);
    },

    submitFriendDelete: function(friendNode) {
        var friendId = F10.userFriend.getFriendIdFromDomId(friendNode.id);
        var userFriendComponent = YAHOO.util.Dom.get("userFriendComponent");
        var submittingOverlay = F10.util.submittingOverlayShow(userFriendComponent);

        var deleteFriendCallback = {
            success: function (oResponse) {
                oResponse.argument.userFriendComponent.innerHTML = oResponse.responseText;
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            failure: function (oResponse) {
                F10.util.submitFailedShow(userFriendComponent);
                F10.util.submittingOverlayHide(submittingOverlay);
            },
            argument: {userFriendComponent:userFriendComponent, submittingOverlay:submittingOverlay}
        }

        YAHOO.util.Connect.asyncRequest('POST', F10.FORM_URL_ACCT_COMP_FRIEND_DELETE, deleteFriendCallback, "friendId=" + friendId);
    }
};
