/*エフェクトライブラリ*/

function Effect(emObj,et,k){
	this.element = emObj;
	this.endtime = et;
	this.kind = k;
	this.starttime = 0;
}

/*-----------*/

Effect.prototype.LOOP = function(){
	this.starttime++;
	this.MAIN();
	if (this.starttime >= this.endtime){
		clearInterval(this.settimer);
	}
}

Effect.prototype.START = function(){
	var myObj = this;
	this.settimer = setInterval(function(){myObj.LOOP()},myObj.fps);
}

Effect.prototype.fps = 1000/30;

/*-----------*/

Effect.prototype.SAME = function(v,f,sv,nowf){	//等速変化
	return sv+(v/f*nowf);
}

Effect.prototype.UP = function(v,f,sv,nowf){	//減速変化
	return sv+(v/Math.sqrt(f)*Math.sqrt(nowf));
}

Effect.prototype.DOWN = function(v,f,sv,nowf){	//加速変化
	return sv+(v/(f*f)*(nowf*nowf));
}

Effect.prototype.UPDOWN = function(v,f,sv,nowf){	//加減速変化
	var v1 = Math.floor(v/2);
	var v2 = v-v1;
	var fr1 = Math.floor(f/2);
	var fr2 = f-fr1;
	if (fr1>=nowf){
		return sv+(v1/(fr1*fr1)*(nowf*nowf));	
	} else {
		if (v!=0) sv = sv+v1;
		return sv+(v2/Math.sqrt(fr2)*Math.sqrt(nowf-fr1));
	}
}

Effect.prototype.CHANGE = function(k,v,f,sv,nowf){
	switch (k){
		case "up":
			return this.UP(v,f,sv,nowf);
			break;
		case "down":
			return this.DOWN(v,f,sv,nowf);
			break;
		case "same":
			return this.SAME(v,f,sv,nowf);
			break;
		case "updown":
			return this.UPDOWN(v,f,sv,nowf);
			break;
	}
}
/*-----------*/

Effect.prototype.Browser_find = function(){
	if ((navigator.userAgent.indexOf("MSIE") != -1)) return "MSIE";		//IE
	if ((navigator.userAgent.indexOf("Chrome") != -1)) return "Gecko";	//Chrome
	if ((navigator.userAgent.indexOf("Safari") != -1)) return "Safari";	//Safari
	if ((navigator.userAgent.indexOf("Gecko") != -1)) return "Gecko";	//Firefox
	if ((navigator.userAgent.indexOf("Opera") != -1)) return "Gecko";	//Opera
}

/*フェード効果*/

Effect.prototype.alpha_Init = function(){
	if (this.Browser_find() == "MSIE"){
		this.alp = parseInt((this.element.currentStyle.filter).match(/\d+/));
	} else {
		this.alp = parseInt(document.defaultView.getComputedStyle(this.element,null).getPropertyValue("opacity"))*100;
	}
}

Effect.prototype.alpha_Set = function(alp){
	if (this.Browser_find() == "MSIE"){
		this.element.style.filter = "alpha(opacity=" + alp + ")";
	} else {
		this.element.style.opacity = alp/100;
	}
}

/*	フェード関数	alpha(オブジェクト,最終透過率,変化時間,変化パターン)	*/

function alpha(emObj,alp,t,k){
	var obj = new Effect(emObj,t,k);
	obj.alpha_Init();
	obj.ealp = alp;
	obj.MAIN = function(){
		var ALP = this.CHANGE(this.kind,(this.ealp-this.alp),this.endtime,this.alp,this.starttime);
		this.alpha_Set(ALP);
	}
	obj.START();
}

