/**-----------------------------------------------------------------------------
 *  IMS_JS_WIDGET.Basket
 *  (c) 2008 Third Light Ltd
 * -----------------------------------------------------------------------------
 */

/**
 * IMS_JS_WIDGET.Basket
 */
IMS_JS_WIDGET.Basket = Class.create(
    IMS_JS_WIDGET.Widget, {

    /**
     * Constructor.
     */
    initialize: function ($super) {
        $super();   
        
        this.elBasket            = $("imsBasket");
        this.elBasketDescription = $("imsBasket_Description");
        this.elBasketMessage     = $("imsBasket_Message");
        this.elBasketProgressBar = $("imsBasket_ProgressBar"); 

        this.setupEventHandlers();      
        
        /* Get the current basket status and clear the message and hide the 
         * progress bar, making the basket ready for use. */
        this.setBasketMessage("");
        this.hideProgressBar();
        this.fireBasketUpdate();
    },
    
    /**
     * setupEventHandlers.
     * Utility method called by the constructor.
     */
    setupEventHandlers: function() {
        
        var myself = this;
        
        /* imsBasket:productAdd is fired by the icon below each thumbnail. */
        Event.observe(
           this.elBasket, 
           "imsBasket:productAdd", 
           function(event) {
               myself.onProductAdd(event);
           }
        );
        
        /* imsBasket:basketUpdate is fired when a product is added or 
         * removed. */
        Event.observe(
           this.elBasket,
           "imsBasket:basketUpdate",
           function(event) {
               myself.onBasketUpdate(event);
           }
        );
        
        /* The Empty Basket button. */
        if ($("imsBasket_EmptyMe")) {
            Event.observe(
               $("imsBasket_EmptyMe"),
               "click",
               function(event) {
                   myself.onEmptyMeClick(event);
               }
            );
        }
    },
    
    /**
     * onEmptyMeClick
     */
    onEmptyMeClick: function(objEvent) {
       this.emptyBasket();       
    },

    /**
     * onProductAdd.
     */ 
    onProductAdd: function(objEvent) {
        
        var myself        = this;
                       
        this.setBasketMessage("Adding Picture...");        
        this.showProgressBar();
        
        var intPictureID   = objEvent.memo.imsBasket_PictureID;
        var intProductID   = objEvent.memo.imsBasket_ProductID;
        var strContainerID = objEvent.memo.imsBasket_ContainerID;
                
        var objParameters = {
           action:      "productAdd", 
           pictureid:   intPictureID,
           productid:   intProductID,
           containerid: strContainerID
        };
        
        var strAction = "ecommerce_api.tlx" + (strContainerID ? "?" + strContainerID : "");
                
        new Ajax.Request(
            strAction, {
                onSuccess: function(transport) {
                    var objResponse = eval('(' + transport.responseText + ')');
                    var bError  = objResponse.error;
                    var strHTML = objResponse.html;                                                                                                    
                    if (bError == false) {
                        myself.setBasketMessage(strHTML);
                        myself.hideProgressBar();
                        myself.fireBasketUpdate();
                    }
                    else {
                        myself.setBasketMessage(
                            "<span class='highlight'>" + strHTML + "</span>"
                        );
                        myself.hideProgressBar();
                    }
                    
                    // Change the basket icon colour now that the icon is in the basket
                    var assetBasketIcon = null;
                    if (assetBasketIcon = $('basketiconimageid_' + intPictureID)) {
                        assetBasketIcon.src = "/images/ecom_btn_cart_add_exists.png";
                    }
                }, 
                onFailure: function(transport) {
                    myself.hideProgressBar();
                    myself.setBasketMessage(
                       "<span class='highlight'>Failed to add picture.</span>"
                   );
                },
                parameters: objParameters,
                method:     "get"
            }
        );        
    },
        
    /**
     * onBasketUpdate
     */
    onBasketUpdate: function(objEvent) {
        var strAction     = "ecommerce_api.tlx";
        var strParameters = "action=basketGetSummaryContents";
        var myself        = this;
        
        new Ajax.Request(
           strAction, {
               onSuccess: function(transport) {
                    var objResponse = eval('(' + transport.responseText + ')');
                    var bError  = objResponse.error;
                    var strHTML = objResponse.html;
                    if (bError == false) {
                        myself.setBasketDescription(strHTML);
                    }
                    else {
                        myself.setBasketMessage(
                            "<span class='highlight'>" + strHTML + "</span>"
                        );
                    }                   
               },
               onFailure: function(transport) {
                   myself.hideProgressBar();
                   myself.setBasketMessage(
                       "<span class='highlight'>Failed to load basket.</span>"
                   );
               },
               parameters: strParameters,
               method:     "get"
           }
        );
    },
    
    /**
     * emptyBasket
     */
    emptyBasket: function() {
        var strAction     = "ecommerce_api.tlx";
        var strParameters = "action=basketEmpty";
        var myself        = this;
        
        new Ajax.Request(
           strAction, {
               parameters: strParameters,
               method:     "get",
               onSuccess:  function(transport) {
                   var objResponse = eval('(' + transport.responseText + ')');
                   var bError      = objResponse.error;
                   var strHTML     = objResponse.html;                                      
                   var strPictureIDList   = objResponse.pictureidlist;
                                      
                   var arrItemsInBasket = strPictureIDList.split(" ");

                   // Replace the basket icon now that the item has been removed                  
                   var assetBasketIcon = null;
                   for (var i = 0; i < arrItemsInBasket.length-1; i++) {
                       if (assetBasketIcon = $('basketiconimageid_' + arrItemsInBasket[i])) {
                           assetBasketIcon.src = "/images/ecom_btn_cart_add.png";
                       }
                   }
                                    
                   if (bError == false) {
                       myself.setBasketDescription(strHTML);
                       myself.fireBasketUpdate();
                   }
                   else {
                       myself.setBasketMessage(
                           "<span class='highlight'>" + strHTML + "</span>"
                       );
                   }
               },
               onFailure: function(transport) {
                    myself.hideProgressBar();
                    myself.setBasketMessage(
                       "<span class='highlight'>Failed to empty basket.</span>"
                   );
               }
           }
       );
    },
    
    /**
     * fireBasketUpdate.
     */ 
    fireBasketUpdate: function() {
        this.elBasket.fire("imsBasket:basketUpdate");
    },
                                                         
    /**
     * showProgressBar.
     */
    showProgressBar: function() {
       this.elBasketProgressBar.setStyle({display: "inline"});
    },
    
    /**
     * hideProgressBar.
     */
    hideProgressBar: function() {
       this.elBasketProgressBar.setStyle({display: "none"});
    },
    
    /**
     * setBasketMessage.
     */ 
    setBasketMessage: function(strMessage) {
       this.elBasketMessage.innerHTML = strMessage;
       this.elBasketMessage.setStyle({display: "inline"});
    },
    
    /**
     * setBasketDescription.
     */ 
    setBasketDescription: function(strMessage) {
       this.elBasketDescription.innerHTML = strMessage;
       this.elBasketDescription.setStyle({display: "inline"});
    }               
});
