holder_rails 2.2.0 → 2.3.0

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.
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