1(function() { 2 var device, 3 previousDevice, 4 addClass, 5 documentElement, 6 find, 7 handleOrientation, 8 hasClass, 9 orientationEvent, 10 removeClass, 11 userAgent; 12 previousDevice = window.device; 13 device = {}; 14 window.device = device; 15 documentElement = window.document.documentElement; 16 userAgent = window.navigator.userAgent.toLowerCase(); 17 device.ios = function () { 18 return device.iphone() || device.ipod() || device.ipad(); 19 }; 20 device.iphone = function () { 21 return !device.windows() && find('iphone'); 22 }; 23 device.ipod = function () { 24 return find('ipod'); 25 }; 26 device.ipad = function () { 27 return find('ipad'); 28 }; 29 device.android = function () { 30 return !device.windows() && find('android'); 31 }; 32 device.androidPhone = function () { 33 return device.android() && find('mobile'); 34 }; 35 device.androidTablet = function () { 36 return device.android() && !find('mobile'); 37 }; 38 device.blackberry = function () { 39 return find('blackberry') || find('bb10') || find('rim'); 40 }; 41 device.blackberryPhone = function () { 42 return device.blackberry() && !find('tablet'); 43 }; 44 device.blackberryTablet = function () { 45 return device.blackberry() && find('tablet'); 46 }; 47 device.windows = function () { 48 return find('windows'); 49 }; 50 device.windowsPhone = function () { 51 return device.windows() && find('phone'); 52 }; 53 device.windowsTablet = function () { 54 return device.windows() && (find('touch') && !device.windowsPhone()); 55 }; 56 device.fxos = function () { 57 return (find('(mobile;') || find('(tablet;')) && find('; rv:'); 58 }; 59 device.fxosPhone = function () { 60 return device.fxos() && find('mobile'); 61 }; 62 device.fxosTablet = function () { 63 return device.fxos() && find('tablet'); 64 }; 65 device.meego = function () { 66 return find('meego'); 67 }; 68 device.cordova = function () { 69 return window.cordova && location.protocol === 'file:'; 70 }; 71 device.nodeWebkit = function () { 72 return typeof window.process === 'object'; 73 }; 74 device.mobile = function () { 75 return device.androidPhone() || device.iphone() || device.ipod() || device.windowsPhone() || device.blackberryPhone() || device.fxosPhone() || device.meego(); 76 }; 77 device.tablet = function () { 78 return device.ipad() || device.androidTablet() || device.blackberryTablet() || device.windowsTablet() || device.fxosTablet(); 79 }; 80 device.desktop = function () { 81 return !device.tablet() && !device.mobile(); 82 }; 83 device.television = function() { 84 var i, tvString; 85 television = [ 86 "googletv", 87 "viera", 88 "smarttv", 89 "internet.tv", 90 "netcast", 91 "nettv", 92 "appletv", 93 "boxee", 94 "kylo", 95 "roku", 96 "dlnadoc", 97 "roku", 98 "pov_tv", 99 "hbbtv", 100 "ce-html" 101 ]; 102 i = 0; 103 while (i < television.length) { 104 if (find(television[i])) { 105 return true; 106 } 107 i++; 108 } 109 return false; 110 }; 111 device.portrait = function () { 112 return (window.innerHeight / window.innerWidth) > 1; 113 }; 114 device.landscape = function () { 115 return (window.innerHeight / window.innerWidth) < 1; 116 }; 117 118 device.noConflict = function () { 119 window.device = previousDevice; 120 return this; 121 }; 122 find = function (needle) { 123 return userAgent.indexOf(needle) !== -1; 124 }; 125 hasClass = function (className) { 126 var regex; 127 regex = new RegExp(className, 'i'); 128 return documentElement.className.match(regex); 129 }; 130 addClass = function (className) { 131 var currentClassNames = null; 132 if (!hasClass(className)) { 133 currentClassNames = documentElement.className.replace(/^\s+|\s+$/g, ''); 134 documentElement.className = currentClassNames + " " + className; 135 } 136 }; 137 removeClass = function (className) { 138 if (hasClass(className)) { 139 documentElement.className = documentElement.className.replace(" " + className, ""); 140 } 141 }; 142 if (device.ios()) { 143 if (device.ipad()) { 144 addClass("ios ipad tablet"); 145 } else if (device.iphone()) { 146 addClass("ios iphone mobile"); 147 } else if (device.ipod()) { 148 addClass("ios ipod mobile"); 149 } 150 } else if (device.android()) { 151 if (device.androidTablet()) { 152 addClass("android tablet"); 153 } else { 154 addClass("android mobile"); 155 } 156 } else if (device.blackberry()) { 157 if (device.blackberryTablet()) { 158 addClass("blackberry tablet"); 159 } else { 160 addClass("blackberry mobile"); 161 } 162 } else if (device.windows()) { 163 if (device.windowsTablet()) { 164 addClass("windows tablet"); 165 } else if (device.windowsPhone()) { 166 addClass("windows mobile"); 167 } else { 168 addClass("desktop"); 169 } 170 } else if (device.fxos()) { 171 if (device.fxosTablet()) { 172 addClass("fxos tablet"); 173 } else { 174 addClass("fxos mobile"); 175 } 176 } else if (device.meego()) { 177 addClass("meego mobile"); 178 }
178 else if (device.nodeWebkit()) { 179 addClass("node-webkit"); 180 } else if (device.television()) { 181 addClass("television"); 182 } else if (device.desktop()) { 183 addClass("desktop"); 184 } 185 if (device.cordova()) { 186 addClass("cordova"); 187 } 188 handleOrientation = function () { 189 if (device.landscape()) { 190 removeClass("portrait"); 191 addClass("landscape"); 192 } else { 193 removeClass("landscape"); 194 addClass("portrait"); 195 } 196 return; 197 }; 198 if (Object.prototype.hasOwnProperty.call(window, "onorientationchange")) { 199 orientationEvent = "orientationchange"; 200 } else { 201 orientationEvent = "resize"; 202 } 203 if (window.addEventListener) { 204 window.addEventListener(orientationEvent, handleOrientation, false); 205 } else if (window.attachEvent) { 206 window.attachEvent(orientationEvent, handleOrientation); 207 } else { 208 window[orientationEvent] = handleOrientation; 209 } 210 handleOrientation(); 211 if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { 212 define(function() { 213 return device; 214 }); 215 } else if (typeof module !== 'undefined' && module.exports) { 216 module.exports = device; 217 } else { 218 window.device = device; 219 } 220}).call(this);
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.