holder_rails 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00cf2580599d5337218784c8efbcec34e86e3acc
4
- data.tar.gz: aa74c9d961f3566c10d3889303a102656103e066
3
+ metadata.gz: 3da663fd410589a49f7a76619dce16e13366e2a8
4
+ data.tar.gz: b40a90454d388b61a624dc0c879d093f48d2e5a3
5
5
  SHA512:
6
- metadata.gz: d02496241c1759caab3976f6f848b166bccf32b39f1f17d5f5a287f8e0fcf56fc612156ee4bc99925a0e7b286cab60ad4c7130a757782a39339e2d83434d1eee
7
- data.tar.gz: 611b7fbea28db0b8a1944b598a0386330f2a3538c7134f17bfb0689574390db6a97f83375ba730b8d421e182c1dac72a7bfbfddbcc53cd4f10a4016a56c0d203
6
+ metadata.gz: 054eaf54f3e1eff00e96f9dd4452c41f36cb80d83b557c7f494d52702f8dd0533b9ff4d1ab2951955974959f0c90a799f514fa9012ef753ae3826b25810d3975
7
+ data.tar.gz: bcc3c6d368097eceda372161e27e2f574d1b640d57964fc803f7a7feff2b18f04519815250cd8208556382a4398aeabeeba9bbfb2ec9ff0c0e84fb1f87383c2c
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2013 Nihad Abbasov <mail@narkoz.me>
1
+ Copyright (c) 2012-2014 Nihad Abbasov <mail@narkoz.me>
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
@@ -1,3 +1,3 @@
1
1
  module HolderRails
2
- VERSION = "2.2.0"
2
+ VERSION = "2.3.0"
3
3
  end
@@ -1,35 +1,44 @@
1
1
  /*
2
2
 
3
- Holder - 2.2 - client side image placeholders
4
- (c) 2012-2013 Ivan Malopinsky / http://imsky.co
3
+ Holder - 2.3 - client side image placeholders
4
+ (c) 2012-2014 Ivan Malopinsky / http://imsky.co
5
5
 
6
6
  Provided under the MIT License.
7
7
  Commercial use requires attribution.
8
8
 
9
9
  */
10
-
11
10
  var Holder = Holder || {};
12
11
  (function (app, win) {
13
12
 
14
- var preempted = false,
15
- fallback = false,
13
+ var system_config = {
14
+ use_svg: false,
15
+ use_canvas: false,
16
+ use_fallback: false
17
+ };
18
+ var instance_config = {};
19
+ var preempted = false;
16
20
  canvas = document.createElement('canvas');
17
21
  var dpr = 1, bsr = 1;
18
22
  var resizable_images = [];
19
23
 
20
24
  if (!canvas.getContext) {
21
- fallback = true;
25
+ system_config.use_fallback = true;
22
26
  } else {
23
27
  if (canvas.toDataURL("image/png")
24
28
  .indexOf("data:image/png") < 0) {
25
29
  //Android doesn't support data URI
26
- fallback = true;
30
+ system_config.use_fallback = true;
27
31
  } else {
28
32
  var ctx = canvas.getContext("2d");
29
33
  }
30
34
  }
31
35
 
32
- if(!fallback){
36
+ if(!!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect){
37
+ system_config.use_svg = true;
38
+ system_config.use_canvas = false;
39
+ }
40
+
41
+ if(!system_config.use_fallback){
33
42
  dpr = window.devicePixelRatio || 1,
34
43
  bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
35
44
  }
@@ -129,46 +138,6 @@ app.flags = {
129
138
  }
130
139
  }
131
140
 
132
- //getElementsByClassName polyfill
133
- document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})
134
-
135
- //getComputedStyle polyfill
136
- window.getComputedStyle||(window.getComputedStyle=function(e){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})
137
-
138
- //http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
139
- function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}}
140
-
141
- //https://gist.github.com/991057 by Jed Schmidt with modifications
142
- function selector(a){
143
- a=a.match(/^(\W)?(.*)/);var b=document["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2]);
144
- var ret=[]; b!==null&&(b.length?ret=b:b.length===0?ret=b:ret=[b]); return ret;
145
- }
146
-
147
- //shallow object property extend
148
- function extend(a,b){
149
- var c={};
150
- for(var i in a){
151
- if(a.hasOwnProperty(i)){
152
- c[i]=a[i];
153
- }
154
- }
155
- for(var i in b){
156
- if(b.hasOwnProperty(i)){
157
- c[i]=b[i];
158
- }
159
- }
160
- return c
161
- }
162
-
163
- //hasOwnProperty polyfill
164
- if (!Object.prototype.hasOwnProperty)
165
- /*jshint -W001, -W103 */
166
- Object.prototype.hasOwnProperty = function(prop) {
167
- var proto = this.__proto__ || this.constructor.prototype;
168
- return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
169
- }
170
- /*jshint +W001, +W103 */
171
-
172
141
  function text_size(width, height, template) {
173
142
  height = parseInt(height, 10);
174
143
  width = parseInt(width, 10);
@@ -181,20 +150,64 @@ function text_size(width, height, template) {
181
150
  }
182
151
  }
183
152
 
184
- function draw(args) {
185
- var ctx = args.ctx;
186
- var dimensions = args.dimensions;
187
- var template = args.template;
188
- var ratio = args.ratio;
189
- var holder = args.holder;
190
- var literal = holder.textmode == "literal";
191
- var exact = holder.textmode == "exact";
153
+ var svg_el = (function(){
154
+ var serializer = new XMLSerializer();
155
+ var svg_ns = "http://www.w3.org/2000/svg"
156
+ var svg = document.createElementNS(svg_ns, "svg");
157
+ svg.setAttribute("xmlns", "http://www.w3.org/2000/svg")
158
+ svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
159
+ var bg_el = document.createElementNS(svg_ns, "rect")
160
+ var text_el = document.createElementNS(svg_ns, "text")
161
+ var textnode_el = document.createTextNode(null)
162
+ text_el.setAttribute("text-anchor", "middle")
163
+ text_el.appendChild(textnode_el)
164
+ svg.appendChild(bg_el)
165
+ svg.appendChild(text_el)
166
+
167
+ return function(props){
168
+ svg.setAttribute("width",props.width);
169
+ svg.setAttribute("height", props.height);
170
+ bg_el.setAttribute("width", props.width);
171
+ bg_el.setAttribute("height", props.height);
172
+ bg_el.setAttribute("fill", props.template.background);
173
+ text_el.setAttribute("x", props.width/2)
174
+ text_el.setAttribute("y", props.height/2)
175
+ textnode_el.nodeValue=props.text
176
+ text_el.setAttribute("style", css_properties({
177
+ "fill": props.template.foreground,
178
+ "font-weight": "bold",
179
+ "font-size": props.text_height+"px",
180
+ "font-family":props.font,
181
+ "dominant-baseline":"central"
182
+ }))
183
+ return serializer.serializeToString(svg)
184
+ }
185
+ })()
186
+
187
+ function css_properties(props){
188
+ var ret = [];
189
+ for(p in props){
190
+ if(props.hasOwnProperty(p)){
191
+ ret.push(p+":"+props[p])
192
+ }
193
+ }
194
+ return ret.join(";")
195
+ }
196
+
197
+ function draw_canvas(args) {
198
+ var ctx = args.ctx,
199
+ dimensions = args.dimensions,
200
+ template = args.template,
201
+ ratio = args.ratio,
202
+ holder = args.holder,
203
+ literal = holder.textmode == "literal",
204
+ exact = holder.textmode == "exact";
192
205
 
193
206
  var ts = text_size(dimensions.width, dimensions.height, template);
194
207
  var text_height = ts.height;
195
208
  var width = dimensions.width * ratio,
196
209
  height = dimensions.height * ratio;
197
- var font = template.font ? template.font : "sans-serif";
210
+ var font = template.font ? template.font : "Arial,Helvetica,sans-serif";
198
211
  canvas.width = width;
199
212
  canvas.height = height;
200
213
  ctx.textAlign = "center";
@@ -222,8 +235,50 @@ function draw(args) {
222
235
  return canvas.toDataURL("image/png");
223
236
  }
224
237
 
225
- function render(mode, el, holder, src) {
238
+ function draw_svg(args){
239
+ var dimensions = args.dimensions,
240
+ template = args.template,
241
+ holder = args.holder,
242
+ literal = holder.textmode == "literal",
243
+ exact = holder.textmode == "exact";
244
+
245
+ var ts = text_size(dimensions.width, dimensions.height, template);
246
+ var text_height = ts.height;
247
+ var width = dimensions.width,
248
+ height = dimensions.height;
249
+
250
+ var font = template.font ? template.font : "Arial,Helvetica,sans-serif";
251
+ var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height));
226
252
 
253
+ if (literal) {
254
+ var dimensions = holder.dimensions;
255
+ text = dimensions.width + "x" + dimensions.height;
256
+ }
257
+ else if(exact && holder.exact_dimensions){
258
+ var dimensions = holder.exact_dimensions;
259
+ text = (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height));
260
+ }
261
+ var string = svg_el({
262
+ text: text,
263
+ width:width,
264
+ height:height,
265
+ text_height:text_height,
266
+ font:font,
267
+ template:template
268
+ })
269
+ return "data:image/svg+xml;base64,"+btoa(string);
270
+ }
271
+
272
+ function draw(args) {
273
+ if(instance_config.use_canvas && !instance_config.use_svg){
274
+ return draw_canvas(args);
275
+ }
276
+ else{
277
+ return draw_svg(args);
278
+ }
279
+ }
280
+
281
+ function render(mode, el, holder, src) {
227
282
  var dimensions = holder.dimensions,
228
283
  theme = holder.theme,
229
284
  text = holder.text ? decodeURIComponent(holder.text) : holder.text;
@@ -240,11 +295,11 @@ function render(mode, el, holder, src) {
240
295
 
241
296
  if (mode == "image") {
242
297
  el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
243
- if (fallback || !holder.auto) {
298
+ if (instance_config.use_fallback || !holder.auto) {
244
299
  el.style.width = dimensions.width + "px";
245
300
  el.style.height = dimensions.height + "px";
246
301
  }
247
- if (fallback) {
302
+ if (instance_config.use_fallback) {
248
303
  el.style.backgroundColor = theme.background;
249
304
  } else {
250
305
  el.setAttribute("src", draw({ctx: ctx, dimensions: dimensions, template: theme, ratio:ratio, holder: holder}));
@@ -256,7 +311,7 @@ function render(mode, el, holder, src) {
256
311
 
257
312
  }
258
313
  } else if (mode == "background") {
259
- if (!fallback) {
314
+ if (!instance_config.use_fallback) {
260
315
  el.style.backgroundImage = "url(" + draw({ctx:ctx, dimensions: dimensions, template: theme, ratio: ratio, holder: holder}) + ")";
261
316
  el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px";
262
317
  }
@@ -264,18 +319,21 @@ function render(mode, el, holder, src) {
264
319
  el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
265
320
  if (dimensions.height.slice(-1) == "%") {
266
321
  el.style.height = dimensions.height
267
- } else {
322
+ } else if(holder.auto == null || !holder.auto){
268
323
  el.style.height = dimensions.height + "px"
269
324
  }
270
325
  if (dimensions.width.slice(-1) == "%") {
271
326
  el.style.width = dimensions.width
272
- } else {
327
+ } else if(holder.auto == null || !holder.auto){
273
328
  el.style.width = dimensions.width + "px"
274
329
  }
275
330
  if (el.style.display == "inline" || el.style.display === "" || el.style.display == "none") {
276
331
  el.style.display = "block";
277
332
  }
278
- if (fallback) {
333
+
334
+ set_initial_dimensions(el)
335
+
336
+ if (instance_config.use_fallback) {
279
337
  el.style.backgroundColor = theme.background;
280
338
  } else {
281
339
  resizable_images.push(el);
@@ -290,19 +348,36 @@ function dimension_check(el, callback) {
290
348
  width: el.clientWidth
291
349
  };
292
350
  if (!dimensions.height && !dimensions.width) {
293
- if (el.hasAttribute("data-holder-invisible")) {
294
- throw new Error("Holder: placeholder is not visible");
295
- } else {
296
- el.setAttribute("data-holder-invisible", true)
297
- setTimeout(function () {
298
- callback.call(this, el)
299
- }, 1)
300
- return null;
301
- }
302
- } else {
351
+ el.setAttribute("data-holder-invisible", true)
352
+ callback.call(this, el)
353
+ }
354
+ else{
303
355
  el.removeAttribute("data-holder-invisible")
356
+ return dimensions;
357
+ }
358
+ }
359
+
360
+ function set_initial_dimensions(el){
361
+ if(el.holder_data){
362
+ var dimensions = dimension_check(el, app.invisible_error_fn( set_initial_dimensions))
363
+ if(dimensions){
364
+ var holder = el.holder_data;
365
+ holder.initial_dimensions = dimensions;
366
+ holder.fluid_data = {
367
+ fluid_height: holder.dimensions.height.slice(-1) == "%",
368
+ fluid_width: holder.dimensions.width.slice(-1) == "%",
369
+ mode: null
370
+ }
371
+ if(holder.fluid_data.fluid_width && !holder.fluid_data.fluid_height){
372
+ holder.fluid_data.mode = "width"
373
+ holder.fluid_data.ratio = holder.initial_dimensions.width / parseFloat(holder.dimensions.height)
374
+ }
375
+ else if(!holder.fluid_data.fluid_width && holder.fluid_data.fluid_height){
376
+ holder.fluid_data.mode = "height";
377
+ holder.fluid_data.ratio = parseFloat(holder.dimensions.width) / holder.initial_dimensions.height
378
+ }
379
+ }
304
380
  }
305
- return dimensions;
306
381
  }
307
382
 
308
383
  function resizable_update(element) {
@@ -319,9 +394,19 @@ function resizable_update(element) {
319
394
  var el = images[i]
320
395
  if (el.holder_data) {
321
396
  var holder = el.holder_data;
322
- var dimensions = dimension_check(el, resizable_update)
397
+ var dimensions = dimension_check(el, app.invisible_error_fn( resizable_update))
323
398
  if(dimensions){
324
399
  if(holder.fluid){
400
+ if(holder.auto){
401
+ switch(holder.fluid_data.mode){
402
+ case "width":
403
+ dimensions.height = dimensions.width / holder.fluid_data.ratio;
404
+ break;
405
+ case "height":
406
+ dimensions.width = dimensions.height * holder.fluid_data.ratio;
407
+ break;
408
+ }
409
+ }
325
410
  el.setAttribute("src", draw({
326
411
  ctx: ctx,
327
412
  dimensions: dimensions,
@@ -350,7 +435,7 @@ function parse_flags(flags, options) {
350
435
  theme: extend(settings.themes.gray, {})
351
436
  };
352
437
  var render = false;
353
- for (sl = flags.length, j = 0; j < sl; j++) {
438
+ for (var fl = flags.length, j = 0; j < fl; j++) {
354
439
  var flag = flags[j];
355
440
  if (app.flags.dimensions.match(flag)) {
356
441
  render = true;
@@ -385,10 +470,20 @@ for (var flag in app.flags) {
385
470
  return val.match(this.regex)
386
471
  }
387
472
  }
473
+
474
+ app.invisible_error_fn = function(fn){
475
+ return function(el){
476
+ if(el.hasAttribute("data-holder-invisible")){
477
+ throw new Error("Holder: invisible placeholder")
478
+ }
479
+ }
480
+ }
481
+
388
482
  app.add_theme = function (name, theme) {
389
483
  name != null && theme != null && (settings.themes[name] = theme);
390
484
  return app;
391
485
  };
486
+
392
487
  app.add_image = function (src, el) {
393
488
  var node = selector(el);
394
489
  if (node.length) {
@@ -400,21 +495,31 @@ app.add_image = function (src, el) {
400
495
  }
401
496
  return app;
402
497
  };
498
+
403
499
  app.run = function (o) {
500
+ instance_config = extend({}, system_config)
404
501
  preempted = true;
405
-
502
+
406
503
  var options = extend(settings, o),
407
504
  images = [],
408
505
  imageNodes = [],
409
506
  bgnodes = [];
507
+
508
+ if(options.use_canvas != null && options.use_canvas){
509
+ instance_config.use_canvas = true;
510
+ instance_config.use_svg = false;
511
+ }
512
+
410
513
  if (typeof (options.images) == "string") {
411
514
  imageNodes = selector(options.images);
412
515
  } else if (window.NodeList && options.images instanceof window.NodeList) {
413
516
  imageNodes = options.images;
414
517
  } else if (window.Node && options.images instanceof window.Node) {
415
518
  imageNodes = [options.images];
519
+ } else if(window.HTMLCollection && options.images instanceof window.HTMLCollection){
520
+ imageNodes = options.images
416
521
  }
417
-
522
+
418
523
  if (typeof (options.bgnodes) == "string") {
419
524
  bgnodes = selector(options.bgnodes);
420
525
  } else if (window.NodeList && options.elements instanceof window.NodeList) {
@@ -469,8 +574,7 @@ app.run = function (o) {
469
574
  src = attr_datasrc;
470
575
  }
471
576
  if (src) {
472
- var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1)
473
- .split("/"), options);
577
+ var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1).split("/"), options);
474
578
  if (holder) {
475
579
  if (holder.fluid) {
476
580
  render("fluid", images[i], holder, src)
@@ -482,6 +586,7 @@ app.run = function (o) {
482
586
  }
483
587
  return app;
484
588
  };
589
+
485
590
  contentLoaded(win, function () {
486
591
  if (window.addEventListener) {
487
592
  window.addEventListener("resize", resizable_update, false);
@@ -489,7 +594,7 @@ contentLoaded(win, function () {
489
594
  } else {
490
595
  window.attachEvent("onresize", resizable_update)
491
596
  }
492
- preempted || app.run();
597
+ preempted || app.run({});
493
598
  });
494
599
  if (typeof define === "function" && define.amd) {
495
600
  define([], function () {
@@ -497,4 +602,44 @@ if (typeof define === "function" && define.amd) {
497
602
  });
498
603
  }
499
604
 
605
+ //github.com/davidchambers/Base64.js
606
+ (function(){function t(t){this.message=t}var e="undefined"!=typeof exports?exports:this,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.prototype=Error(),t.prototype.name="InvalidCharacterError",e.btoa||(e.btoa=function(e){for(var o,n,a=0,i=r,c="";e.charAt(0|a)||(i="=",a%1);c+=i.charAt(63&o>>8-8*(a%1))){if(n=e.charCodeAt(a+=.75),n>255)throw new t("'btoa' failed");o=o<<8|n}return c}),e.atob||(e.atob=function(e){if(e=e.replace(/=+$/,""),1==e.length%4)throw new t("'atob' failed");for(var o,n,a=0,i=0,c="";n=e.charAt(i++);~n&&(o=a%4?64*o+n:n,a++%4)?c+=String.fromCharCode(255&o>>(6&-2*a)):0)n=r.indexOf(n);return c})})();
607
+
608
+ //getElementsByClassName polyfill
609
+ document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})
610
+
611
+ //getComputedStyle polyfill
612
+ window.getComputedStyle||(window.getComputedStyle=function(e){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})
613
+
614
+ //http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
615
+ function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}}
616
+
617
+ //https://gist.github.com/991057 by Jed Schmidt with modifications
618
+ function selector(a,b){var a=a.match(/^(\W)?(.*)/),b=b||document,c=b["getElement"+(a[1]?"#"==a[1]?"ById":"sByClassName":"sByTagName")],d=c.call(b,a[2]),e=[];return null!==d&&(e=d.length||0===d.length?d:[d]),e}
619
+
620
+ //shallow object property extend
621
+ function extend(a,b){
622
+ var c={};
623
+ for(var i in a){
624
+ if(a.hasOwnProperty(i)){
625
+ c[i]=a[i];
626
+ }
627
+ }
628
+ for(var i in b){
629
+ if(b.hasOwnProperty(i)){
630
+ c[i]=b[i];
631
+ }
632
+ }
633
+ return c
634
+ }
635
+
636
+ //hasOwnProperty polyfill
637
+ if (!Object.prototype.hasOwnProperty)
638
+ /*jshint -W001, -W103 */
639
+ Object.prototype.hasOwnProperty = function(prop) {
640
+ var proto = this.__proto__ || this.constructor.prototype;
641
+ return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
642
+ }
643
+ /*jshint +W001, +W103 */
644
+
500
645
  })(Holder, window);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: holder_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nihad Abbasov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-22 00:00:00.000000000 Z
11
+ date: 2014-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
62
  version: '0'
63
63
  requirements: []
64
64
  rubyforge_project:
65
- rubygems_version: 2.1.7
65
+ rubygems_version: 2.0.0
66
66
  signing_key:
67
67
  specification_version: 4
68
68
  summary: Holder.js for Rails 3.1 asset pipeline