Plugin Directory

Changeset 1184365


Ignore:
Timestamp:
06/19/2015 06:06:09 PM (11 years ago)
Author:
iqbalbary
Message:

Update 19-6-2015

Location:
mobile-redirect-plus-lite/trunk
Files:
3 added
4 edited

Legend:

Unmodified
Added
Removed
  • mobile-redirect-plus-lite/trunk/includes/Mobile_Detect.php

    r983434 r1184365  
    99 * It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.
    1010 *
    11  * @author      Current authors: Serban Ghita <serbanghita@gmail.com>, Nick Ilyin <nick.ilyin@gmail.com>
     11 * @author      Current authors: Serban Ghita <serbanghita@gmail.com>
     12 *                               Nick Ilyin <nick.ilyin@gmail.com>
     13 *
    1214 *              Original author: Victor Stanciu <vic.stanciu@gmail.com>
    1315 *
     
    2123 *              HOWTO:        https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
    2224 *
    23  * @version     2.8.3
     25 * @version     2.8.15
    2426 */
    2527
     
    6567     * Stores the version number of the current release.
    6668     */
    67     const VERSION                   = '2.8.3';
     69    const VERSION                   = '2.8.15';
    6870
    6971    /**
     
    7678     */
    7779    const VERSION_TYPE_FLOAT        = 'float';
     80
     81    /**
     82     * A cache for resolved matches
     83     * @var array
     84     */
     85    protected $cache = array();
    7886
    7987    /**
     
    8896     */
    8997    protected $httpHeaders = array();
     98
     99    /**
     100     * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer.
     101     * @var array
     102     */
     103    protected $cloudfrontHeaders = array();
     104
     105    /**
     106     * The matching Regex.
     107     * This is good for debug.
     108     * @var string
     109     */
     110    protected $matchingRegex = null;
     111
     112    /**
     113     * The matches extracted from the regex expression.
     114     * This is good for debug.
     115     * @var string
     116     */
     117    protected $matchesArray = null;
    90118
    91119    /**
     
    128156            // Reported by Verizon, Vodafone proxy system.
    129157            'HTTP_X_MOBILE_GATEWAY'        => null,
    130             // Seend this on HTC Sensation. @ref: SensationXE_Beats_Z715e.
     158            // Seen this on HTC Sensation. SensationXE_Beats_Z715e.
    131159            'HTTP_X_ATT_DEVICEID'          => null,
    132160            // Seen this on a HTC.
     
    140168     */
    141169    protected static $phoneDevices = array(
    142         'iPhone'        => '\biPhone.*|\biPod', // |\biTunes
     170        'iPhone'        => '\biPhone\b|\biPod\b', // |\biTunes
    143171        'BlackBerry'    => 'BlackBerry|\bBB10\b|rim[0-9]+',
    144172        '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',
    145         'Nexus'         => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile',
     173        'Nexus'         => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6',
    146174        // @todo: Is 'Dell Streak' a tablet or a phone? ;)
    147175        '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',
    148         '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',
    149         '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-26UC|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-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E',
    150         'LG'            => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|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)',
    151         'Sony'          => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i',
     176        '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|XT1021|\bMoto E\b',
     177        'Samsung'       => 'Samsung|SM-G9250|GT-19300|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-26UC|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-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205',
     178        '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)',
     179        'Sony'          => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533',
    152180        'Asus'          => 'Asus.*Galaxy|PadFone.*Mobile',
    153         // @ref: http://www.micromaxinfo.com/mobiles/smartphones
     181        // http://www.micromaxinfo.com/mobiles/smartphones
    154182        // Added because the codes might conflict with Acer Tablets.
    155183        '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',
    156         'Palm'          => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex.
     184        // @todo Complete the regex.
     185        'Palm'          => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ;
    157186        'Vertu'         => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;)
    158         // @ref: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH)
     187        // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH)
    159188        // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android.
    160189        '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',
    161         // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
     190        // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
    162191        'Fly'           => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
    163        'iMobile'        => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
     192        // http://fr.wikomobile.com
     193        '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',
     194        'iMobile'        => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
    164195        // Added simvalley mobile just for fun. They have some interesting devices.
    165         // @ref: http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
     196        // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
    166197        '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',
     198         // Wolfgang - a brand that is sold by Aldi supermarkets.
     199         // http://www.wolfgangmobile.com/
     200        'Wolfgang'      => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q',
    167201        'Alcatel'       => 'Alcatel',
    168         // @ref: http://en.wikipedia.org/wiki/Amoi
     202        'Nintendo' => 'Nintendo 3DS',
     203        // http://en.wikipedia.org/wiki/Amoi
    169204        'Amoi'          => 'Amoi',
    170         // @ref: http://en.wikipedia.org/wiki/INQ
     205        // http://en.wikipedia.org/wiki/INQ
    171206        'INQ'           => 'INQ',
    172         // @Tapatalk is a mobile app; @ref: http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
     207        // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
    173208        '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',
    174209    );
     
    181216    protected static $tabletDevices = array(
    182217        'iPad'              => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic.
    183         'NexusTablet'       => 'Android.*Nexus[\s]+(7|10)|^.*Android.*Nexus(?:(?!Mobile).)*$',
    184         '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-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', // SCH-P709|SCH-P729|SM-T2558 - Samsung Mega - treat them like a regular phone.
    185         // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/
    186         'Kindle'            => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE)\b',
     218        'NexusTablet'       => 'Android.*Nexus[\s]+(7|9|10)|^.*Android.*Nexus(?:(?!Mobile).)*$',
     219        '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-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-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone.
     220        // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
     221        'Kindle'            => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b',
    187222        // Only the Surface tablets with Windows RT are considered mobile.
    188         // @ref: http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
    189         'SurfaceTablet'     => 'Windows NT [0-9.]+; ARM;',
    190         // @ref: http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT
     223        // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
     224        'SurfaceTablet'     => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)',
     225        // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT
    191226        'HPTablet'          => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10',
    192         // @note: watch out for PadFone, see #132
    193         '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|TX201LA',
     227        // Watch out for PadFone, see #132.
     228        // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/
     229        '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| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C',
    194230        'BlackBerryTablet'  => 'PlayBook|RIM Tablet',
    195         'HTCtablet'         => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200',
     231        'HTCtablet'         => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410',
    196232        'MotorolaTablet'    => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
    197233        'NookTablet'        => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2',
    198         // @ref: http://www.acer.ro/ac/ro/RO/content/drivers
    199         // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
    200         // @ref: http://us.acer.com/ac/en/US/content/group/tablets
    201         // @note: Can conflict with Micromax and Motorola phones codes.
    202         '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',
    203         // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
    204         // @ref: http://us.toshiba.com/tablets/tablet-finder
    205         // @ref: http://www.toshiba.co.jp/regza/tablet/
     234        // http://www.acer.ro/ac/ro/RO/content/drivers
     235        // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
     236        // http://us.acer.com/ac/en/US/content/group/tablets
     237        // http://www.acer.de/ac/de/DE/content/models/tablets/
     238        // Can conflict with Micromax and Motorola phones codes.
     239        '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',
     240        // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
     241        // http://us.toshiba.com/tablets/tablet-finder
     242        // http://www.toshiba.co.jp/regza/tablet/
    206243        'ToshibaTablet'     => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO',
    207         // @ref: http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
    208         // @ref: http://www.lg.com/us/tablets
    209         'LGTablet'          => '\bL-06C|LG-V900|LG-V500|LG-V909|LG-V500|LG-V510|LG-VK810\b',
     244        // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
     245        // http://www.lg.com/us/tablets
     246        'LGTablet'          => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b',
    210247        'FujitsuTablet'     => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b',
    211248        // Prestigio Tablets http://www.prestigio.com/support
    212249        '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',
    213         // @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
    214         'LenovoTablet'      => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)',
    215         // @ref: http://www.yarvik.com/en/matrix/tablets/
     250        // http://support.lenovo.com/en_GB/downloads/default.page?#
     251        '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|)',
     252        // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets
     253        'DellTablet'        => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7',
     254        // http://www.yarvik.com/en/matrix/tablets/
    216255        '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',
    217256        'MedionTablet'      => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
    218         'ArnovaTablet'      => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT',
     257        'ArnovaTablet'      => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2',
    219258        // http://www.intenso.de/kategorie_en.php?kategorie=33
    220259        // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate
     
    223262        'IRUTablet'         => 'M702pro',
    224263        'MegafonTablet'     => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b',
    225         // @ref: http://www.e-boda.ro/tablete-pc.html
     264        // http://www.e-boda.ro/tablete-pc.html
    226265        'EbodaTablet'       => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)',
    227         // @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
     266        // http://www.allview.ro/produse/droseries/lista-tablete-pc/
    228267        'AllViewTablet'           => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)',
    229         // @reference: http://wiki.archosfans.com/index.php?title=Main_Page
     268        // http://wiki.archosfans.com/index.php?title=Main_Page
    230269        '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',
    231         // @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
     270        // http://www.ainol.com/plugin.php?identifier=ainol&module=product
    232271        'AinolTablet'       => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark',
    233272        // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
    234         // @ref: Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
    235         // @ref: http://www.sony.jp/support/tablet/
    236         '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',
    237         // @ref: db + http://www.cube-tablet.com/buy-products.html
     273        // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
     274        // http://www.sony.jp/support/tablet/
     275        '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',
     276        // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8
     277        'PhilipsTablet'     => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b',
     278        // db + http://www.cube-tablet.com/buy-products.html
    238279        'CubeTablet'        => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT',
    239         // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001
     280        // http://www.cobyusa.com/?p=pcat&pcat_id=3001
    240281        'CobyTablet'        => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
    241         // @ref: http://www.match.net.cn/products.asp
     282        // http://www.match.net.cn/products.asp
    242283        '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',
    243         // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
    244         // @ref: http://www.imp3.net/14/show.php?itemid=20454
     284        // http://www.msi.com/support
     285        // @todo Research the Windows Tablets.
     286        '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',
     287        // @todo http://www.kyoceramobile.com/support/drivers/
     288    //    'KyoceraTablet' => null,
     289        // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/
     290    //    'IntextTablet' => null,
     291        // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
     292        // http://www.imp3.net/14/show.php?itemid=20454
    245293        'SMiTTablet'        => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)',
    246         // @ref: http://www.rock-chips.com/index.php?do=prod&pid=2
     294        // http://www.rock-chips.com/index.php?do=prod&pid=2
    247295        'RockChipTablet'    => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A',
    248         // @ref: http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/
     296        // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/
    249297        'FlyTablet'         => 'IQ310|Fly Vision',
    250         // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html
    251         'bqTablet'          => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus',
    252         // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
    253         // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
     298        // http://www.bqreaders.com/gb/tablets-prices-sale.html
     299        'bqTablet'          => '(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus',
     300        // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
     301        // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
    254302        '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',
    255303        // Nec or Medias Tab
     
    259307        // Broncho Tablets: http://www.broncho.cn/ (hard to find)
    260308        'BronchoTablet'     => 'Broncho.*(N701|N708|N802|a710)',
    261         // @ref: http://versusuk.com/support.html
     309        // http://versusuk.com/support.html
    262310        'VersusTablet'      => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b',
    263         // @ref: http://www.zync.in/index.php/our-products/tablet-phablets
     311        // http://www.zync.in/index.php/our-products/tablet-phablets
    264312        'ZyncTablet'        => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900',
    265         // @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
     313        // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
    266314        'PositivoTablet'    => 'TB07STA|TB10STA|TB07FTA|TB10FTA',
    267         // @ref: https://www.nabitablet.com/
     315        // https://www.nabitablet.com/
    268316        'NabiTablet'        => 'Android.*\bNabi',
    269317        'KoboTablet'        => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build',
     
    272320        // Texet Tablets and Readers http://www.texet.ru/tablet/
    273321        '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',
    274         // @note: Avoid detecting 'PLAYSTATION 3' as mobile.
     322        // Avoid detecting 'PLAYSTATION 3' as mobile.
    275323        'PlaystationTablet' => 'Playstation.*(Portable|Vita)',
    276         // @ref: http://www.trekstor.de/surftabs.html
     324        // http://www.trekstor.de/surftabs.html
    277325        'TrekstorTablet'    => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab',
    278         // @ref: http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets
     326        // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets
    279327        'PyleAudioTablet'   => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b',
    280         // @ref: http://www.advandigital.com/index.php?link=content-product&jns=JP001
    281         // @Note: because of the short codenames we have to include whitespaces to reduce the possible conflicts.
     328        // http://www.advandigital.com/index.php?link=content-product&jns=JP001
     329        // because of the short codenames we have to include whitespaces to reduce the possible conflicts.
    282330        '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 ',
    283         // @ref: http://www.danytech.com/category/tablet-pc
     331        // http://www.danytech.com/category/tablet-pc
    284332        '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',
    285         // @ref: http://www.galapad.net/product.html
     333        // http://www.galapad.net/product.html
    286334        'GalapadTablet'     => 'Android.*\bG1\b',
    287         // @ref: http://www.micromaxinfo.com/tablet/funbook
     335        // http://www.micromaxinfo.com/tablet/funbook
    288336        'MicromaxTablet'    => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b',
    289337        // http://www.karbonnmobiles.com/products_tablet.php
    290338        'KarbonnTablet'     => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b',
    291         // @ref: http://www.myallfine.com/Products.asp
     339        // http://www.myallfine.com/Products.asp
    292340        'AllFineTablet'     => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide',
    293         // @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
     341        // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
    294342        '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',
    295         // @ref: http://www.yonesnav.com/products/products.php
     343        // http://www.yonesnav.com/products/products.php
    296344        'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026',
    297         // @ref: http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
     345        // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
    298346        // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html)
    299347        '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',
    300         // @ref: http://www.gloryunion.cn/products.asp
    301         // @ref: http://www.allwinnertech.com/en/apply/mobile.html
    302         // @ref: http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB)
     348        // http://www.gloryunion.cn/products.asp
     349        // http://www.allwinnertech.com/en/apply/mobile.html
     350        // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB)
    303351        // @todo: Softwiner tablets?
    304352        // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions.
    305353        'GUTablet'          => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G
    306         // @ref: http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118
     354        // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118
    307355        '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',
    308         // @ref: http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
     356        // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
    309357        // @todo: add more tests.
    310358        'OvermaxTablet'     => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)',
    311         // @ref: http://hclmetablet.com/India/index.php
     359        // http://hclmetablet.com/India/index.php
    312360        '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',
    313         // @ref: http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html
     361        // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html
    314362        'DPSTablet'         => 'DPS Dream 9|DPS Dual 7',
    315         // @ref: http://www.visture.com/index.asp
     363        // http://www.visture.com/index.asp
    316364        'VistureTablet'     => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10',
    317         // @ref: http://www.mijncresta.nl/tablet
     365        // http://www.mijncresta.nl/tablet
    318366        'CrestaTablet'     => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989',
    319367        // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309
     
    341389        // i-mobile http://product.i-mobilephone.com/Mobile_Device
    342390        'iMobileTablet'        => 'i-mobile i-note',
    343         // @ref: http://www.tolino.de/de/vergleichen/
     391        // http://www.tolino.de/de/vergleichen/
    344392        'TolinoTablet'  => 'tolino tab [0-9.]+|tolino shine',
    345393        // AudioSonic - a Kmart brand
     
    365413        'ViewsonicTablet'   => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a',
    366414        // http://www.odys.de/web/internet-tablet_en.html
    367         'OdysTablet'        => 'LOOX|XENO10|ODYS( Space|-EVO|-Xpress)|Xelio( |)(10|7|)( |)(Pro|EXTREME|PHONETAB|PT2|)|NEO_QUAD10',
     415        'OdysTablet'        => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10',
    368416        // http://www.captiva-power.de/products.html#tablets-en
    369417        'CaptivaTablet'     => 'CAPTIVA PAD',
    370418        // IconBIT - http://www.iconbit.com/products/tablets/
    371419        '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',
    372         // @ref: http://www.tesco.com/direct/hudl/
    373         'Hudl'              => 'Hudl HT7S3',
    374         // @ref: http://www.telstra.com.au/home-phone/thub-2/
    375         'TelstraTablet'     => 'T-Hub2',
     420        // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63
     421        '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',
     422        // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price
     423        'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+',
    376424        'JaytechTablet'     => 'TPC-PA762',
    377425        'BlaupunktTablet'   => 'Endeavour 800NG|Endeavour 1010',
    378         '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|Tablet-PC-4|Tagi Tab',
     426        // http://www.digma.ru/support/download/
     427        // @todo: Ebooks also (if requested)
     428        'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b',
     429        // http://www.evolioshop.com/ro/tablete-pc.html
     430        // http://www.evolio.ro/support/downloads_static.html?cat=2
     431        // @todo: Research some more
     432        'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b',
     433        // @todo http://www.lavamobiles.com/tablets-data-cards
     434        'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b',
     435        // https://www.celkonmobiles.com/?_a=categoryphones&sid=2
     436        'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b',
     437        // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab
     438        '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',
     439        // http://www.mi.com/en
     440        'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b',
     441        // http://www.nbru.cn/index.html
     442        'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One',
     443        // http://navroad.com/products/produkty/tablety/
     444        'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI',
     445        // http://www.datawind.com/ubislate/
     446        'UbislateTablet' => 'UbiSlate[\s]?7C',
     447        // http://www.pocketbook-int.com/ru/support
     448        'PocketBookTablet' => 'Pocketbook',
     449        // http://www.tesco.com/direct/hudl/
     450        'Hudl'              => 'Hudl HT7S3',
     451        // http://www.telstra.com.au/home-phone/thub-2/
     452        'TelstraTablet'     => 'T-Hub2',
     453        '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'
    379454    );
    380455
     
    394469        // http://wifeng.cn/?r=blog&a=view&id=106
    395470        // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
    396         'WindowsPhoneOS'   => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7',
     471        // http://msdn.microsoft.com/library/ms537503.aspx
     472        'WindowsPhoneOS'   => 'Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
    397473        'iOS'               => '\biPhone.*Mobile|\biPod|\biPad',
    398474        // http://en.wikipedia.org/wiki/MeeGo
     
    425501        'Blazer'          => 'Blazer',
    426502        // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3
    427         'Safari'          => 'Version.*Mobile.*Safari|Safari.*Mobile',
    428         // @ref: http://en.wikipedia.org/wiki/Midori_(web_browser)
     503        'Safari'          => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari',
     504        // http://en.wikipedia.org/wiki/Midori_(web_browser)
    429505        //'Midori'          => 'midori',
    430506        'Tizen'           => 'Tizen',
     
    432508        'baiduboxapp'     => 'baiduboxapp',
    433509        'baidubrowser'    => 'baidubrowser',
    434         // @ref: https://github.com/serbanghita/Mobile-Detect/issues/7
     510        // https://github.com/serbanghita/Mobile-Detect/issues/7
    435511        'DiigoBrowser'    => 'DiigoBrowser',
    436512        // http://www.puffinbrowser.com/index.php
    437513        'Puffin'            => 'Puffin',
    438         // @ref: http://mercury-browser.com/index.html
     514        // http://mercury-browser.com/index.html
    439515        'Mercury'          => '\bMercury\b',
    440         // @ref: http://en.wikipedia.org/wiki/Obigo_Browser
     516        // http://en.wikipedia.org/wiki/Obigo_Browser
    441517        'ObigoBrowser' => 'Obigo',
    442         // @ref: http://en.wikipedia.org/wiki/NetFront
     518        // http://en.wikipedia.org/wiki/NetFront
    443519        'NetFront' => 'NF-Browser',
    444520        // @reference: http://en.wikipedia.org/wiki/Minimo
     
    454530    protected static $utilities = array(
    455531        // Experimental. When a mobile device wants to switch to 'Desktop Mode'.
    456         // @ref: http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/
    457         // @ref: https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
     532        // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/
     533        // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
     534        // https://developers.facebook.com/docs/sharing/best-practices
     535        'Bot'         => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor',
     536        'MobileBot'   => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2',
    458537        'DesktopMode' => 'WPDesktop',
    459538        'TV'          => 'SonyDTV|HbbTV', // experimental
    460539        'WebKit'      => '(webkit)[ /]([\w.]+)',
    461         'Bot'         => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit',
    462         'MobileBot'   => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2',
    463540        // @todo: Include JXD consoles.
    464         'Console'     => '\b(Nintendo|Nintendo WiiU|PLAYSTATION|Xbox)\b',
     541        'Console'     => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b',
    465542        'Watch'       => 'SM-V700',
    466543    );
     
    514591        'Firefox'       => 'Firefox/[VER]',
    515592        'Fennec'        => 'Fennec/[VER]',
    516         // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
    517         'IE'      => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'),
     593        // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
     594        // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx
     595        'IE'      => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'),
    518596        // http://en.wikipedia.org/wiki/NetFront
    519597        'NetFront'      => 'NetFront/[VER]',
     
    527605        'baiduboxapp'   => 'baiduboxapp/[VER]',
    528606        'baidubrowser'  => 'baidubrowser/[VER]',
     607        'Iron'          => 'Iron/[VER]',
    529608        // @note: Safari 7534.48.3 is actually Version 5.1.
    530609        // @note: On BlackBerry the Version is overwriten by the OS.
     
    540619
    541620        // OS
    542         'iOS'              => ' \bOS\b [VER] ',
     621        'iOS'              => ' \bi?OS\b [VER][ ;]{1}',
    543622        'Android'          => 'Android [VER]',
    544623        'BlackBerry'       => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'),
     
    593672    public function setHttpHeaders($httpHeaders = null)
    594673    {
    595         //use global _SERVER if $httpHeaders aren't defined
     674        // use global _SERVER if $httpHeaders aren't defined
    596675        if (!is_array($httpHeaders) || !count($httpHeaders)) {
    597676            $httpHeaders = $_SERVER;
    598677        }
    599678
    600         //clear existing headers
     679        // clear existing headers
    601680        $this->httpHeaders = array();
    602681
    603         //Only save HTTP headers. In PHP land, that means only _SERVER vars that
    604         //start with HTTP_.
     682        // Only save HTTP headers. In PHP land, that means only _SERVER vars that
     683        // start with HTTP_.
    605684        foreach ($httpHeaders as $key => $value) {
    606             if (substr($key,0,5) == 'HTTP_') {
     685            if (substr($key, 0, 5) === 'HTTP_') {
    607686                $this->httpHeaders[$key] = $value;
    608687            }
    609688        }
     689
     690        // In case we're dealing with CloudFront, we need to know.
     691        $this->setCfHeaders($httpHeaders);
    610692    }
    611693
     
    632714    public function getHttpHeader($header)
    633715    {
    634         //are we using PHP-flavored headers?
     716        // are we using PHP-flavored headers?
    635717        if (strpos($header, '_') === false) {
    636718            $header = str_replace('-', '_', $header);
     
    638720        }
    639721
    640         //test the alternate, too
     722        // test the alternate, too
    641723        $altHeader = 'HTTP_' . $header;
    642724
     
    667749    }
    668750
     751   
     752    /**
     753     * Set CloudFront headers
     754     * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device
     755     *
     756     * @param array $cfHeaders List of HTTP headers
     757     *
     758     * @return  boolean If there were CloudFront headers to be set
     759     */
     760    public function setCfHeaders($cfHeaders = null) {
     761        // use global _SERVER if $cfHeaders aren't defined
     762        if (!is_array($cfHeaders) || !count($cfHeaders)) {
     763            $cfHeaders = $_SERVER;
     764        }
     765
     766        // clear existing headers
     767        $this->cloudfrontHeaders = array();
     768
     769        // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that
     770        // start with cloudfront-.
     771        $response = false;
     772        foreach ($cfHeaders as $key => $value) {
     773            if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') {
     774                $this->cloudfrontHeaders[strtoupper($key)] = $value;
     775                $response = true;
     776            }
     777        }
     778
     779        return $response;
     780    }
     781
     782    /**
     783     * Retrieves the cloudfront headers.
     784     *
     785     * @return array
     786     */
     787    public function getCfHeaders()
     788    {
     789        return $this->cloudfrontHeaders;
     790    }
     791
    669792    /**
    670793     * Set the User-Agent to be used.
     
    676799    public function setUserAgent($userAgent = null)
    677800    {
    678         if (!empty($userAgent)) {
     801        // Invalidate cache due to #375
     802        $this->cache = array();
     803
     804        if (false === empty($userAgent)) {
    679805            return $this->userAgent = $userAgent;
    680806        } else {
    681 
    682807            $this->userAgent = null;
    683 
    684808            foreach ($this->getUaHttpHeaders() as $altHeader) {
    685                 if (!empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban)
     809                if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban)
    686810                    $this->userAgent .= $this->httpHeaders[$altHeader] . " ";
    687811                }
    688812            }
    689813
    690             return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null);
    691 
    692         }
     814            if (!empty($this->userAgent)) {
     815                return $this->userAgent = trim($this->userAgent);
     816            }
     817        }
     818
     819        if (count($this->getCfHeaders()) > 0) {
     820            return $this->userAgent = 'Amazon CloudFront';
     821        }
     822        return $this->userAgent = null;
    693823    }
    694824
     
    718848        }
    719849
    720         if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) {
     850        if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) {
    721851            return;
    722852        }
    723853
    724854        $this->detectionType = $type;
     855    }
     856
     857    public function getMatchingRegex()
     858    {
     859        return $this->matchingRegex;
     860    }
     861
     862    public function getMatchesArray()
     863    {
     864        return $this->matchesArray;
    725865    }
    726866
     
    8641004
    8651005        foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) {
    866             if ( isset($this->httpHeaders[$mobileHeader]) ) {
    867                 if ( is_array($matchType['matches']) ) {
     1006            if (isset($this->httpHeaders[$mobileHeader])) {
     1007                if (is_array($matchType['matches'])) {
    8681008                    foreach ($matchType['matches'] as $_match) {
    869                         if ( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ) {
     1009                        if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) {
    8701010                            return true;
    8711011                        }
     
    8941034    public function __call($name, $arguments)
    8951035    {
    896         //make sure the name starts with 'is', otherwise
    897         if (substr($name, 0, 2) != 'is') {
     1036        // make sure the name starts with 'is', otherwise
     1037        if (substr($name, 0, 2) !== 'is') {
    8981038            throw new BadMethodCallException("No such method exists: $name");
    8991039        }
     
    9091049     * Find a detection rule that matches the current User-agent.
    9101050     *
    911      * @param null $userAgent deprecated
     1051     * @param  null    $userAgent deprecated
    9121052     * @return boolean
    9131053     */
     
    9191059                continue;
    9201060            }
     1061
    9211062            if ($this->match($_regex, $userAgent)) {
    9221063                return true;
     
    9301071     * Search for a certain key in the rules array.
    9311072     * If the key is found the try to match the corresponding
    932      * regex agains the User-Agent.
     1073     * regex against the User-Agent.
    9331074     *
    9341075     * @param string $key
    935      * @param null $userAgent deprecated
    936      * @return mixed
    937      */
    938     protected function matchUAAgainstKey($key, $userAgent = null)
     1076     *
     1077     * @return boolean
     1078     */
     1079    protected function matchUAAgainstKey($key)
    9391080    {
    9401081        // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc.
    9411082        $key = strtolower($key);
    942 
    943         //change the keys to lower case
    944         $_rules = array_change_key_case($this->getRules());
    945 
    946         if (array_key_exists($key, $_rules)) {
    947             if (empty($_rules[$key])) {
    948                 return null;
     1083        if (false === isset($this->cache[$key])) {
     1084
     1085            // change the keys to lower case
     1086            $_rules = array_change_key_case($this->getRules());
     1087
     1088            if (false === empty($_rules[$key])) {
     1089                $this->cache[$key] = $this->match($_rules[$key]);
    9491090            }
    9501091
    951             return $this->match($_rules[$key], $userAgent);
    952         }
    953 
    954         return false;
     1092            if (false === isset($this->cache[$key])) {
     1093                $this->cache[$key] = false;
     1094            }
     1095        }
     1096
     1097        return $this->cache[$key];
    9551098    }
    9561099
     
    9581101     * Check if the device is mobile.
    9591102     * Returns true if any type of mobile device detected, including special ones
    960      * @param null $userAgent deprecated
    961      * @param null $httpHeaders deprecated
     1103     * @param  null $userAgent  deprecated
     1104     * @param  null $httpHeaders deprecated
    9621105     * @return bool
    9631106     */
     
    9711114        if ($userAgent) {
    9721115            $this->setUserAgent($userAgent);
     1116        }
     1117
     1118        // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
     1119        if ($this->getUserAgent() === 'Amazon CloudFront') {
     1120            $cfHeaders = $this->getCfHeaders();
     1121            if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') {
     1122                return true;
     1123            }
    9731124        }
    9741125
     
    9931144    public function isTablet($userAgent = null, $httpHeaders = null)
    9941145    {
     1146        // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
     1147        if ($this->getUserAgent() === 'Amazon CloudFront') {
     1148            $cfHeaders = $this->getCfHeaders();
     1149            if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') {
     1150                return true;
     1151            }
     1152        }
     1153
    9951154        $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
    9961155
     
    10091168     * @todo: The httpHeaders part is not yet used.
    10101169     *
    1011      * @param string $key
    1012      * @param string        $userAgent   deprecated
    1013      * @param string        $httpHeaders deprecated
     1170     * @param  string        $key
     1171     * @param  string        $userAgent   deprecated
     1172     * @param  string        $httpHeaders deprecated
    10141173     * @return bool|int|null
    10151174     */
     
    10471206    public function match($regex, $userAgent = null)
    10481207    {
    1049         // Escape the special character which is the delimiter.
    1050         $regex = str_replace('/', '\/', $regex);
    1051 
    1052         return (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent));
     1208        $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches);
     1209        // If positive match is found, store the results for debug.
     1210        if ($match) {
     1211            $this->matchingRegex = $regex;
     1212            $this->matchesArray = $matches;
     1213        }
     1214
     1215        return $match;
    10531216    }
    10541217
     
    11031266        }
    11041267
    1105         //set the $type to the default if we don't recognize the type
    1106         if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) {
     1268        // set the $type to the default if we don't recognize the type
     1269        if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) {
    11071270            $type = self::VERSION_TYPE_STRING;
    11081271        }
     
    11111274
    11121275        // Check if the property exists in the properties array.
    1113         if (array_key_exists($propertyName, $properties)) {
     1276        if (true === isset($properties[$propertyName])) {
    11141277
    11151278            // Prepare the pattern to be matched.
     
    11211284                $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString);
    11221285
    1123                 // Escape the special character which is the delimiter.
    1124                 $propertyPattern = str_replace('/', '\/', $propertyPattern);
    1125 
    11261286                // Identify and extract the version.
    1127                 preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match);
    1128 
    1129                 if (!empty($match[1])) {
    1130                     $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] );
     1287                preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match);
     1288
     1289                if (false === empty($match[1])) {
     1290                    $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]);
    11311291
    11321292                    return $version;
     
    11501310
    11511311        if (
    1152             // 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)
    1153             $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 ||
    1154             $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=3.1 ||
    1155             $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)>=3.1 ||
     1312            // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0)
     1313            $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 ||
     1314            $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 ||
     1315            $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 ||
    11561316
    11571317            // 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)
     
    11611321            ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) ||
    11621322
    1163             // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800
    1164             $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.0 ||
    1165 
    1166             // Blackberry 7 - Tested on BlackBerry Torch 9810
    1167             // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670
    1168             $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 ||
     1323            // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8)
     1324            $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 ||
     1325
     1326            // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10)
     1327            $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 ||
    11691328            // Blackberry Playbook (1.0-2.0) - Tested on PlayBook
    11701329            $this->match('Playbook.*Tablet') ||
    11711330
    1172             // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0)
    1173             ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) ||
     1331            // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0)
     1332            ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) ||
    11741333            // Palm WebOS 3.0  - Tested on HP TouchPad
    11751334            $this->match('hp.*TouchPad') ||
    11761335
    1177             // Firefox Mobile (12 Beta) - Tested on Android 2.3 device
    1178             ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=12 ) ||
     1336            // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices
     1337            ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) ||
    11791338
    11801339            // Chrome for Android - Tested on Android 4.0, 4.1 device
    1181             ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) ||
     1340            ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) ||
    11821341
    11831342            // Skyfire 4.1 - Tested on Android 2.3 device
    1184             ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) ||
     1343            ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
    11851344
    11861345            // Opera Mobile 11.5-12: Tested on Android 2.3
    1187             ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>11 && $this->is('AndroidOS') ) ||
     1346            ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) ||
    11881347
    11891348            // Meego 1.2 - Tested on Nokia 950 and N9
     
    11951354            // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser
    11961355            // @todo: more tests here!
    1197             $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 ||
     1356            $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 ||
    11981357
    11991358            // UC Browser - Tested on Android 2.3 device
    1200             ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) ||
     1359            ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
    12011360
    12021361            // Kindle 3 and Fire  - Tested on the built-in WebKit browser for each
    12031362            ( $this->match('Kindle Fire') ||
    1204             $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) ||
     1363            $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) ||
    12051364
    12061365            // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet
    12071366            $this->is('AndroidOS') && $this->is('NookTablet') ||
    12081367
    1209             // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7
    1210             $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=11 && !$isMobile ||
    1211 
    1212             // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7
    1213             $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile ||
    1214 
    1215             // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7
    1216             $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=4.0 && !$isMobile ||
     1368            // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7
     1369            $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile ||
     1370
     1371            // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7
     1372            $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile ||
     1373
     1374            // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7
     1375            $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile ||
    12171376
    12181377            // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7
    1219             $this->version('MSIE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile ||
     1378            $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile ||
    12201379
    12211380            // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7
    1222             // @reference: http://my.opera.com/community/openweb/idopera/
    1223             $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile
    1224 
     1381            $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile
    12251382        ){
    12261383            return self::MOBILE_GRADE_A;
     
    12281385
    12291386        if (
    1230             $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 ||
    1231             $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<3.1 ||
    1232             $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<3.1 ||
     1387            $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 ||
     1388            $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 ||
     1389            $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 ||
    12331390
    12341391            // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770
    1235             $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 ||
     1392            $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 ||
    12361393
    12371394            //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3
    1238             ( $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=6.5 &&
    1239             ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) ||
     1395            ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 &&
     1396            ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) ||
    12401397
    12411398            // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)
     
    12431400
    12441401            // @todo: report this (tested on Nokia N71)
    1245             $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS')
     1402            $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS')
    12461403        ){
    12471404            return self::MOBILE_GRADE_B;
     
    12501407        if (
    12511408            // Blackberry 4.x - Tested on the Curve 8330
    1252             $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<5.0 ||
     1409            $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 ||
    12531410            // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)
    1254             $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2
    1255 
     1411            $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 ||
     1412
     1413            // Tested on original iPhone (3.1), iPhone 3 (3.2)
     1414            $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 ||
     1415            $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 ||
     1416            $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 ||
     1417
     1418            // Internet Explorer 7 and older - Tested on Windows XP
     1419            $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile
    12561420        ){
    12571421            return self::MOBILE_GRADE_C;
    12581422        }
    12591423
    1260         //All older smartphone platforms and featurephones - Any device that doesn't support media queries
    1261         //will receive the basic, C grade experience.
     1424        // All older smartphone platforms and featurephones - Any device that doesn't support media queries
     1425        // will receive the basic, C grade experience.
    12621426        return self::MOBILE_GRADE_C;
    12631427    }
  • mobile-redirect-plus-lite/trunk/includes/settings.php

    r1013589 r1184365  
    99        <div class="wrap">
    1010            <h2>WP Mobile Redirect Options</h2>
    11             <form action="options.php" method="POST">
     11            <form action="options.php" method="POST" style="float: left; min-width: 800px;">
    1212                <?php settings_fields( 'mobi-setting-group-lite' ); ?>
    1313                <?php do_settings_sections( 'mobi-redirect-plus-lite' ); ?>
    1414                <?php submit_button( ); ?>
    1515            </form>
    16             <hr/>
    17             <h2><a href="http://bitly.com/redirect-plus" style="float: left;">Check out Mobile Redirect Plus Pro Feature!!!</a></h2>
     16            <div style="float: left; max-width: 250px;">
     17                <a href="http://bitly.com/redirect-plus"><?php echo '<img style="margin-top: 20px;" src="' . plugins_url( 'images/banner.jpg', __FILE__ ) . '" > '; ?></a>
     18                <a href="http://bitly.com/redirect-plus"><?php echo '<img style="max-width: 250px; margin-top: 10px;" src="' . plugins_url( 'images/banner2.jpg', __FILE__ ) . '" > '; ?></a>
     19            </div>
    1820            <br/><br/>
    1921        </div>
  • mobile-redirect-plus-lite/trunk/mobi.php

    r1013589 r1184365  
    44Plugin URI: http://wordpress.org/plugins/mobile-redirect-plus-lite/
    55Description: Detect mobile device and redirect to mobile optimize website. You can also choose whether or not to redirect tablets by enabling or disabling the option. This plugin also gives you the ability to redirect back for viewing full version website.
    6 Version: 2.4
     6Version: 2.5
    77Author: Iqbal Bary <contact@iqbalbary.com>
    88Author URI: http://iqbalbary.com
     
    2222    //Check the session
    2323    $session_check_lite = $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    24     if(substr_count($session_check, 'main=true')>0){
     24    if(substr_count($session_check_lite, 'main=true')>0){
    2525        setcookie('fullsite','true');
    2626        return;
  • mobile-redirect-plus-lite/trunk/readme.txt

    r1013579 r1184365  
    77Author: Iqbal Bary
    88Requires at least: 3.0.1
    9 Tested up to: 4.0
    10 Stable tag: 2.4
     9Tested up to: 4.2.2
     10Stable tag: 2.5
    1111License: GPLv2 or later
    1212License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    3636== Changelog ==
    3737
     38= 2.5 =
     39* Bug Fix
     40= 2.4 =
     41* Bug Fix
    3842= 2.3 =
    3943* Initial Release
Note: See TracChangeset for help on using the changeset viewer.