var currentEffect = [];

function getElementPosition(sourceObj) {
    if (sourceObj.style.left && sourceObj.style.top) {
        // for the W3C-compliant crowd
        return [parseInt(sourceObj.style.left), parseInt(sourceObj.style.top)];
    } else {
        // for the other awful browsers...
        x = sourceObj.offsetLeft;
        y = sourceObj.offsetTop;
        temp = sourceObj;
        while (temp = temp.offsetParent) {
            x += temp.offsetLeft;
            y += temp.offsetTop;
        }
        
        return [x, y];
    }
}

function positionMenuBackground(target, fade) {
    if (typeof(fade) == 'undefined') fade = true;
    
    var elName = 'btn_' + target;
    var coords = getElementPosition($(elName + '_std'));
    var el = $(elName + '_menu_bg');
    
    el.style.position = 'absolute';
    el.style.left = (coords[0] + 88) + 'px';
    el.style.top  = (coords[1] + 3) + 'px';
    el.style.margin = '0';
    el.style.display = '';
    
    if (fade) Element.setOpacity(el, .40);
}

var hideRolloverTimeouts = [];
var hoveredButtons = [];

function showRollover(target) {
    try {
        if (hideRolloverTimeouts[target]) {
            clearTimeout(hideRolloverTimeouts[target]);
            hideRolloverTimeouts[target] = null;
            return;
        }
        
        if (hoveredButtons[target]) {
            return;
        }
        
        var el = $(target + '_hover');
        var sourceObj = $(target + '_std');
        
        var coords = getElementPosition(sourceObj);
        el.style.position = 'absolute';
        el.style.left = coords[0] + 'px';
        el.style.top  = coords[1] + 'px';
        el.style.zIndex = '100';
        
        if (currentEffect[el.id]) currentEffect[el.id].cancel();
        currentEffect[el.id] = Effect.Appear(el.id, { duration: 0.2 });
        
        // the rest can be broken out into a separate function if desired
        if (el = $(target + '_menu')) {
            el.style.display = 'none';
            el.style.position = 'absolute';
            el.style.left = (coords[0] + 88) + 'px';
            el.style.top  = (coords[1] + 3) + 'px';
            el.style.zIndex = '100';
            
            for (var i = 0; i < el.childNodes.length; i++) {
                if (el.childNodes[i].tagName == 'DIV') {
                    el.style.width  = el.childNodes[i].style.width;
                    el.style.height = el.childNodes[i].style.height;
                    break;
                }
            }
            if (currentEffect[el.id]) currentEffect[el.id].cancel();
            currentEffect[el.id] = Effect.Grow(el.id, { duration: 0.4, direction: 'top-left' });
        }
        
        hoveredButtons[target] = true;
    } catch (e) { }
}

function hideRollover(target) {
    try {
        hideRolloverTimeouts[target] = setTimeout('hideRolloverComplete("' + target + '");', 50);
    } catch (e) {}
}

function hideRolloverComplete(target) {
    try {
        hideRolloverTimeouts[target] = null;
        
        if (el = $(target + '_hover')) {
            if (currentEffect[el.id]) currentEffect[el.id].cancel();
            currentEffect[el.id] = Effect.Fade(el.id, { duration: 0.3 });
        }
        
        // the rest can be broken out into a separate function if desired
        if (el = $(target + '_menu')) {
            if (currentEffect[el.id]) currentEffect[el.id].cancel();
            currentEffect[el.id] = Effect.Shrink(el.id, { duration: 0.2, direction: 'top-left' });
        }
        
        hoveredButtons[target] = false;
    } catch (e) {}
}

var currentSlideIndex = 0;
var maxSlideIndex = -1;

function getNumSlides() {
    if (maxSlideIndex > -1) return maxSlideIndex;
    maxSlideIndex = 0;
    
    while ($('img_slideshow' + maxSlideIndex)) maxSlideIndex++;
    return maxSlideIndex;
}

function nextSlide(delay, transition) {
    if (typeof(transition) == 'undefined') transition = 'SlideAppear';
    changeSlide(delay, transition, 1);
}

function prevSlide(delay, transition) {
    if (typeof(transition) == 'undefined') transition = 'SlideAppear';
    changeSlide(delay, transition, -1);
}

// controls elements named img_slideshowX
// uses a global named currentSlideIndex to keep track of its state
// uses a global named maxSlideIndex to cache the discovered maximum slide index
function changeSlide(delay, transition, increment) {
    try {
        if (typeof(delay) == 'undefined') delay = -1;
        if (typeof(transition) == 'undefined') transition = 'SlideAppear';
        
        // this element is used for positioning
        origimg = $('img_slideshow');
        
        nextSlideIndex = currentSlideIndex + increment;
        if (!$('img_slideshow' + nextSlideIndex)) {
            if (increment > 0) {
                nextSlideIndex = 0;
            } else {
                nextSlideIndex = getNumSlides() - 1;
            }
        }
        
        if ((curimg  = $('img_slideshow' + currentSlideIndex)) &&
            (nextimg = $('img_slideshow' + nextSlideIndex))) {
            // push old images back
            for (var i = 0; i < getNumSlides(); i++) {
                $('img_slideshow' + i).style.zIndex = ((increment > 0) ? i : (getNumSlides() - i));
            }
            nextimg.style.zIndex = '90';
            nextimg.style.margin = '0';
            
            // really shouldn't have to do this, but I just can't figure it out...
            curimg.style.zIndex  = '89';
            
            // drag the new image over the main image
            var coords = getElementPosition(origimg);
            nextimg.style.position = 'absolute';
            nextimg.style.left = coords[0] + 'px';
            nextimg.style.top  = coords[1] + 'px';
            
            eval('Effect.' + transition + '(nextimg.id, { duration: ' + (delay > 0 ? '1.0' : '0.5') + ' });');
            setTimeout('$("' + curimg.id + '").style.display = "none"', 1100);
            if (delay > 0) setTimeout('changeSlide(' + delay + ', "' + transition + '", ' + increment + ');', delay);
            
            //alert('current: ' + currentSlideIndex + ', next: ' + nextSlideIndex);
            currentSlideIndex = nextSlideIndex;
        }
    } catch (e) {}
}

Effect.BlindRight = function(element) {
  element = $(element);
  var oldWidth = Element.getStyle(element, 'width');
  var elementDimensions = Element.getDimensions(element);
  return new Effect.Scale(element, 100, 
    Object.extend({
        scaleContent: false,
        scaleY: false,
        scaleFrom: 0,
        scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
        restoreAfterFinish: true,
        afterSetup: function(effect) { with(Element) {
          makeClipping(effect.element);
            setStyle(effect.element, {width: '0px'});
            show(effect.element);
          }}
    }, arguments[1] || {})
  );
}

Effect.SlideAppear = function(element) {
    element = $(element);
    new Effect.Appear(element, arguments[2] || arguments[1] || {});
    new Effect.BlindRight(element, arguments[1] || {});
}

// positions slide navigation elements (named btn_slidenext and btn_slideprev)
// relative to img_slideshow (x and y are the relative offsets)
function positionSlideNav(x, y) {
    try {
        img = $('img_slideshow');
        nav = $('div_slidenav');
        
        // find the master positioning image
        //var coords = getElementPosition(img);
        
        // move the buttons to their proper places
        nav.style.zIndex = '95';
        //nav.style.position = 'absolute';
        //nav.style.left = coords[0] + x + 'px';
        //nav.style.top  = coords[1] + y + 'px';
        nav.style.position = 'relative';
        nav.style.left = x + 'px';
        nav.style.top  = y + 'px';
    } catch (e) {}
}

function showSimpleRollover(el) {
    try {
        el = $(el + '_std');
        el.oldsrc = el.src;
        el.src = el.src.replace(/(_hover)?.gif$/, '_hover.gif');
    } catch (e) {}
}

function hideSimpleRollover(el) {
    try {
        el = $(el + '_std');
        el.src = el.oldsrc;
    } catch (e) {}
}