clockical/www/js/lib/install.js
2012-12-03 00:16:14 +01:00

153 lines
No EOL
4.2 KiB
JavaScript

/*jslint nomen: true */
/*global define, navigator, location, window, chrome */
define(function (require) {
'use strict';
/**
* Detects if the current app has been installed.
*
* See https://github.com/wavysandbox/install/blob/master/README.md
* for details on how to use.
*
*/
function install() {
var fn = install[install.type + 'Install'];
if (fn) {
fn();
} else {
install.trigger('error', 'unsupported install: ' + install.type);
}
}
function triggerChange(state) {
install.state = state;
install.trigger('change', install.state);
}
/**
* The install state. Values are:
* 'unknown': the code has not tried to detect any state.
*
* @type {String}
*/
install.state = 'unknown';
install.check = function () {
var apps = navigator.mozApps,
request;
if (navigator.mozApps) {
//Mozilla web apps
install.type = 'mozilla';
request = navigator.mozApps.getSelf();
request.onsuccess = function () {
if (this.result) {
triggerChange('installed');
} else {
triggerChange('uninstalled');
}
};
request.onerror = function (err) {
// Just console log it, no need to bother the user.
install.error = err;
triggerChange('error');
};
} else if (typeof chrome !== 'undefined' &&
chrome.webstore &&
chrome.app) {
//Chrome web apps
install.type = 'chromeStore';
if (chrome.app.isInstalled) {
triggerChange('installed');
} else {
triggerChange('uninstalled');
}
} else if (typeof window.navigator.standalone !== 'undefined') {
install.type = 'ios';
if (window.navigator.standalone) {
triggerChange('installed');
} else {
triggerChange('uninstalled');
}
} else {
install.type = 'unsupported';
triggerChange('unsupported');
}
};
/* Mozilla/Firefox installation */
install.mozillaInstallUrl = location.href + 'manifest.webapp';
install.mozillaInstall = function () {
var installRequest = navigator.mozApps.install(install.mozillaInstallUrl);
installRequest.onsuccess = function (data) {
triggerChange('installed');
};
installRequest.onerror = function (err) {
install.error = err;
triggerChange('error');
};
};
/* Chrome installation */
install.chromeInstallUrl = null;
install.chromeInstall = function () {
chrome.webstore.install(install.chromeInstallUrl,
function () {
triggerChange('installed');
}, function (err) {
install.error = err;
triggerChange('error');
});
};
/* iOS installation */
//Right now, just asks that something show a UI
//element mentioning how to install using the Safari
//"Add to Home Screen" button.
install.iosInstall = function () {
install.trigger('showiOSInstall', navigator.platform.toLowerCase());
};
//Allow install to do events.
var events = {};
install.on = function(name, func) {
events[name] = (events[name] || []).concat([func]);
};
install.off = function(name, func) {
if(events[name]) {
var res = [];
for(var i=0, l=events[name].length; i<l; i++) {
var f = events[name][i];
if(f != func) {
res.push();
}
}
events[name] = res;
}
};
install.trigger = function(name) {
var args = Array.prototype.slice.call(arguments, 1);
if(events[name]) {
for(var i=0, l=events[name].length; i<l; i++) {
events[name][i].apply(this, args);
}
}
};
//Start up the checks
install.check();
return install;
});