var TextSnow = new Class({
	
		options: {
			
			container:null,
			inject:'top',//insert stage inside, top, before or after the container

			stage:{
				//any number of css rules
				styles:{
					background:'none', 
					width: null, 
					height: null, 
					display: 'block', 
					position: 'absolute', 
					overflow: 'hidden'
				},
				padding: 1//horisontal stage padding
			},
			
			snow:{
				ammount: 30,//number of snowflakes
				speed:[1,2,3],//speed with wich individual snowflakes fall
				
				//any number of css rules
				styles: {
					'position': 'absolute'
				},
				
				symbol: ['*'],//an array of flake symbols, html can be used as well
				color:['#fff','#eee','#eed'],//flake color
				fontFamily:['Impact', 'Times New Roman', 'Georgia'],//different flake shape
				fontSize:[20,22],//font size in pixels
				direction:'left',//left,right,straight
				sinkSpeed:50//how fast the snow is falling
			}
			
		},

		initialize: function(options){
				this.stage = new Object();
				this.snow = new Array();

				this.setOptions(options);
				this.createStage();
				this.createSnow();
				this.animateSnow.periodical(this.options.snow.sinkSpeed, this);
		},
		
		createStage: function(){
			this.stage = new Element('div', {
					'styles': this.options.stage.styles,
					'id' : 'text-snow-stage'
			});
			
			if(this.options.stage.styles.height == null) {
				this.options.stage.styles.height = this.options.container.getSize().y.toInt();
			} 
			
			if(this.options.stage.styles.width == null) {
				this.options.stage.styles.width = this.options.container.getSize().x.toInt();
			} 

			this.stage.setStyles({'height': this.options.stage.styles.height, 'width': this.options.stage.styles.width});
			this.stage['inject'+this.options.inject.capitalize()](this.options.container);
		},
		
		createSnow: function(){

			var stagePadding = this.options.stage.styles.width/100*this.options.stage.padding;
			var stepX = (this.options.stage.styles.width - stagePadding/2) / this.options.snow.ammount;
			var posX = stepX/2;
			var stepY = 0;
			var posY = 0;
			var variateX = [stepX/-3, stepX/3];
			
			for (i = 0; i < this.options.snow.ammount; i++) {
				
				var flake = new Element('div', {'styles': this.options.snow.styles});
				
				if(stepY >= 100) stepY = 0;
				posY =  this.options.stage.styles.height/-100*stepY;
				stepY += 25;
				
				flake.setStyles({
					'font-family': this.options.snow.fontFamily.getRandom(),
					'font-size': this.options.snow.fontSize.getRandom(),
					'color': this.options.snow.color.getRandom(),
					'top':posY,
					'left':posX
				});
				
				posX += stepX + variateX.getRandom();
				
				flake.set('html', this.options.snow.symbol.getRandom());
				flake.injectInside(this.stage);
				this.snow[i] = flake;
			}
			
		},
		
		animateSnow: function(){
			var floor = this.options.stage.styles.height;
			var stagePadding = this.options.stage.styles.width/100*this.options.stage.padding;
			
			this.snow.each(function(flake, i) {
			
				var top = flake.getStyle('top').toInt() + this.options.snow.speed.getRandom();
				top = top >= floor ? 0 : top;
				flake.setStyle('top', top);
				
				if(this.options.snow.direction == 'left') {
					var left = flake.getStyle('left').toInt() - [1,2].getRandom();
					left = (left < stagePadding/2) ? this.options.stage.styles.width - stagePadding/2 : left;
				} else if(this.options.snow.direction == 'right'){
					var left = flake.getStyle('left').toInt() + 1;
					left = (left > this.options.stage.styles.width - stagePadding/2) ? stagePadding/2 : left;
				} else {
					var left = flake.getStyle('left').toInt();
				}
				
				flake.setStyle('left', left);

			}, this);
		}
});
TextSnow.implement(new Options, new Events);


var TextDropShadow = new Class({
options: {
color: '#333',
left: 1,
top: 1,
position: 'absolute'
},

initialize: function(obj, options){
this.setOptions(options)
this.createDropShadows(obj);
},

createDropShadows: function(obj){
if('element' == $type(obj)) {
this.applyDropShadow(obj)
} else if('array' == $type(obj)) {
obj.each( function(el) {
this.applyDropShadow(el);
}, this);
} else {
return false;
}
},

applyDropShadow: function(el){
var size = el.getSize();
var original = el.clone();
var shadow = el.clone();

var offsetY = this.options.top ? this.options.top.toInt() : this.options.bottom.toInt();
if(offsetY < 0) offsetY = offsetY * (-1);

var offsetX = this.options.left ? this.options.left.toInt() : this.options.right.toInt();
if(offsetX < 0) offsetX = offsetX * (-1);

var container = new Element('div', {
'styles': {
position: 'relative',
left: 0,
top: 0,
height: size.y + offsetY,
width: size.x + offsetX
}
});

original.setStyles({position: 'absolute', left: 0, top: 0});
shadow.setStyles(this.options);

container.adopt(shadow).adopt(original);
container.injectAfter(el);
el.destroy();
}
});
TextDropShadow.implement(new Options, new Events);

/*
var addDS = {
start: function(){
new TextDropShadow($$('.ds'), {color:'#222', top: 1, left: 1}); //{color:'#222', opacity: 0.5, background: '#fff'});
}
};
*/