<style>
#videoelem { width: 100%; height: 100%; position: absolute; } 
#videocontainer { position: relative; width: 400px; height:230px;-webkit-user-select:none; -webkit-transition-duration:0.2s}
.videobutton { 
    line-height: 40pt;
    border: 3px solid white; 
    -webkit-border-radius: 20px;
    opacity: 0.5;
    position: absolute;
    font-size: 40pt;
    color: white;
    background-color: gray;
    cursor: pointer;
    text-align: center; 
    z-index: 1;
}
.videozoombutton { bottom:10px;right:10px;width:1.1em;height:1.1em;font-size:15pt; line-height: 15pt; border:2px solid white; -webkit-border-radius: 8px;}
.videoloading { top: 0; bottom: 0; margin:auto; left:0; right:0; width: 7em; height: 1.2em; cursor:default;}
.videofadeout { -webkit-transition: 1.5s; opacity:0; }
#videocontainer:hover .videofadeout { opacity: 0.5; }
.videoplay { top: 0; bottom: 0; margin:auto; left:0; right:0; width: 1.2em; height: 1.2em;}
</style>
<script>
var videoElem;
var playButton;
var showProgress = true;
var videoLargeSize = false;
function startedPlaying() {
    showProgress = false;
    playButton.innerHTML = "||"
    playButton.className = "videobutton videoplay videofadeout";
}
function stoppedPlaying() {
    playButton.innerHTML = ">"
    playButton.className = "videobutton videoplay";
}
function updateProgress(ev) {
    if (!showProgress)
       return;
    playButton.innerHTML = "Loading...";
    playButton.className = "videobutton videoloading";
}
function initVideo() {
    videoElem = document.getElementById("videoelem");
    playButton = document.getElementById("videoplaybutton");
    videoZoomButton = document.getElementById("videozoombutton");
    if (!videoElem.play) {
       playButton.style.display = "none";
       videoZoomButton.style.display = "none";
       return;
    }
    videoElem.addEventListener("play", startedPlaying);
    videoElem.addEventListener("pause", stoppedPlaying);
    videoElem.addEventListener("ended", function () {
        if (!videoElem.paused)
            videoElem.pause();
        stoppedPlaying();
    });
    videoElem.addEventListener("progress", updateProgress);
    videoElem.addEventListener("begin", updateProgress);
    videoElem.addEventListener("canplaythrough", function () {
         videoElem.play();
    });
    videoElem.addEventListener("error", function() {
        playButton.innerHTML = "Load failed";
    });
    videoElem.addEventListener("dataunavailable", function () {
         if (!showProgress) {
             showProgress = true;
             playButton.innerHTML = "Loading...";
             playButton.className = "videobutton videoloading";
         }
    });
    videoZoomButton.addEventListener("click", function () {
        var container = document.getElementById("videocontainer");
        videoLargeSize = !videoLargeSize;
        if (videoLargeSize) {
            container.style.width = "640px";
            container.style.height = "360px";
            videoZoomButton.innerHTML = "-";
        } else {
            container.style.width = "400px";
            container.style.height = "225px";
            videoZoomButton.innerHTML = "+";
        }
    });
    playButton.addEventListener("click", function () {
        if (videoElem.paused) {
            if (!videoElem.src)
                videoElem.src = "http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov";
            videoElem.play();
        } else
            videoElem.pause();
    } );
}
</script>
<div id=videocontainer>
<video id=videoelem poster="resources/touch-poster.png">
<b style="font-size:15pt">This is fallback content. If you had video support you would see some here!</b></video>
<div class="videobutton videoplay" id=videoplaybutton>&gt;</div>
<div id=videozoombutton class="videobutton videozoombutton videofadeout">+</div>
</div>
<script>initVideo();</script>
