
(function() {

    BOTTOM = "b";
    LEFT = "l";
    RIGHT = "r";
    SHADOW_CLASS = "generated-shadow";

    SHADOW_X = 5;
    SHADOW_Y = 3;

    SHADOW_MAX = parseFloat(SHADOW_X > SHADOW_Y ? SHADOW_X : SHADOW_Y);

    add_shadow = function(node, side, size) {
        var newshd = $(document.createElement("DIV"));
        newshd.style.position = "absolute"
        newshd.style.background = "#999";
        newshd.style.borderWidth = "0px";
        newshd.style.padding = "0px";
        newshd.style.width = newshd.style.height = "1px";
        newshd.style.overflow = "hidden";

        newshd.addClassName(SHADOW_CLASS);
        newshd.setOpacity((1 - (size / SHADOW_MAX)) * 0.5);
        //node.parentNode.insertBefore(newshd, node);
        node.insertBefore(newshd, node.firstChild);

        newshd.shadow_data = {
            node: node,
            side: side,
            size: size
        }
    };

    set_shadow_positions = function() {
        $$("." + SHADOW_CLASS).each(function(shadow_node) {
            var dims = shadow_node.shadow_data.node.getDimensions();
            width = dims.width - 2;
            height = dims.height - 1;

            nco = shadow_node.shadow_data.node.cumulativeOffset();
            oLeft = nco[0] + 1,
            oTop = nco[1] + 1

            style = shadow_node.style;
            size = shadow_node.shadow_data.size;

            switch(shadow_node.shadow_data.side) {
                case BOTTOM:
                    style.top = oTop + size + height - 1 + "px";
                    style.left = oLeft - size + 1 + "px";
                    style.width = width + size * 2 - 1 + "px";
                    break;

                case LEFT:
                case RIGHT:
                    style.top = oTop + size + 1 + "px";
                    style.height = height - 1 + "px";

                    if(shadow_node.shadow_data.side == RIGHT)
                        style.left = width + oLeft + size + "px";
                    else
                        style.left = -size + oLeft + "px";
                    break;
            }
        });
    };

    Event.observe(window, "load", function() {
        var i;
        $$(".shadow").each(function(node) {
            for(i = 0; i < SHADOW_X; i++) {
                add_shadow(node, LEFT, i + 1);
                add_shadow(node, RIGHT, i + 1);
            }
            for(i = 0; i < SHADOW_Y; i++) {
                add_shadow(node, BOTTOM, i + 1);
            }
        });

        setTimeout(set_shadow_positions, 10);
        Event.observe(window, "resize", set_shadow_positions);

    });

    /* Hacemos pública la función para recolocar las sombras */
    window.dgmtx_update_shadows = set_shadow_positions;

})();

