(function($) {
  
  var DOM = {}, INIT = {
    
    collection: function() {
      DOM.productListWrapper = $('#product_list_wrapper', DOM.body);
      DOM.productList = $('#product_list', DOM.productListWrapper);
      DOM.product = $('.product', DOM.productList);
      DOM.arrowLeft = $('#arrow_left', DOM.body).hide();
      DOM.arrowRight = $('#arrow_right', DOM.body);
      DOM.navProduct = $('.product:visible', DOM.nav);
      
      var index = 0, count = DOM.product.size(), width = DOM.product.outerWidth(true);
      
      var goTo = function(targetIndex) {
        if (targetIndex != index && targetIndex >= 0 && targetIndex < count) {
          index = targetIndex;
          
          // Animate the product list
          DOM.productList.animate({
            marginLeft: -width * index
          }, 200);
          
          // Show or hide arrows
          if (index == 0) {
            DOM.arrowLeft.fadeOut(200);
          }
          else if (DOM.arrowLeft.is(':hidden')) {
            DOM.arrowLeft.fadeIn(200);
          }
          if (index == count - 1) {
            DOM.arrowRight.fadeOut(200);
          }
          else if (DOM.arrowRight.is(':hidden')) {
            DOM.arrowRight.fadeIn(200);
          }
          
          // Deselect the currently selected product link
          DOM.navProduct.filter('.selected').removeClass('selected').addClass('deselected');
          
          // Select the target product link
          DOM.navProduct.filter(function(i) {
            return $(this).data('count') - 1 == index;
          }).removeClass('deselected').addClass('selected');
        }
      };
      
      // Make the product list large enough to accomodate all products hoziontally
      DOM.productList.width(width * count);
      
      // Previous
      DOM.arrowLeft.click(function(event) {
        event.preventDefault();
        goTo(index - 1);
      });
      
      // Next
      DOM.arrowRight.click(function(event) {
        event.preventDefault();
        goTo(index + 1);
      });
      
      // Keyboard controls
      DOM.document.keydown(function(event) {
        switch(event.keyCode) {
          case 37 :
            goTo(index - 1);
            break;
          case 39 :
            goTo(index + 1);
            break;
        }
      });
      
      // Click product link to navigate to a specific product
      DOM.navProduct.find('a').click(function(event) {
        event.preventDefault();
        goTo($(this).text() - 1);
      });
      
      // Select the first product link
      DOM.navProduct.filter(':first').removeClass('deselected').addClass('selected');
      
      DOM.product.each(function() {
        var self = $(this), image = self.find('.product_image img');
        self.find('.product_thumbnail').click(function(event) {
          event.preventDefault();
          image.attr('src', $(this).attr('href'));
        });
      });
    },// end collection
    
    weblog: function() {
      DOM.article_list = $('#article_list');
      DOM.article = DOM.article_list.find('.article');
      DOM.arrowLeft = $('#arrow_left', DOM.body).hide();
      DOM.arrowRight = $('#arrow_right', DOM.body);
      
      var index = 0, count = DOM.article.size(), width = DOM.article.outerWidth(true);
      
      var goTo = function(targetIndex) {
        if (targetIndex != index && targetIndex >= 0 && targetIndex < count - 2) {
          index = targetIndex;
          
          // Animate the product list
          DOM.article_list.animate({
            marginLeft: -width * index
          }, 200);
          
          // Show or hide arrows
          if (index == 0) {
            DOM.arrowLeft.fadeOut(200);
          }
          else if (DOM.arrowLeft.is(':hidden')) {
            DOM.arrowLeft.fadeIn(200);
          }
          if (index == count - 3) {
            DOM.arrowRight.fadeOut(200);
          }
          else if (DOM.arrowRight.is(':hidden')) {
            DOM.arrowRight.fadeIn(200);
          }
        }
      };
      
      // Make the product list large enough to accomodate all products hoziontally
      DOM.article_list.width(width * count);
      
      // Previous
      DOM.arrowLeft.click(function(event) {
        event.preventDefault();
        goTo(index - 1);
      });
      
      // Next
      DOM.arrowRight.click(function(event) {
        event.preventDefault();
        goTo(index + 1);
      });
      
      // Keyboard controls
      DOM.document.keydown(function(event) {
        switch(event.keyCode) {
          case 37 :
            goTo(index - 1);
            break;
          case 39 :
            goTo(index + 1);
            break;
        }
      });
      
      /*
      
      var
        current  = 0,
        count    = DOM.article.size(),
        width    = DOM.article.outerWidth(true),
        previous = function() {
                     if (current > 0) {
                       DOM.article_list.animate({
                         marginLeft: - (--current * width)
                       }, {
                         duration: 100
                       });
                     }
                   },
        next     = function() {
                     if (current < count - 3) {
                       DOM.article_list.animate({
                         marginLeft: - (++current * width)
                       }, {
                         duration: 100
                       });
                     }
                   };
      
      DOM.article_list.width(count * width);
      
      DOM.arrow_left = $('#arrow_left').click(function() {
        previous();
        return false;
      });
      
      DOM.arrow_right = $('#arrow_right').click(function() {
        next();
        return false;
      });
      
      $(document).keydown(function(event) {
        switch(event.keyCode) {
          case 37  : // left
          case 100 : // "4" keypad
            previous();
            break;
          case 39  : // right
          case 102 : // "6" keypad
            next();
            break;
        }
      });
      
      Overlay.hide();
      */
      
    },// end weblog
    
    about: function() {
      DOM.header = $('#header');
      DOM.content = $('#content');
      DOM.roundel = $('#roundel');
      
      var
        headerHeight = DOM.header.outerHeight(true),
        contentHeight = DOM.content.outerHeight(true)
      
      DOM.window.resize(function() {
        DOM.roundel.css('marginTop', Math.max(0, DOM.window.height() - headerHeight - contentHeight));
      }).trigger('resize');
    }
    
  };
  
  $(function() {
    DOM.document = $(document);
    DOM.window = $(window);
    DOM.body = $('body', DOM.document);
    DOM.nav = $('#nav', DOM.body);
    
    var channel = $('html').attr('id');
    if (INIT[channel])
      INIT[channel]();
  });
})(window.jQuery);
