function true_mod(val,mod) {
    if (val < 0) {
        while(val<0) val += mod;
        return val;
    } else {
        return val%mod;
    }
}

function showimage(targetseries,forcestart,forward) {
    // we've not yet loaded!
    if (!placeholder) return;
    
    // if we're already changing, just ignore.
    if (is_changing) return;
    is_changing = true;
    
    // check if series is valid.
    var validseries = false;
    for (var i = 0; i < series.length; i++) {
        if (series[i] == targetseries) { validseries = true; break; }
    }
    
    // get relevant series arr
    var series_arr = eval(targetseries+"_pics");
    
    if (validseries) {
        // determine what is currently shown.
        var index = 0; // we start at index 0.
        
        var offset = forward?1:-1;
        
        // if (forcestart) { // we will always start at 0 then  }
        if (placeholder.src.indexOf("psp_center.gif") == -1 && !forcestart) {
            for (var i = 0; i < series_arr.length; i++) {
                if (placeholder.src.indexOf(series_arr[i]) != -1) {
                    //alert("Found it!");
                    index = true_mod((i+offset),series_arr.length);
                }
            }
            // if we fall out, with no match, index remains at 0.
        }
        
        // load new image:
        var newImg = new Image();
        newImg.src = series_arr[index];
        
        // we "preload" the next AND previous in the same shot
        var next_index = true_mod((index+1),series_arr.length);
        var nextImg = new Image();
        nextImg.src = series_arr[next_index];
        var prev_index = true_mod((index-1),series_arr.length);
        var prevImg = new Image();
        prevImg.src = series_arr[prev_index];
        
        function setImageWhenLoaded() {
            if (newImg.width > 0) {
                //alert("did it! \nold: " + placeholder.src  + "\nnew: "+newImg.src);
                placeholder.src = newImg.src;
                is_changing = false; // we're done now!
            } else {
                //alert("going to wait one more time for: "+newImg.src);
                setTimeout(function() {setImageWhenLoaded();},1000);
            }
        }
        setImageWhenLoaded();
    }
}

function startseries(targetseries) { 
    active_series = targetseries;
    showimage(targetseries,true,true);
    placeholder.style.cursor = "pointer";
    
    document.getElementById('armtopcenter').style.cursor = "pointer";
    document.getElementById('armbottomright').style.cursor = "pointer";
}

function is_active_series() {
    if (active_series) {
        for (var i = 0; i < series.length; i++) {
            if (active_series == series[i]) return true;
        }
    }
    return false;
}

function next_in_series() {
    if (is_active_series()) { // is set at all
        showimage(active_series,false,true);
    }
}

function prev_in_series() {
    if (is_active_series()) { // is set at all
        showimage(active_series,false,false);
    }
}

/*function flip(img,on) {
    if (is_active_series()) {
        img.src = img.src.replace(on?"_off":"_on",on?"_on":"_off");
    }
}*/

function flip(img,state,exclusive) {
    //if (img.src.indexOf("_act.") != -1) return; // no action for active imgs.
    var prev= img.src;
    img.src = img.src.replace(/_[^_]+(\.\w+$)/,"_"+state+"$1");
    //alert("Before:\t"+prev+"\nAfter:\t"+img.src);
    if (exclusive) {
        for (var i = 0; i < series.length; i++) {
            var img2 = document.getElementById("series"+series[i]);
            if (img2 != img) flip(img2,"off",false);
        }
    }
}