{"version":3,"file":"poodll_pushmediaskin.min.js","sources":["../src/poodll_pushmediaskin.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 Push Skin: initialising');\n\n        return {\n\n            instanceprops: null,\n            pmr: null,\n            devsettings: null,\n            therecanim: null,\n            buttonmode: null,\n            strings: 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                //init strings\n                this.strings = this.pmr.fetch_strings();\n                //   this.strings['recui_startactivity']=M.util.get_string('recui_startactivity','filter_poodll');\n                //   this.strings['recui_testmic']=M.util.get_string('recui_testmic','filter_poodll');\n                //   this.strings['recui_stop']=M.util.get_string('recui_stop','filter_poodll');\n\n                this.strings['recui_pushtospeak'] = M.util.get_string('recui_pushtospeak', 'filter_poodll');\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\"></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            onfinalspeechcapture: function (speechtext,speechresults) {\n                this.just_stop();\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                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                this.set_visual_mode('startbuttonrecording', controlbarid);\n\n            },\n\n            handle_timer_update: function (controlbarid) {\n                var ip = this.fetch_instanceprops();\n                ip.controlbar.status.html(ip.timer.fetch_display_time());\n                if (ip.timer.seconds == 0 && ip.timer.initseconds > 0) {\n                    this.stop_and_upload(controlbarid);\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                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_push').removeClass('poodll_mediarecorder_push_' + modeclass);\n                    $('.poodll_mediarecorderbox_push').removeClass('push_canclick');\n                });\n                $('.poodll_mediarecorderbox_push').addClass('poodll_mediarecorder_push_' + mode);\n                if (mode == 'testbuttonready' || mode == 'startbuttonready') {\n                    $('.poodll_mediarecorderbox_push').addClass('push_canclick');\n                }\n            },\n\n            //set visuals for different states (ie recording or playing)\n            set_visual_mode: function (mode) {\n                var self = this;\n                var ip = this.fetch_instanceprops();\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                var spinner = '<i class=\"fa fa-spinner fa-spin fa-3x fa-fw\"></i>';\n\n\n                switch (mode) {\n\n\n                    case 'startbuttonready':\n                        ip.controlbar.thecaption.text(self.strings['recui_pushtospeak']);\n                        ip.controlbar.thecaption.show();\n                        ip.controlbar.playcanvas.hide();\n                        ip.controlbar.status.hide();\n                        ip.controlbar.settingsicon.hide();\n                        self.set_button_style(mode);\n                        break;\n\n                    case 'startbuttonrecording':\n                        ip.controlbar.thecaption.hide();\n                        ip.controlbar.playcanvas.show();\n                        self.set_button_style(mode);\n                        ip.controlbar.status.hide();\n                        break;\n\n                    case 'uploading':\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.hide();\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();\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 status = this.fetch_status_bar('push');\n                var controls = '<div class=\"poodll_mediarecorderholder_push '\n                    + recorder_class + '\" id=\"holder_' + controlbarid + '\">';\n\n                controls += '<div class=\"poodll_mediarecorderbox_push\" 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\"><i class=\"fa fa-cogs\" aria-hidden=\"true\"></i></button></div>';\n                controls += '<canvas id=\"' + controlbarid + '_playcanvas\" class=\"poodll_mediarecorder_playcanvas_push\" width=\"180\" height=\"50\"></canvas>';\n                controls += '<span id=\"' + controlbarid + '_caption\" class=\"poodll_mediarecorder_caption_push\"></span>';\n\n                //removing bgus buttons from html is better. The bogus items will send events(do_play_stop). Thf jquery object refering to them is enough for bogus to work\n                //controls += '<span id=\"' + controlbarid + '_bogusstartbutton\" class=\"poodll_mediarecorder_bogusstartbutton_push\"></span>';\n                //controls += '<span id=\"' + controlbarid + '_bogusstopbutton\" class=\"poodll_mediarecorder_bogusstopbutton_push\"></span>';\n\n                /*\n                controls +=  '<button type=\"button\" class=\"poodll_mediarecorder_button_push poodll_start-recording_push\">' + this.ss['startlabel']  + '</button>';\n                controls +=  '<button type=\"button\" class=\"poodll_mediarecorder_button_push poodll_test-recording_push\">' + this.ss['testlabel']  +  '</button>';\n                controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_push poodll_stop-recording_push\">' +  this.ss['stoplabel']  +  '</button>';\n                */\n\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_push'),\n                    preview: $('#' + controlbarid + ' .poodll_preview_push'),\n                    bigbutton: $('#' + controlbarid + '.poodll_mediarecorderbox_push'),\n                    playcanvas: $('#' + controlbarid + '_playcanvas'),\n                    thecaption: $('#' + controlbarid + '_caption'),\n                    themicicon: $('#' + controlbarid + '_micicon'),\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_push'),\n                    startbutton: $('#' + controlbarid + ' .poodll_mediarecorder_bogusstartbutton_push')\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_push\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_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('startbuttonready');\n\n                ip.controlbar.bigbutton.click(function (e) {\n                    log.debug(e.target);\n                    //we do not want the dialog and other things to trigger events here\n                    //just the caption and the button itself\n                    var clickable = false;\n                    if (e.target === self ||\n                        $(e.target).hasClass('style-holder') ||\n                        $(e.target).hasClass('poodll_mediarecorderbox_push') ||\n                        $(e.target).hasClass('poodll_mediarecorder_caption_push') ||\n                        $(e.target).hasClass('poodll_mediarecorder_playcanvas_push')) {\n                        clickable = true;\n                    }\n                    if (!clickable) {\n                        return;\n                    }\n\n                    switch (self.buttonmode) {\n                        case 'startbuttonready':\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 = 'startbuttonrecording';\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                            pmr.do_start_audio(ip, onMediaSuccess);\n                            self.set_visual_mode('startbuttonrecording');\n                            break;\n\n                        case 'startbuttonrecording':\n                            self.just_stop(controlbarid);\n                            break;\n\n                        case 'oldstartbuttonready':\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');\n                            var starttime = new Date().getTime();\n                            var finalcount = 3000;\n                            var previouscount = -1;\n                            setTimeout(countingdown, 100);\n                            break;\n\n                        //there is no stop button ... just for consistency and testing\n                        case 'stopbutton':\n                            self.stop_and_upload();\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_push\n\n            just_stop: function () {\n                var pmr = this.pmr;\n                var ip = this.fetch_instanceprops();\n                var recanim = this.therecanim;\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                this.set_visual_mode('startbuttonready');\n\n            },\n\n            stop_and_upload: function (controlbarid) {\n                var self = this;\n                var pmr = this.pmr;\n                var ip = this.fetch_instanceprops();\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');\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\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","strings","clone","extend","this","init","ip","fetch_strings","M","util","get_string","fetch_instanceprops","onUploadSuccess","controlbarid","set_visual_mode","onUploadFailure","fetch_status_bar","skin","fetch_preview_audio","fetch_preview_video","fetch_resource_audio","fetch_resource_video","onfinalspeechcapture","speechtext","speechresults","just_stop","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","stop_and_upload","fetch_uploader_skin","element","upskin","config","playcanvas","set_button_style","mode","each","index","modeclass","removeClass","addClass","messageObject","hermes","postMessage","thecaption","text","show","hide","settingsicon","insert_controlbar_video","resource","prepare_controlbar_audio","insert_controlbar_audio","prepare_controlbar","mediatype","skin_style","media_skin_style","controls","fetch_dialogue_box","downloaddialog","errordialog","prepend","settingsdialog","errorsdialog","bigbutton","themicicon","stopbutton","startbutton","set_dialogue_box","register_controlbar_events_video","onMediaSuccess","register_controlbar_events_audio","self","recanim","audioanalyser","get","click","target","clickable","hasClass","disable","do_start_audio","countingdown","currentcount","Date","getTime","starttime","finalcount","enable","newcount","previouscount","setTimeout","stopPropagation","uploaded","open","window","onbeforeunload","mediaRecorder","do_stop_audio","clear","stop","doDeferredUpload","blobs","length","do_save_audio","enable_button","button","disable_button"],"mappings":"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"}