/* Javascript effects.

 * (C) Daniel F. Smith for Sapient Design, 2009

 */



function linearprofile(x) {return x;}

function parabolicprofile(x) {return x*x;}

function onprofile(x) {return (x==0)?0:1;}



function SlideParams(part,suffix,min,max,profile) {

	this.stylepart=part;

	this.stylesuffix=suffix;

	this.min=min;

	this.max=max;

	this.profile=profile;

}



function ObjInfo(ele) {

	var o;

	this.starttop=0;

	this.startleft=0;

	for(o=ele; o; o=o.offsetParent) {

		this.starttop+=o.offsetTop;

		this.startleft+=o.offsetLeft;

	}

	this.startwidth=ele.offsetWidth;

	this.startheight=ele.offsetHeight;

	this.startopacity=1;

	this.startclass=ele.className;

	this.currentpos=1;

	this.destination=1;

	this.sliders=new Array();

}	



function effect() {

	var elename,effectname,destname,srcele,srcclass;

	var ele,params,info;

	var args=Array.prototype.slice.call(effect.arguments);



	if (!document.getElementById) {return;}



	// Pull off first argument if it's an event

	var event = args[0]

	if (typeof(event.target) != "undefined") {srcele=event.target;}

	else if (typeof(event.srcElement) != "undefined") {srcele=event.srcElement;}

	if (srcele) {

		args.shift();

		while(srcele.nodeName != "DIV") {

			srcele = srcele.parentNode;

		}

		if (!srcele.sliderobjinfo) {srcele.sliderobjinfo=new ObjInfo(srcele);}

		srcclass=srcele.sliderobjinfo.startclass;

	}



	while(args.length >= 3) {

		elename = args.shift();

		effectname = args.shift();

		destname = args.shift();

		

		if (!(ele=document.getElementById(elename)) || !ele.style) {continue;}

		if (!ele.sliderobjinfo) {ele.sliderobjinfo=new ObjInfo(ele);}

		info=ele.sliderobjinfo;

		

		with(info) switch(destname) {

		case 'show': destination=1; break;

		case 'hide': destination=0; break;

		case 'flip': destination=destination?0:1; break;

		case 'leave': break;

		default: return;

		}



		if (srcele) {

			if (info.destination) {

				srcele.className=srcclass+" effectshowing";

			}

			else {

				srcele.className=srcclass+" effecthiding";

			}

		}



		switch(effectname) {

		case 'visible':

			ele.style.visibility=(info.destination)?'visible':'hidden';

			info.currentpos=info.destination;

			break;

		case 'slideleft':

			params=new SlideParams('left','px',-info.startwidth-info.startleft,0,parabolicprofile);

			break;

		case 'fade':

			params=new SlideParams('opacity','',0,1,parabolicprofile);

			break;

		case 'blind':

			params=new SlideParams('height','px',0,ele.sliderobjinfo.startheight,parabolicprofile);

			break;

		}

		if (!params) {return;}

		if (info.sliders[effectname]) {delete info.sliders[effectname];}

		info.sliders[effectname]=params;

		slideit(elename);

	}

}



function slideit(eleid) {

	var del=true,c,d,v,ele,info,step=0.05;

	ele=document.getElementById(eleid);

	if (!ele) {return;}

	info=ele.sliderobjinfo;

	c=info.currentpos;

	d=info.destination;

	if (c < d) {

		c+=step;

		if (c >= d) {c=d;}

		else {del=false;}

	}

	else if (c > d) {

		c-=step;

		if (c <= d) {c=d;}

		else {del=false;}

	}

	info.currentpos=c;

	

	for(var i in info.sliders) {

		slider=info.sliders[i];

		if (!slider) continue;

		v=slider.min + slider.profile(c)*(slider.max - slider.min);

		ele.style[slider.stylepart] = v + slider.stylesuffix;

		if (del && d==1) {

			info.sliders[i]=null;

			delete slider;

		}

	}

	if (del) {info.sliders.splice(0,info.sliders.length);}

	else {setTimeout('slideit("'+eleid+'");',1000/30);}

}


