Source: utils.js

/**
 * Copyright© 2016, Oracle and/or its affiliates. All rights reserved.
 */


var KEY_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

var HEADERS = {
  ORACLE_MOBILE_DIAGNOSTIC_SESSION_ID: "Oracle-Mobile-DIAGNOSTIC-SESSION-ID",
  ORACLE_MOBILE_DEVICE_ID: "Oracle-Mobile-DEVICE-ID",
  ORACLE_MOBILE_CLIENT_REQUEST_TIME: "Oracle-Mobile-CLIENT-REQUEST-TIME",

  ORACLE_MOBILE_NAME: "Oracle-Mobile-Name",
  ORACLE_MOBILE_CREATED_BY: "Oracle-Mobile-Created-By",
  ORACLE_MOBILE_CREATED_ON: "Oracle-Mobile-Created-On",
  ORACLE_MOBILE_MODIFIED_BY: "Oracle-Mobile-Modified-By",
  ORACLE_MOBILE_MODIFIED_ON: "Oracle-Mobile-Modified-On",

  ORACLE_MOBILE_SYNC_RESOURCE_TYPE: 'Oracle-Mobile-Sync-Resource-Type',
  ORACLE_MOBILE_SYNC_AGENT: "Oracle-Mobile-Sync-Agent",
  LOCATION: "Location",

  ORACLE_MOBILE_APPLICATION_KEY: "Oracle-Mobile-Application-Key",
  ORACLE_MOBILE_BACKEND_ID: "Oracle-Mobile-Backend-Id",
  ORACLE_MOBILE_SOCIAL_IDENTITY_PROVIDER: "Oracle-Mobile-Social-Identity-Provider",
  ORACLE_MOBILE_SOCIAL_ACCESS_TOKEN: "Oracle-Mobile-Social-Access-Token",
  ORACLE_MOBILE_CLIENT_SDK_INFO: "Oracle-Mobile-Client-SDK-Info",

  ACCEPT: "Accept",
  CONTENT_TYPE: "Content-Type",
  E_TAG: "ETag",
  IF_MATCH: "If-Match",
  AUTHORIZATION: "Authorization",
  X_USER_IDENTITY_DOMAIN_NAME: "X-USER-IDENTITY-DOMAIN-NAME"
};

var ACCEPT_TYPES = {
  APPLICATION_JSON: "application/json",
  TEXT_PLAIN: "text/plain"
};

var HTTP_METHODS = {
  GET: 'GET',
  PUT: 'PUT',
  PATCH: 'PATCH',
  POST: 'POST',
  DELETE: 'DELETE',
  HEAD: 'HEAD'
};

var RESOURCE_TYPES = {
  ITEM: 'item',
  COLLECTION: 'collection',
  FILE: 'file'
};

var AUTHENTICATION_TYPES = {
  BASIC: 'basicAuth',
  OAUTH: 'oAuth',
  SSO: 'ssoAuth',
  FACEBOOK: 'facebookAuth',
  TOKEN: 'tokenAuth'
};

var MODULE_NAMES = {
  STORAGE: 'Storage',
  AUTHORIZATION: 'Authorization',
  USER_MANAGEMENT: 'UserManagement',
  APP_POLICES: 'AppPolicies',
  LOCATION: 'Location',
  SYNC: 'Sync',
  SYNC_EXPRESS: 'SyncExpress',
  NOTIFICATIONS: 'Notifications',
  MCS_ANALYTICS: 'MCSAnalytics',//Original Analytics API, since v1 of MCS
  ANALYTICS: 'Analytics',//CxA Analytics, new API in the Mobile Suite
  CUSTOM_CODE: 'CustomCode',
  APP_CONFIG: 'AppConfig'
};

var PLATFORM_NAMES = {
  JAVASCRIPT: 'Javascript',
  CORDOVA: 'Cordova'
};

function removeSpace(input) {
  return input.replace(/ /g, '');
}

function Utils(){
  this.HEADERS = HEADERS;
  this.RESOURCE_TYPES = RESOURCE_TYPES;
  this.HTTP_METHODS = HTTP_METHODS;
  this.ACCEPT_TYPES = ACCEPT_TYPES;
  this.AUTHENTICATION_TYPES = AUTHENTICATION_TYPES;
  this.MODULE_NAMES = MODULE_NAMES;
  this.PLATFORM_NAMES = PLATFORM_NAMES;
}

Utils.prototype.uuid = function() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    var r = Math.random() * 16 | 0,
      v = c == 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
};

Utils.prototype.validateConfiguration = function (input) {
  var prop = input;
  if (/\s/.test(prop) && prop != undefined) {
    prop = removeSpace(input);
  }
  return prop;
};

Utils.prototype.encodeBase64 = function (input) {

  var output = "";
  var chr1, chr2, chr3 = "";
  var enc1, enc2, enc3, enc4 = "";

  var i = 0;
  do {
    chr1 = input.charCodeAt(i++);
    chr2 = input.charCodeAt(i++);
    chr3 = input.charCodeAt(i++);

    enc1 = chr1 >> 2;
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    enc4 = chr3 & 63;

    if (isNaN(chr2)) {
      enc3 = enc4 = 64;
    } else if (isNaN(chr3)) {
      enc4 = 64;
    }

    output = output +
      KEY_STR.charAt(enc1) +
      KEY_STR.charAt(enc2) +
      KEY_STR.charAt(enc3) +
      KEY_STR.charAt(enc4);
    chr1 = chr2 = chr3 = "";
    enc1 = enc2 = enc3 = enc4 = "";
  } while (i < input.length);

  return output;
};

Utils.prototype.decodeBase64 = function (input) {

  var output = "";
  var chr1, chr2, chr3 = "";
  var enc1, enc2, enc3, enc4 = "";
  var i = 0;

  // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
  var base64test = /[^A-Za-z0-9\+\/\=]/g;
  if (base64test.exec(input)) {
    return null;
  }

  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

  do {
    enc1 = KEY_STR.indexOf(input.charAt(i++));
    enc2 = KEY_STR.indexOf(input.charAt(i++));
    enc3 = KEY_STR.indexOf(input.charAt(i++));
    enc4 = KEY_STR.indexOf(input.charAt(i++));

    chr1 = (enc1 << 2) | (enc2 >> 4);
    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    chr3 = ((enc3 & 3) << 6) | enc4;

    output = output + String.fromCharCode(chr1);

    if (enc3 != 64) {
      output = output + String.fromCharCode(chr2);
    }

    if (enc4 != 64) {
      output = output + String.fromCharCode(chr3);
    }

    chr1 = chr2 = chr3 = "";
    enc1 = enc2 = enc3 = enc4 = "";
  } while (i < input.length);
  return output;
};

Utils.prototype.hasValue = function (obj, key, value) {

  return obj.hasOwnProperty(key) && obj[key] === value;
};

Utils.prototype.isEquivalentURL = function (url1, url2){

  if(url1.indexOf("https") === 0 && url2.indexOf("https") === 0){
    url1 = this.getPort(url1) === 443 ? url1.replace(':443', '') : url1;
    url2 = this.getPort(url2) === 443 ? url2.replace(':443', '') : url2;
  } else if(url1.indexOf("https") === -1 && url2.indexOf("https") === -1) {
    url1 = this.getPort(url1) === 80 ? url1.replace(':80', '') : url1;
    url2 = this.getPort(url2) === 80 ? url2.replace(':80', '') : url2;
  }

  return url1.indexOf(url2) === 0;

};

Utils.prototype.getPort = function (url){
  var colonIdx = url.indexOf(':', 7);
  var slashIdx = url.indexOf('/', colonIdx);
  if(colonIdx > 0 && slashIdx == -1){
    slashIdx = url.length;
  }
  var port = url.substr(colonIdx + 1, slashIdx - colonIdx - 1);
  if(port && !isNaN(port*1)){
    return port * 1;
  } else{
    return -1;
  }
};

Utils.prototype.parseHeaders = function (headerStr) {
  var headers = {};
  if (!headerStr) {
    return headers;
  }
  var headerPairs = headerStr.split('\u000d\u000a');
  for (var i = 0, ilen = headerPairs.length; i < ilen; i++) {
    var headerPair = headerPairs[i];
    var index = headerPair.indexOf('\u003a\u0020');
    if (index > 0) {
      headers[headerPair.substring(0, index).toLowerCase()] = headerPair.substring(index + 2);
    }
  }
  return headers;
};

Utils.prototype.normalizeHeaderKeys = function (responseHeaders) {
  var headers = {};
  // jasmin headers
  if(this.isArray(responseHeaders)){
    for(var i = 0; i < responseHeaders.length; i++){
      headers[responseHeaders[i].name.toLowerCase()] = responseHeaders[i].value;
    }
  } else {
    for (var key in responseHeaders) {
      if (responseHeaders.hasOwnProperty(key)) {
        headers[key.toLowerCase()] = responseHeaders[key];
      }
    }
  }
  return headers;
};

Utils.prototype.isArray = function (arg) {
  return Object.prototype.toString.call(arg) === '[object Array]';
};