/**
 * @author Alexandre Magno
 * @author (enhancement) Nicolas VINCENT - ADAKA
 * @desc Center a element with jQuery
 * @version 1.0
 * @example
 * $("element").center({
 *
 * 		vertical: true,
 *      horizontal: true
 *
 * });
 * @obs With no arguments, the default is above
 * @license free
 * @param bool vertical, bool horizontal
 * @contribution Paulo Radichi
 *
 */
jQuery
	.fn.extend(
		{
			center:
			function(params)
			{
		
				var options = {
		
					vertical: true,
					horizontal: true,
					client:		false
		
				}
				op = jQuery.extend(options, params);
		
			   return this.each(
				   function()
				   {
				   	
						/**
						/ THIRD FUNCTION
						* getPageSize() by quirksmode.com
						*
						* @return Array Return an array with page width, height and window width, height
						*/
						function ___getPageSize() {
						var xScroll, yScroll;
						if (window.innerHeight && window.scrollMaxY) {	
						xScroll = window.innerWidth + window.scrollMaxX;
						yScroll = window.innerHeight + window.scrollMaxY;
						} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
						xScroll = document.body.scrollWidth;
						yScroll = document.body.scrollHeight;
						} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
						xScroll = document.body.offsetWidth;
						yScroll = document.body.offsetHeight;
						}
						var windowWidth, windowHeight;
						if (self.innerHeight) {	// all except Explorer
						if(document.documentElement.clientWidth){
						windowWidth = document.documentElement.clientWidth; 
						} else {
						windowWidth = self.innerWidth;
						}
						windowHeight = self.innerHeight;
						} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
						windowWidth = document.documentElement.clientWidth;
						windowHeight = document.documentElement.clientHeight;
						} else if (document.body) { // other Explorers
						windowWidth = document.body.clientWidth;
						windowHeight = document.body.clientHeight;
						}	
						// for small pages with total height less then height of the viewport
						if(yScroll < windowHeight){
						pageHeight = windowHeight;
						} else { 
						pageHeight = yScroll;
						}
						// for small pages with total width less then width of the viewport
						if(xScroll < windowWidth){	
						pageWidth = xScroll;		
						} else {
						pageWidth = windowWidth;
						}
						arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
						return arrayPageSize;
						};
						/**
						/ THIRD FUNCTION
						* getPageScroll() by quirksmode.com
						*
						* @return Array Return an array with x,y page scroll values.
						*/
						function ___getPageScroll() {
						var xScroll, yScroll;
						if (self.pageYOffset) {
						yScroll = self.pageYOffset;
						xScroll = self.pageXOffset;
						} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
						yScroll = document.documentElement.scrollTop;
						xScroll = document.documentElement.scrollLeft;
						} else if (document.body) {// all other Explorers
						yScroll = document.body.scrollTop;
						xScroll = document.body.scrollLeft;	
						}
						arrayPageScroll = new Array(xScroll,yScroll);
						return arrayPageScroll;
						};
						
						//initializing variables
						var $self = jQuery(this);
						//get the dimensions using dimensions plugin
						var width = $self.width();
						var height = $self.height();
						//get the paddings
						var paddingTop = parseInt($self.css("padding-top"));
						var paddingBottom = parseInt($self.css("padding-bottom"));
						//get the borders
						var borderTop = parseInt($self.css("border-top-width"));
						var borderBottom = parseInt($self.css("border-bottom-width"));
						//get the media of padding and borders
						var mediaBorder = (borderTop+borderBottom)/2;
						var mediaPadding = (paddingTop+paddingBottom)/2;
						//get the type of positioning
						var positionType = $self.parent().css("position");
						// get the half minus of width and height
						var halfWidth = (width/2)*(-1);
						var halfHeight = ((height/2)*(-1))-mediaPadding-mediaBorder;
						// initializing the css properties
						var cssProp = {
							position: 'absolute'
						};
						
						if (op.client===false)
						{
							if(op.vertical) {
								cssProp.height = height;
								cssProp.top = '50%';
								cssProp.marginTop = halfHeight;
							}
							if(op.horizontal) {
								cssProp.width = width;
								cssProp.left = '50%';
								cssProp.marginLeft = halfWidth;
							}
							//check the current position
							if(positionType == 'static') {
								$self.parent().css('position','relative');
							}
							//aplying the css
							$self.css(cssProp);
						}
						else
						{
							// Get page sizes
							var arrPageSizes = ___getPageSize();
							// Get page scroll
							var arrPageScroll = ___getPageScroll();
							
							
							if (!$self.parent().is('body'))
								$self.appendTo($('body'));
							
							if(op.vertical) {
								cssProp.height = height;
								cssProp.top = '50%';
								cssProp.marginTop = halfHeight;
							}
							if(op.horizontal) {
								cssProp.width = width;
								cssProp.top = arrPageScroll[1] + (arrPageSizes[3] / 2);
								cssProp.left = '50%';
								cssProp.marginLeft = halfWidth;
							}
							//aplying the css
							$self.css(cssProp);
							
							// Test target position to know if it's out of the screen
							var self_offset	=	$self.offset();
							if (self_offset.top<0)
							{
								$self.css({marginTop:(parseInt($self.css('marginTop'))-self_offset.top+10)+'px'});
							}
						}
				   }
			   );
			}
		}
	)
;
