var StickerAnimation = function(){}; 
StickerAnimation.prototype = { 
	duration : null, 
	obj : null, 
	from : null, 
	to : null, 
	timer : 0, 
	step : 0, 
	start : function(obj, from, to, duration, type){ 
		var self = this; 
		this.obj = obj; 
		this.from = from; 
		this.to = to; 
		this.now = new Date; 
		this.duration = duration || 1000; 
		this._delta = this['_delta' +(type || 'Elastic')]; 

		if(this.timer) 
			this.stop(); 

		this.timer = setInterval(function(){self.run();}, 10); 
	}, 
	run : function(){ 

		var time = ((new Date) - this.now) / this.duration; 
		var delta = this._delta(time); 

		var step = Math.pow(2, this.step); 
		var dep_x = (this.to.x - this.from.x) * delta; 
		var dep_y = (this.to.y - this.from.y) * delta; 

		if(time > 1){ 
			this.stop(); 
			this.end(); 
		}else{ 
			this.obj.style.marginLeft = this.from.x + dep_x + "px"; 
			this.obj.style.marginTop = this.from.y + dep_y + "px"; 
		} 
	}, 
	end : function(){ 
		this.obj.style.marginLeft = (this.to.x) + "px"; 
		this.obj.style.marginTop = (this.to.y) + "px"; 
	}, 
	stop : function(){ 
		clearInterval(this.timer); 
		this.timer = 0; 
	}, 

	_deltaBounce : function(pos){ 
		var p = 1 - pos; 

		var value; 
		for (var a = 0, b = 1; 1; a += b, b /= 2){ 
			if (p >= (7 - 4 * a) / 11){ 
			value = - Math.pow((11 - 6 * a - 11 * p) / 4, 2) + b * b; 
			break; 
		} 
	} 
	return 1 - value; 
}, 

	_deltaExpo : function(pos){ 
		var p = 1 - pos; 
		return 1 - Math.pow(2, 8 * (p - 1)); 
	}, 

	_deltaElastic : function(pos){ 
		var p = 1 - pos; 
		return 1 - Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * 1 / 3); 
	}, 

	_deltaStatic : function(pos){ 
		return 1; 
	} 

} 

var StickerManager = { 
	init : false, 
	stickers : [], 
	opts : [], 
	add : function(id, duration, type){ 

		if(!this.init){ 
			var self = this; 
			var init_event = function(){self.oninit();}; 
			var scroll_event = function(){self.onscroll();}; 

			if(window.attachEvent){ 
				window.attachEvent('onload', init_event); 
				window.attachEvent('onscroll', scroll_event); 
			}else{ 
				window.addEventListener('load', init_event, false); 
				document.addEventListener('scroll', scroll_event, false); 
			} 

			this.init = true; 
		} 

	this.stickers.push(id); 
	this.opts.push({duration:duration,type:type}); 
}, 

oninit : function(){ 
	var sticker; 
		for(var x = 0, len = this.stickers.length; x < len; x++){ 
			sticker = document.getElementById(this.stickers[x]); 
			if(!sticker){ 
				alert(this.stickers[x] + ' is bad id.'); 
				this.stickers[x] = null; 
				continue; 
			} 
			this.stickers[x] = sticker; 
			sticker.style.marginLeft = sticker.style.marginTop = "0px"; 
		} 
	}, 

	onscroll : function(){ 
		var left = parseInt(document.body.scrollLeft); 
		var top = parseInt(document.body.scrollTop); 
		var sticker; 
		for(var x = 0, len = this.stickers.length; x < len; x++){ 
			sticker = this.stickers[x]; 

			if(!sticker) 
				continue; 

			if(!sticker.animation){ 
				sticker.animation = new StickerAnimation(); 
			}else{ 
				sticker.animation.stop(); 
			} 

			sticker.animation.start( 
			sticker, 
			{x:parseInt(sticker.style.marginLeft), y:parseInt(sticker.style.marginTop)}, 
			{x:left, y:top}, 
			this.opts[x].duration, 
			this.opts[x].type 
			); 

		} 
	} 
} 
