diff --git a/AUTHORS.txt b/AUTHORS.txt deleted file mode 100644 index f62dbb3..0000000 --- a/AUTHORS.txt +++ /dev/null @@ -1,3 +0,0 @@ -Δόβα Φιλία (Dova Filia) -Μίγδος Γεώργιος (Migdos George) - diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 3fd0bc3..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,178 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/README.md b/README.md deleted file mode 100644 index 0cf942e..0000000 --- a/README.md +++ /dev/null @@ -1,90 +0,0 @@ -WifiScanAndMap -============== - -A simple 802.11 mapping application for Linux written in Python. - -Url ---- - -* [http://gmigdos.wordpress.com/2010/04/04/wifiscanandmap-a-wifi-mapping-application-for-linux/](http://gmigdos.wordpress.com/2010/04/04/wifiscanandmap-a-wifi-mapping-application-for-linux/) - -Authors -------- - -* Δόβα Φιλία (Dova Filia) -* Μίγδος Γεώργιος (Migdos George) - -License -------- - -* The source code is available under the [Apache v2.0 license](http://www.apache.org/licenses/LICENSE-2.0.html). -* The artwork is available under the [Creative Commons Attribution-Share Alike 3.0 Unported license](http://creativecommons.org/licenses/by-sa/3.0/). -* The 3rd party [Bluff Javascript library](http://bluff.jcoglan.com/) is available under the [MIT license](http://www.opensource.org/licenses/mit-license.php). - -Description ------------ - -WiFiScanAndMap is a Python WiFi mapping application for Linux. - -You can use it to scan areas for wireless networks, collect information about them and then generate a web page displaying these information on a map. - - -The application was created as an assignment for the “Wireless Networks And Mobile Communcations” course at the Computer Science Department of the Athens University Of Economics And Business, by: - -* Filia Dova -* Georgios Migdos - - -The application consists of two programs, the scanner and the map generator. - -The user runs the scanner on a mobile device (laptop/netbook) which collects information about the wireless networks within range. The program relies on `iwlist` output for the scanning process. After the user is done, they can save the collected information as an XML file. - -The scanner can be run as a GTK+ application or as a command line application (with the `–no-gui` parameter). - -This process can be repeated any number of times, resulting in a number of XML files. These XML files are used as the input of the map generator program which parses the XML files and produces an HTML web page. - - - -The map data used is obtained from OpenStreetMap and the tiles are from Yahoo! Maps. The graph is displayed using the Bluff Javascript library. - - - -Requirements ------------- - -To run the scanner you need: - -* A Linux system with wireless tools for Linux installed -* Wireless card supporting scanning -* GPS receiver -* Python 2.6.4 -* gpsd (+python bindings) -* PyGTK+ 2.16 (if you want to use the GUI) - -To display the map you need: - -* A web browser supporting CSS with Javascript enabled -* An active internet connection - - -Usage ------ - -You can run the scanner (GTK+ GUI) with the command : - - python scanner/scanner.py - -You can run the scanner (GTK+ GUI) with the command : - - python scanner/scanner.py –no-gui - -You can run the map generator with the command: - - python mapgenerator/mapgenerator.py - -where: - -* `` and `` are the geographic coordinates of the resulting map’s original center -* `` is the directory where the result files will be saved -* `` `` … `` are the XML files generated by the scanner. - diff --git a/data/2010-01-10.xml b/data/2010-01-10.xml deleted file mode 100755 index f4d5fc5..0000000 --- a/data/2010-01-10.xml +++ /dev/null @@ -1,10585 +0,0 @@ - - - -
00:15:56:B7:14:5C
- OTENET_7856 - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -89 - -100 - on - 37.968045 - 23.70803 -
- -
00:90:D0:EB:4E:C9
- SpeedTouchDF1E4A - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -96 - -98 - on - 37.968197 - 23.705882 -
- -
00:24:17:2F:1C:57
- Thomson9CD836 - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -92 - -104 - off - 37.968155 - 23.702585 -
- -
00:90:D0:4B:28:A3
- SpeedTouchF6CFEA - Master - 1 - 2.412 GHz (Channel 1) - 0.14 - -93 - -102 - on - 37.972297 - 23.708467 -
- -
00:1C:A2:DA:7D:91
- SABER-NET - Master - 9 - 2.452 GHz (Channel 9) - 0.4 - -76 - -102 - on - 37.96814 - 23.701895 -
- -
00:1C:4A:43:A8:10
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - on - 37.967263 - 23.703967 -
- -
00:1C:4A:46:EE:9D
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -99 - -98 - on - 37.972677 - 23.71002 -
- -
00:05:59:09:7F:03
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.0 - -100 - -100 - on - 37.972818 - 23.711278 -
- -
00:13:33:82:BD:97
- OTE0e95dc - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -85 - -99 - on - 37.96836 - 23.701307 -
- -
00:1A:70:9A:A7:30
- linksysju - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -99 - -101 - on - 37.970457 - 23.704475 -
- -
00:23:48:0E:53:6F
- Dimitris - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -80 - -99 - on - 37.970112 - 23.706637 -
- -
00:14:7F:6E:7C:B7
- SpeedTouchF6D0CD - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -89 - -103 - on - 37.96859 - 23.704977 -
- -
00:1D:68:76:2E:CC
- SpeedTouch2B2B7B - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -97 - -100 - on - 37.972353 - 23.707408 -
- -
00:1A:2A:7E:18:6F
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -93 - -99 - on - 37.971043 - 23.707377 -
- -
00:14:7F:24:4C:F3
- SpeedTouch722835 - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -102 - -101 - on - 37.971057 - 23.706308 -
- -
00:1D:1C:F1:5C:6B
- Oxygen-05087 - Master - 2 - 2.417 GHz (Channel 2) - 0.1 - -97 - -104 - on - 37.96497 - 23.70594 -
- -
00:1D:19:49:D1:06
- away inna - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.967092 - 23.705378 -
- -
00:13:33:0E:AF:3E
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.967905 - 23.702367 -
- -
00:22:3F:55:FB:F8
- NETGEAR - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -99 - -98 - off - 37.967877 - 23.704513 -
- -
00:02:61:19:60:8A
- i3-IAD452W - Master - 11 - 2.462 GHz (Channel 11) - 0.31 - -82 - -102 - on - 37.968405 - 23.701328 -
- -
00:1E:8C:CD:2C:1E
- Gigabit - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - on - 37.970505 - 23.708532 -
- -
00:1D:1C:EE:20:23
- KrisRiot - Master - 2 - 2.417 GHz (Channel 2) - 0.34 - -81 - -103 - on - 37.965957 - 23.705053 -
- -
00:1E:8C:3A:4D:D7
- l33tN3T - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -103 - -102 - on - 37.96876 - 23.705068 -
- -
00:13:33:19:09:88
- Wireless House of J - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.966787 - 23.705043 -
- -
00:1D:19:49:72:C8
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -102 - -100 - on - 37.968285 - 23.702407 -
- -
00:19:4B:9F:E5:23
- SAGEM - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.972632 - 23.708327 -
- -
00:1C:A2:AB:E5:65
- ONTelecoms - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.966428 - 23.70368 -
- -
00:1C:F0:AE:6C:16
- drg - Master - 1 - 2.412 GHz (Channel 1) - 0.31 - -84 - -104 - off - 37.969568 - 23.703137 -
- -
00:1F:9F:CF:18:DF
- skatamefraoules - Master - 1 - 2.412 GHz (Channel 1) - 0.15 - -93 - -103 - on - 37.96935 - 23.708325 -
- -
00:05:59:0A:10:65
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.42 - -69 - -96 - on - 37.970917 - 23.709747 -
- -
00:24:17:1A:CB:53
- ANAXRI - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -102 - -100 - on - 37.967507 - 23.704282 -
- -
00:60:4C:E3:41:E2
- ANTIKALL - Master - 11 - 2.462 GHz (Channel 11) - 0.2 - -87 - -100 - on - 37.969962 - 23.705732 -
- -
00:1A:4F:21:29:CB
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -87 - -99 - on - 37.97072 - 23.706197 -
- -
00:1F:9F:87:EF:81
- ThomsonACAF1B - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - on - 37.966393 - 23.706575 -
- -
00:24:17:B8:A5:03
- Thomson129C13 - Master - 11 - 2.462 GHz (Channel 11) - 0.07 - -97 - -102 - on - 37.967948 - 23.703405 -
- -
00:18:39:2E:CE:18
- Val i Link - Master - 11 - 2.462 GHz (Channel 11) - 0.25 - -84 - -100 - on - 37.972353 - 23.707408 -
- -
00:24:17:18:69:19
- Thomson2D63E5 - Master - 1 - 2.412 GHz (Channel 1) - 0.09 - -97 - -103 - off - 37.968918 - 23.702125 -
- -
00:1F:9F:CE:B6:FB
- Thomson3A8DF2 - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -88 - -104 - on - 37.969635 - 23.708945 -
- -
00:1C:F0:E2:F8:74
- dlink - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -98 - -95 - off - 37.968203 - 23.704702 -
- -
00:1C:F0:AE:62:12
- xrisoyla - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -83 - -100 - on - 37.970667 - 23.70811 -
- -
00:24:17:AB:64:ED
- Thomson993F84 - Master - 1 - 2.412 GHz (Channel 1) - 0.06 - -99 - -103 - on - 37.971185 - 23.709403 -
- -
00:90:D0:EB:4F:07
- SpeedTouch899D95 - Master - 11 - 2.462 GHz (Channel 11) - 0.09 - -96 - -102 - off - 37.966738 - 23.703118 -
- -
00:1C:A2:B4:4F:35
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.5 - -70 - -102 - on - 37.97346 - 23.708635 -
- -
00:13:33:83:9F:9B
- Vassilis_Eleftheria - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -83 - -100 - on - 37.969797 - 23.709105 -
- -
00:1C:A2:B4:66:D9
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.21 - -87 - -101 - off - 37.971753 - 23.709677 -
- -
00:1D:19:8C:F2:94
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -83 - -99 - on - 37.971773 - 23.710243 -
- -
00:05:59:05:AC:5F
- KOSTAS - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -90 - -99 - on - 37.970458 - 23.707103 -
- -
00:05:59:05:97:33
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.971768 - 23.708668 -
- -
00:1E:74:D1:E1:F6
- nicole87 - Master - 1 - 2.412 GHz (Channel 1) - 0.15 - -94 - -104 - on - 37.970953 - 23.709287 -
- -
00:1C:4A:43:B5:73
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.01 - -99 - -100 - on - 37.966418 - 23.704257 -
- -
00:1E:74:BB:38:D4
- CONN-X_5982 - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -88 - -100 - on - 37.968197 - 23.705882 -
- -
00:02:61:25:D9:AA
- i3-IAD452W - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - off - 37.970953 - 23.709287 -
- -
00:13:33:1E:E2:14
- OTEe214 - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.972515 - 23.711133 -
- -
00:1C:A2:D9:9F:85
- ON - Master - 9 - 2.452 GHz (Channel 9) - 0.26 - -85 - -102 - on - 37.972463 - 23.710645 -
- -
00:24:17:AC:0E:11
- Thomson238F3D - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -101 - -97 - off - 37.969918 - 23.7054 -
- -
00:1F:9F:ED:82:F3
- Thomson710491 - Master - 1 - 2.412 GHz (Channel 1) - 0.31 - -84 - -104 - on - 37.966917 - 23.704785 -
- -
00:13:33:82:AE:51
- OTE53beab - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -82 - -92 - on - 37.96948 - 23.708353 -
- -
00:1A:2A:88:8E:1C
- SAMNET - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -92 - -99 - on - 37.966217 - 23.705328 -
- -
00:13:33:82:FB:B5
- OTEd24ea4 - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -82 - -96 - on - 37.971057 - 23.706308 -
- -
00:1C:A2:B3:2F:AD
- josef - Master - 9 - 2.452 GHz (Channel 9) - 0.26 - -85 - -102 - on - 37.972095 - 23.708837 -
- -
00:13:33:09:5C:98
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -87 - -96 - on - 37.968825 - 23.706567 -
- -
00:05:59:15:0A:52
- internet - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.96681 - 23.706005 -
- -
00:23:48:11:E2:8B
- CONN-X_6547 - Master - 11 - 2.462 GHz (Channel 11) - 0.07 - -96 - -101 - on - 37.97046 - 23.70646 -
- -
00:1F:9F:9A:DC:E7
- SpeedTouch917205 - Master - 1 - 2.412 GHz (Channel 1) - 0.15 - -92 - -102 - off - 37.973232 - 23.708955 -
- -
00:1C:A2:AA:89:35
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.01 - -102 - -103 - on - 37.969923 - 23.707147 -
- -
00:1C:A2:AB:DF:F1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.32 - -81 - -102 - on - 37.96896 - 23.706203 -
- -
00:1F:9F:D4:85:95
- ThomsonD54749 - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -88 - -104 - on - 37.968985 - 23.707772 -
- -
00:1C:A2:AB:D6:35
- ONTelecoms - Master - 1 - 2.412 GHz (Channel 1) - 0.12 - -92 - -100 - on - 37.965618 - 23.705558 -
- -
00:1C:A2:AB:D5:A5
- sopfie - Master - 9 - 2.452 GHz (Channel 9) - 0.06 - -99 - -103 - on - 37.969502 - 23.7089 -
- -
00:05:59:0B:31:EF
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -100 - -98 - on - 37.970198 - 23.7064 -
- -
00:18:39:27:F5:AE
- Stef Home - Master - 3 - 2.422 GHz (Channel 3) - 0.12 - -95 - -103 - on - 37.968425 - 23.702672 -
- -
00:1F:9F:EB:98:3F
- alibaba - Master - 1 - 2.412 GHz (Channel 1) - 0.04 - -99 - -102 - on - 37.967155 - 23.706107 -
- -
00:13:33:07:D1:C0
- oxi kataxrhsh - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -82 - -104 - off - 37.971763 - 23.706538 -
- -
00:1C:A2:B3:53:C1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -100 - -98 - on - 37.970508 - 23.707138 -
- -
00:1F:9F:CE:CA:99
- nat_mav - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - on - 37.971445 - 23.707612 -
- -
00:1A:4F:01:A9:BB
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 1 - 2.412 GHz (Channel 1) - 0.28 - -85 - -103 - on - 37.968582 - 23.70733 -
- -
00:15:56:B4:E7:54
- Ni0 - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -80 - -96 - on - 37.96774 - 23.708527 -
- -
00:19:3E:E8:B3:69
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -99 - off - 37.969827 - 23.705668 -
- -
00:1C:4A:A3:3D:6F
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.968788 - 23.70623 -
- -
00:1C:DF:A1:83:CE
- Belkin_N1_A183CE - Master - 6 - 2.437 GHz (Channel 6) - 0.23 - -84 - -99 - on - 37.96858 - 23.70568 -
- -
00:90:D0:4A:F4:83
- SpeedTouch746797 - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -95 - -100 - on - 37.96681 - 23.706005 -
- -
00:05:59:14:CE:4F
- john_ser - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -88 - -96 - on - 37.966608 - 23.707212 -
- -
00:1D:19:49:66:1D
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.965658 - 23.706312 -
- -
00:25:86:CE:E7:82
- TP-LINK_CEE782 - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -102 - -101 - on - 37.968732 - 23.706908 -
- -
00:05:59:0B:B1:0B
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -83 - -100 - on - 37.966375 - 23.705883 -
- -
00:05:59:15:CE:09
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.97028 - 23.705965 -
- -
00:1C:A2:B2:8F:F9
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -90 - -102 - on - 37.973395 - 23.710505 -
- -
00:1D:19:49:0F:AD
- Ultras-13 a.c.a.b - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -90 - -99 - on - 37.968945 - 23.708673 -
- -
00:13:33:1E:34:2A
- eleni - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -89 - -96 - on - 37.970523 - 23.709558 -
- -
00:1C:A2:B2:A1:39
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.06 - -98 - -102 - on - 37.971773 - 23.710243 -
- -
00:15:56:CE:09:18
- OTENET_6299 - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.972177 - 23.707278 -
- -
00:02:61:29:6B:EB
- logan - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -100 - -102 - on - 37.968637 - 23.703137 -
- -
00:15:56:B5:2B:8B
- OTENET_8778 - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -80 - -99 - on - 37.968095 - 23.703507 -
- -
00:13:33:07:B2:3A
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.970788 - 23.709437 -
- -
00:23:48:6A:97:B7
- CONN-X_4385 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -90 - -103 - on - 37.96832 - 23.707882 -
- -
00:05:59:04:B7:47
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.31 - -76 - -96 - on - 37.96828 - 23.706712 -
- -
00:1D:19:49:AF:94
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.966417 - 23.70358 -
- -
00:13:33:07:B6:B0
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -97 - on - 37.969847 - 23.704227 -
- -
00:1C:A2:DD:CD:1F
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.06 - -97 - -101 - on - 37.969242 - 23.708233 -
- -
00:16:E6:3C:B9:58
- - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - off - 37.971768 - 23.708668 -
- -
00:1F:9F:49:D3:7F
- Thomson6BDAF6 - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -92 - -103 - on - 37.969333 - 23.706897 -
- -
00:18:46:02:B5:5D
- AR7WRD - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -86 - -101 - on - 37.967427 - 23.704508 -
- -
00:19:3E:E5:C6:11
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.23 - -87 - -102 - off - 37.968475 - 23.706092 -
- -
00:13:33:1E:9A:9E
- fay - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.96751 - 23.704285 -
- -
00:17:C2:F6:CB:7C
- ONTelecoms - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.97037 - 23.706013 -
- -
00:1C:A2:AC:02:ED
- LEONIDAS - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -89 - -101 - on - 37.971753 - 23.709677 -
- -
00:13:33:1D:4A:BE
- ZTSACH - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.968547 - 23.706083 -
- -
00:1A:2A:B0:35:25
- karvounis - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -84 - -103 - on - 37.968517 - 23.701503 -
- -
00:1D:1C:7C:D0:E9
- OVIDIU - Master - 9 - 2.452 GHz (Channel 9) - 0.25 - -86 - -102 - on - 37.966917 - 23.704785 -
- -
00:13:33:18:D2:CE
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -100 - -96 - on - 37.973335 - 23.709568 -
- -
00:24:17:1A:00:AB
- ThomsonFFE949 - Master - 11 - 2.462 GHz (Channel 11) - 0.09 - -96 - -102 - on - 37.96814 - 23.701895 -
- -
00:15:70:91:34:34
- - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -86 - -103 - on - 37.967398 - 23.70722 -
- -
00:1C:A2:AA:A2:35
- panos - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -92 - -90 - on - 37.967188 - 23.70414 -
- -
00:90:D0:DC:48:75
- SpeedTouch0A89E2 - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -87 - -104 - off - 37.97204 - 23.708807 -
- -
00:05:59:1C:BA:57
- HOL GT - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -92 - -99 - on - 37.965803 - 23.70493 -
- -
00:90:D0:DD:33:F1
- SpeedTouch8FB905 - Master - 1 - 2.412 GHz (Channel 1) - 0.01 - -102 - -103 - on - 37.970462 - 23.707 -
- -
00:1D:19:70:76:6C
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.970347 - 23.709078 -
- -
00:1D:7E:AE:95:CA
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - off - 37.966185 - 23.70391 -
- -
00:05:59:14:94:71
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -90 - -99 - on - 37.973023 - 23.710462 -
- -
00:1F:9F:42:9E:BF
- ThomsonFC467E - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -87 - -103 - on - 37.97037 - 23.706013 -
- -
00:15:56:B7:46:63
- xenonet - Master - 6 - 2.437 GHz (Channel 6) - 0.34 - -78 - -100 - on - 37.972405 - 23.710568 -
- -
00:1C:A2:D9:30:21
- ManoZ ;) - Master - 9 - 2.452 GHz (Channel 9) - 0.0 - -100 - -100 - on - 37.973023 - 23.710462 -
- -
00:13:33:0F:31:14
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.967948 - 23.703405 -
- -
00:1F:9F:4A:3B:5D
- Thomson5F726B - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -103 - -100 - off - 37.965013 - 23.706033 -
- -
00:1C:A2:C2:CA:A0
- OpenRG - Master - 9 - 2.452 GHz (Channel 9) - 0.09 - -96 - -102 - on - 37.966372 - 23.703835 -
- -
00:1C:A2:B2:74:6D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.25 - -87 - -103 - off - 37.971362 - 23.70949 -
- -
00:14:C1:30:AB:D7
- USR9108 - Master - 11 - 2.462 GHz (Channel 11) - 0.2 - -87 - -100 - on - 37.966875 - 23.705922 -
- -
00:1F:9F:CE:B2:97
- Thomson0A4016 - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -83 - -102 - off - 37.969368 - 23.707365 -
- -
00:1C:A2:AC:1B:D1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.28 - -85 - -103 - on - 37.968372 - 23.706247 -
- -
00:24:17:AF:01:D1
- Thomson142254 - Master - 1 - 2.412 GHz (Channel 1) - 0.06 - -100 - -104 - off - 37.967092 - 23.705378 -
- -
00:1D:7E:B1:BF:74
- HUSTLER - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -95 - -102 - on - 37.967323 - 23.704803 -
- -
00:1F:9F:D3:84:D3
- ThomsonD37D98 - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -96 - -103 - on - 37.972195 - 23.707138 -
- -
00:1E:2A:FA:64:4E
- NETGEAR - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -98 - -97 - on - 37.965532 - 23.705545 -
- -
00:1A:4F:20:DE:F2
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -89 - -99 - on - 37.965708 - 23.70483 -
- -
00:1C:A2:DA:C0:DF
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.14 - -94 - -103 - on - 37.972295 - 23.707225 -
- -
00:24:17:1B:BD:5D
- Thomson30380A - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -90 - -103 - on - 37.972318 - 23.708923 -
- -
00:05:59:0A:0B:4D
- pavlos - Master - 2 - 2.417 GHz (Channel 2) - 0.25 - -88 - -104 - on - 37.96677 - 23.705075 -
- -
00:1A:2A:DE:45:98
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -96 - -95 - on - 37.97351 - 23.709682 -
- -
00:17:C2:F6:A7:7C
- aris8 - Master - 6 - 2.437 GHz (Channel 6) - 0.37 - -76 - -100 - on - 37.971768 - 23.708668 -
- -
00:90:D0:F6:7C:E8
- SpeedTouchDC6DF2 - Master - 1 - 2.412 GHz (Channel 1) - 0.0 - -103 - -103 - on - 37.968083 - 23.701913 -
- -
00:21:29:7A:37:3C
- SolosW_AP - Master - 2 - 2.417 GHz (Channel 2) - 0.21 - -90 - -104 - off - 37.967722 - 23.708072 -
- -
00:1F:9F:44:30:FF
- Thomson776A14 - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -87 - -104 - on - 37.967065 - 23.704433 -
- -
00:13:33:83:B6:9F
- OTE13a115 - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -87 - -94 - on - 37.968582 - 23.70733 -
- -
00:24:17:B2:5B:57
- Thomson7C08C8 - Master - 1 - 2.412 GHz (Channel 1) - 0.53 - -69 - -103 - off - 37.970458 - 23.707103 -
- -
00:1E:74:D1:DE:E9
- nikos - Master - 1 - 2.412 GHz (Channel 1) - 0.04 - -97 - -100 - on - 37.967438 - 23.7055 -
- -
00:14:7F:AF:DE:6D
- Loggrafmar - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -91 - -103 - on - 37.96948 - 23.708353 -
- -
00:1A:2A:7E:36:63
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.970815 - 23.707608 -
- -
00:19:5B:F6:98:40
- DLINK_WIRELESS - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -84 - -100 - on - 37.971157 - 23.70996 -
- -
00:17:C2:F4:BB:DC
- ONTelecoms - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -91 - -96 - on - 37.969473 - 23.704218 -
- -
00:13:33:0C:AC:94
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.32 - -79 - -100 - on - 37.973232 - 23.708955 -
- -
00:24:17:1F:B4:83
- Thomson1D86E3 - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -87 - -102 - on - 37.968825 - 23.706567 -
- -
00:13:33:81:F3:41
- KOSTARAS - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -92 - -96 - on - 37.969493 - 23.705497 -
- -
00:1D:19:89:1D:43
- nikos - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -97 - -95 - on - 37.969023 - 23.706087 -
- -
00:13:33:82:A0:57
- OTE6bcc3c - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -81 - -100 - on - 37.968547 - 23.706083 -
- -
00:1C:A2:B2:66:D9
- Mondi - Master - 9 - 2.452 GHz (Channel 9) - 0.04 - -99 - -102 - on - 37.96887 - 23.708523 -
- -
00:05:59:1D:02:2A
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.967092 - 23.705378 -
- -
00:13:33:81:91:87
- OTEbe0f5d - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -89 - -100 - on - 37.96721 - 23.70513 -
- -
00:13:33:0F:34:9A
- PERNET - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -87 - -99 - on - 37.974802 - 23.711063 -
- -
00:1C:A2:DA:62:83
- polimos1 - Master - 9 - 2.452 GHz (Channel 9) - 0.25 - -82 - -98 - on - 37.973592 - 23.709188 -
- -
00:22:B0:A9:74:8C
- dlink - Master - 7 - 2.442 GHz (Channel 7) - 1.0 - -102 - -96 - on - 37.96713 - 23.703062 -
- -
00:1C:F0:AE:65:4A
- dlink - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -85 - -99 - on - 37.968392 - 23.704812 -
- -
00:1F:9F:43:47:F3
- ThomsonF103A3 - Master - 1 - 2.412 GHz (Channel 1) - 0.28 - -85 - -103 - on - 37.969368 - 23.707365 -
- -
00:50:F1:12:12:10
- homerouter - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -98 - off - 37.966828 - 23.705087 -
- -
00:1C:A2:AC:50:E1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.2 - -90 - -103 - on - 37.969333 - 23.706897 -
- -
00:1F:9F:8E:46:EF
- apoukos - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -93 - -104 - on - 37.966002 - 23.704253 -
- -
00:24:17:B2:6C:1F
- Thomson36DE15 - Master - 11 - 2.462 GHz (Channel 11) - 0.01 - -101 - -102 - off - 37.966625 - 23.70651 -
- -
00:23:48:6C:40:7F
- CONN-X_7243 - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -78 - -96 - on - 37.96828 - 23.706712 -
- -
00:1D:1C:0D:C1:5D
- Oxygen-20303 - Master - 5 - 2.432 GHz (Channel 5) - 1.0 - -103 - -101 - on - 37.972483 - 23.710433 -
- -
00:05:59:1B:76:E7
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.23 - -84 - -99 - on - 37.968585 - 23.706857 -
- -
00:1C:A2:B2:4F:15
- the killer - Master - 9 - 2.452 GHz (Channel 9) - 0.01 - -100 - -101 - on - 37.970727 - 23.707922 -
- -
00:13:33:13:62:96
- silva - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.970542 - 23.706718 -
- -
00:13:33:83:6E:0F
- OTEfe6494 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -103 - -100 - on - 37.96935 - 23.70874 -
- -
00:23:48:6C:43:13
- christos - Master - 1 - 2.412 GHz (Channel 1) - 0.31 - -84 - -104 - on - 37.96822 - 23.708157 -
- -
00:13:33:0A:7C:D6
- Akis Home - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -93 - -96 - on - 37.969847 - 23.708547 -
- -
00:1F:9F:42:00:D1
- ThomsonEAB320 - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -90 - -104 - on - 37.967427 - 23.704508 -
- -
00:1C:DF:13:8C:6A
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -82 - -98 - off - 37.966427 - 23.704572 -
- -
00:17:C2:F4:65:E4
- ONTelecoms - Master - 6 - 2.437 GHz (Channel 6) - 0.34 - -78 - -100 - on - 37.967197 - 23.707148 -
- -
00:18:39:2C:E1:5E
- nasia - Master - 11 - 2.462 GHz (Channel 11) - 0.14 - -93 - -102 - on - 37.96955 - 23.707758 -
- -
00:1F:9F:8E:5C:67
- ThomsonDAA3AC - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -102 - -98 - on - 37.97329 - 23.708733 -
- -
00:21:63:3C:6A:24
- SIEMENS-3C6A24 - Master - 11 - 2.462 GHz (Channel 11) - 0.0 - -100 - -100 - on - 37.968095 - 23.703507 -
- -
00:23:48:6F:DD:D6
- CONN-X_3961 - Master - 1 - 2.412 GHz (Channel 1) - 0.09 - -98 - -104 - on - 37.969393 - 23.70382 -
- -
00:05:59:05:EA:1F
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -91 - -99 - on - 37.974392 - 23.711188 -
- -
00:22:3F:4C:68:F2
- katmes - Master - 11 - 2.462 GHz (Channel 11) - 0.18 - -87 - -99 - on - 37.965957 - 23.705053 -
- -
00:1F:9F:9C:28:91
- papalabraina - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -93 - -104 - on - 37.968155 - 23.702585 -
- -
00:21:63:3C:9A:4C
- SIEMENS-3C9A4C - Master - 11 - 2.462 GHz (Channel 11) - 0.17 - -91 - -102 - off - 37.966427 - 23.704572 -
- -
00:13:33:1D:A5:3A
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.968177 - 23.704775 -
- -
00:1C:A2:AC:F3:39
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -100 - on - 37.96721 - 23.70513 -
- -
00:19:3E:E8:8C:51
- DimitraON - Master - 9 - 2.452 GHz (Channel 9) - 0.17 - -92 - -103 - on - 37.972482 - 23.710395 -
- -
00:90:D0:FA:95:07
- nikos - Master - 1 - 2.412 GHz (Channel 1) - 0.14 - -95 - -104 - on - 37.970815 - 23.707608 -
- -
00:14:BF:9E:39:4F
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.35 - -79 - -102 - on - 37.969065 - 23.704443 -
- -
00:1C:A2:AC:12:31
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.17 - -91 - -102 - on - 37.965837 - 23.705773 -
- -
00:1E:E5:8E:0B:58
- thisisthetwinsnetwork - Master - 11 - 2.462 GHz (Channel 11) - 0.12 - -92 - -100 - on - 37.971852 - 23.70869 -
- -
00:05:59:0A:60:B5
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.96946 - 23.70674 -
- -
00:13:33:1E:9A:82
- OTE9a82 - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -90 - -95 - on - 37.973127 - 23.709042 -
- -
00:05:59:0B:AA:57
- oksw oi kleftes!!! - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -100 - -99 - on - 37.966083 - 23.706048 -
- -
00:1F:C6:E5:54:1B
- TASOS HOME - Master - 11 - 2.462 GHz (Channel 11) - 0.12 - -94 - -102 - on - 37.970672 - 23.707235 -
- -
00:90:D0:EA:D3:38
- SpeedTouch479B1F - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -88 - -99 - off - 37.968197 - 23.705882 -
- -
00:05:59:0B:AE:4B
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.96858 - 23.70568 -
- -
00:1C:4A:A3:3D:8A
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -102 - -100 - on - 37.96946 - 23.70674 -
- -
00:15:56:B7:2A:85
- OTE4288 - Master - 6 - 2.437 GHz (Channel 6) - 0.34 - -78 - -100 - on - 37.970112 - 23.706637 -
- -
00:24:17:1A:5A:B1
- ThomsonFAE336 - Master - 1 - 2.412 GHz (Channel 1) - 0.15 - -93 - -103 - on - 37.973023 - 23.710462 -
- -
00:05:59:0F:2E:2C
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.42 - -73 - -100 - on - 37.968257 - 23.702288 -
- -
00:1C:A2:D9:76:D1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -99 - off - 37.970753 - 23.709608 -
- -
00:05:59:06:AD:7F
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.969635 - 23.708945 -
- -
00:1C:A2:D9:9E:FD
- ALEXANDRA - Master - 9 - 2.452 GHz (Channel 9) - 0.06 - -99 - -103 - on - 37.973483 - 23.710197 -
- -
00:24:17:1F:B6:19
- ThomsonF0AB0F - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -89 - -96 - off - 37.973023 - 23.710462 -
- -
00:1D:68:70:4C:51
- SpeedTouchF7FC0A - Master - 10 - 2.457 GHz (Channel 10) - 0.0 - -103 - -103 - on - 37.966722 - 23.706258 -
- -
00:19:3E:E8:74:E5
- ONEirinikos - Master - 9 - 2.452 GHz (Channel 9) - 0.2 - -89 - -102 - on - 37.968095 - 23.706647 -
- -
00:1C:A2:AA:F7:C9
- TSIGASDM - Master - 7 - 2.442 GHz (Channel 7) - 0.09 - -94 - -100 - on - 37.967013 - 23.70709 -
- -
00:05:59:1C:A5:CF
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.9676 - 23.705618 -
- -
00:05:59:0B:4B:7B
- kokomanto - Master - 3 - 2.422 GHz (Channel 3) - 0.1 - -93 - -100 - on - 37.972947 - 23.710802 -
- -
00:1C:DF:82:B5:AD
- Stonefields - Master - 3 - 2.422 GHz (Channel 3) - 0.2 - -91 - -104 - on - 37.969312 - 23.708455 -
- -
00:14:7F:6E:94:8B
- CHRISTINA - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -91 - -100 - on - 37.96822 - 23.708157 -
- -
00:21:63:3C:99:EC
- SIEMENS-3C99EC - Master - 1 - 2.412 GHz (Channel 1) - 0.12 - -96 - -104 - on - 37.972177 - 23.707278 -
- -
00:24:17:1B:7F:A3
- Thomson454E80 - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -87 - -101 - on - 37.974802 - 23.711063 -
- -
00:24:17:1A:5B:43
- Thomson002DDA - Master - 1 - 2.412 GHz (Channel 1) - 0.32 - -83 - -104 - on - 37.9669 - 23.703913 -
- -
00:1C:A2:B2:DF:4D
- TRANSALP - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -98 - on - 37.969545 - 23.706315 -
- -
00:1C:A2:B4:83:E5
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.12 - -93 - -101 - on - 37.9676 - 23.705618 -
- -
00:13:33:19:39:4E
- omar - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -97 - -96 - on - 37.972252 - 23.708705 -
- -
00:1F:9F:D3:B6:13
- manos - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - on - 37.969545 - 23.706315 -
- -
00:23:48:69:20:B5
- CONN-X_1743 - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -88 - -99 - on - 37.970672 - 23.707235 -
- -
00:1F:9F:13:9E:49
- vasilis - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -99 - -98 - on - 37.973335 - 23.709568 -
- -
00:1D:1C:AA:E3:1A
- Oxygen-26513 - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - on - 37.968637 - 23.703137 -
- -
00:1C:A2:B2:E6:01
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.15 - -90 - -100 - off - 37.965712 - 23.704675 -
- -
00:1D:19:89:1E:DE
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.966738 - 23.703118 -
- -
00:1F:9F:8E:70:71
- Thomson46673C - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - on - 37.96601 - 23.704252 -
- -
3E:20:08:FE:B8:0F
- hpsetup - Ad-Hoc - 10 - 2.457 GHz (Channel 10) - 1.0 - -103 - -102 - off - 37.973693 - 23.708393 -
- -
00:21:27:ED:0E:6E
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.39 - -77 - -102 - off - 37.96761 - 23.70829 -
- -
00:11:6B:1D:E4:C0
- VASILME - Master - 11 - 2.462 GHz (Channel 11) - 0.12 - -94 - -102 - off - 37.971358 - 23.7076 -
- -
00:1C:A2:DA:C0:93
- PIRELLI - Master - 9 - 2.452 GHz (Channel 9) - 0.21 - -89 - -103 - on - 37.970582 - 23.706513 -
- -
00:1D:19:49:22:9A
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -99 - -96 - on - 37.971057 - 23.706308 -
- -
00:1D:68:6C:97:F7
- Thomson520229 - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -91 - -103 - on - 37.97055 - 23.708993 -
- -
00:1E:E5:94:79:08
- labkiss - Master - 11 - 2.462 GHz (Channel 11) - 0.25 - -86 - -102 - on - 37.969623 - 23.703583 -
- -
00:1C:A2:B2:96:09
- tranos - Master - 9 - 2.452 GHz (Channel 9) - 0.35 - -80 - -103 - on - 37.970015 - 23.705767 -
- -
00:05:59:04:5D:B3
- NetFasteR_IAD - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -84 - -100 - on - 37.970823 - 23.709288 -
- -
00:1C:A2:D9:87:9D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.01 - -101 - -102 - off - 37.973247 - 23.71102 -
- -
00:24:17:A9:6C:87
- Thomson62065B - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -88 - -102 - on - 37.972267 - 23.708942 -
- -
00:90:D0:EB:48:05
- SpeedTouchCD7545 - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -89 - -104 - off - 37.967263 - 23.703967 -
- -
00:1A:4F:20:21:0D
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -91 - -99 - on - 37.971603 - 23.708903 -
- -
00:1E:74:BC:70:3A
- tipas - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -95 - -98 - on - 37.965618 - 23.705558 -
- -
00:90:D0:F3:A1:BC
- SpeedTouchC20E55 - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -102 - -101 - off - 37.973583 - 23.70985 -
- -
00:05:59:1B:37:A8
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -82 - -98 - on - 37.966123 - 23.70689 -
- -
00:13:33:82:02:1B
- HoMe !! - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -95 - -100 - on - 37.969923 - 23.707147 -
- -
00:05:59:0A:8A:6D
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -98 - -96 - on - 37.970465 - 23.707115 -
- -
00:1C:A2:B4:22:6D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -90 - -102 - on - 37.970077 - 23.709262 -
- -
00:1C:A2:B4:6D:65
- antoniskallis - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -91 - -103 - on - 37.96986 - 23.706743 -
- -
00:1F:9F:D3:A8:27
- andreas - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -88 - -104 - on - 37.971445 - 23.707612 -
- -
00:13:33:0E:EF:FA
- John Garrett - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.966787 - 23.705043 -
- -
00:1C:A2:D9:84:C5
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -105 - -103 - on - 37.967268 - 23.704175 -
- -
00:13:33:82:B1:13
- OTEbec492 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -98 - -95 - on - 37.970733 - 23.708103 -
- -
00:05:59:0C:86:58
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -91 - -100 - on - 37.966393 - 23.706575 -
- -
00:15:56:B7:6E:26
- vicky - Master - 6 - 2.437 GHz (Channel 6) - 0.34 - -77 - -99 - off - 37.968998 - 23.70705 -
- -
00:13:33:19:13:46
- pantel - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.967618 - 23.706488 -
- -
00:18:39:A4:9A:DC
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -102 - -99 - on - 37.968838 - 23.705133 -
- -
00:13:33:1E:D6:3C
- Foundouki - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -88 - -99 - on - 37.96896 - 23.706203 -
- -
00:90:D0:F5:CB:B2
- SpeedTouch12CA39 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -90 - -103 - on - 37.969635 - 23.708945 -
- -
00:1A:2A:7E:14:16
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -92 - -99 - on - 37.967112 - 23.706947 -
- -
00:1F:9F:8E:4C:D7
- Thomson06917E - Master - 1 - 2.412 GHz (Channel 1) - 0.15 - -90 - -100 - on - 37.972225 - 23.708678 -
- -
00:1D:1C:09:BD:73
- PAO13 - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -97 - -99 - on - 37.970112 - 23.706637 -
- -
00:02:61:11:B0:B5
- VIVODI - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -83 - -102 - on - 37.96952 - 23.70464 -
- -
00:1C:A2:B5:A0:49
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -98 - off - 37.965987 - 23.704252 -
- -
00:18:39:39:33:20
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -101 - -100 - on - 37.9693 - 23.70641 -
- -
00:13:33:1F:2C:3E
- OTE2c3e - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -82 - -99 - on - 37.973023 - 23.710462 -
- -
00:1D:68:70:E4:73
- SpeedTouchE113FA - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -82 - -104 - on - 37.96871 - 23.706943 -
- -
00:05:59:04:C1:53
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.971747 - 23.708538 -
- -
00:1F:9F:EB:C3:4D
- Thomson971D27 - Master - 11 - 2.462 GHz (Channel 11) - 0.4 - -76 - -102 - off - 37.969368 - 23.707365 -
- -
00:18:39:31:00:D6
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.31 - -82 - -102 - off - 37.966427 - 23.704572 -
- -
00:1A:4F:20:C7:0D
- Tjakis - Master - 1 - 2.412 GHz (Channel 1) - 0.06 - -100 - -104 - on - 37.966608 - 23.707212 -
- -
00:13:33:1E:16:EA
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.974663 - 23.71135 -
- -
00:14:7F:DA:96:AB
- SpeedTouch08EEC4 - Master - 1 - 2.412 GHz (Channel 1) - 0.07 - -96 - -101 - on - 37.965793 - 23.706485 -
- -
00:1C:A2:AC:AC:F9
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.14 - -93 - -102 - on - 37.96977 - 23.707543 -
- -
00:19:4B:9F:F2:97
- OTE7579 - Master - 6 - 2.437 GHz (Channel 6) - 0.0 - -100 - -100 - on - 37.969227 - 23.705537 -
- -
00:05:59:14:93:63
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -99 - -96 - on - 37.969473 - 23.704218 -
- -
00:1D:1C:43:98:E3
- Oxygen-18685 - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -81 - -103 - on - 37.970132 - 23.706978 -
- -
00:1C:A8:79:5F:96
- GREGORYS - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.967927 - 23.70863 -
- -
00:24:17:80:70:C3
- Thomson3330D7 - Master - 11 - 2.462 GHz (Channel 11) - 0.35 - -75 - -98 - on - 37.972782 - 23.71066 -
- -
00:24:17:AB:DD:F5
- ThomsonD76CB6 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - on - 37.97028 - 23.705965 -
- -
00:30:1A:0C:38:01
- - - 8 - 2.447 GHz (Channel 8) - 1.0 - -96 - -95 - off - 37.96935 - 23.70874 -
- -
00:1E:E5:91:1F:64
- To nou sou - Master - 11 - 2.462 GHz (Channel 11) - 0.26 - -84 - -101 - on - 37.973248 - 23.709532 -
- -
02:1E:58:41:A9:6C
- dlink - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - off - 37.967825 - 23.707837 -
- -
00:23:48:0C:CC:3A
- CONN-X_6565 - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -97 - -104 - on - 37.96601 - 23.704252 -
- -
00:1C:A2:DA:7E:93
- TURI_WIFI - Master - 9 - 2.452 GHz (Channel 9) - 0.21 - -89 - -103 - on - 37.973422 - 23.710658 -
- -
00:1D:1C:29:93:99
- Oxygen-16943 - Master - 11 - 2.462 GHz (Channel 11) - 0.14 - -93 - -102 - on - 37.968937 - 23.703927 -
- -
00:13:33:1E:A6:78
- OTEa678 - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -87 - -99 - on - 37.968998 - 23.70705 -
- -
00:1C:A2:B2:80:FD
- tatsos - Master - 9 - 2.452 GHz (Channel 9) - 0.03 - -101 - -103 - on - 37.969177 - 23.704133 -
- -
00:1C:A2:B2:C7:A9
- goufis - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -102 - -98 - on - 37.973157 - 23.710953 -
- -
00:1F:9F:87:B1:FF
- Thomson6BE312 - Master - 1 - 2.412 GHz (Channel 1) - 0.09 - -97 - -103 - on - 37.969962 - 23.705732 -
- -
00:14:7F:20:A2:69
- SpeedTouch577242 - Master - 11 - 2.462 GHz (Channel 11) - 0.26 - -83 - -100 - on - 37.97085 - 23.706228 -
- -
00:02:61:11:A2:2A
- i3-IAD452W - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -84 - -99 - off - 37.971113 - 23.710118 -
- -
00:1D:19:88:84:27
- home5 - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -95 - -100 - on - 37.966875 - 23.705922 -
- -
00:1C:A2:AA:D5:0D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.12 - -93 - -101 - off - 37.973063 - 23.709398 -
- -
00:1C:F0:E2:E9:B0
- dlink - Master - 6 - 2.437 GHz (Channel 6) - 0.35 - -77 - -100 - off - 37.970788 - 23.709437 -
- -
00:23:48:DF:2E:A6
- CONN-X_1181 - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -94 - -101 - on - 37.967155 - 23.706107 -
- -
00:1C:A2:AC:0D:59
- ONTelecoms_alex - Master - 9 - 2.452 GHz (Channel 9) - 0.21 - -85 - -99 - on - 37.970815 - 23.705013 -
- -
00:1B:11:23:E4:30
- DLINK_WIRELESS - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -86 - -100 - on - 37.970695 - 23.70962 -
- -
00:15:56:B4:CD:AA
- OTE9934 - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -88 - -100 - on - 37.966108 - 23.706723 -
- -
00:1D:68:6D:F7:7F
- ThomsonFC5EF6 - Master - 6 - 2.437 GHz (Channel 6) - 0.34 - -78 - -100 - on - 37.968165 - 23.708115 -
- -
00:24:17:AB:C5:4D
- Thomson125A80 - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -87 - -104 - off - 37.97085 - 23.706228 -
- -
00:60:4C:E2:35:CD
- OTENET_9843 - Master - 7 - 2.442 GHz (Channel 7) - 0.1 - -93 - -100 - on - 37.97351 - 23.709682 -
- -
00:17:C2:F4:9F:AC
- ONTelecoms - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.969962 - 23.705732 -
- -
00:24:B2:59:74:DF
- NTGR_a4B4bN05XmmzJAJQod8pJIxV - Master - 2 - 2.417 GHz (Channel 2) - 0.26 - -86 - -103 - on - 37.970723 - 23.707233 -
- -
00:17:C2:F4:BC:50
- ontel - Master - 9 - 2.452 GHz (Channel 9) - 0.03 - -101 - -103 - on - 37.968582 - 23.70733 -
- -
00:1C:A2:AB:F7:8D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.26 - -84 - -101 - off - 37.967722 - 23.708072 -
- -
00:05:59:0B:28:47
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -84 - -100 - on - 37.96942 - 23.706547 -
- -
00:18:39:2A:28:22
- Sotiris - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - on - 37.966605 - 23.7034 -
- -
00:1F:9F:D4:08:97
- adrian - Master - 11 - 2.462 GHz (Channel 11) - 0.26 - -83 - -100 - on - 37.971652 - 23.706337 -
- -
00:05:59:04:70:8B
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.973372 - 23.708875 -
- -
00:1C:4A:46:EF:26
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -83 - -100 - on - 37.969568 - 23.703137 -
- -
00:1C:A2:AA:A6:E1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.17 - -90 - -101 - off - 37.96737 - 23.703645 -
- -
00:24:17:1A:D4:A1
- Thomson77A6C8 - Master - 1 - 2.412 GHz (Channel 1) - 0.12 - -96 - -104 - on - 37.968155 - 23.702585 -
- -
00:1E:74:D3:19:91
- CONN-X_9113 - Master - 11 - 2.462 GHz (Channel 11) - 0.07 - -100 - -105 - on - 37.967657 - 23.707372 -
- -
00:1C:A2:B4:DC:3D
- kostas - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -91 - -90 - on - 37.967188 - 23.70414 -
- -
00:1A:70:9F:C7:86
- harry - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -97 - -101 - on - 37.973063 - 23.709398 -
- -
00:1A:4F:21:19:0F
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -95 - -98 - on - 37.972677 - 23.71002 -
- -
00:13:33:1D:A4:A4
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -97 - -96 - on - 37.967705 - 23.704497 -
- -
00:05:59:0F:39:5A
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.39 - -70 - -95 - on - 37.966083 - 23.706048 -
- -
00:26:91:15:CB:30
- CONN-X_9837 - Master - 1 - 2.412 GHz (Channel 1) - 0.35 - -79 - -102 - on - 37.969797 - 23.709105 -
- -
00:23:48:E0:68:5F
- CONN-x anna - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -88 - -100 - on - 37.971253 - 23.708337 -
- -
00:1F:9F:44:46:11
- Thomson43FFBE - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -82 - -104 - on - 37.966375 - 23.705883 -
- -
00:24:17:22:B2:29
- Tsakmpam - Master - 5 - 2.432 GHz (Channel 5) - 1.0 - -103 - -101 - on - 37.967398 - 23.70722 -
- -
00:23:48:78:1A:EA
- CONN-X_5771 - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -90 - -104 - on - 37.974663 - 23.71135 -
- -
00:1F:9F:D4:84:55
- ThomsonEC253F - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -90 - -104 - off - 37.966917 - 23.704785 -
- -
00:1C:A2:DA:6C:C7
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.04 - -100 - -103 - on - 37.972482 - 23.710395 -
- -
00:1E:2A:1E:C9:BA
- saintdevil - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -99 - on - 37.969845 - 23.705142 -
- -
00:05:59:1B:CA:54
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -88 - -99 - on - 37.967065 - 23.704433 -
- -
00:14:C1:2A:68:FC
- leo - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.970347 - 23.709078 -
- -
00:13:33:17:C0:82
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -83 - -100 - on - 37.969877 - 23.705683 -
- -
00:1F:9F:D3:6C:D5
- Thomson072A16 - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -87 - -103 - off - 37.970927 - 23.709215 -
- -
00:23:48:74:8E:FD
- CONN-X_9959 - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -93 - -104 - on - 37.968838 - 23.705133 -
- -
00:1C:4A:A3:54:B8
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -91 - -100 - on - 37.969923 - 23.707147 -
- -
00:05:59:04:46:13
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -89 - -99 - on - 37.967438 - 23.7055 -
- -
00:11:6B:1D:E3:C6
- SolosW_AP - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -81 - -103 - off - 37.969168 - 23.707213 -
- -
00:1C:A2:B4:15:4D
- ekon - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -105 - -98 - on - 37.969545 - 23.706315 -
- -
00:4F:67:02:C3:5B
- airlive - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -88 - -103 - off - 37.96828 - 23.706712 -
- -
00:1C:A2:B5:89:1D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -100 - off - 37.9706 - 23.704693 -
- -
00:50:7F:DA:FE:E8
- Tsiou - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -87 - -99 - on - 37.968197 - 23.705882 -
- -
00:05:59:06:87:8B
- ADD2 - Master - 6 - 2.437 GHz (Channel 6) - 0.4 - -74 - -100 - off - 37.97025 - 23.709317 -
- -
00:15:56:B5:36:95
- OTE2379 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -99 - on - 37.96859 - 23.704977 -
- -
00:18:39:8B:84:20
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -91 - -98 - on - 37.967877 - 23.704513 -
- -
00:13:33:83:A2:B3
- chromadecor - Master - 6 - 2.437 GHz (Channel 6) - 0.32 - -79 - -100 - on - 37.969635 - 23.708945 -
- -
00:1C:4A:46:DF:25
- NE 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -83 - -95 - on - 37.972567 - 23.710212 -
- -
00:1D:19:8C:EC:E5
- anna - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -93 - -100 - on - 37.967092 - 23.705378 -
- -
00:1D:1C:A9:CB:AC
- Oxygen-18618 - Master - 3 - 2.422 GHz (Channel 3) - 0.39 - -79 - -104 - on - 37.966367 - 23.707087 -
- -
00:1C:A2:B3:5F:8D
- manolis - Master - 9 - 2.452 GHz (Channel 9) - 0.37 - -78 - -102 - on - 37.96955 - 23.707758 -
- -
00:1C:A2:B3:FF:BD
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.01 - -101 - -102 - on - 37.971418 - 23.710557 -
- -
00:13:33:0B:3C:EA
- Driving School..!!! - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -88 - -99 - on - 37.966083 - 23.706048 -
- -
00:1C:A2:B2:D8:7D
- papaki - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -98 - on - 37.966083 - 23.706048 -
- -
00:1C:F0:E2:EC:4A
- dlink - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -94 - -98 - off - 37.969545 - 23.706315 -
- -
00:90:D0:FA:BB:8D
- SpeedTouch0457C1 - Master - 1 - 2.412 GHz (Channel 1) - 0.04 - -101 - -104 - off - 37.966585 - 23.704683 -
- -
00:14:BF:6F:84:5A
- privnetw - Master - 11 - 2.462 GHz (Channel 11) - 0.14 - -93 - -102 - on - 37.96955 - 23.707758 -
- -
00:1D:19:49:94:0D
- Pyrsos - Master - 2 - 2.417 GHz (Channel 2) - 0.25 - -87 - -103 - on - 37.973157 - 23.711198 -
- -
00:05:59:1A:25:C1
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -85 - -101 - on - 37.972508 - 23.707875 -
- -
00:15:56:CD:FA:A5
- wireless - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -91 - -99 - on - 37.971852 - 23.70869 -
- -
00:13:33:1F:32:04
- OTE3204 - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -84 - -95 - on - 37.968985 - 23.707772 -
- -
00:13:33:18:EB:BA
- LIQUID - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -90 - -99 - on - 37.969207 - 23.70551 -
- -
00:1E:E5:93:AE:52
- linksys-jr - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -87 - -102 - on - 37.967438 - 23.7055 -
- -
00:13:33:0B:E5:10
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.966872 - 23.705892 -
- -
00:90:D0:FC:46:95
- SpeedTouchDE8200 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - on - 37.970422 - 23.708808 -
- -
00:23:48:0D:E5:56
- CONN-X_1175 - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -89 - -104 - on - 37.967323 - 23.704803 -
- -
00:1D:7E:B7:99:C8
- CISCO - Master - 11 - 2.462 GHz (Channel 11) - 0.0 - -98 - -98 - on - 37.97204 - 23.708807 -
- -
00:13:33:1E:F9:D6
- My T-Shirt - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -79 - -96 - on - 37.970193 - 23.708825 -
- -
00:1D:19:46:C7:06
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -81 - -100 - on - 37.970357 - 23.704298 -
- -
00:1C:A2:AB:CF:95
- ON.Telecoms - Master - 2 - 2.417 GHz (Channel 2) - 0.29 - -81 - -100 - on - 37.968988 - 23.706325 -
- -
00:18:46:02:86:44
- he - Master - 6 - 2.437 GHz (Channel 6) - 0.51 - -66 - -99 - on - 37.967825 - 23.707837 -
- -
00:1C:A2:B2:FD:99
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.04 - -100 - -103 - off - 37.972753 - 23.709812 -
- -
02:1E:58:41:5C:86
- jojephin - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -88 - -104 - on - 37.971532 - 23.707297 -
- -
00:1C:4A:43:8C:5E
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -81 - -99 - on - 37.969218 - 23.704032 -
- -
00:24:17:AF:EF:95
- Thomson77DF51 - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - off - 37.973157 - 23.710953 -
- -
00:05:59:06:38:57
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.968917 - 23.708095 -
- -
00:24:17:88:7E:6F
- Thomson6AAF59 - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -82 - -104 - off - 37.968615 - 23.708438 -
- -
00:24:17:AA:ED:53
- Ekkyklima - Master - 11 - 2.462 GHz (Channel 11) - 0.28 - -84 - -102 - on - 37.965933 - 23.706785 -
- -
00:05:59:0D:36:2C
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.972255 - 23.710473 -
- -
00:24:17:BA:56:F7
- ThomsonB074EF - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - off - 37.966853 - 23.703888 -
- -
00:1A:4F:20:26:5B
- NE 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -91 - -100 - on - 37.972225 - 23.708678 -
- -
00:05:59:0C:A7:10
- frohliche - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -88 - -100 - on - 37.972297 - 23.708467 -
- -
00:1F:9F:D3:08:41
- Thomson385886 - Master - 1 - 2.412 GHz (Channel 1) - 0.42 - -76 - -103 - on - 37.966728 - 23.706803 -
- -
00:24:17:94:9B:9F
- ThomsonADABA8 - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -92 - -104 - off - 37.968838 - 23.705133 -
- -
00:13:33:0C:A6:F2
- MARY - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -94 - -96 - on - 37.966647 - 23.70536 -
- -
00:1D:1C:3F:B1:9D
- Oxygen-06665 - Master - 7 - 2.442 GHz (Channel 7) - 0.15 - -90 - -100 - on - 37.971253 - 23.708337 -
- -
00:22:75:2A:96:83
- Belkin_2A9683 - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -88 - -100 - on - 37.96937 - 23.705422 -
- -
00:50:7F:BE:1C:50
- philip - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.967497 - 23.70329 -
- -
00:1E:2A:1C:D8:7E
- - Master - 11 - 2.462 GHz (Channel 11) - 0.4 - -75 - -101 - on - 37.973063 - 23.709398 -
- -
02:1E:58:41:A6:44
- petalouda - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -92 - -103 - on - 37.966647 - 23.70536 -
- -
00:13:33:1F:36:C6
- OTE36c6 - Master - 6 - 2.437 GHz (Channel 6) - 0.39 - -75 - -100 - on - 37.968155 - 23.702585 -
- -
00:21:63:3C:B3:40
- SIEMENS-3CB340 - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -87 - -102 - off - 37.972218 - 23.708677 -
- -
00:05:59:0E:6B:5F
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -84 - -100 - on - 37.967538 - 23.707197 -
- -
00:1C:A2:AB:46:55
- varadero1 - Master - 9 - 2.452 GHz (Channel 9) - 0.09 - -97 - -103 - on - 37.97016 - 23.704653 -
- -
00:1D:68:EC:CD:B7
- Thomson463445 - Master - 1 - 2.412 GHz (Channel 1) - 0.07 - -98 - -103 - on - 37.969312 - 23.708455 -
- -
00:1F:9F:D3:D6:7F
- ThomsonF6AE77 - Master - 1 - 2.412 GHz (Channel 1) - 0.42 - -73 - -100 - on - 37.972405 - 23.710568 -
- -
00:1E:74:BC:7C:E3
- home - Master - 1 - 2.412 GHz (Channel 1) - 0.15 - -92 - -102 - on - 37.966875 - 23.705922 -
- -
00:1C:A2:AB:D4:DD
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.23 - -85 - -100 - off - 37.967815 - 23.706537 -
- -
00:1A:70:A0:08:7E
- OUST RE XAVALE - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -98 - -100 - on - 37.974922 - 23.711463 -
- -
00:1A:70:9C:53:AE
- Johnys_D@WiFi - Master - 4 - 2.427 GHz (Channel 4) - 0.09 - -98 - -104 - on - 37.967052 - 23.704008 -
- -
00:24:17:1A:01:C5
- Thomson2C53F8 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - off - 37.970733 - 23.708103 -
- -
00:24:17:21:0B:F3
- NEUROLOGY@ORG - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -91 - -103 - on - 37.96895 - 23.704772 -
- -
00:1A:4F:21:DE:C5
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -84 - -100 - on - 37.970063 - 23.705018 -
- -
00:1D:7E:AE:77:BA
- forthnet - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -101 - -99 - on - 37.972877 - 23.708108 -
- -
00:23:48:DF:53:40
- CONN-X_1126 - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -82 - -104 - on - 37.966715 - 23.70484 -
- -
00:90:D0:F3:FB:E4
- SpeedTouch1D918F - Master - 11 - 2.462 GHz (Channel 11) - 0.35 - -79 - -102 - on - 37.968778 - 23.705195 -
- -
00:14:7F:69:5C:D1
- - Master - 1 - 2.412 GHz (Channel 1) - 0.09 - -97 - -103 - on - 37.972603 - 23.707737 -
- -
00:13:33:0C:92:A8
- xazevar - Master - 6 - 2.437 GHz (Channel 6) - 0.31 - -78 - -98 - on - 37.970033 - 23.704812 -
- -
00:1C:A2:B5:98:E1
- PHILIPPOS - Master - 9 - 2.452 GHz (Channel 9) - 0.09 - -97 - -103 - on - 37.967948 - 23.703405 -
- -
00:18:39:2F:73:CA
- Aristea - Master - 11 - 2.462 GHz (Channel 11) - 0.18 - -90 - -102 - on - 37.966002 - 23.704253 -
- -
00:1F:9F:D3:62:B9
- Thomson350963 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - on - 37.970815 - 23.707608 -
- -
00:05:59:1C:36:AE
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -81 - -100 - on - 37.969368 - 23.707365 -
- -
00:1E:E5:94:5D:F6
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.2 - -89 - -102 - on - 37.96937 - 23.706807 -
- -
00:15:56:B7:2F:3E
- GEOTENET - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -89 - -99 - off - 37.973023 - 23.710462 -
- -
00:1D:19:49:7F:04
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.967657 - 23.707372 -
- -
00:25:69:0D:12:E7
- CONN-X_8115 - Master - 1 - 2.412 GHz (Channel 1) - 0.09 - -98 - -104 - on - 37.968203 - 23.704702 -
- -
00:05:59:09:52:4B
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.01 - -99 - -100 - on - 37.967427 - 23.704508 -
- -
00:05:59:0A:18:C9
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -92 - -97 - on - 37.969393 - 23.70382 -
- -
00:1F:9F:8E:5A:17
- ThomsonF22730 - Master - 1 - 2.412 GHz (Channel 1) - 0.35 - -79 - -102 - off - 37.97537 - 23.712058 -
- -
00:05:59:05:C2:0F
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -84 - -100 - on - 37.968615 - 23.708438 -
- -
00:1E:E5:93:BA:14
- J.L.P. - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -84 - -103 - on - 37.970462 - 23.707 -
- -
00:50:7F:BB:89:90
- default - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - off - 37.968872 - 23.706263 -
- -
00:1A:2A:7E:05:22
- ioannis - Master - 11 - 2.462 GHz (Channel 11) - 0.17 - -91 - -102 - on - 37.966605 - 23.7034 -
- -
00:05:59:05:1D:43
- NetFasteR IAD (ISDN) - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -96 - -99 - on - 37.965837 - 23.705773 -
- -
00:21:63:44:54:F0
- SIEMENS-4454F0 - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -95 - -102 - on - 37.968667 - 23.705468 -
- -
00:1C:4A:46:26:9A
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -81 - -100 - on - 37.972295 - 23.707225 -
- -
00:1F:9F:CF:2A:8D
- ThomsonB055CE - Master - 11 - 2.462 GHz (Channel 11) - 0.12 - -88 - -96 - on - 37.97381 - 23.70949 -
- -
00:1D:19:49:07:70
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -86 - -99 - on - 37.968392 - 23.704812 -
- -
00:1C:F0:B2:35:DC
- dlink - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -81 - -100 - on - 37.966342 - 23.705473 -
- -
00:1C:A2:DA:98:B9
- ONTelecoms3 - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -87 - -99 - on - 37.97298 - 23.708265 -
- -
00:13:33:18:08:82
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -86 - -100 - on - 37.966393 - 23.706575 -
- -
00:14:85:D9:47:14
- - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.97381 - 23.70949 -
- -
00:13:33:1E:F4:78
- OTEf478 - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -94 - -99 - on - 37.966273 - 23.706827 -
- -
00:24:B2:49:30:96
- motse - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -99 - -98 - on - 37.971217 - 23.705625 -
- -
00:1C:A2:AA:BC:51
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.06 - -99 - -103 - on - 37.969393 - 23.70382 -
- -
00:1C:F0:B2:69:98
- alexwalex - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -95 - -100 - on - 37.971613 - 23.710525 -
- -
00:05:59:0A:31:29
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.967693 - 23.702817 -
- -
00:24:17:AC:01:7B
- Thomson6FAF30 - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -87 - -102 - off - 37.968582 - 23.70733 -
- -
00:05:59:07:5D:83
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.96833 - 23.702468 -
- -
00:1F:9F:EB:5A:5D
- ThomsonC755DE - Master - 1 - 2.412 GHz (Channel 1) - 0.35 - -81 - -104 - on - 37.972582 - 23.709137 -
- -
00:13:33:81:8E:5B
- OTEb36419 - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -84 - -96 - on - 37.966608 - 23.707212 -
- -
00:24:17:AB:BC:2F
- Thomson82A7BF - Master - 11 - 2.462 GHz (Channel 11) - 0.26 - -85 - -102 - on - 37.966847 - 23.707427 -
- -
00:14:C1:38:F7:E1
- KOPER - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -83 - -102 - on - 37.969267 - 23.704155 -
- -
00:05:59:06:30:7B
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.96677 - 23.705075 -
- -
00:1B:2F:75:C8:F4
- Horos - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -80 - -99 - on - 37.974392 - 23.711188 -
- -
00:1C:A2:AA:A2:69
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.07 - -98 - -103 - on - 37.970823 - 23.709288 -
- -
00:17:C2:F4:8B:BC
- khaled - Master - 9 - 2.452 GHz (Channel 9) - 0.23 - -84 - -99 - on - 37.970815 - 23.705013 -
- -
00:13:33:0E:EC:0A
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -96 - on - 37.970445 - 23.707107 -
- -
00:1C:A2:AC:B8:51
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.21 - -89 - -103 - on - 37.966742 - 23.704298 -
- -
00:1C:A2:AA:D6:C1
- onsofia - Master - 9 - 2.452 GHz (Channel 9) - 0.15 - -92 - -102 - on - 37.973248 - 23.709532 -
- -
00:11:6B:3E:E6:5C
- SAMNET - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - on - 37.966527 - 23.705603 -
- -
00:90:D0:E9:E4:0A
- SpeedTouch21BE04 - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -88 - -103 - off - 37.966515 - 23.706703 -
- -
00:05:59:1D:00:05
- Maria - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -98 - -95 - on - 37.969412 - 23.70735 -
- -
00:17:C2:F4:7C:60
- REPEATER-LIVROOM - Master - 8 - 2.447 GHz (Channel 8) - 1.0 - -100 - -99 - off - 37.971748 - 23.706757 -
- -
00:1C:A2:AC:3D:69
- ON,,Telecoms - Master - 2 - 2.417 GHz (Channel 2) - 0.15 - -93 - -103 - off - 37.968582 - 23.70733 -
- -
00:1F:9F:CE:B0:8F
- themis - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -85 - -99 - on - 37.966003 - 23.70658 -
- -
00:24:17:93:34:22
- Thomson8FA75E - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -87 - -103 - off - 37.966653 - 23.706635 -
- -
00:13:33:17:49:20
- webrelations5 - Master - 6 - 2.437 GHz (Channel 6) - 0.01 - -98 - -99 - on - 37.97537 - 23.712058 -
- -
00:24:17:AE:F8:2F
- ThomsonB1B168 - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -99 - -102 - on - 37.966847 - 23.707427 -
- -
00:1E:74:D2:76:D8
- IRELAND-LUCY - Master - 11 - 2.462 GHz (Channel 11) - 0.17 - -90 - -101 - on - 37.967065 - 23.704433 -
- -
00:05:59:0A:0F:F9
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -97 - -99 - on - 37.971617 - 23.70886 -
- -
00:24:17:1A:E4:83
- Thomson3B5AF6 - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -89 - -104 - off - 37.966722 - 23.706258 -
- -
00:1D:19:49:68:F6
- PRIVE - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -92 - -99 - on - 37.971603 - 23.708903 -
- -
00:1C:A2:D9:70:BD
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -102 - -99 - off - 37.971768 - 23.708668 -
- -
00:24:17:2E:F0:EF
- ThomsonB015A1 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -97 - -96 - on - 37.973063 - 23.709398 -
- -
00:05:59:16:0D:7E
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -95 - -99 - on - 37.967065 - 23.704433 -
- -
00:21:29:81:73:AE
- linksys constantina - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -99 - -98 - on - 37.969918 - 23.7054 -
- -
00:18:39:21:C4:A8
- GAntonatos - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -99 - on - 37.966378 - 23.704445 -
- -
00:1D:19:49:C6:DD
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.965543 - 23.704907 -
- -
00:90:D0:F4:0E:57
- SpeedTouchF3AE05 - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -85 - -99 - on - 37.972828 - 23.709252 -
- -
00:13:33:17:84:C6
- giannis - Master - 6 - 2.437 GHz (Channel 6) - 0.1 - -93 - -100 - on - 37.971185 - 23.709403 -
- -
00:24:17:21:9E:81
- Thomson378024 - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -101 - -100 - on - 37.971627 - 23.706973 -
- -
00:24:17:B0:67:69
- Thomson35728A - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -89 - -101 - on - 37.967538 - 23.707197 -
- -
00:24:17:18:6E:09
- ThomsonE02409 - Master - 1 - 2.412 GHz (Channel 1) - 0.07 - -98 - -103 - off - 37.972515 - 23.711133 -
- -
00:13:33:06:63:F8
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -88 - -98 - on - 37.967438 - 23.7055 -
- -
00:13:33:82:FC:9D
- OTE7ea919 - Master - 6 - 2.437 GHz (Channel 6) - 0.31 - -76 - -96 - on - 37.968415 - 23.706743 -
- -
00:24:17:B2:6E:5F
- Thomson87097C - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -96 - -95 - on - 37.97055 - 23.708993 -
- -
00:1C:A2:AC:77:45
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.17 - -91 - -102 - on - 37.968743 - 23.70502 -
- -
00:21:63:3C:CC:0C
- SIEMENS-3CCC0C - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -82 - -97 - on - 37.967112 - 23.706947 -
- -
00:1C:A2:DA:60:29
- MAKIS - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -90 - -102 - on - 37.965803 - 23.70493 -
- -
00:1C:A2:B2:4A:ED
- ON!Telecoms - Master - 3 - 2.422 GHz (Channel 3) - 0.26 - -85 - -102 - off - 37.968998 - 23.70705 -
- -
00:1D:1C:2B:EF:14
- Oxygen-22391 - Master - 3 - 2.422 GHz (Channel 3) - 0.2 - -90 - -103 - on - 37.968582 - 23.708308 -
- -
00:14:7F:32:B7:65
- SpeedTouchAAF667 - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -101 - -97 - on - 37.969918 - 23.7054 -
- -
00:23:48:6A:DA:70
- CONN-X_1232 - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -99 - -102 - on - 37.967438 - 23.7055 -
- -
00:1D:19:92:13:64
- DJ-CHRIS - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -96 - -99 - on - 37.968265 - 23.706558 -
- -
00:13:33:81:D2:EF
- OTE469ee4 - Master - 6 - 2.437 GHz (Channel 6) - 0.23 - -85 - -100 - on - 37.967807 - 23.703517 -
- -
00:1D:1C:AE:28:6A
- Oxygen-02617 - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -89 - -99 - on - 37.971612 - 23.707128 -
- -
00:13:33:18:DA:AE
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -99 - -95 - on - 37.973327 - 23.708825 -
- -
00:1F:9F:88:94:3D
- ThomsonABE9B2 - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -88 - -100 - on - 37.965618 - 23.705558 -
- -
00:1B:2F:EE:81:D8
- NETGEAR - Master - 11 - 2.462 GHz (Channel 11) - 0.17 - -90 - -101 - off - 37.973063 - 23.709398 -
- -
02:E0:C8:3C:81:CB
- ANY - Ad-Hoc - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - off - 37.970112 - 23.706637 -
- -
00:1C:A2:AA:C3:6D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.26 - -84 - -101 - off - 37.974663 - 23.71135 -
- -
00:1C:A2:B2:C4:1D
- zahari123 - Master - 9 - 2.452 GHz (Channel 9) - 0.12 - -94 - -102 - off - 37.97033 - 23.709408 -
- -
00:1E:74:BB:8D:CC
- CONN-X_6796 - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -90 - -104 - on - 37.970505 - 23.708532 -
- -
00:1C:A2:B3:8C:E5
- eimai gata - Master - 9 - 2.452 GHz (Channel 9) - 0.21 - -85 - -99 - on - 37.972603 - 23.707737 -
- -
00:60:4C:E2:32:5B
- forthnet - Master - 7 - 2.442 GHz (Channel 7) - 0.26 - -83 - -100 - on - 37.969473 - 23.704218 -
- -
00:1C:A2:DE:1E:37
- AN AL - Master - 9 - 2.452 GHz (Channel 9) - 0.04 - -99 - -102 - on - 37.968733 - 23.703362 -
- -
00:13:33:18:07:7E
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -92 - -100 - on - 37.967092 - 23.705378 -
- -
00:1F:9F:8E:30:19
- ThomsonE553A1 - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -88 - -104 - on - 37.965837 - 23.705773 -
- -
00:15:56:B4:F8:A0
- kika - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.969915 - 23.705443 -
- -
00:1E:E3:D1:AC:26
- matr-XD1AC25 - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -87 - -103 - on - 37.96828 - 23.706712 -
- -
00:1C:A2:B2:F2:D1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.07 - -97 - -102 - on - 37.970163 - 23.705872 -
- -
00:1C:A2:B3:96:61
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.15 - -93 - -103 - off - 37.968872 - 23.706263 -
- -
00:1C:A2:B2:DE:85
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.12 - -94 - -102 - on - 37.968095 - 23.706647 -
- -
00:1F:9F:88:2C:43
- marvin - Master - 1 - 2.412 GHz (Channel 1) - 0.04 - -100 - -103 - on - 37.9702 - 23.707793 -
- -
00:24:17:2F:4E:E7
- NIKITAS - Master - 1 - 2.412 GHz (Channel 1) - 0.42 - -77 - -104 - on - 37.965837 - 23.705773 -
- -
00:15:56:CD:9B:F5
- negozio - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -96 - on - 37.96832 - 23.707882 -
- -
00:1A:4F:21:DC:DB
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.46 - -70 - -100 - on - 37.96761 - 23.70829 -
- -
00:17:C2:F4:8D:48
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.04 - -99 - -102 - on - 37.966538 - 23.706677 -
- -
00:1C:A2:B2:49:B5
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.09 - -91 - -97 - off - 37.973117 - 23.708465 -
- -
00:1C:A2:B3:F6:FD
- kotoyli - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -104 - -103 - on - 37.97015 - 23.704715 -
- -
00:13:33:1E:D7:04
- GIOTA - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -98 - -100 - on - 37.966418 - 23.704257 -
- -
00:21:29:77:D3:53
- BooNet_1 - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -105 - -102 - on - 37.969857 - 23.705487 -
- -
00:24:17:1F:64:21
- Dreamscapes - Master - 1 - 2.412 GHz (Channel 1) - 0.09 - -98 - -104 - on - 37.968743 - 23.70502 -
- -
00:1D:1C:4F:0B:E8
- Oxygen-00197 - Master - 7 - 2.442 GHz (Channel 7) - 0.15 - -86 - -96 - on - 37.969723 - 23.705997 -
- -
00:1F:9F:CF:DB:CF
- Thomson54ED24 - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -93 - -104 - on - 37.970112 - 23.706637 -
- -
00:1D:19:89:51:06
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.966715 - 23.70484 -
- -
00:16:B6:01:D9:14
- Alfa Solid - Master - 5 - 2.432 GHz (Channel 5) - 0.21 - -86 - -100 - on - 37.965957 - 23.705053 -
- -
00:1C:A2:B5:EE:4D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.14 - -93 - -102 - on - 37.973913 - 23.711022 -
- -
00:21:29:73:6E:E0
- jockeyfullofbourbon - Master - 11 - 2.462 GHz (Channel 11) - 0.37 - -75 - -99 - on - 37.974663 - 23.71135 -
- -
00:1C:A2:B2:AD:45
- GV-NET - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -100 - on - 37.968203 - 23.704702 -
- -
00:05:59:1B:00:1C
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -88 - -100 - on - 37.967933 - 23.70326 -
- -
00:24:17:94:B9:15
- Thomson20D242 - Master - 11 - 2.462 GHz (Channel 11) - 0.15 - -92 - -102 - off - 37.968582 - 23.70733 -
- -
00:1C:A2:D9:68:CD
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.12 - -94 - -102 - off - 37.972828 - 23.709252 -
- -
00:05:59:07:51:7F
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.967948 - 23.703405 -
- -
00:05:59:04:95:83
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -102 - -100 - on - 37.97062 - 23.708278 -
- -
02:6F:D3:55:0E:92
- print server 18D7E1 - Ad-Hoc - 11 - 2.462 GHz (Channel 11) - 0.2 - -89 - -102 - off - 37.96713 - 23.703062 -
- -
00:13:33:06:76:CA
- dtnet - Master - 11 - 2.462 GHz (Channel 11) - 0.14 - -93 - -102 - on - 37.968743 - 23.70502 -
- -
00:1C:A2:B5:95:25
- Dimitris - Master - 9 - 2.452 GHz (Channel 9) - 0.15 - -92 - -102 - on - 37.97033 - 23.709408 -
- -
02:22:B0:9C:2A:89
- dlink - Master - 1 - 2.412 GHz (Channel 1) - 0.28 - -86 - -104 - off - 37.966505 - 23.705655 -
- -
00:24:17:AF:3C:6F
- Thomson905AE1 - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -96 - -103 - on - 37.966367 - 23.707087 -
- -
00:1A:4F:20:DC:2D
- Nikos HOL Fritz Box - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -99 - -98 - on - 37.970343 - 23.707867 -
- -
00:14:7F:20:AB:95
- SpeedTouch2F3425 - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -87 - -104 - off - 37.96895 - 23.704772 -
- -
00:05:59:19:54:E4
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -89 - -100 - on - 37.972463 - 23.710645 -
- -
00:1C:A2:AC:6D:A1
- Cosmir - Master - 10 - 2.457 GHz (Channel 10) - 1.0 - -103 - -102 - on - 37.972095 - 23.708837 -
- -
00:1E:2A:0D:66:9E
- theo - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -92 - -100 - off - 37.968682 - 23.708513 -
- -
00:13:33:83:E9:E5
- OTE7acd15 - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -91 - -94 - on - 37.970723 - 23.707233 -
- -
00:90:D0:F4:0A:EA
- SpeedTouchA57B86 - Master - 1 - 2.412 GHz (Channel 1) - 0.29 - -84 - -103 - off - 37.969168 - 23.707213 -
- -
00:05:59:04:92:0B
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -89 - -99 - on - 37.972082 - 23.70882 -
- -
00:90:D0:FA:BA:57
- eini - Master - 1 - 2.412 GHz (Channel 1) - 0.4 - -77 - -103 - on - 37.969242 - 23.708718 -
- -
00:21:63:3A:FD:EC
- SIEMENS-3AFDEC - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -100 - -102 - off - 37.970505 - 23.708532 -
- -
00:24:17:B2:19:53
- Thomson408054 - Master - 11 - 2.462 GHz (Channel 11) - 0.28 - -84 - -102 - off - 37.966273 - 23.706827 -
- -
00:17:C2:F4:A9:24
- ONTelecoms - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - off - 37.96942 - 23.706547 -
- -
00:1A:2A:DE:3A:0D
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.970112 - 23.706637 -
- -
00:1D:7E:AE:97:54
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.09 - -96 - -102 - on - 37.970347 - 23.709078 -
- -
00:1F:9F:EB:C4:B7
- KALOGEROPOULOS - Master - 1 - 2.412 GHz (Channel 1) - 0.28 - -84 - -102 - on - 37.9693 - 23.70641 -
- -
00:23:48:E0:D3:CB
- CONN-X_2215 - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -96 - -103 - on - 37.96761 - 23.70829 -
- -
00:1C:A2:B3:21:59
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.35 - -79 - -102 - off - 37.96912 - 23.707398 -
- -
00:05:59:16:3E:9B
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -100 - -95 - on - 37.967155 - 23.706107 -
- -
00:1F:9F:CF:86:F5
- ThomsonCAD0B6 - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -92 - -103 - off - 37.971362 - 23.709493 -
- -
00:1C:F0:AD:EE:C8
- dlink - Master - 7 - 2.442 GHz (Channel 7) - 0.17 - -87 - -98 - on - 37.966123 - 23.70689 -
- -
00:1A:70:96:0C:06
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.0 - -98 - -98 - on - 37.965412 - 23.705622 -
- -
00:13:33:13:63:9A
- OTE CONNX - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -87 - -103 - on - 37.966538 - 23.706677 -
- -
00:1F:9F:8E:A6:E9
- ThomsonC3E97C - Master - 11 - 2.462 GHz (Channel 11) - 0.07 - -96 - -101 - on - 37.96755 - 23.704155 -
- -
00:15:56:B5:22:70
- OTENET_9775 - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -89 - -99 - on - 37.972828 - 23.709252 -
- -
00:21:63:3A:B1:B4
- SIEMENS-VAGOS - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -99 - -102 - off - 37.969493 - 23.705497 -
- -
00:17:C2:F4:71:00
- lelis - Master - 9 - 2.452 GHz (Channel 9) - 0.2 - -90 - -103 - on - 37.971747 - 23.708538 -
- -
00:1E:E3:D4:F8:B5
- matr-XD4F8B4 - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -88 - -100 - on - 37.969085 - 23.705863 -
- -
00:24:17:1C:36:FB
- Thomson6B985A - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -89 - -100 - on - 37.966342 - 23.705473 -
- -
00:1D:19:49:22:34
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.34 - -78 - -100 - on - 37.97062 - 23.708278 -
- -
00:90:D0:EB:4F:4D
- SpeedTouch0F4858 - Master - 1 - 2.412 GHz (Channel 1) - 0.45 - -75 - -104 - off - 37.970793 - 23.709473 -
- -
00:90:D0:EA:D2:4B
- .......... - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -93 - -104 - on - 37.967567 - 23.704323 -
- -
00:1A:2A:88:46:6D
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -102 - -100 - on - 37.96946 - 23.70674 -
- -
00:02:61:11:9F:A5
- i3-IAD452W - Master - 11 - 2.462 GHz (Channel 11) - 0.34 - -80 - -102 - on - 37.97039 - 23.705992 -
- -
00:22:15:53:DC:CA
- Aggelos PC - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - on - 37.970542 - 23.706718 -
- -
00:1C:A2:B5:C4:19
- Sonia - Master - 9 - 2.452 GHz (Channel 9) - 0.09 - -96 - -102 - on - 37.965618 - 23.705558 -
- -
00:13:33:18:04:DC
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.03 - -93 - -95 - on - 37.96871 - 23.706943 -
- -
00:1A:2A:DE:25:73
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -103 - -96 - on - 37.96832 - 23.707882 -
- -
00:19:E3:E3:D4:F5
- Stavros Gasparatos's Network - Master - 1 - 2.412 GHz (Channel 1) - 0.29 - -85 - -104 - on - 37.970177 - 23.704562 -
- -
00:14:C1:27:74:A8
- USR9113_SES_8631 - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -99 - on - 37.96843 - 23.707685 -
- -
00:1F:9F:74:8B:3B
- ThomsonC65D8C - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.973583 - 23.70985 -
- -
00:1F:9F:49:30:AB
- gianis13 - Master - 9 - 2.452 GHz (Channel 9) - 0.21 - -88 - -102 - on - 37.968095 - 23.706647 -
- -
00:13:33:83:9E:B3
- bomber - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.966025 - 23.704213 -
- -
00:24:17:93:1E:B8
- Thomson5CBE6B - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -81 - -103 - on - 37.968083 - 23.701913 -
- -
00:02:61:1A:91:AC
- i3-IAD452W - Master - 11 - 2.462 GHz (Channel 11) - 0.5 - -67 - -99 - off - 37.969227 - 23.705537 -
- -
00:02:61:19:89:49
- SPITIKO - Master - 9 - 2.452 GHz (Channel 9) - 0.29 - -81 - -100 - on - 37.966223 - 23.706172 -
- -
00:1C:A2:B5:95:15
- ONTelecoms - Master - 1 - 2.412 GHz (Channel 1) - 0.12 - -96 - -104 - on - 37.971167 - 23.709925 -
- -
00:1D:1C:E2:B4:ED
- Oxygen-09605 - Master - 10 - 2.457 GHz (Channel 10) - 0.17 - -88 - -99 - on - 37.969875 - 23.709123 -
- -
00:17:C2:F4:D0:5C
- ChriS - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -95 - -99 - on - 37.965803 - 23.70493 -
- -
00:1F:9F:74:8F:DD
- Thomson2B2E28 - Master - 1 - 2.412 GHz (Channel 1) - 0.14 - -95 - -104 - on - 37.96935 - 23.70874 -
- -
00:22:69:93:B2:A8
- PS3-1319559 - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.972062 - 23.707608 -
- -
00:90:D0:4B:28:93
- marios - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -90 - -104 - on - 37.965803 - 23.70493 -
- -
00:1D:1C:04:56:4E
- Oxygen-11650 - Master - 9 - 2.452 GHz (Channel 9) - 0.14 - -89 - -98 - on - 37.966217 - 23.705328 -
- -
00:05:59:05:9B:D7
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.968547 - 23.706083 -
- -
00:1D:1C:3F:E7:F5
- Oxygen-38560 - Master - 2 - 2.417 GHz (Channel 2) - 0.32 - -82 - -103 - on - 37.968425 - 23.702672 -
- -
00:1D:19:8D:71:93
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -96 - -99 - on - 37.9702 - 23.707793 -
- -
00:21:63:3A:E1:E0
- SIEMENS-3AE1E0 - Master - 1 - 2.412 GHz (Channel 1) - 0.31 - -84 - -104 - on - 37.968095 - 23.703507 -
- -
00:1F:9F:8E:3E:85
- BeastBox - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -103 - -100 - on - 37.969875 - 23.709123 -
- -
00:1C:A2:AC:A4:95
- ONTelecoms1 - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -102 - -101 - on - 37.96924 - 23.705342 -
- -
00:05:59:09:BF:C5
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.966393 - 23.706575 -
- -
00:1C:A2:AC:8B:21
- pagia - Master - 9 - 2.452 GHz (Channel 9) - 0.06 - -98 - -102 - on - 37.965618 - 23.705558 -
- -
00:23:48:6B:3E:F7
- CONN-X_2355 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -90 - -103 - on - 37.973157 - 23.711198 -
- -
00:05:59:08:C4:05
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -82 - -99 - on - 37.96859 - 23.704977 -
- -
00:1C:A2:AC:D8:29
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.31 - -82 - -102 - off - 37.970757 - 23.709667 -
- -
00:05:59:0C:73:84
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.96608 - 23.705202 -
- -
00:23:48:77:03:01
- CONN-X_3734 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - on - 37.970058 - 23.703132 -
- -
00:1D:19:49:DC:EB
- MARINA - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -88 - -100 - on - 37.971367 - 23.709552 -
- -
00:1F:9F:4A:59:3B
- Thomson1B7647 - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -91 - -104 - off - 37.971217 - 23.705625 -
- -
00:1F:9F:44:17:93
- Thomson1400B9 - Master - 11 - 2.462 GHz (Channel 11) - 0.18 - -88 - -100 - on - 37.9693 - 23.70641 -
- -
00:24:17:AA:3F:87
- Thomson58F1B3 - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -93 - -91 - off - 37.966015 - 23.706662 -
- -
00:14:C1:2D:B6:35
- USR9111 - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - on - 37.972582 - 23.709137 -
- -
00:17:C2:F4:DE:24
- ONTelecoms - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -87 - -99 - on - 37.9702 - 23.707793 -
- -
00:1F:9F:EB:66:DD
- Thomson3379EA - Master - 11 - 2.462 GHz (Channel 11) - 0.15 - -92 - -102 - on - 37.968217 - 23.708142 -
- -
00:1E:E3:D4:DA:91
- super3 - Master - 1 - 2.412 GHz (Channel 1) - 0.14 - -94 - -103 - on - 37.968217 - 23.708142 -
- -
00:1F:9F:D3:58:0B
- Thomson4DF271 - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -90 - -104 - on - 37.967092 - 23.705378 -
- -
00:1D:1C:1D:E3:EF
- Oxygen-42502 - Master - 6 - 2.437 GHz (Channel 6) - 0.17 - -88 - -99 - on - 37.972782 - 23.71066 -
- -
00:23:68:51:AC:C0
- - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -91 - -103 - on - 37.967398 - 23.70722 -
- -
00:23:48:0C:8B:51
- CONN-X_9395 - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -89 - -104 - on - 37.969473 - 23.704218 -
- -
00:1D:19:49:57:83
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -87 - -99 - on - 37.96896 - 23.706203 -
- -
00:18:39:D5:B2:F7
- Cap.House - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -101 - -98 - on - 37.971438 - 23.70765 -
- -
00:1C:DF:13:8B:29
- vasilis - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -99 - on - 37.971785 - 23.710262 -
- -
00:23:48:69:E8:1C
- ellaki otenet - Master - 1 - 2.412 GHz (Channel 1) - 0.14 - -95 - -104 - on - 37.968098 - 23.708553 -
- -
00:1C:A2:DE:1B:8B
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.34 - -80 - -102 - off - 37.968597 - 23.702038 -
- -
00:1F:9F:D3:10:35
- Thomson76547C - Master - 11 - 2.462 GHz (Channel 11) - 0.18 - -90 - -102 - off - 37.971245 - 23.706448 -
- -
00:05:59:14:6F:2D
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -103 - -100 - on - 37.965658 - 23.706312 -
- -
00:21:63:3A:C8:04
- SIEMENS-3AC804 - Master - 11 - 2.462 GHz (Channel 11) - 0.28 - -82 - -100 - on - 37.970895 - 23.706228 -
- -
00:13:33:0F:D0:52
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.01 - -94 - -95 - on - 37.967885 - 23.707608 -
- -
00:1F:9F:13:9E:C9
- Thomson4157F0 - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -96 - -100 - on - 37.968095 - 23.703507 -
- -
00:26:91:12:D9:9E
- CONN-X_4445 - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -86 - -103 - on - 37.96832 - 23.707882 -
- -
00:13:33:17:86:14
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -97 - -96 - on - 37.97086 - 23.707392 -
- -
00:1B:2F:DE:71:D6
- HOL7 - Master - 11 - 2.462 GHz (Channel 11) - 0.32 - -81 - -102 - on - 37.968237 - 23.708238 -
- -
00:05:59:06:C8:9F
- - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -95 - -100 - off - 37.96955 - 23.707758 -
- -
00:13:33:82:94:D3
- OTEb8b43c - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.971842 - 23.708248 -
- -
00:1C:A2:B5:9B:85
- kostas - Master - 9 - 2.452 GHz (Channel 9) - 0.09 - -97 - -103 - on - 37.970422 - 23.708808 -
- -
00:1F:9F:8E:21:07
- Thomson55D895 - Master - 1 - 2.412 GHz (Channel 1) - 0.32 - -79 - -100 - off - 37.969545 - 23.706315 -
- -
00:13:33:1F:33:46
- OTE3346 - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -95 - -100 - on - 37.96911 - 23.70406 -
- -
00:18:39:8B:84:1A
- FRIDA - Master - 11 - 2.462 GHz (Channel 11) - 0.17 - -89 - -100 - on - 37.96681 - 23.706005 -
- -
00:1C:A2:AC:94:CD
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.09 - -96 - -102 - on - 37.973693 - 23.708393 -
- -
00:05:59:0B:B5:17
- John - Master - 11 - 2.462 GHz (Channel 11) - 0.17 - -88 - -99 - on - 37.968155 - 23.702585 -
- -
00:1F:33:03:87:12
- kko_r - Master - 11 - 2.462 GHz (Channel 11) - 0.25 - -86 - -102 - on - 37.966015 - 23.706662 -
- -
00:05:59:0E:54:34
- θανασησ - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -91 - -99 - on - 37.974042 - 23.710977 -
- -
00:05:59:1D:18:FB
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.968045 - 23.70803 -
- -
00:14:BF:6F:86:6C
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -95 - -102 - on - 37.968332 - 23.70782 -
- -
00:60:4C:97:3A:C1
- PosoMLKSeisai - Master - 6 - 2.437 GHz (Channel 6) - 0.0 - -98 - -98 - on - 37.971438 - 23.70765 -
- -
00:24:17:1A:59:E3
- BroadBand - Master - 1 - 2.412 GHz (Channel 1) - 0.14 - -90 - -99 - on - 37.973023 - 23.710462 -
- -
00:1A:70:99:83:EC
- kouneli - Master - 11 - 2.462 GHz (Channel 11) - 0.26 - -85 - -102 - on - 37.968522 - 23.705912 -
- -
00:1F:9F:D4:83:93
- ThomsonDB153D - Master - 11 - 2.462 GHz (Channel 11) - 0.26 - -84 - -101 - off - 37.972177 - 23.707278 -
- -
00:1F:9F:8E:05:EB
- athina - Master - 1 - 2.412 GHz (Channel 1) - 0.34 - -82 - -104 - on - 37.971532 - 23.707297 -
- -
00:19:5B:9A:83:30
- DLINK_WIRELESS - Master - 6 - 2.437 GHz (Channel 6) - 0.31 - -80 - -100 - off - 37.971373 - 23.707907 -
- -
00:14:6C:A9:3B:FE
- NETGEAR - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - on - 37.96858 - 23.70568 -
- -
00:13:33:0E:AE:AA
- LionFon - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -96 - -99 - on - 37.969312 - 23.708455 -
- -
00:60:4C:E2:4C:47
- OTENET_6758 - Master - 7 - 2.442 GHz (Channel 7) - 0.32 - -76 - -97 - on - 37.969615 - 23.706655 -
- -
00:1D:19:48:44:18
- maria - Master - 6 - 2.437 GHz (Channel 6) - 0.32 - -79 - -100 - on - 37.969295 - 23.70698 -
- -
00:18:39:A9:A9:4E
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.01 - -99 - -100 - on - 37.969393 - 23.70382 -
- -
00:15:70:90:54:E4
- - Master - 1 - 2.412 GHz (Channel 1) - 0.09 - -97 - -103 - on - 37.967743 - 23.70728 -
- -
00:13:33:0A:6B:A0
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -84 - -98 - on - 37.966427 - 23.704572 -
- -
00:1C:A2:B3:DF:6D
- altin - Master - 9 - 2.452 GHz (Channel 9) - 0.32 - -81 - -102 - on - 37.97028 - 23.705965 -
- -
02:28:E8:8B:F3:86
- GAS_LTRX - Ad-Hoc - 11 - 2.462 GHz (Channel 11) - 0.25 - -86 - -102 - off - 37.968142 - 23.702082 -
- -
00:18:39:38:3C:F0
- Morpheas v0.1 - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -99 - -102 - on - 37.967323 - 23.704803 -
- -
00:14:C1:42:67:CA
- USR9108 - Master - 11 - 2.462 GHz (Channel 11) - 0.18 - -89 - -101 - on - 37.967065 - 23.704433 -
- -
00:19:4B:9F:D9:14
- StefaniaWireless - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -88 - -100 - on - 37.969875 - 23.709123 -
- -
00:1D:7E:B7:AF:AC
- TASOS HOME - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -99 - on - 37.970723 - 23.707233 -
- -
00:1C:A2:B3:61:3D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -85 - -97 - on - 37.970885 - 23.7092 -
- -
00:13:33:07:B1:20
- immed - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -102 - -100 - on - 37.970462 - 23.707 -
- -
00:1C:A2:B4:97:D9
- Pharaoh's largest - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -90 - -102 - on - 37.965957 - 23.705053 -
- -
00:05:59:06:45:6F
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.01 - -99 - -100 - on - 37.971358 - 23.7076 -
- -
00:15:56:CD:5B:F9
- OTENET_7873 - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -82 - -100 - on - 37.970965 - 23.705243 -
- -
00:1A:4F:20:EE:D0
- tfgk_wifi - Master - 7 - 2.442 GHz (Channel 7) - 0.1 - -93 - -100 - on - 37.973157 - 23.711198 -
- -
00:1C:A2:B2:8E:71
- ONTelecoms2 - Master - 9 - 2.452 GHz (Channel 9) - 0.04 - -98 - -101 - on - 37.968368 - 23.70779 -
- -
00:1C:4A:46:1C:5A
- SATURN A.E. - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.97383 - 23.70864 -
- -
00:1D:7E:AE:74:06
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.35 - -79 - -102 - on - 37.968095 - 23.706647 -
- -
00:13:33:1D:E9:58
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.31 - -77 - -97 - on - 37.968825 - 23.706567 -
- -
00:15:56:CD:A4:A7
- aquaterra - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.972295 - 23.707225 -
- -
00:22:15:8C:75:22
- makisg - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -98 - on - 37.969918 - 23.7054 -
- -
00:14:7F:73:D5:C9
- SpeedTouch95D819 - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -97 - -104 - on - 37.970753 - 23.709608 -
- -
00:1C:A2:AA:CC:D9
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.03 - -101 - -103 - off - 37.972677 - 23.71002 -
- -
00:13:33:83:9B:E9
- OTEd5ec30 - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -83 - -100 - on - 37.971072 - 23.706358 -
- -
00:1D:1C:2F:AF:C1
- Oxygen-31457 - Master - 5 - 2.432 GHz (Channel 5) - 1.0 - -101 - -100 - on - 37.972853 - 23.708088 -
- -
00:1D:19:88:8B:DA
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.971675 - 23.708642 -
- -
00:1D:1C:B2:69:7C
- Oxygen-00560 - Master - 7 - 2.442 GHz (Channel 7) - 0.1 - -92 - -99 - on - 37.967478 - 23.706297 -
- -
00:1C:A2:D9:41:39
- John_Bacoulas - Master - 9 - 2.452 GHz (Channel 9) - 0.43 - -75 - -103 - on - 37.968068 - 23.702945 -
- -
00:1C:A2:AC:00:45
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.34 - -81 - -103 - on - 37.973483 - 23.710197 -
- -
00:1D:7E:9C:70:D8
- Upgrade - Master - 11 - 2.462 GHz (Channel 11) - 0.26 - -85 - -102 - on - 37.968918 - 23.702125 -
- -
00:13:33:17:CD:D4
- Giaourti-13 - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.970347 - 23.709078 -
- -
00:13:33:17:80:AC
- amarad - Master - 6 - 2.437 GHz (Channel 6) - 0.31 - -80 - -100 - on - 37.967157 - 23.7041 -
- -
00:1F:9F:D3:D6:47
- ThomsonF0144D - Master - 11 - 2.462 GHz (Channel 11) - 0.25 - -86 - -102 - on - 37.967438 - 23.7055 -
- -
00:1C:A2:DE:25:85
- panos - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -101 - -99 - on - 37.970112 - 23.706637 -
- -
00:14:C1:40:05:4E
- USR9111 - Master - 11 - 2.462 GHz (Channel 11) - 0.14 - -93 - -102 - off - 37.970542 - 23.706718 -
- -
00:15:56:B5:63:E6
- OTENET_9697 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -106 - -100 - on - 37.969877 - 23.705683 -
- -
00:1F:9F:8E:46:B3
- ThomsonCDCC2C - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -86 - -103 - on - 37.966108 - 23.706723 -
- -
00:1D:19:46:CD:3F
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.967218 - 23.705227 -
- -
00:1E:74:BD:7C:CA
- noula - Master - 1 - 2.412 GHz (Channel 1) - 0.03 - -100 - -102 - on - 37.972267 - 23.708942 -
- -
00:1A:2A:88:7F:0D
- takis - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -96 - -94 - on - 37.968678 - 23.707883 -
- -
00:14:C1:38:F7:87
- elfa - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -98 - on - 37.972028 - 23.706907 -
- -
00:1F:9F:D3:62:5D
- ThomsonA8DEC2 - Master - 11 - 2.462 GHz (Channel 11) - 0.01 - -100 - -101 - on - 37.972515 - 23.711133 -
- -
00:1F:9F:CF:1C:11
- ThomsonE8EFBD - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -83 - -102 - on - 37.967013 - 23.70709 -
- -
00:1C:A2:B4:26:15
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -104 - -103 - on - 37.972482 - 23.710395 -
- -
00:1C:A2:AA:B1:75
- papas1 - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -95 - -100 - on - 37.96684 - 23.703863 -
- -
00:05:59:0B:DE:40
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.97085 - 23.706228 -
- -
00:13:33:0C:83:9C
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.971935 - 23.707937 -
- -
00:0F:CB:B6:56:39
- 3Com - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -103 - -102 - on - 37.968217 - 23.708142 -
- -
00:1F:9F:D4:93:43
- Thomson7D1CFC - Master - 1 - 2.412 GHz (Channel 1) - 0.03 - -101 - -103 - on - 37.973117 - 23.708465 -
- -
DA:CF:93:FD:62:13
- hpsetup - Ad-Hoc - 10 - 2.457 GHz (Channel 10) - 0.18 - -90 - -102 - off - 37.973583 - 23.70985 -
- -
00:13:33:0B:39:0C
- OTE CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -90 - -98 - on - 37.968313 - 23.701553 -
- -
00:18:84:12:7D:59
- marias_home - Master - 2 - 2.417 GHz (Channel 2) - 0.17 - -91 - -102 - on - 37.970193 - 23.708825 -
- -
00:40:F4:7A:45:8E
- KostisWireless - Master - 1 - 2.412 GHz (Channel 1) - 1.0 - -99 - -98 - off - 37.9676 - 23.705618 -
- -
00:1F:9F:CE:B8:4B
- stavroula - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -86 - -103 - on - 37.969847 - 23.708547 -
- -
00:1F:9F:D3:11:A1
- no tsampa - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -91 - -103 - on - 37.975025 - 23.711647 -
- -
00:1C:A2:AC:4D:01
- xristos - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -102 - -100 - on - 37.970667 - 23.70811 -
- -
00:1C:A2:DA:CC:9F
- Apple Greek - Master - 9 - 2.452 GHz (Channel 9) - 0.06 - -99 - -103 - on - 37.973483 - 23.710197 -
- -
00:1C:A2:AC:F8:C5
- makis - Master - 9 - 2.452 GHz (Channel 9) - 0.39 - -77 - -102 - on - 37.969508 - 23.706612 -
- -
00:1F:9F:88:7E:E3
- itnernetaki - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -90 - -104 - on - 37.973592 - 23.709188 -
- -
00:23:48:7A:78:51
- Spiros_Home - Master - 1 - 2.412 GHz (Channel 1) - 0.12 - -95 - -103 - on - 37.967948 - 23.703405 -
- -
00:05:59:04:3A:17
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.29 - -81 - -100 - on - 37.971785 - 23.710262 -
- -
00:90:D0:F5:C2:0C
- - - Master - 10 - 2.457 GHz (Channel 10) - 0.32 - -79 - -100 - on - 37.973513 - 23.708387 -
- -
00:1D:1C:14:E7:4A
- Oxygen-39870 - Master - 3 - 2.422 GHz (Channel 3) - 1.0 - -100 - -99 - on - 37.96887 - 23.708523 -
- -
00:1E:E3:D1:A8:C8
- mike - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -96 - -103 - on - 37.96774 - 23.708527 -
- -
00:1F:9F:88:4C:AF
- Thomson0287DB - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -90 - -103 - on - 37.968197 - 23.705882 -
- -
00:1C:4A:43:91:09
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -91 - -100 - on - 37.967427 - 23.704508 -
- -
00:1C:DF:08:71:C7
- Vagelis_Network - Master - 6 - 2.437 GHz (Channel 6) - 0.21 - -86 - -100 - on - 37.970815 - 23.707608 -
- -
00:1C:A2:AB:3E:B5
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.1 - -96 - -103 - off - 37.971617 - 23.70886 -
- -
00:1C:A2:D9:3B:F5
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.17 - -91 - -102 - on - 37.968095 - 23.706647 -
- -
00:21:63:3C:C1:EC
- SIEMENS-3CC1EC - Master - 11 - 2.462 GHz (Channel 11) - 0.18 - -90 - -102 - off - 37.96866 - 23.707047 -
- -
00:05:59:05:05:DB
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -90 - -99 - on - 37.9721 - 23.709918 -
- -
00:11:50:D2:69:08
- private1 - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -99 - -102 - on - 37.973483 - 23.710197 -
- -
00:21:63:3A:A3:34
- forthnet - Master - 11 - 2.462 GHz (Channel 11) - 0.07 - -97 - -102 - on - 37.966185 - 23.70391 -
- -
00:11:F5:53:D1:BD
- SpeedTouch07F80B - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -100 - -102 - off - 37.973483 - 23.710197 -
- -
00:1D:19:92:3E:CF
- ar gaekarot - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -91 - -99 - on - 37.965618 - 23.705558 -
- -
00:1E:E3:D1:96:7A
- matr-XD19679 - Master - 1 - 2.412 GHz (Channel 1) - 0.04 - -101 - -104 - on - 37.971603 - 23.708903 -
- -
00:15:56:B6:39:98
- OTENET_3452 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -102 - -100 - on - 37.970917 - 23.709747 -
- -
00:23:48:6C:DA:97
- john - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -90 - -97 - on - 37.96828 - 23.706712 -
- -
00:1E:2A:19:93:3E
- KEEP OUT - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - on - 37.967315 - 23.705355 -
- -
00:1D:1C:1A:EF:F0
- Oxygen-40026 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -99 - -96 - off - 37.966585 - 23.704683 -
- -
00:15:70:91:46:B0
- - Master - 1 - 2.412 GHz (Channel 1) - 0.32 - -82 - -103 - on - 37.967743 - 23.70728 -
- -
00:05:59:06:18:C7
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -95 - -99 - on - 37.969022 - 23.708702 -
- -
00:1C:4A:A2:20:21
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.0 - -100 - -100 - on - 37.967197 - 23.707148 -
- -
00:1F:9F:CF:6E:AB
- perseas - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -93 - -104 - on - 37.96601 - 23.704252 -
- -
00:21:29:7D:72:F8
- NancyWLAN - Master - 11 - 2.462 GHz (Channel 11) - 0.09 - -96 - -102 - on - 37.968988 - 23.706325 -
- -
00:1C:A2:AC:D8:5D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.25 - -86 - -102 - on - 37.971242 - 23.707483 -
- -
00:23:48:6C:7F:D4
- CONN-X_1549 - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.966538 - 23.706677 -
- -
00:18:6E:08:0B:89
- 3Com - Master - 11 - 2.462 GHz (Channel 11) - 0.15 - -90 - -100 - on - 37.969962 - 23.705732 -
- -
00:15:56:CF:ED:98
- sensa - Master - 6 - 2.437 GHz (Channel 6) - 0.06 - -96 - -100 - on - 37.968405 - 23.701328 -
- -
02:1E:58:41:94:BB
- HOME - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -87 - -103 - on - 37.968585 - 23.706857 -
- -
00:24:17:2F:3C:25
- kimolos - Master - 11 - 2.462 GHz (Channel 11) - 0.03 - -96 - -98 - on - 37.971307 - 23.705758 -
- -
00:1F:9F:47:D5:F1
- Thomson51416A - Master - 1 - 2.412 GHz (Channel 1) - 0.03 - -101 - -103 - on - 37.968998 - 23.70705 -
- -
00:1D:7E:AC:FC:34
- pavi - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -95 - -102 - on - 37.973 - 23.709225 -
- -
00:05:59:0F:1C:62
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.32 - -79 - -100 - on - 37.971063 - 23.710325 -
- -
00:24:17:88:9D:0F
- Thomson8C0484 - Master - 11 - 2.462 GHz (Channel 11) - 0.28 - -84 - -102 - off - 37.966742 - 23.704298 -
- -
00:02:61:1A:84:20
- DIMITRIS - Master - 11 - 2.462 GHz (Channel 11) - 0.17 - -91 - -102 - on - 37.965712 - 23.704675 -
- -
00:05:59:07:1B:47
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.01 - -99 - -100 - on - 37.972515 - 23.711133 -
- -
00:05:59:17:50:84
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.12 - -89 - -97 - on - 37.973592 - 23.709188 -
- -
00:1F:9F:EB:68:43
- Thomson1C0784 - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - on - 37.968068 - 23.702945 -
- -
00:1F:9F:88:36:25
- Thomson194AD9 - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -100 - -97 - on - 37.972778 - 23.707955 -
- -
00:1D:1C:14:30:94
- annabel - Master - 9 - 2.452 GHz (Channel 9) - 0.07 - -98 - -103 - on - 37.968045 - 23.70803 -
- -
00:13:33:18:F0:C6
- theofano - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.972632 - 23.708327 -
- -
00:1C:A2:AC:A0:A1
- vagouras - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -88 - -104 - on - 37.968285 - 23.702407 -
- -
00:1F:9F:D3:2F:6F
- MyWifi - Master - 1 - 2.412 GHz (Channel 1) - 0.07 - -96 - -101 - on - 37.968585 - 23.706857 -
- -
00:11:6B:3E:DD:F5
- SAMNET - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -96 - -100 - on - 37.966217 - 23.705328 -
- -
00:90:D0:F3:F6:76
- Nikos - Master - 1 - 2.412 GHz (Channel 1) - 0.32 - -83 - -104 - on - 37.96836 - 23.701307 -
- -
00:05:59:04:A4:37
- NetFasteR_IAD - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -97 - on - 37.969437 - 23.706617 -
- -
00:15:56:CD:3C:D9
- gstef - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -81 - -98 - on - 37.968313 - 23.701553 -
- -
00:24:17:B2:68:37
- voudou - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -97 - -104 - on - 37.971373 - 23.707907 -
- -
00:1F:9F:4A:4B:7F
- Psyclist@NetWork - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -104 - -102 - on - 37.969502 - 23.7089 -
- -
00:1C:4A:43:7C:E4
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -90 - -100 - on - 37.970542 - 23.706718 -
- -
00:1F:9F:8E:55:25
- Thomson95C77E - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -96 - -103 - on - 37.970193 - 23.708825 -
- -
00:1C:A2:AB:2B:B9
- la red de jaume - Master - 9 - 2.452 GHz (Channel 9) - 0.14 - -93 - -102 - on - 37.966777 - 23.704967 -
- -
00:23:48:0E:4B:12
- vassilia - Master - 1 - 2.412 GHz (Channel 1) - 0.1 - -97 - -104 - on - 37.973145 - 23.708517 -
- -
00:1C:A2:B4:D7:D9
- karolas - Master - 9 - 2.452 GHz (Channel 9) - 0.07 - -98 - -103 - on - 37.967905 - 23.702367 -
- -
00:1E:2A:12:AC:2A
- NETGEAR - Master - 1 - 2.412 GHz (Channel 1) - 0.12 - -96 - -104 - off - 37.966372 - 23.703835 -
- -
00:18:39:A4:A4:88
- linksys 200 - Master - 11 - 2.462 GHz (Channel 11) - 0.21 - -88 - -102 - on - 37.970015 - 23.705767 -
- -
00:02:61:11:84:9C
- none - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -95 - -102 - off - 37.970667 - 23.70811 -
- -
00:1C:F0:E2:FC:58
- dlink - Master - 6 - 2.437 GHz (Channel 6) - 0.07 - -94 - -99 - off - 37.966273 - 23.706827 -
- -
00:02:61:11:9E:1F
- i3-IAD452W - Master - 11 - 2.462 GHz (Channel 11) - 0.46 - -68 - -98 - on - 37.968197 - 23.705882 -
- -
00:1F:9F:ED:5A:DB
- Thomson405B4B - Master - 1 - 2.412 GHz (Channel 1) - 0.2 - -90 - -103 - on - 37.966217 - 23.705328 -
- -
00:1C:DF:E4:71:4B
- gregory - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.966505 - 23.705655 -
- -
00:18:46:02:5D:05
- zeroprogressT1LAN - Master - 1 - 2.412 GHz (Channel 1) - 0.26 - -86 - -103 - on - 37.970727 - 23.707922 -
- -
00:1C:A2:AC:16:E1
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -103 - -99 - on - 37.968522 - 23.705912 -
- -
00:1D:68:76:47:77
- SpeedTouch1EDDF1 - Master - 11 - 2.462 GHz (Channel 11) - 0.07 - -97 - -102 - on - 37.972818 - 23.711278 -
- -
00:1F:E2:B5:5C:E0
- PS3-5597597 - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.970753 - 23.709608 -
- -
00:0C:F6:25:B5:6E
- Sitecom - Master - 11 - 2.462 GHz (Channel 11) - 0.0 - -102 - -102 - on - 37.96955 - 23.707758 -
- -
00:23:48:7A:D5:BA
- CONN-X_6363 - Master - 1 - 2.412 GHz (Channel 1) - 0.25 - -88 - -104 - on - 37.966738 - 23.703118 -
- -
00:1E:E5:96:B1:7B
- gdoup - Master - 11 - 2.462 GHz (Channel 11) - 0.12 - -94 - -102 - on - 37.968012 - 23.702115 -
- -
00:1F:9F:CE:C6:19
- Thomson2D628F - Master - 1 - 2.412 GHz (Channel 1) - 0.21 - -88 - -102 - on - 37.968727 - 23.708552 -
- -
00:1B:2F:A6:85:52
- NETGEAR - Master - 11 - 2.462 GHz (Channel 11) - 0.14 - -93 - -102 - off - 37.967567 - 23.704323 -
- -
00:15:56:B5:AA:D6
- OTE9695 - Master - 7 - 2.442 GHz (Channel 7) - 0.15 - -90 - -100 - on - 37.966428 - 23.70368 -
- -
00:1C:A2:DA:91:77
- Maria - Master - 9 - 2.452 GHz (Channel 9) - 0.15 - -93 - -103 - on - 37.973592 - 23.709188 -
- -
00:05:59:05:CA:EB
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.25 - -84 - -100 - on - 37.966742 - 23.704298 -
- -
00:1C:A2:AC:B4:79
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.32 - -82 - -103 - on - 37.967427 - 23.704508 -
- -
00:1D:19:48:2C:99
- nikikostas - Master - 6 - 2.437 GHz (Channel 6) - 0.18 - -88 - -100 - on - 37.96751 - 23.704285 -
- -
00:1D:7E:B1:A1:A4
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.04 - -93 - -96 - on - 37.9721 - 23.709918 -
- -
00:1D:19:49:6D:3D
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.0 - -92 - -92 - on - 37.967815 - 23.706537 -
- -
00:15:56:B7:80:68
- magia - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -85 - -98 - on - 37.972218 - 23.708677 -
- -
00:1A:70:A1:31:7C
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.31 - -82 - -102 - on - 37.970582 - 23.706513 -
- -
00:1F:9F:47:E9:07
- gg - Master - 11 - 2.462 GHz (Channel 11) - 0.39 - -75 - -100 - on - 37.967052 - 23.704008 -
- -
00:1E:E5:91:CF:D0
- linksys - Master - 11 - 2.462 GHz (Channel 11) - 0.06 - -98 - -102 - off - 37.97039 - 23.705992 -
- -
00:1C:A2:B3:32:C9
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.07 - -98 - -103 - on - 37.968838 - 23.705133 -
- -
00:1D:19:46:C7:84
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -94 - -100 - on - 37.965488 - 23.706205 -
- -
00:1D:19:92:19:A6
- marias_home - Master - 6 - 2.437 GHz (Channel 6) - 0.26 - -83 - -100 - on - 37.969797 - 23.709105 -
- -
00:21:63:44:52:5C
- SIEMENS-44525C - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -87 - -102 - on - 37.96937 - 23.706807 -
- -
00:90:D0:F5:C0:56
- SpeedTouch1CD341 - Master - 11 - 2.462 GHz (Channel 11) - 0.29 - -84 - -103 - off - 37.966608 - 23.707212 -
- -
00:21:63:3A:C8:68
- homep - Master - 11 - 2.462 GHz (Channel 11) - 0.28 - -84 - -102 - on - 37.969597 - 23.706383 -
- -
00:1D:1C:AB:5B:21
- Oxygen-33045 - Master - 9 - 2.452 GHz (Channel 9) - 0.25 - -85 - -101 - on - 37.974802 - 23.711063 -
- -
00:15:56:B4:7C:23
- OTENET_3544 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -96 - -95 - on - 37.970733 - 23.708103 -
- -
00:1C:A2:AC:E1:3D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.04 - -99 - -102 - on - 37.968918 - 23.702125 -
- -
00:1C:A2:AC:1F:2D
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.07 - -98 - -103 - on - 37.969227 - 23.705537 -
- -
00:30:1A:09:2A:6C
- - - 8 - 2.447 GHz (Channel 8) - 1.0 - -97 - -95 - off - 37.969178 - 23.705352 -
- -
00:25:69:0C:26:E0
- CONN-X_4127 - Master - 1 - 2.412 GHz (Channel 1) - 0.04 - -100 - -103 - on - 37.974543 - 23.710703 -
- -
00:90:D0:FA:AE:6B
- Colorados - Master - 1 - 2.412 GHz (Channel 1) - 0.07 - -98 - -103 - on - 37.969207 - 23.70551 -
- -
00:1C:A2:B2:06:B5
- syga - Master - 9 - 2.452 GHz (Channel 9) - 0.15 - -91 - -101 - on - 37.96948 - 23.708353 -
- -
00:26:91:16:19:D2
- CONN-X_9696 - Master - 1 - 2.412 GHz (Channel 1) - 0.23 - -88 - -103 - on - 37.972515 - 23.711133 -
- -
00:1C:F0:B2:7C:60
- dlink - Master - 6 - 2.437 GHz (Channel 6) - 0.09 - -93 - -99 - on - 37.9721 - 23.709918 -
- -
00:13:33:1E:E5:AC
- bettynikolas - Master - 6 - 2.437 GHz (Channel 6) - 0.15 - -85 - -95 - on - 37.969057 - 23.702348 -
- -
00:1D:68:77:55:9B
- SpeedTouchB27DA2 - Master - 6 - 2.437 GHz (Channel 6) - 0.01 - -99 - -100 - on - 37.967263 - 23.703967 -
- -
00:1C:A2:AB:FA:B5
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.31 - -83 - -103 - off - 37.972927 - 23.709363 -
- -
00:1E:74:AB:88:C4
- CONN-X_3268 - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -101 - -100 - on - 37.96937 - 23.705422 -
- -
00:1C:A2:B4:AB:29
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 1.0 - -100 - -99 - off - 37.96713 - 23.703062 -
- -
00:24:17:93:41:20
- Thomson82E6E5 - Master - 11 - 2.462 GHz (Channel 11) - 0.1 - -94 - -101 - off - 37.967065 - 23.704433 -
- -
00:24:17:93:7D:2E
- Forhnet Wireless - Master - 1 - 2.412 GHz (Channel 1) - 0.17 - -92 - -103 - on - 37.969452 - 23.708058 -
- -
00:02:61:1A:8B:91
- john - Master - 11 - 2.462 GHz (Channel 11) - 0.23 - -87 - -102 - on - 37.972797 - 23.70955 -
- -
00:05:59:09:50:F3
- NetFasteR IAD (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.966742 - 23.704298 -
- -
00:24:17:2E:BF:89
- Thomson1C68CA - Master - 1 - 2.412 GHz (Channel 1) - 0.18 - -92 - -104 - on - 37.96649 - 23.704702 -
- -
00:21:63:3A:F8:CC
- SIEMENS-3AF8CC - Master - 11 - 2.462 GHz (Channel 11) - 1.0 - -98 - -96 - on - 37.970398 - 23.707907 -
- -
00:1F:9F:CF:CD:2B
- Thomson49F4C5 - Master - 6 - 2.437 GHz (Channel 6) - 0.28 - -78 - -96 - on - 37.96719 - 23.704093 -
- -
00:1D:19:88:69:51
- CONNX - Master - 6 - 2.437 GHz (Channel 6) - 1.0 - -99 - -95 - on - 37.973247 - 23.71102 -
- -
00:05:59:05:7E:D7
- Monic - Master - 6 - 2.437 GHz (Channel 6) - 0.23 - -85 - -100 - on - 37.970117 - 23.705057 -
- -
00:11:6B:63:A0:59
- PKS - Master - 6 - 2.437 GHz (Channel 6) - 0.04 - -97 - -100 - on - 37.966917 - 23.702945 -
- -
00:19:3E:E8:7B:59
- JOHN1011 - Master - 9 - 2.452 GHz (Channel 9) - 0.18 - -91 - -103 - on - 37.972225 - 23.708678 -
- -
00:1C:A2:D9:3A:79
- ONTelecoms - Master - 9 - 2.452 GHz (Channel 9) - 0.12 - -95 - -103 - on - 37.971648 - 23.706648 -
- -
00:05:59:18:E1:5E
- NetFasteR IAD 2 (PSTN) - Master - 6 - 2.437 GHz (Channel 6) - 0.14 - -91 - -100 - on - 37.971063 - 23.710325 -
- -
00:90:D0:F3:F9:A5
- SpeedTouch8AA084 - Master - 1 - 2.412 GHz (Channel 1) - 0.07 - -99 - -104 - off - 37.971418 - 23.710557 -
- -
00:1A:4F:22:9D:4B
- FRITZ!Box Fon WLAN 7140 Annex A - Master - 6 - 2.437 GHz (Channel 6) - 0.2 - -87 - -100 - on - 37.971185 - 23.709403 -
-
diff --git a/images/arrow-down.png b/images/arrow-down.png new file mode 100644 index 0000000..585b0bd Binary files /dev/null and b/images/arrow-down.png differ diff --git a/images/octocat-small.png b/images/octocat-small.png new file mode 100644 index 0000000..66c2539 Binary files /dev/null and b/images/octocat-small.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..22906af --- /dev/null +++ b/index.html @@ -0,0 +1,121 @@ + + + + + + Wifi Scan And Map by cyberpython + + + + + + + + +
+
+

Wifi Scan And Map

+

A Linux Python application to create maps of 802.11 networks

+ + + +

This project is maintained by cyberpython

+ + +
+
+

WifiScanAndMap

+ +

A simple 802.11 mapping application for Linux written in Python.

+ +

WifiScanAndMap generated map screenshot

+ +

Description:

+ +

WiFiScanAndMap is a Python WiFi mapping application for Linux. +You can use it to scan areas for wireless networks, collect information about them and then generate a web page displaying these information on a map.

+ +

The application was created as an assignment for the “Wireless Networks And Mobile Communcations” course at the Computer Science Department of the Athens University Of Economics And Business, by:

+ +
    +
  • Filia Dova
  • +
  • Georgios Migdos
  • +

The application consists of two programs, the scanner and the map generator.

+ +

The user runs the scanner on a mobile device (laptop/netbook) which collects information about the wireless networks within range. The program relies on iwlist output for the scanning process. After the user is done, they can save the collected information as an XML file.

+ +

WifiScanAndMap scanner run as a GTK+ application

+ +

The scanner can be run as a GTK+ application or as a command line application (with the –no-gui parameter).

+ +

This process can be repeated any number of times, resulting in a number of XML files. These XML files are used as the input of the map generator program which parses the XML files and produces an HTML web page.

+ +

The map data used is obtained from OpenStreetMap and the tiles are from Yahoo! Maps. The graph is displayed using the Bluff Javascript library.

+ +

Requirements:

+ +

To run the scanner you need:

+ +
    +
  • A Linux system with wireless tools for Linux installed
  • +
  • Wireless card supporting scanning
  • +
  • GPS receiver
  • +
  • Python 2.6.4
  • +
  • gpsd (+python bindings)
  • +
  • PyGTK+ 2.16 (if you want to use the GUI)
  • +

To display the map you need:

+ +
    +
  • A web browser supporting CSS with Javascript enabled
  • +
  • An active internet connection
  • +

Usage:

+ +
    +
  • You can run the scanner (GTK+ GUI) with the command : +python scanner/scanner.py

  • +
  • You can run the scanner (GTK+ GUI) with the command : +python scanner/scanner.py –no-gui

  • +
  • +

    You can run the map generator with the command: +python mapgenerator/mapgenerator.py <longitude> <latitude> <output directory> <input XML file 1> <input XML file 2> … <input XML file n>

    + +

    where:

    + +
      +
    • +<longitude> and <latitude> are the geographic coordinates of the resulting map’s original center
    • +
    • +<output directory> is the directory where the result files will be saved
    • +
    • +<input XML file 1> <input XML file 2> … <input XML file n> are the XML files generated by the scanner.
    • +
    +
  • +

Authors:

+ +

License:

+ +

The source code is available under the Apache v2.0 license.

+ +

The artwork is available under the Creative Commons Attribution-Share Alike 3.0 Unported license.

+ +

The 3rd party Bluff Javascript library is available under the MIT license.

+
+ +
+ + + + \ No newline at end of file diff --git a/javascripts/scale.fix.js b/javascripts/scale.fix.js new file mode 100644 index 0000000..08716c0 --- /dev/null +++ b/javascripts/scale.fix.js @@ -0,0 +1,20 @@ +fixScale = function(doc) { + + var addEvent = 'addEventListener', + type = 'gesturestart', + qsa = 'querySelectorAll', + scales = [1, 1], + meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; + + function fix() { + meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; + doc.removeEventListener(type, fix, true); + } + + if ((meta = meta[meta.length - 1]) && addEvent in doc) { + fix(); + scales = [.25, 1.6]; + doc[addEvent](type, fix, true); + } + +}; \ No newline at end of file diff --git a/mapgenerator/img/LICENSE.txt b/mapgenerator/img/LICENSE.txt deleted file mode 100644 index 290a314..0000000 --- a/mapgenerator/img/LICENSE.txt +++ /dev/null @@ -1,3 +0,0 @@ -The artwork in this directory is available under the Creative Commons Attribution-Share Alike 3.0 Unported license (http://creativecommons.org/licenses/by-sa/3.0/). - -Copyright 2010 Georgios Migdos. diff --git a/mapgenerator/img/bg.png b/mapgenerator/img/bg.png deleted file mode 100644 index 4c0587f..0000000 Binary files a/mapgenerator/img/bg.png and /dev/null differ diff --git a/mapgenerator/img/locked.png b/mapgenerator/img/locked.png deleted file mode 100755 index 76ef0e3..0000000 Binary files a/mapgenerator/img/locked.png and /dev/null differ diff --git a/mapgenerator/img/locked.svg b/mapgenerator/img/locked.svg deleted file mode 100644 index 1cefb56..0000000 --- a/mapgenerator/img/locked.svg +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/mapgenerator/img/marker-few-open.png b/mapgenerator/img/marker-few-open.png deleted file mode 100644 index b0257bf..0000000 Binary files a/mapgenerator/img/marker-few-open.png and /dev/null differ diff --git a/mapgenerator/img/marker-few.png b/mapgenerator/img/marker-few.png deleted file mode 100644 index fa02fd6..0000000 Binary files a/mapgenerator/img/marker-few.png and /dev/null differ diff --git a/mapgenerator/img/marker-few.svg b/mapgenerator/img/marker-few.svg deleted file mode 100644 index fd7aed9..0000000 --- a/mapgenerator/img/marker-few.svg +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/mapgenerator/img/marker-many-open.png b/mapgenerator/img/marker-many-open.png deleted file mode 100644 index 01dc851..0000000 Binary files a/mapgenerator/img/marker-many-open.png and /dev/null differ diff --git a/mapgenerator/img/marker-many.png b/mapgenerator/img/marker-many.png deleted file mode 100644 index 0937df0..0000000 Binary files a/mapgenerator/img/marker-many.png and /dev/null differ diff --git a/mapgenerator/img/marker-many.svg b/mapgenerator/img/marker-many.svg deleted file mode 100644 index 4b5e14e..0000000 --- a/mapgenerator/img/marker-many.svg +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/mapgenerator/img/marker-open.png b/mapgenerator/img/marker-open.png deleted file mode 100644 index ea8ab10..0000000 Binary files a/mapgenerator/img/marker-open.png and /dev/null differ diff --git a/mapgenerator/img/marker.png b/mapgenerator/img/marker.png deleted file mode 100644 index 2462c88..0000000 Binary files a/mapgenerator/img/marker.png and /dev/null differ diff --git a/mapgenerator/img/marker.svg b/mapgenerator/img/marker.svg deleted file mode 100644 index 1411769..0000000 --- a/mapgenerator/img/marker.svg +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/mapgenerator/img/wifi.png b/mapgenerator/img/wifi.png deleted file mode 100644 index b25c79b..0000000 Binary files a/mapgenerator/img/wifi.png and /dev/null differ diff --git a/mapgenerator/img/wifi.svg b/mapgenerator/img/wifi.svg deleted file mode 100644 index 8398315..0000000 --- a/mapgenerator/img/wifi.svg +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/mapgenerator/mapgenerator.py b/mapgenerator/mapgenerator.py deleted file mode 100755 index 0b4d4a1..0000000 --- a/mapgenerator/mapgenerator.py +++ /dev/null @@ -1,492 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 -*- - -''' - Copyright 2010 Filia Dova, Georgios Migdos - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -''' - -from xml.dom.minidom import parse -import os -import sys -import shutil -import math - -class MapGenerator: - - def parseXMLFile(self, XMLFilename, outputDictionary, referenceDictionary): - dom = parse(XMLFilename) - for network in dom.getElementsByTagName('network'): - latitude = "" - longtitude = "" - essid = "" - channel = "" - quality = "" - qualityNum = 0 - security = "" - address = "" - frequency = "" - signal = "" - noise = "" - for lat in network.getElementsByTagName('latitude'): - if(len(lat.childNodes)>0): - latitude = lat.childNodes[0].nodeValue - for lon in network.getElementsByTagName('longtitude'): - if(len(lon.childNodes)>0): - longtitude = lon.childNodes[0].nodeValue - for ssid in network.getElementsByTagName('essid'): - if(len(ssid.childNodes)>0): - essid = ssid.childNodes[0].nodeValue - for chan in network.getElementsByTagName('channel'): - if(len(chan.childNodes)>0): - channel = chan.childNodes[0].nodeValue - for qual in network.getElementsByTagName('quality'): - if(len(qual.childNodes)>0): - qualityNum = eval(qual.childNodes[0].nodeValue)*100 - quality = str(qualityNum)+"%" - for sec in network.getElementsByTagName('security'): - if(len(sec.childNodes)>0): - security = sec.childNodes[0].nodeValue - for mac in network.getElementsByTagName('address'): - if(len(mac.childNodes)>0): - address = mac.childNodes[0].nodeValue - for freq in network.getElementsByTagName('frequency'): - if(len(freq.childNodes)>0): - frequency = freq.childNodes[0].nodeValue - for sig in network.getElementsByTagName('signal'): - if(len(sig.childNodes)>0): - signal = sig.childNodes[0].nodeValue - for nois in network.getElementsByTagName('noise'): - if(len(nois.childNodes)>0): - noise = nois.childNodes[0].nodeValue - - referenceKey = essid+":"+address - newReferenceEntry = [essid, address, qualityNum] - key = latitude+","+longtitude - entry = [essid, channel, quality, security, address, frequency, signal, noise] - - try: - referenceEntry = referenceDictionary[referenceKey] - if(referenceEntry[2] - - - - WNMC - - - - - - - - \n\n''' - outputFile.write(tempStr.encode('utf-8')) - tempStr = ''' - - -
\n\n''' - outputFile.write(tempStr.encode('utf-8')) - stats = Stats(50, inputXMLFilesList).getStats() - tempStr = ''' -
-
-
-
- marker - : 1 WN - marker-few - : 2-4 WNs - marker-many - : >4 WNs -
-
-
-
-
-
- Networks: '''+ str(stats[0]) + " - Open: "+ str(stats[2]) +''' -
-
-
-
-
-
- Access Points / Channel -
- -
- -
-
-
-
- - - ''' - outputFile.write(tempStr.encode('utf-8')) - - tempStr = ''' -''' - outputFile.write(tempStr.encode('utf-8')) - outputFile.close() - - -class Stats: - - def __init__(self, minDistance, XMLFilenames): - self.clear() - for fname in XMLFilenames: - self.parseXMLFile(fname) - self.runStats(minDistance) - - def clear(self): - self.networks = [] - self.total = 0 - self.totalOpen = 0 - self.channelsCounter = [0,0,0,0,0,0,0,0,0,0,0] - - def getStats(self): - return self.total, self.channelsCounter, self.totalOpen - - def getNetworksList(self): - return self.networks - - def parseXMLFile(self, XMLFilename): - dom = parse(XMLFilename) - for network in dom.getElementsByTagName('network'): - latitude = "" - longtitude = "" - essid = "" - channel = "" - quality = "" - security = "" - address = "" - frequency = "" - signal = "" - noise = "" - for lat in network.getElementsByTagName('latitude'): - if(len(lat.childNodes)>0): - latitude = lat.childNodes[0].nodeValue - for lon in network.getElementsByTagName('longtitude'): - if(len(lon.childNodes)>0): - longtitude = lon.childNodes[0].nodeValue - for ssid in network.getElementsByTagName('essid'): - if(len(ssid.childNodes)>0): - essid = ssid.childNodes[0].nodeValue - for chan in network.getElementsByTagName('channel'): - if(len(chan.childNodes)>0): - channel = chan.childNodes[0].nodeValue - for qual in network.getElementsByTagName('quality'): - if(len(qual.childNodes)>0): - quality = str(eval(qual.childNodes[0].nodeValue)*100)+"%" - for sec in network.getElementsByTagName('security'): - if(len(sec.childNodes)>0): - security = sec.childNodes[0].nodeValue - for mac in network.getElementsByTagName('address'): - if(len(mac.childNodes)>0): - address = mac.childNodes[0].nodeValue - for freq in network.getElementsByTagName('frequency'): - if(len(freq.childNodes)>0): - frequency = freq.childNodes[0].nodeValue - for sig in network.getElementsByTagName('signal'): - if(len(sig.childNodes)>0): - signal = sig.childNodes[0].nodeValue - for nois in network.getElementsByTagName('noise'): - if(len(nois.childNodes)>0): - noise = nois.childNodes[0].nodeValue - - entry = [essid, int(channel), quality, security, address, frequency, signal, noise, float(latitude), float(longtitude)] - self.networks.append(entry) - - - def runStats(self, minDistance): - self.channelsCounter = [0,0,0,0,0,0,0,0,0,0,0,0,0,0] - self.total = len(self.networks) - for network in self.networks: - chn = network[1] - self.channelsCounter[chn-1] = self.channelsCounter[chn-1]+1 - if(network[3]!="on"): - self.totalOpen += 1 - - def calculate_distance(self, lat1, lon1, lat2, lon2): - ''' - * Calculates the distance between two points given their (lat, lon) co-ordinates. - * It uses the Spherical Law Of Cosines (http://en.wikipedia.org/wiki/Spherical_law_of_cosines): - * - * cos(c) = cos(a) * cos(b) + sin(a) * sin(b) * cos(C) (1) - * - * In this case: - * a = lat1 in radians, b = lat2 in radians, C = (lon2 - lon1) in radians - * and because the latitude range is [-π/2, π/2] instead of [0, π] - * and the longitude range is [-π, π] instead of [0, 2π] - * (1) transforms into: - * - * x = cos(c) = sin(a) * sin(b) + cos(a) * cos(b) * cos(C) - * - * Finally the distance is arccos(x) - ''' - - if ((lat1 == lat2) and (lon1 == lon2)): - return 0 - - try: - delta = lon2 - lon1 - a = math.radians(lat1) - b = math.radians(lat2) - C = math.radians(delta) - x = math.sin(a) * math.sin(b) + math.cos(a) * math.cos(b) * math.cos(C) - distance = math.acos(x) # in radians - distance = math.degrees(distance) # in degrees - distance = distance * 60 # 60 nautical miles / lat degree - distance = distance * 1852 # conversion to meters - distance = round(distance) - return distance; - except: - return 0 - - -if(len(sys.argv)<5): - print "Usage:\n\tpython mapgenerator.py \n" - print "\tlongtitude:\tThe longtitude of the default center of the map." - print "\tlatitude:\tThe latitude of the default center of the map." - print "\toutput_dir:\tThe location where the resulting html file and images will be saved." - print "\tinput_files:\tThe XML files that were generated by the scanner application.\n" -else: - generator = MapGenerator() - #lon="23.70823" - #lat="37.97009" - generator.generateOpenStreetMapsMap(sys.argv[3], sys.argv[4:], sys.argv[1], sys.argv[2]) - diff --git a/mapgenerator/scripts/MIT-LICENSE b/mapgenerator/scripts/MIT-LICENSE deleted file mode 100644 index 8b415ad..0000000 --- a/mapgenerator/scripts/MIT-LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Bluff -- Beautiful graphs in JavaScript -http://bluff.jcoglan.com - -Copyright (c) 2008-2009 James Coglan - -Original Ruby version (c) 2005-2009 Topfunky Corporation boss@topfunky.com - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mapgenerator/scripts/bluff-min.js b/mapgenerator/scripts/bluff-min.js deleted file mode 100644 index 3a80df0..0000000 --- a/mapgenerator/scripts/bluff-min.js +++ /dev/null @@ -1 +0,0 @@ -Bluff={VERSION:'0.3.6',array:function(c){if(c.length===undefined)return[c];var d=[],f=c.length;while(f--)d[f]=c[f];return d},array_new:function(c,d){var f=[];while(c--)f.push(d);return f},each:function(c,d,f){for(var g=0,h=c.length;gthis._5)?g.length:this._5;Bluff.each(g,function(c,d){if(c===undefined)return;if(this.maximum_value===null&&this.minimum_value===null)this.maximum_value=this.minimum_value=c;this.maximum_value=this._1f(c)?c:this.maximum_value;if(this.maximum_value>=0)this._a=true;this.minimum_value=this._1A(c)?c:this.minimum_value;if(this.minimum_value<0)this._a=true},this)},draw:function(){if(this.stacked)this._1B();this._1C();this._u(function(){this._0.rectangle(this.left_margin,this.top_margin,this._d-this.right_margin,this._L-this.bottom_margin);this._0.rectangle(this._1,this._7,this._l,this._g)})},clear:function(){this._X()},_1C:function(){if(!this._a)return this._1D();this._13();this._1E();if(this.sort)this._1F();this._1G();this._M();this._1H();this._1I()},_13:function(g){if(this._9===null||g===true){this._9=[];if(!this._a)return;this._1g();Bluff.each(this._2,function(d){var f=[];Bluff.each(d[this.klass.DATA_VALUES_INDEX],function(c){if(c===null||c===undefined)f.push(null);else f.push((c-this.minimum_value)/this._i)},this);this._9.push([d[this.klass.DATA_LABEL_INDEX],f,d[this.klass.DATA_COLOR_INDEX]])},this)}},_1g:function(){this._i=this.maximum_value-this.minimum_value;this._i=this._i>0?this._i:1;this._1h=100/Math.pow(10,Math.round(Math.LOG10E*Math.log(this._i)))},_1E:function(){this._N=this.hide_line_markers?0:this._D(this.marker_font_size);this._1i=this.hide_title?0:this._D(this.title_font_size);this._1j=this.hide_legend?0:this._D(this.legend_font_size);var c,d,f,g,h,i,j;if(this.hide_line_markers){this._1=this.left_margin;this._14=this.right_margin;this._1k=this.bottom_margin}else{d=0;if(this.has_left_labels){c='';for(j in this.labels){c=c.length>this.labels[j].length?c:this.labels[j]}d=this._O(this.marker_font_size,c)*1.25}else{d=this._O(this.marker_font_size,this._15(this.maximum_value))}f=this.hide_line_numbers&&!this.has_left_labels?0.0:d+this.klass.LABEL_MARGIN*2;this._1=this.left_margin+f+(this.y_axis_label===null?0.0:this._N+this.klass.LABEL_MARGIN*2);g=-Infinity;for(j in this.labels)g=g>Number(j)?g:Number(j);g=Math.round(g);h=(g>=(this._5-1)&&this.center_labels_over_point)?this._O(this.marker_font_size,this.labels[g])/2:0;this._14=this.right_margin+h;this._1k=this.bottom_margin+this._N+this.klass.LABEL_MARGIN}this._l=this._d-this._14;this._6=this._d-this._1-this._14;this._7=this.top_margin+(this.hide_title?this.title_margin:this._1i+this.title_margin)+(this.hide_legend?this.legend_margin:this._1j+this.legend_margin);i=(this.x_axis_label===null)?0.0:this._N+this.klass.LABEL_MARGIN;this._g=this._L-this._1k-i;this._3=this._g-this._7},_1H:function(){if(this.x_axis_label){var c=this._g+this.klass.LABEL_MARGIN*2+this._N;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(this._d,1.0,0.0,c,this.x_axis_label,this._b);this._u(function(){this._0.line(0.0,c,this._d,c)})}},_M:function(){if(this.hide_line_markers)return;if(this.y_axis_increment===null){if(this.marker_count===null){Bluff.each([3,4,5,6,7],function(c){if(!this.marker_count&&this._i%c===0)this.marker_count=c},this);this.marker_count=this.marker_count||4}this._16=(this._i>0)?this._17(this._i/this.marker_count):1}else{this.maximum_value=Math.max(Math.ceil(this.maximum_value),this.y_axis_increment);this.minimum_value=Math.floor(this.minimum_value);this._1g();this._13(true);this.marker_count=Math.round(this._i/this.y_axis_increment);this._16=this.y_axis_increment}this._1J=this._3/(this._i/this._16);var d,f,g,h;for(d=0,f=this.marker_count;d<=f;d++){g=this._7+this._3-d*this._1J;this._0.stroke=this.marker_color;this._0.stroke_width=1;this._0.line(this._1,g,this._l,g);h=d*this._16+this.minimum_value;if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.font_weight='normal';this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(this._1-this.klass.LABEL_MARGIN,1.0,0.0,g,this._15(h),this._b)}}},_1l:function(c){return(this._d-c)/2},_1G:function(){if(this.hide_legend)return;this._P=Bluff.map(this._2,function(c){return c[this.klass.DATA_LABEL_INDEX]},this);var i=this.legend_box_size;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var j=[[]];Bluff.each(this._P,function(c){var d=j.length-1;var f=this._0.get_type_metrics(c);var g=f.width+i*2.7;j[d].push(g);if(Bluff.sum(j[d])>(this._d*0.9))j.push([j[d].pop()])},this);var k=this._1l(Bluff.sum(j[0]));var l=this.hide_title?this.top_margin+this.title_margin:this.top_margin+this.title_margin+this._1i;this._u(function(){this._0.stroke_width=1;this._0.line(0,l,this._d,l)});Bluff.each(this._P,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._d,1.0,k+(i*1.7),l,c,this._b);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(k,l-i/2.0,k+i,l+i/2.0);this._0.pointsize=this.legend_font_size;var f=this._0.get_type_metrics(c);var g=f.width+(i*2.7),h;j[0].shift();if(j[0].length==0){this._u(function(){this._0.line(0.0,l,this._d,l)});j.shift();if(j.length>0)k=this._1l(Bluff.sum(j[0]));h=Math.max(this._1j,i)+this.legend_margin;if(j.length>0){l+=h;this._7+=h;this._3=this._g-this._7}}else{k+=g}},this);this._m=0},_1I:function(){if(this.hide_title||!this.title)return;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.title_font_size);this._0.font_weight='bold';this._0.gravity='north';this._0.annotate_scaled(this._d,1.0,0,this.top_margin,this.title,this._b)},_c:function(c,d){if(this.hide_line_markers)return;var f;if(this.labels[d]&&!this._q[d]){f=this._g+this.klass.LABEL_MARGIN;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(1.0,1.0,c,f,this.labels[d],this._b);this._q[d]=true;this._u(function(){this._0.stroke_width=1;this._0.line(0.0,f,this._d,f)})}},_E:function(c,d,f,g,h,i,j){if(!this.tooltips)return;this._0.tooltip(c,d,f,g,h,i,j)},_1D:function(){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(80);this._0.gravity='center';this._0.annotate_scaled(this._d,this._L/2,0,10,this.no_data_message,this._b)},_X:function(){var c=this._k.background_colors;switch(true){case c instanceof Array:this._1K.apply(this,c);break;case typeof c==='string':this._1L(c);break;default:this._1M(this._k.background_image);break}},_1L:function(c){this._0.render_solid_background(this._j,this._y,c)},_1K:function(c,d){this._0.render_gradiated_background(this._j,this._y,c,d)},_1M:function(c){},_1e:function(){this._m=0;this._q={};this._k={};this._0.scale(this._b,this._b)},_2a:function(c){return this._b*c},_e:function(c){var d=c*this._b;return d},_Q:function(c,d){return(c>d)?d:c},_1f:function(c,d){return c>this.maximum_value},_1A:function(c,d){return c100){c/=10;d*=10}return Math.floor(c)*d},_1F:function(){var f=this._1N,g=this.klass.DATA_VALUES_INDEX;this._9.sort(function(c,d){return f(d[g])-f(c[g])});this._2.sort(function(c,d){return f(d[g])-f(c[g])})},_1N:function(d){var f=0;Bluff.each(d,function(c){f+=(c||0)});return f},_1B:function(){var g=[],h=this._5;while(h--)g[h]=0;Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){g[d]+=c},this);f[this.klass.DATA_VALUES_INDEX]=Bluff.array(g)},this)},_u:function(c){if(this.klass.DEBUG){this._0.fill='transparent';this._0.stroke='turquoise';c.call(this)}},_1z:function(){if(this._m0&&k>0){i.push(f);i.push(g)}else{i.push(this._1);i.push(this._g-1);i.push(f);i.push(g)}this._c(f,d);j=f;k=g},this);i.push(this._l);i.push(this._g-1);i.push(this._1);i.push(this._g-1);this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(i)},this)}});Bluff.BarConversion=new JS.Class({mode:null,zero:null,graph_top:null,graph_height:null,minimum_value:null,spread:null,getLeftYRightYscaled:function(c,d){var f;switch(this.mode){case 1:d[0]=this.graph_top+this.graph_height*(1-c)+1;d[1]=this.graph_top+this.graph_height-1;break;case 2:d[0]=this.graph_top+1;d[1]=this.graph_top+this.graph_height*(1-c)-1;break;case 3:f=c-this.minimum_value/this.spread;if(c>=this.zero){d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}else{d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}break;default:d[0]=0.0;d[1]=0.0}}});Bluff.Bar=new JS.Class(Bluff.Base,{bar_spacing:0.9,draw:function(){this.center_labels_over_point=(Bluff.keys(this.labels).length>this._5);this.callSuper();if(!this._a)return;this._1O()},_1O:function(){this._8=this._6/(this._5*this._2.length);var n=(this._8*(1-this.bar_spacing))/2;this._0.stroke_opacity=0.0;var m=new Bluff.BarConversion();m.graph_height=this._3;m.graph_top=this._7;if(this.minimum_value>=0){m.mode=1}else{if(this.maximum_value<=0){m.mode=2}else{m.mode=3;m.spread=this._i;m.minimum_value=this.minimum_value;m.zero=-this.minimum_value/this._i}}Bluff.each(this._9,function(j,k){var l=this._2[k][this.klass.DATA_VALUES_INDEX];Bluff.each(j[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*(k+d+((this._2.length-1)*d)))+n;var g=f+this._8*this.bar_spacing;var h=[];m.getLeftYRightYscaled(c,h);this._0.fill=j[this.klass.DATA_COLOR_INDEX];this._0.rectangle(f,h[0],g,h[1]);this._E(f,h[0],g-f,h[1]-h[0],j[this.klass.DATA_LABEL_INDEX],j[this.klass.DATA_COLOR_INDEX],l[d]);var i=this._1+(this._2.length*this._8*d)+(this._2.length*this._8/2.0);this._c(i-(this.center_labels_over_point?this._8/2.0:0.0),d)},this)},this);if(this.center_labels_over_point)this._c(this._l,this._5)}});Bluff.Line=new JS.Class(Bluff.Base,{baseline_value:null,baseline_color:null,line_width:null,dot_radius:null,hide_dots:null,hide_lines:null,initialize:function(c){if(arguments.length>3)throw'Wrong number of arguments';if(arguments.length===1||(typeof arguments[1]!=='number'&&typeof arguments[1]!=='string'))this.callSuper(c,null);else this.callSuper();this.hide_dots=this.hide_lines=false;this.baseline_color='red';this.baseline_value=null},draw:function(){this.callSuper();if(!this._a)return;this.x_increment=(this._5>1)?(this._6/(this._5-1)):this._6;var m;if(this._S!==undefined){m=this._7+(this._3-this._S*this._3);this._0.push();this._0.stroke=this.baseline_color;this._0.fill_opacity=0.0;this._0.stroke_width=3.0;this._0.line(this._1,m,this._1+this._6,m);this._0.pop()}Bluff.each(this._9,function(i,j){var k=null,l=null;var n=this._2[j][this.klass.DATA_VALUES_INDEX];this._1P=this._1Q(i);Bluff.each(i[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this.x_increment*d);if(typeof c!=='number')return;this._c(f,d);var g=this._7+(this._3-c*this._3);this._0.stroke=i[this.klass.DATA_COLOR_INDEX];this._0.fill=i[this.klass.DATA_COLOR_INDEX];this._0.stroke_opacity=1.0;this._0.stroke_width=this.line_width||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*6),3.0);var h=this.dot_radius||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*2),7.0);if(!this.hide_lines&&k!==null&&l!==null){this._0.line(k,l,f,g)}else if(this._1P){this._0.circle(f,g,f-h,g)}if(!this.hide_dots)this._0.circle(f,g,f-h,g);this._E(f-h,g-h,2*h,2*h,i[this.klass.DATA_LABEL_INDEX],i[this.klass.DATA_COLOR_INDEX],n[d]);k=f;l=g},this)},this)},_13:function(){this.maximum_value=Math.max(this.maximum_value,this.baseline_value);this.callSuper();if(this.baseline_value!==null)this._S=this.baseline_value/this.maximum_value},_1Q:function(d){var f=0;Bluff.each(d[this.klass.DATA_VALUES_INDEX],function(c){if(c!==undefined)f+=1});return f===1}});Bluff.Dot=new JS.Class(Bluff.Base,{draw:function(){this.has_left_labels=true;this.callSuper();if(!this._a)return;var k=1.0;this._F=this._3/this._5;this._18=this._F*k/this._9.length;this._0.stroke_opacity=0.0;var l=Bluff.array_new(this._5,0),n=Bluff.array_new(this._5,this._1),m=(this._F*(1-k))/2;Bluff.each(this._9,function(i,j){Bluff.each(i[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(c*this._6)-Math.round(this._18/6.0);var g=this._7+(this._F*d)+m+Math.round(this._18/2.0);if(j===0){this._0.stroke=this.marker_color;this._0.stroke_width=1.0;this._0.opacity=0.1;this._0.line(this._1,g,this._1+this._6,g)}this._0.fill=i[this.klass.DATA_COLOR_INDEX];this._0.stroke='transparent';this._0.circle(f,g,f+Math.round(this._18/3.0),g);var h=this._7+(this._F*d+this._F/2)+m;this._c(h,d)},this)},this)},_M:function(){if(this.hide_line_markers)return;this._0.stroke_antialias=false;this._0.stroke_width=1;var c=5;var d=this._17(this.maximum_value/c);for(var f=0;f<=c;f++){var g=(this._l-this._1)/c,h=this._l-(g*f)-1,i=f-c,j=Math.abs(i)*d;this._0.stroke=this.marker_color;this._0.line(h,this._g,h,this._g+0.5*this.klass.LABEL_MARGIN);if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='center';this._0.annotate_scaled(0,0,h,this._g+(this.klass.LABEL_MARGIN*2.0),j,this._b)}this._0.stroke_antialias=true}},_c:function(c,d){if(this.labels[d]&&!this._q[d]){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(1,1,this._1-this.klass.LABEL_MARGIN*2.0,c,this.labels[d],this._b);this._q[d]=true}}});Bluff.Net=new JS.Class(Bluff.Base,{hide_dots:null,line_width:null,dot_radius:null,initialize:function(){this.callSuper();this.hide_dots=false;this.hide_line_numbers=true},draw:function(){this.callSuper();if(!this._a)return;this._v=this._3/2.0;this._w=this._1+(this._6/2.0);this._x=this._7+(this._3/2.0)-10;this._R=this._6/(this._5-1);var s=this.dot_radius||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*2.5),7.0);this._0.stroke_opacity=1.0;this._0.stroke_width=this.line_width||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*4),3.0);var r;if(this._S!==undefined){r=this._7+(this._3-this._S*this._3);this._0.push();this._0.stroke_color=this.baseline_color;this._0.fill_opacity=0.0;this._0.stroke_width=5;this._0.line(this._1,r,this._1+this._6,r);this._0.pop()}Bluff.each(this._9,function(o){var p=null,q=null;Bluff.each(o[this.klass.DATA_VALUES_INDEX],function(c,d){if(c===undefined)return;var f=d*Math.PI*2/this._5,g=c*this._v,h=this._w+Math.sin(f)*g,i=this._x-Math.cos(f)*g,j=(d+10){this._0.fill=c[this.klass.DATA_COLOR_INDEX];var f=(c[this.klass.DATA_VALUES_INDEX][0]/o)*360;this._0.circle(n,m,n+k,m,p,p+f+0.5);var g=p+((p+f)-p)/2,h=Math.round((c[this.klass.DATA_VALUES_INDEX][0]/o)*100.0),i;if(h>=this.hide_labels_less_than){i=this._15(c[this.klass.DATA_VALUES_INDEX][0]);this._c(n,m,g,k+(k*this.klass.TEXT_OFFSET_PERCENTAGE),i)}p+=f}},this)},_c:function(c,d,f,g,h){var i=20.0,j=c,k=d,l=g+i,n=l*0.15,m=j+((l+n)*Math.cos(f*Math.PI/180)),o=k+(l*Math.sin(f*Math.PI/180));this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.marker_font_size);this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,m,o,h,this._b)},_1R:function(){var d=0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.SideBar=new JS.Class(Bluff.Base,{bar_spacing:0.9,draw:function(){this.has_left_labels=true;this.callSuper();if(!this._a)return;this._G=this._3/this._5;this._8=this._G*this.bar_spacing/this._9.length;this._0.stroke_opacity=0.0;var q=Bluff.array_new(this._5,0),s=Bluff.array_new(this._5,this._1),r=(this._G*(1-this.bar_spacing))/2;Bluff.each(this._9,function(m,o){var p=this._2[o][this.klass.DATA_VALUES_INDEX];Bluff.each(m[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-q[d]),g=this._1+this._6-q[d],h=g-f,i=s[d]-1,j=this._7+(this._G*d)+(this._8*o)+r,k=i+h,l=j+this._8;q[d]+=(c*this._6);this._0.stroke='transparent';this._0.fill=m[this.klass.DATA_COLOR_INDEX];this._0.rectangle(i,j,k,l);this._E(i,j,k-i,l-j,m[this.klass.DATA_LABEL_INDEX],m[this.klass.DATA_COLOR_INDEX],p[d]);var n=this._7+(this._G*d+this._G/2);this._c(n,d)},this)},this)},_M:function(){if(this.hide_line_markers)return;this._0.stroke_antialias=false;this._0.stroke_width=1;var c=5;var d=this._17(this.maximum_value/c),f,g,h,i;for(var j=0;j<=c;j++){f=(this._l-this._1)/c;g=this._l-(f*j)-1;h=j-c;i=Math.abs(h)*d;this._0.stroke=this.marker_color;this._0.line(g,this._g,g,this._7);if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='center';this._0.annotate_scaled(0,0,g,this._g+(this.klass.LABEL_MARGIN*2.0),i,this._b)}}},_c:function(c,d){if(this.labels[d]&&!this._q[d]){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(1,1,this._1-this.klass.LABEL_MARGIN*2.0,c,this.labels[d],this._b);this._q[d]=true}}});Bluff.Spider=new JS.Class(Bluff.Base,{hide_text:null,hide_axes:null,transparent_background:null,initialize:function(c,d,f){this.callSuper(c,f);this._1S=d;this.hide_legend=true},draw:function(){this.hide_line_markers=true;this.callSuper();if(!this._a)return;var c=this._3,d=this._3/2.0,f=this._1+(this._6-c)/2.0,g=this._1+(this._6/2.0),h=this._7+(this._3/2.0)-25;this._1T=d/this._1S;var i=this._1U(),j=0.0,k=(2*Math.PI)/this._2.length,l=0.0;if(!this.hide_axes)this._1V(g,h,d,k);this._1W(g,h,k)},_1n:function(c){return c*this._1T},_c:function(c,d,f,g,h){var i=50,j=c,k=d+0,l=j+((g+i)*Math.cos(f)),n=k+((g+i)*Math.sin(f));this._0.fill=this.marker_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,l,n,h,this._b)},_1V:function(g,h,i,j,k){if(this.hide_axes)return;var l=0.0;Bluff.each(this._2,function(c){this._0.stroke=k||c[this.klass.DATA_COLOR_INDEX];this._0.stroke_width=5.0;var d=i*Math.cos(l);var f=i*Math.sin(l);this._0.line(g,h,g+d,h+f);if(!this.hide_text)this._c(g,h,l,i,c[this.klass.DATA_LABEL_INDEX]);l+=j},this)},_1W:function(d,f,g,h){var i=[],j=0.0;Bluff.each(this._2,function(c){i.push(d+this._1n(c[this.klass.DATA_VALUES_INDEX][0])*Math.cos(j));i.push(f+this._1n(c[this.klass.DATA_VALUES_INDEX][0])*Math.sin(j));j+=g},this);this._0.stroke_width=1.0;this._0.stroke=h||this.marker_color;this._0.fill=h||this.marker_color;this._0.fill_opacity=0.4;this._0.polyline(i)},_1U:function(){var d=0.0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.Base.StackedMixin=new JS.Module({_19:function(){var g={};Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){if(!g[d])g[d]=0.0;g[d]+=c},this)},this);for(var h in g){if(g[h]>this.maximum_value)this.maximum_value=g[h]}this.minimum_value=0}});Bluff.StackedArea=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,last_series_goes_on_bottom:null,draw:function(){this._19();this.callSuper();if(!this._a)return;this._R=this._6/(this._5-1);this._0.stroke='transparent';var n=Bluff.array_new(this._5,0);var m=null;var o=this.last_series_goes_on_bottom?'reverse_each':'each';Bluff[o](this._9,function(h){var i=m;m=[];Bluff.each(h[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._R*d);var g=this._7+(this._3-c*this._3-n[d]);n[d]+=(c*this._3);m.push(f);m.push(g);this._c(f,d)},this);var j,k,l;if(i){j=Bluff.array(m);for(k=i.length/2-1;k>=0;k--){j.push(i[2*k]);j.push(i[2*k+1])}j.push(m[0]);j.push(m[1])}else{j=Bluff.array(m);j.push(this._l);j.push(this._g-1);j.push(this._1);j.push(this._g-1);j.push(m[0]);j.push(m[1])}this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(j)},this)}});Bluff.StackedBar=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,bar_spacing:0.9,draw:function(){this._19();this.callSuper();if(!this._a)return;this._8=this._6/this._5;var m=(this._8*(1-this.bar_spacing))/2;this._0.stroke_opacity=0.0;var o=Bluff.array_new(this._5,0);Bluff.each(this._9,function(k,l){var n=this._2[l][this.klass.DATA_VALUES_INDEX];Bluff.each(k[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*d)+(this._8*this.bar_spacing/2.0);this._c(f,d);if(c==0)return;var g=this._1+(this._8*d)+m;var h=this._7+(this._3-c*this._3-o[d])+1;var i=g+this._8*this.bar_spacing;var j=this._7+this._3-o[d]-1;o[d]+=(c*this._3);this._0.fill=k[this.klass.DATA_COLOR_INDEX];this._0.rectangle(g,h,i,j);this._E(g,h,i-g,j-h,k[this.klass.DATA_LABEL_INDEX],k[this.klass.DATA_COLOR_INDEX],n[d])},this)},this)}});Bluff.AccumulatorBar=new JS.Class(Bluff.StackedBar,{draw:function(){if(this._2.length!==1)throw'Incorrect number of datasets';var g=[],h=0,i=[];Bluff.each(this._2[0][this.klass.DATA_VALUES_INDEX],function(d){var f=-Infinity;Bluff.each(i,function(c){f=Math.max(f,c)});i.push((h>0)?(d+f):d);g.push(i[h]-d);h+=1},this);this.data("Accumulator",g);this.callSuper()}});Bluff.SideStackedBar=new JS.Class(Bluff.SideBar,{include:Bluff.Base.StackedMixin,bar_spacing:0.9,draw:function(){this.has_left_labels=true;this._19();this.callSuper();if(!this._a)return;this._8=this._3/this._5;var q=Bluff.array_new(this._5,0),s=Bluff.array_new(this._5,this._1),r=(this._8*(1-this.bar_spacing))/2;Bluff.each(this._9,function(m,o){this._0.fill=m[this.klass.DATA_COLOR_INDEX];var p=this._2[o][this.klass.DATA_VALUES_INDEX];Bluff.each(m[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-q[d])+1;var g=this._1+this._6-q[d]-1;var h=g-f;var i=s[d],j=this._7+(this._8*d)+r,k=i+h,l=j+this._8*this.bar_spacing;s[d]+=h;q[d]+=(c*this._6-2);this._0.rectangle(i,j,k,l);this._E(i,j,k-i,l-j,m[this.klass.DATA_LABEL_INDEX],m[this.klass.DATA_COLOR_INDEX],p[d]);var n=this._7+(this._8*d)+(this._8*this.bar_spacing/2.0);this._c(n,d)},this)},this)},_1f:function(c,d){d=d||0;return this._1m(c,d)>this.maximum_value},_1m:function(d,f){var g=0;Bluff.each(this._2,function(c){g+=c[this.klass.DATA_VALUES_INDEX][f]},this);return g}});Bluff.Mini.Legend=new JS.Module({hide_mini_legend:false,_1a:function(){if(this.hide_mini_legend)return;this._1X=this._L;this._y+=this._2.length*this._D(this._e(this.legend_font_size))*1.7;this._X()},_1b:function(){if(this.hide_mini_legend)return;this._P=Bluff.map(this._2,function(c){return c[this.klass.DATA_LABEL_INDEX]},this);var f=40.0,g=10.0,h=100.0,i=40.0;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var j=h,k=this._1X+i;this._u(function(){this._0.line(0.0,k,this._d,k)});Bluff.each(this._P,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._d,1.0,j+(f*1.7),k,this._1Y(c),this._b);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(j,k-f/2.0,j+f,k+f/2.0);k+=this._D(this.legend_font_size)*1.7},this);this._m=0},_1Y:function(c){var d=String(c);while(this._O(this._e(this.legend_font_size),d)>(this._j-this.legend_left_margin-this.right_margin)&&(d.length>1))d=d.substr(0,d.length-1);return d+(d.length=1?(c*i):1;var k=(d*i)>=1?(d*i):1;var h=this._T(this.pointsize,h);h.style.color=this.fill;h.style.fontWeight=this.font_weight;h.style.textAlign='center';h.style.left=(this._f*f+this._1Z(h,j))+'px';h.style.top=(this._h*g+this._20(h,k))+'px'},tooltip:function(d,f,g,h,i,j,k){if(g<0)d+=g;if(h<0)f+=h;var l=this._n.parentNode,n=document.createElement('div');n.className=this.klass.TARGET_CLASS;n.style.position='absolute';n.style.left=(this._f*d-3)+'px';n.style.top=(this._h*f-3)+'px';n.style.width=(this._f*Math.abs(g)+5)+'px';n.style.height=(this._h*Math.abs(h)+5)+'px';n.style.fontSize=0;n.style.overflow='hidden';Bluff.Event.observe(n,'mouseover',function(c){Bluff.Tooltip.show(i,j,k)});Bluff.Event.observe(n,'mouseout',function(c){Bluff.Tooltip.hide()});l.appendChild(n)},circle:function(c,d,f,g,h,i){var j=Math.sqrt(Math.pow(f-c,2)+Math.pow(g-d,2));this._4.fillStyle=this.fill;this._4.beginPath();var k=(h||0)*Math.PI/180;var l=(i||360)*Math.PI/180;if(h!==undefined&&i!==undefined){this._4.moveTo(this._f*(c+j*Math.cos(l)),this._h*(d+j*Math.sin(l)));this._4.lineTo(this._f*c,this._h*d);this._4.lineTo(this._f*(c+j*Math.cos(k)),this._h*(d+j*Math.sin(k)))}this._4.arc(this._f*c,this._h*d,this._f*j,k,l,false);this._4.fill()},line:function(c,d,f,g){this._4.strokeStyle=this.stroke;this._4.lineWidth=this.stroke_width;this._4.beginPath();this._4.moveTo(this._f*c,this._h*d);this._4.lineTo(this._f*f,this._h*g);this._4.stroke()},polyline:function(c){this._4.fillStyle=this.fill;this._4.globalAlpha=this.fill_opacity||1;try{this._4.strokeStyle=this.stroke}catch(e){}var d=c.shift(),f=c.shift();this._4.beginPath();this._4.moveTo(this._f*d,this._h*f);while(c.length>0){d=c.shift();f=c.shift();this._4.lineTo(this._f*d,this._h*f)}this._4.fill()},rectangle:function(c,d,f,g){var h;if(c>f){h=c;c=f;f=h}if(d>g){h=d;d=g;g=h}try{this._4.fillStyle=this.fill;this._4.fillRect(this._f*c,this._h*d,this._f*(f-c),this._h*(g-d))}catch(e){}try{this._4.strokeStyle=this.stroke;if(this.stroke!=='transparent')this._4.strokeRect(this._f*c,this._h*d,this._f*(f-c),this._h*(g-d))}catch(e){}},_1Z:function(c,d){var f=this._H(c).width;switch(this.gravity){case'west':return 0;case'east':return d-f;case'north':case'south':case'center':return(d-f)/2}},_20:function(c,d){var f=this._H(c).height;switch(this.gravity){case'north':return 0;case'south':return d-f;case'west':case'east':case'center':return(d-f)/2}},_1o:function(){var c=this._n.parentNode;if(c.className===this.klass.WRAPPER_CLASS)return c;c=document.createElement('div');c.className=this.klass.WRAPPER_CLASS;c.style.position='relative';c.style.border='none';c.style.padding='0 0 0 0';this._n.parentNode.insertBefore(c,this._n);c.appendChild(this._n);return c},_T:function(c,d){var f=this._21(d);f.style.fontFamily=this.font;f.style.fontSize=(typeof c==='number')?c+'px':c;return f},_21:function(c){var d=document.createElement('div');d.className=this.klass.TEXT_CLASS;d.style.position='absolute';d.appendChild(document.createTextNode(c));this._1o().appendChild(d);return d},_U:function(c){c.parentNode.removeChild(c);if(c.className===this.klass.TARGET_CLASS)Bluff.Event.stopObserving(c)},_H:function(c){var d=c.style.display;return(d&&d!=='none')?{width:c.offsetWidth,height:c.offsetHeight}:{width:c.clientWidth,height:c.clientHeight}}});Bluff.Event={_V:[],_1p:(window.attachEvent&&navigator.userAgent.indexOf('Opera')===-1),observe:function(d,f,g,h){var i=Bluff.map(this._1q(d,f),function(c){return c._22});if(Bluff.index(i,g)!==-1)return;var j=function(c){g.call(h||null,d,Bluff.Event._23(c))};this._V.push({_W:d,_1c:f,_22:g,_1r:j});if(d.addEventListener)d.addEventListener(f,j,false);else d.attachEvent('on'+f,j)},stopObserving:function(d){var f=d?this._1q(d):this._V;Bluff.each(f,function(c){if(c._W.removeEventListener)c._W.removeEventListener(c._1c,c._1r,false);else c._W.detachEvent('on'+c._1c,c._1r)})},_1q:function(d,f){var g=[];Bluff.each(this._V,function(c){if(d&&c._W!==d)return;if(f&&c._1c!==f)return;g.push(c)});return g},_23:function(c){if(!this._1p)return c;if(!c)return false;if(c._24)return c;c._24=true;var d=this._25(c);c.target=c.srcElement;c.pageX=d.x;c.pageY=d.y;return c},_25:function(c){var d=document.documentElement,f=document.body||{scrollLeft:0,scrollTop:0};return{x:c.pageX||(c.clientX+(d.scrollLeft||f.scrollLeft)-(d.clientLeft||0)),y:c.pageY||(c.clientY+(d.scrollTop||f.scrollTop)-(d.clientTop||0))}}};if(Bluff.Event._1p)window.attachEvent('onunload',function(){Bluff.Event.stopObserving();Bluff.Event._V=null});if(navigator.userAgent.indexOf('AppleWebKit/')>-1)window.addEventListener('unload',function(){},false);Bluff.Tooltip=new JS.Singleton({LEFT_OFFSET:20,TOP_OFFSET:-6,DATA_LENGTH:8,CLASS_NAME:'bluff-tooltip',setup:function(){this._o=document.createElement('div');this._o.className=this.CLASS_NAME;this._o.style.position='absolute';this.hide();document.body.appendChild(this._o);Bluff.Event.observe(document.body,'mousemove',function(c,d){this._o.style.left=(d.pageX+this.LEFT_OFFSET)+'px';this._o.style.top=(d.pageY+this.TOP_OFFSET)+'px'},this)},show:function(c,d,f){f=Number(String(f).substr(0,this.DATA_LENGTH));this._o.innerHTML='  '+c+' '+f+'';this._o.style.display=''},hide:function(){this._o.style.display='none'}});Bluff.Event.observe(window,'load',Bluff.Tooltip.method('setup'));Bluff.TableReader=new JS.Class({NUMBER_FORMAT:/\-?(0|[1-9]\d*)(\.\d+)?(e[\+\-]?\d+)?/i,initialize:function(c,d){this._26=(typeof c==='string')?document.getElementById(c):c;this._1s=!!d},get_data:function(){if(!this._2)this._1t();return this._2},get_labels:function(){if(!this._1d)this._1t();return this._1d},get_title:function(){return this._27},get_series:function(c){if(this._2[c])return this._2[c];return this._2[c]={points:[]}},_1t:function(){this._I=this._p=0;this._J=this._K=0;this._2=[];this._1d={};this._s=[];this._t=[];this._1u(this._26);if((this._s.length>1&&this._t.length===1)||this._s.length]+>/gi,'')},extend:{Mixin:new JS.Module({data_from_table:function(d,f){var g=new Bluff.TableReader(d,f),h=g.get_data();Bluff.each(h,function(c){this.data(c.name,c.points)},this);this.labels=g.get_labels();this.title=g.get_title()||this.title}})}});Bluff.Base.include(Bluff.TableReader.Mixin); \ No newline at end of file diff --git a/mapgenerator/scripts/bluff-src.js b/mapgenerator/scripts/bluff-src.js deleted file mode 100644 index 1f6d8b6..0000000 --- a/mapgenerator/scripts/bluff-src.js +++ /dev/null @@ -1,2833 +0,0 @@ -Bluff = { - // This is the version of Bluff you are using. - VERSION: '0.3.6', - - array: function(list) { - if (list.length === undefined) return [list]; - var ary = [], i = list.length; - while (i--) ary[i] = list[i]; - return ary; - }, - - array_new: function(length, filler) { - var ary = []; - while (length--) ary.push(filler); - return ary; - }, - - each: function(list, block, context) { - for (var i = 0, n = list.length; i < n; i++) { - block.call(context || null, list[i], i); - } - }, - - index: function(list, needle) { - for (var i = 0, n = list.length; i < n; i++) { - if (list[i] === needle) return i; - } - return -1; - }, - - keys: function(object) { - var ary = [], key; - for (key in object) ary.push(key); - return ary; - }, - - map: function(list, block, context) { - var results = []; - this.each(list, function(item) { - results.push(block.call(context || null, item)); - }); - return results; - }, - - reverse_each: function(list, block, context) { - var i = list.length; - while (i--) block.call(context || null, list[i], i); - }, - - sum: function(list) { - var sum = 0, i = list.length; - while (i--) sum += list[i]; - return sum; - }, - - Mini: {} -}; - -Bluff.Base = new JS.Class({ - extend: { - // Draw extra lines showing where the margins and text centers are - DEBUG: false, - - // Used for navigating the array of data to plot - DATA_LABEL_INDEX: 0, - DATA_VALUES_INDEX: 1, - DATA_COLOR_INDEX: 2, - - // Space around text elements. Mostly used for vertical spacing - LEGEND_MARGIN: 20, - TITLE_MARGIN: 20, - LABEL_MARGIN: 10, - DEFAULT_MARGIN: 20, - - DEFAULT_TARGET_WIDTH: 800, - - THOUSAND_SEPARATOR: ',' - }, - - // Blank space above the graph - top_margin: null, - - // Blank space below the graph - bottom_margin: null, - - // Blank space to the right of the graph - right_margin: null, - - // Blank space to the left of the graph - left_margin: null, - - // Blank space below the title - title_margin: null, - - // Blank space below the legend - legend_margin: null, - - // A hash of names for the individual columns, where the key is the array - // index for the column this label represents. - // - // Not all columns need to be named. - // - // Example: {0: 2005, 3: 2006, 5: 2007, 7: 2008} - labels: null, - - // Used internally for spacing. - // - // By default, labels are centered over the point they represent. - center_labels_over_point: null, - - // Used internally for horizontal graph types. - has_left_labels: null, - - // A label for the bottom of the graph - x_axis_label: null, - - // A label for the left side of the graph - y_axis_label: null, - - // x_axis_increment: null, - - // Manually set increment of the horizontal marking lines - y_axis_increment: null, - - // Get or set the list of colors that will be used to draw the bars or lines. - colors: null, - - // The large title of the graph displayed at the top - title: null, - - // Font used for titles, labels, etc. - font: null, - - font_color: null, - - // Prevent drawing of line markers - hide_line_markers: null, - - // Prevent drawing of the legend - hide_legend: null, - - // Prevent drawing of the title - hide_title: null, - - // Prevent drawing of line numbers - hide_line_numbers: null, - - // Message shown when there is no data. Fits up to 20 characters. Defaults - // to "No Data." - no_data_message: null, - - // The font size of the large title at the top of the graph - title_font_size: null, - - // Optionally set the size of the font. Based on an 800x600px graph. - // Default is 20. - // - // Will be scaled down if graph is smaller than 800px wide. - legend_font_size: null, - - // The font size of the labels around the graph - marker_font_size: null, - - // The color of the auxiliary lines - marker_color: null, - - // The number of horizontal lines shown for reference - marker_count: null, - - // You can manually set a minimum value instead of having the values - // guessed for you. - // - // Set it after you have given all your data to the graph object. - minimum_value: null, - - // You can manually set a maximum value, such as a percentage-based graph - // that always goes to 100. - // - // If you use this, you must set it after you have given all your data to - // the graph object. - maximum_value: null, - - // Set to false if you don't want the data to be sorted with largest avg - // values at the back. - sort: null, - - // Experimental - additional_line_values: null, - - // Experimental - stacked: null, - - // Optionally set the size of the colored box by each item in the legend. - // Default is 20.0 - // - // Will be scaled down if graph is smaller than 800px wide. - legend_box_size: null, - - // Set to true to enable tooltip displays - tooltips: false, - - // If one numerical argument is given, the graph is drawn at 4/3 ratio - // according to the given width (800 results in 800x600, 400 gives 400x300, - // etc.). - // - // Or, send a geometry string for other ratios ('800x400', '400x225'). - initialize: function(renderer, target_width) { - this._d = new Bluff.Renderer(renderer); - target_width = target_width || this.klass.DEFAULT_TARGET_WIDTH; - - var geo; - - if (typeof target_width !== 'number') { - geo = target_width.split('x'); - this._columns = parseFloat(geo[0]); - this._rows = parseFloat(geo[1]); - } else { - this._columns = parseFloat(target_width); - this._rows = this._columns * 0.75; - } - - this.initialize_ivars(); - - this._reset_themes(); - this.theme_keynote(); - }, - - // Set instance variables for this object. - // - // Subclasses can override this, call super, then set values separately. - // - // This makes it possible to set defaults in a subclass but still allow - // developers to change this values in their program. - initialize_ivars: function() { - // Internal for calculations - this._raw_columns = 800; - this._raw_rows = 800 * (this._rows/this._columns); - this._column_count = 0; - this.marker_count = null; - this.maximum_value = this.minimum_value = null; - this._has_data = false; - this._data = []; - this.labels = {}; - this._labels_seen = {}; - this.sort = true; - this.title = null; - - this._scale = this._columns / this._raw_columns; - - this.marker_font_size = 21.0; - this.legend_font_size = 20.0; - this.title_font_size = 36.0; - - this.top_margin = this.bottom_margin = - this.left_margin = this.right_margin = this.klass.DEFAULT_MARGIN; - - this.legend_margin = this.klass.LEGEND_MARGIN; - this.title_margin = this.klass.TITLE_MARGIN; - - this.legend_box_size = 20.0; - - this.no_data_message = "No Data"; - - this.hide_line_markers = this.hide_legend = this.hide_title = this.hide_line_numbers = false; - this.center_labels_over_point = true; - this.has_left_labels = false; - - this.additional_line_values = []; - this._additional_line_colors = []; - this._theme_options = {}; - - this.x_axis_label = this.y_axis_label = null; - this.y_axis_increment = null; - this.stacked = null; - this._norm_data = null; - }, - - // Sets the top, bottom, left and right margins to +margin+. - set_margins: function(margin) { - this.top_margin = this.left_margin = this.right_margin = this.bottom_margin = margin; - }, - - // Sets the font for graph text to the font at +font_path+. - set_font: function(font_path) { - this.font = font_path; - this._d.font = this.font; - }, - - // Add a color to the list of available colors for lines. - // - // Example: - // add_color('#c0e9d3') - add_color: function(colorname) { - this.colors.push(colorname); - }, - - // Replace the entire color list with a new array of colors. Also - // aliased as the colors= setter method. - // - // If you specify fewer colors than the number of datasets you intend - // to draw, 'increment_color' will cycle through the array, reusing - // colors as needed. - // - // Note that (as with the 'set_theme' method), you should set up the color - // list before you send your data (via the 'data' method). Calls to the - // 'data' method made prior to this call will use whatever color scheme - // was in place at the time data was called. - // - // Example: - // replace_colors ['#cc99cc', '#d9e043', '#34d8a2'] - replace_colors: function(color_list) { - this.colors = color_list || []; - this._color_index = 0; - }, - - // You can set a theme manually. Assign a hash to this method before you - // send your data. - // - // graph.set_theme({ - // colors: ['orange', 'purple', 'green', 'white', 'red'], - // marker_color: 'blue', - // background_colors: ['black', 'grey'] - // }) - // - // background_image: 'squirrel.png' is also possible. - // - // (Or hopefully something better looking than that.) - // - set_theme: function(options) { - this._reset_themes(); - - this._theme_options = { - colors: ['black', 'white'], - additional_line_colors: [], - marker_color: 'white', - font_color: 'black', - background_colors: null, - background_image: null - }; - for (var key in options) this._theme_options[key] = options[key]; - - this.colors = this._theme_options.colors; - this.marker_color = this._theme_options.marker_color; - this.font_color = this._theme_options.font_color || this.marker_color; - this._additional_line_colors = this._theme_options.additional_line_colors; - - this._render_background(); - }, - - // A color scheme similar to the popular presentation software. - theme_keynote: function() { - // Colors - this._blue = '#6886B4'; - this._yellow = '#FDD84E'; - this._green = '#72AE6E'; - this._red = '#D1695E'; - this._purple = '#8A6EAF'; - this._orange = '#EFAA43'; - this._white = 'white'; - this.colors = [this._yellow, this._blue, this._green, this._red, this._purple, this._orange, this._white]; - - this.set_theme({ - colors: this.colors, - marker_color: 'white', - font_color: 'white', - background_colors: ['black', '#4a465a'] - }); - }, - - // A color scheme plucked from the colors on the popular usability blog. - theme_37signals: function() { - // Colors - this._green = '#339933'; - this._purple = '#cc99cc'; - this._blue = '#336699'; - this._yellow = '#FFF804'; - this._red = '#ff0000'; - this._orange = '#cf5910'; - this._black = 'black'; - this.colors = [this._yellow, this._blue, this._green, this._red, this._purple, this._orange, this._black]; - - this.set_theme({ - colors: this.colors, - marker_color: 'black', - font_color: 'black', - background_colors: ['#d1edf5', 'white'] - }); - }, - - // A color scheme from the colors used on the 2005 Rails keynote - // presentation at RubyConf. - theme_rails_keynote: function() { - // Colors - this._green = '#00ff00'; - this._grey = '#333333'; - this._orange = '#ff5d00'; - this._red = '#f61100'; - this._white = 'white'; - this._light_grey = '#999999'; - this._black = 'black'; - this.colors = [this._green, this._grey, this._orange, this._red, this._white, this._light_grey, this._black]; - - this.set_theme({ - colors: this.colors, - marker_color: 'white', - font_color: 'white', - background_colors: ['#0083a3', '#0083a3'] - }); - }, - - // A color scheme similar to that used on the popular podcast site. - theme_odeo: function() { - // Colors - this._grey = '#202020'; - this._white = 'white'; - this._dark_pink = '#a21764'; - this._green = '#8ab438'; - this._light_grey = '#999999'; - this._dark_blue = '#3a5b87'; - this._black = 'black'; - this.colors = [this._grey, this._white, this._dark_blue, this._dark_pink, this._green, this._light_grey, this._black]; - - this.set_theme({ - colors: this.colors, - marker_color: 'white', - font_color: 'white', - background_colors: ['#ff47a4', '#ff1f81'] - }); - }, - - // A pastel theme - theme_pastel: function() { - // Colors - this.colors = [ - '#a9dada', // blue - '#aedaa9', // green - '#daaea9', // peach - '#dadaa9', // yellow - '#a9a9da', // dk purple - '#daaeda', // purple - '#dadada' // grey - ]; - - this.set_theme({ - colors: this.colors, - marker_color: '#aea9a9', // Grey - font_color: 'black', - background_colors: 'white' - }); - }, - - // A greyscale theme - theme_greyscale: function() { - // Colors - this.colors = [ - '#282828', // - '#383838', // - '#686868', // - '#989898', // - '#c8c8c8', // - '#e8e8e8' // - ]; - - this.set_theme({ - colors: this.colors, - marker_color: '#aea9a9', // Grey - font_color: 'black', - background_colors: 'white' - }); - }, - - // Parameters are an array where the first element is the name of the dataset - // and the value is an array of values to plot. - // - // Can be called multiple times with different datasets for a multi-valued - // graph. - // - // If the color argument is nil, the next color from the default theme will - // be used. - // - // NOTE: If you want to use a preset theme, you must set it before calling - // data(). - // - // Example: - // data("Bart S.", [95, 45, 78, 89, 88, 76], '#ffcc00') - data: function(name, data_points, color) { - data_points = (data_points === undefined) ? [] : data_points; - color = color || null; - - data_points = Bluff.array(data_points); // make sure it's an array - this._data.push([name, data_points, (color || this._increment_color())]); - // Set column count if this is larger than previous counts - this._column_count = (data_points.length > this._column_count) ? data_points.length : this._column_count; - - // Pre-normalize - Bluff.each(data_points, function(data_point, index) { - if (data_point === undefined) return; - - // Setup max/min so spread starts at the low end of the data points - if (this.maximum_value === null && this.minimum_value === null) - this.maximum_value = this.minimum_value = data_point; - - // TODO Doesn't work with stacked bar graphs - // Original: @maximum_value = _larger_than_max?(data_point, index) ? max(data_point, index) : @maximum_value - this.maximum_value = this._larger_than_max(data_point) ? data_point : this.maximum_value; - if (this.maximum_value >= 0) this._has_data = true; - - this.minimum_value = this._less_than_min(data_point) ? data_point : this.minimum_value; - if (this.minimum_value < 0) this._has_data = true; - }, this); - }, - - // Overridden by subclasses to do the actual plotting of the graph. - // - // Subclasses should start by calling super() for this method. - draw: function() { - if (this.stacked) this._make_stacked(); - this._setup_drawing(); - - this._debug(function() { - // Outer margin - this._d.rectangle(this.left_margin, this.top_margin, - this._raw_columns - this.right_margin, this._raw_rows - this.bottom_margin); - // Graph area box - this._d.rectangle(this._graph_left, this._graph_top, this._graph_right, this._graph_bottom); - }); - }, - - clear: function() { - this._render_background(); - }, - - // Calculates size of drawable area and draws the decorations. - // - // * line markers - // * legend - // * title - _setup_drawing: function() { - // Maybe should be done in one of the following functions for more granularity. - if (!this._has_data) return this._draw_no_data(); - - this._normalize(); - this._setup_graph_measurements(); - if (this.sort) this._sort_norm_data(); - - this._draw_legend(); - this._draw_line_markers(); - this._draw_axis_labels(); - this._draw_title(); - }, - - // Make copy of data with values scaled between 0-100 - _normalize: function(force) { - if (this._norm_data === null || force === true) { - this._norm_data = []; - if (!this._has_data) return; - - this._calculate_spread(); - - Bluff.each(this._data, function(data_row) { - var norm_data_points = []; - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point) { - if (data_point === null || data_point === undefined) - norm_data_points.push(null); - else - norm_data_points.push((data_point - this.minimum_value) / this._spread); - }, this); - this._norm_data.push([data_row[this.klass.DATA_LABEL_INDEX], norm_data_points, data_row[this.klass.DATA_COLOR_INDEX]]); - }, this); - } - }, - - _calculate_spread: function() { - this._spread = this.maximum_value - this.minimum_value; - this._spread = this._spread > 0 ? this._spread : 1; - this._significant_digits = 100/Math.pow(10,Math.round(Math.LOG10E*Math.log(this._spread))); - }, - - // Calculates size of drawable area, general font dimensions, etc. - _setup_graph_measurements: function() { - this._marker_caps_height = this.hide_line_markers ? 0 : - this._calculate_caps_height(this.marker_font_size); - this._title_caps_height = this.hide_title ? 0 : - this._calculate_caps_height(this.title_font_size); - this._legend_caps_height = this.hide_legend ? 0 : - this._calculate_caps_height(this.legend_font_size); - - var longest_label, - longest_left_label_width, - line_number_width, - last_label, - extra_room_for_long_label, - x_axis_label_height, - key; - - if (this.hide_line_markers) { - this._graph_left = this.left_margin; - this._graph_right_margin = this.right_margin; - this._graph_bottom_margin = this.bottom_margin; - } else { - longest_left_label_width = 0; - if (this.has_left_labels) { - longest_label = ''; - for (key in this.labels) { - longest_label = longest_label.length > this.labels[key].length - ? longest_label - : this.labels[key]; - } - longest_left_label_width = this._calculate_width(this.marker_font_size, longest_label) * 1.25; - } else { - longest_left_label_width = this._calculate_width(this.marker_font_size, this._label(this.maximum_value)); - } - - // Shift graph if left line numbers are hidden - line_number_width = this.hide_line_numbers && !this.has_left_labels ? - 0.0 : - longest_left_label_width + this.klass.LABEL_MARGIN * 2; - - this._graph_left = this.left_margin + - line_number_width + - (this.y_axis_label === null ? 0.0 : this._marker_caps_height + this.klass.LABEL_MARGIN * 2); - - // Make space for half the width of the rightmost column label. - // Might be greater than the number of columns if between-style bar markers are used. - last_label = -Infinity; - for (key in this.labels) - last_label = last_label > Number(key) ? last_label : Number(key); - last_label = Math.round(last_label); - extra_room_for_long_label = (last_label >= (this._column_count-1) && this.center_labels_over_point) ? - this._calculate_width(this.marker_font_size, this.labels[last_label]) / 2 : - 0; - this._graph_right_margin = this.right_margin + extra_room_for_long_label; - - this._graph_bottom_margin = this.bottom_margin + - this._marker_caps_height + this.klass.LABEL_MARGIN; - } - - this._graph_right = this._raw_columns - this._graph_right_margin; - this._graph_width = this._raw_columns - this._graph_left - this._graph_right_margin; - - // When hide_title, leave a title_margin space for aesthetics. - // Same with hide_legend - this._graph_top = this.top_margin + - (this.hide_title ? this.title_margin : this._title_caps_height + this.title_margin ) + - (this.hide_legend ? this.legend_margin : this._legend_caps_height + this.legend_margin); - - x_axis_label_height = (this.x_axis_label === null) ? 0.0 : - this._marker_caps_height + this.klass.LABEL_MARGIN; - this._graph_bottom = this._raw_rows - this._graph_bottom_margin - x_axis_label_height; - this._graph_height = this._graph_bottom - this._graph_top; - }, - - // Draw the optional labels for the x axis and y axis. - _draw_axis_labels: function() { - if (this.x_axis_label) { - // X Axis - // Centered vertically and horizontally by setting the - // height to 1.0 and the width to the width of the graph. - var x_axis_label_y_coordinate = this._graph_bottom + this.klass.LABEL_MARGIN * 2 + this._marker_caps_height; - - // TODO Center between graph area - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.stroke = 'transparent'; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.gravity = 'north'; - this._d.annotate_scaled( - this._raw_columns, 1.0, - 0.0, x_axis_label_y_coordinate, - this.x_axis_label, this._scale); - this._debug(function() { - this._d.line(0.0, x_axis_label_y_coordinate, this._raw_columns, x_axis_label_y_coordinate); - }); - } - - // TODO Y label (not generally possible in browsers) - }, - - // Draws horizontal background lines and labels - _draw_line_markers: function() { - if (this.hide_line_markers) return; - - if (this.y_axis_increment === null) { - // Try to use a number of horizontal lines that will come out even. - // - // TODO Do the same for larger numbers...100, 75, 50, 25 - if (this.marker_count === null) { - Bluff.each([3,4,5,6,7], function(lines) { - if (!this.marker_count && this._spread % lines === 0) - this.marker_count = lines; - }, this); - this.marker_count = this.marker_count || 4; - } - this._increment = (this._spread > 0) ? this._significant(this._spread / this.marker_count) : 1; - } else { - // TODO Make this work for negative values - this.maximum_value = Math.max(Math.ceil(this.maximum_value), this.y_axis_increment); - this.minimum_value = Math.floor(this.minimum_value); - this._calculate_spread(); - this._normalize(true); - - this.marker_count = Math.round(this._spread / this.y_axis_increment); - this._increment = this.y_axis_increment; - } - this._increment_scaled = this._graph_height / (this._spread / this._increment); - - // Draw horizontal line markers and annotate with numbers - var index, n, y, marker_label; - for (index = 0, n = this.marker_count; index <= n; index++) { - y = this._graph_top + this._graph_height - index * this._increment_scaled; - - this._d.stroke = this.marker_color; - this._d.stroke_width = 1; - this._d.line(this._graph_left, y, this._graph_right, y); - - marker_label = index * this._increment + this.minimum_value; - - if (!this.hide_line_numbers) { - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.font_weight = 'normal'; - this._d.stroke = 'transparent'; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.gravity = 'east'; - - // Vertically center with 1.0 for the height - this._d.annotate_scaled(this._graph_left - this.klass.LABEL_MARGIN, - 1.0, 0.0, y, - this._label(marker_label), this._scale); - } - } - }, - - _center: function(size) { - return (this._raw_columns - size) / 2; - }, - - // Draws a legend with the names of the datasets matched to the colors used - // to draw them. - _draw_legend: function() { - if (this.hide_legend) return; - - this._legend_labels = Bluff.map(this._data, function(item) { - return item[this.klass.DATA_LABEL_INDEX]; - }, this); - - var legend_square_width = this.legend_box_size; // small square with color of this item - - // May fix legend drawing problem at small sizes - if (this.font) this._d.font = this.font; - this._d.pointsize = this.legend_font_size; - - var label_widths = [[]]; // Used to calculate line wrap - Bluff.each(this._legend_labels, function(label) { - var last = label_widths.length - 1; - var metrics = this._d.get_type_metrics(label); - var label_width = metrics.width + legend_square_width * 2.7; - label_widths[last].push(label_width); - - if (Bluff.sum(label_widths[last]) > (this._raw_columns * 0.9)) - label_widths.push([label_widths[last].pop()]); - }, this); - - var current_x_offset = this._center(Bluff.sum(label_widths[0])); - var current_y_offset = this.hide_title ? - this.top_margin + this.title_margin : - this.top_margin + this.title_margin + this._title_caps_height; - - this._debug(function() { - this._d.stroke_width = 1; - this._d.line(0, current_y_offset, this._raw_columns, current_y_offset); - }); - - Bluff.each(this._legend_labels, function(legend_label, index) { - - // Draw label - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.pointsize = this._scale_fontsize(this.legend_font_size); - this._d.stroke = 'transparent'; - this._d.font_weight = 'normal'; - this._d.gravity = 'west'; - this._d.annotate_scaled(this._raw_columns, 1.0, - current_x_offset + (legend_square_width * 1.7), current_y_offset, - legend_label, this._scale); - - // Now draw box with color of this dataset - this._d.stroke = 'transparent'; - this._d.fill = this._data[index][this.klass.DATA_COLOR_INDEX]; - this._d.rectangle(current_x_offset, - current_y_offset - legend_square_width / 2.0, - current_x_offset + legend_square_width, - current_y_offset + legend_square_width / 2.0); - - this._d.pointsize = this.legend_font_size; - var metrics = this._d.get_type_metrics(legend_label); - var current_string_offset = metrics.width + (legend_square_width * 2.7), - line_height; - - // Handle wrapping - label_widths[0].shift(); - if (label_widths[0].length == 0) { - this._debug(function() { - this._d.line(0.0, current_y_offset, this._raw_columns, current_y_offset); - }); - - label_widths.shift(); - if (label_widths.length > 0) current_x_offset = this._center(Bluff.sum(label_widths[0])); - line_height = Math.max(this._legend_caps_height, legend_square_width) + this.legend_margin; - if (label_widths.length > 0) { - // Wrap to next line and shrink available graph dimensions - current_y_offset += line_height; - this._graph_top += line_height; - this._graph_height = this._graph_bottom - this._graph_top; - } - } else { - current_x_offset += current_string_offset; - } - }, this); - this._color_index = 0; - }, - - // Draws a title on the graph. - _draw_title: function() { - if (this.hide_title || !this.title) return; - - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.pointsize = this._scale_fontsize(this.title_font_size); - this._d.font_weight = 'bold'; - this._d.gravity = 'north'; - this._d.annotate_scaled(this._raw_columns, 1.0, - 0, this.top_margin, - this.title, this._scale); - }, - - // Draws column labels below graph, centered over x_offset - //-- - // TODO Allow WestGravity as an option - _draw_label: function(x_offset, index) { - if (this.hide_line_markers) return; - - var y_offset; - - if (this.labels[index] && !this._labels_seen[index]) { - y_offset = this._graph_bottom + this.klass.LABEL_MARGIN; - - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.stroke = 'transparent'; - this._d.font_weight = 'normal'; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.gravity = 'north'; - this._d.annotate_scaled(1.0, 1.0, - x_offset, y_offset, - this.labels[index], this._scale); - this._labels_seen[index] = true; - - this._debug(function() { - this._d.stroke_width = 1; - this._d.line(0.0, y_offset, this._raw_columns, y_offset); - }); - } - }, - - // Creates a mouse hover target rectangle for tooltip displays - _draw_tooltip: function(left, top, width, height, name, color, data) { - if (!this.tooltips) return; - this._d.tooltip(left, top, width, height, name, color, data); - }, - - // Shows an error message because you have no data. - _draw_no_data: function() { - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.stroke = 'transparent'; - this._d.font_weight = 'normal'; - this._d.pointsize = this._scale_fontsize(80); - this._d.gravity = 'center'; - this._d.annotate_scaled(this._raw_columns, this._raw_rows/2, - 0, 10, - this.no_data_message, this._scale); - }, - - // Finds the best background to render based on the provided theme options. - _render_background: function() { - var colors = this._theme_options.background_colors; - switch (true) { - case colors instanceof Array: - this._render_gradiated_background.apply(this, colors); - break; - case typeof colors === 'string': - this._render_solid_background(colors); - break; - default: - this._render_image_background(this._theme_options.background_image); - break; - } - }, - - // Make a new image at the current size with a solid +color+. - _render_solid_background: function(color) { - this._d.render_solid_background(this._columns, this._rows, color); - }, - - // Use with a theme definition method to draw a gradiated background. - _render_gradiated_background: function(top_color, bottom_color) { - this._d.render_gradiated_background(this._columns, this._rows, top_color, bottom_color); - }, - - // Use with a theme to use an image (800x600 original) background. - _render_image_background: function(image_path) { - // TODO - }, - - // Resets everything to defaults (except data). - _reset_themes: function() { - this._color_index = 0; - this._labels_seen = {}; - this._theme_options = {}; - this._d.scale(this._scale, this._scale); - }, - - _scale_value: function(value) { - return this._scale * value; - }, - - // Return a comparable fontsize for the current graph. - _scale_fontsize: function(value) { - var new_fontsize = value * this._scale; - return new_fontsize; - }, - - _clip_value_if_greater_than: function(value, max_value) { - return (value > max_value) ? max_value : value; - }, - - // Overridden by subclasses such as stacked bar. - _larger_than_max: function(data_point, index) { - return data_point > this.maximum_value; - }, - - _less_than_min: function(data_point, index) { - return data_point < this.minimum_value; - }, - - // Overridden by subclasses that need it. - _max: function(data_point, index) { - return data_point; - }, - - // Overridden by subclasses that need it. - _min: function(data_point, index) { - return data_point; - }, - - _significant: function(inc) { - if (inc == 0) return 1.0; - var factor = 1.0; - while (inc < 10) { - inc *= 10; - factor /= 10; - } - - while (inc > 100) { - inc /= 10; - factor *= 10; - } - - return Math.floor(inc) * factor; - }, - - // Sort with largest overall summed value at front of array so it shows up - // correctly in the drawn graph. - _sort_norm_data: function() { - var sums = this._sums, index = this.klass.DATA_VALUES_INDEX; - - this._norm_data.sort(function(a,b) { - return sums(b[index]) - sums(a[index]); - }); - - this._data.sort(function(a,b) { - return sums(b[index]) - sums(a[index]); - }); - }, - - _sums: function(data_set) { - var total_sum = 0; - Bluff.each(data_set, function(num) { total_sum += (num || 0) }); - return total_sum; - }, - - _make_stacked: function() { - var stacked_values = [], i = this._column_count; - while (i--) stacked_values[i] = 0; - Bluff.each(this._data, function(value_set) { - Bluff.each(value_set[this.klass.DATA_VALUES_INDEX], function(value, index) { - stacked_values[index] += value; - }, this); - value_set[this.klass.DATA_VALUES_INDEX] = Bluff.array(stacked_values); - }, this); - }, - - // Takes a block and draws it if DEBUG is true. - // - // Example: - // debug { @d.rectangle x1, y1, x2, y2 } - _debug: function(block) { - if (this.klass.DEBUG) { - this._d.fill = 'transparent'; - this._d.stroke = 'turquoise'; - block.call(this); - } - }, - - // Returns the next color in your color list. - _increment_color: function() { - if (this._color_index < this.colors.length) { - this._color_index += 1; - } else { - // Start over - this._color_index = 0; - } - // Return pre-incremented index element. - var offset = (this._color_index == 0) ? this.colors.length : this._color_index; - return this.colors[offset - 1]; - }, - - // Return a formatted string representing a number value that should be - // printed as a label. - _label: function(value) { - var sep = this.klass.THOUSAND_SEPARATOR, - label = (this._spread % this.marker_count == 0 || this.y_axis_increment !== null) - ? String(Math.round(value)) - : String(Math.floor(value * this._significant_digits)/this._significant_digits); - - var parts = label.split('.'); - parts[0] = parts[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1' + sep); - return parts.join('.'); - }, - - // Returns the height of the capital letter 'X' for the current font and - // size. - // - // Not scaled since it deals with dimensions that the regular scaling will - // handle. - _calculate_caps_height: function(font_size) { - return this._d.caps_height(font_size); - }, - - // Returns the width of a string at this pointsize. - // - // Not scaled since it deals with dimensions that the regular - // scaling will handle. - _calculate_width: function(font_size, text) { - return this._d.text_width(font_size, text); - } -}); - - -Bluff.Area = new JS.Class(Bluff.Base, { - - draw: function() { - this.callSuper(); - - if (!this._has_data) return; - - this._x_increment = this._graph_width / (this._column_count - 1); - this._d.stroke = 'transparent'; - - Bluff.each(this._norm_data, function(data_row) { - var poly_points = [], - prev_x = 0.0, - prev_y = 0.0; - - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, index) { - // Use incremented x and scaled y - var new_x = this._graph_left + (this._x_increment * index); - var new_y = this._graph_top + (this._graph_height - data_point * this._graph_height); - - if (prev_x > 0 && prev_y > 0) { - poly_points.push(new_x); - poly_points.push(new_y); - - // this._d.polyline(prev_x, prev_y, new_x, new_y); - } else { - poly_points.push(this._graph_left); - poly_points.push(this._graph_bottom - 1); - poly_points.push(new_x); - poly_points.push(new_y); - - // this._d.polyline(this._graph_left, this._graph_bottom, new_x, new_y); - } - - this._draw_label(new_x, index); - - prev_x = new_x; - prev_y = new_y; - }, this); - - // Add closing points, draw polygon - poly_points.push(this._graph_right); - poly_points.push(this._graph_bottom - 1); - poly_points.push(this._graph_left); - poly_points.push(this._graph_bottom - 1); - - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.polyline(poly_points); - - }, this); - } -}); - - -// This class perfoms the y coordinats conversion for the bar class. -// -// There are three cases: -// -// 1. Bars all go from zero in positive direction -// 2. Bars all go from zero to negative direction -// 3. Bars either go from zero to positive or from zero to negative -// -Bluff.BarConversion = new JS.Class({ - mode: null, - zero: null, - graph_top: null, - graph_height: null, - minimum_value: null, - spread: null, - - getLeftYRightYscaled: function(data_point, result) { - var val; - switch (this.mode) { - case 1: // Case one - // minimum value >= 0 ( only positiv values ) - result[0] = this.graph_top + this.graph_height*(1 - data_point) + 1; - result[1] = this.graph_top + this.graph_height - 1; - break; - case 2: // Case two - // only negativ values - result[0] = this.graph_top + 1; - result[1] = this.graph_top + this.graph_height*(1 - data_point) - 1; - break; - case 3: // Case three - // positiv and negativ values - val = data_point-this.minimum_value/this.spread; - if ( data_point >= this.zero ) { - result[0] = this.graph_top + this.graph_height*(1 - (val-this.zero)) + 1; - result[1] = this.graph_top + this.graph_height*(1 - this.zero) - 1; - } else { - result[0] = this.graph_top + this.graph_height*(1 - (val-this.zero)) + 1; - result[1] = this.graph_top + this.graph_height*(1 - this.zero) - 1; - } - break; - default: - result[0] = 0.0; - result[1] = 0.0; - } - } - -}); - - -Bluff.Bar = new JS.Class(Bluff.Base, { - - // Spacing factor applied between bars - bar_spacing: 0.9, - - draw: function() { - // Labels will be centered over the left of the bar if - // there are more labels than columns. This is basically the same - // as where it would be for a line graph. - this.center_labels_over_point = (Bluff.keys(this.labels).length > this._column_count); - - this.callSuper(); - if (!this._has_data) return; - - this._draw_bars(); - }, - - _draw_bars: function() { - this._bar_width = this._graph_width / (this._column_count * this._data.length); - var padding = (this._bar_width * (1 - this.bar_spacing)) / 2; - - this._d.stroke_opacity = 0.0; - - // Setup the BarConversion Object - var conversion = new Bluff.BarConversion(); - conversion.graph_height = this._graph_height; - conversion.graph_top = this._graph_top; - - // Set up the right mode [1,2,3] see BarConversion for further explanation - if (this.minimum_value >= 0) { - // all bars go from zero to positiv - conversion.mode = 1; - } else { - // all bars go from 0 to negativ - if (this.maximum_value <= 0) { - conversion.mode = 2; - } else { - // bars either go from zero to negativ or to positiv - conversion.mode = 3; - conversion.spread = this._spread; - conversion.minimum_value = this.minimum_value; - conversion.zero = -this.minimum_value/this._spread; - } - } - - // iterate over all normalised data - Bluff.each(this._norm_data, function(data_row, row_index) { - var raw_data = this._data[row_index][this.klass.DATA_VALUES_INDEX]; - - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, point_index) { - // Use incremented x and scaled y - // x - var left_x = this._graph_left + (this._bar_width * (row_index + point_index + ((this._data.length - 1) * point_index))) + padding; - var right_x = left_x + this._bar_width * this.bar_spacing; - // y - var conv = []; - conversion.getLeftYRightYscaled(data_point, conv); - - // create new bar - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.rectangle(left_x, conv[0], right_x, conv[1]); - - // create tooltip target - this._draw_tooltip(left_x, conv[0], - right_x - left_x, conv[1] - conv[0], - data_row[this.klass.DATA_LABEL_INDEX], - data_row[this.klass.DATA_COLOR_INDEX], - raw_data[point_index]); - - // Calculate center based on bar_width and current row - var label_center = this._graph_left + - (this._data.length * this._bar_width * point_index) + - (this._data.length * this._bar_width / 2.0); - // Subtract half a bar width to center left if requested - this._draw_label(label_center - (this.center_labels_over_point ? this._bar_width / 2.0 : 0.0), point_index); - }, this); - - }, this); - - // Draw the last label if requested - if (this.center_labels_over_point) this._draw_label(this._graph_right, this._column_count); - } -}); - - -// Here's how to make a Line graph: -// -// g = new Bluff.Line('canvasId'); -// g.title = "A Line Graph"; -// g.data('Fries', [20, 23, 19, 8]); -// g.data('Hamburgers', [50, 19, 99, 29]); -// g.draw(); -// -// There are also other options described below, such as #baseline_value, #baseline_color, #hide_dots, and #hide_lines. - -Bluff.Line = new JS.Class(Bluff.Base, { - // Draw a dashed line at the given value - baseline_value: null, - - // Color of the baseline - baseline_color: null, - - // Dimensions of lines and dots; calculated based on dataset size if left unspecified - line_width: null, - dot_radius: null, - - // Hide parts of the graph to fit more datapoints, or for a different appearance. - hide_dots: null, - hide_lines: null, - - // Call with target pixel width of graph (800, 400, 300), and/or 'false' to omit lines (points only). - // - // g = new Bluff.Line('canvasId', 400) // 400px wide with lines - // - // g = new Bluff.Line('canvasId', 400, false) // 400px wide, no lines (for backwards compatibility) - // - // g = new Bluff.Line('canvasId', false) // Defaults to 800px wide, no lines (for backwards compatibility) - // - // The preferred way is to call hide_dots or hide_lines instead. - initialize: function(renderer) { - if (arguments.length > 3) throw 'Wrong number of arguments'; - if (arguments.length === 1 || (typeof arguments[1] !== 'number' && typeof arguments[1] !== 'string')) - this.callSuper(renderer, null); - else - this.callSuper(); - - this.hide_dots = this.hide_lines = false; - this.baseline_color = 'red'; - this.baseline_value = null; - }, - - draw: function() { - this.callSuper(); - - if (!this._has_data) return; - - // Check to see if more than one datapoint was given. NaN can result otherwise. - this.x_increment = (this._column_count > 1) ? (this._graph_width / (this._column_count - 1)) : this._graph_width; - - var level; - - if (this._norm_baseline !== undefined) { - level = this._graph_top + (this._graph_height - this._norm_baseline * this._graph_height); - this._d.push(); - this._d.stroke = this.baseline_color; - this._d.fill_opacity = 0.0; - // this._d.stroke_dasharray(10, 20); - this._d.stroke_width = 3.0; - this._d.line(this._graph_left, level, this._graph_left + this._graph_width, level); - this._d.pop(); - } - - Bluff.each(this._norm_data, function(data_row, row_index) { - var prev_x = null, prev_y = null; - var raw_data = this._data[row_index][this.klass.DATA_VALUES_INDEX]; - - this._one_point = this._contains_one_point_only(data_row); - - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, index) { - var new_x = this._graph_left + (this.x_increment * index); - if (typeof data_point !== 'number') return; - - this._draw_label(new_x, index); - - var new_y = this._graph_top + (this._graph_height - data_point * this._graph_height); - - // Reset each time to avoid thin-line errors - this._d.stroke = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.stroke_opacity = 1.0; - this._d.stroke_width = this.line_width || - this._clip_value_if_greater_than(this._columns / (this._norm_data[0][this.klass.DATA_VALUES_INDEX].length * 6), 3.0); - - var circle_radius = this.dot_radius || - this._clip_value_if_greater_than(this._columns / (this._norm_data[0][this.klass.DATA_VALUES_INDEX].length * 2), 7.0); - - if (!this.hide_lines && prev_x !== null && prev_y !== null) { - this._d.line(prev_x, prev_y, new_x, new_y); - } else if (this._one_point) { - // Show a circle if there's just one point - this._d.circle(new_x, new_y, new_x - circle_radius, new_y); - } - - if (!this.hide_dots) this._d.circle(new_x, new_y, new_x - circle_radius, new_y); - - this._draw_tooltip(new_x - circle_radius, new_y - circle_radius, - 2 * circle_radius, 2 *circle_radius, - data_row[this.klass.DATA_LABEL_INDEX], - data_row[this.klass.DATA_COLOR_INDEX], - raw_data[index]); - - prev_x = new_x; - prev_y = new_y; - }, this); - }, this); - }, - - _normalize: function() { - this.maximum_value = Math.max(this.maximum_value, this.baseline_value); - this.callSuper(); - if (this.baseline_value !== null) this._norm_baseline = this.baseline_value / this.maximum_value; - }, - - _contains_one_point_only: function(data_row) { - // Spin through data to determine if there is just one value present. - var count = 0; - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point) { - if (data_point !== undefined) count += 1; - }); - return count === 1; - } -}); - - -// Graph with dots and labels along a vertical access -// see: 'Creating More Effective Graphs' by Robbins - -Bluff.Dot = new JS.Class(Bluff.Base, { - - draw: function() { - this.has_left_labels = true; - this.callSuper(); - - if (!this._has_data) return; - - // Setup spacing. - // - var spacing_factor = 1.0; - - this._items_width = this._graph_height / this._column_count; - this._item_width = this._items_width * spacing_factor / this._norm_data.length; - this._d.stroke_opacity = 0.0; - var height = Bluff.array_new(this._column_count, 0), - length = Bluff.array_new(this._column_count, this._graph_left), - padding = (this._items_width * (1 - spacing_factor)) / 2; - - Bluff.each(this._norm_data, function(data_row, row_index) { - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, point_index) { - - var x_pos = this._graph_left + (data_point * this._graph_width) - Math.round(this._item_width/6.0); - var y_pos = this._graph_top + (this._items_width * point_index) + padding + Math.round(this._item_width/2.0); - - if (row_index === 0) { - this._d.stroke = this.marker_color; - this._d.stroke_width = 1.0; - this._d.opacity = 0.1; - this._d.line(this._graph_left, y_pos, this._graph_left + this._graph_width, y_pos); - } - - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.stroke = 'transparent'; - this._d.circle(x_pos, y_pos, x_pos + Math.round(this._item_width/3.0), y_pos); - - // Calculate center based on item_width and current row - var label_center = this._graph_top + (this._items_width * point_index + this._items_width / 2) + padding; - this._draw_label(label_center, point_index); - }, this); - - }, this); - }, - - // Instead of base class version, draws vertical background lines and label - _draw_line_markers: function() { - - if (this.hide_line_markers) return; - - this._d.stroke_antialias = false; - - // Draw horizontal line markers and annotate with numbers - this._d.stroke_width = 1; - var number_of_lines = 5; - - // TODO Round maximum marker value to a round number like 100, 0.1, 0.5, etc. - var increment = this._significant(this.maximum_value / number_of_lines); - for (var index = 0; index <= number_of_lines; index++) { - - var line_diff = (this._graph_right - this._graph_left) / number_of_lines, - x = this._graph_right - (line_diff * index) - 1, - diff = index - number_of_lines, - marker_label = Math.abs(diff) * increment; - - this._d.stroke = this.marker_color; - this._d.line(x, this._graph_bottom, x, this._graph_bottom + 0.5 * this.klass.LABEL_MARGIN); - - if (!this.hide_line_numbers) { - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.stroke = 'transparent'; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.gravity = 'center'; - // TODO Center text over line - this._d.annotate_scaled(0, 0, // Width of box to draw text in - x, this._graph_bottom + (this.klass.LABEL_MARGIN * 2.0), // Coordinates of text - marker_label, this._scale); - } - this._d.stroke_antialias = true; - } - }, - - // Draw on the Y axis instead of the X - _draw_label: function(y_offset, index) { - if (this.labels[index] && !this._labels_seen[index]) { - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.stroke = 'transparent'; - this._d.font_weight = 'normal'; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.gravity = 'east'; - this._d.annotate_scaled(1, 1, - this._graph_left - this.klass.LABEL_MARGIN * 2.0, y_offset, - this.labels[index], this._scale); - this._labels_seen[index] = true; - } - } -}); - - -// Experimental!!! See also the Spider graph. -Bluff.Net = new JS.Class(Bluff.Base, { - - // Hide parts of the graph to fit more datapoints, or for a different appearance. - hide_dots: null, - - //Dimensions of lines and dots; calculated based on dataset size if left unspecified - line_width: null, - dot_radius: null, - - initialize: function() { - this.callSuper(); - - this.hide_dots = false; - this.hide_line_numbers = true; - }, - - draw: function() { - - this.callSuper(); - - if (!this._has_data) return; - - this._radius = this._graph_height / 2.0; - this._center_x = this._graph_left + (this._graph_width / 2.0); - this._center_y = this._graph_top + (this._graph_height / 2.0) - 10; // Move graph up a bit - - this._x_increment = this._graph_width / (this._column_count - 1); - var circle_radius = this.dot_radius || - this._clip_value_if_greater_than(this._columns / (this._norm_data[0][this.klass.DATA_VALUES_INDEX].length * 2.5), 7.0); - - this._d.stroke_opacity = 1.0; - this._d.stroke_width = this.line_width || - this._clip_value_if_greater_than(this._columns / (this._norm_data[0][this.klass.DATA_VALUES_INDEX].length * 4), 3.0); - - var level; - - if (this._norm_baseline !== undefined) { - level = this._graph_top + (this._graph_height - this._norm_baseline * this._graph_height); - this._d.push(); - this._d.stroke_color = this.baseline_color; - this._d.fill_opacity = 0.0; - // this._d.stroke_dasharray(10, 20); - this._d.stroke_width = 5; - this._d.line(this._graph_left, level, this._graph_left + this._graph_width, level); - this._d.pop(); - } - - Bluff.each(this._norm_data, function(data_row) { - var prev_x = null, prev_y = null; - - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, index) { - if (data_point === undefined) return; - - var rad_pos = index * Math.PI * 2 / this._column_count, - point_distance = data_point * this._radius, - start_x = this._center_x + Math.sin(rad_pos) * point_distance, - start_y = this._center_y - Math.cos(rad_pos) * point_distance, - - next_index = (index + 1 < data_row[this.klass.DATA_VALUES_INDEX].length) ? index + 1 : 0, - - next_rad_pos = next_index * Math.PI * 2 / this._column_count, - next_point_distance = data_row[this.klass.DATA_VALUES_INDEX][next_index] * this._radius, - end_x = this._center_x + Math.sin(next_rad_pos) * next_point_distance, - end_y = this._center_y - Math.cos(next_rad_pos) * next_point_distance; - - this._d.stroke = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.line(start_x, start_y, end_x, end_y); - - if (!this.hide_dots) this._d.circle(start_x, start_y, start_x - circle_radius, start_y); - }, this); - - }, this); - }, - - // the lines connecting in the center, with the first line vertical - _draw_line_markers: function() { - if (this.hide_line_markers) return; - - // have to do this here (AGAIN)... see draw() in this class - // because this funtion is called before the @radius, @center_x and @center_y are set - this._radius = this._graph_height / 2.0; - this._center_x = this._graph_left + (this._graph_width / 2.0); - this._center_y = this._graph_top + (this._graph_height / 2.0) - 10; // Move graph up a bit - - var rad_pos, marker_label; - - for (var index = 0, n = this._column_count; index < n; index++) { - rad_pos = index * Math.PI * 2 / this._column_count; - - // Draw horizontal line markers and annotate with numbers - this._d.stroke = this.marker_color; - this._d.stroke_width = 1; - - this._d.line(this._center_x, this._center_y, this._center_x + Math.sin(rad_pos) * this._radius, this._center_y - Math.cos(rad_pos) * this._radius); - - marker_label = labels[index] ? labels[index] : '000'; - - this._draw_label(this._center_x, this._center_y, rad_pos * 360 / (2 * Math.PI), this._radius, marker_label); - } - }, - - _draw_label: function(center_x, center_y, angle, radius, amount) { - var r_offset = 1.1, - x_offset = center_x, // + 15 // The label points need to be tweaked slightly - y_offset = center_y, // + 0 // This one doesn't though - rad_pos = angle * Math.PI / 180, - x = x_offset + (radius * r_offset * Math.sin(rad_pos)), - y = y_offset - (radius * r_offset * Math.cos(rad_pos)); - - // Draw label - this._d.fill = this.marker_color; - if (this.font) this._d.font = this.font; - this._d.pointsize = this._scale_fontsize(20); - this._d.stroke = 'transparent'; - this._d.font_weight = 'bold'; - this._d.gravity = 'center'; - this._d.annotate_scaled(0, 0, x, y, amount, this._scale); - } -}); - - -// Here's how to make a Pie graph: -// -// g = new Bluff.Pie('canvasId'); -// g.title = "Visual Pie Graph Test"; -// g.data('Fries', 20); -// g.data('Hamburgers', 50); -// g.draw(); -// -// To control where the pie chart starts creating slices, use #zero_degree. - -Bluff.Pie = new JS.Class(Bluff.Base, { - extend: { - TEXT_OFFSET_PERCENTAGE: 0.08 - }, - - // Can be used to make the pie start cutting slices at the top (-90.0) - // or at another angle. Default is 0.0, which starts at 3 o'clock. - zero_degreee: null, - - // Do not show labels for slices that are less than this percent. Use 0 to always show all labels. - hide_labels_less_than: null, - - initialize_ivars: function() { - this.callSuper(); - this.zero_degree = 0.0; - this.hide_labels_less_than = 0.0; - }, - - draw: function() { - this.hide_line_markers = true; - - this.callSuper(); - - if (!this._has_data) return; - - var diameter = this._graph_height, - radius = (Math.min(this._graph_width, this._graph_height) / 2.0) * 0.8, - top_x = this._graph_left + (this._graph_width - diameter) / 2.0, - center_x = this._graph_left + (this._graph_width / 2.0), - center_y = this._graph_top + (this._graph_height / 2.0) - 10, // Move graph up a bit - total_sum = this._sums_for_pie(), - prev_degrees = this.zero_degree, - index = this.klass.DATA_VALUES_INDEX; - - // Use full data since we can easily calculate percentages - if (this.sort) this._data.sort(function(a,b) { return a[index][0] - b[index][0]; }); - Bluff.each(this._data, function(data_row, i) { - if (data_row[this.klass.DATA_VALUES_INDEX][0] > 0) { - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - - var current_degrees = (data_row[this.klass.DATA_VALUES_INDEX][0] / total_sum) * 360; - - // Gruff uses ellipse() here, but canvas doesn't seem to support it. - // circle() is fine for our purposes here. - this._d.circle(center_x, center_y, - center_x + radius, center_y, - prev_degrees, prev_degrees + current_degrees + 0.5); // <= +0.5 'fudge factor' gets rid of the ugly gaps - - var half_angle = prev_degrees + ((prev_degrees + current_degrees) - prev_degrees) / 2, - label_val = Math.round((data_row[this.klass.DATA_VALUES_INDEX][0] / total_sum) * 100.0), - label_string; - - if (label_val >= this.hide_labels_less_than) { - label_string = this._label(data_row[this.klass.DATA_VALUES_INDEX][0]); - this._draw_label(center_x, center_y, half_angle, - radius + (radius * this.klass.TEXT_OFFSET_PERCENTAGE), - label_string); - } - - prev_degrees += current_degrees; - } - }, this); - - // TODO debug a circle where the text is drawn... - }, - - // Labels are drawn around a slightly wider ellipse to give room for - // labels on the left and right. - _draw_label: function(center_x, center_y, angle, radius, amount) { - // TODO Don't use so many hard-coded numbers - var r_offset = 20.0, // The distance out from the center of the pie to get point - x_offset = center_x, // + 15.0 # The label points need to be tweaked slightly - y_offset = center_y, // This one doesn't though - radius_offset = radius + r_offset, - ellipse_factor = radius_offset * 0.15, - x = x_offset + ((radius_offset + ellipse_factor) * Math.cos(angle * Math.PI/180)), - y = y_offset + (radius_offset * Math.sin(angle * Math.PI/180)); - - // Draw label - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.font_weight = 'bold'; - this._d.gravity = 'center'; - this._d.annotate_scaled(0,0, x,y, amount, this._scale); - }, - - _sums_for_pie: function() { - var total_sum = 0; - Bluff.each(this._data, function(data_row) { - total_sum += data_row[this.klass.DATA_VALUES_INDEX][0]; - }, this); - return total_sum; - } -}); - - -// Graph with individual horizontal bars instead of vertical bars. - -Bluff.SideBar = new JS.Class(Bluff.Base, { - - // Spacing factor applied between bars - bar_spacing: 0.9, - - draw: function() { - this.has_left_labels = true; - this.callSuper(); - - if (!this._has_data) return; - - this._bars_width = this._graph_height / this._column_count; - this._bar_width = this._bars_width * this.bar_spacing / this._norm_data.length; - this._d.stroke_opacity = 0.0; - var height = Bluff.array_new(this._column_count, 0), - length = Bluff.array_new(this._column_count, this._graph_left), - padding = (this._bars_width * (1 - this.bar_spacing)) / 2; - - Bluff.each(this._norm_data, function(data_row, row_index) { - var raw_data = this._data[row_index][this.klass.DATA_VALUES_INDEX]; - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, point_index) { - - // Using the original calcs from the stacked bar chart - // to get the difference between - // part of the bart chart we wish to stack. - var temp1 = this._graph_left + (this._graph_width - data_point * this._graph_width - height[point_index]), - temp2 = this._graph_left + this._graph_width - height[point_index], - difference = temp2 - temp1, - - left_x = length[point_index] - 1, - left_y = this._graph_top + (this._bars_width * point_index) + (this._bar_width * row_index) + padding, - right_x = left_x + difference, - right_y = left_y + this._bar_width; - - height[point_index] += (data_point * this._graph_width); - - this._d.stroke = 'transparent'; - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.rectangle(left_x, left_y, right_x, right_y); - - this._draw_tooltip(left_x, left_y, - right_x - left_x, right_y - left_y, - data_row[this.klass.DATA_LABEL_INDEX], - data_row[this.klass.DATA_COLOR_INDEX], - raw_data[point_index]); - - // Calculate center based on bar_width and current row - var label_center = this._graph_top + (this._bars_width * point_index + this._bars_width / 2); - this._draw_label(label_center, point_index); - }, this) - - }, this); - }, - - // Instead of base class version, draws vertical background lines and label - _draw_line_markers: function() { - - if (this.hide_line_markers) return; - - this._d.stroke_antialias = false; - - // Draw horizontal line markers and annotate with numbers - this._d.stroke_width = 1; - var number_of_lines = 5; - - // TODO Round maximum marker value to a round number like 100, 0.1, 0.5, etc. - var increment = this._significant(this.maximum_value / number_of_lines), - line_diff, x, diff, marker_label; - for (var index = 0; index <= number_of_lines; index++) { - - line_diff = (this._graph_right - this._graph_left) / number_of_lines; - x = this._graph_right - (line_diff * index) - 1; - diff = index - number_of_lines; - marker_label = Math.abs(diff) * increment; - - this._d.stroke = this.marker_color; - this._d.line(x, this._graph_bottom, x, this._graph_top); - - if (!this.hide_line_numbers) { - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.stroke = 'transparent'; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.gravity = 'center'; - // TODO Center text over line - this._d.annotate_scaled( - 0, 0, // Width of box to draw text in - x, this._graph_bottom + (this.klass.LABEL_MARGIN * 2.0), // Coordinates of text - marker_label, this._scale); - } - } - }, - - // Draw on the Y axis instead of the X - _draw_label: function(y_offset, index) { - if (this.labels[index] && !this._labels_seen[index]) { - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.stroke = 'transparent'; - this._d.font_weight = 'normal'; - this._d.pointsize = this._scale_fontsize(this.marker_font_size); - this._d.gravity = 'east'; - this._d.annotate_scaled(1, 1, - this._graph_left - this.klass.LABEL_MARGIN * 2.0, y_offset, - this.labels[index], this._scale); - this._labels_seen[index] = true; - } - } -}); - - -// Experimental!!! See also the Net graph. -// -// Submitted by Kevin Clark http://glu.ttono.us/ -Bluff.Spider = new JS.Class(Bluff.Base, { - - // Hide all text - hide_text: null, - hide_axes: null, - transparent_background: null, - - initialize: function(renderer, max_value, target_width) { - this.callSuper(renderer, target_width); - this._max_value = max_value; - this.hide_legend = true; - }, - - draw: function() { - this.hide_line_markers = true; - - this.callSuper(); - - if (!this._has_data) return; - - // Setup basic positioning - var diameter = this._graph_height, - radius = this._graph_height / 2.0, - top_x = this._graph_left + (this._graph_width - diameter) / 2.0, - center_x = this._graph_left + (this._graph_width / 2.0), - center_y = this._graph_top + (this._graph_height / 2.0) - 25; // Move graph up a bit - - this._unit_length = radius / this._max_value; - - var total_sum = this._sums_for_spider(), - prev_degrees = 0.0, - additive_angle = (2 * Math.PI) / this._data.length, - - current_angle = 0.0; - - // Draw axes - if (!this.hide_axes) this._draw_axes(center_x, center_y, radius, additive_angle); - - // Draw polygon - this._draw_polygon(center_x, center_y, additive_angle); - }, - - _normalize_points: function(value) { - return value * this._unit_length; - }, - - _draw_label: function(center_x, center_y, angle, radius, amount) { - var r_offset = 50, // The distance out from the center of the pie to get point - x_offset = center_x, // The label points need to be tweaked slightly - y_offset = center_y + 0, // This one doesn't though - x = x_offset + ((radius + r_offset) * Math.cos(angle)), - y = y_offset + ((radius + r_offset) * Math.sin(angle)); - - // Draw label - this._d.fill = this.marker_color; - if (this.font) this._d.font = this.font; - this._d.pointsize = this._scale_fontsize(this.legend_font_size); - this._d.stroke = 'transparent'; - this._d.font_weight = 'bold'; - this._d.gravity = 'center'; - this._d.annotate_scaled(0, 0, - x, y, - amount, this._scale); - }, - - _draw_axes: function(center_x, center_y, radius, additive_angle, line_color) { - if (this.hide_axes) return; - - var current_angle = 0.0; - - Bluff.each(this._data, function(data_row) { - this._d.stroke = line_color || data_row[this.klass.DATA_COLOR_INDEX]; - this._d.stroke_width = 5.0; - - var x_offset = radius * Math.cos(current_angle); - var y_offset = radius * Math.sin(current_angle); - - this._d.line(center_x, center_y, - center_x + x_offset, - center_y + y_offset); - - if (!this.hide_text) this._draw_label(center_x, center_y, current_angle, radius, data_row[this.klass.DATA_LABEL_INDEX]); - - current_angle += additive_angle; - }, this); - }, - - _draw_polygon: function(center_x, center_y, additive_angle, color) { - var points = [], - current_angle = 0.0; - Bluff.each(this._data, function(data_row) { - points.push(center_x + this._normalize_points(data_row[this.klass.DATA_VALUES_INDEX][0]) * Math.cos(current_angle)); - points.push(center_y + this._normalize_points(data_row[this.klass.DATA_VALUES_INDEX][0]) * Math.sin(current_angle)); - current_angle += additive_angle; - }, this); - - this._d.stroke_width = 1.0; - this._d.stroke = color || this.marker_color; - this._d.fill = color || this.marker_color; - this._d.fill_opacity = 0.4; - this._d.polyline(points); - }, - - _sums_for_spider: function() { - var sum = 0.0; - Bluff.each(this._data, function(data_row) { - sum += data_row[this.klass.DATA_VALUES_INDEX][0]; - }, this); - return sum; - } -}); - - -// Used by StackedBar and child classes. -Bluff.Base.StackedMixin = new JS.Module({ - // Get sum of each stack - _get_maximum_by_stack: function() { - var max_hash = {}; - Bluff.each(this._data, function(data_set) { - Bluff.each(data_set[this.klass.DATA_VALUES_INDEX], function(data_point, i) { - if (!max_hash[i]) max_hash[i] = 0.0; - max_hash[i] += data_point; - }, this); - }, this); - - // this.maximum_value = 0; - for (var key in max_hash) { - if (max_hash[key] > this.maximum_value) this.maximum_value = max_hash[key]; - } - this.minimum_value = 0; - } -}); - - -Bluff.StackedArea = new JS.Class(Bluff.Base, { - include: Bluff.Base.StackedMixin, - last_series_goes_on_bottom: null, - - draw: function() { - this._get_maximum_by_stack(); - this.callSuper(); - - if (!this._has_data) return; - - this._x_increment = this._graph_width / (this._column_count - 1); - this._d.stroke = 'transparent'; - - var height = Bluff.array_new(this._column_count, 0); - - var data_points = null; - var iterator = this.last_series_goes_on_bottom ? 'reverse_each' : 'each'; - Bluff[iterator](this._norm_data, function(data_row) { - var prev_data_points = data_points; - data_points = []; - - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, index) { - // Use incremented x and scaled y - var new_x = this._graph_left + (this._x_increment * index); - var new_y = this._graph_top + (this._graph_height - data_point * this._graph_height - height[index]); - - height[index] += (data_point * this._graph_height); - - data_points.push(new_x); - data_points.push(new_y); - - this._draw_label(new_x, index); - }, this); - - var poly_points, i, n; - - if (prev_data_points) { - poly_points = Bluff.array(data_points); - for (i = prev_data_points.length/2 - 1; i >= 0; i--) { - poly_points.push(prev_data_points[2*i]); - poly_points.push(prev_data_points[2*i+1]); - } - poly_points.push(data_points[0]); - poly_points.push(data_points[1]); - } else { - poly_points = Bluff.array(data_points); - poly_points.push(this._graph_right); - poly_points.push(this._graph_bottom - 1); - poly_points.push(this._graph_left); - poly_points.push(this._graph_bottom - 1); - poly_points.push(data_points[0]); - poly_points.push(data_points[1]); - } - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.polyline(poly_points); - }, this); - } -}); - - -Bluff.StackedBar = new JS.Class(Bluff.Base, { - include: Bluff.Base.StackedMixin, - - // Spacing factor applied between bars - bar_spacing: 0.9, - - // Draws a bar graph, but multiple sets are stacked on top of each other. - draw: function() { - this._get_maximum_by_stack(); - this.callSuper(); - if (!this._has_data) return; - - this._bar_width = this._graph_width / this._column_count; - var padding = (this._bar_width * (1 - this.bar_spacing)) / 2; - - this._d.stroke_opacity = 0.0; - - var height = Bluff.array_new(this._column_count, 0); - - Bluff.each(this._norm_data, function(data_row, row_index) { - var raw_data = this._data[row_index][this.klass.DATA_VALUES_INDEX]; - - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, point_index) { - // Calculate center based on bar_width and current row - var label_center = this._graph_left + (this._bar_width * point_index) + (this._bar_width * this.bar_spacing / 2.0); - this._draw_label(label_center, point_index); - - if (data_point == 0) return; - // Use incremented x and scaled y - var left_x = this._graph_left + (this._bar_width * point_index) + padding; - var left_y = this._graph_top + (this._graph_height - - data_point * this._graph_height - - height[point_index]) + 1; - var right_x = left_x + this._bar_width * this.bar_spacing; - var right_y = this._graph_top + this._graph_height - height[point_index] - 1; - - // update the total height of the current stacked bar - height[point_index] += (data_point * this._graph_height); - - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - this._d.rectangle(left_x, left_y, right_x, right_y); - - this._draw_tooltip(left_x, left_y, - right_x - left_x, right_y - left_y, - data_row[this.klass.DATA_LABEL_INDEX], - data_row[this.klass.DATA_COLOR_INDEX], - raw_data[point_index]); - }, this); - }, this); - } -}); - - -// A special bar graph that shows a single dataset as a set of -// stacked bars. The bottom bar shows the running total and -// the top bar shows the new value being added to the array. - -Bluff.AccumulatorBar = new JS.Class(Bluff.StackedBar, { - - draw: function() { - if (this._data.length !== 1) throw 'Incorrect number of datasets'; - - var accumulator_array = [], - index = 0, - increment_array = []; - - Bluff.each(this._data[0][this.klass.DATA_VALUES_INDEX], function(value) { - var max = -Infinity; - Bluff.each(increment_array, function(x) { max = Math.max(max, x); }); - - increment_array.push((index > 0) ? (value + max) : value); - accumulator_array.push(increment_array[index] - value); - index += 1; - }, this); - - this.data("Accumulator", accumulator_array); - - this.callSuper(); - } -}); - - -// New gruff graph type added to enable sideways stacking bar charts -// (basically looks like a x/y flip of a standard stacking bar chart) -// -// alun.eyre@googlemail.com - -Bluff.SideStackedBar = new JS.Class(Bluff.SideBar, { - include: Bluff.Base.StackedMixin, - - // Spacing factor applied between bars - bar_spacing: 0.9, - - draw: function() { - this.has_left_labels = true; - this._get_maximum_by_stack(); - this.callSuper(); - - if (!this._has_data) return; - - this._bar_width = this._graph_height / this._column_count; - var height = Bluff.array_new(this._column_count, 0), - length = Bluff.array_new(this._column_count, this._graph_left), - padding = (this._bar_width * (1 - this.bar_spacing)) / 2; - - Bluff.each(this._norm_data, function(data_row, row_index) { - this._d.fill = data_row[this.klass.DATA_COLOR_INDEX]; - var raw_data = this._data[row_index][this.klass.DATA_VALUES_INDEX]; - - Bluff.each(data_row[this.klass.DATA_VALUES_INDEX], function(data_point, point_index) { - - // using the original calcs from the stacked bar chart to get the difference between - // part of the bart chart we wish to stack. - var temp1 = this._graph_left + (this._graph_width - - data_point * this._graph_width - - height[point_index]) + 1; - var temp2 = this._graph_left + this._graph_width - height[point_index] - 1; - var difference = temp2 - temp1; - - var left_x = length[point_index], //+ 1 - left_y = this._graph_top + (this._bar_width * point_index) + padding, - right_x = left_x + difference, - right_y = left_y + this._bar_width * this.bar_spacing; - length[point_index] += difference; - height[point_index] += (data_point * this._graph_width - 2); - - this._d.rectangle(left_x, left_y, right_x, right_y); - - this._draw_tooltip(left_x, left_y, - right_x - left_x, right_y - left_y, - data_row[this.klass.DATA_LABEL_INDEX], - data_row[this.klass.DATA_COLOR_INDEX], - raw_data[point_index]); - - // Calculate center based on bar_width and current row - var label_center = this._graph_top + (this._bar_width * point_index) + (this._bar_width * this.bar_spacing / 2.0); - this._draw_label(label_center, point_index); - }, this); - }, this); - }, - - _larger_than_max: function(data_point, index) { - index = index || 0; - return this._max(data_point, index) > this.maximum_value; - }, - - _max: function(data_point, index) { - var sum = 0; - Bluff.each(this._data, function(item) { - sum += item[this.klass.DATA_VALUES_INDEX][index]; - }, this); - return sum; - } -}); - - -Bluff.Mini.Legend = new JS.Module({ - - hide_mini_legend: false, - - // The canvas needs to be bigger so we can put the legend beneath it. - _expand_canvas_for_vertical_legend: function() { - if (this.hide_mini_legend) return; - - this._original_rows = this._raw_rows; - this._rows += this._data.length * this._calculate_caps_height(this._scale_fontsize(this.legend_font_size)) * 1.7; - this._render_background(); - }, - - // Draw the legend beneath the existing graph. - _draw_vertical_legend: function() { - if (this.hide_mini_legend) return; - - this._legend_labels = Bluff.map(this._data, function(item) { - return item[this.klass.DATA_LABEL_INDEX]; - }, this); - - var legend_square_width = 40.0, // small square with color of this item - legend_square_margin = 10.0, - legend_left_margin = 100.0, - legend_top_margin = 40.0; - - // May fix legend drawing problem at small sizes - if (this.font) this._d.font = this.font; - this._d.pointsize = this.legend_font_size; - - var current_x_offset = legend_left_margin, - current_y_offset = this._original_rows + legend_top_margin; - - this._debug(function() { - this._d.line(0.0, current_y_offset, this._raw_columns, current_y_offset); - }); - - Bluff.each(this._legend_labels, function(legend_label, index) { - - // Draw label - this._d.fill = this.font_color; - if (this.font) this._d.font = this.font; - this._d.pointsize = this._scale_fontsize(this.legend_font_size); - this._d.stroke = 'transparent'; - this._d.font_weight = 'normal'; - this._d.gravity = 'west'; - this._d.annotate_scaled(this._raw_columns, 1.0, - current_x_offset + (legend_square_width * 1.7), current_y_offset, - this._truncate_legend_label(legend_label), this._scale); - - // Now draw box with color of this dataset - this._d.stroke = 'transparent'; - this._d.fill = this._data[index][this.klass.DATA_COLOR_INDEX]; - this._d.rectangle(current_x_offset, - current_y_offset - legend_square_width / 2.0, - current_x_offset + legend_square_width, - current_y_offset + legend_square_width / 2.0); - - current_y_offset += this._calculate_caps_height(this.legend_font_size) * 1.7; - }, this); - this._color_index = 0; - }, - - // Shorten long labels so they will fit on the canvas. - _truncate_legend_label: function(label) { - var truncated_label = String(label); - while (this._calculate_width(this._scale_fontsize(this.legend_font_size), truncated_label) > (this._columns - this.legend_left_margin - this.right_margin) && (truncated_label.length > 1)) - truncated_label = truncated_label.substr(0, truncated_label.length-1); - return truncated_label + (truncated_label.length < String(label).length ? "..." : ''); - } -}); - - -// Makes a small bar graph suitable for display at 200px or even smaller. -// -Bluff.Mini.Bar = new JS.Class(Bluff.Bar, { - include: Bluff.Mini.Legend, - - initialize_ivars: function() { - this.callSuper(); - - this.hide_legend = true; - this.hide_title = true; - this.hide_line_numbers = true; - - this.marker_font_size = 50.0; - this.minimum_value = 0.0; - this.maximum_value = 0.0; - this.legend_font_size = 60.0; - }, - - draw: function() { - this._expand_canvas_for_vertical_legend(); - - this.callSuper(); - - this._draw_vertical_legend(); - } -}); - - -// Makes a small pie graph suitable for display at 200px or even smaller. -// -Bluff.Mini.Pie = new JS.Class(Bluff.Pie, { - include: Bluff.Mini.Legend, - - initialize_ivars: function() { - this.callSuper(); - - this.hide_legend = true; - this.hide_title = true; - this.hide_line_numbers = true; - - this.marker_font_size = 60.0; - this.legend_font_size = 60.0; - }, - - draw: function() { - this._expand_canvas_for_vertical_legend(); - - this.callSuper(); - - this._draw_vertical_legend(); - } -}); - - -// Makes a small pie graph suitable for display at 200px or even smaller. -// -Bluff.Mini.SideBar = new JS.Class(Bluff.SideBar, { - include: Bluff.Mini.Legend, - - initialize_ivars: function() { - this.callSuper(); - this.hide_legend = true; - this.hide_title = true; - this.hide_line_numbers = true; - - this.marker_font_size = 50.0; - this.legend_font_size = 50.0; - }, - - draw: function() { - this._expand_canvas_for_vertical_legend(); - - this.callSuper(); - - this._draw_vertical_legend(); - } -}); - - -Bluff.Renderer = new JS.Class({ - extend: { - WRAPPER_CLASS: 'bluff-wrapper', - TEXT_CLASS: 'bluff-text', - TARGET_CLASS: 'bluff-tooltip-target' - }, - - font: 'Arial, Helvetica, Verdana, sans-serif', - gravity: 'north', - - initialize: function(canvasId) { - this._canvas = document.getElementById(canvasId); - this._ctx = this._canvas.getContext('2d'); - }, - - scale: function(sx, sy) { - this._sx = sx; - this._sy = sy || sx; - }, - - caps_height: function(font_size) { - var X = this._sized_text(font_size, 'X'), - height = this._element_size(X).height; - this._remove_node(X); - return height; - }, - - text_width: function(font_size, text) { - var element = this._sized_text(font_size, text); - var width = this._element_size(element).width; - this._remove_node(element); - return width; - }, - - get_type_metrics: function(text) { - var node = this._sized_text(this.pointsize, text); - document.body.appendChild(node); - var size = this._element_size(node); - this._remove_node(node); - return size; - }, - - clear: function(width, height) { - this._canvas.width = width; - this._canvas.height = height; - this._ctx.clearRect(0, 0, width, height); - var wrapper = this._text_container(), children = wrapper.childNodes, i = children.length; - wrapper.style.width = width + 'px'; - wrapper.style.height = height + 'px'; - while (i--) { - if (children[i].tagName.toLowerCase() !== 'canvas') - this._remove_node(children[i]); - } - }, - - push: function() { - this._ctx.save(); - }, - - pop: function() { - this._ctx.restore(); - }, - - render_gradiated_background: function(width, height, top_color, bottom_color) { - this.clear(width, height); - var gradient = this._ctx.createLinearGradient(0,0, 0,height); - gradient.addColorStop(0, top_color); - gradient.addColorStop(1, bottom_color); - this._ctx.fillStyle = gradient; - this._ctx.fillRect(0, 0, width, height); - }, - - render_solid_background: function(width, height, color) { - this.clear(width, height); - this._ctx.fillStyle = color; - this._ctx.fillRect(0, 0, width, height); - }, - - annotate_scaled: function(width, height, x, y, text, scale) { - var scaled_width = (width * scale) >= 1 ? (width * scale) : 1; - var scaled_height = (height * scale) >= 1 ? (height * scale) : 1; - var text = this._sized_text(this.pointsize, text); - text.style.color = this.fill; - text.style.fontWeight = this.font_weight; - text.style.textAlign = 'center'; - text.style.left = (this._sx * x + this._left_adjustment(text, scaled_width)) + 'px'; - text.style.top = (this._sy * y + this._top_adjustment(text, scaled_height)) + 'px'; - }, - - tooltip: function(left, top, width, height, name, color, data) { - if (width < 0) left += width; - if (height < 0) top += height; - - var wrapper = this._canvas.parentNode, - target = document.createElement('div'); - target.className = this.klass.TARGET_CLASS; - target.style.position = 'absolute'; - target.style.left = (this._sx * left - 3) + 'px'; - target.style.top = (this._sy * top - 3) + 'px'; - target.style.width = (this._sx * Math.abs(width) + 5) + 'px'; - target.style.height = (this._sy * Math.abs(height) + 5) + 'px'; - target.style.fontSize = 0; - target.style.overflow = 'hidden'; - - Bluff.Event.observe(target, 'mouseover', function(node) { - Bluff.Tooltip.show(name, color, data); - }); - Bluff.Event.observe(target, 'mouseout', function(node) { - Bluff.Tooltip.hide(); - }); - - wrapper.appendChild(target); - }, - - circle: function(origin_x, origin_y, perim_x, perim_y, arc_start, arc_end) { - var radius = Math.sqrt(Math.pow(perim_x - origin_x, 2) + Math.pow(perim_y - origin_y, 2)); - this._ctx.fillStyle = this.fill; - this._ctx.beginPath(); - var alpha = (arc_start || 0) * Math.PI/180; - var beta = (arc_end || 360) * Math.PI/180; - if (arc_start !== undefined && arc_end !== undefined) { - this._ctx.moveTo(this._sx * (origin_x + radius * Math.cos(beta)), this._sy * (origin_y + radius * Math.sin(beta))); - this._ctx.lineTo(this._sx * origin_x, this._sy * origin_y); - this._ctx.lineTo(this._sx * (origin_x + radius * Math.cos(alpha)), this._sy * (origin_y + radius * Math.sin(alpha))); - } - this._ctx.arc(this._sx * origin_x, this._sy * origin_y, this._sx * radius, alpha, beta, false); - this._ctx.fill(); - }, - - line: function(sx, sy, ex, ey) { - this._ctx.strokeStyle = this.stroke; - this._ctx.lineWidth = this.stroke_width; - this._ctx.beginPath(); - this._ctx.moveTo(this._sx * sx, this._sy * sy); - this._ctx.lineTo(this._sx * ex, this._sy * ey); - this._ctx.stroke(); - }, - - polyline: function(points) { - this._ctx.fillStyle = this.fill; - this._ctx.globalAlpha = this.fill_opacity || 1; - try { this._ctx.strokeStyle = this.stroke; } catch (e) {} - var x = points.shift(), y = points.shift(); - this._ctx.beginPath(); - this._ctx.moveTo(this._sx * x, this._sy * y); - while (points.length > 0) { - x = points.shift(); y = points.shift(); - this._ctx.lineTo(this._sx * x, this._sy * y); - } - this._ctx.fill(); - }, - - rectangle: function(ax, ay, bx, by) { - var temp; - if (ax > bx) { temp = ax; ax = bx; bx = temp; } - if (ay > by) { temp = ay; ay = by; by = temp; } - try { - this._ctx.fillStyle = this.fill; - this._ctx.fillRect(this._sx * ax, this._sy * ay, this._sx * (bx-ax), this._sy * (by-ay)); - } catch (e) {} - try { - this._ctx.strokeStyle = this.stroke; - if (this.stroke !== 'transparent') - this._ctx.strokeRect(this._sx * ax, this._sy * ay, this._sx * (bx-ax), this._sy * (by-ay)); - } catch (e) {} - }, - - _left_adjustment: function(node, width) { - var w = this._element_size(node).width; - switch (this.gravity) { - case 'west': return 0; - case 'east': return width - w; - case 'north': case 'south': case 'center': - return (width - w) / 2; - } - }, - - _top_adjustment: function(node, height) { - var h = this._element_size(node).height; - switch (this.gravity) { - case 'north': return 0; - case 'south': return height - h; - case 'west': case 'east': case 'center': - return (height - h) / 2; - } - }, - - _text_container: function() { - var wrapper = this._canvas.parentNode; - if (wrapper.className === this.klass.WRAPPER_CLASS) return wrapper; - wrapper = document.createElement('div'); - wrapper.className = this.klass.WRAPPER_CLASS; - - wrapper.style.position = 'relative'; - wrapper.style.border = 'none'; - wrapper.style.padding = '0 0 0 0'; - - this._canvas.parentNode.insertBefore(wrapper, this._canvas); - wrapper.appendChild(this._canvas); - return wrapper; - }, - - _sized_text: function(size, content) { - var text = this._text_node(content); - text.style.fontFamily = this.font; - text.style.fontSize = (typeof size === 'number') ? size + 'px' : size; - return text; - }, - - _text_node: function(content) { - var div = document.createElement('div'); - div.className = this.klass.TEXT_CLASS; - div.style.position = 'absolute'; - div.appendChild(document.createTextNode(content)); - this._text_container().appendChild(div); - return div; - }, - - _remove_node: function(node) { - node.parentNode.removeChild(node); - if (node.className === this.klass.TARGET_CLASS) - Bluff.Event.stopObserving(node); - }, - - _element_size: function(element) { - var display = element.style.display; - return (display && display !== 'none') - ? {width: element.offsetWidth, height: element.offsetHeight} - : {width: element.clientWidth, height: element.clientHeight}; - } -}); - - -// DOM event module, adapted from Prototype -// Copyright (c) 2005-2008 Sam Stephenson - -Bluff.Event = { - _cache: [], - - _isIE: (window.attachEvent && navigator.userAgent.indexOf('Opera') === -1), - - observe: function(element, eventName, callback, scope) { - var handlers = Bluff.map(this._handlersFor(element, eventName), - function(entry) { return entry._handler }); - if (Bluff.index(handlers, callback) !== -1) return; - - var responder = function(event) { - callback.call(scope || null, element, Bluff.Event._extend(event)); - }; - this._cache.push({_node: element, _name: eventName, - _handler: callback, _responder: responder}); - - if (element.addEventListener) - element.addEventListener(eventName, responder, false); - else - element.attachEvent('on' + eventName, responder); - }, - - stopObserving: function(element) { - var handlers = element ? this._handlersFor(element) : this._cache; - Bluff.each(handlers, function(entry) { - if (entry._node.removeEventListener) - entry._node.removeEventListener(entry._name, entry._responder, false); - else - entry._node.detachEvent('on' + entry._name, entry._responder); - }); - }, - - _handlersFor: function(element, eventName) { - var results = []; - Bluff.each(this._cache, function(entry) { - if (element && entry._node !== element) return; - if (eventName && entry._name !== eventName) return; - results.push(entry); - }); - return results; - }, - - _extend: function(event) { - if (!this._isIE) return event; - if (!event) return false; - if (event._extendedByBluff) return event; - event._extendedByBluff = true; - - var pointer = this._pointer(event); - event.target = event.srcElement; - event.pageX = pointer.x; - event.pageY = pointer.y; - - return event; - }, - - _pointer: function(event) { - var docElement = document.documentElement, - body = document.body || { scrollLeft: 0, scrollTop: 0 }; - return { - x: event.pageX || (event.clientX + - (docElement.scrollLeft || body.scrollLeft) - - (docElement.clientLeft || 0)), - y: event.pageY || (event.clientY + - (docElement.scrollTop || body.scrollTop) - - (docElement.clientTop || 0)) - }; - } -}; - -if (Bluff.Event._isIE) - window.attachEvent('onunload', function() { - Bluff.Event.stopObserving(); - Bluff.Event._cache = null; - }); - -if (navigator.userAgent.indexOf('AppleWebKit/') > -1) - window.addEventListener('unload', function() {}, false); - - -Bluff.Tooltip = new JS.Singleton({ - LEFT_OFFSET: 20, - TOP_OFFSET: -6, - DATA_LENGTH: 8, - - CLASS_NAME: 'bluff-tooltip', - - setup: function() { - this._tip = document.createElement('div'); - this._tip.className = this.CLASS_NAME; - this._tip.style.position = 'absolute'; - this.hide(); - document.body.appendChild(this._tip); - - Bluff.Event.observe(document.body, 'mousemove', function(body, event) { - this._tip.style.left = (event.pageX + this.LEFT_OFFSET) + 'px'; - this._tip.style.top = (event.pageY + this.TOP_OFFSET) + 'px'; - }, this); - }, - - show: function(name, color, data) { - data = Number(String(data).substr(0, this.DATA_LENGTH)); - this._tip.innerHTML = '  ' + - '' + name + ' ' + - '' + data + ''; - this._tip.style.display = ''; - }, - - hide: function() { - this._tip.style.display = 'none'; - } -}); - -Bluff.Event.observe(window, 'load', Bluff.Tooltip.method('setup')); - - -Bluff.TableReader = new JS.Class({ - - NUMBER_FORMAT: /\-?(0|[1-9]\d*)(\.\d+)?(e[\+\-]?\d+)?/i, - - initialize: function(table, transpose) { - this._table = (typeof table === 'string') - ? document.getElementById(table) - : table; - this._swap = !!transpose; - }, - - // Get array of data series from the table - get_data: function() { - if (!this._data) this._read(); - return this._data; - }, - - // Get set of axis labels to use for the graph - get_labels: function() { - if (!this._labels) this._read(); - return this._labels; - }, - - // Get the title from the table's caption - get_title: function() { - return this._title; - }, - - // Return series number i - get_series: function(i) { - if (this._data[i]) return this._data[i]; - return this._data[i] = {points: []}; - }, - - // Gather data by reading from the table - _read: function() { - this._row = this._col = 0; - this._row_offset = this._col_offset = 0; - this._data = []; - this._labels = {}; - this._row_headings = []; - this._col_headings = []; - - this._walk(this._table); - - if ((this._row_headings.length > 1 && this._col_headings.length === 1) || - this._row_headings.length < this._col_headings.length) { - if (!this._swap) this._transpose(); - } else { - if (this._swap) this._transpose(); - } - - Bluff.each(this._col_headings, function(heading, i) { - this.get_series(i - this._col_offset).name = heading; - }, this); - - Bluff.each(this._row_headings, function(heading, i) { - this._labels[i - this._row_offset] = heading; - }, this); - }, - - // Walk the table's DOM tree - _walk: function(node) { - this._visit(node); - var i, children = node.childNodes, n = children.length; - for (i = 0; i < n; i++) this._walk(children[i]); - }, - - // Read a single DOM node from the table - _visit: function(node) { - if (!node.tagName) return; - var content = this._strip_tags(node.innerHTML), x, y; - switch (node.tagName.toUpperCase()) { - - case 'TR': - if (!this._has_data) this._row_offset = this._row; - this._row += 1; - this._col = 0; - break; - - case 'TD': - if (!this._has_data) this._col_offset = this._col; - this._has_data = true; - this._col += 1; - content = content.match(this.NUMBER_FORMAT); - if (content === null) { - this.get_series(x).points[y] = null; - } else { - x = this._col - this._col_offset - 1; - y = this._row - this._row_offset - 1; - this.get_series(x).points[y] = parseFloat(content[0]); - } - break; - - case 'TH': - this._col += 1; - if (this._col === 1 && this._row === 1) - this._row_headings[0] = this._col_headings[0] = content; - else if (node.scope === "row" || this._col === 1) - this._row_headings[this._row - 1] = content; - else - this._col_headings[this._col - 1] = content; - break; - - case 'CAPTION': - this._title = content; - break; - } - }, - - // Transpose data in memory - _transpose: function() { - var data = this._data, tmp; - this._data = []; - - Bluff.each(data, function(row, i) { - Bluff.each(row.points, function(point, p) { - this.get_series(p).points[i] = point; - }, this); - }, this); - - tmp = this._row_headings; - this._row_headings = this._col_headings; - this._col_headings = tmp; - - tmp = this._row_offset; - this._row_offset = this._col_offset; - this._col_offset = tmp; - }, - - // Remove HTML from a string - _strip_tags: function(string) { - return string.replace(/<\/?[^>]+>/gi, ''); - }, - - extend: { - Mixin: new JS.Module({ - data_from_table: function(table, transpose) { - var reader = new Bluff.TableReader(table, transpose), - data_rows = reader.get_data(); - - Bluff.each(data_rows, function(row) { - this.data(row.name, row.points); - }, this); - - this.labels = reader.get_labels(); - this.title = reader.get_title() || this.title; - } - }) - } -}); - -Bluff.Base.include(Bluff.TableReader.Mixin); \ No newline at end of file diff --git a/mapgenerator/scripts/excanvas.js b/mapgenerator/scripts/excanvas.js deleted file mode 100644 index a34ca1d..0000000 --- a/mapgenerator/scripts/excanvas.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2006 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_|| -b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d','","");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("g.x)g.x=e.x;if(h.y==null||e.yg.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_), -z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l')}else a.push('');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("')}a.push("");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(), -this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a, -0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager= -M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})(); diff --git a/mapgenerator/scripts/js-class.js b/mapgenerator/scripts/js-class.js deleted file mode 100644 index 923fa96..0000000 --- a/mapgenerator/scripts/js-class.js +++ /dev/null @@ -1 +0,0 @@ -JS={extend:function(a,b){b=b||{};for(var c in b){if(a[c]===b[c])continue;a[c]=b[c]}return a},makeFunction:function(){return function(){return this.initialize?(this.initialize.apply(this,arguments)||this):this}},makeBridge:function(a){var b=function(){};b.prototype=a.prototype;return new b},bind:function(){var a=JS.array(arguments),b=a.shift(),c=a.shift()||null;return function(){return b.apply(c,a.concat(JS.array(arguments)))}},callsSuper:function(a){return a.SUPER===undefined?a.SUPER=/\bcallSuper\b/.test(a.toString()):a.SUPER},mask:function(a){var b=a.toString().replace(/callSuper/g,'super');a.toString=function(){return b};return a},array:function(a){if(!a)return[];if(a.toArray)return a.toArray();var b=a.length,c=[];while(b--)c[b]=a[b];return c},indexOf:function(a,b){for(var c=0,d=a.length;c':''),d=this.__meta__=new JS.Module(c?c+'.':'',{},{_1:this});d.include(this.klass.__mod__,false);return d},equals:function(a){return this===a},extend:function(a,b){return this.__eigen__().include(a,b,{_2:this})},hash:function(){return this.__hashcode__=this.__hashcode__||JS.Kernel.getHashCode()},isA:function(a){return this.__eigen__().includes(a)},method:function(a){var b=this,c=b.__mcache__=b.__mcache__||{};if((c[a]||{}).fn===b[a])return c[a].bd;return(c[a]={fn:b[a],bd:JS.bind(b[a],b)}).bd},methods:function(){return this.__eigen__().instanceMethods(true)},tap:function(a,b){a.call(b||null,this);return this}}),{__hashIndex__:0,getHashCode:function(){this.__hashIndex__+=1;return(Math.floor(new Date().getTime()/1000)+this.__hashIndex__).toString(16)}});JS.Module.include(JS.Kernel);JS.extend(JS.Module,JS.Kernel.__fns__);JS.Class.include(JS.Kernel);JS.extend(JS.Class,JS.Kernel.__fns__);JS.Interface=new JS.Class({initialize:function(d){this.test=function(a,b){var c=d.length;while(c--){if(!JS.isFn(a[d[c]]))return b?d[c]:false}return true}},extend:{ensure:function(){var a=JS.array(arguments),b=a.shift(),c,d;while(c=a.shift()){d=c.test(b,true);if(d!==true)throw new Error('object does not implement '+d+'()');}}}});JS.Singleton=new JS.Class({initialize:function(a,b,c){return new(new JS.Class(a,b,c))}}); \ No newline at end of file diff --git a/params.json b/params.json new file mode 100644 index 0000000..87087a8 --- /dev/null +++ b/params.json @@ -0,0 +1 @@ +{"tagline":"A Linux Python application to create maps of 802.11 networks","body":"# WifiScanAndMap\r\n\r\n## A simple 802.11 mapping application for Linux written in Python.\r\n\r\n![WifiScanAndMap generated map screenshot](http://dl.dropbox.com/u/599926/images/wfsnm.png \"WifiScanAndMap generated map screenshot\")\r\n\r\n### Description:\r\n\r\nWiFiScanAndMap is a Python WiFi mapping application for Linux.\r\nYou can use it to scan areas for wireless networks, collect information about them and then generate a web page displaying these information on a map.\r\n\r\n\r\nThe application was created as an assignment for the “Wireless Networks And Mobile Communcations” course at the Computer Science Department of the Athens University Of Economics And Business, by:\r\n\r\n* Filia Dova\r\n* Georgios Migdos\r\n\r\nThe application consists of two programs, the scanner and the map generator.\r\n\r\nThe user runs the scanner on a mobile device (laptop/netbook) which collects information about the wireless networks within range. The program relies on iwlist output for the scanning process. After the user is done, they can save the collected information as an XML file.\r\n\r\n![WifiScanAndMap scanner run as a GTK+ application](http://dl.dropbox.com/u/599926/images/screenshot-wifiscanner.png \"WifiScanAndMap scanner run as a GTK+ application\")\r\n\r\nThe scanner can be run as a GTK+ application or as a command line application (with the `–no-gui` parameter).\r\n\r\nThis process can be repeated any number of times, resulting in a number of XML files. These XML files are used as the input of the map generator program which parses the XML files and produces an HTML web page.\r\n\r\n\r\nThe map data used is obtained from [OpenStreetMap](http://www.openstreetmap.org/) and the tiles are from [Yahoo! Maps](http://maps.yahoo.com/). The graph is displayed using the [Bluff Javascript library](http://bluff.jcoglan.com/).\r\n\r\n\r\n\r\n### Requirements:\r\n\r\nTo run the scanner you need:\r\n\r\n* A Linux system with wireless tools for Linux installed\r\n* Wireless card supporting scanning\r\n* GPS receiver\r\n* Python 2.6.4\r\n* gpsd (+python bindings)\r\n* PyGTK+ 2.16 (if you want to use the GUI)\r\n\r\nTo display the map you need:\r\n\r\n* A web browser supporting CSS with Javascript enabled\r\n* An active internet connection\r\n\t\r\n### Usage:\r\n\r\n* You can run the scanner (GTK+ GUI) with the command :\r\n`python scanner/scanner.py`\r\n\r\n* You can run the scanner (GTK+ GUI) with the command :\r\n`python scanner/scanner.py –no-gui`\r\n\r\n* You can run the map generator with the command:\r\n`python mapgenerator/mapgenerator.py `\r\n \r\n where:\r\n * `` and `` are the geographic coordinates of the resulting map’s original center\r\n * `` is the directory where the result files will be saved\r\n * ` ` are the XML files generated by the scanner.\r\n\r\n### Authors:\r\n\r\n* Δόβα Φιλία (Dova Filia) filia_do@hotmail.com\r\n* Μίγδος Γεώργιος (Migdos George) cyberpython@gmail.com\r\n\r\n### License:\r\nThe source code is available under the [Apache v2.0 license](http://www.apache.org/licenses/LICENSE-2.0.html).\r\n\r\nThe artwork is available under the [Creative Commons Attribution-Share Alike 3.0 Unported license](http://creativecommons.org/licenses/by-sa/3.0/).\r\n\r\nThe 3rd party [Bluff Javascript library](http://bluff.jcoglan.com/) is available under the [MIT license](http://www.opensource.org/licenses/mit-license.php).","google":"","note":"Don't delete this file! It's used internally to help with page regeneration.","name":"Wifi Scan And Map"} \ No newline at end of file diff --git a/results/bg.png b/results/bg.png deleted file mode 100644 index 4c0587f..0000000 Binary files a/results/bg.png and /dev/null differ diff --git a/results/bluff-min.js b/results/bluff-min.js deleted file mode 100644 index 3a80df0..0000000 --- a/results/bluff-min.js +++ /dev/null @@ -1 +0,0 @@ -Bluff={VERSION:'0.3.6',array:function(c){if(c.length===undefined)return[c];var d=[],f=c.length;while(f--)d[f]=c[f];return d},array_new:function(c,d){var f=[];while(c--)f.push(d);return f},each:function(c,d,f){for(var g=0,h=c.length;gthis._5)?g.length:this._5;Bluff.each(g,function(c,d){if(c===undefined)return;if(this.maximum_value===null&&this.minimum_value===null)this.maximum_value=this.minimum_value=c;this.maximum_value=this._1f(c)?c:this.maximum_value;if(this.maximum_value>=0)this._a=true;this.minimum_value=this._1A(c)?c:this.minimum_value;if(this.minimum_value<0)this._a=true},this)},draw:function(){if(this.stacked)this._1B();this._1C();this._u(function(){this._0.rectangle(this.left_margin,this.top_margin,this._d-this.right_margin,this._L-this.bottom_margin);this._0.rectangle(this._1,this._7,this._l,this._g)})},clear:function(){this._X()},_1C:function(){if(!this._a)return this._1D();this._13();this._1E();if(this.sort)this._1F();this._1G();this._M();this._1H();this._1I()},_13:function(g){if(this._9===null||g===true){this._9=[];if(!this._a)return;this._1g();Bluff.each(this._2,function(d){var f=[];Bluff.each(d[this.klass.DATA_VALUES_INDEX],function(c){if(c===null||c===undefined)f.push(null);else f.push((c-this.minimum_value)/this._i)},this);this._9.push([d[this.klass.DATA_LABEL_INDEX],f,d[this.klass.DATA_COLOR_INDEX]])},this)}},_1g:function(){this._i=this.maximum_value-this.minimum_value;this._i=this._i>0?this._i:1;this._1h=100/Math.pow(10,Math.round(Math.LOG10E*Math.log(this._i)))},_1E:function(){this._N=this.hide_line_markers?0:this._D(this.marker_font_size);this._1i=this.hide_title?0:this._D(this.title_font_size);this._1j=this.hide_legend?0:this._D(this.legend_font_size);var c,d,f,g,h,i,j;if(this.hide_line_markers){this._1=this.left_margin;this._14=this.right_margin;this._1k=this.bottom_margin}else{d=0;if(this.has_left_labels){c='';for(j in this.labels){c=c.length>this.labels[j].length?c:this.labels[j]}d=this._O(this.marker_font_size,c)*1.25}else{d=this._O(this.marker_font_size,this._15(this.maximum_value))}f=this.hide_line_numbers&&!this.has_left_labels?0.0:d+this.klass.LABEL_MARGIN*2;this._1=this.left_margin+f+(this.y_axis_label===null?0.0:this._N+this.klass.LABEL_MARGIN*2);g=-Infinity;for(j in this.labels)g=g>Number(j)?g:Number(j);g=Math.round(g);h=(g>=(this._5-1)&&this.center_labels_over_point)?this._O(this.marker_font_size,this.labels[g])/2:0;this._14=this.right_margin+h;this._1k=this.bottom_margin+this._N+this.klass.LABEL_MARGIN}this._l=this._d-this._14;this._6=this._d-this._1-this._14;this._7=this.top_margin+(this.hide_title?this.title_margin:this._1i+this.title_margin)+(this.hide_legend?this.legend_margin:this._1j+this.legend_margin);i=(this.x_axis_label===null)?0.0:this._N+this.klass.LABEL_MARGIN;this._g=this._L-this._1k-i;this._3=this._g-this._7},_1H:function(){if(this.x_axis_label){var c=this._g+this.klass.LABEL_MARGIN*2+this._N;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(this._d,1.0,0.0,c,this.x_axis_label,this._b);this._u(function(){this._0.line(0.0,c,this._d,c)})}},_M:function(){if(this.hide_line_markers)return;if(this.y_axis_increment===null){if(this.marker_count===null){Bluff.each([3,4,5,6,7],function(c){if(!this.marker_count&&this._i%c===0)this.marker_count=c},this);this.marker_count=this.marker_count||4}this._16=(this._i>0)?this._17(this._i/this.marker_count):1}else{this.maximum_value=Math.max(Math.ceil(this.maximum_value),this.y_axis_increment);this.minimum_value=Math.floor(this.minimum_value);this._1g();this._13(true);this.marker_count=Math.round(this._i/this.y_axis_increment);this._16=this.y_axis_increment}this._1J=this._3/(this._i/this._16);var d,f,g,h;for(d=0,f=this.marker_count;d<=f;d++){g=this._7+this._3-d*this._1J;this._0.stroke=this.marker_color;this._0.stroke_width=1;this._0.line(this._1,g,this._l,g);h=d*this._16+this.minimum_value;if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.font_weight='normal';this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(this._1-this.klass.LABEL_MARGIN,1.0,0.0,g,this._15(h),this._b)}}},_1l:function(c){return(this._d-c)/2},_1G:function(){if(this.hide_legend)return;this._P=Bluff.map(this._2,function(c){return c[this.klass.DATA_LABEL_INDEX]},this);var i=this.legend_box_size;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var j=[[]];Bluff.each(this._P,function(c){var d=j.length-1;var f=this._0.get_type_metrics(c);var g=f.width+i*2.7;j[d].push(g);if(Bluff.sum(j[d])>(this._d*0.9))j.push([j[d].pop()])},this);var k=this._1l(Bluff.sum(j[0]));var l=this.hide_title?this.top_margin+this.title_margin:this.top_margin+this.title_margin+this._1i;this._u(function(){this._0.stroke_width=1;this._0.line(0,l,this._d,l)});Bluff.each(this._P,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._d,1.0,k+(i*1.7),l,c,this._b);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(k,l-i/2.0,k+i,l+i/2.0);this._0.pointsize=this.legend_font_size;var f=this._0.get_type_metrics(c);var g=f.width+(i*2.7),h;j[0].shift();if(j[0].length==0){this._u(function(){this._0.line(0.0,l,this._d,l)});j.shift();if(j.length>0)k=this._1l(Bluff.sum(j[0]));h=Math.max(this._1j,i)+this.legend_margin;if(j.length>0){l+=h;this._7+=h;this._3=this._g-this._7}}else{k+=g}},this);this._m=0},_1I:function(){if(this.hide_title||!this.title)return;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.title_font_size);this._0.font_weight='bold';this._0.gravity='north';this._0.annotate_scaled(this._d,1.0,0,this.top_margin,this.title,this._b)},_c:function(c,d){if(this.hide_line_markers)return;var f;if(this.labels[d]&&!this._q[d]){f=this._g+this.klass.LABEL_MARGIN;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(1.0,1.0,c,f,this.labels[d],this._b);this._q[d]=true;this._u(function(){this._0.stroke_width=1;this._0.line(0.0,f,this._d,f)})}},_E:function(c,d,f,g,h,i,j){if(!this.tooltips)return;this._0.tooltip(c,d,f,g,h,i,j)},_1D:function(){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(80);this._0.gravity='center';this._0.annotate_scaled(this._d,this._L/2,0,10,this.no_data_message,this._b)},_X:function(){var c=this._k.background_colors;switch(true){case c instanceof Array:this._1K.apply(this,c);break;case typeof c==='string':this._1L(c);break;default:this._1M(this._k.background_image);break}},_1L:function(c){this._0.render_solid_background(this._j,this._y,c)},_1K:function(c,d){this._0.render_gradiated_background(this._j,this._y,c,d)},_1M:function(c){},_1e:function(){this._m=0;this._q={};this._k={};this._0.scale(this._b,this._b)},_2a:function(c){return this._b*c},_e:function(c){var d=c*this._b;return d},_Q:function(c,d){return(c>d)?d:c},_1f:function(c,d){return c>this.maximum_value},_1A:function(c,d){return c100){c/=10;d*=10}return Math.floor(c)*d},_1F:function(){var f=this._1N,g=this.klass.DATA_VALUES_INDEX;this._9.sort(function(c,d){return f(d[g])-f(c[g])});this._2.sort(function(c,d){return f(d[g])-f(c[g])})},_1N:function(d){var f=0;Bluff.each(d,function(c){f+=(c||0)});return f},_1B:function(){var g=[],h=this._5;while(h--)g[h]=0;Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){g[d]+=c},this);f[this.klass.DATA_VALUES_INDEX]=Bluff.array(g)},this)},_u:function(c){if(this.klass.DEBUG){this._0.fill='transparent';this._0.stroke='turquoise';c.call(this)}},_1z:function(){if(this._m0&&k>0){i.push(f);i.push(g)}else{i.push(this._1);i.push(this._g-1);i.push(f);i.push(g)}this._c(f,d);j=f;k=g},this);i.push(this._l);i.push(this._g-1);i.push(this._1);i.push(this._g-1);this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(i)},this)}});Bluff.BarConversion=new JS.Class({mode:null,zero:null,graph_top:null,graph_height:null,minimum_value:null,spread:null,getLeftYRightYscaled:function(c,d){var f;switch(this.mode){case 1:d[0]=this.graph_top+this.graph_height*(1-c)+1;d[1]=this.graph_top+this.graph_height-1;break;case 2:d[0]=this.graph_top+1;d[1]=this.graph_top+this.graph_height*(1-c)-1;break;case 3:f=c-this.minimum_value/this.spread;if(c>=this.zero){d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}else{d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}break;default:d[0]=0.0;d[1]=0.0}}});Bluff.Bar=new JS.Class(Bluff.Base,{bar_spacing:0.9,draw:function(){this.center_labels_over_point=(Bluff.keys(this.labels).length>this._5);this.callSuper();if(!this._a)return;this._1O()},_1O:function(){this._8=this._6/(this._5*this._2.length);var n=(this._8*(1-this.bar_spacing))/2;this._0.stroke_opacity=0.0;var m=new Bluff.BarConversion();m.graph_height=this._3;m.graph_top=this._7;if(this.minimum_value>=0){m.mode=1}else{if(this.maximum_value<=0){m.mode=2}else{m.mode=3;m.spread=this._i;m.minimum_value=this.minimum_value;m.zero=-this.minimum_value/this._i}}Bluff.each(this._9,function(j,k){var l=this._2[k][this.klass.DATA_VALUES_INDEX];Bluff.each(j[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*(k+d+((this._2.length-1)*d)))+n;var g=f+this._8*this.bar_spacing;var h=[];m.getLeftYRightYscaled(c,h);this._0.fill=j[this.klass.DATA_COLOR_INDEX];this._0.rectangle(f,h[0],g,h[1]);this._E(f,h[0],g-f,h[1]-h[0],j[this.klass.DATA_LABEL_INDEX],j[this.klass.DATA_COLOR_INDEX],l[d]);var i=this._1+(this._2.length*this._8*d)+(this._2.length*this._8/2.0);this._c(i-(this.center_labels_over_point?this._8/2.0:0.0),d)},this)},this);if(this.center_labels_over_point)this._c(this._l,this._5)}});Bluff.Line=new JS.Class(Bluff.Base,{baseline_value:null,baseline_color:null,line_width:null,dot_radius:null,hide_dots:null,hide_lines:null,initialize:function(c){if(arguments.length>3)throw'Wrong number of arguments';if(arguments.length===1||(typeof arguments[1]!=='number'&&typeof arguments[1]!=='string'))this.callSuper(c,null);else this.callSuper();this.hide_dots=this.hide_lines=false;this.baseline_color='red';this.baseline_value=null},draw:function(){this.callSuper();if(!this._a)return;this.x_increment=(this._5>1)?(this._6/(this._5-1)):this._6;var m;if(this._S!==undefined){m=this._7+(this._3-this._S*this._3);this._0.push();this._0.stroke=this.baseline_color;this._0.fill_opacity=0.0;this._0.stroke_width=3.0;this._0.line(this._1,m,this._1+this._6,m);this._0.pop()}Bluff.each(this._9,function(i,j){var k=null,l=null;var n=this._2[j][this.klass.DATA_VALUES_INDEX];this._1P=this._1Q(i);Bluff.each(i[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this.x_increment*d);if(typeof c!=='number')return;this._c(f,d);var g=this._7+(this._3-c*this._3);this._0.stroke=i[this.klass.DATA_COLOR_INDEX];this._0.fill=i[this.klass.DATA_COLOR_INDEX];this._0.stroke_opacity=1.0;this._0.stroke_width=this.line_width||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*6),3.0);var h=this.dot_radius||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*2),7.0);if(!this.hide_lines&&k!==null&&l!==null){this._0.line(k,l,f,g)}else if(this._1P){this._0.circle(f,g,f-h,g)}if(!this.hide_dots)this._0.circle(f,g,f-h,g);this._E(f-h,g-h,2*h,2*h,i[this.klass.DATA_LABEL_INDEX],i[this.klass.DATA_COLOR_INDEX],n[d]);k=f;l=g},this)},this)},_13:function(){this.maximum_value=Math.max(this.maximum_value,this.baseline_value);this.callSuper();if(this.baseline_value!==null)this._S=this.baseline_value/this.maximum_value},_1Q:function(d){var f=0;Bluff.each(d[this.klass.DATA_VALUES_INDEX],function(c){if(c!==undefined)f+=1});return f===1}});Bluff.Dot=new JS.Class(Bluff.Base,{draw:function(){this.has_left_labels=true;this.callSuper();if(!this._a)return;var k=1.0;this._F=this._3/this._5;this._18=this._F*k/this._9.length;this._0.stroke_opacity=0.0;var l=Bluff.array_new(this._5,0),n=Bluff.array_new(this._5,this._1),m=(this._F*(1-k))/2;Bluff.each(this._9,function(i,j){Bluff.each(i[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(c*this._6)-Math.round(this._18/6.0);var g=this._7+(this._F*d)+m+Math.round(this._18/2.0);if(j===0){this._0.stroke=this.marker_color;this._0.stroke_width=1.0;this._0.opacity=0.1;this._0.line(this._1,g,this._1+this._6,g)}this._0.fill=i[this.klass.DATA_COLOR_INDEX];this._0.stroke='transparent';this._0.circle(f,g,f+Math.round(this._18/3.0),g);var h=this._7+(this._F*d+this._F/2)+m;this._c(h,d)},this)},this)},_M:function(){if(this.hide_line_markers)return;this._0.stroke_antialias=false;this._0.stroke_width=1;var c=5;var d=this._17(this.maximum_value/c);for(var f=0;f<=c;f++){var g=(this._l-this._1)/c,h=this._l-(g*f)-1,i=f-c,j=Math.abs(i)*d;this._0.stroke=this.marker_color;this._0.line(h,this._g,h,this._g+0.5*this.klass.LABEL_MARGIN);if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='center';this._0.annotate_scaled(0,0,h,this._g+(this.klass.LABEL_MARGIN*2.0),j,this._b)}this._0.stroke_antialias=true}},_c:function(c,d){if(this.labels[d]&&!this._q[d]){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(1,1,this._1-this.klass.LABEL_MARGIN*2.0,c,this.labels[d],this._b);this._q[d]=true}}});Bluff.Net=new JS.Class(Bluff.Base,{hide_dots:null,line_width:null,dot_radius:null,initialize:function(){this.callSuper();this.hide_dots=false;this.hide_line_numbers=true},draw:function(){this.callSuper();if(!this._a)return;this._v=this._3/2.0;this._w=this._1+(this._6/2.0);this._x=this._7+(this._3/2.0)-10;this._R=this._6/(this._5-1);var s=this.dot_radius||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*2.5),7.0);this._0.stroke_opacity=1.0;this._0.stroke_width=this.line_width||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*4),3.0);var r;if(this._S!==undefined){r=this._7+(this._3-this._S*this._3);this._0.push();this._0.stroke_color=this.baseline_color;this._0.fill_opacity=0.0;this._0.stroke_width=5;this._0.line(this._1,r,this._1+this._6,r);this._0.pop()}Bluff.each(this._9,function(o){var p=null,q=null;Bluff.each(o[this.klass.DATA_VALUES_INDEX],function(c,d){if(c===undefined)return;var f=d*Math.PI*2/this._5,g=c*this._v,h=this._w+Math.sin(f)*g,i=this._x-Math.cos(f)*g,j=(d+10){this._0.fill=c[this.klass.DATA_COLOR_INDEX];var f=(c[this.klass.DATA_VALUES_INDEX][0]/o)*360;this._0.circle(n,m,n+k,m,p,p+f+0.5);var g=p+((p+f)-p)/2,h=Math.round((c[this.klass.DATA_VALUES_INDEX][0]/o)*100.0),i;if(h>=this.hide_labels_less_than){i=this._15(c[this.klass.DATA_VALUES_INDEX][0]);this._c(n,m,g,k+(k*this.klass.TEXT_OFFSET_PERCENTAGE),i)}p+=f}},this)},_c:function(c,d,f,g,h){var i=20.0,j=c,k=d,l=g+i,n=l*0.15,m=j+((l+n)*Math.cos(f*Math.PI/180)),o=k+(l*Math.sin(f*Math.PI/180));this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.marker_font_size);this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,m,o,h,this._b)},_1R:function(){var d=0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.SideBar=new JS.Class(Bluff.Base,{bar_spacing:0.9,draw:function(){this.has_left_labels=true;this.callSuper();if(!this._a)return;this._G=this._3/this._5;this._8=this._G*this.bar_spacing/this._9.length;this._0.stroke_opacity=0.0;var q=Bluff.array_new(this._5,0),s=Bluff.array_new(this._5,this._1),r=(this._G*(1-this.bar_spacing))/2;Bluff.each(this._9,function(m,o){var p=this._2[o][this.klass.DATA_VALUES_INDEX];Bluff.each(m[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-q[d]),g=this._1+this._6-q[d],h=g-f,i=s[d]-1,j=this._7+(this._G*d)+(this._8*o)+r,k=i+h,l=j+this._8;q[d]+=(c*this._6);this._0.stroke='transparent';this._0.fill=m[this.klass.DATA_COLOR_INDEX];this._0.rectangle(i,j,k,l);this._E(i,j,k-i,l-j,m[this.klass.DATA_LABEL_INDEX],m[this.klass.DATA_COLOR_INDEX],p[d]);var n=this._7+(this._G*d+this._G/2);this._c(n,d)},this)},this)},_M:function(){if(this.hide_line_markers)return;this._0.stroke_antialias=false;this._0.stroke_width=1;var c=5;var d=this._17(this.maximum_value/c),f,g,h,i;for(var j=0;j<=c;j++){f=(this._l-this._1)/c;g=this._l-(f*j)-1;h=j-c;i=Math.abs(h)*d;this._0.stroke=this.marker_color;this._0.line(g,this._g,g,this._7);if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='center';this._0.annotate_scaled(0,0,g,this._g+(this.klass.LABEL_MARGIN*2.0),i,this._b)}}},_c:function(c,d){if(this.labels[d]&&!this._q[d]){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(1,1,this._1-this.klass.LABEL_MARGIN*2.0,c,this.labels[d],this._b);this._q[d]=true}}});Bluff.Spider=new JS.Class(Bluff.Base,{hide_text:null,hide_axes:null,transparent_background:null,initialize:function(c,d,f){this.callSuper(c,f);this._1S=d;this.hide_legend=true},draw:function(){this.hide_line_markers=true;this.callSuper();if(!this._a)return;var c=this._3,d=this._3/2.0,f=this._1+(this._6-c)/2.0,g=this._1+(this._6/2.0),h=this._7+(this._3/2.0)-25;this._1T=d/this._1S;var i=this._1U(),j=0.0,k=(2*Math.PI)/this._2.length,l=0.0;if(!this.hide_axes)this._1V(g,h,d,k);this._1W(g,h,k)},_1n:function(c){return c*this._1T},_c:function(c,d,f,g,h){var i=50,j=c,k=d+0,l=j+((g+i)*Math.cos(f)),n=k+((g+i)*Math.sin(f));this._0.fill=this.marker_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,l,n,h,this._b)},_1V:function(g,h,i,j,k){if(this.hide_axes)return;var l=0.0;Bluff.each(this._2,function(c){this._0.stroke=k||c[this.klass.DATA_COLOR_INDEX];this._0.stroke_width=5.0;var d=i*Math.cos(l);var f=i*Math.sin(l);this._0.line(g,h,g+d,h+f);if(!this.hide_text)this._c(g,h,l,i,c[this.klass.DATA_LABEL_INDEX]);l+=j},this)},_1W:function(d,f,g,h){var i=[],j=0.0;Bluff.each(this._2,function(c){i.push(d+this._1n(c[this.klass.DATA_VALUES_INDEX][0])*Math.cos(j));i.push(f+this._1n(c[this.klass.DATA_VALUES_INDEX][0])*Math.sin(j));j+=g},this);this._0.stroke_width=1.0;this._0.stroke=h||this.marker_color;this._0.fill=h||this.marker_color;this._0.fill_opacity=0.4;this._0.polyline(i)},_1U:function(){var d=0.0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.Base.StackedMixin=new JS.Module({_19:function(){var g={};Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){if(!g[d])g[d]=0.0;g[d]+=c},this)},this);for(var h in g){if(g[h]>this.maximum_value)this.maximum_value=g[h]}this.minimum_value=0}});Bluff.StackedArea=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,last_series_goes_on_bottom:null,draw:function(){this._19();this.callSuper();if(!this._a)return;this._R=this._6/(this._5-1);this._0.stroke='transparent';var n=Bluff.array_new(this._5,0);var m=null;var o=this.last_series_goes_on_bottom?'reverse_each':'each';Bluff[o](this._9,function(h){var i=m;m=[];Bluff.each(h[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._R*d);var g=this._7+(this._3-c*this._3-n[d]);n[d]+=(c*this._3);m.push(f);m.push(g);this._c(f,d)},this);var j,k,l;if(i){j=Bluff.array(m);for(k=i.length/2-1;k>=0;k--){j.push(i[2*k]);j.push(i[2*k+1])}j.push(m[0]);j.push(m[1])}else{j=Bluff.array(m);j.push(this._l);j.push(this._g-1);j.push(this._1);j.push(this._g-1);j.push(m[0]);j.push(m[1])}this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(j)},this)}});Bluff.StackedBar=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,bar_spacing:0.9,draw:function(){this._19();this.callSuper();if(!this._a)return;this._8=this._6/this._5;var m=(this._8*(1-this.bar_spacing))/2;this._0.stroke_opacity=0.0;var o=Bluff.array_new(this._5,0);Bluff.each(this._9,function(k,l){var n=this._2[l][this.klass.DATA_VALUES_INDEX];Bluff.each(k[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*d)+(this._8*this.bar_spacing/2.0);this._c(f,d);if(c==0)return;var g=this._1+(this._8*d)+m;var h=this._7+(this._3-c*this._3-o[d])+1;var i=g+this._8*this.bar_spacing;var j=this._7+this._3-o[d]-1;o[d]+=(c*this._3);this._0.fill=k[this.klass.DATA_COLOR_INDEX];this._0.rectangle(g,h,i,j);this._E(g,h,i-g,j-h,k[this.klass.DATA_LABEL_INDEX],k[this.klass.DATA_COLOR_INDEX],n[d])},this)},this)}});Bluff.AccumulatorBar=new JS.Class(Bluff.StackedBar,{draw:function(){if(this._2.length!==1)throw'Incorrect number of datasets';var g=[],h=0,i=[];Bluff.each(this._2[0][this.klass.DATA_VALUES_INDEX],function(d){var f=-Infinity;Bluff.each(i,function(c){f=Math.max(f,c)});i.push((h>0)?(d+f):d);g.push(i[h]-d);h+=1},this);this.data("Accumulator",g);this.callSuper()}});Bluff.SideStackedBar=new JS.Class(Bluff.SideBar,{include:Bluff.Base.StackedMixin,bar_spacing:0.9,draw:function(){this.has_left_labels=true;this._19();this.callSuper();if(!this._a)return;this._8=this._3/this._5;var q=Bluff.array_new(this._5,0),s=Bluff.array_new(this._5,this._1),r=(this._8*(1-this.bar_spacing))/2;Bluff.each(this._9,function(m,o){this._0.fill=m[this.klass.DATA_COLOR_INDEX];var p=this._2[o][this.klass.DATA_VALUES_INDEX];Bluff.each(m[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-q[d])+1;var g=this._1+this._6-q[d]-1;var h=g-f;var i=s[d],j=this._7+(this._8*d)+r,k=i+h,l=j+this._8*this.bar_spacing;s[d]+=h;q[d]+=(c*this._6-2);this._0.rectangle(i,j,k,l);this._E(i,j,k-i,l-j,m[this.klass.DATA_LABEL_INDEX],m[this.klass.DATA_COLOR_INDEX],p[d]);var n=this._7+(this._8*d)+(this._8*this.bar_spacing/2.0);this._c(n,d)},this)},this)},_1f:function(c,d){d=d||0;return this._1m(c,d)>this.maximum_value},_1m:function(d,f){var g=0;Bluff.each(this._2,function(c){g+=c[this.klass.DATA_VALUES_INDEX][f]},this);return g}});Bluff.Mini.Legend=new JS.Module({hide_mini_legend:false,_1a:function(){if(this.hide_mini_legend)return;this._1X=this._L;this._y+=this._2.length*this._D(this._e(this.legend_font_size))*1.7;this._X()},_1b:function(){if(this.hide_mini_legend)return;this._P=Bluff.map(this._2,function(c){return c[this.klass.DATA_LABEL_INDEX]},this);var f=40.0,g=10.0,h=100.0,i=40.0;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var j=h,k=this._1X+i;this._u(function(){this._0.line(0.0,k,this._d,k)});Bluff.each(this._P,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._d,1.0,j+(f*1.7),k,this._1Y(c),this._b);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(j,k-f/2.0,j+f,k+f/2.0);k+=this._D(this.legend_font_size)*1.7},this);this._m=0},_1Y:function(c){var d=String(c);while(this._O(this._e(this.legend_font_size),d)>(this._j-this.legend_left_margin-this.right_margin)&&(d.length>1))d=d.substr(0,d.length-1);return d+(d.length=1?(c*i):1;var k=(d*i)>=1?(d*i):1;var h=this._T(this.pointsize,h);h.style.color=this.fill;h.style.fontWeight=this.font_weight;h.style.textAlign='center';h.style.left=(this._f*f+this._1Z(h,j))+'px';h.style.top=(this._h*g+this._20(h,k))+'px'},tooltip:function(d,f,g,h,i,j,k){if(g<0)d+=g;if(h<0)f+=h;var l=this._n.parentNode,n=document.createElement('div');n.className=this.klass.TARGET_CLASS;n.style.position='absolute';n.style.left=(this._f*d-3)+'px';n.style.top=(this._h*f-3)+'px';n.style.width=(this._f*Math.abs(g)+5)+'px';n.style.height=(this._h*Math.abs(h)+5)+'px';n.style.fontSize=0;n.style.overflow='hidden';Bluff.Event.observe(n,'mouseover',function(c){Bluff.Tooltip.show(i,j,k)});Bluff.Event.observe(n,'mouseout',function(c){Bluff.Tooltip.hide()});l.appendChild(n)},circle:function(c,d,f,g,h,i){var j=Math.sqrt(Math.pow(f-c,2)+Math.pow(g-d,2));this._4.fillStyle=this.fill;this._4.beginPath();var k=(h||0)*Math.PI/180;var l=(i||360)*Math.PI/180;if(h!==undefined&&i!==undefined){this._4.moveTo(this._f*(c+j*Math.cos(l)),this._h*(d+j*Math.sin(l)));this._4.lineTo(this._f*c,this._h*d);this._4.lineTo(this._f*(c+j*Math.cos(k)),this._h*(d+j*Math.sin(k)))}this._4.arc(this._f*c,this._h*d,this._f*j,k,l,false);this._4.fill()},line:function(c,d,f,g){this._4.strokeStyle=this.stroke;this._4.lineWidth=this.stroke_width;this._4.beginPath();this._4.moveTo(this._f*c,this._h*d);this._4.lineTo(this._f*f,this._h*g);this._4.stroke()},polyline:function(c){this._4.fillStyle=this.fill;this._4.globalAlpha=this.fill_opacity||1;try{this._4.strokeStyle=this.stroke}catch(e){}var d=c.shift(),f=c.shift();this._4.beginPath();this._4.moveTo(this._f*d,this._h*f);while(c.length>0){d=c.shift();f=c.shift();this._4.lineTo(this._f*d,this._h*f)}this._4.fill()},rectangle:function(c,d,f,g){var h;if(c>f){h=c;c=f;f=h}if(d>g){h=d;d=g;g=h}try{this._4.fillStyle=this.fill;this._4.fillRect(this._f*c,this._h*d,this._f*(f-c),this._h*(g-d))}catch(e){}try{this._4.strokeStyle=this.stroke;if(this.stroke!=='transparent')this._4.strokeRect(this._f*c,this._h*d,this._f*(f-c),this._h*(g-d))}catch(e){}},_1Z:function(c,d){var f=this._H(c).width;switch(this.gravity){case'west':return 0;case'east':return d-f;case'north':case'south':case'center':return(d-f)/2}},_20:function(c,d){var f=this._H(c).height;switch(this.gravity){case'north':return 0;case'south':return d-f;case'west':case'east':case'center':return(d-f)/2}},_1o:function(){var c=this._n.parentNode;if(c.className===this.klass.WRAPPER_CLASS)return c;c=document.createElement('div');c.className=this.klass.WRAPPER_CLASS;c.style.position='relative';c.style.border='none';c.style.padding='0 0 0 0';this._n.parentNode.insertBefore(c,this._n);c.appendChild(this._n);return c},_T:function(c,d){var f=this._21(d);f.style.fontFamily=this.font;f.style.fontSize=(typeof c==='number')?c+'px':c;return f},_21:function(c){var d=document.createElement('div');d.className=this.klass.TEXT_CLASS;d.style.position='absolute';d.appendChild(document.createTextNode(c));this._1o().appendChild(d);return d},_U:function(c){c.parentNode.removeChild(c);if(c.className===this.klass.TARGET_CLASS)Bluff.Event.stopObserving(c)},_H:function(c){var d=c.style.display;return(d&&d!=='none')?{width:c.offsetWidth,height:c.offsetHeight}:{width:c.clientWidth,height:c.clientHeight}}});Bluff.Event={_V:[],_1p:(window.attachEvent&&navigator.userAgent.indexOf('Opera')===-1),observe:function(d,f,g,h){var i=Bluff.map(this._1q(d,f),function(c){return c._22});if(Bluff.index(i,g)!==-1)return;var j=function(c){g.call(h||null,d,Bluff.Event._23(c))};this._V.push({_W:d,_1c:f,_22:g,_1r:j});if(d.addEventListener)d.addEventListener(f,j,false);else d.attachEvent('on'+f,j)},stopObserving:function(d){var f=d?this._1q(d):this._V;Bluff.each(f,function(c){if(c._W.removeEventListener)c._W.removeEventListener(c._1c,c._1r,false);else c._W.detachEvent('on'+c._1c,c._1r)})},_1q:function(d,f){var g=[];Bluff.each(this._V,function(c){if(d&&c._W!==d)return;if(f&&c._1c!==f)return;g.push(c)});return g},_23:function(c){if(!this._1p)return c;if(!c)return false;if(c._24)return c;c._24=true;var d=this._25(c);c.target=c.srcElement;c.pageX=d.x;c.pageY=d.y;return c},_25:function(c){var d=document.documentElement,f=document.body||{scrollLeft:0,scrollTop:0};return{x:c.pageX||(c.clientX+(d.scrollLeft||f.scrollLeft)-(d.clientLeft||0)),y:c.pageY||(c.clientY+(d.scrollTop||f.scrollTop)-(d.clientTop||0))}}};if(Bluff.Event._1p)window.attachEvent('onunload',function(){Bluff.Event.stopObserving();Bluff.Event._V=null});if(navigator.userAgent.indexOf('AppleWebKit/')>-1)window.addEventListener('unload',function(){},false);Bluff.Tooltip=new JS.Singleton({LEFT_OFFSET:20,TOP_OFFSET:-6,DATA_LENGTH:8,CLASS_NAME:'bluff-tooltip',setup:function(){this._o=document.createElement('div');this._o.className=this.CLASS_NAME;this._o.style.position='absolute';this.hide();document.body.appendChild(this._o);Bluff.Event.observe(document.body,'mousemove',function(c,d){this._o.style.left=(d.pageX+this.LEFT_OFFSET)+'px';this._o.style.top=(d.pageY+this.TOP_OFFSET)+'px'},this)},show:function(c,d,f){f=Number(String(f).substr(0,this.DATA_LENGTH));this._o.innerHTML='  '+c+' '+f+'';this._o.style.display=''},hide:function(){this._o.style.display='none'}});Bluff.Event.observe(window,'load',Bluff.Tooltip.method('setup'));Bluff.TableReader=new JS.Class({NUMBER_FORMAT:/\-?(0|[1-9]\d*)(\.\d+)?(e[\+\-]?\d+)?/i,initialize:function(c,d){this._26=(typeof c==='string')?document.getElementById(c):c;this._1s=!!d},get_data:function(){if(!this._2)this._1t();return this._2},get_labels:function(){if(!this._1d)this._1t();return this._1d},get_title:function(){return this._27},get_series:function(c){if(this._2[c])return this._2[c];return this._2[c]={points:[]}},_1t:function(){this._I=this._p=0;this._J=this._K=0;this._2=[];this._1d={};this._s=[];this._t=[];this._1u(this._26);if((this._s.length>1&&this._t.length===1)||this._s.length]+>/gi,'')},extend:{Mixin:new JS.Module({data_from_table:function(d,f){var g=new Bluff.TableReader(d,f),h=g.get_data();Bluff.each(h,function(c){this.data(c.name,c.points)},this);this.labels=g.get_labels();this.title=g.get_title()||this.title}})}});Bluff.Base.include(Bluff.TableReader.Mixin); \ No newline at end of file diff --git a/results/excanvas.js b/results/excanvas.js deleted file mode 100644 index a34ca1d..0000000 --- a/results/excanvas.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2006 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_|| -b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d','","");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("g.x)g.x=e.x;if(h.y==null||e.yg.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_), -z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l')}else a.push('');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("')}a.push("");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(), -this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a, -0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager= -M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})(); diff --git a/results/index.html b/results/index.html deleted file mode 100644 index 8ad2fa0..0000000 --- a/results/index.html +++ /dev/null @@ -1,1011 +0,0 @@ - - - - - WNMC - - - - - - - - - - - - -
- - -
-
-
-
- marker - : 1 WN - marker-few - : 2-4 WNs - marker-many - : >4 WNs -
-
-
-
-
-
- Networks: 814 - Open: 127 -
-
-
-
-
-
- Access Points / Channel -
- -
- -
-
-
-
- - - - \ No newline at end of file diff --git a/results/js-class.js b/results/js-class.js deleted file mode 100644 index 923fa96..0000000 --- a/results/js-class.js +++ /dev/null @@ -1 +0,0 @@ -JS={extend:function(a,b){b=b||{};for(var c in b){if(a[c]===b[c])continue;a[c]=b[c]}return a},makeFunction:function(){return function(){return this.initialize?(this.initialize.apply(this,arguments)||this):this}},makeBridge:function(a){var b=function(){};b.prototype=a.prototype;return new b},bind:function(){var a=JS.array(arguments),b=a.shift(),c=a.shift()||null;return function(){return b.apply(c,a.concat(JS.array(arguments)))}},callsSuper:function(a){return a.SUPER===undefined?a.SUPER=/\bcallSuper\b/.test(a.toString()):a.SUPER},mask:function(a){var b=a.toString().replace(/callSuper/g,'super');a.toString=function(){return b};return a},array:function(a){if(!a)return[];if(a.toArray)return a.toArray();var b=a.length,c=[];while(b--)c[b]=a[b];return c},indexOf:function(a,b){for(var c=0,d=a.length;c':''),d=this.__meta__=new JS.Module(c?c+'.':'',{},{_1:this});d.include(this.klass.__mod__,false);return d},equals:function(a){return this===a},extend:function(a,b){return this.__eigen__().include(a,b,{_2:this})},hash:function(){return this.__hashcode__=this.__hashcode__||JS.Kernel.getHashCode()},isA:function(a){return this.__eigen__().includes(a)},method:function(a){var b=this,c=b.__mcache__=b.__mcache__||{};if((c[a]||{}).fn===b[a])return c[a].bd;return(c[a]={fn:b[a],bd:JS.bind(b[a],b)}).bd},methods:function(){return this.__eigen__().instanceMethods(true)},tap:function(a,b){a.call(b||null,this);return this}}),{__hashIndex__:0,getHashCode:function(){this.__hashIndex__+=1;return(Math.floor(new Date().getTime()/1000)+this.__hashIndex__).toString(16)}});JS.Module.include(JS.Kernel);JS.extend(JS.Module,JS.Kernel.__fns__);JS.Class.include(JS.Kernel);JS.extend(JS.Class,JS.Kernel.__fns__);JS.Interface=new JS.Class({initialize:function(d){this.test=function(a,b){var c=d.length;while(c--){if(!JS.isFn(a[d[c]]))return b?d[c]:false}return true}},extend:{ensure:function(){var a=JS.array(arguments),b=a.shift(),c,d;while(c=a.shift()){d=c.test(b,true);if(d!==true)throw new Error('object does not implement '+d+'()');}}}});JS.Singleton=new JS.Class({initialize:function(a,b,c){return new(new JS.Class(a,b,c))}}); \ No newline at end of file diff --git a/results/locked.png b/results/locked.png deleted file mode 100755 index 76ef0e3..0000000 Binary files a/results/locked.png and /dev/null differ diff --git a/results/marker-few-open.png b/results/marker-few-open.png deleted file mode 100644 index b0257bf..0000000 Binary files a/results/marker-few-open.png and /dev/null differ diff --git a/results/marker-few.png b/results/marker-few.png deleted file mode 100644 index fa02fd6..0000000 Binary files a/results/marker-few.png and /dev/null differ diff --git a/results/marker-many-open.png b/results/marker-many-open.png deleted file mode 100644 index 01dc851..0000000 Binary files a/results/marker-many-open.png and /dev/null differ diff --git a/results/marker-many.png b/results/marker-many.png deleted file mode 100644 index 0937df0..0000000 Binary files a/results/marker-many.png and /dev/null differ diff --git a/results/marker-open.png b/results/marker-open.png deleted file mode 100644 index ea8ab10..0000000 Binary files a/results/marker-open.png and /dev/null differ diff --git a/results/marker.png b/results/marker.png deleted file mode 100644 index 2462c88..0000000 Binary files a/results/marker.png and /dev/null differ diff --git a/results/wifi.png b/results/wifi.png deleted file mode 100644 index b25c79b..0000000 Binary files a/results/wifi.png and /dev/null differ diff --git a/scanner/locked.png b/scanner/locked.png deleted file mode 100755 index 76ef0e3..0000000 Binary files a/scanner/locked.png and /dev/null differ diff --git a/scanner/unlocked.png b/scanner/unlocked.png deleted file mode 100755 index f86a3fb..0000000 Binary files a/scanner/unlocked.png and /dev/null differ diff --git a/scanner/wifiScanner.py b/scanner/wifiScanner.py deleted file mode 100755 index 5176c7f..0000000 --- a/scanner/wifiScanner.py +++ /dev/null @@ -1,694 +0,0 @@ -#!/usr/bin/env python - -''' - Copyright 2010 Filia Dova, Georgios Migdos - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -''' - -import subprocess -import threading -import time -from gps import * -import os -import sys -from os import path -import commands - - -#====================================================================================================================== - -#--- Simple helper class: -#--- (method names are self-explanatory) - -class Utilities: - def getWirelessInterfacesList(self): - networkInterfaces=[] - command = ["iwconfig"] - process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - process.wait() - (stdoutdata, stderrdata) = process.communicate(); - output = stdoutdata - lines = output.splitlines() - for line in lines: - if(line.find("IEEE 802.11")!=-1): - networkInterfaces.append(line.split()[0]) - return networkInterfaces - - def checkIfGpsdIsRunning(self): - output = commands.getoutput('ps -A') - if 'gpsd' in output: - return True - else: - return False - - -#====================================================================================================================== - -#--- Class that calls iwlist periodically -#--- and parses its output - also gets GPS data from gpsd: - -class wifiScanner(threading.Thread): - - def __init__(self, wifiNetworks, interval): - self.stopThread = threading.Event() - self.wifiNetworks = wifiNetworks - self.interval = interval - self.setWirelessInterface(None) - self.session = gps(mode=WATCH_ENABLE) - self.scanning = False - threading.Thread.__init__(self) - - def run(self): - self.stopThread.clear() - self.scanning = True - - while( not self.stopThread.isSet() ): - self.scanForWifiNetworks() - time.sleep(self.interval) - - self.scanning = False - - - def stop(self): - self.stopThread.set() - - def isScanning(self): - return self.scanning - - def getGPSData(self): - # Get GPS data from gpsd - # a = altitude, d = date/time, m=mode, - # o=postion/fix, s=status, y=satellites - #self.session.query('o') - self.session.next() - longtitude = self.session.fix.longitude - latitude = self.session.fix.latitude - return (longtitude, latitude) - - def getWifiNetworksList(self): - result = [] - for k,v in self.wifiNetworks.iteritems(): - result.append(v) - return result - - def setWirelessInterface(self, iface): - self.wIface = iface - - def getWirelessInterface(self): - return self.wIface - - - def scanForWifiNetworks(self): - networkInterface = self.wIface - output = "" - if(networkInterface!=None): - command = ["iwlist", networkInterface, "scanning"] - process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - process.wait() - (stdoutdata, stderrdata) = process.communicate(); - output = stdoutdata - self.parseIwlistOutput(output) - - - def cutFrom(self, s, pattern): - index = s.find(pattern) - if(index>-1): - return s[index+len(pattern):] - else: - return "" - - def cutTo(self, s, pattern): - index = s.find(pattern) - if(index>-1): - return s[:index] - else: - return s - - def parseIwlistOutput(self, output): - output = self.cutFrom(output, "Address:") - while (output!=""): - entry = self.cutTo(output, "Address:") - - address = "" - essid = "" - mode = "" - channel = "" - frequency = "" - quality = "" - signal = "" - noise = "" - encryption = "" - - address = entry[1:18] - - startIndex = entry.find("ESSID:\"") - if(startIndex > -1): - endIndex = entry.find("\"\n", startIndex) - essid = entry[startIndex+7:endIndex] - - startIndex = entry.find("Mode:") - if(startIndex > -1): - endIndex = entry.find("\n", startIndex) - mode = entry[startIndex+5:endIndex] - - startIndex = entry.find("Channel:") - if(startIndex > -1): - endIndex = entry.find("\n", startIndex) - channel = entry[startIndex+8:endIndex] - - startIndex = entry.find("Frequency:") - if(startIndex > -1): - endIndex = entry.find("\n", startIndex) - frequency = entry[startIndex+10:endIndex] - - startIndex = entry.find("Quality=") - if(startIndex > -1): - endIndex = entry.find("Signal", startIndex) -2 - qual = eval(entry[startIndex+8:endIndex]+".0") - if(qual > 1.0): - qual = 1.0 - quality = str(qual) - - startIndex = entry.find("Signal level:") - if(startIndex > -1): - endIndex = entry.find("dBm", startIndex) -1 - signal = entry[startIndex+13:endIndex] - - startIndex = entry.find("Noise level=") - if(startIndex > -1): - endIndex = entry.find("dBm", startIndex) -1 - noise = entry[startIndex+12:endIndex] - - startIndex = entry.find("Encryption key:") - if(startIndex > -1): - endIndex = entry.find("\n", startIndex) - encryption = entry[startIndex+15:endIndex] - - longtitude, latitude = self.getGPSData() - - key = (address, essid) - value = [address, essid, mode, channel, frequency, quality, signal, noise, encryption, str(latitude), str(longtitude)] - try: - oldValue = self.wifiNetworks[key] - qualityN = eval(quality) - oldQualityN = eval(oldValue[5]) - oldLat = oldValue[9] - oldLon = oldValue[10] - if ( ( qualityN > oldQualityN) or ( (oldLat=="0.0") and (oldLon=="0.0") ) ): - self.wifiNetworks[key] = value - except KeyError: - self.wifiNetworks[key] = value - - output = self.cutFrom(output, "Address:") - - - - def exportXML(self, filename): - out = open(filename, 'w') - out.write('\n') - out.write("\n") - - lst = self.getWifiNetworksList() - for l in lst: - out.write("\t\n") - - out.write("\t\t
"+ l[0] +"
\n") - out.write("\t\t"+ l[1] +"\n") - out.write("\t\t"+ l[2] +"\n") - out.write("\t\t"+ l[3] +"\n") - out.write("\t\t"+ l[4] +"\n") - out.write("\t\t"+ l[5] +"\n") - out.write("\t\t"+ l[6] +"\n") - out.write("\t\t"+ l[7] +"\n") - out.write("\t\t"+ l[8] +"\n") - out.write("\t\t"+ l[9] +"\n") - out.write("\t\t"+ l[10] +"\n") - - out.write("\t
\n") - - out.write("
\n") - out.close() - - - -#====================================================================================================================== - -#--- Class that is used to print -#--- results to stdout - -class resultCLIPrinter(threading.Thread): - - def __init__(self, interval, scanner, msg): - self.stopThread = threading.Event() - self.scanner = scanner - self.interval = interval - self.msg = msg - threading.Thread.__init__(self) - - def run(self): - self.stopThread.clear() - - while( not self.stopThread.isSet() ): - os.system("clear") - lst = self.scanner.getWifiNetworksList() - for l in lst: - print l - print "--------------------" - print self.msg - time.sleep(self.interval) - - - def stop(self): - self.stopThread.set() - - - - - -#====================================================================================================================== - -#--- Simple CLI application: - -class CLIApplication: - - def __init__(self): - self.wifiNetworks={} - self.SCANNER_INTERVAL = 5 - self.UPDATE_INTERVAL = 2 - self.checkForGpsd() - self.scanner = wifiScanner(self.wifiNetworks, self.SCANNER_INTERVAL) - self.resultsPrinter = resultCLIPrinter(self.UPDATE_INTERVAL, self.scanner, "Press enter key to stop scanning") - - def checkForGpsd(self): - if( not Utilities().checkIfGpsdIsRunning()): - print "gpsd is not running!" - device = raw_input("Please enter which GPS device gpsd should use: ") - while (not os.path.exists(device)): - print "Invalid device!" - device = raw_input("Please enter which GPS device gpsd should use: ") - process = subprocess.Popen(["gpsd", device]) - process.wait() - - def run(self): - os.system("clear") - print "Available wireless interfaces:" - wifiInterfacesList = Utilities().getWirelessInterfacesList() - if(len(wifiInterfacesList)==0): - print "\tNone\n" - print "Get a wireless card and try again! Bye, bye..." - exit(1) - else: - for wi in wifiInterfacesList: - print "\t- "+wi - - wifiInterfaceName = raw_input("Wireless interface to use: ") - if( not (wifiInterfaceName in wifiInterfacesList) ): - print "Error: Invalid wireless interface!" - exit(1) - - self.scanner.setWirelessInterface(wifiInterfaceName) - - self.scanner.start() - self.resultsPrinter.start() - - x=raw_input() - - self.resultsPrinter.stop() - self.scanner.stop() - - answer = raw_input("Would you like to save the results as an XML file (y = yes)? ") - if(answer == "y"): - fname = raw_input("Filename: ") - self.scanner.exportXML(fname) - - - -#====================================================================================================================== - -#--- GUI application: - -class GUIApplication: - - def __init__(self): - - self.checkForGpsd() - - self.initialize() - self.associateGUIElements() - self.createComboBox() - self.createListview() - self.bindEvents() - - self.updater = ListviewUpdater(self, self.discoveredLabel, self.UPDATE_INTERVAL) - self.updater.start() - - self.window.show_all() - - - def initialize(self): - self.wifiNetworks = {} - self.SCANNER_INTERVAL = 5 - self.UPDATE_INTERVAL = 2 - self.scanner = wifiScanner(self.wifiNetworks, self.SCANNER_INTERVAL) - self.gladefile = path.join(path.dirname(__file__), "wnmc.glade") - self.wTree = gtk.glade.XML(self.gladefile) - - def checkForGpsd(self): - if( not Utilities().checkIfGpsdIsRunning()): - device = self.showEnterGPSDeviceDialog('Please enter which GPS device to use:') - while ( (device!=None) and (not os.path.exists(device)) ): - device = self.showEnterGPSDeviceDialog('Invalid device!\nPlease enter which GPS device to use:') - if(device==None): - exit(0) - process = subprocess.Popen(["gpsd", device]) - process.wait() - - def on_quit(self, sender, arg=None): - self.quit() - - def quit(self): - if(self.updater!=None): - self.updater.stop() - if(self.scanner!=None): - self.scanner.stop() - gtk.main_quit() - - def run(self): - gtk.main() - - def getScanner(self): - return self.scanner - - def getListview(self): - return self.listview - - def getNetworks(self): - return self.wifiNetworks - - def getNumberOfNetworks(self): - return len(self.wifiNetworks) - -# def setRGBAColorMap(self, widget): -# screen = widget.get_screen() -# rgba = screen.get_rgba_colormap() -# widget.set_colormap(rgba) - - def associateGUIElements(self): - self.window = self.wTree.get_widget("window1") - #self.setRGBAColorMap(self.window) - self.scrolledWindow1 = self.wTree.get_widget("scrolledwindow1") - self.statusLabel = self.wTree.get_widget("label1") - self.discoveredLabel = self.wTree.get_widget("label3") - self.quitButton = self.wTree.get_widget("button1") - self.startStopButton = self.wTree.get_widget("button2") - self.exportXMLButton = self.wTree.get_widget("button3") - - -# --- Network interface selection combobox: - - def createComboBox(self): - self.comboBox1 = gtk.combo_box_new_text() - self.wTree.get_widget("hbox1").pack_start(self.comboBox1, expand=False) - self.updateComboBoxModel() - - def updateComboBoxModel(self): - self.comboBox1.get_model().clear() - items = Utilities().getWirelessInterfacesList() - for item in items: - self.comboBox1.append_text(item) - if(len(items)>0): - self.comboBox1.set_active(0) - - -#--- Wifi networks listview: - - def createListview(self): - self.listviewModel = self.createListviewModel() - self.listview = gtk.TreeView(self.listviewModel) - self.scrolledWindow1.add(self.listview) - self.createListviewColumns(self.listview) - self.listview.set_reorderable(False) - - - def createListviewModel(self): - networksList = [] - listviewModel = gtk.ListStore(str, str, str, str, str, float, str, str, gtk.gdk.Pixbuf, str, str) - return listviewModel - - def createListviewColumns(self, listview): - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("ESSID", rendererText, text=1) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Address", rendererText, text=0) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Mode", rendererText, text=2) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Channel", rendererText, text=3) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Frequency", rendererText, text=4) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererProgress = gtk.CellRendererProgress() - column = gtk.TreeViewColumn("Quality", rendererProgress, value=5) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Signal", rendererText, text=6) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Noise", rendererText, text=7) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererPixbuf = gtk.CellRendererPixbuf() - column = gtk.TreeViewColumn("Security", rendererPixbuf, pixbuf=8) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Latitude", rendererText, text=9) - column.set_sort_column_id(-1) - listview.append_column(column) - - rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Longtitude", rendererText, text=10) - column.set_sort_column_id(-1) - listview.append_column(column) - -#--- GUI Events: - - def bindEvents(self): - self.startStopButton.connect("clicked", self.onStartStopButtonClicked) - self.quitButton.connect("clicked", self.onQuitButtonClicked) - self.exportXMLButton.connect("clicked", self.onExportXMLButtonClicked) - - if (self.window): - self.window.connect("destroy", self.on_quit) - - - def onStartStopButtonClicked(self, widget): - if(self.scanner.isScanning()): - self.stopScanning() - self.updateComboBoxModel() - else: - self.startScanning() - - - - def onQuitButtonClicked(self, widget): - self.quit() - - - - def onExportXMLButtonClicked(self, widget): - self.exportXML() - -#--- Application methods: - - def startScanning(self): - if(self.comboBox1.get_active()!=-1): - self.scanner.stop() - - self.comboBox1.set_sensitive(False) - self.exportXMLButton.set_sensitive(False) - self.startStopButton.set_label("Stop scanning") - self.statusLabel.set_text("Scanning for 802.11 networks in range...") - - iface = self.comboBox1.get_model().get_value(self.comboBox1.get_active_iter(), 0) - self.scanner = wifiScanner(self.wifiNetworks, self.SCANNER_INTERVAL) - self.scanner.setWirelessInterface(iface) - self.scanner.start() - - def stopScanning(self): - self.scanner.stop() - self.startStopButton.set_label("Start scanning") - self.startStopButton.set_sensitive(False) - self.statusLabel.set_text("Stopping - Please wait...") - while (self.scanner.isScanning()): - time.sleep(1) - self.statusLabel.set_text("Idle") - self.startStopButton.set_sensitive(True) - self.comboBox1.set_sensitive(True) - self.exportXMLButton.set_sensitive(True) - - - def exportXML(self): - fname = self.getSaveTarget() - if( fname!=None ): - self.scanner.exportXML(fname) - - def getSaveTarget(self): - filename = self.showSaveToXMLDialog() - overwrite = False - while( (filename!=None) and os.path.exists(filename) and (not overwrite) ): - if(self.overwriteFile(filename)): - overwrite = True - else: - filename = self.showSaveToXMLDialog() - return filename - - def showSaveToXMLDialog(self): - dialog = gtk.FileChooserDialog("Save..", self.window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) - #self.setRGBAColorMap(dialog) - dialog.set_default_response(gtk.RESPONSE_OK) - filter = gtk.FileFilter() - filter.set_name("XML files") - filter.add_mime_type("text/xml") - filter.add_pattern("*.xml") - dialog.add_filter(filter) - response = dialog.run() - if response == gtk.RESPONSE_OK: - result = dialog.get_filename() - elif response == gtk.RESPONSE_CANCEL: - result = None - dialog.destroy() - return result - - def overwriteFile(self, filename): - dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO, "The file: \n\n"+filename+"\n\nalready exists. Overwrite?") - #self.setRGBAColorMap(dialog) - response = dialog.run() - dialog.destroy() - if response == gtk.RESPONSE_YES: - return True - elif response == gtk.RESPONSE_NO: - return False - - def showEnterGPSDeviceDialog(self, msg): - dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, None) - #self.setRGBAColorMap(dialog) - dialog.set_markup(msg) - entry = gtk.Entry() - entry.connect("activate", self.responseToDialog, dialog, gtk.RESPONSE_OK) - hbox = gtk.HBox() - hbox.pack_start(gtk.Label("Device:"), False, 5, 5) - hbox.pack_end(entry) - dialog.vbox.pack_end(hbox, True, True, 0) - dialog.show_all() - response = dialog.run() - device = entry.get_text() - dialog.destroy() - if response == gtk.RESPONSE_CANCEL: - return None - return device - - def responseToDialog(self, entry, dialog, response): - dialog.response(response) - - -#====================================================================================================================== - -#--- Helper class that updates the listview on regular intervals: - -class ListviewUpdater(threading.Thread): - - def __init__(self, parentApp, counterLabel, interval): - self.stopThread = threading.Event() - self.parentApp = parentApp - self.interval = interval - self.counterLabel = counterLabel - self.lockedIcon = gtk.gdk.pixbuf_new_from_file(path.join(path.dirname(__file__), "locked.png")) - self.unlockedIcon = gtk.gdk.pixbuf_new_from_file(path.join(path.dirname(__file__), "unlocked.png")) - threading.Thread.__init__(self) - - def run(self): - self.stopThread.clear() - - while( not self.stopThread.isSet() ): - scanner = self.parentApp.getScanner() - listview = self.parentApp.getListview() - - networksList = scanner.getWifiNetworksList() - listviewModel = gtk.ListStore(str, str, str, str, str, float, str, str, gtk.gdk.Pixbuf, str, str) - for l in networksList: - listviewModel.append( [ l[0], l[1], l[2], l[3], l[4], eval(l[5])*100, l[6], l[7], self.securityStatusToPixbuf(l[8]), l[9], l[10] ] ) - listviewModel.set_sort_column_id(5,gtk.SORT_DESCENDING) - gtk.gdk.threads_enter() - listview.set_model(listviewModel) - self.counterLabel.set_markup("Networks found: "+str(self.parentApp.getNumberOfNetworks())+"") - gtk.gdk.threads_leave() - time.sleep(self.interval) - - - def stop(self): - self.stopThread.set() - - - def securityStatusToBool(self, status): - if(status=="on"): - return True - else: - return False - - def securityStatusToPixbuf(self, status): - if(status=="on"): - return self.lockedIcon - else: - return self.unlockedIcon - - - -#====================================================================================================================== - -#--- Main loop: - - -if "--no-gui" in sys.argv: - import readline - application = CLIApplication() -else: - import gtk - import gtk.glade - gtk.gdk.threads_init() - application = GUIApplication() - -application.run() - - diff --git a/scanner/wnmc.glade b/scanner/wnmc.glade deleted file mode 100644 index 053476e..0000000 --- a/scanner/wnmc.glade +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - 802.11 Wireless Network Scanner - 640 - 480 - - - True - vertical - - - True - - - True - <b>Wireless Interface: </b> - True - - - False - 5 - 0 - - - - - - - - - - - False - 0 - - - - - True - - - True - True - automatic - automatic - in - - - - - - 5 - 0 - - - - - 1 - - - - - True - - - True - - - Start scanning - True - True - True - - - False - False - 0 - - - - - Export XML - True - True - True - - - False - False - 1 - - - - - False - 5 - 0 - - - - - True - Networks found: <b>0</b> - True - right - - - False - 5 - end - 1 - - - - - False - 2 - - - - - True - - - False - 5 - 3 - - - - - True - - - True - Idle - - - False - 5 - 0 - - - - - True - - - 1 - - - - - True - end - - - gtk-quit - True - True - True - True - - - False - False - 0 - - - - - False - 5 - 2 - - - - - False - 10 - 4 - - - - - - diff --git a/stylesheets/pygment_trac.css b/stylesheets/pygment_trac.css new file mode 100644 index 0000000..c6a6452 --- /dev/null +++ b/stylesheets/pygment_trac.css @@ -0,0 +1,69 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ + +.type-csharp .highlight .k { color: #0000FF } +.type-csharp .highlight .kt { color: #0000FF } +.type-csharp .highlight .nf { color: #000000; font-weight: normal } +.type-csharp .highlight .nc { color: #2B91AF } +.type-csharp .highlight .nn { color: #000000 } +.type-csharp .highlight .s { color: #A31515 } +.type-csharp .highlight .sc { color: #A31515 } diff --git a/stylesheets/styles.css b/stylesheets/styles.css new file mode 100644 index 0000000..f14d9e4 --- /dev/null +++ b/stylesheets/styles.css @@ -0,0 +1,413 @@ +@import url(https://fonts.googleapis.com/css?family=Arvo:400,700,400italic); + +/* MeyerWeb Reset */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + + +/* Base text styles */ + +body { + padding:10px 50px 0 0; + font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + color: #232323; + background-color: #FBFAF7; + margin: 0; + line-height: 1.8em; + -webkit-font-smoothing: antialiased; + +} + +h1, h2, h3, h4, h5, h6 { + color:#232323; + margin:36px 0 10px; +} + +p, ul, ol, table, dl { + margin:0 0 22px; +} + +h1, h2, h3 { + font-family: Arvo, Monaco, serif; + line-height:1.3; + font-weight: normal; +} + +h1,h2, h3 { + display: block; + border-bottom: 1px solid #ccc; + padding-bottom: 5px; +} + +h1 { + font-size: 30px; +} + +h2 { + font-size: 24px; +} + +h3 { + font-size: 18px; +} + +h4, h5, h6 { + font-family: Arvo, Monaco, serif; + font-weight: 700; +} + +a { + color:#C30000; + font-weight:200; + text-decoration:none; +} + +a:hover { + text-decoration: underline; +} + +a small { + font-size: 12px; +} + +em { + font-style: italic; +} + +strong { + font-weight:700; +} + +ul li { + list-style: inside; + padding-left: 25px; +} + +ol li { + list-style: decimal inside; + padding-left: 20px; +} + +blockquote { + margin: 0; + padding: 0 0 0 20px; + font-style: italic; +} + +dl, dt, dd, dl p { + font-color: #444; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; +} + +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + border:0; + background:#ccc; + height:1px; + margin:0 0 24px; +} + +/* Images */ + +img { + position: relative; + margin: 0 auto; + max-width: 650px; + padding: 5px; + margin: 10px 0 32px 0; + border: 1px solid #ccc; +} + + +/* Code blocks */ + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color:#000; + font-size:14px; +} + +pre { + padding: 4px 12px; + background: #FDFEFB; + border-radius:4px; + border:1px solid #D7D8C8; + overflow: auto; + overflow-y: hidden; + margin-bottom: 32px; +} + + +/* Tables */ + +table { + width:100%; +} + +table { + border: 1px solid #ccc; + margin-bottom: 32px; + text-align: left; + } + +th { + font-family: 'Arvo', Helvetica, Arial, sans-serif; + font-size: 18px; + font-weight: normal; + padding: 10px; + background: #232323; + color: #FDFEFB; + } + +td { + padding: 10px; + background: #ccc; + } + + +/* Wrapper */ +.wrapper { + width:960px; +} + + +/* Header */ + +header { + background-color: #171717; + color: #FDFDFB; + width:170px; + float:left; + position:fixed; + border: 1px solid #000; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + padding: 34px 25px 22px 50px; + margin: 30px 25px 0 0; + -webkit-font-smoothing: antialiased; +} + +p.header { + font-size: 16px; +} + +h1.header { + font-family: Arvo, sans-serif; + font-size: 30px; + font-weight: 300; + line-height: 1.3em; + border-bottom: none; + margin-top: 0; +} + + +h1.header, a.header, a.name, header a{ + color: #fff; +} + +a.header { + text-decoration: underline; +} + +a.name { + white-space: nowrap; +} + +header ul { + list-style:none; + padding:0; +} + +header li { + list-style-type: none; + width:132px; + height:15px; + margin-bottom: 12px; + line-height: 1em; + padding: 6px 6px 6px 7px; + + background: #AF0011; + background: -moz-linear-gradient(top, #AF0011 0%, #820011 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -o-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -ms-linear-gradient(top, #AF0011 0%,#820011 100%); + background: linear-gradient(top, #AF0011 0%,#820011 100%); + + border-radius:4px; + border:1px solid #0D0D0D; + + -webkit-box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); + box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); + +} + +header li:hover { + background: #C3001D; + background: -moz-linear-gradient(top, #C3001D 0%, #950119 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -o-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -ms-linear-gradient(top, #C3001D 0%,#950119 100%); + background: linear-gradient(top, #C3001D 0%,#950119 100%); +} + +a.buttons { + -webkit-font-smoothing: antialiased; + background: url(../images/arrow-down.png) no-repeat; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.4) 0 -1px 0; + padding: 2px 2px 2px 22px; + height: 30px; +} + +a.github { + background: url(../images/octocat-small.png) no-repeat 1px; +} + +a.buttons:hover { + color: #fff; + text-decoration: none; +} + + +/* Section - for main page content */ + +section { + width:650px; + float:right; + padding-bottom:50px; +} + + +/* Footer */ + +footer { + width:170px; + float:left; + position:fixed; + bottom:10px; + padding-left: 50px; +} + +@media print, screen and (max-width: 960px) { + + div.wrapper { + width:auto; + margin:0; + } + + header, section, footer { + float:none; + position:static; + width:auto; + } + + footer { + border-top: 1px solid #ccc; + margin:0 84px 0 50px; + padding:0; + } + + header { + padding-right:320px; + } + + section { + padding:20px 84px 20px 50px; + margin:0 0 20px; + } + + header a small { + display:inline; + } + + header ul { + position:absolute; + right:130px; + top:84px; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:10px 20px 0; + margin-right: 0; + } + + section { + padding:10px 0 10px 20px; + margin:0 0 30px; + } + + footer { + margin: 0 0 0 30px; + } + + header ul, header p.view { + position:static; + } +} + +@media print, screen and (max-width: 480px) { + + header ul li.download { + display:none; + } + + footer { + margin: 0 0 0 20px; + } + + footer a{ + display:block; + } + +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} \ No newline at end of file