/**
 * This interface having vinfolio myAccount module related listeners and Ajax functions a
 */
YAHOO.widget.CVMAInterface = function ()
{
  this.targetAction = "myAccount";
  //this flag is to identify whether the 'initializeWindow()' have to call or not
  this.canInitializeWindow = true;

  this.dimmer = new DynamicDimLayer();
  this.dimmer.defaultHideMessage = true;

  this.editSignInHandler = new EditSignInHandler(this);
  this.billingHandler = new BillingHandler(this);

  this.overlayDimmer = new DynamicDimLayer();
  this.overlayDimmer.zIndex = 500;
  this.overlayDimmer.topAdjust = 34;

  //list of all sortHandler related to myAccount module
  this.wineclubSortHandler = new SortHandler(this, this.targetAction, "tableContainer" , false , "winestore");
  this.savedSearchSortHandler = new SortHandler(this, this.targetAction, "savedSearchContainer" , "savedSearchContext=SavedSearch" , "winestore","savedSearch");
  this.savableFilterSortHandler = new SortHandler(this, this.targetAction, "savableFilterContainer" , "savedSearchContext=SavableFilter" , "winestore","savableFilter");
  this.sellRequestSortHandler = new SortHandler(this, "activeSellRequest", "tableContainer" , false , "winestore/myAccount");
  this.quoteRequestSortHandler = new SortHandler(this, "activeQuoteRequest", "tableContainer" , false , "winestore/myAccount");
  this.sellRequestDetailSortHandler = new SortHandler(this, "activeSellRequestDetail", "tableContainer", false, "winestore/myAccount");
  this.moveRequestSortHandler = new SortHandler(this, "customerMoveRequest", "tableContainer", false, "winestore");
  this.wineWatcherHistoryHandler = new SortHandler(this, "wineWatcherHistory", "tableContainer", false, "winestore");
  this.customerOrderRequestSortHandler = new SortHandler(this, "customerOrderRequest", "tableContainer", false, "winestore");
  this.mpWinningBidsSortHandler = new SortHandler(this, "marketplaceOrderRequest", "WinningBids-tableContainer", "context=WinningBids", "winestore/myAccount","WinningBids");
  this.mpOrderHistorySortHandler = new SortHandler(this, "marketplaceOrderRequest", "AllOrder-tableContainer", "context=AllOrder", "winestore/myAccount","AllOrder");

  //list of all pageHandler related to myAccount module
  this.sellRequestPageControlHandler = new PageControlHandler(this, "activeSellRequest", "winestore/myAccount");
  this.quoteRequestPageControlHandler = new PageControlHandler(this, "activeQuoteRequest", "winestore/myAccount");
  this.savedSearchPageControlHandler = new PageControlHandler(this, this.targetAction, "winestore", "savedSearchContainer" , "savedSearchContext=SavedSearch","savedSearch");
  this.savableFilterPageControlHandler = new PageControlHandler(this, this.targetAction, "winestore", "savableFilterContainer" , "savedSearchContext=SavableFilter","savableFilter");
  this.wineClubPageControlHandler = new PageControlHandler(this, this.targetAction, "winestore");
  this.sellRequestDetailPageControlHandler = new PageControlHandler(this, "activeSellRequestDetail", "winestore/myAccount");
  this.moveRequestPageControlHandler = new PageControlHandler(this, "customerMoveRequest", "winestore");
  this.wineWatcherHistoryPageControlHandler = new PageControlHandler(this, "wineWatcherHistory", "winestore");
  this.customerOrderRequestPageControlHandler = new PageControlHandler(this, "customerOrderRequest", "winestore");
  this.mpWinningBidsPageControlHandler = new PageControlHandler(this, "marketplaceOrderRequest", "winestore/myAccount", "WinningBids-tableContainer","context=WinningBids","WinningBids");
  this.mpOrderPageControlHandler = new PageControlHandler(this, "marketplaceOrderRequest", "winestore/myAccount", "AllOrder-tableContainer","context=AllOrder","AllOrder");

  this.alertHandler = new AlertHandler("WineStore");
  this.alertHandler.target=this;
  this.alertHandler.application = "marketplace";
  this.alertHandler.action = "activityMatch";
  this.alertHandler.formName = "activityMatchForm";

  this.selectedContext ="";
  this.moveLogExpandIndex=-1;
  if(document.getElementById("view"))
  {
    this.selectedContext = document.getElementById("view").value;
  }
};

YAHOO.widget.CVMAInterface.prototype = {

  initNavigator: function()
  {
    //We should not reinitialize window from the popup window...
    if (this.canInitializeWindow)
    {
      initializeWindow(); //popup.js
    }
    this.canInitializeWindow = true;

    this.initChangeContext();
    //initialize listener to corresponding functionalities based on context
    if (this.selectedContext == 'preferences')
    {
      this.initEmailCommunication();
      this.initCatalogSubscription();
      this.editSignInHandler.init();
      this.initEditPersonalInfo();
      this.initRedeemGiftCard();
    }
    else if (this.selectedContext == 'billing')
    {
      this.billingHandler.initBilling();
    }
    else if (this.selectedContext == 'shipping')
    {
      this.initShippingAddress();
    }
    else if (this.selectedContext == 'savedSearches')
    {
      this.initSavedSearch();
    }
    this.initQuoteRequest();
    this.initSellRequest();
    this.initMoveRequest();
    this.initDeliveryCredit();
    this.initStorageActivity();
    this.initOpenOrder();
    this.initCustomerOrderRequest();
    this.initMarketplace();

    var myAccountProfile = document.getElementById('myAccountProfile');
    if (myAccountProfile)
    {
       YAHOO.util.Event.purgeElement(myAccountProfile, false, "click");
       YAHOO.util.Event.addListener(myAccountProfile, "click", this.openURL.bind(this, 'profile'), true);
    }
    var myAccountPreference= document.getElementById('myAccountPreference');
    if (myAccountPreference)
    {
       YAHOO.util.Event.purgeElement(myAccountPreference, false, "click");
       YAHOO.util.Event.addListener(myAccountPreference, "click", this.openURL.bind(this, 'preferences'), true);
    }
    var  myAccountPrivacy= document.getElementById('myAccountPrivacy');
    if (myAccountPrivacy)
    {
       YAHOO.util.Event.purgeElement(myAccountPrivacy, false, "click");
       YAHOO.util.Event.addListener(myAccountPrivacy, "click", this.openURL.bind(this, 'privacy'), true);
    }
    var myAccountSubscriptions=document.getElementById('myAccountSubscription')
    if(myAccountSubscriptions)
    {
       YAHOO.util.Event.purgeElement(myAccountSubscriptions, false, "click");
       YAHOO.util.Event.addListener(myAccountSubscriptions, "click", this.openURL.bind(this, 'subscriptions'), true);
    }

    var myAccountAlerts=document.getElementById('myAccountAlerts')
    if(myAccountAlerts)
    {
       YAHOO.util.Event.purgeElement(myAccountAlerts, false, "click");
       YAHOO.util.Event.addListener(myAccountAlerts, "click", this.openURL.bind(this, 'alerts'), true);
    }

    this.alertHandler.initDeleteAlerts();
    this.loadAsyncContent();
  },

  initChangeContext: function()
  {
    //TODO: need to check any better way other than this(current listener will not work if we align the corresponding jsp)
    // Wire up the my account tabs, they change context when clicked
    var tabDiv = YAHOO.util.Dom.get("my-account-tabs");
    if (tabDiv)
    {
      var tabUl = tabDiv.firstChild;
      for (var i = 0; i < tabUl.childNodes.length; i++)
      {
        // for Billing tab, when the cookie is enabled no id will be there for the li element.
        if (tabUl.childNodes[i] != undefined && tabUl.childNodes[i].firstChild != undefined && tabUl.childNodes[i].id != '')
        {
          tabUl.childNodes[i].firstChild.onclick = this.changeContext.bind(this);
        }
      }
    }
  },

  loadAsyncContent: function ()
  {
    var wineClub = YAHOO.util.Dom.get("wineclub-loading");
    if (wineClub != null)
    {
      var asyncCallback = {success:this.handleLoadAsyncContentSuccess.bind(this),failure:this.handleFailure.bind(this)};
      // Make the async request.
      vfAsyncRequest("GET", "/do/winestore/myAccount?doAction=loadWineClubs", asyncCallback);
    }
    return false;
  },

  handleLoadAsyncContentSuccess: function (response)
  {
    var jsonObject = getJsonObject(response);

    var wineClub = YAHOO.util.Dom.get("wineclub-loading");
    if (wineClub != null)
    {
      wineClub.innerHTML=jsonObject.content;
    }
    var wineClubCount = YAHOO.util.Dom.get("wineClubCount");
    if (wineClubCount)
    {
      wineClubCount.innerHTML = jsonObject.count;
    }
    this.initWineClub();
    return false;
  },
  
  initEditPersonalInfo: function ()
  {
    var saveBtn = YAHOO.util.Dom.get("savePersonalInfo");
    if (saveBtn)
    {
      YAHOO.util.Event.purgeElement(saveBtn, false, "click");
      saveBtn.onclick = this.updatePersonalInformation.bind(this);
    }
  },

  initDeliveryCredit: function()
  {
    var deliveryCreditObj = YAHOO.util.Dom.getElementsByClassName("delivery-credits", "a");
    if (deliveryCreditObj && deliveryCreditObj.length > 0)
    {
      var customerId = deliveryCreditObj[0].id;
      YAHOO.util.Event.addListener(deliveryCreditObj, "click", this.openDeliveryCreditReport.bind(this, customerId), this, true);
    }
  },

  initStorageActivity: function()
  {
    var showStorageActivity = YAHOO.util.Dom.get('showStorageActivityReport');
    YAHOO.util.Event.addListener(showStorageActivity, "click", this.storagePeriodReports, this, true);
  },

  initOpenOrder: function()
  {
    var viewOrder = YAHOO.util.Dom.getElementsByClassName('view-order', 'a')
    if (viewOrder)
    {
      for (var i = 0; i < viewOrder.length; i++)
      {
        var orderNumber = viewOrder[i].id;
        YAHOO.util.Event.addListener(viewOrder[i], "click", this.openVinfolioInvoice.bind(this, orderNumber), this, true);
      }
    }

    var openOrdersObj = document.getElementById("openOrders");
    if (openOrdersObj)
    {
      YAHOO.util.Event.purgeElement(openOrdersObj, false, "click");
      // add listener to display open orders
       YAHOO.util.Event.addListener(openOrdersObj, "click", this.displayOrders.bind(this, 'OpenOrder', 'winestoreMyAccount'), true);
    }

    var allOrdersObj = document.getElementById("allOrders");
    if (allOrdersObj)
    {
      YAHOO.util.Event.purgeElement(allOrdersObj, false, "click");
      // add listener to display all orders
       YAHOO.util.Event.addListener(allOrdersObj, "click", this.displayOrders.bind(this, 'AllOrders', 'winestoreMyAccount'), true);
    }
  },

  initRedeemGiftCard: function()
  {
    var btnGo = YAHOO.util.Dom.get("btnGo");
    if (btnGo)
    {
      btnGo.onclick = this.redeemGiftCard.bind(this);
    }
    var learnmore = YAHOO.util.Dom.getElementsByClassName("learn-more","A")[0];
    if (learnmore)
    {
      learnmore.onclick = this.redeemHelpPopup.bind(this);
    }
  },

  initMoveRequest: function()
  {
    var customerMoveRequestObj = document.getElementById("customerMoveRequest");
    if (customerMoveRequestObj)
    {
      YAHOO.util.Event.purgeElement(customerMoveRequestObj, false, "click");
      // display the move requests for the customer
      YAHOO.util.Event.addListener(customerMoveRequestObj, "click", this.displayMoveRequests, this, true);
    }

    /* Initialize listener for move request expand link. */
    var moveRequestDetailObj = YAHOO.util.Dom.getElementsByClassName("expand-moveRequest", "a");
    if (moveRequestDetailObj)
    {
      for (var i = 0; i < moveRequestDetailObj.length; i++)
      {
        YAHOO.util.Event.purgeElement(moveRequestDetailObj[i], false, "click");
        YAHOO.util.Event.addListener(moveRequestDetailObj[i], "click", this.expandMoveRequest, this, true);
      }
    }

    /* Initialize listener for move request View Invoice link. */
    var moveRequestInvoiceObj = YAHOO.util.Dom.getElementsByClassName("moveRequestInvoice", "span");
    if (moveRequestInvoiceObj)
    {
      for (var i = 0; i < moveRequestInvoiceObj.length; i++)
      {
        YAHOO.util.Event.purgeElement(moveRequestInvoiceObj[i], false, "click");
        YAHOO.util.Event.addListener(moveRequestInvoiceObj[i], "click", this.openMoveRequestInvoice, this, true);
      }
    }
    /* Initialize listener for page navigation for move request. */
    var moveRequestPager = YAHOO.util.Dom.getElementsByClassName('moverequest-page-navigation', 'div')
    this.moveRequestPageControlHandler.bindElements(moveRequestPager);

    this.initSort("CustomerMoveRequests", this.moveRequestSortHandler);

    /* Initialize listener for page navigation for move request. */
    var wineWatcherHistoryPager = YAHOO.util.Dom.getElementsByClassName('wineWatcherHistory-page-navigation', 'div')
    this.wineWatcherHistoryPageControlHandler.bindElements(wineWatcherHistoryPager);

    this.initSort("wineWatcherHistory", this.wineWatcherHistoryHandler);
  },

  initCustomerOrderRequest: function()
  {

    /* Initialize listener for page navigation for move request. */
    var customerOrderRequestPager = YAHOO.util.Dom.getElementsByClassName('customerOrderRequest-table-navigation', 'div')
    this.customerOrderRequestPageControlHandler.bindElements(customerOrderRequestPager);


    this.initSort("customerOrderRequests", this.customerOrderRequestSortHandler);

  },

  initShippingAddress: function()
  {
    var shippingAddressEdit = YAHOO.util.Dom.getElementsByClassName("link-arrow", "a");

    for (var i = 0; i < shippingAddressEdit.length; i++)
    {
      var id = shippingAddressEdit[i].id;
      var splittedId = id.split("_")
      if (splittedId[0] == 'shipping')
      {
        YAHOO.util.Event.purgeElement(shippingAddressEdit[i], false, "click");
        // edit the shipping address.
        YAHOO.util.Event.addListener(shippingAddressEdit[i], "click", this.handleShippingAddressEditClickRequest, this, true);
      }
    }

    var shippingAddressdelete = YAHOO.util.Dom.getElementsByClassName("link-trash", "a");
    for (var i = 0; i < shippingAddressdelete.length; i++)
    {
      var id = shippingAddressdelete[i].id;
      var splittedId = id.split("_")
      if (splittedId[0] == 'shipping')
      {
        YAHOO.util.Event.purgeElement(shippingAddressdelete[i], false, "click");
        // delete the shipping address.
        YAHOO.util.Event.addListener(shippingAddressdelete[i], "click", this.showdeleteShippingAddressPopup, this, true);
      }
    }

    var addPrimaryShippingAddress = YAHOO.util.Dom.getElementsByClassName("btn-add-new-primary", "a");
    for (var i = 0; i < addPrimaryShippingAddress.length; i++)
    {
      var id = addPrimaryShippingAddress[i].id;
      var splittedId = id.split("_")
      if (splittedId[0] == 'shipping')
      {
        YAHOO.util.Event.purgeElement(addPrimaryShippingAddress[i], false, "click");
        // add shipping address
        YAHOO.util.Event.addListener(addPrimaryShippingAddress[i], "click", this.handlePrimaryShippingAddressAddRequest, this, true);
      }
    }

    var addSecondaryShippingAddress = YAHOO.util.Dom.getElementsByClassName("btn-add-new", "a");
    for (var i = 0; i < addSecondaryShippingAddress.length; i++)
    {
      var id = addSecondaryShippingAddress[i].id;
      var splittedId = id.split("_")
      if (splittedId[0] == 'shipping')
      {
        YAHOO.util.Event.purgeElement(addSecondaryShippingAddress[i], false, "click");

        YAHOO.util.Event.addListener(addSecondaryShippingAddress[i], "click", this.handleSecondaryShippingAddressAddRequest, this, true);
      }
    }

  },

  initSavedSearch: function()
  {
    var renameLink = YAHOO.util.Dom.getElementsByClassName("rename-saved-search");
    for (var index = 0; index < renameLink.length; index++)
    {
      if (renameLink[index].id)
      {
        YAHOO.util.Event.purgeElement(renameLink[index])
        YAHOO.util.Event.addListener(renameLink[index],"click",this.rename_saved_search_popup.bind(this));
      }
    }

    var deleteLink = YAHOO.util.Dom.getElementsByClassName("delete-saved-search");
    for (var index = 0; index < deleteLink.length; index++)
    {
      if (deleteLink[index].id)
      {
        //deleteLink[index].onclick = this.delete_saved_search.bind(this);
        YAHOO.util.Event.purgeElement(deleteLink[index])
        YAHOO.util.Event.addListener(deleteLink[index], "click", this.delete_saved_search.bind(this));
      }
    }

    var savedSearchPagerElements = YAHOO.util.Dom.getElementsByClassName('savedsearch-page-navigation', 'div')
    this.savedSearchPageControlHandler.bindElements(savedSearchPagerElements);
    this.initSort("SavedSearch", this.savedSearchSortHandler);

    var savableFilterPagerElements = YAHOO.util.Dom.getElementsByClassName('savableFilter-page-navigation', 'div')
    this.savableFilterPageControlHandler.bindElements(savableFilterPagerElements);
    this.initSort("SavableFilter", this.savableFilterSortHandler);
  },

  initSellRequest: function()
  {
    var openSellRequestObj = document.getElementById("sellRequest");
    if (openSellRequestObj)
    {
      YAHOO.util.Event.purgeElement(openSellRequestObj, false, "click");
      // display the sell requests for the customer
      YAHOO.util.Event.addListener(openSellRequestObj, "click", this.displaySellRequests, this, true);
    }

    var openSellRequestDetailObj = YAHOO.util.Dom.getElementsByClassName("link-arrow", "a");

    for (var i = 0; i < openSellRequestDetailObj.length; i++)
    {
      var id = openSellRequestDetailObj[i].id;
      var splittedId = id.split("_")
      if (splittedId[0] == 'sellRequestDetail')
      {
        YAHOO.util.Event.purgeElement(openSellRequestDetailObj[i], false, "click");
        // display the sell request details for the customer
        YAHOO.util.Event.addListener(openSellRequestDetailObj[i], "click", this.displaySellRequestDetail, this, true);
      }
    }

    var showRejectedBottlesObj = document.getElementById("showRejectedBottles");
    if (showRejectedBottlesObj)
    {
      YAHOO.util.Event.purgeElement(showRejectedBottlesObj, false, "click");
      // show the rejected bottles for the sell request
      YAHOO.util.Event.addListener(showRejectedBottlesObj, "click", this.displaySellRequestItems, this, true);
    }

    var showQuotedBottlesObj = document.getElementById("showQuotedBottles");
    if (showQuotedBottlesObj)
    {
      YAHOO.util.Event.purgeElement(showQuotedBottlesObj, false, "click");
         // show the quoted bottles for the sell request
      YAHOO.util.Event.addListener(showQuotedBottlesObj, "click", this.displaySellRequestItems, this, true);
    }

    // get the sell request page div and add the handler
    var sellRequestPagerElements = YAHOO.util.Dom.getElementsByClassName('sellrequest-page-navigation', 'div')
    this.sellRequestPageControlHandler.bindElements(sellRequestPagerElements);
    this.initSort("ActiveSellRequests", this.sellRequestSortHandler);

    // get the sell request detail page div and add the handler
    var sellRequestDetailPagerElements = YAHOO.util.Dom.getElementsByClassName('sellrequestdetail-page-navigation', 'div')
    this.sellRequestDetailPageControlHandler.bindElements(sellRequestDetailPagerElements);
    this.initSort("SellRequestDetailsTable", this.sellRequestDetailSortHandler);

  },

  initWineClub: function()
  {
    var showShipments = YAHOO.util.Dom.getElementsByClassName('expand-shipment', 'a');
    for (var i = 0; i < showShipments.length; i++)
    {
      YAHOO.util.Event.purgeElement(showShipments[i], false, "click");
      YAHOO.util.Event.addListener(showShipments[i], "click", this.handleShowShipment.bind(this), true);
    }

    var skipShipments = YAHOO.util.Dom.getElementsByClassName('skipshipment', 'a');
    for (var i = 0; i < skipShipments.length; i++)
    {
      YAHOO.util.Event.purgeElement(skipShipments[i], false, "click");
      YAHOO.util.Event.addListener(skipShipments[i], "click", this.skipShipment_onclick.bind(this), true);
    }

    var comment = YAHOO.util.Dom.getElementsByClassName('comment', 'a');
    for (var i = 0; i < comment.length; i++)
    {
      YAHOO.util.Event.purgeElement(comment[i], false, "click");
      YAHOO.util.Event.addListener(comment[i], "click", this.commentLink_onclick.bind(this), true);
    }

    var editClubDetails = YAHOO.util.Dom.getElementsByClassName('editclubdetails', 'a');
    for (var i = 0; i < editClubDetails.length; i++)
    {
      YAHOO.util.Event.purgeElement(editClubDetails[i], false, "click");
      YAHOO.util.Event.addListener(editClubDetails[i], "click", this.editClubDetail_onclick.bind(this), true);
    }

    var editShippings = YAHOO.util.Dom.getElementsByClassName('editshipping', 'a');
    for (var i = 0; i < editShippings.length; i++)
    {
      YAHOO.util.Event.purgeElement(editShippings[i], false, "click");
      YAHOO.util.Event.addListener(editShippings[i], "click", this.editShipping_onclick.bind(this), true);
    }

    var editPayments = YAHOO.util.Dom.getElementsByClassName('editpayment', 'a');
    for (var i = 0; i < editPayments.length; i++)
    {
      YAHOO.util.Event.purgeElement(editPayments[i], false, "click");
      YAHOO.util.Event.addListener(editPayments[i], "click", this.editPayment_onclick.bind(this), true);
    }

    var cancelClubs = YAHOO.util.Dom.getElementsByClassName('cancelclub', 'a');
    for (var i = 0; i < cancelClubs.length; i++)
    {
      YAHOO.util.Event.purgeElement(cancelClubs[i], false, "click");
      YAHOO.util.Event.addListener(cancelClubs[i], "click", this.cancelClub_onclick.bind(this), true);
    }

    var wineclub = YAHOO.util.Dom.getElementsByClassName('wineclub-page-navigation', 'div')
    this.wineClubPageControlHandler.bindElements(wineclub);

    this.initSort('wineclubTableEl', this.wineclubSortHandler);
  },

  initSort: function(tableEl, sortHandler)
  {
    var tableElement = YAHOO.util.Dom.get(tableEl);

    if (tableElement)
    {
      var tr = tableElement.getElementsByTagName('tr');
      for (var j = 0; j < tr.length; j++)
      {
        if (j > 0 && tr[j].className != 'active-row') //skip first row
        {
          tr[j].onmouseover = function()
          {
            if (this.parentNode.parentNode.parentNode.className != 'expanded-area')
              this.style.backgroundColor = '#fffde7';
          }
          tr[j].onmouseout = function()
          {
            if (this.parentNode.parentNode.parentNode.className != 'expanded-area')
              this.style.backgroundColor = '';
          }
        }

        //Set hover and wire up sort on table headers
        var th = tr[j].getElementsByTagName('th');
        sortHandler.bindElements(th);
        for (var i = 0; i < th.length; i++)
        {
          if (th[i].firstChild && th[i].firstChild.tagName == 'A')
          {
            th[i].firstChild.style.color = "#FFFFFF";
          }
        }
      }
    }
  },

  initQuoteRequest: function()
   {
     // get the quote request link and add the listener
     var openQuoteRequestObj = document.getElementById("quoteRequest");
     if (openQuoteRequestObj)
     {
       // remove the previously added listeners
       YAHOO.util.Event.purgeElement(openQuoteRequestObj, false, "click");
       // add listener to open the quote requests
       YAHOO.util.Event.addListener(openQuoteRequestObj, "click", this.displayQuoteRequests, this, true);
     }

     // get the quote requests and add listeners for delete
     var cancelQuoteRequestObj = YAHOO.util.Dom.getElementsByClassName("deleteQuoteRequest", "a");
     if (cancelQuoteRequestObj)
     {
       // iterate through the quote requests and add the listener
       for (var i = 0; i < cancelQuoteRequestObj.length; i++)
       {
         // remove the previously added listeners
         YAHOO.util.Event.purgeElement(cancelQuoteRequestObj[i], false, "click");
         // add listener to cancel the quote request
         YAHOO.util.Event.addListener(cancelQuoteRequestObj[i], "click", this.cancelQuoteRequest, this, true);
       }
     }

     // get the quote request page div and add the handler
     var quoteRequestPagerElements = YAHOO.util.Dom.getElementsByClassName('quoterequest-page-navigation', 'div')
     this.quoteRequestPageControlHandler.bindElements(quoteRequestPagerElements);
     this.initSort("ActiveQuoteRequests", this.quoteRequestSortHandler);
   },

  initMarketplace : function()
  {
    var bidRequest = YAHOO.util.Dom.get("bidRequest");
    if (bidRequest)
    {
      YAHOO.util.Event.purgeElement(bidRequest, false, "click");
      YAHOO.util.Event.addListener(bidRequest, "click", this.displayBidRequest.bind(this), true);
    }
    var bidHistory = YAHOO.util.Dom.get("bidHistory");
    if(bidHistory)
    {
      YAHOO.util.Event.purgeElement(bidHistory, false, "click");
      YAHOO.util.Event.addListener(bidHistory, "click", this.displayBidRequest.bind(this, 'bidHistory', 'winestoreMyAccount'), true);
    }

    var saleHistory = YAHOO.util.Dom.get("saleHistory");
    if (saleHistory)
    {
      YAHOO.util.Event.purgeElement(saleHistory, false, "click");
      YAHOO.util.Event.addListener(saleHistory, "click", this.displaySaleHistory.bind(this), true);
    }

    var marketplaceWinningBids = YAHOO.util.Dom.get("marketplaceWinningBids");
    if (marketplaceWinningBids)
    {
      YAHOO.util.Event.purgeElement(marketplaceWinningBids, false, "click");
      YAHOO.util.Event.addListener(marketplaceWinningBids, "click",  this.displayMarketplaceOrders.bind(this, 'WinningBids', 'winestoreMyAccount'), true);
    }

    var marketplaceAllOrders = YAHOO.util.Dom.get("marketplaceAllOrders");
    if (marketplaceAllOrders)
    {
      YAHOO.util.Event.purgeElement(marketplaceAllOrders, false, "click");
      YAHOO.util.Event.addListener(marketplaceAllOrders, "click",  this.displayMarketplaceOrders.bind(this, 'OrderHistory', 'winestoreMyAccount'), true);
    }

     /* Initialize listener for move request expand link. */
    var mpOrderRequestDetailObj = YAHOO.util.Dom.getElementsByClassName("expand-MPOrderRequest", "a");
    if (mpOrderRequestDetailObj)
    {
      for (var i = 0; i < mpOrderRequestDetailObj.length; i++)
      {
        YAHOO.util.Event.purgeElement(mpOrderRequestDetailObj[i], false, "click");
        YAHOO.util.Event.addListener(mpOrderRequestDetailObj[i], "click", this.marketplaceOrderRequest, this, true);
      }
    }

    var viewOrder = YAHOO.util.Dom.getElementsByClassName('view-order', 'a')
    if (viewOrder)
    {
      for (var i = 0; i < viewOrder.length; i++)
      {
        var orderNumber = viewOrder[i].id;
        YAHOO.util.Event.addListener(viewOrder[i], "click", this.openVinfolioInvoice.bind(this, orderNumber), this, true);
      }
    }

    // get the marketplace open order page div and add the handler.
    var mpWinningBidsPagerElements = YAHOO.util.Dom.getElementsByClassName('WinningBids-page-navigation', 'div');
    this.mpWinningBidsPageControlHandler.bindElements(mpWinningBidsPagerElements);
    this.initSort("MarketplaceOrderRequests", this.mpWinningBidsSortHandler);

    // get the marketplace order history page div and add the handler.
    var mpOrderHistoryRequestPagerElements = YAHOO.util.Dom.getElementsByClassName('AllOrder-page-navigation', 'div');
    this.mpOrderPageControlHandler.bindElements(mpOrderHistoryRequestPagerElements);
    this.initSort("MarketplaceOrderRequestsHistory", this.mpOrderHistorySortHandler);

  },

  initEmailCommunication: function()
  {
    var wineOffers = YAHOO.util.Dom.get("wineOffers");
    if (wineOffers)
    {
      wineOffers.onclick = this.updateEmailCommunication.bind(this);
    }
    var wilderSide = YAHOO.util.Dom.get("wilderSide");
    if (wilderSide)
    {
      wilderSide.onclick = this.updateEmailCommunication.bind(this);
    }
    var showServicesBilling = YAHOO.util.Dom.get("showServicesBillingReport");
    if (showServicesBilling)
    {
      showServicesBilling.onclick = this.openStatement.bind(this);
    }
    var cellarAcquistions = YAHOO.util.Dom.get("cellarAcquistions");
    if (cellarAcquistions)
    {
      cellarAcquistions.onclick = this.updateEmailCommunication.bind(this);
    }
    var newlyAvailable = YAHOO.util.Dom.get("newlyAvailable");
    if (newlyAvailable)
    {
      newlyAvailable.onclick = this.updateEmailCommunication.bind(this);

    }
    var newlyRelease = YAHOO.util.Dom.get("newlyRelease");
    if (newlyRelease)
    {
      newlyRelease.onclick = this.updateEmailCommunication.bind(this);
    }
    var cellarRecommendation = YAHOO.util.Dom.get("cellarRecommendation");
    if (cellarRecommendation)
    {
      cellarRecommendation.onclick = this.updateEmailCommunication.bind(this);
    }
    var vinfolioUpdates = YAHOO.util.Dom.get("vinfolioUpdates");
    if (vinfolioUpdates)
    {
      vinfolioUpdates.onclick = this.updateEmailCommunication.bind(this);
    }
    var offersAndTips = YAHOO.util.Dom.get("offersAndTips");
    if (offersAndTips)
    {
      offersAndTips.onclick = this.updateEmailCommunication.bind(this);
    }
    var priorityEmail = YAHOO.util.Dom.get("priorityEmail");
    if (priorityEmail)
    {
      priorityEmail.onclick = this.updateEmailCommunication.bind(this)
    }
    var marketplaceOffers = YAHOO.util.Dom.get("marketplaceOffers");
    if (marketplaceOffers)
    {
      marketplaceOffers.onclick = this.updateEmailCommunication.bind(this);
    }
    var hongkongWineOffers = YAHOO.util.Dom.get("hongKongWineOffers");
    if (hongkongWineOffers)
    {
      hongkongWineOffers.onclick = this.updateEmailCommunication.bind(this);
    }
  },

  initCatalogSubscription: function()
  {
    var sendCatalog = YAHOO.util.Dom.get('sendCatalog');
    if(sendCatalog)
    {
      sendCatalog.onclick = this.updateSendCatalog.bind(this);
    }
  },

  init_commentPopup: function()
  {
    var submitButton = document.getElementById("submit-button");
    submitButton.onclick = this.addComment.bind(this);
  },

  initialzeShippingAddressPopElement:function()
  {
    var shipping_address_contry = YAHOO.util.Dom.get("shippingAddressContries");
    if (shipping_address_contry)
    {
      YAHOO.util.Event.addListener(shipping_address_contry, "change", this.updateShippingAddressState, this, true);
    }
    var shipping_address_update_secondary = YAHOO.util.Dom.get("btn-update-secondary");
    if (shipping_address_update_secondary)
    {
      YAHOO.util.Event.addListener(shipping_address_update_secondary, "click", this.updateSecondaryShippingAddress, this, true);
    }
    var shipping_address_update_primary = YAHOO.util.Dom.get("btn-update-primary");
    if (shipping_address_update_primary)
    {
      YAHOO.util.Event.addListener(shipping_address_update_primary, "click", this.updatePrimaryShippingAddress, this, true);
    }
  },

  populateAndSubmitForm: function(actionURL, method, referrer)
  {
    document.location.href=actionURL +"?doAction="+method+"&referrer="+referrer;
  },

  displayMoveRequests: function(evt)
  {
    this.populateAndSubmitForm("/do/winestore/customerMoveRequest", "init", "WineStoreMoveRequest");
    return false;
  },

  displayQuoteRequests: function(evt)
  {
    this.populateAndSubmitForm("/do/winestore/myAccount/activeQuoteRequest", "init", "winestoreMyAccount");
    return false;
  },

  displayBidRequest : function(value)
  {
    if (value == "bidHistory")
    {
      this.populateAndSubmitForm("/do/winestore/myAccount/customerBidRequest", "bidHistory", "winestoreMyAccount");
    }
    else
    {
      this.populateAndSubmitForm("/do/winestore/myAccount/customerBidRequest", "init", "winestoreMyAccount");
    }
    return false;
  },

  displaySaleHistory : function()
  {
    document.location.href="/do/winestore/myAccount/marketplaceSaleHistory?doAction=init&referrer=winestoreMyAccount"
    return false;
  },

  displaySellRequests: function(evt)
  {
    this.populateAndSubmitForm("/do/winestore/myAccount/activeSellRequest", "init", "winestoreMyAccount");
    return false;
  },

  displayMarketplaceOrders : function(value, page, evt)
  {
    if (value == 'WinningBids')
    {
      this.populateAndSubmitForm("/do/winestore/myAccount/marketplaceOrderRequest", "actionWinningBids", page);
    }
    else
    {
      this.populateAndSubmitForm("/do/winestore/myAccount/marketplaceOrderRequest", "actionAllOrders", page);
    }
     return false;
  },


  displaySellRequestDetail: function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;

    var id = srcEl.id;
    var sellRequestId = id.split("_")[1];

    document.forms["sellRequestDetailForm"].action = "/do/winestore/myAccount/activeSellRequestDetail";
    var sellRequestIdObj = document.getElementById("sellRequestId");
    if(sellRequestIdObj)
    {
      sellRequestIdObj.value = sellRequestId;
    }
    document.forms["sellRequestDetailForm"].submit();
    return false;
  },

  displayOrders: function(value, page, evt)
  {
    if (value == 'AllOrders')
    {
      this.populateAndSubmitForm("/do/winestore/customerOrderRequest", "actionAllOrders", page);
    }
    else
    {
      this.populateAndSubmitForm("/do/winestore/customerOrderRequest", "actionOpenOrders", page);
    }
    return false;
  },

  cancelQuoteRequest: function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;

    var reallyDelete = confirm("Are you sure?");
    if (reallyDelete)
    {
      var quoteRequestId = srcEl.parentNode.id;
      // set the URL to cancel the quote request
      var url = "/do/winestore/myAccount/activeQuoteRequest?doAction=asyncCancelRequest&quoteRequestId=" + quoteRequestId;
      // assign the call back methods that needs to be called on success and failure
      var callbacks = {success: this.handleDeleteQuoteRequestSuccess.bind(this), failure: this.handleFailure.bind(this)};
      this.dimmer.showDimEffect("account-main");
      vfAsyncRequest("GET", url, callbacks);
    }
  },

  handleDeleteQuoteRequestSuccess: function(response)
  {
    this.dimmer.clearDimEffect();
    var jsonObject = getJsonObject(response);

    var quoteRequestContainer = document.getElementById('tableContainer');
    if (quoteRequestContainer)
    {
      quoteRequestContainer.innerHTML = jsonObject.content;
    }
    var pageNavigationTopObj = document.getElementById('pageControlTop');
    if (pageNavigationTopObj)
    {
      pageNavigationTopObj.innerHTML = jsonObject.pageControl;
    }
    var pageNavigationBottomObj = document.getElementById('pageControlBottom');
    if (pageNavigationBottomObj)
    {
      pageNavigationBottomObj.innerHTML = jsonObject.pageControl;
    }
    var quoteCountObj = document.getElementById('quoteCount');
    if (quoteCountObj)
    {
      quoteCountObj.innerHTML = "<h4>Active Quote Requests<span>(<strong>" + jsonObject.quoteCount + "</strong>)</span></h4>";
    }
    this.initNavigator();
    return false;
  },

  handleFailure: function(response)
  {
    this.dimmer.clearPageDimEffect();
    return false;
  },

  displaySellRequestItems: function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;

    var quoteRequestId = srcEl.id;
    var url;

    if (quoteRequestId == "showRejectedBottles")
    {
      url = "/do/winestore/myAccount/activeSellRequestDetail?doAction=asyncRejectedRequest&viewState.pageInfo.currentPageNumber=0";
    }
    else
    {
      url = "/do/winestore/myAccount/activeSellRequestDetail?doAction=asyncQuotedRequest&viewState.pageInfo.currentPageNumber=0";
    }
    var callbacks = {success: this.handleSellRequestItemsSuccess.bind(this), failure: this.handleFailure.bind(this)};
    this.dimmer.showDimEffect("account-main");
    vfAsyncRequest("GET", url, callbacks);
    return false;
  },

  handleSellRequestItemsSuccess: function(response)
  {
    var jsonObject = getJsonObject(response);

    this.dimmer.clearDimEffect();
    // get the sell Request Detail Header and change the value
    var sellRequestItemCountObj = document.getElementById('sellRequestDetailHeader');
    if (sellRequestItemCountObj)
    {
      var sellRequestDetailHeader = "";
      if (jsonObject.bottleType == "rejectedBottles")
      {
        sellRequestDetailHeader = "<h4>Sell Request Detail - Rejected Bottles<span>(<strong>" + jsonObject.sellRequestDetailCount + "</strong>)</span>";
        if (jsonObject.viewBottlesLinkFlag == "true")
        {
          sellRequestDetailHeader += "<a href='#' id='showQuotedBottles' class='link-arrow ml30'>Show quoted bottles</a></h4>";
        }
        sellRequestItemCountObj.innerHTML = sellRequestDetailHeader;
      }
      else
      {
        sellRequestDetailHeader = "<h4>Sell Request Detail - Quoted Bottles<span>(<strong>" + jsonObject.sellRequestDetailCount + "</strong>)</span>";
        if(jsonObject.viewBottlesLinkFlag == "true")
        {
          sellRequestDetailHeader += "<a href='#' id='showRejectedBottles' class='link-arrow ml30'>Show Rejected bottles</a></h4>";
        }
        sellRequestItemCountObj.innerHTML = sellRequestDetailHeader;
      }
    }

    this.sellRequestDetailPageControlHandler.handleSuccess(response);
  },

  addComment:function(evt)
  {
    evt = evt ? evt : window.event;
    var commentText = document.getElementById("new-comment");
    var wineClubRequestItemId = document.getElementById("addCommentWineClubRequestItemId");
    var commentId = "td_comments_" + wineClubRequestItemId.value;
    var commentSpan = document.getElementById(commentId);
    var comment = YAHOO.lang.trim(commentText.value);
    comment = comment.substring(0, 255);
    commentSpan.innerHTML = comment;

    var url = "/do/winestore/myAccount/manageWineClubRequests?doAction=addComment";
    url += "&wineClubItemId=" + wineClubRequestItemId.value;
    url += "&customerComment=" + comment;

    var asyncCallback = {success:this.handleAddCommenttSuccess.bind(this),failure:this.handleAddCommentFailure.bind(this)};
    vfAsyncRequest("GET", url, asyncCallback);

    popupWindow.deactivate();
    YAHOO.util.Event.stopEvent(evt);
  },

  handleAddCommenttSuccess: function(jsonResponse)
  {
    //Nothing to do...
  },

  handleAddCommentFailure: function()
  {
    alert("Add comment Failure");
  },

  skipShipment_onclick : function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var idx = srcEl.id.indexOf("_");
    var wineClubItemId = srcEl.id.substring(idx + 1);

    if (confirm("Are you sure that you want to cancel this wine club shipment? Once it is cancelled it cannot be restored."))
    {
      var wineClubItemRowId = "wineClubRequestItemRow_" + wineClubItemId;
      var wineClubItemRow = document.getElementById(wineClubItemRowId);
      wineClubItemRow.style.display = "none";

      var url = "/do/winestore/myAccount/manageWineClubRequests?doAction=cancelWineClubRequestItem&toBeCancelledWineClubRequestItemId=" + wineClubItemId;

      var asyncCallback = {success:this.handleSkipShipmentSuccess.bind(this),failure:this.handleSkipShipmentFailure.bind(this)};
      vfAsyncRequest("GET", url, asyncCallback);
    }
  },

  commentLink_onclick: function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var idx = srcEl.id.indexOf("_");
    var wineClubItemId = srcEl.id.substring(idx + 1);

    var winPopup = new WindowModal(false);
    winPopup.content = '/do/winestore/myAccount?doAction=showCommentPopup&wineClubRequestItemId=' + wineClubItemId;
    winPopup.activate();
  },

  editClubDetail_onclick: function(evt)
  {
    this.submitWineClubForm('/do/store/wineClub', 'edit', false, evt);
    return false;
  },

  editShipping_onclick: function(evt)
  {
    this.submitWineClubForm('/do/store/ship', 'editWineClub', false, evt);
    return false;
  },

  editPayment_onclick: function(evt)
  {
    this.submitWineClubForm('/do/store/payment', 'editWineClub', false, evt);
    return false;
  },

  cancelClub_onclick: function(evt)
  {
    if (confirm("Are you sure that you want to cancel this wine club?"))
    {
      this.submitWineClubForm('/do/winestore/myAccount/manageWineClubRequests', 'cancelWineClubRequest', true, evt);
    }
    return false;
  },

  submitWineClubForm:function(action, doAction, isCancelledWineClub, evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var idx = srcEl.id.indexOf("_");
    var wineClubId = srcEl.id.substring(idx + 1);

    document.forms["wineClubForm"].action = action;
    document.forms["wineClubForm"].doAction.value = doAction;
    document.forms["wineClubForm"].referrer.value = "vfmyAccount";
    if (isCancelledWineClub)
    {
      document.getElementById("wineClubRequestId").value = '';
      document.getElementById("CancelledWineClub").value = wineClubId;
    }
    else
    {
      document.getElementById("wineClubRequestId").value = wineClubId;
      document.getElementById("CancelledWineClub").value = '';
    }
    document.forms["wineClubForm"].submit();
  },

  handleShowShipment : function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;

    var action = 'show';
    var expandedShipmentTR = document.getElementById("expandedShipment" + srcEl.id);

    //if the class name contain 'show' and replace the class name 'hide' and content
    //display the expanded div
    if (-1 >= srcEl.className.indexOf('show'))
    {
      action = 'hide';
      srcEl.className += ' show';

      if (-1 < srcEl.innerHTML.indexOf('Show'))
        srcEl.innerHTML = srcEl.innerHTML.replace('Show' , 'Hide');

      if (-1 >= expandedShipmentTR.className.indexOf('expanded'))
      {
        expandedShipmentTR.className += ' expanded';
      }
    }
    else
    {
       //if the class name contain 'hide' and replace the class name 'show' and content
      //hide expanded div
      srcEl.className = srcEl.className.replace(/\s*show/, '');

      if (-1 < srcEl.innerHTML.indexOf('Hide'))
        srcEl.innerHTML = srcEl.innerHTML.replace('Hide' , 'Show');
      if (-1 < expandedShipmentTR.className.indexOf('expanded'))
      {
        expandedShipmentTR.className = expandedShipmentTR.className.replace(/\s*expanded/, '');
      }
    }
  },

  handleSkipShipmentSuccess: function()
  {
    //Nothing to do...
  },

  handleSkipShipmentFailure : function()
  {
    alert("Error Accoured skipping the shipment");
  },

  updateEmailCommunication:function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;

    var updateEmailCommunicationback = {success:this.handleUpdateEmailCommunicationSuccess.bind(this),failure:this.handleUpdateEmailCommunicationFailure.bind(this)};
    var contentContainer = document.getElementById('contentContainer');
    this.dimmer.showPageDimEffect();
    var updateRememberMeRequest = vfAsyncRequest("GET", "/do/winestore/myAccount?doAction=updateEmailPreference&" + srcEl.name + "=" + srcEl.checked, updateEmailCommunicationback);
    return false;
  },

  openStatement: function(evt)
  {
    var statementPeriod = document.getElementById('statementPeriod');
    if (statementPeriod)
    {
      var stmtPeriod = statementPeriod.options[statementPeriod.selectedIndex].value;
      if (stmtPeriod != "-1")
      {
        var url = "/do/user/statement?statementDate=" + stmtPeriod;
        openPopup(url, 700, 700, "popup", true);
      }
      else
      {
        alert("Please select a time period");
      }
    }
  },

  handleUpdateEmailCommunicationSuccess: function(response)
  {
    this.dimmer.clearPageDimEffect();
    var jsonObject = getJsonObject(response);
    var contentContainer = YAHOO.util.Dom.get("contentContainer");
    contentContainer.innerHTML = jsonObject.content;
    var messages = YAHOO.util.Dom.get("messages");
    if (jsonObject.messages)
    {
      messages.innerHTML = jsonObject.messages;
    }
    else
    {
      messages.innerHTML = "";
    }

    this.initNavigator();
  },

  handleUpdateEmailCommunicationFailure: function()
  {
    this.dimmer.clearPageDimEffect();
    alert("Edit Email Preference failed");
  },

  updateSendCatalog:function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;

    var updateSendCatalogCallback = {success:this.handleUpdateSendCatalogSuccess.bind(this),failure:this.handleUpdateSendCatalogFailure.bind(this)};
    var contentContainer = document.getElementById('contentContainer');
    this.dimmer.showPageDimEffect();
    var updateRememberMeRequest = vfAsyncRequest("GET", "/do/winestore/myAccount?doAction=updateSendCatalogPreference&" + srcEl.name + "=" + srcEl.checked, updateSendCatalogCallback);
    return false;
  },

  handleUpdateSendCatalogSuccess: function(response)
  {
    this.dimmer.clearPageDimEffect();
    var jsonObject = getJsonObject(response);
    var contentContainer = YAHOO.util.Dom.get("contentContainer");
    contentContainer.innerHTML = jsonObject.content;
    var messages = YAHOO.util.Dom.get("messages");
    if (jsonObject.messages)
    {
      messages.innerHTML = jsonObject.messages;
    }
    else
    {
      messages.innerHTML = "";
    }

    this.initNavigator();
  },

  handleUpdateSendCatalogFailure: function()
  {
    this.dimmer.clearPageDimEffect();
    alert("Edit Send Catalog Preference failed");
  },

  redeemHelpPopup: function(evt)
  {
    var win = new WindowModal(true,true,false);
    win.content = "/do/winestore/redeem?doAction=showHelpPopup";
    win.activate();
  },

  redeemGiftCard: function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var giftCard = document.getElementById("cardNumber");
    var cardNumber;
    if (giftCard != null)
    {
      cardNumber = giftCard.value;
    }
    var contentContainer = document.getElementById('contentContainer');
    this.dimmer.showPageDimEffect();
    var redeemGiftCardCallback={success:this.handleRedeemSuccess.bind(this),failure:this.handleRedeemFailure.bind(this)};
    var redeemGiftCardRequest = vfAsyncRequest("POST", "/do/winestore/redeem?doAction=handleRedeemGiftCardRequest&cardNumber="+ cardNumber , redeemGiftCardCallback);

  },

  handleRedeemSuccess: function(response)
  {
    this.dimmer.clearPageDimEffect();
    var jsonObject = getJsonObject(response);
    var messages = YAHOO.util.Dom.get("messages");
    var creditBalance = YAHOO.util.Dom.get("creditBalance");

    if (jsonObject.messages)
    {
      messages.innerHTML = jsonObject.messages;
    }
    else
    {
      messages.innerHTML = "";
    }

    if (jsonObject.creditBalance)
    {
      creditBalance.innerHTML = jsonObject.creditBalance;
    }
    else
    {
      creditBalance.innerHTML = "";
    }


  },

  handleRedeemFailure: function(evt)
  {
    this.dimmer.clearPageDimEffect();
    alert("failure");
  },

  changeContext: function (evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var listEl;
    if (srcEl.tagName == 'A')
    {
      listEl = srcEl.parentNode;
    }
    else
    {
      listEl = srcEl.parentNode.parentNode;
    }
    var idx = listEl.id.indexOf("-");
    var targetContext = listEl.id.substring(idx + 1);
    this.selectedContext = targetContext;
    this.changeTab();
    listEl.className = 'selected';
    this.myAccountAsyncRefresh(targetContext);
  },

  changeTab : function()
  {
    var tabDiv = YAHOO.util.Dom.get("my-account-tabs");
    var tabUl = tabDiv.firstChild;
    for (var i = 0; i < tabUl.childNodes.length; i++)
    {
      tabUl.childNodes[i].className = "";
    }
  },

  refreshPage: function()
  {
    closeOverlay();
    this.myAccountAsyncRefresh();
  },

  updatePreferenceSuccess:function (response)
  {
    this.dimmer.clearDimEffect();
    this.overlayDimmer.clearDimEffect();

    var jsonObject = getJsonObject(response);
    if (jsonObject.hasErrors == "true")
    {
      var errordiv = document.getElementById('errordiv');
      errordiv.innerHTML = jsonObject.errors;
    }
    else
    {
      closeOverlay();
      var contentContainer = YAHOO.util.Dom.get("contentContainer");
      contentContainer.innerHTML = jsonObject.content;
      var messages = YAHOO.util.Dom.get("messages");
      if (jsonObject.messages) messages.innerHTML = jsonObject.messages;
      else messages.innerHTML = "";

      this.initNavigator();
    }
    return false;
  },

  updatePreferenceFailure: function(response)
  {
    alert("Update Preference failure");
  },

  myAccountAsyncRefresh: function (context)
  {
    var contextParameter = "";
    if (context) contextParameter = "&myAccountContext=" + context;

    this.dimmer.showPageDimEffect();

    var asyncCallback = {success:this.handleMyAccountAsyncRefreshSuccess.bind(this),failure:this.handleMyAccountAsyncRefreshFailure.bind(this)};
    vfAsyncRequest("GET", "/do/winestore/" + this.targetAction + "?doAction=asyncMyAccount" + contextParameter, asyncCallback);
  },

  handleMyAccountAsyncRefreshSuccess:function(response)
  {
    // remove all dimmer effects
    this.dimmer.clearPageDimEffect();
    this.dimmer.clearDimEffect();
    this.overlayDimmer.clearDimEffect();
    //close the overlay if available
    closeOverlay();

    var jsonObject = getJsonObject(response);

    var contentContainer = YAHOO.util.Dom.get("contentContainer");
    contentContainer.innerHTML = jsonObject.content;

    var messages = YAHOO.util.Dom.get("messages");
    if (jsonObject.messages) messages.innerHTML = jsonObject.messages;
    else messages.innerHTML = "";

    this.initNavigator();

    return false;
  },

  handleMyAccountAsyncRefreshFailure: function()
  {
    this.overlayDimmer.clearDimEffect();
    this.dimmer.clearDimEffect();
    alert("Async failed");
  },

  asyncOrderDetails: function (orderNumber)
  {
    var asyncCallback = {success:this.handleAsyncOrderDetailsSuccess.bind(this),failure:this.handleMyAccountAsyncRefreshFailure.bind(this)};
    var container = YAHOO.util.Dom.get("tableContainer");
    this.dimmer.showPageDimEffect();
    vfAsyncRequest("GET", "/do/winestore/customerOrderRequest?doAction=actionAsyncOrderDetails&orderDetailsNumber=" + orderNumber, asyncCallback);
  },

  handleAsyncOrderDetailsSuccess:function(response)
  {
    this.dimmer.clearPageDimEffect();

    var jsonResponse = "(" + response.responseText + ")";
    var jsonObject = eval(jsonResponse);


    var contentContainer = YAHOO.util.Dom.get("tableContainer");
    contentContainer.innerHTML = jsonObject.content;

    var messages = YAHOO.util.Dom.get("messages");
    if (jsonObject.messages) messages.innerHTML = jsonObject.messages;
    else messages.innerHTML = "";

    this.initNavigator();

    return false;
  },


  handleAsyncOrderDetailsFailure: function()
  {
    this.overlayDimmer.clearPageDimEffect();
    alert("Async failed");
  },

  asyncClearOrderDetails: function ()
  {
    var asyncCallback = {success:this.handleAsyncClearOrderDetailsSuccess.bind(this),failure:this.handleAsyncClearOrderDetailsFailure.bind(this)};
    var container = YAHOO.util.Dom.get("tableContainer");
    this.dimmer.showPageDimEffect();
    vfAsyncRequest("GET", "/do/winestore/customerOrderRequest?doAction=actionAsyncClearOrderDetails", asyncCallback);
  },

  handleAsyncClearOrderDetailsSuccess:function(response)
  {
    this.dimmer.clearPageDimEffect();

    var jsonResponse = "(" + response.responseText + ")";
    var jsonObject = eval(jsonResponse);


    var contentContainer = YAHOO.util.Dom.get("tableContainer");
    contentContainer.innerHTML = jsonObject.content;

    var messages = YAHOO.util.Dom.get("messages");
    if (jsonObject.messages) messages.innerHTML = jsonObject.messages;
    else messages.innerHTML = "";

    this.initNavigator();

    return false;
  },

  handleAsyncClearOrderDetailsFailure: function()
  {
    this.overlayDimmer.clearPageDimEffect();
    alert("Async failed");
  },

  openDeliveryCreditReport: function(customerId)
  {
    var url = "/do/user/deliveryCreditReport?customerId=" + customerId;
    openPopup(url, 700, 700, "popup", true);
  },

  storagePeriodReports: function(evt)
  {
    var storagePeriod = document.getElementById('storagePeriod');
    if (storagePeriod)
    {
      var statementDate = storagePeriod.options[storagePeriod.selectedIndex].value;
      if (statementDate != null && statementDate != "")
      {
        var url = "/do/user/vinfolioStorageActivity?statementDate=" + statementDate;
        openPopup(url, 700, 700, "popup", true);
      }
      else
      {
        alert("Please select a time period");
      }
    }
  },

  updatePersonalInformation: function (evt)
  {
    var personalInformationContainer = document.getElementById('popup-account-esi');
    this.overlayDimmer.showDimEffect(personalInformationContainer);

    var updatePersonalInfoCallback = {success:this.updatePreferenceSuccess.bind(this),failure:this.updatePreferenceFailure.bind(this)};

    // Make the async request.
    YAHOO.util.Connect.setForm("editPersonalInfoForm");
    var changeContextRequest = vfAsyncRequest("POST", "/do/winestore/editPersonalInfo?doAction=save", updatePersonalInfoCallback);

  },


  delete_saved_search: function(evt)
  {
    if (confirm("Are you sure?"))
    {
      evt = evt ? evt : window.event;
      var srcEl = evt.target ? evt.target : evt.srcElement;
      var searchId;
      var searchContext;
      var formName;
      if (srcEl.tagName != 'A')
      {
        return;
      }
      else
      {
        searchContext=srcEl.id.split("_")[0];
        formName =(searchContext=='SavableFilter')?'savableFilterForm':'savedSearchForm';
        searchId = srcEl.id.split("_")[1];
      }
      this.dimmer.showPageDimEffect();
      var deleteSavedSearchCallback = {success:this.deleteSavedSearchSuccess.bind(this),failure:this.deleteSavedSearchFailure.bind(this)};
      // Make the async request.
      var deleteSavedSearchRequest = vfAsyncRequest("GET", "/do/winestore/myAccount?doAction=asyncDeleteSavedSearch&savedSearchContext="+searchContext+"&"+formName+".searchId=" + searchId, deleteSavedSearchCallback);
    }
  },

  rename_saved_search_popup: function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var searchId;
    var searchContext;
    var formName;
    if (srcEl.tagName != 'A')
    {
      return;
    }
    else
    {
      searchContext=srcEl.id.split("_")[0];
      formName =(searchContext=='SavableFilter')?'savableFilterForm':'savedSearchForm';
      searchId = srcEl.id.split("_")[1];
    }
    //var contentContainer = document.getElementById('contentContainer');
    this.dimmer.showPageDimEffect();
    //Old Search name
    var searchName = document.getElementById("saved_search_name_" + searchId).innerHTML

    //show rename Popup
    var rename_popup = document.getElementById("rename_popup");
    if (rename_popup)
    {
      rename_popup.parentNode.removeChild(rename_popup);
    }
    rename_popup = document.createElement('div');
    rename_popup.id = "rename_popup";
    rename_popup.style.position = "fixed";
     if (isIE)
    {
      rename_popup.style.position = "absolute";
    }
    rename_popup.style.width = "400px";
    rename_popup.style.height = "200px";
    var popupContent = document.getElementById("rename-popup").innerHTML;
    rename_popup.innerHTML = popupContent;
    rename_popup.style.zIndex = "100";
    document.getElementById("outer").appendChild(rename_popup);
    //find the absolute position of the target element
    rename_popup.style.left = screen.availWidth / 2 - 250 + "px";
    rename_popup.style.top =  screen.availHeight / 2 - 200 + "px";
     if (isIE)
    {
      rename_popup.style.position = "absolute";
      var scrollTop = YAHOO.util.Dom.getDocumentScrollTop();
      rename_popup.style.top =  scrollTop + 200 + "px";
    }
    this.dimmer.hideMessage();
    rename_popup = document.getElementById("rename_popup");
    //put the old search name value in the input box
    var input_text = rename_popup.getElementsByTagName("input")[0];
    input_text.value = searchName;

    //add listerner to Cancel button
    var cancel_btn = rename_popup.getElementsByTagName("A")[0];
    YAHOO.util.Event.addListener(cancel_btn, "click", this.close_rename_search_popup.bind(this), false);
    // add listnter to save button
    var save_btn = rename_popup.getElementsByTagName("A")[1];
    YAHOO.util.Event.addListener(save_btn, "click", this.rename_saved_search.bind(this, searchContext, formName, searchId), false);
  },

  rename_saved_search: function(searchContext, formName, searchId)
  {
    // get the old Search Name
    var oldName = document.getElementById("saved_search_name_" + searchId).innerHTML

    var rename_popup = document.getElementById("rename_popup");
    var input_text = rename_popup.getElementsByTagName("input")[0];
    // get New Search name
    var newName = YAHOO.lang.trim(input_text.value);
    var rename_div = document.getElementById("rename_popup");
    var rename_err= rename_div.getElementsByTagName("span")[0];
    if (YAHOO.lang.trim(newName) == "")
    {
      rename_err.innerHTML = "<b>Name cannot be Empty</b><br><br>";
    }
    else if (newName.toLowerCase() == oldName.toLowerCase())
    {
      rename_err.innerHTML = "<b>Please enter a New name</b><br><br>";
    }

    if (newName != null && YAHOO.lang.trim(newName) != "" && oldName.toLowerCase() != newName.toLowerCase())
    {
      this.overlayDimmer.showDimEffect(rename_popup);
      var renameSavedSearchCallback = {success:this.renameSavedSearchSuccess.bind(this),failure:this.renameSavedSearchFailure.bind(this)};
      // Make the async request.
      vfAsyncRequest("GET", "/do/winestore/myAccount?doAction=asyncRenameSavedSearch&savedSearchContext="+searchContext+"&"+formName+".searchId=" + searchId + "&"+formName+".newName=" + encodeURIComponent(newName), renameSavedSearchCallback);
    }
  },

  deleteSavedSearchSuccess: function(response)
  {
    this.dimmer.clearDimEffect();
    this.dimmer.clearPageDimEffect();
    var jsonObject = getJsonObject(response);
    var savedSearchContext = jsonObject.savedSearchContext;
    if(savedSearchContext=='SavableFilter')
    {
      this.savableFilterPageControlHandler.handleSuccess(response);
    }
    else
    {
      this.savedSearchPageControlHandler.handleSuccess(response);
    }
    this.initNavigator();
    return false;
  },

  deleteSavedSearchFailure: function()
  {
    this.dimmer.clearDimEffect();
    alert("Delete Failure");
  },

  renameSavedSearchSuccess: function(response)
  {
    var jsonObject = getJsonObject(response);
    var savedSearchContext = jsonObject.savedSearchContext;

    if(savedSearchContext=='SavableFilter')
    {
      this.savableFilterPageControlHandler.handleSuccess(response);
    }
    else
    {
      this.savedSearchPageControlHandler.handleSuccess(response);
    }
    this.initNavigator();
    this.close_rename_search_popup();
    this.overlayDimmer.clearDimEffect();
  },

  renameSavedSearchFailure: function()
  {
    this.close_rename_search_popup();
    alert("Rename Failure");
  },

  close_rename_search_popup: function()
  {
    this.dimmer.clearPageDimEffect();
    var rename_popup = document.getElementById("rename_popup");
    if (rename_popup)
    {
      rename_popup.parentNode.removeChild(rename_popup);
    }
  },

  showAddEditPrimaryShippingAddressPopup : function(index)
  {
    closeOverlay();
      // Display the add/edit shipping address Model for primary address
    // Set the pop up as movable to scroll if it is not fitting to window size
    var winPopup = new WindowModal(true,true);
    winPopup.content = '/do/winestore/shippingAddress?doAction=asyncShowPrimaryShippingAddressPopup&index=' + index + '&type=primary';
    winPopup.activate();
  },

  showAddEditSecondaryShippingAddressPopup : function(index)
  {
    closeOverlay();
    // Display the add/edit shipping address Model for secondary address
    // Set the pop up as movable to scroll if it is not fitting to window size
    var winPopup = new WindowModal(true,true);
    winPopup.content = '/do/winestore/shippingAddress?doAction=asyncShowSecondaryShippingAddressPopup&index=' + index + '&type=secondary';
    winPopup.activate();
  },

  getShippingAddress:function(evt)
  {
    var contentContainer = document.getElementById('contentContainer');
    this.dimmer.showDimEffect(contentContainer);
    var getShippingAddressCallback = {success:this.updateShippingAddressSuccess.bind(this),failure:this.updateShippingAddressSuccess.bind(this)};
    // Make the async request.
    var getShippingAddressRequest = vfAsyncRequest("GET", "/do/winestore/shippingAddress?doAction=init", getShippingAddressCallback);

  },

  updateShippingAddressSuccess: function (response)
  {
    this.dimmer.clearDimEffect();
    var jsonObject = getJsonObject(response);
    if (jsonObject.hasErrors == "true")
    {
      var messagediv = document.getElementById('messages');
      messagediv.innerHTML = jsonObject.errors;
    }
    else
    {
      var contentContainer = YAHOO.util.Dom.get("contentContainer");
      contentContainer.innerHTML = jsonObject.content;
      var messages = YAHOO.util.Dom.get("messages");
      if (jsonObject.message.indexOf("exclamation") != -1) messages.innerHTML = jsonObject.message;
      else messages.innerHTML = "";
      return false;
    }
  },

  asyncRequestFailure: function ()
  {
    this.dimmer.clearPageDimEffect();
    alert("Async request failure");
  },

  updatePrimaryShippingAddress : function ()
  {
    var personalInformationContainer = document.getElementById('popup-account-pi');
    this.overlayDimmer.showDimEffect(personalInformationContainer);
    var updatePrimaryShippingAddressCallback = {success:this.handleUpdateShippingSuccess.bind(this),failure:this.asyncRequestFailure.bind(this)};
    YAHOO.util.Connect.setForm("myShippingAddressForm");
        // Make the async request.
    var updatePrimaryShippingAddRequest = vfAsyncRequest("GET", "/do/winestore/shippingAddress?doAction=asyncEditPrimaryAddress", updatePrimaryShippingAddressCallback);
  } ,

  updateSecondaryShippingAddress : function ()
  {
    var personalInformationContainer = document.getElementById('popup-account-pi');
    this.overlayDimmer.showDimEffect(personalInformationContainer);
    var updateSecondaryCallback = {success:this.handleUpdateShippingSuccess.bind(this),failure:this.asyncRequestFailure.bind(this)};
    YAHOO.util.Connect.setForm("myShippingAddressForm");
        // Make the async request.
    var updateSecondaryRequest = vfAsyncRequest("GET", "/do/winestore/shippingAddress?doAction=asyncEditSecondaryAddress", updateSecondaryCallback);
  },

  handleUpdateShippingSuccess: function (response)
  {
    this.dimmer.clearDimEffect();
    this.overlayDimmer.clearDimEffect();
    var jsonObject = getJsonObject(response);
    if (jsonObject.message.indexOf("exclamation") != -1)
    {
      closeOverlay();
      var messagediv = document.getElementById('messages');
      messagediv.innerHTML = jsonObject.message;
      var contentContainer = YAHOO.util.Dom.get("contentContainer");
      contentContainer.innerHTML = jsonObject.content;
      this.initNavigator();
    }
    else
    {
      var messages = YAHOO.util.Dom.get("popUpMessages");
      if (jsonObject.errors) messages.innerHTML = jsonObject.errors;
      else messages.innerHTML = "";
      return false;
    }
  },

  updateShippingAddressState:function(evt)
  {
    var country = YAHOO.util.Dom.get("shippingAddressContries");
    var selected_country = '';
    if (country)
    {
      selected_country = country.value;
    }
    var updateStatesForCountryCallback = {success:this.handleUpdateStatesOnChangeOfCountry.bind(this),failure:this.asyncRequestFailure.bind(this)};
        // Make the async request.
    var updateStatesForCountryRequest = vfAsyncRequest("GET", "/do/winestore/shippingAddress?doAction=asyncUpdateStatesForCountry&address.country=" + selected_country, updateStatesForCountryCallback);
  },

  handleUpdateStatesOnChangeOfCountry:function(response)
  {
    var jsonObject = getJsonObject(response);
    var statediv = document.getElementById('shipping-state');
    statediv.innerHTML = jsonObject.stateCombo;
  },


  showdeleteShippingAddressPopup : function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var shippingAddId = srcEl.id;
    var splittedId = shippingAddId.split("_");
    if (confirm("Are you sure?"))
    {
      this.deleteSecondaryShippingAddress(splittedId[1]);
    }
  },

  deleteSecondaryShippingAddress : function (index)
  {
    var contentContainer = document.getElementById('contentContainer');
    this.dimmer.showDimEffect(contentContainer);
    var deleteSecondaryAddressCallback = {success:this.handleUpdateShippingSuccess.bind(this),failure:this.asyncRequestFailure.bind(this)};
        // Make the async request.
    var deleteSecondaryAddressRequest = vfAsyncRequest("GET", "/do/winestore/shippingAddress?doAction=deleteSecondaryAddress&index=" + index, deleteSecondaryAddressCallback);
  },

  handleShippingAddressEditClickRequest:function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var shippingAddId = srcEl.id;
    var idParam = shippingAddId.split("_");
    if (idParam[1] == 'primary')
    {
      this.showAddEditPrimaryShippingAddressPopup(idParam[2]);
    }
    else
    {
      this.showAddEditSecondaryShippingAddressPopup(idParam[2]);
    }
  },

  handlePrimaryShippingAddressAddRequest:function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var shippingAddId = srcEl.id;
    var splittedId = shippingAddId.split("_");
    this.showAddEditPrimaryShippingAddressPopup(splittedId[1]);
  },

  handleSecondaryShippingAddressAddRequest:function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var shippingAddId = srcEl.id;
    var splittedId = shippingAddId.split("_");
    this.showAddEditSecondaryShippingAddressPopup(splittedId[1]);
    return false;
  },

  expandMoveRequest:function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var requestId = srcEl.id;
    requestId = requestId.substring(requestId.indexOf("_") + 1, requestId.length);
    var moveRequestblock = "moveRequestShip_" + requestId;
    var moveRequestObj = document.getElementById(moveRequestblock);
    this.moveLogExpandIndex = requestId;
    if (-1 != moveRequestObj.className.indexOf('expanded'))
    {
      moveRequestObj.className = "expand-moveRequest";
      srcEl.className = "expand-moveRequest";
    }
    else
    {
      this.dimmer.showPageDimEffect();
      moveRequestObj.className = "expand-moveRequest expanded";
      srcEl.className = "expand-moveRequest show";
      var expandMoveLogCallback = {success:this.handleExpandMoveLogSuccess.bind(this),failure:this.asyncRequestFailure.bind(this)};
       // Make the async request.
      vfAsyncRequest("GET", "/do/winestore/customerMoveRequest?doAction=asyncExpandMoveLog&selectIndex=" + requestId, expandMoveLogCallback);

    }
  },
  handleExpandMoveLogSuccess:function(response)
  {
    var jsonObject = getJsonObject(response);
    var moveReqDiv = document.getElementById('moveRequestShip_'+ this.moveLogExpandIndex);
    moveReqDiv.innerHTML = jsonObject.content;
    this.dimmer.clearPageDimEffect();
  },
  openMoveRequestInvoice: function (evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var moveRequest = srcEl.parentNode.id;
    var imageUrl = "/do/store/vinfolioMoveDocument?doAction=getMoveRequest&";
    if (moveRequest != null) imageUrl += 'documentNumber=' + moveRequest;
    var popup = window.open(imageUrl, 'popup2', 'height=650,width=630,scrollbars=yes,resizable=yes');
    popup.focus();
  },

  openVinfolioInvoice:function (orderNumber)
  {
    var imageUrl = '/do/store/vinfolioInvoiceImage?doAction=start&doReset=true&';
    if (orderNumber != null) imageUrl += 'orderNumber=' + orderNumber;

    var popup = window.open(imageUrl, 'popup2', 'height=650,width=630,scrollbars=yes,resizable=yes');
    popup.focus();
  },

  openURL:function(value,evt)
  {
    document.location.href="/do/vincellar/myAccount?myAccountContext="+value;
  },

  marketplaceOrderRequest:function(evt)
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;
    var requestId = srcEl.id;
    requestId = requestId.substring(requestId.indexOf("_") + 1, requestId.length);
    var orderRequestblock = "orderRequest_" + requestId;
    var orderRequestObj = document.getElementById(orderRequestblock);
    if (-1 != orderRequestObj.className.indexOf('expanded'))
    {
      orderRequestObj.className = "expand-MPOrderRequest";
      srcEl.className = "expand-MPOrderRequest";
    }
    else
    {
      orderRequestObj.className = "expand-MPOrderRequest expanded";
      srcEl.className = "expand-MPOrderRequest show";
    }
  }

};
