Beautifully crafted timelines that are easy and intuitive to use. http://timeline.knightlab.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
5.6 KiB
247 lines
5.6 KiB
/* |
|
LoadLib |
|
Based on LazyLoad by Ryan Grove |
|
https://github.com/rgrove/lazyload/ |
|
Copyright (c) 2011 Ryan Grove <ryan@wonko.com> |
|
All rights reserved. |
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of |
|
this software and associated documentation files (the 'Software'), to deal in |
|
the Software without restriction, including without limitation the rights to |
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
|
the Software, and to permit persons to whom the Software is furnished to do so, |
|
subject to the following conditions: |
|
|
|
The above copyright notice and this permission notice shall be included in all |
|
copies or substantial portions of the Software. |
|
|
|
================================================== */ |
|
window.loadedJS = []; |
|
|
|
|
|
if(typeof VMM != 'undefined' && typeof VMM.LoadLib == 'undefined') { |
|
//VMM.LoadLib.js('http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', onJQueryLoaded); |
|
//VMM.LoadLib.css('http://someurl.css', onCSSLoaded); |
|
|
|
|
|
|
|
VMM.LoadLib = (function (doc) { |
|
var env, |
|
head, |
|
pending = {}, |
|
pollCount = 0, |
|
queue = {css: [], js: []}, |
|
styleSheets = doc.styleSheets; |
|
|
|
var loaded_Array = []; |
|
|
|
function isLoaded(url) { |
|
var has_been_loaded = false; |
|
for(var i=0; i<loaded_Array.length; i++) { |
|
if (loaded_Array[i] == url) { |
|
has_been_loaded = true; |
|
} |
|
} |
|
if (!has_been_loaded) { |
|
loaded_Array.push(url); |
|
} |
|
return has_been_loaded; |
|
} |
|
|
|
function createNode(name, attrs) { |
|
var node = doc.createElement(name), attr; |
|
|
|
for (attr in attrs) { |
|
if (attrs.hasOwnProperty(attr)) { |
|
node.setAttribute(attr, attrs[attr]); |
|
} |
|
} |
|
|
|
return node; |
|
} |
|
|
|
function finish(type) { |
|
var p = pending[type], |
|
callback, |
|
urls; |
|
|
|
if (p) { |
|
callback = p.callback; |
|
urls = p.urls; |
|
urls.shift(); |
|
pollCount = 0; |
|
if (!urls.length) { |
|
callback && callback.call(p.context, p.obj); |
|
pending[type] = null; |
|
queue[type].length && load(type); |
|
} |
|
} |
|
} |
|
|
|
function getEnv() { |
|
var ua = navigator.userAgent; |
|
|
|
env = { |
|
|
|
async: doc.createElement('script').async === true |
|
}; |
|
|
|
(env.webkit = /AppleWebKit\//.test(ua)) |
|
|| (env.ie = /MSIE/.test(ua)) |
|
|| (env.opera = /Opera/.test(ua)) |
|
|| (env.gecko = /Gecko\//.test(ua)) |
|
|| (env.unknown = true); |
|
} |
|
|
|
function load(type, urls, callback, obj, context) { |
|
var _finish = function () { finish(type); }, |
|
isCSS = type === 'css', |
|
nodes = [], |
|
i, len, node, p, pendingUrls, url; |
|
|
|
env || getEnv(); |
|
|
|
if (urls) { |
|
|
|
urls = typeof urls === 'string' ? [urls] : urls.concat(); |
|
|
|
if (isCSS || env.async || env.gecko || env.opera) { |
|
|
|
queue[type].push({ |
|
urls : urls, |
|
callback: callback, |
|
obj : obj, |
|
context : context |
|
}); |
|
} else { |
|
for (i = 0, len = urls.length; i < len; ++i) { |
|
queue[type].push({ |
|
urls : [urls[i]], |
|
callback: i === len - 1 ? callback : null, |
|
obj : obj, |
|
context : context |
|
}); |
|
} |
|
} |
|
} |
|
|
|
if (pending[type] || !(p = pending[type] = queue[type].shift())) { |
|
return; |
|
} |
|
|
|
head || (head = doc.head || doc.getElementsByTagName('head')[0]); |
|
pendingUrls = p.urls; |
|
|
|
for (i = 0, len = pendingUrls.length; i < len; ++i) { |
|
url = pendingUrls[i]; |
|
|
|
if (isCSS) { |
|
node = env.gecko ? createNode('style') : createNode('link', { |
|
href: url, |
|
rel : 'stylesheet' |
|
}); |
|
} else { |
|
node = createNode('script', {src: url}); |
|
node.async = false; |
|
} |
|
|
|
node.className = 'lazyload'; |
|
node.setAttribute('charset', 'utf-8'); |
|
|
|
if (env.ie && !isCSS) { |
|
node.onreadystatechange = function () { |
|
if (/loaded|complete/.test(node.readyState)) { |
|
node.onreadystatechange = null; |
|
_finish(); |
|
} |
|
}; |
|
} else if (isCSS && (env.gecko || env.webkit)) { |
|
if (env.webkit) { |
|
p.urls[i] = node.href; |
|
pollWebKit(); |
|
} else { |
|
node.innerHTML = '@import "' + url + '";'; |
|
pollGecko(node); |
|
} |
|
} else { |
|
node.onload = node.onerror = _finish; |
|
} |
|
|
|
nodes.push(node); |
|
} |
|
|
|
for (i = 0, len = nodes.length; i < len; ++i) { |
|
head.appendChild(nodes[i]); |
|
} |
|
} |
|
|
|
function pollGecko(node) { |
|
var hasRules; |
|
|
|
try { |
|
|
|
hasRules = !!node.sheet.cssRules; |
|
} catch (ex) { |
|
pollCount += 1; |
|
|
|
if (pollCount < 200) { |
|
setTimeout(function () { pollGecko(node); }, 50); |
|
} else { |
|
|
|
hasRules && finish('css'); |
|
} |
|
|
|
return; |
|
} |
|
|
|
finish('css'); |
|
} |
|
|
|
function pollWebKit() { |
|
var css = pending.css, i; |
|
|
|
if (css) { |
|
i = styleSheets.length; |
|
|
|
while (--i >= 0) { |
|
if (styleSheets[i].href === css.urls[0]) { |
|
finish('css'); |
|
break; |
|
} |
|
} |
|
|
|
pollCount += 1; |
|
|
|
if (css) { |
|
if (pollCount < 200) { |
|
setTimeout(pollWebKit, 50); |
|
} else { |
|
|
|
finish('css'); |
|
} |
|
} |
|
} |
|
} |
|
|
|
return { |
|
|
|
css: function (urls, callback, obj, context) { |
|
if (isLoaded(urls)) { |
|
return callback; |
|
} else { |
|
load('css', urls, callback, obj, context); |
|
} |
|
}, |
|
|
|
js: function (urls, callback, obj, context) { |
|
if (isLoaded(urls)) { |
|
return callback; |
|
} else { |
|
load('js', urls, callback, obj, context); |
|
} |
|
} |
|
|
|
}; |
|
})(this.document); |
|
} |
|
|
|
|