{"version":3,"file":"poodll_scenariomediaskin.min.js","sources":["../src/poodll_scenariomediaskin.js"],"sourcesContent":["/* jshint ignore:start */\r\ndefine(['jquery', 'core/log', 'filter_poodll/utils_amd', 'filter_poodll/upskin_bar'], function ($, log, utils, upskin_bar) {\r\n\r\n    \"use strict\"; // jshint ;_;\r\n\r\n    log.debug('PoodLL Scenario Skin: initialising');\r\n\r\n    return {\r\n\r\n        instanceprops: null,\r\n        pmr: null,\r\n        uploaded: false,\r\n        recorded: false,\r\n        played: false,\r\n        mustResetResourcePlayer: false,\r\n\r\n        //for making multiple instances\r\n        clone: function () {\r\n            return $.extend(true, {}, this);\r\n        },\r\n\r\n        init: function (ip, pmr) {\r\n            this.instanceprops = ip;\r\n            this.pmr = pmr;\r\n        },\r\n\r\n\r\n        fetch_instanceprops: function () {\r\n            return this.instanceprops;\r\n        },\r\n\r\n\r\n        onUploadSuccess: function (controlbarid) {\r\n            $('#' + controlbarid + ' > .poodll_save-recording').hide();\r\n            // $('#' + controlbarid  + '_messages').hide();\r\n            $('#' + controlbarid + ' > .poodll_savedsuccessfully').show();\r\n        },\r\n\r\n        onUploadFailure: function (controlbarid) {\r\n            return;\r\n        },\r\n\r\n        fetch_status_bar: function (skin) {\r\n            var status = '<div class=\"poodll_status_' + skin + '\"></div>';\r\n            return status;\r\n        },\r\n\r\n        fetch_preview_audio: function (skin) {\r\n            var checkplayer = '<audio class=\"poodll_checkplayer_' + skin + ' hide\" controls playsinline=\"playsinline\"></audio>';\r\n            return checkplayer;\r\n        },\r\n        fetch_preview_video: function (skin) {\r\n            var checkplayer = '<video class=\"poodll_checkplayer_' + skin + '\" width=\"320\" height=\"240\" playsinline=\"playsinline\"></video>';\r\n            return checkplayer;\r\n        },\r\n        fetch_resource_audio: function (skin) {\r\n            var resourceplayer = '<audio class=\"poodll_resourceplayer_' + skin + ' hide\" src=\"@@RESOURCEURL@@\" playsinline controls></audio>';\r\n            return resourceplayer;\r\n        },\r\n        fetch_resource_video: function (skin) {\r\n            var resourceplayer = '<video class=\"poodll_resourceplayer_' + skin + ' hide\" src=\"@@RESOURCEURL@@\" playsinline=\"playsinline\"></video>';\r\n            return resourceplayer;\r\n        },\r\n        fetch_uploader_skin: function (controlbarid, element) {\r\n            var ip = this.fetch_instanceprops(controlbarid);\r\n            var upskin = upskin_bar.clone();\r\n            upskin.init(ip.config, element, ip.controlbar.split_progresscanvas, ip.controlbar.status);\r\n            return upskin;\r\n        },\r\n        onMediaError: function (e) {\r\n            console.error('media error', e);\r\n        },\r\n\r\n        onMediaSuccess_video: function (controlbarid) {\r\n            var ip = this.fetch_instanceprops(controlbarid);\r\n            ip.controlbar.stopbutton.attr('disabled', false);\r\n            ip.controlbar.savebutton.attr('disabled', false);\r\n        },\r\n\r\n        onMediaSuccess_audio: function (controlbarid) {\r\n            var ip = this.fetch_instanceprops(controlbarid);\r\n            ip.controlbar.checkplayer.attr('src', null);\r\n            ip.controlbar.stopbutton.attr('disabled', false);\r\n            ;\r\n            ip.controlbar.savebutton.attr('disabled', false);\r\n        },\r\n\r\n        handle_timer_update: function (controlbarid) {\r\n            if (!this.played && !this.recorded) {\r\n                return;\r\n            }\r\n            var ip = this.fetch_instanceprops(controlbarid);\r\n            var recordingstring = M.util.get_string('recui_recording', 'filter_poodll');\r\n            this.update_status(controlbarid, recordingstring + ip.timer.fetch_display_time());\r\n            if (ip.timer.seconds == 0 && ip.timer.initseconds > 0) {\r\n                ip.controlbar.stopbutton.click();\r\n            }\r\n        },\r\n\r\n        update_status: function (controlbarid, text) {\r\n            var ip = this.fetch_instanceprops(controlbarid);\r\n            ip.controlbar.status.html(text);\r\n        },\r\n\r\n        //set visuals for different states (ie recording or playing)\r\n        set_visual_mode: function (mode, ip) {\r\n            var self = this;\r\n\r\n            switch (mode) {\r\n\r\n                case 'recordingmode':\r\n                    self.disable_button(ip.controlbar.resourceplaybutton);\r\n                    ip.controlbar.resourceplaybutton.empty();\r\n                    ip.controlbar.resourceplaybutton.html('<span class=\"fa fa-microphone fa-3x\"></span>');\r\n                    ip.controlbar.resourceplaybutton.addClass('poodll_mediarecorderholder_scenario_recordcolor');\r\n                    ip.controlbar.status.addClass('poodll_mediarecorderholder_scenario_recordcolor');\r\n                    self.handle_timer_update(ip.controlbarid);\r\n                    self.enable_button(ip.controlbar.stopbutton);\r\n                    break;\r\n\r\n                case 'resourceplayingmode':\r\n                    self.disable_button(ip.controlbar.resourceplaybutton);\r\n                    self.disable_button(ip.controlbar.stopbutton);\r\n                    break;\r\n\r\n\r\n                case 'neverrecordedmode':\r\n                    ip.controlbar.resourceplaybutton.empty();\r\n                    ip.controlbar.resourceplaybutton.html('<p style=\"margin-bottom: 0px; font-size: 24px;\">Start</p>');\r\n\r\n                    self.enable_button(ip.controlbar.resourceplaybutton);\r\n                    self.disable_button(ip.controlbar.stopbutton);\r\n\r\n                    this.update_status(ip.controlbarid, M.util.get_string('recui_ready', 'filter_poodll'));\r\n                    break;\r\n\r\n                case 'allstoppedmode':\r\n                    self.disable_button(ip.controlbar.resourceplaybutton);\r\n                    self.disable_button(ip.controlbar.stopbutton);\r\n                    ip.controlbar.resourceplaybutton.empty();\r\n                    ip.controlbar.resourceplaybutton.html('<span class=\"fa fa-check fa-3x\"></span>');\r\n                    ip.controlbar.resourceplaybutton.removeClass('poodll_mediarecorderholder_scenario_recordcolor');\r\n                    ip.controlbar.status.removeClass('poodll_mediarecorderholder_scenario_recordcolor');\r\n                    this.update_status(ip.controlbarid, M.util.get_string('recui_finished', 'filter_poodll'));\r\n                    break;\r\n            }\r\n\r\n        },\r\n\r\n        //insert the control bar and return it to be reused\r\n        insert_controlbar_video: function (element, controlbarid, checkplayer, resourceplayer) {\r\n            var controlbar = this.prepare_controlbar(element, controlbarid, checkplayer, resourceplayer, 'video');\r\n            return controlbar;\r\n        },\r\n        //insert the control bar and return it to be reused\r\n        insert_controlbar_audio: function (element, controlbarid, checkplayer, resourceplayer) {\r\n            var controlbar = this.prepare_controlbar(element, controlbarid, checkplayer, resourceplayer, 'audio');\r\n            return controlbar;\r\n        },\r\n\r\n        //insert the control bar and return it to be reused\r\n        prepare_controlbar: function (element, controlbarid, checkplayer, resourceplayer, mediatype) {\r\n            var ip = this.fetch_instanceprops(controlbarid);\r\n            var skin_style = ip.config.media_skin_style;\r\n\r\n            var recorder_class = mediatype == 'video' ? 'poodll_mediarecorder_video' : 'poodll_mediarecorder_audio';\r\n\r\n            //load resource player with the src of the resource audio (or video ...never)\r\n            resourceplayer = resourceplayer.replace('@@RESOURCEURL@@', ip.config.resource);\r\n\r\n\r\n            var ss = this.pmr.fetch_strings();\r\n            var controls = '<div class=\"poodll_mediarecorderholder_scenario '\r\n                + recorder_class + '\" id=\"holder_' + controlbarid + '\">';\r\n\r\n            controls += '<div class=\"poodll_mediarecorderbox_scenario\" id=\"' + controlbarid + '\">';\r\n            controls += '<div class=\"style-holder ' + skin_style + '\">';\r\n\r\n            controls += checkplayer,\r\n                controls += resourceplayer,\r\n\r\n\r\n                //this is never displayed\r\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_scenario poodll_start-recording_scenario hide\">'\r\n                    + '<span class=\"fa fa-microphone fa-3x\"></span>'\r\n                    + '</button>';\r\n\r\n            //this is never displayed\r\n            controls += ' <button type=\"button\" class=\"poodll_mediarecorder_button_scenario poodll_playback-recording_scenario hide\">'\r\n                + '<span class=\"fa fa-play-circle fa-3x\"></span>'\r\n                + '</button>';\r\n\r\n            //this is never displayed\r\n            controls += ' <button type=\"button\" class=\"poodll_mediarecorder_button_scenario poodll_stopplayback-recording_scenario hide\">'\r\n                + '<span class=\"fa fa-stop-circle fa-3x\"></span>'\r\n                + '</button>';\r\n\r\n            //this is never displayed\r\n            controls += '<button type=\"button\" class=\"poodll_save-recording_scenario pmr_disabled hide\">' + ss['recui_save'] + '</button></div>';\r\n\r\n            //this IS displayed\r\n            controls += '<div class=\"poodll_mediarecorderholder_scenario\"><button type=\"button\" class=\"poodll_mediarecorder_button_scenario poodll_stop-recording_scenario pmr_disabled\" disabled>'\r\n                + '<p style=\"margin-bottom: 0px;font-size: 24px;\">Submit</p>'\r\n                + '</button></div>';\r\n\r\n            controls += '<div class=\"poodll_statusholder_scenario\" >';\r\n            controls += '<canvas class=\"scenario_range\"></canvas>';\r\n            var statushtml = this.fetch_status_bar('scenario');\r\n            controls += statushtml;\r\n            controls += '</div>';\r\n\r\n\r\n            //end if div\r\n            controls += '</div></div></div>';\r\n\r\n            // add to the page\r\n            $(element).append(controls);\r\n\r\n\r\n            //play button\r\n            var playbuttonhtml = '<button type=\"button\" class=\"poodll_mediarecorder_button_scenario poodll_play-resource_scenario\">'\r\n                + '<p style=\"margin-bottom: 0px; font-size: 24px;\">Start</p></button>';\r\n            var topscenario = '<div class=\"poodll_mediarecorderholder_scenario poodll_mediarecorder_scenario_topscenario\">' + playbuttonhtml + '</div>';\r\n\r\n            //divider\r\n            var divider = \"<hr />\";\r\n\r\n            //prepend the top scenario\r\n            $('.qtext').prepend(divider);\r\n            $('.qtext').prepend(topscenario);\r\n\r\n\r\n            var controlbar = {\r\n                scenario_progresscanvas: $('#' + controlbarid + ' .scenario_range'),\r\n                marker: $('#' + controlbarid + '  .marker'),\r\n                resourceplayer: $('#' + controlbarid + '  .poodll_resourceplayer_scenario'),\r\n                checkplayer: $('#' + controlbarid + '  .poodll_checkplayer_scenario'),\r\n                stopbutton: $('#' + controlbarid + '  .poodll_stop-recording_scenario'),\r\n                resourcestopbutton: $('#' + controlbarid + '  .poodll_stop-resource_scenario'),\r\n                startbutton: $('#' + controlbarid + '  .poodll_start-recording_scenario'),\r\n                playbackbutton: $('#' + controlbarid + '  .poodll_playback-recording_scenario'),\r\n                stopplaybackbutton: $('#' + controlbarid + '  .poodll_stopplayback-recording_scenario'),\r\n                savebutton: $('#' + controlbarid + '  .poodll_save-recording_scenario'),\r\n\r\n\r\n                //these are actually outside the control bar above the question text\r\n                resourceplaybutton: $('.poodll_mediarecorder_button_scenario.poodll_play-resource_scenario'),\r\n                status: $('.poodll_status_scenario'),\r\n            };\r\n            return controlbar;\r\n        }, //end of fetch_control_bar_scenario\r\n\r\n\r\n        register_controlbar_events_video: function (onMediaSuccess, controlbarid) {\r\n            return this.register_controlbar_events_audio(onMediaSuccess, controlbarid);\r\n        },\r\n\r\n        do_callback: function (args) {\r\n            //log.debug(args);\r\n            //args will look like this\r\n            /*\r\n            0:\"recorderbase5a367e03c2f9319\"\r\n            1:\"filesubmitted\"\r\n            2:\"poodllfile5a367e03c2f9318.mp3\"\r\n            3:\"q101:1_answer_id\"\r\n            */\r\n            switch (args[1]) {\r\n\r\n                case 'filesubmitted':\r\n                    //record the url on the html page,\r\n                    var filenamecontrol = document.getElementById(args[3]);\r\n                    if (filenamecontrol == null) {\r\n                        filenamecontrol = parent.document.getElementById(args[3]);\r\n                    }\r\n                    if (filenamecontrol) {\r\n                        filenamecontrol.value = args[2];\r\n                    }\r\n\r\n                    //enable the next button\r\n                    $('#responseform input[name=next]').attr('disabled', false);\r\n                //we used to click it. But client doesn't want that\r\n                // $('#responseform input[name=next]').click();\r\n            }\r\n        },\r\n\r\n\r\n        register_controlbar_events_audio: function (onMediaSuccess, controlbarid) {\r\n\r\n            var self = this;\r\n            var pmr = this.pmr;\r\n            var ip = this.fetch_instanceprops(controlbarid);\r\n\r\n            this.set_visual_mode('neverrecordedmode', ip);\r\n            ip.config.callbackjs = self.do_callback;\r\n\r\n            //disable the forms next button.\r\n            //its not a recorder button so we do not use our disable_button method here\r\n            $('#responseform input[name=next]').attr('disabled', true);\r\n\r\n\r\n            function poodll_resource_play(count_down) {\r\n                var cd;\r\n                var playingstring = M.util.get_string('recui_playing', 'filter_poodll');\r\n                self.update_status(controlbarid, playingstring + ip.timer.fetch_display_time(count_down));\r\n                cd = setInterval(function () {\r\n                    count_down--;\r\n                    if (count_down < 0) {\r\n                        clearInterval(cd);\r\n                    } else {\r\n                        self.update_status(controlbarid, playingstring + ip.timer.fetch_display_time(count_down));\r\n                    }\r\n                }, 1000);\r\n            }\r\n\r\n            /*\r\n            //this code was for the case when the recording should start AFTER the playback ends\r\n            ip.controlbar.resourceplayer.on('ended', function() {\r\n                ip.controlbar.startbutton.trigger( \"click\" );\r\n            });\r\n            */\r\n\r\n\r\n            ip.controlbar.startbutton.click(function () {\r\n\r\n                pmr.do_start_audio(ip, onMediaSuccess);\r\n                self.recorded = true;\r\n\r\n                //recording timer setup\r\n                ip.timer.reset();\r\n                ip.timer.start();\r\n\r\n                self.set_visual_mode('recordingmode', ip);\r\n\r\n\r\n            });\r\n\r\n            ip.controlbar.stopbutton.click(function () {\r\n                //stop playing\r\n                self.do_stop_resource(ip);\r\n                //stop recording\r\n                pmr.do_stop_audio(ip);\r\n                self.disable_button(this);\r\n\r\n                //click the 'save' button\r\n                //this timeout is ugly but we just need a few ms for the blobs to arrive\r\n                setTimeout(function () {\r\n                    ip.controlbar.savebutton.click();\r\n                }, 100);\r\n\r\n\r\n                //recording timer\r\n                ip.timer.stop();\r\n                self.set_visual_mode('allstoppedmode', ip);\r\n\r\n\r\n            });\r\n\r\n\r\n            ip.controlbar.resourceplaybutton.click(function () {\r\n\r\n                //we do not want to start the timer or get going if recording is off limits\r\n                //so we first call getUserMedia, and force a permissions check\r\n                navigator.mediaDevices.getUserMedia({\"audio\": true}).then(function (stream) {\r\n                    ip.controlbar.startbutton.trigger(\"click\");\r\n\r\n                    //flag played\r\n                    self.played = true;\r\n\r\n\r\n                    if (ip.config.resource != '') {\r\n                        self.do_play_resource(ip);\r\n                    }\r\n\r\n\r\n                }).catch(function (err) {\r\n                    alert(err);\r\n                });\r\n\r\n\r\n            });\r\n\r\n            ip.controlbar.resourcestopbutton.click(function () {\r\n                self.do_stop_resource(ip);\r\n\r\n                //do visuals\r\n                if (self.recorded) {\r\n                    self.set_visual_mode('allstoppedmode', ip);\r\n                } else {\r\n                    self.set_visual_mode('neverrecordedmode', ip);\r\n                }\r\n\r\n            });\r\n\r\n            ip.controlbar.savebutton.click(function () {\r\n                self.disable_button(this);\r\n                if (ip.blobs && ip.blobs.length > 0) {\r\n                    pmr.do_save_audio(ip);\r\n                    self.uploaded = true;\r\n                    self.disable_button(ip.controlbar.startbutton);\r\n                } else {\r\n                    ip.uploader.Output(M.util.get_string('recui_nothingtosaveerror', 'filter_poodll'));\r\n                }//end of if self.blobs\t\t\r\n                //probably not necessary  ... but getting odd ajax errors occasionally\r\n                return false;\r\n            });//end of save recording\r\n        }, //end of register_control_bar_events_scenario\r\n\r\n        set_completion: function (completed, ip) {\r\n            /*On hold for now Justin 20171007 */\r\n            return;\r\n\r\n            var completioncheck = ip.controlbar.completioncheck;\r\n            if (completed) {\r\n                completioncheck.removeClass('fa-circle');\r\n                completioncheck.addClass('fa-check-circle');\r\n            } else {\r\n                completioncheck.removeClass('fa-check-circle');\r\n                completioncheck.addClass('fa-circle');\r\n            }\r\n        },\r\n\r\n        //DO stop playing the resource\r\n        do_stop_resource: function (ip) {\r\n            console.log('stopped the resource');\r\n            var resourceplayer = ip.controlbar.resourceplayer.get(0);\r\n            resourceplayer.pause();\r\n            resourceplayer.currentTime = 0;\r\n\r\n            if (ip.mustResetResourcePlayer) {\r\n                ip.mustResetResourcePlayer = false;\r\n                resourceplayer.src = ip.config.resource;\r\n                var ppromise = resourceplayer.load();\r\n                /* \r\n\t\t\t\t// playPromise won’t be defined.\r\n\t\t\t\tif (ppromise !== undefined) {\r\n\t\t\t\t\tppromise.then(function() {resourceplayer.pause();});\r\n\t\t\t\t}else{\r\n\t\t\t\t\tresourceplayer.oncanplay(resourceplayer.pause());\r\n\t\t\t\t}\r\n\t\t\t\t*/\r\n            }\r\n        },\r\n\r\n\r\n        //do the play of resource\r\n        do_play_resource: function (ip) {\r\n            //if was used to play recording, we need to reset it\r\n            var resourceplayer = ip.controlbar.resourceplayer.get(0);\r\n            resourceplayer.play();\r\n            resourceplayer.currentTime = 0;\r\n        },\r\n\r\n        enable_button: function (button) {\r\n            $(button).attr('disabled', false);\r\n            $(button).removeClass('pmr_disabled');\r\n        },\r\n        disable_button: function (button) {\r\n            $(button).attr('disabled', true);\r\n            $(button).addClass('pmr_disabled');\r\n        },\r\n\r\n    };//end of returned object\r\n\r\n\r\n});//total end\r\n"],"names":["define","$","log","utils","upskin_bar","debug","instanceprops","pmr","uploaded","recorded","played","mustResetResourcePlayer","clone","extend","this","init","ip","fetch_instanceprops","onUploadSuccess","controlbarid","hide","show","onUploadFailure","fetch_status_bar","skin","fetch_preview_audio","fetch_preview_video","fetch_resource_audio","fetch_resource_video","fetch_uploader_skin","element","upskin","config","controlbar","split_progresscanvas","status","onMediaError","e","console","error","onMediaSuccess_video","stopbutton","attr","savebutton","onMediaSuccess_audio","checkplayer","handle_timer_update","recordingstring","M","util","get_string","update_status","timer","fetch_display_time","seconds","initseconds","click","text","html","set_visual_mode","mode","disable_button","resourceplaybutton","empty","addClass","enable_button","removeClass","insert_controlbar_video","resourceplayer","prepare_controlbar","insert_controlbar_audio","mediatype","controls","media_skin_style","replace","resource","fetch_strings","append","prepend","scenario_progresscanvas","marker","resourcestopbutton","startbutton","playbackbutton","stopplaybackbutton","register_controlbar_events_video","onMediaSuccess","register_controlbar_events_audio","do_callback","args","filenamecontrol","document","getElementById","parent","value","self","callbackjs","do_start_audio","reset","start","do_stop_resource","do_stop_audio","setTimeout","stop","navigator","mediaDevices","getUserMedia","then","stream","trigger","do_play_resource","catch","err","alert","blobs","length","do_save_audio","uploader","Output","set_completion","completed","get","pause","currentTime","src","load","play","button"],"mappings":"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"}