text: /*
   *
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   *
  */
  
  /* global qnx, PluginResult */
  
  var audioObjects = {},
      mediaErrorsHandled = false;
  
  // There is a bug in the webplatform handling of media error
  // dialogs prior to 10.2. This function needs to be run once
  // on the webview which plays audio to prevent freezing.
  function handleMediaErrors() {
      var webview = qnx.webplatform.getWebViews()[0],
          handler = webview.onDialogRequested;
      if (!mediaErrorsHandled) {
          webview.allowWebEvent("DialogRequested");
          webview.onDialogRequested = undefined;
          webview.onDialogRequested = function (eventArgs) {
              var parsedArgs = JSON.parse(eventArgs);
              if (parsedArgs.dialogType === 'MediaError') {
                  return '{"setPreventDefault": true}';
              }
              handler(eventArgs);
          };
          mediaErrorsHandled = true;
      }
  }
  
  module.exports = {
  
      create: function (success, fail, args, env) {
          var result = new PluginResult(args, env),
              id;
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          id = JSON.parse(decodeURIComponent(args[0]));
  
          if (!args[1]){
              audioObjects[id] = new Audio();
          } else {
              audioObjects[id] = new Audio(JSON.parse(decodeURIComponent(args[1])));
          }
  
          handleMediaErrors();
  
          result.ok();
      },
  
      startPlayingAudio: function (success, fail, args, env) {
  
          var audio,
              id,
              result = new PluginResult(args, env);
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          id = JSON.parse(decodeURIComponent(args[0]));
  
          audio = audioObjects[id];
  
          if (!audio) {
              result.error("Audio object has not been initialized");
          } else {
              audio.play();
              result.ok();
          }
      },
  
      stopPlayingAudio: function (success, fail, args, env) {
  
          var audio,
              id,
              result = new PluginResult(args, env);
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          id = JSON.parse(decodeURIComponent(args[0]));
  
          audio = audioObjects[id];
  
          if (!audio) {
              result.error("Audio Object has not been initialized");
              return;
          }
  
          audio.pause();
          audio.currentTime = 0;
  
          result.ok();
      },
  
      seekToAudio: function (success, fail, args, env) {
  
          var audio,
              result = new PluginResult(args, env);
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
  
          if (!audio) {
              result.error("Audio Object has not been initialized");
          } else if (!args[1]) {
              result.error("Media seek time argument not found");
          } else {
              try {
                  audio.currentTime = JSON.parse(decodeURIComponent(args[1])) / 1000;
                  result.ok();
              } catch (e) {
                  result.error("Error seeking audio: " + e);
              }
          }
      },
  
      pausePlayingAudio: function (success, fail, args, env) {
  
          var audio,
              result = new PluginResult(args, env);
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
  
          if (!audio) {
              result.error("Audio Object has not been initialized");
              return;
          }
  
          audio.pause();
      },
  
      getCurrentPositionAudio: function (success, fail, args, env) {
  
          var audio,
              result = new PluginResult(args, env);
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
  
          if (!audio) {
              result.error("Audio Object has not been initialized");
              return;
          }
  
          result.ok(audio.currentTime);
      },
  
      getDuration: function (success, fail, args, env) {
  
          var audio,
              result = new PluginResult(args, env);
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
  
          if (!audio) {
              result.error("Audio Object has not been initialized");
              return;
          }
  
          result.ok(audio.duration);
      },
  
      startRecordingAudio: function (success, fail, args, env) {
          var result = new PluginResult(args, env);
          result.error("Not supported");
      },
  
      stopRecordingAudio: function (success, fail, args, env) {
          var result = new PluginResult(args, env);
          result.error("Not supported");
      },
  
      release: function (success, fail, args, env) {
          var audio,
              id,
              result = new PluginResult(args, env);
  
          if (!args[0]) {
              result.error("Media Object id was not sent in arguments");
              return;
          }
  
          id = JSON.parse(decodeURIComponent(args[0]));
  
          audio = audioObjects[id];
  
          if (audio) {
              if(audio.src !== ""){
                  audio.src = undefined;
              }
              audioObjects[id] = undefined;
          }
  
          result.ok();
      }
  };
  