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 El Capitan', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])11([0-9_\.]*))', versionSeparator: '[_|\.]' }, 55 { name: 'Mac OS X Yosemite', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])10([0-9_\.]*))', versionSeparator: '[_|\.]' }, 56 { name: 'Mac OS X Mavericks', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])9([0-9_\.]*))', versionSeparator: '[_|\.]' },
57 { name: 'Mac OS X Mountain Lion', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])8([0-9_\.]*))', versionSeparator: '[_|\.]' }, 58 { name: 'Mac OS X Lion', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])7([0-9_\.]*))', versionSeparator: '[_|\.]' }, 59 { name: 'Mac OS X Snow Leopard', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])6([0-9_\.]*))', versionSeparator: '[_|\.]' }, 60 { name: 'Mac OS X Leopard', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])5([0-9_\.]*))', versionSeparator: '[_|\.]' }, 61 { name: 'Mac OS X Tiger', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])4([0-9_\.]*))', versionSeparator: '[_|\.]' }, 62 { name: 'Mac OS X Panther', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])3([0-9_\.]*))', versionSeparator: '[_|\.]' }, 63 { name: 'Mac OS X Jaguar', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])2([0-9_\.]*))', versionSeparator: '[_|\.]' }, 64 { name: 'Mac OS X Puma', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])1([0-9_\.]*))', versionSeparator: '[_|\.]' }, 65 { name: 'Mac OS X Cheetah', group: 'Mac OS', identifier: 'Mac OS X (10([_|\.])0([0-9_\.]*))', versionSeparator: '[_|\.]' }, 66 { name: 'Mac OS', group: 'Mac OS', identifier: 'Mac OS' }, 67 { name: 'Ubuntu', group: 'Linux', identifier: 'Ubuntu', versionIdentifier: 'Ubuntu/([0-9\.]*)' }, 68 { name: 'Debian', group: 'Linux', identifier: 'Debian' }, 69 { name: 'Gentoo', group: 'Linux', identifier: 'Gentoo' }, 70 { name: 'Linux', group: 'Linux', identifier: 'Linux' }, 71 { name: 'BlackBerry', group: 'BlackBerry', identifier: 'BlackBerry' } 72 ]; 73 74 // Set browser data 75 var setBrowserData = function() { 76 var userAgent = pgwBrowser.userAgent.toLowerCase(); 77 78 // Check browser type 79 for (i in browserData) { 80 var browserRegExp = new RegExp(browserData[i].identifier.toLowerCase()); 81 var browserRegExpResult = browserRegExp.exec(userAgent); 82 83 if (browserRegExpResult != null && browserRegExpResult[1]) { 84 pgwBrowser.browser.name = browserData[i].name; 85 pgwBrowser.browser.group = browserData[i].group; 86 87 // Check version 88 if (browserData[i].versionIdentifier) { 89 var versionRegExp = new RegExp(browserData[i].versionIdentifier.toLowerCase()); 90 var versionRegExpResult = versionRegExp.exec(userAgent); 91 92 if (versionRegExpResult != null && versionRegExpResult[1]) { 93 setBrowserVersion(versionRegExpResult[1]); 94 } 95 96 } else { 97 setBrowserVersion(browserRegExpResult[1]); 98 } 99 100 break; 101 } 102 } 103 104 return true; 105 }; 106 107 // Set browser version 108 var setBrowserVersion = function(version) { 109 var splitVersion = version.split('.', 2); 110 pgwBrowser.browser.fullVersion = version; 111 112 // Major version 113 if (splitVersion[0]) { 114 pgwBrowser.browser.majorVersion = parseInt(splitVersion[0]); 115 } 116 117 // Minor version 118 if (splitVersion[1]) { 119 pgwBrowser.browser.minorVersion = parseInt(splitVersion[1]); 120 } 121 122 return true; 123 }; 124 125 // Set OS data 126 var setOsData = function() { 127 var userAgent = pgwBrowser.userAgent.toLowerCase(); 128 129 // Check browser type 130 for (i in osData) { 131 var osRegExp = new RegExp(osData[i].identifier.toLowerCase()); 132 var osRegExpResult = osRegExp.exec(userAgent); 133 134 if (osRegExpResult != null) { 135 pgwBrowser.os.name = osData[i].name; 136 pgwBrowser.os.group = osData[i].group; 137 138 // Version defined 139 if (osData[i].version) { 140 setOsVersion(osData[i].version, (osData[i].versionSeparator) ? osData[i].versionSeparator : '.'); 141 142 // Version detected 143 } else if (osRegExpResult[1]) { 144 setOsVersion(osRegExpResult[1], (osData[i].versionSeparator) ? osData[i].versionSeparator : '.'); 145 146 // Version identifier 147 } else if (osData[i].versionIdentifier) { 148 var versionRegExp = new RegExp(osData[i].versionIdentifier.toLowerCase()); 149 var versionRegExpResult = versionRegExp.exec(userAgent); 150 151 if (versionRegExpResult != null && versionRegExpResult[1]) { 152 setOsVersion(versionRegExpResult[1], (osData[i].versionSeparator) ? osData[i].versionSeparator : '.'); 153 } 154 } 155 156 break; 157 } 158 } 159 160 return true; 161 }; 162 163 // Set OS version 164 var setOsVersion = function(version, separator) { 165 if (separator.substr(0, 1) == '[') { 166 var splitVersion = version.split(new RegExp(separator, 'g'), 2); 167 } else { 168 var splitVersion = version.split(separator, 2); 169 } 170 171 if (separator != '.') { 172 version = version.replace(new RegExp(separator, 'g'), '.'); 173 } 174 175 pgwBrowser.os.fullVersion = version; 176 177 // Major version 178 if (splitVersion[0]) { 179 pgwBrowser.os.majorVersion = parseInt(splitVersion[0]); 180 } 181 182 // Minor version 183 if (splitVersion[1]) { 184 pgwBrowser.os.minorVersion = parseInt(splitVersion[1]); 185 } 186 187 return true; 188 }; 189 190 // Set viewport size
191 var setViewportSize = function(init) { 192 pgwBrowser.viewport.width = $(window).width(); 193 pgwBrowser.viewport.height = $(window).height(); 194 195 // Resize triggers 196 if (typeof init == 'undefined') { 197 if (resizeEvent == null) { 198 $(window).trigger('PgwBrowser::StartResizing'); 199 } else { 200 clearTimeout(resizeEvent); 201 } 202 203 resizeEvent = setTimeout(function() { 204 $(window).trigger('PgwBrowser::StopResizing'); 205 clearTimeout(resizeEvent); 206 resizeEvent = null; 207 }, 300); 208 } 209 210 return true; 211 }; 212 213 // Set viewport orientation 214 var setViewportOrientation = function() { 215 if (typeof window.orientation == 'undefined') { 216 217 if (pgwBrowser.viewport.width >= pgwBrowser.viewport.height) { 218 pgwBrowser.viewport.orientation = 'landscape'; 219 } else { 220 pgwBrowser.viewport.orientation = 'portrait'; 221 } 222 223 } else { 224 switch(window.orientation) { 225 case -90: 226 case 90: 227 pgwBrowser.viewport.orientation = 'landscape'; 228 break; 229 default: 230 pgwBrowser.viewport.orientation = 'portrait'; 231 break; 232 } 233 } 234 235 // Orientation trigger 236 $(window).trigger('PgwBrowser::OrientationChange'); 237 238 return true; 239 }; 240 241 // Replace default value for the user-agent tester on pgwjs.com 242 if (typeof window.pgwJsUserAgentTester != 'undefined') { 243 pgwBrowser.userAgent = window.pgwJsUserAgentTester; 244 } 245 246 // Initialization 247 setBrowserData(); 248 setOsData(); 249 setViewportSize(true); 250 setViewportOrientation(); 251 252 // Triggers 253 $(window).on('orientationchange', function(e) { 254 setViewportOrientation(); 255 }); 256 257 $(window).resize(function(e) { 258 setViewportSize(); 259 }); 260 261 return pgwBrowser; 262 } 263})(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.