/**-----------------------------------------------------------------------------
 *  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, required, options) {
        $super(required, options);   
        
        this.elBasket            = $("imsBasket");
        this.elBasketDescription = $("imsBasket_Description");
        this.elBasketMessage     = $("imsBasket_Message");
        this.elBasketProgressBar = $("imsBasket_ProgressBar"); 

        this.setupEventHandlers();
        
        this.errorMessages = this.options.errorMessages || {
            NO_ACCESS_ITEM:     "Sorry, but you do not have access to this item.",
            ITEM_EXPIRED:       "This item has expired and cannot be added to your basket.",
            ITEM_EMBARGOED:     "This item is embargoed and cannot be added to your basket.",
            ITEM_CANT_ADD:      "This item cannot be added to your basket.",
            UNEXPECTED_ERROR:   "An unexpected error occurred while trying to open the basket.",
            FAILED_TO_ADD:      "Failed to add picture.",
            FAILED_TO_LOAD:     "Failed to load basket.",
            FAILED_TO_EMPTY:    "Failed to empty basket."
        };
        this.successMessages = this.options.successMessages || {
            ITEM_ADDED:         "Added to basket.",
            NUM_ITEMS:          "Number of Items:",
            BASKET_TOTAL:       "Basket Total:",
            ADDING_PICTURE:     "Adding Picture..."
        };
         
        
        /* 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() {
        /* imsBasket:productAdd is fired by the icon below each thumbnail. */
        Event.observe(
           this.elBasket, 
           "imsBasket:productAdd", 
           function(event) {
               this.onProductAdd(event);
           }.bind(this)
        );
        
        /* imsBasket:basketUpdate is fired when a product is added or 
         * removed. */
        Event.observe(
           this.elBasket,
           "imsBasket:basketUpdate",
           function(event) {
               this.onBasketUpdate(event);
           }.bind(this)
        );
        
        /* The Empty Basket button. */
        if ($("imsBasket_EmptyMe")) {
            Event.observe(
               $("imsBasket_EmptyMe"),
               "click",
               function(event) {
                   this.onEmptyMeClick(event);
               }.bind(this)
            );
        }
    },
    
    /**
     * onEmptyMeClick
     */
    onEmptyMeClick: function(objEvent) {
       this.emptyBasket();       
    },

    /**
     * onProductAdd.
     */ 
    onProductAdd: function(objEvent) {
        this.setBasketMessage(this.successMessages.ADDING_PICTURE.escapeHTML());
        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) {
                        this.setBasketMessage(this.successMessages.ITEM_ADDED.escapeHTML());
                        this.hideProgressBar();
                        this.fireBasketUpdate();
                    }
                    else {
                        this.setBasketMessage(
                            "<span class='highlight'>" + this.errorMessages[objResponse.errorCode].escapeHTML() + "</span>"
                        );
                        this.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";
                    }
                }.bind(this), 
                onFailure: function(transport) {
                    this.hideProgressBar();
                    this.setBasketMessage(
                       "<span class='highlight'>"+this.errorMessages.FAILED_TO_ADD.escapeHTML()+"</span>"
                   );
                }.bind(this),
                parameters: objParameters,
                method:     "get"
            }
        );        
    },
        
    /**
     * onBasketUpdate
     */
    onBasketUpdate: function(objEvent) {
        var strAction     = "ecommerce_api.tlx";
        var strParameters = "action=basketGetSummaryContents";
        
        new Ajax.Request(
           strAction, {
               onSuccess: function(transport) {
                    var objResponse = eval('(' + transport.responseText + ')');
                    var bError  = objResponse.error;
                    if (bError == false) {
                      if ("numItems" in objResponse) {
                        var strHTML = "<table><tr><th>"+this.successMessages.NUM_ITEMS.escapeHTML()+"</th><td>"+objResponse.numItems+"</td></tr>";
                        if ("strTotal" in objResponse && objResponse.strTotal) {
                          strHTML += "<tr><th>"+this.successMessages.BASKET_TOTAL.escapeHTML()+"</th><td>"+objResponse.strTotal.escapeHTML()+"</td></tr>";
                        }
                        strHTML += "</table>";
                      } else {
                        var strHTML = objResponse.html;
                      }
                      this.setBasketDescription(strHTML);
                    }
                    else {
                        this.setBasketMessage(
                            "<span class='highlight'>" + this.errorMessages[objResponse.errorCode].escapeHTML() + "</span>"
                        );
                    }                   
               }.bind(this),
               onFailure: function(transport) {
                   this.hideProgressBar();
                   this.setBasketMessage(
                       "<span class='highlight'>"+this.errorMessages.FAILED_TO_LOAD.escapeHTML()+"</span>"
                   );
               }.bind(this),
               parameters: strParameters,
               method:     "get"
           }
        );
    },
    
    /**
     * emptyBasket
     */
    emptyBasket: function() {
        var strAction     = "ecommerce_api.tlx";
        var strParameters = "action=basketEmpty";
        
        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) {
                       this.setBasketMessage("");
                       this.setBasketDescription("");
                       this.fireBasketUpdate();
                   }
                   else {
                       this.setBasketMessage(
                           "<span class='highlight'>" + this.errorMessages[objResponse.errorCode].escapeHTML() + "</span>"
                       );
                   }
               }.bind(this),
               onFailure: function(transport) {
                    this.hideProgressBar();
                    this.setBasketMessage(
                       "<span class='highlight'>"+this.errorMessages.FAILED_TO_EMPTY.escapeHTML()+"</span>"
                   );
               }.bind(this)
           }
       );
    },
    
    /**
     * 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"});
    }               
});
