

PhotoSlide = {

    last_page_loaded: 1,
    cache_previous_page: null,
    cache_next_page: null,
    slideshow_direction: ">", /* ">" hacia atrás, "|" pause, "<" hacia delante */
    slideshow_speed: "med",

    show: function(link_node) {
        var current_page = $("slide_current_image");
        var previous_page = $("slide_prev_image");
        var url_image = link_node.href;
        if(current_page.src == url_image)
            return;

        if(Prototype.Browser.IE) {
            current_page.src = url_image;
            PhotoSlide.set_active(link_node);
            setTimeout(function () { PhotoSlide.setup_timer(); }, 500);
        } else {
            /* Mensaje mientras carga */
            var slide_loading_message = $("slide_loading_message");
            slide_loading_message.style.display = "inline";

            var new_img = document.createElement("IMG");
            new_img.src = url_image;
            new_img.style.display = "none";
            document.body.appendChild(new_img);
            Event.observe(new_img, "load", function() {
                slide_loading_message.hide();
                previous_page.src = current_page.src;
                previous_page.style.left = Position.page(current_page)[0] + "px";
                previous_page.setOpacity(1);
                previous_page.show()
                current_page.hide();
                current_page.src = url_image;
                new_img.remove();
                new Effect.Appear(current_page, {duration: 0.7});
                new Effect.Fade(previous_page, {duration: 0.7});
                PhotoSlide.set_active(link_node);
                PhotoSlide.setup_timer();
            });
        }
    },

    find_relative_link: function(offset) {
        var other = null;
        var current = $$("div.fotoslides a.slide_link.active")[0];
        if(current)
            return current[offset < 0 ? "previous" : "next"]("a.slide_link");
    },

    next: function() {
        var next = PhotoSlide.find_relative_link(1);
        if(next)
            next.onclick();
    },

    prev: function() {
        if(prev)
            prev.onclick();
        var prev = PhotoSlide.find_relative_link(-1);
        if(prev)
            prev.onclick();
    },

    set_active: function(link_node) {
        var slide_links = PhotoSlide._slide_links()
        var link_node_position = 0;
        slide_links.each(function(link, item_index) {
            if(link.id == link_node.id) {
                link_node.addClassName("active");
                link_node_position = item_index;
            } else {
                link.removeClassName("active");
            }
        });

        /* Movemos la barra para centrar (si podemos) la página actual */
        var parentDiv = $("slides_pages");
        var slidesDiv = $("slides_pages_items");

        if(!slidesDiv.style.marginLeft)
            slidesDiv.style.marginLeft = "0px";

        var offsetLeft = link_node.offsetLeft - parseFloat(slidesDiv.style.marginLeft.replace("px", ""));

        var width = parentDiv.getWidth();
        var marginLeft = "0px";
        if(offsetLeft > width / 2) {
            marginLeft = "-" + (offsetLeft - width / 2 + link_node.getWidth()) + "px";
        }

        /* Movemos la barra */
        new Effect.Morph(slidesDiv, {style: {marginLeft: marginLeft}, duration: 0.5});

        /* Vemos si tenemos que añadir más elementos */
        if((!PhotoSlide._update_pending) && (PhotoSlide.last_page_loaded != -1) && (10 * link_node_position / slide_links.length > 6)) {
            PhotoSlide._update_pending = true;
            PhotoSlide.last_page_loaded += 1;
            new Ajax.Request(location.href, {
                method: "GET",
                parameters: {page: PhotoSlide.last_page_loaded},
                onComplete: function() { PhotoSlide._update_pending = false; }
            });
        }


        /* Precargamos las imágenes anterior y siguiente */
        load_image_to_cache = function(offset, attr) {
            var other_link;
            if((other_link = PhotoSlide.find_relative_link(offset))) {
                if(!PhotoSlide[attr]) {
                    PhotoSlide[attr] = document.createElement("IMG");
                    document.body.appendChild(PhotoSlide[attr]);
                    PhotoSlide[attr].style.display = "none";
                }
                PhotoSlide[attr].src = other_link.href;
            }
        }
        load_image_to_cache(-1, "cache_previous_page");
        load_image_to_cache(1, "cache_next_page");
    },

    _slide_links: function() {
        return $$("div.fotoslides a.slide_link");
    },

    _timer: function() {
        switch(PhotoSlide.slideshow_direction) {
            case "<":
                PhotoSlide.prev();
                break;
            case ">":
                PhotoSlide.next();
                break;
        }

        PhotoSlide._last_timer_id = 0;
        PhotoSlide.setup_timer();
    },

    setup_timer: function(new_direction) {
        if(new_direction) {
            PhotoSlide.slideshow_direction = new_direction;
            PhotoSlide._timer();
        }

        if(PhotoSlide._last_timer_id)
            clearTimeout(PhotoSlide._last_timer_id);

        if(PhotoSlide.slideshow_direction != "|") {
            var fn = function() {
                if(fn.timer_id == PhotoSlide._last_timer_id)
                    PhotoSlide._timer();
            }
            PhotoSlide._last_timer_id = fn.timer_id = setTimeout(fn, PhotoSlide._speed_map[PhotoSlide.speed] || 4000);
        }

        /* Información de la dirección */
        var spans = [["<", "info_slide_control_prev", ">"], [">", "info_slide_control_next"], ["|", "info_slide_control_pause"]];
        spans.each(function(item) {
            $(item[1]).style.display = PhotoSlide.slideshow_direction == item[0] ? "" : "none";
        });
    },

    setup_speed: function(speed) {
        PhotoSlide.speed = speed;
        PhotoSlide._timer();
        var selected_id = "speed_control_" + speed;
        $$("span.speed_controls a").each(function(link) {
            link[link.id == selected_id ? "addClassName" : "removeClassName"]("active");
        });
    },

    _speed_map: {
        slow: 7000,
        med: 4500,
        fast: 2500
    }
};


Event.observe(window, "load", function() {
    $$("div.fotoslides").each(function(node) { node.style.display = "block";});
    PhotoSlide.setup_timer(">");
    PhotoSlide.setup_speed("med");
    PhotoSlide.set_active(PhotoSlide._slide_links()[0]);
});
