/**
 * @author Joao Mealha Costa
 * @based on center plugin from Alexandre Magno
 * @desc Center a element without clipping content 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.center = function(params) {

		var options = {
			vertical: true,
			horizontal: true
		}
		
		op = jQuery.extend(options, params);

   return this.each(function(){

		//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"));
		var paddingLeft = parseInt($self.css("padding-left"));
		var paddingRight = parseInt($self.css("padding-right"));
		
		//get the borders
		var borderTop = parseInt($self.css("border-top-width"));
		var borderBottom = parseInt($self.css("border-bottom-width"));
		var borderLeft = parseInt($self.css("border-left-width"));
		var borderRight = parseInt($self.css("border-rigth-width"));
		
		//get the media of padding and borders
		var mediaBorderVertical = (borderTop+borderBottom)/2;
		var mediaPaddingVertical = (paddingTop+paddingBottom)/2;
		var mediaBorderHorizontal = (borderLeft+borderRight)/2;
		var mediaPaddingHorizontal = (paddingLeft+paddingRight)/2;
		
		//get the type of positioning
		var positionType = $self.parent().css("position");
		
		//get the half minus of width and height
		//var halfHeight = ((height/2)*(-1))-mediaPaddingVertical-mediaBorderVertical;
		var halfHeight = ((height/2)*(-1))-mediaPaddingVertical;
		//var halfWidth = ((width/2)*(-1))-mediaPaddingHorizontal-mediaBorderHorizontal;
		var halfWidth = ((width/2)*(-1))-mediaPaddingHorizontal;
		//var halfWidth = ((width/2)*(-1));
		
		// initializing the css properties
		var cssProp = {
			position: 'absolute'
		};
		
		//center vertically without content clipping
		if(op.vertical && $self.parent().height()>($self.height()+mediaPaddingVertical)){
			cssProp.height = height;
			cssProp.top = '50%';
			cssProp.marginTop = halfHeight;
		}else{
			cssProp.height = height;
			cssProp.top = '0';
			cssProp.marginTop = 0;
		}
			
		//center horizontally without content clipping
		if(op.horizontal && $self.parent().width()>($self.width()+mediaPaddingHorizontal)){
			cssProp.width = width;
			cssProp.left = '50%';
			cssProp.marginLeft = halfWidth;
		}else{
			cssProp.width = width;
			cssProp.left = '0';
			cssProp.marginLeft = 0;
		};
		
		//check the current position
		if(positionType == 'static') {
			$self.parent().css("position","relative");
		}

		//aplying the css
		$self.css(cssProp);

   });

};
