mobile responsive

This commit is contained in:
Bachir Soussi Chiadmi
2015-04-15 18:50:57 +02:00
parent 2a949edab0
commit 74243b416c
18 changed files with 2297 additions and 0 deletions
@@ -0,0 +1,44 @@
{
"name": "detectizr",
"version": "2.0.0",
"main": "dist/detectizr.js",
"license": "MIT",
"ignore": [
"**/.*",
"test",
"*.md",
"Gruntfile.js",
"package.json"
],
"dependencies": {
"modernizr": "2.7.1"
},
"devDependencies": {
"requirejs": "2.1.11",
"qunit": "1.14.0"
},
"keywords": [
"detect",
"determine",
"browser",
"device",
"mobile",
"desktop",
"tablet",
"os",
"modernizr",
"javascript",
"js"
],
"homepage": "https://github.com/barisaydinoglu/Detectizr",
"_release": "2.0.0",
"_resolution": {
"type": "version",
"tag": "v2.0.0",
"commit": "d18dd6121a7c80c448b098638929e6e3bf6f460b"
},
"_source": "git://github.com/barisaydinoglu/Detectizr.git",
"_target": "~2.0.0",
"_originalSource": "detectizr",
"_direct": true
}
@@ -0,0 +1,20 @@
Copyright 2013 Baris Aydinoglu
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,33 @@
{
"name": "detectizr",
"version": "2.0.0",
"main": "dist/detectizr.js",
"license": "MIT",
"ignore": [
"**/.*",
"test",
"*.md",
"Gruntfile.js",
"package.json"
],
"dependencies": {
"modernizr": "2.7.1"
},
"devDependencies": {
"requirejs": "2.1.11",
"qunit": "1.14.0"
},
"keywords": [
"detect",
"determine",
"browser",
"device",
"mobile",
"desktop",
"tablet",
"os",
"modernizr",
"javascript",
"js"
]
}
@@ -0,0 +1,502 @@
/*!
* Detectizr v2.0.0
* http://barisaydinoglu.github.com/Detectizr/
*
* Written by Baris Aydinoglu (http://baris.aydinoglu.info) - Copyright 2012
* Released under the MIT license
*
* Date: 2014-03-21
*/
window.Detectizr = (function(window, navigator, document, undefined) {
var Detectizr = {},
Modernizr = window.Modernizr,
deviceTypes = [ "tv", "tablet", "mobile", "desktop" ],
options = {
// option for enabling HTML classes of all features (not only the true features) to be added
addAllFeaturesAsClass: false,
// option for enabling detection of device
detectDevice: true,
// option for enabling detection of device model
detectDeviceModel: true,
// option for enabling detection of screen size
detectScreen: true,
// option for enabling detection of operating system type and version
detectOS: true,
// option for enabling detection of browser type and version
detectBrowser: true,
// option for enabling detection of common browser plugins
detectPlugins: true
},
plugins2detect = [ {
name: "adobereader",
substrs: [ "Adobe", "Acrobat" ],
// AcroPDF.PDF is used by version 7 and later
// PDF.PdfCtrl is used by version 6 and earlier
progIds: [ "AcroPDF.PDF", "PDF.PDFCtrl.5" ]
}, {
name: "flash",
substrs: [ "Shockwave Flash" ],
progIds: [ "ShockwaveFlash.ShockwaveFlash.1" ]
}, {
name: "wmplayer",
substrs: [ "Windows Media" ],
progIds: [ "wmplayer.ocx" ]
}, {
name: "silverlight",
substrs: [ "Silverlight" ],
progIds: [ "AgControl.AgControl" ]
}, {
name: "quicktime",
substrs: [ "QuickTime" ],
progIds: [ "QuickTime.QuickTime" ]
} ],
rclass = /[\t\r\n]/g,
docElement = document.documentElement,
resizeTimeoutId,
oldOrientation;
function extend(obj, extObj) {
var a, b, i;
if (arguments.length > 2) {
for (a = 1, b = arguments.length; a < b; a += 1) {
extend(obj, arguments[a]);
}
} else {
for (i in extObj) {
if (extObj.hasOwnProperty(i)) {
obj[i] = extObj[i];
}
}
}
return obj;
}
// simplified and localized indexOf method as one parameter fixed as useragent
function is(key) {
return Detectizr.browser.userAgent.indexOf(key) > -1;
}
// simplified and localized regex test method as one parameter fixed as useragent
function test(regex) {
return regex.test(Detectizr.browser.userAgent);
}
// simplified and localized regex exec method as one parameter fixed as useragent
function exec(regex) {
return regex.exec(Detectizr.browser.userAgent);
}
// localized string trim method
function trim(value) {
return value.replace(/^\s+|\s+$/g, "");
}
// convert string to camelcase
function toCamel(string) {
if (string === null || string === undefined) {
return "";
}
return String(string).replace(/((\s|\-|\.)+[a-z0-9])/g, function($1) {
return $1.toUpperCase().replace(/(\s|\-|\.)/g, "");
});
}
// removeClass function inspired from jQuery.removeClass
function removeClass(element, value) {
var class2remove = value || "",
cur = element.nodeType === 1 && (element.className ? (" " + element.className + " ").replace(rclass, " ") : "");
if (cur) {
while (cur.indexOf(" " + class2remove + " ") >= 0) {
cur = cur.replace(" " + class2remove + " ", " ");
}
element.className = value ? trim(cur) : "";
}
}
// add version test to Modernizr
function addVersionTest(version, major, minor) {
if ( !!version) {
version = toCamel(version);
if ( !!major) {
major = toCamel(major);
addConditionalTest(version + major, true);
if ( !!minor) {
addConditionalTest(version + major + "_" + minor, true);
}
}
}
}
function checkOrientation() {
//timeout wrapper points with doResizeCode as callback
window.clearTimeout(resizeTimeoutId);
resizeTimeoutId = window.setTimeout(function() {
oldOrientation = Detectizr.device.orientation;
//wrapper for height/width check
if (window.innerHeight > window.innerWidth) {
Detectizr.device.orientation = "portrait";
} else {
Detectizr.device.orientation = "landscape";
}
addConditionalTest(Detectizr.device.orientation, true);
if (oldOrientation !== Detectizr.device.orientation) {
addConditionalTest(oldOrientation, false);
}
}, 10);
}
// add test to Modernizr based on a condition
function addConditionalTest(feature, test) {
if ( !!feature && !!Modernizr) {
if (options.addAllFeaturesAsClass) {
Modernizr.addTest(feature, test);
} else {
test = typeof test === "function" ? test() : test;
if (test) {
Modernizr.addTest(feature, true);
} else {
delete Modernizr[feature];
removeClass(docElement, feature);
}
}
}
}
// set version based on versionFull
function setVersion(versionType, versionFull) {
versionType.version = versionFull;
var versionArray = versionFull.split(".");
if (versionArray.length > 0) {
versionArray = versionArray.reverse();
versionType.major = versionArray.pop();
if (versionArray.length > 0) {
versionType.minor = versionArray.pop();
if (versionArray.length > 0) {
versionArray = versionArray.reverse();
versionType.patch = versionArray.join(".");
} else {
versionType.patch = "0";
}
} else {
versionType.minor = "0";
}
} else {
versionType.major = "0";
}
}
function detect(opt) {
// Create Global "extend" method, so Detectizr does not need jQuery.extend
var that = this,
i, j, k, device, os, browser, plugin2detect, pluginFound;
options = extend({}, options, opt || {});
/** Device detection **/
if (options.detectDevice) {
Detectizr.device = {
type: "",
model: "",
orientation: ""
};
device = Detectizr.device;
if (test(/googletv|smarttv|internet.tv|netcast|nettv|appletv|boxee|kylo|roku|dlnadoc|ce\-html/)) {
// Check if user agent is a smart tv
device.type = deviceTypes[0];
device.model = "smartTv";
} else if (test(/xbox|playstation.3|wii/)) {
// Check if user agent is a game console
device.type = deviceTypes[0];
device.model = "gameConsole";
} else if (test(/ip(a|ro)d/)) {
// Check if user agent is a iPad
device.type = deviceTypes[1];
device.model = "ipad";
} else if ((test(/tablet/) && !test(/rx-34/)) || test(/folio/)) {
// Check if user agent is a Tablet
device.type = deviceTypes[1];
device.model = String(exec(/playbook/) || "");
} else if (test(/linux/) && test(/android/) && !test(/fennec|mobi|htc.magic|htcX06ht|nexus.one|sc-02b|fone.945/)) {
// Check if user agent is an Android Tablet
device.type = deviceTypes[1];
device.model = "android";
} else if (test(/kindle/) || (test(/mac.os/) && test(/silk/))) {
// Check if user agent is a Kindle or Kindle Fire
device.type = deviceTypes[1];
device.model = "kindle";
} else if (test(/gt-p10|sc-01c|shw-m180s|sgh-t849|sch-i800|shw-m180l|sph-p100|sgh-i987|zt180|htc(.flyer|\_flyer)|sprint.atp51|viewpad7|pandigital(sprnova|nova)|ideos.s7|dell.streak.7|advent.vega|a101it|a70bht|mid7015|next2|nook/) || (test(/mb511/) && test(/rutem/))) {
// Check if user agent is a pre Android 3.0 Tablet
device.type = deviceTypes[1];
device.model = "android";
} else if (test(/bb10/)) {
// Check if user agent is a BB10 device
device.type = deviceTypes[1];
device.model = "blackberry";
} else {
// Check if user agent is one of common mobile types
device.model = exec(/iphone|ipod|android|blackberry|opera mini|opera mobi|skyfire|maemo|windows phone|palm|iemobile|symbian|symbianos|fennec|j2me/);
if (device.model !== null) {
device.type = deviceTypes[2];
device.model = String(device.model);
} else {
device.model = "";
if (test(/bolt|fennec|iris|maemo|minimo|mobi|mowser|netfront|novarra|prism|rx-34|skyfire|tear|xv6875|xv6975|google.wireless.transcoder/)) {
// Check if user agent is unique Mobile User Agent
device.type = deviceTypes[2];
} else if (test(/opera/) && test(/windows.nt.5/) && test(/htc|xda|mini|vario|samsung\-gt\-i8000|samsung\-sgh\-i9/)) {
// Check if user agent is an odd Opera User Agent - http://goo.gl/nK90K
device.type = deviceTypes[2];
} else if ((test(/windows.(nt|xp|me|9)/) && !test(/phone/)) || test(/win(9|.9|nt)/) || test(/\(windows 8\)/)) {
// Check if user agent is Windows Desktop, "(Windows 8)" Chrome extra exception
device.type = deviceTypes[3];
} else if (test(/macintosh|powerpc/) && !test(/silk/)) {
// Check if agent is Mac Desktop
device.type = deviceTypes[3];
device.model = "mac";
} else if (test(/linux/) && test(/x11/)) {
// Check if user agent is a Linux Desktop
device.type = deviceTypes[3];
} else if (test(/solaris|sunos|bsd/)) {
// Check if user agent is a Solaris, SunOS, BSD Desktop
device.type = deviceTypes[3];
} else if (test(/bot|crawler|spider|yahoo|ia_archiver|covario-ids|findlinks|dataparksearch|larbin|mediapartners-google|ng-search|snappy|teoma|jeeves|tineye/) && !test(/mobile/)) {
// Check if user agent is a Desktop BOT/Crawler/Spider
device.type = deviceTypes[3];
device.model = "crawler";
} else {
// Otherwise assume it is a Mobile Device
device.type = deviceTypes[2];
}
}
}
for (i = 0, j = deviceTypes.length; i < j; i += 1) {
addConditionalTest(deviceTypes[i], (device.type === deviceTypes[i]));
}
if (options.detectDeviceModel) {
addConditionalTest(toCamel(device.model), true);
}
}
/** Screen detection **/
if (options.detectScreen) {
if ( !!Modernizr && !!Modernizr.mq) {
addConditionalTest("smallScreen", Modernizr.mq("only screen and (max-width: 480px)"));
addConditionalTest("verySmallScreen", Modernizr.mq("only screen and (max-width: 320px)"));
addConditionalTest("veryVerySmallScreen", Modernizr.mq("only screen and (max-width: 240px)"));
}
if (device.type === deviceTypes[1] || device.type === deviceTypes[2]) {
window.onresize = function(event) {
checkOrientation(event);
};
checkOrientation();
} else {
device.orientation = "landscape";
addConditionalTest(device.orientation, true);
}
}
/** OS detection **/
if (options.detectOS) {
Detectizr.os = {};
os = Detectizr.os;
if (device.model !== "") {
if (device.model === "ipad" || device.model === "iphone" || device.model === "ipod") {
os.name = "ios";
setVersion(os, (test(/os\s([\d_]+)/) ? RegExp.$1 : "").replace(/_/g, "."));
} else if (device.model === "android") {
os.name = "android";
setVersion(os, (test(/android\s([\d\.]+)/) ? RegExp.$1 : ""));
} else if (device.model === "blackberry") {
os.name = "blackberry";
setVersion(os, (test(/version\/([^\s]+)/) ? RegExp.$1 : ""));
} else if (device.model === "playbook") {
os.name = "blackberry";
setVersion(os, (test(/os ([^\s]+)/) ? RegExp.$1.replace(";", "") : ""));
}
}
if (!os.name) {
if (is("win") || is("16bit")) {
os.name = "windows";
if (is("windows nt 6.3")) {
setVersion(os, "8.1");
} else if (is("windows nt 6.2") || test(/\(windows 8\)/)) { //windows 8 chrome mac fix
setVersion(os, "8");
} else if (is("windows nt 6.1")) {
setVersion(os, "7");
} else if (is("windows nt 6.0")) {
setVersion(os, "vista");
} else if (is("windows nt 5.2") || is("windows nt 5.1") || is("windows xp")) {
setVersion(os, "xp");
} else if (is("windows nt 5.0") || is("windows 2000")) {
setVersion(os, "2k");
} else if (is("winnt") || is("windows nt")) {
setVersion(os, "nt");
} else if (is("win98") || is("windows 98")) {
setVersion(os, "98");
} else if (is("win95") || is("windows 95")) {
setVersion(os, "95");
}
} else if (is("mac") || is("darwin")) {
os.name = "mac os";
if (is("68k") || is("68000")) {
setVersion(os, "68k");
} else if (is("ppc") || is("powerpc")) {
setVersion(os, "ppc");
} else if (is("os x")) {
setVersion(os, (test(/os\sx\s([\d_]+)/) ? RegExp.$1 : "os x").replace(/_/g, "."));
}
} else if (is("webtv")) {
os.name = "webtv";
} else if (is("x11") || is("inux")) {
os.name = "linux";
} else if (is("sunos")) {
os.name = "sun";
} else if (is("irix")) {
os.name = "irix";
} else if (is("freebsd")) {
os.name = "freebsd";
} else if (is("bsd")) {
os.name = "bsd";
}
}
if ( !!os.name) {
addConditionalTest(os.name, true);
if ( !!os.major) {
addVersionTest(os.name, os.major);
if ( !!os.minor) {
addVersionTest(os.name, os.major, os.minor);
}
}
}
if (test(/\sx64|\sx86|\swin64|\swow64|\samd64/)) {
os.addressRegisterSize = "64bit";
} else {
os.addressRegisterSize = "32bit";
}
addConditionalTest(os.addressRegisterSize, true);
}
/** Browser detection **/
if (options.detectBrowser) {
browser = Detectizr.browser;
if (!test(/opera|webtv/) && (test(/msie\s([\d\w\.]+)/) || is("trident"))) {
browser.engine = "trident";
browser.name = "ie";
if (!window.addEventListener && document.documentMode && document.documentMode === 7) {
setVersion(browser, "8.compat");
} else if (test(/trident.*rv[ :](\d+)\./)) {
setVersion(browser, RegExp.$1);
} else {
setVersion(browser, (test(/trident\/4\.0/) ? "8" : RegExp.$1));
}
} else if (is("firefox")) {
browser.engine = "gecko";
browser.name = "firefox";
setVersion(browser, (test(/firefox\/([\d\w\.]+)/) ? RegExp.$1 : ""));
} else if (is("gecko/")) {
browser.engine = "gecko";
} else if (is("opera")) {
browser.name = "opera";
browser.engine = "presto";
setVersion(browser, (test(/version\/([\d\.]+)/) ? RegExp.$1 : (test(/opera(\s|\/)([\d\.]+)/) ? RegExp.$2 : "")));
} else if (is("konqueror")) {
browser.name = "konqueror";
} else if (is("chrome")) {
browser.engine = "webkit";
browser.name = "chrome";
setVersion(browser, (test(/chrome\/([\d\.]+)/) ? RegExp.$1 : ""));
} else if (is("iron")) {
browser.engine = "webkit";
browser.name = "iron";
} else if (is("crios")) {
browser.name = "chrome";
browser.engine = "webkit";
setVersion(browser, (test(/crios\/([\d\.]+)/) ? RegExp.$1 : ""));
} else if (is("applewebkit/")) {
browser.name = "safari";
browser.engine = "webkit";
setVersion(browser, (test(/version\/([\d\.]+)/) ? RegExp.$1 : ""));
} else if (is("mozilla/")) {
browser.engine = "gecko";
}
if ( !!browser.name) {
addConditionalTest(browser.name, true);
if ( !!browser.major) {
addVersionTest(browser.name, browser.major);
if ( !!browser.minor) {
addVersionTest(browser.name, browser.major, browser.minor);
}
}
}
addConditionalTest(browser.engine, true);
// Browser Language
browser.language = navigator.userLanguage || navigator.language;
addConditionalTest(browser.language, true);
}
/** Plugin detection **/
if (options.detectPlugins) {
browser.plugins = [];
that.detectPlugin = function(substrs) {
var plugins = navigator.plugins,
plugin, haystack, pluginFoundText;
for (j = plugins.length - 1; j >= 0; j--) {
plugin = plugins[j];
haystack = plugin.name + plugin.description;
pluginFoundText = 0;
for (k = substrs.length; k >= 0; k--) {
if (haystack.indexOf(substrs[k]) !== -1) {
pluginFoundText += 1;
}
}
if (pluginFoundText === substrs.length) {
return true;
}
}
return false;
};
that.detectObject = function(progIds) {
for (j = progIds.length - 1; j >= 0; j--) {
try {
new ActiveXObject(progIds[j]);
} catch (e) {
// Ignore
}
}
return false;
};
for (i = plugins2detect.length - 1; i >= 0; i--) {
plugin2detect = plugins2detect[i];
pluginFound = false;
if (window.ActiveXObject) {
pluginFound = that.detectObject(plugin2detect.progIds);
} else if (navigator.plugins) {
pluginFound = that.detectPlugin(plugin2detect.substrs);
}
if (pluginFound) {
browser.plugins.push(plugin2detect.name);
addConditionalTest(plugin2detect.name, true);
}
}
if (navigator.javaEnabled()) {
browser.plugins.push("java");
addConditionalTest("java", true);
}
}
}
Detectizr.detect = function(settings) {
return detect(settings);
};
Detectizr.init = function() {
if (Detectizr !== undefined) {
Detectizr.browser = {
userAgent: (navigator.userAgent || navigator.vendor || window.opera).toLowerCase()
};
Detectizr.detect();
}
};
Detectizr.init();
return Detectizr;
}(this, this.navigator, this.document));
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,502 @@
/*!
* Detectizr v@VERSION
* http://barisaydinoglu.github.com/Detectizr/
*
* Written by Baris Aydinoglu (http://baris.aydinoglu.info) - Copyright 2012
* Released under the MIT license
*
* Date: @DATE
*/
window.Detectizr = (function(window, navigator, document, undefined) {
var Detectizr = {},
Modernizr = window.Modernizr,
deviceTypes = [ "tv", "tablet", "mobile", "desktop" ],
options = {
// option for enabling HTML classes of all features (not only the true features) to be added
addAllFeaturesAsClass: false,
// option for enabling detection of device
detectDevice: true,
// option for enabling detection of device model
detectDeviceModel: true,
// option for enabling detection of screen size
detectScreen: true,
// option for enabling detection of operating system type and version
detectOS: true,
// option for enabling detection of browser type and version
detectBrowser: true,
// option for enabling detection of common browser plugins
detectPlugins: true
},
plugins2detect = [ {
name: "adobereader",
substrs: [ "Adobe", "Acrobat" ],
// AcroPDF.PDF is used by version 7 and later
// PDF.PdfCtrl is used by version 6 and earlier
progIds: [ "AcroPDF.PDF", "PDF.PDFCtrl.5" ]
}, {
name: "flash",
substrs: [ "Shockwave Flash" ],
progIds: [ "ShockwaveFlash.ShockwaveFlash.1" ]
}, {
name: "wmplayer",
substrs: [ "Windows Media" ],
progIds: [ "wmplayer.ocx" ]
}, {
name: "silverlight",
substrs: [ "Silverlight" ],
progIds: [ "AgControl.AgControl" ]
}, {
name: "quicktime",
substrs: [ "QuickTime" ],
progIds: [ "QuickTime.QuickTime" ]
} ],
rclass = /[\t\r\n]/g,
docElement = document.documentElement,
resizeTimeoutId,
oldOrientation;
function extend(obj, extObj) {
var a, b, i;
if (arguments.length > 2) {
for (a = 1, b = arguments.length; a < b; a += 1) {
extend(obj, arguments[a]);
}
} else {
for (i in extObj) {
if (extObj.hasOwnProperty(i)) {
obj[i] = extObj[i];
}
}
}
return obj;
}
// simplified and localized indexOf method as one parameter fixed as useragent
function is(key) {
return Detectizr.browser.userAgent.indexOf(key) > -1;
}
// simplified and localized regex test method as one parameter fixed as useragent
function test(regex) {
return regex.test(Detectizr.browser.userAgent);
}
// simplified and localized regex exec method as one parameter fixed as useragent
function exec(regex) {
return regex.exec(Detectizr.browser.userAgent);
}
// localized string trim method
function trim(value) {
return value.replace(/^\s+|\s+$/g, "");
}
// convert string to camelcase
function toCamel(string) {
if (string === null || string === undefined) {
return "";
}
return String(string).replace(/((\s|\-|\.)+[a-z0-9])/g, function($1) {
return $1.toUpperCase().replace(/(\s|\-|\.)/g, "");
});
}
// removeClass function inspired from jQuery.removeClass
function removeClass(element, value) {
var class2remove = value || "",
cur = element.nodeType === 1 && (element.className ? (" " + element.className + " ").replace(rclass, " ") : "");
if (cur) {
while (cur.indexOf(" " + class2remove + " ") >= 0) {
cur = cur.replace(" " + class2remove + " ", " ");
}
element.className = value ? trim(cur) : "";
}
}
// add version test to Modernizr
function addVersionTest(version, major, minor) {
if ( !!version) {
version = toCamel(version);
if ( !!major) {
major = toCamel(major);
addConditionalTest(version + major, true);
if ( !!minor) {
addConditionalTest(version + major + "_" + minor, true);
}
}
}
}
function checkOrientation() {
//timeout wrapper points with doResizeCode as callback
window.clearTimeout(resizeTimeoutId);
resizeTimeoutId = window.setTimeout(function() {
oldOrientation = Detectizr.device.orientation;
//wrapper for height/width check
if (window.innerHeight > window.innerWidth) {
Detectizr.device.orientation = "portrait";
} else {
Detectizr.device.orientation = "landscape";
}
addConditionalTest(Detectizr.device.orientation, true);
if (oldOrientation !== Detectizr.device.orientation) {
addConditionalTest(oldOrientation, false);
}
}, 10);
}
// add test to Modernizr based on a condition
function addConditionalTest(feature, test) {
if ( !!feature && !!Modernizr) {
if (options.addAllFeaturesAsClass) {
Modernizr.addTest(feature, test);
} else {
test = typeof test === "function" ? test() : test;
if (test) {
Modernizr.addTest(feature, true);
} else {
delete Modernizr[feature];
removeClass(docElement, feature);
}
}
}
}
// set version based on versionFull
function setVersion(versionType, versionFull) {
versionType.version = versionFull;
var versionArray = versionFull.split(".");
if (versionArray.length > 0) {
versionArray = versionArray.reverse();
versionType.major = versionArray.pop();
if (versionArray.length > 0) {
versionType.minor = versionArray.pop();
if (versionArray.length > 0) {
versionArray = versionArray.reverse();
versionType.patch = versionArray.join(".");
} else {
versionType.patch = "0";
}
} else {
versionType.minor = "0";
}
} else {
versionType.major = "0";
}
}
function detect(opt) {
// Create Global "extend" method, so Detectizr does not need jQuery.extend
var that = this,
i, j, k, device, os, browser, plugin2detect, pluginFound;
options = extend({}, options, opt || {});
/** Device detection **/
if (options.detectDevice) {
Detectizr.device = {
type: "",
model: "",
orientation: ""
};
device = Detectizr.device;
if (test(/googletv|smarttv|internet.tv|netcast|nettv|appletv|boxee|kylo|roku|dlnadoc|ce\-html/)) {
// Check if user agent is a smart tv
device.type = deviceTypes[0];
device.model = "smartTv";
} else if (test(/xbox|playstation.3|wii/)) {
// Check if user agent is a game console
device.type = deviceTypes[0];
device.model = "gameConsole";
} else if (test(/ip(a|ro)d/)) {
// Check if user agent is a iPad
device.type = deviceTypes[1];
device.model = "ipad";
} else if ((test(/tablet/) && !test(/rx-34/)) || test(/folio/)) {
// Check if user agent is a Tablet
device.type = deviceTypes[1];
device.model = String(exec(/playbook/) || "");
} else if (test(/linux/) && test(/android/) && !test(/fennec|mobi|htc.magic|htcX06ht|nexus.one|sc-02b|fone.945/)) {
// Check if user agent is an Android Tablet
device.type = deviceTypes[1];
device.model = "android";
} else if (test(/kindle/) || (test(/mac.os/) && test(/silk/))) {
// Check if user agent is a Kindle or Kindle Fire
device.type = deviceTypes[1];
device.model = "kindle";
} else if (test(/gt-p10|sc-01c|shw-m180s|sgh-t849|sch-i800|shw-m180l|sph-p100|sgh-i987|zt180|htc(.flyer|\_flyer)|sprint.atp51|viewpad7|pandigital(sprnova|nova)|ideos.s7|dell.streak.7|advent.vega|a101it|a70bht|mid7015|next2|nook/) || (test(/mb511/) && test(/rutem/))) {
// Check if user agent is a pre Android 3.0 Tablet
device.type = deviceTypes[1];
device.model = "android";
} else if (test(/bb10/)) {
// Check if user agent is a BB10 device
device.type = deviceTypes[1];
device.model = "blackberry";
} else {
// Check if user agent is one of common mobile types
device.model = exec(/iphone|ipod|android|blackberry|opera mini|opera mobi|skyfire|maemo|windows phone|palm|iemobile|symbian|symbianos|fennec|j2me/);
if (device.model !== null) {
device.type = deviceTypes[2];
device.model = String(device.model);
} else {
device.model = "";
if (test(/bolt|fennec|iris|maemo|minimo|mobi|mowser|netfront|novarra|prism|rx-34|skyfire|tear|xv6875|xv6975|google.wireless.transcoder/)) {
// Check if user agent is unique Mobile User Agent
device.type = deviceTypes[2];
} else if (test(/opera/) && test(/windows.nt.5/) && test(/htc|xda|mini|vario|samsung\-gt\-i8000|samsung\-sgh\-i9/)) {
// Check if user agent is an odd Opera User Agent - http://goo.gl/nK90K
device.type = deviceTypes[2];
} else if ((test(/windows.(nt|xp|me|9)/) && !test(/phone/)) || test(/win(9|.9|nt)/) || test(/\(windows 8\)/)) {
// Check if user agent is Windows Desktop, "(Windows 8)" Chrome extra exception
device.type = deviceTypes[3];
} else if (test(/macintosh|powerpc/) && !test(/silk/)) {
// Check if agent is Mac Desktop
device.type = deviceTypes[3];
device.model = "mac";
} else if (test(/linux/) && test(/x11/)) {
// Check if user agent is a Linux Desktop
device.type = deviceTypes[3];
} else if (test(/solaris|sunos|bsd/)) {
// Check if user agent is a Solaris, SunOS, BSD Desktop
device.type = deviceTypes[3];
} else if (test(/bot|crawler|spider|yahoo|ia_archiver|covario-ids|findlinks|dataparksearch|larbin|mediapartners-google|ng-search|snappy|teoma|jeeves|tineye/) && !test(/mobile/)) {
// Check if user agent is a Desktop BOT/Crawler/Spider
device.type = deviceTypes[3];
device.model = "crawler";
} else {
// Otherwise assume it is a Mobile Device
device.type = deviceTypes[2];
}
}
}
for (i = 0, j = deviceTypes.length; i < j; i += 1) {
addConditionalTest(deviceTypes[i], (device.type === deviceTypes[i]));
}
if (options.detectDeviceModel) {
addConditionalTest(toCamel(device.model), true);
}
}
/** Screen detection **/
if (options.detectScreen) {
if ( !!Modernizr && !!Modernizr.mq) {
addConditionalTest("smallScreen", Modernizr.mq("only screen and (max-width: 480px)"));
addConditionalTest("verySmallScreen", Modernizr.mq("only screen and (max-width: 320px)"));
addConditionalTest("veryVerySmallScreen", Modernizr.mq("only screen and (max-width: 240px)"));
}
if (device.type === deviceTypes[1] || device.type === deviceTypes[2]) {
window.onresize = function(event) {
checkOrientation(event);
};
checkOrientation();
} else {
device.orientation = "landscape";
addConditionalTest(device.orientation, true);
}
}
/** OS detection **/
if (options.detectOS) {
Detectizr.os = {};
os = Detectizr.os;
if (device.model !== "") {
if (device.model === "ipad" || device.model === "iphone" || device.model === "ipod") {
os.name = "ios";
setVersion(os, (test(/os\s([\d_]+)/) ? RegExp.$1 : "").replace(/_/g, "."));
} else if (device.model === "android") {
os.name = "android";
setVersion(os, (test(/android\s([\d\.]+)/) ? RegExp.$1 : ""));
} else if (device.model === "blackberry") {
os.name = "blackberry";
setVersion(os, (test(/version\/([^\s]+)/) ? RegExp.$1 : ""));
} else if (device.model === "playbook") {
os.name = "blackberry";
setVersion(os, (test(/os ([^\s]+)/) ? RegExp.$1.replace(";", "") : ""));
}
}
if (!os.name) {
if (is("win") || is("16bit")) {
os.name = "windows";
if (is("windows nt 6.3")) {
setVersion(os, "8.1");
} else if (is("windows nt 6.2") || test(/\(windows 8\)/)) { //windows 8 chrome mac fix
setVersion(os, "8");
} else if (is("windows nt 6.1")) {
setVersion(os, "7");
} else if (is("windows nt 6.0")) {
setVersion(os, "vista");
} else if (is("windows nt 5.2") || is("windows nt 5.1") || is("windows xp")) {
setVersion(os, "xp");
} else if (is("windows nt 5.0") || is("windows 2000")) {
setVersion(os, "2k");
} else if (is("winnt") || is("windows nt")) {
setVersion(os, "nt");
} else if (is("win98") || is("windows 98")) {
setVersion(os, "98");
} else if (is("win95") || is("windows 95")) {
setVersion(os, "95");
}
} else if (is("mac") || is("darwin")) {
os.name = "mac os";
if (is("68k") || is("68000")) {
setVersion(os, "68k");
} else if (is("ppc") || is("powerpc")) {
setVersion(os, "ppc");
} else if (is("os x")) {
setVersion(os, (test(/os\sx\s([\d_]+)/) ? RegExp.$1 : "os x").replace(/_/g, "."));
}
} else if (is("webtv")) {
os.name = "webtv";
} else if (is("x11") || is("inux")) {
os.name = "linux";
} else if (is("sunos")) {
os.name = "sun";
} else if (is("irix")) {
os.name = "irix";
} else if (is("freebsd")) {
os.name = "freebsd";
} else if (is("bsd")) {
os.name = "bsd";
}
}
if ( !!os.name) {
addConditionalTest(os.name, true);
if ( !!os.major) {
addVersionTest(os.name, os.major);
if ( !!os.minor) {
addVersionTest(os.name, os.major, os.minor);
}
}
}
if (test(/\sx64|\sx86|\swin64|\swow64|\samd64/)) {
os.addressRegisterSize = "64bit";
} else {
os.addressRegisterSize = "32bit";
}
addConditionalTest(os.addressRegisterSize, true);
}
/** Browser detection **/
if (options.detectBrowser) {
browser = Detectizr.browser;
if (!test(/opera|webtv/) && (test(/msie\s([\d\w\.]+)/) || is("trident"))) {
browser.engine = "trident";
browser.name = "ie";
if (!window.addEventListener && document.documentMode && document.documentMode === 7) {
setVersion(browser, "8.compat");
} else if (test(/trident.*rv[ :](\d+)\./)) {
setVersion(browser, RegExp.$1);
} else {
setVersion(browser, (test(/trident\/4\.0/) ? "8" : RegExp.$1));
}
} else if (is("firefox")) {
browser.engine = "gecko";
browser.name = "firefox";
setVersion(browser, (test(/firefox\/([\d\w\.]+)/) ? RegExp.$1 : ""));
} else if (is("gecko/")) {
browser.engine = "gecko";
} else if (is("opera")) {
browser.name = "opera";
browser.engine = "presto";
setVersion(browser, (test(/version\/([\d\.]+)/) ? RegExp.$1 : (test(/opera(\s|\/)([\d\.]+)/) ? RegExp.$2 : "")));
} else if (is("konqueror")) {
browser.name = "konqueror";
} else if (is("chrome")) {
browser.engine = "webkit";
browser.name = "chrome";
setVersion(browser, (test(/chrome\/([\d\.]+)/) ? RegExp.$1 : ""));
} else if (is("iron")) {
browser.engine = "webkit";
browser.name = "iron";
} else if (is("crios")) {
browser.name = "chrome";
browser.engine = "webkit";
setVersion(browser, (test(/crios\/([\d\.]+)/) ? RegExp.$1 : ""));
} else if (is("applewebkit/")) {
browser.name = "safari";
browser.engine = "webkit";
setVersion(browser, (test(/version\/([\d\.]+)/) ? RegExp.$1 : ""));
} else if (is("mozilla/")) {
browser.engine = "gecko";
}
if ( !!browser.name) {
addConditionalTest(browser.name, true);
if ( !!browser.major) {
addVersionTest(browser.name, browser.major);
if ( !!browser.minor) {
addVersionTest(browser.name, browser.major, browser.minor);
}
}
}
addConditionalTest(browser.engine, true);
// Browser Language
browser.language = navigator.userLanguage || navigator.language;
addConditionalTest(browser.language, true);
}
/** Plugin detection **/
if (options.detectPlugins) {
browser.plugins = [];
that.detectPlugin = function(substrs) {
var plugins = navigator.plugins,
plugin, haystack, pluginFoundText;
for (j = plugins.length - 1; j >= 0; j--) {
plugin = plugins[j];
haystack = plugin.name + plugin.description;
pluginFoundText = 0;
for (k = substrs.length; k >= 0; k--) {
if (haystack.indexOf(substrs[k]) !== -1) {
pluginFoundText += 1;
}
}
if (pluginFoundText === substrs.length) {
return true;
}
}
return false;
};
that.detectObject = function(progIds) {
for (j = progIds.length - 1; j >= 0; j--) {
try {
new ActiveXObject(progIds[j]);
} catch (e) {
// Ignore
}
}
return false;
};
for (i = plugins2detect.length - 1; i >= 0; i--) {
plugin2detect = plugins2detect[i];
pluginFound = false;
if (window.ActiveXObject) {
pluginFound = that.detectObject(plugin2detect.progIds);
} else if (navigator.plugins) {
pluginFound = that.detectPlugin(plugin2detect.substrs);
}
if (pluginFound) {
browser.plugins.push(plugin2detect.name);
addConditionalTest(plugin2detect.name, true);
}
}
if (navigator.javaEnabled()) {
browser.plugins.push("java");
addConditionalTest("java", true);
}
}
}
Detectizr.detect = function(settings) {
return detect(settings);
};
Detectizr.init = function() {
if (Detectizr !== undefined) {
Detectizr.browser = {
userAgent: (navigator.userAgent || navigator.vendor || window.opera).toLowerCase()
};
Detectizr.detect();
}
};
Detectizr.init();
return Detectizr;
}(this, this.navigator, this.document));
@@ -0,0 +1,10 @@
"use strict";
var exec = require( "child_process" ).exec;
module.exports = function( grunt ) {
grunt.registerTask( "commit", "Add and commit changes", function( message ) {
// Always add dist directory
exec( "git add dist && git commit -m " + message, this.async() );
});
};
@@ -0,0 +1,34 @@
"use strict";
module.exports = function( grunt ) {
grunt.registerMultiTask(
"compile",
"Compile detectizr.js to the dist directory. Embed date/version.",
function() {
var data = this.data,
dest = data.dest,
src = data.src,
version = grunt.config( "pkg.version" ),
compiled = grunt.file.read( src );
// Embed version and date
compiled = compiled
.replace( /@VERSION/g, version )
.replace( "@DATE", function() {
var date = new Date();
// YYYY-MM-DD
return [
date.getFullYear(),
( "0" + ( date.getMonth() + 1 ) ).slice( -2 ),
( "0" + date.getDate() ).slice( -2 )
].join( "-" );
});
// Write source to file
grunt.file.write( dest, compiled );
grunt.log.ok( "File written to " + dest );
}
);
};
@@ -0,0 +1,35 @@
"use strict";
var fs = require( "fs" );
module.exports = function( grunt ) {
grunt.registerTask( "dist", "Process files for distribution", function() {
var files = grunt.file.expand( { filter: "isFile" }, "dist/*" );
files.forEach(function( filename ) {
var map,
text = fs.readFileSync( filename, "utf8" );
// Modify map/min so that it points to files in the same folder;
// see https://github.com/mishoo/UglifyJS2/issues/47
if ( /\.map$/.test( filename ) ) {
text = text.replace( /"dist\//g, "\"" );
fs.writeFileSync( filename, text, "utf-8" );
} else if ( /\.min\.js$/.test( filename ) ) {
// Wrap sourceMap directive in multiline comments (#13274)
text = text.replace( /\n?(\/\/@\s*sourceMappingURL=)(.*)/,
function( _, directive, path ) {
map = "\n" + directive + path.replace( /^dist\//, "" );
return "";
});
if ( map ) {
text = text.replace( /(^\/\*[\w\W]*?)\s*\*\/|$/,
function( _, comment ) {
return ( comment || "\n/*" ) + map + "\n*/";
});
}
fs.writeFileSync( filename, text, "utf-8" );
}
});
});
};
@@ -0,0 +1,32 @@
"use strict";
var exec = require( "child_process" ).exec;
module.exports = function( grunt ) {
var rpreversion = /\d\.\d+\.\d+/;
grunt.registerTask( "release",
"Release a version of detectizr", function( version ) {
if ( !rpreversion.test( version ) ) {
grunt.fatal( "Version must follow semver release format: " + version );
return;
}
var done = this.async();
exec( "git diff HEAD --name-only", function( err ) {
if ( err ) {
grunt.fatal( "The working directory should be clean when releasing. Commit or stash changes." + err );
return;
}
// Build to dist directories along with a map and tag the release
grunt.task.run([
// Commit new version
"version:" + version,
// Tag new version
"tag:" + version
]);
done();
});
});
};
@@ -0,0 +1,9 @@
"use strict";
var exec = require( "child_process" ).exec;
module.exports = function( grunt ) {
grunt.registerTask( "tag", "Tag the specified version", function( version ) {
exec( "git tag " + version, this.async() );
});
};
@@ -0,0 +1,34 @@
"use strict";
var exec = require( "child_process" ).exec;
module.exports = function( grunt ) {
grunt.registerTask( "version", "Commit a new version", function( version ) {
if ( !/\d\.\d+\.\d+/.test( version ) ) {
grunt.fatal( "Version must follow semver release format: " + version );
return;
}
var done = this.async(),
files = grunt.config( "version.files" ),
rversion = /("version":\s*")[^"]+/;
// Update version in specified files
files.forEach(function( filename ) {
var text = grunt.file.read( filename );
text = text.replace( rversion, "$1" + version );
grunt.file.write( filename, text );
});
// Add files to git index
exec( "git add -A", function( err ) {
if ( err ) {
grunt.fatal( err );
return;
}
// Commit next pre version
grunt.config( "pkg.version", version );
grunt.task.run([ "build", "bower", "test", "commit:'Update version to " + version + "'" ]);
done();
});
});
};