1+ /** 
2+ * Detect Element Rezise Plugin for jQuery 
3+ * 
4+ * https://github.com/sdecima/javascript-detect-element-resize 
5+ * Sebastian Decima 
6+ * 
7+ * Based on the works of Back Alley Coder: 
8+ *  http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/ 
9+ **/ 
10+ 
11+ ( function  (  $  )  { 
12+ 	$ . fn . resize  =  function ( callback )  { 
13+ 		return  this . each ( function ( )  { 
14+ 			addResizeListener ( this ,  callback ) ; 
15+ 		} ) ; 
16+ 	} 
17+ 	
18+ 	$ . fn . flow  =  function ( type ,  callback )  { 
19+ 		return  this . each ( function ( )  { 
20+ 			addFlowListener ( this ,  type ,  callback ) ; 
21+ 		} ) ; 
22+ 	} 
23+ 	
24+ 	function  addFlowListener ( element ,  type ,  fn ) { 
25+ 		var  flow  =  type  ==  'over' ; 
26+ 		element . addEventListener ( 'OverflowEvent'  in  window  ? 'overflowchanged'  : type  +  'flow' ,  function ( e ) { 
27+ 			if  ( e . type  ==  ( type  +  'flow' )  || 
28+ 			( ( e . orient  ==  0  &&  e . horizontalOverflow  ==  flow )  || 
29+ 			( e . orient  ==  1  &&  e . verticalOverflow  ==  flow )  || 
30+ 			( e . orient  ==  2  &&  e . horizontalOverflow  ==  flow  &&  e . verticalOverflow  ==  flow ) ) )  { 
31+ 				e . flow  =  type ; 
32+ 				return  fn . call ( this ,  e ) ; 
33+ 			} 
34+ 		} ,  false ) ; 
35+ 	} ; 
36+ 	
37+ 	function  fireEvent ( element ,  type ,  data ,  options ) { 
38+ 		var  options  =  options  ||  { } , 
39+ 			event  =  document . createEvent ( 'Event' ) ; 
40+ 		event . initEvent ( type ,  'bubbles'  in  options  ? options . bubbles  : true ,  'cancelable'  in  options  ? options . cancelable  : true ) ; 
41+ 		for  ( var  z  in  data )  event [ z ]  =  data [ z ] ; 
42+ 		element . dispatchEvent ( event ) ; 
43+     } ; 
44+ 	
45+ 	function  addResizeListener ( element ,  fn ) { 
46+ 		var  resize  =  'onresize'  in  element ; 
47+ 		if  ( ! resize  &&  ! element . _resizeSensor )  { 
48+ 			var  sensor_style  =  'position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; z-index: -1;' ; 
49+ 			var  sensor  =  element . _resizeSensor  =  document . createElement ( 'div' ) ; 
50+ 				sensor . className  =  'resize-sensor' ; 
51+ 				//sensor.style = ; 
52+ 				sensor . innerHTML  =  '<div class="resize-overflow" style="'  +  sensor_style 
53+ 					+  '"><div></div></div><div class="resize-underflow" style="'  +  sensor_style 
54+ 					+  '"><div></div></div>' ; 
55+ 			
56+ 			var  x  =  0 ,  y  =  0 , 
57+ 				first  =  sensor . firstElementChild . firstChild , 
58+ 				last  =  sensor . lastElementChild . firstChild , 
59+ 				matchFlow  =  function ( event ) { 
60+ 					var  change  =  false , 
61+ 						width  =  element . offsetWidth ; 
62+ 					if  ( x  !=  width )  { 
63+ 						first . style . width  =  width  -  1  +  'px' ; 	
64+ 						last . style . width  =  width  +  1  +  'px' ; 
65+ 						change  =  true ; 
66+ 						x  =  width ; 
67+ 					} 
68+ 					var  height  =  element . offsetHeight ; 
69+ 					if  ( y  !=  height )  { 
70+ 						first . style . height  =  height  -  1  +  'px' ; 
71+ 						last . style . height  =  height  +  1  +  'px' ; 	
72+ 						change  =  true ; 
73+ 						y  =  height ; 
74+ 					} 
75+ 					if  ( change  &&  event . currentTarget  !=  element )  fireEvent ( element ,  'resize' ) ; 
76+ 				} ; 
77+ 			
78+ 			if  ( getComputedStyle ( element ) . position  ==  'static' ) { 
79+ 				element . style . position  =  'relative' ; 
80+ 				element . _resizeSensor . _resetPosition  =  true ; 
81+ 			} 
82+ 			addFlowListener ( sensor ,  'over' ,  matchFlow ) ; 
83+ 			addFlowListener ( sensor ,  'under' ,  matchFlow ) ; 
84+ 			addFlowListener ( sensor . firstElementChild ,  'over' ,  matchFlow ) ; 
85+ 			addFlowListener ( sensor . lastElementChild ,  'under' ,  matchFlow ) ; 	
86+ 			element . appendChild ( sensor ) ; 
87+ 			matchFlow ( { } ) ; 
88+ 		} 
89+ 		var  events  =  element . _flowEvents  ||  ( element . _flowEvents  =  [ ] ) ; 
90+ 		if  ( events . indexOf ( fn )  ==  - 1 )  events . push ( fn ) ; 
91+ 		if  ( ! resize )  element . addEventListener ( 'resize' ,  fn ,  false ) ; 
92+ 		element . onresize  =  function ( e ) { 
93+ 			events . forEach ( function ( fn ) { 
94+ 				fn . call ( element ,  e ) ; 
95+ 			} ) ; 
96+ 		} ; 
97+ 	} ; 
98+ 	
99+ 	function  removeResizeListener ( element ,  fn ) { 
100+ 		var  index  =  element . _flowEvents . indexOf ( fn ) ; 
101+ 		if  ( index  >  - 1 )  element . _flowEvents . splice ( index ,  1 ) ; 
102+ 		if  ( ! element . _flowEvents . length )  { 
103+ 			var  sensor  =  element . _resizeSensor ; 
104+ 			if  ( sensor )  { 
105+ 				element . removeChild ( sensor ) ; 
106+ 				if  ( sensor . _resetPosition )  element . style . position  =  'static' ; 
107+ 				delete  element . _resizeSensor ; 
108+ 			} 
109+ 			if  ( 'onresize'  in  element )  element . onresize  =  null ; 
110+ 			delete  element . _flowEvents ; 
111+ 		} 
112+ 		element . removeEventListener ( 'resize' ,  fn ) ; 
113+ 	} ; 
114+ 	
115+ } (  jQuery  ) ) ; 
0 commit comments