if (!window.ecoideas){ var ecoideas = {}; }
(function (pkg){

pkg.importCSS("/common/css/ecoideas.SlideShow.css");
pkg.SlideShowItem    = SlideShowItem;
pkg.SlideShowTrigger = SlideShowTrigger;
pkg.SlideShow        = SlideShow;

function SlideShowItem(node, duration) {
	this.node     = null;
	this.duration = 0;
	this.selected = false;
	this.fader    = null;
	this.move     = null;
	this.init(node, duration);
}
SlideShowItem.prototype = new pkg.SelectorItem();
SlideShowItem.prototype.init = function(node, duration) {
	if (!node) {
		return;
	}

	this.node     = $(node);
	this.duration = duration || 0;
	this.fader    = new ecoideas.Fader(this.node, this.duration);
	this.move     = new ecoideas.Move(this.node, this.duration);

	this.fader.addEventListener("timercomplete", pkg.delegate(function(){
		this.node.hide();
	}, this));

	this.node.bind("mouseenter.SlideShow", pkg.delegate(function(){
		this.dispatchEvent(new pkg.CustomEvent("mouseenter"));
	}, this));
	this.node.bind("mouseleave.SlideShow", pkg.delegate(function(){
		this.dispatchEvent(new pkg.CustomEvent("mouseleave"));
	}, this));

	this.addEventListener("select",   this.show);
	this.addEventListener("unselect", this.hide);

	this.node.hide();
}
SlideShowItem.prototype.dispose = function() {
	if (this.node) {
		this.node.unbind("mouseenter.SlideShow");
		this.node.unbind("mouseleave.SlideShow");
	}

	if (this.fader) {
		this.fader.dispose();
	}
	if (this.move) {
		this.move.dispose();
	}

	this.node     = null;
	this.duration = 0;
	this.selected = false;
	this.fader    = null;
	this.move     = null;

	pkg.SelectorItem.prototype.dispose.apply(this, []);
}
SlideShowItem.prototype.show = function() {
	this.node.addClass("pseudo-selected");
	this.node.show();
	this.fader.stop();
	this.move.stop();
	this.fader.setOpacity(100);
	this.move.setPosition(596, 0);
	this.move.moveTo(30, 0);
}
SlideShowItem.prototype.hide = function() {
	this.node.parent().appendTo(this.node.parent().parent());
	this.node.removeClass("pseudo-selected");
	this.fader.stop();
	this.move.stop();
	this.fader.fadeOut();
	this.move.moveTo(0, 14);
}

function SlideShowTrigger(node, duration) {
	this.node          = null;
	this.item          = null;
	this.selected      = false;
	this.init(node, duration);
}
SlideShowTrigger.prototype = new pkg.SelectorItem();
SlideShowTrigger.prototype.init = function(node, duration) {
	if (!node) {
		return;
	}

	this.node = $(node);
	var target = $("#" + node.hash.replace(/^#/, ""));
	if (target.length) {
		this.item = new pkg.SlideShowItem(target, duration);
		this.item.addEventListener("mouseenter", pkg.delegate(this.onItemMouseEnter, this));
		this.item.addEventListener("mouseleave", pkg.delegate(this.onItemMouseLeave, this));

		this.node.bind("click.SlideShow", pkg.delegate(function(e){
			this.dispatchEvent(new pkg.CustomEvent("click"));
			return false;
		}, this));
		this.addEventListener("select",   this.onSelect);
		this.addEventListener("unselect", this.onUnselect);
	}

	$(window).bind("unload", pkg.delegate(this.dispose, this, true));
}
SlideShowTrigger.prototype.dispose = function() {
	this.node.unbind("click.SlideShow");
	this.item.dispose();

	this.node = null;
	this.item = null;

	pkg.SelectorItem.prototype.dispose.apply(this, []);
}
SlideShowTrigger.prototype.onSelect = function() {
	this.node.parents("li:first").addClass("stay");
	this.item.select();
}
SlideShowTrigger.prototype.onUnselect = function() {
	this.node.parents("li:first").removeClass("stay");
	this.item.unselect();
}
SlideShowTrigger.prototype.onItemMouseEnter = function() {
	this.dispatchEvent(new pkg.CustomEvent("itemmouseenter"));
}
SlideShowTrigger.prototype.onItemMouseLeave = function() {
	this.dispatchEvent(new pkg.CustomEvent("itemmouseleave"));
}

function SlideShow(node, duration, interval) {
	this.node          = null;
	this.content       = null;
	this.items         = [];
	this.selectedItems = [];
	this.multiple      = false;
	this.selected      = false;
	this.timer         = null;
	this.init(node, duration, interval);
}
SlideShow.prototype = new pkg.Selector();
SlideShow.prototype.init = function(node, duration, interval) {
	this.node = $(node);

	var func = pkg.delegate(function(index, node){
		var trigger = new pkg.SlideShowTrigger(node, duration);
		trigger.addEventListener("click",          pkg.delegate(this.onTriggerClick, this));
		trigger.addEventListener("itemmouseenter", pkg.delegate(this.stop,           this));
		trigger.addEventListener("itemmouseleave", pkg.delegate(this.start,          this));
		this.addItem(trigger);
	}, this);
	this.node.find("div.thumbs a").each(func);
	func.dispose();

	this.content = this.node.find("div.section-content");
	var func = pkg.delegate(function(index, node){
		var current = this.content.height();
		this.content.height(Math.max(current, $(node).height()));
	}, this);
	this.content.find("div.item").each(func);
	func.dispose();

	this.timer = new pkg.Timer(interval);
	this.timer.addEventListener("timer", pkg.delegate(this.selectNextItem, this));
	this.timer.start();

	this.selectItem(this.getItem(0));

	$(window).bind("unload", pkg.delegate(this.dispose, this, true));
}
SlideShow.prototype.dispose = function() {
	this.node.find("div.thumbs a").unbind("click.SlideShow");
	this.timer.dispose();

	this.node  = null;
	this.timer = null;

	pkg.Selector.prototype.dispose.apply(this, []);
}
SlideShow.prototype.start = function() {
	this.timer.start();
}
SlideShow.prototype.stop = function() {
	this.timer.stop();
}
SlideShow.prototype.selectNextItem = function() {
	var item = this.selectedItems[0];
	for (var i = 0, n = this.items.length; i < n; i++) {
		if (this.items[i] === item) {
			if (i + 1 >= n) {
				this.selectItem(this.getItem(0));
			} else {
				this.selectItem(this.getItem(i + 1));
			}
			return;
		}
	}
}
SlideShow.prototype.selectPrevItem = function() {
	var item = this.selectedItems[0];
	for (var i = this.items.length - 1, n = 0; i >= 0; i--) {
		if (this.items[i] === item) {
			if (i - 1 <= 0) {
				this.selectItem(this.getItem(this.items.length - 1));
			} else {
				this.selectItem(this.getItem(i - 1));
			}
			return;
		}
	}
}
SlideShow.prototype.onTriggerClick = function(e) {
	this.selectItem(e.target);
	this.start();
}

})(ecoideas);