1/** 2 * PgwBrowser - Version 1.3 3 * 4 * Copyright 2014-2015, Jonathan M. Piat 5 * http://pgwjs.com - http://pagawa.com 6 * 7 * Released under the GNU GPLv3 license - http://opensource.org/licenses/gpl-3.0 8 */ 9;(function($){ 10 $.pgwBrowser = function() { 11 12 var pgwBrowser = {}; 13 pgwBrowser.userAgent = navigator.userAgent; 14 pgwBrowser.browser = {}; 15 pgwBrowser.viewport = {}; 16 pgwBrowser.os = {}; 17 resizeEvent = null; 18 19 // The order of the following arrays is important, be careful if you change it. 20 21 var browserData = [ 22 { name: 'Chromium', group: 'Chrome', identifier: 'Chromium/([0-9\.]*)' }, 23 { name: 'Chrome Mobile', group: 'Chrome', identifier: 'Chrome/([0-9\.]*) Mobile', versionIdentifier: 'Chrome/([0-9\.]*)'}, 24 { name: 'Chrome', group: 'Chrome', identifier: 'Chrome/([0-9\.]*)' }, 25 { name: 'Chrome for iOS', group: 'Chrome', identifier: 'CriOS/([0-9\.]*)' }, 26 { name: 'Android Browser', group: 'Chrome', identifier: 'CrMo/([0-9\.]*)' }, 27 { name: 'Firefox', group: 'Firefox', identifier: 'Firefox/([0-9\.]*)' }, 28 { name: 'Opera Mini', group: 'Opera', identifier: 'Opera Mini/([0-9\.]*)' }, 29 { name: 'Opera', group: 'Opera', identifier: 'Opera ([0-9\.]*)' }, 30 { name: 'Opera', group: 'Opera', identifier: 'Opera/([0-9\.]*)', versionIdentifier: 'Version/([0-9\.]*)' }, 31 { name: 'IEMobile', group: 'Explorer', identifier: 'IEMobile/([0-9\.]*)' }, 32 { name: 'Internet Explorer', group: 'Explorer', identifier: 'MSIE ([a-zA-Z0-9\.]*)' }, 33 { name: 'Internet Explorer', group: 'Explorer', identifier: 'Trident/([0-9\.]*)', versionIdentifier: 'rv:([0-9\.]*)' }, 34 { name: 'Spartan', group: 'Spartan', identifier: 'Edge/([0-9\.]*)', versionIdentifier: 'Edge/([0-9\.]*)' }, 35 { name: 'Safari', group: 'Safari', identifier: 'Safari/([0-9\.]*)', versionIdentifier: 'Version/([0-9\.]*)' } 36 ]; 37 38 var osData = [ 39 { name: 'Windows 2000', group: 'Windows', identifier: 'Windows NT 5.0', version: '5.0' }, 40 { name: 'Windows XP', group: 'Windows', identifier: 'Windows NT 5.1', version: '5.1' }, 41 { name: 'Windows Vista', group: 'Windows', identifier: 'Windows NT 6.0', version: '6.0' }, 42 { name: 'Windows 7', group: 'Windows', identifier: 'Windows NT 6.1', version: '7.0' }, 43 { name: 'Windows 8', group: 'Windows', identifier: 'Windows NT 6.2', version: '8.0' }, 44 { name: 'Windows 8.1', group: 'Windows', identifier: 'Windows NT 6.3', version: '8.1' }, 45 { name: 'Windows 10', group: 'Windows', identifier: 'Windows NT 10.0', version: '10.0' }, 46 { name: 'Windows Phone', group: 'Windows Phone', identifier: 'Windows Phone ([0-9\.]*)', }, 47 { name: 'Windows Phone', group: 'Windows Phone', identifier: 'Windows Phone OS ([0-9\.]*)', }, 48 { name: 'Windows', group: 'Windows', identifier: 'Windows', }, 49 { name: 'Chrome OS', group: 'Chrome OS', identifier: 'CrOS', }, 50 { name: 'Android', group: 'Android', identifier: 'Android', versionIdentifier: 'Android ([a-zA-Z0-9\.-]*)' }, 51 { name: 'iPad', group: 'iOS', identifier: 'iPad', versionIdentifier: 'OS ([0-9_]*)', versionSeparator: '[_|\.]' }, 52 { name: 'iPod', group: 'iOS', identifier: 'iPod', versionIdentifier: 'OS ([0-9_]*)', versionSeparator: '[_|\.]' }, 53 { name: 'iPhone', group: 'iOS', identifier: 'iPhone OS', versionIdentifier: 'OS ([0-9_]*)', versionSeparator: '[_|\.]' }, 54 { name: 'Mac OS X Yosemite', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])10([0-9_\.]*))', versionSeparator: '[_|\.]' }, 55 { name: 'Mac OS X Mavericks', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])9([0-9_\.]*))', versionSeparator: '[_|\.]' },
56 { name: 'Mac OS X Mountain Lion', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])8([0-9_\.]*))', versionSeparator: '[_|\.]' }, 57 { name: 'Mac OS X Lion', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])7([0-9_\.]*))', versionSeparator: '[_|\.]' }, 58 { name: 'Mac OS X Snow Leopard', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])6([0-9_\.]*))', versionSeparator: '[_|\.]' }, 59 { name: 'Mac OS X Leopard', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])5([0-9_\.]*))', versionSeparator: '[_|\.]' }, 60 { name: 'Mac OS X Tiger', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])4([0-9_\.]*))', versionSeparator: '[_|\.]' }, 61 { name: 'Mac OS X Panther', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])3([0-9_\.]*))', versionSeparator: '[_|\.]' }, 62 { name: 'Mac OS X Jaguar', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])2([0-9_\.]*))', versionSeparator: '[_|\.]' }, 63 { name: 'Mac OS X Puma', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])1([0-9_\.]*))', versionSeparator: '[_|\.]' }, 64 { name: 'Mac OS X Cheetah', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])0([0-9_\.]*))', versionSeparator: '[_|\.]' }, 65 { name: 'Mac OS', group: 'Mac OS', identifier: 'Mac OS' }, 66 { name: 'Ubuntu', group: 'Linux', identifier: 'Ubuntu', versionIdentifier: 'Ubuntu/([0-9\.]*)' }, 67 { name: 'Debian', group: 'Linux', identifier: 'Debian', }, 68 { name: 'Gentoo', group: 'Linux', identifier: 'Gentoo', }, 69 { name: 'Linux', group: 'Linux', identifier: 'Linux', }, 70 { name: 'BlackBerry', group: 'BlackBerry', identifier: 'BlackBerry', } 71 ]; 72 73 // Set browser data 74 var setBrowserData = function() { 75 var userAgent = pgwBrowser.userAgent.toLowerCase(); 76 77 // Check browser type 78 for (i in browserData) { 79 var browserRegExp = new RegExp(browserData[i].identifier.toLowerCase()); 80 var browserRegExpResult = browserRegExp.exec(userAgent); 81 82 if (browserRegExpResult != null && browserRegExpResult[1]) { 83 pgwBrowser.browser.name = browserData[i].name; 84 pgwBrowser.browser.group = browserData[i].group; 85 86 // Check version 87 if (browserData[i].versionIdentifier) { 88 var versionRegExp = new RegExp(browserData[i].versionIdentifier.toLowerCase()); 89 var versionRegExpResult = versionRegExp.exec(userAgent); 90 91 if (versionRegExpResult != null && versionRegExpResult[1]) { 92 setBrowserVersion(versionRegExpResult[1]); 93 } 94 95 } else { 96 setBrowserVersion(browserRegExpResult[1]); 97 } 98 99 break; 100 } 101 } 102 103 return true; 104 }; 105 106 // Set browser version 107 var setBrowserVersion = function(version) { 108 var splitVersion = version.split('.', 2); 109 pgwBrowser.browser.fullVersion = version; 110 111 // Major version 112 if (splitVersion[0]) { 113 pgwBrowser.browser.majorVersion = parseInt(splitVersion[0]); 114 } 115 116 // Minor version 117 if (splitVersion[1]) { 118 pgwBrowser.browser.minorVersion = parseInt(splitVersion[1]); 119 } 120 121 return true; 122 }; 123 124 // Set OS data 125 var setOsData = function() { 126 var userAgent = pgwBrowser.userAgent.toLowerCase(); 127 128 // Check browser type 129 for (i in osData) { 130 var osRegExp = new RegExp(osData[i].identifier.toLowerCase()); 131 var osRegExpResult = osRegExp.exec(userAgent); 132 133 if (osRegExpResult != null) { 134 pgwBrowser.os.name = osData[i].name; 135 pgwBrowser.os.group = osData[i].group; 136 137 // Version defined 138 if (osData[i].version) { 139 setOsVersion(osData[i].version, (osData[i].versionSeparator) ? osData[i].versionSeparator : '.'); 140 141 // Version detected 142 } else if (osRegExpResult[1]) { 143 setOsVersion(osRegExpResult[1], (osData[i].versionSeparator) ? osData[i].versionSeparator : '.'); 144 145 // Version identifier 146 } else if (osData[i].versionIdentifier) { 147 var versionRegExp = new RegExp(osData[i].versionIdentifier.toLowerCase()); 148 var versionRegExpResult = versionRegExp.exec(userAgent); 149 150 if (versionRegExpResult != null && versionRegExpResult[1]) { 151 setOsVersion(versionRegExpResult[1], (osData[i].versionSeparator) ? osData[i].versionSeparator : '.'); 152 } 153 } 154 155 break; 156 } 157 } 158 159 return true; 160 }; 161 162 // Set OS version 163 var setOsVersion = function(version, separator) { 164 if (separator.substr(0, 1) == '[') { 165 var splitVersion = version.split(new RegExp(separator, 'g'), 2); 166 } else { 167 var splitVersion = version.split(separator, 2); 168 } 169 170 if (separator != '.') { 171 version = version.replace(new RegExp(separator, 'g'), '.'); 172 } 173 174 pgwBrowser.os.fullVersion = version; 175 176 // Major version 177 if (splitVersion[0]) { 178 pgwBrowser.os.majorVersion = parseInt(splitVersion[0]); 179 } 180 181 // Minor version 182 if (splitVersion[1]) { 183 pgwBrowser.os.minorVersion = parseInt(splitVersion[1]); 184 } 185 186 return true; 187 }; 188 189 // Set viewport size
190 var setViewportSize = function(init) { 191 pgwBrowser.viewport.width = $(window).width(); 192 pgwBrowser.viewport.height = $(window).height(); 193 194 // Resize triggers 195 if (typeof init == 'undefined') { 196 if (resizeEvent == null) { 197 $(window).trigger('PgwBrowser::StartResizing'); 198 } else { 199 clearTimeout(resizeEvent); 200 } 201 202 resizeEvent = setTimeout(function() { 203 $(window).trigger('PgwBrowser::StopResizing'); 204 clearTimeout(resizeEvent); 205 resizeEvent = null; 206 }, 300); 207 } 208 209 return true; 210 }; 211 212 // Set viewport orientation 213 var setViewportOrientation = function() { 214 if (typeof window.orientation == 'undefined') { 215 216 if (pgwBrowser.viewport.width >= pgwBrowser.viewport.height) { 217 pgwBrowser.viewport.orientation = 'landscape'; 218 } else { 219 pgwBrowser.viewport.orientation = 'portrait'; 220 } 221 222 } else { 223 switch(window.orientation) { 224 case -90: 225 case 90: 226 pgwBrowser.viewport.orientation = 'landscape'; 227 break; 228 default: 229 pgwBrowser.viewport.orientation = 'portrait'; 230 break; 231 } 232 } 233 234 // Orientation trigger 235 $(window).trigger('PgwBrowser::OrientationChange'); 236 237 return true; 238 }; 239 240 // Replace default value for the user-agent tester on pgwjs.com 241 if (typeof window.pgwJsUserAgentTester != 'undefined') { 242 pgwBrowser.userAgent = window.pgwJsUserAgentTester; 243 } 244 245 // Initialization 246 setBrowserData(); 247 setOsData(); 248 setViewportSize(true); 249 setViewportOrientation(); 250 251 // Triggers 252 $(window).on('orientationchange', function(e) { 253 setViewportOrientation(); 254 }); 255 256 $(window).resize(function(e) { 257 setViewportSize(); 258 }); 259 260 return pgwBrowser; 261 } 262})(window.Zepto || window.jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.