Browse Source

Tweaked embed to allow 100% width and height

pull/13/merge
Zach Wise 13 years ago
parent
commit
24af8bae0d
  1. 42
      examples/embed.html
  2. 42
      examples/template_googlespreadsheet/index.html
  3. 37
      examples/template_json/index.html
  4. 15
      source/js/timeline-embed.js
  5. 534
      timeline-embed.js

42
examples/embed.html

@ -8,23 +8,39 @@
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]--> <![endif]-->
<style>
html, body {
height:100%;
padding: 0px;
margin: 0px;
}
#timeline-embed{
margin:0px !important;
border:0px solid #CCC !important;
padding:0px !important;
-webkit-border-radius:0px !important;
-moz-border-radius:0px !important;
border-radius:0px !important;
-moz-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;
-webkit-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;
box-shadow:0px 0px 0px rgba(0, 0, 0, 0.25) !important;
}
</style>
</head> </head>
<body> <body>
<div id="content"> <!-- BEGIN Timeline Embed -->
<div id="timeline-embed"></div>
<div id="timeline-embed"></div> <script type="text/javascript">
<script type="text/javascript"> var config = {
var config = { width: "100%",
width: 900, height: "100%",
height: 700, source: 'https://docs.google.com/spreadsheet/pub?key=0Agl_Dv6iEbDadHdKcHlHcTB5bzhvbF9iTWwyMmJHdkE&output=html'
source: 'https://docs.google.com/spreadsheet/pub?key=0Agl_Dv6iEbDadHdKcHlHcTB5bzhvbF9iTWwyMmJHdkE&output=html' }
} </script>
</script> <script type="text/javascript" src="../timeline-embed.js"></script>
<script type="text/javascript" src="http://veritetimeline.appspot.com/latest/timeline-embed.js"></script> <!-- END Timeline Embed -->
</div>
</body> </body>
</html> </html>

42
examples/template_googlespreadsheet/index.html

@ -5,35 +5,39 @@
<title>Timeline Google Spreadsheet Template</title> <title>Timeline Google Spreadsheet Template</title>
<meta name="description" content="Template Description"> <meta name="description" content="Template Description">
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- CSS -->
<link href="../../timeline.css" rel="stylesheet">
<style> <style>
html, body { html, body {
height:100%; height:100%;
padding: 0px; padding: 0px;
margin: 0px; margin: 0px;
} }
</style> #timeline-embed{
<!-- JavaScript --> margin:0px !important;
<script type="text/javascript" src="../../jquery-min.js"></script> border:0px solid #CCC !important;
<script type="text/javascript" src="../../timeline-min.js"></script> padding:0px !important;
<script> -webkit-border-radius:0px !important;
$(document).ready(function() { -moz-border-radius:0px !important;
var timeline = new VMM.Timeline(); border-radius:0px !important;
timeline.init("https://docs.google.com/spreadsheet/pub?key=0Agl_Dv6iEbDadHdKcHlHcTB5bzhvbF9iTWwyMmJHdkE&output=html"); -moz-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;
}); -webkit-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;
</script> box-shadow:0px 0px 0px rgba(0, 0, 0, 0.25) !important;
}
</style>
</head> </head>
<body> <body>
<div id="timeline"></div> <!-- BEGIN Timeline Embed -->
<div id="timeline-embed"></div>
<script type="text/javascript">
var config = {
width: "100%",
height: "100%",
source: 'https://docs.google.com/spreadsheet/pub?key=0Agl_Dv6iEbDadHdKcHlHcTB5bzhvbF9iTWwyMmJHdkE&output=html'
}
</script>
<script type="text/javascript" src="http://veritetimeline.appspot.com/latest/timeline-embed.js"></script>
<!-- END Timeline Embed -->
</body> </body>
</html> </html>

37
examples/template_json/index.html

@ -10,30 +10,39 @@
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]--> <![endif]-->
<!-- CSS -->
<link href="../../timeline.css" rel="stylesheet">
<style> <style>
html, body { html, body {
height:100%; height:100%;
padding: 0px; padding: 0px;
margin: 0px; margin: 0px;
} }
</style> #timeline-embed{
<!-- JavaScript --> margin:0px !important;
<script type="text/javascript" src="../../jquery-min.js"></script> border:0px solid #CCC !important;
<!-- <script type="text/javascript" src="jquery.mobile-1.0.min.js"></script> --> padding:0px !important;
<script type="text/javascript" src="../../timeline-min.js"></script> -webkit-border-radius:0px !important;
<script> -moz-border-radius:0px !important;
$(document).ready(function() { border-radius:0px !important;
var timeline = new VMM.Timeline(); -moz-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;
timeline.init("data.json"); -webkit-box-shadow:0 0px 0px rgba(0, 0, 0, 0.25) !important;
}); box-shadow:0px 0px 0px rgba(0, 0, 0, 0.25) !important;
</script> }
</style>
</head> </head>
<body> <body>
<div id="timeline"></div> <!-- BEGIN Timeline Embed -->
<div id="timeline-embed"></div>
<script type="text/javascript">
var config = {
width: "100%",
height: "100%",
source: 'data.json'
}
</script>
<script type="text/javascript" src="http://veritetimeline.appspot.com/latest/timeline-embed.js"></script>
<!-- END Timeline Embed -->
</body> </body>
</html> </html>

15
source/js/timeline-embed.js

@ -80,8 +80,19 @@
var te = document.getElementById("timeline-embed"); var te = document.getElementById("timeline-embed");
te.appendChild(t); te.appendChild(t);
t.setAttribute("id", 'timeline'); t.setAttribute("id", 'timeline');
te.style.width = embed_config.width + 'px';
te.style.height = embed_config.height + 'px'; if (embed_config.width.toString().match("%") || embed_config.width.toString().match("px")) {
te.style.width = embed_config.width;
} else {
te.style.width = embed_config.width + 'px';
}
if (embed_config.height.toString().match("%") || embed_config.height.toString().match("px")) {
te.style.height = embed_config.height;
} else {
te.style.height = embed_config.height + 'px';
}
t.style.position = 'relative'; t.style.position = 'relative';
/* Load CSS /* Load CSS

534
timeline-embed.js

@ -1,6 +1,4 @@
/*jslint browser: true, eqeqeq: true, bitwise: true, newcap: true, immed: true, regexp: false */ /*jslint browser: true, eqeqeq: true, bitwise: true, newcap: true, immed: true, regexp: false *//**
/**
LazyLoad makes it easy and painless to lazily load one or more external LazyLoad makes it easy and painless to lazily load one or more external
JavaScript or CSS files on demand either during or after the rendering of a web JavaScript or CSS files on demand either during or after the rendering of a web
page. page.
@ -35,532 +33,4 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@class LazyLoad @class LazyLoad
@static @static
@version 2.0.3 (git) @version 2.0.3 (git)
*/ */LazyLoad=function(a){function h(b,c){var d=a.createElement(b),e;for(e in c)c.hasOwnProperty(e)&&d.setAttribute(e,c[e]);return d}function i(a){var b=d[a],c,g;if(b){c=b.callback;g=b.urls;g.shift();e=0;if(!g.length){c&&c.call(b.context,b.obj);d[a]=null;f[a].length&&k(a)}}}function j(){var c=navigator.userAgent;b={async:a.createElement("script").async===!0};(b.webkit=/AppleWebKit\//.test(c))||(b.ie=/MSIE/.test(c))||(b.opera=/Opera/.test(c))||(b.gecko=/Gecko\//.test(c))||(b.unknown=!0)}function k(e,g,k,n,o){var p=function(){i(e)},q=e==="css",r=[],s,t,u,v,w,x;b||j();if(g){g=typeof g=="string"?[g]:g.concat();if(q||b.async||b.gecko||b.opera)f[e].push({urls:g,callback:k,obj:n,context:o});else for(s=0,t=g.length;s<t;++s)f[e].push({urls:[g[s]],callback:s===t-1?k:null,obj:n,context:o})}if(d[e]||!(v=d[e]=f[e].shift()))return;c||(c=a.head||a.getElementsByTagName("head")[0]);w=v.urls;for(s=0,t=w.length;s<t;++s){x=w[s];if(q)u=b.gecko?h("style"):h("link",{href:x,rel:"stylesheet"});else{u=h("script",{src:x});u.async=!1}u.className="lazyload";u.setAttribute("charset","utf-8");if(b.ie&&!q)u.onreadystatechange=function(){if(/loaded|complete/.test(u.readyState)){u.onreadystatechange=null;p()}};else if(q&&(b.gecko||b.webkit))if(b.webkit){v.urls[s]=u.href;m()}else{u.innerHTML='@import "'+x+'";';l(u)}else u.onload=u.onerror=p;r.push(u)}for(s=0,t=r.length;s<t;++s)c.appendChild(r[s])}function l(a){var b;try{b=!!a.sheet.cssRules}catch(c){e+=1;e<200?setTimeout(function(){l(a)},50):b&&i("css");return}i("css")}function m(){var a=d.css,b;if(a){b=g.length;while(--b>=0)if(g[b].href===a.urls[0]){i("css");break}e+=1;a&&(e<200?setTimeout(m,50):i("css"))}}var b,c,d={},e=0,f={css:[],js:[]},g=a.styleSheets;return{css:function(a,b,c,d){k("css",a,b,c,d)},js:function(a,b,c,d){k("js",a,b,c,d)}}}(this.document);(function(){function m(){LazyLoad.js(a.js,n)}function n(){c=!0;p()}function o(){d=!0;p()}function p(){if(f>40)return;f++;if(c&&d){if(!e){e=!0;h=new VMM.Timeline;h.init(a.source)}}else g=setTimeout("checkAgain();",250)}var a={width:800,height:600,source:"taylor/data.json",css:"http://veritetimeline.appspot.com/latest/timeline.css",js:"http://veritetimeline.appspot.com/latest/timeline-min.js"};if(typeof config=="object"){var b;for(b in config)Object.prototype.hasOwnProperty.call(config,b)&&(a[b]=config[b])}var c=!1,d=!1,e=!1,f=0,g,h,i=document.createElement("div"),j=document.getElementById("timeline-embed");j.appendChild(i);i.setAttribute("id","timeline");a.width.toString().match("%")||a.width.toString().match("px")?j.style.width=a.width:j.style.width=a.width+"px";a.height.toString().match("%")||a.height.toString().match("px")?j.style.height=a.height:j.style.height=a.height+"px";i.style.position="relative";LazyLoad.css(a.css,o);try{var k=jQuery;k=!0}catch(l){var k=!1}k?m():LazyLoad.js("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js",m);this.checkAgain=function(){p()}})();
LazyLoad = (function (doc) {
// -- Private Variables ------------------------------------------------------
// User agent and feature test information.
var env,
// Reference to the <head> element (populated lazily).
head,
// Requests currently in progress, if any.
pending = {},
// Number of times we've polled to check whether a pending stylesheet has
// finished loading. If this gets too high, we're probably stalled.
pollCount = 0,
// Queued requests.
queue = {css: [], js: []},
// Reference to the browser's list of stylesheets.
styleSheets = doc.styleSheets;
// -- Private Methods --------------------------------------------------------
/**
Creates and returns an HTML element with the specified name and attributes.
@method createNode
@param {String} name element name
@param {Object} attrs name/value mapping of element attributes
@return {HTMLElement}
@private
*/
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;
}
/**
Called when the current pending resource of the specified type has finished
loading. Executes the associated callback (if any) and loads the next
resource in the queue.
@method finish
@param {String} type resource type ('css' or 'js')
@private
*/
function finish(type) {
var p = pending[type],
callback,
urls;
if (p) {
callback = p.callback;
urls = p.urls;
urls.shift();
pollCount = 0;
// If this is the last of the pending URLs, execute the callback and
// start the next request in the queue (if any).
if (!urls.length) {
callback && callback.call(p.context, p.obj);
pending[type] = null;
queue[type].length && load(type);
}
}
}
/**
Populates the <code>env</code> variable with user agent and feature test
information.
@method getEnv
@private
*/
function getEnv() {
var ua = navigator.userAgent;
env = {
// True if this browser supports disabling async mode on dynamically
// created script nodes. See
// http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
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);
}
/**
Loads the specified resources, or the next resource of the specified type
in the queue if no resources are specified. If a resource of the specified
type is already being loaded, the new request will be queued until the
first request has been finished.
When an array of resource URLs is specified, those URLs will be loaded in
parallel if it is possible to do so while preserving execution order. All
browsers support parallel loading of CSS, but only Firefox and Opera
support parallel loading of scripts. In other browsers, scripts will be
queued and loaded one at a time to ensure correct execution order.
@method load
@param {String} type resource type ('css' or 'js')
@param {String|Array} urls (optional) URL or array of URLs to load
@param {Function} callback (optional) callback function to execute when the
resource is loaded
@param {Object} obj (optional) object to pass to the callback function
@param {Object} context (optional) if provided, the callback function will
be executed in this object's context
@private
*/
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) {
// If urls is a string, wrap it in an array. Otherwise assume it's an
// array and create a copy of it so modifications won't be made to the
// original.
urls = typeof urls === 'string' ? [urls] : urls.concat();
// Create a request object for each URL. If multiple URLs are specified,
// the callback will only be executed after all URLs have been loaded.
//
// Sadly, Firefox and Opera are the only browsers capable of loading
// scripts in parallel while preserving execution order. In all other
// browsers, scripts must be loaded sequentially.
//
// All browsers respect CSS specificity based on the order of the link
// elements in the DOM, regardless of the order in which the stylesheets
// are actually downloaded.
if (isCSS || env.async || env.gecko || env.opera) {
// Load in parallel.
queue[type].push({
urls : urls,
callback: callback,
obj : obj,
context : context
});
} else {
// Load sequentially.
for (i = 0, len = urls.length; i < len; ++i) {
queue[type].push({
urls : [urls[i]],
callback: i === len - 1 ? callback : null, // callback is only added to the last URL
obj : obj,
context : context
});
}
}
}
// If a previous load request of this type is currently in progress, we'll
// wait our turn. Otherwise, grab the next item in the queue.
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)) {
// Gecko and WebKit don't support the onload event on link nodes.
if (env.webkit) {
// In WebKit, we can poll for changes to document.styleSheets to
// figure out when stylesheets have loaded.
p.urls[i] = node.href; // resolve relative URLs (or polling won't work)
pollWebKit();
} else {
// In Gecko, we can import the requested URL into a <style> node and
// poll for the existence of node.sheet.cssRules. Props to Zach
// Leatherman for calling my attention to this technique.
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]);
}
}
/**
Begins polling to determine when the specified stylesheet has finished loading
in Gecko. Polling stops when all pending stylesheets have loaded or after 10
seconds (to prevent stalls).
Thanks to Zach Leatherman for calling my attention to the @import-based
cross-domain technique used here, and to Oleg Slobodskoi for an earlier
same-domain implementation. See Zach's blog for more details:
http://www.zachleat.com/web/2010/07/29/load-css-dynamically/
@method pollGecko
@param {HTMLElement} node Style node to poll.
@private
*/
function pollGecko(node) {
var hasRules;
try {
// We don't really need to store this value or ever refer to it again, but
// if we don't store it, Closure Compiler assumes the code is useless and
// removes it.
hasRules = !!node.sheet.cssRules;
} catch (ex) {
// An exception means the stylesheet is still loading.
pollCount += 1;
if (pollCount < 200) {
setTimeout(function () { pollGecko(node); }, 50);
} else {
// We've been polling for 10 seconds and nothing's happened. Stop
// polling and finish the pending requests to avoid blocking further
// requests.
hasRules && finish('css');
}
return;
}
// If we get here, the stylesheet has loaded.
finish('css');
}
/**
Begins polling to determine when pending stylesheets have finished loading
in WebKit. Polling stops when all pending stylesheets have loaded or after 10
seconds (to prevent stalls).
@method pollWebKit
@private
*/
function pollWebKit() {
var css = pending.css, i;
if (css) {
i = styleSheets.length;
// Look for a stylesheet matching the pending URL.
while (--i >= 0) {
if (styleSheets[i].href === css.urls[0]) {
finish('css');
break;
}
}
pollCount += 1;
if (css) {
if (pollCount < 200) {
setTimeout(pollWebKit, 50);
} else {
// We've been polling for 10 seconds and nothing's happened, which may
// indicate that the stylesheet has been removed from the document
// before it had a chance to load. Stop polling and finish the pending
// request to prevent blocking further requests.
finish('css');
}
}
}
}
return {
/**
Requests the specified CSS URL or URLs and executes the specified
callback (if any) when they have finished loading. If an array of URLs is
specified, the stylesheets will be loaded in parallel and the callback
will be executed after all stylesheets have finished loading.
@method css
@param {String|Array} urls CSS URL or array of CSS URLs to load
@param {Function} callback (optional) callback function to execute when
the specified stylesheets are loaded
@param {Object} obj (optional) object to pass to the callback function
@param {Object} context (optional) if provided, the callback function
will be executed in this object's context
@static
*/
css: function (urls, callback, obj, context) {
load('css', urls, callback, obj, context);
},
/**
Requests the specified JavaScript URL or URLs and executes the specified
callback (if any) when they have finished loading. If an array of URLs is
specified and the browser supports it, the scripts will be loaded in
parallel and the callback will be executed after all scripts have
finished loading.
Currently, only Firefox and Opera support parallel loading of scripts while
preserving execution order. In other browsers, scripts will be
queued and loaded one at a time to ensure correct execution order.
@method js
@param {String|Array} urls JS URL or array of JS URLs to load
@param {Function} callback (optional) callback function to execute when
the specified scripts are loaded
@param {Object} obj (optional) object to pass to the callback function
@param {Object} context (optional) if provided, the callback function
will be executed in this object's context
@static
*/
js: function (urls, callback, obj, context) {
load('js', urls, callback, obj, context);
}
};
})(this.document);
/***********************************************
Begin timeline-embed.js
***********************************************/
/*!
Verite Timeline Loader 0.1
Designed and built by Zach Wise digitalartwork.net
Date: March 30, 2012
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
http://www.gnu.org/licenses/
*/
/* CodeKit Import
http://incident57.com/codekit/
================================================== */
// @codekit-prepend "lazyload.js";
/* TIMELINE CDN LOADER
================================================== */
/* Embed code with config
================================================== */
/*
<!-- Begin Embed Code -->
<div id="timeline-embed"></div>
<script type="text/javascript">
var config = {
width: 900,
height: 700,
source: 'https://docs.google.com/a/digitalartwork.net/spreadsheet/ccc?hl=en_US&key=0Agl_Dv6iEbDadGRwZjJSRTR4RHJpanE2U3lkb0lyYUE&rm=full#gid=0',
css: '../timeline.css',
js: '../timeline.js'
}
</script>
<script type="text/javascript" src="../timeline-embed.js"></script>
<!-- End Embed Code -->
*/
(function() {
/* CONFIG Default
================================================== */
var embed_config = {
width: 800,
height: 600,
source: 'taylor/data.json',
css: 'http://veritetimeline.appspot.com/latest/timeline.css',
js: 'http://veritetimeline.appspot.com/latest/timeline-min.js'
}
if (typeof config == 'object') {
var x;
for (x in config) {
if (Object.prototype.hasOwnProperty.call(config, x)) {
embed_config[x] = config[x];
}
}
}
/* VARS
================================================== */
var jsReady = false;
var cssReady = false;
var isReady = false;
var preload_checks = 0;
var timeout;
var timeline;
/* Add Timeline Div
================================================== */
var t = document.createElement('div');
var te = document.getElementById("timeline-embed");
te.appendChild(t);
t.setAttribute("id", 'timeline');
te.style.width = embed_config.width + 'px';
te.style.height = embed_config.height + 'px';
t.style.position = 'relative';
/* Load CSS
================================================== */
LazyLoad.css(embed_config.css, cssComplete);
/* Check for jQuery
================================================== */
try {
var jqueryLoaded=jQuery;
jqueryLoaded=true;
} catch(err) {
var jqueryLoaded=false;
}
/* Load jQuery if it doesn't exist
================================================== */
if (!jqueryLoaded) {
LazyLoad.js('http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', onJQueryLoaded);
} else {
onJQueryLoaded();
}
function onJQueryLoaded() {
LazyLoad.js(embed_config.js, onJSLoaded);
}
function onJSLoaded() {
jsReady = true;
checkLoad();
}
function cssComplete() {
cssReady = true;
checkLoad();
}
/* Check to see if everything is loaded.
================================================== */
function checkLoad() {
if (preload_checks > 40) {
return;
alert("Error Loading Files");
} else {
preload_checks++;
if (jsReady && cssReady) {
if (!isReady) {
isReady = true;
timeline = new VMM.Timeline();
timeline.init(embed_config.source);
}
} else {
//alert("run timeout");
timeout = setTimeout('checkAgain();', 250);
}
}
}
this.checkAgain = function() {
checkLoad();
}
})();
/*
Thinking of ditching Lazy loader after some more testing.
*/
/*
var stylesheet = document.createElement('link');
stylesheet.href = '/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css';
stylesheet.rel = 'stylesheet';
stylesheet.type = 'text/css';
document.getElementsByTagName('head')[0].appendChild(stylesheet);
var tjs = document.createElement('script');
tjs.type = 'text/javascript';
tjs.async = true;
tjs.url = '/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css';
document.getElementsByTagName('head')[0].appendChild(tjs);
*/
Loading…
Cancel
Save