diff options
Diffstat (limited to 'StoneIsland/platforms/ios/www')
35 files changed, 2577 insertions, 2694 deletions
diff --git a/StoneIsland/platforms/ios/www/cordova-js-src/exec.js b/StoneIsland/platforms/ios/www/cordova-js-src/exec.js index 3fb7fa19..466220d8 100644 --- a/StoneIsland/platforms/ios/www/cordova-js-src/exec.js +++ b/StoneIsland/platforms/ios/www/cordova-js-src/exec.js @@ -19,30 +19,24 @@ * */ -/*global require, module, atob, document */ - /** - * Creates a gap bridge iframe used to notify the native code about queued + * Creates the exec bridge used to notify the native code of * commands. */ -var cordova = require('cordova'), - utils = require('cordova/utils'), - base64 = require('cordova/base64'), - execIframe, - commandQueue = [], // Contains pending JS->Native messages. - isInContextOfEvalJs = 0, - failSafeTimerId = 0; +var cordova = require('cordova'); +var utils = require('cordova/utils'); +var base64 = require('cordova/base64'); -function massageArgsJsToNative(args) { - if (!args || utils.typeName(args) != 'Array') { +function massageArgsJsToNative (args) { + if (!args || utils.typeName(args) !== 'Array') { return args; } var ret = []; - args.forEach(function(arg, i) { - if (utils.typeName(arg) == 'ArrayBuffer') { + args.forEach(function (arg, i) { + if (utils.typeName(arg) === 'ArrayBuffer') { ret.push({ - 'CDVType': 'ArrayBuffer', - 'data': base64.fromArrayBuffer(arg) + CDVType: 'ArrayBuffer', + data: base64.fromArrayBuffer(arg) }); } else { ret.push(arg); @@ -51,29 +45,29 @@ function massageArgsJsToNative(args) { return ret; } -function massageMessageNativeToJs(message) { - if (message.CDVType == 'ArrayBuffer') { - var stringToArrayBuffer = function(str) { +function massageMessageNativeToJs (message) { + if (message.CDVType === 'ArrayBuffer') { + var stringToArrayBuffer = function (str) { var ret = new Uint8Array(str.length); for (var i = 0; i < str.length; i++) { ret[i] = str.charCodeAt(i); } return ret.buffer; }; - var base64ToArrayBuffer = function(b64) { - return stringToArrayBuffer(atob(b64)); + var base64ToArrayBuffer = function (b64) { + return stringToArrayBuffer(atob(b64)); // eslint-disable-line no-undef }; message = base64ToArrayBuffer(message.data); } return message; } -function convertMessageToArgsNativeToJs(message) { +function convertMessageToArgsNativeToJs (message) { var args = []; - if (!message || !message.hasOwnProperty('CDVType')) { + if (!message || !Object.prototype.hasOwnProperty.call(message, 'CDVType')) { args.push(message); - } else if (message.CDVType == 'MultiPart') { - message.messages.forEach(function(e) { + } else if (message.CDVType === 'MultiPart') { + message.messages.forEach(function (e) { args.push(massageMessageNativeToJs(e)); }); } else { @@ -82,8 +76,7 @@ function convertMessageToArgsNativeToJs(message) { return args; } -function iOSExec() { - +var iOSExec = function () { var successCallback, failCallback, service, action, actionArgs; var callbackId = null; if (typeof arguments[0] !== 'string') { @@ -100,9 +93,8 @@ function iOSExec() { // an invalid callbackId and passes it even if no callbacks were given. callbackId = 'INVALID'; } else { - throw new Error('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' + - 'cordova.exec(null, null, \'Service\', \'action\', [ arg1, arg2 ]);' - ); + throw new Error('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' + // eslint-disable-line + 'cordova.exec(null, null, \'Service\', \'action\', [ arg1, arg2 ]);'); } // If actionArgs is not provided, default to an empty array @@ -113,149 +105,54 @@ function iOSExec() { if (successCallback || failCallback) { callbackId = service + cordova.callbackId++; cordova.callbacks[callbackId] = - {success:successCallback, fail:failCallback}; + { success: successCallback, fail: failCallback }; } actionArgs = massageArgsJsToNative(actionArgs); - var command = [callbackId, service, action, actionArgs]; - - // Stringify and queue the command. We stringify to command now to - // effectively clone the command arguments in case they are mutated before - // the command is executed. - commandQueue.push(JSON.stringify(command)); - - // If we're in the context of a stringByEvaluatingJavaScriptFromString call, - // then the queue will be flushed when it returns; no need for a poke. - // Also, if there is already a command in the queue, then we've already - // poked the native side, so there is no reason to do so again. - if (!isInContextOfEvalJs && commandQueue.length == 1) { - pokeNative(); - } -} - -// CB-10530 -function proxyChanged() { - var cexec = cordovaExec(); - - return (execProxy !== cexec && // proxy objects are different - iOSExec !== cexec // proxy object is not the current iOSExec - ); -} - -// CB-10106 -function handleBridgeChange() { - if (proxyChanged()) { - var commandString = commandQueue.shift(); - while(commandString) { - var command = JSON.parse(commandString); - var callbackId = command[0]; - var service = command[1]; - var action = command[2]; - var actionArgs = command[3]; - var callbacks = cordova.callbacks[callbackId] || {}; - - execProxy(callbacks.success, callbacks.fail, service, action, actionArgs); - - commandString = commandQueue.shift(); - }; - return true; - } - - return false; -} - -function pokeNative() { - // CB-5488 - Don't attempt to create iframe before document.body is available. - if (!document.body) { - setTimeout(pokeNative); - return; - } - - // Check if they've removed it from the DOM, and put it back if so. - if (execIframe && execIframe.contentWindow) { - execIframe.contentWindow.location = 'gap://ready'; - } else { - execIframe = document.createElement('iframe'); - execIframe.style.display = 'none'; - execIframe.src = 'gap://ready'; - document.body.appendChild(execIframe); - } - // Use a timer to protect against iframe being unloaded during the poke (CB-7735). - // This makes the bridge ~ 7% slower, but works around the poke getting lost - // when the iframe is removed from the DOM. - // An onunload listener could be used in the case where the iframe has just been - // created, but since unload events fire only once, it doesn't work in the normal - // case of iframe reuse (where unload will have already fired due to the attempted - // navigation of the page). - failSafeTimerId = setTimeout(function() { - if (commandQueue.length) { - // CB-10106 - flush the queue on bridge change - if (!handleBridgeChange()) { - pokeNative(); - } - } - }, 50); // Making this > 0 improves performance (marginally) in the normal case (where it doesn't fire). -} - -iOSExec.nativeFetchMessages = function() { - // Stop listing for window detatch once native side confirms poke. - if (failSafeTimerId) { - clearTimeout(failSafeTimerId); - failSafeTimerId = 0; - } - // Each entry in commandQueue is a JSON string already. - if (!commandQueue.length) { - return ''; - } - var json = '[' + commandQueue.join(',') + ']'; - commandQueue.length = 0; - return json; + // CB-10133 DataClone DOM Exception 25 guard (fast function remover) + var command = [callbackId, service, action, JSON.parse(JSON.stringify(actionArgs))]; + window.webkit.messageHandlers.cordova.postMessage(command); }; -iOSExec.nativeCallback = function(callbackId, status, message, keepCallback, debug) { - return iOSExec.nativeEvalAndFetch(function() { - var success = status === 0 || status === 1; - var args = convertMessageToArgsNativeToJs(message); - function nc2() { - cordova.callbackFromNative(callbackId, success, status, args, keepCallback); - } - setTimeout(nc2, 0); +iOSExec.nativeCallback = function (callbackId, status, message, keepCallback, debug) { + var success = status === 0 || status === 1; + var args = convertMessageToArgsNativeToJs(message); + Promise.resolve().then(function () { + cordova.callbackFromNative(callbackId, success, status, args, keepCallback); // eslint-disable-line }); }; -iOSExec.nativeEvalAndFetch = function(func) { - // This shouldn't be nested, but better to be safe. - isInContextOfEvalJs++; +// for backwards compatibility +iOSExec.nativeEvalAndFetch = function (func) { try { func(); - return iOSExec.nativeFetchMessages(); - } finally { - isInContextOfEvalJs--; + } catch (e) { + console.log(e); } }; // Proxy the exec for bridge changes. See CB-10106 -function cordovaExec() { +function cordovaExec () { var cexec = require('cordova/exec'); var cexec_valid = (typeof cexec.nativeFetchMessages === 'function') && (typeof cexec.nativeEvalAndFetch === 'function') && (typeof cexec.nativeCallback === 'function'); - return (cexec_valid && execProxy !== cexec)? cexec : iOSExec; + return (cexec_valid && execProxy !== cexec) ? cexec : iOSExec; } -function execProxy() { +function execProxy () { cordovaExec().apply(null, arguments); -}; +} -execProxy.nativeFetchMessages = function() { +execProxy.nativeFetchMessages = function () { return cordovaExec().nativeFetchMessages.apply(null, arguments); }; -execProxy.nativeEvalAndFetch = function() { +execProxy.nativeEvalAndFetch = function () { return cordovaExec().nativeEvalAndFetch.apply(null, arguments); }; -execProxy.nativeCallback = function() { +execProxy.nativeCallback = function () { return cordovaExec().nativeCallback.apply(null, arguments); }; diff --git a/StoneIsland/platforms/ios/www/cordova-js-src/platform.js b/StoneIsland/platforms/ios/www/cordova-js-src/platform.js index 2345fa5b..83868c81 100644 --- a/StoneIsland/platforms/ios/www/cordova-js-src/platform.js +++ b/StoneIsland/platforms/ios/www/cordova-js-src/platform.js @@ -26,6 +26,14 @@ module.exports = { // see the file under plugin/ios/console.js require('cordova/modulemapper').clobbers('cordova/plugin/ios/console', 'window.console'); + // Attach the wkwebkit utility to window.WkWebView + // see the file under plugin/ios/wkwebkit.js + require('cordova/modulemapper').clobbers('cordova/plugin/ios/wkwebkit', 'window.WkWebView'); + + // Attach the splashscreen utility to window.navigator.splashscreen + // see the file under plugin/ios/launchscreen.js + require('cordova/modulemapper').clobbers('cordova/plugin/ios/launchscreen', 'navigator.splashscreen'); + require('cordova/channel').onNativeReady.fire(); } }; diff --git a/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/console.js b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/console.js index 6224fb44..0a4820ed 100644 --- a/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/console.js +++ b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/console.js @@ -19,168 +19,168 @@ * */ -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var logger = require('cordova/plugin/ios/logger'); -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // object that we're exporting -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var console = module.exports; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // copy of the original console object -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var WinConsole = window.console; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // whether to use the logger -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var UseLogger = false; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Timers -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var Timers = {}; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // used for unimplemented methods -//------------------------------------------------------------------------------ -function noop() {} +// ------------------------------------------------------------------------------ +function noop () {} -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // used for unimplemented methods -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.useLogger = function (value) { if (arguments.length) UseLogger = !!value; if (UseLogger) { if (logger.useConsole()) { - throw new Error("console and logger are too intertwingly"); + throw new Error('console and logger are too intertwingly'); } } return UseLogger; }; -//------------------------------------------------------------------------------ -console.log = function() { +// ------------------------------------------------------------------------------ +console.log = function () { if (logger.useConsole()) return; logger.log.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.error = function() { +// ------------------------------------------------------------------------------ +console.error = function () { if (logger.useConsole()) return; logger.error.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.warn = function() { +// ------------------------------------------------------------------------------ +console.warn = function () { if (logger.useConsole()) return; logger.warn.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.info = function() { +// ------------------------------------------------------------------------------ +console.info = function () { if (logger.useConsole()) return; logger.info.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.debug = function() { +// ------------------------------------------------------------------------------ +console.debug = function () { if (logger.useConsole()) return; logger.debug.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.assert = function(expression) { +// ------------------------------------------------------------------------------ +console.assert = function (expression) { if (expression) return; var message = logger.format.apply(logger.format, [].slice.call(arguments, 1)); - console.log("ASSERT: " + message); + console.log('ASSERT: ' + message); }; -//------------------------------------------------------------------------------ -console.clear = function() {}; +// ------------------------------------------------------------------------------ +console.clear = function () {}; -//------------------------------------------------------------------------------ -console.dir = function(object) { - console.log("%o", object); +// ------------------------------------------------------------------------------ +console.dir = function (object) { + console.log('%o', object); }; -//------------------------------------------------------------------------------ -console.dirxml = function(node) { +// ------------------------------------------------------------------------------ +console.dirxml = function (node) { console.log(node.innerHTML); }; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.trace = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.group = console.log; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.groupCollapsed = console.log; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.groupEnd = noop; -//------------------------------------------------------------------------------ -console.time = function(name) { +// ------------------------------------------------------------------------------ +console.time = function (name) { Timers[name] = new Date().valueOf(); }; -//------------------------------------------------------------------------------ -console.timeEnd = function(name) { +// ------------------------------------------------------------------------------ +console.timeEnd = function (name) { var timeStart = Timers[name]; if (!timeStart) { - console.warn("unknown timer: " + name); + console.warn('unknown timer: ' + name); return; } var timeElapsed = new Date().valueOf() - timeStart; - console.log(name + ": " + timeElapsed + "ms"); + console.log(name + ': ' + timeElapsed + 'ms'); }; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.timeStamp = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.profile = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.profileEnd = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.count = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.exception = console.log; -//------------------------------------------------------------------------------ -console.table = function(data, columns) { - console.log("%o", data); +// ------------------------------------------------------------------------------ +console.table = function (data, columns) { + console.log('%o', data); }; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // return a new function that calls both functions passed as args -//------------------------------------------------------------------------------ -function wrappedOrigCall(orgFunc, newFunc) { - return function() { +// ------------------------------------------------------------------------------ +function wrappedOrigCall (orgFunc, newFunc) { + return function () { var args = [].slice.call(arguments); try { orgFunc.apply(WinConsole, args); } catch (e) {} - try { newFunc.apply(console, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} }; } -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // For every function that exists in the original console object, that // also exists in the new console object, wrap the new console method // with one that calls both -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ for (var key in console) { - if (typeof WinConsole[key] == "function") { + if (typeof WinConsole[key] === 'function') { console[key] = wrappedOrigCall(WinConsole[key], console[key]); } } diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-splashscreen/www/splashscreen.js b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/launchscreen.js index 5beaa5fd..24606969 100644 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-splashscreen/www/splashscreen.js +++ b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/launchscreen.js @@ -1,4 +1,3 @@ -cordova.define("cordova-plugin-splashscreen.SplashScreen", function(require, exports, module) { /* * * Licensed to the Apache Software Foundation (ASF) under one @@ -22,15 +21,13 @@ cordova.define("cordova-plugin-splashscreen.SplashScreen", function(require, exp var exec = require('cordova/exec'); -var splashscreen = { - show:function() { - exec(null, null, "SplashScreen", "show", []); +var launchscreen = { + show: function () { + exec(null, null, 'LaunchScreen', 'show', []); }, - hide:function() { - exec(null, null, "SplashScreen", "hide", []); + hide: function () { + exec(null, null, 'LaunchScreen', 'hide', []); } }; -module.exports = splashscreen; - -}); +module.exports = launchscreen; diff --git a/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/logger.js b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/logger.js index 430d887d..6f59e1c8 100644 --- a/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/logger.js +++ b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/logger.js @@ -19,7 +19,7 @@ * */ -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // The logger module exports the following properties/functions: // // LOG - constant for the level LOG @@ -38,16 +38,16 @@ // debug(message,...) - logs a message at level DEBUG // logLevel(level,message,...) - logs a message specified level // -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var logger = exports; -var exec = require('cordova/exec'); +var exec = require('cordova/exec'); -var UseConsole = false; -var UseLogger = true; -var Queued = []; -var DeviceReady = false; +var UseConsole = false; +var UseLogger = true; +var Queued = []; +var DeviceReady = false; var CurrentLevel; var originalConsole = console; @@ -57,11 +57,11 @@ var originalConsole = console; */ var Levels = [ - "LOG", - "ERROR", - "WARN", - "INFO", - "DEBUG" + 'LOG', + 'ERROR', + 'WARN', + 'INFO', + 'DEBUG' ]; /* @@ -70,10 +70,10 @@ var Levels = [ */ var LevelsMap = {}; -for (var i=0; i<Levels.length; i++) { +for (var i = 0; i < Levels.length; i++) { var level = Levels[i]; LevelsMap[level] = i; - logger[level] = level; + logger[level] = level; } CurrentLevel = LevelsMap.WARN; @@ -100,7 +100,7 @@ CurrentLevel = LevelsMap.WARN; logger.level = function (value) { if (arguments.length) { if (LevelsMap[value] === null) { - throw new Error("invalid logging level: " + value); + throw new Error('invalid logging level: ' + value); } CurrentLevel = LevelsMap[value]; } @@ -118,17 +118,17 @@ logger.useConsole = function (value) { if (arguments.length) UseConsole = !!value; if (UseConsole) { - if (typeof console == "undefined") { - throw new Error("global console object is not defined"); + if (typeof console === 'undefined') { + throw new Error('global console object is not defined'); } - if (typeof console.log != "function") { - throw new Error("global console object does not have a log function"); + if (typeof console.log !== 'function') { + throw new Error('global console object does not have a log function'); } - if (typeof console.useLogger == "function") { + if (typeof console.useLogger === 'function') { if (console.useLogger()) { - throw new Error("console and logger are too intertwingly"); + throw new Error('console and logger are too intertwingly'); } } } @@ -154,7 +154,7 @@ logger.useLogger = function (value) { * Parameters passed after message are used applied to * the message with utils.format() */ -logger.log = function(message) { logWithArgs("LOG", arguments); }; +logger.log = function (message) { logWithArgs('LOG', arguments); }; /** * Logs a message at the ERROR level. @@ -162,7 +162,7 @@ logger.log = function(message) { logWithArgs("LOG", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.error = function(message) { logWithArgs("ERROR", arguments); }; +logger.error = function (message) { logWithArgs('ERROR', arguments); }; /** * Logs a message at the WARN level. @@ -170,7 +170,7 @@ logger.error = function(message) { logWithArgs("ERROR", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.warn = function(message) { logWithArgs("WARN", arguments); }; +logger.warn = function (message) { logWithArgs('WARN', arguments); }; /** * Logs a message at the INFO level. @@ -178,7 +178,7 @@ logger.warn = function(message) { logWithArgs("WARN", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.info = function(message) { logWithArgs("INFO", arguments); }; +logger.info = function (message) { logWithArgs('INFO', arguments); }; /** * Logs a message at the DEBUG level. @@ -186,17 +186,17 @@ logger.info = function(message) { logWithArgs("INFO", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.debug = function(message) { logWithArgs("DEBUG", arguments); }; +logger.debug = function (message) { logWithArgs('DEBUG', arguments); }; // log at the specified level with args -function logWithArgs(level, args) { +function logWithArgs (level, args) { args = [level].concat([].slice.call(args)); logger.logLevel.apply(logger, args); } // return the correct formatString for an object -function formatStringForMessage(message) { - return (typeof message === "string") ? "" : "%o"; +function formatStringForMessage (message) { + return (typeof message === 'string') ? '' : '%o'; } /** @@ -205,18 +205,18 @@ function formatStringForMessage(message) { * Parameters passed after message are used applied to * the message with utils.format() */ -logger.logLevel = function(level /* , ... */) { +logger.logLevel = function (level /* , ... */) { // format the message with the parameters var formatArgs = [].slice.call(arguments, 1); var fmtString = formatStringForMessage(formatArgs[0]); - if (fmtString.length > 0){ + if (fmtString.length > 0) { formatArgs.unshift(fmtString); // add formatString } - var message = logger.format.apply(logger.format, formatArgs); + var message = logger.format.apply(logger.format, formatArgs); if (LevelsMap[level] === null) { - throw new Error("invalid logging level: " + level); + throw new Error('invalid logging level: ' + level); } if (LevelsMap[level] > CurrentLevel) return; @@ -229,28 +229,27 @@ logger.logLevel = function(level /* , ... */) { // Log using the native logger if that is enabled if (UseLogger) { - exec(null, null, "Console", "logLevel", [level, message]); + exec(null, null, 'Console', 'logLevel', [level, message]); } // Log using the console if that is enabled if (UseConsole) { // make sure console is not using logger if (console.useLogger()) { - throw new Error("console and logger are too intertwingly"); + throw new Error('console and logger are too intertwingly'); } // log to the console switch (level) { - case logger.LOG: originalConsole.log(message); break; - case logger.ERROR: originalConsole.log("ERROR: " + message); break; - case logger.WARN: originalConsole.log("WARN: " + message); break; - case logger.INFO: originalConsole.log("INFO: " + message); break; - case logger.DEBUG: originalConsole.log("DEBUG: " + message); break; + case logger.LOG: originalConsole.log(message); break; + case logger.ERROR: originalConsole.log('ERROR: ' + message); break; + case logger.WARN: originalConsole.log('WARN: ' + message); break; + case logger.INFO: originalConsole.log('INFO: ' + message); break; + case logger.DEBUG: originalConsole.log('DEBUG: ' + message); break; } } }; - /** * Formats a string and arguments following it ala console.log() * @@ -259,12 +258,11 @@ logger.logLevel = function(level /* , ... */) { * for rationale, see FireBug's Console API: * http://getfirebug.com/wiki/index.php/Console_API */ -logger.format = function(formatString, args) { - return __format(arguments[0], [].slice.call(arguments,1)).join(' '); +logger.format = function (formatString, args) { + return __format(arguments[0], [].slice.call(arguments, 1)).join(' '); }; - -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ /** * Formats a string and arguments following it ala vsprintf() * @@ -279,26 +277,25 @@ logger.format = function(formatString, args) { * Returns an array containing the formatted string and any remaining * arguments. */ -function __format(formatString, args) { - if (formatString === null || formatString === undefined) return [""]; - if (arguments.length == 1) return [formatString.toString()]; +function __format (formatString, args) { + if (formatString === null || formatString === undefined) return ['']; + if (arguments.length === 1) return [formatString.toString()]; - if (typeof formatString != "string") - formatString = formatString.toString(); + if (typeof formatString !== 'string') { formatString = formatString.toString(); } var pattern = /(.*?)%(.)(.*)/; - var rest = formatString; - var result = []; + var rest = formatString; + var result = []; while (args.length) { var match = pattern.exec(rest); if (!match) break; - var arg = args.shift(); + var arg = args.shift(); rest = match[3]; result.push(match[1]); - if (match[2] == '%') { + if (match[2] === '%') { result.push('%'); args.unshift(arg); continue; @@ -314,17 +311,15 @@ function __format(formatString, args) { return remainingArgs; } -function __formatted(object, formatChar) { - +function __formatted (object, formatChar) { try { - switch(formatChar) { - case 'j': - case 'o': return JSON.stringify(object); - case 'c': return ''; + switch (formatChar) { + case 'j': + case 'o': return JSON.stringify(object); + case 'c': return ''; } - } - catch (e) { - return "error JSON.stringify()ing argument: " + e; + } catch (e) { + return 'error JSON.stringify()ing argument: ' + e; } if ((object === null) || (object === undefined)) { @@ -334,15 +329,14 @@ function __formatted(object, formatChar) { return object.toString(); } - -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // when deviceready fires, log queued messages -logger.__onDeviceReady = function() { +logger.__onDeviceReady = function () { if (DeviceReady) return; DeviceReady = true; - for (var i=0; i<Queued.length; i++) { + for (var i = 0; i < Queued.length; i++) { var messageArgs = Queued[i]; logger.logLevel(messageArgs[0], messageArgs[1]); } @@ -351,4 +345,4 @@ logger.__onDeviceReady = function() { }; // add a deviceready event to log queued messages -document.addEventListener("deviceready", logger.__onDeviceReady, false); +document.addEventListener('deviceready', logger.__onDeviceReady, false); diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-network-information/www/Connection.js b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/wkwebkit.js index 5f7279c5..35c819cf 100644 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-network-information/www/Connection.js +++ b/StoneIsland/platforms/ios/www/cordova-js-src/plugin/ios/wkwebkit.js @@ -1,4 +1,3 @@ -cordova.define("cordova-plugin-network-information.Connection", function(require, exports, module) { /* * * Licensed to the Apache Software Foundation (ASF) under one @@ -20,18 +19,24 @@ cordova.define("cordova-plugin-network-information.Connection", function(require * */ -/** - * Network status - */ -module.exports = { - UNKNOWN: "unknown", - ETHERNET: "ethernet", - WIFI: "wifi", - CELL_2G: "2g", - CELL_3G: "3g", - CELL_4G: "4g", - CELL:"cellular", - NONE: "none" +var exec = require('cordova/exec'); + +var WkWebKit = { + allowsBackForwardNavigationGestures: function (allow) { + exec(null, null, 'CDVWebViewEngine', 'allowsBackForwardNavigationGestures', [allow]); + }, + convertFilePath: function (path) { + if (!path || !window.CDV_ASSETS_URL) { + return path; + } + if (path.startsWith('/')) { + return window.CDV_ASSETS_URL + '/_app_file_' + path; + } + if (path.startsWith('file://')) { + return window.CDV_ASSETS_URL + path.replace('file://', '/_app_file_'); + } + return path; + } }; -}); +module.exports = WkWebKit; diff --git a/StoneIsland/platforms/ios/www/cordova.js b/StoneIsland/platforms/ios/www/cordova.js index a320f5ee..a837c75f 100644 --- a/StoneIsland/platforms/ios/www/cordova.js +++ b/StoneIsland/platforms/ios/www/cordova.js @@ -1,5 +1,5 @@ // Platform: ios -// ff66178b108b93be36a1aafe341af17381a727a3 +// 538a985db128858c0a0eb4dd40fb9c8e5433fc94 /* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -8,9 +8,9 @@ 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 @@ -19,12 +19,8 @@ under the License. */ ;(function() { -var PLATFORM_VERSION_BUILD_LABEL = '4.5.2'; +var PLATFORM_VERSION_BUILD_LABEL = '6.1.1'; // file: src/scripts/require.js - -/* jshint -W079 */ -/* jshint -W020 */ - var require; var define; @@ -54,10 +50,10 @@ var define; require = function (id) { if (!modules[id]) { - throw 'module ' + id + ' not found'; + throw new Error('module ' + id + ' not found'); } else if (id in inProgressModules) { var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; - throw 'Cycle in require graph: ' + cycle; + throw new Error('Cycle in require graph: ' + cycle); } if (modules[id].factory) { try { @@ -73,8 +69,8 @@ var define; }; define = function (id, factory) { - if (modules[id]) { - throw 'module ' + id + ' already defined'; + if (Object.prototype.hasOwnProperty.call(modules, id)) { + throw new Error('module ' + id + ' already defined'); } modules[id] = { @@ -101,7 +97,7 @@ define("cordova", function(require, exports, module) { // Workaround for Windows 10 in hosted environment case // http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object -if (window.cordova && !(window.cordova instanceof HTMLElement)) { // eslint-disable-line no-undef +if (window.cordova && !(window.cordova instanceof HTMLElement)) { throw new Error('cordova already defined'); } @@ -166,7 +162,7 @@ function createEvent (type, data) { event.initEvent(type, false, false); if (data) { for (var i in data) { - if (data.hasOwnProperty(i)) { + if (Object.prototype.hasOwnProperty.call(data, i)) { event[i] = data[i]; } } @@ -174,7 +170,6 @@ function createEvent (type, data) { return event; } -/* eslint-disable no-undef */ var cordova = { define: define, require: require, @@ -182,8 +177,6 @@ var cordova = { platformVersion: PLATFORM_VERSION_BUILD_LABEL, platformId: platform.id, - /* eslint-enable no-undef */ - /** * Methods to add/remove your own addEventListener hijacking on document + window. */ @@ -202,15 +195,25 @@ var cordova = { removeDocumentEventHandler: function (event) { delete documentEventHandlers[event]; }, + /** * Retrieve original event handlers that were replaced by Cordova * * @return object */ getOriginalHandlers: function () { - return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, - 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + return { + document: { + addEventListener: m_document_addEventListener, + removeEventListener: m_document_removeEventListener + }, + window: { + addEventListener: m_window_addEventListener, + removeEventListener: m_window_removeEventListener + } + }; }, + /** * Method to fire event from native code * bNoDetach is required for events which cause an exception which needs to be caught in native code @@ -233,6 +236,7 @@ var cordova = { document.dispatchEvent(evt); } }, + fireWindowEvent: function (type, data) { var evt = createEvent(type, data); if (typeof windowEventHandlers[type] !== 'undefined') { @@ -306,11 +310,11 @@ var cordova = { } } catch (err) { var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err; - console && console.log && console.log(msg); - cordova.fireWindowEvent('cordovacallbackerror', { 'message': msg }); + cordova.fireWindowEvent('cordovacallbackerror', { message: msg, error: err }); throw err; } }, + addConstructor: function (func) { channel.onCordovaReady.subscribe(function () { try { @@ -334,18 +338,47 @@ var utils = require('cordova/utils'); var moduleExports = module.exports; var typeMap = { - 'A': 'Array', - 'D': 'Date', - 'N': 'Number', - 'S': 'String', - 'F': 'Function', - 'O': 'Object' + A: 'Array', + D: 'Date', + N: 'Number', + S: 'String', + F: 'Function', + O: 'Object' }; function extractParamName (callee, argIndex) { - return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; + return (/\(\s*([^)]*?)\s*\)/).exec(callee)[1].split(/\s*,\s*/)[argIndex]; } +/** + * Checks the given arguments' types and throws if they are not as expected. + * + * `spec` is a string where each character stands for the required type of the + * argument at the same position. In other words: the character at `spec[i]` + * specifies the required type for `args[i]`. The characters in `spec` are the + * first letter of the required type's name. The supported types are: + * + * Array, Date, Number, String, Function, Object + * + * Lowercase characters specify arguments that must not be `null` or `undefined` + * while uppercase characters allow those values to be passed. + * + * Finally, `*` can be used to allow any type at the corresponding position. + * + * @example + * function foo (arr, opts) { + * // require `arr` to be an Array and `opts` an Object, null or undefined + * checkArgs('aO', 'my.package.foo', arguments); + * // ... + * } + * @param {String} spec - the type specification for `args` as described above + * @param {String} functionName - full name of the callee. + * Used in the error message + * @param {Array|arguments} args - the arguments to be checked against `spec` + * @param {Function} [opt_callee=args.callee] - the recipient of `args`. + * Used to extract parameter names for the error message + * @throws {TypeError} if args do not satisfy spec + */ function checkArgs (spec, functionName, args, opt_callee) { if (!moduleExports.enableChecks) { return; @@ -401,7 +434,7 @@ base64.fromArrayBuffer = function (arrayBuffer) { }; base64.toArrayBuffer = function (str) { - var decodedStr = typeof atob !== 'undefined' ? atob(str) : Buffer.from(str, 'base64').toString('binary'); // eslint-disable-line no-undef + var decodedStr = atob(str); var arrayBuffer = new ArrayBuffer(decodedStr.length); var array = new Uint8Array(arrayBuffer); for (var i = 0, len = decodedStr.length; i < len; i++) { @@ -463,14 +496,13 @@ var utils = require('cordova/utils'); function each (objects, func, context) { for (var prop in objects) { - if (objects.hasOwnProperty(prop)) { + if (Object.prototype.hasOwnProperty.call(objects, prop)) { func.apply(context, [objects[prop], prop]); } } } function clobber (obj, key, value) { - exports.replaceHookForTesting(obj, key); var needsProperty = false; try { obj[key] = value; @@ -544,7 +576,7 @@ function include (parent, objects, clobber, merge) { */ function recursiveMerge (target, src) { for (var prop in src) { - if (src.hasOwnProperty(prop)) { + if (Object.prototype.hasOwnProperty.call(src, prop)) { if (target.prototype && target.prototype.constructor === target) { // If the target object is a constructor override off prototype. clobber(target.prototype, prop, src[prop]); @@ -570,7 +602,6 @@ exports.buildIntoAndMerge = function (objects, target) { }; exports.recursiveMerge = recursiveMerge; exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; -exports.replaceHookForTesting = function () {}; }); @@ -651,14 +682,14 @@ var channel = { } if (!len) h(); }, - /* eslint-disable no-return-assign */ + create: function (type) { - return channel[type] = new Channel(type, false); + return (channel[type] = new Channel(type, false)); }, createSticky: function (type) { - return channel[type] = new Channel(type, true); + return (channel[type] = new Channel(type, true)); }, - /* eslint-enable no-return-assign */ + /** * cordova Channels that must fire before "deviceready" is fired. */ @@ -779,7 +810,6 @@ Channel.prototype.unsubscribe = function (eventListenerOrFunction) { * Calls all functions subscribed to this channel. */ Channel.prototype.fire = function (e) { - var fail = false; // eslint-disable-line no-unused-vars var fireArgs = Array.prototype.slice.call(arguments); // Apply stickiness. if (this.state === 1) { @@ -836,33 +866,27 @@ module.exports = channel; }); -// file: /Users/spindori/Documents/Cordova/cordova-ios/cordova-js-src/exec.js +// file: ../cordova-ios/cordova-js-src/exec.js define("cordova/exec", function(require, exports, module) { -/*global require, module, atob, document */ - /** - * Creates a gap bridge iframe used to notify the native code about queued + * Creates the exec bridge used to notify the native code of * commands. */ -var cordova = require('cordova'), - utils = require('cordova/utils'), - base64 = require('cordova/base64'), - execIframe, - commandQueue = [], // Contains pending JS->Native messages. - isInContextOfEvalJs = 0, - failSafeTimerId = 0; +var cordova = require('cordova'); +var utils = require('cordova/utils'); +var base64 = require('cordova/base64'); -function massageArgsJsToNative(args) { - if (!args || utils.typeName(args) != 'Array') { +function massageArgsJsToNative (args) { + if (!args || utils.typeName(args) !== 'Array') { return args; } var ret = []; - args.forEach(function(arg, i) { - if (utils.typeName(arg) == 'ArrayBuffer') { + args.forEach(function (arg, i) { + if (utils.typeName(arg) === 'ArrayBuffer') { ret.push({ - 'CDVType': 'ArrayBuffer', - 'data': base64.fromArrayBuffer(arg) + CDVType: 'ArrayBuffer', + data: base64.fromArrayBuffer(arg) }); } else { ret.push(arg); @@ -871,29 +895,29 @@ function massageArgsJsToNative(args) { return ret; } -function massageMessageNativeToJs(message) { - if (message.CDVType == 'ArrayBuffer') { - var stringToArrayBuffer = function(str) { +function massageMessageNativeToJs (message) { + if (message.CDVType === 'ArrayBuffer') { + var stringToArrayBuffer = function (str) { var ret = new Uint8Array(str.length); for (var i = 0; i < str.length; i++) { ret[i] = str.charCodeAt(i); } return ret.buffer; }; - var base64ToArrayBuffer = function(b64) { - return stringToArrayBuffer(atob(b64)); + var base64ToArrayBuffer = function (b64) { + return stringToArrayBuffer(atob(b64)); // eslint-disable-line no-undef }; message = base64ToArrayBuffer(message.data); } return message; } -function convertMessageToArgsNativeToJs(message) { +function convertMessageToArgsNativeToJs (message) { var args = []; - if (!message || !message.hasOwnProperty('CDVType')) { + if (!message || !Object.prototype.hasOwnProperty.call(message, 'CDVType')) { args.push(message); - } else if (message.CDVType == 'MultiPart') { - message.messages.forEach(function(e) { + } else if (message.CDVType === 'MultiPart') { + message.messages.forEach(function (e) { args.push(massageMessageNativeToJs(e)); }); } else { @@ -902,8 +926,7 @@ function convertMessageToArgsNativeToJs(message) { return args; } -function iOSExec() { - +var iOSExec = function () { var successCallback, failCallback, service, action, actionArgs; var callbackId = null; if (typeof arguments[0] !== 'string') { @@ -920,9 +943,8 @@ function iOSExec() { // an invalid callbackId and passes it even if no callbacks were given. callbackId = 'INVALID'; } else { - throw new Error('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' + - 'cordova.exec(null, null, \'Service\', \'action\', [ arg1, arg2 ]);' - ); + throw new Error('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' + // eslint-disable-line + 'cordova.exec(null, null, \'Service\', \'action\', [ arg1, arg2 ]);'); } // If actionArgs is not provided, default to an empty array @@ -933,149 +955,54 @@ function iOSExec() { if (successCallback || failCallback) { callbackId = service + cordova.callbackId++; cordova.callbacks[callbackId] = - {success:successCallback, fail:failCallback}; + { success: successCallback, fail: failCallback }; } actionArgs = massageArgsJsToNative(actionArgs); - var command = [callbackId, service, action, actionArgs]; - - // Stringify and queue the command. We stringify to command now to - // effectively clone the command arguments in case they are mutated before - // the command is executed. - commandQueue.push(JSON.stringify(command)); - - // If we're in the context of a stringByEvaluatingJavaScriptFromString call, - // then the queue will be flushed when it returns; no need for a poke. - // Also, if there is already a command in the queue, then we've already - // poked the native side, so there is no reason to do so again. - if (!isInContextOfEvalJs && commandQueue.length == 1) { - pokeNative(); - } -} - -// CB-10530 -function proxyChanged() { - var cexec = cordovaExec(); - - return (execProxy !== cexec && // proxy objects are different - iOSExec !== cexec // proxy object is not the current iOSExec - ); -} - -// CB-10106 -function handleBridgeChange() { - if (proxyChanged()) { - var commandString = commandQueue.shift(); - while(commandString) { - var command = JSON.parse(commandString); - var callbackId = command[0]; - var service = command[1]; - var action = command[2]; - var actionArgs = command[3]; - var callbacks = cordova.callbacks[callbackId] || {}; - - execProxy(callbacks.success, callbacks.fail, service, action, actionArgs); - - commandString = commandQueue.shift(); - }; - return true; - } - - return false; -} - -function pokeNative() { - // CB-5488 - Don't attempt to create iframe before document.body is available. - if (!document.body) { - setTimeout(pokeNative); - return; - } - - // Check if they've removed it from the DOM, and put it back if so. - if (execIframe && execIframe.contentWindow) { - execIframe.contentWindow.location = 'gap://ready'; - } else { - execIframe = document.createElement('iframe'); - execIframe.style.display = 'none'; - execIframe.src = 'gap://ready'; - document.body.appendChild(execIframe); - } - // Use a timer to protect against iframe being unloaded during the poke (CB-7735). - // This makes the bridge ~ 7% slower, but works around the poke getting lost - // when the iframe is removed from the DOM. - // An onunload listener could be used in the case where the iframe has just been - // created, but since unload events fire only once, it doesn't work in the normal - // case of iframe reuse (where unload will have already fired due to the attempted - // navigation of the page). - failSafeTimerId = setTimeout(function() { - if (commandQueue.length) { - // CB-10106 - flush the queue on bridge change - if (!handleBridgeChange()) { - pokeNative(); - } - } - }, 50); // Making this > 0 improves performance (marginally) in the normal case (where it doesn't fire). -} - -iOSExec.nativeFetchMessages = function() { - // Stop listing for window detatch once native side confirms poke. - if (failSafeTimerId) { - clearTimeout(failSafeTimerId); - failSafeTimerId = 0; - } - // Each entry in commandQueue is a JSON string already. - if (!commandQueue.length) { - return ''; - } - var json = '[' + commandQueue.join(',') + ']'; - commandQueue.length = 0; - return json; + // CB-10133 DataClone DOM Exception 25 guard (fast function remover) + var command = [callbackId, service, action, JSON.parse(JSON.stringify(actionArgs))]; + window.webkit.messageHandlers.cordova.postMessage(command); }; -iOSExec.nativeCallback = function(callbackId, status, message, keepCallback, debug) { - return iOSExec.nativeEvalAndFetch(function() { - var success = status === 0 || status === 1; - var args = convertMessageToArgsNativeToJs(message); - function nc2() { - cordova.callbackFromNative(callbackId, success, status, args, keepCallback); - } - setTimeout(nc2, 0); +iOSExec.nativeCallback = function (callbackId, status, message, keepCallback, debug) { + var success = status === 0 || status === 1; + var args = convertMessageToArgsNativeToJs(message); + Promise.resolve().then(function () { + cordova.callbackFromNative(callbackId, success, status, args, keepCallback); // eslint-disable-line }); }; -iOSExec.nativeEvalAndFetch = function(func) { - // This shouldn't be nested, but better to be safe. - isInContextOfEvalJs++; +// for backwards compatibility +iOSExec.nativeEvalAndFetch = function (func) { try { func(); - return iOSExec.nativeFetchMessages(); - } finally { - isInContextOfEvalJs--; + } catch (e) { + console.log(e); } }; // Proxy the exec for bridge changes. See CB-10106 -function cordovaExec() { +function cordovaExec () { var cexec = require('cordova/exec'); var cexec_valid = (typeof cexec.nativeFetchMessages === 'function') && (typeof cexec.nativeEvalAndFetch === 'function') && (typeof cexec.nativeCallback === 'function'); - return (cexec_valid && execProxy !== cexec)? cexec : iOSExec; + return (cexec_valid && execProxy !== cexec) ? cexec : iOSExec; } -function execProxy() { +function execProxy () { cordovaExec().apply(null, arguments); -}; +} -execProxy.nativeFetchMessages = function() { +execProxy.nativeFetchMessages = function () { return cordovaExec().nativeFetchMessages.apply(null, arguments); }; -execProxy.nativeEvalAndFetch = function() { +execProxy.nativeEvalAndFetch = function () { return cordovaExec().nativeEvalAndFetch.apply(null, arguments); }; -execProxy.nativeCallback = function() { +execProxy.nativeCallback = function () { return cordovaExec().nativeCallback.apply(null, arguments); }; @@ -1121,7 +1048,6 @@ var cordova = require('cordova'); var modulemapper = require('cordova/modulemapper'); var platform = require('cordova/platform'); var pluginloader = require('cordova/pluginloader'); -var utils = require('cordova/utils'); var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; @@ -1141,34 +1067,6 @@ window.setTimeout(function () { } }, 5000); -// Replace navigator before any modules are required(), to ensure it happens as soon as possible. -// We replace it so that properties that can't be clobbered can instead be overridden. -function replaceNavigator (origNavigator) { - var CordovaNavigator = function () {}; - CordovaNavigator.prototype = origNavigator; - var newNavigator = new CordovaNavigator(); - // This work-around really only applies to new APIs that are newer than Function.bind. - // Without it, APIs such as getGamepads() break. - if (CordovaNavigator.bind) { - for (var key in origNavigator) { - if (typeof origNavigator[key] === 'function') { - newNavigator[key] = origNavigator[key].bind(origNavigator); - } else { - (function (k) { - utils.defineGetterSetter(newNavigator, key, function () { - return origNavigator[k]; - }); - })(key); - } - } - } - return newNavigator; -} - -if (window.navigator) { - window.navigator = replaceNavigator(window.navigator); -} - if (!window.console) { window.console = { log: function () {} @@ -1234,131 +1132,6 @@ channel.join(function () { channel.join(function () { require('cordova').fireDocumentEvent('deviceready'); }, channel.deviceReadyChannelsArray); - -}, platformInitChannelsArray); - -}); - -// file: src/common/init_b.js -define("cordova/init_b", function(require, exports, module) { - -var channel = require('cordova/channel'); -var cordova = require('cordova'); -var modulemapper = require('cordova/modulemapper'); -var platform = require('cordova/platform'); -var pluginloader = require('cordova/pluginloader'); -var utils = require('cordova/utils'); - -var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady]; - -// setting exec -cordova.exec = require('cordova/exec'); - -function logUnfiredChannels (arr) { - for (var i = 0; i < arr.length; ++i) { - if (arr[i].state !== 2) { - console.log('Channel not fired: ' + arr[i].type); - } - } -} - -window.setTimeout(function () { - if (channel.onDeviceReady.state !== 2) { - console.log('deviceready has not fired after 5 seconds.'); - logUnfiredChannels(platformInitChannelsArray); - logUnfiredChannels(channel.deviceReadyChannelsArray); - } -}, 5000); - -// Replace navigator before any modules are required(), to ensure it happens as soon as possible. -// We replace it so that properties that can't be clobbered can instead be overridden. -function replaceNavigator (origNavigator) { - var CordovaNavigator = function () {}; - CordovaNavigator.prototype = origNavigator; - var newNavigator = new CordovaNavigator(); - // This work-around really only applies to new APIs that are newer than Function.bind. - // Without it, APIs such as getGamepads() break. - if (CordovaNavigator.bind) { - for (var key in origNavigator) { - if (typeof origNavigator[key] === 'function') { - newNavigator[key] = origNavigator[key].bind(origNavigator); - } else { - (function (k) { - utils.defineGetterSetter(newNavigator, key, function () { - return origNavigator[k]; - }); - })(key); - } - } - } - return newNavigator; -} -if (window.navigator) { - window.navigator = replaceNavigator(window.navigator); -} - -if (!window.console) { - window.console = { - log: function () {} - }; -} -if (!window.console.warn) { - window.console.warn = function (msg) { - this.log('warn: ' + msg); - }; -} - -// Register pause, resume and deviceready channels as events on document. -channel.onPause = cordova.addDocumentEventHandler('pause'); -channel.onResume = cordova.addDocumentEventHandler('resume'); -channel.onActivated = cordova.addDocumentEventHandler('activated'); -channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); - -// Listen for DOMContentLoaded and notify our channel subscribers. -if (document.readyState === 'complete' || document.readyState === 'interactive') { - channel.onDOMContentLoaded.fire(); -} else { - document.addEventListener('DOMContentLoaded', function () { - channel.onDOMContentLoaded.fire(); - }, false); -} - -// _nativeReady is global variable that the native side can set -// to signify that the native code is ready. It is a global since -// it may be called before any cordova JS is ready. -if (window._nativeReady) { - channel.onNativeReady.fire(); -} - -// Call the platform-specific initialization. -platform.bootstrap && platform.bootstrap(); - -// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. -// The delay allows the attached modules to be defined before the plugin loader looks for them. -setTimeout(function () { - pluginloader.load(function () { - channel.onPluginsReady.fire(); - }); -}, 0); - -/** - * Create all cordova objects once native side is ready. - */ -channel.join(function () { - modulemapper.mapModules(window); - - platform.initialize && platform.initialize(); - - // Fire event to notify that all objects are created - channel.onCordovaReady.fire(); - - // Fire onDeviceReady event once page has fully loaded, all - // constructors have run and cordova info has been received from native - // side. - channel.join(function () { - require('cordova').fireDocumentEvent('deviceready'); - }, channel.deviceReadyChannelsArray); - }, platformInitChannelsArray); }); @@ -1367,7 +1140,7 @@ channel.join(function () { define("cordova/modulemapper", function(require, exports, module) { var builder = require('cordova/builder'); -var moduleMap = define.moduleMap; // eslint-disable-line no-undef +var moduleMap = define.moduleMap; var symbolList; var deprecationMap; @@ -1407,12 +1180,9 @@ function prepareNamespace (symbolPath, context) { if (!symbolPath) { return context; } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign - cur = cur[part] = cur[part] || {}; - } - return cur; + return symbolPath.split('.').reduce(function (cur, part) { + return (cur[part] = cur[part] || {}); + }, context); } exports.mapModules = function (context) { @@ -1463,103 +1233,7 @@ exports.reset(); }); -// file: src/common/modulemapper_b.js -define("cordova/modulemapper_b", function(require, exports, module) { - -var builder = require('cordova/builder'); -var symbolList = []; -var deprecationMap; - -exports.reset = function () { - symbolList = []; - deprecationMap = {}; -}; - -function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) { - symbolList.push(strategy, moduleName, symbolPath); - if (opt_deprecationMessage) { - deprecationMap[symbolPath] = opt_deprecationMessage; - } -} - -// Note: Android 2.3 does have Function.bind(). -exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) { - addEntry('c', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) { - addEntry('m', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) { - addEntry('d', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.runs = function (moduleName) { - addEntry('r', moduleName, null); -}; - -function prepareNamespace (symbolPath, context) { - if (!symbolPath) { - return context; - } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign - cur = cur[part] = cur[part] || {}; - } - return cur; -} - -exports.mapModules = function (context) { - var origSymbols = {}; - context.CDV_origSymbols = origSymbols; - for (var i = 0, len = symbolList.length; i < len; i += 3) { - var strategy = symbolList[i]; - var moduleName = symbolList[i + 1]; - var module = require(moduleName); - // <runs/> - if (strategy === 'r') { - continue; - } - var symbolPath = symbolList[i + 2]; - var lastDot = symbolPath.lastIndexOf('.'); - var namespace = symbolPath.substr(0, lastDot); - var lastName = symbolPath.substr(lastDot + 1); - - var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; - var parentObj = prepareNamespace(namespace, context); - var target = parentObj[lastName]; - - if (strategy === 'm' && target) { - builder.recursiveMerge(target, module); - } else if ((strategy === 'd' && !target) || (strategy !== 'd')) { - if (!(symbolPath in origSymbols)) { - origSymbols[symbolPath] = target; - } - builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); - } - } -}; - -exports.getOriginalSymbol = function (context, symbolPath) { - var origSymbols = context.CDV_origSymbols; - if (origSymbols && (symbolPath in origSymbols)) { - return origSymbols[symbolPath]; - } - var parts = symbolPath.split('.'); - var obj = context; - for (var i = 0; i < parts.length; ++i) { - obj = obj && obj[parts[i]]; - } - return obj; -}; - -exports.reset(); - -}); - -// file: /Users/spindori/Documents/Cordova/cordova-ios/cordova-js-src/platform.js +// file: ../cordova-ios/cordova-js-src/platform.js define("cordova/platform", function(require, exports, module) { module.exports = { @@ -1569,187 +1243,213 @@ module.exports = { // see the file under plugin/ios/console.js require('cordova/modulemapper').clobbers('cordova/plugin/ios/console', 'window.console'); + // Attach the wkwebkit utility to window.WkWebView + // see the file under plugin/ios/wkwebkit.js + require('cordova/modulemapper').clobbers('cordova/plugin/ios/wkwebkit', 'window.WkWebView'); + + // Attach the splashscreen utility to window.navigator.splashscreen + // see the file under plugin/ios/launchscreen.js + require('cordova/modulemapper').clobbers('cordova/plugin/ios/launchscreen', 'navigator.splashscreen'); + require('cordova/channel').onNativeReady.fire(); } }; }); -// file: /Users/spindori/Documents/Cordova/cordova-ios/cordova-js-src/plugin/ios/console.js +// file: ../cordova-ios/cordova-js-src/plugin/ios/console.js define("cordova/plugin/ios/console", function(require, exports, module) { -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var logger = require('cordova/plugin/ios/logger'); -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // object that we're exporting -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var console = module.exports; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // copy of the original console object -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var WinConsole = window.console; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // whether to use the logger -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var UseLogger = false; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Timers -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var Timers = {}; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // used for unimplemented methods -//------------------------------------------------------------------------------ -function noop() {} +// ------------------------------------------------------------------------------ +function noop () {} -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // used for unimplemented methods -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.useLogger = function (value) { if (arguments.length) UseLogger = !!value; if (UseLogger) { if (logger.useConsole()) { - throw new Error("console and logger are too intertwingly"); + throw new Error('console and logger are too intertwingly'); } } return UseLogger; }; -//------------------------------------------------------------------------------ -console.log = function() { +// ------------------------------------------------------------------------------ +console.log = function () { if (logger.useConsole()) return; logger.log.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.error = function() { +// ------------------------------------------------------------------------------ +console.error = function () { if (logger.useConsole()) return; logger.error.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.warn = function() { +// ------------------------------------------------------------------------------ +console.warn = function () { if (logger.useConsole()) return; logger.warn.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.info = function() { +// ------------------------------------------------------------------------------ +console.info = function () { if (logger.useConsole()) return; logger.info.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.debug = function() { +// ------------------------------------------------------------------------------ +console.debug = function () { if (logger.useConsole()) return; logger.debug.apply(logger, [].slice.call(arguments)); }; -//------------------------------------------------------------------------------ -console.assert = function(expression) { +// ------------------------------------------------------------------------------ +console.assert = function (expression) { if (expression) return; var message = logger.format.apply(logger.format, [].slice.call(arguments, 1)); - console.log("ASSERT: " + message); + console.log('ASSERT: ' + message); }; -//------------------------------------------------------------------------------ -console.clear = function() {}; +// ------------------------------------------------------------------------------ +console.clear = function () {}; -//------------------------------------------------------------------------------ -console.dir = function(object) { - console.log("%o", object); +// ------------------------------------------------------------------------------ +console.dir = function (object) { + console.log('%o', object); }; -//------------------------------------------------------------------------------ -console.dirxml = function(node) { +// ------------------------------------------------------------------------------ +console.dirxml = function (node) { console.log(node.innerHTML); }; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.trace = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.group = console.log; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.groupCollapsed = console.log; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.groupEnd = noop; -//------------------------------------------------------------------------------ -console.time = function(name) { +// ------------------------------------------------------------------------------ +console.time = function (name) { Timers[name] = new Date().valueOf(); }; -//------------------------------------------------------------------------------ -console.timeEnd = function(name) { +// ------------------------------------------------------------------------------ +console.timeEnd = function (name) { var timeStart = Timers[name]; if (!timeStart) { - console.warn("unknown timer: " + name); + console.warn('unknown timer: ' + name); return; } var timeElapsed = new Date().valueOf() - timeStart; - console.log(name + ": " + timeElapsed + "ms"); + console.log(name + ': ' + timeElapsed + 'ms'); }; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.timeStamp = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.profile = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.profileEnd = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.count = noop; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ console.exception = console.log; -//------------------------------------------------------------------------------ -console.table = function(data, columns) { - console.log("%o", data); +// ------------------------------------------------------------------------------ +console.table = function (data, columns) { + console.log('%o', data); }; -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // return a new function that calls both functions passed as args -//------------------------------------------------------------------------------ -function wrappedOrigCall(orgFunc, newFunc) { - return function() { +// ------------------------------------------------------------------------------ +function wrappedOrigCall (orgFunc, newFunc) { + return function () { var args = [].slice.call(arguments); try { orgFunc.apply(WinConsole, args); } catch (e) {} - try { newFunc.apply(console, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} }; } -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // For every function that exists in the original console object, that // also exists in the new console object, wrap the new console method // with one that calls both -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ for (var key in console) { - if (typeof WinConsole[key] == "function") { + if (typeof WinConsole[key] === 'function') { console[key] = wrappedOrigCall(WinConsole[key], console[key]); } } }); -// file: /Users/spindori/Documents/Cordova/cordova-ios/cordova-js-src/plugin/ios/logger.js +// file: ../cordova-ios/cordova-js-src/plugin/ios/launchscreen.js +define("cordova/plugin/ios/launchscreen", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var launchscreen = { + show: function () { + exec(null, null, 'LaunchScreen', 'show', []); + }, + hide: function () { + exec(null, null, 'LaunchScreen', 'hide', []); + } +}; + +module.exports = launchscreen; + +}); + +// file: ../cordova-ios/cordova-js-src/plugin/ios/logger.js define("cordova/plugin/ios/logger", function(require, exports, module) { -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // The logger module exports the following properties/functions: // // LOG - constant for the level LOG @@ -1768,16 +1468,16 @@ define("cordova/plugin/ios/logger", function(require, exports, module) { // debug(message,...) - logs a message at level DEBUG // logLevel(level,message,...) - logs a message specified level // -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ var logger = exports; -var exec = require('cordova/exec'); +var exec = require('cordova/exec'); -var UseConsole = false; -var UseLogger = true; -var Queued = []; -var DeviceReady = false; +var UseConsole = false; +var UseLogger = true; +var Queued = []; +var DeviceReady = false; var CurrentLevel; var originalConsole = console; @@ -1787,11 +1487,11 @@ var originalConsole = console; */ var Levels = [ - "LOG", - "ERROR", - "WARN", - "INFO", - "DEBUG" + 'LOG', + 'ERROR', + 'WARN', + 'INFO', + 'DEBUG' ]; /* @@ -1800,10 +1500,10 @@ var Levels = [ */ var LevelsMap = {}; -for (var i=0; i<Levels.length; i++) { +for (var i = 0; i < Levels.length; i++) { var level = Levels[i]; LevelsMap[level] = i; - logger[level] = level; + logger[level] = level; } CurrentLevel = LevelsMap.WARN; @@ -1830,7 +1530,7 @@ CurrentLevel = LevelsMap.WARN; logger.level = function (value) { if (arguments.length) { if (LevelsMap[value] === null) { - throw new Error("invalid logging level: " + value); + throw new Error('invalid logging level: ' + value); } CurrentLevel = LevelsMap[value]; } @@ -1848,17 +1548,17 @@ logger.useConsole = function (value) { if (arguments.length) UseConsole = !!value; if (UseConsole) { - if (typeof console == "undefined") { - throw new Error("global console object is not defined"); + if (typeof console === 'undefined') { + throw new Error('global console object is not defined'); } - if (typeof console.log != "function") { - throw new Error("global console object does not have a log function"); + if (typeof console.log !== 'function') { + throw new Error('global console object does not have a log function'); } - if (typeof console.useLogger == "function") { + if (typeof console.useLogger === 'function') { if (console.useLogger()) { - throw new Error("console and logger are too intertwingly"); + throw new Error('console and logger are too intertwingly'); } } } @@ -1884,7 +1584,7 @@ logger.useLogger = function (value) { * Parameters passed after message are used applied to * the message with utils.format() */ -logger.log = function(message) { logWithArgs("LOG", arguments); }; +logger.log = function (message) { logWithArgs('LOG', arguments); }; /** * Logs a message at the ERROR level. @@ -1892,7 +1592,7 @@ logger.log = function(message) { logWithArgs("LOG", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.error = function(message) { logWithArgs("ERROR", arguments); }; +logger.error = function (message) { logWithArgs('ERROR', arguments); }; /** * Logs a message at the WARN level. @@ -1900,7 +1600,7 @@ logger.error = function(message) { logWithArgs("ERROR", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.warn = function(message) { logWithArgs("WARN", arguments); }; +logger.warn = function (message) { logWithArgs('WARN', arguments); }; /** * Logs a message at the INFO level. @@ -1908,7 +1608,7 @@ logger.warn = function(message) { logWithArgs("WARN", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.info = function(message) { logWithArgs("INFO", arguments); }; +logger.info = function (message) { logWithArgs('INFO', arguments); }; /** * Logs a message at the DEBUG level. @@ -1916,17 +1616,17 @@ logger.info = function(message) { logWithArgs("INFO", arguments); }; * Parameters passed after message are used applied to * the message with utils.format() */ -logger.debug = function(message) { logWithArgs("DEBUG", arguments); }; +logger.debug = function (message) { logWithArgs('DEBUG', arguments); }; // log at the specified level with args -function logWithArgs(level, args) { +function logWithArgs (level, args) { args = [level].concat([].slice.call(args)); logger.logLevel.apply(logger, args); } // return the correct formatString for an object -function formatStringForMessage(message) { - return (typeof message === "string") ? "" : "%o"; +function formatStringForMessage (message) { + return (typeof message === 'string') ? '' : '%o'; } /** @@ -1935,18 +1635,18 @@ function formatStringForMessage(message) { * Parameters passed after message are used applied to * the message with utils.format() */ -logger.logLevel = function(level /* , ... */) { +logger.logLevel = function (level /* , ... */) { // format the message with the parameters var formatArgs = [].slice.call(arguments, 1); var fmtString = formatStringForMessage(formatArgs[0]); - if (fmtString.length > 0){ + if (fmtString.length > 0) { formatArgs.unshift(fmtString); // add formatString } - var message = logger.format.apply(logger.format, formatArgs); + var message = logger.format.apply(logger.format, formatArgs); if (LevelsMap[level] === null) { - throw new Error("invalid logging level: " + level); + throw new Error('invalid logging level: ' + level); } if (LevelsMap[level] > CurrentLevel) return; @@ -1959,28 +1659,27 @@ logger.logLevel = function(level /* , ... */) { // Log using the native logger if that is enabled if (UseLogger) { - exec(null, null, "Console", "logLevel", [level, message]); + exec(null, null, 'Console', 'logLevel', [level, message]); } // Log using the console if that is enabled if (UseConsole) { // make sure console is not using logger if (console.useLogger()) { - throw new Error("console and logger are too intertwingly"); + throw new Error('console and logger are too intertwingly'); } // log to the console switch (level) { - case logger.LOG: originalConsole.log(message); break; - case logger.ERROR: originalConsole.log("ERROR: " + message); break; - case logger.WARN: originalConsole.log("WARN: " + message); break; - case logger.INFO: originalConsole.log("INFO: " + message); break; - case logger.DEBUG: originalConsole.log("DEBUG: " + message); break; + case logger.LOG: originalConsole.log(message); break; + case logger.ERROR: originalConsole.log('ERROR: ' + message); break; + case logger.WARN: originalConsole.log('WARN: ' + message); break; + case logger.INFO: originalConsole.log('INFO: ' + message); break; + case logger.DEBUG: originalConsole.log('DEBUG: ' + message); break; } } }; - /** * Formats a string and arguments following it ala console.log() * @@ -1989,12 +1688,11 @@ logger.logLevel = function(level /* , ... */) { * for rationale, see FireBug's Console API: * http://getfirebug.com/wiki/index.php/Console_API */ -logger.format = function(formatString, args) { - return __format(arguments[0], [].slice.call(arguments,1)).join(' '); +logger.format = function (formatString, args) { + return __format(arguments[0], [].slice.call(arguments, 1)).join(' '); }; - -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ /** * Formats a string and arguments following it ala vsprintf() * @@ -2009,26 +1707,25 @@ logger.format = function(formatString, args) { * Returns an array containing the formatted string and any remaining * arguments. */ -function __format(formatString, args) { - if (formatString === null || formatString === undefined) return [""]; - if (arguments.length == 1) return [formatString.toString()]; +function __format (formatString, args) { + if (formatString === null || formatString === undefined) return ['']; + if (arguments.length === 1) return [formatString.toString()]; - if (typeof formatString != "string") - formatString = formatString.toString(); + if (typeof formatString !== 'string') { formatString = formatString.toString(); } var pattern = /(.*?)%(.)(.*)/; - var rest = formatString; - var result = []; + var rest = formatString; + var result = []; while (args.length) { var match = pattern.exec(rest); if (!match) break; - var arg = args.shift(); + var arg = args.shift(); rest = match[3]; result.push(match[1]); - if (match[2] == '%') { + if (match[2] === '%') { result.push('%'); args.unshift(arg); continue; @@ -2044,17 +1741,15 @@ function __format(formatString, args) { return remainingArgs; } -function __formatted(object, formatChar) { - +function __formatted (object, formatChar) { try { - switch(formatChar) { - case 'j': - case 'o': return JSON.stringify(object); - case 'c': return ''; + switch (formatChar) { + case 'j': + case 'o': return JSON.stringify(object); + case 'c': return ''; } - } - catch (e) { - return "error JSON.stringify()ing argument: " + e; + } catch (e) { + return 'error JSON.stringify()ing argument: ' + e; } if ((object === null) || (object === undefined)) { @@ -2064,15 +1759,14 @@ function __formatted(object, formatChar) { return object.toString(); } - -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // when deviceready fires, log queued messages -logger.__onDeviceReady = function() { +logger.__onDeviceReady = function () { if (DeviceReady) return; DeviceReady = true; - for (var i=0; i<Queued.length; i++) { + for (var i = 0; i < Queued.length; i++) { var messageArgs = Queued[i]; logger.logLevel(messageArgs[0], messageArgs[1]); } @@ -2081,7 +1775,34 @@ logger.__onDeviceReady = function() { }; // add a deviceready event to log queued messages -document.addEventListener("deviceready", logger.__onDeviceReady, false); +document.addEventListener('deviceready', logger.__onDeviceReady, false); + +}); + +// file: ../cordova-ios/cordova-js-src/plugin/ios/wkwebkit.js +define("cordova/plugin/ios/wkwebkit", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var WkWebKit = { + allowsBackForwardNavigationGestures: function (allow) { + exec(null, null, 'CDVWebViewEngine', 'allowsBackForwardNavigationGestures', [allow]); + }, + convertFilePath: function (path) { + if (!path || !window.CDV_ASSETS_URL) { + return path; + } + if (path.startsWith('/')) { + return window.CDV_ASSETS_URL + '/_app_file_' + path; + } + if (path.startsWith('file://')) { + return window.CDV_ASSETS_URL + path.replace('file://', '/_app_file_'); + } + return path; + } +}; + +module.exports = WkWebKit; }); @@ -2104,11 +1825,11 @@ exports.injectScript = function (url, onload, onerror) { function injectIfNecessary (id, url, onload, onerror) { onerror = onerror || onload; - if (id in define.moduleMap) { // eslint-disable-line no-undef + if (id in define.moduleMap) { onload(); } else { exports.injectScript(url, function () { - if (id in define.moduleMap) { // eslint-disable-line no-undef + if (id in define.moduleMap) { onload(); } else { onerror(); @@ -2119,7 +1840,7 @@ function injectIfNecessary (id, url, onload, onerror) { function onScriptLoadingComplete (moduleList, finishPluginLoading) { // Loop through all the plugins and then through their clobbers and merges. - for (var i = 0, module; module = moduleList[i]; i++) { // eslint-disable-line no-cond-assign + for (var i = 0, module; (module = moduleList[i]); i++) { if (module.clobbers && module.clobbers.length) { for (var j = 0; j < module.clobbers.length; j++) { modulemapper.clobbers(module.id, module.clobbers[j]); @@ -2195,53 +1916,6 @@ exports.load = function (callback) { }); -// file: src/common/pluginloader_b.js -define("cordova/pluginloader_b", function(require, exports, module) { - -var modulemapper = require('cordova/modulemapper'); - -// Handler for the cordova_plugins.js content. -// See plugman's plugin_loader.js for the details of this object. -function handlePluginsObject (moduleList) { - // if moduleList is not defined or empty, we've nothing to do - if (!moduleList || !moduleList.length) { - return; - } - - // Loop through all the modules and then through their clobbers and merges. - for (var i = 0, module; module = moduleList[i]; i++) { // eslint-disable-line no-cond-assign - if (module.clobbers && module.clobbers.length) { - for (var j = 0; j < module.clobbers.length; j++) { - modulemapper.clobbers(module.id, module.clobbers[j]); - } - } - - if (module.merges && module.merges.length) { - for (var k = 0; k < module.merges.length; k++) { - modulemapper.merges(module.id, module.merges[k]); - } - } - - // Finally, if runs is truthy we want to simply require() the module. - if (module.runs) { - modulemapper.runs(module.id); - } - } -} - -// Loads all plugins' js-modules. Plugin loading is syncronous in browserified bundle -// but the method accepts callback to be compatible with non-browserify flow. -// onDeviceReady is blocked on onPluginsReady. onPluginsReady is fired when there are -// no plugins to load, or they are all done. -exports.load = function (callback) { - var moduleList = require('cordova/plugin_list'); - handlePluginsObject(moduleList); - - callback(); -}; - -}); - // file: src/common/urlutil.js define("cordova/urlutil", function(require, exports, module) { @@ -2349,10 +2023,11 @@ utils.clone = function (obj) { retVal = {}; for (i in obj) { - // https://issues.apache.org/jira/browse/CB-11522 'unknown' type may be returned in - // custom protocol activation case on Windows Phone 8.1 causing "No such interface supported" exception - // on cloning. - if ((!(i in retVal) || retVal[i] !== obj[i]) && typeof obj[i] !== 'undefined' && typeof obj[i] !== 'unknown') { // eslint-disable-line valid-typeof + // 'unknown' type may be returned in custom protocol activation case on + // Windows Phone 8.1 causing "No such interface supported" exception on + // cloning (https://issues.apache.org/jira/browse/CB-11522) + // eslint-disable-next-line valid-typeof + if ((!(i in retVal) || retVal[i] !== obj[i]) && typeof obj[i] !== 'undefined' && typeof obj[i] !== 'unknown') { retVal[i] = utils.clone(obj[i]); } } @@ -2402,7 +2077,6 @@ utils.extend = (function () { var F = function () {}; // extend Child from Parent return function (Child, Parent) { - F.prototype = Parent.prototype; Child.prototype = new F(); Child.__super__ = Parent.prototype; @@ -2425,7 +2099,6 @@ utils.alert = function (msg) { window.cordova = require('cordova'); // file: src/scripts/bootstrap.js - require('cordova/init'); -})();
\ No newline at end of file +})(); diff --git a/StoneIsland/platforms/ios/www/cordova_plugins.js b/StoneIsland/platforms/ios/www/cordova_plugins.js index 8469b08b..74e8a3a4 100644 --- a/StoneIsland/platforms/ios/www/cordova_plugins.js +++ b/StoneIsland/platforms/ios/www/cordova_plugins.js @@ -1,172 +1,97 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { -module.exports = [ - { - "id": "cordova-plugin-customurlscheme.LaunchMyApp", - "file": "plugins/cordova-plugin-customurlscheme/www/ios/LaunchMyApp.js", - "pluginId": "cordova-plugin-customurlscheme", - "clobbers": [ - "window.plugins.launchmyapp" - ] - }, - { - "id": "cordova-plugin-device.device", - "file": "plugins/cordova-plugin-device/www/device.js", - "pluginId": "cordova-plugin-device", - "clobbers": [ - "device" - ] - }, - { - "id": "cordova-plugin-dialogs.notification", - "file": "plugins/cordova-plugin-dialogs/www/notification.js", - "pluginId": "cordova-plugin-dialogs", - "merges": [ - "navigator.notification" - ] - }, - { - "id": "cordova-plugin-geolocation.Coordinates", - "file": "plugins/cordova-plugin-geolocation/www/Coordinates.js", - "pluginId": "cordova-plugin-geolocation", - "clobbers": [ - "Coordinates" - ] - }, - { - "id": "cordova-plugin-geolocation.PositionError", - "file": "plugins/cordova-plugin-geolocation/www/PositionError.js", - "pluginId": "cordova-plugin-geolocation", - "clobbers": [ - "PositionError" - ] - }, - { - "id": "cordova-plugin-geolocation.Position", - "file": "plugins/cordova-plugin-geolocation/www/Position.js", - "pluginId": "cordova-plugin-geolocation", - "clobbers": [ - "Position" - ] - }, - { - "id": "cordova-plugin-geolocation.geolocation", - "file": "plugins/cordova-plugin-geolocation/www/geolocation.js", - "pluginId": "cordova-plugin-geolocation", - "clobbers": [ - "navigator.geolocation" - ] - }, - { - "id": "cordova-plugin-inappbrowser.inappbrowser", - "file": "plugins/cordova-plugin-inappbrowser/www/inappbrowser.js", - "pluginId": "cordova-plugin-inappbrowser", - "clobbers": [ - "cordova.InAppBrowser.open", - "window.open" - ] - }, - { - "id": "cordova-plugin-network-information.network", - "file": "plugins/cordova-plugin-network-information/www/network.js", - "pluginId": "cordova-plugin-network-information", - "clobbers": [ - "navigator.connection", - "navigator.network.connection" - ] - }, - { - "id": "cordova-plugin-network-information.Connection", - "file": "plugins/cordova-plugin-network-information/www/Connection.js", - "pluginId": "cordova-plugin-network-information", - "clobbers": [ - "Connection" - ] - }, - { - "id": "cordova-plugin-splashscreen.SplashScreen", - "file": "plugins/cordova-plugin-splashscreen/www/splashscreen.js", - "pluginId": "cordova-plugin-splashscreen", - "clobbers": [ - "navigator.splashscreen" - ] - }, - { - "id": "cordova-plugin-statusbar.statusbar", - "file": "plugins/cordova-plugin-statusbar/www/statusbar.js", - "pluginId": "cordova-plugin-statusbar", - "clobbers": [ - "window.StatusBar" - ] - }, - { - "id": "cordova-plugin-x-socialsharing.SocialSharing", - "file": "plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js", - "pluginId": "cordova-plugin-x-socialsharing", - "clobbers": [ - "window.plugins.socialsharing" - ] - }, - { - "id": "ionic-plugin-keyboard.keyboard", - "file": "plugins/ionic-plugin-keyboard/www/ios/keyboard.js", - "pluginId": "ionic-plugin-keyboard", - "clobbers": [ - "cordova.plugins.Keyboard" - ], - "runs": true - }, - { - "id": "phonegap-plugin-push.PushNotification", - "file": "plugins/phonegap-plugin-push/www/push.js", - "pluginId": "phonegap-plugin-push", - "clobbers": [ - "PushNotification" - ] - }, - { - "id": "cordova-plugin-sim.Sim", - "file": "plugins/cordova-plugin-sim/www/sim.js", - "pluginId": "cordova-plugin-sim", - "merges": [ - "window.plugins.sim" - ] - }, - { - "id": "phonegap-plugin-mobile-accessibility.mobile-accessibility", - "file": "plugins/phonegap-plugin-mobile-accessibility/www/mobile-accessibility.js", - "pluginId": "phonegap-plugin-mobile-accessibility", - "clobbers": [ - "window.MobileAccessibility" - ] - }, - { - "id": "phonegap-plugin-mobile-accessibility.MobileAccessibilityNotifications", - "file": "plugins/phonegap-plugin-mobile-accessibility/www/MobileAccessibilityNotifications.js", - "pluginId": "phonegap-plugin-mobile-accessibility", - "clobbers": [ - "MobileAccessibilityNotifications" - ] - } -]; -module.exports.metadata = -// TOP OF METADATA -{ - "cordova-plugin-app-name": "1.0.4", - "cordova-plugin-compat": "1.1.0", - "cordova-plugin-customurlscheme": "4.2.0", - "cordova-plugin-device": "1.1.3", - "cordova-plugin-dialogs": "1.3.0", - "cordova-plugin-geolocation": "2.4.0", - "cordova-plugin-inappbrowser": "1.5.0", - "cordova-plugin-network-information": "1.3.0", - "cordova-plugin-splashscreen": "4.0.3", - "cordova-plugin-statusbar": "2.2.3", - "cordova-plugin-whitelist": "1.3.0", - "cordova-plugin-x-socialsharing": "5.1.3", - "ionic-plugin-keyboard": "2.2.1", - "phonegap-plugin-push": "1.9.2", - "cordova-plugin-sim": "1.3.3", - "phonegap-plugin-mobile-accessibility": "1.0.5-dev" -}; -// BOTTOM OF METADATA + module.exports = [ + { + "id": "cordova-plugin-customurlscheme.LaunchMyApp", + "file": "plugins/cordova-plugin-customurlscheme/www/ios/LaunchMyApp.js", + "pluginId": "cordova-plugin-customurlscheme", + "clobbers": [ + "window.plugins.launchmyapp" + ] + }, + { + "id": "cordova-plugin-device.device", + "file": "plugins/cordova-plugin-device/www/device.js", + "pluginId": "cordova-plugin-device", + "clobbers": [ + "device" + ] + }, + { + "id": "cordova-plugin-dialogs.notification", + "file": "plugins/cordova-plugin-dialogs/www/notification.js", + "pluginId": "cordova-plugin-dialogs", + "merges": [ + "navigator.notification" + ] + }, + { + "id": "cordova-plugin-firebasex.FirebasePlugin", + "file": "plugins/cordova-plugin-firebasex/www/firebase.js", + "pluginId": "cordova-plugin-firebasex", + "clobbers": [ + "FirebasePlugin" + ] + }, + { + "id": "cordova-plugin-ionic-keyboard.keyboard", + "file": "plugins/cordova-plugin-ionic-keyboard/www/ios/keyboard.js", + "pluginId": "cordova-plugin-ionic-keyboard", + "clobbers": [ + "window.Keyboard" + ] + }, + { + "id": "cordova-plugin-sim.Sim", + "file": "plugins/cordova-plugin-sim/www/sim.js", + "pluginId": "cordova-plugin-sim", + "merges": [ + "window.plugins.sim" + ] + }, + { + "id": "cordova-plugin-geolocation.Coordinates", + "file": "plugins/cordova-plugin-geolocation/www/Coordinates.js", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "Coordinates" + ] + }, + { + "id": "cordova-plugin-geolocation.PositionError", + "file": "plugins/cordova-plugin-geolocation/www/PositionError.js", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "PositionError" + ] + }, + { + "id": "cordova-plugin-geolocation.Position", + "file": "plugins/cordova-plugin-geolocation/www/Position.js", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "Position" + ] + }, + { + "id": "cordova-plugin-geolocation.geolocation", + "file": "plugins/cordova-plugin-geolocation/www/geolocation.js", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "navigator.geolocation" + ] + } + ]; + module.exports.metadata = { + "cordova-plugin-app-name": "1.0.4", + "cordova-plugin-compat": "1.1.0", + "cordova-plugin-customurlscheme": "4.2.0", + "cordova-plugin-device": "1.1.3", + "cordova-plugin-dialogs": "1.3.0", + "cordova-plugin-androidx": "2.0.0", + "cordova-plugin-androidx-adapter": "1.1.1", + "cordova-plugin-firebasex": "10.2.0-cli", + "cordova-plugin-ionic-keyboard": "2.2.0", + "cordova-plugin-sim": "1.3.3", + "cordova-plugin-geolocation": "4.0.2" + }; });
\ No newline at end of file diff --git a/StoneIsland/platforms/ios/www/db.json b/StoneIsland/platforms/ios/www/db.json index 7bffd341..c58f6472 100644 --- a/StoneIsland/platforms/ios/www/db.json +++ b/StoneIsland/platforms/ios/www/db.json @@ -5,10 +5,12 @@ "title": "Philosophy", "image": { "uri": "http://cdn3.yoox.biz/stoneisland/wp-content/uploads/2013/11/philosophy1.jpg", - "caption": "" + "caption": "The philosophy of Stone Island. Image of glass lab flasks containing pigments used for dyeing garments.", + "width": "", + "height": "" }, "body": "A culture of research, experimentation, function and use are the matrixes that have always defined Stone Island: the sportswear brand established in 1982, designed to become a symbol of extreme research on fibers and textiles, applied to an innovative design. Season after season, it is through the study of form and the “manipulation” of the matter that Stone Island has found its own language with the aim of establishing new boundaries in the world of garment making. \r\n\r\nThe study of uniforms and of work wear, its evolution according to new requirements of use, has become Stone Island’s observation post for defining a project in which the clothing item’s function is never just aesthetic.\r\n\r\nAn ongoing investigation, thorough and without frontiers, on the processing and ennobling of fibers and textiles, leading to discover materials and production techniques never used before in the clothing industry.\r\n\r\nJackets constructed in nylon monofilament, deriving from the water filtering technology. Highly reflective or thermo-sensitive fabrics, changing color with the variation of temperature. Featherweight polyester cloth vacuum- coated with a 100% stainless steel film used in aviation technology to protect the on-board computers. Non-woven materials, Kevlar® and polyester felt, rhomboidal nets in polyester used in the construction industry and coated in polyurethane. These are some examples of materials conceived by Stone Island philosophy.\r\n\r\nStone Island’s strength is also based on the unique ability to intervene on the finished item, through the continuous tests on dyeing and treatments carried out in the Sportswear Company’s laboratory of color. A department able to combine advanced technology, experience and human capacity and that has developed more than 60,000 different recipes of dyes throughout the years.\r\n\r\nAll the accumulated knowledge and experience, an inalienable heritage, on which great part of Stone Island’s know-how is based, is kept in the historical archive that collects the trial tests, and the recipes for textile dyeing and handling that have been developed by all those people who have worked on this project with passion.", - "__index": "0", + "__index": 0, "dateCreated": "Thu, 05 Nov 2015 00:24:44 GMT" }, { @@ -16,10 +18,12 @@ "title": "History", "image": { "uri": "https://ltho.s3.amazonaws.com/ce68408c-34b3-40ca-8ddf-c10cd1412c5f.jpg", - "caption": "" + "caption": "Image of the Stone Island exhibition with an artistic installation of mannequins in different jackets.", + "width": "", + "height": "" }, "body": "Stone Island, the Italian brand that reinvented the concept of casual wear, was founded in 1982 out of the passion and brilliant research into textile finishing performed by its creator and art director, intellectual from Bologna, Massimo Osti. It was Osti, in the mid-Seventies, who researched thousands of uniforms and pieces of work clothing and catalogued their functional characteristics. In Ravarino, in the province of Modena, he created a company whose hub was a full-scale center of research into materials and treatments became a sophisticated laboratory for garment and experimental dyeing.\r\n\r\nThe story of Stone Island began, almost by chance, with research into a special material, a thick truck tarpaulin, the outstanding feature of which was that it had been resin-treated in red on one side and blue on the other. The first prototype was too stiff, so it was washed for a long period in water with pumice stones to break down the structure of the material. The result was surprising, a worn-look garment with great appeal. It was therefore decided to create seven jackets in that unique fabric called Tela Stella, and to give this product a name. The strong identity of the project called for an important name, which was identified by analyzing the most commonly occurring words in Joseph Conrad’s novels: the words Stone and Island were chosen.\r\n\r\nStone Island has a marine feel, conjuring up old oilskins corroded by the sea and a military feel, which is drawn from the fund of research completed until that time. The name also evokes a love of the sea and that first treatment selected to “process” the garments. The badge, the detachable fabric label that has distinguished Stone Island garments since the first season, showed a Compass Rose, displayed like a military badge.\r\n\r\nThe reaction is immediate. Stone Island became a success phenomenon, with no set plan or marketing research behind it: a uniquely Italian mix of creativity, intuition and entrepreneurial spirit. A star was born.", - "__index": "1", + "__index": 1, "dateCreated": "Thu, 05 Nov 2015 00:27:25 GMT" }, { @@ -27,80 +31,142 @@ "title": "Carlo Rivetti", "image": { "uri": "https://ltho.s3.amazonaws.com/2fe16d85-e85f-4f12-ae55-72622c8efafd.jpg", - "caption": "" + "caption": "Black and white head shot of Carlo Rivetti, CEO of Stone Island.", + "width": "", + "height": "" }, "body": "My family has deep roots within the clothing industry. In the 19th century, Giuseppe Rivetti – son of Giovanni Battista, Italy’s first carding machine operator, inherited his father’s passion and in order to fund his own wool factory he secretly sold cows from the family farms to buy looms. By 1872 he had his own wool factory: “Giuseppe Rivetti e Figli”, which later merged with the Turin based GFT group (Gruppo Finanziario Tessile). There, my uncle Pinot had the unique idea of rubberizing wool fabrics to increase their performance.
This fondness for research also drove my father, Silvio. In the immediate post-war period, he set off for the United States where he found the Palm Beach Incorporated company, who produced something that didn’t yet exist in Europe: clothing constructed on theoretical measurements; what we now know as sizes.
My father was stunned, working for six months as a laborer, before returning and convincing his brothers to give up their shares in the wool factories in order to buy out GFT. \r\n\r\nIn the early 1950’s GFT measured more than 25,000 Italians, which allowed them to effectively dress the whole nation for the first time with non-tailored garments. \r\n\r\nThe 1973 oil crisis brought severe yet swift recession, and something had to be done to recover sales. My cousin, Marco Rivetti, noticed a French couturier working in a women’s outerwear firm we’d acquired one year earlier. He would design and fit the garments, write orders in Paris and then use our company to manufacture them. He was Emanuel Ungaro. This led us to realize that in order to re-launch the sector we needed to add a fundamental ingredient to the clothing industry: fashion.
As a result, GFT became a licensee of the rising stars of Italian fashion, including Giorgio Armani and Valentino. The rise of Italian-made Prêt à Porter was due to the ability to combine entrepreneurial ability with creativity.\r\n\r\nI joined GFT in 1975. Towards the end of that decade, I had the idea to start a new area within the group; to generate something more timeless: sportswear. In the early 1980’s, I discovered C.P. Company, a firm known for being innovative and cutting edge in this field. The company was owned by Trabaldo Togna and Massimo Osti, a graphic artist by profession and the firm’s designer and art director. We bought first 50% in 1983 and later on the entire company.
That was the beginning of my journey. In 1993 I left GFT and, together with my sister Cristina, acquired 100% of the firm which is known today as Sportswear Company.
\r\n\r\nIt was in 1983 that I got to know Massimo Osti, who had brought Stone Island into existence almost by chance, a year earlier. A special fabric named ‘Tela Stella’ had arrived in the company: a cloth that had a different color on each side, used to make truck tarpaulins. The effect was very interesting but had little to do with the existing C.P. Company line. Osti decided to do something special with that fabric and created a collection of just seven jackets. The collection strongly referenced military style with the now iconic badge inspired by military insignia. The compass symbolized love for the sea and an aim for constant research.\r\n\r\nMassimo was at least ten years ahead of others in his field. He saw himself as a producer rather than a fashion designer.
His achievement establishing Stone Island was not only appealing and saleable, but also true to his core belief in informal wear. His ideas were drawn from military and work wear, accompanying them with endless textile research.\r\n\r\nIn the mid-nineties, Massimo our paths eventually came apart, and I found myself with the difficult task of finding someone to design Stone Island.
In 1994 as I wandered through a Munich trade fair I came across the work of designer Paul Harvey, an English designer who lived in Sant’Arcangelo di Romagna, Italy. I was struck by a strange feeling of familiarity and cried out: “so here’s the Stone of the 21st Century!”. From 1996, with Paul, we embarked on the second era of our brand.\r\n\r\nPaul designed 24 collections, each consistent in the evolution and research that has always set Stone Island apart.
He is another extraordinary character. After graduating Central Saint Martins, he decided fashion was not his career path and worked as a truck driver! Only after marrying a fantastic Italian lady and moving to Italy did he start designing clothes.
His approach to design has functionality in its blood, which allowed him to interpret Stone Island perfectly. He led the brand masterfully into the new century. \r\n\r\nAfter 12 marvelous years, Paul needed to leave the fashion world to “do something for the Planet”. With such a noble ambition, I could only accept and support his decision.
In that moment, facing another crucial decision, I came to the conclusion the era of “one man at the helm” was over.
Times had changed. It was necessary to be multicultural in order to be truly contemporary.
I built a design team. I felt that in this era it is this possible to face all aspects of a world only with several minds and several visions: and this has been Stone Island from 2008 to today.
\r\n\r\nI feel like the coach. I choose which men to send onto the pitch, depending upon who we have to play: We need to be more sensitive, faster, and ready to grasp the signs of strength and weakness.
As a result, we need multi-cultural people that travel the world and observe it from different viewpoints: people of different ages and from different cultures.\r\n\r\nThis, in short, is my story. I like to think there’s a common thread that binds us all. A desire for continual experimentation and research, not without a touch of healthy insanity: that special something that makes our Stone Island much more than a just a clothing brand.\r\n\r\n<i>Carlo Rivetti,\r\nPresident and Creative Director, Stone Island</i>", - "__index": "2", + "__index": 2, "dateCreated": "Thu, 05 Nov 2015 00:27:38 GMT" } ], "archive": [ { - "id": "-010-015", - "title": "'010'015", + "id": "-010-019", + "title": "'010'019", "images": [ { - "uri": "https://ltho.s3.amazonaws.com/2bafd7a2-fbbb-4904-8e64-ff394888fd24.png", - "label": "LIQUID REFLECTIVE", - "code": "5315 42944", - "caption": "Fabric that is highly reflective owing to its coating made up\r\nof thousands of glass microspheres. Each finished garment\r\nis hand sprayed individually and individually baked dry.\r\nThe varying intensity of the reflective element and varying\r\nintensity of color, the dribbling and speckled effect, are\r\nowing to the high level of craftsmanship involved in the\r\nprocess, making each garment unique and unrepeatable.\r\nLining in quilted microfiber with polyester padding.\r\nStone Island badge with white embroidery, reserved for\r\ngarments that are made using advanced research into\r\nfabrics or processes." + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f4278f40-a735-11ea-a0eb-d316a823bd3a.png", + "width": "400", + "height": "600", + "label": "ICE KNIT_THERMO SENSITIVE YARN", + "caption": "Crew neck sweater made with double knit construction. For the outer face an exclusive thermo-sensitive yarn drastically changes color when exposed to cold. The inside is in pure wool. Ribbed neckline, cuffs and bottom hem.", + "code": "6715 547B4 " }, { - "uri": "https://ltho.s3.amazonaws.com/a0714935-2800-425f-9b34-63fdc4a7fc78.png", - "label": "30/30 JACKET", - "code": "5715 4TTY2", - "caption": "The 30/30 jacket is a cross section of the state of the art of Stone Island. A testament to three decades of exploration and development, it has been designed to embody the spirit of Stone Island’s endless creativity. Linked by the signature looped rigging system, both the jacket shell and jacket liner are reversible. These can be worn, either together or alone, in a total of 10 different ways. The transformative\r\nproperties of the fabrics mean that these 10 ways can each be worn in 3 different modes: Ice, Reflective,\r\nand Normal; resulting in a total of 30 different jacket states.\r\nThis piece features is our 30th anniversary special edition badge.\r\nJACKET /SHELL _ RASO GOMMATO PRISMATIC COVER.\r\nSatin weave cotton of military origin bonded on the inside to a a shiny transparent fine-grained polyurethane film reflecting the light, magnifying the color effects and bestowing the surface with a three-dimensional and ‘liquid’ appearance.\r\nJACKET/ LINER_ THERMO REFLECTIVE / ENGINEERED WOOL\r\nThis material merges two of Stone Island’s most avant-garde research paths. It explores the interaction between light refraction and thermosensitivity technologies. The resins used to coat the nylon substrate host both the glass microspheres allowing fabric refraction and the micro-encapsulated pigments modifying the passage of light and thus enabling color changes in relation to temperature. The final effect is an organic and dynamic interaction of light and color. On the reverse side, an engineered wool face made with a double knit machine." + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f4219bd0-a735-11ea-a0eb-d316a823bd3a.png", + "width": "400", + "height": "600", + "label": "ICE JACKET IN DYNEEMA® BONDED LEATHER", + "caption": "Jacket in thermosensitive leather. This material is born from the collaboration of ECCO LEATHER and the Dyneema® Project with Stone Island. The leather is bonded to the super lightweight Dyneema® composite non-woven fabric, the strongest and most resistant fiber in the world. The leather outer face is coated with thermosensitive agents. Pigment molecules micro encapsulated in resin change appearance and leather facing drastically changes color with the lowering of the temperature. Dyneema® hood can be folded away in the stand-up collar edged in cloth on the inside. Diagonal pockets with zipper fastening edged in nylon tape. Velcro® strap at cuffs. Hidden double slider zipper and Velcro® fastening. Detachable nylon lining padded with down. Snap-fastened.", + "code": "6915 00199" }, { - "uri": "https://ltho.s3.amazonaws.com/d51dce63-d467-45ea-88a6-5b077ffe3c3c.png", - "label": "REFLECTIVE KNIT WITH WINDSTOPPER® 3L", - "code": "5715 587Y5", - "caption": "To celebrate the thirtieth anniversary of Stone Island, a yarn has been engineered that represents the\r\nheight of our tireless research. The President’S Knit 5715 has been created in Reflective yarn, made\r\nup of micro plates coated with glass microspheres trapped inside a polyester mesh. The structure of\r\nthe jumper has been made double, reflective on the outside and wool on the inside. The outer face\r\nhas then been printed in a darker shade using heat and pressure sublimation printing to amalgamate\r\nthe fibers, obtain an even surface and reduce the strong reflective appearance.\r\nThe detachable padded and quilted lining has been created in a polyester jersey laminated with a\r\nWindstopper® membrane, which provides an unbeatable balance between protection and comfort.\r\nThis piece features is our 30th anniversary special edition badge." + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f4285290-a735-11ea-a0eb-d316a823bd3a.png", + "width": "400", + "height": "600", + "label": "GARMENT DYED PIXEL REFLECTIVE", + "caption": "Stone Island’s research introduces garment dyeing on reflective fabrics. The landmark iridescent Nylon Metal fabric is printed with a resin substance containing thousands of glass microspheres. The garment dyeing procedure lends extraordinary colors to the textile base while the Pixel Reflective printing provides it with a strong capacity to reflect even the weakest light sources. A special agent was added to the dyeing bath for an anti-drop effect. Hooded jacket in Pixel Reflective fabric. Garment dyed. Double hood, the detachable inner one in cotton jersey. Diagonal hand pockets with hidden zip fastening. Chest pockets with zip fastening. Snap at cuffs. Zip and Velcro fastening.", + "code": "6415 45646" }, { - "uri": "https://ltho.s3.amazonaws.com/5883b275-a2eb-4a34-890f-69b30250a62b.png", - "label": "RASO HAND PAINTED TORTOISE SHELL", - "code": "6115 70565", - "caption": "Trench coat in a satin-weave cotton fabric of military origin. The garment has been dyed and then faded in selected areas with a corrosive paste. The bleached parts have then been hand-painted with a tortoiseshell-inspired motif also appearing on the Stone Island badge on the left sleeve. This extraordinary manual process makes each piece unique and unrepeatable. Detachable hood in garment-dyed padded iridescent nylon. Detachable lining in GARMENT-DYED DOWN_26 GR X SQM_N, an ultra-light nylon weighing only 26 grams per square meter, filled with the finest down specially treated to bear the stress of the garment dyeing procedure. Garment-dyed with special dye recipes. It is secured to the outer garment by the iconic Stone Island fastening system." + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f44688f0-a735-11ea-a0eb-d316a823bd3a.png", + "width": "400", + "height": "600", + "label": "PRINTED HEAT REACTIVE_THERMOSENSITIVE FABRIC", + "caption": "Jacket/Vest in cotton ripstop printed with a permanent color and three colors that react with temperature changes. The printed pattern considerably mutes and morphs when exposed to heat. Stand-up collar with Velcro band. Detachable sleeves, attached to the garment with long zippers on the front and shoulders, to wear the piece as a vest. Hidden popper diagonal pockets. Ribbed inserts at the elbows and forearms. Ribbed cuffs. Drawstring on bottom hem. Double slider zipper fastening.", + "code": "7015 448E1" }, { - "uri": "https://ltho.s3.amazonaws.com/a25cc013-5c2c-4221-974a-987b8fd00ab4.png", - "label": "HAND PAINTED SHEEPSKIN", - "code": "6115 00379", - "caption": "Sheepskin parka. The finished piece has been hand-sprayed on the outer face with a resin based product and then hand waxed to achieve a softer feel. Hood edged by fur trim. " + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f449bd40-a735-11ea-a0eb-d316a823bd3a.png", + "width": "400", + "height": "600", + "label": "PAINTBALL CAMO_COTTON/CORDURA®", + "caption": "Fishtail anorak made of a resistant cotton rep blended with ultra-twisted Cordura® yarns. Cordura® lends extra strength and tenacity to the fabric. The garment is dyed with the addition of an anti-drop agent. The exclusive camouflage appearance, different on each garment, is obtained by ‘shooting’ colors onto the finished garment through an innovative technique. Also the Stone Island badge presents the same effect. The piece is padded with wadding. Large protective hood with drawstring and throat flap with snaps, with inner second detachable hood in woolen felt. Pouch pockets on the front, with slanting entrances fastened through flap and button. Collar fastened trough hidden zipper, buttons and snap. Adjustable straps at cuffs. Side Velcro straps at waist. Side bottom vertical zippers. Drawstring in bottom hem. The fishtail bottom can be shortened through the use of snaps.", + "code": "7115 711PA " }, { - "uri": "https://ltho.s3.amazonaws.com/fa5ed231-8b04-4ecc-b126-7a5543d5614a.png", - "label": "ICE JACKET THERMO-SENSITIVE FABRIC", - "code": "6115 43098", - "caption": "Hooded jacket in thermo sensitive fabric. A water- and wind-resistant polyurethane film is embedded with micro-encapsulated pigments. The molecules of these pigments modify the path of light and change color according to the temperature. The garment is then padded with the finest down.Two chest patch pockets, with snap-flap fastening and second pocket with vertical zip fastening. Adjustable elastic at cuffs. Cotton terry lined hood. Hidden zip and button fastening." + "uri": "https://ltho.s3.amazonaws.com/512029b0-f4a3-469a-9d7d-1cd7fc15c1c8.png", + "width": "", + "height": "", + "label": "POLY COVER COMPOSITE + POLY FUR SILVER DETACHABLE LINING", + "caption": "Hooded jacket in Poly Cover Composite, a matte, colorless and opaque two-component water and wind resistant film. The garment dyeing technique colors the film without affecting its transparency. Completely heat sealed seams.Detachable hooded lining in Poly Fur, a synthetic fur with external silver colored coating. Snap fastening on nylon tape.", + "code": "6315 491Y1" }, { "uri": "https://ltho.s3.amazonaws.com/bfd9defc-a1ef-4322-9e53-9505ec606ed9.png", + "width": "", + "height": "", "label": "RASO GOMMATO REVERSE COLOR PROCESS", - "code": "6215 42338", - "caption": "Jacket in Raso Gommato -rubberized satin- a mil. spec. cotton satin bonded with a polyurethane cover making the fabric wind and water resistant. In this version, the transparent cover is bonded to a previously piece dyed and printed the cotton satin. The finished garment undergoes an exclusive procedure named Reverse Color Process, a fading technique followed by an overdyeing process on the finished garment, owing to the piece unparalleled shaded print effects, resist print areas and residual color deposits, unique to each single item." + "caption": "Jacket in Raso Gommato -rubberized satin- a mil. spec. cotton satin bonded with a polyurethane cover making the fabric wind and water resistant. In this version, the transparent cover is bonded to a previously piece dyed and printed the cotton satin. The finished garment undergoes an exclusive procedure named Reverse Color Process, a fading technique followed by an overdyeing process on the finished garment, owing to the piece unparalleled shaded print effects, resist print areas and residual color deposits, unique to each single item.", + "code": "6215 42338" }, { - "uri": "https://ltho.s3.amazonaws.com/390b68f3-7f9a-41af-a09c-bd15ac7008a3.png", - "label": "POLYPROPYLENE TELA", - "code": "6315 40534", - "caption": "Down filled parka in polypropylene tela treated with an anti-drop agent. Polypropylene, a material with antibacterial properties, is the lightest man-made fibre. Even very bulky garments astonish for their specific lightness. The paste colored yarn is texturized to obtain a cotton looking opaque aspect. " + "uri": "https://ltho.s3.amazonaws.com/5883b275-a2eb-4a34-890f-69b30250a62b.png", + "width": "", + "height": "", + "label": "RASO HAND PAINTED TORTOISE SHELL", + "caption": "Trench coat in a satin-weave cotton fabric of military origin. The garment has been dyed and then faded in selected areas with a corrosive paste. The bleached parts have then been hand-painted with a tortoiseshell-inspired motif also appearing on the Stone Island badge on the left sleeve. This extraordinary manual process makes each piece unique and unrepeatable. Detachable hood in garment-dyed padded iridescent nylon. Detachable lining in GARMENT-DYED DOWN_26 GR X SQM_N, an ultra-light nylon weighing only 26 grams per square meter, filled with the finest down specially treated to bear the stress of the garment dyeing procedure. Garment-dyed with special dye recipes. It is secured to the outer garment by the iconic Stone Island fastening system.", + "code": "6115 70565" + }, + { + "uri": "https://ltho.s3.amazonaws.com/d51dce63-d467-45ea-88a6-5b077ffe3c3c.png", + "width": "", + "height": "", + "label": "REFLECTIVE KNIT WITH WINDSTOPPER® 3L", + "caption": "To celebrate the thirtieth anniversary of Stone Island, a yarn has been engineered that represents theheight of our tireless research. The President’S Knit 5715 has been created in Reflective yarn, madeup of micro plates coated with glass microspheres trapped inside a polyester mesh. The structure ofthe jumper has been made double, reflective on the outside and wool on the inside. The outer facehas then been printed in a darker shade using heat and pressure sublimation printing to amalgamatethe fibers, obtain an even surface and reduce the strong reflective appearance.The detachable padded and quilted lining has been created in a polyester jersey laminated with aWindstopper® membrane, which provides an unbeatable balance between protection and comfort.This piece features is our 30th anniversary special edition badge.", + "code": "5715 587Y5" }, { "uri": "https://ltho.s3.amazonaws.com/cc9f8c72-bbac-4d34-9762-4eae85374abf.png", + "width": "", + "height": "", "label": "HIDDEN REFLECTIVE", - "code": "6315 G0598", - "caption": "Vest in a reflective, water and wind resistant polyester fabric owing its features to a coating made of thousands of glass microspheres. An opaque black plating totally covers the refraction of the material which is unveiled when photographed in flash mode. The reflective features will be revealed through usage, with diverse effects and intensities from piece to piece, depending on its wearer usage. Stone Island logo on the back obtained through laser printing. Filled with the finest down. Sheepskin over collar. " + "caption": "Vest in a reflective, water and wind resistant polyester fabric owing its features to a coating made of thousands of glass microspheres. An opaque black plating totally covers the refraction of the material which is unveiled when photographed in flash mode. The reflective features will be revealed through usage, with diverse effects and intensities from piece to piece, depending on its wearer usage. Stone Island logo on the back obtained through laser printing. Filled with the finest down. Sheepskin over collar. ", + "code": "6315 G0598" }, { - "uri": "https://ltho.s3.amazonaws.com/512029b0-f4a3-469a-9d7d-1cd7fc15c1c8.png", - "label": "POLY COVER COMPOSITE + POLY FUR SILVER DETACHABLE LINING", - "code": "6315 491Y1", - "caption": "Hooded jacket in Poly Cover Composite, a matte, colorless and opaque two-component water and wind resistant film. The garment dyeing technique colors the film without affecting its transparency. Completely heat sealed seams.\r\nDetachable hooded lining in Poly Fur, a synthetic fur with external silver colored coating. Snap fastening on nylon tape." + "uri": "https://ltho.s3.amazonaws.com/2bafd7a2-fbbb-4904-8e64-ff394888fd24.png", + "width": "", + "height": "", + "label": "LIQUID REFLECTIVE", + "caption": "Fabric that is highly reflective owing to its coating made upof thousands of glass microspheres. Each finished garmentis hand sprayed individually and individually baked dry.The varying intensity of the reflective element and varyingintensity of color, the dribbling and speckled effect, areowing to the high level of craftsmanship involved in theprocess, making each garment unique and unrepeatable.Lining in quilted microfiber with polyester padding.Stone Island badge with white embroidery, reserved forgarments that are made using advanced research intofabrics or processes.", + "code": "5315 42944" + }, + { + "uri": "https://ltho.s3.amazonaws.com/390b68f3-7f9a-41af-a09c-bd15ac7008a3.png", + "width": "", + "height": "", + "label": "POLYPROPYLENE TELA", + "caption": "Down filled parka in polypropylene tela treated with an anti-drop agent. Polypropylene, a material with antibacterial properties, is the lightest man-made fibre. Even very bulky garments astonish for their specific lightness. The paste colored yarn is texturized to obtain a cotton looking opaque aspect. ", + "code": "6315 40534" + }, + { + "uri": "https://ltho.s3.amazonaws.com/a0714935-2800-425f-9b34-63fdc4a7fc78.png", + "width": "", + "height": "", + "label": "30/30 JACKET", + "caption": "The 30/30 jacket is a cross section of the state of the art of Stone Island. A testament to three decades of exploration and development, it has been designed to embody the spirit of Stone Island’s endless creativity. Linked by the signature looped rigging system, both the jacket shell and jacket liner are reversible. These can be worn, either together or alone, in a total of 10 different ways. The transformativeproperties of the fabrics mean that these 10 ways can each be worn in 3 different modes: Ice, Reflective,and Normal; resulting in a total of 30 different jacket states.This piece features is our 30th anniversary special edition badge.JACKET /SHELL _ RASO GOMMATO PRISMATIC COVER.Satin weave cotton of military origin bonded on the inside to a a shiny transparent fine-grained polyurethane film reflecting the light, magnifying the color effects and bestowing the surface with a three-dimensional and ‘liquid’ appearance.JACKET/ LINER_ THERMO REFLECTIVE / ENGINEERED WOOLThis material merges two of Stone Island’s most avant-garde research paths. It explores the interaction between light refraction and thermosensitivity technologies. The resins used to coat the nylon substrate host both the glass microspheres allowing fabric refraction and the micro-encapsulated pigments modifying the passage of light and thus enabling color changes in relation to temperature. The final effect is an organic and dynamic interaction of light and color. On the reverse side, an engineered wool face made with a double knit machine.", + "code": "5715 4TTY2" + }, + { + "uri": "https://ltho.s3.amazonaws.com/a25cc013-5c2c-4221-974a-987b8fd00ab4.png", + "width": "", + "height": "", + "label": "HAND PAINTED SHEEPSKIN", + "caption": "Sheepskin parka. The finished piece has been hand-sprayed on the outer face with a resin based product and then hand waxed to achieve a softer feel. Hood edged by fur trim. ", + "code": "6115 00379" + }, + { + "uri": "https://ltho.s3.amazonaws.com/fa5ed231-8b04-4ecc-b126-7a5543d5614a.png", + "width": "", + "height": "", + "label": "ICE JACKET THERMO-SENSITIVE FABRIC", + "caption": "Hooded jacket in thermo sensitive fabric. A water- and wind-resistant polyurethane film is embedded with micro-encapsulated pigments. The molecules of these pigments modify the path of light and change color according to the temperature. The garment is then padded with the finest down.Two chest patch pockets, with snap-flap fastening and second pocket with vertical zip fastening. Adjustable elastic at cuffs. Cotton terry lined hood. Hidden zip and button fastening.", + "code": "6115 43098" } ], - "__index": "4", + "__index": 4, "dateCreated": "Thu, 05 Nov 2015 01:48:39 GMT" }, { @@ -4721,6 +4787,1136 @@ ], "__index": 73, "dateCreated": "Thu, 12 Jul 2018 16:22:14 GMT" + }, + { + "id": "man-made-suede_video", + "date": "Wed, 17 Oct 2018 12:00:00 GMT", + "title": "MAN MADE SUEDE_Video", + "subtitle": "", + "body": "WATCH THE VIDEO", + "link": "https://youtu.be/ZZRTWjo008Q", + "store": "true", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/020cd180-d2dd-11e8-8a6b-3521187b68ec.jpg", + "width": "1000", + "height": "564", + "caption": "" + } + ], + "__index": 74, + "dateCreated": "Thu, 18 Oct 2018 13:59:48 GMT" + }, + { + "id": "man-made-suede", + "date": "Thu, 18 Oct 2018 12:00:00 GMT", + "title": "MAN MADE SUEDE", + "subtitle": "", + "body": "Stone Island succeeds, for the first time in history, in dignifying a coagulated material through garment dyeing.\r\nGarments are made through an elaborate industrial process applied to a non-woven, nylon microfiber and polyurethane resin and then coagulated.\r\nThe result is a substrate which is lightened, through washes, dissolving the polyethylene component. The material is then treated to achieve the final suede aspect.", + "link": "", + "store": "true", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/368c4d50-d2dd-11e8-8a6b-3521187b68ec.jpg", + "width": "580", + "height": "813", + "caption": "" + } + ], + "__index": 75, + "dateCreated": "Thu, 18 Oct 2018 13:59:51 GMT" + }, + { + "id": "stone-island-harris-tweed-with-polymorphic-ice-limited-edition", + "date": "Mon, 22 Oct 2018 12:00:00 GMT", + "title": "STONE ISLAND / HARRIS TWEED WITH POLYMORPHIC ICE LIMITED EDITION", + "subtitle": "", + "body": "Jacket made of two special and iconic materials deriving from the color experimentation at the base of Harris Tweed and Stone Island's DNA.\r\n\r\nHarris Tweed is the most iconic of all tweeds. From the collaboration with Stone Island is born the development of an exclusive tweed which consists of dyeing 8 different colors of wool, spun together into a single yarn and then woven into a twill base.\r\n\r\nThe detachable hood and pockets are in Polymorphic Ice, a new heat-sensitive coating on a cotton base
developed by Stone Island especially for this project with the goal to replicate the hypothetical colors of specifically spun and woven tweed.\r\n\r\nThe garment is focused on the concept of interchangeability: the outer shell comes with a zipper system that allows the chest pockets placed on the detachable liner to be worn also on the tweed outer shell.", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c4076780-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "552", + "height": "720", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c3e364c0-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "552", + "height": "720", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c3f51800-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "552", + "height": "720", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c4082ad0-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "552", + "height": "720", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c3af3560-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "552", + "height": "720", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c4d45470-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "509", + "height": "720", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c4ac3300-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "509", + "height": "720", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c4b69340-d5fa-11e8-8a6b-3521187b68ec.jpg", + "width": "509", + "height": "720", + "caption": "" + } + ], + "__index": 76, + "dateCreated": "Mon, 22 Oct 2018 13:05:50 GMT" + }, + { + "id": "lino-resinato-tc_-stone-island-app-preview", + "date": "Thu, 08 Nov 2018 12:00:00 GMT", + "title": "Lino Resinato-TC_ Stone Island App Preview", + "subtitle": "", + "body": "Garments made in Lino Resinato, a linen canvas soaked in a lightweight polyurethane resin, padded in down or quilted to an inner wadding substrate.\r\n\r\nGarment dyed with special dye recipes. The resin partially retains the color for a final chalky/pastel effect of the material.\r\n\r\nAVAILABLE ON STONE ISLAND APP FROM 11/8 TO 11/14 ", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/17113360-e367-11e8-8a6b-3521187b68ec.jpg", + "width": "767", + "height": "1000", + "caption": "" + } + ], + "__index": 78, + "dateCreated": "Thu, 08 Nov 2018 15:00:58 GMT" + }, + { + "id": "david-tc-br-with-primaloft-insulation-technology", + "date": "Thu, 15 Nov 2018 12:00:00 GMT", + "title": "DAVID-TC<br>WITH PRIMALOFT® INSULATION TECHNOLOGY", + "subtitle": "", + "body": "Hooded anorak and large pouch pocket padded with a PrimaLoft® layer, for an outstanding insulation capacity.\r\n\r\nBeginning with a star-shaped polyester / polyamide substrate, garments in David-TC are sewn and then simultaneously garment dyed and treated with an anti-drop agent. During the dye process, under pressure at 130°C, the fabric undergoes heat-induced compression achieving a truly unique tactile experience; both industrial and luxurious at once.\r\n\r\nAVAILABLE ON STONE ISLAND APP\r\nFROM 11/15 TO 11/21 ", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/5c72ffd0-e8e7-11e8-8a6b-3521187b68ec.jpg", + "width": "583", + "height": "827", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/5c553ea0-e8e7-11e8-8a6b-3521187b68ec.jpg", + "width": "519", + "height": "692", + "caption": "" + } + ], + "__index": 79, + "dateCreated": "Thu, 15 Nov 2018 15:01:44 GMT" + }, + { + "id": "spring-summer_-019-icon-imagery", + "date": "Tue, 11 Dec 2018 12:00:00 GMT", + "title": "SPRING SUMMER_'019 ICON IMAGERY", + "subtitle": "", + "body": "", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/21d13480-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/200dd9a0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/1deca750-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/1be42d20-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/1a56fd70-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/188375f0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/16cb8cc0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/14d3b460-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/131cdca0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/11759540-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/0fb324c0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/0e1b46b0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/0c99d6d0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/0b1d21e0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/08638020-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/0613c3c0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/03121c80-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/00c08b60-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/fe254710-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f9eec950-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f6c61210-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f4687300-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f258a5d0-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f028a670-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/edd71550-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/eb72e690-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/e527b9a0-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/dff96e60-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/ddefbbb0-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/daf73c30-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/d8ab0240-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/d684c6e0-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/d3793490-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/d044bd80-fe1e-11e8-8a6b-3521187b68ec.jpg", + "width": "400", + "height": "600", + "caption": "" + } + ], + "__index": 80, + "dateCreated": "Wed, 12 Dec 2018 15:04:37 GMT" + }, + { + "id": "spring-summer_-019", + "date": "Wed, 12 Dec 2018 12:00:00 GMT", + "title": "SPRING SUMMER_'019", + "subtitle": "", + "body": "The Stone Island Spring Summer '019 collection repeats and evolves the concept of INDUSTRIAL STRENGTH: mixed textures and fabrics as well as essential lines derived from workwear archetypes reflect the functionality of the garments. The color palette is a mix of sophisticated deep colors and bright accents with a touch of fluo orange: brick, lemon, stucco, sage green, lavender and periwinkle.\r\n\r\nSPRING SUMMER COLLECTION PREVIEW ON STONE ISLAND APP FROM 12/12 TO 12/18", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/4cd4b5d0-fe1f-11e8-8a6b-3521187b68ec.jpg", + "width": "613", + "height": "800", + "caption": "" + } + ], + "__index": 81, + "dateCreated": "Wed, 12 Dec 2018 15:05:06 GMT" + }, + { + "id": "7015-stone-island-spring-summer_-019-collection-video", + "date": "Thu, 10 Jan 2019 12:00:00 GMT", + "title": "7015 STONE ISLAND SPRING SUMMER_'019 COLLECTION VIDEO", + "subtitle": "", + "body": "WATCH THE VIDEO", + "link": "https://www.youtube.com/watch?v=YL3HoZxboHc&t=20s", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/ac299b00-14fd-11e9-8a6b-3521187b68ec.jpg", + "width": "1600", + "height": "900", + "caption": "" + } + ], + "__index": 82, + "dateCreated": "Thu, 10 Jan 2019 17:32:33 GMT" + }, + { + "id": "ss_-019-ribbed-b-color-knitwear_stone-island-app-preview", + "date": "Thu, 17 Jan 2019 12:00:00 GMT", + "title": "SS_'019 Ribbed b-color Knitwear_Stone Island App Preview", + "subtitle": "", + "body": "Ribbed knits in two-tone cotton and mixed stitches that create depth and mélange effects.\r\nSingle color insert on the arm, with Stone Island Compass logo embroidery.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP
FROM 1/17 TO 1/23", + "link": "", + "store": "true", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/17262e90-1a68-11e9-8a6b-3521187b68ec.jpg", + "width": "374", + "height": "528", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/1719f990-1a68-11e9-8a6b-3521187b68ec.jpg", + "width": "374", + "height": "528", + "caption": "" + } + ], + "__index": 83, + "dateCreated": "Thu, 17 Jan 2019 14:58:31 GMT" + }, + { + "id": "garment-dyed-quilted-micro-yarn_stone-island-app-preview", + "date": "Tue, 29 Jan 2019 12:00:00 GMT", + "title": "Garment Dyed Quilted Micro Yarn_Stone Island App Preview", + "subtitle": "", + "body": "Outerwear pieces, quilted to a wadding substrate, in a 10 deniers calendered fabric made by nylon microfilaments with a ripstop construction, treated with an invisible finishing. Garment dyed with special color recipes with the addition of an anti-drop finish.\r\n\r\nThe set is completed by a cape with a large Stone Island Compass embroidery on the back.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP
FROM 1/29 TO 2/4", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/de2a04e0-23d6-11e9-8a6b-3521187b68ec.jpg", + "width": "559", + "height": "729", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/de5867e0-23d6-11e9-8a6b-3521187b68ec.jpg", + "width": "745", + "height": "994", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/de542220-23d6-11e9-8a6b-3521187b68ec.jpg", + "width": "745", + "height": "994", + "caption": "" + } + ], + "__index": 84, + "dateCreated": "Tue, 29 Jan 2019 15:03:15 GMT" + }, + { + "id": "stone-island-porter-co-lab_app-preview", + "date": "Thu, 14 Feb 2019 12:00:00 GMT", + "title": "Stone Island / Porter® co-lab_App Preview", + "subtitle": "", + "body": "Bumbag, backpack and duffle bag in Man Made Suede, a non-woven fabric, developed by Stone Island, made with nylon microfibers and polyurethane resins engineered through a complex industrial process, impregnated with resins and coagulated. The material is then treated to achieve the final suede aspect.\r\n\r\nThree models made in Japan by Porter®, dyed by Stone Island in Italy with the specific textile dyeing and ennobling technology recently engineered.\r\n\r\nLaser print of the Stone Island Compass logo, made on the finished product.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP FROM\r\n02/14 TO 02/20", + "link": "", + "store": "true", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/5ea132c0-306a-11e9-8a6b-3521187b68ec.jpg", + "width": "580", + "height": "813", + "caption": "Stone Island backpack in blue." + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/5ea06f70-306a-11e9-8a6b-3521187b68ec.jpg", + "width": "580", + "height": "813", + "caption": "Bum bag in brown red colorway." + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/5e9db050-306a-11e9-8a6b-3521187b68ec.jpg", + "width": "580", + "height": "813", + "caption": "Stone Island duffel bag in green." + } + ], + "__index": 85, + "dateCreated": "Thu, 14 Feb 2019 15:08:32 GMT" + }, + { + "id": "shoulder-patch-fleece_stone-island-app-preview", + "date": "Thu, 21 Feb 2019 12:00:00 GMT", + "title": "Shoulder Patch Fleece_Stone Island App Preview", + "subtitle": "", + "body": "Cotton fleece with seasonal details. Over stitched fabric covered with patches applied on shoulders, elbows and above the wrists. Garment dyed.\r\n\r\nAVAILABLE ON STONE ISLAND APP
FROM 2/21 TO 2/27", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/0df2aa50-35e9-11e9-8a6b-3521187b68ec.jpg", + "width": "559", + "height": "729", + "caption": "" + } + ], + "__index": 86, + "dateCreated": "Thu, 21 Feb 2019 14:58:31 GMT" + }, + { + "id": "stone-island-ss_-019-david-fluo_app-preview", + "date": "Thu, 21 Mar 2019 12:00:00 GMT", + "title": "Stone Island SS_'019 David Fluo_App Preview", + "subtitle": "", + "body": "Fluo orange, among seasonal colors, gets different shades and intensity according to materials and treatments.\r\n\r\n44548_DAVID FLUO\r\n
AVAILABLE ON THE STONE ISLAND APP\r\nFROM 3/21 TO 3/27", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/7f12ea40-4be9-11e9-8a6b-3521187b68ec.jpg", + "width": "580", + "height": "813", + "caption": "" + } + ], + "__index": 87, + "dateCreated": "Thu, 21 Mar 2019 14:57:41 GMT" + }, + { + "id": "lino-resinato-tc_stone-island-app-preview", + "date": "Tue, 02 Apr 2019 12:00:00 GMT", + "title": "Lino Resinato-TC_Stone Island App Preview", + "subtitle": "", + "body": "Outerwear pieces in Lino Resinato, a linen canvas soaked in a lightweight polyurethane resin.\r\n\r\nGarment dyed with special dye recipes, with the addition of an anti-drop agent. The resin partially retains the color for a final chalky/pastel effect of the material.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP UNTIL 4/8", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/42fddf10-551c-11e9-8a6b-3521187b68ec.jpg", + "width": "559", + "height": "729", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/43029a00-551c-11e9-8a6b-3521187b68ec.jpg", + "width": "559", + "height": "729", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/42f70140-551c-11e9-8a6b-3521187b68ec.jpg", + "width": "559", + "height": "729", + "caption": "" + } + ], + "__index": 88, + "dateCreated": "Tue, 02 Apr 2019 14:03:51 GMT" + }, + { + "id": "canvas-placcato_stone-island-app-preview", + "date": "Tue, 16 Apr 2019 12:00:00 GMT", + "title": "Canvas Placcato_Stone Island App Preview", + "subtitle": "", + "body": "Outerwear pieces, shirts, pants and accessories made in cotton canvas impregnated with special pigmented resins. Thanks to the finished garment over dye procedure the outer face takes on a chalky/mélange appearance, while the interior and textile parts are fully colored by the dye recipe.\r\nMalfilé cotton fleece wear feature Tela Placcata appliqués.\r\nThe concept is also developed with polos and T-shirts made in jersey cotton, Bermuda shorts in Nylon Metal, plated all over in two different color intensities with placed prints.\r\n\r\n24436_JERSEY PLACCATO\r\n63665_FELPA PLACCATA\r\n
AVAILABLE ON THE STONE ISLAND APP UNTIL 4/22", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/7e1b7690-6050-11e9-8a6b-3521187b68ec.jpg", + "width": "580", + "height": "813", + "caption": "" + } + ], + "__index": 89, + "dateCreated": "Tue, 16 Apr 2019 14:04:20 GMT" + }, + { + "id": "stone-island-marina_app-preview", + "date": "Tue, 23 Apr 2019 12:00:00 GMT", + "title": "Stone Island Marina_App Preview", + "subtitle": "", + "body": "For SS_'019 Stone Island presents garments with a mix of archive-inspired striped sections and full prints.\r\n\r\nT-shirts and fleeces with a vertical or horizontal striped print are characterized by a red Stone Island star embroidered on the chest.\r\n\r\nAn additional element is given by a print of the Stone Island Marina wording on the back.\r\n\r\n644X6_STONE ISLAND MARINA\r\n661X5_STONE ISLAND MARINA\r\n\r\nAVAILABLE ON THE STONE ISLAND APP UNTIL 4/29", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/fcfa5290-65cf-11e9-8a6b-3521187b68ec.jpg", + "width": "519", + "height": "692", + "caption": "" + } + ], + "__index": 90, + "dateCreated": "Tue, 23 Apr 2019 13:59:21 GMT" + }, + { + "id": "stone-island-marina_app-preview-video", + "date": "Tue, 23 Apr 2019 12:00:00 GMT", + "title": "Stone Island Marina_App Preview Video", + "subtitle": "", + "body": "", + "link": "https://www.youtube.com/watch?v=13y1dB1bnGY", + "store": "true", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/b20c8a40-65d0-11e9-8a6b-3521187b68ec.png", + "width": "1280", + "height": "631", + "caption": "" + } + ], + "__index": 91, + "dateCreated": "Tue, 23 Apr 2019 14:04:34 GMT" + }, + { + "id": "reflective-sweatshirt_stone-island-app-preview", + "date": "Tue, 30 Apr 2019 12:00:00 GMT", + "title": "Reflective Sweatshirt_Stone Island App Preview", + "subtitle": "", + "body": "Sweatshirts in stretch nylon jersey with a highly reflective coating made with thousands of glass microspheres in a resin bath.\r\nThe finished garments are dyed with special recipes that color the fabric parts while respecting the reflective surface.\r\n\r\n61854_REFLECTIVE SWEATSHIRT\r\nAVAILABLE ON THE STONE ISLAND APP UNTIL 5/6", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/8cff0630-6b50-11e9-8a6b-3521187b68ec.jpg", + "width": "580", + "height": "813", + "caption": "" + } + ], + "__index": 92, + "dateCreated": "Tue, 30 Apr 2019 14:02:23 GMT" + }, + { + "id": "stone-island_placcato_video", + "date": "Thu, 16 May 2019 12:00:00 GMT", + "title": "STONE ISLAND_PLACCATO_VIDEO", + "subtitle": "", + "body": "", + "link": "https://www.youtube.com/watch?v=4Y0rBl1eF8I", + "store": "false", + "__index": 93, + "dateCreated": "Thu, 16 May 2019 14:40:03 GMT", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9a43bf80-77e8-11e9-b872-1770116f47a5.png", + "width": "1374", + "height": "722", + "caption": "" + } + ] + }, + { + "id": "prototype-research_series-04_video", + "date": "Mon, 20 May 2019 12:00:00 GMT", + "title": "Prototype Research_Series 04_Video", + "subtitle": "", + "body": "", + "link": "https://youtu.be/j1fRdoyRWlc", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/135ef470-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "1267", + "height": "714", + "caption": "" + } + ], + "__index": 94, + "dateCreated": "Mon, 20 May 2019 13:00:32 GMT" + }, + { + "id": "prototype-research_series-04-manual-flocking-on-nylon-metal-grid-ovd-limited-edition-numbered-01-to-100", + "date": "Mon, 20 May 2019 12:00:00 GMT", + "title": "PROTOTYPE RESEARCH_SERIES 04 MANUAL FLOCKING ON NYLON METAL GRID-OVD LIMITED EDITION - NUMBERED 01 TO 100", + "subtitle": "", + "body": "The Prototype Research Series are native limited editions. They feature garments in fabrics and/or treatments born from research and experimentation processes that have not yet been industrialized.\r\n\r\nSERIES 04_MANUAL FLOCKING ON NYLON METAL GRID-OVD is a fishtail parka in Nylon Metal, the iconic iridescent STONE ISLAND fabric. The finished garment undergoes a cutting-edge artisanal flocking procedure, executed by highly specialized personnel: the garment is sprayed with a water-based adhesive and then exposed to the cotton flock. The creation of an electromagnetic field straightens the fibrils, which are attracted by the garment thanks to the uniqueness of this innovative technique. The flocked garment then undergoes an elaborate double dyeing procedure providing highly contrasting colors between the nylon and the cotton flock. The two processes create an unrepeatable effect, different and unique on each garment. The flock will wear off naturally with use, especially on rubbing spots. The addition of a special agent to the dyeing recipe makes the garment anti-drop.\r\n\r\nExclusively available online:\r\n\r\n- stoneisland.com\r\n- stoneisland.co.uk, for the United Kingdom\r\n- Stone Island App, for United States and Canada", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9bbd3bb0-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "580", + "height": "813", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9b050f40-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "580", + "height": "813", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9b3b1360-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "580", + "height": "813", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9b30da30-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "580", + "height": "813", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9afad610-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "580", + "height": "813", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9b4302a0-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "580", + "height": "813", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/9b998710-7aff-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "580", + "height": "813", + "caption": "" + } + ], + "__index": 95, + "dateCreated": "Mon, 20 May 2019 13:03:35 GMT" + }, + { + "id": "fall-winter_-019-020-preview", + "date": "Thu, 06 Jun 2019 12:00:00 GMT", + "title": "FALL WINTER_'019 '020 PREVIEW", + "subtitle": "", + "body": "The Fall Winter '019 '020 Stone Island collection features new expressions of luxury, finding functional areas in common for protection and comfort requirements.\r\n\r\nA sporty and sophisticated aesthetic that adds outer layers to protect the fabric inside with enveloping, warm and comfortable materials.\r\n\r\nThe colors are luxurious and sophisticated: dark and deep tones blend with the light colors of the earth and lively pop touches.\r\n\r\n117WN_ON THE STONE ISLAND APP UNTIL 6/12", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f36d9b50-8862-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "519", + "height": "692", + "caption": "" + } + ], + "__index": 96, + "dateCreated": "Thu, 06 Jun 2019 14:00:14 GMT" + }, + { + "id": "stone-island-fw_-019-020_icon-imagery", + "date": "Tue, 11 Jun 2019 12:00:00 GMT", + "title": "Stone Island FW_'019 '020_Icon Imagery", + "subtitle": "", + "body": "", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/84ee0150-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "559", + "height": "729", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/8504bda0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/85abac00-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/8588e1c0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/855b1b00-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/85301360-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/86ac7a30-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/85fbc7d0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/86114ba0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/49ee8cf0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/497d0670-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/49a43d80-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/4a6a4ca0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/4a8093c0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/4ac6c480-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/4a38b550-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/389aab00-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/382776d0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/38ed10c0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/3883c7a0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/3866a2b0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/38d67b80-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/29bcd220-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/295a18b0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/29a72740-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/297c6dc0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "519", + "height": "692", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/29409d40-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/18d03d80-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/19f81bb0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/19e2bef0-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/1a0d0340-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/19cd6230-8c55-11e9-975b-a5b6c8dd2ad8.jpg", + "width": "776", + "height": "1012", + "caption": "" + } + ], + "__index": 97, + "dateCreated": "Tue, 11 Jun 2019 14:31:51 GMT" + }, + { + "id": "7115-stone-island-fall-winter_-019-020-collection-video", + "date": "Tue, 25 Jun 2019 12:00:00 GMT", + "title": "7115 STONE ISLAND FALL WINTER_'019 '020 COLLECTION VIDEO", + "subtitle": "", + "body": "", + "link": "https://youtu.be/Y-KEYz_CFjI", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f80b66c0-9752-11e9-975b-a5b6c8dd2ad8.png", + "width": "1000", + "height": "563", + "caption": "" + } + ], + "__index": 98, + "dateCreated": "Tue, 25 Jun 2019 14:10:54 GMT" + }, + { + "id": "hand-sprayed-treatment", + "date": "Tue, 14 Jan 2020 12:00:00 GMT", + "title": "HAND-SPRAYED TREATMENT", + "subtitle": "", + "body": "Crewneck knits in thinly ribbed cotton nylon, hand-sprayed with a color solution on the outer side of the finished piece. Seamless construction, ribbed cuffs and bottom band.", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/c4364490-36db-11ea-b603-3b0ffcb8ea11.jpg", + "width": "640", + "height": "840", + "caption": "Male model wearing dark colored pants and peach crewneck sweater with the Stone Island badge on the left arm." + } + ], + "__index": 99, + "dateCreated": "Tue, 14 Jan 2020 15:01:51 GMT" + }, + { + "id": "cotton-cordura-", + "date": "Thu, 20 Feb 2020 12:00:00 GMT", + "title": "COTTON / CORDURA®", + "subtitle": "", + "body": "Outerwear pieces made of a resistant cotton reps blended with ultra-twisted Cordura® yarns, lending extra strength and tenacity to the fabric. Garment dyed.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP
UNTIL 2/26", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/f1ec7480-5400-11ea-b603-3b0ffcb8ea11.jpg", + "width": "559", + "height": "729", + "caption": "Model wearing a bright blue jacket with stand collar, four flap pockets on the front with black buttons, Stone Island badge in the center of the chest" + } + ], + "__index": 100, + "dateCreated": "Thu, 20 Feb 2020 16:49:30 GMT" + }, + { + "id": "s-i-pa-pl-seersucker-tc-stone-island-app-preview", + "date": "Fri, 20 Mar 2020 12:00:00 GMT", + "title": "S.I. PA/PL SEERSUCKER-TC Stone Island App Preview", + "subtitle": "", + "body": "Pieces in PA/PL Seersucker-TC with nylon mesh lining: the seersucker weave of the nylon polyester fabric is obtained thanks to STONE ISLAND’s expertise in textile construction, aimed at emphasizing the final result of the garment dyeing processes.\r\nThe glossy nylon warp is woven with nylon yarns, as well glossy and black polyester yarns. During the garment dyeing phase, the different reactions of nylon and polyester create the distinctive wavy look of seersucker woven fabrics.\r\n\r\nS.I. PA/PL SEERSUCKER-TC
G0229_VEST\r\n32029_PANTS
DUST GREY COLORWAY AVAILABLE ON THE STONE ISLAND APP
UNTIL 3/23
", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/6f190240-6abb-11ea-b603-3b0ffcb8ea11.jpg", + "width": "642", + "height": "838", + "caption": "Model wearing black pants, a black shirt and a gray V neck vest with two patch pockets and two side pockets." + } + ], + "__index": 101, + "dateCreated": "Fri, 20 Mar 2020 15:02:37 GMT" + }, + { + "id": "fleck-treatment-fleecewear_stone-island-app-preview", + "date": "Tue, 12 May 2020 12:00:00 GMT", + "title": "Fleck Treatment Fleecewear_Stone Island App Preview", + "subtitle": "", + "body": "Garment dyed sweatshirt and pants with double recipe and the addition of the ‘FLECK’ effect, an exclusive sprayed resin technique creating a flecked surface appearance.\r\nDetail with Stone Island mirror embroidery and Nylon Metal inlays.\r\n\r\nAVAILABLE ON STONE ISLAND APP UNTIL 5/18", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/d17f9120-9459-11ea-a0eb-d316a823bd3a.jpg", + "width": "640", + "height": "840", + "caption": "Model wearing light blue sweatpants with lettering on the left thigh and matching sweatshirt with hoodie, dropped shoulders and lettering across the chest." + } + ], + "__index": 102, + "dateCreated": "Tue, 12 May 2020 14:06:52 GMT" + }, + { + "id": "swimwear-in-nylon-metal-with-fleck-treatment_stone-island-app-preview", + "date": "Tue, 26 May 2020 12:00:00 GMT", + "title": "Swimwear in Nylon Metal with Fleck Treatment_Stone Island App Preview", + "subtitle": "", + "body": "Swim trunks in Nylon Metal,one of the most versatile fabrics born of STONE ISLAND textile research.\r\nGarment dyed with a double recipe and the addition of the ‘FLECK’ effect, an exclusive sprayed resin technique creating a flecked surface appearance.\r\n\r\nDetail on legs with mirrored Stone Island lettering embroidery.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP\r\nUNTIL 6/1", + "link": "", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/20e5de30-9f5a-11ea-a0eb-d316a823bd3a.jpg", + "width": "660", + "height": "840", + "caption": "Lower body shot of model wearing olive green flecked swim trunks with elasticated waistband, slanting hand pockets and lettering embroidery on the legs." + } + ], + "__index": 103, + "dateCreated": "Tue, 26 May 2020 14:06:47 GMT" + }, + { + "id": "bags-in-compacted-nylon-garment-dyed-with-dust-color-finish-bags_stone-island-app-preview", + "date": "Tue, 09 Jun 2020 12:00:00 GMT", + "title": "Bags in Compacted Nylon Garment Dyed With Dust Color Finish Bags_Stone Island App Preview", + "subtitle": "", + "body": "Duffle bags, backpacks, tote bags and laptop cases in compacted nylon with DUST COLOR treatment, a process providing a pigment patina on the surface, for a three-dimensional effect that is unique and unrepeatable.\r\n\r\nStone Island compass logo details.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP\r\nUNTIL 6/15", + "link": "", + "store": "true", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/913b8630-aa59-11ea-a0eb-d316a823bd3a.jpg", + "width": "640", + "height": "840", + "caption": "" + } + ], + "__index": 104, + "dateCreated": "Tue, 09 Jun 2020 14:18:38 GMT" + }, + { + "id": "7315-stone-island-aw-020-021_-collection-video", + "date": "Mon, 20 Jul 2020 12:00:00 GMT", + "title": "7315 Stone Island AW '020'021_ Collection Video", + "subtitle": "", + "body": "WATCH THE VIDEO", + "link": "https://www.youtube.com/watch?v=FpNNusezh7A", + "store": "false", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/0911dee0-ca97-11ea-92aa-1fa3632a88e2.jpg", + "width": "1600", + "height": "900", + "caption": "" + } + ], + "__index": 105, + "dateCreated": "Mon, 20 Jul 2020 14:41:18 GMT" + }, + { + "id": "stone-island-porter-co-lab_app-preview-2", + "date": "Tue, 28 Jul 2020 12:00:00 GMT", + "title": "Stone Island / Porter® co-lab_App Preview", + "subtitle": "", + "body": "The collaboration between Stone Island and Porter® continues.\r\nA pouch bag, backpack and tote bag made in Reflective Weave Ripstop-TC, a twisted cotton nylon ripstop, woven with a thin highly reflective tape, obtained through a resin bath that incorporates thousands of glass microspheres.\r\nDyed with specific recipes coloring the textile parts of the garment while respecting the reflecting surface.\r\n\r\nPatch of the Stone Island Compass logo and Porter patch logo applied on all three models.\r\n\r\nAVAILABLE ON THE STONE ISLAND APP\r\nUNTIL 8/3", + "link": "", + "store": "true", + "image": [ + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/49c884a0-d0d9-11ea-92aa-1fa3632a88e2.jpg", + "width": "642", + "height": "838", + "caption": "First image" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/49a80450-d0d9-11ea-92aa-1fa3632a88e2.jpg", + "width": "642", + "height": "838", + "caption": "Second image" + }, + { + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/49cb43c0-d0d9-11ea-92aa-1fa3632a88e2.jpg", + "width": "642", + "height": "838", + "caption": "Third image" + } + ], + "__index": 106, + "dateCreated": "Tue, 28 Jul 2020 14:03:00 GMT" } ], "page": [ @@ -4747,7 +5943,7 @@ "width": "", "height": "" }, - "body": "Privacy Policy<br>\r\nWelcome to our website stoneisland.com (the Website).<br>\r\nYour privacy and the security of your personal data are very important to us, which is why we collect and process your personal data with the utmost care and take appropriate steps to keep it safe.<br>\r\nBelow you will find the key information on the processing of your personal data in relation to your use of stoneisland.com and the services offered. For detailed information on how we manage your personal data, please read our Privacy Policy.<br>\r\nPlease also read the stoneisland.com 'Cookie Policy', 'General Terms and Conditions of Use' and the 'Terms and Conditions of Registration of My Account', which contain detailed information about the terms and conditions of our services. Some services may be subject to specific legal requirements, in which case we will provide you with all the relevant information from time to time.<br>\r\n<b>Who is the Data Controller?</b><br>\r\n<b>The Data Controller</b><br>\r\nUpon consulting this website, and throughout the user's use of the services offered by the integrated Online Store, data related to identified or identifiable persons may be collected and processed. The data controllers are:<br>\r\n- SPORTSWEAR COMPANY S.p.A., with registered office at Bologna Galleria Cavour 4, 40124, and operational headquarters in Ravarino (MO), Via Confine n. 2161; <br>\r\nand<br>\r\n- YOOX NET-A-PORTER GROUP S.p.A., with registered office at via Morimondo, 17 – Milano 20143, Italy (\"YOOX NET-A-PORTER GROUP\")<br>\r\nin the persons of their pro tempore legal representatives.<br>\r\nIn particular, SPORTSWEAR COMPANY S.p.A. is the owner of stoneisland.com and of the 'Stone Island' trademark, and is the independent controller of the data processed for corporate purposes (i.e. for example but not limited to CRM, marketing activities, customer profiling, market analysis, management and strategic evaluations) that directly refers to the brand or to the company.<br>\r\nSPORTSWEAR COMPANY S.p.A. has appointed YOOX NET-A-PORTER GROUP S.p.A. as the Data Processor for the area of its responsibility and for the purposes related to the provision of the service on stoneisland.com. YOOX NET-A-PORTER GROUP S.p.A. was appointed based on its experience, competence and trustworthiness, as well as the ability of YOOX NET-A-PORTER GROUP S.p.A. to guarantee the implementation of adequate technical and organizational measures to comply with the requirements of data protection regulations and to guarantee the protection of Data Subjects' rights.<br>\r\nSPORTSWEAR COMPANY S.p.A. will ensure that the Data Processor has carried out the tasks assigned to it and that it continues to provide adequate guarantees of full compliance with the provisions on the protection of personal data.<br>\r\nYOOX NET-A-PORTER GROUP manages the website and is the independent controller of the processing connected to the e-commerce services offered through this website's Online Store.<br>\r\nAny privacy issue related to processing by SPORTSWEAR COMPANY S.p.A. may be sent to the following e-mail address: spwprivacy@spwco.it or by fax to +39 059 810337. Requests which instead refer to processing connected to the Online Store must be sent to YOOX NET-A-PORTER GROUP by contacting Customer Care and selecting “Privacy” as the topic.<br>\r\n<b>What data do we process and why?</b>\r\nThe personal data that we process is the information you provide us with when you place an order and purchase goods, and the information we collect while you browse or use the services offered on stoneisland.com. We may therefore collect data relating to you such as personal details like your first and last name, shipping address and billing address, browsing information and your buying habits.<br>\r\nYour personal data is processed for the following purposes:<br>\r\n- enter into and fulfill a contract for the purchase of goods available on stoneisland.com;<br>\r\n- provide you with stoneisland.com services such as subscription to the newsletter;<br>\r\n- allow you to register on the Website and use the services reserved for registered users;<br>\r\n- manage your requests to our Customer Care Department.<br>\r\nIn the cases referred to above, the processing of your personal data is legitimate to the extent necessary to fulfill a contract entered into with you or to provide you with the service you have specifically requested from us. We also perform statistical research and analysis using aggregate data to understand how users interact with and use the Website, and to improve our product range and services.<br>\r\nOnly if you have given us your express consent will we process your personal data to:<br>\r\n- carry out marketing communications activities;<br>\r\n- personalize the Website according to your interests.<br>\r\n<b>Who will process your data?</b><br>\r\nYour personal data will be processed by appropriately trained employees of stoneisland.com and of other companies in the Data Controllers Group and, for organizational and functional purposes related to the provision of services on stoneisland.com, by our suppliers. These suppliers have been assessed and chosen by the Controllers based on their proven trustworthiness and competence. Some of these parties may also be based in non-EU countries and, in these cases, the transfer of your personal data to these countries is carried out in compliance with the safeguards provided for in law.<br>\r\n<b>How long do we keep your data?</b><br>\r\nWe store your personal data for a limited period of time determined by the purpose for which it was collected, at the end of such period your personal data will be erased or otherwise made irreversibly anonymous. The storage period is different depending on the purpose of the processing: for example, data collected during the purchase of goods on stoneisland.com is processed until the completion of all administrative and accounting formalities, therefore it is stored in accordance with local tax laws (ten years), while the data used to send you our newsletters is stored until you ask us to stop sending them.<br>\r\nFor further information please see our Privacy Policy.<br>\r\n<b>What are your rights?<br></b>\r\nDepending on the type of processing, you may at any time: revoke your consent to the processing, be notified of what personal data we hold about you, its origin and how it is used, request that it be updated, corrected or supplemented and, in the cases provided for under current legislation, erase or restrict the processing of your personal data or object to its processing. If you wish, you can request to receive the personal data in the Controller's possession in a format readable by electronic devices and, where technically possible, we can transfer your data directly to a third party indicated by you.<br>\r\nIf you believe that your personal data has been processed unlawfully, you may file a complaint with one of the supervisory authorities responsible for ensuring compliance with data protection regulations. In Italy, complaints can be submitted to the Italian Data Protection Authority (http://www.garanteprivacy.it/).<br>\r\nThis statement may be subject to changes and additions over time, so please review its content periodically. Where possible, we will try to inform you in a timely manner of any amendments made.<br>\r\n<b>Privacy Policy<br>\r\n1. General information<br>\r\nWho is the Data Controller?</b><br>\r\nUpon consulting this website, and throughout the user's use of the services offered by the integrated Online Store, data related to identified or identifiable persons may be collected and processed. The data controllers are:<br>\r\n- SPORTSWEAR COMPANY S.p.A., with registered office at Bologna Galleria Cavour 4, 40124, and operational headquarters in Ravarino (MO), Via Confine n. 2161;<br>\r\nand\r\n- YOOX NET-A-PORTER GROUP S.p.A., with registered office at via Morimondo, 17 – Milano 20143, Italy (\"YOOX NET-A-PORTER GROUP”) <br>\r\nin the persons of their pro tempore legal representatives.<br>\r\nIn particular, SPORTSWEAR COMPANY S.p.A. is the owner of stoneisland.com and of the 'Stone Island' trademark, and is the independent controller of the data processed for corporate purposes (i.e. for example but not limited to CRM, marketing activities, customer profiling, market analysis, management and strategic evaluations) that directly refers to the brand or to the company.<br>\r\nSPORTSWEAR COMPANY S.p.A. has appointed YOOX NET-A-PORTER GROUP S.p.A. as the Data Processor for the area of its responsibility and for the purposes related to the provision of the service on stoneisland.com. YOOX NET-A-PORTER GROUP S.p.A. was appointed based on its experience, competence and trustworthiness, as well as the ability of YOOX NET-A-PORTER GROUP S.p.A. to guarantee the implementation of adequate technical and organizational measures to comply with the requirements of data protection regulations and to guarantee the protection of Data Subjects' rights.<br>\r\nSPORTSWEAR COMPANY S.p.A. will ensure that the Data Processor has carried out the tasks assigned to it and that it continues to provide adequate guarantees of full compliance with the provisions on the protection of personal data.<br>\r\nYOOX NET-A-PORTER GROUP manages the website and is the independent controller of the processing connected to the e-commerce services offered through this website's Online Store.<br>\r\nAny privacy issue related to processing by SPORTSWEAR COMPANY S.p.A. may be sent to the following e-mail address: spwprivacy@spwco.it or by fax to +39 059 810337. Requests which instead refer to processing connected to the Online Store must be sent to YOOX NET-A-PORTER GROUP by contacting Customer Care and selecting “Privacy” as the topic.<br>\r\n<b>Who is the Data Protection Officer?</b><br>\r\nYNAP has appointed a Data Protection Officer. Should you so wish, for any request regarding the protection of your personal data and the exercise of your rights, you may contact the YNAP Personal Data Protection Officer (DPO) at the address of the Data Controller indicated above or by writing to our Customer Care Department.<br>\r\n<b>2. What personal data do we collect?</b><br>\r\nThe categories of personal data that the Data Controllers collect and process when you browse or shop on stoneisland.com are:<br>\r\na. we collect the personal information necessary to complete and fulfill your purchase on stoneisland.com such as your first and last name, email address, shipping address, billing address, telephone number and payment information;<br>\r\nb. we collect your email address when you subscribe to our newsletter service;<br>\r\nc. we process the personal data you provide us with when you contact our Customer Care department in order to provide you with the assistance you require;<br>\r\nd. subject to your consent, we collect and use your personal data for marketing communications;<br>\r\ne. to register your My Account, we collect your first and last name, your email address, your password and your date of birth. If you are a registered user, we collect information about your access to the restricted area of the Website. Subject to your express consent, by analyzing your personal data, we may draw up information regarding your interests and preferences with respect to our products and services, in order to provide you with suggestions and offers in line with your tastes.<br>\r\nf. we collect information about your browsing of stoneisland.com, such as the pages you visit and how you interact with the individual page and we store this information on our servers.<br>\r\nWe want to assure you that the Data Controller does not process any personal data relating to minors. If you access stoneisland.com and use the services offered by the Controllers you agree that you are over the age of majority.<br>\r\n<b>3. How do we use the personal data we collect?</b><br>\r\nTo the extent of their respective responsibilities, the Data Controllers collect and process your personal data for the following purposes:<br>\r\na. entering into and fulfillment of the contract for the purchase of the products available on stoneisland.com. When you make your purchase we ask you for the personal data necessary to fulfill the contract, such as payment, anti-fraud checks if you choose to pay by credit or debit card, billing, shipping of the product and any return management.<br>\r\nb. registration on the Website and use of the services offered to registered users. Registration on the Website is only possible by entering certain personal information, which is necessary to carry out the services offered to registered users.<br>\r\nc. provision of the services offered on stoneisland.com. For such purposes and in relation to each service and its characteristics, the Data Controllers need to collect the personal data necessary to carry out the specific service requested by you.<br>\r\nd. management of requests to our Customer Care department, which uses the personal data you provide to deal with your requests for information and assistance.<br>\r\ne. CV submission. If you send us your CV to apply for an open position, SPORTSWEAR COMPANY S.p.A. will use the information contained in your CV solely for this purpose. The data relating to your application may be transferred to third party suppliers of candidate application management. Your CV will be retained for a maximum of six months, after which it will be erased: if you wish, you can of course send us a new updated version.<br>\r\nf. statistical analysis and research. We use some information about your use of the Website, how you browse the Website and how you use its services, to carry out statistical analysis and research in order to improve our range of products and services.<br>\r\ng. sending marketing correspondence following the purchase of one of our products, so-called soft spam. Following the purchase of one of our products on the Website, we will send you communications containing our marketing offers for similar products and services to the e-mail address you provided when you placed your order.
subject to your express consent, we may use the contact details you have provided to us for marketing communications relating to our products and services, in order to keep you updated on news, new arrivals, exclusive products, offers and promotions. In addition to this, we may with your consent use your contact information for market research purposes and customer satisfaction surveys to improve our services and our relationship with our customers.<br>\r\nh. only with your consent, SPORTSWEAR COMPANY S.p.A. will be able to personalize your experience as a registered user on stoneisland.com, offering you previews and offers in line with your tastes and sending you personalized marketing communications tailored to your interests. This personalization will be achieved by analyzing your previous purchases and the other information described in the previous section 'What personal data do we collect?’. For further information on this data and the activity that allows it to be processed, please consult the \"My Account\" section.<br>\r\nIf you wish to authorize the activities referred to in points h) and i) and subsequently do not wish to receive further communications from SPORTSWEAR COMPANY S.p.A. or wish to limit the ways in which you can be contacted, you may at any time discontinue these communications simply by clicking on the 'unsubscribe' link at the bottom of each communication, or by accessing your My Account, alternatively you can always contact SPORTSWEAR COMPANY S.p.A. through our Customer Care Department or by writing to the address above. Please note that you may receive further communications from us even after you have submitted your unsubscribe request, as some mailings may already have been planned, and our systems may take some time to process your request.<br>\r\nIn relation to all the above activities, we will mainly process your personal data through IT and electronic means; the tools we use ensure high standards of security, in full compliance with current regulations on the issue.<br>\r\n<b>4. My Account</b><br>\r\nWhen you create your My Account, we offer you access to the following services:<br>\r\n- My profile: manage your personal data and your consent<br>\r\n- My orders: track your shipping and check your order history<br>\r\n- My cards: save your credit card details for faster checkout<br>\r\n- Address Book: save all your addresses for faster checkout<br>\r\n- Wish List: create your own wish list: you can save up to 50 items, get notifications about their availability and add them to your Shopping Bag at any time.<br>\r\nSubject to your express consent, SPORTSWEAR COMPANY S.p.A. may use your contact details for marketing communications on products and services, in order to keep you updated on news, new arrivals, exclusive products, and for conducting opinion polls and market research, in order to assess your level of satisfaction and improve the services offered.<br>\r\nOnly with your prior consent, SPORTSWEAR COMPANY S.p.A. will be able to personalize your experience and the content of marketing communications and offers you will see when you browse stoneisland.com as a registered user to suit your interests. This activity makes it easier for you to find products and services that you prefer and that are in line with your interests, while at the same time improving our service to you. This personalization is made possible by analyzing the personal data we hold about you, which is described in the previous section 'What personal data do we collect?’. In particular, information about your past purchases and the sections of the Website you visit most often or the services you use most frequently helps us to understand which products and services are most relevant to you.<br>\r\nTo ensure that the information we hold is correct and allows us to properly perform the activity described above, we encourage you to access the 'My Profile' section of your My Account and, update it as necessary.<br>\r\n<b>5. Legal basis for processing</b><br>\r\nWe will only process your personal data if one of the legal requirements provided for by current legislation is met, and specifically:<br>\r\na. for the conclusion and performance of a contract to which you are party.<br>
When we process your data for the conclusion of the purchase contract to which you are a party we ensure that we use only the minimum information necessary for the completion of the same. This basis legitimizes the processing of personal data in the course of the following activities:<br>\r\n- stipulation and fulfillment of a contract for the purchase of products offered on stoneisland.com,<br>\r\n- registration on the Website and use of services reserved for registered users;<br>\r\n- provision of the services offered on stoneisland.com,<br>\r\n- management of your requests to our Customer Care department.<br>\r\nThe provision of your personal data for these activities is a contractual obligation. You are free to disclose your data to us or not, but in the absence of the requested data, we will not be able to conclude or execute the agreement and your requests. This means that you will not be able to purchase products from or use the services of the Website and that YOOX NET-A-PORTER GROUP S.p.A. will not be able to handle your requests.<br>\r\nb. to comply with a legal obligation.<br>In the event of the stipulation of a contract for the purchase of goods on stoneisland.com, the user's data will be processed in order to fulfill the legal obligations to which YOOX NET-A-PORTER GROUP S.p.A. is subject. You are free to decide whether or not to enter into a contract and whether or not to disclose your data to us, but if you do, your data will be necessary and will be processed to comply with the aforementioned legal obligations YOOX NET-A-PORTER GROUP S.p.A. is required to fulfill.<br> The processing of CVs sent spontaneously, carried out to assess candidates with respect to possible employment with SPORTSWEAR COMPANY S.p.A., is legitimate as it is expressly authorized by a legal provision, which specifies that in this case the consent of the person to whom the personal data refers is not required. You are free to send us your CV or not, but if you do not, we will not be able to assess your application for employment with SPORTSWEAR COMPANY S.p.A..<br>\r\nc. in our legitimate interest.<br>
When purchasing products on stoneisland.com by credit or debit card, some of your personal data may be used for anti-fraud purposes: we have a legitimate interest in performing this activity in order to prevent and prosecute any fraudulent activities. For internal administrative purposes, the data may be processed by companies belonging to the business group to which YOOX NET-A-PORTER GROUP S.p.A. belongs.<br>\r\nd. with your consent.<br>
We will only carry out the following processing if you have given us your express consent:<br>\r\n- carrying out marketing activities, opinion polls and market research;<br>\r\n- analyzing your browsing and shopping habits when using your My Account profile, in order to personalize your experience on our Website.<br>\r\nProviding your consent for such activities is optional. You are free to consent or not to consent, but in the absence of consent it will not be possible for SPORTSWEAR COMPANY S.p.A. to carry out marketing activities, opinion polls and market research, and to analyze your habits.<br>\r\n<b>6. Who will process your data?</b><br>\r\nYour personal data will be processed by the Data Controller's in-house staff who have been specially trained and authorized to process the same. When processing the data, it may also be transferred to companies belonging to the corporate group to which the Data Controller belongs.<br>\r\nYour personal data will also be transferred to third parties that we use to provide our services on stoneisland.com; these parties have been carefully selected and offer an adequate guarantee of compliance with the regulations regarding personal data processing. These parties have been designated as data processors and carry out their activities according to the instructions given by the Data Controllers and under their supervision.<br>\r\nThe third parties in question belong to the following categories: site manager, banks, internet providers, companies specializing in computer and telecommunications services, couriers, marketing agencies, companies specializing in market research and data processing.<br>\r\nYour data may be disclosed to the police and to the judicial and administrative authorities, in accordance with the law, for the detection and prosecution of crimes, the prevention and protection from threats to public security, to enable the Controllers to ascertain, exercise or defend a right in court, as well as for other reasons related to the protection of the rights and freedoms of others.<br>\r\n<b>7. APP version of the Website</b><br>\r\nIn addition to the information referred to in the 'What personal data do we collect?, when you use the App version of our stoneisland.com Website, the Controllers may, with your express consent:<br>\r\na. collect personal data as part of marketing activities in order to send push notifications to your device. You can disable push notifications at any time by changing your selection in your mobile device settings.<br>\r\nb. collect personal data about your location to locate the store closest to you, in order to improve your shopping experience;<br>\r\nc. access the camera on your device to make it easier for you to enter your card details to complete the purchase;<br>\r\nd. automatically collect information, such as your data about your traffic and your visit to stoneisland.com or your IP address, in order to improve our range of products and services.<br>\r\n<b>8. Web push notification</b><br>\r\nDepending on which device you use, you may receive, upon giving your consent, push notifications regarding our offers, new items, your wish list and your cart.<br>\r\nTo deactivate notifications, depending on the platform and/or browser used, follow the steps listed below:<br>\r\n- Desktop: Right-click on notification > disable notifications from stoneisland.com<br>\r\n- Mobile: Access the notification center > Site parameters > Notifications > Block notifications from stoneisland.com<br>\r\n- Common browsers:<br>\r\n- Chrome: Settings > Show Advanced Settings > Privacy – Content Settings > Notifications - Manage exceptions > Enter stoneisland.com and select “Block”<br>\r\n- Firefox: Options > Content > Notifications – Select > stoneisland.com – “Block”<br>\r\n- Safari: Preferences > Notifications > From here select \"Deny\"<br>\r\n<b>9. Data transfer outside of the EU</b><br>\r\nSome of the third parties listed in the previous section no. 6 'Who will process your data? could be based in countries outside the European Union which, however, offer an adequate level of data protection, as set out in specific decisions of the European Commission (http://www.garanteprivacy.it/home/provvedimenti-normativa/normativa/normativa community-and-intentional/transfer-of-data-to-third-countries#1).<br>\r\nThe transfer of your personal data to countries that are not members of the European Union and that do not ensure adequate levels of protection will only be carried out after specific agreements have been entered into between the Data Controllers and said parties, containing safeguarding clauses and appropriate guarantees for the protection of your personal data, known as the 'standard contractual clauses', also approved by the European Commission, or if the transfer is necessary for the stipulation and fulfillment of a contract between you and the Data Controllers (for the purchase of goods offered on our Website, for registration on the Website or for the use of services on the Website) or for the management of your requests.<br>\r\n<b>10. How long do we keep your data?</b>\r\nWe store your personal data for a limited period of time, which varies depending on the type of activity requiring the processing of your personal data. After this period, your data will be permanently deleted or irreversibly anonymized.<br>\r\nYour personal data is stored in compliance with the following terms and criteria:<br>\r\na. data collected to conclude and execute agreements for the purchase of goods on stoneisland.com: until the administrative and accounting formalities have been completed. Billing information will be retained for ten years from the invoice date;<br>\r\nb. registered user data: this data will be stored until you request the deletion of your My Account;<br>\r\nc. payment data: until authentication of payment and completion of the relevant administrative and accounting formalities following expiry of the right of withdrawal and the time limits applicable for contesting payment;<br>\r\nd. data collected in the context of the use of services offered on stoneisland.com: this data is stored until the termination of the service or the user's request to unsubscribe from the service;<br>\r\ne. data related to user requests to our Customer Care: data needed to assist you will be kept until your request is fully resolved;<br>\r\nf. CVs: for six months from receipt;<br>\r\ng. data used for marketing communications to users who purchase products on stoneisland.com (soft spam): this data is stored until the termination of the service or until the user unsubscribes from the service;<br>\r\nh. data provided for marketing communications, opinion polls and market research activities: until the user unsubscribes from the service or upon request by the user to discontinue the activity and in any event within two years of the user's last interaction of any kind with SPORTSWEAR COMPANY S.p.A.;<br>\r\ni. data used to personalize the Website and to display personalized marketing offers: until the user revokes the consent given for such activity or requests its discontinuation, and in any event within two years of the user's last interaction of any kind with SPORTSWEAR COMPANY S.p.A.;<br>\r\nIn all cases, termination of processing and subsequent permanent erasure or irreversible anonymization of personal data will be final within thirty days of the deadlines indicated above for technical reasons.<br>\r\n<b>11. Your rights</b><br>\r\nYou may exercise your rights at any time with regard to the specific processing of your personal data by the Data Controllers. Below you will find a general description of them and how to exercise them.<br>\r\na. Accessing and modifying your data: you have the right to access your personal data and to request that it be corrected, modified or supplemented with other information. If you wish, we will provide you with a copy of the data we hold about you.<br>\r\nb. Withdraw your consent: you may at any time withdraw your consent to the processing of your personal data in connection with any marketing activity. To this end, please note that marketing activities include sending marketing communications, conducting opinion polls and market research, in order to assess your level of satisfaction and improve the services offered. On receipt of your request we will ensure that the processing of your personal data based on such consent is promptly discontinued, while other processing or processing based on other grounds will continue to be carried out in full compliance with the applicable provisions.<br>\r\nc. Objecting to the processing of your data: you have the right to object at any time to the processing of your personal data carried out on the basis of our legitimate interest, explaining the reasons that justify your request; before accepting your request, the Data Controllers must assess the reasons for your request.<br>\r\nd. Erasure of your data: in the circumstance provided for by current legislation you may request the erasure of your personal data. Once your request has been received and assessed, if it is justified we will immediately discontinue the processing and erase your personal data.<br>\r\ne. Requesting that the processing of your personal data be temporarily restricted: in this case the Data Controllers will continue to store your personal data but will not process it, unless otherwise requested by you and subject to the exceptions provided for by law. You can obtain restriction of the processing when you are contesting the accuracy of your personal data, when the processing is unlawful but you oppose the erasure of your data, when your data is no longer needed but you need it to exercise your rights in court and when you object to the processing, during the period in which we are assessing the reasons for your request.<br>\r\nf. Requesting your data or transferring them to a party other than the Data Controllers (right to data portability). You can ask to be provided with your data that we process based on your consent or pursuant to a contract with you, in a standard format. If you wish, where technically possible, we may on your request transfer your data directly to a third party specified by you.<br>\r\nYou can access your My Account in order to exercise some of your rights outlined above or, alternatively, you can contact us by writing to our Customer Care Department or to the address of the Data Controller stated above.<br>\r\nTo ensure that our users' data is not compromised or misused by third parties, we may ask you to provide certain information to verify your identity before we respond to a request from you to exercise any of these rights.<br>\r\n<b>12. Children’s rights</b><br>\r\nWe do not sell products or services for purchase by children, but by adults. If you are under 18, you may use the Site only with the involvement of a parent or guardian. In accordance with the Federal Children's Online Privacy Protection Act of 1998 (COPPA), stoneisland.com/us does not knowingly collect, solicit or use personal data of children under the age of 13 provided without parental consent, and will delete any such data should we become aware that a user under the age of 13 has registered without verifiable parental con-sent. Therefore, if you are not 18 years or older, you are not authorized to use our US Site.<br>\r\n<b>13. Rights of California residents</b><br>\r\nPursuant to California Civil Code Sec. 1789.3, California resident users are entitled to know that they may file grievances and complaints with the California Department of Consumer Affairs, 400 R Street, STE 1080, Sacramento, CA 95814. For more information about protecting your privacy, you may wish to visit: www.ftc.gov. If you are a resident of California, you may request that we not share your information with certain affiliates or third parties providers for marketing purposes, and/or you may inquire as to how we have shared your information with third parties providers for marketing purposes. In connection with such request, we will identify the types of information shared and provide you with the names and addresses of the third parties with whom the information was shared. Please contact our Customer care through the appropriate form selecting “Privacy” as the topic on our contact form.<br>\r\n<b>13. Security measures</b>\r\nWe protect your personal data with specific technical and organizational security measures, aimed at preventing your personal data from being used in an illegitimate or fraudulent manner. In particular, we use security measures that ensure: the pseudonymization or encryption of your data; the confidentiality, integrity and availability of your data as well as the strength of the systems and services that process it; the ability to restore data in the event of a data breach. In addition, YOOX NET-A-PORTER GROUP S.p.A. undertakes to regularly test, check and assess the adequacy of its technical and organizational measures in order to ensure continued improvement in processing security.<br>\r\n<b>14. Complaints</b><br>\r\nIf you believe that your personal data has been processed unlawfully, you may file a complaint with one of the supervisory authorities responsible for ensuring compliance with data protection regulations.<br>\r\nIn Italy, complaints can be submitted to the Italian Data Protection Authority.<br>\r\nFurther information on submission procedures is available on the authority’s website http://www.garanteprivacy.it/.<br>\r\n<b>15. Amendments to this statement</b><br>\r\nThe continual development of our services may lead to modifications to the nature of the processing of your personal data as described above. As a result, this privacy statement may be subject to amendments and additions over time, which may also be necessary with regard to new regulations on the protection of personal data.<br>\r\nWe therefore ask you to periodically review its content: where possible, we will try to inform you in a timely manner of any amendments made and their consequences.<br>\r\nThe updated version of the privacy statement will in any event be published on this page, indicating the date it was last updated.<br>\r\n<b>16. Legal references and useful links</b><br>\r\nThe processing of your personal data is carried out by the Data Controllers in full compliance with the relevant provisions of EU Regulation 2016/679 General Data Protection Regulation, the Italian regulations governing the processing of personal data and the provisions of the Italian supervisory authority (http://www.garanteprivacy.it/) and, where applicable, the relevant foreign supervisory authorities.<br>\r\nLast update: 25/05/2018<br>", + "body": "Privacy Policy<br>\r\nWelcome to the App version of stoneisland.com (the App).<br>\r\nYour privacy and the security of your personal data are very important to us, which is why we collect and process your personal data with the utmost care and take appropriate steps to keep it safe.<br>\r\nBelow you will find the key information on the processing of your personal data in relation to your use of the App and the services offered. For detailed information on how we manage your personal data, please read our Privacy Policy.<br>\r\nPlease also read the stoneisland.com 'Cookie Policy', 'General Terms and Conditions of Use' and the 'Terms and Conditions of Registration of My Account', which contain detailed information about the terms and conditions of our services. Some services may be subject to specific legal requirements, in which case we will provide you with all the relevant information from time to time.<br>\r\n<b>Who is the Data Controller?</b><br>\r\n<b>The Data Controller</b><br>\r\nUpon consulting this App, and throughout the user's use of the services offered by the integrated Store, data related to identified or identifiable persons may be collected and processed. The data controllers are:<br>\r\n- SPORTSWEAR COMPANY S.p.A., with registered office at Bologna Galleria Cavour 4, 40124, and operational headquarters in Ravarino (MO), Via Confine n. 2161; <br>\r\nand<br>\r\n- YOOX NET-A-PORTER GROUP S.p.A., with registered office at via Morimondo, 17 – Milano 20143, Italy (\"YOOX NET-A-PORTER GROUP\")<br>\r\nin the persons of their pro tempore legal representatives.<br>\r\nIn particular, SPORTSWEAR COMPANY S.p.A. is the owner of stoneisland.com and of the 'Stone Island' trademark, and is the independent controller of the data processed for corporate purposes (i.e. for example but not limited to CRM, marketing activities, customer profiling, market analysis, management and strategic evaluations) that directly refers to the brand or to the company.<br>\r\nSPORTSWEAR COMPANY S.p.A. has appointed YOOX NET-A-PORTER GROUP S.p.A. as the Data Processor for the area of its responsibility and for the purposes related to the provision of the service on the App. YOOX NET-A-PORTER GROUP S.p.A. was appointed based on its experience, competence and trustworthiness, as well as the ability of YOOX NET-A-PORTER GROUP S.p.A. to guarantee the implementation of adequate technical and organizational measures to comply with the requirements of data protection regulations and to guarantee the protection of Data Subjects' rights.<br>\r\nSPORTSWEAR COMPANY S.p.A. will ensure that the Data Processor has carried out the tasks assigned to it and that it continues to provide adequate guarantees of full compliance with the provisions on the protection of personal data.<br>\r\nYOOX NET-A-PORTER GROUP manages stoneisland.com and is the independent controller of the processing connected to the e-commerce services offered through this App’s Store.<br>\r\nAny privacy issue related to processing by SPORTSWEAR COMPANY S.p.A. may be sent to the following e-mail address: spwprivacy@spwco.it or by fax to +39 059 810337. Requests which instead refer to processing connected to the Online Store must be sent to YOOX NET-A-PORTER GROUP by contacting Customer Care and selecting “Privacy” as the topic.<br>\r\n<b>What data do we process and why?</b>\r\nThe personal data that we process is the information you provide us with when you place an order and purchase goods, and the information we collect while you browse or use the services offered on stoneisland.com. We may therefore collect data relating to you such as personal details like your first and last name, shipping address and billing address, browsing information and your buying habits.<br>\r\nYour personal data is processed for the following purposes:<br>\r\n- enter into and fulfill a contract for the purchase of goods available on stoneisland.com;<br>\r\n- provide you with stoneisland.com services such as subscription to the newsletter;<br>\r\n- allow you to register on the App and use the services reserved for registered users;<br>\r\n- manage your requests to our Customer Care Department.<br>\r\nIn the cases referred to above, the processing of your personal data is legitimate to the extent necessary to fulfill a contract entered into with you or to provide you with the service you have specifically requested from us. We also perform statistical research and analysis using aggregate data to understand how users interact with and use the App, and to improve our product range and services.<br>\r\nOnly if you have given us your express consent will we process your personal data to:<br>\r\n- carry out marketing communications activities;<br>\r\n- personalize the App according to your interests.<br>\r\n<b>Who will process your data?</b><br>\r\nYour personal data will be processed by appropriately trained employees of stoneisland.com and of other companies in the Data Controllers Group and, for organizational and functional purposes related to the provision of services on stoneisland.com, by our suppliers. These suppliers have been assessed and chosen by the Controllers based on their proven trustworthiness and competence. Some of these parties may also be based in non-EU countries and, in these cases, the transfer of your personal data to these countries is carried out in compliance with the safeguards provided for in law.<br>\r\n<b>How long do we keep your data?</b><br>\r\nWe store your personal data for a limited period of time determined by the purpose for which it was collected, at the end of such period your personal data will be erased or otherwise made irreversibly anonymous. The storage period is different depending on the purpose of the processing: for example, data collected during the purchase of goods on stoneisland.com is processed until the completion of all administrative and accounting formalities, therefore it is stored in accordance with local tax laws (ten years), while the data used to send you our newsletters is stored until you ask us to stop sending them.<br>\r\nFor further information please see our Privacy Policy.<br>\r\n<b>What are your rights?<br></b>\r\nDepending on the type of processing, you may at any time: revoke your consent to the processing, be notified of what personal data we hold about you, its origin and how it is used, request that it be updated, corrected or supplemented and, in the cases provided for under current legislation, erase or restrict the processing of your personal data or object to its processing. If you wish, you can request to receive the personal data in the Controller's possession in a format readable by electronic devices and, where technically possible, we can transfer your data directly to a third party indicated by you.<br>\r\nIf you believe that your personal data has been processed unlawfully, you may file a complaint with one of the supervisory authorities responsible for ensuring compliance with data protection regulations. In Italy, complaints can be submitted to the Italian Data Protection Authority (http://www.garanteprivacy.it/).<br>\r\nThis statement may be subject to changes and additions over time, so please review its content periodically. Where possible, we will try to inform you in a timely manner of any amendments made.<br>\r\n<b>Privacy Policy<br>\r\n1. General information<br>\r\nWho is the Data Controller?</b><br>\r\nUpon consulting this App, and throughout the user's use of the services offered by the integrated Store, data related to identified or identifiable persons may be collected and processed. The data controllers are:<br>\r\n- SPORTSWEAR COMPANY S.p.A., with registered office at Bologna Galleria Cavour 4, 40124, and operational headquarters in Ravarino (MO), Via Confine n. 2161;<br>\r\nand\r\n- YOOX NET-A-PORTER GROUP S.p.A., with registered office at via Morimondo, 17 – Milano 20143, Italy (\"YOOX NET-A-PORTER GROUP”) <br>\r\nin the persons of their pro tempore legal representatives.<br>\r\nIn particular, SPORTSWEAR COMPANY S.p.A. is the owner of stoneisland.com and of the 'Stone Island' trademark, and is the independent controller of the data processed for corporate purposes (i.e. for example but not limited to CRM, marketing activities, customer profiling, market analysis, management and strategic evaluations) that directly refers to the brand or to the company.<br>\r\nSPORTSWEAR COMPANY S.p.A. has appointed YOOX NET-A-PORTER GROUP S.p.A. as the Data Processor for the area of its responsibility and for the purposes related to the provision of the service on stoneisland.com. YOOX NET-A-PORTER GROUP S.p.A. was appointed based on its experience, competence and trustworthiness, as well as the ability of YOOX NET-A-PORTER GROUP S.p.A. to guarantee the implementation of adequate technical and organizational measures to comply with the requirements of data protection regulations and to guarantee the protection of Data Subjects' rights.<br>\r\nSPORTSWEAR COMPANY S.p.A. will ensure that the Data Processor has carried out the tasks assigned to it and that it continues to provide adequate guarantees of full compliance with the provisions on the protection of personal data.<br>\r\nYOOX NET-A-PORTER GROUP manages stoneisland.com and is the independent controller of the processing connected to the e-commerce services offered through this App’s Store.<br>\r\nAny privacy issue related to processing by SPORTSWEAR COMPANY S.p.A. may be sent to the following e-mail address: spwprivacy@spwco.it or by fax to +39 059 810337. Requests which instead refer to processing connected to the Online Store must be sent to YOOX NET-A-PORTER GROUP by contacting Customer Care and selecting “Privacy” as the topic.<br>\r\n<b>Who is the Data Protection Officer?</b><br>\r\nYNAP has appointed a Data Protection Officer. Should you so wish, for any request regarding the protection of your personal data and the exercise of your rights, you may contact the YNAP Personal Data Protection Officer (DPO) at the address of the Data Controller indicated above or by writing to our Customer Care Department.<br>\r\n<b>2. What personal data do we collect?</b><br>\r\nThe categories of personal data that the Data Controllers collect and process when you browse or shop on stoneisland.com are:<br>\r\na. we collect the personal information necessary to complete and fulfill your purchase on stoneisland.com such as your first and last name, email address, shipping address, billing address, telephone number and payment information;<br>\r\nb. we collect your email address when you subscribe to our newsletter service;<br>\r\nc. we process the personal data you provide us with when you contact our Customer Care department in order to provide you with the assistance you require;<br>\r\nd. subject to your consent, we collect and use your personal data for marketing communications;<br>\r\ne. to register your My Account, we collect your first and last name, your email address, your password and your date of birth. If you are a registered user, we collect information about your access to the restricted area of the App. Subject to your express consent, by analyzing your personal data, we may draw up information regarding your interests and preferences with respect to our products and services, in order to provide you with suggestions and offers in line with your tastes.<br>\r\nf. we collect information about your browsing of stoneisland.com, such as the pages you visit and how you interact with the individual page and we store this information on our servers.<br>\r\nWe want to assure you that the Data Controller does not process any personal data relating to minors. If you access stoneisland.com and use the services offered by the Controllers you agree that you are over the age of majority.<br>\r\n<b>3. How do we use the personal data we collect?</b><br>\r\nTo the extent of their respective responsibilities, the Data Controllers collect and process your personal data for the following purposes:<br>\r\na. entering into and fulfillment of the contract for the purchase of the products available on stoneisland.com. When you make your purchase we ask you for the personal data necessary to fulfill the contract, such as payment, anti-fraud checks if you choose to pay by credit or debit card, billing, shipping of the product and any return management.<br>\r\nb. registration on the App and use of the services offered to registered users. Registration on the App is only possible by entering certain personal information, which is necessary to carry out the services offered to registered users.<br>\r\nc. provision of the services offered on stoneisland.com. For such purposes and in relation to each service and its characteristics, the Data Controllers need to collect the personal data necessary to carry out the specific service requested by you.<br>\r\nd. management of requests to our Customer Care department, which uses the personal data you provide to deal with your requests for information and assistance.<br>\r\ne. statistical analysis and research. We use some information about your use of the App, how you browse the App and how you use its services, to carry out statistical analysis and research in order to improve our range of products and services.<br>\r\nf. sending marketing correspondence following the purchase of one of our products, so-called soft spam. Following the purchase of one of our products on the App, we will send you communications containing our marketing offers for similar products and services to the e-mail address you provided when you placed your order.
subject to your express consent, we may use the contact details you have provided to us for marketing communications relating to our products and services, in order to keep you updated on news, new arrivals, exclusive products, offers and promotions. In addition to this, we may with your consent use your contact information for market research purposes and customer satisfaction surveys to improve our services and our relationship with our customers.<br>\r\ng. only with your consent, SPORTSWEAR COMPANY S.p.A. will be able to personalize your experience as a registered user on stoneisland.com, offering you previews and offers in line with your tastes and sending you personalized marketing communications tailored to your interests. This personalization will be achieved by analyzing your previous purchases and the other information described in the previous section 'What personal data do we collect?’. For further information on this data and the activity that allows it to be processed, please consult the \"My Account\" section.<br>\r\nIf you wish to authorize the activities referred to in points h) and i) and subsequently do not wish to receive further communications from SPORTSWEAR COMPANY S.p.A. or wish to limit the ways in which you can be contacted, you may at any time discontinue these communications simply by clicking on the 'unsubscribe' link at the bottom of each communication, or by accessing your My Account, alternatively you can always contact SPORTSWEAR COMPANY S.p.A. through our Customer Care Department or by writing to the address above. Please note that you may receive further communications from us even after you have submitted your unsubscribe request, as some mailings may already have been planned, and our systems may take some time to process your request.<br>\r\nIn relation to all the above activities, we will mainly process your personal data through IT and electronic means; the tools we use ensure high standards of security, in full compliance with current regulations on the issue.<br>\r\n<b>4. My Account</b><br>\r\nWhen you create your My Account, we offer you access to the following services:<br>\r\n- My profile: manage your personal data and your consent<br>\r\n- My orders: track your shipping and check your order history<br>\r\n- My cards: save your credit card details for faster checkout<br>\r\n- Address Book: save all your addresses for faster checkout<br>\r\nSubject to your express consent, SPORTSWEAR COMPANY S.p.A. may use your contact details for marketing communications on products and services, in order to keep you updated on news, new arrivals, exclusive products, and for conducting opinion polls and market research, in order to assess your level of satisfaction and improve the services offered.<br>\r\nOnly with your prior consent, SPORTSWEAR COMPANY S.p.A. will be able to personalize your experience and the content of marketing communications and offers you will see when you browse stoneisland.com as a registered user to suit your interests. This activity makes it easier for you to find products and services that you prefer and that are in line with your interests, while at the same time improving our service to you. This personalization is made possible by analyzing the personal data we hold about you, which is described in the previous section 'What personal data do we collect?’. In particular, information about your past purchases and the sections of the App you visit most often or the services you use most frequently helps us to understand which products and services are most relevant to you.<br>\r\nTo ensure that the information we hold is correct and allows us to properly perform the activity described above, we encourage you to access the 'My Profile' section of your My Account and, update it as necessary.<br>\r\n<b>5. Legal basis for processing</b><br>\r\nWe will only process your personal data if one of the legal requirements provided for by current legislation is met, and specifically:<br>\r\na. for the conclusion and performance of a contract to which you are party.<br>
When we process your data for the conclusion of the purchase contract to which you are a party we ensure that we use only the minimum information necessary for the completion of the same. This basis legitimizes the processing of personal data in the course of the following activities:<br>\r\n- stipulation and fulfillment of a contract for the purchase of products offered on stoneisland.com,<br>\r\n- registration on the App and use of services reserved for registered users;<br>\r\n- provision of the services offered on stoneisland.com,<br>\r\n- management of your requests to our Customer Care department.<br>\r\nThe provision of your personal data for these activities is a contractual obligation. You are free to disclose your data to us or not, but in the absence of the requested data, we will not be able to conclude or execute the agreement and your requests. This means that you will not be able to purchase products from or use the services of the App and that YOOX NET-A-PORTER GROUP S.p.A. will not be able to handle your requests.<br>\r\nb. to comply with a legal obligation.<br>In the event of the stipulation of a contract for the purchase of goods on stoneisland.com, the user's data will be processed in order to fulfill the legal obligations to which YOOX NET-A-PORTER GROUP S.p.A. is subject. You are free to decide whether or not to enter into a contract and whether or not to disclose your data to us, but if you do, your data will be necessary and will be processed to comply with the aforementioned legal obligations YOOX NET-A-PORTER GROUP S.p.A. is required to fulfill.<br>\r\nc. in our legitimate interest.<br>
When purchasing products on stoneisland.com by credit or debit card, some of your personal data may be used for anti-fraud purposes: we have a legitimate interest in performing this activity in order to prevent and prosecute any fraudulent activities. For internal administrative purposes, the data may be processed by companies belonging to the business group to which YOOX NET-A-PORTER GROUP S.p.A. belongs.<br>\r\nd. with your consent.<br>
We will only carry out the following processing if you have given us your express consent:<br>\r\n- carrying out marketing activities, opinion polls and market research;<br>\r\n- analyzing your browsing and shopping habits when using your My Account profile, in order to personalize your experience on our App.<br>\r\nProviding your consent for such activities is optional. You are free to consent or not to consent, but in the absence of consent it will not be possible for SPORTSWEAR COMPANY S.p.A. to carry out marketing activities, opinion polls and market research, and to analyze your habits.<br>\r\n<b>6. Who will process your data?</b><br>\r\nYour personal data will be processed by the Data Controller's in-house staff who have been specially trained and authorized to process the same. When processing the data, it may also be transferred to companies belonging to the corporate group to which the Data Controller belongs.<br>\r\nYour personal data will also be transferred to third parties that we use to provide our services on stoneisland.com; these parties have been carefully selected and offer an adequate guarantee of compliance with the regulations regarding personal data processing. These parties have been designated as data processors and carry out their activities according to the instructions given by the Data Controllers and under their supervision.<br>\r\nThe third parties in question belong to the following categories: site manager, banks, internet providers, companies specializing in computer and telecommunications services, couriers, marketing agencies, companies specializing in market research and data processing.<br>\r\nYour data may be disclosed to the police and to the judicial and administrative authorities, in accordance with the law, for the detection and prosecution of crimes, the prevention and protection from threats to public security, to enable the Controllers to ascertain, exercise or defend a right in court, as well as for other reasons related to the protection of the rights and freedoms of others.<br>\r\n<b>7. APP version of the Website</b><br>\r\nIn addition to the information referred to in the 'What personal data do we collect?, when you use the App version of our stoneisland.com Website, the Controllers may, with your express consent:<br>\r\na. collect personal data as part of marketing activities in order to send push notifications to your device. You can disable push notifications at any time by changing your selection in your mobile device settings.<br>\r\nb. collect personal data about your location to locate the store closest to you, in order to improve your shopping experience;<br>\r\nc. access the camera on your device to make it easier for you to enter your card details to complete the purchase;<br>\r\nd. automatically collect information, such as your data about your traffic and your visit to stoneisland.com or your IP address, in order to improve our range of products and services.<br>\r\n<b>8. Web push notification</b><br>\r\nDepending on which device you use, you may receive, upon giving your consent, push notifications regarding our offers, new items, your wish list and your cart.<br>\r\nTo deactivate notifications, depending on the platform and/or browser used, follow the steps listed below:<br>\r\n- Desktop: Right-click on notification > disable notifications from stoneisland.com<br>\r\n- Mobile: Access the notification center > Site parameters > Notifications > Block notifications from stoneisland.com<br>\r\n- Common browsers:<br>\r\n- Chrome: Settings > Show Advanced Settings > Privacy – Content Settings > Notifications - Manage exceptions > Enter stoneisland.com and select “Block”<br>\r\n- Firefox: Options > Content > Notifications – Select > stoneisland.com – “Block”<br>\r\n- Safari: Preferences > Notifications > From here select \"Deny\"<br>\r\n<b>9. Data transfer outside of the EU</b><br>\r\nSome of the third parties listed in the previous section no. 6 'Who will process your data? could be based in countries outside the European Union which, however, offer an adequate level of data protection, as set out in specific decisions of the European Commission (http://www.garanteprivacy.it/home/provvedimenti-normativa/normativa/normativa community-and-intentional/transfer-of-data-to-third-countries#1).<br>\r\nThe transfer of your personal data to countries that are not members of the European Union and that do not ensure adequate levels of protection will only be carried out after specific agreements have been entered into between the Data Controllers and said parties, containing safeguarding clauses and appropriate guarantees for the protection of your personal data, known as the 'standard contractual clauses', also approved by the European Commission, or if the transfer is necessary for the stipulation and fulfillment of a contract between you and the Data Controllers (for the purchase of goods offered on our App, for registration on the App or for the use of services on the App) or for the management of your requests.<br>\r\n<b>10. How long do we keep your data?</b>\r\nWe store your personal data for a limited period of time, which varies depending on the type of activity requiring the processing of your personal data. After this period, your data will be permanently deleted or irreversibly anonymized.<br>\r\nYour personal data is stored in compliance with the following terms and criteria:<br>\r\na. data collected to conclude and execute agreements for the purchase of goods on stoneisland.com: until the administrative and accounting formalities have been completed. Billing information will be retained for ten years from the invoice date;<br>\r\nb. registered user data: this data will be stored until you request the deletion of your My Account;<br>\r\nc. payment data: until authentication of payment and completion of the relevant administrative and accounting formalities following expiry of the right of withdrawal and the time limits applicable for contesting payment;<br>\r\nd. data collected in the context of the use of services offered on stoneisland.com: this data is stored until the termination of the service or the user's request to unsubscribe from the service;<br>\r\ne. data related to user requests to our Customer Care: data needed to assist you will be kept until your request is fully resolved;<br>\r\nf. data used for marketing communications to users who purchase products on stoneisland.com (soft spam): this data is stored until the termination of the service or until the user unsubscribes from the service;<br>\r\ng. data provided for marketing communications, opinion polls and market research activities: until the user unsubscribes from the service or upon request by the user to discontinue the activity and in any event within two years of the user's last interaction of any kind with SPORTSWEAR COMPANY S.p.A.;<br>\r\nh. data used to personalize the App and to display personalized marketing offers: until the user revokes the consent given for such activity or requests its discontinuation, and in any event within two years of the user's last interaction of any kind with SPORTSWEAR COMPANY S.p.A.;<br>\r\nIn all cases, termination of processing and subsequent permanent erasure or irreversible anonymization of personal data will be final within thirty days of the deadlines indicated above for technical reasons.<br>\r\n<b>11. Your rights</b><br>\r\nYou may exercise your rights at any time with regard to the specific processing of your personal data by the Data Controllers. Below you will find a general description of them and how to exercise them.<br>\r\na. Accessing and modifying your data: you have the right to access your personal data and to request that it be corrected, modified or supplemented with other information. If you wish, we will provide you with a copy of the data we hold about you.<br>\r\nb. Withdraw your consent: you may at any time withdraw your consent to the processing of your personal data in connection with any marketing activity. To this end, please note that marketing activities include sending marketing communications, conducting opinion polls and market research, in order to assess your level of satisfaction and improve the services offered. On receipt of your request we will ensure that the processing of your personal data based on such consent is promptly discontinued, while other processing or processing based on other grounds will continue to be carried out in full compliance with the applicable provisions.<br>\r\nc. Objecting to the processing of your data: you have the right to object at any time to the processing of your personal data carried out on the basis of our legitimate interest, explaining the reasons that justify your request; before accepting your request, the Data Controllers must assess the reasons for your request.<br>\r\nd. Erasure of your data: in the circumstance provided for by current legislation you may request the erasure of your personal data. Once your request has been received and assessed, if it is justified we will immediately discontinue the processing and erase your personal data.<br>\r\ne. Requesting that the processing of your personal data be temporarily restricted: in this case the Data Controllers will continue to store your personal data but will not process it, unless otherwise requested by you and subject to the exceptions provided for by law. You can obtain restriction of the processing when you are contesting the accuracy of your personal data, when the processing is unlawful but you oppose the erasure of your data, when your data is no longer needed but you need it to exercise your rights in court and when you object to the processing, during the period in which we are assessing the reasons for your request.<br>\r\nf. Requesting your data or transferring them to a party other than the Data Controllers (right to data portability). You can ask to be provided with your data that we process based on your consent or pursuant to a contract with you, in a standard format. If you wish, where technically possible, we may on your request transfer your data directly to a third party specified by you.<br>\r\nYou can access your My Account in order to exercise some of your rights outlined above or, alternatively, you can contact us by writing to our Customer Care Department or to the address of the Data Controller stated above.<br>\r\nTo ensure that our users' data is not compromised or misused by third parties, we may ask you to provide certain information to verify your identity before we respond to a request from you to exercise any of these rights.<br>\r\n<b>12. Children’s rights</b><br>\r\nWe do not sell products or services for purchase by children, but by adults. If you are under 18, you may use the Site only with the involvement of a parent or guardian. In accordance with the Federal Children's Online Privacy Protection Act of 1998 (COPPA), stoneisland.com/us does not knowingly collect, solicit or use personal data of children under the age of 13 provided without parental consent, and will delete any such data should we become aware that a user under the age of 13 has registered without verifiable parental con-sent. Therefore, if you are not 18 years or older, you are not authorized to use our US Site.<br>\r\n<b>13. Rights of California residents</b><br>\r\nPursuant to California Civil Code Sec. 1789.3, California resident users are entitled to know that they may file grievances and complaints with the California Department of Consumer Affairs, 400 R Street, STE 1080, Sacramento, CA 95814. For more information about protecting your privacy, you may wish to visit: www.ftc.gov. If you are a resident of California, you may request that we not share your information with certain affiliates or third parties providers for marketing purposes, and/or you may inquire as to how we have shared your information with third parties providers for marketing purposes. In connection with such request, we will identify the types of information shared and provide you with the names and addresses of the third parties with whom the information was shared. Please contact our Customer care through the appropriate form selecting “Privacy” as the topic on our contact form.<br>\r\n<b>13. Security measures</b>\r\nWe protect your personal data with specific technical and organizational security measures, aimed at preventing your personal data from being used in an illegitimate or fraudulent manner. In particular, we use security measures that ensure: the pseudonymization or encryption of your data; the confidentiality, integrity and availability of your data as well as the strength of the systems and services that process it; the ability to restore data in the event of a data breach. In addition, YOOX NET-A-PORTER GROUP S.p.A. undertakes to regularly test, check and assess the adequacy of its technical and organizational measures in order to ensure continued improvement in processing security.<br>\r\n<b>14. Complaints</b><br>\r\nIf you believe that your personal data has been processed unlawfully, you may file a complaint with one of the supervisory authorities responsible for ensuring compliance with data protection regulations.<br>\r\nIn Italy, complaints can be submitted to the Italian Data Protection Authority.<br>\r\nFurther information on submission procedures is available on the authority’s website http://www.garanteprivacy.it/.<br>\r\n<b>15. Amendments to this statement</b><br>\r\nThe continual development of our services may lead to modifications to the nature of the processing of your personal data as described above. As a result, this privacy statement may be subject to amendments and additions over time, which may also be necessary with regard to new regulations on the protection of personal data.<br>\r\nWe therefore ask you to periodically review its content: where possible, we will try to inform you in a timely manner of any amendments made and their consequences.<br>\r\nThe updated version of the privacy statement will in any event be published on this page, indicating the date it was last updated.<br>\r\n<b>16. Legal references and useful links</b><br>\r\nThe processing of your personal data is carried out by the Data Controllers in full compliance with the relevant provisions of EU Regulation 2016/679 General Data Protection Regulation, the Italian regulations governing the processing of personal data and the provisions of the Italian supervisory authority (http://www.garanteprivacy.it/) and, where applicable, the relevant foreign supervisory authorities.<br>\r\nLast update: 25/05/2018<br>", "__index": 2, "dateCreated": "Tue, 17 Nov 2015 20:32:07 GMT", "tag": "privacy" @@ -4775,20 +5971,6 @@ "__index": "4", "dateCreated": "Tue, 17 Nov 2015 21:03:57 GMT", "tag": "care" - }, - { - "id": "account-terms", - "title": "Account Terms", - "image": { - "uri": "", - "caption": "", - "width": "", - "height": "" - }, - "body": "<h2>1. Services</h2>\r\n\r\nStone Island - SPORTSWEAR COMPANY S.p.A. (\"Stone Island\") offers you the possibility of using the following services \"My Account\" (the \"Services\")*:\r\n\r\n<ul>\r\n<li><b>My Orders:</b> Track the shipping of your orders, change or return items that are not for you and see the history of your orders.</li>\r\n<li><b>My Profile:</b> Manage your registration data.</li>\r\n<li><b>Address Book:</b> Save or change your addresses to have them always at hand and complete your purchases faster.</li>\r\n<li><b>My Card:</b> Save or change your card information and complete your orders faster and always safely.</li>\r\n</ul>\r\n\r\n<h2>2. Registration</h2>\r\n<h3>2.1</h3>\r\n\r\nIf you want to use the Services you must be an adult user, register on stoneisland.com creating your My Account account, and accept these terms and conditions for using the Services (\"Terms\"). Registration is free of charge. To create your My Account account, you will need to fill out the registration form by entering the required information, and guarantee to Stone Island that the information provided during the registration process is complete, accurate and truthful. We will send you an email to confirm your registration. We remind you that the credentials to access your My Account account must be used exclusively by you, and they cannot be transferred to third parties. Subject to legal limitations, Stone Island cannot in any way be held responsible in the event of access to your My Account account by unauthorized third parties. You are requested to keep your credentials confidential and to immediately inform Stone Island if you suspect that there has been an unauthorized access to your My Account account or if your password has been violated.\r\n\r\n\r\n<h3>2.2</h3>\r\n\r\nFor the provision of some Services, it may be necessary to use electronic communication channels (such as e-mail, SMS or telephone). If you want to use these specific services, you will be asked to give your consent to be contacted by Stone Island for the related communications by SMS, email or other communication channel.\r\n\r\n\r\n<h3>2.3</h3>\r\n\r\nWe also request you to consult, if you have not already done so, our <a href=\"#!/page/terms\">General Terms of Use</a> which form an integral part of these Terms. For any other legal information, consult the <a href=\"http://www.stoneisland.com/localize.asp?tskay=4036416C&page=legal/saleterms&\">General Terms of Sale</a>, <a href=\"http://www.stoneisland.com/localize.asp?tskay=4036416C&page=legal/returnpolicy\">Return Policy</a> and <a href=\"http://www.stoneisland.com/localize.asp?tskay=4036416C&page=legal/privacypolicy&\">Privacy Policy</a> of stoneisland.com.\r\n\r\n\r\n<h2>3. Duration and withdrawal</h2>\r\n\r\n<h3>3.1</h3>\r\n\r\nThe registration with the Services shall be effective from the moment you receive the confirmation email and for the entire period in which you use the Services.\r\n\r\n\r\n<h3>3.2</h3>\r\n\r\nAt any time and for any reason, you can cancel your subscription to the Services by sending a request to our Customer Service and selecting \"privacy\". In the event you exercised the right of withdrawal, we will send you an email to confirm the cancellation of the Services.\r\n\r\n\r\n<h3>3.3</h3>\r\n\r\nStone Island reserves the right to cancel your registration with the Services in the event of a violation of the provisions contained in these Terms, or in the event that the data provided was not complete, truthful or accurate, without prejudice to the right to compensation for the damage suffered. Stone Island also reserves the right to temporarily suspend, without any prior communication, the provision of the Services, for the time necessary and / or appropriate, to perform all the technical interventions required to improve the quality of the Services. Stone Island may, at any time, interrupt the provision of the Services for security reasons.\r\n\r\n\r\n<h2>4. Warning on the Services</h2>\r\n\r\nStone Island shall do its best to provide an accurate services. Without prejudice to the legal limits, the Services are provided free of charge \"AS IS\". Stone Island does not provide any guarantee, by way of example but not limited to, relating to the quality, the good functioning, the absence of interruptions or the suitability of the Services for an end or a particular result set by the user.\r\n\r\n\r\n<h2>5. Rectification and Update</h2>\r\n\r\nThe present Terms can be amended from time to time in consideration of possible regulatory changes. The new Terms shall be effective as of their date of publication in stoneisland.com You are requested to regularly access this section in order to check the publication of the most recent and updated Privacy Policy.\r\n\r\n\r\n*The availability of the Service may vary by country or region. Verify your My Account account to see which Services are available.\r\n\r\n", - "tag": "account_terms", - "__index": 5, - "dateCreated": "Tue, 24 Jul 2018 13:59:23 GMT" } ], "store": [ @@ -4798,9 +5980,9 @@ "StoreIsOpen": "false", "ClosedStoreImages": [ { - "uri": "https://marsupial.s3.amazonaws.com/stoneisland/4b3949c0-7300-11e8-8a6b-3521187b68ec.jpg", - "width": "519", - "height": "692", + "uri": "https://marsupial.s3.amazonaws.com/stoneisland/edf098b0-d0d9-11ea-92aa-1fa3632a88e2.jpg", + "width": "642", + "height": "838", "caption": "" } ], @@ -4809,25 +5991,37 @@ "collection": "", "FitsLarge": "false", "BackgroundIsGray": "false", - "CollectionId": "PPTSTTLSSC", - "StoreStatus": "closed", + "CollectionId": "", + "StoreStatus": "open", "OpensOn": "", - "DepartmentId": "PPTSTTLSSC", + "DepartmentId": "", "StoreClosedMessageOne": "", "StoreClosedMessageTwo": "", "FittingCodes": "", - "DepartmentStoreStatus": "closed", + "DepartmentStoreStatus": "open", "Departments": [ { - "text": "REFLECTIVE TAPE", - "uri": "PPTSTTLSSC" + "text": "STONE ISLAND / PORTER® CO-LAB", + "uri": "PPPRTRFWSC" } ], "GroupBy": "none", "FilterBy": "none", "ShowProductNameOnCollectionPage": false, "NotAvailableInCanada": false, - "FitsLargeText": "" + "FitsLargeText": "", + "SizingFooter": "use_alt_text", + "SizingFooterText": "", + "showModal": "once", + "modalBackgroundColor": "white", + "modalTextColor": "black", + "modalTaglineColor": "blue", + "modalTaglinePosition": "bottom", + "modalTitle": "COVID-19 UPDATE", + "modalTagline": "Tap here for Stone Island's COVID-19 FAQs", + "modalContent": "Due to the current situation, the shipment of Stone Island orders will be delayed.\r\n\r\nWe apologize for the inconvenience.", + "modalButton": "PROCEED", + "modalTaglineLink": "https://www.stoneisland.com/system/selfservice.controller?CONFIGURATION=1701&PARTITION_ID=1&CMD=BROWSE_TOPIC&LANGUAGE=en&COUNTRY=us&USERTYPE=1&TOPIC_ID=149680" }, { "id": "test-environment", @@ -4835,12 +6029,7 @@ "collection": "", "CollectionId": "", "DepartmentId": "", - "Departments": [ - { - "text": "Test", - "uri": "PPPRVWFWSC1" - } - ], + "Departments": [], "StoreStatus": "closed", "DepartmentStoreStatus": "closed", "GroupBy": "none", @@ -4863,7 +6052,18 @@ "__index": 1, "dateCreated": "Sat, 15 Apr 2017 00:26:23 GMT", "NotAvailableInCanada": false, - "FitsLargeText": "M (size on the label) → fits M/L\r\nL (size on the label) → fits L/XL\r\nXL (size on the label) → fits XL/XXL" + "FitsLargeText": "M (size on the label) → fits M/L\r\nL (size on the label) → fits L/XL\r\nXL (size on the label) → fits XL/XXL", + "SizingFooter": "use_alt_text", + "SizingFooterText": "", + "showModal": "never", + "modalBackgroundColor": "white", + "modalTaglineColor": "black", + "modalTaglinePosition": "hidden", + "modalTaglineLink": "", + "modalTitle": "", + "modalTagline": "", + "modalContent": "", + "modalButton": "" } ] -}
\ No newline at end of file +} diff --git a/StoneIsland/platforms/ios/www/index.html b/StoneIsland/platforms/ios/www/index.html index 2e4e50b6..d8065176 100755 --- a/StoneIsland/platforms/ios/www/index.html +++ b/StoneIsland/platforms/ios/www/index.html @@ -12,7 +12,7 @@ --> -<meta http-equiv="Content-Security-Policy" content="default-src * gap: 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; object-src * 'unsafe-inline' 'unsafe-eval'; style-src * 'unsafe-inline' 'unsafe-eval'; img-src * 'unsafe-inline' 'unsafe-eval'; media-src * 'unsafe-inline' 'unsafe-eval'; frame-src * gap: 'unsafe-inline' 'unsafe-eval'; font-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline' 'unsafe-eval'"> +<meta http-equiv="Content-Security-Policy" content="default-src * gap: 'unsafe-inline' 'unsafe-eval' https://ssl.gstatic.com https://www.google-analytics.com; script-src * 'unsafe-inline' 'unsafe-eval'; object-src * 'unsafe-inline' 'unsafe-eval' https://ssl.gstatic.com https://www.google-analytics.com; style-src * 'unsafe-inline' 'unsafe-eval'; img-src * 'unsafe-inline' 'unsafe-eval'; media-src * 'unsafe-inline' 'unsafe-eval'; frame-src * gap: 'unsafe-inline' 'unsafe-eval' https://ssl.gstatic.com https://www.google-analytics.com; font-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline' 'unsafe-eval'"> <meta name="format-detection" content="telephone=no"> <meta name="msapplication-tap-highlight" content="no"> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height"> @@ -1312,14 +1312,14 @@ </body> <script src="cordova.js"></script> <script src="js/vendor/jquery-2.1.4.min.js"></script> -<script src="js/vendor/fastclick.js"></script> +<!-- <script src="js/vendor/fastclick.js"></script> --> <script src="js/vendor/iscroll.js"></script> <script src="js/vendor/loader.js"></script> <script src="js/vendor/lodash.min.js"></script> <script src="js/vendor/moment.js"></script> <script src="js/vendor/oktween.js"></script> <script src="js/vendor/imageviewer.js"></script> -<script src="js/vendor/prefixfree.js"></script> +<!-- <script src="js/vendor/prefixfree.js"></script> --> <script src="js/vendor/promise.js"></script> <script src="js/vendor/flickity.pkgd.js"></script> <script src="js/vendor/util.js"></script> @@ -1334,6 +1334,7 @@ <script src="js/sdk/product.js"></script> <script src="js/sdk/shipping.js"></script> +<script src="js/lib/etc/analytics.js"></script> <script src="js/lib/etc/push.js"></script> <script src="js/lib/etc/deeplink.js"></script> <script src="js/lib/etc/geo.js"></script> diff --git a/StoneIsland/platforms/ios/www/js/index.js b/StoneIsland/platforms/ios/www/js/index.js index 8574372d..3947b43e 100755 --- a/StoneIsland/platforms/ios/www/js/index.js +++ b/StoneIsland/platforms/ios/www/js/index.js @@ -23,7 +23,7 @@ var app = (function(){ app.bind = function(){ document.addEventListener('touchmove', function(e){ e.preventDefault() }) if (!app.accessible) { - FastClick.attach(document.body) + // FastClick.attach(document.body) } } @@ -87,10 +87,11 @@ var app = (function(){ document.addEventListener('resume', app.resumed, false) document.addEventListener('online', app.online, false) document.addEventListener('offline', app.offline, false) - cordova.plugins.Keyboard.disableScroll(true) - cordova.plugins.Keyboard.hideKeyboardAccessoryBar(false) + window.Keyboard.disableScroll(true) + // window.Keyboard.HideKeyboardFormAccessoryBar(false) + analytics.init() geo.fetch() - sim.fetch(app.api_ready) + simcard.fetch(app.api_ready) var image = new Image image.src = "./img/compass-logo.png" } @@ -117,8 +118,11 @@ var app = (function(){ if (navigator.onLine) { app.account.connect(window.deepLinkRoute || '/intro') app.blog.fetch(function(){ - console.log("navigating to deep link route after fetch") + console.log("blog fetched, launching router") app.router.initial_route = window.deepLinkRoute || null + if (app.router.initial_route) { + analytics.sendPageView('push/' + app.router.initial_route) + } app.router.launch() }) } diff --git a/StoneIsland/platforms/ios/www/js/lib/_router.js b/StoneIsland/platforms/ios/www/js/lib/_router.js index 75f598e9..7d487689 100755 --- a/StoneIsland/platforms/ios/www/js/lib/_router.js +++ b/StoneIsland/platforms/ios/www/js/lib/_router.js @@ -101,6 +101,7 @@ var SiteRouter = Router.extend({ } // window.FirebasePlugin && window.FirebasePlugin.setScreenName(name) + analytics.sendPageView(name) console.log("view >>", app.view) app.header.set_back( !! app.view.back ) app.view.show() @@ -128,6 +129,7 @@ var SiteRouter = Router.extend({ if (app.view && app.view.hide) { app.view.hide() } + analytics.sendPageView('store/' + code) app.view = app.product app.header.set_back( true ) app.product.load(code) diff --git a/StoneIsland/platforms/ios/www/js/lib/blogs/BlogView.js b/StoneIsland/platforms/ios/www/js/lib/blogs/BlogView.js index 9190634c..d37846c2 100755 --- a/StoneIsland/platforms/ios/www/js/lib/blogs/BlogView.js +++ b/StoneIsland/platforms/ios/www/js/lib/blogs/BlogView.js @@ -61,9 +61,11 @@ var BlogView = View.extend({ } else { app.departments = app.store.Departments - app.department_id = app.store.Departments[0].uri + if (app.store.Departments.length) { + app.department_id = app.store.Departments[0].uri + app.collection.setCollectionName( app.store.Departments[0].text ) + } $("#collections h1").toggleClass("single-dept", app.store.Departments.length == 1) - app.collection.setCollectionName( app.store.Departments[0].text ) //// demo department for shoes with weird SizeTypeId // app.department_id = "NKDrtSC" if (sdk.env === 'test') { diff --git a/StoneIsland/platforms/ios/www/js/lib/blogs/HubView.js b/StoneIsland/platforms/ios/www/js/lib/blogs/HubView.js index 0d59bcc8..7a6f17d9 100755 --- a/StoneIsland/platforms/ios/www/js/lib/blogs/HubView.js +++ b/StoneIsland/platforms/ios/www/js/lib/blogs/HubView.js @@ -70,6 +70,7 @@ var HubView = ScrollableView.extend({ if (row.image && row.image.length > 1) { // image gallery var $gallery = $(".gallery-" + row.id) + var default_title = stonewash(row.title) + ". Image gallery, use the arrows to scroll." row.image.forEach(function(img){ var el = document.createElement("div") el.style.backgroundImage = "url(" + img.uri + ")" @@ -93,9 +94,17 @@ var HubView = ScrollableView.extend({ var url = gallery.selectedElement.style.backgroundImage.replace(/url\(\"?/,"").replace(/\"?\)/,"") app.fullscreenViewer.show(url, url, stonewash(row.title)) }) - $(".gallery-" + row.id).attr('aria-label', stonewash(row.title) + ". Image gallery, use the arrows to scroll.") + gallery.on('settle', function(e){ + // console.log(".gallery-target-" + row.id) + var currentImage = gallery.selectedElement + var title = $(currentImage).get(0).getAttribute('aria-label') || default_title + $(".gallery-" + row.id).attr('aria-label', title) + $(".gallery-target-" + row.id).attr('aria-label', title) + }) + var current_title = row.image[0].caption || default_title + $(".gallery-" + row.id).attr('aria-label', current_title) if (accessibility.voiceOver) { - $(".gallery-target-" + row.id).attr('aria-label', stonewash(row.title) + ". Image gallery, use the arrows to scroll.") + $(".gallery-target-" + row.id).attr('aria-label', current_title) $(".gallery-target-" + row.id).click(function(e){ e && e.preventDefault() var url = gallery.selectedElement.style.backgroundImage.replace(/url\(\"?/,"").replace(/\"?\)/,"") diff --git a/StoneIsland/platforms/ios/www/js/lib/etc/analytics.js b/StoneIsland/platforms/ios/www/js/lib/etc/analytics.js new file mode 100644 index 00000000..f5f871f5 --- /dev/null +++ b/StoneIsland/platforms/ios/www/js/lib/etc/analytics.js @@ -0,0 +1,21 @@ +var analytics = (function() { + var analytics = {} + + analytics.init = function() { + console.log("Analytics init") + if (window.FirebasePlugin) { + window.FirebasePlugin.setAnalyticsCollectionEnabled(true) + } + analytics.sendPageView('/') + } + + analytics.sendPageView = function(path) { + console.log("/a\\ send", path) + FirebasePlugin.logEvent("select_content", { + content_type: "page_view", + item_id: path, + }) + } + + return analytics +})() diff --git a/StoneIsland/platforms/ios/www/js/lib/etc/push.js b/StoneIsland/platforms/ios/www/js/lib/etc/push.js index 74aaf7b5..1f0ab9b6 100755 --- a/StoneIsland/platforms/ios/www/js/lib/etc/push.js +++ b/StoneIsland/platforms/ios/www/js/lib/etc/push.js @@ -1,34 +1,68 @@ var push = (function(){ var push = { settings: {}, disabled: false } - var pushPlugin + // var pushPlugin push.init = function(){ if (! ('device' in window) || (device.platform || "").toLowerCase() !== "ios") { console.log("push disabled") push.disabled = true return } - - pushPlugin = PushNotification.init({ - ios: { - alert: true, - badge: true, - sound: false, - clearBadge: true, - }, - }) console.log("push init") - - PushNotification.hasPermission(push.did_initialize) - pushPlugin.on('registration', push.got_registration) - pushPlugin.on('notification', push.got_push_notification) + + // Register handlers + FirebasePlugin.onMessageReceived(function(message) { + try { + console.log("onMessageReceived") + console.dir(message) + if (message.messageType === "notification") { + push.got_push_notification(message) + } + } catch(e) { + console.error("Exception in onMessageReceived callback: " + e.message) + } + }, function(error) { + console.error("Failed receiving FirebasePlugin message", error); + }) + + checkNotificationPermission(false) // Check permission then get token + FirebasePlugin.setBadgeNumber(0) } - push.did_initialize = function(data) { - // console.log(data) - if (! data.isEnabled) { - console.log("push did not initialize") - return - } + + var checkNotificationPermission = function(requested) { + FirebasePlugin.hasPermission(function(hasPermission) { + if (hasPermission) { + // Granted + console.log("Remote notifications permission granted") + push.disabled = false + getAPNSToken() + } else if (!requested) { + // Request permission + console.log("Requesting remote notifications permission") + FirebasePlugin.grantPermission(checkNotificationPermission.bind(this, true)) + } else { + // Denied + push.disabled = true + console.error("Notifications won't be shown as permission is denied") + } + }) + } + + var getAPNSToken = function() { + FirebasePlugin.getAPNSToken(function(token) { + console.log("Got APNS token: " + token) + if (!token) { + console.log("Token is null, probably in simulator") + return + } + push.did_initialize() + push.got_registration(token) + }, function(error) { + console.error("Failed to get APNS token", error) + }) + } + + push.did_initialize = function() { console.log("push did initialize") var hub_status = localStorage.getItem("yoox.push_hub") var store_status = localStorage.getItem("yoox.push_store") @@ -36,30 +70,19 @@ var push = (function(){ push.settings.requested = localStorage.getItem("yoox.push_requested") == "true" push.settings.hub = hub_status == "true" push.settings.store = store_status == "true" - - if (push.settings.requested) { - return - } - // not sure why we're also signing up for notifications here?? - if (! hub_status || hub_status == "true") { - push.subscribe("hub") - } - if (! store_status || store_status == "true") { - push.subscribe("store") - } } - push.got_registration = function(data){ - var registrationId = data.registrationId + + push.got_registration = function(registrationId){ var oldRegistrationId = localStorage.getItem("yoox.registrationId") - // console.log(registrationId, oldRegistrationId) - if (registrationId !== oldRegistrationId || ! push.settings.requested) { + localStorage.setItem("yoox.push_requested", "true") localStorage.setItem("yoox.registrationId", registrationId) - push.subscribe("hub", function(){ - push.subscribe("store") - }) + push.settings.requested = true + push.subscribe("hub") + push.subscribe("store") } } + push.subscribe = function(channel, cb){ if (push.disabled) return push.settings[channel] = true @@ -69,8 +92,10 @@ var push = (function(){ channel: channel, platform: device.platform, } - pushPlugin.subscribe(channel, function(){ - console.log("subscribed to", channel) + FirebasePlugin.subscribe(channel, function(){ + console.log("Subscribed to topic") + }, function(error){ + console.error("Error subscribing to topic: " + error) }) $.ajax({ method: "POST", @@ -93,6 +118,11 @@ var push = (function(){ channel: channel, platform: device.platform, } + FirebasePlugin.unsubscribe(channel, function(){ + console.log("Unsubscribed from topic"); + }, function(error){ + console.error("Error unsubscribing from topic: " + error); + }) $.ajax({ method: "POST", url: push.url('remove'), @@ -108,42 +138,26 @@ var push = (function(){ push.url = function(key){ return sdk.cms() + '/_services/push/' + key } - push.got_push_notification = function(push_obj) { + push.got_push_notification = function(message) { // console.log('We received this push notification: ' + JSON.stringify(push_obj)); - app.blog.refresh() - push_obj.additionalData = push_obj.additionalData || {} - var is_hub = true + FirebasePlugin.setBadgeNumber(0) + try { - is_hub = JSON.stringify(push_obj || {}).match(/hub/i) - } - catch (e) { - } + is_hub = !! JSON.stringify(push_obj || {}).match(/hub/i) + } catch (e) { } if (is_hub) { app.intro.$alert.show().html("[ HUB UPDATED ]") - } - else if (! push_obj.additionalData.url) { + analytics.sendPageView("push/open/hub") + app.router.go("intro") + } else { auth.clear_cart() app.intro.$alert.show().html("[ STORE UPDATED ]") - } - - if (push_obj.additionalData.foreground === false) { - // TODO: route the user to the uri in push_obj - pushPlugin.finish(function(){}, function(){}) - - if (push_obj.additionalData.url) { - app.deepLinkRoute = push_obj.additionalData.url - app.router.go(push_obj.additionalData.url) - } - } - else if (is_hub) { - app.router.go("hub") - } - else { + analytics.sendPageView("push/open/store") app.router.go("intro") } } diff --git a/StoneIsland/platforms/ios/www/js/lib/etc/sim.js b/StoneIsland/platforms/ios/www/js/lib/etc/sim.js index 65be02b0..19d2e3c3 100644 --- a/StoneIsland/platforms/ios/www/js/lib/etc/sim.js +++ b/StoneIsland/platforms/ios/www/js/lib/etc/sim.js @@ -1,49 +1,50 @@ -var sim = (function(){ - var sim = {} +var simcard = (function(){ + var simcard = {} - sim.loaded = false - sim.data = { + simcard.loaded = false + simcard.data = { carrierName: 'unknown', countryCode: 'us', mcc: '0', mnc: '0', } - sim.fetch = function(cb){ + simcard.fetch = function(cb){ console.log('fetching sim data') - sim.afterFetch = cb - window.plugins.sim.getSimInfo(sim.success, sim.error) + simcard.afterFetch = cb + window.plugins.sim.getSimInfo(simcard.success, simcard.error) + // cordova.exec(simcard.success, simcard.error, 'Sim', 'getSimInfo', []) } - sim.afterFetch = function(){} + simcard.afterFetch = function(){} - sim.success = function(data){ + simcard.success = function(data){ console.log(data) - if (sim.data.countryCode) { - sim.data = data - sim.data.countryCode = sim.data.countryCode.toLowerCase() + if (simcard.data.countryCode) { + simcard.data = data + simcard.data.countryCode = simcard.data.countryCode.toLowerCase() // app is only available in US or Canada, so call the US API regardless - if (sim.data.countryCode !== 'ca') { - sim.data.countryCode = 'us' + if (simcard.data.countryCode !== 'ca') { + simcard.data.countryCode = 'us' } } - sim.loaded = true - sim.afterFetch() + simcard.loaded = true + simcard.afterFetch() } - sim.error = function(){ + simcard.error = function(){ console.log("no SIM card detected") $.ajax({ url: "http://ip-api.com/json/", jsonp: "callback", dataType: "jsonp", - success: sim.success, + success: simcard.success, error: function(){ - sim.loaded = true - sim.afterFetch() + simcard.loaded = true + simcard.afterFetch() } }) } - return sim + return simcard })()
\ No newline at end of file diff --git a/StoneIsland/platforms/ios/www/js/lib/products/CollectionView.js b/StoneIsland/platforms/ios/www/js/lib/products/CollectionView.js index 70bb22b4..507c51d7 100755 --- a/StoneIsland/platforms/ios/www/js/lib/products/CollectionView.js +++ b/StoneIsland/platforms/ios/www/js/lib/products/CollectionView.js @@ -84,6 +84,9 @@ var CollectionView = ScrollableView.extend({ return } this.$loader.show() + if (!app.department_id) { + console.log("no department ID, store is closed") + } console.log("fetching", app.department_id) sdk.product.collection({ department_id: app.department_id, diff --git a/StoneIsland/platforms/ios/www/js/lib/products/ProductView.js b/StoneIsland/platforms/ios/www/js/lib/products/ProductView.js index 570024b6..63f651b6 100755 --- a/StoneIsland/platforms/ios/www/js/lib/products/ProductView.js +++ b/StoneIsland/platforms/ios/www/js/lib/products/ProductView.js @@ -313,6 +313,7 @@ var ProductView = ScrollableView.extend({ this.sizes = sizes this.colors = colors + // console.log('populated colors', sizes, colors, default_color) return default_color }, @@ -329,6 +330,9 @@ var ProductView = ScrollableView.extend({ var option = document.createElement('option') option.value = size.value option.innerHTML = size.label + if (this.size && size.id === this.size.id) { + option.selected = true + } this.$sizeSelect.append(option) }.bind(this)) }, @@ -337,13 +341,18 @@ var ProductView = ScrollableView.extend({ if (this.sold_out) { return } if (this.notAvailable) { return } if (this.details['ModelColors'].length == 0) { return } + console.log('populate colors', this.color) this.$colorSelect.empty() Object.keys(this.colors).forEach(function(key){ var color = this.colors[key] + console.log(color) var option = document.createElement('option') option.value = key option.innerHTML = color.label + if (this.color && color.id === this.color.id) { + option.selected = true + } this.$colorSelect.append(option) }.bind(this)) }, @@ -352,7 +361,7 @@ var ProductView = ScrollableView.extend({ console.log(this.colors) var value = this.$sizeSelect.val() var size = this.sizes[value] - console.log(size) + console.log('size', size) this.set_size_label(size.label) this.size = size.value }, @@ -360,7 +369,7 @@ var ProductView = ScrollableView.extend({ select_color: function(){ var value = this.$colorSelect.val() var color = this.colors[value] - console.log(color) + console.log('color', color) this.code = color.code this.set_color_label(color.label) this.gallery.populate( color.code, this.details['ImageTypes'] ) diff --git a/StoneIsland/platforms/ios/www/js/lib/view/Serializable.js b/StoneIsland/platforms/ios/www/js/lib/view/Serializable.js index 0d638412..acf77f2c 100755 --- a/StoneIsland/platforms/ios/www/js/lib/view/Serializable.js +++ b/StoneIsland/platforms/ios/www/js/lib/view/Serializable.js @@ -155,7 +155,7 @@ var SerializableView = View.extend({ } else { this.hide_errors() - window.cordova && cordova.plugins.Keyboard.close() + window.cordova && window.Keyboard.close() } var finalized_data = this.finalize(valid.data) diff --git a/StoneIsland/platforms/ios/www/js/sdk/_sdk.js b/StoneIsland/platforms/ios/www/js/sdk/_sdk.js index aba05ca3..cc68dd67 100755 --- a/StoneIsland/platforms/ios/www/js/sdk/_sdk.js +++ b/StoneIsland/platforms/ios/www/js/sdk/_sdk.js @@ -30,7 +30,7 @@ var sdk = (function(){ } sdk.cc = function(){ - return sim.data.countryCode.toUpperCase() + return simcard.data.countryCode.toUpperCase() // return 'CA' } diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-firebasex/www/firebase.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-firebasex/www/firebase.js new file mode 100644 index 00000000..0e8005e5 --- /dev/null +++ b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-firebasex/www/firebase.js @@ -0,0 +1,388 @@ +cordova.define("cordova-plugin-firebasex.FirebasePlugin", function(require, exports, module) { +var exec = require('cordova/exec'); + +var ensureBooleanFn = function (callback){ + return function(result){ + callback(ensureBoolean(result)); + } +}; + +var ensureBoolean = function(value){ + if(value === "true"){ + value = true; + }else if(value === "false"){ + value = false; + } + return !!value; +}; + +var onAuthStateChangeCallback = function(){}; + +/*********************** + * Protected internals + ***********************/ +exports._onAuthStateChange = function(userSignedIn){ + onAuthStateChangeCallback(userSignedIn); +}; + +/************** + * Public API + **************/ + +// Notifications +exports.getId = function (success, error) { + exec(success, error, "FirebasePlugin", "getId", []); +}; + +exports.getToken = function (success, error) { + exec(success, error, "FirebasePlugin", "getToken", []); +}; + +exports.getAPNSToken = function (success, error) { + exec(success, error, "FirebasePlugin", "getAPNSToken", []); +}; + +exports.onMessageReceived = function (success, error) { + exec(success, error, "FirebasePlugin", "onMessageReceived", []); +}; + +exports.onTokenRefresh = function (success, error) { + exec(success, error, "FirebasePlugin", "onTokenRefresh", []); +}; + +exports.onApnsTokenReceived = function (success, error) { + exec(success, error, "FirebasePlugin", "onApnsTokenReceived", []); +}; + +exports.subscribe = function (topic, success, error) { + exec(success, error, "FirebasePlugin", "subscribe", [topic]); +}; + +exports.unsubscribe = function (topic, success, error) { + exec(success, error, "FirebasePlugin", "unsubscribe", [topic]); +}; + +exports.unregister = function (success, error) { + exec(success, error, "FirebasePlugin", "unregister", []); +}; + +exports.isAutoInitEnabled = function (success, error) { + exec(success, error, "FirebasePlugin", "isAutoInitEnabled", []); +}; + +exports.setAutoInitEnabled = function (enabled, success, error) { + exec(success, error, "FirebasePlugin", "setAutoInitEnabled", [!!enabled]); +}; + +// Notifications - iOS-only +exports.setBadgeNumber = function (number, success, error) { + exec(success, error, "FirebasePlugin", "setBadgeNumber", [number]); +}; + +exports.getBadgeNumber = function (success, error) { + exec(success, error, "FirebasePlugin", "getBadgeNumber", []); +}; + +exports.grantPermission = function (success, error) { + exec(ensureBooleanFn(success), error, "FirebasePlugin", "grantPermission", []); +}; + +exports.hasPermission = function (success, error) { + exec(ensureBooleanFn(success), error, "FirebasePlugin", "hasPermission", []); +}; + +// Notifications - Android-only +exports.setDefaultChannel = function (options, success, error) { + exec(success, error, "FirebasePlugin", "setDefaultChannel", [options]); +}; + +exports.createChannel = function (options, success, error) { + exec(success, error, "FirebasePlugin", "createChannel", [options]); +}; + +exports.deleteChannel = function (channelID, success, error) { + exec(success, error, "FirebasePlugin", "deleteChannel", [channelID]); +}; + +exports.listChannels = function (success, error) { + exec(success, error, "FirebasePlugin", "listChannels", []); +}; + +// Analytics +exports.setAnalyticsCollectionEnabled = function (enabled, success, error) { + exec(success, error, "FirebasePlugin", "setAnalyticsCollectionEnabled", [!!enabled]); +}; + +exports.isAnalyticsCollectionEnabled = function (success, error) { + exec(success, error, "FirebasePlugin", "isAnalyticsCollectionEnabled", []); +}; + +exports.logEvent = function (name, params, success, error) { + exec(success, error, "FirebasePlugin", "logEvent", [name, params]); +}; + +exports.setScreenName = function (name, success, error) { + exec(success, error, "FirebasePlugin", "setScreenName", [name]); +}; + +exports.setUserId = function (id, success, error) { + exec(success, error, "FirebasePlugin", "setUserId", [id]); +}; + +exports.setUserProperty = function (name, value, success, error) { + exec(success, error, "FirebasePlugin", "setUserProperty", [name, value]); +}; + +exports.activateFetched = function (success, error) { + exec(ensureBooleanFn(success), error, "FirebasePlugin", "activateFetched", []); +}; + +exports.fetch = function (cacheExpirationSeconds, success, error) { + var args = []; + if (typeof cacheExpirationSeconds === 'number') { + args.push(cacheExpirationSeconds); + } else { + error = success; + success = cacheExpirationSeconds; + } + exec(success, error, "FirebasePlugin", "fetch", args); +}; + +exports.getByteArray = function (key, success, error) { + exec(success, error, "FirebasePlugin", "getByteArray", [key]); +}; + +exports.getValue = function (key, success, error) { + exec(success, error, "FirebasePlugin", "getValue", [key]); +}; + +exports.getInfo = function (success, error) { + exec(success, error, "FirebasePlugin", "getInfo", []); +}; + +exports.setConfigSettings = function (settings, success, error) { + exec(success, error, "FirebasePlugin", "setConfigSettings", [settings]); +}; + +exports.setDefaults = function (defaults, success, error) { + exec(success, error, "FirebasePlugin", "setDefaults", [defaults]); +}; + +exports.startTrace = function (name, success, error) { + exec(success, error, "FirebasePlugin", "startTrace", [name]); +}; + +exports.incrementCounter = function (name, counterNamed, success, error) { + exec(success, error, "FirebasePlugin", "incrementCounter", [name, counterNamed]); +}; + +exports.stopTrace = function (name, success, error) { + exec(success, error, "FirebasePlugin", "stopTrace", [name]); +}; + +exports.setPerformanceCollectionEnabled = function (enabled, success, error) { + exec(success, error, "FirebasePlugin", "setPerformanceCollectionEnabled", [!!enabled]); +}; + +exports.isPerformanceCollectionEnabled = function (success, error) { + exec(success, error, "FirebasePlugin", "isPerformanceCollectionEnabled", []); +}; + +exports.clearAllNotifications = function (success, error) { + exec(success, error, "FirebasePlugin", "clearAllNotifications", []); +}; + + +// Crashlytics +exports.setCrashlyticsCollectionEnabled = function (enabled, success, error) { + exec(success, error, "FirebasePlugin", "setCrashlyticsCollectionEnabled", [!!enabled]); +}; + +exports.isCrashlyticsCollectionEnabled = function (success, error) { + exec(success, error, "FirebasePlugin", "isCrashlyticsCollectionEnabled", []); +}; + +exports.logMessage = function (message, success, error) { + exec(success, error, "FirebasePlugin", "logMessage", [message]); +}; + +exports.sendCrash = function (success, error) { + exec(success, error, "FirebasePlugin", "sendCrash", []); +}; + +exports.logError = function (message, stackTrace, success, error) { + var args = [message]; + // "stackTrace" is an optional arg that's an array of objects. + if (stackTrace) { + if (typeof stackTrace === 'function') { + error = success; + success = stackTrace; + } else { + args.push(stackTrace); + } + } + exec(success, error, "FirebasePlugin", "logError", args); +}; + +exports.setCrashlyticsUserId = function (userId, success, error) { + exec(success, error, "FirebasePlugin", "setCrashlyticsUserId", [userId]); +}; + + +// Authentication +exports.verifyPhoneNumber = function (success, error, number, timeOutDuration, fakeVerificationCode) { + exec(function(credential){ + if(typeof credential === 'object'){ + credential.instantVerification = ensureBoolean(credential.instantVerification); + } + success(credential); + }, error, "FirebasePlugin", "verifyPhoneNumber", [number, timeOutDuration, fakeVerificationCode]); +}; + +exports.createUserWithEmailAndPassword = function (email, password, success, error) { + exec(success, error, "FirebasePlugin", "createUserWithEmailAndPassword", [email, password]); +}; + +exports.signInUserWithEmailAndPassword = function (email, password, success, error) { + exec(success, error, "FirebasePlugin", "signInUserWithEmailAndPassword", [email, password]); +}; + +exports.signInUserWithCustomToken = function (customToken, success, error) { + exec(success, error, "FirebasePlugin", "signInUserWithCustomToken", [customToken]); +}; + +exports.signInUserAnonymously = function (success, error) { + exec(success, error, "FirebasePlugin", "signInUserAnonymously"); +}; + +exports.authenticateUserWithGoogle = function (clientId, success, error) { + exec(success, error, "FirebasePlugin", "authenticateUserWithGoogle", [clientId]); +}; + +exports.authenticateUserWithApple = function (success, error, locale) { + exec(success, error, "FirebasePlugin", "authenticateUserWithApple", [locale]); +}; + +exports.signInWithCredential = function (credential, success, error) { + if(typeof credential !== 'object') return error("'credential' must be an object"); + exec(success, error, "FirebasePlugin", "signInWithCredential", [credential]); +}; + +exports.linkUserWithCredential = function (credential, success, error) { + if(typeof credential !== 'object') return error("'credential' must be an object"); + exec(success, error, "FirebasePlugin", "linkUserWithCredential", [credential]); +}; + +exports.reauthenticateWithCredential = function (credential, success, error) { + if(typeof credential !== 'object') return error("'credential' must be an object"); + exec(success, error, "FirebasePlugin", "reauthenticateWithCredential", [credential]); +}; + +exports.isUserSignedIn = function (success, error) { + exec(ensureBooleanFn(success), error, "FirebasePlugin", "isUserSignedIn", []); +}; + +exports.signOutUser = function (success, error) { + exec(ensureBooleanFn(success), error, "FirebasePlugin", "signOutUser", []); +}; + + +exports.getCurrentUser = function (success, error) { + exec(function(user){ + user.emailIsVerified = ensureBoolean(user.emailIsVerified); + success(user); + }, error, "FirebasePlugin", "getCurrentUser", []); +}; + +exports.reloadCurrentUser = function (success, error) { + exec(function(user){ + user.emailIsVerified = ensureBoolean(user.emailIsVerified); + success(user); + }, error, "FirebasePlugin", "reloadCurrentUser", []); +}; + +exports.updateUserProfile = function (profile, success, error) { + if(typeof profile !== 'object') return error("'profile' must be an object with keys 'name' and/or 'photoUri'"); + exec(success, error, "FirebasePlugin", "updateUserProfile", [profile]); +}; + +exports.updateUserEmail = function (email, success, error) { + if(typeof email !== 'string' || !email) return error("'email' must be a valid email address"); + exec(success, error, "FirebasePlugin", "updateUserEmail", [email]); +}; + +exports.sendUserEmailVerification = function (success, error) { + exec(success, error, "FirebasePlugin", "sendUserEmailVerification", []); +}; + +exports.updateUserPassword = function (password, success, error) { + if(typeof password !== 'string' || !password) return error("'password' must be a valid string"); + exec(success, error, "FirebasePlugin", "updateUserPassword", [password]); +}; + +exports.sendUserPasswordResetEmail = function (email, success, error) { + if(typeof email !== 'string' || !email) return error("'email' must be a valid email address"); + exec(success, error, "FirebasePlugin", "sendUserPasswordResetEmail", [email]); +}; + +exports.deleteUser = function (success, error) { + exec(success, error, "FirebasePlugin", "deleteUser", []); +}; + +exports.registerAuthStateChangeListener = function(fn){ + if(typeof fn !== "function") throw "The specified argument must be a function"; + onAuthStateChangeCallback = fn; +}; + +// Firestore +exports.addDocumentToFirestoreCollection = function (document, collection, success, error) { + if(typeof collection !== 'string') return error("'collection' must be a string specifying the Firestore collection name"); + if(typeof document !== 'object' || typeof document.length === 'number') return error("'document' must be an object specifying record data"); + + exec(success, error, "FirebasePlugin", "addDocumentToFirestoreCollection", [document, collection]); +}; + +exports.setDocumentInFirestoreCollection = function (documentId, document, collection, success, error) { + if(typeof documentId !== 'string' && typeof documentId !== 'number') return error("'documentId' must be a string or number specifying the Firestore document identifier"); + if(typeof collection !== 'string') return error("'collection' must be a string specifying the Firestore collection name"); + if(typeof document !== 'object' || typeof document.length === 'number') return error("'document' must be an object specifying record data"); + + exec(success, error, "FirebasePlugin", "setDocumentInFirestoreCollection", [documentId.toString(), document, collection]); +}; + +exports.updateDocumentInFirestoreCollection = function (documentId, document, collection, success, error) { + if(typeof documentId !== 'string' && typeof documentId !== 'number') return error("'documentId' must be a string or number specifying the Firestore document identifier"); + if(typeof collection !== 'string') return error("'collection' must be a string specifying the Firestore collection name"); + if(typeof document !== 'object' || typeof document.length === 'number') return error("'document' must be an object specifying record data"); + + exec(success, error, "FirebasePlugin", "updateDocumentInFirestoreCollection", [documentId.toString(), document, collection]); +}; + +exports.deleteDocumentFromFirestoreCollection = function (documentId, collection, success, error) { + if(typeof documentId !== 'string' && typeof documentId !== 'number') return error("'documentId' must be a string or number specifying the Firestore document identifier"); + if(typeof collection !== 'string') return error("'collection' must be a string specifying the Firestore collection name"); + + exec(success, error, "FirebasePlugin", "deleteDocumentFromFirestoreCollection", [documentId.toString(), collection]); +}; + +exports.documentExistsInFirestoreCollection = function (documentId, collection, success, error) { + if(typeof documentId !== 'string' && typeof documentId !== 'number') return error("'documentId' must be a string or number specifying the Firestore document identifier"); + if(typeof collection !== 'string') return error("'collection' must be a string specifying the Firestore collection name"); + + exec(ensureBooleanFn(success), error, "FirebasePlugin", "documentExistsInFirestoreCollection", [documentId.toString(), collection]); +}; + +exports.fetchDocumentInFirestoreCollection = function (documentId, collection, success, error) { + if(typeof documentId !== 'string' && typeof documentId !== 'number') return error("'documentId' must be a string or number specifying the Firestore document identifier"); + if(typeof collection !== 'string') return error("'collection' must be a string specifying the Firestore collection name"); + + exec(success, error, "FirebasePlugin", "fetchDocumentInFirestoreCollection", [documentId.toString(), collection]); +}; + +exports.fetchFirestoreCollection = function (collection, filters, success, error) { + if(typeof collection !== 'string') return error("'collection' must be a string specifying the Firestore collection name"); + if(filters && (typeof filters !== 'object' || typeof filters.length === 'undefined')) return error("'filters' must be a array specifying a list of filters to apply to documents in the Firestore collection"); + exec(success, error, "FirebasePlugin", "fetchFirestoreCollection", [collection, filters || []]); +}; + +}); diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Coordinates.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Coordinates.js index 4a995077..ff1003be 100644 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Coordinates.js +++ b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Coordinates.js @@ -31,7 +31,7 @@ cordova.define("cordova-plugin-geolocation.Coordinates", function(require, expor * @param {Object} altacc * @constructor */ -var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { +var Coordinates = function (lat, lng, alt, acc, head, vel, altacc) { /** * The latitude of the position. */ diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Position.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Position.js index 97c6c2e3..22d47b83 100644 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Position.js +++ b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/Position.js @@ -22,7 +22,7 @@ cordova.define("cordova-plugin-geolocation.Position", function(require, exports, var Coordinates = require('./Coordinates'); -var Position = function(coords, timestamp) { +var Position = function (coords, timestamp) { if (coords) { this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy); } else { diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/PositionError.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/PositionError.js index c26dd754..e5ceeea0 100644 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/PositionError.js +++ b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/PositionError.js @@ -27,7 +27,7 @@ cordova.define("cordova-plugin-geolocation.PositionError", function(require, exp * @param code * @param message */ -var PositionError = function(code, message) { +var PositionError = function (code, message) { this.code = code || null; this.message = message || ''; }; diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/geolocation.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/geolocation.js index 50f1f953..465d90b8 100644 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/geolocation.js +++ b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-geolocation/www/geolocation.js @@ -20,16 +20,16 @@ cordova.define("cordova-plugin-geolocation.geolocation", function(require, expor * */ -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'), - PositionError = require('./PositionError'), - Position = require('./Position'); +var argscheck = require('cordova/argscheck'); +var utils = require('cordova/utils'); +var exec = require('cordova/exec'); +var PositionError = require('./PositionError'); +var Position = require('./Position'); -var timers = {}; // list of timers in use +var timers = {}; // list of timers in use // Returns default params, overrides if provided with values -function parseParameters(options) { +function parseParameters (options) { var opt = { maximumAge: 0, enableHighAccuracy: false, @@ -56,20 +56,20 @@ function parseParameters(options) { } // Returns a timeout failure, closed over a specified timeout value and error callback. -function createTimeout(errorCallback, timeout) { - var t = setTimeout(function() { +function createTimeout (errorCallback, timeout) { + var t = setTimeout(function () { clearTimeout(t); t = null; errorCallback({ - code:PositionError.TIMEOUT, - message:"Position retrieval timed out." + code: PositionError.TIMEOUT, + message: 'Position retrieval timed out.' }); }, timeout); return t; } var geolocation = { - lastPosition:null, // reference to last known (cached) position returned + lastPosition: null, // reference to last known (cached) position returned /** * Asynchronously acquires the current position. * @@ -77,15 +77,15 @@ var geolocation = { * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) */ - getCurrentPosition:function(successCallback, errorCallback, options) { + getCurrentPosition: function (successCallback, errorCallback, options) { argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); options = parseParameters(options); // Timer var that will fire an error callback if no position is retrieved from native // before the "timeout" param provided expires - var timeoutTimer = {timer:null}; + var timeoutTimer = {timer: null}; - var win = function(p) { + var win = function (p) { clearTimeout(timeoutTimer.timer); if (!(timeoutTimer.timer)) { // Timeout already happened, or native fired error callback for @@ -95,20 +95,20 @@ var geolocation = { } var pos = new Position( { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy + latitude: p.latitude, + longitude: p.longitude, + altitude: p.altitude, + accuracy: p.accuracy, + heading: p.heading, + velocity: p.velocity, + altitudeAccuracy: p.altitudeAccuracy }, p.timestamp ); geolocation.lastPosition = pos; successCallback(pos); }; - var fail = function(e) { + var fail = function (e) { clearTimeout(timeoutTimer.timer); timeoutTimer.timer = null; var err = new PositionError(e.code, e.message); @@ -124,8 +124,8 @@ var geolocation = { // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. } else if (options.timeout === 0) { fail({ - code:PositionError.TIMEOUT, - message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." + code: PositionError.TIMEOUT, + message: "timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." }); // Otherwise we have to call into native to retrieve a position. } else { @@ -140,7 +140,7 @@ var geolocation = { // always truthy before we call into native timeoutTimer.timer = true; } - exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); + exec(win, fail, 'Geolocation', 'getLocation', [options.enableHighAccuracy, options.maximumAge]); } return timeoutTimer; }, @@ -153,7 +153,7 @@ var geolocation = { * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) * @return String The watch id that must be passed to #clearWatch to stop watching. */ - watchPosition:function(successCallback, errorCallback, options) { + watchPosition: function (successCallback, errorCallback, options) { argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); options = parseParameters(options); @@ -162,7 +162,7 @@ var geolocation = { // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); - var fail = function(e) { + var fail = function (e) { clearTimeout(timers[id].timer); var err = new PositionError(e.code, e.message); if (errorCallback) { @@ -170,20 +170,20 @@ var geolocation = { } }; - var win = function(p) { + var win = function (p) { clearTimeout(timers[id].timer); if (options.timeout !== Infinity) { timers[id].timer = createTimeout(fail, options.timeout); } var pos = new Position( { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy + latitude: p.latitude, + longitude: p.longitude, + altitude: p.altitude, + accuracy: p.accuracy, + heading: p.heading, + velocity: p.velocity, + altitudeAccuracy: p.altitudeAccuracy }, p.timestamp ); @@ -191,7 +191,7 @@ var geolocation = { successCallback(pos); }; - exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); + exec(win, fail, 'Geolocation', 'addWatch', [id, options.enableHighAccuracy]); return id; }, @@ -200,11 +200,11 @@ var geolocation = { * * @param {String} id The ID of the watch returned from #watchPosition */ - clearWatch:function(id) { + clearWatch: function (id) { if (id && timers[id] !== undefined) { clearTimeout(timers[id].timer); timers[id].timer = false; - exec(null, null, "Geolocation", "clearWatch", [id]); + exec(null, null, 'Geolocation', 'clearWatch', [id]); } } }; diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-inappbrowser/www/inappbrowser.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-inappbrowser/www/inappbrowser.js deleted file mode 100644 index 3e87a6e7..00000000 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-inappbrowser/www/inappbrowser.js +++ /dev/null @@ -1,114 +0,0 @@ -cordova.define("cordova-plugin-inappbrowser.inappbrowser", function(require, exports, module) { -/* - * - * 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. - * -*/ - -(function() { - // special patch to correctly work on Ripple emulator (CB-9760) - if (window.parent && !!window.parent.ripple) { // https://gist.github.com/triceam/4658021 - module.exports = window.open.bind(window); // fallback to default window.open behaviour - return; - } - - var exec = require('cordova/exec'); - var channel = require('cordova/channel'); - var modulemapper = require('cordova/modulemapper'); - var urlutil = require('cordova/urlutil'); - - function InAppBrowser() { - this.channels = { - 'loadstart': channel.create('loadstart'), - 'loadstop' : channel.create('loadstop'), - 'loaderror' : channel.create('loaderror'), - 'exit' : channel.create('exit') - }; - } - - InAppBrowser.prototype = { - _eventHandler: function (event) { - if (event && (event.type in this.channels)) { - this.channels[event.type].fire(event); - } - }, - close: function (eventname) { - exec(null, null, "InAppBrowser", "close", []); - }, - show: function (eventname) { - exec(null, null, "InAppBrowser", "show", []); - }, - addEventListener: function (eventname,f) { - if (eventname in this.channels) { - this.channels[eventname].subscribe(f); - } - }, - removeEventListener: function(eventname, f) { - if (eventname in this.channels) { - this.channels[eventname].unsubscribe(f); - } - }, - - executeScript: function(injectDetails, cb) { - if (injectDetails.code) { - exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]); - } else if (injectDetails.file) { - exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]); - } else { - throw new Error('executeScript requires exactly one of code or file to be specified'); - } - }, - - insertCSS: function(injectDetails, cb) { - if (injectDetails.code) { - exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]); - } else if (injectDetails.file) { - exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]); - } else { - throw new Error('insertCSS requires exactly one of code or file to be specified'); - } - } - }; - - module.exports = function(strUrl, strWindowName, strWindowFeatures, callbacks) { - // Don't catch calls that write to existing frames (e.g. named iframes). - if (window.frames && window.frames[strWindowName]) { - var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open'); - return origOpenFunc.apply(window, arguments); - } - - strUrl = urlutil.makeAbsolute(strUrl); - var iab = new InAppBrowser(); - - callbacks = callbacks || {}; - for (var callbackName in callbacks) { - iab.addEventListener(callbackName, callbacks[callbackName]); - } - - var cb = function(eventname) { - iab._eventHandler(eventname); - }; - - strWindowFeatures = strWindowFeatures || ""; - - exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); - return iab; - }; -})(); - -}); diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-ionic-keyboard/www/ios/keyboard.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-ionic-keyboard/www/ios/keyboard.js new file mode 100644 index 00000000..50e3ea9d --- /dev/null +++ b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-ionic-keyboard/www/ios/keyboard.js @@ -0,0 +1,105 @@ +cordova.define("cordova-plugin-ionic-keyboard.keyboard", function(require, exports, module) { +/* + * + * 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. + * + */ + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +var Keyboard = function () {}; + +Keyboard.fireOnShow = function (height) { + Keyboard.isVisible = true; + cordova.fireWindowEvent('keyboardDidShow', { + 'keyboardHeight': height + }); + + // To support the keyboardAttach directive listening events + // inside Ionic's main bundle + cordova.fireWindowEvent('native.keyboardshow', { + 'keyboardHeight': height + }); +}; + +Keyboard.fireOnHide = function () { + Keyboard.isVisible = false; + cordova.fireWindowEvent('keyboardDidHide'); + + // To support the keyboardAttach directive listening events + // inside Ionic's main bundle + cordova.fireWindowEvent('native.keyboardhide'); +}; + +Keyboard.fireOnHiding = function () { + cordova.fireWindowEvent('keyboardWillHide'); +}; + +Keyboard.fireOnShowing = function (height) { + cordova.fireWindowEvent('keyboardWillShow', { + 'keyboardHeight': height + }); +}; + +Keyboard.fireOnResize = function (height, screenHeight, ele) { + if (!ele) { + return; + } + if (height === 0) { + ele.style.height = null; + } else { + ele.style.height = (screenHeight - height) + 'px'; + } +}; + +Keyboard.hideFormAccessoryBar = function (hide, success) { + if (hide !== null && hide !== undefined) { + exec(success, null, "CDVIonicKeyboard", "hideFormAccessoryBar", [hide]); + } else { + exec(success, null, "CDVIonicKeyboard", "hideFormAccessoryBar", []); + } +}; + +Keyboard.hide = function () { + exec(null, null, "CDVIonicKeyboard", "hide", []); +}; + +Keyboard.show = function () { + console.warn('Showing keyboard not supported in iOS due to platform limitations.'); + console.warn('Instead, use input.focus(), and ensure that you have the following setting in your config.xml: \n'); + console.warn(' <preference name="KeyboardDisplayRequiresUserAction" value="false"/>\n'); +}; + +Keyboard.disableScroll = function (disable) { + exec(null, null, "CDVIonicKeyboard", "disableScroll", [disable]); +}; + +Keyboard.setResizeMode = function (mode) { + exec(null, null, "CDVIonicKeyboard", "setResizeMode", [mode]); +} + +Keyboard.setKeyboardStyle = function(style) { + exec(null, null, "CDVIonicKeyboard", "keyboardStyle", [style]); +}; + +Keyboard.isVisible = false; + +module.exports = Keyboard; +}); diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-network-information/www/network.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-network-information/www/network.js deleted file mode 100644 index 770e6ba5..00000000 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-network-information/www/network.js +++ /dev/null @@ -1,94 +0,0 @@ -cordova.define("cordova-plugin-network-information.network", function(require, exports, module) { -/* - * 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. - * -*/ - -var exec = require('cordova/exec'), - cordova = require('cordova'), - channel = require('cordova/channel'), - utils = require('cordova/utils'); - -// Link the onLine property with the Cordova-supplied network info. -// This works because we clobber the navigator object with our own -// object in bootstrap.js. -// Browser platform do not need to define this property, because -// it is already supported by modern browsers -if (cordova.platformId !== 'browser' && typeof navigator != 'undefined') { - utils.defineGetter(navigator, 'onLine', function() { - return this.connection.type != 'none'; - }); -} - -function NetworkConnection() { - this.type = 'unknown'; -} - -/** - * Get connection info - * - * @param {Function} successCallback The function to call when the Connection data is available - * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL) - */ -NetworkConnection.prototype.getInfo = function(successCallback, errorCallback) { - exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []); -}; - -var me = new NetworkConnection(); -var timerId = null; -var timeout = 500; - -channel.createSticky('onCordovaConnectionReady'); -channel.waitForInitialization('onCordovaConnectionReady'); - -channel.onCordovaReady.subscribe(function() { - me.getInfo(function(info) { - me.type = info; - if (info === "none") { - // set a timer if still offline at the end of timer send the offline event - timerId = setTimeout(function(){ - cordova.fireDocumentEvent("offline"); - timerId = null; - }, timeout); - } else { - // If there is a current offline event pending clear it - if (timerId !== null) { - clearTimeout(timerId); - timerId = null; - } - cordova.fireDocumentEvent("online"); - } - - // should only fire this once - if (channel.onCordovaConnectionReady.state !== 2) { - channel.onCordovaConnectionReady.fire(); - } - }, - function (e) { - // If we can't get the network info we should still tell Cordova - // to fire the deviceready event. - if (channel.onCordovaConnectionReady.state !== 2) { - channel.onCordovaConnectionReady.fire(); - } - console.log("Error initializing Network Connection: " + e); - }); -}); - -module.exports = me; - -}); diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-statusbar/www/statusbar.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-statusbar/www/statusbar.js deleted file mode 100644 index 708186f9..00000000 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-statusbar/www/statusbar.js +++ /dev/null @@ -1,116 +0,0 @@ -cordova.define("cordova-plugin-statusbar.statusbar", function(require, exports, module) { -/* - * - * 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 cordova */ - -var exec = require('cordova/exec'); - -var namedColors = { - "black": "#000000", - "darkGray": "#A9A9A9", - "lightGray": "#D3D3D3", - "white": "#FFFFFF", - "gray": "#808080", - "red": "#FF0000", - "green": "#00FF00", - "blue": "#0000FF", - "cyan": "#00FFFF", - "yellow": "#FFFF00", - "magenta": "#FF00FF", - "orange": "#FFA500", - "purple": "#800080", - "brown": "#A52A2A" -}; - -var StatusBar = { - - isVisible: true, - - overlaysWebView: function (doOverlay) { - exec(null, null, "StatusBar", "overlaysWebView", [doOverlay]); - }, - - styleDefault: function () { - // dark text ( to be used on a light background ) - exec(null, null, "StatusBar", "styleDefault", []); - }, - - styleLightContent: function () { - // light text ( to be used on a dark background ) - exec(null, null, "StatusBar", "styleLightContent", []); - }, - - styleBlackTranslucent: function () { - // #88000000 ? Apple says to use lightContent instead - exec(null, null, "StatusBar", "styleBlackTranslucent", []); - }, - - styleBlackOpaque: function () { - // #FF000000 ? Apple says to use lightContent instead - exec(null, null, "StatusBar", "styleBlackOpaque", []); - }, - - backgroundColorByName: function (colorname) { - return StatusBar.backgroundColorByHexString(namedColors[colorname]); - }, - - backgroundColorByHexString: function (hexString) { - if (hexString.charAt(0) !== "#") { - hexString = "#" + hexString; - } - - if (hexString.length === 4) { - var split = hexString.split(""); - hexString = "#" + split[1] + split[1] + split[2] + split[2] + split[3] + split[3]; - } - - exec(null, null, "StatusBar", "backgroundColorByHexString", [hexString]); - }, - - hide: function () { - exec(null, null, "StatusBar", "hide", []); - StatusBar.isVisible = false; - }, - - show: function () { - exec(null, null, "StatusBar", "show", []); - StatusBar.isVisible = true; - } - -}; - -// prime it. setTimeout so that proxy gets time to init -window.setTimeout(function () { - exec(function (res) { - if (typeof res == 'object') { - if (res.type == 'tap') { - cordova.fireWindowEvent('statusTap'); - } - } else { - StatusBar.isVisible = res; - } - }, null, "StatusBar", "_ready", []); -}, 0); - -module.exports = StatusBar; - -}); diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js deleted file mode 100644 index fe0e83ad..00000000 --- a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js +++ /dev/null @@ -1,124 +0,0 @@ -cordova.define("cordova-plugin-x-socialsharing.SocialSharing", function(require, exports, module) { -function SocialSharing() { -} - -// Override this method (after deviceready) to set the location where you want the iPad popup arrow to appear. -// If not overridden with different values, the popup is not used. Example: -// -// window.plugins.socialsharing.iPadPopupCoordinates = function() { -// return "100,100,200,300"; -// }; -SocialSharing.prototype.iPadPopupCoordinates = function () { - // left,top,width,height - return "-1,-1,-1,-1"; -}; - -SocialSharing.prototype.setIPadPopupCoordinates = function (coords) { - // left,top,width,height - cordova.exec(function() {}, this._getErrorCallback(function() {}, "setIPadPopupCoordinates"), "SocialSharing", "setIPadPopupCoordinates", [coords]); -}; - -SocialSharing.prototype.available = function (callback) { - cordova.exec(function (avail) { - callback(avail ? true : false); - }, null, "SocialSharing", "available", []); -}; - -// this is the recommended way to share as it is the most feature-rich with respect to what you pass in and get back -SocialSharing.prototype.shareWithOptions = function (options, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareWithOptions"), "SocialSharing", "shareWithOptions", [options]); -}; - -SocialSharing.prototype.share = function (message, subject, fileOrFileArray, url, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "share"), "SocialSharing", "share", [message, subject, this._asArray(fileOrFileArray), url]); -}; - -SocialSharing.prototype.shareViaTwitter = function (message, file /* multiple not allowed by twitter */, url, successCallback, errorCallback) { - var fileArray = this._asArray(file); - var ecb = this._getErrorCallback(errorCallback, "shareViaTwitter"); - if (fileArray.length > 1) { - ecb("shareViaTwitter supports max one file"); - } else { - cordova.exec(successCallback, ecb, "SocialSharing", "shareViaTwitter", [message, null, fileArray, url]); - } -}; - -SocialSharing.prototype.shareViaFacebook = function (message, fileOrFileArray, url, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaFacebook"), "SocialSharing", "shareViaFacebook", [message, null, this._asArray(fileOrFileArray), url]); -}; - -SocialSharing.prototype.shareViaFacebookWithPasteMessageHint = function (message, fileOrFileArray, url, pasteMessageHint, successCallback, errorCallback) { - pasteMessageHint = pasteMessageHint || "If you like you can paste a message from your clipboard"; - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaFacebookWithPasteMessageHint"), "SocialSharing", "shareViaFacebookWithPasteMessageHint", [message, null, this._asArray(fileOrFileArray), url, pasteMessageHint]); -}; - -SocialSharing.prototype.shareViaWhatsApp = function (message, fileOrFileArray, url, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaWhatsApp"), "SocialSharing", "shareViaWhatsApp", [message, null, this._asArray(fileOrFileArray), url, null]); -}; - -SocialSharing.prototype.shareViaWhatsAppToReceiver = function (receiver, message, fileOrFileArray, url, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaWhatsAppToReceiver"), "SocialSharing", "shareViaWhatsApp", [message, null, this._asArray(fileOrFileArray), url, receiver]); -}; - -SocialSharing.prototype.shareViaSMS = function (options, phonenumbers, successCallback, errorCallback) { - var opts = options; - if (typeof options == "string") { - opts = {"message":options}; // for backward compatibility as the options param used to be the message - } - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaSMS"), "SocialSharing", "shareViaSMS", [opts, phonenumbers]); -}; - -SocialSharing.prototype.shareViaEmail = function (message, subject, toArray, ccArray, bccArray, fileOrFileArray, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaEmail"), "SocialSharing", "shareViaEmail", [message, subject, this._asArray(toArray), this._asArray(ccArray), this._asArray(bccArray), this._asArray(fileOrFileArray)]); -}; - -SocialSharing.prototype.canShareVia = function (via, message, subject, fileOrFileArray, url, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "canShareVia"), "SocialSharing", "canShareVia", [message, subject, this._asArray(fileOrFileArray), url, via]); -}; - -SocialSharing.prototype.canShareViaEmail = function (successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "canShareViaEmail"), "SocialSharing", "canShareViaEmail", []); -}; - -SocialSharing.prototype.shareViaInstagram = function (message, fileOrFileArray, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaInstagram"), "SocialSharing", "shareViaInstagram", [message, null, this._asArray(fileOrFileArray), null]); -}; - -SocialSharing.prototype.shareVia = function (via, message, subject, fileOrFileArray, url, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareVia"), "SocialSharing", "shareVia", [message, subject, this._asArray(fileOrFileArray), url, via]); -}; - -SocialSharing.prototype.saveToPhotoAlbum = function (fileOrFileArray, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "saveToPhotoAlbum"), "SocialSharing", "saveToPhotoAlbum", [this._asArray(fileOrFileArray)]); -}; - -SocialSharing.prototype._asArray = function (param) { - if (param == null) { - param = []; - } else if (typeof param === 'string') { - param = new Array(param); - } - return param; -}; - -SocialSharing.prototype._getErrorCallback = function (ecb, functionName) { - if (typeof ecb === 'function') { - return ecb; - } else { - return function (result) { - console.log("The injected error callback of '" + functionName + "' received: " + JSON.stringify(result)); - } - } -}; - -SocialSharing.install = function () { - if (!window.plugins) { - window.plugins = {}; - } - - window.plugins.socialsharing = new SocialSharing(); - return window.plugins.socialsharing; -}; - -cordova.addConstructor(SocialSharing.install); -}); diff --git a/StoneIsland/platforms/ios/www/plugins/ionic-plugin-keyboard/www/ios/keyboard.js b/StoneIsland/platforms/ios/www/plugins/ionic-plugin-keyboard/www/ios/keyboard.js deleted file mode 100644 index c74bb4d6..00000000 --- a/StoneIsland/platforms/ios/www/plugins/ionic-plugin-keyboard/www/ios/keyboard.js +++ /dev/null @@ -1,43 +0,0 @@ -cordova.define("ionic-plugin-keyboard.keyboard", function(require, exports, module) { - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'); - - -var Keyboard = function() { -}; - -Keyboard.hideKeyboardAccessoryBar = function(hide) { - exec(null, null, "Keyboard", "hideKeyboardAccessoryBar", [hide]); -}; - -Keyboard.close = function() { - exec(null, null, "Keyboard", "close", []); -}; - -Keyboard.show = function() { - console.warn('Showing keyboard not supported in iOS due to platform limitations.') - console.warn('Instead, use input.focus(), and ensure that you have the following setting in your config.xml: \n'); - console.warn(' <preference name="KeyboardDisplayRequiresUserAction" value="false"/>\n'); - // exec(null, null, "Keyboard", "show", []); -}; - -Keyboard.disableScroll = function(disable) { - exec(null, null, "Keyboard", "disableScroll", [disable]); -}; - -/* -Keyboard.styleDark = function(dark) { - exec(null, null, "Keyboard", "styleDark", [dark]); -}; -*/ - -Keyboard.isVisible = false; - -module.exports = Keyboard; - - - - -}); diff --git a/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-mobile-accessibility/www/MobileAccessibilityNotifications.js b/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-mobile-accessibility/www/MobileAccessibilityNotifications.js deleted file mode 100644 index f5d0aaf7..00000000 --- a/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-mobile-accessibility/www/MobileAccessibilityNotifications.js +++ /dev/null @@ -1,53 +0,0 @@ -cordova.define("phonegap-plugin-mobile-accessibility.MobileAccessibilityNotifications", function(require, exports, module) { -/* - * - * 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. - * -*/ - -/** - * Mobile Accessibility Notification event constants - */ -module.exports = { - /* MobileAccessibility window events */ - SCREEN_READER_STATUS_CHANGED : "screenreaderstatuschanged", - CLOSED_CAPTIONING_STATUS_CHANGED : "closedcaptioningstatuschanged", - GUIDED_ACCESS_STATUS_CHANGED : "guidedaccessstatuschanged", - INVERT_COLORS_STATUS_CHANGED : "invertcolorsstatuschanged", - MONO_AUDIO_STATUS_CHANGED : "monoaudiostatuschanged", - REDUCE_MOTION_STATUS_CHANGED : "reducemotionstatuschanged", - TOUCH_EXPLORATION_STATUS_CHANGED : "touchexplorationstatechanged", - BOLD_TEXT_STATUS_CHANGED : "boldtextstatuschanged", - DARKER_SYSTEM_COLORS_STATUS_CHANGED : "darkersystemcolorsstatuschanged", - GRAYSCALE_STATUS_CHANGED : "grayscalestatuschanged", - REDUCE_TRANSPARENCY_STATUS_CHANGED : "reducetransparencystatuschanged", - SPEAK_SCREEN_STATUS_CHANGED : "speakscreenstatuschanged", - SPEAK_SELECTION_STATUS_CHANGED : "speakselectionstatuschanged", - SWITCH_CONTROL_STATUS_CHANGED : "switchcontrolstatuschanged", - - /* iOS specific UIAccessibilityNotifications */ - SCREEN_CHANGED : 1000, - LAYOUT_CHANGED : 1001, - ANNOUNCEMENT : 1008, - PAGE_SCROLLED : 1009, - - /* Windows specific high contrast event */ - HIGH_CONTRAST_CHANGED : "highcontrastchanged" -}; - -}); diff --git a/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-mobile-accessibility/www/mobile-accessibility.js b/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-mobile-accessibility/www/mobile-accessibility.js deleted file mode 100644 index 852b8d34..00000000 --- a/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-mobile-accessibility/www/mobile-accessibility.js +++ /dev/null @@ -1,502 +0,0 @@ -cordova.define("phonegap-plugin-mobile-accessibility.mobile-accessibility", function(require, exports, module) { -/** - * - * 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. - * -*/ - -var argscheck = require('cordova/argscheck'), - utils = require('cordova/utils'), - exec = require('cordova/exec'), - device = require('cordova-plugin-device.device'), - network = require('cordova-plugin-network-information.network'), - connection = require('cordova-plugin-network-information.Connection'), - MobileAccessibilityNotifications = require('phonegap-plugin-mobile-accessibility.MobileAccessibilityNotifications'); - -var MobileAccessibility = function() { - this._isBoldTextEnabled = false; - this._isClosedCaptioningEnabled = false; - this._isDarkerSystemColorsEnabled = false; - this._isGrayscaleEnabled = false; - this._isGuidedAccessEnabled = false; - this._isInvertColorsEnabled = false; - this._isMonoAudioEnabled = false; - this._isReduceMotionEnabled = false; - this._isReduceTransparencyEnabled = false; - this._isScreenReaderRunning = false; - this._isSpeakScreenEnabled = false; - this._isSpeakSelectionEnabled = false; - this._isSwitchControlRunning = false; - this._isTouchExplorationEnabled = false; - this._usePreferredTextZoom = false; - this._isHighContrastEnabled = false; - this._highContrastScheme = undefined; - - // Create new event handlers on the window (returns a channel instance) - this.channels = { - boldtextstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.BOLD_TEXT_STATUS_CHANGED), - closedcaptioningstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.CLOSED_CAPTIONING_STATUS_CHANGED), - darkersystemcolorsstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.DARKER_SYSTEM_COLORS_STATUS_CHANGED), - grayscalestatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.GRAYSCALE_STATUS_CHANGED), - guidedaccessstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.GUIDED_ACCESS_STATUS_CHANGED), - invertcolorsstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.INVERT_COLORS_STATUS_CHANGED), - monoaudiostatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.MONO_AUDIO_STATUS_CHANGED), - reducemotionstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.REDUCE_MOTION_STATUS_CHANGED), - reducetransparencystatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.REDUCE_TRANSPARENCY_STATUS_CHANGED), - screenreaderstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.SCREEN_READER_STATUS_CHANGED), - speakscreenstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.SPEAK_SCREEN_STATUS_CHANGED), - speakselectionstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.SPEAK_SELECTION_STATUS_CHANGED), - switchcontrolstatuschanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.SWITCH_CONTROL_STATUS_CHANGED), - touchexplorationstatechanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.TOUCH_EXPLORATION_STATUS_CHANGED), - highcontrastchanged : cordova.addWindowEventHandler(MobileAccessibilityNotifications.HIGH_CONTRAST_CHANGED) - }; - for (var key in this.channels) { - this.channels[key].onHasSubscribersChange = MobileAccessibility.onHasSubscribersChange; - } -}; - -/** - * @private - * @ignore - */ -function handlers() { - return mobileAccessibility.channels.boldtextstatuschanged.numHandlers + - mobileAccessibility.channels.closedcaptioningstatuschanged.numHandlers + - mobileAccessibility.channels.darkersystemcolorsstatuschanged.numHandlers + - mobileAccessibility.channels.grayscalestatuschanged.numHandlers + - mobileAccessibility.channels.guidedaccessstatuschanged.numHandlers + - mobileAccessibility.channels.invertcolorsstatuschanged.numHandlers + - mobileAccessibility.channels.monoaudiostatuschanged.numHandlers + - mobileAccessibility.channels.reducemotionstatuschanged.numHandlers + - mobileAccessibility.channels.reducetransparencystatuschanged.numHandlers + - mobileAccessibility.channels.screenreaderstatuschanged.numHandlers + - mobileAccessibility.channels.speakscreenstatuschanged.numHandlers + - mobileAccessibility.channels.speakselectionstatuschanged.numHandlers + - mobileAccessibility.channels.switchcontrolstatuschanged.numHandlers + - mobileAccessibility.channels.touchexplorationstatechanged.numHandlers + - mobileAccessibility.channels.highcontrastchanged.numHandlers; -}; - -/** - * - * Event handlers for when callback methods get registered for mobileAccessibility. - * Keep track of how many handlers we have so we can start and stop the native MobileAccessibility listener - * appropriately. - * @private - * @ignore - */ -MobileAccessibility.onHasSubscribersChange = function() { - // If we just registered the first handler, make sure native listener is started. - if (this.numHandlers === 1 && handlers() === 1) { - exec(mobileAccessibility._status, mobileAccessibility._error, "MobileAccessibility", "start", []); - } else if (handlers() === 0) { - exec(null, null, "MobileAccessibility", "stop", []); - } -}; - -/** - * Asynchronous call to native MobileAccessibility determine if a screen reader is running. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isScreenReaderRunning = function(callback) { - exec(function(bool) { - mobileAccessibility.activateOrDeactivateChromeVox(bool); - callback(Boolean(bool)); - }, null, "MobileAccessibility", "isScreenReaderRunning", []); -}; -MobileAccessibility.prototype.isVoiceOverRunning = function(callback) { - if (device.platform.toLowerCase() === "ios") { - MobileAccessibility.prototype.isScreenReaderRunning(callback); - } else { - callback(false); - } -}; -MobileAccessibility.prototype.isTalkBackRunning = function(callback) { - if (device.platform.toLowerCase() === "android" || device.platform.toLowerCase() === "amazon-fireos") { - MobileAccessibility.prototype.isScreenReaderRunning(callback); - } else { - callback(false); - } -}; -MobileAccessibility.prototype.isChromeVoxActive = function () { - return typeof cvox !== "undefined" && cvox.ChromeVox.host.ttsLoaded() && cvox.Api.isChromeVoxActive(); -}; -MobileAccessibility.prototype.activateOrDeactivateChromeVox = function(bool) { - if (device.platform !== "Android") return; - if (typeof cvox === "undefined") { - if (bool) { - console.warn('A screen reader is running but ChromeVox has failed to initialize.'); - if (navigator.connection.type === Connection.UNKNOWN || navigator.connection.type === Connection.NONE) { - mobileAccessibility.injectLocalAndroidVoxScript(); - } - } - } else { - // activate or deactivate ChromeVox based on whether or not or not the screen reader is running. - try { - cvox.ChromeVox.host.activateOrDeactivateChromeVox(bool); - } catch (err) { - console.error(err); - } - } - - if (bool) { - if (!mobileAccessibility.hasOrientationChangeListener) { - window.addEventListener("orientationchange", mobileAccessibility.onOrientationChange); - mobileAccessibility.hasOrientationChangeListener = true; - } - } else if(mobileAccessibility.hasOrientationChangeListener) { - window.removeEventListener("orientationchange", mobileAccessibility.onOrientationChange); - mobileAccessibility.hasOrientationChangeListener = false; - } -}; - -MobileAccessibility.prototype.hasOrientationChangeListener = false; -MobileAccessibility.prototype.onOrientationChange = function(event) { - if (!mobileAccessibility.isChromeVoxActive()) return; - cvox.ChromeVox.navigationManager.updateIndicator(); -}; - -MobileAccessibility.prototype.scriptInjected = false; -MobileAccessibility.prototype.injectLocalAndroidVoxScript = function() { - var versionsplit = device.version.split('.'); - if (device.platform !== "Android" || - !(versionsplit[0] > 4 || (versionsplit[0] == 4 && versionsplit[1] >= 1)) || - typeof cvox !== "undefined" || mobileAccessibility.scriptInjected) return; - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.async = true; - script.onload = function(){ - // console.log(this.src + ' has loaded'); - if (mobileAccessibility.isChromeVoxActive()) { - cordova.fireWindowEvent("screenreaderstatuschanged", { - isScreenReaderRunning: true - }); - } - }; - - script.src = (versionsplit[0] > 4 || versionsplit[1] > 3) - ? "plugins/com.phonegap.plugin.mobile-accessibility/android/chromeandroidvox.js" - : "plugins/com.phonegap.plugin.mobile-accessibility/android/AndroidVox_v1.js"; - document.getElementsByTagName('head')[0].appendChild(script); - mobileAccessibility.scriptInjected = true; -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Bold Text is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isBoldTextEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isBoldTextEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Closed Captioning is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isClosedCaptioningEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isClosedCaptioningEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Darker System Colors are enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isDarkerSystemColorsEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isDarkerSystemColorsEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Grayscale is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isGrayscaleEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isGrayscaleEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Guided Access is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isGuidedAccessEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isGuidedAccessEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if the display colors have been inverted. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isInvertColorsEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isInvertColorsEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Mono Audio is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isMonoAudioEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isMonoAudioEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Reduce Motion is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isReduceMotionEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isReduceMotionEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Reduce Transparency is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isReduceTransparencyEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isReduceTransparencyEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Speak Screen is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isSpeakScreenEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isSpeakScreenEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Speak Selection is enabled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isSpeakSelectionEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isSpeakSelectionEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Switch Control is running. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isSwitchControlRunning = function(callback) { - exec(callback, null, "MobileAccessibility", "isSwitchControlRunning", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if Touch Exploration is enabled on Android. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isTouchExplorationEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isTouchExplorationEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to determine if High Contrast is enabled on Windows. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.isHighContrastEnabled = function(callback) { - exec(callback, null, "MobileAccessibility", "isHighContrastEnabled", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to return the current text zoom percent value for the WebView. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.getTextZoom = function(callback) { - exec(callback, null, "MobileAccessibility", "getTextZoom", []); -}; - -/** - * Asynchronous call to native MobileAccessibility to set the current text zoom percent value for the WebView. - * @param {Number} textZoom A percentage value by which text in the WebView should be scaled. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.setTextZoom = function(textZoom, callback) { - exec(callback, null, "MobileAccessibility", "setTextZoom", [textZoom]); -}; - -/** - * Asynchronous call to native MobileAccessibility to retrieve the user's preferred text zoom from system settings and apply it to the application WebView. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility. - */ -MobileAccessibility.prototype.updateTextZoom = function(callback) { - exec(callback, null, "MobileAccessibility", "updateTextZoom", []); -}; - -MobileAccessibility.prototype.usePreferredTextZoom = function(bool) { - var currentValue = window.localStorage.getItem("MobileAccessibility.usePreferredTextZoom") === "true"; - - if (arguments.length === 0) { - return currentValue; - } - - if (currentValue != bool) { - window.localStorage.setItem("MobileAccessibility.usePreferredTextZoom", bool); - } - - var callback = function(){ - // Wrapping updateTextZoom call in a function to stop - // the event parameter propagation. This fixes an error - // on resume where cordova tried to call apply() on the - // event, expecting a function. - mobileAccessibility.updateTextZoom(); - }; - - document.removeEventListener("resume", callback); - - if (bool) { - // console.log("We should update the text zoom at this point: " + bool) - document.addEventListener("resume", callback, false); - mobileAccessibility.updateTextZoom(); - } else { - mobileAccessibility.setTextZoom(100); - } - - return Boolean(bool); -}; - -MobileAccessibility.prototype.MobileAccessibilityNotifications = MobileAccessibilityNotifications; - -/** - * Posts a notification with a string for a screen reader to announce, if it is running. - * @param {uint} mobileAccessibilityNotification A numeric constant for the type of notification to send. Constants are defined in MobileAccessibility.MobileAccessibilityNotifications. - * @param {string} string A string to be announced by a screen reader. - * @param {function} callback A callback method to receive the asynchronous result from the native MobileAccessibility, when the announcement is finished, the function should expect an object containing the stringValue that was voiced and a boolean indicating that the announcement wasSuccessful. - */ -MobileAccessibility.prototype.postNotification = function(mobileAccessibilityNotification, string, callback) { - exec(callback, null, "MobileAccessibility", "postNotification", [mobileAccessibilityNotification, string]); -}; - -/** - * Speaks the given string, and if ChromeVox is active, it will use the specified queueMode and properties. - * @param {string} string A string to be announced by a screen reader. - * @param {number} [queueMode] Optional number. Valid modes are 0 for flush; 1 for queue. - * @param {Object} [properties] Speech properties to use for this utterance. - */ -MobileAccessibility.prototype.speak = function(string, queueMode, properties) { - if (this.isChromeVoxActive()) { - cvox.ChromeVox.tts.speak(string, queueMode, properties); - } else { - exec(null, null, "MobileAccessibility", "postNotification", [MobileAccessibilityNotifications.ANNOUNCEMENT, string]); - } -} - -/** - * Stops speech. - */ -MobileAccessibility.prototype.stop = function() { - if (this.isChromeVoxActive()) { - cvox.ChromeVox.tts.stop(); - } else { - exec(null, null, "MobileAccessibility", "postNotification", [MobileAccessibilityNotifications.ANNOUNCEMENT, "\u200b"]); - } -} - -/** - * Callback from native MobileAccessibility returning an object which describes the status of MobileAccessibility features. - * - * @param {Object} info - * @config {Boolean} [isBoldTextEnabled] Boolean to indicate bold text status (ios). - * @config {Boolean} [isClosedCaptioningEnabled] Boolean to indicate closed captioning status. - * @config {Boolean} [isDarkerSystemColorsEnabled] Boolean to indicate darker system colors status (ios). - * @config {Boolean} [isGrayscaleEnabled] Boolean to indicate grayscale status (ios). - * @config {Boolean} [isGuidedAccessEnabled] Boolean to indicate guided access status (ios). - * @config {Boolean} [isInvertColorsEnabled] Boolean to indicate invert colors status (ios). - * @config {Boolean} [isMonoAudioEnabled] Boolean to indicate mono audio status (ios). - * @config {Boolean} [isReduceMotionEnabled] Boolean to indicate reduce motion status (ios). - * @config {Boolean} [isReduceTransparencyEnabled] Boolean to indicate reduce transparency status (ios). - * @config {Boolean} [isScreenReaderRunning] Boolean to indicate screen reader status. - * @config {Boolean} [isSpeakScreenEnabled] Boolean to indicate speak screen status (ios). - * @config {Boolean} [isSpeakSelectionEnabled] Boolean to indicate speak selection status (ios). - * @config {Boolean} [isSwitchControlRunning] Boolean to indicate switch control status (ios). - * @config {Boolean} [isTouchExplorationEnabled] Boolean to indicate touch exploration status (android). - */ -MobileAccessibility.prototype._status = function(info) { - if (info) { - mobileAccessibility.activateOrDeactivateChromeVox(info.isScreenReaderRunning); - if (mobileAccessibility._isBoldTextEnabled !== info.isBoldTextEnabled) { - mobileAccessibility._isBoldTextEnabled = info.isBoldTextEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.BOLD_TEXT_STATUS_CHANGED, info); - } - if (mobileAccessibility._isClosedCaptioningEnabled !== info.isClosedCaptioningEnabled) { - mobileAccessibility._isClosedCaptioningEnabled = info.isClosedCaptioningEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.CLOSED_CAPTIONING_STATUS_CHANGED, info); - } - if (mobileAccessibility._isDarkerSystemColorsEnabled !== info.isDarkerSystemColorsEnabled) { - mobileAccessibility._isDarkerSystemColorsEnabled = info.isDarkerSystemColorsEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.DARKER_SYSTEM_COLORS_STATUS_CHANGED, info); - } - if (mobileAccessibility._isGrayscaleEnabled !== info.isGrayscaleEnabled) { - mobileAccessibility._isGrayscaleEnabled = info.isGrayscaleEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.GRAYSCALE_STATUS_CHANGED, info); - } - if (mobileAccessibility._isGuidedAccessEnabled !== info.isGuidedAccessEnabled) { - mobileAccessibility._isGuidedAccessEnabled = info.isGuidedAccessEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.GUIDED_ACCESS_STATUS_CHANGED, info); - } - if (mobileAccessibility._isInvertColorsEnabled !== info.isInvertColorsEnabled) { - mobileAccessibility._isInvertColorsEnabled = info.isInvertColorsEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.INVERT_COLORS_STATUS_CHANGED, info); - } - if (mobileAccessibility._isMonoAudioEnabled !== info.isMonoAudioEnabled) { - mobileAccessibility._isMonoAudioEnabled = info.isMonoAudioEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.MONO_AUDIO_STATUS_CHANGED, info); - } - if (mobileAccessibility._isReduceMotionEnabled !== info.isReduceMotionEnabled) { - mobileAccessibility._isReduceMotionEnabled = info.isReduceMotionEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.REDUCE_MOTION_STATUS_CHANGED, info); - } - if (mobileAccessibility._isReduceTransparencyEnabled !== info.isReduceTransparencyEnabled) { - mobileAccessibility._isReduceTransparencyEnabled = info.isReduceTransparencyEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.REDUCE_TRANSPARENCY_STATUS_CHANGED, info); - } - if (mobileAccessibility._isScreenReaderRunning !== info.isScreenReaderRunning) { - mobileAccessibility._isScreenReaderRunning = info.isScreenReaderRunning; - cordova.fireWindowEvent(MobileAccessibilityNotifications.SCREEN_READER_STATUS_CHANGED, info); - } - if (mobileAccessibility._isSpeakScreenEnabled !== info.isSpeakScreenEnabled) { - mobileAccessibility._isSpeakScreenEnabled = info.isSpeakScreenEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.SPEAK_SCREEN_STATUS_CHANGED, info); - } - if (mobileAccessibility._isSpeakSelectionEnabled !== info.isSpeakSelectionEnabled) { - mobileAccessibility._isSpeakSelectionEnabled = info.isSpeakSelectionEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.SPEAK_SELECTION_STATUS_CHANGED, info); - } - if (mobileAccessibility._isSwitchControlRunning !== info.isSwitchControlRunning) { - mobileAccessibility._isSwitchControlRunning = info.isSwitchControlRunning; - cordova.fireWindowEvent(MobileAccessibilityNotifications.SWITCH_CONTROL_STATUS_CHANGED, info); - } - if (mobileAccessibility._isTouchExplorationEnabled !== info.isTouchExplorationEnabled) { - mobileAccessibility._isTouchExplorationEnabled = info.isTouchExplorationEnabled; - cordova.fireWindowEvent(MobileAccessibilityNotifications.TOUCH_EXPLORATION_STATUS_CHANGED, info); - } - if (mobileAccessibility._isHighContrastEnabled !== info.isHighContrastEnabled) { - mobileAccessibility._isHighContrastEnabled = info.isHighContrastEnabled; - mobileAccessibility._highContrastScheme = info.highContrastScheme; - cordova.fireWindowEvent(MobileAccessibilityNotifications.HIGH_CONTRAST_CHANGED, info); - } - } -}; - -/** - * Error callback for MobileAccessibility start - */ -MobileAccessibility.prototype._error = function(e) { - console.log("Error initializing MobileAccessibility: " + e); -}; - -var mobileAccessibility = new MobileAccessibility(); - -module.exports = mobileAccessibility; - -}); diff --git a/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-push/www/push.js b/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-push/www/push.js deleted file mode 100644 index a5315486..00000000 --- a/StoneIsland/platforms/ios/www/plugins/phonegap-plugin-push/www/push.js +++ /dev/null @@ -1,329 +0,0 @@ -cordova.define("phonegap-plugin-push.PushNotification", function(require, exports, module) { -/* global cordova:false */ -/* globals window */ - -/*! - * Module dependencies. - */ - -var exec = cordova.require('cordova/exec'); - -/** - * PushNotification constructor. - * - * @param {Object} options to initiate Push Notifications. - * @return {PushNotification} instance that can be monitored and cancelled. - */ - -var PushNotification = function(options) { - this._handlers = { - 'registration': [], - 'notification': [], - 'error': [] - }; - - // require options parameter - if (typeof options === 'undefined') { - throw new Error('The options argument is required.'); - } - - // store the options to this object instance - this.options = options; - - // triggered on registration and notification - var that = this; - var success = function(result) { - if (result && typeof result.registrationId !== 'undefined') { - that.emit('registration', result); - } else if (result && result.additionalData && typeof result.additionalData.actionCallback !== 'undefined') { - var executeFuctionOrEmitEventByName = function(callbackName, context, arg) { - var namespaces = callbackName.split('.'); - var func = namespaces.pop(); - for (var i = 0; i < namespaces.length; i++) { - context = context[namespaces[i]]; - } - - if (typeof context[func] === 'function') { - context[func].call(context, arg); - } else { - that.emit(callbackName, arg); - } - }; - - executeFuctionOrEmitEventByName(result.additionalData.actionCallback, window, result); - } else if (result) { - that.emit('notification', result); - } - }; - - // triggered on error - var fail = function(msg) { - var e = (typeof msg === 'string') ? new Error(msg) : msg; - that.emit('error', e); - }; - - // wait at least one process tick to allow event subscriptions - setTimeout(function() { - exec(success, fail, 'PushNotification', 'init', [options]); - }, 10); -}; - -/** - * Unregister from push notifications - */ - -PushNotification.prototype.unregister = function(successCallback, errorCallback, options) { - if (!errorCallback) { errorCallback = function() {}; } - - if (typeof errorCallback !== 'function') { - console.log('PushNotification.unregister failure: failure parameter not a function'); - return; - } - - if (typeof successCallback !== 'function') { - console.log('PushNotification.unregister failure: success callback parameter must be a function'); - return; - } - - var that = this; - var cleanHandlersAndPassThrough = function() { - if (!options) { - that._handlers = { - 'registration': [], - 'notification': [], - 'error': [] - }; - } - successCallback(); - }; - - exec(cleanHandlersAndPassThrough, errorCallback, 'PushNotification', 'unregister', [options]); -}; - -/** - * subscribe to a topic - * @param {String} topic topic to subscribe - * @param {Function} successCallback success callback - * @param {Function} errorCallback error callback - * @return {void} - */ -PushNotification.prototype.subscribe = function(topic, successCallback, errorCallback) { - if (!errorCallback) { errorCallback = function() {}; } - - if (typeof errorCallback !== 'function') { - console.log('PushNotification.subscribe failure: failure parameter not a function'); - return; - } - - if (typeof successCallback !== 'function') { - console.log('PushNotification.subscribe failure: success callback parameter must be a function'); - return; - } - - exec(successCallback, errorCallback, 'PushNotification', 'subscribe', [topic]); -}; - -/** - * unsubscribe to a topic - * @param {String} topic topic to unsubscribe - * @param {Function} successCallback success callback - * @param {Function} errorCallback error callback - * @return {void} - */ -PushNotification.prototype.unsubscribe = function(topic, successCallback, errorCallback) { - if (!errorCallback) { errorCallback = function() {}; } - - if (typeof errorCallback !== 'function') { - console.log('PushNotification.unsubscribe failure: failure parameter not a function'); - return; - } - - if (typeof successCallback !== 'function') { - console.log('PushNotification.unsubscribe failure: success callback parameter must be a function'); - return; - } - - exec(successCallback, errorCallback, 'PushNotification', 'unsubscribe', [topic]); -}; - -/** - * Call this to set the application icon badge - */ - -PushNotification.prototype.setApplicationIconBadgeNumber = function(successCallback, errorCallback, badge) { - if (!errorCallback) { errorCallback = function() {}; } - - if (typeof errorCallback !== 'function') { - console.log('PushNotification.setApplicationIconBadgeNumber failure: failure parameter not a function'); - return; - } - - if (typeof successCallback !== 'function') { - console.log('PushNotification.setApplicationIconBadgeNumber failure: success callback parameter must be a function'); - return; - } - - exec(successCallback, errorCallback, 'PushNotification', 'setApplicationIconBadgeNumber', [{badge: badge}]); -}; - -/** - * Get the application icon badge - */ - -PushNotification.prototype.getApplicationIconBadgeNumber = function(successCallback, errorCallback) { - if (!errorCallback) { errorCallback = function() {}; } - - if (typeof errorCallback !== 'function') { - console.log('PushNotification.getApplicationIconBadgeNumber failure: failure parameter not a function'); - return; - } - - if (typeof successCallback !== 'function') { - console.log('PushNotification.getApplicationIconBadgeNumber failure: success callback parameter must be a function'); - return; - } - - exec(successCallback, errorCallback, 'PushNotification', 'getApplicationIconBadgeNumber', []); -}; - -/** - * Get the application icon badge - */ - -PushNotification.prototype.clearAllNotifications = function(successCallback, errorCallback) { - if (!successCallback) { successCallback = function() {}; } - if (!errorCallback) { errorCallback = function() {}; } - - if (typeof errorCallback !== 'function') { - console.log('PushNotification.clearAllNotifications failure: failure parameter not a function'); - return; - } - - if (typeof successCallback !== 'function') { - console.log('PushNotification.clearAllNotifications failure: success callback parameter must be a function'); - return; - } - - exec(successCallback, errorCallback, 'PushNotification', 'clearAllNotifications', []); -}; - -/** - * Listen for an event. - * - * Any event is supported, but the following are built-in: - * - * - registration - * - notification - * - error - * - * @param {String} eventName to subscribe to. - * @param {Function} callback triggered on the event. - */ - -PushNotification.prototype.on = function(eventName, callback) { - if (!this._handlers.hasOwnProperty(eventName)) { - this._handlers[eventName] = []; - } - this._handlers[eventName].push(callback); -}; - -/** - * Remove event listener. - * - * @param {String} eventName to match subscription. - * @param {Function} handle function associated with event. - */ - -PushNotification.prototype.off = function (eventName, handle) { - if (this._handlers.hasOwnProperty(eventName)) { - var handleIndex = this._handlers[eventName].indexOf(handle); - if (handleIndex >= 0) { - this._handlers[eventName].splice(handleIndex, 1); - } - } -}; - -/** - * Emit an event. - * - * This is intended for internal use only. - * - * @param {String} eventName is the event to trigger. - * @param {*} all arguments are passed to the event listeners. - * - * @return {Boolean} is true when the event is triggered otherwise false. - */ - -PushNotification.prototype.emit = function() { - var args = Array.prototype.slice.call(arguments); - var eventName = args.shift(); - - if (!this._handlers.hasOwnProperty(eventName)) { - return false; - } - - for (var i = 0, length = this._handlers[eventName].length; i < length; i++) { - var callback = this._handlers[eventName][i]; - if (typeof callback === 'function') { - callback.apply(undefined,args); - } else { - console.log('event handler: ' + eventName + ' must be a function'); - } - } - - return true; -}; - -PushNotification.prototype.finish = function(successCallback, errorCallback, id) { - if (!successCallback) { successCallback = function() {}; } - if (!errorCallback) { errorCallback = function() {}; } - if (!id) { id = 'handler'; } - - if (typeof successCallback !== 'function') { - console.log('finish failure: success callback parameter must be a function'); - return; - } - - if (typeof errorCallback !== 'function') { - console.log('finish failure: failure parameter not a function'); - return; - } - - exec(successCallback, errorCallback, 'PushNotification', 'finish', [id]); -}; - -/*! - * Push Notification Plugin. - */ - -module.exports = { - /** - * Register for Push Notifications. - * - * This method will instantiate a new copy of the PushNotification object - * and start the registration process. - * - * @param {Object} options - * @return {PushNotification} instance - */ - - init: function(options) { - return new PushNotification(options); - }, - - hasPermission: function(successCallback, errorCallback) { - exec(successCallback, errorCallback, 'PushNotification', 'hasPermission', []); - }, - - /** - * PushNotification Object. - * - * Expose the PushNotification object for direct use - * and testing. Typically, you should use the - * .init helper method. - */ - - PushNotification: PushNotification -}; - -}); |
