/**
 * Setup init functions and globally used vars
 */
var categoryClass;
var categoryTab;
var numberLatestNews;
var latestNews;
var numberTopCategories;
var topCategories;
var numberCarousel;
var carousel;
var carouselItem = 0;

var init = function() {
	if ($('categories_tab') != null) {
		categoryTab = $('categories_tab').up('li');
		categoryClass = categoryTab.className;
		initCategoriesMenu();
	}
	
	if ($$('.active_bar .more, .bar .more') != null) {
		$$('.active_bar .more, .bar .more').each(function(bar) {
			initBar(bar);
		});
	}
	
	if ($$('.search_results') != null) {
		initSearchHover();
	}
	
	if ($('carousel_selector') != null) {
		initCarousel();
	}
	
	if ($('top_products_content') != null) {
		initTopProductsHover();
	}
	
	if ($('latest_news_articles') != null) {
		initLatestNews();
	}
	
	if ($('top_categories_selector') != null) {
		initTopCategories();
	}
	
	if ($$('.tabs') != null) {
		$$('.tabs li a').each(function(tab) {
			initTab(tab);
		});
	}
	
	if ($('sort_by') != null) {
		initSortBy();
	}
};


var initBar = function(link) {
	link.observe('click', function(event) {
		event.stop();
		toggleBar(link.up('.active_bar, .bar'));
	});
};

var toggleBar = function(bar) {
	bar.toggleClassName('active_bar');
	bar.toggleClassName('bar');
	$(bar.id+'_content').toggle();
}

var initTab = function(tab) {
	tab.observe('click', function(event) {
		event.stop();
		var id = tab.getAttribute('href');
		id = id.substring(id.lastIndexOf('#') + 1);
		
		tab.up('ul').down('.active').removeClassName('active');
		tab.up().addClassName('active');
		
		$$('.tab_content').each(function (div) {
			div.hide();
		});
		
		$(id).show();
	});
};

var initCategoriesMenu = function() {
	$('categories_tab').observe('click', function(event) {
		event.stop();
		
		if ($('categories_menu').visible()) { // visible so close required
			categoryTab.className = categoryClass;
			$('categories_menu').hide();
		} else {
			categoryClass = categoryTab.className;
			categoryTab.addClassName('active');
			$('categories_menu').show();
		}
	});
	
	$('categories_menu').observe('mouseout', function(event) {	
		if (mouseOut('categories_menu', event)) {
			categoryTab.className = categoryClass;
			$('categories_menu').hide();
		}
	});
};

var initSearchHover = function() {
	$$('.search_results>li').each(function(li) {
		li.observe('click', function(event) {
			var e = event.element();
			if (e.tagName != 'A' &! e.up('a'))
			{
				var link = li.down('.product_action');
				if (link.getAttribute('onclick') == null) {
					if (link.getAttribute('href'))
					{
						if (link.getAttribute('target') == '_blank')
						{
							window.open(link.getAttribute('href'));
						}
						else
						{
							location.href = link.getAttribute('href');
						}
					}
				} else {
					link.onclick();
				}
			}
		});
		li.observe('mouseover', function(event) {
			li.addClassName('hover');
		});
		li.observe('mouseout', function(event) {
			li.removeClassName('hover');
		});
	});
};

var initAdHover = function() {
  $$('#adverts .result').each(function(div) {
    div.observe('click', function(event) {
      var e = event.element();
      if (e.tagName != 'A' &! e.up('a'))
      {
        var link = div.down('.button');
        if (link.getAttribute('onclick') == null) {
          if (link.getAttribute('href'))
          {
            if (link.getAttribute('target') == '_blank')
            {
              window.open(link.getAttribute('href'));
            }
            else
            {
              location.href = link.getAttribute('href');
            }
          }
        } else {
          link.onclick();
        }
      }
    });
    div.observe('mouseover', function(event) {
      div.addClassName('hover');
    });
    div.observe('mouseout', function(event) {
      div.removeClassName('hover');
    });
  });
};

var initTopProductsHover = function() {
	$$('#top_products_content>li').each(function(li) {
		li.observe('mouseover', function(event) {
			li.addClassName('hover');
		});
		li.observe('mouseout', function(event) {
			li.removeClassName('hover');
		});
	});
};

var initLatestNews = function() {
	numberLatestNews = $$('#latest_news_articles ul>li').length;
	latestNews = $$('#latest_news_articles ul');
	latestNews = latestNews[0];
	
	Event.observe('previous_news_article', 'click', previousNewsArticle);
	Event.observe('next_news_article', 'click', nextNewsArticle);
	
	$$('#latest_news_selector li').each(function(li) {
		li.observe('click', selectNewsArticle);
	});
	
	$$('#latest_news_articles li').each(function(li) {
		li.observe('mouseover', function(event) {
			li.addClassName('hover');
		});
		li.observe('mouseout', function(event) {
			li.removeClassName('hover');
		});
	});
};

var nextNewsArticle = function(event) {
	var maxLeft = (numberLatestNews - 3) * -322;
	var offset = latestNews.positionedOffset();
	
	if (offset[0] > maxLeft) {
		new Effect.Move(latestNews, {
			x: -322,
			y: 0,
			mode: 'relative',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: hideNewsNavigation,
			afterFinish: function() {
				showNewsNavigation();
				$$('#latest_news_selector li.active').each(function(li) {
					li.removeClassName('active');
					li.next().addClassName('active');
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var previousNewsArticle = function(event) {
	var offset = latestNews.positionedOffset();
	
	if (offset[0] < 0) {
		new Effect.Move(latestNews, {
			x: 322,
			y: 0,
			mode: 'relative',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: hideNewsNavigation,
			afterFinish: function() {
				showNewsNavigation();
				$$('#latest_news_selector li.active').each(function(li) {
					li.removeClassName('active');
					li.previous().addClassName('active');
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var selectNewsArticle = function(event) {
	var trigger = event.element();
	var id = trigger.getAttribute('id').substring(19);
	var left = id * -322;
	var pos = latestNews.positionedOffset();
	
	if (pos[0] != left) {
		new Effect.Move(latestNews, {
			x: left,
			y: 0,
			mode: 'absolute',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: hideNewsNavigation,
			afterFinish: function() {
				showNewsNavigation();
				$$('#latest_news_selector li').each(function(li) {
					li.removeClassName('active');
					if (li == trigger.up()) {
						li.addClassName('active');
					}
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var hideNewsNavigation = function() {
	new Effect.Move('previous_news_article', {
		x: -40,
		y: 46,
		mode: 'absolute',
		duration: 0.3
	});
	new Effect.Move('next_news_article', {
		x: 980,
		y: 46,
		mode: 'absolute',
		duration: 0.3
	});
};

var showNewsNavigation = function() {
	new Effect.Move('previous_news_article', {
		x: 5,
		y: 46,
		mode: 'absolute',
		duration: 0.3
	});
	new Effect.Move('next_news_article', {
		x: 920,
		y: 46,
		mode: 'absolute',
		duration: 0.3
	});
};

var initSortBy = function() {
	$('sort_by').observe('change', function(event) {
		$('sort_by').up('form').submit();
	});
};


var initTopCategories = function() {
	numberTopCategories = $$('#top_categories div>div').length;
	topCategories = $$('#top_categories div');
	topCategories = topCategories[0];
	
    startTopCategoriesNavigation();
	
	$$('#top_categories_selector li').each(function(li) {
		li.observe('click', selectTopCategory);
	});
};

var startTopCategoriesNavigation = function() {
	Event.observe('previous_category', 'click', previousTopCategory);
	Event.observe('next_category', 'click', nextTopCategory);
};

var stopTopCategoriesNavigation = function() {
	Event.stopObserving('previous_category', 'click');
	Event.stopObserving('next_category', 'click');
};

var nextTopCategory = function(event) {
	var maxLeft = (numberTopCategories - 2) * -214;
	var offset = topCategories.positionedOffset();
	
	if (offset[0] > maxLeft) {
		new Effect.Move(topCategories, {
			x: -214,
			y: 0,
			mode: 'relative',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: stopTopCategoriesNavigation,
			afterFinish: function() {
				startTopCategoriesNavigation();
				$$('#top_categories_selector li.active').each(function(li) {
					li.removeClassName('active');
					li.next().addClassName('active');
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var previousTopCategory = function(event) {
	var offset = topCategories.positionedOffset();
	
	if (offset[0] < -11) {
		new Effect.Move(topCategories, {
			x: 214,
			y: 0,
			mode: 'relative',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: stopTopCategoriesNavigation,
			afterFinish: function() {
				startTopCategoriesNavigation();
				$$('#top_categories_selector li.active').each(function(li) {
					li.removeClassName('active');
					li.previous().addClassName('active');
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var selectTopCategory = function(event) {
	var trigger = event.element();
	var id = trigger.getAttribute('id').substring(22);
	var left = (id * -214) - 11;
	var pos = topCategories.positionedOffset();
	
	if (pos[0] != left) {
		new Effect.Move(topCategories, {
			x: left,
			y: 0,
			mode: 'absolute',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: stopTopCategoriesNavigation,
			afterFinish: function() {
				startTopCategoriesNavigation();
				$$('#top_categories_selector li').each(function(li) {
					li.removeClassName('active');
					if (li == trigger.up()) {
						li.addClassName('active');
					}
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};


var initCarousel = function() {
	numberCarousel = $$('#carousel ul>li').length;
	carousel = $$('#carousel ul');
	carousel = carousel[0];
	
	Event.observe('previous_carousel_item', 'click', previousCarouselItem);
	Event.observe('next_carousel_item', 'click', nextCarouselItem);
	
	$$('#carousel_selector li').each(function(li) {
		li.observe('click', selectCarouselItem);
	});
};

var nextCarouselItem = function(event) {
	var maxLeft = (numberCarousel - 1) * -424;
	var offset = carousel.positionedOffset();
	
	if (offset[0] > maxLeft) {
		new Effect.Move(carousel, {
			x: -424,
			y: 0,
			mode: 'relative',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: hideCarouselNavigation,
			afterFinish: function() {
			    carouselItem++;
			    $('carousel_link').setAttribute('href', $('carousel_link_'+carouselItem).getAttribute('href'));
				showCarouselNavigation();
				$$('#carousel_selector li.active').each(function(li) {
					li.removeClassName('active');
					li.next().addClassName('active');
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var previousCarouselItem = function(event) {
	var offset = carousel.positionedOffset();
	
	if (offset[0] < 0) {
		new Effect.Move(carousel, {
			x: 424,
			y: 0,
			mode: 'relative',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: hideCarouselNavigation,
			afterFinish: function() {
		    	carouselItem--;
		    	$('carousel_link').setAttribute('href', $('carousel_link_'+carouselItem).getAttribute('href'));
				showCarouselNavigation();
				$$('#carousel_selector li.active').each(function(li) {
					li.removeClassName('active');
					li.previous().addClassName('active');
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var selectCarouselItem = function(event) {
	var trigger = event.element();
	var id = trigger.getAttribute('id').substring(16);
	var left = id * -424;
	var pos = carousel.positionedOffset();
	
	if (pos[0] != left) {
		new Effect.Move(carousel, {
			x: left,
			y: 0,
			mode: 'absolute',
			duration: 0.8,
			transition: Effect.Transitions.sinoidal,
			beforeStart: hideCarouselNavigation,
			afterFinish: function() {
		    	carouselItem = id;
		    	$('carousel_link').setAttribute('href', $('carousel_link_'+carouselItem).getAttribute('href'));
				showCarouselNavigation();
				$$('#carousel_selector li').each(function(li) {
					li.removeClassName('active');
					if (li == trigger.up()) {
						li.addClassName('active');
					}
				});
			},
			queue: "end"
		});
	}
	
	event.stop();
};

var hideCarouselNavigation = function() {
	new Effect.Move('previous_carousel_item', {
		x: -40,
		y: 97,
		mode: 'absolute',
		duration: 0.3
	});
	new Effect.Move('next_carousel_item', {
		x: 433,
		y: 97,
		mode: 'absolute',
		duration: 0.3
	});
};

var showCarouselNavigation = function() {
	new Effect.Move('previous_carousel_item', {
		x: 0,
		y: 97,
		mode: 'absolute',
		duration: 0.3
	});
	new Effect.Move('next_carousel_item', {
		x: 393,
		y: 97,
		mode: 'absolute',
		duration: 0.3
	});
};


// Call init functions when the DOM has loaded
document.observe("dom:loaded", function() {
	init();
});


var mouseOut = function(element, event) {
	var pos = $(element).cumulativeOffset();
	var scr = $(element).cumulativeScrollOffset();
	var left = pos['left'] - scr['left'];
	var top = pos['top'] - scr['top'];
	var dim = $(element).getDimensions();
	
	if (!(event.pointerX() > pos['left'] && event.pointerX() < pos['left'] + dim['width'] &&
			  event.pointerY() > pos['top'] && event.pointerY() < pos['top'] + dim['height'])) {
		return true;
	}
	else
	{
		return false;
	}
};


/**
 * Refinement functions
 */
var showRefinements = function(id) {
	$$('.more_refinements').invoke('hide');
	$('refinement_'+id).show();
	
	$$('.extra ul li').invoke('removeClassName', 'selected');
	$('refinement_selector_'+id).addClassName('selected');
};


var showFullRefinements = function(id) {
	$('main_refinements').hide();
	$('full_refinements_'+id).show();
};


var hideFullRefinements = function(id) {
	$('main_refinements').show();
	$('full_refinements_'+id).hide();
};



var launchLink = function(url) {
	window.open(url);
};