function Transform()
{
	var obj = null;
	var opType = "";
	var conf = {
		startvalue: 0,
		curvalue : 0,
		endvalue: 0,
		step: 0,
		steps: 10,
		curstep: 0,
		param: "",
		timeout: 100,
		callbackfunc: null
	};
	var intID;
	function init()
	{
		if (typeof document.body.style.opacity == 'string') opType = 'opacity';
		else if (typeof document.body.style.MozOpacity == 'string') opType =  'MozOpacity';
		else if (typeof document.body.style.KhtmlOpacity == 'string') opType =  'KhtmlOpacity';
		else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) opType =  'filter';
	}
	function setOpacity(nOpacity)
	{
		switch(opType)
		{
			case "filter":
			nOpacity *= 100;
			var oAlpha = obj.filters["DXImageTransform.Microsoft.alpha"] || obj.filters.alpha;
			if (oAlpha) oAlpha.opacity = nOpacity; 
			else obj.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")";
			break;
			case "opacity":
			obj.style.opacity = nOpacity;
			break;
			case "MozOpacity":
			obj.style.MozOpacity = nOpacity;
			break;
			case "KhtmlOpacity":
			obj.style.KhtmlOpacity = nOpacity;
			break;
		}
	}
	function setElement(o)
	{
		obj = o;
	}
	function doFade()
	{
		conf["curstep"] ++;
		conf["curvalue"] = conf["curvalue"] + conf["step"];
		conf["curvalue"] = Math.round(conf["curvalue"] * 100) / 100; 
		setOpacity(conf["curvalue"]);
		if(conf["curstep"] == conf["steps"]) 
		{
			clearInterval(intID);
			if(conf["callback"])
			{
				var func = conf["callback"];
				func();
			}
		}
	}
	function doMove()
	{
		conf["curstep"] ++;
		conf["curvalue"] = conf["curvalue"] + conf["step"];
		obj.style[conf["param"]] = Math.floor(conf["curvalue"]) + "px";
		if(conf["curstep"] == conf["steps"]) 
		{
			clearInterval(intID);
			if(conf["callback"])
			{
				var func = conf["callback"];
				func();
			}
		}
	}
	function TransformObject()
	{
		init();
		this.setElement = function(o)
		{
			obj = o;
		}
		this.fade = function(svalue,evalue,callback)
		{
			conf["startvalue"] = svalue;
			conf["endvalue"] = evalue;
			conf["step"] = (evalue - svalue) / conf["steps"];
			conf["curvalue"] = svalue;
			if(callback) conf["callback"] = callback;
			conf["curstep"] = 0;
			intID = setInterval(doFade,conf["timeout"]);
		}
		this.move = function (param,svalue,evalue,callback)
		{
			conf["startvalue"] = parseFloat(svalue);
			conf["endvalue"] = parseFloat(evalue);
			conf["param"] = param;
			conf["step"] = (conf["endvalue"] - conf["startvalue"]) / parseFloat(conf["steps"]);
			conf["curvalue"] = conf["startvalue"];
			if(callback) conf["callback"] = callback;
			conf["curstep"] = 0;
			if(obj.style[param]) obj.style[param] = Math.floor(conf["startvalue"]) + "px";
			intID = setInterval(doMove,conf["timeout"]);
		}
	}
	return new TransformObject();
}
