{"version":3,"file":"poodll_fbmediaskin.min.js","sources":["../src/poodll_fbmediaskin.js"],"sourcesContent":["/* jshint ignore:start */\ndefine(['jquery', 'core/log', 'filter_poodll/utils_amd'], function ($, log, utils) {\n\n    \"use strict\"; // jshint ;_;\n\n    log.debug('PoodLL Fluencybuilder Skin: initialising');\n\n    return {\n\n        instanceprops: null,\n        pmr: null,\n        uploaded: false,\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.instanceprops.warmedup = false;\n            this.pmr = pmr;\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 + ' hide\"></div>';\n            return status;\n        },\n\n        fetch_preview_audio: function (skin) {\n            var checkplayer = '<audio class=\"poodll_checkplayer_' + skin + ' hide\" playsinline=\"playsinline\" muted></audio>';\n            return checkplayer;\n        },\n        fetch_model_audio: function () {\n            var modelplayer = '<audio class=\"poodll_modelplayer_fluencybuilder hide\" src=\"' + M.cfg.wwwroot + '/filter/poodll/ding.mp3\" playsinline=\"playsinline\"></audio>';\n            return modelplayer;\n        },\n        fetch_preview_video: function (skin) {\n            var checkplayer = '<video class=\"poodll_checkplayer_' + skin + '\" width=\"320\" height=\"240\" playsinline=\"playsinline\" muted></video>';\n            return checkplayer;\n        },\n        fetch_resource_audio: function (skin) {\n            var resourceplayer = '<audio class=\"poodll_resourceplayer_' + skin + ' hide\" src=\"' + M.cfg.wwwroot + '/filter/poodll/ding.mp3\" playsinline=\"playsinline\"></audio>';\n            return resourceplayer;\n        },\n        fetch_resource_video: function (skin) {\n            var resourceplayer = '<video class=\"poodll_resourceplayer_' + skin + ' hide\" src=\"@@RESOURCEURLx@@\" playsinline=\"playsinline\"></video>';\n            return resourceplayer;\n        },\n        fetch_uploader_skin: function (controlbarid, element) {\n            return false;\n        },\n        fetch_ding_player: function () {\n            var skin = 'fluencybuilder';\n            var dingplayer = '<audio class=\"poodll_dingplayer_' + skin + ' hide\"  src=\"' + M.cfg.wwwroot + '/filter/poodll/ding.mp3\" ></audio>';\n            return dingplayer;\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\n            this.highlight_button('bwrapper_start-recording', controlbarid);\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            ip.controlbar.stopbutton.attr('disabled', false);\n            ip.controlbar.savebutton.attr('disabled', false);\n\n        },\n\n        onMediaSuccess_audio: function (controlbarid) {\n            var ip = this.fetch_instanceprops(controlbarid);\n            ip.controlbar.checkplayer.attr('src', null);\n            this.pmr.do_pause_audio(ip);\n\n        },\n\n        handle_timer_update: function (controlbarid) {\n            var ip = this.fetch_instanceprops(controlbarid);\n            this.update_status(controlbarid);\n            if (ip.timer.seconds == 0 && ip.timer.initseconds > 0) {\n                ip.controlbar.stoprecbutton.click();\n            }\n        },\n\n        update_status: function (controlbarid) {\n            /*\n            var ip = this.fetch_instanceprops(controlbarid);\n            ip.controlbar.status.html(ip.timer.fetch_display_time());\n            */\n        },\n\n\n        //insert the control bar and return it to be reused\n        insert_controlbar_video: function (element, controlbarid, checkplayer, resourceplayer) {\n            var controlbar = this.prepare_controlbar(element, controlbarid, checkplayer, resourceplayer, 'video');\n            return controlbar;\n        },\n\n        //insert the control bar and return it to be reused\n        insert_controlbar_audio: function (element, controlbarid, checkplayer, resourceplayer) {\n            var controlbar = this.prepare_controlbar(element, controlbarid, checkplayer, resourceplayer, 'audio');\n            return controlbar;\n        },\n\n        //insert the control bar and return it to be reused\n        prepare_controlbar: function (element, controlbarid, checkplayer, resourceplayer, mediatype) {\n            var ip = this.fetch_instanceprops(controlbarid);\n            var skin_style = ip.config.media_skin_style;\n\n            var recorder_class = mediatype == 'video' ? 'poodll_mediarecorder_video' : 'poodll_mediarecorder_audio';\n\n            //fetch html for players and items that t\n            var resourceplayer = resourceplayer.replace('@@RESOURCEURL@@', ip.config.resource);\n            var modelplayer = this.fetch_model_audio();\n            modelplayer = modelplayer.replace('@@MODELURL@@', ip.config.resource2);\n            var dingplayer = this.fetch_ding_player();\n            var status = this.fetch_status_bar('fluencybuilder');\n\n            //fetch the size class we use. Not really meaningful in fluency builder\n            var size_class = 'poodll_mediarecorder_size_auto';\n            switch (ip.config.size) {\n                case 'small':\n                    size_class = 'poodll_mediarecorder_size_small';\n                    break;\n                case 'big':\n                    size_class = 'poodll_mediarecorder_size_big';\n                    break;\n                case 'auto':\n                    size_class = 'poodll_mediarecorder_size_auto';\n            }\n\n\n            var controls = '<div class=\"poodll_mediarecorderholder_fluencybuilder '\n                + recorder_class + ' ' + size_class + '\" id=\"holder_' + controlbarid + '\">';\n\n            controls += '<div class=\"poodll_mediarecorderbox_fluencybuilder\" id=\"' + controlbarid + '\">';\n            controls += '<div class=\"style-holder ' + skin_style + '\">';\n            controls += status,\n                controls += dingplayer,\n                controls += modelplayer,\n                controls += checkplayer,\n                controls += resourceplayer,\n                controls += '<div class=\"fb_bwrapper bwrapper_play-resource mod_fluencybuilder_autobutton_inactive\"><button type=\"button\" class=\"poodll_mediarecorder_button_fluencybuilder poodll_play-resource_fluencybuilder\"><i class=\"fa fa-assistive-listening-systems\" aria-hidden=\"true\"></i></button></div>';\n            controls += '<div class=\"fb_bwrapper bwrapper_start-recording mod_fluencybuilder_autobutton_inactive\"><button type=\"button\" class=\"poodll_mediarecorder_button_fluencybuilder poodll_start-recording_fluencybuilder\" disabled><i class=\"fa fa-microphone\" aria-hidden=\"true\"></i></button></div>';\n            controls += '<div class=\"fb_bwrapper bwrapper_play-model mod_fluencybuilder_autobutton_inactive\"> <button type=\"button\" class=\"poodll_mediarecorder_button_fluencybuilder poodll_play-model_fluencybuilder\" disabled><i class=\"fa fa-play-circle\" aria-hidden=\"true\"></i></button></div>';\n\n            /* hidden buttons: they still are used internally so we need them, but user doesn't see them */\n            controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_fluencybuilder poodll_play-recording_fluencybuilder hide\">' + M.util.get_string('recui_play', 'filter_poodll') + '</button>';\n            controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_fluencybuilder poodll_stop-playing_fluencybuilder hide\">' + 'stopplay' + '</button>';\n            controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_fluencybuilder poodll_stop-recording_fluencybuilder hide\">' + M.util.get_string('recui_stop', 'filter_poodll') + '</button>';\n            controls += '<button type=\"button\" class=\"poodll_save-recording_fluencybuilder pmr_disabled hide\">' + M.util.get_string('recui_save', 'filter_poodll') + '</button>';\n            controls += '</div></div></div>';\n            $(element).prepend(controls);\n\n            var controlbar = {\n                status: $('#' + controlbarid + '  .poodll_status_fluencybuilder'),\n                dingplayer: $('#' + controlbarid + '  .poodll_dingplayer_fluencybuilder'),\n                modelplayer: $('#' + controlbarid + '  .poodll_modelplayer_fluencybuilder'),\n                resourceplayer: $('#' + controlbarid + '  .poodll_resourceplayer_fluencybuilder'),\n                checkplayer: $('#' + controlbarid + '  .poodll_checkplayer_fluencybuilder'),\n                resourcebutton: $('#' + controlbarid + '  .poodll_play-resource_fluencybuilder'),\n                startbutton: $('#' + controlbarid + '  .poodll_start-recording_fluencybuilder'),\n                stoprecbutton: $('#' + controlbarid + '  .poodll_stop-recording_fluencybuilder'),\n                stopbutton: $('#' + controlbarid + '  .poodll_stop-playing_fluencybuilder'),\n                playbutton: $('#' + controlbarid + '  .poodll_play-recording_fluencybuilder'),\n                playmodelbutton: $('#' + controlbarid + '  .poodll_play-model_fluencybuilder'),\n                savebutton: $('#' + controlbarid + '  .poodll_save-recording_fluencybuilder'),\n                resourcewrapper: $('#' + controlbarid + '  .bwrapper_play-resource'),\n                startrecwrapper: $('#' + controlbarid + '  .bwrapper_start-recording'),\n                playmodelwrapper: $('#' + controlbarid + '  .bwrapper_play-model')\n            };\n            return controlbar;\n        }, //end of fetch_control_bar_fluencybuilder\n\n\n        register_controlbar_events_video: function (onMediaSuccess, controlbarid) {\n            return this.register_controlbar_events_audio(onMediaSuccess, controlbarid);\n        },\n\n\n        /*\n        * Plays a ding and calls the next action\n        *\n        *\n         */\n        play_ding: function (action, controlbarid) {\n\n            var ip = this.fetch_instanceprops(controlbarid);\n            ip.controlbar.dingplayer[0].play();\n            switch (action) {\n                case 'click_start':\n                    ip.controlbar.startbutton.click();\n                    break;\n                case 'click_play':\n                    ip.controlbar.playmodelbutton.click();\n                    break;\n                case 'show_dialog':\n                    alert('dialog');\n                    break;\n                default:\n                    ip.controlbar.dingplayer[0].onended = null;\n            }\n        },\n\n        /*\n         * Highlights the current button (wrapper) and dehighlishts the rest\n         *\n         *\n         */\n        highlight_button: function (highlightwrapper, controlbarid) {\n            var wrappers = $('#' + controlbarid + '  .fb_bwrapper');\n            $(wrappers).each(function (index) {\n                if ($(this).hasClass(highlightwrapper)) {\n                    $(this).removeClass('mod_fluencybuilder_autobutton_inactive');\n                    $(this).addClass('mod_fluencybuilder_autobutton_active');\n                } else {\n                    $(this).removeClass('mod_fluencybuilder_autobutton_active');\n                    $(this).addClass('mod_fluencybuilder_autobutton_inactive');\n                }\n            });\n        },\n\n        warmup_recorder: function (controlbarid, onMediaSuccess) {\n            var ip = this.fetch_instanceprops(controlbarid);\n            //warm up preview player and audiocontext\n            this.pmr.warmup_context(ip);\n            this.pmr.warmup_preview(ip);\n\n            //We start recording here for mobile sfari click proximity\n            //but immediately pause it in onMediaSuccess\n            //when we really start (start-rec button click event), we \"resume\" recording\n            this.pmr.do_start_audio(ip, onMediaSuccess);\n\n\n            //fetch players and info\t\n            var model = ip.controlbar.modelplayer.get(0);\n            var ding = ip.controlbar.dingplayer.get(0);\n            var resource = ip.controlbar.resourceplayer.get(0);\n\n\n            if (!ip.warmedup) {\n                //play from players\n                try {\n                    resource.play();\n                    ding.play();\n                    model.play();\n                    resource.pause();\n                    ding.pause();\n                    model.pause();\n\n                } catch (e) {\n                    //do nothing\n                }\n            }\n\n\n            //set src on urls\n            var dingurl = M.cfg.wwwroot + '/filter/poodll/ding.mp3';\n            $(model).attr('src', ip.config.resource2);\n            $(ding).attr('src', dingurl);\n            $(resource).attr('src', ip.config.resource);\n            //flag all warmed up\n            ip.warmedup = true;\n        },\n\n        register_controlbar_events_audio: function (onMediaSuccess, controlbarid) {\n            var self = this;\n            var pmr = this.pmr;\n            var ip = this.fetch_instanceprops(controlbarid);\n\n            //when audio prompt finishes , play ding, then start recording\n            //AUTOMATION\n            ip.controlbar.resourceplayer.on('ended', function () {\n                if (ip.warmedup) {\n                    self.play_ding('click_start', controlbarid);\n                }\n            });\n\n            ip.controlbar.modelplayer.on('ended', function () {\n                self.highlight_button('', controlbarid);\n            });\n\n\n            //when start recording button clicked\n            ip.controlbar.startbutton.click(function () {\n\n                //pmr.do_start_audio(ip, onMediaSuccess);\n                pmr.do_resume_audio(ip);\n\n\n                self.highlight_button('bwrapper_start-recording', controlbarid);\n\n                //clear messages\n                ip.uploader.Output('');\n\n                //timer and status bar\n                ip.timer.reset();\n                ip.timer.start();\n                self.update_status(controlbarid);\n\n                ip.controlbar.stopbutton.attr('disabled', false);\n                ip.controlbar.savebutton.attr('disabled', false);\n\n            });\n\n\n            //when the stop recording button is pressed\n            ip.controlbar.stoprecbutton.click(function () {\n                pmr.do_stop_audio(ip);\n\n                //AUTOMATION\n                self.play_ding('click_play', controlbarid);\n\n                //timer and status bar\n                ip.timer.stop()\n                self.update_status(controlbarid);\n            });\n\n            //when the stop playing recording button is pressed\n            ip.controlbar.stopbutton.click(function () {\n\n                self.highlight_button('none', controlbarid);\n\n                //timer and status bar\n                ip.timer.stop()\n                self.update_status(controlbarid);\n\n            });\n\n            //when the play recording button is pressed\n            ip.controlbar.playmodelbutton.click(function () {\n                var modelplayer = ip.controlbar.modelplayer.get(0);\n                modelplayer.play();\n                self.highlight_button('bwrapper_play-model', controlbarid);\n\n            });\n\n            //when the play recording button is pressed\n            ip.controlbar.playbutton.click(function () {\n                var checkplayer = ip.controlbar.checkplayer.get(0);\n                pmr.do_play_audio(ip, checkplayer);\n            });\n\n            //when the play prompt button is pressed\n            ip.controlbar.resourcebutton.click(function () {\n\n                self.warmup_recorder(controlbarid, onMediaSuccess);\n\n                self.disable_button(this);\n                var resourceplayer = ip.controlbar.resourceplayer.get(0);\n                resourceplayer.play();\n                self.highlight_button('bwrapper_play-resource', controlbarid);\n            });\n\n            //when the save button is pressed\n            ip.controlbar.savebutton.click(function () {\n                self.disable_button(this);\n                if (ip.blobs && ip.blobs.length > 0) {\n                    pmr.do_save_audio(ip);\n                    self.uploaded = true;\n                    self.disable_button(ip.controlbar.startbutton);\n                } else {\n                    ip.uploader.Output(M.util.get_string('recui_nothingtosaveerror', 'filter_poodll'));\n                }//end of if self.blobs\t\t\n                //probably not necessary  ... but getting odd ajax errors occasionally\n                return false;\n            });//end of save recording\n\n            window.onbeforeunload = function () {\n                self.enable_button(ip.controlbar.startbutton);\n                var checkplayer = ip.controlbar.checkplayer;\n                if (checkplayer && checkplayer.get(0)) {\n                    checkplayer.get(0).pause();\n                }\n            };\n        }, //end of register_control_bar_events_fluencybuilder\n\n        /*\n         * convenient functions to hide/show/enable/disable buttons\n         *\n         *\n         */\n        enable_button: function (button) {\n            $(button).prop('disabled', false);\n\n            // $(button).removeClass('pmr_disabled');\n        },\n        disable_button: function (button) {\n            $(button).prop('disabled', true);\n            //  $(button).addClass('pmr_disabled');\n        },\n        show_button: function (button) {\n            button.show();\n        },\n        hide_button: function (button) {\n            button.hide();\n        },\n\n    };//end of returned object\n});//total end\n"],"names":["define","$","log","utils","debug","instanceprops","pmr","uploaded","clone","extend","this","init","ip","warmedup","fetch_instanceprops","onUploadSuccess","controlbarid","hide","show","onUploadFailure","fetch_status_bar","skin","fetch_preview_audio","fetch_model_audio","M","cfg","wwwroot","fetch_preview_video","fetch_resource_audio","fetch_resource_video","fetch_uploader_skin","element","fetch_ding_player","onMediaError","e","console","error","onMediaSuccess_video","highlight_button","uploader","Output","timer","reset","start","update_status","controlbar","stopbutton","attr","savebutton","onMediaSuccess_audio","checkplayer","do_pause_audio","handle_timer_update","seconds","initseconds","stoprecbutton","click","insert_controlbar_video","resourceplayer","prepare_controlbar","insert_controlbar_audio","mediatype","skin_style","config","media_skin_style","recorder_class","modelplayer","replace","resource","resource2","dingplayer","status","size_class","size","controls","util","get_string","prepend","resourcebutton","startbutton","playbutton","playmodelbutton","resourcewrapper","startrecwrapper","playmodelwrapper","register_controlbar_events_video","onMediaSuccess","register_controlbar_events_audio","play_ding","action","play","alert","onended","highlightwrapper","wrappers","each","index","hasClass","removeClass","addClass","warmup_recorder","warmup_context","warmup_preview","do_start_audio","model","get","ding","pause","dingurl","self","on","do_resume_audio","do_stop_audio","stop","do_play_audio","disable_button","blobs","length","do_save_audio","window","onbeforeunload","enable_button","button","prop","show_button","hide_button"],"mappings":"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"}