(function() {
	var
	Event = YAHOO.util.Event,
	Dom = YAHOO.util.Dom,
	Animation = YAHOO.util.Anim,
	Easing = YAHOO.util.Easing,
	AnimMgr = YAHOO.util.AnimMgr;
	
	YAHOO.namespace('ln');
	
	YAHOO.ln.Spinner = function(el, duration, method) {
		this.viewport = Dom.get(el);
		
		this.digits = [null,null,null,null,null];
		
		this.current = [0,0,0,0,0];
		this.start = [0,0,0,0,0];
		this.end = [0,0,0,0,0];
		
		this.ticker = null;
		
		this.value = 0;
		this.pre = 0;
		this.duration = duration || 1;
		this.method = method || Easing.easeBothStrong;
		this.currentFrame = 0;
		this.totalFrames = Math.ceil(AnimMgr.fps * this.duration);
		
		this.initSpinner();
	};
	
	YAHOO.ln.Spinner.prototype = {
		multiply: [1,10,100,1000,10000],
		setValue: function(value) {
			if(this.value != value) {
				var i;
				
				if(this.interval) {
					this.stop();
				}
				
				this.pre = this.value;
				this.value = value;
				this.currentFrame = 0;
				
				for(i = 0; i < 5; i++) {
					this.start[i] = this.current[i];
				}
				
				for(i = 0; i < 5; i++) {
					this.end[i] = Math.floor(this.value / this.multiply[i]) * this.height;
				}
				
				this.timestamp = new Date();
				
				this.repeat = bind(this, this.spin);
				
				this.repeat();
			}
		},
		stop: function() {
			clearTimeout(this.interval);
			
			this.interval = null;
		},
		spin: function() {
			this.currentFrame = new Date() - this.timestamp;
			
			var top, i, finished = this.currentFrame > this.totalFrames;
			
			if(finished) {
				this.currentFrame = this.totalFrames;
			}
			
			for(i = 0; i < 5; i++) {
				this.current[i] = this.method(this.currentFrame, this.start[i], this.end[i] - this.start[i], this.totalFrames);
				
				top = -this.current[i] % (this.height * 10) - this.height;
				
				if(top > 0) {
					top -= this.height * 10;
				}
				
				Dom.setStyle(this.digits[i], 'top', top + 'px');
			}
			
			if(!finished) {
				this.ticker = setTimeout(this.repeat, 1);
			}
		},
		initSpinner: function() {
			Dom.setStyle(this.viewport, 'overflow', 'hidden');
			
			var region = Dom.getRegion(this.viewport);
			
			this.width = region.right - region.left;
			this.height = region.bottom - region.top;
			
			var
			digit_width = Math.round(this.width / 5),
			last_extra_width = this.width - digit_width * 5;
			
			for(var i = 0; i < 5; i++) {
				this.digits[i] = document.createElement('div');
				
				this.digits[i].innerHTML = '';
				
				Dom.setStyle(this.digits[i], 'width', (digit_width + (i == 4 ? last_extra_width : 0)) + 'px');
				Dom.setStyle(this.digits[i], 'left', (this.width - (i + 1) * digit_width  + (i == 4 ? last_extra_width : 0)) + 'px');
				
				this.viewport.appendChild(this.digits[i]);
			}
			
			Dom.setStyle(this.digits, 'position', 'absolute');
			Dom.setStyle(this.digits, 'top', -this.height + 'px');
			Dom.setStyle(this.digits, 'line-height', this.height + 'px');
			Dom.addClass(this.digits, 'digit');
		}
	};
	
	function pythagoras(x, y) {
		return Math.sqrt(x * x + y * y);
	}
	
	/*function init() {
		var spinner = new YAHOO.ln.Spinner('spinner');
		
		Event.on('value', 'keyup', function() { spinner.setValue(this.value); });
	}*/
	
	function bind(scope, fn, args) {
		return function() {
			return fn.apply(scope, args || []);
		};
	}
	
	//Event.onDOMReady(init);
})();
