/**
 * 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));
}
