<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;
    if (ev.total)
        playButton.innerHTML = "Loading " + (100*ev.loaded/ev.total).toFixed(0) + "%";
    else
        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 = "sample.mov";
                videoElem.src = "http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov";
            if (videoElem.readyState == HTMLMediaElement.DATA_UNAVAILABLE)
                videoElem.load();
            if (videoElem.readyState == HTMLMediaElement.CAN_PLAY_THROUGH)
                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>
