{"version":3,"file":"poodll_oncemediaskin.min.js","sources":["../src/poodll_oncemediaskin.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, settings) {\n\n        \"use strict\"; // jshint ;_;\n\n        log.debug('PoodLL Once Recorder 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 + ' > .poodll_savedsuccessfully').show();\n            },\n\n            onUploadFailure: function (controlbarid) {\n                return;\n            },\n\n            fetch_status_bar: function (skinname) {\n                var status = '<div class=\"poodll_status_' + skinname + '\" width=\"320\" height=\"50\">00:00:00</div>';\n                return status;\n            },\n\n            fetch_preview_audio: function (skinname) {\n                var preview = '<audio class=\"poodll_preview_' + skinname + '\" style=\"display: none;\" playsinline=\"playsinline\" muted></audio>';\n                return preview;\n            },\n            fetch_preview_video: function (skinname) {\n                var preview = '<video class=\"poodll_preview_' + skinname + '\" style=\"display: none;\" playsinline=\"playsinline\" muted></video>';\n                return preview;\n            },\n            fetch_resource_audio: function (skinname) {\n                var resourceplayer = '<audio class=\"poodll_resourceplayer_' + skinname + '\" style=\"display: none;\" playsinline=\"playsinline\"></audio>';\n                return resourceplayer;\n            },\n            fetch_resource_video: function (skinname) {\n                var resourceplayer = '<video class=\"poodll_resourceplayer_' + skinname + '\" style=\"display: none;\" playsinline=\"playsinline\"></video>';\n                return resourceplayer;\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();\n\n                //clear messages\n                ip.uploader.Output('');\n\n                //timer and status bar\n                ip.timer.reset();\n                ip.timer.start();\n                this.update_status(controlbarid);\n\n                this.set_visual_mode('recordingmode', controlbarid);\n            },\n\n            onMediaSuccess_audio: function (controlbarid) {\n                var ip = this.fetch_instanceprops();\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();\n                this.therecanim.displaytime = ip.timer.fetch_display_time();\n                this.update_status(controlbarid);\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();\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();\n                var upskin = upskin_radial.clone();\n                upskin.init(ip.config, element, ip.controlbar.uploadcanvas, ip.controlbar.uploadmessages);\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();\n\n                switch (mode) {\n\n                    case 'readymode':\n\n                        ip.controlbar.status.show();\n                        self.enable_button(ip.controlbar.startbutton);\n                        self.enable_button(ip.controlbar.settingsicon);\n                        self.disable_button(ip.controlbar.finishedbutton);\n                        self.disable_button(ip.controlbar.stopbutton);\n                        ip.controlbar.uploadcanvas.hide();\n                        self.therecanim.setDrawParam('wavColor', '#CCCCCC');\n                        self.therecanim.clear();\n                        if (ip.config.mediatype == 'video') {\n                            ip.controlbar.playcanvas.hide();\n                            ip.controlbar.preview.show();\n                        } else {\n                            ip.controlbar.playcanvas.show();\n                            ip.controlbar.preview.hide();\n                        }\n                        break;\n\n                    case 'recordingmode':\n                        //when testing(timer off) we do not want the stop button. Just really recording and allowearlyexit\n                        self.enable_button(ip.controlbar.stopbutton);\n                        self.focus_button(ip.controlbar.stopbutton);\n                        self.disable_button(ip.controlbar.startbutton);\n                        self.disable_button(ip.controlbar.settingsicon);\n\n                        if (ip.config.mediatype == 'video') {\n                            ip.controlbar.playcanvas.hide();\n                            ip.controlbar.preview.show();\n                        } else {\n                            ip.controlbar.playcanvas.show();\n                            ip.controlbar.preview.hide();\n                        }\n\n                        ip.controlbar.uploadcanvas.hide();\n                        self.therecanim.setDrawParam('wavColor', '#FF0000');\n                        self.therecanim.clear();\n                        ip.controlbar.status.show();\n                        break;\n\n                    case 'aftermode':\n                        self.disable_button(ip.controlbar.startbutton);\n                        self.disable_button(ip.controlbar.stopbutton);\n                        self.enable_button(ip.controlbar.settingsicon);\n                        self.therecanim.setDrawParam('wavColor', '#CCCCCC');\n                        self.therecanim.clear();\n                        ip.controlbar.playcanvas.hide();\n                        if (ip.config.mediatype == 'video') {\n                            ip.controlbar.preview.hide();\n                        }\n                        ip.controlbar.uploadcanvas.show();\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                var controlbar = this.prepare_controlbar(element, controlbarid, preview, resource, 'video');\n                return controlbar;\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();\n                var skin_style = ip.config.media_skin_style;\n\n                var recorder_class = mediatype == 'video' ? 'poodll_mediarecorder_video' : 'poodll_mediarecorder_audio';\n                var size_class = 'poodll_mediarecorder_size_auto';\n\n                var ss = this.pmr.fetch_strings();\n                var ss_startlabel = ss['recui_record'];\n                var ss_stoplabel = ss['recui_stop'];\n                var ss_settingslabel = ss['recui_settings'];\n\n                var status = this.fetch_status_bar('once');\n                var controls = '<div class=\"poodll_mediarecorderholder_once '\n                    + recorder_class + '\" id=\"holder_' + controlbarid + '\">';\n\n                controls += '<div class=\"poodll_mediarecorderbox_once\" 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-poodllsettings\" data-toggle=\"modal\" data-target=\"#myModal\" aria-label=\"' + ss_settingslabel + '\"><i class=\"fa fa-cogs\" aria-hidden=\"true\"></i></button></div>';\n                controls += '<canvas id=\"' + controlbarid + '_playcanvas\" width=\"250\" height=\"50\" class=\"poodll_mediarecorder_playcanvas_once\"></canvas>';\n                controls += status;\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_once poodll_start-recording_once\" aria-label=\"' + ss_startlabel + '\"  tabindex=\"0\">' + ss_startlabel + '</button>';\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_once poodll_stop-recording_once\" aria-label=\"' + ss_stoplabel + '\"  tabindex=\"0\">' + ss_stoplabel + '</button>';\n                if (mediatype == 'audio') {\n                    controls += '<canvas id=\"' + controlbarid + '_uploadcanvas\" width=\"250\" height=\"50\" class=\"poodll_mediarecorder_uploadcanvas_once\"></canvas>';\n                } else {\n                    //we keep the canvas same height as video, but narrowe so the radial stays under the timer (we center it with CSS)\n                    controls += '<canvas id=\"' + controlbarid + '_uploadcanvas\" width=\"130\" height=\"210\" class=\"poodll_mediarecorder_uploadcanvas_once\"></canvas>';\n                }\n\n                controls += '<div class=\"poodll_uploadmessages_once\"></div>';\n\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_once'),\n                    preview: $('#' + controlbarid + ' .poodll_preview_once'),\n                    startbutton: $('#' + controlbarid + ' .poodll_start-recording_once'),\n                    stopbutton: $('#' + controlbarid + ' .poodll_stop-recording_once'),\n                    playcanvas: $('#' + controlbarid + '_playcanvas'),\n                    uploadcanvas: $('#' + controlbarid + '_uploadcanvas'),\n                    uploadmessages: $('#' + controlbarid + ' .poodll_uploadmessages_once')\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_once\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();\n\n                //init recording anim\n                ip.config.recanim = 'hwave_mic';\n                var recanim = hwave.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('readymode', controlbarid);\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                    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                    //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_once\n\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            focus_button: function (button) {\n                $(button).focus();\n            },\n\n        };//end of returned object\n    });//total end\n"],"names":["define","$","log","utils","upskin_radial","hwave","settings","debug","instanceprops","pmr","devsettings","therecanim","clone","extend","this","init","ip","fetch_instanceprops","onUploadSuccess","controlbarid","hide","show","onUploadFailure","fetch_status_bar","skinname","fetch_preview_audio","fetch_preview_video","fetch_resource_audio","fetch_resource_video","onMediaError","e","console","error","onMediaSuccess_video","uploader","Output","timer","reset","start","update_status","set_visual_mode","onMediaSuccess_audio","controlbar","preview","attr","handle_timer_update","displaytime","fetch_display_time","seconds","initseconds","stopbutton","click","status","html","fetch_uploader_skin","element","upskin","config","uploadcanvas","uploadmessages","setDrawParam","mode","enable_button","startbutton","settingsicon","disable_button","finishedbutton","clear","mediatype","playcanvas","focus_button","insert_controlbar_video","resource","prepare_controlbar","insert_controlbar_audio","skin_style","media_skin_style","recorder_class","ss","fetch_strings","ss_startlabel","ss_stoplabel","ss_settingslabel","controls","fetch_dialogue_box","downloaddialog","errordialog","prepend","settingsdialog","errorsdialog","set_dialogue_box","register_controlbar_events_video","onMediaSuccess","register_controlbar_events_audio","self","recanim","audioanalyser","get","uploaded","open","hermes","enable","do_start_audio","do_stop_audio","stop","doDeferredUpload","blobs","length","do_save_audio","setTimeout","window","onbeforeunload","button","removeClass","addClass","focus"],"mappings":"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"}