// utilities
// gg fisher-yates shuffle
function shuffle(arr) {
    var i = arr.length;
    if (i == 0) {
        return false;
    }
    while (--i) {
        var j = Math.floor(Math.random() * ( i + 1 ));
        var tempi = arr[i];
        var tempj = arr[j];
        arr[i] = tempj;
        arr[j] = tempi;
    }
}

function zeropad(nr) {
    if (nr < 10) {
        return '00' + nr;
    }
    if (nr < 100) {
        return '0' + nr;
    }
    return '' + nr;
}

var fade_time = 1500;
var try_again_time = 6000;
var stay_time = 4000;
var img_nr_queue = [];


function Images () {
    this.arr = [];
    this.idx = -1;
    this.crt = null;
}

Images.prototype.add = function (nr) {
    var nrid = jQuery.inArray(nr, this.arr);
    if (nrid != -1) {
        return nrid;
    }
    return this.arr.push(nr);
}

Images.prototype.url_of = function (nr) {
    return '/img/2010/slideshow/' + zeropad(nr) + '.jpg';
}

Images.prototype.next = function () {
    this.idx += 1;
    if (this.idx > (this.arr.length - 1)) {
        this.idx = 0;
    }
    return this.url_of(this.arr[this.idx]);
}

var images = new Images();
images.add(1);


function load_next() {
    var img_elt = this;
    if (img_nr_queue.length) {
        var nr = img_nr_queue.pop();
        var src = images.url_of(nr);
        var img = new Image();
        images.img = img;
        img.onload = function() {
            images.add(nr);
            img_elt.src = src;
            return false;
        }
        // trigger load (hopefully)
        img.src = src;
        return;
    } else {
        img_elt.src = images.next();
    }
}

$slide1 = null;
$slide2 = null;

function show_next_slide() {

    if (!images.img.complete) {
        setTimeout("show_next_slide()", try_again_time);
        return;
    }
    // var $slide1 = $('IMG#slide1');
    // var $slide2 = $('IMG#slide2');

    if ($slide1.css('display') == 'none') {
        var hidden = $slide1;
        var visible = $slide2;
    } else {
        var hidden = $slide2;
        var visible = $slide1;
    }
    visible.fadeOut(fade_time, load_next);
    hidden.fadeIn(fade_time, function() {
        // remove IE filter bug
        if (this.style.removeAttribute) {
            this.style.removeAttribute('filter');
        }
        setTimeout("show_next_slide()", stay_time);
    });
}


function slideshow() {

    $slide1 = $('IMG#slide1');
    // remove the already shown image
    var skip = parseInt($slide1.attr('src').replace(/[^\d]+/g, ''), 10);
    for (var i=1; i<133; i++) {
        if (i != skip) {
            img_nr_queue.push(i);
        }
    }
    shuffle(img_nr_queue);

    var second = $('<img id="slide2" src="" alt="">');
    $('DIV#slideshow').append(second);
    $slide2 = $('IMG#slide2');
    $slide2.fadeOut(0);
    var src = images.url_of(img_nr_queue.shift());
    images.img = new Image();
    images.img.src = src
    $slide2[0].src = src;
    setTimeout(show_next_slide, stay_time);
}
$(document).ready(slideshow);
