//-----------------------------------------------------------------
// Licensed Materials - Property of IBM
//
// WebSphere Commerce
//
// (C) Copyright IBM Corp. 2008, 2010 All Rights Reserved.
//
// US Government Users Restricted Rights - Use, duplication or
// disclosure restricted by GSA ADP Schedule Contract with
// IBM Corp.
//-----------------------------------------------------------------

/** 
 * @fileOverview This file provides the common controller variables and functions, 
 * and links these controllers to listen to the defined render contexts in CommonContextsDeclarations.js.
 */

dojo.require("wc.render.common");

/** 
 * @class The CommonControllersDeclarationJS class defines all the common variables and functions 
 * for the controllers of the defined render contexts across all store pages.
 */
CommonControllersDeclarationJS = {
       /**
        * This variable stores the ID of the language that the store is currently using.
        * @private
        */
       langId: "-1",
       
       /**
        * This variable stores the ID of the current store.
        * @private
        */       
       storeId: "",
       
       /**
        * This variable stores the ID of the catalog that is used in the store.
        * @private
        */           
       catalogId: "",
       
       /**
        * This variable indicates whether the Ajax CheckoutOut flex flow is enabled or not.
        * @private
        */           
       ajaxCheckOut: true,
       
       /**
        * Sets the common ids used in the store - language id, store id, and catalog id.
        * 
        * @param {string} langId The id of the store language.
        * @param {string} storeId The id of the store.
        * @param {string} langId The id of the catalog used in the store.
        */
       setCommonParameters:function(langId,storeId,catalogId){
              this.langId = langId;
              this.storeId = storeId;
              this.catalogId = catalogId;
       },
       
       /**
        * Sets the URL of the specified controller.
        * 
        * @param {string} controllerId The id of the target controller.
        * @param {string} url The link to specify for the controller.
        */       
       setControllerURL:function(controllerId,url){
              wc.render.getRefreshControllerById(controllerId).url = url;
       }

}

/** 
 * Declares a new refresh controller for the Mini Shopping Cart.
 */
wc.render.declareRefreshController({
       id: "MiniShoppingCartController",
       renderContext: wc.render.getContextById("MiniShoppingCartContext"),
       url: "",
       formId: ""
       
       /** 
        * Refreshs the mini shopping cart.
        * If a new order item is added via an Ajax service call, set the mini shopping cart to display the new order item in the dropdown.
        * Otherwise, only refresh the contents of mini shopping cart to the updated order information.
        * This function is called when a modelChanged event is detected. 
        * 
        * @param {string} message The model changed event message
        * @param {object} widget The registered refresh area
        */
       ,modelChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
            
              if(message.actionId in order_updated || message.actionId == 'AjaxDeleteOrderItemForShippingBillingPage'){
                     var param = [];
                     var ordItmTmp = '';
                     if(message.actionId == 'AjaxAddOrderItem'){
                    	 	for(var i=0; i < message.orderItemId.length;i++){
                    	 		if(i>0){
                    	 			param.multipleOrdItem = true;
                    	 			ordItmTmp = ordItmTmp +','+message.orderItemId[i] + "";
                    	 		} else{
                    	 			ordItmTmp = +message.orderItemId[i] + "";
                    	 		}	
                    	 	}

                	 		param.addedOrderItemId = ordItmTmp;
                            showDropdown = true;
                     }
                     widget.refresh(param);
              }
              setTimeout("displayMessageItemAdd()", 2000);
       }

       /** 
        * Destroys the old mini shopping cart dialog with previous order information.
        * If order item was added, display the mini shopping cart dropdown with the new order item added contents.
        * This function is called after a successful refresh. 
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
                
              dojo.attr("rj-mini-cart", "style", { position:"static" });
              dojo.byId('rj-mini-cart').style.display = 'none';
              dojo.byId('miniShopCartAdded').style.display = 'block';
              setTimeout("displayMessageItemAdd()", 2000);
              //The dialog contents has changed..so destroy the old dialog with stale data..
              destroyDialog();
              setFocus('shoppingCartBar');
              if(showDropdown){
                     //We have added item to cart..So display the drop down with item added message..
                     showMiniShopCartDropDown("placeHolder",'quick_cart_container','orderItemAdded');
                     showDropdown = false;
              }
       }

}),

/** 
 * Declares a new refresh controller for the Category display with pagination.
 */
wc.render.declareRefreshController({
       id: "CategoryDisplay_Controller",
       renderContext: wc.render.getContextById("CategoryDisplay_Context"),
       url: "",
       formId: ""

       /** 
        * Displays the previous/next page of category listings.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              categoryDisplayJS.contextChanged = true;
              widget.refresh(renderContext.properties);
              
       }

       /** 
        * This function handles paging and browser back/forward functionalities upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
	          window.scrollTo(0,0);
              var controller = this;
              var renderContext = this.renderContext;
              if (categoryDisplayJS.contextChanged && (!categoryDisplayJS.isHistory)){

                       var identifier = "&identifier=" + (new Date()).getTime();
                       
                       
                      var historyObject = new categoryDisplayJS.HistoryTracker('CategoryDisplay_Widget', controller.url + identifier);
                       dojo.back.addToHistory(historyObject);       
                       categoryDisplayJS.contextChanged = false;
                       categoryDisplayJS.isHistory = false;  
              }
              var productList = eval(dojo.byId('CategoryProductList').innerHTML);
				var productId=new Array();
				dojo.forEach(productList , function(product ) {
				  for(index in product) {
				    if(index=='productId'){
				       	productId=product[index];	
				    }
				  }
				});
				for (var tmp=0; tmp < productId.length; tmp++){
					var discount = '';
					var special_text = '';

					try {
						discount = Discount.getProductDiscountText(productId[tmp]);

						if (dojo.byId('special_text_' + productId[tmp]) != null) {
							special_text = dojo.byId('special_text_' + productId[tmp]).innerHTML;
						}

						if (special_text != '') {
							dojo.byId('offer_' + productId[tmp]).innerHTML = discount;

							if (dojo.byId('extra_offer_' + productId[tmp]) != null) {
								dojo.byId('extra_offer_' + productId[tmp]).style.display = 'none';
							}
						} else {
							dojo.byId('offer1_' + productId[tmp]).innerHTML = discount;

							if (dojo.byId('offer_' + productId[tmp]) != null) {
								dojo.byId('offer_' + productId[tmp]).style.display = 'none';
							}
						}

						if (discount == '') {
							if (dojo.byId('extra_offer_' + productId[tmp]) != null) {
								dojo.byId('extra_offer_' + productId[tmp]).style.display = 'none';
							}
						}

					} catch (err) {
						// do nothing
					}
				}
              
				cursor_clear();

       }

}),

/** 
 * Declares a new refresh controller for the Sub-category display with pagination.
 */
wc.render.declareRefreshController({
       id: "SubCategoryDisplay_Controller",
       renderContext: wc.render.getContextById("SubCategoryDisplay_Context"),
       url: "",
       formId: ""

       /** 
        * Displays the previous/next page of sub-category listings.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              categoryDisplayJS.contextChanged = true;
              widget.refresh(renderContext.properties);
              
       }

       /** 
        * This function handles paging and browser back/forward functionalities upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
              if (categoryDisplayJS.contextChanged && (!categoryDisplayJS.isHistory)){

                       var identifier = "&identifier=" + (new Date()).getTime();
                       
                       
                      var historyObject = new categoryDisplayJS.HistoryTracker('SubCategoryDisplay_Widget', controller.url + identifier);
                       dojo.back.addToHistory(historyObject);       
                       categoryDisplayJS.contextChanged = false;
                       categoryDisplayJS.isHistory = false;  
              }
              cursor_clear();

       }

}),

/** 
 * Declares a new refresh controller for the Wishlist display.
 */
wc.render.declareRefreshController({
       id: "WishlistDisplay_Controller",
       renderContext: wc.render.getContextById("WishlistDisplay_Context"),
       url: "",
       formId: ""

       /** 
	* Displays the previous/next page of items on the Wishlist display page.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              AccountWishListDisplay.contextChanged = true;
              widget.refresh(renderContext.properties);
       }

       /** 
        * Refreshs the wishlist display when an item is added to or deleted from the wishlist.
        * This function is called when a modelChanged event is detected. 
        * 
        * @param {string} message The model changed event message
        * @param {object} widget The registered refresh area
        */
       ,modelChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              if (message.actionId == "InterestItemDelete") {
                     controller.url = wc.render.getRefreshControllerById("WishlistDisplay_Controller").url;
                     widget.refresh(renderContext.properties);
              }
              if (message.actionId == "AjaxInterestItemAdd") {
                     controller.url = wc.render.getRefreshControllerById("WishlistDisplay_Controller").url;
                     widget.refresh(renderContext.properties);
              }
              if (message.actionId == "AjaxGiftListServiceCreate" || message.actionId == "AjaxGiftListServiceUpdateDescription" || message.actionId == "AjaxGiftListServiceDeleteGiftList" || message.actionId == "AjaxGiftListServiceRemoveItem" || message.actionId == "AjaxGiftListServiceAddItem") {
                     widget.refresh(renderContext.properties);
              }
       }
       
       /** 
        * This function handles paging and browser back/forward functionalities upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */       
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
              if (AccountWishListDisplay.contextChanged && (!AccountWishListDisplay.isHistory)){
                       var identifier = "&identifier=" + (new Date()).getTime();

                       // Get MyAccountCenterLinkDisplay_Controller url
                       var accountDisplayURL = renderContext.properties["url"];              
                     
                     if(accountDisplayURL == null || accountDisplayURL == ""){
                            accountDisplayURL = controller.url;
                     }else{
                            accountDisplayURL = accountDisplayURL;
                     }

                     var historyObject = new AccountWishListDisplay.HistoryTracker('WishlistDisplay_Widget', accountDisplayURL + identifier , controller.url + identifier);
                       dojo.back.addToHistory(historyObject);       
                       AccountWishListDisplay.contextChanged = false;
                       AccountWishListDisplay.isHistory = false;  
              }
              
              if((dojo.byId("multipleWishlistController_select")!=null && dojo.byId("multipleWishlistController_select")!='undefined')){
              	dojo.byId("multipleWishlistController_select").disabled = false;
              }
              cursor_clear();
       }
}),

/** 
 * Declares a new refresh controller for the shared Wishlist display. 
 */
wc.render.declareRefreshController({
       id: "SharedWishlistDisplay_Controller",
       renderContext: wc.render.getContextById("SharedWishlistDisplay_Context"),
       url: "",
       formId: ""

       /** 
	* Displays the previous/next page of items on the Shared Wishlist display page.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              widget.refresh(renderContext.properties);
       }

		/** 
		 * Refreshs the wishlist display when an item is added to or deleted from the wishlist.
		 * This function is called when a modelChanged event is detected. 
		 * 
		 * @param {string} message The model changed event message
		 * @param {object} widget The registered refresh area
		 */
		,modelChangedHandler: function(message, widget) {
		       var controller = this;
		       var renderContext = this.renderContext;
		       if (message.actionId == "InterestItemDelete") {
		              controller.url = wc.render.getRefreshControllerById("WishlistDisplay_Controller").url;
		              widget.refresh(renderContext.properties);
		       }
		       if (message.actionId == "AjaxInterestItemAdd") {
		              controller.url = wc.render.getRefreshControllerById("WishlistDisplay_Controller").url;
		              widget.refresh(renderContext.properties);
		       }
		       if (message.actionId == "AjaxGiftListServiceCreate" || message.actionId == "AjaxGiftListServiceUpdateDescription" || message.actionId == "AjaxGiftListServiceDeleteGiftList" || message.actionId == "AjaxGiftListServiceRemoveItem" || message.actionId == "AjaxGiftListServiceAddItem") {
		              widget.refresh(renderContext.properties);
		       }
		}
       /** 
        * This function handles paging and browser back/forward functionalities upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */       
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
              cursor_clear();
       }
}),

/** 
 * Declares a new refresh controller for the Shopping Cart display.
 */
wc.render.declareRefreshController({
       id: "ShopCartDisplayController",
       renderContext: wc.render.getContextById("ShopCartPaginationDisplay_Context"),
       url: "",
       formId: ""

       /** 
        * Refreshs the shopping cart area when an update to the order is made, 
        * such as add/remove items or update quantity/promotions etc.
        * This function is called when a modelChanged event is detected. 
        * 
        * @param {string} message The model changed event message
        * @param {object} widget The registered refresh area
        */
       ,modelChangedHandler: function(message, widget) {
			if(dojo.byId('updatedSuccessFlag') != null && dojo.byId('updatedSuccessFlag').value!=""){
				if(dojo.byId('updatedSuccessFlag').value == 'success'){
					 var controller = this;
		              
		              var renderContext = this.renderContext;
		              if(message.actionId in order_updated){
		                     widget.refresh(renderContext.properties);
		              }
				}
			}else{
	              var controller = this;
	              
	              var renderContext = this.renderContext;
	              if(message.actionId in order_updated){
	                     widget.refresh(renderContext.properties);
	              }
			}
       }

       /** 
        * Displays the discounts and promotions area upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
			 		 var controller = this;
           var renderContext = this.renderContext;
           
	         if (typeof(savedOrdersJS) != null && typeof(savedOrdersJS) != 'undefined')
	         {
	        	 savedOrdersJS.isCurrentOrderPage(true);
	         }
              var controller = this;
              // Order level discount tooltip section - if the tooltip is defined, show the section after area is refreshed
              if(document.getElementById("discountDetailsSection")!=null )  {
                     document.getElementById("discountDetailsSection").style.display = "block";
              }
              // Promotion code tooltip section - if the tooltip is defined, show the section after area is refreshed
              if(document.getElementById("appliedPromotionCodes")!=null ) {
                     document.getElementById("appliedPromotionCodes").style.display = "block";
              }              
              
              if(!CheckoutHelperJS.isAjaxCheckOut()){
	              CheckoutHelperJS.setFieldDirtyFlag(false);
	              CheckoutHelperJS.initDojoEventListenerShoppingCartPage();
              }
              
              //select the proper shipmode that is saved in the cookie
              ShipmodeSelectionExtJS.displaySavedShipmentTypeForOrder(renderContext.properties["orderId"]);
			  if(document.getElementById("OrderFirstItemId"))
			  {
				ShipmodeSelectionExtJS.orderItemId = document.getElementById("OrderFirstItemId").value;
			  }
			  if(dojo.byId('updatedSuccessFlag') != null && dojo.byId('updatedSuccessFlag').value == 'success'
				  && dojo.byId('isCheckoutClicked') != null && dojo.byId('isCheckoutClicked').value == 'yes'){
				  var form = document.getElementById('ShoppingCart');
				  form.submit();
				  
			  }
			  cursor_clear();
       }

}),

/** 
 * Declares a new refresh controller for the Shopping Cart pagination display.
 */
wc.render.declareRefreshController({
       id: "ShopCartPaginationDisplayController",
       renderContext: wc.render.getContextById("ShopCartPaginationDisplay_Context"),
       url: "",
       formId: ""
       
       /** 
        * Displays the previous/next page of order items in the shopping cart.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              if(controller.testForChangedRC(["beginIndex"])){
                     widget.refresh(renderContext.properties);
              }
       }

       /** 
        * Hide the progress bar upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
              cursor_clear();
              if(!CheckoutHelperJS.isAjaxCheckOut()){
	              CheckoutHelperJS.setFieldDirtyFlag(false);
	              CheckoutHelperJS.initDojoEventListenerShoppingCartPage();
              }
              
              //select the proper shipmode that is saved in the cookie
              ShipmodeSelectionExtJS.displaySavedShipmentTypeForOrder(renderContext.properties["orderId"]);
       }
}),

/** 
* Declares a new refresh controller for the Pending orders details page pagination display.
*/
wc.render.declareRefreshController({
      id: "PendingOrderPaginationDisplayController",
      renderContext: wc.render.getContextById("PendingOrderPaginationDisplay_Context"),
      url: "",
      formId: ""
      
      /** 
       * Displays the previous/next page of order items in the shopping cart.
       * This function is called when a render context changed event is detected. 
       * 
       * @param {string} message The render context changed event message
       * @param {object} widget The registered refresh area
       */
      ,renderContextChangedHandler: function(message, widget) {
             var controller = this;
             var renderContext = this.renderContext;
             
             if(controller.testForChangedRC(["beginIndex"])){
            	 widget.refresh(renderContext.properties);
             }
      }

      /** 
       * Hide the progress bar upon a successful refresh.
       * 
       * @param {object} widget The registered refresh area
       */
      ,postRefreshHandler: function(widget) {
    	  
             var controller = this;
             var renderContext = this.renderContext;
             cursor_clear();
      }
}),

/** 
 * Declares a new refresh controller for Single Shipment Order Item display with pagination
 * on the Order Summary and Confirmation pages. 
 */
wc.render.declareRefreshController({
       id: "OrderItemPaginationDisplayController",
       renderContext: wc.render.getContextById("OrderItemPaginationDisplay_Context"),
       url: "",
       formId: ""

       /** 
        * Displays the previous/next page of order items for Single Shipment Order Summary/Confirmation display.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              if(controller.testForChangedRC(["beginIndex"])){
                     widget.refresh(renderContext.properties);
              }
       }

       /** 
        * Hide the progress bar upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
              cursor_clear();
       }
}),

/** 
 * Declares a new refresh controller for Multiple Shipment Order Item display with pagination
 * on the Order Summary and Confirmation pages.
 */
wc.render.declareRefreshController({
       id: "MSOrderItemPaginationDisplayController",
       renderContext: wc.render.getContextById("MSOrderItemPaginationDisplay_Context"),
       url: "",
       formId: ""

       /** 
        * Displays the previous/next page of order items for Multiple Shipment Order Summary/Confirmation display.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              if(controller.testForChangedRC(["beginIndex"])){
                     widget.refresh(renderContext.properties);
              }
       }

       /** 
        * Hide the progress bar upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
              cursor_clear();
       }
}),

/** 
 * Declares a new refresh controller for Coupon Wallet display.
 */
wc.render.declareRefreshController({
	id: "CouponDisplay_Controller",
	renderContext: wc.render.getContextById("CouponDisplay_Context"),
	url: "",
	formId: ""
	
	/** 
	 * Refreshs the coupon wallet display if a coupon is added or removed via an Ajax call.
	 * This function is called when a modelChanged event is detected. 
	 * 
	 * @param {string} message The model changed event message
	 * @param {object} widget The registered refresh area
	 */
	,modelChangedHandler: function(message, widget) {
		var controller = this;
		var renderContext = this.renderContext;
		if(message.actionId == 'AjaxCouponsAddRemove' || message.actionId == 'AjaxWalletItemProcessServiceDelete'){
			widget.refresh(renderContext.properties);
		}
	}
}),

/** 
 * Refresh controller for displaying a pop-up of a list of free gifts to choose from .
 */
wc.render.declareRefreshController({
    id: "PromotionFreeGifts_Controller",
    renderContext: wc.render.getContextById("PromotionFreeGifts_Context"),
    url: "",
    formId: ""

    ,modelChangedHandler: function(message, widget) {
           var controller = this;
           var renderContext = this.renderContext;
    }

    ,renderContextChangedHandler: function(message, widget) {
           var controller = this;
           var renderContext = this.renderContext;   
           widget.refresh(renderContext.properties);
    }
    
    ,postRefreshHandler: function(widget) {
	    var controller = this;
	    var renderContext = this.renderContext;	   
	    cursor_clear();
	    PromotionChoiceOfFreeGiftsJS.showFreeGiftsDialog();
   }
}),

/** 
 * Declares a new refresh controller for the saved orders list with pagination.
 */
wc.render.declareRefreshController({
       id: "ListOrdersDisplay_Controller",
       renderContext: wc.render.getContextById("ListOrdersDisplay_Context"),
       url: "",
       formId: ""

    	   ,modelChangedHandler: function(message, widget) {
           var controller = this;
           var renderContext = this.renderContext;
           if(message.actionId in listorders_changed){
        	   		
        		    //After an order create, or order copy service, return to the first page.
	       	   	 	if ((message.actionId == 'AjaxOrderCreate' || message.actionId == 'AjaxSingleOrderCalculate') && this.renderContext.properties["startNumber"] != 0) 
	       	   	 	{
	       	   	 		
	       	   	 		wc.render.updateContext("ListOrdersDisplay_Context", {'startNumber' : 0});	
	       	   	 	}
	       	   	 	else
	       	   	 	{
	       	   	 		widget.refresh(renderContext.properties);
	       	   	 	}
           }
    }

       /** 
        * Refreshes the saved orders table.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
            
              var renderContext = this.renderContext;
              if(controller.testForChangedRC(["startNumber"])){
            	
            	  widget.refresh(renderContext.properties);
              }
       }

       /** 
        * Update the toolbar icons after a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
        	
              var controller = this;
              var renderContext = this.renderContext;
              if (savedOrdersJS.updateCurrentOrder)
              {
            	  savedOrdersJS.initializeCurrentOrder();
            	  savedOrdersJS.updateCurrentOrder = false;
              }
              savedOrdersJS.updateToolbar();
              savedOrdersJS.checkAllIfNeeded();
       }
}),

/** 
* Declares a new refresh controller for the Shopping Cart display.
*/
wc.render.declareRefreshController({
      id: "PendingOrderDisplayController",
      renderContext: wc.render.getContextById("PendingOrderPaginationDisplay_Context"),
      url: "",
      formId: ""

      /** 
       * Refreshs the shopping cart area when an update to the order is made, 
       * such as add/remove items or update quantity/promotions etc.
       * This function is called when a modelChanged event is detected. 
       * 
       * @param {string} message The model changed event message
       * @param {object} widget The registered refresh area
       */
      ,modelChangedHandler: function(message, widget) {
             var controller = this;
          
             var renderContext = this.renderContext;
             if(message.actionId in order_updated){
            	 
            	 	this.currentDesc = document.getElementById('OrderDescription_input').value;
            	 	
                    widget.refresh(renderContext.properties);
             }
      }

      /** 
       * Displays the discounts and promotions area upon a successful refresh.
       * 
       * @param {object} widget The registered refresh area
       */
      ,postRefreshHandler: function(widget) {
             var controller = this;
           
             cursor_clear();
             
             if (this.currentDesc != document.getElementById('OldOrderDescription').value)
             {
            	var inputElement = document.getElementById('OrderDescription_input');
            	if (inputElement != null && inputElement != 'undefined')
            	{
            		inputElement.value = this.currentDesc;
            		dojo.removeClass(inputElement, 'savedOrderDetailsInputBorder'); 
            		dojo.addClass(inputElement, 'savedOrderDetailsInputBorderWarning');
            	}
             }
          
      }

}),

/** 
 * Declares a new refresh controller for the Browsing History ESpot.
 */
wc.render.declareRefreshController({
       id: "BrowsingHistoryController",
       renderContext: wc.render.getContextById("BrowsingHistoryContext"),
       url: "",
       formId: ""
       
       /** 
        * Refreshes the Browsing History Espot area.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The model changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
		    var controller = this;
		    var renderContext = this.renderContext;

		    if(controller.testForChangedRC(["status"])){
		    	widget.refresh(renderContext.properties);
		    }	
       }
       
       /** 
        * Post handling for the Browsing History display.
        * This function is called after a successful refresh. 
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
        	if(!document.getElementById('WC_ScrollingProductsESpot_EmptyImgContainer_BrowsingHistory')){
        			document.getElementById('WC_LeftSidebarDisplay_div_5').style.display = 'block';
        	}
       }       
       
}),

/** 
* Declares a new refresh controller for the My Account Browsing History Display.
*/
wc.render.declareRefreshController({
      id: "BrowsingHistoryDisplay_Controller",
      renderContext: wc.render.getContextById("BrowsingHistoryDisplay_Context"),
      url: "",
      formId: ""
     
       /** 
        * Refreshes the Browsing History display.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The model changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
		    var controller = this;
		    var renderContext = this.renderContext;

		    if(controller.testForChangedRC(["currentPage"]) || controller.testForChangedRC(["pageView"])){
		    	widget.refresh(renderContext.properties);
		    }	
       }

       /** 
        * Post handling for the Browsing History display.
        * This function is called after a successful refresh. 
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
        	cursor_clear();
       }

}),

/** 
 * Declares a new refresh controller for the Category Subscription e-marketing spot.
 */
wc.render.declareRefreshController({
	id: "CategorySubscriptionController",
	renderContext: wc.render.getContextById("CategorySubscriptionContext"),
	url: "",
	formId: ""
	
	/** 
	 * Refreshes the category subscription area when a status update is made, such as subscribe or unsubscribe. 
	 * This function is called when a modelChanged event is detected. 
	 * 
	 * @param {Object} message The model changed event message.
	 * @param {Object} widget The registered refresh area.
	 */
	,modelChangedHandler: function(message, widget) {
		var controller = this;
		var renderContext = this.renderContext;
		if(message.actionId == "AjaxCategorySubscribe"){
			widget.refresh(renderContext.properties);
		}
	}

	/** 
	 * This function is called after a successful area refresh, and it clears the progress bar. 
	 * 
	 * @param {object} widget The registered refresh area
	 */
	,postRefreshHandler: function(widget) {
		cursor_clear();
		if(dojo.byId("CategorySubscriptionImage") == null){
			dojo.animateProperty({
				node: dojo.byId("CategorySubscriptionLink"),
				duration: 1500,
				properties: {
					backgroundColor: {
						start: "yellow",
						end: dojo.style("CategorySubscriptionLink", "backgroundColor")
					}
				}
			}).play();
		}
	}
}),

/** 
 * Declares a new refresh controller for the Quick View display
 */
wc.render.declareRefreshController({
       id: "QuickView_Controller",
       renderContext: wc.render.getContextById("QuickView_Context"),
       url: "",
       formId: ""

       /** 
        * Displays the previous/next page of category listings.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              categoryDisplayJS.contextChanged = true;
              widget.refresh(renderContext.properties);
       }

       /** 
        * This function handles paging and browser back/forward functionalities upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
              var controller = this;
              var renderContext = this.renderContext;
              /*if (categoryDisplayJS.contextChanged && (!categoryDisplayJS.isHistory)){
	              var identifier = "&identifier=" + (new Date()).getTime();
	              var historyObject = new categoryDisplayJS.HistoryTracker('QuickView_Widget', controller.url + identifier);
	              dojo.back.addToHistory(historyObject);       
	              categoryDisplayJS.contextChanged = false;
	              categoryDisplayJS.isHistory = false;  
              }*/
              dijit.byId('quickview-overlay').show();
              dojo.query('.dijitDialogUnderlay', document).forEach(function(tag) {		
            	  tag.style.display='block';
          	  });		
              var nodes= dojo.query('#quickview-overlay div[class =dijitDialogPaneContent]');
              nodes[0].style.height="auto";
              nodes[0].style.width="auto";
              nodes[0].style.overflow="";
              nodes[0].style.position="";
              /*
               * This logic is to evaluate the default attributes list JSON and select the default attribute
               * values
               */
              
              if(dojo.byId('attributeSeq') != null) {
            	  var attributeSeqJSON = eval(dojo.byId('attributeSeq').innerHTML);
            	  var attrName = '';
            	  var attrValue = '';
            	  var firstAttrName='';
            	  var firstAttrVal='';
            	  var colourAttr=dojo.byId('colourAtr').value;
				  var amountAttr=dojo.byId('amountAtr').value;
            	  
              }
              
              var firstAttributeArray=new Array();
				dojo.forEach(attributeSeqJSON , function(attributeSequence ) {
					  for(index in attributeSequence) {
					        if(index=='1'){
					        	firstAttributeArray=attributeSequence[index];	
					        }
					    }
					    
					attrName = firstAttributeArray[0].split('_')[0];
					attrName = attrName.toLowerCase();
					attrValue = firstAttributeArray[0].split('_')[1];
					if(attrName == colourAttr.toLowerCase() || attrName == amountAttr.toLowerCase() ){
						firstAttrName=firstAttributeArray[0].split('_')[0];
						firstAttrVal=attrValue;
					}
					categoryDisplayJS.setSelectedAttribute(firstAttrName, firstAttrVal);
				});
              
              
              
              
              var productID = '';
              var productInfoJSON  = eval(dojo.byId('productInfo').innerHTML);
              dojo.forEach(productInfoJSON, function(productInfo) {
            	  productID = productInfo.productID;
              });
              if (Discount.getProductDiscountText(productID) != '') {
             	  dojo.byId('offer_'+productID).innerHTML = Discount.getProductDiscountText(productID);
             	 dojo.byId('offer_'+productID).style.display = 'block';
    			  }
			  
              TJGCategoryDisplayJS.updateAttributesList(productID, firstAttrName, firstAttrVal);
              TJGCategoryDisplayJS.updatePrice(productID);
              TJGCategoryDisplayJS.updateImage();
              TJGCategoryDisplayJS.updateSoldOut(productID);
              
            //Added to reload the quickview based on the selection of item that has inventory
              if(dojo.byId('rj-size') != null) {
	              var size = dojo.byId('rj-size').value;			  
				  categoryDisplayJS.setSelectedAttribute("Size",size); 						
				  TJGCategoryDisplayJS.updatePrice(productID);
				  TJGCategoryDisplayJS.updateSoldOut(productID);
              }
              var alternateImgPH = dojo.query('.dijitDialogTitleBar' );
              for(var i=0; i<10; i++) {
                  if(alternateImgPH[i] != null){
                      alternateImgPH[i].innerHTML = '';
                      alternateImgPH[i].innerHTML = '<a class="rj-close" onclick="javascript:dijit.byId(\'quickview-overlay\').hide();hideUnderlayWrapper()"></a>';
                  }
              }

                  $(document).bind("keydown", function(e){
                	  if(e.keyCode == 0 || e.keyCode == 27){
                		  if(dijit.byId('quickview-overlay')!=null){
                			  dijit.byId('quickview-overlay').hide();
                    		  hideUnderlayWrapper();
                		  }	  
                	  }
                  });
              //For bazaarvoice
             
            /*  var bvHostUrl = document.getElementById('bvHostUrl').value;
              var bvPageUrl = document.getElementById('bvPageUrl').value;
      		<!--
      			var BVisLoaded = false;
    			function BVcheckLoadState() {
    				
    				if(!BVisLoaded) {
    					//alert('BV is loaded');
    					var page = document.getElementById('BVFrame').src;
    					
    				    document.getElementById('BVFrame').src='http://'+bvHostUrl+'/logging?page=' + escape(page);
    				    document.getElementById('BVReviewsContainer').innerHTML = '<!-- Review retrieval timed out -->';
    				    alert(document.getElementById('BVFrame').src);
    				}
    			}
    		 
      		   function bvLoadRR() {
      			   
      		        var bvPage = bvPageUrl;
      		        var URLParamNames = {
      		            reviewID : 'featurereview',
      		            reviewPage : 'reviewspage'
      		        };
      		        // End Configuration
      		        
      		        var getURLParam = function(name) { 
      		            if (!name) return null;
      		            var match = (new RegExp('[?&]' + name + '=([^&#]+)')).exec(window.location.search);
      		            return match ? decodeURIComponent(match[1]) : null;        
      		        };
      		        
      		        bvReviewID = getURLParam(URLParamNames.reviewID);
      		        bvReviewPage = getURLParam(URLParamNames.reviewPage);
      		        
      		        if (/^[0-9]+$/.test(bvReviewID)) {
      		            bvPage += '&reviewid=' + bvReviewID;
      		        } else if (/^[0-9]+$/.test(bvReviewPage)) {
      		            bvPage += '&page=' + bvReviewPage;
      		        }
      		        
      		        document.getElementById('BVFrame').src = bvPage;
      		        
      		        //Timeout for review load.  Consider reviews unavailable if not loaded within 15 seconds
      		        setTimeout("BVcheckLoadState()", 15000);
      		    }
      		    bvLoadRR();*/
              //End Bazaarvoice
              
              cursor_clear();
       }
}),

/** 
 * Declares a new refresh controller for the Overlay display
 */
wc.render.declareRefreshController({
       id: "OverLayView_Controller",
       renderContext: wc.render.getContextById("OverLay_Context"),
       url: "",
       formId: ""

       /** 
        * Displays the previous/next page of category listings.
        * This function is called when a render context changed event is detected. 
        * 
        * @param {string} message The render context changed event message
        * @param {object} widget The registered refresh area
        */
       ,renderContextChangedHandler: function(message, widget) {
              var controller = this;
              var renderContext = this.renderContext;
              categoryDisplayJS.contextChanged = true;
              widget.refresh(renderContext.properties);
       }

       /** 
        * This function handles paging and browser back/forward functionalities upon a successful refresh.
        * 
        * @param {object} widget The registered refresh area
        */
       ,postRefreshHandler: function(widget) {
              
    	   if(dojo.byId('largeImage') != null && dojo.byId('enlargedImagePath')!= null){
    		   var newImg = new Image();

    		   newImg.onload = function()
    		   {
    			   dojo.byId('largeImage').src = newImg.src; 
    			   cursor_clear();
    			   dijit.byId('espot-overlay').show();
    			   dojo.query('.dijitDialogUnderlay', document).forEach(function(tag) {		
    				   tag.style.display='block';
    			   });
    			   var nodes= dojo.query('#espot-overlay div[class =dijitDialogPaneContent]');
    	           nodes[0].style.height="auto";
    	           nodes[0].style.width="auto";
    	           nodes[0].style.overflow="";
    	           nodes[0].style.position="";
    			   requestSubmitted = false;
    			   var alternateImgPH = dojo.query('.dijitDialogTitleBar' );
    			   for(var i=0; i<10; i++) {
    				   if(alternateImgPH[i] != null){
    					   alternateImgPH[i].innerHTML = '';
    					   alternateImgPH[i].innerHTML = '<a class="rj-close" onclick="JavaScript:TJGCategoryDisplayJS.closeOverlayView()"></a>'
    				   }
    			   }
    		   }
    		   newImg.src =  dojo.byId('enlargedImagePath').value;
    	   }else if(dojo.byId('enlargedVideoPath')!= null && dojo.byId('enlargedVideoPath').value!= ""){
    		   dojo.byId('do-video').src = dojo.byId('enlargedVideoPath').value;
    		   var width = (dojo.byId('do-video').width/15); 
    		   dijit.byId('espot-overlay').show();
    		   dojo.query('.dijitDialogUnderlay', document).forEach(function(tag) {		
    			   tag.style.display='block';
          	  });
              requestSubmitted = false;
              var alternateImgPH = dojo.query('.dijitDialogTitleBar' );
              for(var i=0; i<10; i++) {
                  if(alternateImgPH[i] != null){
                      alternateImgPH[i].innerHTML = '';
					  alternateImgPH[i].innerHTML = '<a class="rj-close" style="z-index:4000;top:-12px;right:-8px;" href="JavaScript:TJGCategoryDisplayJS.closeVideoOverlayView()">Close</a>'
                  }
              }
			  cursor_clear();
    	   }
    		   
    	   else{
    		   dijit.byId('espot-overlay').show();
    		   dojo.query('.dijitDialogUnderlay', document).forEach(function(tag) {		
    			   tag.style.display='block';
          	  });
              requestSubmitted = false;
              var alternateImgPH = dojo.query('.dijitDialogTitleBar' );
              for(var i=0; i<10; i++) {
                  if(alternateImgPH[i] != null){
                      alternateImgPH[i].innerHTML = '';
					  alternateImgPH[i].innerHTML = '<a class="rj-close" onclick="JavaScript:TJGCategoryDisplayJS.closeOverlayView()"></a>'
                  }
              }
			  cursor_clear();
    	   }
       }
	})

function displayMessageItemAdd() {

	dojo.attr("rj-mini-cart", "style", { position:"absolute" });
	dojo.byId('rj-mini-cart').style.display = 'block';
	if(dojo.byId('miniShopCartAdded')!=null){
		dojo.byId('miniShopCartAdded').style.display = 'none';
	}
    
}
