Widget / WebRTC Client PeerJs

This widget receives a video stream via WebRTC. You must have the server widget running in another window, or on a different machine.

HTML

<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="http://www.chilipeppr.com/js/require.js"></script>
<div id="com-chilipeppr-widget-camalignment" class="panel panel-default">
    <div class="panel-heading">
        <div class="btn-toolbar pull-right" role="toolbar">
            <div class="btn-group">
                <button type="button" class="btn btn-xs btn-default settings" data-toggle="modal" data-target="#com-chilipeppr-widget-camalignment-settings"><span class="glyphicon glyphicon-cog"></span></button>
            </div>
            <div class="btn-group">
                <button type="button" class="btn btn-xs btn-default disconnect"><span class="glyphicon glyphicon-off"></span></button>
            </div>
            <div class="btn-group">
                <button type="button" class="btn btn-xs btn-default hidebody"><span class="glyphicon glyphicon-chevron-up"></span></button>
            </div>

            <div class="btn-group">
                <div class="dropdown">
                    <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><span class="caret"></span>
                    </button>
                    <ul class="dropdown-menu dropdown-menu-right" role="menu"></ul>
                </div>
            </div>
        </div> 
        <span class="panel-title" data-toggle="popover">Camera Alignment</span>
    </div>
    <div id="com-chilipeppr-widget-camalignment-body" class="panel-body">
        <!-- Video area -->
        <div id="video-container">
            <div id="crosshairs" class="hidden"></div>
            <video id="video" autoplay class="hidden"></video> 
        </div>
    </div>
    <div id="com-chilipeppr-widget-camalignment-ftr" class="panel-footer hidden">
        
    </div>
    <div id="com-chilipeppr-widget-camalignment-settings" class="modal fade">
      <div class="modal-dialog">
        <div class="modal-content">
     ...

CSS

#com-chilipeppr-widget-camalignment-body {
    padding:0;
}
#com-chilipeppr-widget-camalignment .btn {
  z-index: 3;
}
#com-chilipeppr-widget-camalignment-body #crosshairs {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  z-index: 1;
  background: url(https://www.ambush-paintball.com/images/crosshairs.png) no-repeat center center;
}

#com-chilipeppr-widget-camalignment #video {
  width: 100%;
  height: 480px;
  max-height: 480px;
  background-color: #eee;
}

#com-chilipeppr-widget-camalignment #video-container {
    padding: 0;
    text-align: center;
    margin-bottom:-5px;
}

#step1-error, #step2, #step3 {
    display: none;
}
#step1-error {
    padding-top:10px;
}
#my-id {
  font-weight: bold;
}

#com-chilipeppr-widget-camalignment-body:after {
    content:none;
}

JavaScript

requirejs.config({
    paths: {
        jqueryui: '//chilipeppr.com/js/jquery-ui-1.10.4/ui/jquery.ui.core',
        jqueryuiWidget: '//chilipeppr.com/js/jquery-ui-1.10.4/ui/jquery.ui.widget',
        jqueryuiMouse: '//chilipeppr.com/js/jquery-ui-1.10.4/ui/jquery.ui.mouse',
        jqueryuiResizeable: '//chilipeppr.com/js/jquery-ui-1.10.4/ui/jquery.ui.resizable',
    },
    shim: {
        jqueryuiWidget: ['jqueryui'],
        jqueryuiMouse: ['jqueryuiWidget'],
        jqueryuiResizeable: ['jqueryuiMouse' ]
    }
});

// Test this element. This code is auto-removed by the chilipeppr.load()
cprequire_test(["inline:com-chilipeppr-widget-camalignment"], function (hello) {
    console.log("test running of " + hello.id);
    hello.init();
} /*end_test*/ );

cpdefine("inline:com-chilipeppr-widget-camalignment", ["chilipeppr_ready", "jquerycookie", 'jqueryuiResizeable'], function () {
    
    return {
        id: "com-chilipeppr-widget-camalignment",
        url: "http://fiddle.jshell.net/chilipeppr/qWj4f/show/light/",
        fiddleurl: "http://jsfiddle.net/chilipeppr/qWj4f/",
        name: "Camera Alignment",
        desc: "This widget uses a USB camera to align your machine to the the zero X/Y coordinates of your material",
        publish: {},
        subscribe: {},
        foreignPublish: {},
        foreignSubscribe: {},
        init: function () {

            this.configBodyFromCookie();
            $('#com-chilipeppr-widget-camalignment .hidebody').click(this.toggleBody.bind(this));
            $('#com-chilipeppr-widget-camalignment .disconnect').click(this.toggleConnect.bind(this));
            //this.makeCall('tvfzz2donnbwewmi');
            this.forkSetup();
            
            this.setupResizeable();

            console.log(this.name + " done loading.");
        },
        setupResizeable: function() {
            console.log("setting up resizeable");
            // load jquery-ui css, but make sure nobody else loaded it
            if...