2015-04-12 09:46:29 -07:00
// THIS FILE IS GENERATED - DO NOT EDIT!
2015-07-10 22:03:05 -07:00
( function ( ) {
var impl = { } ;
impl . mobileDetectRules = {
"phones" : {
"iPhone" : "\\biPhone\\b|\\biPod\\b" ,
"BlackBerry" : "BlackBerry|\\bBB10\\b|rim[0-9]+" ,
"HTC" : "HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m" ,
"Nexus" : "Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6" ,
"Dell" : "Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b" ,
"Motorola" : "Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925" ,
"Samsung" : " Samsung | SGH - I337 | BGT - S5230 | GT - B2100 | GT - B2700 | GT - B2710 | GT - B3210 | GT - B3310 | GT - B3410 | GT - B3730 | GT - B3740 | GT - B5510 | GT - B5512 | GT - B5722 | GT - B6520 | GT - B7300 | GT - B7320 | GT - B7330 | GT - B7350 | GT - B7510 | GT - B7722 | GT - B7800 | GT - C3010 | GT - C3011 | GT - C3060 | GT - C3200 | GT - C3212 | GT - C3212I | GT - C3262 | GT - C3222 | GT - C3300 | GT - C3300K | GT - C3303 | GT - C3303K | GT - C3310 | GT - C3322 | GT - C3330 | GT - C3350 | GT - C3500 | GT - C3510 | GT - C3530 | GT - C3630 | GT - C3780 | GT - C5010 | GT - C5212 | GT - C6620 | GT - C6625 | GT - C6712 | GT - E1050 | GT - E1070 | GT - E1075 | GT - E1080 | GT - E1081 | GT - E1085 | GT - E1087 | GT - E1100 | GT - E1107 | GT - E1110 | GT - E1120 | GT - E1125 | GT - E1130 | GT - E1160 | GT - E1170 | GT - E1175 | GT - E1180 | GT - E1182 | GT - E1200 | GT - E1210 | GT - E1225 | GT - E1230 | GT - E1390 | GT - E2100 | GT - E2120 | GT - E2121 | GT - E2152 | GT - E2220 | GT - E2222 | GT - E2230 | GT - E2232 | GT - E2250 | GT - E2370 | GT - E2550 | GT - E2652 | GT - E3210 | GT - E3213 | GT - I5500 | GT - I5503 | GT - I5700 | GT - I5800 | GT - I5801 | GT - I6410 | GT - I6420 | GT - I7110 | GT - I7410 | GT - I7500 | GT - I8000 | GT - I8150 | GT - I8160 | GT - I8190 | GT - I8320 | GT - I8330 | GT - I8350 | GT - I8530 | GT - I8700 | GT - I8703 | GT - I8910 | GT - I9000 | GT - I9001 | GT - I9003 | GT - I9010 | GT - I9020 | GT - I9023 | GT - I9070 | GT - I9082 | GT - I9100 | GT - I9103 | GT - I9220 | GT - I9250 | GT - I9300 | GT - I9305 | GT - I9500 | GT - I9505 | GT - M3510 | GT - M5650 | GT - M7500 | GT - M7600 | GT - M7603 | GT - M8800 | GT - M8910 | GT - N7000 | GT - S3110 | GT - S3310 | GT - S3350 | GT - S3353 | GT - S3370 | GT - S3650 | GT - S3653 | GT - S3770 | GT - S3850 | GT - S5210 | GT - S5220 | GT - S5229 | GT - S5230 | GT - S5233 | GT - S5250 | GT - S5253 | GT - S5260 | GT - S5263 | GT - S5270 | GT - S5300 | GT - S5330 | GT - S5350 | GT - S5360 | GT - S5363 | GT - S5369 | GT - S5380 | GT - S5380D | GT - S5560 | GT - S5570 | GT - S5600 | GT - S5603 | GT - S5610 | GT - S5620 | GT - S5660 | GT - S5670 | GT - S5690 | GT - S5750 | GT - S5780 | GT - S5830 | GT - S5839 | GT - S6102 | GT - S6500 | GT - S7070 | GT - S7200 | GT - S7220 | GT - S7230 | GT - S7233 | GT - S7250 | GT - S7500 | GT - S7530 | GT - S7550 | GT - S7562 | GT - S7710 | GT - S8000 | GT - S8003 | GT - S8500 | GT - S8530 | GT - S8600 | SCH - A310 | SCH - A530 | SCH - A570 | SCH - A610 | SCH - A630 | SCH - A650 | SCH - A790 | SCH - A795 | SCH - A850 | SCH - A870 | SCH - A890 | SCH - A930 | SCH - A950 | SCH - A970 | SCH - A990 | SCH - I100 | SCH - I110 | SCH - I400 | SCH - I405 | SCH - I500 | SCH - I510 | SCH - I515 | SCH - I600 | SCH - I730 | SCH - I760 | SCH - I770 | SCH - I830 | SCH - I910 | SCH - I920 | SCH - I959 | SCH - LC11 | SCH - N150 | SCH - N300 | SCH - R100 | SCH - R300 | SCH - R351 | SCH - R400 | SCH - R410 | SCH - T300 | SCH - U310 | SCH - U320 | SCH - U350 | SCH - U360 | SCH - U365 | SCH - U370 | SCH - U380 | SCH - U410 | SCH - U430 | SCH - U450 | SCH - U460 | SCH - U470 | SCH - U490 | SCH - U540 | SCH - U550 | SCH - U620 | SCH - U640 | SCH - U650 | SCH - U660 | SCH - U700 | SCH - U740 | SCH - U750 | SCH - U810 | SCH - U820 | SCH - U900 | SCH - U940 | SCH - U960 | SCS - 26 UC | SGH - A107 | SGH - A117 | SGH - A127 | SGH - A137 | SGH - A157 | SGH - A167 | SGH - A177 | SGH - A187 | SGH - A197 | SGH - A227 | SGH - A237 | SGH - A257 | SGH - A437 | SGH - A517 | SGH - A597 | SGH - A637 | SGH - A657 | SGH - A667 | SGH - A687 | SGH - A697 | SGH - A707 | SGH - A717 | SGH - A727 | SGH - A737 | SGH - A747 | SGH - A767 | SGH - A777 | SGH - A797 | SGH - A817 | SGH - A827 | SGH - A837 | SGH - A847 | SGH - A867 | SGH - A877 | SGH - A887 | SGH - A897 | SGH - A927 | SGH - B100 | SGH - B130 | SGH - B200 | SGH - B220 | SGH - C100 | SGH - C110 | SGH - C120 | SGH - C130 | SGH - C140 | SGH - C160 | SGH - C170 | SGH - C180 | SGH - C200 | SGH - C207 | SGH - C210 | SGH - C225 | SGH - C230 | SGH - C417 | SGH - C450 | SGH - D307 | SGH - D347 | SGH - D357 | SGH - D407 | SGH - D415 | SGH - D780 | SGH - D807 | SGH - D980 | SGH - E105 | SGH - E200 | SGH - E315 | SGH - E316 | SGH - E317 | SGH - E335 | SGH - E590 | SGH - E635 | SGH - E715 | SGH - E890 | SGH - F300 | SGH - F480 | SGH - I200 | SGH - I300 | SGH - I320 | SGH - I550 | SGH - I577 | SGH - I600 | SGH - I607 | SGH - I617 | SGH - I627 | SGH - I637 | SGH - I677 | SGH - I700 | SGH - I717 | SGH - I727 | SGH - i747M | SGH - I777 | SGH - I780 | SGH - I827 | SGH - I847 | SGH - I857 | SGH - I896 | SGH - I897 | SGH - I900 | SGH - I907 | SGH - I917 | SGH - I927 | SGH - I937 | SGH - I997 | SGH - J150 | SGH - J200 | SGH - L170 | SGH - L700 | SGH - M110 | SGH - M150 | SGH - M200 | SGH - N105 | SGH - N500 | SGH - N600 | SGH - N620 | SGH - N625 | SGH - N700 | SGH - N710 | SGH - P107 | SGH - P207 | SGH - P300 | SGH - P310 | SGH - P520 | SGH - P735 | SGH - P777 | SGH - Q105 | SGH - R210 | SGH - R220 | SGH - R225 | SGH - S105 | SGH - S307 | SGH - T109 | SGH - T119 | SGH - T139 | SGH - T209 | SGH - T219 | SGH - T229 | SGH - T239 | SGH - T249 | SGH - T259 | SGH - T309 | SGH - T319 | SGH - T329 | SGH - T339 | SGH - T349 | SGH - T359 | SGH - T369 | SGH - T379 | SGH - T409 | SGH - T429 | SGH - T439 | SGH - T459 | SGH - T469 | SGH - T479 | SGH - T499 | SGH - T509 | SGH - T519 | SGH - T539 | SGH - T559 | SGH - T589 | SGH - T609 | SGH - T619 | SGH - T629 | SGH - T639 | SGH - T659 | SGH - T669 | SGH - T679 | SGH - T709 | SGH - T719 | SGH - T729 | SGH - T739 | SGH - T746 | SGH - T749 | SGH - T759 | SGH - T769 | SGH - T809 | SGH - T819 | SGH - T839 | SGH - T919 | SGH - T929 | SGH - T939 | SGH - T959 | SGH - T989 | SGH - U100 | SGH - U200 | SGH - U800 | SGH - V205 | SGH - V206 | SGH - X100 | SGH - X105 | SGH - X120 | SGH - X140 | SGH - X426 | SGH - X427 | SGH - X475 | SGH - X495 | SGH - X49
"LG" : "\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)" ,
"Sony" : "SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533" ,
"Asus" : "Asus.*Galaxy|PadFone.*Mobile" ,
"Micromax" : "Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b" ,
"Palm" : "PalmSource|Palm" ,
"Vertu" : "Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature" ,
"Pantech" : "PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790" ,
"Fly" : "IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250" ,
"Wiko" : "KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM" ,
"iMobile" : "i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)" ,
"SimValley" : "\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b" ,
"Wolfgang" : "AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q" ,
"Alcatel" : "Alcatel" ,
"Nintendo" : "Nintendo 3DS" ,
"Amoi" : "Amoi" ,
"INQ" : "INQ" ,
"GenericPhone" : "Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"
} ,
"tablets" : {
"iPad" : "iPad|iPad.*Mobile" ,
"NexusTablet" : "Android.*Nexus[\\s]+(7|9|10)|^.*Android.*Nexus(?:(?!Mobile).)*$" ,
"SamsungTablet" : "SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237P|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T" ,
"Kindle" : "Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\\b" ,
"SurfaceTablet" : "Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)" ,
"HPTablet" : "HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10" ,
"AsusTablet" : "^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL" ,
"BlackBerryTablet" : "PlayBook|RIM Tablet" ,
"HTCtablet" : "HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410" ,
"MotorolaTablet" : "xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617" ,
"NookTablet" : "Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2" ,
"AcerTablet" : "Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b" ,
"ToshibaTablet" : "Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO" ,
"LGTablet" : "\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b" ,
"FujitsuTablet" : "Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b" ,
"PrestigioTablet" : "PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD" ,
"LenovoTablet" : "Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)" ,
"DellTablet" : "Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7" ,
"YarvikTablet" : "Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b" ,
"MedionTablet" : "Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB" ,
"ArnovaTablet" : "AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2" ,
"IntensoTablet" : "INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004" ,
"IRUTablet" : "M702pro" ,
"MegafonTablet" : "MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b" ,
"EbodaTablet" : "E-Boda (Supreme|Impresspeed|Izzycomm|Essential)" ,
"AllViewTablet" : "Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)" ,
"ArchosTablet" : "\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b" ,
"AinolTablet" : "NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark" ,
"SonyTablet" : "Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612" ,
"PhilipsTablet" : "\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b" ,
"CubeTablet" : "Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT" ,
"CobyTablet" : "MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010" ,
"MIDTablet" : "M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733" ,
"MSITablet" : "MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b" ,
"SMiTTablet" : "Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)" ,
"RockChipTablet" : "Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A" ,
"FlyTablet" : "IQ310|Fly Vision" ,
"bqTablet" : "(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus" ,
"HuaweiTablet" : "MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim" ,
"NecTablet" : "\\bN-06D|\\bN-08D" ,
"PantechTablet" : "Pantech.*P4100" ,
"BronchoTablet" : "Broncho.*(N701|N708|N802|a710)" ,
"VersusTablet" : "TOUCHPAD.*[78910]|\\bTOUCHTAB\\b" ,
"ZyncTablet" : "z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900" ,
"PositivoTablet" : "TB07STA|TB10STA|TB07FTA|TB10FTA" ,
"NabiTablet" : "Android.*\\bNabi" ,
"KoboTablet" : "Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build" ,
"DanewTablet" : "DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b" ,
"TexetTablet" : "NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE" ,
"PlaystationTablet" : "Playstation.*(Portable|Vita)" ,
"TrekstorTablet" : "ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab" ,
"PyleAudioTablet" : "\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b" ,
"AdvanTablet" : "Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b " ,
"DanyTechTablet" : "Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1" ,
"GalapadTablet" : "Android.*\\bG1\\b" ,
"MicromaxTablet" : "Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b" ,
"KarbonnTablet" : "Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b" ,
"AllFineTablet" : "Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide" ,
"PROSCANTablet" : "\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b" ,
"YONESTablet" : "BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026" ,
"ChangJiaTablet" : "TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503" ,
"GUTablet" : "TX-A1301|TX-M9002|Q702|kf026" ,
"PointOfViewTablet" : "TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10" ,
"OvermaxTablet" : "OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)" ,
"HCLTablet" : "HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync" ,
"DPSTablet" : "DPS Dream 9|DPS Dual 7" ,
"VistureTablet" : "V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10" ,
"CrestaTablet" : "CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989" ,
"MediatekTablet" : "\\bMT8125|MT8389|MT8135|MT8377\\b" ,
"ConcordeTablet" : "Concorde([ ]+)?Tab|ConCorde ReadMan" ,
"GoCleverTablet" : "GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042" ,
"ModecomTablet" : "FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003" ,
"VoninoTablet" : "\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b" ,
"ECSTablet" : "V07OT2|TM105A|S10OT1|TR10CS1" ,
"StorexTablet" : "eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab" ,
"VodafoneTablet" : "SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7" ,
"EssentielBTablet" : "Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2" ,
"RossMoorTablet" : "RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711" ,
"iMobileTablet" : "i-mobile i-note" ,
"TolinoTablet" : "tolino tab [0-9.]+|tolino shine" ,
"AudioSonicTablet" : "\\bC-22Q|T7-QC|T-17B|T-17P\\b" ,
"AMPETablet" : "Android.* A78 " ,
"SkkTablet" : "Android.* (SKYPAD|PHOENIX|CYCLOPS)" ,
"TecnoTablet" : "TECNO P9" ,
"JXDTablet" : "Android.*\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b" ,
"iJoyTablet" : "Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)" ,
"FX2Tablet" : "FX2 PAD7|FX2 PAD10" ,
"XoroTablet" : "KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151" ,
"ViewsonicTablet" : "ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a" ,
"OdysTablet" : "LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10" ,
"CaptivaTablet" : "CAPTIVA PAD" ,
"IconbitTablet" : "NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S" ,
"TeclastTablet" : "T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi" ,
"JaytechTablet" : "TPC-PA762" ,
"BlaupunktTablet" : "Endeavour 800NG|Endeavour 1010" ,
"DigmaTablet" : "\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b" ,
"EvolioTablet" : "ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b" ,
"LavaTablet" : "QPAD E704|\\bIvoryS\\b|E-TAB IVORY" ,
"CelkonTablet" : "CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b" ,
"WolderTablet" : "miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b" ,
"MiTablet" : "\\bMI PAD\\b|\\bHM NOTE 1W\\b" ,
"NibiruTablet" : "Nibiru M1|Nibiru Jupiter One" ,
"NexoTablet" : "NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI" ,
"UbislateTablet" : "UbiSlate[\\s]?7C" ,
"PocketBookTablet" : "Pocketbook" ,
"Hudl" : "Hudl HT7S3" ,
"TelstraTablet" : "T-Hub2" ,
"GenericTablet" : "Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bJolla\\b"
} ,
"oss" : {
"AndroidOS" : "Android" ,
"BlackBerryOS" : "blackberry|\\bBB10\\b|rim tablet os" ,
"PalmOS" : "PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino" ,
"SymbianOS" : "Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b" ,
"WindowsMobileOS" : "Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;" ,
"WindowsPhoneOS" : "Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;" ,
"iOS" : "\\biPhone.*Mobile|\\biPod|\\biPad" ,
"MeeGoOS" : "MeeGo" ,
"MaemoOS" : "Maemo" ,
"JavaOS" : "J2ME\/|\\bMIDP\\b|\\bCLDC\\b" ,
"webOS" : "webOS|hpwOS" ,
"badaOS" : "\\bBada\\b" ,
"BREWOS" : "BREW"
} ,
"uas" : {
"Chrome" : "\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?" ,
"Dolfin" : "\\bDolfin\\b" ,
"Opera" : "Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+" ,
"Skyfire" : "Skyfire" ,
"IE" : "IEMobile|MSIEMobile" ,
"Firefox" : "fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile" ,
"Bolt" : "bolt" ,
"TeaShark" : "teashark" ,
"Blazer" : "Blazer" ,
"Safari" : "Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari" ,
"Tizen" : "Tizen" ,
"UCBrowser" : "UC.*Browser|UCWEB" ,
"baiduboxapp" : "baiduboxapp" ,
"baidubrowser" : "baidubrowser" ,
"DiigoBrowser" : "DiigoBrowser" ,
"Puffin" : "Puffin" ,
"Mercury" : "\\bMercury\\b" ,
"ObigoBrowser" : "Obigo" ,
"NetFront" : "NF-Browser" ,
"GenericBrowser" : "NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger"
} ,
"props" : {
"Mobile" : "Mobile\/[VER]" ,
"Build" : "Build\/[VER]" ,
"Version" : "Version\/[VER]" ,
"VendorID" : "VendorID\/[VER]" ,
"iPad" : "iPad.*CPU[a-z ]+[VER]" ,
"iPhone" : "iPhone.*CPU[a-z ]+[VER]" ,
"iPod" : "iPod.*CPU[a-z ]+[VER]" ,
"Kindle" : "Kindle\/[VER]" ,
"Chrome" : [
"Chrome\/[VER]" ,
"CriOS\/[VER]" ,
"CrMo\/[VER]"
] ,
"Coast" : [
"Coast\/[VER]"
] ,
"Dolfin" : "Dolfin\/[VER]" ,
"Firefox" : "Firefox\/[VER]" ,
"Fennec" : "Fennec\/[VER]" ,
"IE" : [
"IEMobile\/[VER];" ,
"IEMobile [VER]" ,
"MSIE [VER];"
] ,
"NetFront" : "NetFront\/[VER]" ,
"NokiaBrowser" : "NokiaBrowser\/[VER]" ,
"Opera" : [
" OPR\/[VER]" ,
"Opera Mini\/[VER]" ,
"Version\/[VER]"
] ,
"Opera Mini" : "Opera Mini\/[VER]" ,
"Opera Mobi" : "Version\/[VER]" ,
"UC Browser" : "UC Browser[VER]" ,
"MQQBrowser" : "MQQBrowser\/[VER]" ,
"MicroMessenger" : "MicroMessenger\/[VER]" ,
"baiduboxapp" : "baiduboxapp\/[VER]" ,
"baidubrowser" : "baidubrowser\/[VER]" ,
"Iron" : "Iron\/[VER]" ,
"Safari" : [
"Version\/[VER]" ,
"Safari\/[VER]"
] ,
"Skyfire" : "Skyfire\/[VER]" ,
"Tizen" : "Tizen\/[VER]" ,
"Webkit" : "webkit[ \/][VER]" ,
"Gecko" : "Gecko\/[VER]" ,
"Trident" : "Trident\/[VER]" ,
"Presto" : "Presto\/[VER]" ,
"iOS" : " \\bi?OS\\b [VER][ ;]{1}" ,
"Android" : "Android [VER]" ,
"BlackBerry" : [
"BlackBerry[\\w]+\/[VER]" ,
"BlackBerry.*Version\/[VER]" ,
"Version\/[VER]"
] ,
"BREW" : "BREW [VER]" ,
"Java" : "Java\/[VER]" ,
"Windows Phone OS" : [
"Windows Phone OS [VER]" ,
"Windows Phone [VER]"
] ,
"Windows Phone" : "Windows Phone [VER]" ,
"Windows CE" : "Windows CE\/[VER]" ,
"Windows NT" : "Windows NT [VER]" ,
"Symbian" : [
"SymbianOS\/[VER]" ,
"Symbian\/[VER]"
] ,
"webOS" : [
"webOS\/[VER]" ,
"hpwOS\/[VER];"
]
} ,
"utils" : {
"Bot" : "Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor" ,
"MobileBot" : "Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2" ,
"DesktopMode" : "WPDesktop" ,
"TV" : "SonyDTV|HbbTV" ,
"WebKit" : "(webkit)[ \/]([\\w.]+)" ,
"Console" : "\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b" ,
"Watch" : "SM-V700"
}
} ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// following patterns come from http://detectmobilebrowsers.com/
impl . detectMobileBrowsers = {
fullPattern : /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i ,
shortPattern : /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i
} ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
var hasOwnProp = Object . prototype . hasOwnProperty ,
isArray ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
impl . FALLBACK _PHONE = 'UnknownPhone' ;
impl . FALLBACK _TABLET = 'UnknownTablet' ;
impl . FALLBACK _MOBILE = 'UnknownMobile' ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
isArray = ( 'isArray' in Array ) ?
Array . isArray : function ( value ) { return Object . prototype . toString . call ( value ) === '[object Array]' ; } ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
function equalIC ( a , b ) {
return a != null && b != null && a . toLowerCase ( ) === b . toLowerCase ( ) ;
}
function convertPropsToRegExp ( object ) {
for ( var key in object ) {
if ( hasOwnProp . call ( object , key ) ) {
object [ key ] = new RegExp ( object [ key ] , 'i' ) ;
2015-04-12 09:46:29 -07:00
}
}
2015-07-10 22:03:05 -07:00
}
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
( function init ( ) {
var key , values , value , i , len , verPos , mobileDetectRules = impl . mobileDetectRules ;
for ( key in mobileDetectRules . props ) {
if ( hasOwnProp . call ( mobileDetectRules . props , key ) ) {
values = mobileDetectRules . props [ key ] ;
if ( ! isArray ( values ) ) {
values = [ values ] ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
len = values . length ;
for ( i = 0 ; i < len ; ++ i ) {
value = values [ i ] ;
verPos = value . indexOf ( '[VER]' ) ;
if ( verPos >= 0 ) {
value = value . substring ( 0 , verPos ) + '([\\w._\\+]+)' + value . substring ( verPos + 5 ) ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
values [ i ] = new RegExp ( value , 'i' ) ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
mobileDetectRules . props [ key ] = values ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
}
convertPropsToRegExp ( mobileDetectRules . oss ) ;
convertPropsToRegExp ( mobileDetectRules . phones ) ;
convertPropsToRegExp ( mobileDetectRules . tablets ) ;
convertPropsToRegExp ( mobileDetectRules . uas ) ;
convertPropsToRegExp ( mobileDetectRules . utils ) ;
// copy some patterns to oss0 which are tested first (see issue#15)
mobileDetectRules . oss0 = {
WindowsPhoneOS : mobileDetectRules . oss . WindowsPhoneOS ,
WindowsMobileOS : mobileDetectRules . oss . WindowsMobileOS
2015-04-12 09:46:29 -07:00
} ;
2015-07-10 22:03:05 -07:00
} ( ) ) ;
/ * *
* Test userAgent string against a set of rules and find the matched key .
* @ param { Object } rules ( key is String , value is RegExp )
* @ param { String } userAgent the navigator . userAgent ( or HTTP - Header 'User-Agent' ) .
* @ returns { String | null } the matched key if found , otherwise < tt > null < / t t >
* @ private
* /
impl . findMatch = function ( rules , userAgent ) {
for ( var key in rules ) {
if ( hasOwnProp . call ( rules , key ) ) {
if ( rules [ key ] . test ( userAgent ) ) {
return key ;
2015-04-12 09:46:29 -07:00
}
}
2015-07-10 22:03:05 -07:00
}
return null ;
} ;
/ * *
* Check the version of the given property in the User - Agent .
*
* @ param { String } propertyName
* @ param { String } userAgent
* @ return { String } version or < tt > null < / t t > i f v e r s i o n n o t f o u n d
* @ private
* /
impl . getVersionStr = function ( propertyName , userAgent ) {
var props = impl . mobileDetectRules . props , patterns , i , len , match ;
if ( hasOwnProp . call ( props , propertyName ) ) {
patterns = props [ propertyName ] ;
len = patterns . length ;
for ( i = 0 ; i < len ; ++ i ) {
match = patterns [ i ] . exec ( userAgent ) ;
if ( match !== null ) {
return match [ 1 ] ;
}
}
}
return null ;
} ;
/ * *
* Check the version of the given property in the User - Agent .
* Will return a float number . ( eg . 2_0 will return 2.0 , 4.3 . 1 will return 4.31 )
*
* @ param { String } propertyName
* @ param { String } userAgent
* @ return { Number } version or < tt > NaN < / t t > i f v e r s i o n n o t f o u n d
* @ private
* /
impl . getVersion = function ( propertyName , userAgent ) {
var version = impl . getVersionStr ( propertyName , userAgent ) ;
return version ? impl . prepareVersionNo ( version ) : NaN ;
} ;
/ * *
* Prepare the version number .
*
* @ param { String } version
* @ return { Number } the version number as a floating number
* @ private
* /
impl . prepareVersionNo = function ( version ) {
var numbers ;
numbers = version . split ( /[a-z._ \/\-]/i ) ;
if ( numbers . length === 1 ) {
version = numbers [ 0 ] ;
}
if ( numbers . length > 1 ) {
version = numbers [ 0 ] + '.' ;
numbers . shift ( ) ;
version += numbers . join ( '' ) ;
}
return Number ( version ) ;
} ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
impl . isMobileFallback = function ( userAgent ) {
return impl . detectMobileBrowsers . fullPattern . test ( userAgent ) ||
impl . detectMobileBrowsers . shortPattern . test ( userAgent . substr ( 0 , 4 ) ) ;
} ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
impl . prepareDetectionCache = function ( cache , userAgent , maxPhoneWidth ) {
if ( cache . mobile !== undefined ) {
return ;
}
var phone , tablet , phoneSized ;
// first check for stronger tablet rules, then phone (see issue#5)
tablet = impl . findMatch ( impl . mobileDetectRules . tablets , userAgent ) ;
if ( tablet ) {
cache . mobile = cache . tablet = tablet ;
cache . phone = null ;
return ; // unambiguously identified as tablet
}
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
phone = impl . findMatch ( impl . mobileDetectRules . phones , userAgent ) ;
if ( phone ) {
cache . mobile = cache . phone = phone ;
cache . tablet = null ;
return ; // unambiguously identified as phone
}
// our rules haven't found a match -> try more general fallback rules
if ( impl . isMobileFallback ( userAgent ) ) {
phoneSized = MobileDetect . isPhoneSized ( maxPhoneWidth ) ;
if ( phoneSized === undefined ) {
cache . mobile = impl . FALLBACK _MOBILE ;
cache . tablet = cache . phone = null ;
} else if ( phoneSized ) {
cache . mobile = cache . phone = impl . FALLBACK _PHONE ;
cache . tablet = null ;
} else {
cache . mobile = cache . tablet = impl . FALLBACK _TABLET ;
cache . phone = null ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
} else {
// not mobile at all!
cache . mobile = cache . tablet = cache . phone = null ;
}
} ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// t is a reference to a MobileDetect instance
impl . mobileGrade = function ( t ) {
// impl note:
// To keep in sync w/ Mobile_Detect.php easily, the following code is tightly aligned to the PHP version.
// When changes are made in Mobile_Detect.php, copy this method and replace:
// $this-> / t.
// self::MOBILE_GRADE_(.) / '$1'
// , self::VERSION_TYPE_FLOAT / (nothing)
// isIOS() / os('iOS')
// [reg] / (nothing) <-- jsdelivr complaining about unescaped unicode character U+00AE
var $isMobile = t . mobile ( ) !== null ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
if (
// Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1)
t . os ( 'iOS' ) && t . version ( 'iPad' ) >= 4.3 ||
t . os ( 'iOS' ) && t . version ( 'iPhone' ) >= 3.1 ||
t . os ( 'iOS' ) && t . version ( 'iPod' ) >= 3.1 ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)
// Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM
// Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices
// Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7
( t . version ( 'Android' ) > 2.1 && t . is ( 'Webkit' ) ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800
t . version ( 'Windows Phone OS' ) >= 7.0 ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Blackberry 7 - Tested on BlackBerry Torch 9810
// Blackberry 6.0 - Tested on the Torch 9800 and Style 9670
t . is ( 'BlackBerry' ) && t . version ( 'BlackBerry' ) >= 6.0 ||
// Blackberry Playbook (1.0-2.0) - Tested on PlayBook
t . match ( 'Playbook.*Tablet' ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0)
( t . version ( 'webOS' ) >= 1.4 && t . match ( 'Palm|Pre|Pixi' ) ) ||
// Palm WebOS 3.0 - Tested on HP TouchPad
t . match ( 'hp.*TouchPad' ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Firefox Mobile (12 Beta) - Tested on Android 2.3 device
( t . is ( 'Firefox' ) && t . version ( 'Firefox' ) >= 12 ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Chrome for Android - Tested on Android 4.0, 4.1 device
( t . is ( 'Chrome' ) && t . is ( 'AndroidOS' ) && t . version ( 'Android' ) >= 4.0 ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Skyfire 4.1 - Tested on Android 2.3 device
( t . is ( 'Skyfire' ) && t . version ( 'Skyfire' ) >= 4.1 && t . is ( 'AndroidOS' ) && t . version ( 'Android' ) >= 2.3 ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Opera Mobile 11.5-12: Tested on Android 2.3
( t . is ( 'Opera' ) && t . version ( 'Opera Mobi' ) > 11 && t . is ( 'AndroidOS' ) ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Meego 1.2 - Tested on Nokia 950 and N9
t . is ( 'MeeGoOS' ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Tizen (pre-release) - Tested on early hardware
t . is ( 'Tizen' ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser
// @todo: more tests here!
t . is ( 'Dolfin' ) && t . version ( 'Bada' ) >= 2.0 ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// UC Browser - Tested on Android 2.3 device
( ( t . is ( 'UC Browser' ) || t . is ( 'Dolfin' ) ) && t . version ( 'Android' ) >= 2.3 ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Kindle 3 and Fire - Tested on the built-in WebKit browser for each
( t . match ( 'Kindle Fire' ) ||
t . is ( 'Kindle' ) && t . version ( 'Kindle' ) >= 3.0 ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet
t . is ( 'AndroidOS' ) && t . is ( 'NookTablet' ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7
t . version ( 'Chrome' ) >= 11 && ! $isMobile ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7
t . version ( 'Safari' ) >= 5.0 && ! $isMobile ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7
t . version ( 'Firefox' ) >= 4.0 && ! $isMobile ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Internet Explorer 7-9 - Tested on Windows XP, Vista and 7
t . version ( 'MSIE' ) >= 7.0 && ! $isMobile ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7
// @reference: http://my.opera.com/community/openweb/idopera/
t . version ( 'Opera' ) >= 10 && ! $isMobile
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
) {
return 'A' ;
}
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
if (
t . os ( 'iOS' ) && t . version ( 'iPad' ) < 4.3 ||
t . os ( 'iOS' ) && t . version ( 'iPhone' ) < 3.1 ||
t . os ( 'iOS' ) && t . version ( 'iPod' ) < 3.1 ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770
t . is ( 'Blackberry' ) && t . version ( 'BlackBerry' ) >= 5 && t . version ( 'BlackBerry' ) < 6 ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
//Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3
( t . version ( 'Opera Mini' ) >= 5.0 && t . version ( 'Opera Mini' ) <= 6.5 &&
( t . version ( 'Android' ) >= 2.3 || t . is ( 'iOS' ) ) ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)
t . match ( 'NokiaN8|NokiaC7|N97.*Series60|Symbian/3' ) ||
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// @todo: report this (tested on Nokia N71)
t . version ( 'Opera Mobi' ) >= 11 && t . is ( 'SymbianOS' )
) {
return 'B' ;
}
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
if (
// Blackberry 4.x - Tested on the Curve 8330
t . version ( 'BlackBerry' ) < 5.0 ||
// Windows Mobile - Tested on the HTC Leo (WinMo 5.2)
t . match ( 'MSIEMobile|Windows CE.*Mobile' ) || t . version ( 'Windows Mobile' ) <= 5.2
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
) {
return 'C' ;
}
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
//All older smartphone platforms and featurephones - Any device that doesn't support media queries
//will receive the basic, C grade experience.
return 'C' ;
} ;
impl . detectOS = function ( ua ) {
return impl . findMatch ( impl . mobileDetectRules . oss0 , ua ) ||
impl . findMatch ( impl . mobileDetectRules . oss , ua ) ;
} ;
impl . getDeviceSmallerSide = function ( ) {
return window . screen . width < window . screen . height ?
window . screen . width :
window . screen . height ;
} ;
/ * *
* Constructor for MobileDetect object .
* < br >
* Such an object will keep a reference to the given user - agent string and cache most of the detect queries . < br >
* < div style = "background-color: #d9edf7; border: 1px solid #bce8f1; color: #3a87ad; padding: 14px; border-radius: 2px; margin-top: 20px" >
* < strong > Find information how to download and install : < / s t r o n g >
* < a href = "https://github.com/hgoebl/mobile-detect.js/" > github . com / hgoebl / mobile - detect . js / < / a >
* < / d i v >
*
* @ example < pre >
* var md = new MobileDetect ( window . navigator . userAgent ) ;
* if ( md . mobile ( ) ) {
* location . href = ( md . mobileGrade ( ) === 'A' ) ? '/mobile/' : '/lynx/' ;
* }
* < / p r e >
*
* @ param { string } userAgent typically taken from window . navigator . userAgent or http _header [ 'User-Agent' ]
* @ param { number } [ maxPhoneWidth = 600 ] < strong > only for browsers < / s t r o n g > s p e c i f y a v a l u e f o r t h e m a x i m u m
* width of smallest device side ( in logical "CSS" pixels ) until a device detected as mobile will be handled
* as phone .
* This is only used in cases where the device cannot be classified as phone or tablet . < br >
* See < a href = "http://developer.android.com/guide/practices/screens_support.html" > Declaring Tablet Layouts
* for Android < / a > . < b r >
* If you provide a value < 0 , then this "fuzzy" check is disabled .
* @ constructor
* @ global
* /
function MobileDetect ( userAgent , maxPhoneWidth ) {
this . ua = userAgent || '' ;
this . _cache = { } ;
//600dp is typical 7" tablet minimum width
this . maxPhoneWidth = maxPhoneWidth || 600 ;
}
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
MobileDetect . prototype = {
constructor : MobileDetect ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Returns the detected phone or tablet type or < tt > null < / t t > i f i t i s n o t a m o b i l e d e v i c e .
* < br >
* For a list of possible return values see { @ link MobileDetect # phone } and { @ link MobileDetect # tablet } . < br >
* < br >
* If the device is not detected by the regular expressions from Mobile - Detect , a test is made against
* the patterns of < a href = "http://detectmobilebrowsers.com/" > detectmobilebrowsers . com < / a > . I f t h i s t e s t
* is positive , a value of < code > UnknownPhone < / c o d e > , < c o d e > U n k n o w n T a b l e t < / c o d e > o r
* < code > UnknownMobile < / c o d e > i s r e t u r n e d . < b r >
* When used in browser , the decision whether phone or tablet is made based on < code > screen . width / height < / c o d e > . < b r >
* < br >
* When used server - side ( node . js ) , there is no way to tell the difference between < code > UnknownTablet < / c o d e >
* and < code > UnknownMobile < / c o d e > , s o y o u w i l l g e t < c o d e > U n k n o w n M o b i l e < / c o d e > h e r e . < b r >
* Be aware that since v1 . 0.0 in this special case you will get < code > UnknownMobile < / c o d e > o n l y f o r :
* { @ link MobileDetect # mobile } , not for { @ link MobileDetect # phone } and { @ link MobileDetect # tablet } .
* In versions before v1 . 0.0 all 3 methods returned < code > UnknownMobile < / c o d e > w h i c h w a s t e d i o u s t o u s e .
* < br >
* In most cases you will use the return value just as a boolean .
*
* @ returns { String } the key for the phone family or tablet family , e . g . "Nexus" .
* @ function MobileDetect # mobile
* /
mobile : function ( ) {
impl . prepareDetectionCache ( this . _cache , this . ua , this . maxPhoneWidth ) ;
return this . _cache . mobile ;
} ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Returns the detected phone type / family string or < tt > null < / t t > .
* < br >
* The returned tablet ( family or producer ) is one of following keys : < br >
* < br > < tt > iPhone , BlackBerry , HTC , Nexus , Dell , Motorola , Samsung , LG , Sony , Asus ,
* Micromax , Palm , Vertu , Pantech , Fly , Wiko , iMobile , SimValley , Wolfgang ,
* Alcatel , Nintendo , Amoi , INQ , GenericPhone < / t t > < b r >
* < br >
* If the device is not detected by the regular expressions from Mobile - Detect , a test is made against
* the patterns of < a href = "http://detectmobilebrowsers.com/" > detectmobilebrowsers . com < / a > . I f t h i s t e s t
* is positive , a value of < code > UnknownPhone < / c o d e > o r < c o d e > U n k n o w n M o b i l e < / c o d e > i s r e t u r n e d . < b r >
* When used in browser , the decision whether phone or tablet is made based on < code > screen . width / height < / c o d e > . < b r >
* < br >
* When used server - side ( node . js ) , there is no way to tell the difference between < code > UnknownTablet < / c o d e >
* and < code > UnknownMobile < / c o d e > , s o y o u w i l l g e t < c o d e > n u l l < / c o d e > h e r e , w h i l e { @ l i n k M o b i l e D e t e c t # m o b i l e }
* will return < code > UnknownMobile < / c o d e > . < b r >
* Be aware that since v1 . 0.0 in this special case you will get < code > UnknownMobile < / c o d e > o n l y f o r :
* { @ link MobileDetect # mobile } , not for { @ link MobileDetect # phone } and { @ link MobileDetect # tablet } .
* In versions before v1 . 0.0 all 3 methods returned < code > UnknownMobile < / c o d e > w h i c h w a s t e d i o u s t o u s e .
* < br >
* In most cases you will use the return value just as a boolean .
*
* @ returns { String } the key of the phone family or producer , e . g . "iPhone"
* @ function MobileDetect # phone
* /
phone : function ( ) {
impl . prepareDetectionCache ( this . _cache , this . ua , this . maxPhoneWidth ) ;
return this . _cache . phone ;
} ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Returns the detected tablet type / family string or < tt > null < / t t > .
* < br >
* The returned tablet ( family or producer ) is one of following keys : < br >
* < br > < tt > iPad , NexusTablet , SamsungTablet , Kindle , SurfaceTablet , HPTablet , AsusTablet ,
* BlackBerryTablet , HTCtablet , MotorolaTablet , NookTablet , AcerTablet ,
* ToshibaTablet , LGTablet , FujitsuTablet , PrestigioTablet , LenovoTablet ,
* DellTablet , YarvikTablet , MedionTablet , ArnovaTablet , IntensoTablet , IRUTablet ,
* MegafonTablet , EbodaTablet , AllViewTablet , ArchosTablet , AinolTablet ,
* SonyTablet , PhilipsTablet , CubeTablet , CobyTablet , MIDTablet , MSITablet ,
* SMiTTablet , RockChipTablet , FlyTablet , bqTablet , HuaweiTablet , NecTablet ,
* PantechTablet , BronchoTablet , VersusTablet , ZyncTablet , PositivoTablet ,
* NabiTablet , KoboTablet , DanewTablet , TexetTablet , PlaystationTablet ,
* TrekstorTablet , PyleAudioTablet , AdvanTablet , DanyTechTablet , GalapadTablet ,
* MicromaxTablet , KarbonnTablet , AllFineTablet , PROSCANTablet , YONESTablet ,
* ChangJiaTablet , GUTablet , PointOfViewTablet , OvermaxTablet , HCLTablet ,
* DPSTablet , VistureTablet , CrestaTablet , MediatekTablet , ConcordeTablet ,
* GoCleverTablet , ModecomTablet , VoninoTablet , ECSTablet , StorexTablet ,
* VodafoneTablet , EssentielBTablet , RossMoorTablet , iMobileTablet , TolinoTablet ,
* AudioSonicTablet , AMPETablet , SkkTablet , TecnoTablet , JXDTablet , iJoyTablet ,
* FX2Tablet , XoroTablet , ViewsonicTablet , OdysTablet , CaptivaTablet ,
* IconbitTablet , TeclastTablet , JaytechTablet , BlaupunktTablet , DigmaTablet ,
* EvolioTablet , LavaTablet , CelkonTablet , WolderTablet , MiTablet , NibiruTablet ,
* NexoTablet , UbislateTablet , PocketBookTablet , Hudl , TelstraTablet , GenericTablet < / t t > < b r >
* < br >
* If the device is not detected by the regular expressions from Mobile - Detect , a test is made against
* the patterns of < a href = "http://detectmobilebrowsers.com/" > detectmobilebrowsers . com < / a > . I f t h i s t e s t
* is positive , a value of < code > UnknownTablet < / c o d e > o r < c o d e > U n k n o w n M o b i l e < / c o d e > i s r e t u r n e d . < b r >
* When used in browser , the decision whether phone or tablet is made based on < code > screen . width / height < / c o d e > . < b r >
* < br >
* When used server - side ( node . js ) , there is no way to tell the difference between < code > UnknownTablet < / c o d e >
* and < code > UnknownMobile < / c o d e > , s o y o u w i l l g e t < c o d e > n u l l < / c o d e > h e r e , w h i l e { @ l i n k M o b i l e D e t e c t # m o b i l e }
* will return < code > UnknownMobile < / c o d e > . < b r >
* Be aware that since v1 . 0.0 in this special case you will get < code > UnknownMobile < / c o d e > o n l y f o r :
* { @ link MobileDetect # mobile } , not for { @ link MobileDetect # phone } and { @ link MobileDetect # tablet } .
* In versions before v1 . 0.0 all 3 methods returned < code > UnknownMobile < / c o d e > w h i c h w a s t e d i o u s t o u s e .
* < br >
* In most cases you will use the return value just as a boolean .
*
* @ returns { String } the key of the tablet family or producer , e . g . "SamsungTablet"
* @ function MobileDetect # tablet
* /
tablet : function ( ) {
impl . prepareDetectionCache ( this . _cache , this . ua , this . maxPhoneWidth ) ;
return this . _cache . tablet ;
} ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Returns the detected user - agent string or < tt > null < / t t > .
* < br >
* The returned user - agent is one of following keys : < br >
* < br > < tt > Chrome , Dolfin , Opera , Skyfire , IE , Firefox , Bolt , TeaShark , Blazer , Safari ,
* Tizen , UCBrowser , baiduboxapp , baidubrowser , DiigoBrowser , Puffin , Mercury ,
* ObigoBrowser , NetFront , GenericBrowser < / t t > < b r >
*
* @ returns { String } the key for the detected user - agent or < tt > null < / t t >
* @ function MobileDetect # userAgent
* /
userAgent : function ( ) {
if ( this . _cache . userAgent === undefined ) {
this . _cache . userAgent = impl . findMatch ( impl . mobileDetectRules . uas , this . ua ) ;
}
return this . _cache . userAgent ;
} ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Returns the detected operating system string or < tt > null < / t t > .
* < br >
* The operating system is one of following keys : < br >
* < br > < tt > AndroidOS , BlackBerryOS , PalmOS , SymbianOS , WindowsMobileOS , WindowsPhoneOS ,
* iOS , MeeGoOS , MaemoOS , JavaOS , webOS , badaOS , BREWOS < / t t > < b r >
*
* @ returns { String } the key for the detected operating system .
* @ function MobileDetect # os
* /
os : function ( ) {
if ( this . _cache . os === undefined ) {
this . _cache . os = impl . detectOS ( this . ua ) ;
}
return this . _cache . os ;
} ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Get the version ( as Number ) of the given property in the User - Agent .
* < br >
* Will return a float number . ( eg . 2_0 will return 2.0 , 4.3 . 1 will return 4.31 )
*
* @ param { String } key a key defining a thing which has a version . < br >
* You can use one of following keys : < br >
* < br > < tt > Mobile , Build , Version , VendorID , iPad , iPhone , iPod , Kindle , Chrome , Coast ,
* Dolfin , Firefox , Fennec , IE , NetFront , NokiaBrowser , Opera , Opera Mini , Opera
* Mobi , UC Browser , MQQBrowser , MicroMessenger , baiduboxapp , baidubrowser , Iron ,
* Safari , Skyfire , Tizen , Webkit , Gecko , Trident , Presto , iOS , Android ,
* BlackBerry , BREW , Java , Windows Phone OS , Windows Phone , Windows CE , Windows
* NT , Symbian , webOS < / t t > < b r >
*
* @ returns { Number } the version as float or < tt > NaN < / t t > i f U s e r - A g e n t d o e s n ' t c o n t a i n t h i s v e r s i o n .
* Be careful when comparing this value with '==' operator !
* @ function MobileDetect # version
* /
version : function ( key ) {
return impl . getVersion ( key , this . ua ) ;
} ,
2015-04-12 09:46:29 -07:00
/ * *
2015-07-10 22:03:05 -07:00
* Get the version ( as String ) of the given property in the User - Agent .
2015-04-12 09:46:29 -07:00
* < br >
*
2015-07-10 22:03:05 -07:00
* @ param { String } key a key defining a thing which has a version . < br >
* You can use one of following keys : < br >
* < br > < tt > Mobile , Build , Version , VendorID , iPad , iPhone , iPod , Kindle , Chrome , Coast ,
* Dolfin , Firefox , Fennec , IE , NetFront , NokiaBrowser , Opera , Opera Mini , Opera
* Mobi , UC Browser , MQQBrowser , MicroMessenger , baiduboxapp , baidubrowser , Iron ,
* Safari , Skyfire , Tizen , Webkit , Gecko , Trident , Presto , iOS , Android ,
* BlackBerry , BREW , Java , Windows Phone OS , Windows Phone , Windows CE , Windows
* NT , Symbian , webOS < / t t > < b r >
*
* @ returns { String } the "raw" version as String or < tt > null < / t t > i f U s e r - A g e n t d o e s n ' t c o n t a i n t h i s v e r s i o n .
2015-04-12 09:46:29 -07:00
*
2015-07-10 22:03:05 -07:00
* @ function MobileDetect # versionStr
2015-04-12 09:46:29 -07:00
* /
2015-07-10 22:03:05 -07:00
versionStr : function ( key ) {
return impl . getVersionStr ( key , this . ua ) ;
} ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Global test key against userAgent , os , phone , tablet and some other properties of userAgent string .
*
* @ param { String } key the key ( case - insensitive ) of a userAgent , an operating system , phone or
* tablet family . < br >
* For a complete list of possible values , see { @ link MobileDetect # userAgent } ,
* { @ link MobileDetect # os } , { @ link MobileDetect # phone } , { @ link MobileDetect # tablet } . < br >
* Additionally you have following keys : < br >
* < br > < tt > Bot , MobileBot , DesktopMode , TV , WebKit , Console , Watch < / t t > < b r >
*
* @ returns { boolean } < tt > true < / t t > w h e n t h e g i v e n k e y i s o n e o f t h e d e f i n e d k e y s o f u s e r A g e n t , o s , p h o n e ,
* tablet or one of the listed additional keys , otherwise < tt > false < / t t >
* @ function MobileDetect # is
* /
is : function ( key ) {
return equalIC ( key , this . userAgent ( ) ) ||
equalIC ( key , this . os ( ) ) ||
equalIC ( key , this . phone ( ) ) ||
equalIC ( key , this . tablet ( ) ) ||
equalIC ( key , impl . findMatch ( impl . mobileDetectRules . utils , this . ua ) ) ;
} ,
/ * *
* Do a quick test against navigator : : userAgent .
*
* @ param { String | RegExp } pattern the pattern , either as String or RegExp
* ( a string will be converted to a case - insensitive RegExp ) .
* @ returns { boolean } < tt > true < / t t > w h e n t h e p a t t e r n m a t c h e s , o t h e r w i s e < t t > f a l s e < / t t >
* @ function MobileDetect # match
* /
match : function ( pattern ) {
if ( ! ( pattern instanceof RegExp ) ) {
pattern = new RegExp ( pattern , 'i' ) ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
return pattern . test ( this . ua ) ;
} ,
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
/ * *
* Checks whether the mobile device can be considered as phone regarding < code > screen . width < / c o d e > .
* < br >
* Obviously this method makes sense in browser environments only ( not for Node . js ) !
* @ param { number } [ maxPhoneWidth ] the maximum logical pixels ( aka . CSS - pixels ) to be considered as phone . < br >
* The argument is optional and if not present or falsy , the value of the constructor is taken .
* @ returns { boolean | undefined } < code > undefined < / c o d e > i f s c r e e n s i z e w a s n ' t d e t e c t a b l e , e l s e < c o d e > t r u e < / c o d e >
* when screen . width is less or equal to maxPhoneWidth , otherwise < code > false < / c o d e > . < b r >
* Will always return < code > undefined < / c o d e > s e r v e r - s i d e .
* /
isPhoneSized : function ( maxPhoneWidth ) {
return MobileDetect . isPhoneSized ( maxPhoneWidth || this . maxPhoneWidth ) ;
} ,
/ * *
* Returns the mobile grade ( 'A' , 'B' , 'C' ) .
*
* @ returns { String } one of the mobile grades ( 'A' , 'B' , 'C' ) .
* @ function MobileDetect # mobileGrade
* /
mobileGrade : function ( ) {
if ( this . _cache . grade === undefined ) {
this . _cache . grade = impl . mobileGrade ( this ) ;
}
return this . _cache . grade ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
} ;
2015-04-12 09:46:29 -07:00
2015-07-10 22:03:05 -07:00
// environment-dependent
if ( typeof window !== 'undefined' && window . screen ) {
MobileDetect . isPhoneSized = function ( maxPhoneWidth ) {
return maxPhoneWidth < 0 ? undefined : impl . getDeviceSmallerSide ( ) <= maxPhoneWidth ;
} ;
2015-04-12 09:46:29 -07:00
} else {
2015-07-10 22:03:05 -07:00
MobileDetect . isPhoneSized = function ( ) { } ;
2015-04-12 09:46:29 -07:00
}
2015-07-10 22:03:05 -07:00
// should not be replaced by a completely new object - just overwrite existing methods
MobileDetect . _impl = impl ;
window . MobileDetect = MobileDetect ;
} ) ( ) ;
2015-04-12 09:46:29 -07:00
( function ( jQuery , window , undefined ) {
2014-10-23 21:54:35 -07:00
"use strict" ;
var matched , browser ;
jQuery . uaMatch = function ( ua ) {
ua = ua . toLowerCase ( ) ;
var match = /(chrome)[ \/]([\w.]+)/ . exec ( ua ) ||
2015-05-09 21:29:04 -07:00
/(safari)[ \/]([\w.]+)/ . exec ( ua ) ||
2014-10-23 21:54:35 -07:00
/(opera)(?:.*version|)[ \/]([\w.]+)/ . exec ( ua ) ||
/(msie) ([\w.]+)/ . exec ( ua ) ||
ua . indexOf ( "compatible" ) < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/ . exec ( ua ) ||
[ ] ;
var platform _match = /(ipad)/ . exec ( ua ) ||
/(iphone)/ . exec ( ua ) ||
/(android)/ . exec ( ua ) ||
[ ] ;
var browser = match [ 1 ] || "" ;
2015-05-11 09:32:15 -07:00
if ( ua . indexOf ( "windows phone" ) != - 1 || ua . indexOf ( "iemobile" ) != - 1 ) {
2015-05-11 12:59:59 -07:00
2015-05-11 09:32:15 -07:00
// http://www.neowin.net/news/ie11-fakes-user-agent-to-fool-gmail-in-windows-phone-81-gdr1-update
browser = "msie" ;
}
else if ( ua . indexOf ( "like gecko" ) != - 1 && ua . indexOf ( 'webkit' ) == - 1 && ua . indexOf ( 'opera' ) == - 1 && ua . indexOf ( 'chrome' ) == - 1 && ua . indexOf ( 'safari' ) == - 1 ) {
2014-10-23 21:54:35 -07:00
browser = "msie" ;
}
return {
browser : browser ,
version : match [ 2 ] || "0" ,
platform : platform _match [ 0 ] || ""
} ;
} ;
2015-05-06 20:11:51 -07:00
var userAgent = window . navigator . userAgent ;
matched = jQuery . uaMatch ( userAgent ) ;
2014-10-23 21:54:35 -07:00
browser = { } ;
if ( matched . browser ) {
browser [ matched . browser ] = true ;
browser . version = matched . version ;
}
if ( matched . platform ) {
browser [ matched . platform ] = true ;
}
2015-05-11 12:59:59 -07:00
if ( userAgent . toLowerCase ( ) . indexOf ( "webkit" ) != - 1 && ! browser . chrome && ! browser . msie ) {
2015-05-10 14:56:13 -07:00
browser . safari = true ;
}
2015-05-06 20:11:51 -07:00
var md = new MobileDetect ( userAgent ) ;
2015-04-12 09:46:29 -07:00
2015-05-11 12:59:59 -07:00
if ( md . mobile ( ) ) {
browser . mobile = true ;
} else {
browser . mobile = null ;
}
2015-05-09 21:29:04 -07:00
2015-05-06 20:11:51 -07:00
if ( browser . msie && ! browser . mobile && userAgent . toLowerCase ( ) . indexOf ( "xbox" ) != - 1 ) {
browser . tv = true ;
}
2015-05-11 12:59:59 -07:00
2015-06-19 10:22:54 -07:00
if ( browser . ipad || browser . iphone ) {
2015-06-19 11:34:21 -07:00
if ( userAgent . toLowerCase ( ) . indexOf ( 'cpu os 9' ) != - 1 ) {
2015-06-19 10:22:54 -07:00
browser . iOSVersion = 9 ;
}
2015-06-19 11:34:21 -07:00
else if ( userAgent . toLowerCase ( ) . indexOf ( 'cpu os 8' ) != - 1 ) {
2015-06-19 10:22:54 -07:00
browser . iOSVersion = 8 ;
}
2015-06-19 11:34:21 -07:00
else if ( userAgent . toLowerCase ( ) . indexOf ( 'cpu os 7' ) != - 1 ) {
2015-06-19 10:22:54 -07:00
browser . iOSVersion = 7 ;
}
}
2014-10-23 21:54:35 -07:00
jQuery . browser = browser ;
2015-04-12 09:46:29 -07:00
} ) ( jQuery , window ) ;