WebRTC

START STREAM
MediaStream (LocalMediaStream)
MediaStream (LocalMediaStream)
PropertyValuehasOwnProperty
NavigatorUserMediaError (MediaStreamError)
(function() {

    var onDOMContentLoaded = function() {

        navigator.getUserMedia = navigator.getUserMedia       ||
                                 navigator.webkitGetUserMedia ||
                                 navigator.mozGetUserMedia;

        if (navigator.getUserMedia === undefined) {
            window.alert('Cannot use WebRTC.');
            return;
        }

        window.URL = window.URL || window.webkitURL;

        var displayProperties = function(node, tableid, caption) {
            var html = '<caption>' + caption + '</caption>';

            html += '<thead>';
            html += '<tr>';
            html += '<th scope="col">Property</th>';
            html += '<th scope="col">Value</th>';
            html += '<th scope="col">hasOwnProperty</th>';
            html += '</tr>';
            html += '</thead>';

            html += '<tbody>';

            for (var key in node) {
                html += '<tr>';
                html += '<td>' + key + '</td>';
                html += '<td>' + node[key] + '</td>';
                html += '<td>' + node.hasOwnProperty(key) + '</td>';
                html += '</tr>';
            }

            html += '</tbody>';

            document.getElementById(tableid).innerHTML = html;
            document.getElementById(tableid).parentNode.previousElementSibling.style.display = 'block';
        };

        var video = document.querySelector('video');

        // Access microphone and camera
        var medias = {audio : true, video : true};

        var successCallback = function(stream) {
            video.src = window.URL.createObjectURL(stream);

            displayProperties(stream, 'mediastream-properties', 'MediaStream (LocalMediaStream)');
        };

        var errorCallback = function(error) {
            displayProperties(error, 'navigatorusermediaerror-properties', 'NavigatorUserMediaError (MediaStreamError)');
        };

        // Start Stream
        document.getElementById('button-start-stream').addEventListener(EventWrapper.CLICK, function() {
            navigator.getUserMedia(medias, successCallback, errorCallback);
        }, false);
    };

    if ((document.readyState === 'interactive') || (document.readyState === 'complete')) {
        onDOMContentLoaded();
    } else {
        document.addEventListener('DOMContentLoaded', onDOMContentLoaded, true);
    }

})();
function EventWrapper(){
}

(function(){
    var click = '';
    var start = '';
    var move  = '';
    var end   = '';

    // Touch Panel ?
    if (/iPhone|iPad|iPod|Android/.test(navigator.userAgent)) {
        click = 'click';
        start = 'touchstart';
        move  = 'touchmove';
        end   = 'touchend';
    } else {
        click = 'click';
        start = 'mousedown';
        move  = 'mousemove';
        end   = 'mouseup';
    }

    EventWrapper.CLICK = click;
    EventWrapper.START = start;
    EventWrapper.MOVE  = move;
    EventWrapper.END   = end;
})();