diff options
Diffstat (limited to 'examples/tg16/web/stream.gathering.org/ng')
5 files changed, 418 insertions, 0 deletions
diff --git a/examples/tg16/web/stream.gathering.org/ng/README.md b/examples/tg16/web/stream.gathering.org/ng/README.md new file mode 100644 index 0000000..379dcb5 --- /dev/null +++ b/examples/tg16/web/stream.gathering.org/ng/README.md @@ -0,0 +1,5 @@ +# Copying + +The content of this directory is a pure copy-paste from Steinar H. +Gunderson's site 'stream.sesse.net'. It was used for testing purposes. +Copyrights/license for the respective owners might apply.
\ No newline at end of file diff --git a/examples/tg16/web/stream.gathering.org/ng/index.html b/examples/tg16/web/stream.gathering.org/ng/index.html new file mode 100644 index 0000000..ca523aa --- /dev/null +++ b/examples/tg16/web/stream.gathering.org/ng/index.html @@ -0,0 +1,410 @@ +<html> + <head> + <title>Steinar-style Videostream</title> + <link rel="stylesheet" href="reset.css" type="text/css" media="screen"/> + <link rel="stylesheet" href="style.css" type="text/css" media="screen"/> + <link rel="stylesheet" href="media-queries.css" type="text/css" media="screen"/> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + </head> +<body> + <style> + #videowrapper { + margin-top: 0.5em; + margin-left: auto; + margin-right: auto; + position: relative; + } + #video { + max-height: 100%; + max-width: 100%; + width: auto; + border: 1px solid black; + } + #loader { + width: 100%; + display: none; + background: black; + border: 1px solid black; + } + #castposter { + width: 100%; + display: none; + background: black; + border: 1px solid black; + } + #castposteri { + margin-top: 0; + margin-bottom: 0; + position: relative; + } + #castposteri:after { + padding-top: 56.25%; /* 16:9 aspect */ + display: block; + content: ''; + } + #castposterii { + position: absolute; top: 0; bottom: 0; left: 0; right: 0; + display: flex; + flex-direction: column; + justify-content: center; + } + #castposteriii { + color: white; + } + #castposteriii p { margin-bottom: 0; } + #streamchoice { + margin-bottom: 0; + } + </style> + +<p id="streamchoice"></p> + +<div id="videowrapper"> + <canvas id="loader"></canvas> + <div id="castposter"><div id="castposteri"><div id="castposterii"><div id="castposteriii"><p id="nowcasting">Now casting to <strong id="casttarget"></strong></p><p><a href="javascript:stop_casting();">Stop casting</a></p></div></div></div></div> + <video controls="controls" id="video" preload="none"> + <source src="http://cubemap.tg16.gathering.org/event.mp4" type="video/mp4"> + </video> +</div> + +<p style="margin-top: 1em; margin-bottom: 0">For use with a non-web player (e.g. VLC), use + <a id="vlcurl"></a> (MP4) or <a id="vlchlsurl"></a> (HLS). + Also <a href="https://chrome.google.com/webstore/detail/google-cast/boadgeojelhgndaghljhdicfkmllpafd" id="casturl">Google Cast</a> enabled.</p> + +<script type="text/javascript" src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"></script> +<script> +<!-- + +// CONFIG + +var global_title = 'Scenesat live stream'; +var enable_loader = false; +var streams = [ + { + name: "720p (2.0 Mbit/sec)", + url: "http://cubemap.tg16.gathering.org/event.mp4", + hlsurl: "http://stream.tg16.gathering.org/hls/event.m3u8", + width: 1280, + height: 720 + }, +]; + +// GLOBALS + +var video = document.getElementById('video'); +var loader = document.getElementById('loader'); +var castposter = document.getElementById('castposter'); +var use_hls; + +// LOADER PICTURE + +// C64 font. Yes, mixing up Amiga and C64 is a sin, I know. +var text = [ + ' xx xxxx xx xxxx xxxx xx xx xxxx ', + ' xx xx xx xxxx xx xx xx xxx xx xx xx ', + ' xx xx xx xx xx xx xx xx xxxxxx xx ', + ' xx xx xx xxxxxx xx xx xx xxxxxx xx xxx ', + ' xx xx xx xx xx xx xx xx xx xxx xx xx ', + ' xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ', + ' xxxxxx xxxx xx xx xxxx xxxx xx xx xxxx xx xx xx ' +]; + +function raster() { + var ctx = loader.getContext("2d"); + var width = 352; // overscan + var height = 288; // overscan + var border_width = 18; // really 16 + var border_height = 24; // really 16 + var scalefac_w = loader.width/width; + var scalefac_h = loader.height/height; + + for (var y = 0; y < height; ++y) { + var r = Math.round(Math.random() * 16).toString(16); + var g = Math.round(Math.random() * 16).toString(16); + var b = Math.round(Math.random() * 16).toString(16); + ctx.fillStyle = '#' + r + r + g + g + b + b; + + var start_y = Math.round(y * scalefac_h); + var next_y = Math.round((y + 1) * scalefac_h); + if (y < border_height || y >= height-border_height) { + ctx.fillRect(0, start_y, loader.width, next_y - start_y); + } else { + ctx.fillRect(0, start_y, border_width * scalefac_w, next_y - start_y); + ctx.fillRect((width - border_width) * scalefac_w, start_y, border_width * scalefac_w, next_y - start_y); + } + } + + // Use the same scalefactor to get square pixels despite the changed aspect. + var scalefac_ch = Math.round(scalefac_h); + if (scalefac_ch < 1) scalefac_ch = 1; + var offset_y = Math.round(loader.height / 2 - text.length * scalefac_ch / 2); + var offset_x = Math.round(loader.width / 2 - text[0].length * scalefac_ch / 2); + + ctx.fillStyle = '#ffffff'; + for (var line = 0; line < text.length; ++line) { + var start_y = Math.round(line * scalefac_ch) + offset_y; + for (var ch = 0; ch < text[line].length; ++ch) { + if (text[line].substr(ch, 1) === ' ') { + continue; + } + + var start_x = Math.round(ch * scalefac_ch) + offset_x; + ctx.fillRect(start_x, start_y, scalefac_ch, scalefac_ch); + } + } +} + +var loader_interval = null; + +function start_loader() { + if (!enable_loader) return; + + if (video.readyState === 4) { + // No need to show a loader screen. This can happen because we call start_loader() + // on the 'play' event, but we could already have enough buffering (especially on + // mobile, where the play event is delayed), so we'd never get the 'canplay' event. + console.log("Not starting loader screen, already enough to play"); + return; + } + + console.log("STARTING LOADER SCREEN"); + var ctx = loader.getContext("2d"); + ctx.clearRect(0, 0, loader.width, loader.height); + loader_interval = setInterval(raster, 1000/20); // 20 fps ought to be enough for anyone + + loader.style.display = 'inline'; + video.style.display = 'none'; + castposter.style.display = 'none'; +} + +function stop_loader() { + if (!enable_loader) return; + + console.log("STOPPING LOADER SCREEN"); + clearInterval(loader_interval); + + if (castposter.style.display !== 'block') { + loader.style.display = 'none'; + video.style.display = 'inline'; + castposter.style.display = 'none'; + } +} + +// GOOGLE CAST + +var current_media; +var session; + +function show_castposter() { + stop_loader(); + castposter.style.display = 'block'; + loader.style.display = 'none'; + video.style.display = 'none'; +} + +function hide_castposter() { + castposter.style.display = 'none'; + loader.style.display = 'none'; + video.style.display = 'inline'; +} + +function stop_casting() { + hide_castposter(); + if (current_media) { + var media = current_media; + current_media = null; + media.stop(); + } + if (session) { + session.stop(); + session = null; + } +} + +function cast_current_video() { + if (session === undefined || selected_stream === undefined) { + return; + } + var title = streams[selected_stream].name; + var url = streams[selected_stream].url; + document.getElementById('casttarget').textContent = session.receiver.friendlyName; + show_castposter(); + video.pause(); + // If we are already casting this, do nothing. + if (current_media && current_media.media.contentId === url) { + console.log("Already casting " + url + " to " + session.receiver.friendlyName + " (" + current_media.playerState + ")"); + return; + } + if (current_media) { + current_media = null; // Signal to on_media_status_update. + } + var media_info = new chrome.cast.media.MediaInfo(url, "video/mp4"); + media_info.metadata = new chrome.cast.media.GenericMediaMetadata(); + media_info.metadata.title = global_title; // + ': ' + title; + var request = new chrome.cast.media.LoadRequest(media_info); + session.loadMedia(request, + on_media_discovered.bind(this, 'loadMedia'), + on_media_error); +} + +function on_media_status_update(active) { + console.log("media status update: " + active); + if (current_media !== null && !active) { // If current_media is null, we intended to stop it, so don't bother. + console.log("Unexpected end, quitting."); + stop_casting(); + } +} + +function on_media_discovered(how, media) { + console.log("media discovered, how: " + how); + console.log(media); + current_media = media; + cast_current_video(); + media.addUpdateListener(on_media_status_update); +} + +function on_media_error(e) { + console.log("media error:"); + console.log(e); +} + +function on_session_status_update(active) { + console.log("session status update: " + active); + if (!active) { + stop_casting(); + } +} + +function session_listener(e) { + session = e; + if (session.media.length != 0) { + on_media_discovered('onRequestSessionSuccess', session.media[0]); + } + session.addUpdateListener(on_session_status_update); + cast_current_video(); +} + +function receiver_listener(e) { +// console.log("receiver status: " + e); +} + +function on_cast_init_success() { + document.getElementById('casturl').href = "javascript:chrome.cast.requestSession(session_listener)"; +} + +function on_cast_init_error() { + console.log("google cast init error"); +} + +var initialize_cast_api = function() { + var session_request = new chrome.cast.SessionRequest( + chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); + var api_config = new chrome.cast.ApiConfig( + session_request, + session_listener, + receiver_listener); + chrome.cast.initialize(api_config, on_cast_init_success, on_cast_init_error); +}; + +window['__onGCastApiAvailable'] = function(loaded, error_info) { + if (loaded) { + initialize_cast_api(); + } else { + console.log(error_info); + } +} + +// ACTUAL VIDEO STUFF + +if (navigator.userAgent.match(/iPad|iPhone|iPod/)) { + // iOS claims to support video/mp4, but it doesn't work for these streams. + // They play the HLS fine, though. + use_hls = true; +} else if (navigator.userAgent.match(/Safari/) && !navigator.userAgent.match(/Chrome/)) { + // Same with Safari (on OS X; not on Windows, but who cares about Safari on Windows). + use_hls = true; +} else if (video.canPlayType('video/mp4') === '' && video.canPlayType('application/vnd.apple.mpegURL') !== '') { + // Explicitly no MP4 support, but HLS support. + use_hls = true; +} else { + // Default to the normal stream (less latency, less muxer overhead). + use_hls = false; +} + +var selected_stream; + +function update_stream_list() { + var stream_html = ""; + for (var i = 0; i < streams.length; ++i) { + if (i != 0) { + stream_html += " | "; + } + if (i == selected_stream) { + stream_html += "<strong>" + streams[i].name + "</strong>"; + } else { + stream_html += "<a href=\"javascript:select_stream(" + i + ")\">" + streams[i].name + "</a>"; + } + } + document.getElementById('streamchoice').innerHTML = stream_html; +} +function select_stream(s) { + selected_stream = s; + update_stream_list(); + + var vlcurl = document.getElementById('vlcurl'); + vlcurl.href = streams[s].url; + vlcurl.innerHTML = streams[s].url; + + var vlchlsurl = document.getElementById('vlchlsurl'); + vlchlsurl.href = streams[s].hlsurl; + vlchlsurl.innerHTML = streams[s].hlsurl; + + var videowrapper = document.getElementById('videowrapper'); + var video = document.getElementById('video'); + var url = streams[s].url; + if (use_hls && streams[s].hlsurl) { + url = streams[s].hlsurl; + } + loader.width = streams[s].width; + loader.height = streams[s].height; + loader.style.maxWidth = streams[s].width + "px"; + loader.style.maxHeight = streams[s].height + "px"; + castposter.style.maxWidth = streams[s].width + "px"; + castposter.style.maxHeight = streams[s].height + "px"; + videowrapper.style.maxWidth = streams[s].width + "px"; + videowrapper.style.maxHeight = streams[s].height + "px"; + + if (session) { + cast_current_video(); + } else { + video.src = url; + video.load(); + video.play(); + } +} + +function setup_listeners() { + video.addEventListener('pause', on_pause); + video.addEventListener('play', start_loader); + video.addEventListener('canplay', stop_loader); + video.addEventListener('error', stop_loader); +} + +var on_pause; +on_pause = function(e) { + // The only real way to make it reload without buffering up + // the current content. + video.outerHTML = video.outerHTML; + video = document.getElementById('video'); + setup_listeners(); // Since we have a new object. + + stop_loader(); +}; + +setup_listeners(); +select_stream(0); + +//alert("MP4: " + video.canPlayType('video/mp4') + "; HLS: " + video.canPlayType('application/vnd.apple.mpegURL')); +--> +</script> + diff --git a/examples/tg16/web/stream.gathering.org/ng/media-queries.css b/examples/tg16/web/stream.gathering.org/ng/media-queries.css new file mode 100644 index 0000000..057b601 --- /dev/null +++ b/examples/tg16/web/stream.gathering.org/ng/media-queries.css @@ -0,0 +1 @@ +@media only screen and (min-width: 768px) and (max-width: 919px) {.container{width:728px;}#primary-content,.primary{width:728px;float:none;}#sidebar,.timeslot-thumb,#sponsors-full{display:none;}.widget_search #s{width:146px;}#talks,.the-talk{width:638px!important;}.talk-image{width:100px;}.talk-info{width:508px!important;}#talks-pager{padding:20px 0 25px!important;}#speakers-full .speaker:nth-child(3n){margin-right:20px;}.timeslot-desc,.timeslot-content{width:420px;}}@media only screen and (max-width: 767px) {#top .location,#top .identity{width:280px;}#navigation #primarymenu{display:none;}#navigation select.select-menu,#navigation span.select{display:block;}.container,#primary-content,.primary{width:280px;}#sidebar,#talks-full,#sponsors-full,.timeslot-thumb{display:none;}.location h2 span{line-height:26px;}.timeslot-desc{float:none;}.timeslot-desc,.timeslot-content{width:220px;}#footer p#credits,#footer p#footer-copy{float:none;}select.select-menu{width:230px!important;}span.select{width:230px;background:url(../images/selectbg_small.png) no-repeat center;}#commentform p label,#commentform p.comment-form-author span,#commentform p.comment-form-email span{position:relative;top:0;left:0;}}@media only screen and (min-width: 480px) and (max-width: 767px) {.container{width:440px;}#top .location,#top .identity{width:440px;}#navigation #primarymenu,.timeslot-thumb,#sidebar,#talks-full{display:none;}#navigation select.select-menu,#navigation span.select{display:block;}#primary-content,.primary{width:440px;}#speakers-full .speaker:nth-child(3n){margin-right:20px;}.timeslot-desc,.timeslot-content{width:380px;}select.select-menu{width:390px!important;}span.select{width:390px;background:url(../images/selectbg.png) no-repeat center;}}
\ No newline at end of file diff --git a/examples/tg16/web/stream.gathering.org/ng/reset.css b/examples/tg16/web/stream.gathering.org/ng/reset.css new file mode 100644 index 0000000..8ad64aa --- /dev/null +++ b/examples/tg16/web/stream.gathering.org/ng/reset.css @@ -0,0 +1 @@ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}ins{text-decoration:none;}del{text-decoration:line-through;}table{border-collapse:collapse;border-spacing:0;}
\ No newline at end of file diff --git a/examples/tg16/web/stream.gathering.org/ng/style.css b/examples/tg16/web/stream.gathering.org/ng/style.css new file mode 100644 index 0000000..d169861 --- /dev/null +++ b/examples/tg16/web/stream.gathering.org/ng/style.css @@ -0,0 +1 @@ +.alignnone{margin:5px 20px 20px 0;}.aligncenter,div.aligncenter{display:block;margin:5px auto 5px auto;}.alignright{float:right;margin:5px 0 20px 20px;}.alignleft{float:left;margin:5px 20px 20px 0;}.aligncenter{display:block;margin:5px auto 5px auto;}a img.alignright{float:right;margin:5px 0 20px 20px;}a img.alignnone{margin:5px 20px 20px 0;}a img.alignleft{float:left;margin:5px 20px 20px 0;}a img.aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-caption{background:#fff;border:1px solid #f0f0f0;max-width:96%;padding:5px 3px 10px;text-align:center;}.wp-caption.alignnone{margin:5px 20px 20px 0;}.wp-caption.alignleft{margin:5px 20px 20px 0;}.wp-caption.alignright{margin:5px 0 20px 20px;}.wp-caption img{border:0 none;height:auto;margin:0;max-width:98.5%;padding:0;width:auto;}.wp-caption p.wp-caption-text{font-size:11px;line-height:17px;margin:0;padding:0 4px 5px;}.sticky{}.gallery-caption{}.bypostauthor{}body{text-align:center;background:#fff;}.container{width:920px;margin:0 auto;text-align:left;position:relative;}#header{margin:0 auto;}#primary-content,.primary{width:640px;float:left;}#sidebar{width:240px;float:right;}img.scale-with-grid,img{max-width:100%;height:auto;}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.clearfix{display:inline-block;}.clearfix{display:block;}.none{display:none;}body,input,textarea,button{font:13px/21px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#787878;}h1,h2,h3,h4,h5,h6{margin:0 0 15px;color:#444;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;}p{margin:0 0 20px;}h1{font-size:26px;line-height:30px;letter-spacing:-1px;}h2{font-size:24px;line-height:28px;letter-spacing:-1px;}h3{font-size:18px;line-height:24px;}h4{font-size:16px;line-height:22px;}h5{font-size:14px;line-height:20px;}h6{font-size:12px;line-height:18px;}a{text-decoration:none;-moz-transition:background-color .1s linear,color .1s linear;-webkit-transition:background-color .1s linear,color .1s linear;-o-transition:background-color .1s linear,color .1s linear;-ms-transition:background-color .1s linear,color .1s linear;transition:background-color .1s linear,color .1s linear;}a:link,a:visited{color:#777;border-bottom:1px dotted #a9a8a8;}a:hover{color:#333;}code,pre{font:12px/18px Consolas,"Andale Mono",Courier,"Courier New",monospace;background:#f7f7f8;}em{font-style:italic;}strong{font-weight:bold;}small{font-size:11px;}blockquote,blockquote p{font-size:17px;line-height:24px;color:#777;font-style:italic;}blockquote{margin:0 0 20px;padding:9px 20px 0 19px;border-left:1px solid #ddd;}blockquote cite{display:block;font-size:12px;color:#555;}blockquote cite:before{content:"\2014 \0020";}blockquote cite a,blockquote cite a:visited,blockquote cite a:visited{color:#555;}hr{border:solid #ddd;border-width:1px 0 0;clear:both;margin:10px 0 30px;height:0;}ul,ol{margin-bottom:20px;list-style-type:square;margin-left:20px;}ul{list-style:none outside;list-style-type:square;}ol{list-style:decimal;}ol,ul.square,ul.circle,ul.disc{margin-left:30px;}ul.square{list-style:square outside;list-style-type:square;}ul.circle{list-style:circle outside;}ul.disc{list-style:disc outside;}ul ul,ul ol,ol ol,ol ul{margin:4px 0 2px 15px;}ul ul li,ul ol li,ol ol li,ol ul li{margin-bottom:2px;}li{line-height:21px;margin-bottom:2px;}ul.large li{line-height:21px;}li p{line-height:21px;}#header-full{background:url(images/headerbg_2015.jpg) center no-repeat;-webkit-background-size:cover;-moz-background-size:cover;background-size:cover;padding:40px 0 0;margin-bottom:40px;}.page-template-homepage-php #header-full{margin-bottom:0px;padding:50px 0 0}#top{text-align:center;margin:0 0 40px;}.page-template-homepage-php #top{margin:0 0 50px;}#top .location,#top .identity{width:700px;margin:0 auto;}.identity img{display:block;margin:0 auto;}.page-template-homepage-php .identity img{margin:0 auto 20px;}.identity h1{color:#fff;font-size:44px;line-height:44px;font-weight:bold;letter-spacing:-1px;margin:0;}.identity h1 span{display:block;font-weight:normal;font-size:26px;}.location h2{color:#fff;font-size:36px;line-height:36px;margin:0 0 15px;text-shadow:0px 1px 1px #4a4a4a;}.location h2 span{display:block;font-size:18px;}.location p{color:#fff;text-shadow:0px 1px 1px #4a4a4a;font-size:16px;font-family:Helvetica,Arial,sans-serif;line-height:22px;margin:0 0 30px;}a.register-cta:link,a.register-cta:visited{display:inline-block;padding:8px 15px;color:#9c663a;text-shadow:0px 1px 1px #fee4b4;font-size:18px;font-family:Helvetica,Arial,sans-serif;letter-spacing:-1px;font-weight:bold;margin:0;border:1px solid #c99237;background:#fed76e;background-image:-webkit-gradient(linear,0% 0%,0% 100%,from(#fed76e),to(#feba4b));background-image:-webkit-linear-gradient(top,#fed76e,#feba4b);background-image:-moz-linear-gradient(top,#fed76e,#feba4b);background-image:-ms-linear-gradient(top,#fed76e,#feba4b);background-image:-o-linear-gradient(top,#fed76e,#feba4b);border-radius:3px;}a.register-cta:hover{background:#fed76e;}#navigation #mobilemenu,#navigation select.select-menu,#navigation span.select{display:none;}#navigation{margin:0;padding:15px 25px;z-index:30;background:url(images/nav_bg.png) 0 0 repeat;position:relative;}#navigation a{border:0;}#navigation ul{margin:0;}#navigation li{position:relative;margin:0;padding:0;list-style:none;display:inline-block;text-transform:uppercase;font-size:12px;}#navigation li a{display:block;margin:0 20px 0 0;padding:0;font-weight:bold;color:#fff;text-shadow:0px 1px 1px #000;border-bottom:3px solid transparent;}#navigation .nav-search{margin-right:25px;}#navigation li a:hover,#navigation li a:focus,#navigation li.current_page_item a{border-color:#808181;}#navigation li ul{z-index:9999;position:absolute;display:none;left:0;height:auto;margin:15px 0 0 0;padding:5px 15px;background:#eee;}#navigation li ul li{width:150px;float:left;border-bottom:1px solid #cfcfcf;}#navigation li ul li:last-child{border:none;}#navigation li ul li a{text-transform:none;color:#444;text-shadow:none;margin:0;padding:5px 0;text-decoration:none;text-align:left;border:none;}#navigation li ul li a:hover{color:#777;border:0;}#navigation li ul li ul,#navigation li ul li ul li ul{margin:-38px 0 0 165px;padding:5px 15px!important;background-color:#eee;}.page-template-homepage-php #navigation li ul{background:#fff;}.page-template-homepage-php #navigation li ul li{border-bottom:1px solid #dedede;}.page-template-homepage-php #navigation li ul li:last-child{border:none;}#mobile-container{position:relative;}select.select-menu{position:relative;z-index:10;height:43px!important;line-height:26px;}span.select{position:absolute;bottom:0px;left:0px;float:left;height:43px;line-height:43px;font-size:14px;font-weight:bold;text-shadow:1px 1px #fff;color:#444;text-indent:10px;z-index:1;}#footer-full{padding:20px 0;margin:20px 0 0;background:#333;}.page-template-homepage-php #footer-full{margin:0;}#footer p{margin:0;color:#e3e3e3;text-shadow:0px 1px 1px #000;font-size:11px;font-weight:bold;}#footer a{color:#ccc;}#footer a:hover{color:#8b8b8b;}#footer #credits{float:left;}#footer #footer-copy{float:right;}input,textarea{background:#f8f9fe;border:1px solid #e6e8ed;color:#abadb7;padding:9px 12px;width:230px;}textarea{width:96%;height:200px;}button,#submit{background:#333;color:#fff;cursor:pointer;padding:5px 10px;width:auto;border:none;-moz-transition:color .1s linear,background .1s linear,border-color .1s linear;-webkit-transition:color .1s linear,background .1s linear,border-color .1s linear;-ms-transition:color .1s linear,background .1s linear,border-color .1s linear;-o-transition:color .1s linear,background .1s linear,border-color .1s linear;transition:color .1s linear,background .1s linear,border-color .1s linear;}input:focus,textarea:focus{border-color:#d1d3d8;}#submit:hover,button:hover{background:#555;}#talks-full{width:100%;background:#eaeaea;padding:30px 0 0;}#talks-full>.container{text-align:center;}#talks,.the-talk{position:relative;width:810px;margin:0 auto;text-align:left;}.talk-image{width:100px;float:left;}.talk-info{width:680px;float:right;}.talk-info h2{margin:0 0 10px;font-size:22px;}.talk-info p{margin:0;}.talk-image img{display:block;}a.talk-nav{position:absolute;top:40px;width:14px;height:21px;text-indent:-9999px;border:0;}#next-talk{right:0;background:url(images/arrow-right.png) 0 0 no-repeat;}#prev-talk{left:0;background:url(images/arrow-left.png) 0 0 no-repeat;}#talks-pager{margin:0 auto;height:9px;overflow:hidden;padding:15px 0 25px;}#talks-pager a{display:inline-block;width:9px;height:9px;background:url('images/talks_nav_sprite.png') 0 0 no-repeat;text-indent:-9999px;border:0;margin:0 3px 0 0;}#talks-pager a.activeSlide{background-position:-11px 0;}#speakers-full{width:100%;background:#f1f1f1;padding:40px 0 20px;}.speaker{width:200px;float:left;margin:0 20px 20px 0;text-align:left;position:relative;}.speaker h4{position:absolute;bottom:0;left:0;font-size:12px;background:#101010;padding:5px 10px;color:#fff;margin:0;}.speaker img,.sponsor img{display:block;}#speakers-full .speaker:nth-child(3n){margin-right:0;}#story-full{padding:40px 0 20px;background:#eaeaea;}#sponsors-full{padding:15px 0 0;background:#f1f1f1;}.sponsor{width:207px;float:left;margin:0 20px 15px 0;}#sponsors-full .sponsor:nth-child(4n){margin-right:0;}.speaker-single-thumb img{display:block;float:left;margin:0 20px 5px 0;}#schedule{margin:0 0 40px;}#schedule .timeslot:first-child{border-top:1px solid #d9d9d9;}.timeslot{padding:30px 30px 10px;border-bottom:1px solid #d9d9d9;background:#fcfcfc;}.timeslot h2{margin:0 0 5px;}.timeslot-detail p{margin:0;}.timeslot-detail{width:220px;float:left;margin:0 0 20px;}.timeslot-desc{width:610px;float:right;}.timeslot-content{width:400px;float:left;}.timeslot-thumb{width:180px;float:right;height:140px;}.timeslot-thumb img{display:block;}.contactform li{margin:0 0 15px;padding:0;display:block;}.contactform li:last-child{margin:0;}.contactform li input{display:inline;}.contactform li label{display:inline;padding:0 0 0 10px;}p.email-error{padding:5px 10px;margin:0;background:#fe7550;display:inline-block;color:#fff;}p.email-sent{padding:5px 10px;margin:0;background:#fff666;display:inline-block;color:#222;}.contactform li span{font-size:11px;display:block;padding-top:5px;color:#fe7550;}.post{margin:0 0 40px;}#primary-content .post:last-child{margin:0;}span.the-format{height:36px;width:36px;display:inline-block;margin:0 10px 0 0;text-indent:-9999px;}span.format-standard{background:url(images/format_standard.jpg) 0 0 no-repeat;}span.format-video{background:url(images/format_video.jpg) 0 0 no-repeat;}.post-meta{margin:0;padding:5px 0 0;border-top:1px solid #d9dbe1;font-size:11px;}.post-thumbnail,.post-title{margin:0 0 20px;}.post-thumbnail img{display:block;}ol.commentlist{margin:0 0 40px;}.commentlist{list-style:none;margin:0 auto;}.commentlist>li.comment{margin:0 0 15px;position:relative;padding:20px 20px 20px 90px;background:#f9f9f9;}.commentlist .pingback{margin:0 0 15px;}.commentlist .children{list-style:none;margin:0;}.commentlist .children li.comment{position:relative;padding:20px 0 0 80px;}.commentlist .children li.comment .fn{display:block;}.comment-meta .fn{font-style:normal;}.comment-meta{color:#666;font-size:12px;margin:0 0 5px;}.commentlist .children li.comment .comment-meta{}.commentlist .children li.comment .comment-content{}.comment-meta a{font-weight:bold;}.commentlist .avatar{position:absolute;top:20px;left:20px;padding:0;}.commentlist>li:before{left:-21px;position:absolute;}.commentlist>li.pingback:before{content:'';}.commentlist .children .avatar{}a.comment-reply-link{display:inline-block;font-size:12px;}a.comment-reply-link>span{display:inline-block;position:relative;top:-1px;}#commentform p{position:relative;}#commentform p input{display:block;}#commentform p label{position:absolute;top:0;left:270px;}#commentform p.comment-form-author span,#commentform p.comment-form-email span{position:absolute;top:0;left:308px;}#commentform p.comment-form-comment label{display:none;}.widget{margin:0 0 30px;}#sidebar .widget:last-child{margin:0;}.widget ul{margin:0;}#twitter_update_list{margin:0;}#twitter_update_list li{margin:0 0 10px;}.widget_search #s{width:214px;}.widget_search form,.widget_search fieldset{margin:0;}
\ No newline at end of file |