Effect.AjSet = {
    'slide':  ['SlideDownAj','SlideUp'],
    'blind':  ['BlindDownAj','BlindUp'],
    'appear': ['Appear','Fade'],
	'phase' : ['AjPhase','AjPhase'],
	'phase2' : ['ColPhase','ColPhase'],
	'simple' : ['Simple','Simple'],
    'apblind': ['Appear','BlindUp']
  }

//main toggle effect
Effect.Spoiler = function(element, effect, me, show, hide) {
    element = $(element);
    if (element.style.display != 'none') {
      me.innerHTML = show;
    } else {
      me.innerHTML = hide;
        }
	if(me.className.indexOf("collapsed") > -1) {
		me.className = me.className.replace(" collapsed", "");
	} else {
		me.className += " collapsed";
	}
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global') }
    }, arguments[2] || {});
    Effect[Element.visible(element) ? 
      Effect.AjSet[effect][1] : Effect.AjSet[effect][0]](element, options);
  }

//fix IE bug
Effect.SlideDownAj = function(element) {
  element = $(element);
  Element.cleanWhitespace(element);
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
  var elementDimensions = Element.getDimensions(element);
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false, 
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
//    restoreAfterFinish: true,
    afterSetup: function(effect) { with(Element) {
      makePositioned(effect.element);
      makePositioned(effect.element.firstChild);
      if(window.opera) setStyle(effect.element, {top: ''});
      makeClipping(effect.element);
      setStyle(effect.element, {height: '0px'});
      show(element); }},
    afterUpdateInternal: function(effect) { with(Element) {
      setStyle(effect.element.firstChild, {bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
    afterFinishInternal: function(effect) { with(Element) {
      undoClipping(effect.element); 
      // IE will crash if child is undoPositioned first
      if(/MSIE/.test(navigator.userAgent)){
        undoPositioned(effect.element);     
        undoPositioned(effect.element.firstChild);     
      }else{
        undoPositioned(effect.element.firstChild);     
        undoPositioned(effect.element);             
      }
      setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
    }, arguments[1] || {})
  );
}

//fix opera bug
Effect.BlindDownAj = function(element) {
  element = $(element);
  var oldHeight = Element.getStyle(element, 'height');
  var elementDimensions = Element.getDimensions(element);
  if(oldHeight == '0px'){ oldHeight = elementDimensions.Height + 'px'; }
  return new Effect.Scale(element, 100, 
    Object.extend({ scaleContent: false, 
      scaleX: false,
      scaleFrom: 0,
      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
      restoreAfterFinish: true,
      afterSetup: function(effect) { with(Element) {
        makeClipping(effect.element);
        setStyle(effect.element, {height: '0px'});
        show(effect.element); 
      }},  
      afterFinishInternal: function(effect) { with(Element) {
        undoClipping(effect.element);
        setStyle(effect.element, {height: oldHeight});
      }}
    }, arguments[1] || {})
  );
}

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

Effect.AjPhase = function(element) {
  element = $(element);
  if (element.style.display == 'none')
    new Effect.PhaseInAj(element,'','','','', arguments[1] || {}, arguments[2] || arguments[1] || {});
  else new Effect.PhaseOut(element,'','','','', arguments[1] || {}, arguments[2] || arguments[1] || {});
}

 Effect.Simple = function(element) {
  element = $(element);
	if (element.style.display == 'none') 
	element.style.display = 'block';
	else	element.style.display = 'none'; 
  }

Effect.ColPhase = function(element) {
  element = $(element);
  if (element.style.display == 'none')
    new Effect.PhaseInAj(element,'','', arguments[1] || {}, arguments[2] || arguments[1] || {});
  else new Effect.PhaseOut(element,'','', arguments[1] || {}, arguments[2] || arguments[1] || {});
}

Effect.Collapse = function(element, effect, me) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global') }
    }, arguments[2] || {});
    Effect[Element.visible(element) ? 
      Effect.AjSet[effect][1] : Effect.AjSet[effect][0]](element, options);
	if (me.className.indexOf("collapsed") > -1) {
		me.className = me.className.replace(" collapsed", "");
	}else{
		me.className += " collapsed";
	}
  }

