embd/bower_components/gumby/js/libs/ui/gumby.retina.js

82 lines
1.9 KiB
JavaScript

/**
* Gumby Retina
*/
!function($) {
'use strict';
function Retina($el) {
Gumby.debug('Initializing Retina', $el);
this.$el = $el;
this.imageSrc = this.$el.attr('src');
this.retinaSrc = this.fetchRetinaImage();
this.$retinaImg = $(new Image());
var scope = this;
// image src not valid
if(!this.retinaSrc) {
return false;
}
// load retina image
this.$retinaImg.attr('src', this.retinaSrc).load(function() {
scope.retinaImageLoaded();
}).error(function() {
Gumby.error('Couln\'t load retina image: '+scope.retinaSrc);
});
}
// fetch retina src by appending '@2x' to image string before extension
Retina.prototype.fetchRetinaImage = function() {
var imgSrc = this.imageSrc,
index = this.imageSrc.search(/(\.|\/)(gif|jpe?g|png)$/i);
// image src is not valid
if(index < 0) {
return false;
}
// return retina src
return imgSrc.substr(0, index) + '@2x' + imgSrc.substr(index, imgSrc.length);
};
// once retina image loaded swap original src
Retina.prototype.retinaImageLoaded = function() {
Gumby.debug('Swapping image for retina version', this.$el);
Gumby.debug('Triggering onRetina event', this.$el);
this.$el.attr('src', this.$retinaImg.attr('src')).trigger('gumby.onRetina');
};
// add initialisation
Gumby.addInitalisation('retina', function() {
// this module is for retina devices only
if(!window.devicePixelRatio || window.devicePixelRatio <= 1) {
return;
}
$('img[data-retina],img[gumby-retina],img[retina]').each(function() {
var $this = $(this);
// this element has already been initialized
if($this.data('isRetina')) {
return true;
}
// mark element as initialized
$this.data('isRetina', true);
new Retina($this);
});
});
// register UI module
Gumby.UIModule({
module: 'retina',
events: ['onRetina'],
init: function() {
Gumby.initialize('retina');
}
});
}(jQuery);