var MyUtils = {
    X: function(element, id, isClass){
        element = $(element);
		var curleft = 0;
		if (element.offsetParent)
		{
			while (element.offsetParent)
			{
				curleft += (element.offsetLeft + element.scrollLeft);
				element = element.offsetParent;
			}
		}
		else if (element.x)
			curleft += element.x;
		return curleft;
    },
    Y: function(element, id, isClass){
        element = $(element);
		var curtop = 0;
		if (element.offsetParent)
		{
			while (element.offsetParent)
			{	
				curtop += (element.offsetTop - element.scrollTop);
				element = element.offsetParent;
			}
		}
		else if (element.y)
			curtop += element.y;
		return curtop;
    }	
}

Element.addMethods(MyUtils);








// -- SHAPED NOTE : WE ARE HOSTING THIS CLASS FOR SCRIPTACULOUS WIKI, HAD NOTHING TO DO WITH ITS CREATION -- //

//pass me the desired most outer bouding box position and dimensions. calculations includes margin/border/paddings, so when you know you want a div positioned
//and sized a specific way, this will position and animate the transition. set duration=0 for no aninmation. *note* you will need to click 'edit' to view the real source! the stupid 
//wiki interpreter is parsing asterisks as bold text dispite being inside a code block!
//by jake richardson {jaecob.gmail.com}

Effect.MoveAndResizeTo = Class.create();
Object.extend(Object.extend(Effect.MoveAndResizeTo.prototype, Effect.Base.prototype), {
  initialize: function(element, toTop, toLeft, toWidth, toHeight) {

    this.element      = $(element);
    this.toTop        = toTop;
    this.toLeft       = toLeft;
    this.toWidth      = toWidth;
    this.toHeight     = toHeight;


    this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || 0);
    this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || 0);
    this.originalWidth  = parseFloat(Element.getStyle(this.element,'width')  || 0);
    this.originalHeight = parseFloat(Element.getStyle(this.element,'height') || 0);

    this.effectiveTop = this.toTop;

    this.effectiveLeft = this.toLeft;

    this.effectiveWidth = this.toWidth 
                        - (!isNaN(parseFloat(Element.getStyle(this.element,'margin-left') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'margin-left') || 0)) 
						- (!isNaN(parseFloat(Element.getStyle(this.element,'margin-right') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'margin-right') || 0)) 
                        - (document.compatMode == 'BackCompat' ? 0 : // height includes padding & border in IE BackCompat mode
						   (!isNaN(parseFloat(Element.getStyle(this.element,'padding-left') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'padding-left') || 0)) 
                            + (!isNaN(parseFloat(Element.getStyle(this.element,'padding-right') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'padding-right') || 0)) 
							+ (!isNaN(parseFloat(Element.getStyle(this.element,'border-left-width') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'border-left-width') || 0))
							+ (!isNaN(parseFloat(Element.getStyle(this.element,'border-right-width') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'border-right-width') || 0)));

	if (isNaN(this.effectiveWidth))
		this.effectiveWidth = this.toWidth;

    this.effectiveHeight = this.toHeight
                        - (!isNaN(parseFloat(Element.getStyle(this.element,'margin-top') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'margin-top') || 0)) 
						- (!isNaN(parseFloat(Element.getStyle(this.element,'margin-bottom') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'margin-bottom') || 0)) 
                        - (document.compatMode == 'BackCompat' ? 0 : // height includes padding & border in IE BackCompat mode
						   (!isNaN(parseFloat(Element.getStyle(this.element,'padding-top') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'padding-top') || 0)) 
                            + (!isNaN(parseFloat(Element.getStyle(this.element,'padding-bottom') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'padding-bottom') || 0)) 
							+ (!isNaN(parseFloat(Element.getStyle(this.element,'border-top-width') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'border-top-width') || 0))
							+ (!isNaN(parseFloat(Element.getStyle(this.element,'border-bottom-width') || 0)) ? 0 : parseFloat(Element.getStyle(this.element,'border-bottom-width') || 0)));

	if (isNaN(this.effectiveHeight))
		this.effectiveHeight = this.toHeight;

    this.options = arguments[5] || {};

    if (this.effectiveWidth < 0) this.effectiveWidth = 0;
    if (this.effectiveHeight < 0) this.effectiveHeight = 0;

    if (this.originalTop == this.effectiveTop &&
        this.originalLeft == this.effectiveLeft &&
        this.originalWidth == this.effectiveWidth &&
        this.originalHeight == this.effectiveHeight) {

      // no need to start!
      return;
    }

    this.start(this.options);

  },
  update: function(position) {
    topd  = this.effectiveTop * (position) + this.originalTop * (1 - position);
    leftd = this.effectiveLeft * (position) + this.originalLeft * (1 - position);
    widthd  = this.effectiveWidth * (position) + this.originalWidth * (1 - position);
    heightd = this.effectiveHeight * (position) + this.originalHeight * (1 - position);
    this.setPosition(topd, leftd, widthd, heightd);
  },
  setPosition: function(topd, leftd, widthd, heightd) {

	var w = widthd;
	if (isNaN(w))
		w = 0;
		
		
	var h = heightd;
	if (isNaN(h))
		h = 0;
		
    this.element.style.top = topd+'px';
    this.element.style.left = leftd+'px';
    this.element.style.width = w+'px';
    this.element.style.height = h+'px';
  }
});



Effect.Unfold = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  element.makeClipping();
  return new Effect.Scale(element, 100, Object.extend({   
    scaleContent: false,
    scaleY: false,
    scaleFrom: 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({width: '1px', height: '1px'}).show();
    },
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 100, {
      scaleContent: false, 
      scaleX: false,
      scaleFrom: 5,
      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
          restoreAfterFinish: true,
        afterSetup: function(effect) {
            effect.element.makeClipping().setStyle({height: '1px'}).show(); 
          },  
          afterFinishInternal: function(effect) {
            effect.element.undoClipping().setStyle(oldStyle);
          }
    });
  }}, arguments[1] || {}));
};



















Effect.ScrollIntoViewTo = Class.create();
Object.extend(Object.extend(Effect.ScrollIntoViewTo.prototype, Effect.Base.prototype), {
  initialize: function(element) {

    this.element      = $(element);
	this.elementTop = this.element.Y();
	this.elementLeft = this.element.X();
	
	  var scrOfX = 0, scrOfY = 0;
	  if( typeof( window.pageYOffset ) == 'number' ) {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	  }	
	  
	this.startScrollTop = scrOfY;
	this.startScrollLeft = scrOfX;
	this.scrollAmountY = this.elementTop - this.startScrollTop;
	this.scrollAmountX = this.elementLeft - this.startScrollLeft;
	
	if ((this.startScrollTop==0) && (this.startScrollLeft==0))
		return;

    this.start(this.options);

  },
  update: function(position) {
	  var y = this.startScrollTop + (this.scrollAmountY*position);
	  var x = this.startScrollLeft + (this.scrollAmountX*position);
	  
	  window.scrollTo(x, y);	  
	  
  },
  finish: function(){
	  this.element.scrollIntoView(false);
  }
});
