(function(window,$){

var defaultPositions = ['centerBottom', 'centerTop', 'centerRight', 'centerLeft', 'center'];
Element.implement({
    autoposition : function( options ) {
        var positions     = options.positions || defaultPositions,
            offsets       = options.offsets || [],
            edges         = options.edges || defaultPositions,
            returnPos     = options.returnPos,
            windowSize    = window.getSize(),
            windowScroll  = window.getScroll(),
            viewPort      = {
                top    : windowScroll.y,
                bottom : windowScroll.y + windowSize.y,
                left   : windowScroll.x,
                right  : windowScroll.x + windowSize.x
            },
            size          = this.getDimensions( {computedSize:true} );  
            position      = null;
        
        options.returnPos = true;
        for( var i = 0; i < positions.length; i++ ) {
            options.position = positions[i];
            options.offset   = offsets[i] || {x:0,y:0};
            options.edge     = edges[i];
            position         = this.position( options );
            if ( position.top > viewPort.top &&
                position.left > viewPort.left && 
                (position.left + size.width) < viewPort.right &&
                (position.top + size.height) < viewPort.bottom ) {
                break;
            }
        }
        // if no positions had room, default to the first position in the list
        if( i == positions.length ) {
            options.position = position = positions[0];
            options.edge     = edges[0];
            options.offset   = offsets[0] || {x:0,y:0};
        }
        
        if( returnPos ) {
            return position;
        } else {
            options.returnPos = false; 
            for( var i = 0, l = defaultPositions.length; i < l; i++ ) {
                this.removeClass( defaultPositions[i] )
            }
            this.addClass( options.position );
            return this.position( options );
        }
    },
    
    relativeToViewport : function( viewport ) {
        var coords = this.getCoordinates();
        if ( coords.bottom < viewport.top ) return -1;
        if ( coords.top > viewport.bottom ) return 1;
        return 0;
    }
});

})(this,document.id);
