/**
 * Adds the functions for positioning to the Element
 *
 * @auther Adam Brill adam@solutionset.com
 * @date 20070122
 *
 * @see prototype.js v1.6
 */

/* Element
---------------------------------------*/
Element.addMethods({
	/**
	 * Position any element relative to another element or the viewport
	 *
	 * @param DOMElement element
	 * @param options array
	 * @return bool
	 */
	position: function(element, options) {
		if(options.exemplar != 'viewport' && !Object.isElement(options.exemplar)){
			return false;
		}
		
		element = $(element);
		
		if(options.exemplar == 'viewport'){
			var exemplarDims = Object.extend(document.viewport.getDimensions(), document.viewport.getScrollOffsets());
		}else{
			options.exemplar = $(options.exemplar);
			var exemplarDims = Object.extend(options.exemplar.getDimensions(), options.exemplar.cumulativeOffset());
		}
		
		var exemplarAnchor = options.exemplarAnchor.split(' '),
		selfAnchor = options.selfAnchor.split(' ');
		
		if(element.visible()){
			element.absolutize();
			var selfDims = element.getDimensions();
		}else{
			element.setStyle({visibility: 'hidden'}).show().absolutize();
			var selfDims = element.getDimensions();
			element.hide().setStyle({visibility: 'visible'});
		}
		var newLeft = exemplarDims.left +
		((exemplarAnchor[1] == 'right')? exemplarDims.width : 0) +
		((exemplarAnchor[1] == 'center')? exemplarDims.width/2 : 0) -
		((selfAnchor[1] == 'right')? selfDims.width : 0) -
		((selfAnchor[1] == 'center')? selfDims.width/2 : 0);
		var newTop = exemplarDims.top +
		((exemplarAnchor[0] == 'bottom')? exemplarDims.height : 0) +
		((exemplarAnchor[0] == 'center')? exemplarDims.height/2 : 0) -
		((selfAnchor[0] == 'bottom')? selfDims.height : 0) -
		((selfAnchor[0] == 'center')? selfDims.height/2 : 0);
		
		newLeft = (newLeft < 0)? 0 : newLeft;
		newTop = (newTop < 0)? 0 : newTop;
		if(options.keepOnScreen !== false){
			var vpDims = Object.extend(document.viewport.getDimensions(), document.viewport.getScrollOffsets());
			newLeft = (newLeft > (vpDims.width+vpDims.left)-selfDims.width)? (vpDims.width+vpDims.left)-selfDims.width : newLeft;
			newTop = (newTop > (vpDims.height+vpDims.top)-selfDims.height)? (vpDims.height+vpDims.top)-selfDims.height : newTop;
		}
		element.setStyle({top: newTop+"px", left: newLeft+"px"});
		return true;
	}
});