window.addEvent('domready', function() {
  // This is for the checkboxes that select all checkboxes in the form.
  $$('table input.toggle').each(function(toggle_item) {
    toggle_item.addEvent('click', function() {
      toggle_item.getParent('table').getElements('input[type="checkbox"]').set('checked', toggle_item.get('checked'));
    });
  });
  
  // Initialise the slideshow whenever it is found.
  $$('.slideshow').each(function(slideshow_item) {
    new Slideshow({
      container : slideshow_item
    });
  });

  // This is for the product sidebar filter, we do AJAX calls to retrieve the filtered results.
  if($('ProductSidebarForm')) {
    $('ProductSidebarForm').addEvent('submit', function(event) {
      if(event) event.stop();
      var form = $('ProductSidebarForm');
      $('product_listing').empty();
      $('product_listing').getNext().empty();
      $url = ($('gourmetMarketBrandId') ? '/gourmet_market_items/search' : 'hampers/search');
      var request = new Request({
        'method' : 'get',
        'url' : $url,
        onSuccess : function(result) {
          var div = new Element('div', {
            html : result
          })
          div.getFirst('ul').replaces($('product_listing'));
          div.getLast('ul').replaces($('product_listing').getNext());
          $('product_listing').getNext().getChildren().each(function(item) {
            item.addEvents({
              'click' : function(event) {
                if(event) event.stop();
                window.scrollTo(0, 0);
                request.send(form.toQueryString().replace(/data\[(.*?)\]/g, '$1') + '&page=' + this.get('text'));
                $('product_listing').empty();
                $('product_listing').getNext().empty();
              },
              'keypress' : function(event) {
                event.stop();
                this.fireEvent('click');
              }
            });
          });
        }
      }).send(form.toQueryString().replace(/data\[(.*?)\]/g, '$1'));
      window.scrollTo(0, 0);
    });
    $('ProductSidebarForm').fireEvent('submit');
  }

  if($('FeaturedProductDiscountType')) {
    new Toggler({
      element : $('FeaturedProductDiscountType'),
      toggle_on : [$('FeaturedProductDiscountAppliedTo').getParent(), $('FeaturedProductDiscountValue')],
      toggle_off : [$('FeaturedProductDiscountValueGourmetMarketItem')],
      comparison : function(element) {
        return element.get('value') != 'item';
      }
    });
  }
  
  $$('.OptionCategoryCheckbox').each(function(item) {
    new Toggler({
      element : item
    });
  });

  if($('VoucherDiscountType')) {
    new Toggler({
      element : $('VoucherDiscountType'),
      toggle_on : [$('VoucherDiscountAppliedTo').getParent(), $('VoucherDiscountValue')],
      toggle_off : [$('VoucherDiscountValueGourmetMarketItem')],
      comparison : function(element) {
        return element.get('value') != 'item';
      }
    });
    new Toggler({
      element : $('VoucherLimited')
    });
    new Toggler({
      element : $('VoucherExpires')
    });
  }

  // Lets handle the checkout form now...
  if($('OrderAddForm')) {
    var page = 1;
    var pages = $$('.checkout_page');
    var steps = $$('.checkout_steps li');
    var page_count = pages.length;

    function page_change(page) {
      pages.setStyle('display', 'none');
      pages[page - 1].setStyle('display', 'block');
      steps.removeClass('current');
      steps[page - 1].addClass('current');
      window.scrollTo(0, 0);
    }

    pages.each(function(item, index) {
      var div = new Element('div', {
        'class' : 'center submit submit_combined'
      });
      if(index > 0) new Element('input', {
        type : 'submit',
        value : 'Previous Page',
        events : {
          'click' : function(event) {
            if(event) event.stop();
            page_change(this.retrieve('page'));
          },
          'keyup' : function(event) {
            event.stop();
            this.fireEvent('click');
          }
        }
      }).store('page', index).inject(div);
      if(index < page_count - 1) new Element('input', {
        type : 'submit',
        value : 'Next Page',
        events : {
          'click' : function(event) {
            if(event) event.stop();
            page_change(this.retrieve('page'));
          },
          'keyup' : function(event) {
            event.stop();
            this.fireEvent('click');
          }
        }
      }).store('page', index + 2).inject(div);
      div.inject(item);
      item.setStyle('display', 'none');
    });
    steps.each(function(item, index) {
      item.store('page', index + 1).addEvents({
        'click' : function(event) {
          if(event) event.stop();
          page_change(this.retrieve('page'));
        },
        'keyup' : function(event) {
          event.stop();
          this.fireEvent('click');
        }
      });
    });
    page_change(1);

    new Toggler({
      element : $('OrderBillingUseDelivery'),
      comparison : function(element) {
        return !element.get('checked');
      }
    });

    var confirmation_request;
    var postcode = $('OrderDeliveryPostcode');
    var suburb = $('OrderDeliverySuburb');
    var state = $('OrderDeliveryState');
    var deliveryHampers = $('OrderDeliveryHampers');
    var deliveryGourmetMarketItems = $('OrderDeliveryGourmetMarketItems');
    var voucher = $('OrderBillingVoucher');
    var delivery_hampers_options = {
      'posted_vic' : new Element('option', {
        value : 'posted_vic',
        text : 'Victoria (Posted): $10.00 Each Hamper'
      }),
      'door_to_door' : new Element('option', {
        value : 'door_to_door',
        text : 'Melbourne Metropolitan Area (Door-to-Door): $15.00 Each Hamper'
      }),
      'posted' : new Element('option', {
        value : 'posted',
        text : 'Other States (Posted): $15.00 Each Hamper'
      })
    };

    function update_available_delivery_methods() {
      if(deliveryHampers) {
        deliveryHampers.empty();
        if(postcode.get('value').length == 4) {
          if(state.selectedIndex == 2) {
            delivery_hampers_options.posted_vic.clone().inject(deliveryHampers);
            if(postcode.retrieve('door_to_door')) delivery_hampers_options.door_to_door.clone().inject(deliveryHampers);
          } else {
            delivery_hampers_options.posted.clone().inject(deliveryHampers);
          }
        } else {
          if(state.selectedIndex == 2 || state.selectedIndex == 0) {
            delivery_hampers_options.posted_vic.clone().inject(deliveryHampers);
            delivery_hampers_options.door_to_door.clone().inject(deliveryHampers);
          }
          delivery_hampers_options.posted.clone().inject(deliveryHampers);
        }
        update_confirmation_area();
      }
    }

    function update_confirmation_area() {
      if(confirmation_request) confirmation_request.cancel();
      confirmation_request = new Request({
        url : '/checkout/total',
        onSuccess : function(html) {
          if(html) $('confirmation').set('html', html);
        }
      }).send($('OrderAddForm').toQueryString());
    }

    postcode.addEvent('keyup', function() {
      postcode.removeClass('loading');
      if(postcode.retrieve('request')) postcode.retrieve('request').cancel();
      if(postcode.get('value').length == 4) {
        postcode.addClass('loading');
        postcode.store('request', new Request.JSON({
          method : 'get',
          url : '/checkout/postcode/' + this.get('value'),
          onSuccess : function(json) {
            postcode.removeClass('loading');
            if(json.length > 0) {
              suburb.set('value', json[0].suburb);
              state.selectedIndex = $A(state.options).filter(function(item) {
                return item.value == json[0].state;
              }).getLast().index;
              postcode.store('door_to_door', json[0]['door_to_door']);
            }
            update_available_delivery_methods();
          }
        }).send());
      }
    });
    postcode.fireEvent('keyup');

    state.addEvents({
      keyup : function() {
        update_available_delivery_methods();
      },
      click : function() {
        this.fireEvent('keyup');
      }
    });
    state.fireEvent('keyup');
    
    if(deliveryHampers) deliveryHampers.addEvents({
      click : function() {
        update_confirmation_area();
      },
      keyup : function() {
        this.fireEvent('click');
      }
    });
    if(deliveryGourmetMarketItems) deliveryGourmetMarketItems.addEvents({
      click : function() {
        update_confirmation_area();
      },
      keyup : function() {
        this.fireEvent('click');
      }
    });

    if(voucher) {
        voucher.addEvent('keyup', function() {
        if(voucher.retrieve('request')) voucher.retrieve('request').cancel();
        if(!voucher.retrieve('info')) voucher.store('info', new Element('p').inject(voucher, 'after'));
        var info = voucher.retrieve('info');
        if(voucher.get('value').length > 0) {
          info.set({
            'class' : 'flashMessage',
            text : 'Checking voucher code, please wait...'
          }).setStyle('display', 'block');
        } else {
          info.setStyle('display', 'none');
        }
        voucher.store('request', new Request.JSON({
          url : '/vouchers/retrieve/' + voucher.get('value'),
          onSuccess : function(json) {
            if(json && json['Voucher']) {
              info.set({
                'class' : 'flashSuccess',
                text : 'Voucher for "' + json['Voucher']['title'] + '" accepted and applied if applicable.'
              });
              update_confirmation_area();
            } else {
              this.onFailure();
            }
          },
          onFailure : function() {
            info.set({
              'class' : 'flashError',
              text : 'The voucher code was incorrect. Please try another voucher.'
            });
            update_confirmation_area();
          }
        }).send());
      });
      voucher.fireEvent('keyup');
    }
  }
});

var Slideshow = new Class({
  Implements : Options,
  options : {
    period : 5000,
    container : null,
    selectors : new Array(),
    images : new Array(),
    last : 0
  },
  initialize : function(options) {
    var this_class = this;
    this.setOptions(options);
    if(this.options.container) {
      this.options.selectors = this.options.container.getElements('nav li');
      this.options.images = this.options.container.getChildren('a.image');
      this.options.images.fade('hide');
      this.options.images[0].fade('in');
      var periodical = this.animate.periodical(this.options.period, this);
      for(var i = 0; i < this.options.selectors.length; i++) {
        this.options.selectors[i].store('key', i);
        this.options.selectors[i].addEvent('click', function(click_event) {
          click_event.preventDefault();
          $clear(periodical);
          this_class.set(this_class.options.last, this.retrieve('key'));
          this_class.options.last = this.retrieve('key');
          periodical = this_class.animate.periodical(this_class.options.period, this_class);
        });
      }
    }
  },
  animate : function() {
    var position = this.options.last + 1;
    if(position >= this.options.images.length) position = 0;
    this.set(this.options.last, position);
    this.options.last = position;
  },
  set : function(previous, current) {
    this.options.images[previous].fade('out');
    this.options.images[previous].removeClass('current');
    if(this.options.selectors[previous]) {
      this.options.selectors[previous].removeClass('selected');
    }
    this.options.images[current].fade('in');
    this.options.images[current].addClass('current');
    if(this.options.selectors[current]) {
      this.options.selectors[current].addClass('selected');
    }
  }
});

var Toggler = new Class({
  Implements : Options,
  options : {
    element : null,
    toggle_on : null,
    toggle_off : null,
    comparison : function(element) {
      return element.get('checked');
    }
  },
  toggle : null,
  initialize : function(options) {
    this.setOptions(options);
    this.toggle = this.options.element.getNext('.toggle');
    if(!this.toggle) this.toggle = this.options.element.getParent().getNext('.toggle');
    this.options.element.addEvents({
      click : function() {
        if(this.options.comparison.run(this.options.element, this)) {
          if(this.toggle) this.toggle.setStyle('display', 'block');
          if(this.options.toggle_on) this.options.toggle_on.each(function(item) {
            item.setStyle('display', 'block');
          });
          if(this.options.toggle_off) this.options.toggle_off.each(function(item) {
            item.setStyle('display', 'none');
          });
        } else {
          if(this.toggle) this.toggle.setStyle('display', 'none');
          if(this.options.toggle_on) this.options.toggle_on.each(function(item) {
            item.setStyle('display', 'none');
          });
          if(this.options.toggle_off) this.options.toggle_off.each(function(item) {
            item.setStyle('display', 'block');
          });
        }
      }.bindWithEvent(this),
      keyup : function() {
        this.fireEvent('click');
      }
    });
    this.options.element.fireEvent('click');
  }
});