{"version":3,"file":"poodll_goldmediaskin.min.js","sources":["../src/poodll_goldmediaskin.js"],"sourcesContent":["/* jshint ignore:start */\ndefine(['jquery',  'core/log', 'filter_poodll/utils_amd', 'filter_poodll/anim_progress_radial',\n    'filter_poodll/anim_hwave', 'filter_poodll/anim_fbars', 'filter_poodll/anim_ripple',\n    'filter_poodll/anim_words', 'filter_poodll/speech_poodll', 'filter_poodll/dlg_devicesettings'],\n    function ($, log, utils, radialprogress, hwave, fbars, ripple, words, speechrecognition, settings) {\n\n    \"use strict\"; // jshint ;_;\n\n    log.debug('PoodLL Gold 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=\"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=\"playsinline\" muted></audio>';\n            return preview;\n        },\n        fetch_preview_video: function (skin) {\n            var preview = '<video class=\"poodll_preview_' + skin + '\" width=\"320\" height=\"240\" playsinline=\"playsinline\" muted></video>';\n            return preview;\n        },\n        fetch_resource_audio: function (skin) {\n            var resourceplayer = '<audio class=\"poodll_resourceplayer_' + skin + ' hide\" playsinline=\"playsinline\"></audio>';\n            return resourceplayer;\n        },\n        fetch_resource_video: function (skin) {\n            var resourceplayer = '<video class=\"poodll_resourceplayer_' + skin + ' hide\" playsinline=\"playsinline\"></video>';\n            return resourceplayer;\n        },\n        fetch_uploader_skin: function (controlbarid, element) {\n            return false;\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            ip.controlbar.status.html(ip.timer.fetch_display_time());\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        //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                    self.enable_button(ip.controlbar.startbutton);\n                    self.disable_button(ip.controlbar.playbutton);\n                    self.disable_button(ip.controlbar.stopbutton);\n                    //hide the save buttons if necessary\n                    if (ip.showupload) {\n                        self.disable_button(ip.controlbar.savebutton);\n                    } else {\n                        ip.controlbar.savebutton.hide();\n                    }\n\n                    self.disable_button(ip.controlbar.restartbutton);\n                    break;\n\n\n                case 'recordingmode':\n                    self.enable_button(ip.controlbar.stopbutton);\n                    self.disable_button(ip.controlbar.startbutton);\n                    self.disable_button(ip.controlbar.playbutton);\n                    if (ip.showupload) {\n                        self.disable_button(ip.controlbar.savebutton);\n                    } else {\n                        ip.controlbar.savebutton.hide();\n                    }\n                    self.disable_button(ip.controlbar.restartbutton);\n\n\n                    /*Added Feature for the one button recorder Video*/\n                    if (ip.config.mediatype == 'video') {\n                        ip.controlbar.preview.removeClass('hide');\n                    }\n                    break;\n\n                case 'previewmode':\n\n                    if (ip.showupload) {\n                        //show save button\n                        ip.controlbar.savebutton.removeClass('hide');\n                        ip.controlbar.savebutton.removeClass('pmr_disabled');\n                        ip.controlbar.savebutton.attr('disabled', false);\n\n\n                    } else {\n                        ip.controlbar.savebutton.hide();\n                        if (ip.config.mediatype == 'video') {\n                            ip.controlbar.preview.addClass('hide');\n                        }\n                    }\n\n                    if (!ip.uploaded) {\n                        self.enable_button(ip.controlbar.startbutton);\n                        self.enable_button(ip.controlbar.restartbutton);\n                    }\n                    self.enable_button(ip.controlbar.stopbutton);\n                    self.enable_button(ip.controlbar.playbutton);\n\n                    break;\n\n                case 'playingmode':\n                    self.enable_button(ip.controlbar.stopbutton);\n                    if (ip.config.mediatype == 'video') {\n                        self.enable_button(ip.controlbar.preview);\n                        ip.controlbar.preview.removeClass('hide');\n                    }\n\n                    self.disable_button(ip.controlbar.startbutton);\n                    self.disable_button(ip.controlbar.playbutton);\n                    self.disable_button(ip.controlbar.restartbutton);\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(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            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            var ss = this.pmr.fetch_strings();\n\n            var controls = '<div class=\"poodll_mediarecorderholder_gold '\n                + recorder_class + '\" id=\"holder_' + controlbarid + '\">';\n\n            controls += '<div class=\"poodll_mediarecorderbox_gold\" 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            var status = this.fetch_status_bar('gold');\n            controls += status,\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\"> width=\"250\" height=\"250\"></canvas>';\n            controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_gold poodll_start-recording_gold\"><i class=\"fa fa-microphone\" aria-hidden=\"true\"></i></button>';\n            controls += '<button type=\"button\" class=\"poodll_mediarecorder_button_gold poodll_stop-recording_gold\"><i class=\"fa fa-stop\" aria-hidden=\"true\"></i></button>';\n            controls += '<div class=\"gold-save-button-wrapper\"><a class=\"btn btn-primary poodll_save-recording_gold\">Upload</a></div>';\n            controls += ' <button type=\"button\" class=\"poodll_mediarecorder_button_gold poodll_play-recording_gold\"><i class=\"fa fa-play\" aria-hidden=\"true\"></i></button>';\n            controls += '<div class=\"gold-restart-button-wrapper\"><a class=\"btn btn-success poodll_restart_gold \" >' + ss['recui_restart'] + '</a></div>';\n            controls += '</div></div></div>';\n            $(element).prepend(controls);\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_gold'),\n                preview: $('#' + controlbarid + ' .poodll_preview_gold'),\n                startbutton: $('#' + controlbarid + ' .poodll_start-recording_gold'),\n                stopbutton: $('#' + controlbarid + ' .poodll_stop-recording_gold'),\n                stopplayingbutton: $('#' + controlbarid + ' .poodll_stop-playing_gold'),\n                playbutton: $('#' + controlbarid + ' .poodll_play-recording_gold'),\n                savebutton: $('#' + controlbarid + ' .poodll_save-recording_gold'),\n                restartbutton: $('#' + controlbarid + ' .poodll_restart_gold'),\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_gold\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            //set visual mode\n            this.set_visual_mode('startmode', controlbarid);\n\n            //init radial progress\n            var rprogress = radialprogress.clone();\n            rprogress.init(ip.controlbar.playcanvas);\n\n            //init recording anim\n            var recanim = null;\n            switch (ip.config.recanim) {\n                case 'hwave':\n                    recanim = hwave.clone();\n                    break;\n                case 'fbars':\n                    recanim = fbars.clone();\n                    break;\n                case 'ripple':\n                    recanim = ripple.clone();\n                    break;\n                case 'words':\n                    recanim = words.clone();\n                    break;\n                default:\n                    ip.config.recanim = 'ripple';\n                    var recanim = ripple.clone();\n\n            }\n            // log.debug('recanim=' + ip.config.recanim);\n            recanim.init(ip.audioanalyser, ip.controlbar.playcanvas.get(0));\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\n            /*Added Feature for the one button recorder Video */\n            if (ip.config.mediatype == 'video') {\n                ip.controlbar.preview.addClass('hide');\n            }\n            ip.controlbar.preview.click(function () {\n                console.log('clicked preview');\n\n                $(this).addClass('hide');\n                $(ip.controlbar.stopbutton).trigger(\"click\");\n\n                if ($(this).hasClass('recorded')) {\n                    $(this).removeClass('recorded');\n                } else {\n                    $(this).addClass('recorded');\n                }\n\n            });\n            /* */\n\n\n            //Start button click\n            ip.controlbar.startbutton.click(function () {\n                //moved the true logic into onMediaSuccess\n                //so we need to stash recanim to make it available\n                self.therecanim = recanim;\n                pmr.do_start_audio(ip, onMediaSuccess);\n\n            });\n\n            //Restart link clicked\n            ip.controlbar.restartbutton.click(function () {\n                //visuals\n                self.set_visual_mode('startmode', controlbarid);\n            });\n\n            //Stop button click\n            ip.controlbar.stopbutton.click(function () {\n\n                //stop recording\n                pmr.do_stop_audio(ip);\n\n                //stop previewing (if that is what we are doing)\n                var preview = ip.controlbar.preview.get(0);\n                preview.pause();\n\n                //wave animation\n                recanim.clear();\n\n                //radial progress clear\n                rprogress.stop();\n\n                //timer and status bar\n                ip.timer.stop()\n                self.update_status(controlbarid);\n\n                //set visuals\n                self.set_visual_mode('previewmode', controlbarid);\n\n            });\n\n            //Play button click\n            ip.controlbar.playbutton.click(function () {\n\n                if (ip.config.mediatype == 'video') {\n                    if ($(ip.controlbar.preview).hasClass('recorder')) {\n                        $(ip.controlbar.preview).removeClass('recorder');\n                        $(ip.controlbar.preview).removeClass('hide');\n                        //ip.controlbar.preview.show();\t\n                    }\n                }\n\n\n                //commence playback\n                var preview = ip.controlbar.preview.get(0);\n                pmr.do_play_audio(ip, preview);\n\n                //init and run radial progress animation\n                rprogress.clear();\n                rprogress.fetchCurrent = function () {\n                    var ct = ip.controlbar.preview.prop('currentTime');\n                    var duration = ip.controlbar.preview.prop('duration');\n                    if (!isFinite(duration)) {\n                        duration = ip.timer.finalseconds;\n                    }\n                    return ct / duration;\n                };\n                rprogress.start();\n\n                //set visuals\n                self.set_visual_mode('playingmode', controlbarid);\n\n            });\n\n            //Save button click\n            ip.controlbar.savebutton.click(function () {\n\n\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                    ip.uploader.Output(M.util.get_string('recui_nothingtosaveerror', 'filter_poodll'));\n                }//end of if self.blobs\n\n                //set visuals\n                self.set_visual_mode('previewmode', controlbarid);\n\n                //probably not necessary  ... but getting odd ajax errors occasionally\n                return false;\n            });//end of save recording\n\n\n            window.onbeforeunload = function () {\n                self.enable_button(ip.controlbar.startbutton);\n                var preview = ip.controlbar.preview;\n                if (preview && preview.get(0)) {\n                    preview.get(0).pause();\n                }\n            };\n        }, //end of register_control_bar_events_gold\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","radialprogress","hwave","fbars","ripple","words","speechrecognition","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","fetch_uploader_skin","element","onMediaError","e","console","error","onMediaSuccess_video","set_visual_mode","onMediaSuccess_audio","controlbar","preview","attr","uploader","Output","start","timer","reset","update_status","handle_timer_update","status","html","fetch_display_time","seconds","initseconds","stopbutton","click","mode","enable_button","startbutton","disable_button","playbutton","showupload","savebutton","restartbutton","config","mediatype","removeClass","addClass","uploaded","insert_controlbar_video","resource","prepare_controlbar","insert_controlbar_audio","skin_style","media_skin_style","recorder_class","size","ss","fetch_strings","controls","fetch_dialogue_box","downloaddialog","errordialog","prepend","settingsdialog","errorsdialog","settingsicon","stopplayingbutton","playcanvas","set_dialogue_box","register_controlbar_events_video","onMediaSuccess","register_controlbar_events_audio","self","rprogress","recanim","audioanalyser","get","open","trigger","hasClass","do_start_audio","do_stop_audio","pause","clear","stop","do_play_audio","fetchCurrent","ct","prop","duration","isFinite","finalseconds","blobs","length","do_save_audio","M","util","get_string","window","onbeforeunload","button"],"mappings":"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"}