
var ProductSorter = Class.create({
  
  initialize: function() {
    
    if( $('carts_list') ) {
      
      $$('.sorter select').each(function(sorter){
        sorter.observe('change',this.sort.bindAsEventListener(this));
      }.bind(this));
      
    }
    
  },
  
  sort: function(e) {

    var th = this;

    var sorter = Event.element(e);
    var sort_by = sorter.getValue();
    
    th.sorter_text(sorter,sort_by);
    
    var products_container = sorter.ancestors()[1].nextSiblings().first();
    var products = th.get_sorter_products(products_container);
    
    var params = { 'sort_by': sort_by, 'skus': products.keys() };
    
    new Ajax.Request('/product_sort.html',{
      method: 'post',
      parameters: params,
      onComplete: function(t) {
    
        var result = t.responseText.evalJSON();
        var skus = new Object(result.skus);
        
        new_container = th.sort_the_products(skus,products);
        products_container.replace(new_container);
        
      }
    });

  },
  
  get_sorter_products: function(products_container) {
  
    var products = new Hash();
    
    products_container.select('.product').each(function(product){
      var sku = product.select('input[name=sku]').first().getValue();
      products.set(sku,product);
    });
    
    return products;
    
  },
  
  sort_the_products: function(skus,products) {
    
    container = new Element('div',{ 'class': 'group_products' });
    
    var previous_product = undefined;
    
    skus.each(function(s){
      var product = products.get(s);
      container.insert(product);
      ( previous_product && (previous_product.hasClassName('best_buy_budget') || previous_product.hasClassName('best_buy_genuine')) ) ? product.addClassName('after_recommended') : product.removeClassName('after_recommended');
      
      previous_product = product;
    });
    
    return container;
  },
  
  sorter_text: function(sorter,sort_by) {
    
    var sorter_text_elm = sorter.previous();
    
    var classes = $w(sorter_text_elm.className);
    
    sorter_text_elm.removeClassName(classes[1]);
    sorter_text_elm.addClassName(sort_by);
    
  }
  
});

var CSHoverOver = Class.create({
  
  initialize: function() {
    
    $$('a.info').each(function(elm){
       elm.observe('click', function(e) { Event.stop(e); });
       elm.observe('mouseover', this.show_info.bindAsEventListener(this,false));
       elm.observe('mouseout', this.hide_info.bindAsEventListener(this,false));
     }.bind(this));
     
    $$('img.info').each(function(elm){
      elm.observe('mouseover', this.show_info.bindAsEventListener(this,true));
      elm.observe('mouseout', this.hide_info.bindAsEventListener(this,true));
    }.bind(this));
  },
  
  show_info: function(e,is_image) {
    
    var elm = Event.element(e);
    elm = elm.tagName == 'A' || is_image ? elm : elm.parentNode;
    
    Event.stop(e);
    
    var div = is_image ? elm.previous() : elm.next();
    
    if( !div.hasClassName('more_info') ) return;
    
    this.position_hover(elm,div);
    div.removeClassName('hide');
    this.select_sort(true);
  
    var classes = $w(elm.className);
    new CSEventTracker(classes.first()+'-hover',undefined);
    
  },
  
  hide_info: function(e,is_image) {
    
    var elm = Event.element(e);
    elm = elm.tagName == 'A' || is_image ? elm : elm.parentNode;
    
    Event.stop(e);
    
    var div = is_image ? elm.previous() : elm.next();
    
    if( !div.hasClassName('more_info') ) return;
    
    div.addClassName('hide');
    this.select_sort(false);
    
  },
  
  position_hover: function(elm,div) {
    
    var left_offset = div.hasClassName('right') ? -236 : elm.getWidth() + 5;
    div.clonePosition(elm,{ setWidth: false, setHeight: false, offsetLeft: left_offset, offsetTop: -20 });
    
  },
  
	select_sort: function(disable) {

	  var selects = $$('body').first().select('select');
	  var browser = navigator.userAgent;

	  if( /MSIE 6/.test(browser) ) {
  	  if( disable ) {

  	    selects.each(function(elm){
  	      elm.setStyle({ 'visibility': 'hidden' });
  	    });

  	  } else {
	      var delay_rate = this.delay_rate;

  	    selects.each(function(elm){
  	      Element.setStyle.delay(delay_rate,elm,{ 'visibility': 'visible' });
  	    });

  	  }
	  }

	}
  
});

var CSEventTracker = Class.create({

  initialize: function(action,category) {
    
    if( !category && $('event_tracking_category') ) category = $('event_tracking_category').getValue();
    if( category && action ) this.track(category,action);
  
  },
  
  track: function(category,action) {
    
    _gaq.push(['_trackEvent',category,action]);

  }

});

var CartsListTracking = Class.create({ 

  initialize: function() {
    
    this.track_enlarged_image();
    this.track_flypage_link();
    this.track_flypage_image_link();
    
  },
  
  track_enlarged_image: function() {
    
    $$('a.zoom').each(function(elm){
      elm.observe('click',function(e){
        new CSEventTracker('enlarge', undefined);
      });
    });
    
  },
  
  track_flypage_link: function() {
    
    $$('.title a').each(function(elm){
      elm.observe('click',function(e){
        new CSEventTracker('flypage-link', undefined);
      });
    });
    
  },
  
  track_flypage_image_link: function() {
    
    $$('a.image').each(function(elm){
      elm.observe('click',function(e){
        new CSEventTracker('flypage-image-link', undefined);
      });
    });
    
  }

});

function initProductFilter() { var newFilter = new ProductSorter(); new CSHoverOver(); new CartsListTracking(); }
document.observe('dom:loaded',initProductFilter);
