<?xml version="1.0"?><phpdoc><class name="Bs_Browscap" extends="Bs_Object" undoc="false" access="public" package="net/http"><file>C:/usr/local/lib/php/blueshoes-4.2/core/net/http/Bs_Browscap.class.php</file><doc><author>Andrej Arn &amp;lt;andrej at blueshoes dot org&amp;gt;</author><inherited src="Array"/><description>detects a lot. can even use a temp redirect page to grab much information using javascript.wishlist:- detect junkbuster/muffin etc. it&amp;apos;s annoying if clients send different and wronguser-agent and http-referer each time. I think that especially the user-agent couldbe detected.- re-detect previous client machines using a hash.dependencies: Bs_Url, BsDb for detectUserType (with the kb),</description><shortdescription>Browser Capture Class.</shortdescription><version>4.0.$id$</version><copyright>blueshoes.org</copyright></doc><function name="Bs_Browscap" undoc="false" access="public"><doc><return type="void"/><description/><shortdescription>Constructor.</shortdescription></doc></function><function name="detectUserType" undoc="false" access="public"><doc><see type="var">$this</see><return type="void"/><description>ip and ip-rangehostnameuser-agent (browser string)NOTE:in order to be able to query the kb for crawler-data, we need a refto a db instance. so set $this-&amp;gt;bsDb first.</description><shortdescription>tells what kind of &amp;apos;user&amp;apos; the user is, based on</shortdescription></doc></function><function name="isWebCrawler" undoc="false" access="public"><doc><parameter name="$userAgent" type="string"/><parameter name="$ip" default="NULL," type="string"/><parameter name="$hostName" default="NULL" type="string"/><return name="" type="bool"/><description>if it&amp;apos;s a web crawler we might want to send different pages, andwe certainly don&amp;apos;t want a redirect for browser sniffing.</description><shortdescription>better use detectUserType()! this is for testing only.</shortdescription></doc></function><function name="compute" undoc="false" access="private"><doc><return type="void"/><description/><shortdescription>runTest() has been done, now let&amp;apos;s compute the data.</shortdescription></doc></function><function name="runTest" undoc="false" access="public"><doc><return type="void"/><description>client and redirect to the same page.NOTE: this method does EXIT at the end.</description><shortdescription>Make cookie and javascript tests. For this we need to send an html file to the</shortdescription></doc></function><function name="_getOsInfo" undoc="false" access="private"><doc><author>Roger Raymond</author><author>modifications by andrej arn</author><parameter name="&amp;$userAgent" type="string"/><return name="" type="array"> (vector with 2 elements)</return><description>vector with 2 elements, [0] being the os and [1] the osVersion.possible values are:OS      OS Versionwin     31,95,98,NT,2000,ME,XPos2     os2mac     68k, ppc*nix    sun|sun4|sun5|suni86irix|irix5|irix6|...hpux9|hpux10|...aix|aix1|aix2|aix3|...dec, vms, sco, unixware, mpras, reliant, sinix, bsd|freebsd, linuxunknown unknown</description><shortdescription>reads out os information from the userAgent string. returns a</shortdescription></doc></function><function name="_getBrowserInfo" undoc="false" access="private"><doc><author>Roger Raymond</author><author>modifications by andrej arn</author><parameter name="$userAgent" type="string"/><return name="" type="array"> (vector with 5 elements)</return><description>vector with 7 elements:[0] = browser             (&amp;apos;ie&amp;apos;, &amp;apos;ns&amp;apos; etc)[1] = browserFullVersion  (&amp;apos;6.0b&amp;apos;)[2] = browserMajorVersion (&amp;apos;6&amp;apos;)[3] = browserMinorVersion (&amp;apos;0&amp;apos;)[4] = browserMinorVerlet  (&amp;apos;b&amp;apos;)[5] = isGecko[6] = browserBuild</description><shortdescription>reads out browser information from the userAgent string. returns a</shortdescription></doc></function><function name="is" undoc="false" access="public"><doc><parameter name="$s" type="string">search phrase, format &amp;apos;l:lang;b:browser&amp;apos;</parameter><return name="" type="bool">TRUE on success, FALSE on failure.</return><description>fired for it each time.example I:you wanna know if the browser is opera version 5 or higher.$client-&amp;gt;is(&amp;apos;b:OP5Up&amp;apos;);should also work with the &amp;apos;browser language&amp;apos; somehow. dunno. not supported yet.</description><shortdescription>tells if the client browser IS or HAS what you ask for. a regexp is being</shortdescription></doc></function><function name="_performBrowserSearch" undoc="false" access="private"><doc><see type="var">$this</see><parameter name="$data" type="array">vector with 5 elements. see above.</parameter><return name="" type="bool">TRUE on success, FALSE on failure.</return><description>param $data: $this-&amp;gt;is() was called with a param like &amp;apos;b:OP5Up&amp;apos;.this gets parsed into a 5-element vector like this:array(&amp;apos;b:OP5Up&amp;apos;, &amp;apos;OP&amp;apos;, &amp;apos;5&amp;apos;, &amp;apos;&amp;apos;, &amp;apos;Up&amp;apos;);here the 4th element is empty cause the browser had nominor version (like &amp;apos;b:OP5.5Up&amp;apos;).</description><shortdescription>note: browserMinorVerlet is not used for the compare.</shortdescription></doc></function><function name="_insert" undoc="false" access="private"><doc><parameter name="$k" type="string">(key)</parameter><parameter name="$v" type="mixed">(value)</parameter><return type="void"/><description/><shortdescription>inserts a key/value pair into the knowledge hash.</shortdescription></doc></function><function name="_test_cookies" undoc="false" access="private"><doc><return type="void"/><description/><shortdescription/></doc></function><function name="isEmailCrawler" undoc="true" access="private"><doc><parameter name="$userAgent" undoc="true"/><parameter name="$ip" type="string" undoc="true"/><parameter name="$hostName" type="string" undoc="true"/><return type="void"/></doc></function><function name="isCrawler" undoc="true" access="private"><doc><parameter name="$userAgent" undoc="true"/><parameter name="$ip" type="string" undoc="true"/><parameter name="$hostName" type="string" undoc="true"/><return type="void"/></doc></function><function name="bcCheck" undoc="true" access="private"><doc><return type="void"/></doc></function><function name="bsBcRedirect" undoc="true" access="private"><doc><return type="void"/></doc></function><function name="ieCheckPlugin" undoc="true" access="private"><doc><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$dummyHs}" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$head" undoc="true"/><parameter name="$page" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="&amp;$userAgent" undoc="true"/><parameter name="$regex_windows" type="string" undoc="true"/><parameter name="$regex_mac" type="string" undoc="true"/><return type="void"/></doc></function><function name="checkFlash" undoc="true" access="private"><doc><return type="void"/></doc></function><function name="something" undoc="true" access="private"><doc><return type="void"/></doc></function><function name="_performLanguageSearch" undoc="true" access="private"><doc><parameter name="$data" undoc="true"/><return type="void"/></doc></function><function name="_getLanguages" undoc="true" access="private"><doc><return type="void"/></doc></function><function name="_get_ip" undoc="true" access="private"><doc><return type="void"/></doc></function><variable name="$bsDb" access="public" type="object [unknown]"><doc><see type="var">$this</see><description/><shortdescription>a db instance, used in detectUserType to access the kb.</shortdescription></doc></variable><variable name="$data" access="private" type="array">array()<doc><description>Data hash holding the key/value pairs with the information. If something isnot set or null it means &amp;apos;not known&amp;apos; while false means &amp;apos;no&amp;apos;.Normally we would write var names like &amp;apos;hasFrames&amp;apos; instead of just &amp;apos;frames&amp;apos; and&amp;apos;isJavaScriptEnabled&amp;apos; instead of &amp;apos;javaScriptEnabled&amp;apos; but to save characters wedon&amp;apos;t do that here.-------------------------------------------------------------------------------------------BROWSER, BASIC-------------------------------------------------------------------------------------------KEY: userAgent (string):The browser string as we get it from the client.NOTE:  The client can send *anything*. Some users even have stupid anonymizersand banner killers installed which send a random client string on each request. Sucks!Also it is usual that less common browsers identify themselves as well known ones.Example: &amp;apos;Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)&amp;apos;Supported: all afaik &amp;quot;As Far As I Know&amp;quot;, (sent in the header request).KEY: browser (string):&amp;apos;ie&amp;apos;, &amp;apos;ns&amp;apos; etc.Supported: depends on userAgenttodo: i&amp;apos;d like to classify all moz-browsers as gecko (mozilla, netscape, konqueror etc)KEY: isGecko (bool):tells if the browser uses the gecko engine.that should be TRUE for things like mozilla, netscape, galeon, &amp;quot;konqueror&amp;quot; (sp?) etc.check browserBuild for the versionKEY: browserMajorVersion (int):For &amp;quot;internet explorer 6.0b&amp;quot; this would be &amp;apos;6&amp;apos;.Supported: depends on userAgentKEY: browserMinorVersion (int):For &amp;quot;internet explorer 6.0b&amp;quot; this would be &amp;apos;0&amp;apos;.Supported: depends on userAgentKEY: browserMinorVerlet (mixed):For &amp;quot;internet explorer 6.0b&amp;quot; this would be &amp;apos;b&amp;apos;.Supported: depends on userAgentKEY: browserFullVersion (string):For &amp;quot;internet explorer 6.0b&amp;quot; this would be &amp;apos;6.0b&amp;apos;.Supported: depends on userAgentKEY: browserBuild (string):2do...for gecko: from the browser string &amp;quot;Gecko/20020530&amp;quot; =&amp;gt; &amp;quot;20020530&amp;quot;so it&amp;apos;s a date.20020530 is the release version of moz 1.0    moz 1.0 identifies as 5.0, revision 1.0.0, see here:    Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.0) Gecko/2002053020020826 is the release version of moz 1.1    moz 1.1 identified as 5.0, revision 1.1,   see here:    Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826KEY: browserCodeName (string):The nickname of the browser. Invented by netscape cause their browser was called &amp;apos;mozilla&amp;apos;.Comes from &amp;quot;mosaic killer&amp;quot;, &amp;quot;mosaic killa&amp;quot;. ie identifies itself as &amp;apos;mozilla&amp;apos; aswell. So Iguess most clients do, which makes this var pretty useless(?)Supported: Needs javascript. I think that it could be read out from the userAgent aswell,cause &amp;apos;mozilla&amp;apos; is often in there. dunno.KEY: browserLanguages (array holding strings):ISO codes like &amp;apos;en&amp;apos; or extended like &amp;apos;en-uk&amp;apos;, &amp;apos;de-ch&amp;apos; etc.Supported: all afaik (sent in the header request).KEY: webCrawler (bool):2do...If the client is a webcrawler. For example search engines crawl the web to update theirindexes. So if we detect a crawler, one can send a crawler-optimized webpage, for example.Supported: depends on userAgent, maybe ip/hostname.KEY: emailCrawler (bool):2do...If the client is an email crawler. I don&amp;apos;t see how we can detect these, cause i guess theyusually identify themself as a standard browser. Maybe using ranges of known ip addresses?Email crawlers spider the web to get email addresses, so that&amp;apos;s something we don&amp;apos;t wanna have.Supported: depends on userAgent, maybe ip/hostname.KEY: wap (bool):2do...If the client is a wap mobile phone. =&amp;gt; use wmlSupported: depends on userAgentKEY: pda (bool):2do...If the client is a portable device. Like palm or handspring.Dunno what language they need.  Dul I thin .Supported: depends on userAgentKEY: os (string):One of &amp;apos;win&amp;apos;, &amp;apos;mac&amp;apos;, &amp;apos;linux&amp;apos;, &amp;apos;beos&amp;apos;, &amp;apos;freebsd&amp;apos;, &amp;apos;solaris&amp;apos;, ...Supported: depends on userAgentKEY: osVersion (string):Something like &amp;apos;95&amp;apos;, &amp;apos;98&amp;apos;, &amp;apos;2000&amp;apos;, &amp;apos;xp&amp;apos;, &amp;apos;ppc&amp;apos;, ...Supported: depends on userAgentKEY: cpuClass (string):Something like &amp;apos;x86&amp;apos;.Supported: only ie afaik, not netscape, needs javascript.-------------------------------------------------------------------------------------------CLIENT-------------------------------------------------------------------------------------------KEY: ip (string 15 chars, IPv6 would be 24):Example: 217.162.141.109Sometimes ISP Cache Servers/Proxies replace the REMOTE_ADDR with their ip address.If so, they usually add the originators ip to the HTTP_X_FORWARDED_FOR header. butthere are 2 problems:1) Anyone can add such a header, and thus we cannot use this as the real ip address.2) Sometimes this header value is a comma separated list cause there are more proxiesin a row, and each one adds the previous host to the list.Though you can still log this information.I have read once that using netscape and a java applet, it would be possible to getthe real ip address of a client inside a company using a proxy server. hrm?Supported: alwaysKEY: ipResolved (string): (also known as &amp;apos;host&amp;apos;)The resolved ip address. Example: dclient217-162-141-109.hispeed.chSupported: If resolving is enabled in the web server (apache) and the host can be resolved to a name.KEY: referrer (string):I have seen this word written as referer and referrer (2r) both multiple times. So Ithink both writings are ok. But when it comes to variables it matters. For php (apache)it is HTTP_REFERER. My translator only knows 2r.The address of the page (if any) which referred the browser to the current page. This isset by the user&amp;apos;s browser; not all browsers will set it.As with userAgent, anonymizer programs often fake this one.It is not really used here. the information is lost with the redirect, but we could fixthat easily. Should we? The browser check is only done once; when the session starts.So after that you have to read out the current http referer yourself anyway. The sameapplies for proxy and via. I kinda thing that we should carry on the original referrerbefore our redirect. The same applies to anything, like post-, get- and cookie vars.KEY: proxy (string):2do...see referrer.KEY: via (string):2do...see referrer.KEY: userType (array):type =&amp;gt; webcrawler|emailcrawler|user|proxy|virus|translator|anonymizerwebcrawler[s]   come from public search engines to update their indexes. they&amp;apos;re mostly welcome.emailcrawler[s] come to find email addresses from spamming, we never want them.users[s]        are ppl visiting the web site, they&amp;apos;re mostly welcome.prox[ies]       come to our site to fetch pages for ppl. they&amp;apos;re fine. some ppl and services mayabuse them to be anonymous.virus[es]       are programs (or users) trying to fuck with our server. often the owners of thesemachines don&amp;apos;t know what happens from their box, are using dial-up accounts, andthus we really should not block them permanently.translator      like babelfish from altavista, google has that aswell.anonymizer      like a proxy (or translator) to be anonymous.nice =&amp;gt; true|falsewebcrawlers are nice until known otherwise or until they don&amp;apos;t respect our robots.txt.emailcrawlers are never nice.users ans proxies are nice until they fuck with our bandwidth or so.viruses are never nice.name =&amp;gt; if a crawler is coming from google, the name will be &amp;quot;Google&amp;quot; (not googlebot). it&amp;apos;s the nameof the service. of course a user has no such &amp;apos;name&amp;apos;.url  =&amp;gt; again for crawlers, google would have the value http://www.google.com/ here.if you use cloaking and know the request comes from altavista, you may want to add a back-linkto them, the spider may like it. :-)supported: needs detectUserType() to be executed.-------------------------------------------------------------------------------------------PROPERTIES-------------------------------------------------------------------------------------------KEY: dom (string):string &amp;apos;dom&amp;apos; || &amp;apos;ie4&amp;apos; || &amp;apos;ns4&amp;apos; || &amp;apos;basic&amp;apos; || &amp;apos;&amp;apos;ie4: document.-   all , style  window.  -   eventns4: document.-   layers   array    -   push  , popbasic: dunnosupported: needs javascripttodo: maybe detect it if js is disabled based on the browser string. at least for ie5+ and ns6+.BUT: spiders could fake it and that way get dom-pages. do we want that? not sure.new implementation: if we get to compute the values with a js=0 param (js disabled, but redirectworked), this var will be computed from the browser string. spiders should notfall into that category, hopefully. i need that feature now.KEY: height (int):The full screen height of the client computer. In 1024/768 that is 768.Supported: needs javascriptKEY: width (int):The full screen width of the client computer. in 1024/768 that is 1024.Supported: needs javascriptKEY: heightAvailable (int):The available height for the page in the browser window.That is the height withouth taskbar, office shortcut bar, browser bars etc.Supported: needs javascriptKEY: widthAvailable (int):The available width for the page in the browser window.That is the width withouth taskbar, office shortcut bar, browser bars etc.Supported: needs javascriptKEY: colorDepth (int):If set it is one of 8, 16, 24, 32 or 36. it is the number of bits.24-bit means &amp;quot;high&amp;quot;, 16.77 million colors.16-bit means &amp;quot;medium&amp;quot;.dunno the others.Supported: needs javascriptKEY: langUser (string):Something like &amp;apos;en-uk&amp;apos;Supported: needs javascript. ie only i think. no ns/op/mo on win2k.KEY: langSystem (string):Something like &amp;apos;en-uk&amp;apos;Supported: needs javascript. ie only i think. no ns/op/mo on win2k.KEY: timeZoneDiffGmt (double) (stored as string):The timezone difference from the client to gmt in hours.It can be something like &amp;apos;3&amp;apos;, &amp;apos;0&amp;apos;, &amp;apos;-1.5&amp;apos;.Supported: needs javascriptKEY: timeZoneDiffServer (double):2do...see timeZoneDiffGmt.The timezone difference from the client to the server in hours.It can be something like &amp;apos;3&amp;apos;, &amp;apos;0&amp;apos;, &amp;apos;-1.5&amp;apos;.Supported: needs javascriptKEY: browserDateTime (string):2do...Supported: needs javascriptKEY: connectionType ():One of the following values:- lan     User is connected through a network.- modem   User is connected through a modem.- offline User is working offline.KEY: connectionSpeed ():2do...KEY: isFramed (bool):Tells if the part in which we should load a page is inside a frameset.Supported: needs javascript-------------------------------------------------------------------------------------------FEATURES-------------------------------------------------------------------------------------------KEY: cookiesSession (bool):If the browser supports session cookies (and are enabled).Session cookies are cookies that are deleted once the browser (all browser instances) is closed.Supported: all (it is tested by setting a real cookie.)KEY: cookiesPermanent (bool):If the browser supports permanent cookies (and are enabled).Permanent cookies are cookies that keep on living (hours, days) until the given timeout, even ifthe browser is closed.Supported: needs javascript. Also works without, but it may be that this var is true even thoughthe client only treats persistant cookies as session cookies.KEY: javaScript (bool):If the client supports javascript.2do: I&amp;apos;m not able to detect if javascript would be available but is disabled.but i don&amp;apos;t really need that. i guess we would need to check the browser string.KEY: javaScriptEnabled (bool):If javascripts are enabled.It still could be that a firewall filters parts of it out from the html file, or that a junkbusterdoes it. Usually they would allow image effects and such, but not more.So if any of the javascript checks should fail this var should be set to false.Supported: needs javascript :)KEY: javaScriptBuild ():2dodo we need this at all?KEY: javaScriptVersion (string) (stored as string not double):The javascript version, eg &amp;apos;1.3&amp;apos;.Supported: needs javascriptKEY: javaApplets(bool):If the browser supports java (applets).2do: I&amp;apos;m not able to detect if javascript would be available but is disabled.But I don&amp;apos;t really need that. I guess we would need to check the browser string.I think this is better here than in the plugins list.KEY: javaAppletsEnabled(bool):If java applets are enabled in the browser.It still could be that a firewall filters it out from the html file.I think this is better here than in the plugins list.KEY: metaRefresh (bool):If we can use http redirect using meta refresh or not. In ie6 you can set thatin your preferences. Default is true, and i don&amp;apos;t think many ppl will change that.2do dunno how to detect it (without doing a metarefresh).KEY: frames (bool):If the client supports frames.KEY: iFrames (bool):If the client has and supports iframes. (in ie6/op5 you can disable that.)KEY: tables (bool):KEY: styleSheets (bool):If the client supports style sheets.KEY: fileUpload (bool):If the client supports file uploading.KEY: png (bool):If the client supports png images.NULL means unknown. you better treat that as FALSE and use gif/jpg or you riskthat ppl don&amp;apos;t see your images.For further information visit- http://www.libpng.org/pub/png/- http://www.libpng.org/pub/png/pngapbr.htmlKEY: tableBgImage (bool):If the client supports having background images inside tables.KEY: xml:If the client supports xml.do we mean xsl here?2do...-------------------------------------------------------------------------------------------PLUGINS-------------------------------------------------------------------------------------------//Navigator.plugins.refresh()  make newly installed plugins availableKEY: pluginFlash (bool):If the client supports the flash plugin.KEY: pluginFlashVersion (string):KEY: pluginAcrobat (bool):If the client supports the acrobat plugin and thus can view .pdf files.KEY: pluginAcrobatVersion (string):</description><shortdescription>*****************************************************************************************</shortdescription></doc></variable><variable name="$_getVars" access="private" type="array"><doc><description/><shortdescription>reference to the HTTP_GET_VARS.</shortdescription></doc></variable><variable name="$runTestTemplate" access="public" type="string"><doc><description>will be used in runTest().the special placeholder __HEAD__ in the template will be replacedwith all the needed javascript and stuff.your body tag needs to do onLoad=&amp;quot;bcCheck();&amp;quot;.</description><shortdescription>if set then the html template at this location (absolute path)</shortdescription></doc></variable><variable name="$runTestTimeout" access="private" type="unknown"><doc><description>a redirect after 1.5 seconds is no fun. you want more. set atimeout here in seconds.</description><shortdescription>you may want to use the browsertest page as intro page. if so,</shortdescription></doc></variable><variable name="$this" access="private" type="unknown"><doc></doc></variable><constant name="BS_BROWSCAP_VERSION" undoc="true" access="private" case="default: case sensitive">4.0.$x$<doc></doc></constant><inherited src="Bs_Object" type="functions"><element>isex</element><element>isexception</element><element>tostring</element><element>tohtml</element><element>persist</element><element>unpersist</element><element>bs_object</element><element>bbsetoutput</element><element>bbawake</element><element>bbisawake</element><element>bbxmsg</element><element>bbxfunctionstart</element><element>bbxfunctionend</element><element>bbxecho</element><element>bbxvar</element><element>bbxvardump</element><element>bbforcetrace</element><element>bbbufferstart</element><element>bbbufferget</element><element>bbbufferendflush</element><element>bbbufferendclean</element></inherited><inherited src="Bs_Object" type="consts"><element>bs_object_version</element></inherited><path><parent>Bs_Object</parent></path><baseclass>Bs_Object</baseclass></class></phpdoc>