utils.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /**
  2. *
  3. * Utilities
  4. * Author: Stefan Petre www.eyecon.ro
  5. *
  6. */
  7. (function($) {
  8. EYE.extend({
  9. getPosition : function(e, forceIt)
  10. {
  11. var x = 0;
  12. var y = 0;
  13. var es = e.style;
  14. var restoreStyles = false;
  15. if (forceIt && jQuery.curCSS(e,'display') == 'none') {
  16. var oldVisibility = es.visibility;
  17. var oldPosition = es.position;
  18. restoreStyles = true;
  19. es.visibility = 'hidden';
  20. es.display = 'block';
  21. es.position = 'absolute';
  22. }
  23. var el = e;
  24. if (el.getBoundingClientRect) { // IE
  25. var box = el.getBoundingClientRect();
  26. x = box.left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) - 2;
  27. y = box.top + Math.max(document.documentElement.scrollTop, document.body.scrollTop) - 2;
  28. } else {
  29. x = el.offsetLeft;
  30. y = el.offsetTop;
  31. el = el.offsetParent;
  32. if (e != el) {
  33. while (el) {
  34. x += el.offsetLeft;
  35. y += el.offsetTop;
  36. el = el.offsetParent;
  37. }
  38. }
  39. if (jQuery.browser.safari && jQuery.curCSS(e, 'position') == 'absolute' ) {
  40. x -= document.body.offsetLeft;
  41. y -= document.body.offsetTop;
  42. }
  43. el = e.parentNode;
  44. while (el && el.tagName.toUpperCase() != 'BODY' && el.tagName.toUpperCase() != 'HTML')
  45. {
  46. if (jQuery.curCSS(el, 'display') != 'inline') {
  47. x -= el.scrollLeft;
  48. y -= el.scrollTop;
  49. }
  50. el = el.parentNode;
  51. }
  52. }
  53. if (restoreStyles == true) {
  54. es.display = 'none';
  55. es.position = oldPosition;
  56. es.visibility = oldVisibility;
  57. }
  58. return {x:x, y:y};
  59. },
  60. getSize : function(e)
  61. {
  62. var w = parseInt(jQuery.curCSS(e,'width'), 10);
  63. var h = parseInt(jQuery.curCSS(e,'height'), 10);
  64. var wb = 0;
  65. var hb = 0;
  66. if (jQuery.curCSS(e, 'display') != 'none') {
  67. wb = e.offsetWidth;
  68. hb = e.offsetHeight;
  69. } else {
  70. var es = e.style;
  71. var oldVisibility = es.visibility;
  72. var oldPosition = es.position;
  73. es.visibility = 'hidden';
  74. es.display = 'block';
  75. es.position = 'absolute';
  76. wb = e.offsetWidth;
  77. hb = e.offsetHeight;
  78. es.display = 'none';
  79. es.position = oldPosition;
  80. es.visibility = oldVisibility;
  81. }
  82. return {w:w, h:h, wb:wb, hb:hb};
  83. },
  84. getClient : function(e)
  85. {
  86. var h, w;
  87. if (e) {
  88. w = e.clientWidth;
  89. h = e.clientHeight;
  90. } else {
  91. var de = document.documentElement;
  92. w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
  93. h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
  94. }
  95. return {w:w,h:h};
  96. },
  97. getScroll : function (e)
  98. {
  99. var t=0, l=0, w=0, h=0, iw=0, ih=0;
  100. if (e && e.nodeName.toLowerCase() != 'body') {
  101. t = e.scrollTop;
  102. l = e.scrollLeft;
  103. w = e.scrollWidth;
  104. h = e.scrollHeight;
  105. } else {
  106. if (document.documentElement) {
  107. t = document.documentElement.scrollTop;
  108. l = document.documentElement.scrollLeft;
  109. w = document.documentElement.scrollWidth;
  110. h = document.documentElement.scrollHeight;
  111. } else if (document.body) {
  112. t = document.body.scrollTop;
  113. l = document.body.scrollLeft;
  114. w = document.body.scrollWidth;
  115. h = document.body.scrollHeight;
  116. }
  117. if (typeof pageYOffset != 'undefined') {
  118. t = pageYOffset;
  119. l = pageXOffset;
  120. }
  121. iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
  122. ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
  123. }
  124. return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
  125. },
  126. getMargins : function(e, toInteger)
  127. {
  128. var t = jQuery.curCSS(e,'marginTop') || '';
  129. var r = jQuery.curCSS(e,'marginRight') || '';
  130. var b = jQuery.curCSS(e,'marginBottom') || '';
  131. var l = jQuery.curCSS(e,'marginLeft') || '';
  132. if (toInteger)
  133. return {
  134. t: parseInt(t, 10)||0,
  135. r: parseInt(r, 10)||0,
  136. b: parseInt(b, 10)||0,
  137. l: parseInt(l, 10)
  138. };
  139. else
  140. return {t: t, r: r, b: b, l: l};
  141. },
  142. getPadding : function(e, toInteger)
  143. {
  144. var t = jQuery.curCSS(e,'paddingTop') || '';
  145. var r = jQuery.curCSS(e,'paddingRight') || '';
  146. var b = jQuery.curCSS(e,'paddingBottom') || '';
  147. var l = jQuery.curCSS(e,'paddingLeft') || '';
  148. if (toInteger)
  149. return {
  150. t: parseInt(t, 10)||0,
  151. r: parseInt(r, 10)||0,
  152. b: parseInt(b, 10)||0,
  153. l: parseInt(l, 10)
  154. };
  155. else
  156. return {t: t, r: r, b: b, l: l};
  157. },
  158. getBorder : function(e, toInteger)
  159. {
  160. var t = jQuery.curCSS(e,'borderTopWidth') || '';
  161. var r = jQuery.curCSS(e,'borderRightWidth') || '';
  162. var b = jQuery.curCSS(e,'borderBottomWidth') || '';
  163. var l = jQuery.curCSS(e,'borderLeftWidth') || '';
  164. if (toInteger)
  165. return {
  166. t: parseInt(t, 10)||0,
  167. r: parseInt(r, 10)||0,
  168. b: parseInt(b, 10)||0,
  169. l: parseInt(l, 10)||0
  170. };
  171. else
  172. return {t: t, r: r, b: b, l: l};
  173. },
  174. traverseDOM : function(nodeEl, func)
  175. {
  176. func(nodeEl);
  177. nodeEl = nodeEl.firstChild;
  178. while(nodeEl){
  179. EYE.traverseDOM(nodeEl, func);
  180. nodeEl = nodeEl.nextSibling;
  181. }
  182. },
  183. getInnerWidth : function(el, scroll) {
  184. var offsetW = el.offsetWidth;
  185. return scroll ? Math.max(el.scrollWidth,offsetW) - offsetW + el.clientWidth:el.clientWidth;
  186. },
  187. getInnerHeight : function(el, scroll) {
  188. var offsetH = el.offsetHeight;
  189. return scroll ? Math.max(el.scrollHeight,offsetH) - offsetH + el.clientHeight:el.clientHeight;
  190. },
  191. getExtraWidth : function(el) {
  192. if($.boxModel)
  193. return (parseInt($.curCSS(el, 'paddingLeft'))||0)
  194. + (parseInt($.curCSS(el, 'paddingRight'))||0)
  195. + (parseInt($.curCSS(el, 'borderLeftWidth'))||0)
  196. + (parseInt($.curCSS(el, 'borderRightWidth'))||0);
  197. return 0;
  198. },
  199. getExtraHeight : function(el) {
  200. if($.boxModel)
  201. return (parseInt($.curCSS(el, 'paddingTop'))||0)
  202. + (parseInt($.curCSS(el, 'paddingBottom'))||0)
  203. + (parseInt($.curCSS(el, 'borderTopWidth'))||0)
  204. + (parseInt($.curCSS(el, 'borderBottomWidth'))||0);
  205. return 0;
  206. },
  207. isChildOf: function(parentEl, el, container) {
  208. if (parentEl == el) {
  209. return true;
  210. }
  211. if (!el || !el.nodeType || el.nodeType != 1) {
  212. return false;
  213. }
  214. if (parentEl.contains && !$.browser.safari) {
  215. return parentEl.contains(el);
  216. }
  217. if ( parentEl.compareDocumentPosition ) {
  218. return !!(parentEl.compareDocumentPosition(el) & 16);
  219. }
  220. var prEl = el.parentNode;
  221. while(prEl && prEl != container) {
  222. if (prEl == parentEl)
  223. return true;
  224. prEl = prEl.parentNode;
  225. }
  226. return false;
  227. },
  228. centerEl : function(el, axis)
  229. {
  230. var clientScroll = EYE.getScroll();
  231. var size = EYE.getSize(el);
  232. if (!axis || axis == 'vertically')
  233. $(el).css(
  234. {
  235. top: clientScroll.t + ((Math.min(clientScroll.h,clientScroll.ih) - size.hb)/2) + 'px'
  236. }
  237. );
  238. if (!axis || axis == 'horizontally')
  239. $(el).css(
  240. {
  241. left: clientScroll.l + ((Math.min(clientScroll.w,clientScroll.iw) - size.wb)/2) + 'px'
  242. }
  243. );
  244. }
  245. });
  246. if (!$.easing.easeout) {
  247. $.easing.easeout = function(p, n, firstNum, delta, duration) {
  248. return -delta * ((n=n/duration-1)*n*n*n - 1) + firstNum;
  249. };
  250. }
  251. })(jQuery);