/**

 *

 * Utilities

 * Author: Stefan Petre www.eyecon.ro

 * 

 */

(function($) {

EYE.extend({

	getPosition : function(e, forceIt)

	{

		var x = 0;

		var y = 0;

		var es = e.style;

		var restoreStyles = false;

		if (forceIt && jQuery.curCSS(e,'display') == 'none') {

			var oldVisibility = es.visibility;

			var oldPosition = es.position;

			restoreStyles = true;

			es.visibility = 'hidden';

			es.display = 'block';

			es.position = 'absolute';

		}

		var el = e;

		if (el.getBoundingClientRect) { // IE

			var box = el.getBoundingClientRect();

			x = box.left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) - 2;

			y = box.top + Math.max(document.documentElement.scrollTop, document.body.scrollTop) - 2;

		} else {

			x = el.offsetLeft;

			y = el.offsetTop;

			el = el.offsetParent;

			if (e != el) {

				while (el) {

					x += el.offsetLeft;

					y += el.offsetTop;

					el = el.offsetParent;

				}

			}

			if (jQuery.browser.safari && jQuery.curCSS(e, 'position') == 'absolute' ) {

				x -= document.body.offsetLeft;

				y -= document.body.offsetTop;

			}

			el = e.parentNode;

			while (el && el.tagName.toUpperCase() != 'BODY' && el.tagName.toUpperCase() != 'HTML') 

			{

				if (jQuery.curCSS(el, 'display') != 'inline') {

					x -= el.scrollLeft;

					y -= el.scrollTop;

				}

				el = el.parentNode;

			}

		}

		if (restoreStyles == true) {

			es.display = 'none';

			es.position = oldPosition;

			es.visibility = oldVisibility;

		}

		return {x:x, y:y};

	},

	getSize : function(e)

	{

		var w = parseInt(jQuery.curCSS(e,'width'), 10);

		var h = parseInt(jQuery.curCSS(e,'height'), 10);

		var wb = 0;

		var hb = 0;

		if (jQuery.curCSS(e, 'display') != 'none') {

			wb = e.offsetWidth;

			hb = e.offsetHeight;

		} else {

			var es = e.style;

			var oldVisibility = es.visibility;

			var oldPosition = es.position;

			es.visibility = 'hidden';

			es.display = 'block';

			es.position = 'absolute';

			wb = e.offsetWidth;

			hb = e.offsetHeight;

			es.display = 'none';

			es.position = oldPosition;

			es.visibility = oldVisibility;

		}

		return {w:w, h:h, wb:wb, hb:hb};

	},

	getClient : function(e)

	{

		var h, w;

		if (e) {

			w = e.clientWidth;

			h = e.clientHeight;

		} else {

			var de = document.documentElement;

			w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;

			h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;

		}

		return {w:w,h:h};

	},

	getScroll : function (e)

	{

		var t=0, l=0, w=0, h=0, iw=0, ih=0;

		if (e && e.nodeName.toLowerCase() != 'body') {

			t = e.scrollTop;

			l = e.scrollLeft;

			w = e.scrollWidth;

			h = e.scrollHeight;

		} else  {

			if (document.documentElement) {

				t = document.documentElement.scrollTop;

				l = document.documentElement.scrollLeft;

				w = document.documentElement.scrollWidth;

				h = document.documentElement.scrollHeight;

			} else if (document.body) {

				t = document.body.scrollTop;

				l = document.body.scrollLeft;

				w = document.body.scrollWidth;

				h = document.body.scrollHeight;

			}

			if (typeof pageYOffset != 'undefined') {

				t = pageYOffset;

				l = pageXOffset;

			}

			iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;

			ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;

		}

		return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };

	},

	getMargins : function(e, toInteger)

	{

		var t = jQuery.curCSS(e,'marginTop') || '';

		var r = jQuery.curCSS(e,'marginRight') || '';

		var b = jQuery.curCSS(e,'marginBottom') || '';

		var l = jQuery.curCSS(e,'marginLeft') || '';

		if (toInteger)

			return {

				t: parseInt(t, 10)||0,

				r: parseInt(r, 10)||0,

				b: parseInt(b, 10)||0,

				l: parseInt(l, 10)

			};

		else

			return {t: t, r: r,	b: b, l: l};

	},

	getPadding : function(e, toInteger)

	{

		var t = jQuery.curCSS(e,'paddingTop') || '';

		var r = jQuery.curCSS(e,'paddingRight') || '';

		var b = jQuery.curCSS(e,'paddingBottom') || '';

		var l = jQuery.curCSS(e,'paddingLeft') || '';

		if (toInteger)

			return {

				t: parseInt(t, 10)||0,

				r: parseInt(r, 10)||0,

				b: parseInt(b, 10)||0,

				l: parseInt(l, 10)

			};

		else

			return {t: t, r: r,	b: b, l: l};

	},

	getBorder : function(e, toInteger)

	{

		var t = jQuery.curCSS(e,'borderTopWidth') || '';

		var r = jQuery.curCSS(e,'borderRightWidth') || '';

		var b = jQuery.curCSS(e,'borderBottomWidth') || '';

		var l = jQuery.curCSS(e,'borderLeftWidth') || '';

		if (toInteger)

			return {

				t: parseInt(t, 10)||0,

				r: parseInt(r, 10)||0,

				b: parseInt(b, 10)||0,

				l: parseInt(l, 10)||0

			};

		else

			return {t: t, r: r,	b: b, l: l};

	},

	traverseDOM : function(nodeEl, func)

	{

		func(nodeEl);

		nodeEl = nodeEl.firstChild;

		while(nodeEl){

			EYE.traverseDOM(nodeEl, func);

			nodeEl = nodeEl.nextSibling;

		}

	},

	getInnerWidth :  function(el, scroll) {

		var offsetW = el.offsetWidth;

		return scroll ? Math.max(el.scrollWidth,offsetW) - offsetW + el.clientWidth:el.clientWidth;

	},

	getInnerHeight : function(el, scroll) {

		var offsetH = el.offsetHeight;

		return scroll ? Math.max(el.scrollHeight,offsetH) - offsetH + el.clientHeight:el.clientHeight;

	},

	getExtraWidth : function(el) {

		if($.boxModel)

			return (parseInt($.curCSS(el, 'paddingLeft'))||0)

				+ (parseInt($.curCSS(el, 'paddingRight'))||0)

				+ (parseInt($.curCSS(el, 'borderLeftWidth'))||0)

				+ (parseInt($.curCSS(el, 'borderRightWidth'))||0);

		return 0;

	},

	getExtraHeight : function(el) {

		if($.boxModel)

			return (parseInt($.curCSS(el, 'paddingTop'))||0)

				+ (parseInt($.curCSS(el, 'paddingBottom'))||0)

				+ (parseInt($.curCSS(el, 'borderTopWidth'))||0)

				+ (parseInt($.curCSS(el, 'borderBottomWidth'))||0);

		return 0;

	},

	isChildOf: function(parentEl, el, container) {

		if (parentEl == el) {

			return true;

		}

		if (!el || !el.nodeType || el.nodeType != 1) {

			return false;

		}

		if (parentEl.contains && !$.browser.safari) {

			return parentEl.contains(el);

		}

		if ( parentEl.compareDocumentPosition ) {

			return !!(parentEl.compareDocumentPosition(el) & 16);

		}

		var prEl = el.parentNode;

		while(prEl && prEl != container) {

			if (prEl == parentEl)

				return true;

			prEl = prEl.parentNode;

		}

		return false;

	},

	centerEl : function(el, axis)

	{

		var clientScroll = EYE.getScroll();

		var size = EYE.getSize(el);

		if (!axis || axis == 'vertically')

			$(el).css(

				{

					top: clientScroll.t + ((Math.min(clientScroll.h,clientScroll.ih) - size.hb)/2) + 'px'

				}

			);

		if (!axis || axis == 'horizontally')

			$(el).css(

				{

					left: clientScroll.l + ((Math.min(clientScroll.w,clientScroll.iw) - size.wb)/2) + 'px'

				}

			);

	}

});

if (!$.easing.easeout) {

	$.easing.easeout = function(p, n, firstNum, delta, duration) {

		return -delta * ((n=n/duration-1)*n*n*n - 1) + firstNum;

	};

}

	

})(jQuery);
