function EW1O4(o)
{
	isset = function(g){return typeof(g)!='undefined';};
	this.constructor = function(){};
	this.scrollable = function(o)
	{
		this.intr;
		this.count	= 0;
		this.mask	= new Object();
		this.mask.obj	= o.mask;
		this.mask.size;
		this.item	= new Object();
		this.item.obj	= o.content;
		this.item.size;
		this.axis	= o.axis;
		this.speed	= (typeof(o.speed)=='undefined')? 4 : o.speed ;
		this.duration	= 12;
		this.itr	= 0;
		this.start	= null;
		this.end 	= null;
		this.size 	= o.size;
		this.isLimit	= false;
		this.isRunning	= false;
		this.x 		= 1;
		this.toString 	= function(){return 'Scrollable';};
		this.refresh	= function()
		{
			var o1 	= this.getSize();
			root.obj.setProperty(this.mask.obj,'width',o1.w+'px');
			root.obj.setProperty(this.mask.obj,'height',o1.h+1+'px');
		};
		this.getSize 	= function()
		{
			var o1 = root.obj;
			var o2 = this.size;
			var n1 = (typeof(o2.w)=='number')? o2.w : o1.getProperty(o2.w,'offsetWidth');
			var n2 = (typeof(o2.h)=='number')? o2.h : o1.getProperty(o2.h,'offsetHeight');
			return {w:n1,h:n2};
		};
		this.play	= function(n,b)
		{
			if(this.isRunning) return;
			this.stop();
			if(!isset(b)) b = false;
			if(!isRunnable(this)) return;
			this.intr	= setInterval(root.delegate.create(this,'onInt',n,b),10);
		};
		function isRunnable(o)
		{
			var c1 = root.obj;
			var c2 = root.xml;
			var b1 = o.axis == 'horizontal';
			var s1 = b1?'offsetWidth':'offsetHeight';
			var s2 = b1? 'w' : 'h' ;
			var x1 = c2.getNode(0,getObj(o.item.obj),true);
			var n1 = typeof o.size[s2] == 'number' ? o.size[s2] : Number(c1.getProperty(o.size[s2],s1));
			var n2 = Number(c1.getProperty(x1,s1));
			return n2>n1;
		};
		this.stop	= function()
		{
			clearInterval(this.intr);
			this.isRunning	= false;
			this.itr 	= 0;
			delete this.end;
			delete this.start;
		};
		this.backward	= function(n1,n2)
		{
			if(isset(n2)) this.duration = n2;
			this.play(1*n1,true);
		};
		this.foward	= function(n1,n2)
		{
			if(isset(n2)) this.duration = n2;
			this.play(-1*n1,true);
		};
		this.onInt 	= function(n,b)
		{
			var o	= root.obj;
			var b1 	= (this.axis=='horizontal')? true : false;
			var b2 	= (n>=this.x)? true : false;
			var s1 	= (b1)? 'offsetWidth' 	: 'offsetHeight' ;
			var s2 	= (b1)?'left':'top';
			var s3 	= (b1)?'width':'height';
			if(!isset(this.mask.size)) this.mask.size = Number(o.getProperty(this.mask.obj,s1));
			if(!isset(this.item.size))
			{
				this.item.size 	= Number(o.getProperty(this.item.obj,s1));
				var n0 		= Number(o.getProperty(this.mask.obj,s3));
				if(this.item.size == n0)
				{
					var o1	= root.getObj(this.item.obj);
					for(var i=0;i<o1.childNodes.length;i++)
					{
						var n1 = Math.max(this.item.size,(o1.childNodes[i][s1] ? o1.childNodes[i][s1] : 0));
						if(n1>this.item.size) this.item.size = n1;
					}
				}
			}
			var n1 	= this.count;
			var n2 	= this.mask.size-this.item.size;
			var n3 	= Number(o.getProperty(this.item.obj,s2));
			if(!isset(this.start))	this.start 	= n3;
			if(!isset(this.end))	this.end 	= n3+n;
			if(!b) ((b2 && n1>this.x) || (!b2 && n1<n2))? n1 = (b2)?this.x:n2 : this.count += (n * this.speed);
			if(b)
			{
				if((this.itr>this.duration) || (b2 && n1>this.x) || (!b2 && n1<n2))
				{
					if(isset(this.onMotionFinished)) this.onMotionFinished((b2 && n1>=this.x),(!b2 && n1<=n2));					
					n1 = (b2 && n1>this.x)? this.x : (!b2 && n1<n2)? n2 : n1;
					this.stop();
				}else{
					this.count = this.eq2(this.itr,this.start,this.end-this.start,this.duration);
					this.itr ++;
				}				
			}
			o.setProperty(this.item.obj,s2,n1+'px');
		};
		this.eq1 = function(t,b,c,d){return c*t/d + b;};
		this.eq2 = function(t,b,c,d){return c*((t=t/d-1)*t*t + 1) + b;};
		root.obj.setProperty(window,'load',root.delegate.create(this,'refresh'));
		root.obj.setProperty(window,'resize',root.delegate.create(this,'refresh'));
	};
}
root.addClass('scroll',EW1O4,'Scroll class');