$(document).onready(function() {
    var elements = document.body.getElementsByTagName("*");
    for (var i = 0; i < elements.length; i++) {
        var element = elements[i];

        var styleClasses = Element.classNames(element);

        styleClasses.each(function(styleClass) {
            if(styleClass.endsWith("effect")) {
                var effect = styleClass.substring(0, styleClass.indexOf("-"));
                if(/\d\w*/.test(effect)) {
                    effect = "$" + effect;
                }

                Effects[effect].apply(element);
            }
        });
    }
});

Effects = {
    version: "1.0.0"
}

Effects.shadow = {
    SHADOW: 7,

    add: function(element) {
        $(element).addClassName("shadow-effect");
        Effects.shadow.apply(element);
    },

    remove: function(element) {
        var element = $(element);
            element.removeClassName("shadow-effect");
            element.parentNode.removeChild(element);
    },

    apply: function(element) {
        var element = $(element);

        var parent = element.parentNode;

        var id = (element.getAttribute("id") != null) ? element.getAttribute("id") : parent.getAttribute("id");

        var shadowId = id + "-shadow";
        if($(shadowId) == null) {
            var shadowNode = document.createElement("div")
                shadowNode.setAttribute("id", shadowId);

            shadowNode.style.position = "absolute";
            shadowNode.style.top = element.offsetTop + "px";
            shadowNode.style.left = 0;
            shadowNode.style.width = "100%";
            shadowNode.style.zIndex = element.style.zIndex - 1;

            var node = document.createElement("div");
                node.style.width = (element.offsetWidth + ((10 + this.SHADOW) * 2)) + "px"; //Math.floor((element.offsetWidth * (1 + (this.SHADOW * 0.02))) / 10) + "em";
                node.style.height = (element.offsetHeight + ((10 + this.SHADOW) * 1)) + "px"; //Math.floor((element.offsetHeight * (1 + (this.SHADOW * 0.01))) / 10) + "em";
                node.style.margin = "auto";
            shadowNode.appendChild(node);

            var leftShadowNode = document.createElement("div");
                leftShadowNode.style.width = "36px";
                leftShadowNode.style.height = (parseInt(node.style.height) - 36) + "px";
                leftShadowNode.style.cssFloat = "left";
                leftShadowNode.style.styleFloat = "left";

            if(Prototype.Browser.IE && parseInt(Prototype.Browser.Version) < 7) {
                leftShadowNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./images/effects/shadow/left.png', sizingMethod='scale')";
            } else {
                leftShadowNode.style.backgroundImage = "url(./images/effects/shadow/left.png)";
                leftShadowNode.style.backgroundPosition = "top left";
                leftShadowNode.style.backgroundRepeat = "repeat-y";
            }

            var rightShadowNode = document.createElement("div");
                rightShadowNode.style.width = "36px";
                rightShadowNode.style.height = (parseInt(node.style.height) - 36) + "px";
                rightShadowNode.style.cssFloat = "right";
                rightShadowNode.style.styleFloat = "right";

            if(Prototype.Browser.IE && parseInt(Prototype.Browser.Version) < 7) {
                rightShadowNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./images/effects/shadow/right.png', sizingMethod='scale')";
            } else {
                rightShadowNode.style.backgroundImage = "url(./images/effects/shadow/right.png)";
                rightShadowNode.style.backgroundPosition = "top right";
                rightShadowNode.style.backgroundRepeat = "repeat-y";
            }

            var bottomShadowNode = document.createElement("div");
                bottomShadowNode.style.height = "36px";
                bottomShadowNode.style.clear = "both";

            var leftBottomShadowNode = document.createElement("div");
                leftBottomShadowNode.style.width = "36px";
                leftBottomShadowNode.style.height = "100%";
                leftBottomShadowNode.style.cssFloat = "left";
                leftBottomShadowNode.style.styleFloat = "left";

            if(Prototype.Browser.IE && parseInt(Prototype.Browser.Version) < 7) {
                leftBottomShadowNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./images/effects/shadow/left-bottom.png', sizingMethod='scale')";
            } else {
                leftBottomShadowNode.style.backgroundImage = "url(./images/effects/shadow/left-bottom.png)";
                leftBottomShadowNode.style.backgroundPosition = "top left";
                leftBottomShadowNode.style.backgroundRepeat = "no-repeat";
            }

            var bottomBottomShadowNode = document.createElement("div");
                bottomBottomShadowNode.style.width = (parseInt(node.style.width) - 72) + "px";
                bottomBottomShadowNode.style.height = "100%";
                bottomBottomShadowNode.style.cssFloat = "left";
                bottomBottomShadowNode.style.styleFloat = "left";

            if(Prototype.Browser.IE && parseInt(Prototype.Browser.Version) < 7) {
                bottomBottomShadowNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./images/effects/shadow/bottom.png', sizingMethod='scale')";
            } else {
                bottomBottomShadowNode.style.backgroundImage = "url(./images/effects/shadow/bottom.png)";
                bottomBottomShadowNode.style.backgroundPosition = "top left";
                bottomBottomShadowNode.style.backgroundRepeat = "repeat-x";
            }

            var rightBottomShadowNode = document.createElement("div");
                rightBottomShadowNode.style.width = "36px";
                rightBottomShadowNode.style.height = "100%";
                rightBottomShadowNode.style.cssFloat = "right";
                rightBottomShadowNode.style.styleFloat = "right";

            if(Prototype.Browser.IE && parseInt(Prototype.Browser.Version) < 7) {
                rightBottomShadowNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./images/effects/shadow/right-bottom.png', sizingMethod='scale')";
            } else {
                rightBottomShadowNode.style.backgroundImage = "url(./images/effects/shadow/right-bottom.png)";
                rightBottomShadowNode.style.backgroundPosition = "top right";
                rightBottomShadowNode.style.backgroundRepeat = "no-repeat";
            }

            bottomShadowNode.appendChild(leftBottomShadowNode);
            bottomShadowNode.appendChild(bottomBottomShadowNode);
            bottomShadowNode.appendChild(rightBottomShadowNode);

            node.appendChild(leftShadowNode);
            node.appendChild(rightShadowNode);
            node.appendChild(bottomShadowNode);

            parent.insertBefore(shadowNode, element);
        }
    }
}

Effects.$3d = {
    add: function(element) {
        $(element).addClassName("3d-effect");
        Effects.$3d.apply(element);
    },

    remove: function(element) {
        var element = $(element);
            element.removeClassName("3d-effect");
            element.style.backgroundImage = "none";
    },

    apply: function(element) {
        var element = $(element);

        if(Prototype.Browser.IE) {
/*
            if(parseInt(Prototype.Browser.Version) < 7) {
                element.style.height = 0;
                element.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./images/effects/3d/background.png', sizingMethod='scale')";

                var elements = element.childNodes;
                for (var i = 0; i < elements.length; i++) {
                    var child = elements[i];
                    if(child.style != null) {
                        if(child.style.position.empty()) {
                           child.style.position = "relative";
                        }
                        child.style.zIndex++;
                    }
                }
            }
*/
        } else {
            element.style.backgroundImage = "url(./images/effects/3d/background.png)";
            element.style.backgroundPosition = "top left";
            element.style.backgroundRepeat = "repeat-x";
        }
    }
}



Effects.collapsable = {
    toggleAll: function(element) {
        var element = $(element);
        var parent = element.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
        Effects.collapsable.toggle(parent, "collapsable");
    },

    expandAll: function(element) {
        var element = $(element);
        var parent = element.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
        Effects.collapsable.toggle(parent, "collapsable", true);
    },

    collapseAll: function(element) {
        var element = $(element);
        var parent = element.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
        Effects.collapsable.toggle(parent, "collapsable", false);
    },

    toggle: function(node, classFilter, visible) {
        for(var i = 0; i < node.childNodes.length; i++) {
            var element = $(node.childNodes[i]);

            if(element.className != null) {
                if(classFilter != null) {
                   var styleClasses = Element.classNames(element);

                   styleClasses.each(function(styleClass) {
                       if(styleClass == classFilter) {
                           if(visible != null) {
                               (visible) ? element.show() : element.hide();
                           } else {
                               element.toggle();
                           }
                       }
                   });
                } else {
                   if(visible != null) {
                       (visible) ? element.show() : element.hide();
                   } else {
                       element.toggle();
                   }
                }
            }

            if(element.childNodes != null) {
                Effects.collapsable.toggle(element, classFilter, visible);
            }
        }
    }
}
