var Shadow = new Class({
	options: {
		shadowClass: "ShadowClass",
		wrapperClass: "ShadowWrapper",
		fps: 60,
		lift: {
			opacity: (Browser.Engine.trident5)?0.6:0.8,
			effect: {
				transition: Fx.Transitions.Cubic.easeInOut,
				duration: 100
			}
		},
		drop: {
			opacity: (Browser.Engine.trident5)?0.3:0.5,
			effect: {
				transition: Fx.Transitions.Bounce.easeOut,
				duration: 750
			}
		},
		radius: 6,
		offsetY: (Browser.Engine.trident5)?4:2,
		offsetX: (Browser.Engine.trident5)?3:2
	},
	initialize: function(element, options){
		if(Browser.Engine.trident4 != true) {
			//alert("1");
			var adjustment = (Browser.Engine.trident)?-3:0;
			
			var newHeight = element.offsetWidth-this.options.radius-element.getStyle('padding-left').toInt()-element.getStyle('padding-right').toInt()+4;
			var newWidth = element.offsetHeight-this.options.radius-element.getStyle('padding-top').toInt()-element.getStyle('padding-bottom').toInt()+4;
			if(newHeight >= 0 && newWidth >= 0) {
				element.setStyles({
					width: newHeight,
					height: newWidth
				});
			}
			
			//alert("2");
			this.debug = false;
			this.setOptions(options);
			this.options.lift.effect.fps = this.options.fps;
			this.options.drop.effect.fps = this.options.fps;
			
			//alert("3");
			this.element = element;
			this.wrapper = new Element("div", {
				"class": this.options.wrapperClass,
				"styles": {
					//display:	'none',
					clear:		this.element.getStyle('clear')
				}
			});
			this.wrapper.injectAfter(this.element);
			this.element.injectInside(this.wrapper);
			//this.wrapper.setStyle('display', 'block');
			
			//alert("4");
			var c = this.element.getCoordinates();
			//alert("c.height: "+c.height+"\noffset height: "+this.element.offsetHeight);
			
			var curvyCorners = (Browser.Engine.trident5)?-1:-2;
			if(this.element.getElements('.TopCorners')[0])
				curvyCorners += this.element.getElements('.TopCorners')[0].offsetHeight;
			if(this.element.getElements('.BtmCorners')[0])
				curvyCorners += this.element.getElements('.BtmCorners')[0].offsetHeight - 1;
			
			//alert("5");
			var sw = c.width + this.options.radius, sh = c.height + this.options.radius + curvyCorners;
			var top = 0, left = 0;
			//alert("shadow height calculated");
			
			//alert("6");
			if(Browser.Engine.trident) {
				sh += adjustment;
				sw += adjustment;
			}
	
			this.shadow = new Element("div", {
				"class": this.options.shadowClass,
				"styles": {
					marginTop:	this.options.offsetY - (this.options.radius/2) - (this.element.getElements('.TopCorners')[0])?this.element.getElements('.TopCorners')[0].offsetHeight:0,
					marginLeft:	this.options.offsetX - (this.options.radius/2) + this.element.getStyle('margin-left').toInt(),
					width:		sw,
					height:		sh,
					left:		left,
					top:		top,
					opacity:	(this.element.hasClass('PopupWin'))?(Browser.Engine.trident5)?1:0.6:this.options.drop.opacity,
					fontSize:	this.options.radius
				}
			}).injectAfter(this.element); 

			//alert("7");
			"tmb".split("").each(function(y){
				"lcr".split("").each(function(x){
					new Element("div", {"class": y+x}).set("text", "\u00A0").injectInside(this.shadow);
					if (Browser.Engine.trident4) {
						this.shadow.getElement("." + y+x);
					} else {
						var srcEl = this.shadow.getElement("." + y+x);
						var src = srcEl.getStyle("background-image").replace(/(^url\(["']?)|(["']?\)$)/g, "");
						srcEl.destroy();
						new Element("img", {src: src, "class": y+x}).injectInside(this.shadow);
					}
				}, this);
			}, this);
			
			//alert("8");
			var r = this.options.radius, w = sw - (r*2), h = sh - (r*2);
			var tag = (Browser.Engine.trident4)?"div":"img";
			var els = this.shadow.getElements(tag);
			this.elementsFx = new Fx.Elements($$(this.shadow, this.element, els || null), {fps: this.options.fps})
				
			// Make sure object is visible
			if(w >= 0 && h >= 0) {
				//alert("9");
				var styles = {
					"2": {width: r, height: r},
					"3": {width: w, height: r},
					"4": {width: r, height: r},
					"5": {width: r, height: (Browser.Engine.trident)?h:(this.element.hasClass('PopupWin'))?h-1:h},
					"6": {width: w, height: h},
					"7": {width: r, height: h},
					"8": {width: r, height: r},
					"9": {width: w, height: r},
					"10": {width: r, height: r}
				};
				this.elementsFx.set(styles);
			
				if (!Browser.Engine.gecko || this.debug) {
					//alert("10");
					var r = [{}, {}, {}, {right: "auto"}, {}, {bottom: "auto"}, {right: "auto", bottom: "auto"}, {bottom: "auto"}, {}, {right: "auto"}, {}];
					this.elementsFx.elements.each(function(el, i){
						el.setStyles(r[i]);
					});
				}
			}
			//alert("11");
			
			this.element.addEvents({
				'mouseenter':	this.lift.bind(this),
				'mouseleave':	this.drop.bind(this)
			});
		}
	},
	lift: function(){
		var c = this.element.getCoordinates();
		
		var styles = {
			"0": {
				opacity: this.options.lift.opacity
			}
		};
		this.elementsFx.cancel();
		this.elementsFx.options.transition = this.options.lift.effect.transition;
		this.elementsFx.options.duration = this.options.lift.effect.duration;
		this.elementsFx.start(styles);
	},
	drop: function(){
		var styles = {
			"0": {
				opacity: this.options.drop.opacity		
			}
		};
		this.elementsFx.cancel();
		this.elementsFx.options.transition = this.options.drop.effect.transition;
		this.elementsFx.options.duration = this.options.drop.effect.duration;
		this.elementsFx.start(styles);
	}
});
Shadow.implement(new Options);

String.extend({
	pad: function(l, s){
		var t = this;
		while (t.length<l) t = (s || "0") + t;
		return t;
	},
	toQueryObject: function(){
		var o = {};
		$A(this.replace(/(^.*\?)|(#.*$)/g,'').split('&')).each(function(p){
			p = p.split("=");
			o[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
		});
		return o;
	}
});

if(AutoInitScripts == true) {
	window.addEvent((Browser.Engine.trident)?"domready":"load", function() {
		$$(".Shade").each(function(el){
			if(!el.Shade) {
				el.Shade = new Shadow(el);
				/*el.addEvents({
					mouseenter: myShadow.lift.bind(el.Shade),
					mouseleave: myShadow.drop.bind(el.Shade)
				});*/
			}
		});
	});
}