/*
 * $LastChangedRevision$
 * $LastChangedDate$
 */

$(function() {
    var fadeSpeed = 1000;
    var fadeFactor = 3 / 5;
    var transitionDelay = 10000;
    var jqStage = $('#stageRotator');
    var debuggingEnabled = true;             // FIXME set to false in production
    var stageXmlPath = '/bin/m/y/home-stage.xml'; // FIXME set in SiteExecutive
    
    if(!jqStage.length) {
        if(debuggingEnabled)
            alert('the stage could not be located');
        return;
    }
    
    // save the old stage content in case the XML read fails
    var jqOldStageContent = jqStage.children('*').remove();
    
    $.ajax({
        type: 'GET',
        url: stageXmlPath,
        dataType: 'xml',
        success: function(data, textStatus, XMLHttpRequest) {
            var xmlSlides = $(data).find('slide');
            var validSlides = [ ];
            
            for(var i = 0; i < xmlSlides.length; ++i) {
                var ithSlide = xmlSlides.eq(i);
                
                if(!ithSlide.attr('href')) {
                    if(debuggingEnabled)
                        alert('slide #' + (i + 1) + ' is missing its href');
                    continue;
                }
                if(!ithSlide.attr('image')) {
                    if(debuggingEnabled)
                        alert('slide #' + (i + 1) + ' is missing its background image');
                    continue;
                }
                if(!ithSlide.text()) {
                    if(debuggingEnabled)
                        alert('slide #' + (i + 1) + ' is missing its markup');
                    continue;
                }
                
                validSlides.push({
                    background: ithSlide.attr('href'),
                    image: ithSlide.attr('image'),
                    markup: ithSlide.text()
                });
            }
            
            if(validSlides.length < 2) {
                if(debuggingEnabled)
                    alert('insufficient valid slides were found for the stage')
                jqStage.append(jqOldStageContent);
                return;
            }
            
            
            var currentTimer = false;
            
            var currentOffset = 0;
            
            var jumpToSlide = function() {
                if(currentTimer)
                    clearTimeout(currentTimer);
                transitionTo($(this).text() - 1, false);
            };
            
            var animationBusy = false;
            var transitionDelayed = false;
            var transitionDelayedTo = false;
            
            var transitionTo = function(newOffset, continueOn) {
                if(animationBusy) {
                    transitionDelayed = true;
                    transitionDelayedTo = newOffset;
                    return;
                }
                else if(newOffset != -1 && newOffset == currentOffset)
                    return;
                
                animationBusy = true;
                if(newOffset == -1)
                    newOffset = (currentOffset + 1) % jqSlides.length;
                
                jqSlides[currentOffset].fadeOut(fadeSpeed);
                setTimeout(
                    function() {
                        jqSlides[newOffset].fadeIn(fadeSpeed, function() {
                            currentOffset = newOffset;
                            for(var i = 0; i < jqJumpItems.length; ++i)
                                if(i != newOffset)
                                    jqJumpItems[i].removeClass('Active');
                                else if(!jqJumpItems[i].hasClass('Active'))
                                    jqJumpItems[i].addClass('Active');
                            
                            animationBusy = false;
                            if(transitionDelayed) {
                                transitionDelayed = false;
                                transitionTo(transitionDelayedTo, false);
                                transitionDelayedTo = false;
                            }
                            else if(continueOn)
                                currentTimer = setTimeout(function() { transitionTo(-1, true); }, transitionDelay);
                        });
                    },
                    Math.round(fadeFactor * fadeSpeed)
                );
            };
            
            var jqJumpList = $('<ul />').addClass('Controls');
            var jqJumpItems = [ ];
            var jqSlides = [ ];
            
            for(var i = 0; i < validSlides.length; ++i) {
                jqJumpItems.push(
                    $('<li />').append(
                        $('<a href="javascript:void(0)" />')
                            .click(jumpToSlide)
                            .text(i + 1)
                    )
                );
            
                var newCard = $('<div />')
                    .addClass('Card')
                    .css('background-image', "url('" + validSlides[i].image + "')")
				.css('cursor', 'pointer')
				.click(function() { window.location.href = $(this).find('a').attr('href'); })
                    .append(
                        $('<div />')
                            .addClass('Message')
                            .html(validSlides[i].markup)
                    );
                jqJumpList.append(jqJumpItems[i]);
                jqSlides.push(newCard);
            }
            
            jqStage.append(jqJumpList);
            for(var i = 0; i < validSlides.length; ++i) {
                if(i)
                    jqSlides[i].hide();
                jqStage.append(jqSlides[i]);
            }
            jqJumpItems[0].addClass('Active');
            
            currentTimer =  setTimeout(function() { transitionTo(-1, true); }, transitionDelay);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            jqStage.append(jqOldStageContent);
            if(debuggingEnabled)
                alert('unable to read XML; stage reverted back to static content\n(' + errorThrown + ')');
        }
    });
});

