Element.addMethods({
	textshadow: function(element, opts){
		var elem  = $(element);
        opts  = (opts) ? opts : {};
        var light = (opts.light) ? opts.light : undefined;		
        var color = (opts.shadowColor) ? opts.shadowColor : "#666";
        var dist  = (opts.distance) ? opts.distance : 1;
        var opacity = (opts.shadowOpacity) ? opts.shadowOpacity : 1;
        var setShadowColor = function(elem, color){
			$A($(elem).descendants()).each(function(node){
				if (node.nodeType == Node.ELEMENT_NODE) {
                    node.setStyle({color: color});
                }
            })
        }
		var textalign = $(elem).getStyle("textAlign");
        var text = elem.innerHTML;
        var container = $(document.createElement("div"));
        var textdiv = $(document.createElement("div"));
        elem.innerHTML = "";
        container.setStyle({position: "relative"});
		textdiv.innerHTML = text;
        container.appendChild(textdiv);
        for (var i = 0; i < dist; i++) {
            var shadowdiv = $(document.createElement("div"));
            shadowdiv.innerHTML = text;
            //shadowdiv.unselectable();
            switch (light) {
                case "down":
                    shadowdiv.setStyle({padding:"0px", color: color,textAlign:textalign, position: "absolute",zIndex: 100 - i,top: "-" + (dist - i) + "px",opacity: opacity});
                    break;
                case "up":
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",opacity: opacity});
                    break;
                case "downleft":
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: "-" + (dist - i) + "px",left: (dist - i) + "px",opacity: opacity});
                    break;
                case "left":
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: "0px",left: (dist - i) + "px",opacity: opacity});
                    break;
                case "upright":
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",left: "-" + (dist - i) + "px",opacity: opacity});
                    break;
                case "downright":
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: "-" + (dist - i) + "px",left: "-" + (dist - i) + "px",opacity: opacity});
                    break;
                case "right":
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: "0px",left: "-" + (dist - i) + "px",opacity: opacity});
                    break;
                case "wide":
					shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign, position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",left: (dist - i) + "px",opacity: opacity});
                    
					var shadowdiv2 = $(document.createElement("div"));
                    shadowdiv2.innerHTML = text;
                    shadowdiv2.unselectable();
					shadowdiv2.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",left: "-" + (dist - i) + "px",opacity: opacity});
                    setShadowColor(shadowdiv2, color);
                    container.appendChild(shadowdiv2);
                    
                    var shadowdiv3 = $(document.createElement("div"));
                    shadowdiv3.innerHTML = text;
                    shadowdiv3.unselectable();
                    shadowdiv3.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",opacity: opacity});
                    setShadowColor(shadowdiv3, color);
                    container.appendChild(shadowdiv3);
                    break;
					
                case "glow":
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",left: (dist - i) + "px",opacity: opacity});
                    var shadowdiv2 = $(document.createElement("div"));
                    shadowdiv2.innerHTML = text;
                    shadowdiv2.unselectable();
                    shadowdiv2.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",left: "-" + (dist - i) + "px",opacity: 0.2});
                    setShadowColor(shadowdiv2, color);
                    container.appendChild(shadowdiv2);
                    
                    var shadowdiv3 = $(document.createElement("div"));
                    shadowdiv3.innerHTML = text;
                    shadowdiv3.unselectable();
                    shadowdiv3.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",opacity: 0.2});
                    setShadowColor(shadowdiv3, color);
                    container.appendChild(shadowdiv3);
                    
                    var shadowdiv4 = $(document.createElement("div"));
                    shadowdiv4.innerHTML = text;
                    shadowdiv4.unselectable();
                    shadowdiv4.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: "-" + (dist - i) + "px",left: (dist - i) + "px",opacity: 0.2});
                    setShadowColor(shadowdiv4, color);
                    container.appendChild(shadowdiv4);
                    
                    var shadowdiv5 = $(document.createElement("div"));
                    shadowdiv5.innerHTML = text;
                    shadowdiv5.unselectable();
                    shadowdiv5.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: "-" + (dist - i) + "px",left: "-" + (dist - i) + "px",opacity: 0.2});
                    setShadowColor(shadowdiv5, color);
                    container.appendChild(shadowdiv5);
                    
                    var shadowdiv6 = $(document.createElement("div"));
                    shadowdiv6.innerHTML = text;
                    shadowdiv6.unselectable();
                    shadowdiv6.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: "-" + (dist - i) + "px",opacity: 0.2});
                    setShadowColor(shadowdiv6, color);
                    container.appendChild(shadowdiv6);
                    break;
                default:
                    shadowdiv.setStyle( {padding:"0px",color: color,textAlign:textalign,position: "absolute",zIndex: 100 - i,top: (dist - i) + "px",left: (dist - i) + "px",opacity: opacity});
            }
            setShadowColor(shadowdiv, color);
            container.appendChild(shadowdiv);
        }
        textdiv.setStyle( {padding:"0px",position: "relative",zIndex: "120"});
        elem.appendChild(container);
        if (opts.imageLike) {
           elem.setStyle( {cursor: "default"});
           elem.unselectable();
        }
    }
});
