match_media_js 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,18 +1,46 @@
1
1
  # match_media_js
2
2
  a ruby gem for use in rails 3.2
3
3
 
4
+ It's a hack-gem with css3 polyfills and javascript libraries to get a css3 responsive site behaving with IE8.
5
+
4
6
  Gemfile
7
+
5
8
  gem 'match_media_js'
6
9
 
7
- application.js
10
+ application.js (this is all the libraries in the right order-- match media needs to be before enquire)
11
+
12
+ //= require match_media_js
13
+
14
+ Individual Libaraies
15
+
8
16
  //= require match_media
17
+ //= require respond
18
+ //= require enquire
19
+
9
20
 
10
21
  Individual Files
22
+
11
23
  //= require match_media/matchMedia
12
24
  //= require match_media/matchMedia.addListener
13
25
 
26
+ Background Size Polyfill (IE8)
27
+
28
+ Source is available at /assets/background_size/backgroundsize.src.htc and minified prefered as default
29
+
30
+ .selector {
31
+ background-size: cover;
32
+ /* absolute url */
33
+ -ms-behavior: url(/assets/background_size/backgroundsize.htc);
34
+ }
35
+
36
+
14
37
  License: MIT (http://www.opensource.org/licenses/mit-license.php)
15
38
 
16
39
 
17
- Original repository: [github.com/paulirish/matchMedia.js](https://github.com/paulirish/matchMedia.js)
40
+ Original repositories:
41
+ [github.com/paulirish/matchMedia.js](https://github.com/paulirish/matchMedia.js)
42
+ [github.com/scottjehl/Respond](https://github.com/scottjehl/Respond)
43
+ [github.com/WickyNilliams/enquire.js/](https://github.com/WickyNilliams/enquire.js/)
44
+
45
+ [github.com/louisremi/background-size-polyfill](https://github.com/louisremi/background-size-polyfill)
18
46
 
@@ -1,3 +1,3 @@
1
1
  module MatchMediaJs
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,7 @@
1
+ <component lightWeight="true">
2
+ <attach event="onpropertychange" onevent="handlePropertychange()" />
3
+ <attach event="ondetach" onevent="restore()" />
4
+ <attach event="onresize" for="window" onevent="handleResize()" />
5
+ <script type="text/javascript">
6
+ var rsrc=/url\(["']?(.*?)["']?\)/,positions={top:0,left:0,bottom:1,right:1,center:0.5},doc=element.document;init(); function init(){var b=doc.createElement("div"),a=doc.createElement("img"),c,d;b.style.position="absolute";b.style.zIndex=-1;b.style.top=0;b.style.right=0;b.style.left=0;b.style.bottom=0;b.style.overflow="hidden";a.style.position="absolute";a.style.width=a.style.width="auto";b.appendChild(a);element.insertBefore(b,element.firstChild);d=[element.currentStyle.backgroundPositionX,element.currentStyle.backgroundPositionY];element.bgsExpando=c={wrapper:b,img:a,backgroundSize:element.currentStyle["background-size"], backgroundPositionX:positions[d[0]]||parseFloat(d[0])/100,backgroundPositionY:positions[d[1]]||parseFloat(d[1])/100};"auto"==element.currentStyle.zIndex&&(element.style.zIndex=0);"static"==element.currentStyle.position&&(element.style.position="relative");refreshDisplay(element,c)&&(refreshDimensions(element,c),refreshBackgroundImage(element,c,function(){updateBackground(element,c)}))} function refreshDisplay(b,a){var c=b.currentStyle.display;c!=a.display&&(a.display=c,a.somethingChanged=!0);return"none"!=c}function refreshDimensions(b,a){var c=b.offsetWidth-(parseFloat(b.currentStyle.borderLeftWidth)||0)-(parseFloat(b.currentStyle.borderRightWidth)||0),d=b.offsetHeight-(parseFloat(b.currentStyle.borderTopWidth)||0)-(parseFloat(b.currentStyle.borderBottomWidth)||0);if(c!=a.innerWidth||d!=a.innerHeight)a.innerWidth=c,a.innerHeight=d,a.somethingChanged=!0} function refreshBackgroundImage(b,a,c){var d=a.img,e=(rsrc.exec(b.currentStyle.backgroundImage)||[])[1];if(e&&e!=a.backgroundSrc){a.backgroundSrc=e;a.somethingChanged=!0;d.onload=function(){var b=d.width,e=d.height;1==b&&1==e||(a.imgWidth=b,a.imgHeight=e,a.constrain=!1,c(),d.style.visibility="visible",d.onload=null)};d.style.visibility="hidden";d.src=a.backgroundSrc;if(d.readyState||d.complete)d.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",d.src=a.backgroundSrc;a.ignoreNextPropertyChange= !0;b.style.backgroundImage="none"}else c()} function updateBackground(b,a){if(a.somethingChanged){var c=a.img,d=a.innerWidth/a.innerHeight,e=a.imgWidth/a.imgHeight,f=a.constrain;"contain"==a.backgroundSize?e>d?(a.constrain=d="width",e=Math.floor((a.innerHeight-a.innerWidth/e)*a.backgroundPositionY),c.style.top=e+"px",d!=f&&(c.style.width="100%",c.style.height="auto",c.style.left=0)):(a.constrain=d="height",e=Math.floor((a.innerWidth-a.innerHeight*e)*a.backgroundPositionX),c.style.left=e+"px",d!=f&&(c.style.width="auto",c.style.height="100%", c.style.top=0)):"cover"==a.backgroundSize&&(e>d?(a.constrain=d="height",e=Math.floor((a.innerHeight*e-a.innerWidth)*a.backgroundPositionX),c.style.left=-e+"px",d!=f&&(c.style.width="auto",c.style.height="100%",c.style.top=0)):(a.constrain=d="width",e=Math.floor((a.innerWidth/e-a.innerHeight)*a.backgroundPositionY),c.style.top=-e+"px",d!=f&&(c.style.width="100%",c.style.height="auto",c.style.left=0)));a.somethingChanged=!1}} function handlePropertychange(){var b=element.bgsExpando;b.ignoreNextPropertyChange?b.ignoreNextPropertyChange=!1:refreshDisplay(element,b)&&(refreshDimensions(element,b),refreshBackgroundImage(element,b,function(){updateBackground(element,b)}))}function handleResize(){var b=element.bgsExpando;"none"!=b.display&&(refreshDimensions(element,b),updateBackground(element,b))} function restore(){var b=element.bgsExpando;try{element.style.backgroundImage="url('"+b.backgroundSrc+"')",element.removeChild(b.wrapper),element.bgsExpando=null}catch(a){}};
7
+ </script>
@@ -0,0 +1,271 @@
1
+ <component lightWeight="true">
2
+ <attach event="onpropertychange" onevent="handlePropertychange()" />
3
+ <attach event="ondetach" onevent="restore()" />
4
+ <attach event="onresize" for="window" onevent="handleResize()" />
5
+ <script type="text/javascript">
6
+
7
+ var rsrc = /url\(["']?(.*?)["']?\)/,
8
+ positions = {
9
+ top: 0,
10
+ left: 0,
11
+ bottom: 1,
12
+ right: 1,
13
+ center: .5
14
+ },
15
+ doc = element.document;
16
+
17
+ init();
18
+
19
+ // remove the background-image and emulate it with a wrapped <img/>
20
+ function init() {
21
+ var wrapper = doc.createElement( "div" ),
22
+ img = doc.createElement( "img" ),
23
+ expando,
24
+ pos;
25
+
26
+ wrapper.style.position = "absolute";
27
+ wrapper.style.zIndex = -1;
28
+ wrapper.style.top = 0;
29
+ wrapper.style.right = 0;
30
+ wrapper.style.left = 0;
31
+ wrapper.style.bottom = 0;
32
+ wrapper.style.overflow = "hidden";
33
+
34
+ img.alt = "";
35
+ img.style.position = "absolute";
36
+ img.style.width = img.style.width = "auto";
37
+
38
+ wrapper.appendChild( img );
39
+
40
+ element.insertBefore( wrapper, element.firstChild );
41
+
42
+ pos = [
43
+ element.currentStyle.backgroundPositionX,
44
+ element.currentStyle.backgroundPositionY
45
+ ];
46
+
47
+ // save useful data for quick access
48
+ element.bgsExpando = expando = {
49
+ wrapper: wrapper,
50
+ img: img,
51
+ backgroundSize: element.currentStyle['background-size'],
52
+ // Only keywords or percentage values are supported
53
+ backgroundPositionX: positions[ pos[0] ] || parseFloat( pos[0] ) / 100,
54
+ backgroundPositionY: positions[ pos[1] ] || parseFloat( pos[1] ) / 100
55
+ };
56
+
57
+ // This is the part where we mess with the existing DOM
58
+ // to make sure that the background image is correctly zIndexed
59
+ if ( element.currentStyle.zIndex == "auto" ) {
60
+ element.style.zIndex = 0;
61
+ }
62
+ if ( element.currentStyle.position == "static" ) {
63
+ element.style.position = "relative";
64
+ }
65
+
66
+ if ( refreshDisplay( element, expando ) ) {
67
+ refreshDimensions( element, expando );
68
+ refreshBackgroundImage( element, expando, function() {
69
+ updateBackground( element, expando );
70
+ });
71
+ }
72
+ }
73
+
74
+ function refreshDisplay( element, expando ) {
75
+ var display = element.currentStyle.display;
76
+
77
+ if ( display != expando.display ) {
78
+ expando.display = display;
79
+ expando.somethingChanged = true;
80
+ }
81
+
82
+ return display != "none";
83
+ }
84
+
85
+ function refreshDimensions( element, expando ) {
86
+ var innerWidth = element.offsetWidth
87
+ - ( parseFloat( element.currentStyle.borderLeftWidth ) || 0 )
88
+ - ( parseFloat( element.currentStyle.borderRightWidth ) || 0 ),
89
+ innerHeight = element.offsetHeight
90
+ - ( parseFloat( element.currentStyle.borderTopWidth ) || 0 )
91
+ - ( parseFloat( element.currentStyle.borderBottomWidth ) || 0 );
92
+
93
+ if ( innerWidth != expando.innerWidth || innerHeight != expando.innerHeight ) {
94
+ expando.innerWidth = innerWidth;
95
+ expando.innerHeight = innerHeight;
96
+ expando.somethingChanged = true;
97
+ }
98
+ }
99
+
100
+ function refreshBackgroundImage( element, expando, callback ) {
101
+ var img = expando.img,
102
+ src = ( rsrc.exec( element.currentStyle.backgroundImage ) || [] )[1];
103
+
104
+ if ( src && src != expando.backgroundSrc ) {
105
+ expando.backgroundSrc = src;
106
+ expando.somethingChanged = true;
107
+
108
+ img.onload = function() {
109
+ var width = img.width,
110
+ height = img.height;
111
+
112
+ // ignore onload on the proxy image
113
+ if ( width == 1 && height == 1 ) { return; }
114
+
115
+ expando.imgWidth = width;
116
+ expando.imgHeight = height;
117
+ expando.constrain = false;
118
+
119
+ callback();
120
+
121
+ img.style.visibility = "visible";
122
+ img.onload = null;
123
+ };
124
+
125
+ img.style.visibility = "hidden";
126
+ img.src = expando.backgroundSrc;
127
+
128
+ // force onload execution
129
+ if ( img.readyState || img.complete ) {
130
+ img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
131
+ img.src = expando.backgroundSrc;
132
+ }
133
+
134
+ expando.ignoreNextPropertyChange = true;
135
+ element.style.backgroundImage = "none";
136
+
137
+ } else {
138
+ // the callback should be exacuted in all cases
139
+ callback();
140
+ }
141
+ }
142
+
143
+ function updateBackground( element, expando ) {
144
+ if ( !expando.somethingChanged ) { return; }
145
+
146
+ var img = expando.img,
147
+ elemRatio = expando.innerWidth / expando.innerHeight,
148
+ imgRatio = expando.imgWidth / expando.imgHeight,
149
+ prevConstrain = expando.constrain,
150
+ curConstrain,
151
+ delta;
152
+
153
+ if ( expando.backgroundSize == "contain" ) {
154
+ if ( imgRatio > elemRatio ) {
155
+ expando.constrain = curConstrain = "width";
156
+
157
+ delta = Math.floor(
158
+ ( expando.innerHeight - expando.innerWidth / imgRatio )
159
+ * expando.backgroundPositionY
160
+ );
161
+
162
+ img.style.top = delta + "px";
163
+
164
+ // when switching from height to width constraint,
165
+ // make sure to release constraint on height and reset left
166
+ if ( curConstrain != prevConstrain ) {
167
+ img.style.width = "100%";
168
+ img.style.height = "auto";
169
+ img.style.left = 0;
170
+ }
171
+
172
+ // elemRatio > imgRatio
173
+ } else {
174
+ expando.constrain = curConstrain = "height";
175
+
176
+ delta = Math.floor(
177
+ ( expando.innerWidth - expando.innerHeight * imgRatio )
178
+ * expando.backgroundPositionX
179
+ );
180
+
181
+ img.style.left = delta + "px";
182
+
183
+ if ( curConstrain != prevConstrain ) {
184
+ img.style.width = "auto";
185
+ img.style.height = "100%";
186
+ img.style.top = 0;
187
+ }
188
+ }
189
+
190
+ } else if ( expando.backgroundSize == "cover" ) {
191
+ if ( imgRatio > elemRatio ) {
192
+ expando.constrain = curConstrain = "height";
193
+
194
+ delta = Math.floor(
195
+ ( expando.innerHeight * imgRatio - expando.innerWidth )
196
+ * expando.backgroundPositionX
197
+ );
198
+
199
+ img.style.left = -delta + "px";
200
+
201
+ // when switching from height to width constraint,
202
+ // make sure to release constraint on height and reset left
203
+ if ( curConstrain != prevConstrain ) {
204
+ img.style.width = "auto";
205
+ img.style.height = "100%";
206
+ img.style.top = 0;
207
+ }
208
+
209
+ // elemRatio > imgRatio
210
+ } else {
211
+ expando.constrain = curConstrain = "width";
212
+
213
+ delta = Math.floor(
214
+ ( expando.innerWidth / imgRatio - expando.innerHeight )
215
+ * expando.backgroundPositionY
216
+ );
217
+
218
+ img.style.top = -delta + "px";
219
+
220
+ if ( curConstrain != prevConstrain ) {
221
+ img.style.width = "100%";
222
+ img.style.height = "auto";
223
+ img.style.left = 0;
224
+ }
225
+ }
226
+ }
227
+
228
+ expando.somethingChanged = false;
229
+ }
230
+
231
+ // handle different style changes
232
+ function handlePropertychange() {
233
+ var expando = element.bgsExpando;
234
+
235
+ // this prevents handling propertychange events caused by this script
236
+ // TODO: make it reliable
237
+ if ( expando.ignoreNextPropertyChange ) {
238
+ expando.ignoreNextPropertyChange = false;
239
+ return;
240
+ }
241
+
242
+ if ( refreshDisplay( element, expando ) ) {
243
+ refreshDimensions( element, expando );
244
+ refreshBackgroundImage( element, expando, function() {
245
+ updateBackground( element, expando );
246
+ });
247
+ }
248
+ }
249
+
250
+ function handleResize() {
251
+ // TODO: throttle resize events
252
+
253
+ var expando = element.bgsExpando;
254
+
255
+ if ( expando.display != "none" ) {
256
+ refreshDimensions( element, expando );
257
+ updateBackground( element, expando );
258
+ }
259
+ }
260
+
261
+ function restore() {
262
+ var expando = element.bgsExpando;
263
+
264
+ try {
265
+ element.style.backgroundImage = "url('" + expando.backgroundSrc + "')";
266
+ element.removeChild( expando.wrapper );
267
+ element.bgsExpando = null;
268
+ } catch(e) {}
269
+ }
270
+
271
+ </script>
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 3
9
- version: 0.0.3
8
+ - 4
9
+ version: 0.0.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - rheaton
@@ -42,6 +42,8 @@ extra_rdoc_files: []
42
42
  files:
43
43
  - lib/match_media_js/version.rb
44
44
  - lib/match_media_js.rb
45
+ - vendor/assets/javascripts/background_size/backgroundsize.htc
46
+ - vendor/assets/javascripts/background_size/backgroundsize.src.htc
45
47
  - vendor/assets/javascripts/enquire/enquire.js
46
48
  - vendor/assets/javascripts/enquire.js
47
49
  - vendor/assets/javascripts/match_media/matchMedia.addListener.js