<?php

if (!defined('WIRELESS_DETECTOR_COOKIE_NAME')) {
    /**
     * Nom du cookie utilisé pour mémoriser si un terminal est mobile ou non.
     */
    define('WIRELESS_DETECTOR_COOKIE_NAME', 'iswireless');
}

if (!defined('WIRELESS_DETECTOR_COOKIE_EXPIRATION')) {
    /**
     * Expiration en secondes du cookie utilisé pour mémoriser si un terminal est mobile ou non.
     */
    define('WIRELESS_DETECTOR_COOKIE_EXPIRATION', 86400 * 365);
}

/**
 * La classe WirelessDetector tente de detecter si un client est un poste
 * fixe ou un portable, en se basant sur l'entete HTTP Accept, sur
 * l'USER_AGENT et sur les definitions du projet WURFL.
 */
class WirelessDetector {
    protected static function is_wireless_according_to_wurfl($ua) {
        if (preg_match('£^(mot-t\d+|philips-vthin_wap|motorola-ic\d+ obigo/q\d+c\d+ mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|siemens_platform_\d+|yourwap ericsson \d+/\d+\.\d+|siemens-cl\d+/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|goodaccess|vodafone/\d+\.\d+/samsungsghe\d+v/e\d+aegb\d+ browser/nf/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|alcatel-th\d+|hd-pd\d+/\d+\.\d+a up/\d+\.\d+\.\d+e up\.browser/\d+\.\d+\.\d+e-xxxx|maxon|sec-schn\d+|ezwapbrowserce\d+\.\d+-wap|hei-mmd\d+/\d+\.\d+a up/\d+\.\d+\.\d+i up\.browser/\d+\.\d+\.\d+i-xxxx|cdm-\d+|slide\d+|yourwap siemens c\d+i/\d+\.\d+|mot-af/\d+\.\d+\.\d+ up/\d+\.\d+\.\d+i up\.browser/\d+\.\d+\.\d+i-xxxx|blackberry|mot-gatw|pt-gf\d+|sanyo-c\d+sa/\d+|ds\d+ up|sie-op\d+|compal-tg\d+|java\d+\.\d+\.\d+|alcot\d+|sanyo-scp\d+|samsung-sgh-i\d+|zte-f\d+/\d+\.\d+ acs-nf/\d+\.\d+ qtv/\d+\.\d+|xdagraphite/\d+\.\d+ mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; smartphone; \d+x\d+; xdagraphite\)|mot-m y x|fly sx\d+/teleca/q\d+c\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|vulcan-color|huawei-vf\d+|newgen-x\d+|mot-cf/\d+\.\d+\.\d+ up/\d+\.\d+\.\d+m|telit-g\d+|alcatel up/\d+|ccwap-browser|pt-gb\d+|mot-rokr e\d+/r\d+_g_\d+\.\d+\.\d+p mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; linux; motorola rokr e\d+; \d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ opera \d+\.\d+ \[en-gb\] up\.link/\d+\.\d+|sch-x\d+|benq-sl\d+/\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ browser/up\.browser/\d+\.\d+\.\d+\.k\.\d+ \(gui\) mmp/\d+\.\d+|bird\.sc\d+|mio\d+|tsm\d+|samsung-sgh-u\d+|brvwap v\d+\.\d+|motoe\d+|yourwap siemens s\d+/\d+\.\d+|becker-op|fly_sl\d+i|opwv-sdk/s\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|bw-up\d+ve obigo/wap \d+\.\d+ midp-\d+\.\d+/cldc-\d+\.\d+|toplux/ag\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|o\d+|sharp-z\d+|mot-q\d+/\d+\.\d+\.\d+r mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; smartphone; \d+x\d+\) opera \d+\.\d+|s\d+|kpt sd-\d+/midp-\d+\.\d+ cldc-\d+\.\d+|pt-g\d+|telit-gm\d+\[npp\]/\d+\.\d+ up|sy\d+ up|sie-al\d+|htc_tytn_ii mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; iemobile \d+\.\d+\)|mot-pebl v\d+|mot-mib/\d+\.\d+|yourwap nokia \d+/\d+\.\d+|yourwap motorola \d+/\d+\.\d+|jataayu|sie-sg\d+|mobileexplorer/\d+\.\d+ \(mozilla/\d+\.\d+; compatible; mmef\d+; microsoft; windows; genericlarge\)|smb\d+\.\d+\(z\d+\)samsung|amoi a\d+/r\d+\.\d+ nf-browser/\d+\.\d+|sie-u\d+|htc p\d+/\d+\.\d+\.\d+\.\d+ mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; ppc; \d+x\d+\)|waprunner|sp\d+ up/\d+\.\d+\.\d+a|qtek s\d+|sharp-tq-v\d+|bumblebee@relevare\.com|m\d+|sagem-myc-\d+|newgen-c\d+|philips-xenium \d+@\d+/\d+\.\d+ up/\d+\.\d+\.\d+m up\.browser/\d+\.\d+\.\d+m-xxxx|lg|eml\d+|nzphone/\d+\.\d+|kwc-ke\d+|castor/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|aptus wap\.info\.pl search engine|sph-a\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|kddi-ts\d+|sie-cv\d+|samsug-sgh-d\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|benq-cf\d+/\d+\.\d+/wap\d+\.\d+/midp\d+\.\d+/cldc\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|maui wap browser|device/taichiplus version/vdb\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|toshiba_ts\d+/v\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.d\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|iris-g\d+|sammy the wapworker\.co\.uk wap search agent|tx-\d+c|upg\d+ up/\d+\.\d+\.wpk_v\d+\.\d+\.\d+|hcitx\d+b/t\d+ up\.browser/\d+\.\d+\.\d+b\d+|htc-p\d+|samsung_mits/i\d+|mot-motorokre\d+/r\d+_g_\d+\.\d+\.\d+p mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; linux; motorokre\d+; \d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ opera \d+\.\d+ \[en\]|r\d+ \d+\.\d+|philips-xenium\d+@\d+|mt\d+/\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\)|bellwave_neo\d+_mt|portalmmm|mot-u\d+|mot-black monster/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|fake_sie-s\d+|alcatel-bf\d+|mot-razrv\d+|winwap-pro/\d+\.\d+|hpipaqhw\d+|sec-sghs\d+|opwv-sdk/\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\)|fly-\d+/\d+\.\d+ \(\d+\.\d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mot-rokr e\d+ itunes/\d+\.\d+\.\d+ mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mobilsurf/\d+\.\d+|benq-p\d+|philips \d+|esl\d+|mot-rokr e\d+/\d+e\.\d+\.\d+er mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|bird\.v\d+|palmsource/palm-d\d+; blazer/\d+\.\d+|wapuniverse/\d+|mot-mcc\d+|panasonic-gad\d+|fake_user_agent sanyo rl-\d+|sagem-myv-\d+|sec-sghzx\d+|opera/\d+\.\d+ \(nintendo wii|mot-pcc_\d+/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|qa-atm v\d+\.\d+\(atmc v\d+\)|fly_\d+|bilbo|sch-a\d+|winwap/\d+\.\d+ \(\d+\.\d+\.\d+\.\d+; win\d+\)|opera/\d+\.\d+ \(j\d+me/midp; opera mini|alcatel-cth\d+|samsung-samsung sgh-x\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|htcp\d+|philips-xenium \d+@\d+\+\+|amoisonic-a\d+|alav up/\d+|mot-pebl u\d+|mot-w\d+|lenovo-s\d+/\(\d+\.\d+\.\d+\)s\d+/wap\d+\.\d+ profile/midp\d+\.\d+|orange spv m\d+|emulateur orange|sendom\d+|audiovox-\d+gpx|sagem-myt-\d+|neonode-n\d+|wince|wig browser/\d+|alcatel-bh\d+r/|sagem-myg-\d+|alcatel-bh\d+/\d+\.\d+ up\.browser/\d+\.\d+|psion cpw/\d+|rover g\.fish \(rim handheld; mobitex; os v\. \d+\.\d+\)|samsung-sght\d+|compal-a\d+|architextspider|mot-q\d+/\d+\.\d+ \(\d+\.\d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|winwap/\d+\.\d+ \(\d+\.\d+\.\d+\.\d+;wince;ppc\d+\)|spv-c\d+|spv m\d+; opver \d+\.\d+\.\d+\.\d+|kddi-hi\d+|semc-t\d+|hpipaqrw\d+/\d+\.\d+ mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; ppc; \d+x\d+\)|dragon g\d+/\d+\.\d+ brew/\d+\.\d+ browser/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|ericy-r\d+d|sendosv\d+|au-mic|idea \d+|samsung-sch-d\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+\(gui\) mmp/\d+\.\d+|sie-sl\d+|sie-s\d+|vodafone/\d+\.\d+/panasonic-vs\d+/\d+\.\d+ browser/obigo-browser/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sharpsx\d+|sie-elf\d+/\d+ up\.browser/\d+\.\d+\.\d+\.e\.\d+\(gui\) mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ browser/up\.browser/\d+\.\d+\.\d+\.e\.\d+ \(gui\) mmp/\d+\.\d+|raks \d+|sie-ic\d+|mtp\d+ up/\d+\.\d+\.\d+a up\.browser/\d+\.\d+\.\d+a-xxxx|mot-df|sch-u\d+|sch-r\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|materna-wappreview/\d+|device v\d+\.\d+|sec-scha\d+|mot-c\d+|mozilla/smb\d+\(z\d+\)/samsu\d+g|mot-slvr l\d+/\d+a\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|rover ham\.mer\.head\.\d+ alpha \(rim handheld; mobitex; os \d+\.\d+\)|mot-artem|winwap-xl/\d+\.\d+|panasonic-x\d+|sendos\d+|asus-p\d+|acs-nf/\d+\.\d+ nec-c\d+|airness-air\d+|grundig gr\d+|kwc-se\d+|htcartist|fly-mx\d+|kddi-ca\d+|scooter/wap|panasonic-g\d+|sagem-sg\d+i|mot-l\d+|wapjag virtual wap|vitelcom-feature phone \d+\.\d+|motv\d+|mc\d+ \d+\.\d+ wap\d+\.\d+|sie-e\d+|asus-j\d+|generic docomo|sharp-tq-gx-i\d+|benqs\d+\\\d+\.\d+\\wap\d+\.\d+\\midp\d+\.\d+\\cldc\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|scooter-w\d+\.\d+\.\d+|sharp-tq-gx\d+|sec-sghx\d+|spv-m\d+|sharp-tq-gx-l\d+|audiovox-cdm-\d+|fly-sx\d+/profile/midp\.\d+\.\d+configuration/cldc\.\d+\.\d+|sagem-myw\d+|philips\d+|samsunge\d+|mot-p\d+k-c|sie-cfx\d+|sharp-tq-gx-t\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.d\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|samsung-apha\d+ au-mic-a\d+/\d+\.\d+ mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc|vodafone/\d+\.\d+/htc_mercury|mot-motorola v\d+/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|tcl-\d+|yas-cosmos|gf-\d+|vodafone/toshibats\d+|scooter-\d+\.\d+|benq-nike\d+|amoi-a\d+|sendoj\d+|lexibook_tab\d+|pt-gi\d+/cldc/cldc\d+\.\d+ midp/midp-\d+\.\d+|samsung-sghp\d+|vodafone/\d+\.\d+/samsungsghx\d+v|sp\d+/teleca/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ midp-\d+\.\d+/cldc-\d+\.\d+|verizon_audiovox-cdm\d+|vodafone/\d+\.\d+/samsung-sgh-e\d+v/bugb\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|softbank/\d+\.\d+|http\://www\.voxtel\.ru/uaprof/voxtel_bd\d+\.xml|docomo|vodafone/\d+\.\d+/panasonicvs\d+|p\d+ simulator|bird\.s\d+|sie-m\d+|pt-gi\d+ cldc|grundig m\d+|fake_samsung-spha\d+|bw-up\d+ tmt/wap \d+\.\d+ midp-\d+\.\d+/cldc-\d+\.\d+|w\d+c-mobileok/ddc-\d+\.\d+ \(see http\://www\.w\d+\.org/\d+/\d+/mobileok-ddc\)|mot-rokr e\d+ipod/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|benqs\d+\.\d+wap\d+\.\d+midp\d+\.\d+cldc\d+\.\d+|benq-s\d+|yourwap siemens s\d+i/\d+\.\d+|epoc\d+-wtl/\d+\.\d+|pirelli d\d+\.\d+\.\d+\.\d+c fs_d\d+\.\d+\.\d+\.\d+_acr|becker-dcw\d+h|alcatel-oh\d+|hd-mmp\d+/\d+\.\d+a up/\d+\.\d+\.\d+i up\.browser/\d+\.\d+\.\d+i-xxxx|amoi-da\d+|\d+i|bird\.sm\d+|sec-sgh-x\d+|samsung-sec-sghd\d+/\d+\.\d+ netfront/\d+\.\d+|vodafone/toshiba\d+|opwv\d+/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\)|argogroupwapdevice|aur palm wapper|klondike/\d+|fake_user_agent samsung ip-a\d+|telit-gm\d+x\d+\[npp\]|alcatel-be\d+/\d+|sec-sghu\d+|mot-mpx\d+|palm\d+|mc\d+ up|mot-mcca|wmlb|panasonic-sc\d+|sanyo-s\d+|sgh-t\d+|optimay-seville|mot-af/\d+ up/\d+|sie-sxg\d+|motorizr-z\d+/\d+\.\d+\.\d+ mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; symbian os; \d+\) opera \d+\.\d+|samsung-sgh-n\d+|newgen-t\d+|lenovo-p\d+|philips-\d+|mot-mccc|c\d+/\(null\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|htc-s\d+|samsung-sgh-l\d+/aogg\d+ shp/vpp/r\d+ netfront/\d+\.\d+ smm-mms/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sharpt\d+/shs\d+/\d+\.\d+ browser/up\.browser/\d+\.\d+\.\d+\.\d+a\.f\.\d+\.\d+ \(gui\) profile/midp-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+ push/po|sama\d+|yourwap siemens ic\d+i/\d+\.\d+|conduits-palmbrowser/\d+\.\d+|benqa\d+\.\d+wap\d+\.\d+midp\d+\.\d+cldc\d+\.\d+|capitel-f\d+|wapview \d+|toshiba ts\d+;ts\d+/v\d+\.\d+|htc_tytn mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; iemobile \d+\.\d+\)|mozilla\\samsung-xhtml \d+\.\d+|mot-fe/ up\.browser/\d+|fake_user_agent sanyo vi-\d+|hutc\d+g/\d+ \(e\d+ for hutchison \d+g|mot-motor e\d+/\d+e\.\d+\.\d+fr mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|aiko s\d+|g\d+|qtek\d+|vodafone/\d+\.\d+/lg-ku\d+/v\d+a browser/obigo-q\d+a/\d+\.\d+ mms/lg-mms-v\d+\.\d+/\d+\.\d+ java/asvm/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sagem-myc\d+-\d+|fake_user_agent sanyo mm-\d+|sie-cl\d+|sharp-tq-gx-a\d+|mot-mccb/\d+ up\.browser/\d+\.\d+\.\d+|motorola-k\d+m obigo/q\d+c\d+ mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mioa\d+|mot-k\d+|mt\d+/\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sec-sghd\d+|dc-s\d+p|utstarcom-pcs-\d+vm/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|a wang-a\d+/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|haier-m\d+|mot-cf/\d+\.\d+\.\d+ up/\d+\.\d+\.\d+f|mot-af/\d+\.\d+\.\d+ up/\d+\.\d+\.\d+s|dallab-dp\d+|fetchpage\.cgi/\d+\.\d+|emulateur wap de phonevalley|philips-ozeo up/\d+|siemens-sfg\d+|samsung-sgh-r\d+|zte-\d+|go\.web|ez\d+|motorola a\d+|mot-slvr l\d+/\d+b\.d\d+\.\d+fr mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sie-xelibri \d+|sendop\d+|mot-phx\d+|innoa\d+|philips-fisio \d+|sec-sghv\d+|sendow\d+/\d+-h-\d+|pn-\d+|tdg-\d+|motorola voxgateway/\d+\.\d+|mot-a-\d+|modelabs-pebble/rev \d+\.\d+\.\d+/teleca q\d+b\d+|vodafone/\d+\.\d+/\d+sh|sie-sx\d+|mot-cb|wapper|smb\d+\(z\d+\)/samsung|benq-z\d+|htcgemini|bird\.g\d+|sc\d+ up|qc-\d+|compal-chase\d+|pg\d+v/r\d+|ig\d+ up|mot-\d+|compal-hz\d+|sie-x\d+i|fly-\d+i/bsi au\.browser/\d+\.\d+ qo\d+c\d+ mmp/\d+\.\d+|vodafone/\d+\.\d+/\d+vodafone\d+/b\d+ browser/obigo-browser/q\d+a mms/obigo-mms/q\d+a syncml/hw-syncml/\d+\.\d+ java/qvm/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|philips-sysol\d+|samsung-sth-a\d+|sagem-mo\d+-\d+x\d+|sec-sghp\d+|samsung sgh-x\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|benq p\d+|mot-babyviper-e\d+|mot-sap\d+a|mot-klgo|i-go\d+|fly-sx\d+/\d+\.\d+ \(\d+\.\d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|samsungsgh-zv\d+/\d+\.\d+ shp/vpp/r\d+ netfront/\d+\.\d+ smm-mms/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|fake_user_agent samsung pm-a\d+|sanyo-c\d+hk|motorola-e\d+|motorokr z\d+/r\d+_g_\d+\.\d+\.\d+r mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+ linux; motorokr z\d+;\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ opera \d+\.\d+\[zh\]|se\d+|utstargz\d+s/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|savajeos|alcatel-bg\d+|vodafone/sonyericssonv\d+|daiteg\d+|alcatel-m\d+|bird-v\d+|wapyeah|bird sc\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\)|rozowa|sgh-z\d+|winwap for pocket pc \d+|x\d+/\d+\.\d+ symbianos/\d+\.\d+ series\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|owg\d+ up/\d+\.\d+\.\d+a|toplux ag\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|audiovox-pm\d+kit|samsung-sgh-a\d+|sharp wx-t\d+|talkabout v\d+|mot-motorola v\d+/\d+b\.\d+\.\d+r mib/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|el\d+/\d+\.\d+ \(\d+\.\d+\)|smartone-vodafone/sharpsx\d+/shs\d+/\d+\.\d+ browser/up\.browser/\d+\.\d+\.\d+\.\d+a\.\d+ \(gui\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ ext-j-profile/jscl-\d+\.\d+\.\d+ ext-v-profile/vscl-\d+\.\d+\.\d+|sie-sk\d+|motorola-ic\d+ obigo/q\d+c\d+-\d+\.\d+ mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mot-pan\d+_/\d+\.\d+ up\.browser/\d+\.\d+\.\d+c|telit-gm\d+i|mot-r\d+_/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|alcatel-ot-s\d+/\d+\.\d+ up\.browser/\d+\.\d+ \(gui\) mmp/\d+\.\d+|fake_user_agent audiovox vi\d+|panasonic-vs\d+|pantech|yourwap sony cmd z\d+/\d+\.\d+|mot-r\d+\.\d+/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|huawei-u\d+|jemulator|modottel-wte_\d+|motorola-t\d+|sie-me\d+|amoi-v\d+|benq-m\d+|mot- e \d+/\d+b\.d\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|amoi-ca\d+|vk\d+|attws/\d+\.\d+ n\d+i-\d+\(c\d+;tb\)|mot-p\d+k-t/\d+\.\d+ up\.browser/\d+\.\d+\.\d+h|sx\d+/teleca/q\d+c\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|gradiente|mot-ed|asus-m\d+|sec-sghf\d+|mot-af/\d+\.\d+\.\d+ up/\d+\.\d+\.\d+n|ts\d+/\d+\.\d+|mot-f\d+|samsung-xhtml|\d+gsonyericssonz\d+|wonu s\d+|smith|sagem-myx-\d+|sagem-myw-\d+|mot-z\d+|upg\d+/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|myway-slim|bw-neo\d+ tmt|yourwap nokia\d+/\d+\.\d+|sph-e\d+|wapalizer /\d+\.\d+ phonevalley|hutc\d+g/\d+ e\d+ for hutchison \d+g/c\d+|sie-mc\d+|ikomo ik\d+|sec-schi\d+|qc\d+|sec-sghj\d+/\d+\.\d+ netfront/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sec-sgha\d+|dbtel\d+|philips s\d+ / obigo browser \d+\.\d+|hp ipaq hw\d+|xda_trion; \d+x\d+ \(compatible; msie \d+\.\d+; windows ce; iemobile \d+\.\d+\)|yourwap siemens sl\d+/\d+\.\d+|winwap \d+|mot-rokr e\d+/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mot-sule v\d+/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sie-af\d+|benq-a\d+|dopod \d+|panda-m\d+|htctytn-mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; ppc; \d+x\d+\)|mcca up|meridian-z\d+|mot-cn\d+|scooter-w\d+-\d+\.\d+|yourwap trium geo/\d+\.\d+|mot-bloodkasch/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|pant\d+v\d+|alcatel-e\d+|vertuascentti/\d+\.\d+ \(\d+\.\d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sie-ap\d+|upg\d+ up/\d+\.\d+ \(compatible; blazer \d+\.\d+\)|capitel-c\d+|mobileexplorer/\d+\.\d+ \(mmef\d+|medion \d+|mot-pan\d+_/\d+ up\.browser/\d+|mozilla/\d+\.\d+|mot-a\d+|huawei/\d+\.\d+/u\d+/b\d+ browser/obigo-browser/q\d+a mms/obigo-mms/q\d+a syncml/hw-syncml/\d+\.\d+ java/qvm/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sagem-mys-\d+|sagem-my-\d+|compal-s\d+|mot-canary|mot-v\d+|kddi-sa\d+|sony|hd-tx\d+b\d+\.\d+a/ up\.browser/\d+\.\d+\.\d+b|tagtag emulator v\d+\.\d+|dmobo m\d+|w\d+c mobileok ddc \(http\://www\.w\d+\.org/\d+/\d+/mobileok-ddc\)|ppc; \d+x\d+; htc_p\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; iemobile \d+\.\d+\)|amoi/\d+|mot-d\d+|kwc-garnetto/\d+\.\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|mo\d+|mot-c \d+/\d+b\.d\d+\.\d+fr mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sie-slck/\d+\.\d+ up/\d+\.\d+\.\d+i|panasonic-sa\d+|mozilla/smb\d+\(z\d+u\)/samsung|sgh-f\d+/\d+\.\d+ netfront/\d+\.\d+|panasonic g\d+i|hd-mmd\d+/\d+\.\d+a up/\d+\.\d+\.\d+i up\.browser/\d+\.\d+\.\d+i-xxxx|vodafone/\d+\.\d+/vs\d+|wapsilon/\d+\.\d+ \(www\.wapsilon\.com\)|t-mobile dash mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; smartphone; \d+x\d+\)|toshibats\d+|tsm-\d+|mot-verbatim_e\d+/\d+e\.\d+\.\d+fr mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|philips-fisio\d+|nec-arm\d+-brcm_edge|sie-ct\d+|sie-ef\d+|rover \d+|alcatel-elle-n\d+|newgen-topaz/rev \d+\.\d+\.\d+/teleca q\d+b\d+|vodafone/\d+\.\d+/v\d+nk/nkj\d+/imei/sn\d+ series\d+/\d+\.\d+ nokia\d+/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|nec-\d+|sec-sghq\d+|annyway|sharp-tq-gx-e\d+|mot-c \d+/\d+b\.a\d+\.\d+fr mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|htcs\d+|sie-p\d+|qwapper/\d+\.\d+|vodafone/r\d+\.\d+/semc_v\d+/eu_\d+ sonyericssonvodafone-\d+se/r\d+a browser/semc-browser/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sagem-myx\d+|vertu ltd/\d+\.\d+ \(\d+\.\d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|vodafone/\d+sh|smt\d+|mot-motorola e\d+/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|fake_user_agent sanyo vm-\d+|ds-d\d+|opwv-sdk/\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+c \(gui\) mmp/\d+\.\d+|savaje-os/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|\d+thpass\.com kbrowser \d+\.\d+|motorola-v\d+m obigo/q\d+c\d+ mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|upg\d+ up/\d+\.\d+\.\d+|sie-z\d+|mozilla/smb\(z\d+\)/samsung/|mot-ta\d+|acs-nf/\d+\.\d+ nec-e\d+|samsung-sphm\d+ au-|acer-pro\d+|benq-e\d+|haier-t\d+c/\d+\.\d+ ipanel/\d+\.\d+ wap\d+\.\d+ \(compatible; up\.browser/\d+\.\d+\.\d+\.\d+; upg\d+; up/\d+\.\d+; embedded\)|benq-morpheus|sie-st\d+|opwv-gen-\d+/uni\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\)|compal-d\d+|ibrowser/\d+\.\d+|philips-v\d+wap|motorola-c\d+|motorola/\d+\.\d+|motorola-slv-l\d+c obigo/q\d+c\d+ mmp/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|bird-s\d+|compal-seville|opwv-sdk up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+ push/po|kgt|sec\d+|sie-slin|zte-f\d+/\d+\.\d+ acs-nf/\d+\.\d+ qtv\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.link/\d+\.\d+\.\d+\.\d+\.\d+|telit_mobile_terminals-gm\d+|opwv-sdk/\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/http-direct|opwv-sdk/\d+ up/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\) up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\)-xxxx|\d+sh|crawlerboy pinpoint\.com|sec-sphn\d+|tim-igo\d+|fake_qtek_\d+|wapalizer/\d+|sagem-mymobiletv|sharp-tq-gz\d+|sie-\d+|htc-\d+|toshiba ts\d+_ts\d+/v\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.d\.\d+ \(gui\) mmp/\d+\.\d+|opwv-sdk up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|vodafone/\d+\.\d+/htc_prophet/\d+\.\d+\.\d+\.\d+/mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; ppc; \d+x\d+\)|acoonwap robot v\d+\.\d+ \(www\.acoon\.de\)|samsung-spha\d+|mot-e \d+/\d+b\.d\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mot-sap\d+_/\d+\.\d+ up\.browser/\d+\.\d+\.\d+c|uniscope-u\d+/\(\d+\.\d+\.\d+\)ver\d+\.\d+\.\d+/wap\d+\.\d+|mot-sap\d+h|v\d+ mot-v\d+/\d+b\.\d+\.\d+r mib/\d+\.\d+ profile/midp-\d+\.\d+|utstar\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|fake_user_agent samsung-spha\d+|wapsilon/\d+ \(www\.wapsilon\.com\)|wapman version \d+|kejian-k\d+|pg-\d+|sch-n\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|mot-motorola c\d+/\d+b\.d\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|nem-\d+|mot-stepler/\d+\.bd\.b\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|elaine|benqs\d+c/\d+\.\d+/wap\d+\.\d+/midp\d+\.\d+/cldc\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|motov\d+|panasonicvs\d+|winwap-x/\d+\.\d+|sharpwxt\d+/shs\d+/\d+\.\d+ browser/up\.browser/\d+\.\d+\.\d+\.\d+a\.f\.\d+\.\d+ \(gui\) profile/midp-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+ push/po|mot-jacqu/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|sagem-mw\d+|i-mate jam|winwap-ce/\d+\.\d+|chtml generic|sagem-\d+|vx\d+|nec-e\d+|kddi-kc\d+|n\d+|i-\d+|kyocera-kz-\d+|ezwapbrowser\d+\.\d+-wap|samsung-sgh-q\d+/\d+\.\d+ up/\d+\.\d+\.\d+k up\.browser/\d+\.\d+\.\d+k-xxxx|fly-sl\d+|mot-ef|fake_mozilla/\d+\.\d+ \(compatible; avantgo \d+\.\d+; proxinet; danger hiptop \d+\.\d+\)|winwap-spbe/\d+\.\d+ \(\d+\.\d+\.\d+\.\d+;win\d+\)|samsung-sgh-x\d+|ericsson|amoi-m\d+|sec-n\d+|mot-bc/\d+\.\d+\.\d+ up\.browser/\d+|ct\d+a\d+g profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ obigointernetbrowser/qo\d+c ege/\d+\.\d+|mot slvr-l\d+|mot-i\d+|opwv-sdk/\d+ up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|kwc-k\d+|samsung-sgh-t\d+|motorolav\d+rn|kddi-sn\d+|samsung-sghc\d+|sagem-myz-\d+|mot-pan\d+_/mib\d+\.\d+/v\d+\.\d+|vodafone/\d+\.\d+/v\d+sh/shj\d+ browser/up\.browser/\d+\.\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ ext-j-profile/jscl-\d+\.\d+\.\d+ ext-v-profile/vscl-\d+\.\d+\.\d+|mot-cf/\d+ up/\d+|dbtel/\d+|panasonic-a\d+|mobileexplorer/\d+\.\d+ \(mozilla/\d+\.\d+; compatible; mmef\d+; microsoft; windows; genericsmall\)|sendox|sharp-tq-gx-\d+|white ts\d+/\d+\.\d+|mozz|haier-v\d+ obigointernetbrowser/\d+\.\d+|ezos|qci-mj\d+/|abachobot|dbtel-db\d+|pg-c\d+|audiovox-smt\d+|samsung-sgh-f\d+|vodafone/samsungsghe\d+v/e\d+aeeg\d+/browser/nf/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|ericy-t\d+c|rim\d+|goodinfo|anywhereyougo\.com online testing tool v\d+\.\d+|sie-cx\d+|hei-hgc\d+e/\d+\.\d+a up/\d+\.\d+\.\d+e|i\d+|spv-e\d+|poseidon|yourwap alcatel view db/\d+\.\d+|\d+-sendow\d+|sie-cxt\d+|hitachi-p\d+|vodafone/\d+\.\d+/v\d+nk/nkj\d+/imei/snxxxxxxxxxxxxxxx series\d+/\d+\.\d+ nokia\d+/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|kddi-ma\d+|aus palm wapper|ezze|iac|http\://www\.voxtel\.ru/uaprof/voxtel_rx\d+_uaprof\.xml|amoi-f\d+|amoisonic-f\d+|newgen-megax|vm\d+|sie-el\d+|sec-sghc\d+|sec-sghj\d+e|nec-n\d+|dbtelt\d+|g-mobile gm\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+\.c\.\d+ \(gui\) mmp/\d+\.\d+|samsung-sgh-c\d+|amoi-s\d+|sdk/\d+\.\d+\: \(r\d+|fly-e\d+/profile/midp\.\d+\.\d+configuration/cldc\.\d+\.\d+|benq-athena|sie-opera|fly-mp\d+/bsi au\.browser/\d+\.\d+ qo\d+c\d+ mmp/\d+\.\d+|qci-\d+|v\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.\d+\.d\.\d+ \(gui\) mmp/\d+\.\d+|sharp-tm-\d+|haier-p\d+|panasonic-mx\d+|mot-e\d+|mot-mlnbt/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.e\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|dbtelj\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+|fake_user_agent samsung rl-a\d+|benq up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\)|vodafone/samsungsghx\d+v/x\d+aeek\d+/browser/tss/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+-\d+\.\d+|sie-sf\d+|sec-sghe\d+|vk-vk\d+|sie-ax\d+|vodafone/v\d+t|dbteld\d+|telit_mobile_terminals-g\d+|kyokx\d+|motorazrv\d+|vodafone/\d+\.\d+/benq-s\d+|mot-motorola l\d+/\d+a\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|libwww-perl|netfront/\d+\.\d+|alcatel-ot-c\d+|\d+/\d+\.\d+\(\d+\.\d+\)|sagem vs\d+|lenovo-v\d+_rus_eng_fly/\(\d+\.\d+\.\d+\)ver\d+\.\d+/wap\d+\.\d+|opwv-gen-\d+/uni\d+ up/\d+\.\d+\.\d+\.\d+ \(gui\) up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\)-xxxx|sagem-my\d+|sagem-co\d+|hd-mmd\d+/\d+\.\d+a up/\d+\.\d+\.\d+i up/\d+\.\d+\.\d+i|htc_p\d+ mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; windows ce; iemobile \d+\.\d+\)|samsung-sgh-zv\d+|mot-fe/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+|toplux cg\d+|sec-sgh-p\d+|http\://www\.voxtel\.ru/uaprof/voxtel_v\d+\.xml|fake_sie-ef\d+|nokia|panasonic wap|mot-timeport\d+|sec-sghm\d+|nec-db\d+/\d+\.\d+ up\.browser/\d+|samsung/sghe\d+v|fake_user_agent toshiba vm-\d+|spv c\d+|sgh-zm\d+|m-crawler/\d+\.\d+ wap|sec-spha\d+|philips-az@lis\d+|jbrowser|sie-c\d+|lynx/r\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|t\d+|hs-c\d+|sl\d+i|audio\d+|mot-irka|mozilla \d+\.\d+ \(compatible\:msie \d+\.\d+; windows ce; iemobile \d+\.\d+\) sprint mp\d+sp|mot-sap\d+_/\d+ up\.browser/\d+|benq-ef\d+|scp-\d+th-a|sec-sghi\d+|xda\d+|dbtel-\d+|mot-pebl_u\d+|samsung-sgh-s\d+|sec-sghn\d+|samsung-sgh-d\d+|audiovox-cdm\d+|motorola-mpx\d+|sie-a\d+|mot-e \d+i/\d+e\.\d+\.\d+r mib/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|virgin_\d+|yourwap\.com wireless companion|pocket m\d+gate/\d+\.\d+ beta \d+|mot-motorazrv\d+/\d+c\.\d+\.\d+r ber\d+\.\d+ mozilla/\d+\.\d+ \(compatible; msie \d+\.\d+; \d+\) profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ opera \d+\.\d+ \[en\]|dicam-t\d+|wapaka/\d+|sie-slik/\d+\.\d+ up/\d+|bird\.a\d+|motoa\d+|telme_t\d+|lenovo-e\d+|wapide-sdk/\d+\.\d+; \(r\d+s \(arial\)\)|sie-cf\d+|vodafone/\d+\.\d+/v\d+nk/nkj\d+ series\d+/\d+\.\d+ nokia\d+/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|sk-\d+/\d+\.\d+ up/\d+\.\d+\.\d+|sch-w\d+|vodafone/r\d+\.\d+/semc_v\d+/eu_\d+ sonyericssonv\d+/r\d+a browser/semc-browser/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mozilla/smb\d+\(z\d+\)/samsung|vodafone/\d+\.\d+/samsungsghc\d+v|plm\'s wapbrowser|inno\d+|tcl-e\d+|zte-c\d+|sec-schx\d+|samsung-sva-t\d+\+|samsungsghc\d+v|sie-sp\d+|rx\d+/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+ midp-\d+\.\d+/cldc-\d+\.\d+|smartone/sharpsx\d+/shs\d+|sie-mt\d+|mtv \d+\.\d+|compal-c\d+|smb\d+\.\d+\(z\d+\)/samsung|ce|meridian-x\d+/rev \d+\.\d+\.\d+/teleca q\d+b\d+|nok\d+v\d+|amoi-d\d+|erk\d+ up|yourwap/|mercedes|kwc-kx\d+|amoi-cs\d+|opwv\d+/\d+\.\d+ up/\d+\.\d+\.\d+\.\d+ \(gui\) up\.browser/\d+\.\d+\.\d+\.\d+ \(gui\)-xxxx|zetor|compal-u\d+|mot-ncr_\d+/\d+\.\d+ up\.browser/\d+\.\d+\.\d+\.\d+\.c\.\d+\.\d+ \(gui\) mmp/\d+\.\d+|anexteksp\d+ \(compatible; msie \d+\.\d+; windows ce; ppc; \d+x\d+\)|vodafone/sharp\d+sh|vodafone/\d+\.\d+/v\d+se/sej\d+ browser/semc-browser/\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|mot-fe/\d+\.\d+\.\d+ up\.browser/\d+\.\d+\.\d+i|ericy-a\d+c-\d+|compal-v\d+c|compal-xg\d+|mot-evelyn|mitsu|sharp\d+sh|im\d+k up/\d+\.\d+\.\d+a up\.browser/\d+\.\d+\.\d+a-xxxx|up\.browser/\d+|samsung-sgh-z\d+|samsung-sgh-l\d+/xxgf\d+ shp/vpp/r\d+ netfront/\d+\.\d+ smm-mms/\d+\.\d+\.\d+ profile/midp-\d+\.\d+ configuration/cldc-\d+\.\d+|waptor \d+\.\d+|sanyo mm-\d+|mercator|samsung-sgh-p\d+|alcatel-ot\d+|mot-dd|samsung-sgh-e\d+)£i', $ua) > 0) {
            return TRUE;
        }
        return FALSE;
    }
    
    protected static function is_desktop_according_to_wurfl($ua) {
        if (preg_match('£^(webtrends|curl/|nutchcvs|windows-media-player/\d+|firefox/|enteos customer care|lynx/|opera/\d+|nsplayer/\d+\.\d+\.\d+\.\d+|mozilla/\d+\.\d+|mimanet\! webtools \(http\://www\.mimanet\.com/scripts/webtools\.html\)|vobsub|opera \d+|getright|fun web products|mediapartners-google/\d+\.\d+)£i', $ua) > 0) {
            return TRUE;
        }
        return FALSE;
    }
    
    protected static function is_wireless_according_to_headers() {
        if (isset($_SERVER['HTTP_X_WAP_PROFILE']) ||
            isset($_SERVER['HTTP_X_OPERAMINI_PHONE']) ||
            isset($_SERVER['HTTP_X_NOKIA_GID']) ||
            isset($_SERVER['HTTP_X_NOKIA_BEARER']) ||
            isset($_SERVER['HTTP_X_ICAP_VERSION']) ||       
            isset($_SERVER['HTTP_UA_VOICE'])) {
            return TRUE;
        }
        if (preg_match('£vnd\.symbian\.install|3gpp|vnd\.wap|vnd\.sun\.j2me|vnd\.smaf|vnd\.oma\.drm|text/orangeml£i',
                       @$_SERVER['HTTP_ACCEPT']) > 0) {
            return TRUE;
        }
        return FALSE;
    }

    protected static function is_desktop_according_to_shortcuts($ua) {
        if (stripos($ua, 'Windows') !== FALSE &&
            stripos($ua, 'Windows CE') === FALSE &&
            stripos($ua, 'Windows generic') === FALSE) {
            return TRUE;
        }
        return FALSE;
    }

    /**
     * Retourne si un terminal est mobile ou non, d'après un cookie.
     * 
     * @return boolean NULL si le cookie n'existe pas, TRUE ou FALSE sinon.
     */
    protected static function is_wireless_according_to_cookies() {
        $is_wireless = @$_COOKIE[WIRELESS_DETECTOR_COOKIE_NAME];
        if ($is_wireless === '0') {
            return FALSE;
        }
        if ($is_wireless === '1') {
            return TRUE;
        }
        return NULL;
    }
    
    /**
     * Tente de mémoriser le type de terminal dans un cookie.
     * 
     * @param boolean $status TRUE s'il s'agit d'un terminal mobile, FALSE sinon.
     * @return boolean FALSE en cas d'erreur
     */
    protected static function store_wireless_status_into_cookies($status) {
        if ($status === FALSE) {
            $cookie_value = '0';
        } elseif ($status === TRUE) {
            $cookie_value = '1';
        } else {
            return FALSE;
        }
        return @setcookie(WIRELESS_DETECTOR_COOKIE_NAME, $cookie_value,
                          time() + WIRELESS_DETECTOR_COOKIE_EXPIRATION, '/');
    }
    
    /**
     * Teste si le client est un mobile.
     * 
     * Cette methode tente de determiner si un client est un mobile,
     * @return boolean TRUE si c'est le cas et FALSE s'il s'agit d'un poste fixe.
     */
    public static function is_wireless() {
        $is_wireless_according_to_cookies = self::is_wireless_according_to_cookies();
        if ($is_wireless_according_to_cookies !== NULL) {
            return $is_wireless_according_to_cookies;
        }
        $is_wireless_according_to_headers = self::is_wireless_according_to_headers();
        $ua = @$_SERVER['HTTP_USER_AGENT'];
        if (empty($ua)) {
            self::store_wireless_status_into_cookies($is_wireless_according_to_headers);
            return $is_wireless_according_to_headers;
        }
        if (self::is_desktop_according_to_shortcuts($ua) === TRUE) {
            self::store_wireless_status_into_cookies(FALSE);
            return FALSE;
        }
        $is_wireless_according_to_wurfl = self::is_wireless_according_to_wurfl($ua);
        $is_desktop_according_to_wurfl = self::is_desktop_according_to_wurfl($ua);
        $default_is_wireless = FALSE;
        if ($is_wireless_according_to_wurfl === FALSE) {
            if ($is_desktop_according_to_wurfl === FALSE) {
                self::store_wireless_status_into_cookies($is_wireless_according_to_headers);
                return $is_wireless_according_to_headers;
            } else {
                if ($is_wireless_according_to_headers === FALSE) {
                    self::store_wireless_status_into_cookies(FALSE);
                    return FALSE;
                } else {
                    return $default_is_wireless;
                }
            }
        } else {
            if ($is_desktop_according_to_wurfl === FALSE) {
                if ($is_wireless_according_to_headers === FALSE) {
                    return !$default_is_wireless;
                } else {
                    self::store_wireless_status_into_cookies(TRUE);
                    return TRUE;
                }
            } else {
                if ($is_wireless_according_to_headers === FALSE) {
                    self::store_wireless_status_into_cookies($default_is_wireless);
                    return $default_is_wireless;
                } else {
                    return !$default_is_wireless;
                }
            }
        }
    }
    
    /**
     * Teste si le client est un poste fixe.
     * 
     * Cette methode tente de determiner si un client est un poste fixe,
     * @return boolean TRUE si c'est le cas et FALSE s'il s'agit d'un mobile.
     */
    public static function is_desktop() {
        return !self::is_wireless();
    }
    
    /**
     * Redirige le client sur une autre URL, en utilisant le WML si necessaire.
     * 
     * @param string $url L'URL de destination.
     */
    public static function redirect_to_url($url) {
        header('Location: ' . $url);
        header('Cache-Control: no-cache, must-revalidate');
        header('Pragma: no-cache');
        if (stripos((string) @$_SERVER['HTTP_ACCEPT'],
                   'vnd.wap') === FALSE) {
            exit(0);
        }
        header('Content-type: text/vnd.wap.wml');       
        echo '<card title="redirection">' . "\n";
        echo ' <onevent type="onenterforward">' . "\n";
        $xml_escaped_url = htmlspecialchars($url, ENT_QUOTES);
        $xml_escaped_url = preg_replace('/&#0*39;/', '&apos;',
                                        $xml_escaped_url);
        echo '  <go href="' .
          htmlspecialchars($xml_escaped_url) . '"/>' . "\n";
        echo ' </onevent>' . "\n";
        echo '</card>' . "\n";
        exit(0);
    }
}
