arteleku_skin/MAQUETA/nathansmith-adapt-230a885/assets/js/adapt.js
2017-12-15 01:06:00 +01:00

145 lines
3.7 KiB
JavaScript

/*
Adapt.js licensed under GPL and MIT.
Read more here: http://adapt.960.gs
*/
// Closure.
(function(w, d, config, undefined) {
// If no config, exit.
if (!config) {
return;
}
// Empty vars to use later.
var url, url_old, timer;
// Alias config values.
var callback = typeof config.callback === 'function' ? config.callback : undefined;
var path = config.path ? config.path : '';
var range = config.range;
var range_len = range.length;
// Create empty link tag:
// <link rel="stylesheet" />
var css = d.createElement('link');
css.rel = 'stylesheet';
css.media = 'screen';
// Called from within adapt().
function change(i, width) {
// Set the URL.
css.href = url;
url_old = url;
// Call callback, if defined.
callback && callback(i, width);
}
// Adapt to width.
function adapt() {
// This clearTimeout is for IE.
// Really it belongs in react(),
// but doesn't do any harm here.
clearTimeout(timer);
// Parse browser width.
var width = w.innerWidth || d.documentElement.clientWidth || d.body.clientWidth || 0;
// While loop vars.
var arr, arr_0, val_1, val_2, is_range, file;
// How many ranges?
var i = range_len;
var last = range_len - 1;
while (i--) {
// Blank if no conditions met.
url = '';
// Turn string into array.
arr = range[i].split('=');
// Width is to the left of "=".
arr_0 = arr[0];
// File name is to the right of "=".
// Presuppoes a file with no spaces.
// If no file specified, make empty.
file = arr[1] ? arr[1].replace(/\s/g, '') : undefined;
// Assume max if "to" isn't present.
is_range = arr_0.match('to');
// If it's a range, split left/right sides of "to",
// and then convert each one into numerical values.
// If it's not a range, turn maximum into a number.
val_1 = is_range ? parseInt(arr_0.split('to')[0], 10) : parseInt(arr_0, 10);
val_2 = is_range ? parseInt(arr_0.split('to')[1], 10) : undefined;
// Check for maxiumum or range.
if ((!val_2 && i === last && width > val_1) || (width > val_1 && width <= val_2)) {
// Build full URL to CSS file.
file && (url = path + file);
// Exit the while loop. No need to continue
// if we've already found a matching range.
break;
}
}
// Was it created yet?
if (!url_old) {
// Apply changes.
change(i, width);
// Add the CSS, only if path is defined.
// Use faster document.head if possible.
path && (d.head || d.getElementsByTagName('head')[0]).appendChild(css);
}
else if (url_old !== url) {
// Apply changes.
change(i, width);
}
}
// Fire off once.
adapt();
// Slight delay.
function react() {
// Clear the timer as window resize fires,
// so that it only calls adapt() when the
// user has finished resizing the window.
clearTimeout(timer);
// Start the timer countdown.
timer = setTimeout(adapt, 16);
// -----------------------^^
// Note: 15.6 milliseconds is lowest "safe"
// duration for setTimeout and setInterval.
//
// http://www.nczonline.net/blog/2011/12/14/timer-resolution-in-browsers
}
// Do we want to watch for
// resize and device tilt?
if (config.dynamic) {
// Event listener for window resize,
// also triggered by phone rotation.
if (w.addEventListener) {
// Good browsers.
w.addEventListener('resize', react, false);
}
else if (w.attachEvent) {
// Legacy IE support.
w.attachEvent('onresize', react);
}
else {
// Old-school fallback.
w.onresize = react;
}
}
// Pass in window, document, config, undefined.
})(this, this.document, ADAPT_CONFIG);