{"name":"Dictation Chat","key":"dictationchat","version":"1.0.1","instructions":"Enter the sentences to be used for dictation as an HTML unordered list (bullet points) between the tags.","showatto":"1","showplayers":"0","requirecss":"https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.2/animate.min.css","requirejs":"","shim":"","defaults":"language=\"English(US)|English(GB)|English(AU)|English(IN)|English(Welsh)|Danish|Dutch|French(FR)|French(CA)|German|Icelandic|Italian|Japanese|Korean|Norwegian|Polish|Portugese(BR)|Portugese(PT)|Romanian|Russian|Spanish(ES)|Spanish(US)|Swedish|Turkish|Welsh\",speaker=\"Male|Female\"comparison=simple|advanced,checkcase=true|false","amd":"1","body":"\n\n
\n Loading\n
\n\n
\n \n
RESULTS
\n\n
Listen and Type
\n\n
\n

Listen and type the sentences spoken by the computer.

\n

Click 'Start' to begin the game!

\n
\n\n
\n\n\n\n
\n \n \n \n \n \n \n \n\n
","bodyend":"
\n\n
","script":"var app = {\n errors:{\n \"no_text\":\"No text items found! Ensure you add your text items between
  • tags!\"\n },\n spliton: new RegExp('([,.!?:;\" ])','g'),\n game:{\n pointer:0\n },\n usevoice: 'Amy',\n \n setvoice: function(){\n //determine voice\n var mf=@@speaker@@;\n var voice='Amy';\n switch(@@language@@){\n case \"English(US)\": voice = mf=='Male'?'Joey':'Kendra';break;\n case \"English(GB)\": voice = mf=='Male'?'Brian':'Amy';break;\n case \"English(AU)\": voice = mf=='Male'?'Russell':'Nicole';break;\n case \"English(IN)\": voice = mf=='Male'?'Aditi':'Raveena';break;\n case \"English(Welsh)\": voice = mf=='Male'? 'Geraint':'Geraint';break;\n case \"Danish\": voice = mf=='Male'?'Mads':'Naja';break;\n case \"Dutch\": voice = mf=='Male'?'Ruben':'Lotte';break;\n case \"French(FR)\": voice = mf=='Male'?'Mathieu':'Celine';break;\n case \"French(CA)\": voice = mf=='Male'?'Chantal':'Chantal';break;\n case \"German\": voice = mf=='Male'?'Hans':'Marlene';break;\n case \"Icelandic\": voice = mf=='Male'?'Karl':'Dora';break;\n case \"Italian\": voice = mf=='Male'?'Carla':'Giorgio';break;\n case \"Japanese\": voice = mf=='Male'?'Takumi':'Mizuki';break;\n case \"Korean\": voice = mf=='Male'?'Seoyan':'Seoyan';break;\n case \"Norwegian\": voice = mf=='Male'?'Liv':'Liv';break;\n case \"Polish\": voice = mf=='Male'?'Jacek':'Ewa';break;\n case \"Portugese(BR)\": voice = mf=='Male'?'Ricardo':'Vitoria';break;\n case \"Portugese(PT)\": voice = mf=='Male'?'Cristiano':'Ines';break;\n case \"Romanian\": voice = mf=='Male'?'Carmen':'Carmen';break;\n case \"Russian\": voice = mf=='Male'?'Maxim':'Tatyana';break;\n case \"Spanish(ES)\": voice = mf=='Male'?'Enrique':'Conchita';break;\n case \"Spanish(US)\": voice = mf=='Male'?'Miguel':'Penelope';break;\n case \"Swedish\": voice = mf=='Male'?'Astrid':'Astrid';break;\n case \"Turkish\": voice = mf=='Male'?'Filiz':'Filiz';break;\n case \"Welsh\": voice = mf=='Male'?'Gwyneth':'Gwyneth';break;\n default: voice = mf=='Male'?'Brian':'Amy';\n }\n this.usevoice=voice;\n },\n\n preloadAudio:function(){\n \n var self=this;\n var fullyLoaded = false;\n \n console.log(\"Preloading audio..\");\n \n self.items.forEach(function(item,idx){\n \n self.getTTS(item.target,self.usevoice,function(pollyurl){\n \n item.audio = new Audio();\n item.audio.src=pollyurl;\n \n fullyLoaded = self.items.filter(function(item){\n return item.audio === null\n }).length === 0;\n \n if(fullyLoaded){\n self.appReady();\n }\n });\n \n });\n },\n getItems:function(){\n \n var self=this;\n var text_items = [];\n \n console.log(\"Getting items..\");\n \n $(\"#dictate_container li\").each(function(){\n text_items.push($(this).text().trim());\n });\n \n this.items = text_items.map(function(target){\n return {\n targetWords:target.split(self.spliton).filter(function(e){return e!==\"\";}),\n target:target,\n typed:\"\",\n answered:false,\n correct:false,\n audio:null\n };\n }).filter(function(e){return e.target!==\"\";});\n\n console.log(this.items);\n\n if(!this.items.length){\n $(\"#dictate_error\").text(this.errors.no_text).show();\n }\n \n else{\n self.preloadAudio();\n }\n \n },\n init:function(){\n\n window.app = this;\n var self = this;\n \n console.log(\"Loading libraries..\");\n \n require(['jquery', 'core/ajax'], function($, Ajax) {\n self.ajax = Ajax;\n self.setvoice();\n self.getItems();\n });\n \n },\n appReady:function(){\n console.log(\"App ready!\");\n $(\"#dictate_container li\").remove();\n this.attachHandlers();\n $(\"#dictate_loading\").hide();\n $(\"#dictate_container\").show();\n },\n gotComparison: function(comparison,typed){\n \n var self = this;\n \n $(\".targetWord\").addClass(\"correct\").removeClass(\"incorrect\");\n \n if(!Object.keys(comparison).length){\n //add success marker here if wish\n $(\".speech.teacher_left\").text(self.items[self.game.pointer].target+\"\");\n\n self.items[self.game.pointer].answered=true;\n self.items[self.game.pointer].correct=true;\n self.items[self.game.pointer].typed=typed;\n \n if(self.game.pointer\"+numCorrect+\"/\"+totalNum).show();\n this.animateCSS(\"#dictate_results\", \"tada\", function(){\n setTimeout(function(){\n $(\"#dictate_results\").fadeOut();\n },2000);\n });\n $(\"#dictate_game\").hide();\n $(\"#dictate_start_btn\").show();\n $(\"#dictate_mainmenu\").show();\n $(\"#dictate_controls\").hide();\n $(\"#dictate_title\").html(\"Listen and Repeat\");\n },\n start:function(){\n this.items.forEach(function(item){\n item.spoken=\"\";\n item.answered=false;\n item.correct=false;\n });\n this.game.pointer=0;\n $(\"#dictate_game\").show();\n $(\"#dictate_start_btn\").hide();\n $(\"#dictate_mainmenu\").hide();\n $(\"#dictate_controls\").show();\n this.nextPrompt();\n },\n nextPrompt:function(){\n \n var self = this;\n\n var target = this.items[this.game.pointer].target;\n var id = \"dictate_prompt_\"+this.game.pointer;\n var code=\"\";\n \n $(\"#dictate_game\").html(code);\n $(\".ctrl-btn\").prop(\"disabled\",false);\n \n var color;\n \n var progress = self.items.map(function(item,idx){\n color = \"gray\";\n if(self.items[idx].answered && self.items[idx].correct){\n color=\"green\";\n }\n else if(self.items[idx].answered && !self.items[idx].correct){\n color=\"red\";\n }\n return \"\";\n }).join(\" \");\n \n $(\"#dictate_title\").html(progress);\n $(\"#\"+id).toggle(\"slide\",{direction:'left'});\n \n self.nextReply();\n \n }, \n nextReply:function(){\n var self = this;\n var id = \"dictate_reply_\"+this.game.pointer;\n var target = this.items[this.game.pointer].target;\n var code=\"\";\n $(\"#dictate_game\").append(code);\n $(\"#\"+id).toggle(\"slide\",{direction:'right'});\n },\n getTTS:function(speaktext,voice,callback){\n\n //The REST API we are calling\n var functionname = 'local_cpapi_fetch_polly_url';\n \n //fetch the Posturl. We need this.\n //set up our ajax request\n var xhr = new XMLHttpRequest();\n var that = this;\n \n //set up our handler for the response\n xhr.onreadystatechange = function (e) {\n if (this.readyState === 4) {\n if (xhr.status == 200) {\n \n //get a yes or forgetit or tryagain\n var payload = xhr.responseText;\n var payloadobject = JSON.parse(payload);\n if (payloadobject) {\n //returnCode > 0 indicates an error\n if (payloadobject.returnCode > 0) {\n console.log(payloadobject.returnMessage);\n return false;\n //if all good, then lets do the embed\n } else if (payloadobject.returnCode === 0){\n var pollyurl = payloadobject.returnMessage;\n callback(pollyurl);\n } else {\n console.log('Polly Signed URL Request failed:');\n console.log(payloadobject);\n }\n } else {\n console.log('Polly Signed URL Request something bad happened');\n }\n } else {\n console.log('Polly Signed URL Request Not 200 response:' + xhr.status);\n }\n }\n };\n \n //make our request\n var xhrparams = \"wstoken=\" + @@CLOUDPOODLLTOKEN@@\n + \"&wsfunction=\" + functionname\n + \"&moodlewsrestformat=\" + 'json'\n + \"&text=\" + encodeURIComponent(speaktext)\n + '&texttype=text'\n + '&voice=' + voice\n + '&appid=' + 'filter_poodll'\n + '&owner=poodll'\n + '®ion=useast1';\n \n var serverurl = 'https://cloud.poodll.com' + \"/webservice/rest/server.php\";\n xhr.open(\"POST\", serverurl, true);\n xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n xhr.send(xhrparams);\n },\n render:function(){\n var self = this;\n },\n attachHandlers:function(){\n var self = this;\n $(\"#dictate_start_btn\").on(\"click\",function(){\n self.start();\n });\n $(\"#dictate_listen_btn\").on(\"click\",function(){\n self.items[self.game.pointer].audio.load();\n self.items[self.game.pointer].audio.play();\n });\n $(\"#dictate_skip_btn\").on(\"click\",function(){\n if(self.game.pointer