| 1 | /**
|
|---|
| 2 | * @class TTVDisplay
|
|---|
| 3 | * @constructor
|
|---|
| 4 | * @public
|
|---|
| 5 | *
|
|---|
| 6 | * Creates a div Node which contains a TTVPlayer and returns this.
|
|---|
| 7 | * Options are partially passed through to the TTVPlayer object.
|
|---|
| 8 | * Overwites the options 'onclose', 'onready', 'onupdate',
|
|---|
| 9 | * 'oncompletion', 'onbookmark', 'onpause', 'onplay' and 'callback'.
|
|---|
| 10 | *
|
|---|
| 11 | * @param {Object} options
|
|---|
| 12 | * <ul>
|
|---|
| 13 | * <li> title: if the title is not undefined or an empty string
|
|---|
| 14 | * it is used as the title bar title. Otherwise the filename
|
|---|
| 15 | * of the url is used excluding the extions .rec and .tty
|
|---|
| 16 | * <li> controls: if defined, controls are displayed in a status bar
|
|---|
| 17 | * <li> debug: the debug property is converted to the debugLevel
|
|---|
| 18 | * property and an own debug handler is setup
|
|---|
| 19 | * </ul>
|
|---|
| 20 | *
|
|---|
| 21 | * @returns {Node}
|
|---|
| 22 | * A div-element container all the html nodes is returned.
|
|---|
| 23 | *
|
|---|
| 24 | */
|
|---|
| 25 | function TTVDisplay(options)
|
|---|
| 26 | {
|
|---|
| 27 | var name;
|
|---|
| 28 | if (options['title'] || options['title']==="")
|
|---|
| 29 | name = options['title'];
|
|---|
| 30 | else
|
|---|
| 31 | {
|
|---|
| 32 | name = options['name'].split('/').reverse()[0];
|
|---|
| 33 | var ext = name.substr(-4, 4);
|
|---|
| 34 | if (ext==".rec" || ext==".tty")
|
|---|
| 35 | name = name.substr(0, name.length-4);
|
|---|
| 36 | }
|
|---|
| 37 |
|
|---|
| 38 | var div = document.createElement("div");
|
|---|
| 39 | div.setAttribute("class", "tty");
|
|---|
| 40 | div.setAttribute("style", "display:none;");
|
|---|
| 41 |
|
|---|
| 42 | var table = document.createElement("table");
|
|---|
| 43 | table.setAttribute("class", "tty");
|
|---|
| 44 | table.id = "table";
|
|---|
| 45 |
|
|---|
| 46 | // ------------- first row ---------------
|
|---|
| 47 |
|
|---|
| 48 | var tr1 = document.createElement("tr");
|
|---|
| 49 |
|
|---|
| 50 | var td11 = document.createElement("td");
|
|---|
| 51 | var td12 = document.createElement("td");
|
|---|
| 52 | var td13 = document.createElement("td");
|
|---|
| 53 |
|
|---|
| 54 | var img11 = document.createElement("img");
|
|---|
| 55 | var img13 = document.createElement("img");
|
|---|
| 56 |
|
|---|
| 57 | var txt12 = document.createTextNode(name);
|
|---|
| 58 |
|
|---|
| 59 | tr1.setAttribute("class", "tty");
|
|---|
| 60 | tr1.id = "row1";
|
|---|
| 61 |
|
|---|
| 62 | td11.setAttribute("class", "tty");
|
|---|
| 63 | td12.setAttribute("class", "tty");
|
|---|
| 64 | td13.setAttribute("class", "tty");
|
|---|
| 65 | td11.id = "cell11";
|
|---|
| 66 | td12.id = "cell12";
|
|---|
| 67 | td13.id = "cell13";
|
|---|
| 68 |
|
|---|
| 69 | img11.setAttribute("class", "tty")
|
|---|
| 70 | img11.id = "img11";
|
|---|
| 71 |
|
|---|
| 72 | img13.setAttribute("class", "tty");
|
|---|
| 73 | img13.id = "img13";
|
|---|
| 74 |
|
|---|
| 75 | if (options['onclose'])
|
|---|
| 76 | img13.onclick = options['onclose'];
|
|---|
| 77 |
|
|---|
| 78 | td11.appendChild(img11);
|
|---|
| 79 | td12.appendChild(txt12);
|
|---|
| 80 | td13.appendChild(img13);
|
|---|
| 81 |
|
|---|
| 82 | tr1.appendChild(td11);
|
|---|
| 83 | tr1.appendChild(td12);
|
|---|
| 84 | tr1.appendChild(td13);
|
|---|
| 85 |
|
|---|
| 86 | table.appendChild(tr1);
|
|---|
| 87 |
|
|---|
| 88 | // ------------- second row ---------------
|
|---|
| 89 |
|
|---|
| 90 | var tr2 = document.createElement("tr");
|
|---|
| 91 |
|
|---|
| 92 | tr2.setAttribute("class", "tty");
|
|---|
| 93 | tr2.id = "row2";
|
|---|
| 94 |
|
|---|
| 95 | var td21 = document.createElement("td");
|
|---|
| 96 |
|
|---|
| 97 | td21.setAttribute("class", "tty");
|
|---|
| 98 | td21.id = "cell21";
|
|---|
| 99 |
|
|---|
| 100 | var canvas = document.createElement("canvas");
|
|---|
| 101 | canvas.setAttribute("class", "tty");
|
|---|
| 102 | canvas.id = "canvas";
|
|---|
| 103 |
|
|---|
| 104 | td21.setAttribute("colspan", "3");
|
|---|
| 105 |
|
|---|
| 106 | canvas.width = 1;
|
|---|
| 107 | canvas.height = 1;
|
|---|
| 108 |
|
|---|
| 109 | td21.appendChild(canvas);
|
|---|
| 110 | tr2.appendChild(td21);
|
|---|
| 111 |
|
|---|
| 112 | table.appendChild(tr2);
|
|---|
| 113 |
|
|---|
| 114 | // ------------- third row ---------------
|
|---|
| 115 |
|
|---|
| 116 | var tr3 = document.createElement("tr");
|
|---|
| 117 |
|
|---|
| 118 | tr3.setAttribute("class", "tty");
|
|---|
| 119 | tr3.id = "row3";
|
|---|
| 120 |
|
|---|
| 121 | var td31 = document.createElement("td");
|
|---|
| 122 | var td32 = document.createElement("td");
|
|---|
| 123 | var td33 = document.createElement("td");
|
|---|
| 124 |
|
|---|
| 125 | td31.setAttribute("class", "tty");
|
|---|
| 126 | td32.setAttribute("class", "tty");
|
|---|
| 127 | td33.setAttribute("class", "tty");
|
|---|
| 128 | td31.id = "cell31";
|
|---|
| 129 | td32.id = "cell32";
|
|---|
| 130 | td33.id = "cell33";
|
|---|
| 131 |
|
|---|
| 132 | var txt31 = document.createTextNode("TermTV");
|
|---|
| 133 |
|
|---|
| 134 | var input321 = document.createElement("span");
|
|---|
| 135 | var input322a = document.createElement("span");
|
|---|
| 136 | var input322b = document.createElement("span");
|
|---|
| 137 | var input326 = document.createElement("span");
|
|---|
| 138 | var input327a = document.createElement("span");
|
|---|
| 139 | var input327b = document.createElement("span");
|
|---|
| 140 | var input33 = document.createElement("span");
|
|---|
| 141 |
|
|---|
| 142 | var span323 = document.createElement("span");
|
|---|
| 143 | var span325 = document.createElement("span");
|
|---|
| 144 |
|
|---|
| 145 | var progress324 = document.createElement("progress");
|
|---|
| 146 |
|
|---|
| 147 | var txt323 = document.createTextNode("00:00:00");
|
|---|
| 148 | var txt325 = document.createTextNode("00:00:00");
|
|---|
| 149 |
|
|---|
| 150 | input322b.setAttribute("style", "display:none;");
|
|---|
| 151 | input327b.setAttribute("style", "display:none;");
|
|---|
| 152 |
|
|---|
| 153 | input321.setAttribute("class", "tty")
|
|---|
| 154 | input322a.setAttribute("class", "tty")
|
|---|
| 155 | input322b.setAttribute("class", "tty")
|
|---|
| 156 | input326.setAttribute("class", "tty")
|
|---|
| 157 | input327a.setAttribute("class", "tty")
|
|---|
| 158 | input327b.setAttribute("class", "tty")
|
|---|
| 159 | input33.setAttribute( "class", "tty")
|
|---|
| 160 | input321.id = "input321";
|
|---|
| 161 | input322a.id = "input322a";
|
|---|
| 162 | input322b.id = "input322b";
|
|---|
| 163 | input326.id = "input326";
|
|---|
| 164 | input327a.id = "input327a";
|
|---|
| 165 | input327b.id = "input327b";
|
|---|
| 166 | input33.id = "input33";
|
|---|
| 167 |
|
|---|
| 168 | input33.onclick = function() {
|
|---|
| 169 | var img = canvas.toDataURL("image/png");
|
|---|
| 170 | img = img.replace("image/png", "image/octet-stream");
|
|---|
| 171 | document.location.href = img;
|
|---|
| 172 | return false;
|
|---|
| 173 | }
|
|---|
| 174 |
|
|---|
| 175 | span323.setAttribute("class", "tty");
|
|---|
| 176 | span325.setAttribute("class", "tty");
|
|---|
| 177 | span323.id = "span323";
|
|---|
| 178 | span325.id = "span325";
|
|---|
| 179 |
|
|---|
| 180 | progress324.max = 1;
|
|---|
| 181 | progress324.value = 0;
|
|---|
| 182 |
|
|---|
| 183 | span323.appendChild(txt323);
|
|---|
| 184 | span325.appendChild(txt325);
|
|---|
| 185 |
|
|---|
| 186 | td31.appendChild(txt31);
|
|---|
| 187 |
|
|---|
| 188 | td32.appendChild(input321);
|
|---|
| 189 | td32.appendChild(input322a);
|
|---|
| 190 | td32.appendChild(input322b);
|
|---|
| 191 | td32.appendChild(span323);
|
|---|
| 192 | td32.appendChild(progress324);
|
|---|
| 193 | td32.appendChild(span325);
|
|---|
| 194 | td32.appendChild(input326);
|
|---|
| 195 | td32.appendChild(input327a);
|
|---|
| 196 | td32.appendChild(input327b);
|
|---|
| 197 |
|
|---|
| 198 | td33.appendChild(input33);
|
|---|
| 199 |
|
|---|
| 200 | tr3.appendChild(td31);
|
|---|
| 201 | tr3.appendChild(td32);
|
|---|
| 202 | tr3.appendChild(td33);
|
|---|
| 203 |
|
|---|
| 204 | if (options['controls'])
|
|---|
| 205 | table.appendChild(tr3);
|
|---|
| 206 |
|
|---|
| 207 | // ------------- fourth row ---------------
|
|---|
| 208 |
|
|---|
| 209 | var tr4 = document.createElement("tr");
|
|---|
| 210 | var td4 = document.createElement("td");
|
|---|
| 211 | var div4 = document.createElement("div");
|
|---|
| 212 |
|
|---|
| 213 | td4.setAttribute("style", "max-width:1px;");
|
|---|
| 214 |
|
|---|
| 215 | td4.setAttribute("colspan", "3");
|
|---|
| 216 |
|
|---|
| 217 | div4.setAttribute("class", "tty");
|
|---|
| 218 | div4.id = "div4";
|
|---|
| 219 | div4.onscroll = function()
|
|---|
| 220 | {
|
|---|
| 221 | div4.userControl = div4.scrollHeight - div4.scrollTop!=div4.clientHeight;
|
|---|
| 222 | }
|
|---|
| 223 |
|
|---|
| 224 | td4.appendChild(div4);
|
|---|
| 225 |
|
|---|
| 226 | tr4.appendChild(td4);
|
|---|
| 227 |
|
|---|
| 228 | if (options['debug'])
|
|---|
| 229 | table.appendChild(tr4);
|
|---|
| 230 |
|
|---|
| 231 | // -----------------------------------------
|
|---|
| 232 |
|
|---|
| 233 | div.appendChild(table);
|
|---|
| 234 |
|
|---|
| 235 | // ============================================
|
|---|
| 236 |
|
|---|
| 237 | if (options['debug'])
|
|---|
| 238 | {
|
|---|
| 239 | var lvl = parseInt(options['debug'], 10);
|
|---|
| 240 | options['debugLevel'] = options['debug'];
|
|---|
| 241 | options['debug'] = function(msg) {
|
|---|
| 242 | if (!msg)
|
|---|
| 243 | return;
|
|---|
| 244 |
|
|---|
| 245 | if (lvl==1 && msg.substr(9, 3)=="emu") // emulate.js:
|
|---|
| 246 | return;
|
|---|
| 247 |
|
|---|
| 248 | if (msg.substr(9, 3)=="par") // parse.js
|
|---|
| 249 | {
|
|---|
| 250 | var sp = document.createElement("div");
|
|---|
| 251 | sp.setAttribute("style", "color:green");
|
|---|
| 252 | sp.appendChild(document.createTextNode(msg));
|
|---|
| 253 | div4.appendChild(sp);
|
|---|
| 254 | }
|
|---|
| 255 | else
|
|---|
| 256 | {
|
|---|
| 257 | div4.appendChild(document.createTextNode(msg));
|
|---|
| 258 | div4.appendChild(document.createElement("br"));
|
|---|
| 259 | }
|
|---|
| 260 |
|
|---|
| 261 | if (!div4.userControl)
|
|---|
| 262 | div4.scrollTop = div4.scrollHeight;
|
|---|
| 263 | }
|
|---|
| 264 | }
|
|---|
| 265 | else
|
|---|
| 266 | options['debug'] = function() { }
|
|---|
| 267 |
|
|---|
| 268 |
|
|---|
| 269 | function pad(v) { return ('0'+v).slice(-2); }
|
|---|
| 270 |
|
|---|
| 271 | options['onready'] = function(dat) {
|
|---|
| 272 | txt325.nodeValue = pad(dat.getUTCHours())+":"+pad(dat.getUTCMinutes())+":"+pad(dat.getUTCSeconds());
|
|---|
| 273 | div.style.display = 'inherit';
|
|---|
| 274 | }
|
|---|
| 275 |
|
|---|
| 276 | options['callback'] = function(arg)
|
|---|
| 277 | {
|
|---|
| 278 | if (arg.title)
|
|---|
| 279 | {
|
|---|
| 280 | var title = name;
|
|---|
| 281 | if (title.length)
|
|---|
| 282 | title += ": ";
|
|---|
| 283 | if (arg.title)
|
|---|
| 284 | title += arg.title;
|
|---|
| 285 | //if (arg.icon)
|
|---|
| 286 | // title += "["+arg.icon+"]";
|
|---|
| 287 |
|
|---|
| 288 | txt12.nodeValue = title;
|
|---|
| 289 | }
|
|---|
| 290 |
|
|---|
| 291 | if (arg.border)
|
|---|
| 292 | {
|
|---|
| 293 | var w = (arg.width||0)+"px ";
|
|---|
| 294 | td21.oldStyle = td21.getAttribute("style");
|
|---|
| 295 | td21.setAttribute("style", "padding:"+w+w+w+w+"; background-color:"+arg.border+";");
|
|---|
| 296 | }
|
|---|
| 297 | if (arg.border==null)
|
|---|
| 298 | {
|
|---|
| 299 | if (td21.oldStyle)
|
|---|
| 300 | td21.setAttribute("style", td21.oldStyle);
|
|---|
| 301 | }
|
|---|
| 302 | }
|
|---|
| 303 |
|
|---|
| 304 | options['onupdate'] = function(dat, frac) {
|
|---|
| 305 | txt323.nodeValue = pad(dat.getUTCHours())+":"+pad(dat.getUTCMinutes())+":"+pad(dat.getUTCSeconds());
|
|---|
| 306 | progress324.value = frac;
|
|---|
| 307 | }
|
|---|
| 308 |
|
|---|
| 309 | options['oncompletion'] = function() {
|
|---|
| 310 | input322b.setAttribute("style", "display:none;");
|
|---|
| 311 | input322a.setAttribute("style", "display:inline;");
|
|---|
| 312 | txt323.nodeValue = "--:--:--";
|
|---|
| 313 | }
|
|---|
| 314 |
|
|---|
| 315 | options['onbookmark'] = function() {
|
|---|
| 316 | input327a.setAttribute("style", "display:none;");
|
|---|
| 317 | input327b.setAttribute("style", "display:inline;");
|
|---|
| 318 | }
|
|---|
| 319 |
|
|---|
| 320 | options['onpause'] = function() {
|
|---|
| 321 | input322b.setAttribute("style", "display:none;");
|
|---|
| 322 | input322a.setAttribute("style", "display:inline;");
|
|---|
| 323 | }
|
|---|
| 324 | options['onplay'] = function() {
|
|---|
| 325 | input322a.setAttribute("style", "display:none;");
|
|---|
| 326 | input322b.setAttribute("style", "display:inline;");
|
|---|
| 327 | }
|
|---|
| 328 |
|
|---|
| 329 | div.player = new TTVPlayer(canvas, options);
|
|---|
| 330 |
|
|---|
| 331 | input321.onclick = function() { div.player.rewind(); }
|
|---|
| 332 | input322a.onclick = function() { div.player.playpause(); }
|
|---|
| 333 | input322b.onclick = function() { div.player.playpause(); }
|
|---|
| 334 | input326.onclick = function() { div.player.setBookmark(); }
|
|---|
| 335 | input327a.onclick = function() { div.player.jump(); }
|
|---|
| 336 | input327b.onclick = function() { div.player.jump(); }
|
|---|
| 337 |
|
|---|
| 338 | return div;
|
|---|
| 339 | }
|
|---|
| 340 |
|
|---|
| 341 | // This is a hack to avoid that the closure compiler will rename
|
|---|
| 342 | // these functions
|
|---|
| 343 | window['TTVDisplay'] = TTVDisplay;
|
|---|