jQuery.noConflict();

(function($){
  // on window loaded
  $(window).load(function(e){
  });

  // on document ready
  $(document).ready(function(e){
    
    // load common
    project.prepareCommon();

    // get page kind
    var page = $('body').data('page');

    // load homepagea
    if('home' == page){
      project.prepareHomePage();
    }

    // load product page
    if('product-detail' == page){
      project.prepareProductDetailPage();
    }
    
    // load checkout page
    if('checkout' == page){
      project.prepareCheckoutPage();
    }
  });


  // project object give some utility to initialize and manage
  // behaviors and interactions with user on the current page
  var project = {};

  // common
  project.prepareCommon = function(){
    // add prototype methods
    Number.prototype.formatCurrency = function(c, d, t){
    var n = this, c = isNaN(c = Math.abs(c)) ? 2 : c, d = d == undefined ? "," : d, t = t == undefined ? " " : t, s = n < 0 ? "-" : "", i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
      return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
    };
    // hide submenus
    $('#main .body-left .menu ul ul, div#main-menu .submenu').hide().removeClass('hidden');
    
    // clear-first
    $(':input.clear-first').click(function(e){
      if(!$(this).data('initialized')){
        $(this).val('');
        $(this).data('initialized', true);
      }
    });

    // attach 'timers' data container to submenus
    $('.submenu').each(function(){
      $(this).data('config', {
        status: 'closed',
        callback: null,
        timer: null
      });
    });
    
    /* h1 transformation */
    $('.page-content h1').each(function(index, element){
      var $table = $('<table class="h1-title"><tr><td class="title"></td><td class="background"></td></tr></table>');
      $table.hide().insertBefore($(this));
      $(this).appendTo($table.find('td.title'));
      $table.show();
    });

    /* table transformation */
    $('.page-content table.bordered').each(function(index, element){
      var $container = $('<div class="table-border"></div>');
      $container.hide().insertBefore($(this));
      $(this).appendTo($container);
      $container.show();
    });

    /* Left menu */  
    // Remove first level entries
    $('#product-menu > ul > li > a').each(function(index, element){
      if($(this).parent().find('ul').length){
        $(this).attr('href', '#');
      }
    });
    
    // Initialize menu
    $('#product-menu > ul > li > a').click(function(e){
      // open menu
      var submenu = $(this).siblings('ul');
      if(submenu.length){
        if(submenu.is(':visible')){
          submenu.hide();
        } else {
          submenu.show('blind', {}, 'fast');
        }        
      }
      
      // go to url
      if($(this).attr('href') == '#'){
        e.preventDefault();
      }
    });
    
    /* Initialize page top */
    $('.page-top a').click(function(e){
      e.preventDefault();
      
      // safari bug on scrollTop
      if($('html').scrollTop() == 0){
        $('body').animate({scrollTop: 0}, 'fast');
      } else {
        $('html').animate({scrollTop: 0}, 'fast');
      }
    });
    
    /* Initialize page scroll */
    $('a[href^=#].scroll').click(function(e){
      e.preventDefault();
      
      var target = $($(this).attr('href'));
      if(target.length){
        // safari bug on scrollTop
       $('html').animate({scrollTop: target.offset().top}, 'fast');
        if($('html').scrollTop() == 0){
          $('body').animate({scrollTop: target.offset().top}, 'fast');
        }
      }
    });

    /* Initialize mailto protection */
    $('a.mailto').each(function (index, element) {
      var emailValue = $(this).text().replace(/ at /, '@');
      $(this)
        .attr('href', 'mailto:' + emailValue)
        .text(emailValue)
      ;
    });

    

    /* Main menu */
    
    // Submenu management
    var $menuContainer = $('div#main-menu');
    $menuContainer.data('config', {
      currentEntry: null,
      displayDuration: 300,
      autoClosingDelay: 4000,
      userActionDelay: 100,
      userActionTimer: null
    });
    
    
    $menuContainer.bind('submenuClosed', function(){
      var result = 'STATUS ';
      $('.submenu', $menuContainer).each(function(){result += $(this).attr('id') + '=' + $(this).data('config').status + ' ';});
    });
        
    // open a submenu
    var submenuOpen = function($submenu){
      
      // closed
      if($submenu.data('config').status == 'closed'){
        // open the submenu
        $submenu.data('config').status = 'opening';
        $submenu.show('blind', {}, $menuContainer.data('config').displayDuration, function(){
          // submenu opened
          $submenu.data('config').status = 'opened';

          // launch callback if any
          if($.isFunction($submenu.data('config').callback)){
            $submenu.data('config').callback();
          }
          
          // set autoClosing timer
          submenuSetAutoClosingTimer($submenu);
        });
        
      }
      
      // opened
      else if($submenu.data('config').status == 'opened'){
        // noop
      }
        
      // closing
      else if($submenu.data('config').status == 'closing'){
        $submenu.data('config').callback = function(){
          submenuOpen($submenu);
          $submenu.data('config').callback = null;
        };
      }
        
      // opening
      else if($submenu.data('config').status == 'opening'){
        // noop
      }
    };
    
    
    // close a submenu
    var submenuClose = function($submenu){
      // closed
      if($submenu.data('config').status == 'closed'){
        // noop
      }
      
      // opened
      else if($submenu.data('config').status == 'opened'){
        // close the submenu
        $submenu.data('config').status = 'closing';
        $submenu.hide('blind', {}, $menuContainer.data('config').displayDuration, function(){
          $submenu.data('config').status = 'closed';
          $menuContainer.data('config').currentEntry = null;

          if($.isFunction($submenu.data('config').callback)){
            $submenu.data('config').callback();
          }
        });
      }
        
      // closing
      else if($submenu.data('config').status == 'closing'){
        // noop
      }
        
      // opening
      else if($submenu.data('config').status == 'opening'){
        $submenu.data('config').callback =  function(){
          submenuClose($submenu);
          $submenu.data('config').callback = null;
        };
      }
    };

    
    // submenu autoclosing timer
    var submenuSetAutoClosingTimer = function($submenu){
      if($submenu.data('config').timer){
        clearTimeout($submenu.data('config').timer);
      }
      $submenu.data('config').timer = setTimeout(function(){submenuClose($submenu);}, $menuContainer.data('config').autoClosingDelay);
    }
    
    // clear all submenus timers
    var submenuClearAllTimers = function(){
      $('.submenu', $menuContainer).each(function(){
        if($(this).data('config').timer){
          clearTimeout($(this).data('config').timer);
        }
      });
    }
    
    
    // menu links hover
    $('ul#menu a', $menuContainer).bind('mouseover', function(e){
      e.preventDefault();
      $menuContainer.trigger('submenuClosed');
      
      // clear all submenus timers
      submenuClearAllTimers();
      
      // store entry to activate
      var $nextEntry = $(this);
      
      // clear user action
      if($menuContainer.data('config').userActionTimer){
        clearTimeout($menuContainer.data('config').userActionTimer);
      }
      
      // link has submenu ?
      var hasSubmenu = false;
      var $submenu;
      
      if(!!$(this).data('submenu')){
        $submenu = $($(this).data('submenu'), $menuContainer);
        if($submenu.length){
          hasSubmenu = true;
        }
      }
      
      // modify display only when the hovered entry is different from the previous one, or if this is the first action
      if(!($menuContainer.data('config').currentEntry && $menuContainer.data('config').currentEntry.length) || ($menuContainer.data('config').currentEntry.text() != $(this).text())){

        // define the method opening the desired submenu
        var openMenu = function(){
          $menuContainer.data('config').currentEntry = $nextEntry;
          if(hasSubmenu){
            submenuOpen($submenu);
          }
        };
        
        // close opened submenu(s) first, then open the desired one
        $menuContainer.data('config').userActionTimer = setTimeout(function(){
          // get the number of submenus opened
          var submenusToClose = $('.submenu:visible', $menuContainer).length;
    
          if(submenusToClose){
            $('.submenu:visible', $menuContainer).each(function(index, submenuToClose){
              // last one
              if(index == submenusToClose - 1){
                $(submenuToClose).data('config').callback = function(){
                  openMenu();
                  $(submenuToClose).data('config').callback = null;
                }
              }
              
              submenuClose($(this));
            });
          }
    
          // none to close, open the desired one, using the user delay timer to avoid
          else {
            openMenu();
          }
        }, $menuContainer.data('config').userActionDelay);
        
      }
      
      // update last current menu entry user played with
      $menuContainer.data('config').currentEntry = $(this);
      
    });
    
    // menu clicks
    $('ul#menu a', $menuContainer).click(function(e){
      if((/^#/).test($(this).attr('href'))){
        e.preventDefault();
      }
    });
    
    // submenu links hover
    $('.submenu a', $menuContainer).bind('mouseover, mouseleave', function(e){
      e.preventDefault();

      // get submenu    
      var $submenu = $(this).closest('.submenu');
      
      // prolongate timer
      submenuSetAutoClosingTimer($submenu);
    });
      
      
    /* lightbox fancybox */
    var lightboxElements = $('a.lightbox');
    if(lightboxElements.length){
      lightboxElements.fancybox({
        'titleShow': false,
        'transitionOut': 'none'
      });
    }
    
    /* popup link */
    $('a.popup').fancybox({
        'titleShow': false,
        'transitionOut': 'none'
    });
      

    /* newsletter short subscription */
    $('form#newsletter-short-subscribe').submit(function(e){
      var email = $('input[name=email]', $(this)).val();
      var messageContainer = $('span.message', $(this));

      // hide previous message
      messageContainer.empty().hide();

      var emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

      // not a valid email
      if(!emailRegex.test(email)){
        messageContainer.text('Le mail indiqué ne semble pas valide, pouvez-vous vérifier ?').addClass('error').fadeIn();
        return false;
      }

      $.ajax({
        url: $(this).attr('action'),
        data: {'email': email},
        success: function(data, textStatus, jqXHR){
          messageContainer.text('Votre inscription a bien été enregistrée !').removeClass('error').fadeIn();
        },
        error: function(jqXHR, textStatus, errorThrown){
          messageContainer.text('Votre inscription a échoué, pouvez-vous recommencer ?').addClass('error').fadeIn();
        }
      })
      return false;
    });
    $('form#newsletter-short-subscribe a.submit').click(function(e){
      e.preventDefault();
      $('form#newsletter-short-subscribe').submit();
    });

  

  };

  // home page
  project.prepareHomePage = function(){
    $('.current-offer .wrapper').carouFredSel({
          items: {
            visible: 1
          },
          auto: {
            duration: 500,
            fx: 'cover',
            delay: 1000,
            pauseDuration: 3500,
            pauseOnHover: true
          },
          pagination  : "#slider-nav"
    });

  };


  // product detail page
  project.prepareProductDetailPage = function(){
    /* basket */
    // Local variables
    var basketForm = $('form.add-item');
    var variationInput = $('input[name=item]', basketForm);
    var quantityInput = $('select[name=quantity]', basketForm);
    var submitButton = $('div.submit a.submit');
    var priceContainer = $('.product-right div.price');
    var errorContainer = $('div.basket p.error');
    var dataVariations = variationInput.data('variations');
    var dataOptionSets = variationInput.data('optionSets');
    var optionSetInputs = $('select.optionset', basketForm);

    // Local methods
    
    // get option set index
    var getOptionSetIndex = function(element){
      return parseInt($(element).attr('name').replace(/option\[/, '').replace(/\]/, ''));
    };

    // remember select options
    $(optionSetInputs).each(function(index, element){
      $(element).data('options', $('option', element).clone());
    });



    // update option sets display
    var updateOptionSetsDisplay = function(){
      if(!optionSetInputs.length)
      {
        return false;
      }
      
      // get current user selection
      var selectedOptions = getSelectedOptions();

      // met a variation for these option
      var variation = getVariationForOptions(selectedOptions);

      if(variation){
        setVariation(variation);
      } else {
        variationInput.val('');
      }

      // get options for that pattern
      var availableOptions = getAvailableOptionsForSelectedOptions(selectedOptions);

      // show available options for that user selected options
      optionSetInputs.each(function(optionSetIndex, optionSet){

        // option set has something to show for user
        if(availableOptions[optionSetIndex].length){
          var selector = [];
          $.each(availableOptions[optionSetIndex], function(index, value){
            selector.push('option[value="' + value +'"]');
          });
          selector = 'option[value=""],' + selector.join(',');

          /* DOES NOT WORK WITH IE, search for "jquery hide option in a select" to get more information
          $('option', $(optionSet)).hide();
          $(selector, optionSet).show();
          if($('option:hidden:selected', optionSet).length){
            optionSet.selectedIndex = $('option:visible[1]').index;
          }
          */

          // get current selected value
          var currentValue = $(optionSet).val();

          // reinitialize option set
          $(optionSet).empty();
          $(optionSet).append($(optionSet).data('options').clone()).find(':not(' + selector + ')').remove();
          $('option[value=' + currentValue + ']', optionSet).attr('selected', 'selected');
        }
        
        // no option to show, means that a parent option must be taken
        // so we disable this option set until user makes that parent choice
        else {
          $('option[value!=""]', optionSet).hide();
          if($('option:hidden:selected', optionSet).length){
            optionSet.selectedIndex = $('option:visible[1]').index;
          }
        }
      });
    };

    // get selected options array, like [1, 4, 7]
    var getSelectedOptions = function(){
      var selectedOptions = [];
      var values = optionSetInputs.serializeArray();
      $.each(values, function(index, element){
        if(typeof element.value === 'undefined' || !element.value){
          return false;
        }
        selectedOptions.push(parseInt(element.value));
      });
      return selectedOptions;
    }

    // get index for lastly selected option set
    var getCurrentOptionSetIndex = function(){
      var currentIndex = 0;
      optionSetInputs.each(function(index, optionSet){
        if(!!$(this).val()){
          return false;
        }
        currentIndex++;
      });
      return currentIndex;
    }
    
    // get set options matching a pattern
    var getAvailableOptionsForSelectedOptions = function(selectedOptions){
      var availableOptions = [];
      optionSetInputs.each(function(index, optionSetInput){
        var options = [];
        // first option set, keep all options
        if(index == 0){
          $('option[value!=""]', optionSetInput).each(function(optionIndex, option){
            options.push(parseInt($(option).attr('value')));
          });
        }
        
        // subset, keep options compatible with upper selected options
        else {
          // filter option sets matching parent selected options
          if(typeof selectedOptions[index-1] !== 'undefined'){
            $.each(dataOptionSets, function(variationIndex, variationSet){
              if(compareOptions(variationSet.slice(0, index), selectedOptions.slice(0, index))){
                if($.inArray(variationSet[index], options) < 0){
                  options.push(variationSet[index]);
                }
              }
            });
          }
        }
        availableOptions.push(options);
      });

      return availableOptions;
    };

    // Oh my god! Still needing to define a method for comparing two arrays in 2011!!
    var compareOptions = function(set1, set2){
      if(set1.length != set2.length){
        return false;
      }
      for(var i = 0; i < set1.length; i++){
        if(set1[i] != set2[i]){
          return false;
        }
      }
      return true;
    }

    // get a variation matching an option set
    var getVariationForOptions = function(options){
      var variation = false;
      $.each(dataOptionSets, function(variationId, variationSet){
        if(compareOptions(options, variationSet)){
          variation = variationId;
          return false;
        }
      });
      return variation;
    };

    // configure ui for a choosen variation
    var setVariation = function(variationId){
      // remove any error message
      errorContainer.hide();

      // update variation input value
      variationInput.val(variationId);

      // update price display
      priceContainer.find('strong span').text(dataVariations[variationId].price);
      priceContainer.find('em span').text(dataVariations[variationId].usualPrice);
      if(dataVariations[variationId].usualPrice){
        priceContainer.find('em').addClass('discounted');
      } else {
        priceContainer.find('em').removeClass('discounted');
      }
    }

    // initialize option sets
    updateOptionSetsDisplay();

    // initialize basket form
    submitButton.click(function(e){
      e.preventDefault();
      if(errorContainer.is(':visible')){
        errorContainer.fadeOut();
      }
      if(!variationInput.val()){
        errorContainer.text('Utilisez les listes déroulantes pour choisir votre modèle').fadeIn();
        return false;
      }
      if(!(quantityInput.val() > 0)){
        errorContainer.text('Indiquez une quantité valide pour votre produit').fadeIn();
        return false;
      }
      basketForm.submit();
    });


    // initialize variation selection
    optionSetInputs.change(function(e){
      e.preventDefault();

      // update available options for option sets
      updateOptionSetsDisplay(getOptionSetIndex(this));
    })

    



    /* superzoom */
    // Local variables
    var zoomContainer = $('div.zoom');

    // initialize superzoom
    if(zoomContainer.length){
      // superzoom options
      var options = {
        showPreload: true,
        preloadText: 'Chargement de l\'image...',
        title: false,
        opacity: 0.2,
        zoomWidth: 375,
        zoomHeight: 336,
        position: 'right',
        xOffset : 20,
        yOffset : 0
      };
      
      // Activate superzoom on main picture
      $('a', zoomContainer).jqzoom(options);
      
      // Event: click on a preview and change the main picture
      $('.product-left .zoom-pictures a').click(function(e){
        e.preventDefault();
        
        zoomContainer
          .find('a').remove().end()
          .append('<a href="' + $(this).attr('rel') + '"><img src="' + $(this).attr('href') + '" /></a>')
        ;
        
        $('a', zoomContainer).jqzoom(options);
      });
    }
  };

  // product detail page
  project.prepareCheckoutPage = function(){
    /* STEP BASKET */

    /* local variables */
    var basketContainer = $('.checkout-main .checkout-step-basket');
    var basketUpdateForm = $('form.update', basketContainer);
    var basketUpdateInput = $('input[type=hidden][name=update]', basketContainer);
    var basketQuantitySelects = $('select.item-quantity', basketContainer);
    var basketRemoveItemButtons = $('a.remove-item', basketContainer);
    var basketDeliveryCountrySelect = $('select.delivery-country', basketContainer);
    var basketShippingMethodSelect = $('select.shipping-method', basketContainer);
    var basketCouponCodeInput = $('input[type=text].coupon-code', basketContainer);
    var basketCouponCodeSubmit = $('input[type=button].coupon-code', basketContainer);
    var basketCouponCodeRemoveLink = $('a.remove-discount', basketContainer);
    var basketSubmitButton = $('input[type=submit]', basketContainer);
    var basketLoadingContainer = $('tfoot', basketContainer);
    var basketUpdateLink = $('a.update-basket', basketContainer);

    var basketDiscountContainer = $('tr#discount', basketContainer);
    var basketCouponCodeError = $('div.error', basketDiscountContainer);
    var basketDiscountAmountText = $('td.discount-amount span', basketContainer);
    var basketShippingsAmountText = $('td.shippings-amount span', basketContainer);
    var basketTotalAmountText = $('td.total-amount span', basketContainer);
    var basketDiscountCodeText = $('div.display-discount span.code', basketDiscountContainer);

    /* config */
    var config = basketContainer.data('config');

    /* local methods */
    // set basket loading
    var loading = false;
    var basketLoading = function(status){
      if(typeof status != 'undefined' && !status){
        var currentLoading = loading;
        setTimeout(function(){basketUnsetLoading(currentLoading)}, 500);
      } else {
        basketLoadingContainer.addClass('loading');
        loading = new Date().getTime();
      }
    }
    var basketUnsetLoading = function(time){
      if(loading == time){
        basketLoadingContainer.removeClass('loading');
      }
    }
    
    // update basket items
    var basketUpdateItems = function(){
      $.ajax({
        "url": basketUpdateForm.attr('action'),
        "data": basketUpdateForm.serialize(),
        "dataType": 'json',
        "beforeSend": function(){
          basketLoading();
        },
        "success": function(data, textStatus, jqXHR){
          basketUpdateDisplay(data);
        },
        "error": function(jqXHR, textStatus, errorThrown){
          alert('erreur');
        },
        "complete": function(){
          basketShippingMethodSelect.attr('disabled', '');
          basketLoading(false);
        }
      });
    }


    // remove an item
    var basketRemoveItem = function(button){
      if($('a.remove-item', basketContainer).length > 1){
        $.ajax({
          "url": button.attr('href'),
          "dataType": 'json',
          "beforeSend": function(){
            basketLoading();
          },
          "success": function(data, textStatus, jqXHR){
            button.closest('tr').remove();
            basketUpdateDisplay(data);
          },
          "error": function(jqXHR, textStatus, errorThrown){
            alert('erreur');
          },
          "complete": function(){
            basketLoading(false);
          }
        });
      }
      
      // this is the last item, page needs a refresh
      else {
         basketLoading();
        document.location = button.attr('href');
      }
    }

    // update delivery country
    var basketUpdateDeliveryCountry = function(value){
      basketShippingMethodSelect.attr('disabled', "disabled");
      $.ajax({
        "url": config.updateDeliveryCountryUrl,
        "data": {"country": value},
        "dataType": 'json',
        "beforeSend": function(){
          basketLoading();
        },
        "success": function(data, textStatus, jqXHR){
          basketUpdateDisplay(data);
          basketUpdateShippingMethodsForCountry(value);
        },
        "error": function(jqXHR, textStatus, errorThrown){
          basketDeliveryCountrySelect.val(basketDeliveryCountrySelect.data('val'));
          alert('erreur');
        },
        "complete": function(){
          basketLoading(false);
        }
      });
    }

    // update shipping method
    var basketUpdateShippingMethod = function(value){
      $.ajax({
        "url": config.updateShippingMethodUrl,
        "data": {"shipping_method": value},
        "dataType": 'json',
        "beforeSend": function(){
          basketLoading();
        },
        "success": function(data, textStatus, jqXHR){
          basketUpdateDisplay(data);
        },
        "error": function(jqXHR, textStatus, errorThrown){
          basketShippingMethodSelect.val(basketShippingMethodSelect.data('val'));
          alert('erreur');
        },
        "complete": function(){
          basketLoading(false);
        }
      });
    }

    // update coupon code
    var basketUpdateCouponCode = function(value){
      $.ajax({
        "url": config.updateCouponCodeUrl,
        "data": {"code": value},
        "dataType": 'json',
        "beforeSend": function(){
          basketLoading();
        },
        "success": function(data, textStatus, jqXHR){
          basketUpdateDisplay(data);
        },
        "error": function(jqXHR, textStatus, errorThrown){
          basketCouponCodeInput.val('');
          basketCouponCodeError.text('Ce code n\'est pas valable').fadeIn().delay(3000).fadeOut('slow');
        },
        "complete": function(){
          basketCouponCodeInput.val('');
          basketLoading(false);
        }
      });
    }

    // remove coupon code
    var basketRemoveCouponCode = function(){
      $.ajax({
        "url": basketCouponCodeRemoveLink.attr('href'),
        "dataType": 'json',
        "beforeSend": function(){
          basketLoading();
        },
        "success": function(data, textStatus, jqXHR){
          basketUpdateDisplay(data);
        },
        "error": function(jqXHR, textStatus, errorThrown){
          alert('erreur');
        },
        "complete": function(){
          basketCouponCodeInput.val('');
          basketLoading(false);
        }
      });
    }

    // update shipping methods for country
    var basketUpdateShippingMethodsForCountry = function(value){
      $.ajax({
        "url": config.updateShippingMethodsForCountryUrl,
        "data": {"country": value},
        "dataType": 'json',
        "beforeSend": function(){
          basketLoading();
        },
        "success": function(data, textStatus, jqXHR){
          var currentValue = basketShippingMethodSelect.val();
          basketShippingMethodSelect.empty();

          $.each(data, function(index, element){
            basketShippingMethodSelect.append('<option value="' + element.symlink + '">' + element.name + '</option>');
          });
          basketShippingMethodSelect.val(currentValue);
        },
        "error": function(jqXHR, textStatus, errorThrown){
          alert('erreur');
        },
        "complete": function(){
          basketShippingMethodSelect.attr('disabled', '');
          basketLoading(false);
        }
      });
    }

    // update basket display
    var basketUpdateDisplay = function(data){
      // set shippings amount
      basketShippingsAmountText.text(Number(data.amount.shippings_amount_no_discount).formatCurrency() + ' €');

      // set discount amount
      basketDiscountAmountText.text('-' + Number(data.amount.discount_amount).formatCurrency() + ' €');

      // set total amount
      basketTotalAmountText.text(Number(data.amount.amount).formatCurrency() + ' €');

      // manage discount display
      if(data.discount.length){
        basketDiscountCodeText.text(data.discount[0].coupon.code);
        basketDiscountContainer.addClass('has-discount');
      } else {
        basketDiscountContainer.removeClass('has-discount');
      }

      // manage items
      if(data.item.length){
        $.each(data.item, function(index, element){
          var itemPriceText = $('.item-' + element.index + '-price span', basketContainer);
          if(itemPriceText.length){
            itemPriceText.text(Number(element.amount.amount).formatCurrency() + ' €');
          }
        });
      }
    }


    /* events */
    // user changes an item quantity
    basketQuantitySelects.change(function(e){
      e.preventDefault();
      basketUpdateInput.val(1);
      basketUpdateForm.submit();
    });

    // user removes an item
    basketRemoveItemButtons.click(function(e){
      e.preventDefault();
      basketRemoveItem($(this));
    });

    // user submit first step basket
    basketSubmitButton.click(function(e){
      e.preventDefault();
      basketUpdateInput.val('');
      basketUpdateForm.submit();
    });

    // user submit first step basket
    basketUpdateLink.click(function(e){
      e.preventDefault();
      basketUpdateInput.val('1');
      basketUpdateForm.submit();
    });

    // form is submited
    basketUpdateForm.submit(function(e){
      // ajax update
      if(basketUpdateInput.val()){
        e.preventDefault();
        basketUpdateItems();
      }
    });

    // user changes delivery country
    basketDeliveryCountrySelect.change(function(e){
      e.preventDefault();
      basketUpdateDeliveryCountry($(this).val());
    });

    // user changes shipping method
    basketShippingMethodSelect.change(function(e){
      e.preventDefault();
      basketUpdateShippingMethod($(this).val());
    });

    // user submit coupon code
    basketCouponCodeSubmit.click(function(e){
      e.preventDefault();
      basketUpdateCouponCode(basketCouponCodeInput.val());
    });

    // user remove coupon code
    basketCouponCodeRemoveLink.click(function(e){
      e.preventDefault();
      basketRemoveCouponCode();
    });


    /* initialization */




    /* STEP CONTACT */
    /* local variables */
    var contactContainer = $('.checkout-main .checkout-step-contact');
    var deliveryAddressContainer = $('fieldset.shipping-address');
    var differentDeliveryAddressCheckbox = $('input[name=different_delivery_address]');

    
    /* local methods */
    var displayDeliveryAddress = function(){
      if(differentDeliveryAddressCheckbox.is(':checked')){
        differentDeliveryAddressCheckbox.parent('div.checkbox').addClass('checked');
        deliveryAddressContainer.fadeIn();
      } else {
        differentDeliveryAddressCheckbox.parent('div.checkbox').removeClass('checked');
        deliveryAddressContainer.hide();
      }
    }

    /* events */
    // different delivery address chosen
    differentDeliveryAddressCheckbox.click(function(e){
      displayDeliveryAddress();
    });
    
    /* initialization */

    /* STEP PERSONNALIZE */
    /* local variables */
    var personnalizeContainer = $('.checkout-main .checkout-step-personnalize');
    var giftPackingWantedCheckbox = $('input[name=gift_packing]', personnalizeContainer);
    var giftPackingsContainer = $('div.gift-packings', personnalizeContainer);
    var giftPackingsRadios = $('input[type=radio]', giftPackingsContainer);
    var giftPackingLinks = $('a.lightbox', giftPackingsContainer);

    /* local methods */
    /* events */

    // click on gift packing checkbox
    giftPackingWantedCheckbox.click(function(e){
      if(!$(this).is(':checked')){
        $('input[type=radio]', giftPackingsContainer).attr('checked', '');
      } else {
        if(!$('input[type=radio]:checked', giftPackingsContainer).length){
          $('input[type=radio]:eq(0)', giftPackingsContainer).attr('checked', 'checked');
        }
      }
    });

    // click on gift packing image
    giftPackingLinks.click(function(e){
      giftPackingWantedCheckbox.attr('checked', 'checked');
      $(this).closest('li').find('input[type=radio]').attr('checked', 'checked');
    });

    // click on gift packing image
    giftPackingsRadios.click(function(e){
      giftPackingWantedCheckbox.attr('checked', 'checked');
    });

    /* initialization */


    /* STEP PAYMENT */
    /* local variables */
    var paymentContainer = $('.checkout-main .checkout-step-payment');

    var creditCardContainer = $('div.credit-card-checkout', paymentContainer);
    var creditCardSetMethodUrl = $('.select-payment-method', creditCardContainer).data('setMethodUrl');
    var creditCardButton = $('.select-payment-method input[type=button]', creditCardContainer);
    var creditCardPaymentOptionsContainer = $('div.payment-options-wrapper', creditCardContainer);

    var paypalContainer = $('div.paypal-checkout', paymentContainer);
    var paypalSetMethodUrl = $('.select-payment-method', paypalContainer).data('setMethodUrl');
    var paypalButton = $('.select-payment-method input[type=button]', paypalContainer);
    var paypalPaymentOptionsContainer = $('div.payment-options-wrapper', paypalContainer);

    var boxContent;

    /* local methods */
    // display lightbox with credit card payment options
    var displayCreditCardPaymentOptions = function(){
      $.fancybox({
        'content': creditCardPaymentOptionsContainer,
        'titleShow': false,
        'transitionOut': 'none',
        'width': 700,
        'height': 250,
        'autoDimensions': false,
        'onComplete': function(){
          boxContent = $(this).content;
          $('input[type=image]', boxContent).click(function(e){
            e.preventDefault();
            updateCreditCardPaymentMethod($(this));
          });
        }
      });
    };

    var updateCreditCardPaymentMethod = function(button){
      $.ajax({
        "url": creditCardSetMethodUrl,
        "dataType": 'json',
        "success": function(data, textStatus, jqXHR){
        },
        "error": function(jqXHR, textStatus, errorThrown){
        },
        "complete": function(){
          $('input[type=image]', boxContent).unbind('click');
          button.click();
        }
      });
    };

    // display lightbox with paypal payment options
    var displayPaypalPaymentOptions = function(){
      $.fancybox({
        'content': paypalPaymentOptionsContainer,
        'titleShow': false,
        'transitionOut': 'none',
        'width': 700,
        'height': 250,
        'autoDimensions': false,
        'onComplete': function(){
          boxContent = $(this).content;
          $('input[type=image]', boxContent).click(function(e){
            e.preventDefault();
            updatePaypalPaymentMethod($(this));
          });
        }
      });
    };

    var updatePaypalPaymentMethod = function(button){
      $.ajax({
        "url": paypalSetMethodUrl,
        "dataType": 'json',
        "success": function(data, textStatus, jqXHR){
        },
        "error": function(jqXHR, textStatus, errorThrown){
        },
        "complete": function(){
          $('input[type=image]', boxContent).unbind('click');
          button.click();
        }
      });
    };

    /* events */
    // credit card payment button clicked
    creditCardButton.click(function(e){
      e.preventDefault();
      displayCreditCardPaymentOptions();
    });

    // paypal payment button clicked
    paypalButton.click(function(e){
      e.preventDefault();
      displayPaypalPaymentOptions();
    });

    /* initialization */


  };
})(jQuery);

