/*! * Retina.js v1.3.0 * * Copyright 2014 Imulus, LLC * Released under the MIT license * * Retina.js is an open source script that makes it easy to serve * high-resolution images to devices with retina displays. */ (function() { var root = (typeof exports === 'undefined' ? window : exports); var config = { // An option to choose a suffix for 2x images retinaImageSuffix : '@2x', // Ensure Content-Type is an image before trying to load @2x image // https://github.com/imulus/retinajs/pull/45) check_mime_type: true, // Resize high-resolution images to original image's pixel dimensions // https://github.com/imulus/retinajs/issues/8 force_original_dimensions: true }; function Retina() {} root.Retina = Retina; Retina.configure = function(options) { if (options === null) { options = {}; } for (var prop in options) { if (options.hasOwnProperty(prop)) { config[prop] = options[prop]; } } }; Retina.init = function(context) { if (context === null) { context = root; } var existing_onload = context.onload || function(){}; context.onload = function() { var images = document.getElementsByTagName('img'), retinaImages = [], i, image; for (i = 0; i < images.length; i += 1) { image = images[i]; if (!!!image.getAttributeNode('data-no-retina')) { retinaImages.push(new RetinaImage(image)); } } existing_onload(); }; }; Retina.isRetina = function(){ var mediaQuery = '(-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-resolution: 1.5dppx)'; if (root.devicePixelRatio > 1) { return true; } if (root.matchMedia && root.matchMedia(mediaQuery).matches) { return true; } return false; }; var regexMatch = /\.\w+$/; function suffixReplace (match) { return config.retinaImageSuffix + match; } function RetinaImagePath(path, at_2x_path) { this.path = path || ''; if (typeof at_2x_path !== 'undefined' && at_2x_path !== null) { this.at_2x_path = at_2x_path; this.perform_check = false; } else { if (undefined !== document.createElement) { var locationObject = document.createElement('a'); locationObject.href = this.path; locationObject.pathname = locationObject.pathname.replace(regexMatch, suffixReplace); this.at_2x_path = locationObject.href; } else { var parts = this.path.split('?'); parts[0] = parts[0].replace(regexMatch, suffixReplace); this.at_2x_path = parts.join('?'); } this.perform_check = true; } } root.RetinaImagePath = RetinaImagePath; RetinaImagePath.confirmed_paths = []; RetinaImagePath.prototype.is_external = function() { return !!(this.path.match(/^https?\:/i) && !this.path.match('//' + document.domain) ); }; RetinaImagePath.prototype.check_2x_variant = function(callback) { var http, that = this; if (this.is_external()) { return callback(false); } else if (!this.perform_check && typeof this.at_2x_path !== 'undefined' && this.at_2x_path !== null) { return callback(true); } else if (this.at_2x_path in RetinaImagePath.confirmed_paths) { return callback(true); } else { http = new XMLHttpRequest(); http.open('HEAD', this.at_2x_path); http.onreadystatechange = function() { if (http.readyState !== 4) { return callback(false); } if (http.status >= 200 && http.status <= 399) { if (config.check_mime_type) { var type = http.getResponseHeader('Content-Type'); if (type === null || !type.match(/^image/i)) { return callback(false); } } RetinaImagePath.confirmed_paths.push(that.at_2x_path); return callback(true); } else { return callback(false); } }; http.send(); } }; function RetinaImage(el) { this.el = el; this.path = new RetinaImagePath(this.el.getAttribute('src'), this.el.getAttribute('data-at2x')); var that = this; this.path.check_2x_variant(function(hasVariant) { if (hasVariant) { that.swap(); } }); } root.RetinaImage = RetinaImage; RetinaImage.prototype.swap = function(path) { if (typeof path === 'undefined') { path = this.path.at_2x_path; } var that = this; function load() { if (! that.el.complete) { setTimeout(load, 5); } else { if (config.force_original_dimensions) { that.el.setAttribute('width', that.el.offsetWidth); that.el.setAttribute('height', that.el.offsetHeight); } that.el.setAttribute('src', path); } } load(); }; if (Retina.isRetina()) { Retina.init(root); } })();