/**
 *
 * 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);
