// EXTEND THE SCRIPTACULOUS EFFECT API TO DO LEFT/RIGHT SLIDE EFFECTS.
Effect.SlideOpen = function(element) {
	side = arguments[1].side;
  	element = $(element).cleanWhitespace();
	switch(side) {
		case 'top'    : var oldInner = element.down().getStyle('bottom'); break;
		case 'right'  : var oldInner = element.down().getStyle('right');  break;
		case 'bottom' : var oldInner = element.down().getStyle('bottom'); break;
		case 'left'   : var oldInner = element.down().getStyle('right');  break;
	}
  
	var elementDimensions = element.getDimensions();
  	return new Effect.Scale(element, 100, 
		Object.extend({ 
			scaleContent: false, 
			scaleY: ((side == 'left' || side == 'right') ? false : true), 
			scaleX: ((side == 'top' || side == 'bottom') ? false : true), 
			scaleFrom: window.opera ? 0 : 1,
			scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
			restoreAfterFinish: true,
			afterSetup: function(effect) {
			//effect.element.makePositioned(); //commented out to work in Safari... should probably do a browser test here instead
			effect.element.down().makePositioned();
			if(side == 'left' || side == 'right') {
				if(window.opera) effect.element.setStyle({left: ''});
				effect.element.makeClipping().setStyle({width: '0px'}).show(); 
			}
			else {
				if(window.opera) effect.element.setStyle({top: ''});
				effect.element.makeClipping().setStyle({height: '0px'}).show(); 
			}
		},
		afterUpdateInternal: function(effect) {
			switch(side) {
				case 'top'   : effect.element.down().setStyle({bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); break;
				case 'right' : effect.element.down().setStyle({right: (effect.dims[1] - effect.element.clientWidth) + 'px' });   break;
				case 'bottom': effect.element.down().setStyle({bottom: (effect.dims[2] - effect.element.clientHeight) + 'px' }); break;
				case 'left'  : effect.element.down().setStyle({right: (effect.dims[3] - effect.element.clientWidth) + 'px' });   break;
			}
		},
		afterFinishInternal: function(effect) {
			effect.element.undoClipping().undoPositioned();
			(side == 'left' || side == 'right') ? effect.element.down().undoPositioned().setStyle({right: oldInner}) : effect.element.down().undoPositioned().setStyle({bottom: oldInner});
		}
	}, arguments[1] || {})
  );
}

Effect.SlideClose = function(element) {
	side = arguments[1].side;
  	element = $(element).cleanWhitespace();
  	switch(side) {
		case 'top'    : var oldInner = element.getStyle('bottom'); break;
		case 'right'  : var oldInner = element.getStyle('right');  break;
		case 'bottom' : var oldInner = element.getStyle('bottom'); break;
		case 'left'   : var oldInner = element.getStyle('right');  break;
	}
	
  	return new Effect.Scale(element, window.opera ? 0 : 1,
   		Object.extend({ scaleContent: false, 
    		scaleY: ((side == 'left' || side == 'right') ? false : true), 
			scaleX: ((side == 'top' || side == 'bottom') ? false : true),
    		scaleMode: 'box',
    		restoreAfterFinish: true,
    		beforeStartInternal: function(effect) {
				effect.element.makePositioned();
				effect.element.down().makePositioned();
				if(side == 'left' || side == 'right') {
					if(window.opera) effect.element.setStyle({left: ''});
				}
				else {
					if(window.opera) effect.element.setStyle({top: ''});
				}
      			effect.element.makeClipping().show();
    		},  
			afterUpdateInternal: function(effect) {
				switch(side) {
					case 'top'   : effect.element.down().setStyle({bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); break;
					case 'right' : effect.element.down().setStyle({right: (effect.dims[1] - effect.element.clientWidth) + 'px' });   break;
					case 'bottom': effect.element.down().setStyle({bottom: (effect.dims[2] - effect.element.clientHeight) + 'px' }); break;
					case 'left'  : effect.element.down().setStyle({right: (effect.dims[3] - effect.element.clientWidth) + 'px' });   break;
				}
			},
			afterFinishInternal: function(effect) {
				switch(side) {
					case 'top'   : effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInner});   break;
					case 'right' : effect.element.hide().undoClipping().undoPositioned().setStyle({right: oldInner});   break;
					case 'bottom': effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInner});   break;
					case 'left'  : effect.element.hide().undoClipping().undoPositioned().setStyle({right: oldInner});   break;
				}
				effect.element.down().undoPositioned();
			}
   		}, arguments[1] || {})
  	);
}