{"version":3,"file":"poodll_readseedmediaskin.min.js","sources":["../src/poodll_readseedmediaskin.js"],"sourcesContent":["/* jshint ignore:start */\ndefine(['jquery', 'core/log', 'filter_poodll/utils_amd', 'filter_poodll/upskin_radial', 'filter_poodll/upskin_bar',\n        'filter_poodll/anim_hwave_mic', 'filter_poodll/dlg_devicesettings'],\n    function ($,  log, utils, upskin_radial, upskin_bar, hwave_mic, settings) {\n\n        \"use strict\"; // jshint ;_;\n\n        log.debug('PoodLL Read Seed Skin: initialising');\n\n        return {\n\n            instanceprops: null,\n            pmr: null,\n            devsettings: null,\n            therecanim: null,\n            buttonmode: 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                this.set_visual_mode('allfinished', 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 (skin) {\n                var status = '<div class=\"poodll_status_' + skin + '\" width=\"320\" 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('startbuttonrecording', 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                //only change visuals if this is not the testing\n                if (this.buttonmode != \"testbuttonrecording\") {\n                    this.set_visual_mode('startbuttonrecording', controlbarid);\n                }\n            },\n\n            handle_timer_update: function (controlbarid) {\n                var ip = this.fetch_instanceprops(controlbarid);\n                ip.controlbar.status.html(ip.timer.fetch_display_time());\n                if (ip.timer.seconds == 0 && ip.timer.initseconds > 0) {\n                    this.process_recording_stop(controlbarid);\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                var upskin = upskin_bar.clone();\n                upskin.init(ip.config, element, ip.controlbar.playcanvas, ip.controlbar.status);\n                return upskin;\n            },\n\n            set_button_style: function (mode) {\n                //remove all button styles\n                var mode_css_classes = ['testbuttonready', 'testbuttonrecording', 'startbuttonready', 'startbuttoncountdown', 'startbuttonrecording', 'uploading', 'allfinished'];\n                $.each(mode_css_classes, function (index, modeclass) {\n                    $('.poodll_mediarecorderbox_readseed').removeClass('poodll_mediarecorder_readseed_' + modeclass);\n                    $('.poodll_mediarecorderbox_readseed').removeClass('readseed_canclick');\n                });\n                $('.poodll_mediarecorderbox_readseed').addClass('poodll_mediarecorder_readseed_' + mode);\n                if (mode == 'testbuttonready' || mode == 'startbuttonready') {\n                    $('.poodll_mediarecorderbox_readseed').addClass('readseed_canclick');\n                }\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                this.buttonmode = mode;\n\n                //send a message to alert of status change\n                var messageObject = {};\n                messageObject.type = \"recorderstatus\";\n                messageObject.status = mode;\n                ip.config.hermes.postMessage(messageObject);\n\n\n                switch (mode) {\n\n                    case 'testbuttonready':\n                        ip.controlbar.status.hide();\n                        ip.controlbar.thecaption.text('SPEAK');\n                        ip.controlbar.thecaption.show();\n                        ip.controlbar.playcanvas.hide();\n                        self.set_button_style(mode);\n                        break;\n                    case 'testbuttonrecording':\n                        ip.controlbar.thecaption.hide();\n                        ip.controlbar.playcanvas.show();\n                        self.set_button_style(mode);\n                        break;\n\n                    case 'startbuttonready':\n                        ip.controlbar.thecaption.text('START');\n                        ip.controlbar.thecaption.show();\n                        ip.controlbar.playcanvas.hide();\n                        self.set_button_style(mode);\n                        break;\n                    case 'startbuttoncountdown':\n                        ip.controlbar.thecaption.text('----------');\n                        ip.controlbar.thecaption.show();\n                        ip.controlbar.playcanvas.hide();\n                        self.set_button_style(mode);\n                        break;\n                    case 'startbuttonrecording':\n                        ip.controlbar.playcanvas.show();\n                        if (ip.config.allowearlyexit == \"1\" && ip.timer.enabled) {\n                           // self.enable_button(ip.controlbar.stopbutton);\n                            var ss_caption=M.util.get_string('recui_clicktofinish', 'filter_poodll');\n                            ip.controlbar.thecaption.text(ss_caption);\n                            ip.controlbar.thecaption.show();\n                        }else{\n                            ip.controlbar.thecaption.hide();\n                        }\n                        self.set_button_style(mode);\n                        break;\n\n                    case 'uploading':\n                        var spinner = '<i class=\"fa fa-spinner fa-spin fa-3x fa-fw\"></i>';\n                        ip.controlbar.thecaption.html(spinner);\n\n                        //the bar progress works too.\n                        //to use that hide the caption and show the  canvas\n                        //ip.controlbar.thecaption.hide();\n                        //ip.controlbar.playcanvas.show();\n                        ip.controlbar.thecaption.show();\n                        ip.controlbar.playcanvas.hide();\n\n\n                        self.set_button_style(mode);\n                        ip.controlbar.status.show();\n                        break;\n\n                    case 'allfinished':\n                        ip.controlbar.thecaption.text('Finished');\n                        ip.controlbar.thecaption.show();\n                        ip.controlbar.playcanvas.hide();\n                        ip.controlbar.status.hide();\n                        self.set_button_style(mode);\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 = M.util.get_string('recui_startactivity', 'filter_poodll');\n                var ss_testlabel = M.util.get_string('recui_testmic', 'filter_poodll');\n                var ss_stoplabel = M.util.get_string('recui_stop', 'filter_poodll');\n\n                var status = this.fetch_status_bar('readseed');\n                var controls = '<div class=\"poodll_mediarecorderholder_readseed '\n                    + recorder_class + '\" id=\"holder_' + controlbarid + '\">';\n\n                controls += '<div class=\"poodll_mediarecorderbox_readseed\" 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\" class=\"poodll_mediarecorder_playcanvas_readseed\" width=\"180\" height=\"50\"></canvas>';\n                controls += '<span id=\"' + controlbarid + '_caption\" class=\"poodll_mediarecorder_caption_readseed\"></span>';\n                controls += '<span id=\"' + controlbarid + '_bogusstartbutton\" class=\"poodll_mediarecorder_bogusstartbutton_readseed\"></span>';\n                controls += '<span id=\"' + controlbarid + '_bogusstopbutton\" class=\"poodll_mediarecorder_bogusstopbutton_readseed\"></span>';\n                controls += status;\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_readseed'),\n                    preview: $('#' + controlbarid + ' .poodll_preview_readseed'),\n                    bigbutton: $('#' + controlbarid + '.poodll_mediarecorderbox_readseed'),\n                    playcanvas: $('#' + controlbarid + '_playcanvas'),\n                    thecaption: $('#' + controlbarid + '_caption'),\n                    //These start and stop buttons are bogus. poodll_mediarecorder goes looking for them.\n                    //But we never use them here.\n                    stopbutton: $('#' + controlbarid + ' .poodll_mediarecorder_bogusstopbutton_readseed'),\n                    startbutton: $('#' + controlbarid + ' .poodll_mediarecorder_bogusstartbutton_readseed')\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_readseed\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('testbuttonready', controlbarid);\n\n                ip.controlbar.bigbutton.click(function (e) {\n                    //we do not want the dialog and other things to trigger events here\n                    //just the caption and the button itself\n                    if (e.target !== this\n                        && !$(e.target).hasClass('poodll_mediarecorder_caption_readseed')\n                        && !$(e.target).hasClass('poodll_mediarecorder_playcanvas_readseed')) {\n                        return;\n                    }\n\n                    switch (self.buttonmode) {\n                        case 'testbuttonready':\n\n                            //send a message to alert of new status\n                            //publish recording stopped event\n                            var messageObject = {};\n                            messageObject.type = \"recorderstatus\";\n                            messageObject.status = 'testbuttonrecording';\n                            ip.config.hermes.postMessage(messageObject);\n\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                            var testover = function () {\n                                if (ip.mediaRecorder) {\n                                    //stop recording\n                                    pmr.do_stop_audio(ip);\n                                }\n                                //wave animation\n                                recanim.clear();\n                                ip.config.hermes.enable();\n                                if (recanim.sounddetected) {\n                                    self.set_visual_mode('startbuttonready', controlbarid);\n                                } else {\n                                    var messageObject = {};\n                                    messageObject.type = \"recorderstatus\";\n                                    messageObject.status = 'testrecordingfailed';\n                                    ip.config.hermes.postMessage(messageObject);\n                                    self.set_visual_mode('testbuttonready', controlbarid);\n                                }\n                            }\n                            pmr.do_start_audio(ip, onMediaSuccess);\n                            setTimeout(testover, 4000);\n                            self.set_visual_mode('testbuttonrecording', controlbarid);\n                            break;\n\n                        case 'startbuttonready':\n                            //we start real recording here.\n                            // so we enable messages to API client and timer\n                            var countingdown = function () {\n                                var currenttime = new Date().getTime();\n                                var currentcount = currenttime - starttime;\n                                if (currentcount > finalcount) {\n                                    ip.timer.enable();\n                                    pmr.do_start_audio(ip, onMediaSuccess);\n                                } else {\n                                    var newcount = false;\n                                    if (previouscount < 0 && currentcount > 0) {\n                                        newcount = finalcount / 1000;\n                                    } else if (previouscount < 1000 && currentcount > 1000) {\n                                        newcount = finalcount / 1000 - 1;\n                                    } else if (previouscount < 2000 && currentcount > 2000) {\n                                        newcount = finalcount / 1000 - 2;\n                                    }\n                                    if (newcount) {\n                                        var messageObject = {};\n                                        messageObject.type = \"countdownstatus\";\n                                        messageObject.status = newcount;\n                                        ip.config.hermes.postMessage(messageObject);\n                                        //ip.controlbar.thecaption.text('--- ' + newcount +'  ---');\n                                    }\n                                    previouscount = currentcount;\n                                    setTimeout(countingdown, 100);\n                                }\n                            };\n                            ip.config.hermes.enable();\n                            self.set_visual_mode('startbuttoncountdown', controlbarid);\n                            var starttime = new Date().getTime();\n                            var finalcount = 3000;\n                            var previouscount = -1;\n                            setTimeout(countingdown, 100);\n                            break;\n\n                        //if we ARE recording and allowearlyexit is true, a click will stop the activity\n                        case 'startbuttonrecording':\n                            if (ip.config.allowearlyexit == \"1\" && ip.timer.enabled) {\n                                self.process_recording_stop(controlbarid);\n                            }\n                            break;\n\n                        //there is no stop button ... just for consistency and testing\n                        case 'stopbutton':\n                            self.process_recording_stop();\n                    }\n\n                });\n\n                ip.controlbar.settingsicon.click(function (e) {\n                    log.debug(\"we no proapagato\");\n                    // Do not pass this event on\n                    e.stopPropagation();\n                    //handle click properly\n                    if (!self.uploaded) {\n                        self.devsettings.open();\n                    } else {\n                        ip.downloaddialog.open();\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_readseed\n\n            process_recording_stop: function (controlbarid) {\n                var self = this;\n                var pmr = this.pmr;\n                var ip = this.fetch_instanceprops(controlbarid);\n                var recanim = self.therecanim;\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('uploading', controlbarid);\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","upskin_bar","hwave_mic","settings","debug","instanceprops","pmr","devsettings","therecanim","buttonmode","clone","extend","this","init","ip","fetch_instanceprops","onUploadSuccess","controlbarid","set_visual_mode","onUploadFailure","fetch_status_bar","skin","fetch_preview_audio","fetch_preview_video","fetch_resource_audio","fetch_resource_video","onMediaError","e","console","error","onMediaSuccess_video","onMediaSuccess_audio","controlbar","preview","attr","uploader","Output","start","timer","reset","update_status","handle_timer_update","status","html","fetch_display_time","seconds","initseconds","process_recording_stop","fetch_uploader_skin","element","upskin","config","playcanvas","set_button_style","mode","each","index","modeclass","removeClass","addClass","messageObject","hermes","postMessage","hide","thecaption","text","show","allowearlyexit","enabled","ss_caption","M","util","get_string","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","bigbutton","stopbutton","startbutton","set_dialogue_box","register_controlbar_events_video","onMediaSuccess","register_controlbar_events_audio","self","recanim","audioanalyser","get","click","target","hasClass","disable","do_start_audio","setTimeout","mediaRecorder","do_stop_audio","clear","enable","sounddetected","countingdown","currentcount","Date","getTime","starttime","finalcount","newcount","previouscount","stopPropagation","uploaded","open","window","onbeforeunload","stop","doDeferredUpload","blobs","length","do_save_audio","focus_button","button","focus","enable_button","disable_button"],"mappings":"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"}