// npjq by Nekopps
// 2011/10/03 - 2011/10/04

window.npjq = 
{
	fps: 20, 
	ival: undefined, 
	queur: [], 
	ie: navigator.userAgent.match(/msie /i), // IE uses filter not opacity 
	reg_opa: /opacity=([^)]*)/, // regexp from jQuery 
	init: function()
	{
		this.ival = 1000 / this.fps; 
	}, 
	animate: function(elem, value, intime)
	{
		// this context would be under the window because of setTimeout
		var self = window.npjq; 

		//if(self.ie)
		//	return; 

		// add a seen 
		if(typeof elem === "object")
		{
			this.queur.push({
				elem: elem, 
				value: value, 
				intime: (intime || 0)
			}); 
			return this; 
		}

		// has any seen? 
		var seen = self.queur[0];
		if(! seen)
			return self; 

		// just delay 
		if(seen.value === undefined)
		{
			if(seen.intime)
				if(self.queur.length)
					self.timeout_id = window.setTimeout(self.animate, seen.intime); 
			self.queur.shift(); 
			return self; 
		}

		// once for each seens
		if(! seen.per)
		{
			if(seen.intime < self.ival)
				seen.intime = self.ival; 

			var opa; 
			if(self.ie) 
			{
				seen.elem.style.zoom = 1; // IE problem fix 
				opa = self.reg_opa.test(seen.elem.style.filter) 
					? parseFloat(RegExp.$1) / 100 : undefined; 
				if(opa === undefined)
				{
					opa = 1; 
					seen.elem.style.filter = "alpha(opacity=100)"; 
				}
			}
			else
			{
				opa = seen.elem.style.opacity; 
				if(! opa)
					if(opa === "")
						seen.elem.style.opacity = opa = 1; 
					else
						return; // might be not supported 
			}

			seen.diff = Math.abs(parseFloat(opa) - parseFloat(seen.value)); 
			if(seen.diff == 0)
			{
				self.queur.shift(); 
				if(self.queur.length)
					self.timeout_id = window.setTimeout(self.animate, self.ival); 
				return self; 
			}
			var per = seen.diff / (seen.intime / self.ival); 
			per = parseFloat(per); 
			seen.per = seen.value < opa ? -per : per; 
		}

		var opa = self.ie ? (
			self.reg_opa.test(seen.elem.style.filter) ? 
				parseFloat(RegExp.$1) / 100 : undefined
		) : parseFloat(seen.elem.style.opacity); 
		if(Math.abs(opa - seen.value) < Math.abs(seen.per))
		{
			opa = seen.value; 
			self.queur.shift(); 
		}
		else
			opa += seen.per; 
		if(self.ie)
			seen.elem.style.filter = "alpha(opacity=" + parseInt(opa * 100) + ")"; 
		else
			seen.elem.style.opacity = opa; 

//-- old style 
//		var opa; 
//		if(self.ie)
//		{
//			opa = self.reg_opa.test(seen.elem.style.filter) 
//				? parseFloat(RegExp.$1) / 100 : undefined; 
//			opa += seen.per; 
//			seen.elem.style.filter = "alpha(opacity=" + parseInt(opa * 100) + ")"; 
//		}
//		else
//		{
//			opa = parseFloat(seen.elem.style.opacity); 
//			opa += seen.per; 
//			seen.elem.style.opacity = opa; 
//		}
//
//		if(Math.abs(opa - seen.value) < Math.abs(seen.per))
//			self.queur.shift(); 

		// for testing 
		//document.getElementById("see_opa").value = opa; 

		if(self.queur.length)
			self.timeout_id = window.setTimeout(self.animate, self.ival); 

		return self; 
	}
}; 
window.npjq.init(); 

