function addEvent(el, type, handler) {
	if (el.addEventListener) el.addEventListener(type, handler, false);
	else if (el.attachEvent) el.attachEvent("on"+type, handler);
}

/* FADING BACKGROUND */

Fade=function(box_id, url, duration) {
	var self=this;
	if (this.box=document.getElementById(box_id)) {
		var arr=this.box.getElementsByTagName("img");
		if (arr && arr.length) {
			this.obj=arr[0];

			this.img=new Image();
			this.img.src=url;
			this.img.className="fade_image";
			this.img.FadeState=-2;
			this.box.appendChild(this.img);
			this.TimeToFade=(duration==null ? 1000.0 : duration);
			if (this.img.FadeState == null) {
				if(this.img.style.opacity == null || this.img.style.opacity == '' || this.img.style.opacity == '1') this.img.FadeState = 2;
				else this.img.FadeState = -2;
		  	}
   
			if (this.img.FadeState == 1 || this.img.FadeState == -1) {
				this.img.FadeState = this.img.FadeState == 1 ? -1 : 1;
				this.img.FadeTimeLeft = this.TimeToFade - this.img.FadeTimeLeft;
		  	} else {
				this.img.FadeState = this.img.FadeState == 2 ? -1 : 1;
				this.img.FadeTimeLeft = this.TimeToFade;
				setTimeout(function() {self.animation(new Date().getTime())}, 33);
			}
   		}
	}
}

Fade.prototype.animation=function(lastTick) {
	var self=this;
	var curTick = new Date().getTime();
	var elapsedTicks = curTick - lastTick;
 
	if(this.img.FadeTimeLeft <= elapsedTicks) {
		this.img.style.opacity = this.img.FadeState == 1 ? '1' : '0';
		this.img.style.filter = 'alpha(opacity = '
		+ (this.img.FadeState == 1 ? '100' : '0') + ')';
		this.img.FadeState = this.img.FadeState == 1 ? 2 : -2;
		this.obj.src=this.img.src;
		setTimeout(function() {self.box.removeChild(self.img)}, 100);
		return;
	}
 
	this.img.FadeTimeLeft -= elapsedTicks;
	var newOpVal = this.img.FadeTimeLeft/this.TimeToFade;
	if(this.img.FadeState == 1) newOpVal = 1 - newOpVal;

	this.img.style.opacity = newOpVal;
	this.img.style.filter = 'alpha(opacity = ' + (newOpVal*100) + ')';
 
	this.fadeTimer=setTimeout(function() {self.animation(curTick)}, 33);
}

/* TEASER */

Effect=function(obj) {
	var arr=obj.getElementsByTagName("*");
	for(var i=0; i<arr.length; i++) {
		if (arr[i].className=="text_box") {
			this.box=arr[i];
		}
	}
	this.init();
}

Effect.prototype.init=function() {
	this.minY		= 0;
	this.maxY		= this.box.offsetTop;
	this.status		= '';

	this.factor		= 8;
	this.duration		= 0.5;				// seconds
	this.width		= 20*this.duration;		// 20 fps
	this.position		= 0;
	this.background		= '';
}

Effect.prototype.show=function() {
	this.status		= 'show';
	if (this.background.length) new Fade("background", this.background);
}

Effect.prototype.hide=function() {
	this.status		= 'hide';
}

Effect.prototype.f=function(x) {
	x=x/(this.factor*this.duration);
	return (Math.exp(2*x)-1)/(Math.exp(2*x)+1);
}

Effect.prototype.play=function() {
	var bg;
	if (this.status.length>0) {
		if ((this.status=='show' && this.position==this.width) || (this.status=='hide' && this.position==0)) {
			this.box.style.top=(this.status=='show' ? this.minY : this.maxY)+'px';
			this.status='';
		} else {
			this.box.style.top=(this.maxY-(this.maxY-this.minY)*(this.status=='show' ? this.f(this.position) : 1-this.f(this.width-this.position)))+'px';
			this.position+=(this.status=='show' ? 1 : -1);
		}
	}
}



/* TEASER EFFECT */

TeaserEffect=function(id) {
	this.teaserList=new Array();
	this.t=0;
	var self=this;
	var arr=document.getElementById(id).getElementsByTagName("*");
	var type;
	for(var i=0; i<arr.length; i++) {
		if (arr[i].className=="teaser") {
			arr[i].effect=new Effect(arr[i]);
			arr[i].onmouseover=function() {
				this.effect.show();
			}
			arr[i].onmouseout=function() {
				this.effect.hide();
			}
			var bg=arr[i].getElementsByTagName('input');
			for (var j=0; j<bg.length; j++) {
				if (bg[j].name=='background') {
					arr[i].effect.background=bg[j].value;
					image_preloader(arr[i].effect.background);
				}
			}
			this.teaserList[this.teaserList.length]=arr[i];
		}
	}

	this.timer=setInterval(function() {self.timerHandler();},15);
}

TeaserEffect.prototype.timerHandler=function() {
	for(var i=0; i<this.teaserList.length; i++) {
		this.teaserList[i].effect.play();
	}
}
