Window.extend({
	stopEvent: function(e){
		if (e.stopPropagation){
			e.stopPropagation();
			e.preventDefault();
		} else {
			e.returnValue = false;
			e.cancelBubble = true;
		}
		return false;
	}
});

var PortfolioPages = new Class({
	initialize: function(img, ul, t, objects){
		this.objects = objects;
		this.img = img;
		this.ul = ul;
		this.t = t;
		this.lis = this.ul.getElementsByTagName('li');
		this.current = 0;
		this.addMouseFx();
	},
	
	addMouseFx: function() {
		for(var i = 0; i < this.lis.length; i++) {
			var a = this.lis[i].getElementsByTagName('a')[0];
			if(a != null) {
				$(a).addEvent('mouseover', this.over.bindAsEventListener(this));
				$(a).addEvent('mouseover', this.out.bindAsEventListener(this));
				$(a).addEvent('click', this.click.bindAsEventListener(this));
			}
		}
	},
	
	over: function(event) {
		Window.stopEvent(event);
		var element = window.event ? window.event.srcElement : event.target;
		this.current = this.getObjectNumFromUrl(element.href);
		this.assignObj(this.current);
	},
	
	out: function(event) {
		Window.stopEvent(event);
		var element = window.event ? window.event.srcElement : event.target;
		for(var i = 0; i < this.lis.length; i++) {
			var a = this.lis[i].getElementsByTagName('a')[0];
			if(a == element) {
				element.addClass('act');
			} else {
				a.removeClass('act');
			}
		}
	},
	
	click: function(event) {
		Window.stopEvent(event);
		var element = window.event ? window.event.srcElement : event.target;
		
		return false;
	},
	
	getObjectNumFromUrl: function(url) {
		var parts = url.split('/');
		
		return parts[(parts.length - 2)];
	},
	
	assignObj: function(n) {
		if(this.objects[n] != null) {
			this.img.src = this.objects[n].src;
			this.t.innerHTML = this.objects[n].txt;
		}
	}
});

var ImageBlender = new Class({
	initialize: function(element, srcs){
		this.element = element;
		this.element.innerHTML = '';
		this.imgSrcs = srcs;
		this.imgElements = new Array();
		for(var i = 0; i < this.imgSrcs.length; i++) {
			this.imgElements[i] = new ImageBlenderElement(this.element, this.imgSrcs[i], (i + 100));
			if(i > 0) {
				this.imgElements[i].hide();
			}
		};
		this.currentPos = 0;
		this.t = window.setTimeout(this.next.bind(this), 2000);
	},
	
	next: function() {
		this.imgElements[this.currentPos].fadeOut();
		if((this.currentPos + 1) >= this.imgSrcs.length)  {
			this.currentPos = 0;
		} else {
			this.currentPos++;
		}
		this.imgElements[this.currentPos].fadeIn();
		this.t = window.setTimeout(this.next.bind(this), 7500);
	}
});

var ImageBlenderElement = new Class({
	initialize: function(element, src, zindex){
		this.cElement = element;
		this.zIndex = zindex;
		this.element = new Element('img').injectInside(element);
		this.element.src = src;
		window.addEvent('resize', this.setPosition.bind(this));
		this.setPosition();
	},
	
	setPosition: function() {
		var pos = cumulativeOffset(this.cElement);
		this.element.setStyles({
		  position: 'absolute',
		  top: pos[1] + 'px',
		  left: pos[0] + 'px',
			'z-index': this.zIndex
		});
	},
	
	fadeIn: function() {
		return new fx.Style(this.element, 'opacity', {duration: 4500}).custom(0,1);
	},
	
	fadeOut: function() {
		this.setPosition();
		return new fx.Style(this.element, 'opacity', {duration: 4500}).custom(1,0);
	},
	
	hide: function() {
		this.element.setOpacity(0)
	},
	
	show: function() {
		this.element.setOpacity(1)
	}
});

var PortfolioBlender = new Class({
	initialize: function(element, text_element, ul_element, objects, current){
		this.element = element;
		this.text_element = text_element;
		this.ul_element = ul_element;
		this.element.innerHTML = '';
		this.text_element.innerHTML = '';
		this.objects = objects;
		this.imgElements = new Array();
		this.textElements = new Array();
		this.currentPos = current;
		for(var i = 0; i < this.objects.length; i++) {
			this.imgElements[i] = new ImageBlenderElement(this.element, this.objects[i].src, (i + 100));
			this.textElements[i] = new TextBlenderElement(this.text_element, this.objects[i].txt, (i + 100));
			if(i != this.currentPos) {
				this.imgElements[i].hide();
				this.textElements[i].hide();
			} else {
				this.imgElements[i].show();
				this.textElements[i].show();
			}
		};
		this.t = window.setTimeout(this.next.bind(this), 4000);
	},
	
	next: function() {
		this.imgElements[this.currentPos].fadeOut();
		this.textElements[this.currentPos].fadeOut();
		if((this.currentPos + 1) >= this.objects.length)  {
			this.currentPos = 0;
		} else {
			this.currentPos++;
		}
		this.imgElements[this.currentPos].fadeIn();
		this.textElements[this.currentPos].fadeIn();
		
		// Next
		if(this.objects[this.currentPos].next != '') {
			this.ul_element.getElement('li.next').removeClass('disabled');
			this.ul_element.getElement('li.next a').href = this.objects[this.currentPos].next;
			this.ul_element.getElement('li.next a').title = 'Weiter';
		} else {
			this.ul_element.getElement('li.next').addClass('disabled');
		}
		
		// Prev
		if(this.objects[this.currentPos].prev != '') {
			this.ul_element.getElement('li.prev').removeClass('disabled');
			this.ul_element.getElement('li.prev a').href = this.objects[this.currentPos].prev;
			this.ul_element.getElement('li.prev a').title = 'Zurück';
		} else {
			this.ul_element.getElement('li.prev').addClass('disabled');
		}

		this.t = window.setTimeout(this.next.bind(this), 8500);
	}
});

var TextBlenderElement = new Class({
	initialize: function(element, text, zindex){
		this.cElement = element;
		this.zIndex = zindex;
		this.element = new Element('div').injectInside(element);
		this.element.innerHTML = text;
		this.element.setStyles({
		  position: 'absolute',
		  bottom: 0 + 'px',
			'z-index': this.zIndex
		});
	},
	
	fadeIn: function() {
		return new fx.Style(this.element, 'opacity', {duration: 4500}).custom(0,1);
	},
	
	fadeOut: function() {
		return new fx.Style(this.element, 'opacity', {duration: 4500}).custom(1,0);
	},
	
	hide: function() {
		this.element.setOpacity(0)
	},
	
	show: function() {
		this.element.setOpacity(1)
	}
});


function cumulativeOffset(element) {
var valueT = 0, valueL = 0;
do {
  valueT += element.offsetTop  || 0;
  valueL += element.offsetLeft || 0;
  element = element.offsetParent;
} while (element);
return [valueL, valueT];
}
