{"version":3,"file":"poodll_readaloudmediaskin.min.js","sources":["../src/poodll_readaloudmediaskin.js"],"sourcesContent":["/* jshint ignore:start */\ndefine(['jquery', 'core/log', 'filter_poodll/utils_amd', 'filter_poodll/upskin_radial',\n        'filter_poodll/anim_hwave_mic', 'filter_poodll/dlg_devicesettings'],\n    function ($, log, utils, upskin_radial, hwave_mic, settings) {\n\n        \"use strict\"; // jshint ;_;\n\n        log.debug('PoodLL Read Aloud Skin: initialising');\n\n        return {\n\n            instanceprops: null,\n            pmr: null,\n            devsettings: null,\n            therecanim: null,\n\n            //for making multiple instances\n            clone: function () {\n                return $.extend(true, {}, this);\n            },\n\n            init: function (ip, pmr) {\n                this.instanceprops = ip;\n                this.pmr = pmr;\n                this.devsettings = settings.clone();\n                this.devsettings.init(pmr, ip);\n            },\n\n\n            fetch_instanceprops: function () {\n                return this.instanceprops;\n            },\n\n\n            onUploadSuccess: function (controlbarid) {\n                $('#' + controlbarid + ' > .poodll_save-recording').hide();\n                // $('#' + controlbarid  + '_messages').hide();\n                $('#' + controlbarid + ' > .poodll_savedsuccessfully').show();\n            },\n\n            onUploadFailure: function (controlbarid) {\n                return;\n            },\n\n            fetch_status_bar: function (skin) {\n                var status = '<div class=\"poodll_status_' + skin + '\" width=\"100%\" height=\"50\">00:00:00</div>';\n                return status;\n            },\n\n            fetch_preview_audio: function (skin) {\n                var preview = '<audio class=\"poodll_preview_' + skin + ' hide\" playsInline muted></audio>';\n                return preview;\n            },\n            fetch_preview_video: function (skin) {\n                return this.fetch_preview_audio(skin);\n            },\n            fetch_resource_audio: function (skin) {\n                var resourceplayer = '<audio class=\"poodll_resourceplayer_' + skin + ' hide\" ></audio>';\n                return resourceplayer;\n            },\n            fetch_resource_video: function (skin) {\n                return this.fetch_resource_audio(skin);\n            },\n\n            onMediaError: function (e) {\n                console.error('media error', e);\n            },\n\n            onMediaSuccess_video: function (controlbarid) {\n                var ip = this.fetch_instanceprops(controlbarid);\n                this.set_visual_mode('recordingmode', controlbarid);\n            },\n\n            onMediaSuccess_audio: function (controlbarid) {\n                var ip = this.fetch_instanceprops(controlbarid);\n                ip.controlbar.preview.attr('src', null);\n\n                //clear messages\n                ip.uploader.Output('');\n\n                //wave animation\n                this.therecanim.start();\n\n                //timer and status bar\n                ip.timer.reset();\n                ip.timer.start();\n                this.update_status(controlbarid);\n\n                //visuals\n                this.set_visual_mode('recordingmode', controlbarid);\n            },\n\n            handle_timer_update: function (controlbarid) {\n                var ip = this.fetch_instanceprops(controlbarid);\n                var displaytime = ip.timer.fetch_display_time();\n                this.therecanim.displaytime =displaytime;\n                ip.controlbar.status.html(displaytime);\n                if (ip.timer.seconds == 0 && ip.timer.initseconds > 0) {\n                    ip.controlbar.stopbutton.click();\n                }\n            },\n\n            update_status: function (controlbarid) {\n                var ip = this.fetch_instanceprops(controlbarid);\n                ip.controlbar.status.html(ip.timer.fetch_display_time());\n            },\n\n            fetch_uploader_skin: function (controlbarid, element) {\n                var ip = this.fetch_instanceprops(controlbarid);\n                var upskin = upskin_radial.clone();\n                upskin.init(ip.config, element, ip.controlbar.playcanvas, ip.controlbar.status);\n                upskin.setDrawParam('lineWidth', 2);\n                upskin.setDrawParam('font', '14px Arial');\n                return upskin;\n            },\n\n            //set visuals for different states (ie recording or playing)\n            set_visual_mode: function (mode, controlbarid) {\n                var self = this;\n                var ip = this.fetch_instanceprops(controlbarid);\n\n                switch (mode) {\n\n                    case 'startmode':\n\n                        ip.controlbar.status.hide();\n                        if(ip.config.juststart == \"1\"){\n                            self.disable_button(ip.controlbar.testbutton);\n                            self.enable_button(ip.controlbar.startbutton);\n                            self.focus_button(ip.controlbar.startbutton);\n                        }else{\n                            self.enable_button(ip.controlbar.testbutton);\n                            self.focus_button(ip.controlbar.testbutton);\n                            self.disable_button(ip.controlbar.startbutton);\n                        }\n                        self.disable_button(ip.controlbar.placeholderbutton);\n                        self.disable_button(ip.controlbar.stopbutton);\n                        self.therecanim.clear();\n                        break;\n\n                    case 'testingmode':\n\n                        ip.controlbar.status.hide();\n                        self.disable_button(ip.controlbar.startbutton);\n                        self.disable_button(ip.controlbar.testbutton);\n                        self.enable_button(ip.controlbar.placeholderbutton);\n                        self.disable_button(ip.controlbar.stopbutton);\n\n                        break;\n\n                        //not implemented\n                    case 'countdownmode':\n\n                        break;\n\n                    case 'readymode':\n\n                        ip.controlbar.status.hide();\n                        self.enable_button(ip.controlbar.startbutton);\n                        self.focus_button(ip.controlbar.startbutton);\n                        self.disable_button(ip.controlbar.testbutton);\n                        self.disable_button(ip.controlbar.placeholderbutton);\n                        self.disable_button(ip.controlbar.stopbutton);\n                        self.therecanim.setDrawParam('wavColor', '#CCCCCC');\n                        self.therecanim.clear();\n                        break;\n\n                    case 'recordingmode':\n                        //when testing(timer off) we do not want the stop button. Just really recording and allowearlyexit\n                        if (ip.config.allowearlyexit == \"1\" && ip.timer.enabled) {\n                            self.enable_button(ip.controlbar.stopbutton);\n                        }\n                        if ( ip.timer.enabled) {\n                            ip.controlbar.status.show();\n                            self.therecanim.setDrawParam('wavColor', '#FF0000');\n                            self.therecanim.clear();\n                            self.disable_button(ip.controlbar.placeholderbutton);\n                        }else{\n                            self.therecanim.setDrawParam('wavColor', '#0000FF');\n                            self.therecanim.clear();\n                            self.enable_button(ip.controlbar.placeholderbutton);\n                        }\n                        self.disable_button(ip.controlbar.testbutton);\n                        self.disable_button(ip.controlbar.startbutton);\n\n                        break;\n\n                    case 'aftermode':\n                        self.disable_button(ip.controlbar.startbutton);\n                        self.disable_button(ip.controlbar.stopbutton);\n                        self.disable_button(ip.controlbar.placeholderbutton);\n                        self.therecanim.setDrawParam('wavColor', '#CCCCCC');\n                        self.therecanim.clear();\n                        ip.controlbar.status.show();\n\n                        break;\n\n                }\n\n            },\n\n            //insert the control bar and return it to be reused\n            insert_controlbar_video: function (element, controlbarid, preview, resource) {\n                return this.prepare_controlbar_audio(element, controlbarid, preview, resource);\n            },\n            //insert the control bar and return it to be reused\n            insert_controlbar_audio: function (element, controlbarid, preview, resource) {\n                var controlbar = this.prepare_controlbar(element, controlbarid, preview, resource, 'audio');\n                return controlbar;\n            },\n\n            //insert the control bar and return it to be reused\n            prepare_controlbar: function (element, controlbarid, preview, resource, mediatype) {\n                var ip = this.fetch_instanceprops(controlbarid);\n                var skin_style = ip.config.media_skin_style;\n\n                var recorder_class = 'poodll_mediarecorder_audio';\n                var size_class = 'poodll_mediarecorder_size_auto';\n\n                var ss = this.pmr.fetch_strings();\n                var ss_startlabel = '<i class=\"fa fa-microphone\"></i>'; //M.util.get_string('recui_start', 'filter_poodll');\n                var ss_testlabel = '<i class=\"fa fa-microphone\"></i>';//M.util.get_string('recui_testmic', 'filter_poodll');\n                var ss_stoplabel = '<i class=\"fa fa-stop\">';//M.util.get_string('recui_stop', 'filter_poodll');\n\n                var status = this.fetch_status_bar('readaloud');\n                var controls = '<div class=\"poodll_mediarecorderholder_readaloud '\n                    + recorder_class + '\" id=\"holder_' + controlbarid + '\">';\n\n                controls += '<div class=\"poodll_mediarecorderbox_readaloud\" id=\"' + controlbarid + '\">';\n                controls += this.devsettings.fetch_dialogue_box();\n                controls += ip.downloaddialog.fetch_dialogue_box();\n                controls += ip.errordialog.fetch_dialogue_box();\n                controls += '<div class=\"style-holder ' + skin_style + '\">';\n                controls += preview;\n                controls += '<div class=\"settingsicon\" id=\"settingsicon_' + controlbarid + '\"><button type=\"button\" class=\"btn btn-info btn-lg\" data-toggle=\"modal\" data-target=\"#myModal\" aria-label=\"' + ss['recui_settings'] + '\"><i class=\"fa fa-cogs\" aria-hidden=\"true\"></i></button></div>';\n                controls += '<canvas id=\"' + controlbarid + '_playcanvas\" width=\"180\" height=\"50\"></canvas>';\n                controls += status;\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_readaloud poodll_start-recording_readaloud\" aria-label=\"' + ss['recui_record'] + '\"  tabindex=\"0\">' + ss_startlabel + '</button>';\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_readaloud poodll_test-recording_readaloud\" aria-label=\"' + ss['recui_soundtest'] + '\"  tabindex=\"0\">' + ss_testlabel + '</button>';\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_readaloud poodll_testing-placeholder_readaloud\" aria-label=\"' + ss['recui_soundtesting'] + '\"  tabindex=\"0\" style=\"background-color: #CCCCCC;\">' + ss_testlabel  + '</button>';\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_readaloud poodll_stop-recording_readaloud\" aria-label=\"' + ss['recui_stop'] + '\"  tabindex=\"0\">' + ss_stoplabel + '</button>';\n                controls += '</div></div></div>';\n                $(element).prepend(controls);\n                //<i class=\"fa fa-stop\" aria-hidden=\"true\"></i>\n                var controlbar = {\n                    settingsdialog: $('#' + controlbarid + ' .poodll_dialogue_box_settings'),\n                    downloaddialog: $('#' + controlbarid + ' .poodll_dialogue_box_download'),\n                    errorsdialog: $('#' + controlbarid + ' .poodll_dialogue_box_errors'),\n                    settingsicon: $('#' + controlbarid + ' .settingsicon'),\n                    status: $('#' + controlbarid + ' .poodll_status_readaloud'),\n                    preview: $('#' + controlbarid + ' .poodll_preview_readaloud'),\n                    startbutton: $('#' + controlbarid + ' .poodll_start-recording_readaloud'),\n                    testbutton: $('#' + controlbarid + ' .poodll_test-recording_readaloud'),\n                    placeholderbutton: $('#' + controlbarid + ' .poodll_testing-placeholder_readaloud'),\n                    stopbutton: $('#' + controlbarid + ' .poodll_stop-recording_readaloud'),\n                    playcanvas: $('#' + controlbarid + '_playcanvas')\n                };\n                //settings and error and download dialogs\n                //settings is on 'this' because it is shown from skkn events, but errors are from pmr stuff\n                ip.downloaddialog.set_dialogue_box(controlbar.downloaddialog);\n                ip.errordialog.set_dialogue_box(controlbar.errorsdialog);\n                this.devsettings.set_dialogue_box(controlbar.settingsdialog);\n\n                return controlbar;\n            }, //end of fetch_control_bar_readaloud\n\n\n            register_controlbar_events_video: function (onMediaSuccess, controlbarid) {\n                return this.register_controlbar_events_audio(onMediaSuccess, controlbarid);\n            },\n\n            register_controlbar_events_audio: function (onMediaSuccess, controlbarid) {\n\n                var self = this;\n                var pmr = this.pmr;\n                var ip = this.fetch_instanceprops(controlbarid);\n\n                //init recording anim\n                ip.config.recanim = 'hwave_mic';\n                var recanim = hwave_mic.clone();\n                self.therecanim = recanim;\n                recanim.init(ip.audioanalyser, ip.controlbar.playcanvas.get(0));\n\n                //set visual mode\n                this.set_visual_mode('startmode', controlbarid);\n\n\n                //Test button click\n                ip.controlbar.testbutton.click(function () {\n                    //we will start recording here.\n                    //but its just a throwaway so we disable messages to API client and timer\n                    ip.config.hermes.disable();\n                    ip.timer.disable();\n\n\n\n                    var testover = function () {\n                        //stop recording\n                        pmr.do_stop_audio(ip);\n                        //wave animation\n                        recanim.clear();\n                        if (recanim.sounddetected) {\n                            self.set_visual_mode('readymode', controlbarid);\n                        }\n                    };\n                    pmr.do_start_audio(ip, onMediaSuccess);\n                    self.set_visual_mode('testingmode', controlbarid);\n                    setTimeout(testover, 4000);\n                });\n\n\n                ip.controlbar.settingsicon.click(function () {\n                    if (!self.uploaded) {\n                        self.devsettings.open();\n                    } else {\n                        ip.downloaddialog.open();\n                    }\n                });\n\n                //Start button click\n                ip.controlbar.startbutton.click(function () {\n                    //we start real recording here.\n                    // so we enable messages to API client and timer\n                    ip.config.hermes.enable();\n                    ip.timer.enable();\n\n                    pmr.do_start_audio(ip, onMediaSuccess);\n                });\n\n\n                //Stop button click\n                ip.controlbar.stopbutton.click(function () {\n\n                    //stop recording\n                    pmr.do_stop_audio(ip);\n\n                    //wave animation\n                    recanim.clear();\n\n\n                    //timer and status bar\n                    ip.timer.stop()\n                    self.update_status(controlbarid);\n\n                    //call upload right away\n                    //but we have to do it this lame deferred way because some mediastreamrecorders return a single\n                    //blob shortly after we stop. We init like that too, to make sure we do not truncate a users recording\n                    //if the mini blobs did not arrive\n                    var doDeferredUpload = function () {\n                        if (ip.blobs && ip.blobs.length > 0) {\n                            pmr.do_save_audio(ip);\n                            ip.uploaded = true;\n                            self.disable_button(ip.controlbar.startbutton);\n                        } else {\n                            setTimeout(doDeferredUpload, 200);\n                        }\n                    }\n                    setTimeout(doDeferredUpload, 200);\n\n                    //set visuals\n                    self.set_visual_mode('aftermode', controlbarid);\n\n                });\n\n\n                window.onbeforeunload = function () {\n                    //no need to do anything here\n                    // self.enable_button(ip.controlbar.startbutton);\n\n                };\n            }, //end of register_control_bar_events_readaloud\n\n            focus_button: function (button) {\n                $(button).focus();\n            },\n            enable_button: function (button) {\n                $(button).attr('disabled', false);\n                $(button).removeClass('pmr_disabled');\n            },\n            disable_button: function (button) {\n                $(button).attr('disabled', true);\n                $(button).addClass('pmr_disabled');\n            },\n\n        };//end of returned object\n    });//total end\n"],"names":["define","$","log","utils","upskin_radial","hwave_mic","settings","debug","instanceprops","pmr","devsettings","therecanim","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","onMediaError","e","console","error","onMediaSuccess_video","set_visual_mode","onMediaSuccess_audio","controlbar","preview","attr","uploader","Output","start","timer","reset","update_status","handle_timer_update","displaytime","fetch_display_time","status","html","seconds","initseconds","stopbutton","click","fetch_uploader_skin","element","upskin","config","playcanvas","setDrawParam","mode","juststart","disable_button","testbutton","enable_button","startbutton","focus_button","placeholderbutton","clear","allowearlyexit","enabled","insert_controlbar_video","resource","prepare_controlbar_audio","insert_controlbar_audio","prepare_controlbar","mediatype","skin_style","media_skin_style","ss","fetch_strings","controls","fetch_dialogue_box","downloaddialog","errordialog","prepend","settingsdialog","errorsdialog","settingsicon","set_dialogue_box","register_controlbar_events_video","onMediaSuccess","register_controlbar_events_audio","self","recanim","audioanalyser","get","hermes","disable","do_start_audio","setTimeout","do_stop_audio","sounddetected","uploaded","open","enable","stop","doDeferredUpload","blobs","length","do_save_audio","window","onbeforeunload","button","focus","removeClass","addClass"],"mappings":"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"}