web/res/metadataplayer/NoteTaking.js
changeset 1558 761ba7426984
parent 1557 7c67caaafdeb
child 1559 796b49572291
equal deleted inserted replaced
1557:7c67caaafdeb 1558:761ba7426984
     1 /* This widget displays a note-taking view, that can be saved to localStorage */
       
     2 
       
     3 IriSP.Widgets.NoteTaking = function(player, config) {
       
     4     IriSP.Widgets.Widget.call(this, player, config);
       
     5 }
       
     6 
       
     7 IriSP.Widgets.NoteTaking.prototype = new IriSP.Widgets.Widget();
       
     8 
       
     9 IriSP.Widgets.NoteTaking.prototype.defaults = {
       
    10     // Id that will be used as localStorage key
       
    11     editable_storage: ""
       
    12 }
       
    13 
       
    14 IriSP.Widgets.NoteTaking.prototype.template = '<textarea class="Ldt-NoteTaking-Text"></textarea>';
       
    15 
       
    16 IriSP.Widgets.NoteTaking.prototype.draw = function() {
       
    17     var widget = this;
       
    18     var content;
       
    19     var $ = IriSP.jQuery;
       
    20 
       
    21     widget.renderTemplate();
       
    22     content = widget.$.find('.Ldt-NoteTaking-Text');
       
    23 
       
    24     function load_content() {
       
    25         $(content).val(window.localStorage[widget.editable_storage]);
       
    26     }
       
    27     function save_content() {
       
    28         window.localStorage[widget.editable_storage] = $(content).val();
       
    29     }
       
    30 
       
    31     // Load current transcript
       
    32     if (window.localStorage[widget.editable_storage]) {
       
    33         load_content();
       
    34     }
       
    35 
       
    36     // Thanks to http://stackoverflow.com/questions/4456545/how-to-insert-text-at-the-current-caret-position-in-a-textarea
       
    37     $.fn.insertAtCaret = function(text) {
       
    38         return this.each(function() {
       
    39             if (this.selectionStart !== undefined) {
       
    40                 // mozilla/netscape support
       
    41                 var startPos = this.selectionStart,
       
    42                     endPos = this.selectionEnd,
       
    43                     scrollTop = this.scrollTop;
       
    44                 this.value = this.value.substring(0, startPos) + text + this.value.substring(endPos, this.value.length);
       
    45                 this.focus();
       
    46                 this.selectionStart = startPos + text.length;
       
    47                 this.selectionEnd = startPos + text.length;
       
    48                 this.scrollTop = scrollTop;
       
    49             } else {
       
    50                 // IE input[type=text] and other browsers
       
    51                 this.value += text;
       
    52                 this.focus();
       
    53                 this.value = this.value;    // forces cursor to end
       
    54             }
       
    55         });
       
    56     };
       
    57 
       
    58     function getAroundCaret(el, length) {
       
    59         // Return a selection of 2 * length characters around the caret
       
    60         var startPos = el.selectionStart;
       
    61         return el.value.substring(startPos - length, startPos + length);
       
    62     };
       
    63 
       
    64 
       
    65     $(content).keydown(function (_event) {
       
    66         if (_event.keyCode == 13 && (_event.ctrlKey || _event.metaKey)) {
       
    67             // Insert current timestamp
       
    68             _event.preventDefault();
       
    69             // Get current value
       
    70             var match = /\[([\d:]+)\]/.exec(getAroundCaret(content[0], 8));
       
    71             if (match) {
       
    72                 // Found a timecode. Go to position.
       
    73                 widget.media.setCurrentTime(IriSP.timestamp2ms(match[1]));
       
    74             } else {
       
    75                 $(content).insertAtCaret("[" + (new IriSP.Model.Time(widget.media.getCurrentTime())).toString() + "]");
       
    76                 save_content();
       
    77             }
       
    78         }
       
    79     }).on("input", function (_event) {
       
    80         console.log("Change");
       
    81         // Store updated value
       
    82         save_content();
       
    83     }).on("dblclick", function (_event) {
       
    84             var match = /\[([\d:]+)\]/.exec(getAroundCaret(content[0], 8));
       
    85             if (match) {
       
    86                 // Found a timecode. Go to position.
       
    87                 _event.preventDefault();
       
    88                 widget.media.setCurrentTime(IriSP.timestamp2ms(match[1]));
       
    89             };
       
    90     });
       
    91 };