/**
 * Additional effects for use with scriptaculous
 * 
 * (c) Alex Jasse / Skygate GmbH
 */

/**
 * Blocks an element by puttin a transparent layer over it
 * needs Element.block(), Effect.Opacity
 * 
 * Options:
 * color: Color of block-layer (default: '#ffffff')
 * opacity: target opacity for layer default (default: 0.5)
 * 
 * + options from Effect.Opacity
 */
Effect.Block = function(element) {
    element = $(element);
    if(!element) throw(Effect._elementDoesNotExistError);
    
    // Default options
    var options = Object.extend({
        color:   '#FFFFFF',
        opacity: 0.5
    }, arguments[1] || {})
    
    // Block element, but w/ opacity 0 for blocker
    element.block(Object.extend(Object.clone(options), {opacity: 0}));
    
    // Fade in blocker
    return new Effect.Opacity(element.blocker, Object.extend(options, { to: options.opacity}));
}

/**
 * Unblocks an element
 */
Effect.Unblock = function(element) {
    element = $(element);
    if(!element) throw(Effect._elementDoesNotExistError);
    
    var options = Object.extend({
        to: 0,
        afterFinishInternal: function() { element.unblock(); }
    }, arguments[1] || {})

    return new Effect.Opacity(element.blocker, options);
}

/**
 * Toggles the visibility of an element by blinding it up/down
 * 
 * element: The element to toggle
 * options: See Effect.BlindUp/Effect.BlindDown
 */
Effect.ToggleBlind = function(element) {
    element = $(element);
    if(!element) throw(Effect._elementDoesNotExistError);
    
    var options = Object.extend({}, arguments[1] || {});
    return (element.visible()) ? (new Effect.BlindUp(element, options)) : (new Effect.BlindDown(element, options));
}

/**
 * Replace an element by another with a smooth transition
 * 
 * Parameters:
 * element:  the element to replace
 * element2:    the source for the other image
 * 
 * Options:
 * see Effect.Opacity
 */
Effect.FadeOver = function(element, element2) {
    
    element  = $(element);
    element2 = $(element2);

    if(!element) throw(Effect._elementDoesNotExistError);
    if(!element2) throw(Effect._elementDoesNotExistError);
    
    var options = arguments[2] || {};
    
    var fromWidth  = element.getWidth()
    var fromHeight = element.getHeight()
    
    var toWidth  = element2.getWidth();
    var toHeight = element2.getHeight();
    
    new Position.absolutize(element2);
    new Position.clone(element, element2);
    
    new Effect.Parallel([
       new Effect.Fade(element, options),
       new Effect.Appear(element2, options),
       new Effect.Morph(element, {
           style: {
               width:  toWidth + 'px',
               height: toHeight + 'px'
           }
       }),
       new Effect.Morph(element2, {
           style: {
               width:  toWidth + 'px',
               height: toHeight + 'px'
           }
       })
    ], Object.extend(options, {
            afterFinishInternal: function() {
                element.setStyle({ width: fromWidth+'px', height: fromHeight+'px' }); // Reset dimensions of original element
                element2.setStyle({ position: element.style.position });
            }
        })
    );
    
}