1// From: http://www.quirksmode.org/js/detect.html 2window.top.browserDetect = { 3 init: function () { 4 this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; 5 6 this.version = this.searchVersion(navigator.userAgent) 7 || this.searchVersion(navigator.appVersion) 8 || "an unknown version"; 9 10 this.OS = this.searchString(this.dataOS) || "an unknown OS"; 11 12 this.supportsRapportive = ((function () { 13 switch (browserDetect.browser) { 14 case "Chrome": 15 return true; 16 17 case "ChromeOS": 18 return true; 19 20 case "RockMelt": 21 return true; 22 23 case "Flock": 24 var flockVersion = navigator.userAgent.match(/Flock\/(\d+)\.(\d+)(?:\.(\d+))?/).slice(1, 4); 25 if (!(parseInt(flockVersion[0]) < 3 || parseInt(flockVersion[1]) < 5)) { 26 return true; 27 } 28 break; 29 30 case "Firefox": 31 return true; 32 33 case "Safari": 34 switch (browserDetect.OS) { 35 case "Mac": 36 case "Windows": 37 var safariVersion = navigator.userAgent.match(/ Version\/(\d+)\.(\d+)(?:\.(\d+))?/).slice(1, 4); 38 if (!(parseInt(safariVersion[0]) < 5 || parseInt(safariVersion[1]) < 0 || parseInt(safariVersion[2] || '0') < 1)) { 39 return true; 40 } 41 break; 42 case "iPhone/iPod": 43 return false; 44 case "iPad": 45 return false; 46 default: 47 return false; 48 } 49 break; 50 51 default: 52 switch (browserDetect.OS) { 53 case "Android": 54 return false; 55 56 default: 57 return false; 58 } 59 } 60 })()); 61 }, 62 searchString: function (data) { 63 for (var i=0;i<data.length;i++) { 64 var dataString = data[i].string; 65 var dataProp = data[i].prop; 66 this.versionSearchString = data[i].versionSearch || data[i].identity; 67 if (dataString) { 68 if (dataString.indexOf(data[i].subString) != -1) 69 return data[i].identity; 70 } 71 else if (dataProp) 72 return data[i].identity; 73 } 74 }, 75 searchVersion: function (dataString) { 76 var index = dataString.indexOf(this.versionSearchString); 77 if (index == -1) return; 78 return parseFloat(dataString.substring(index+this.versionSearchString.length+1)); 79 }, 80 dataBrowser: [ 81 { 82 string: navigator.userAgent, 83 subString: "Flock", 84 identity: "Flock" 85 }, 86 { 87 string: navigator.userAgent, 88 subString: "RockMelt", 89 identity: "RockMelt" 90 }, 91 { 92 string: navigator.userAgent, 93 subString: "Chrome", 94 identity: "Chrome" 95 }, 96 { 97 string: navigator.userAgent, 98 subString: "OmniWeb", 99 versionSearch: "OmniWeb/", 100 identity: "OmniWeb" 101 }, 102 { 103 string: navigator.vendor, 104 subString: "Apple", 105 identity: "Safari", 106 versionSearch: "Version" 107 }, 108 { 109 prop: window.opera, 110 identity: "Opera" 111 }, 112 { 113 string: navigator.vendor, 114 subString: "iCab", 115 identity: "iCab" 116 }, 117 { 118 string: navigator.vendor, 119 subString: "KDE", 120 identity: "Konqueror" 121 }, 122 { 123 string: navigator.userAgent, 124 subString: "Firefox", 125 versionSearch: "Firefox", 126 identity: "Firefox" 127 }, 128 {
129 string: navigator.userAgent, 130 subString: "Iceweasel", 131 identity: "Firefox" 132 }, 133 { 134 string: navigator.userAgent, 135 subString: "Shiretoko", 136 identity: "Firefox" 137 }, 138 { 139 string: navigator.userAgent, 140 subString: "Namoroka", 141 identity: "Firefox" 142 }, 143 { 144 string: navigator.userAgent, 145 subString: "Minefield", 146 identity: "Firefox" 147 }, 148 { 149 string: navigator.vendor, 150 subString: "Camino", 151 identity: "Camino" 152 }, 153 { // for newer Netscapes (6+) 154 string: navigator.userAgent, 155 subString: "Netscape", 156 identity: "Netscape" 157 }, 158 { 159 string: navigator.userAgent, 160 subString: "MSIE", 161 identity: "Explorer", 162 versionSearch: "MSIE" 163 }, 164 { 165 string: navigator.userAgent, 166 subString: "Gecko", 167 identity: "Mozilla", 168 versionSearch: "rv" 169 }, 170 { // for older Netscapes (4-) 171 string: navigator.userAgent, 172 subString: "Mozilla", 173 identity: "Netscape", 174 versionSearch: "Mozilla" 175 } 176 ], 177 dataOS : [ 178 { 179 string: navigator.platform, 180 subString: "Win", 181 identity: "Windows" 182 }, 183 { 184 string: navigator.platform, 185 subString: "Mac", 186 identity: "Mac" 187 }, 188 { 189 string: navigator.userAgent, 190 subString: "CrOS", 191 identity: "ChromeOS" 192 }, 193 { 194 string: navigator.userAgent, 195 subString: "iPhone", 196 identity: "iPhone/iPod" 197 }, 198 { 199 string: navigator.userAgent, 200 subString: "iPad", 201 identity: "iPad" 202 }, 203 { 204 string: navigator.userAgent, 205 subString: "Android", 206 identity: "Android" 207 }, 208 { 209 string: navigator.platform, 210 subString: "Linux", 211 identity: "Linux" 212 } 213 ] 214 215}; 216browserDetect.init();
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.