text: /*jslint indent: 2 */
  /*global window, jQuery, angular, cordova */
  "use strict";
  
  // Returns a jQuery or AngularJS deferred object, or pass a success and fail callbacks if you don't want to use jQuery or AngularJS
  var getPromisedCordovaExec = function (command, success, fail) {
    var toReturn, deferred, injector, $q;
    if (success === undefined) {
      if (window.jQuery) {
        deferred = jQuery.Deferred();
        success = deferred.resolve;
        fail = deferred.reject;
        toReturn = deferred;
      } else if (window.angular) {
        injector = angular.injector(["ng"]);
        $q = injector.get("$q");
        deferred = $q.defer();
        success = deferred.resolve;
        fail = deferred.reject;
        toReturn = deferred.promise;
      } else if (window.when && window.when.promise) {
        deferred = when.defer();
        success = deferred.resolve;
        fail = deferred.reject;
        toReturn = deferred.promise;
      } else if (window.Promise) {
        toReturn = new Promise(function(c, e) {
          success = c;
          fail = e;
        });
      } else if (window.WinJS && window.WinJS.Promise) {
        toReturn = new WinJS.Promise(function(c, e) {
          success = c;
          fail = e;
        });
      } else {
        return console.error('AppVersion either needs a success callback, or jQuery/AngularJS/Promise/WinJS.Promise defined for using promises');
      }
    }
    cordova.exec(success, fail, "AppVersion", command, []);
    return toReturn;
  };
  
  var getAppVersion = function (success, fail) {
    return getPromisedCordovaExec('getVersionNumber', success, fail);
  };
  
  getAppVersion.getAppName = function (success, fail) {
    return getPromisedCordovaExec('getAppName', success, fail);
  };
  
  getAppVersion.getPackageName = function (success, fail) {
    return getPromisedCordovaExec('getPackageName', success, fail);
  };
  
  getAppVersion.getVersionNumber = function (success, fail) {
    return getPromisedCordovaExec('getVersionNumber', success, fail);
  };
  
  getAppVersion.getVersionCode = function (success, fail) {
    return getPromisedCordovaExec('getVersionCode', success, fail);
  };
  
  module.exports = getAppVersion;
  