// -----------------------------------------------------------------------------------

//
//	Additional methods for Element added by SU, Couloir
//	- further additions by Lokesh Dhakar (huddletogether.com)
//
Object.extend(Element, {
    getWidth: function(element)
    {
        element = $(element);
        return element.offsetWidth;
    },
    setWidth: function(element, w)
    {
        element = $(element);
        element.style.width = w + "px";
    },
    setHeight: function(element, h)
    {
        element = $(element);
        element.style.height = h + "px";
    },
    setTop: function(element, t)
    {
        element = $(element);
        element.style.top = t + "px";
    },
    setSrc: function(element, src)
    {
        element = $(element);
        element.src = src;
    },
    setHref: function(element, href)
    {
        element = $(element);
        element.href = href;
    },
    setInnerHTML: function(element, content)
    {
        element = $(element);
        element.innerHTML = content;
    },
    setVisibility: function(element, visible)
    {
        element = $(element);
        element.style.visibility = visible;
    }
});


// -----------------------------------------------------------------------------------

var imageArray = new Array;
var imageIndex = 0;
var paused = false;
var Richslide = Class.create();
var myRichSlide;

Richslide.prototype = {

    // initialize()
    // Constructor runs on completion of the DOM loading. Loops through anchor tags looking for 
    // 'lightbox' references and applies onclick events to appropriate links. The 2nd section of
    // the function inserts html at the bottom of the page which is used to display the shadow 
    // overlay and the image container.
    //
    initialize: function()
    {
        if (!document.getElementsByTagName)
        {
            return;
        }
        var images = document.getElementsByTagName('slideshow');

        // loop through all anchor tags
        for (var i = 0; i < images.length; ++i)
        {
            var image = images[i];

            var slideshowAttribute = String(image.getAttribute('src'));
            if (slideshowAttribute)
            {
                // Save the entire image info for later
                imageArray.push(image);
            }
        }
    },

    // Start the Slideshow, initialise to -1 as the first iteration adds 1 straight away ( reduces if/else complexity later on )
    run: function()
    {
        imageIndex = -1;
        myRichslide.nextImage();
        myRichslide.handleImageTransition(false);
    },

    incrementImage: function()
    {
        paused = true;
        myRichslide.nextImage();
        myRichslide.handleImageTransition(true);
    },

    decrementImage: function()
    {
        paused = true;
        myRichslide.previousImage();
        myRichslide.handleImageTransition(true);
    },

    pause: function()
    {
        paused = true;
    },


    play: function()
    {
        paused = false;
        myRichslide.nextImage();
        myRichslide.handleImageTransition(false);
    },

    hideImage: function()
    {
        /* RS: This is now handled in the nextImage call ( after the image has been downloaded - improves the transition! )
        // Fade the image out, when complete begin loading the next image
        new Effect.Fade('richslideImage', { duration: 0.5, from: 1.0, to: 0.1, afterFinish: function(){myRichslide.nextImage(); } });
        */
        myRichslide.nextImage();
        myRichslide.handleImageTransition(false);

    },

    nextImage: function()
    {
        if (1 >= imageArray.length)
        {
            return;
        }

        imageIndex++;
        if (imageIndex >= imageArray.length)
        {
            imageIndex = 0;
        }
    },

    previousImage: function()
    {
        if (1 >= imageArray.length)
        {
            return;
        }

        imageIndex--;

        if (imageIndex < 0)
        {
            imageIndex = imageArray.length - 1;
        }
    },

    handleImageTransition: function(forcedTransition)
    {
        var imageIter = imageArray[imageIndex];
        var imageLink = imageIter.getAttribute('src');
        if (imageLink)
        {
            var imagePreloader = new Image();

            // Using the onload functionality to handle the preloader
            imagePreloader.onload = function()
            {
                if (true == forcedTransition || true != paused)
                {
                    // Now we have loaded the replacement then fade out the main image
                    new Effect.Fade('richslideImage', { duration: 0.5, from: 1.0, to: 0.1, afterFinish: function() { myRichslide.showNextImage(imageLink, imagePreloader); } });
                }
            }

            // Set imagelink to start the pre-loader functionality
            imagePreloader.src = imageLink;
        }
    },

    setBuyImage: function(imageLink, imagePreloader)
    {
        buyImage = imageLink;
        buyImageWidth = imagePreloader.width;
        buyImageHeight = imagePreloader.height;
    },

    showNextImage: function(imageLink, imagePreloader)
    {
        myRichslide.setBuyImage(imageLink, imagePreloader);

        // Update the source
        Element.setSrc('richslideImage', imageLink);
        //Element.setSrc('richslideBuyImage', imageLink);

        // Resize the images
        myRichslide.imageResize(imagePreloader.width, imagePreloader.height);

        // Now fade the image into view
        myRichslide.imageShow();
    },

    imageResize: function(imageWidth, imageHeight)
    {
        // Resize the image and image container for the new image ( otherwise will be squeued )
        if (imageWidth)
        {
            Element.setWidth('richslideImage', imageWidth);

            try
            {
                // Handle the resizing of the frame
                Element.setWidth('BottomMiddleImage', imageWidth);
                Element.setWidth('TopMiddleImage', imageWidth);
            }
            catch (err)
            {
            }

        }
        if (imageHeight)
        {
            Element.setHeight('richslideImage', imageHeight)

            try
            {
                // Handle the resizing of the frame
                Element.setHeight('LeftMiddleImage', imageHeight)
                Element.setHeight('RightMiddleImage', imageHeight)
            }
            catch (err)
            {
            }
        }

        // Show the frame corners - means we only leave a nice "Loading" msg if things go wrong!!
        if (imageWidth && imageHeight)
        {
            try
            {
                Element.setVisibility('LeftMiddleImage', 'visible');
                Element.setVisibility('RightMiddleImage', 'visible');
                Element.setVisibility('BottomMiddleImage', 'visible');
                Element.setVisibility('TopMiddleImage', 'visible');

                Element.setVisibility('TopRightImage', 'visible');
                Element.setVisibility('TopLeftImage', 'visible');
                Element.setVisibility('BottomLeftImage', 'visible');
                Element.setVisibility('BottomRightImage', 'visible');
            }
            catch (err)
            {
            }
        }
    },

    // Fades the image into view
    imageShow: function()
    {
        Element.setInnerHTML('TextCounter', "Slideshow: " + ( imageIndex + 1 ) + " / " + ( imageArray.length ) );
        new Effect.Appear('richslideImage', { duration: 0.5, from: 0.1, to: 1.0, afterFinish: function() { myRichslide.imageDelay(); } });
    },

    // Delays for 5 secs before starting the next entry in the slideshow
    imageDelay: function()
    {
        // this hack prevents the play funtionality, remove it to reenable play
        //paused = true;

        if (true != paused)
        {
            new Effect.Appear('richslideImage', { duration: 5.0, from: 1.0, to: 1.0, afterFinish: function() { myRichslide.hideImage(); } });
        }
    }
}

function getQueryParams()
{
    var query = '' + this.location;
    // Get the current URL so we can parse out the data.
    // Adding a null-string '' forces an implicit type cast
    // from property to string, for NS2 compatibility.
    query = query.substring((query.indexOf('?')) + 1);

    return query.toQueryParams();
}

function downloadSlideshow1(slideshowID)
{
    var slideshow = getQueryParams().slideshow;

    if (slideshow)
    {
        downloadSlideshow2(slideshow, slideshowID);
    }
    else
    {
        downloadSlideshow2('Index.images', slideshowID);
    }
}

function downloadSlideshow2(url, slideshowID)
{
    var ajax = new Ajax.Updater({ success: slideshowID }, url, { method: 'get', onComplete: startSlideshow });
}

function startSlideshow()
{
    initSlideshow();
}

function initSlideshow() { myRichslide = new Richslide(); myRichslide.run(); }
//Event.observe(window, 'load', initRichslide, false);
