From 0c8c9ad976879f7c90f9915a60845ccb0cdb337d Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 25 Dec 2013 13:25:16 +0100 Subject: initial commit --- doc/CHANGELOG | 84 ++ doc/INSTALL | 46 + doc/LICENSE | 204 +++ doc/README | 60 + doc/updatedoc | 23 + examples/clients/coap-client.py | 15 + examples/clients/webiopi-client.py | 46 + examples/magpi-9-cambot/cambot.py | 139 ++ examples/magpi-9-cambot/index.html | 70 + examples/magpi-9-cambot/stream.sh | 11 + examples/magpi-9-cambot2/cambot.py | 117 ++ examples/magpi-9-cambot2/index.html | 70 + examples/magpi-9-cambot2/stream.sh | 11 + examples/scripts/basic/script.py | 34 + examples/scripts/blink/script.py | 41 + examples/scripts/macros/index.html | 120 ++ examples/scripts/macros/script.py | 60 + examples/scripts/simple/index.html | 68 + htdocs/app/devices-monitor/index.html | 36 + htdocs/app/gpio-header/index.html | 18 + htdocs/app/gpio-list/index.html | 28 + htdocs/app/serial-monitor/index.html | 64 + htdocs/index.html | 25 + htdocs/jquery-mobile.css | 2 + htdocs/jquery-mobile.js | 2 + htdocs/jquery.js | 2 + htdocs/webiopi.css | 93 ++ htdocs/webiopi.js | 1448 ++++++++++++++++++++ java/client/src/Test.java | 52 + .../src/com/trouch/webiopi/client/PiClient.java | 38 + .../com/trouch/webiopi/client/PiCoapClient.java | 57 + .../com/trouch/webiopi/client/PiHttpClient.java | 68 + .../com/trouch/webiopi/client/PiMixedClient.java | 56 + .../trouch/webiopi/client/PiMulticastClient.java | 27 + .../com/trouch/webiopi/client/devices/Device.java | 44 + .../trouch/webiopi/client/devices/analog/ADC.java | 34 + .../trouch/webiopi/client/devices/analog/DAC.java | 37 + .../trouch/webiopi/client/devices/analog/PWM.java | 33 + .../webiopi/client/devices/digital/GPIO.java | 53 + .../webiopi/client/devices/digital/NativeGPIO.java | 26 + .../webiopi/client/devices/sensor/Distance.java | 30 + .../webiopi/client/devices/sensor/Luminosity.java | 30 + .../webiopi/client/devices/sensor/Pressure.java | 34 + .../webiopi/client/devices/sensor/Temperature.java | 34 + .../org/apache/commons/codec/BinaryDecoder.java | 38 + .../org/apache/commons/codec/BinaryEncoder.java | 38 + .../src/org/apache/commons/codec/CharEncoding.java | 113 ++ .../src/org/apache/commons/codec/Charsets.java | 144 ++ .../src/org/apache/commons/codec/Decoder.java | 47 + .../org/apache/commons/codec/DecoderException.java | 86 ++ .../src/org/apache/commons/codec/Encoder.java | 44 + .../org/apache/commons/codec/EncoderException.java | 89 ++ .../org/apache/commons/codec/binary/Base64.java | 775 +++++++++++ .../apache/commons/codec/binary/BaseNCodec.java | 500 +++++++ .../apache/commons/codec/binary/StringUtils.java | 343 +++++ midori/config | 9 + play.sh | 19 + python/config | 136 ++ python/native/bridge.c | 720 ++++++++++ python/native/cpuinfo.c | 65 + python/native/cpuinfo.h | 23 + python/native/gpio.c | 329 +++++ python/native/gpio.h | 73 + python/passwd | 1 + python/setup.py | 37 + python/webiopi-passwd.py | 57 + python/webiopi.init.sh | 155 +++ python/webiopi.sh | 2 + python/webiopi/__init__.py | 34 + python/webiopi/__main__.py | 79 ++ python/webiopi/clients/__init__.py | 209 +++ python/webiopi/decorators/__init__.py | 0 python/webiopi/decorators/rest.py | 19 + python/webiopi/devices/__init__.py | 13 + python/webiopi/devices/analog/__init__.py | 267 ++++ python/webiopi/devices/analog/ads1x1x.py | 82 ++ python/webiopi/devices/analog/mcp3x0x.py | 75 + python/webiopi/devices/analog/mcp4725.py | 38 + python/webiopi/devices/analog/mcp492X.py | 53 + python/webiopi/devices/analog/pca9685.py | 63 + python/webiopi/devices/bus.py | 117 ++ python/webiopi/devices/digital/__init__.py | 144 ++ python/webiopi/devices/digital/ds2408.py | 84 ++ python/webiopi/devices/digital/gpio.py | 189 +++ python/webiopi/devices/digital/mcp23XXX.py | 153 +++ python/webiopi/devices/digital/pcf8574.py | 70 + python/webiopi/devices/i2c.py | 75 + python/webiopi/devices/instance.py | 6 + python/webiopi/devices/manager.py | 77 ++ python/webiopi/devices/onewire.py | 74 + python/webiopi/devices/sensor/__init__.py | 177 +++ python/webiopi/devices/sensor/bmp085.py | 100 ++ python/webiopi/devices/sensor/onewiretemp.py | 58 + python/webiopi/devices/sensor/tmpXXX.py | 60 + python/webiopi/devices/sensor/tslXXXX.py | 247 ++++ python/webiopi/devices/sensor/vcnl4000.py | 211 +++ python/webiopi/devices/serial.py | 86 ++ python/webiopi/devices/shield/__init__.py | 16 + python/webiopi/devices/shield/piface.py | 66 + python/webiopi/devices/spi.py | 145 ++ python/webiopi/protocols/__init__.py | 14 + python/webiopi/protocols/coap.py | 537 ++++++++ python/webiopi/protocols/http.py | 249 ++++ python/webiopi/protocols/rest.py | 254 ++++ python/webiopi/server/__init__.py | 139 ++ python/webiopi/utils/__init__.py | 16 + python/webiopi/utils/config.py | 35 + python/webiopi/utils/crypto.py | 17 + python/webiopi/utils/loader.py | 26 + python/webiopi/utils/logger.py | 45 + python/webiopi/utils/thread.py | 50 + python/webiopi/utils/types.py | 30 + python/webiopi/utils/version.py | 29 + setup.sh | 126 ++ 114 files changed, 12087 insertions(+) create mode 100644 doc/CHANGELOG create mode 100644 doc/INSTALL create mode 100644 doc/LICENSE create mode 100644 doc/README create mode 100755 doc/updatedoc create mode 100644 examples/clients/coap-client.py create mode 100644 examples/clients/webiopi-client.py create mode 100644 examples/magpi-9-cambot/cambot.py create mode 100644 examples/magpi-9-cambot/index.html create mode 100755 examples/magpi-9-cambot/stream.sh create mode 100644 examples/magpi-9-cambot2/cambot.py create mode 100644 examples/magpi-9-cambot2/index.html create mode 100755 examples/magpi-9-cambot2/stream.sh create mode 100644 examples/scripts/basic/script.py create mode 100644 examples/scripts/blink/script.py create mode 100644 examples/scripts/macros/index.html create mode 100644 examples/scripts/macros/script.py create mode 100644 examples/scripts/simple/index.html create mode 100644 htdocs/app/devices-monitor/index.html create mode 100644 htdocs/app/gpio-header/index.html create mode 100644 htdocs/app/gpio-list/index.html create mode 100644 htdocs/app/serial-monitor/index.html create mode 100644 htdocs/index.html create mode 100644 htdocs/jquery-mobile.css create mode 100644 htdocs/jquery-mobile.js create mode 100644 htdocs/jquery.js create mode 100644 htdocs/webiopi.css create mode 100644 htdocs/webiopi.js create mode 100644 java/client/src/Test.java create mode 100644 java/client/src/com/trouch/webiopi/client/PiClient.java create mode 100644 java/client/src/com/trouch/webiopi/client/PiCoapClient.java create mode 100644 java/client/src/com/trouch/webiopi/client/PiHttpClient.java create mode 100644 java/client/src/com/trouch/webiopi/client/PiMixedClient.java create mode 100644 java/client/src/com/trouch/webiopi/client/PiMulticastClient.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/Device.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/analog/ADC.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/analog/DAC.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/analog/PWM.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/digital/GPIO.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/digital/NativeGPIO.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/sensor/Distance.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/sensor/Luminosity.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/sensor/Pressure.java create mode 100644 java/client/src/com/trouch/webiopi/client/devices/sensor/Temperature.java create mode 100644 java/client/src/org/apache/commons/codec/BinaryDecoder.java create mode 100644 java/client/src/org/apache/commons/codec/BinaryEncoder.java create mode 100644 java/client/src/org/apache/commons/codec/CharEncoding.java create mode 100644 java/client/src/org/apache/commons/codec/Charsets.java create mode 100644 java/client/src/org/apache/commons/codec/Decoder.java create mode 100644 java/client/src/org/apache/commons/codec/DecoderException.java create mode 100644 java/client/src/org/apache/commons/codec/Encoder.java create mode 100644 java/client/src/org/apache/commons/codec/EncoderException.java create mode 100644 java/client/src/org/apache/commons/codec/binary/Base64.java create mode 100644 java/client/src/org/apache/commons/codec/binary/BaseNCodec.java create mode 100644 java/client/src/org/apache/commons/codec/binary/StringUtils.java create mode 100644 midori/config create mode 100755 play.sh create mode 100644 python/config create mode 100644 python/native/bridge.c create mode 100644 python/native/cpuinfo.c create mode 100644 python/native/cpuinfo.h create mode 100644 python/native/gpio.c create mode 100644 python/native/gpio.h create mode 100644 python/passwd create mode 100644 python/setup.py create mode 100755 python/webiopi-passwd.py create mode 100755 python/webiopi.init.sh create mode 100755 python/webiopi.sh create mode 100644 python/webiopi/__init__.py create mode 100644 python/webiopi/__main__.py create mode 100644 python/webiopi/clients/__init__.py create mode 100644 python/webiopi/decorators/__init__.py create mode 100644 python/webiopi/decorators/rest.py create mode 100644 python/webiopi/devices/__init__.py create mode 100644 python/webiopi/devices/analog/__init__.py create mode 100644 python/webiopi/devices/analog/ads1x1x.py create mode 100644 python/webiopi/devices/analog/mcp3x0x.py create mode 100644 python/webiopi/devices/analog/mcp4725.py create mode 100644 python/webiopi/devices/analog/mcp492X.py create mode 100644 python/webiopi/devices/analog/pca9685.py create mode 100644 python/webiopi/devices/bus.py create mode 100644 python/webiopi/devices/digital/__init__.py create mode 100644 python/webiopi/devices/digital/ds2408.py create mode 100644 python/webiopi/devices/digital/gpio.py create mode 100644 python/webiopi/devices/digital/mcp23XXX.py create mode 100644 python/webiopi/devices/digital/pcf8574.py create mode 100644 python/webiopi/devices/i2c.py create mode 100644 python/webiopi/devices/instance.py create mode 100644 python/webiopi/devices/manager.py create mode 100644 python/webiopi/devices/onewire.py create mode 100644 python/webiopi/devices/sensor/__init__.py create mode 100644 python/webiopi/devices/sensor/bmp085.py create mode 100644 python/webiopi/devices/sensor/onewiretemp.py create mode 100644 python/webiopi/devices/sensor/tmpXXX.py create mode 100644 python/webiopi/devices/sensor/tslXXXX.py create mode 100644 python/webiopi/devices/sensor/vcnl4000.py create mode 100644 python/webiopi/devices/serial.py create mode 100644 python/webiopi/devices/shield/__init__.py create mode 100644 python/webiopi/devices/shield/piface.py create mode 100644 python/webiopi/devices/spi.py create mode 100644 python/webiopi/protocols/__init__.py create mode 100644 python/webiopi/protocols/coap.py create mode 100644 python/webiopi/protocols/http.py create mode 100644 python/webiopi/protocols/rest.py create mode 100644 python/webiopi/server/__init__.py create mode 100644 python/webiopi/utils/__init__.py create mode 100644 python/webiopi/utils/config.py create mode 100644 python/webiopi/utils/crypto.py create mode 100644 python/webiopi/utils/loader.py create mode 100644 python/webiopi/utils/logger.py create mode 100644 python/webiopi/utils/thread.py create mode 100644 python/webiopi/utils/types.py create mode 100644 python/webiopi/utils/version.py create mode 100755 setup.sh diff --git a/doc/CHANGELOG b/doc/CHANGELOG new file mode 100644 index 0000000..16206fd --- /dev/null +++ b/doc/CHANGELOG @@ -0,0 +1,84 @@ +==0.6 (27/03/13)== + Added CoAP ([http://tools.ietf.org/html/draft-ietf-core-coap-14 draft-14]) implementation (Server and Client) + Added Python WebIOPi Client class (HTTP or CoAP with HTTP fallback) + Added Python WebIOPi MulticastClient class (CoAP) + Added Serial, I2C, SPI and 1-Wire support + Python lightweight drivers with no dependency + Automatically load required linux modules + Added many device drivers, see [DEVICES device support page] + Added [Configuration] file + Added Serial monitor web app + Added Devices monitor web app + Added Devices abstractions Javascript class + Added GPIO digitalRead/Write and getFunction methods + Added Cache-Control REST response header + Added Server logging facility + Added jQuery-mobile + Improved button up/down handling on mobile devices + Fixed error fetching python-dev package during setup + Fixed webiopi-passwd missing execution flag when installing with PiStore + Fixed binary file serving + Fixed iOS6 Safari Mobile bug + + +==0.5.3 (01/07/13)== + Added board revision REST URI (submitted by Andreas Riegg) + Added encrypted passwd file to store credentials used for HTTP authentication + Added webiopi-passwd command-line program to generate passwd file + Moved demo to examples/custom folder, added examples/basic + Changed /dev/mem access to allow webiopi import without root privileges when not using GPIOs + Disabled update checker to avoid "Update available" link + Improved GPIO error handling + Fixed encoding issue with python 2.x giving a blank page + Fixed setup script + +==0.5.2 (12/21/12 - PiStore only)== + Fixed blank page and file handling when server start at boot + Improved macros handling to allow zeo, one or more args + Added server loop helper + Improved setup.sh for the PiStore + Added play.sh for the PiStore to open the browser + +==0.5.1 (11/16/12)== +===New Features=== + REV 2 boards support + Added setup script to ease WebIOPi install + Use WebIOPi in your own Python scripts + Login/Password protection + Software PWM + Binary sequence output + +===Python Server & REST API=== + Usable as a library + Added Python 3 support + Removed RPi.GPIO library dependency + Improved security + Improved file serving + Improved REST API + Added ability to use custom REST macro + Added ability to output a single pulse + Added ability to output a binary sequence + Added software PWM + +===Javascript Library=== + Improved and simplified + Added ability to create custom buttons with one or two callbacks (mousedown and mouseup) + Added helpers for new REST functions (macro, pulse, sequence, PWM, ...) + +===Other changes=== + PHP Server discontinued + + +==0.3 (08/27/12)== + Fixed security issue in the Python server + Python server general improvements + Python server display real IP + Allow PHP5 < 5.4 (Works on Debian wheezy) + Added update tracking + Refactored Javascript code to be used as a library + Changed IDs and CSS naming + Added expert app + + +==0.2 (08/21/12)== + Initial release \ No newline at end of file diff --git a/doc/INSTALL b/doc/INSTALL new file mode 100644 index 0000000..e34f9db --- /dev/null +++ b/doc/INSTALL @@ -0,0 +1,46 @@ +WebIOPi is developed and tested on Raspbian. + +You only need Python, either 2.7 or 3.2. Download, then extract and install WebIOPi. The setup script will automatically download and install required dependencies using apt-get. You may have to manually install GCC and Python development headers if you are not using Raspbian. + +$ wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz +$ tar xvzf WebIOPi-0.6.0.tar.gz +$ cd WebIOPi-0.6.0 +$ sudo ./setup.sh + +Finally, run Python using webiopi command : +$ sudo webiopi [-h] [-c config] [-l log] [-s script] [-d] [port] + + Options: + -h, --help Display this help + -c, --config file Load config from file + -l, --log file Log to file + -s, --script file Load script from file + -d, --debug Enable DEBUG + + Arguments: + port Port to bind the HTTP Server + +You're done, and ready to enjoy WebIOPi ! But the server and GPIO state will be lost when you'll stop the script (CTRL-C) or close the terminal. + +You can also start/stop the background service : +$ sudo /etc/init.d/webiopi start +and +$ sudo /etc/init.d/webiopi stop + +You can even setup your system to start webiopi at startup : +$ sudo update-rc.d webiopi defaults + + +=Usage= +If your are directly using your Raspberry Pi with keyboard/mouse/display plugged, open a browser to http://localhost:8000/ + +If your Raspberry Pi is connected to your network, you can open a browser to http://raspberrypi:8000/ with any device of your network. Replace raspberrypi by its IP. + +You can even add a port redirection on your router (and/or use IPv6) to control your GPIOs over Internet ! + +Default user is "webiopi" and password is "raspberry" + +By choosing the GPIO Header link on the main page, you will be able to control GPIO using a web UI which looks like the board header. + Click/Tap the OUT/IN button to change GPIO direction. + Click/Tap pins to change the GPIO output state. +http://trouch.com/wp-content/uploads/2012/08/webiopi-chrome.png \ No newline at end of file diff --git a/doc/LICENSE b/doc/LICENSE new file mode 100644 index 0000000..4112d3e --- /dev/null +++ b/doc/LICENSE @@ -0,0 +1,204 @@ + + + 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + diff --git a/doc/README b/doc/README new file mode 100644 index 0000000..f17ecc9 --- /dev/null +++ b/doc/README @@ -0,0 +1,60 @@ +===WebIOPi is a fully integrated Internet of Things framework for the Raspberry Pi.=== + Control, debug, and use your Pi's GPIO locally or remotely, from a browser or any app. + WebIOPi is the perfect Swiss-knife to make connected things with the Raspberry Pi. + Developed and provided by Eric PTAK, french R&D engineer in networks, software, and Internet of Things. + +===Features=== + REST API over HTTP and CoAP (draft-14) with multicast support + Server written in Python with zero dependency + Supports GPIO, Serial, I2C, SPI, 1-Wire with zero dependency + Supports more than [DEVICES 30 devices] including DAC, ADC, sensors... + Full Python library for the Server, GPIO, Serial, I2C, SPI and devices drivers + Compatible with both Python 2 and 3 + Extensible and highly customizable + Login/Password protection + Mobile devices compatible + Includes debug web apps + GPIO Header + GPIO List + Serial Monitor + Devices Monitor + Javascript client library built on top of jQuery + Python client library with HTTP and CoAP support + +===What for=== + Use webiopi.GPIO library to control GPIO in your Python scripts + Use devices drivers to interact with DAC, ADC, sensors and more in your Python scripts + Use Serial, I2C and SPI webiopi classes in your Python scripts + Use the GPIO Header web-app to play with GPIO and debug circuits + Use the Serial Monitor web-app to debug Serial devices + Use the Devices Monitor web-app to debug devices like DAC, ADC, sensors and more + Create a web-app with the Javascript library to remote controls things connected on GPIO + Add webiopi in your existing Python script to simply add all WebIOPi features + Extends webiopi with your own macro + Extends webiopi with scripts loading facilities in a Arduino fashion way (setup, loop, destroy) + Use the Python Client to make Pi-2-Pi communication through the REST API + Use the Python Multicast Client to control multiple Pis with a single REST call + Use the Java Client to use the REST API from a Java application, including Android + Use the REST API from any technology/language + +===Where to start=== + [INSTALL Installation] + [http://groups.google.com/group/webiopi Support & Discussion] + [http://trouch.com Developer's Blog (Eric/trouch)] + [http://issuu.com/themagpi/docs/issue9final?mode=window WebRobotCam Part 1 in MagPi #9] by Eric + [http://issuu.com/themagpi/docs/issue10final?mode=window WebRobotCam Part 2 in MagPi #10] by Eric + [http://www.youtube.com/watch?v=wGahWkjettw Video tutorial] by RaspberryPiBeginners + +

+ +http://trouch.com/wp-content/uploads/2012/11/webiopi-architecture.png + +http://trouch.com/wp-content/uploads/2012/08/webiopi-chrome.png + +http://trouch.com/wp-content/uploads/2013/03/webiopi-0.6-serialmon.png + +http://trouch.com/wp-content/uploads/2013/03/webiopi-0.6-devices1.png + +

+ +

https://www.paypal.com/enUS/i/btn/btndonateCCLG.gif

\ No newline at end of file diff --git a/doc/updatedoc b/doc/updatedoc new file mode 100755 index 0000000..aa0e5bc --- /dev/null +++ b/doc/updatedoc @@ -0,0 +1,23 @@ +#!/bin/sh + +if [ -z "$*" ]; then + files=`ls` +else + files="$*" +fi + +for file in $files; do + echo "Downloading $file..." + wget -q http://webiopi.googlecode.com/svn/wiki/$file.wiki && + echo "Processing $file..." && + mv $file.wiki $file && + sed -i 's/\|<\/font>//g' $file && + sed -i 's/
\|<\/pre>//g' $file &&
+	sed -i 's/[_*]//g' $file &&
+	sed -i '/{{{\|}}}/d' $file &&
+	echo "$file OK" ||
+	echo "$file not on wiki"
+done
+
+echo "Uploading changes on SVN..."
+svn commit -m "updated doc from wiki"
\ No newline at end of file
diff --git a/examples/clients/coap-client.py b/examples/clients/coap-client.py
new file mode 100644
index 0000000..eba80e9
--- /dev/null
+++ b/examples/clients/coap-client.py
@@ -0,0 +1,15 @@
+from webiopi.protocols.coap import *
+from time import sleep
+
+client = COAPClient()
+client.sendRequest(COAPPost("coap://224.0.1.123/GPIO/25/function/out"))
+state = True
+
+while True: 
+    response = client.sendRequest(COAPPost("coap://224.0.1.123/GPIO/25/value/%d" % state))
+    if response:
+        print("Received response:\n%s" % response)
+        state = not state
+    else:
+        print("No response received")
+    sleep(0.5)
diff --git a/examples/clients/webiopi-client.py b/examples/clients/webiopi-client.py
new file mode 100644
index 0000000..c277682
--- /dev/null
+++ b/examples/clients/webiopi-client.py
@@ -0,0 +1,46 @@
+from webiopi.clients import *
+from time import sleep
+
+# Create a WebIOPi client
+client = PiHttpClient("192.168.1.234")
+#client = PiMixedClient("192.168.1.234")
+#client = PiCoapClient("192.168.1.234")
+#client = PiMulticastClient()
+
+client.setCredentials("webiopi", "raspberry")
+
+# RPi native GPIO
+gpio = NativeGPIO(client)
+gpio.setFunction(25, "out")
+state = True
+
+# DAC named "dac1"
+dac = DAC(client, "dac1")
+
+# ADC named "adc1"
+adc = ADC(client, "adc1")
+value = 0.0
+
+# Temperature sensor named "temp0"
+temp = Temperature(client, "temp0")
+
+while True:
+    # toggle digital state
+    state = not state
+    gpio.digitalWrite(25, state)
+
+    # increase analog value
+    value += 0.01
+    if value > 1.0:
+        value = 0.0
+    dac.writeFloat(0, value)
+
+    # DAC output 0 is wired to ADC input 1
+    val = adc.readFloat(1)
+    print("Analog = %.2f" % val)
+    
+    # Retrieve temperature
+    t = temp.getCelsius()
+    print("Temperature = %.2f Celsius" % t)
+
+    sleep(1)
diff --git a/examples/magpi-9-cambot/cambot.py b/examples/magpi-9-cambot/cambot.py
new file mode 100644
index 0000000..ed2e499
--- /dev/null
+++ b/examples/magpi-9-cambot/cambot.py
@@ -0,0 +1,139 @@
+# Imports
+import webiopi
+
+# Retrieve GPIO lib
+GPIO = webiopi.GPIO
+
+# -------------------------------------------------- #
+# Constants definition                               #
+# -------------------------------------------------- #
+
+# Left motor GPIOs
+L1=9  # H-Bridge 1
+L2=10 # H-Bridge 2
+LS=11 # H-Bridge 1,2EN
+
+# Right motor GPIOs
+R1=23 # H-Bridge 3
+R2=24 # H-Bridge 4
+RS=25 # H-Bridge 3,4EN
+
+# -------------------------------------------------- #
+# Convenient PWM Function                            #
+# -------------------------------------------------- #
+
+# Set the speed of two motors
+def set_speed(speed):
+    GPIO.pulseRatio(LS, speed)
+    GPIO.pulseRatio(RS, speed)
+
+# -------------------------------------------------- #
+# Left Motor Functions                               #
+# -------------------------------------------------- #
+
+def left_stop():
+    GPIO.output(L1, GPIO.LOW)
+    GPIO.output(L2, GPIO.LOW)
+
+def left_forward():
+    GPIO.output(L1, GPIO.HIGH)
+    GPIO.output(L2, GPIO.LOW)
+
+def left_backward():
+    GPIO.output(L1, GPIO.LOW)
+    GPIO.output(L2, GPIO.HIGH)
+
+# -------------------------------------------------- #
+# Right Motor Functions                              #
+# -------------------------------------------------- #
+def right_stop():
+    GPIO.output(R1, GPIO.LOW)
+    GPIO.output(R2, GPIO.LOW)
+
+def right_forward():
+    GPIO.output(R1, GPIO.HIGH)
+    GPIO.output(R2, GPIO.LOW)
+
+def right_backward():
+    GPIO.output(R1, GPIO.LOW)
+    GPIO.output(R2, GPIO.HIGH)
+
+# -------------------------------------------------- #
+# Macro definition part                              #
+# -------------------------------------------------- #
+
+def go_forward():
+    left_forward()
+    right_forward()
+
+def go_backward():
+    left_backward()
+    right_backward()
+
+def turn_left():
+    left_backward()
+    right_forward()
+
+def turn_right():
+    left_forward()
+    right_backward()
+
+def stop():
+    left_stop()
+    right_stop()
+    
+# -------------------------------------------------- #
+# Initialization part                                #
+# -------------------------------------------------- #
+
+# Setup GPIOs
+GPIO.setFunction(LS, GPIO.PWM)
+GPIO.setFunction(L1, GPIO.OUT)
+GPIO.setFunction(L2, GPIO.OUT)
+
+GPIO.setFunction(RS, GPIO.PWM)
+GPIO.setFunction(R1, GPIO.OUT)
+GPIO.setFunction(R2, GPIO.OUT)
+
+set_speed(0.5)
+stop()
+
+# -------------------------------------------------- #
+# Main server part                                   #
+# -------------------------------------------------- #
+
+
+# Instantiate the server on the port 8000, it starts immediately in its own thread
+server = webiopi.Server(port=8000, login="cambot", password="cambot")
+
+# Register the macros so you can call it with Javascript and/or REST API
+
+server.addMacro(go_forward)
+server.addMacro(go_backward)
+server.addMacro(turn_left)
+server.addMacro(turn_right)
+server.addMacro(stop)
+
+# -------------------------------------------------- #
+# Loop execution part                                #
+# -------------------------------------------------- #
+
+# Run our loop until CTRL-C is pressed or SIGTERM received
+webiopi.runLoop()
+
+# -------------------------------------------------- #
+# Termination part                                   #
+# -------------------------------------------------- #
+
+# Stop the server
+server.stop()
+
+# Reset GPIO functions
+GPIO.setFunction(LS, GPIO.IN)
+GPIO.setFunction(L1, GPIO.IN)
+GPIO.setFunction(L2, GPIO.IN)
+
+GPIO.setFunction(RS, GPIO.IN)
+GPIO.setFunction(R1, GPIO.IN)
+GPIO.setFunction(R2, GPIO.IN)
+
diff --git a/examples/magpi-9-cambot/index.html b/examples/magpi-9-cambot/index.html
new file mode 100644
index 0000000..db69b41
--- /dev/null
+++ b/examples/magpi-9-cambot/index.html
@@ -0,0 +1,70 @@
+
+
+
+	
+	 
+	CamBot
+	
+	
+	
+
+
+	
+
+
+
+
+
+ + diff --git a/examples/magpi-9-cambot/stream.sh b/examples/magpi-9-cambot/stream.sh new file mode 100755 index 0000000..12d6579 --- /dev/null +++ b/examples/magpi-9-cambot/stream.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +STREAMER=mjpg_streamer +DEVICE=/dev/video0 +RESOLUTION=320x240 +FRAMERATE=25 +HTTP_PORT=8001 + +PLUGINPATH=/usr/local/lib + +$STREAMER -i "$PLUGINPATH/input_uvc.so -n -d $DEVICE -r $RESOLUTION -f $FRAMERATE" -o "$PLUGINPATH/output_http.so -n -p $HTTP_PORT" diff --git a/examples/magpi-9-cambot2/cambot.py b/examples/magpi-9-cambot2/cambot.py new file mode 100644 index 0000000..f1013ab --- /dev/null +++ b/examples/magpi-9-cambot2/cambot.py @@ -0,0 +1,117 @@ +# This version uses new-style automatic setup/destroy/mapping +# Need to change /etc/webiopi + +# Imports +import webiopi + +# Retrieve GPIO lib +GPIO = webiopi.GPIO + +# -------------------------------------------------- # +# Constants definition # +# -------------------------------------------------- # + +# Left motor GPIOs +L1=17 # H-Bridge 1 +L2=18 # H-Bridge 2 +LS=21 # H-Bridge 1,2EN + +# Right motor GPIOs +R1=23 # H-Bridge 3 +R2=24 # H-Bridge 4 +RS=25 # H-Bridge 3,4EN + +# -------------------------------------------------- # +# Convenient PWM Function # +# -------------------------------------------------- # + +# Set the speed of two motors +def set_speed(speed): + GPIO.pulseRatio(LS, speed) + GPIO.pulseRatio(RS, speed) + +# -------------------------------------------------- # +# Left Motor Functions # +# -------------------------------------------------- # + +def left_stop(): + GPIO.output(L1, GPIO.LOW) + GPIO.output(L2, GPIO.LOW) + +def left_forward(): + GPIO.output(L1, GPIO.HIGH) + GPIO.output(L2, GPIO.LOW) + +def left_backward(): + GPIO.output(L1, GPIO.LOW) + GPIO.output(L2, GPIO.HIGH) + +# -------------------------------------------------- # +# Right Motor Functions # +# -------------------------------------------------- # +def right_stop(): + GPIO.output(R1, GPIO.LOW) + GPIO.output(R2, GPIO.LOW) + +def right_forward(): + GPIO.output(R1, GPIO.HIGH) + GPIO.output(R2, GPIO.LOW) + +def right_backward(): + GPIO.output(R1, GPIO.LOW) + GPIO.output(R2, GPIO.HIGH) + +# -------------------------------------------------- # +# Macro definition part # +# -------------------------------------------------- # +@webiopi.macro +def go_forward(): + left_forward() + right_forward() + +@webiopi.macro +def go_backward(): + left_backward() + right_backward() + +@webiopi.macro +def turn_left(): + left_backward() + right_forward() + +@webiopi.macro +def turn_right(): + left_forward() + right_backward() + +@webiopi.macro +def stop(): + left_stop() + right_stop() + +# Called by WebIOPi at script loading +def setup(): + # Setup GPIOs + GPIO.setFunction(LS, GPIO.PWM) + GPIO.setFunction(L1, GPIO.OUT) + GPIO.setFunction(L2, GPIO.OUT) + + GPIO.setFunction(RS, GPIO.PWM) + GPIO.setFunction(R1, GPIO.OUT) + GPIO.setFunction(R2, GPIO.OUT) + + set_speed(0.5) + stop() + + +# Called by WebIOPi at server shutdown +def destroy(): + # Reset GPIO functions + GPIO.setFunction(LS, GPIO.IN) + GPIO.setFunction(L1, GPIO.IN) + GPIO.setFunction(L2, GPIO.IN) + + GPIO.setFunction(RS, GPIO.IN) + GPIO.setFunction(R1, GPIO.IN) + GPIO.setFunction(R2, GPIO.IN) + diff --git a/examples/magpi-9-cambot2/index.html b/examples/magpi-9-cambot2/index.html new file mode 100644 index 0000000..db69b41 --- /dev/null +++ b/examples/magpi-9-cambot2/index.html @@ -0,0 +1,70 @@ + + + + + + CamBot + + + + + +
+
+
+
+
+
+ + diff --git a/examples/magpi-9-cambot2/stream.sh b/examples/magpi-9-cambot2/stream.sh new file mode 100755 index 0000000..12d6579 --- /dev/null +++ b/examples/magpi-9-cambot2/stream.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +STREAMER=mjpg_streamer +DEVICE=/dev/video0 +RESOLUTION=320x240 +FRAMERATE=25 +HTTP_PORT=8001 + +PLUGINPATH=/usr/local/lib + +$STREAMER -i "$PLUGINPATH/input_uvc.so -n -d $DEVICE -r $RESOLUTION -f $FRAMERATE" -o "$PLUGINPATH/output_http.so -n -p $HTTP_PORT" diff --git a/examples/scripts/basic/script.py b/examples/scripts/basic/script.py new file mode 100644 index 0000000..5750a69 --- /dev/null +++ b/examples/scripts/basic/script.py @@ -0,0 +1,34 @@ +# Imports +import webiopi + +# Enable debug output +webiopi.setDebug() + +# Retrieve GPIO lib +GPIO = webiopi.GPIO +SWITCH = 21 +SERVO = 23 +LED0 = 24 +LED1 = 25 + +# Called by WebIOPi at script loading +def setup(): + webiopi.debug("Basic script - Setup") + # Setup GPIOs + GPIO.setFunction(SWITCH, GPIO.IN) + GPIO.setFunction(SERVO, GPIO.PWM) + GPIO.setFunction(LED0, GPIO.PWM) + GPIO.setFunction(LED1, GPIO.OUT) + + GPIO.pwmWrite(LED0, 0.5) # set to 50% ratio + GPIO.pwmWriteAngle(SERVO, 0) # set to 0 (neutral) + GPIO.digitalWrite(LED1, GPIO.HIGH) + +# Called by WebIOPi at server shutdown +def destroy(): + webiopi.debug("Basic script - Destroy") + # Reset GPIO functions + GPIO.setFunction(SWITCH, GPIO.IN) + GPIO.setFunction(SERVO, GPIO.IN) + GPIO.setFunction(LED0, GPIO.IN) + GPIO.setFunction(LED1, GPIO.IN) diff --git a/examples/scripts/blink/script.py b/examples/scripts/blink/script.py new file mode 100644 index 0000000..90c6c8c --- /dev/null +++ b/examples/scripts/blink/script.py @@ -0,0 +1,41 @@ +# Imports +import webiopi + +# Enable debug output +webiopi.setDebug() + +# Retrieve GPIO lib +GPIO = webiopi.GPIO +SWITCH = 21 +SERVO = 23 +LED0 = 24 +LED1 = 25 + +# Called by WebIOPi at script loading +def setup(): + webiopi.debug("Blink script - Setup") + # Setup GPIOs + GPIO.setFunction(SWITCH, GPIO.IN) + GPIO.setFunction(SERVO, GPIO.PWM) + GPIO.setFunction(LED0, GPIO.PWM) + GPIO.setFunction(LED1, GPIO.OUT) + + GPIO.pwmWrite(LED0, 0.5) # set to 50% ratio + GPIO.pwmWriteAngle(SERVO, 0) # set to 0 (neutral) + GPIO.digitalWrite(LED1, GPIO.HIGH) + +# Looped by WebIOPi +def loop(): + # Toggle LED each 5 seconds + value = not GPIO.digitalRead(LED1) + GPIO.digitalWrite(LED1, value) + webiopi.sleep(5) + +# Called by WebIOPi at server shutdown +def destroy(): + webiopi.debug("Blink script - Destroy") + # Reset GPIO functions + GPIO.setFunction(SWITCH, GPIO.IN) + GPIO.setFunction(SERVO, GPIO.IN) + GPIO.setFunction(LED0, GPIO.IN) + GPIO.setFunction(LED1, GPIO.IN) diff --git a/examples/scripts/macros/index.html b/examples/scripts/macros/index.html new file mode 100644 index 0000000..2dc118e --- /dev/null +++ b/examples/scripts/macros/index.html @@ -0,0 +1,120 @@ + + + + + + WebIOPi | Demo + + + + + +
+ + diff --git a/examples/scripts/macros/script.py b/examples/scripts/macros/script.py new file mode 100644 index 0000000..a469b1a --- /dev/null +++ b/examples/scripts/macros/script.py @@ -0,0 +1,60 @@ +# Imports +import webiopi +import time + +# Enable debug output +webiopi.setDebug() + +# Retrieve GPIO lib +GPIO = webiopi.GPIO + +SWITCH = 21 +SERVO = 23 +LED0 = 24 +LED1 = 25 + +# Called by WebIOPi at script loading +def setup(): + webiopi.debug("Script with macros - Setup") + # Setup GPIOs + GPIO.setFunction(SWITCH, GPIO.IN) + GPIO.setFunction(SERVO, GPIO.PWM) + GPIO.setFunction(LED0, GPIO.PWM) + GPIO.setFunction(LED1, GPIO.OUT) + + GPIO.pwmWrite(LED0, 0.5) # set to 50% ratio + GPIO.pwmWriteAngle(SERVO, 0) # set to 0 (neutral) + GPIO.digitalWrite(LED1, GPIO.HIGH) + + gpio0 = webiopi.deviceInstance("gpio0") + gpio0.digitalWrite(0, 0) + +# Looped by WebIOPi +def loop(): + # Toggle LED each 5 seconds + value = not GPIO.digitalRead(LED1) + GPIO.digitalWrite(LED1, value) + webiopi.sleep(5) + +# Called by WebIOPi at server shutdown +def destroy(): + webiopi.debug("Script with macros - Destroy") + # Reset GPIO functions + GPIO.setFunction(SWITCH, GPIO.IN) + GPIO.setFunction(SERVO, GPIO.IN) + GPIO.setFunction(LED0, GPIO.IN) + GPIO.setFunction(LED1, GPIO.IN) + gpio0 = webiopi.deviceInstance("gpio0") + gpio0.digitalWrite(0, 1) + +# A macro which says hello +@webiopi.macro +def HelloWorld(first, last): + webiopi.debug("HelloWorld(%s, %s)" % (first, last)) + return "Hello %s %s !" % (first, last) + +# A macro without args which return nothing +@webiopi.macro +def PrintTime(): + webiopi.debug("PrintTime: " + time.asctime()) + diff --git a/examples/scripts/simple/index.html b/examples/scripts/simple/index.html new file mode 100644 index 0000000..516ecbe --- /dev/null +++ b/examples/scripts/simple/index.html @@ -0,0 +1,68 @@ + + + + + + WebIOPi | Demo + + + + + +
+ + diff --git a/htdocs/app/devices-monitor/index.html b/htdocs/app/devices-monitor/index.html new file mode 100644 index 0000000..6e969dc --- /dev/null +++ b/htdocs/app/devices-monitor/index.html @@ -0,0 +1,36 @@ + + + + + + WebIOPi | Devices Monitor + + + + + +

Devices Monitor

+
+
+ + diff --git a/htdocs/app/gpio-header/index.html b/htdocs/app/gpio-header/index.html new file mode 100644 index 0000000..0634b1e --- /dev/null +++ b/htdocs/app/gpio-header/index.html @@ -0,0 +1,18 @@ + + + + + + WebIOPi | GPIO Header + + + + +
+ + diff --git a/htdocs/app/gpio-list/index.html b/htdocs/app/gpio-list/index.html new file mode 100644 index 0000000..6c0cf1a --- /dev/null +++ b/htdocs/app/gpio-list/index.html @@ -0,0 +1,28 @@ + + + + + + WebIOPi | GPIO List + + + + + +
+ + diff --git a/htdocs/app/serial-monitor/index.html b/htdocs/app/serial-monitor/index.html new file mode 100644 index 0000000..cdc8524 --- /dev/null +++ b/htdocs/app/serial-monitor/index.html @@ -0,0 +1,64 @@ + + + + + + WebIOPi | Serial Monitor + + + + + +

Serial Monitor

+Serial device :
+Input :
+
+Output : + + diff --git a/htdocs/index.html b/htdocs/index.html new file mode 100644 index 0000000..68c49c9 --- /dev/null +++ b/htdocs/index.html @@ -0,0 +1,25 @@ + + + + + + WebIOPi | Raspberry Pi IoT Framework + + + +

WebIOPi Main Menu

+ +

GPIO Header

+

Control and Debug the Raspberry Pi GPIO with a display which looks like the physical header.

+ +

GPIO List

+

Control and Debug the Raspberry Pi GPIO ordered in a single column.

+ +

Serial Monitor

+

Use the browser to play with Serial interfaces configured in WebIOPi.

+ +

Devices Monitor

+

Control and Debug devices and circuits wired to your Pi and configured in WebIOPi.

+ + + diff --git a/htdocs/jquery-mobile.css b/htdocs/jquery-mobile.css new file mode 100644 index 0000000..3a52bf0 --- /dev/null +++ b/htdocs/jquery-mobile.css @@ -0,0 +1,2 @@ +/*! jQuery Mobile vGit Build: SHA1: b49cc06499abf8f987cf90f35349cfac0918c939 <> Date: Tue Oct 2 11:22:34 2012 -0700 jquerymobile.com | jquery.org/license !*/ +.ui-mobile,.ui-mobile body{height:99.9%}.ui-mobile fieldset,.ui-page{padding:0;margin:0}.ui-mobile a img,.ui-mobile fieldset{border-width:0}.ui-mobile-viewport{margin:0;overflow-x:visible;-webkit-text-size-adjust:100%;-ms-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}body.ui-mobile-viewport,div.ui-mobile-viewport{overflow-x:hidden}.ui-mobile [data-role=page],.ui-mobile [data-role=dialog],.ui-page{top:0;left:0;width:100%;min-height:100%;position:absolute;display:none;border:0}.ui-mobile .ui-page-active{display:block;overflow:visible}.ui-page{outline:none}@media screen and (orientation:portrait){.ui-mobile,.ui-mobile .ui-page{min-height:420px}}@media screen and (orientation:landscape){.ui-mobile,.ui-mobile .ui-page{min-height:300px}}.ui-loading .ui-loader{display:block}.ui-loader{display:none;z-index:9999999;position:fixed;top:50%;left:50%;border:0}.ui-loader-default{background:none;filter:Alpha(Opacity=18);opacity:.18;width:46px;height:46px;margin-left:-23px;margin-top:-23px}.ui-loader-verbose{width:200px;filter:Alpha(Opacity=88);opacity:.88;box-shadow:0 1px 1px -1px #fff;height:auto;margin-left:-110px;margin-top:-43px;padding:10px}.ui-loader-default h1{font-size:0;width:0;height:0;overflow:hidden}.ui-loader-verbose h1{font-size:16px;margin:0;text-align:center}.ui-loader .ui-icon{background-color:#000;display:block;margin:0;width:44px;height:44px;padding:1px;-webkit-border-radius:36px;-moz-border-radius:36px;border-radius:36px}.ui-loader-verbose .ui-icon{margin:0 auto 10px;filter:Alpha(Opacity=75);opacity:.75}.ui-loader-textonly{padding:15px;margin-left:-115px}.ui-loader-textonly .ui-icon{display:none}.ui-loader-fakefix{position:absolute}.ui-mobile-rendering > *{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-header,.ui-footer{position:relative;border-left-width:0;border-right-width:0;zoom:1}.ui-header .ui-btn-left,.ui-header .ui-btn-right,.ui-footer .ui-btn-left,.ui-footer .ui-btn-right{position:absolute;top:3px}.ui-header .ui-btn-left,.ui-footer .ui-btn-left{left:5px}.ui-header .ui-btn-right,.ui-footer .ui-btn-right{right:5px}.ui-footer .ui-btn-icon-notext,.ui-header .ui-btn-icon-notext{top:6px}.ui-header .ui-title,.ui-footer .ui-title{min-height:1.1em;text-align:center;font-size:16px;display:block;margin:.6em 30% .8em;padding:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;outline:0!important}.ui-footer .ui-title{margin:.6em 15px .8em}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-icon{width:18px;height:18px}.ui-nojs{position:absolute;left:-9999px}.ui-hide-label label.ui-input-text,.ui-hide-label label.ui-select,.ui-hide-label label.ui-slider,.ui-hide-label label.ui-submit,.ui-hide-label .ui-controlgroup-label,.ui-hidden-accessible{position:absolute!important;left:-9999px;clip:rect(1px);clip:rect(1px,1px,1px,1px)}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.ui-page-pre-in{opacity:0}.in{-webkit-animation-timing-function:ease-out;-webkit-animation-duration:350ms;-moz-animation-timing-function:ease-out;-moz-animation-duration:350ms}.out{-webkit-animation-timing-function:ease-in;-webkit-animation-duration:225ms;-moz-animation-timing-function:ease-in;-moz-animation-duration:225ms}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.out{opacity:0;-webkit-animation-duration:125ms;-webkit-animation-name:fadeout;-moz-animation-duration:125ms;-moz-animation-name:fadeout}.fade.in{opacity:1;-webkit-animation-duration:225ms;-webkit-animation-name:fadein;-moz-animation-duration:225ms;-moz-animation-name:fadein}.pop{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);-moz-transform:scale(1);opacity:1;-webkit-animation-name:popin;-moz-animation-name:popin;-webkit-animation-duration:350ms;-moz-animation-duration:350ms}.pop.out{-webkit-animation-name:fadeout;-moz-animation-name:fadeout;opacity:0;-webkit-animation-duration:100ms;-moz-animation-duration:100ms}.pop.in.reverse{-webkit-animation-name:fadein;-moz-animation-name:fadein}.pop.out.reverse{-webkit-transform:scale(.8);-moz-transform:scale(.8);-webkit-animation-name:popout;-moz-animation-name:popout}@-webkit-keyframes popin{from{-webkit-transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-moz-keyframes popin{from{-moz-transform:scale(.8);opacity:0}to{-moz-transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.8);opacity:0}}@-moz-keyframes popout{from{-moz-transform:scale(1);opacity:1}to{-moz-transform:scale(.8);opacity:0}}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-moz-keyframes slideinfromright{from{-moz-transform:translateX(100%)}to{-moz-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-moz-keyframes slideinfromleft{from{-moz-transform:translateX(-100%)}to{-moz-transform:translateX(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-moz-keyframes slideouttoleft{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-moz-keyframes slideouttoright{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(100%)}}.slide.out,.slide.in{-webkit-animation-timing-function:ease-out;-webkit-animation-duration:350ms;-moz-animation-timing-function:ease-out;-moz-animation-duration:350ms}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft;-moz-transform:translateX(-100%);-moz-animation-name:slideouttoleft}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright;-moz-transform:translateX(0);-moz-animation-name:slideinfromright}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright;-moz-transform:translateX(100%);-moz-animation-name:slideouttoright}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft;-moz-transform:translateX(0);-moz-animation-name:slideinfromleft}.slidefade.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft;-moz-transform:translateX(-100%);-moz-animation-name:slideouttoleft;-webkit-animation-duration:225ms;-moz-animation-duration:225ms}.slidefade.in{-webkit-transform:translateX(0);-webkit-animation-name:fadein;-moz-transform:translateX(0);-moz-animation-name:fadein;-webkit-animation-duration:200ms;-moz-animation-duration:200ms}.slidefade.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright;-moz-transform:translateX(100%);-moz-animation-name:slideouttoright;-webkit-animation-duration:200ms;-moz-animation-duration:200ms}.slidefade.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:fadein;-moz-transform:translateX(0);-moz-animation-name:fadein;-webkit-animation-duration:200ms;-moz-animation-duration:200ms}.slidedown.out{-webkit-animation-name:fadeout;-moz-animation-name:fadeout;-webkit-animation-duration:100ms;-moz-animation-duration:100ms}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;-moz-transform:translateY(0);-moz-animation-name:slideinfromtop;-webkit-animation-duration:250ms;-moz-animation-duration:250ms}.slidedown.in.reverse{-webkit-animation-name:fadein;-moz-animation-name:fadein;-webkit-animation-duration:150ms;-moz-animation-duration:150ms}.slidedown.out.reverse{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-webkit-animation-name:slideouttotop;-moz-animation-name:slideouttotop;-webkit-animation-duration:200ms;-moz-animation-duration:200ms}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translateY(-100%)}to{-webkit-transform:translateY(0)}}@-moz-keyframes slideinfromtop{from{-moz-transform:translateY(-100%)}to{-moz-transform:translateY(0)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(-100%)}}@-moz-keyframes slideouttotop{from{-moz-transform:translateY(0)}to{-moz-transform:translateY(-100%)}}.slideup.out{-webkit-animation-name:fadeout;-moz-animation-name:fadeout;-webkit-animation-duration:100ms;-moz-animation-duration:100ms}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;-moz-transform:translateY(0);-moz-animation-name:slideinfrombottom;-webkit-animation-duration:250ms;-moz-animation-duration:250ms}.slideup.in.reverse{-webkit-animation-name:fadein;-moz-animation-name:fadein;-webkit-animation-duration:150ms;-moz-animation-duration:150ms}.slideup.out.reverse{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-webkit-animation-name:slideouttobottom;-moz-animation-name:slideouttobottom;-webkit-animation-duration:200ms;-moz-animation-duration:200ms}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-moz-keyframes slideinfrombottom{from{-moz-transform:translateY(100%)}to{-moz-transform:translateY(0)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-moz-keyframes slideouttobottom{from{-moz-transform:translateY(0)}to{-moz-transform:translateY(100%)}}.viewport-flip{-webkit-perspective:1000;-moz-perspective:1000;position:absolute}.flip{-webkit-backface-visibility:hidden;-webkit-transform:translateX(0);-moz-backface-visibility:hidden;-moz-transform:translateX(0)}.flip.out{-webkit-transform:rotateY(-90deg) scale(.9);-webkit-animation-name:flipouttoleft;-webkit-animation-duration:175ms;-moz-transform:rotateY(-90deg) scale(.9);-moz-animation-name:flipouttoleft;-moz-animation-duration:175ms}.flip.in{-webkit-animation-name:flipintoright;-webkit-animation-duration:225ms;-moz-animation-name:flipintoright;-moz-animation-duration:225ms}.flip.out.reverse{-webkit-transform:rotateY(90deg) scale(.9);-webkit-animation-name:flipouttoright;-moz-transform:rotateY(90deg) scale(.9);-moz-animation-name:flipouttoright}.flip.in.reverse{-webkit-animation-name:flipintoleft;-moz-animation-name:flipintoleft}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0)}to{-webkit-transform:rotateY(-90deg) scale(.9)}}@-moz-keyframes flipouttoleft{from{-moz-transform:rotateY(0)}to{-moz-transform:rotateY(-90deg) scale(.9)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(.9)}}@-moz-keyframes flipouttoright{from{-moz-transform:rotateY(0)}to{-moz-transform:rotateY(90deg) scale(.9)}}@-webkit-keyframes flipintoleft{from{-webkit-transform:rotateY(-90deg) scale(.9)}to{-webkit-transform:rotateY(0)}}@-moz-keyframes flipintoleft{from{-moz-transform:rotateY(-90deg) scale(.9)}to{-moz-transform:rotateY(0)}}@-webkit-keyframes flipintoright{from{-webkit-transform:rotateY(90deg) scale(.9)}to{-webkit-transform:rotateY(0)}}@-moz-keyframes flipintoright{from{-moz-transform:rotateY(90deg) scale(.9)}to{-moz-transform:rotateY(0)}}.viewport-turn{-webkit-perspective:1000;-moz-perspective:1000;position:absolute}.turn{-webkit-backface-visibility:hidden;-webkit-transform:translateX(0);-webkit-transform-origin:0;-moz-backface-visibility:hidden;-moz-transform:translateX(0);-moz-transform-origin:0}.turn.out{-webkit-transform:rotateY(-90deg) scale(.9);-webkit-animation-name:flipouttoleft;-moz-transform:rotateY(-90deg) scale(.9);-moz-animation-name:flipouttoleft;-webkit-animation-duration:125ms;-moz-animation-duration:125ms}.turn.in{-webkit-animation-name:flipintoright;-moz-animation-name:flipintoright;-webkit-animation-duration:250ms;-moz-animation-duration:250ms}.turn.out.reverse{-webkit-transform:rotateY(90deg) scale(.9);-webkit-animation-name:flipouttoright;-moz-transform:rotateY(90deg) scale(.9);-moz-animation-name:flipouttoright}.turn.in.reverse{-webkit-animation-name:flipintoleft;-moz-animation-name:flipintoleft}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0)}to{-webkit-transform:rotateY(-90deg) scale(.9)}}@-moz-keyframes flipouttoleft{from{-moz-transform:rotateY(0)}to{-moz-transform:rotateY(-90deg) scale(.9)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(.9)}}@-moz-keyframes flipouttoright{from{-moz-transform:rotateY(0)}to{-moz-transform:rotateY(90deg) scale(.9)}}@-webkit-keyframes flipintoleft{from{-webkit-transform:rotateY(-90deg) scale(.9)}to{-webkit-transform:rotateY(0)}}@-moz-keyframes flipintoleft{from{-moz-transform:rotateY(-90deg) scale(.9)}to{-moz-transform:rotateY(0)}}@-webkit-keyframes flipintoright{from{-webkit-transform:rotateY(90deg) scale(.9)}to{-webkit-transform:rotateY(0)}}@-moz-keyframes flipintoright{from{-moz-transform:rotateY(90deg) scale(.9)}to{-moz-transform:rotateY(0)}}.flow{-webkit-transform-origin:50% 30%;-moz-transform-origin:50% 30%;-webkit-box-shadow:0 0 20px rgba(0,0,0,.4);-moz-box-shadow:0 0 20px rgba(0,0,0,.4)}.ui-dialog.flow{-webkit-transform-origin:none;-moz-transform-origin:none;-webkit-box-shadow:none;-moz-box-shadow:none}.flow.out{-webkit-transform:translateX(-100%) scale(.7);-webkit-animation-name:flowouttoleft;-webkit-animation-timing-function:ease;-webkit-animation-duration:350ms;-moz-transform:translateX(-100%) scale(.7);-moz-animation-name:flowouttoleft;-moz-animation-timing-function:ease;-moz-animation-duration:350ms}.flow.in{-webkit-transform:translateX(0) scale(1);-webkit-animation-name:flowinfromright;-webkit-animation-timing-function:ease;-webkit-animation-duration:350ms;-moz-transform:translateX(0) scale(1);-moz-animation-name:flowinfromright;-moz-animation-timing-function:ease;-moz-animation-duration:350ms}.flow.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:flowouttoright;-moz-transform:translateX(100%);-moz-animation-name:flowouttoright}.flow.in.reverse{-webkit-animation-name:flowinfromleft;-moz-animation-name:flowinfromleft}@-webkit-keyframes flowouttoleft{0%{-webkit-transform:translateX(0) scale(1)}60%,70%{-webkit-transform:translateX(0) scale(.7)}100%{-webkit-transform:translateX(-100%) scale(.7)}}@-moz-keyframes flowouttoleft{0%{-moz-transform:translateX(0) scale(1)}60%,70%{-moz-transform:translateX(0) scale(.7)}100%{-moz-transform:translateX(-100%) scale(.7)}}@-webkit-keyframes flowouttoright{0%{-webkit-transform:translateX(0) scale(1)}60%,70%{-webkit-transform:translateX(0) scale(.7)}100%{-webkit-transform:translateX(100%) scale(.7)}}@-moz-keyframes flowouttoright{0%{-moz-transform:translateX(0) scale(1)}60%,70%{-moz-transform:translateX(0) scale(.7)}100%{-moz-transform:translateX(100%) scale(.7)}}@-webkit-keyframes flowinfromleft{0%{-webkit-transform:translateX(-100%) scale(.7)}30%,40%{-webkit-transform:translateX(0) scale(.7)}100%{-webkit-transform:translateX(0) scale(1)}}@-moz-keyframes flowinfromleft{0%{-moz-transform:translateX(-100%) scale(.7)}30%,40%{-moz-transform:translateX(0) scale(.7)}100%{-moz-transform:translateX(0) scale(1)}}@-webkit-keyframes flowinfromright{0%{-webkit-transform:translateX(100%) scale(.7)}30%,40%{-webkit-transform:translateX(0) scale(.7)}100%{-webkit-transform:translateX(0) scale(1)}}@-moz-keyframes flowinfromright{0%{-moz-transform:translateX(100%) scale(.7)}30%,40%{-moz-transform:translateX(0) scale(.7)}100%{-moz-transform:translateX(0) scale(1)}}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.ui-grid-solo .ui-block-a{display:block;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:49.95%}.ui-grid-a >:nth-child(n){width:50%;margin-right:-.5px}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.25%}.ui-grid-b >:nth-child(n){width:33.333%;margin-right:-.5px}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:24.925%}.ui-grid-c >:nth-child(n){width:25%;margin-right:-.5px}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:19.925%}.ui-grid-d >:nth-child(n){width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-header-fixed,.ui-footer-fixed{left:0;right:0;width:100%;position:fixed;z-index:1000}.ui-header-fixed{top:0}.ui-footer-fixed{bottom:0}.ui-header-fullscreen,.ui-footer-fullscreen{filter:Alpha(Opacity=90);opacity:.9}.ui-page-header-fixed{padding-top:2.6875em}.ui-page-footer-fixed{padding-bottom:2.6875em}.ui-page-header-fullscreen .ui-content,.ui-page-footer-fullscreen .ui-content{padding:0}.ui-fixed-hidden{position:absolute}.ui-page-header-fullscreen .ui-fixed-hidden,.ui-page-footer-fullscreen .ui-fixed-hidden{left:-9999px}.ui-header-fixed .ui-btn,.ui-footer-fixed .ui-btn{z-index:10}.ui-navbar{max-width:100%}.ui-navbar.ui-mini{margin:0}.ui-navbar ul:before,.ui-navbar ul:after{content:" ";display:table}.ui-navbar ul:after{clear:both}.ui-navbar ul{list-style:none;margin:0;padding:0;position:relative;display:block;border:0;max-width:100%;overflow:visible;zoom:1}.ui-navbar li .ui-btn{display:block;text-align:center;margin:0 -1px 0 0;border-right-width:0}.ui-navbar li .ui-btn-icon-right .ui-icon{right:6px}.ui-navbar li:last-child .ui-btn,.ui-navbar .ui-grid-duo .ui-block-b .ui-btn{margin-right:0;border-right-width:1px}.ui-header .ui-navbar li:last-child .ui-btn,.ui-footer .ui-navbar li:last-child .ui-btn,.ui-header .ui-navbar .ui-grid-duo .ui-block-b .ui-btn,.ui-footer .ui-navbar .ui-grid-duo .ui-block-b .ui-btn{margin-right:-1px;border-right-width:0}.ui-navbar .ui-grid-duo li.ui-block-a:last-child .ui-btn{margin-right:-1px;border-right-width:1px}.ui-header .ui-navbar li .ui-btn,.ui-footer .ui-navbar li .ui-btn{border-top-width:0;border-bottom-width:0}.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn,.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn{margin-right:-5px}.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn,.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn{margin-right:-4px}.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon,.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon{right:8px}.ui-navbar li .ui-btn .ui-btn-inner{padding-top:.7em;padding-bottom:.8em}.ui-navbar li .ui-btn-icon-top .ui-btn-inner{padding-top:30px}.ui-navbar li .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:30px}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 0;padding:0}.ui-mini{margin-top:.25em;margin-bottom:.25em}.ui-btn-left,.ui-btn-right,.ui-input-clear,.ui-btn-inline,.ui-grid-a .ui-btn,.ui-grid-b .ui-btn,.ui-grid-c .ui-btn,.ui-grid-d .ui-btn,.ui-grid-e .ui-btn,.ui-grid-solo .ui-btn{margin-right:5px;margin-left:5px}.ui-btn-inner{font-size:16px;padding:.6em 20px;min-width:.75em;display:block;position:relative;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;zoom:1}.ui-btn input,.ui-btn button{z-index:2}.ui-btn-left,.ui-btn-right,.ui-btn-inline{display:inline-block;vertical-align:middle}.ui-mobile .ui-btn-left,.ui-mobile .ui-btn-right{margin:0}.ui-btn-block{display:block}.ui-header > .ui-btn,.ui-footer > .ui-btn{display:inline-block;margin:0}.ui-header .ui-btn-block,.ui-footer .ui-btn-block{display:block}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-mini .ui-btn-inner{font-size:12.5px;padding:.55em 11px .5em}.ui-fullsize .ui-btn-inner,.ui-fullsize .ui-btn-inner{font-size:16px;padding:.6em 20px}.ui-btn-icon-notext{width:24px;height:24px}.ui-btn-icon-notext .ui-btn-inner{padding:0;height:100%}.ui-btn-icon-notext .ui-btn-inner .ui-icon{margin:2px 1px 2px 3px;float:left}.ui-btn-text{position:relative;z-index:1;width:100%;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-9999px}.ui-btn-icon-left .ui-btn-inner{padding-left:40px}.ui-btn-icon-right .ui-btn-inner{padding-right:40px}.ui-btn-icon-top .ui-btn-inner{padding-top:40px}.ui-btn-icon-bottom .ui-btn-inner{padding-bottom:40px}.ui-header .ui-btn-icon-left .ui-btn-inner,.ui-footer .ui-btn-icon-left .ui-btn-inner,.ui-mini.ui-btn-icon-left .ui-btn-inner,.ui-mini .ui-btn-icon-left .ui-btn-inner{padding-left:30px}.ui-header .ui-btn-icon-right .ui-btn-inner,.ui-footer .ui-btn-icon-right .ui-btn-inner,.ui-mini.ui-btn-icon-right .ui-btn-inner,.ui-mini .ui-btn-icon-right .ui-btn-inner{padding-right:30px}.ui-header .ui-btn-icon-top .ui-btn-inner,.ui-footer .ui-btn-icon-top .ui-btn-inner{padding:30px 3px .5em 3px}.ui-mini.ui-btn-icon-top .ui-btn-inner,.ui-mini .ui-btn-icon-top .ui-btn-inner{padding-top:30px}.ui-header .ui-btn-icon-bottom .ui-btn-inner,.ui-footer .ui-btn-icon-bottom .ui-btn-inner{padding:.55em 3px 30px 3px}.ui-mini.ui-btn-icon-bottom .ui-btn-inner,.ui-mini .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:30px}.ui-btn-icon-notext .ui-icon{display:block;z-index:0}.ui-btn-icon-left > .ui-btn-inner > .ui-icon,.ui-btn-icon-right > .ui-btn-inner > .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-btn-icon-top .ui-btn-inner .ui-icon,.ui-btn-icon-bottom .ui-btn-inner .ui-icon{position:absolute;left:50%;margin-left:-9px}.ui-btn-icon-left .ui-icon{left:10px}.ui-btn-icon-right .ui-icon{right:10px}.ui-btn-icon-top .ui-icon{top:10px}.ui-btn-icon-bottom .ui-icon{top:auto;bottom:10px}.ui-header .ui-btn-icon-left .ui-icon,.ui-footer .ui-btn-icon-left .ui-icon,.ui-mini.ui-btn-icon-left .ui-icon,.ui-mini .ui-btn-icon-left .ui-icon{left:5px}.ui-header .ui-btn-icon-right .ui-icon,.ui-footer .ui-btn-icon-right .ui-icon,.ui-mini.ui-btn-icon-right .ui-icon,.ui-mini .ui-btn-icon-right .ui-icon{right:5px}.ui-header .ui-btn-icon-top .ui-icon,.ui-footer .ui-btn-icon-top .ui-icon,.ui-mini.ui-btn-icon-top .ui-icon,.ui-mini .ui-btn-icon-top .ui-icon{top:5px}.ui-header .ui-btn-icon-bottom .ui-icon,.ui-footer .ui-btn-icon-bottom .ui-icon,.ui-mini.ui-btn-icon-bottom .ui-icon,.ui-mini .ui-btn-icon-bottom .ui-icon{bottom:5px}.ui-btn-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:none;cursor:pointer;background:#fff;background:rgba(255,255,255,0);filter:Alpha(Opacity=0);opacity:.1;font-size:1px;border:none;text-indent:-9999px}.ui-disabled .ui-btn-hidden{display:none}.ui-disabled{z-index:1}.ui-field-contain .ui-btn.ui-submit{margin:0}label.ui-submit{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}@media all and (min-width:450px){.ui-field-contain label.ui-submit{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-btn.ui-submit{width:78%;display:inline-block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.ui-hide-label .ui-btn.ui-submit{width:auto;display:block}}.ui-collapsible-inset{margin:.5em 0}.ui-collapsible-heading{font-size:16px;display:block;margin:0 -15px;padding:0;position:relative}.ui-collapsible-inset .ui-collapsible-heading{margin:0}.ui-collapsible-heading .ui-btn{text-align:left;margin:0;border-left-width:0;border-right-width:0}.ui-collapsible-inset .ui-collapsible-heading .ui-btn{border-right-width:1px;border-left-width:1px}.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn{border-top-width:0}.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn{border-top-width:1px}.ui-collapsible-heading .ui-btn-inner,.ui-collapsible-heading .ui-btn-icon-left .ui-btn-inner{padding-left:40px}.ui-collapsible-heading .ui-btn-icon-right .ui-btn-inner{padding-left:12px;padding-right:40px}.ui-collapsible-heading .ui-btn-icon-top .ui-btn-inner,.ui-collapsible-heading .ui-btn-icon-bottom .ui-btn-inner{padding-right:40px;text-align:center}.ui-collapsible-heading .ui-btn span.ui-btn{position:absolute;left:6px;top:50%;margin:-12px 0 0 0;width:20px;height:20px;padding:1px 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading .ui-btn span.ui-btn .ui-btn-inner{padding:10px 0}.ui-collapsible-heading .ui-btn span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;top:-9999px;left:0}.ui-collapsible-content{display:block;margin:0 -15px;padding:10px 15px;border-left-width:0;border-right-width:0;border-top:none;background-image:none}.ui-collapsible-inset .ui-collapsible-content{margin:0;border-right-width:1px;border-left-width:1px}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible{margin:-1px 0 0}.ui-collapsible-set .ui-collapsible:first-child{margin-top:0}.ui-controlgroup,fieldset.ui-controlgroup{padding:0;margin:.5em 0;zoom:1}.ui-controlgroup.ui-mini,fieldset.ui-controlgroup.ui-mini{margin:.25em 0}.ui-field-contain .ui-controlgroup,.ui-field-contain fieldset.ui-controlgroup{margin:0}.ui-bar .ui-controlgroup{margin:0 5px}.ui-controlgroup-label{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .4em}.ui-controlgroup li{list-style:none}.ui-controlgroup-vertical .ui-btn,.ui-controlgroup-vertical .ui-checkbox,.ui-controlgroup-vertical .ui-radio{margin:0;border-bottom-width:0}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-controls label.ui-select{position:absolute;left:-9999px}.ui-controlgroup .ui-btn-icon-notext{width:auto;height:auto;top:auto}.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner{height:20px;padding:.6em 20px .6em 20px}.ui-controlgroup-horizontal .ui-btn-icon-notext .ui-btn-inner{width:18px}.ui-controlgroup.ui-mini .ui-btn-icon-notext .ui-btn-inner,.ui-header .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner,.ui-footer .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner{height:16px;padding:.55em 11px .5em 11px}.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner .ui-icon{position:absolute;top:50%;right:50%;margin:-9px -9px 0 0}.ui-controlgroup-horizontal .ui-controlgroup-controls:before,.ui-controlgroup-horizontal .ui-controlgroup-controls:after{content:"";display:table}.ui-controlgroup-horizontal .ui-controlgroup-controls:after{clear:both}.ui-controlgroup-horizontal .ui-controlgroup-controls{display:inline-block;vertical-align:middle;zoom:1}.ui-controlgroup-horizontal .ui-btn-inner{text-align:center}.ui-controlgroup-horizontal.ui-mini .ui-btn-inner{height:16px;line-height:16px}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-select,.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{float:left;clear:none;margin:0 -1px 0 0}.ui-controlgroup-horizontal .ui-select .ui-btn,.ui-controlgroup-horizontal .ui-checkbox .ui-btn,.ui-controlgroup-horizontal .ui-radio .ui-btn{float:none;margin:0}.ui-controlgroup-horizontal .ui-controlgroup-last,.ui-controlgroup-horizontal .ui-select:last-child,.ui-controlgroup-horizontal .ui-checkbox:last-child,.ui-controlgroup-horizontal .ui-radio:last-child{margin-right:0}.ui-controlgroup .ui-checkbox label,.ui-controlgroup .ui-radio label{font-size:16px}@media all and (min-width:450px){.ui-field-contain .ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-controlgroup-controls{width:78%;display:inline-block}.ui-field-contain .ui-controlgroup .ui-select{width:100%;display:block}.ui-field-contain .ui-controlgroup-horizontal .ui-select{width:auto}.ui-hide-label .ui-controlgroup-controls{width:100%}}.ui-dialog{background:none!important}.ui-dialog-contain{width:92.5%;max-width:500px;margin:10% auto 15px auto;padding:0;position:relative;top:-15px}.ui-dialog-contain > .ui-header,.ui-dialog-contain > .ui-content,.ui-dialog-contain > .ui-footer{display:block;position:relative;width:auto;margin:0}.ui-dialog-contain > .ui-header{border:none;overflow:hidden;z-index:10;padding:0}.ui-dialog-contain > .ui-content{padding:15px}.ui-dialog-contain > .ui-footer{z-index:10;padding:0 15px}.ui-popup-open .ui-header-fixed,.ui-popup-open .ui-footer-fixed{position:absolute!important}.ui-popup-screen{background-image:url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);top:0;left:0;right:0;bottom:1px;position:absolute;filter:Alpha(Opacity=0);opacity:0;z-index:1099}.ui-popup-screen.in{opacity:0.5;filter:Alpha(Opacity=50)}.ui-popup-screen.out{opacity:0;filter:Alpha(Opacity=0)}.ui-popup-container{z-index:1100;display:inline-block;position:absolute;padding:0;outline:0}.ui-popup{position:relative}.ui-popup.ui-content,.ui-popup .ui-content{overflow:visible}.ui-popup > p,.ui-popup > h1,.ui-popup > h2,.ui-popup > h3,.ui-popup > h4,.ui-popup > h5,.ui-popup > h6{margin:.5em 7px}.ui-popup > span{display:block;margin:.5em 7px}.ui-popup .ui-title{font-size:16px;font-weight:bold;margin-top:.5em;margin-bottom:.5em}.ui-popup-container .ui-content > p,.ui-popup-container .ui-content > h1,.ui-popup-container .ui-content > h2,.ui-popup-container .ui-content > h3,.ui-popup-container .ui-content > h4,.ui-popup-container .ui-content > h5,.ui-popup-container .ui-content > h6{margin:.5em 0}.ui-popup-container .ui-content > span{margin:0}.ui-popup-container .ui-content > p:first-child,.ui-popup-container .ui-content > h1:first-child,.ui-popup-container .ui-content > h2:first-child,.ui-popup-container .ui-content > h3:first-child,.ui-popup-container .ui-content > h4:first-child,.ui-popup-container .ui-content > h5:first-child,.ui-popup-container .ui-content > h6:first-child{margin-top:0}.ui-popup-container .ui-content > p:last-child,.ui-popup-container .ui-content > h1:last-child,.ui-popup-container .ui-content > h2:last-child,.ui-popup-container .ui-content > h3:last-child,.ui-popup-container .ui-content > h4:last-child,.ui-popup-container .ui-content > h5:last-child,.ui-popup-container .ui-content > h6:last-child{margin-bottom:0}.ui-popup > img{width:auto;height:auto;max-width:100%;max-height:100%;vertical-align:middle}.ui-popup iframe{vertical-align:middle}@media all and (min-width:450px){.ui-popup .ui-field-contain label.ui-submit,.ui-popup .ui-field-contain .ui-controlgroup-label,.ui-popup .ui-field-contain label.ui-select,.ui-popup .ui-field-contain label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}.ui-popup .ui-field-contain .ui-btn.ui-submit,.ui-popup .ui-field-contain .ui-controlgroup-controls,.ui-popup .ui-field-contain .ui-select,.ui-popup .ui-field-contain input.ui-input-text,.ui-popup .ui-field-contain textarea.ui-input-text,.ui-popup .ui-field-contain .ui-input-search{width:100%;display:block}}.ui-popup > .ui-btn-left,.ui-popup > .ui-btn-right{position:absolute;top:-9px;margin:0;z-index:1101}.ui-popup > .ui-btn-left{left:-9px}.ui-popup > .ui-btn-right{right:-9px}.ui-popup.ui-corner-all > .ui-header,.ui-popup.ui-corner-all ~ .ui-content,.ui-popup.ui-corner-all > .ui-content:first-child{-webkit-border-top-left-radius:inherit;border-top-left-radius:inherit;-webkit-border-top-right-radius:inherit;border-top-right-radius:inherit}.ui-popup.ui-corner-all > .ui-content,.ui-popup.ui-corner-all > .ui-footer,.ui-popup.ui-corner-all > .ui-header:nth-child(n):last-child{-webkit-border-bottom-left-radius:inherit;border-bottom-left-radius:inherit;-webkit-border-bottom-right-radius:inherit;border-bottom-right-radius:inherit}.ui-popup.ui-corner-all > .ui-content:nth-child(2),.ui-popup.ui-corner-all > .ui-header:nth-child(2){-webkit-border-top-left-radius:0;border-top-left-radius:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.ui-popup.ui-corner-all > .ui-content:nth-last-child(1n+2),.ui-popup.ui-corner-all > .ui-footer:nth-last-child(1n+2){-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.ui-popup.ui-corner-all > .ui-header:only-child,.ui-popup.ui-corner-all > .ui-footer:only-child{-webkit-border-radius:inherit;border-radius:inherit}.ui-checkbox,.ui-radio{position:relative;clear:both;margin:0;z-index:1}.ui-checkbox .ui-btn,.ui-radio .ui-btn{margin-top:.5em;margin-bottom:.5em;text-align:left;z-index:2}.ui-checkbox .ui-btn.ui-mini,.ui-radio .ui-btn.ui-mini{margin:.25em 0}.ui-controlgroup .ui-checkbox .ui-btn,.ui-controlgroup .ui-radio .ui-btn{margin:0}.ui-checkbox .ui-btn-inner,.ui-radio .ui-btn-inner{white-space:normal}.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner{padding-left:45px}.ui-checkbox .ui-mini.ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-mini.ui-btn-icon-left .ui-btn-inner{padding-left:36px}.ui-checkbox .ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-checkbox .ui-mini.ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-mini.ui-btn-icon-right .ui-btn-inner{padding-right:36px}.ui-checkbox .ui-btn-icon-top .ui-btn-inner,.ui-radio .ui-btn-icon-top .ui-btn-inner{padding-right:0;padding-left:0;text-align:center}.ui-checkbox .ui-btn-icon-bottom .ui-btn-inner,.ui-radio .ui-btn-icon-bottom .ui-btn-inner{padding-right:0;padding-left:0;text-align:center}.ui-checkbox .ui-icon,.ui-radio .ui-icon{top:1.1em}.ui-checkbox .ui-btn-icon-left .ui-icon,.ui-radio .ui-btn-icon-left .ui-icon{left:15px}.ui-checkbox .ui-mini.ui-btn-icon-left .ui-icon,.ui-radio .ui-mini.ui-btn-icon-left .ui-icon{left:9px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon,.ui-radio .ui-mini.ui-btn-icon-right .ui-icon{right:9px}.ui-checkbox .ui-btn-icon-top .ui-icon,.ui-radio .ui-btn-icon-top .ui-icon{top:10px}.ui-checkbox .ui-btn-icon-bottom .ui-icon,.ui-radio .ui-btn-icon-bottom .ui-icon{top:auto;bottom:10px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon,.ui-radio .ui-mini.ui-btn-icon-right .ui-icon{right:9px}.ui-checkbox input,.ui-radio input{position:absolute;left:20px;top:50%;width:10px;height:10px;margin:-5px 0 0 0;outline:0!important;z-index:1}.ui-field-contain,fieldset.ui-field-contain{padding:.8em 0;margin:0;border-width:0 0 1px 0;overflow:visible}.ui-field-contain:last-child{border-bottom-width:0}.ui-field-contain{max-width:100%}@media all and (min-width:450px){.ui-field-contain,.ui-mobile fieldset.ui-field-contain{border-width:0;padding:0;margin:1em 0}}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn{overflow:hidden;opacity:1}.ui-field-contain .ui-select .ui-btn{margin:0}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:none;left:0;top:0;width:100%;min-height:1.5em;min-height:100%;height:3em;max-height:100%;filter:Alpha(Opacity=0);opacity:0;z-index:2}.ui-select .ui-disabled{opacity:.3}.ui-select .ui-disabled select{display:none}@-moz-document url-prefix(){.ui-select .ui-btn select{opacity:0.0001}}.ui-select .ui-btn.ui-select-nativeonly{border-radius:0;border:0}.ui-select .ui-btn.ui-select-nativeonly select{opacity:1;text-indent:0;display:block}.ui-select .ui-disabled.ui-select-nativeonly .ui-btn-inner{opacity:0}.ui-select .ui-btn-icon-right .ui-btn-inner,.ui-select .ui-li-has-count .ui-btn-inner{padding-right:45px}.ui-select .ui-mini.ui-btn-icon-right .ui-btn-inner{padding-right:32px}.ui-select .ui-btn-icon-right.ui-li-has-count .ui-btn-inner{padding-right:80px}.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-btn-inner{padding-right:67px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}.ui-select .ui-mini.ui-btn-icon-right .ui-icon{right:7px}.ui-select .ui-btn-icon-right.ui-li-has-count .ui-li-count{right:45px}.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-li-count{right:32px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:block;min-height:1em;overflow:hidden!important}.ui-select .ui-btn-text{text-overflow:ellipsis}.ui-selectmenu{padding:6px;min-width:160px}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-99999px;left:-9999px}.ui-screen-hidden,.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.ui-selectmenu .ui-header{margin:0;padding:0}.ui-selectmenu .ui-header .ui-title{margin:0.6em 46px 0.8em}@media all and (min-width:450px){.ui-field-contain label.ui-select{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-select{width:78%;display:inline-block}.ui-hide-label .ui-select{width:100%}}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}input.ui-input-text,textarea.ui-input-text{background-image:none;padding:.4em;margin:.5em 0;line-height:1.4;font-size:16px;display:block;width:100%;outline:0}input.ui-input-text.ui-mini,textarea.ui-input-text.ui-mini{margin:.25em 0}.ui-field-contain input.ui-input-text,.ui-field-contain textarea.ui-input-text{margin:0}input.ui-input-text,textarea.ui-input-text,.ui-input-search{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}input.ui-input-text{-webkit-appearance:none}textarea.ui-input-text{height:50px;-webkit-transition:height 200ms linear;-moz-transition:height 200ms linear;-o-transition:height 200ms linear;transition:height 200ms linear}.ui-input-search{padding:0 30px;margin:.5em 0;background-image:none;position:relative}.ui-input-search.ui-mini{margin:.25em 0}.ui-field-contain .ui-input-search{margin:0}.ui-icon-searchfield:after{position:absolute;left:7px;top:50%;margin-top:-9px;content:"";width:18px;height:18px;opacity:.5}.ui-input-search input.ui-input-text{border:none;width:98%;padding:.4em 0;margin:0;display:block;background:transparent none;outline:0!important}.ui-input-search .ui-input-clear{position:absolute;right:0;top:50%;margin-top:-13px}.ui-mini .ui-input-clear{right:-3px}.ui-input-search .ui-input-clear-hidden{display:none}input.ui-mini,.ui-mini input,textarea.ui-mini{font-size:14px}textarea.ui-mini{height:45px}@media all and (min-width:450px){.ui-field-contain label.ui-input-text{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain input.ui-input-text,.ui-field-contain textarea.ui-input-text,.ui-field-contain .ui-input-search{width:78%;display:inline-block}.ui-hide-label input.ui-input-text,.ui-hide-label textarea.ui-input-text,.ui-hide-label .ui-input-search{width:100%}.ui-input-search input.ui-input-text{width:98%}}.ui-listview{margin:0}ol.ui-listview,ol.ui-listview .ui-li-divider{counter-reset:listnumbering}.ui-content .ui-listview{margin:-15px}.ui-collapsible-content > .ui-listview{margin:-10px -15px}.ui-content .ui-listview-inset{margin:1em 0}.ui-collapsible-content .ui-listview-inset{margin:.5em 0}.ui-listview,.ui-li{list-style:none;padding:0}.ui-li,.ui-li.ui-field-contain{display:block;margin:0;position:relative;overflow:visible;text-align:left;border-width:0;border-top-width:1px}.ui-li.ui-btn{margin:0}.ui-li .ui-btn-text a.ui-link-inherit{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-static{background-image:none}.ui-li-divider{padding:.5em 15px;font-size:14px;font-weight:bold}ol.ui-listview .ui-link-inherit:before,ol.ui-listview .ui-li-static:before,.ui-li-dec{font-size:.8em;display:inline-block;padding-right:.3em;font-weight:normal;counter-increment:listnumbering;content:counter(listnumbering) ". "}ol.ui-listview .ui-li-jsnumbering:before{content:""!important}.ui-listview-inset .ui-li{border-right-width:1px;border-left-width:1px}.ui-li-last,.ui-li.ui-field-contain.ui-li-last{border-bottom-width:1px}.ui-collapsible [class*="ui-body"] > .ui-listview:not(.ui-listview-inset) .ui-li-last{border-bottom-width:0}.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li:first-child{border-top-width:0}.ui-collapsible-content > .ui-listview:not(.ui-listview-inset),.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li-last{-webkit-border-bottom-left-radius:inherit;-webkit-border-bottom-right-radius:inherit;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li-last .ui-li-link-alt{-webkit-border-bottom-right-radius:inherit;border-bottom-right-radius:inherit}.ui-li>.ui-btn-inner{display:block;position:relative;padding:0}.ui-li .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li{padding:.7em 15px;display:block}.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-thumb{min-height:60px;padding-left:100px}.ui-li-has-icon .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-icon{min-height:20px;padding-left:40px}.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-count,.ui-li-divider.ui-li-has-count{padding-right:45px}.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow{padding-right:40px}.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow.ui-li-has-count{padding-right:75px}.ui-li-heading{font-size:16px;font-weight:bold;display:block;margin:.6em 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-desc{font-size:12px;font-weight:normal;display:block;margin:-.5em 0 .6em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-thumb,.ui-listview .ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-listview .ui-li-icon{max-height:16px;max-width:16px;left:10px;top:.9em}.ui-li-thumb,.ui-listview .ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}@media all and (min-width:480px){.ui-li-aside{width:45%}}.ui-li-divider{cursor:default}.ui-li-has-alt .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-alt{padding-right:53px}.ui-li-has-alt.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-alt.ui-li-has-count{padding-right:88px}.ui-li-has-count .ui-li-count{position:absolute;font-size:11px;font-weight:bold;padding:.2em .5em;top:50%;margin-top:-.9em;right:10px}.ui-li-has-count.ui-li-divider .ui-li-count,.ui-li-has-count .ui-link-inherit .ui-li-count{margin-top:-.95em}.ui-li-has-arrow.ui-li-has-count .ui-li-count{right:40px}.ui-li-has-alt.ui-li-has-count .ui-li-count{right:53px}.ui-li-link-alt{position:absolute;width:40px;height:100%;border-width:0;border-left-width:1px;top:0;right:0;margin:0;padding:0;z-index:2}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-13px 0 0 0;border-bottom-width:1px;z-index:-1}.ui-li-link-alt .ui-btn-inner{padding:0;height:100%;position:absolute;width:100%;top:0;left:0}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-li-link-alt .ui-btn-icon-notext .ui-btn-inner .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner{border-top:0}.ui-listview-filter{border-width:0;overflow:hidden;margin:-15px -15px 15px -15px}.ui-collapsible-content .ui-listview-filter{margin:-10px -15px 10px -15px;border-bottom:inherit}.ui-listview-filter-inset{margin:-15px -5px;background:transparent}.ui-collapsible-content .ui-listview-filter-inset{margin:-5px;border-bottom-width:0}.ui-listview-filter .ui-input-search{margin:5px;width:auto;display:block}.ui-li.ui-screen-hidden{display:none}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}input.ui-slider-input,.ui-field-contain input.ui-slider-input{display:inline-block;width:50px;background-image:none;padding:.4em;margin:.5em 0;line-height:1.4;font-size:16px;outline:0}input.ui-slider-input.ui-mini,.ui-field-contain input.ui-slider-input.ui-mini{width:45px;margin:.25em 0;font-size:14px}.ui-field-contain input.ui-slider-input{margin:0}input.ui-slider-input,.ui-field-contain input.ui-slider-input{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;box-sizing:content-box}.ui-slider-input::-webkit-outer-spin-button{margin:0}select.ui-slider-switch{display:none}div.ui-slider{position:relative;display:inline-block;overflow:visible;height:15px;padding:0;margin:0 2% 0 20px;top:4px;width:65%}div.ui-slider-mini{height:12px;margin-left:10px;top:2px}div.ui-slider-bg{border:none;height:100%;padding-right:8px}.ui-controlgroup a.ui-slider-handle,a.ui-btn.ui-slider-handle{position:absolute;z-index:1;top:50%;width:28px;height:28px;margin:-15px 0 0 -15px;outline:0}a.ui-btn.ui-slider-handle .ui-btn-inner{padding:0;height:100%}div.ui-slider-mini a.ui-slider-handle{height:14px;width:14px;margin:-8px 0 0 -7px}div.ui-slider-mini a.ui-slider-handle .ui-btn-inner{height:30px;width:30px;padding:0;margin:-9px 0 0 -9px;border-top:none}@media all and (min-width:450px){.ui-field-contain label.ui-slider{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain div.ui-slider{width:43%}.ui-field-contain div.ui-slider-switch{width:5.5em}}div.ui-slider-switch{height:32px;margin-left:0;width:5.8em}a.ui-slider-handle-snapping{-webkit-transition:left 70ms linear;-moz-transition:left 70ms linear}div.ui-slider-switch .ui-slider-handle{margin:1px 0 0 -15px}.ui-slider-inneroffset{margin:0 16px;position:relative;z-index:1}div.ui-slider-switch.ui-slider-mini{width:5em;height:29px}div.ui-slider-switch.ui-slider-mini .ui-slider-inneroffset{margin:0 15px 0 14px}div.ui-slider-switch.ui-slider-mini .ui-slider-handle{width:25px;height:25px;margin:1px 0 0 -13px}div.ui-slider-switch.ui-slider-mini a.ui-slider-handle .ui-btn-inner{height:30px;width:30px;padding:0;margin:0}span.ui-slider-label{position:absolute;text-align:center;width:100%;overflow:hidden;font-size:16px;top:0;line-height:2;min-height:100%;border-width:0;white-space:nowrap}.ui-slider-mini span.ui-slider-label{font-size:14px}span.ui-slider-label-a{z-index:1;left:0;text-indent:-1.5em}span.ui-slider-label-b{z-index:0;right:0;text-indent:1.5em}.ui-slider-inline{width:120px;display:inline-block} \ No newline at end of file diff --git a/htdocs/jquery-mobile.js b/htdocs/jquery-mobile.js new file mode 100644 index 0000000..e0d02a9 --- /dev/null +++ b/htdocs/jquery-mobile.js @@ -0,0 +1,2 @@ +/*! jQuery Mobile vGit Build: SHA1: b49cc06499abf8f987cf90f35349cfac0918c939 <> Date: Tue Oct 2 11:22:34 2012 -0700 jquerymobile.com | jquery.org/license !*/ +(function(a,b,c){typeof define=="function"&&define.amd?define(["jquery"],function(d){return c(d,a,b),d.mobile}):c(a.jQuery,a,b)})(this,document,function(a,b,c,d){(function(a,b,d){var e={};a.mobile=a.extend({},{version:"1.2.0",ns:"",subPageUrlKey:"ui-page",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",focusClass:"ui-focus",ajaxEnabled:!0,hashListeningEnabled:!0,linkBindingEnabled:!0,defaultPageTransition:"fade",maxTransitionWidth:!1,minScrollBack:250,touchOverflowEnabled:!1,defaultDialogTransition:"pop",pageLoadErrorMessage:"Error Loading Page",pageLoadErrorMessageTheme:"e",phonegapNavigationEnabled:!1,autoInitializePage:!0,pushStateEnabled:!0,ignoreContentEnabled:!1,orientationChangeEnabled:!0,buttonMarkup:{hoverDelay:200},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91},silentScroll:function(d){a.type(d)!=="number"&&(d=a.mobile.defaultHomeScroll),a.event.special.scrollstart.enabled=!1,setTimeout(function(){b.scrollTo(0,d),a(c).trigger("silentscroll",{x:0,y:d})},20),setTimeout(function(){a.event.special.scrollstart.enabled=!0},150)},nsNormalizeDict:e,nsNormalize:function(b){if(!b)return;return e[b]||(e[b]=a.camelCase(a.mobile.ns+b))},getInheritedTheme:function(a,b){var c=a[0],d="",e=/ui-(bar|body|overlay)-([a-z])\b/,f,g;while(c){f=c.className||"";if(f&&(g=e.exec(f))&&(d=g[2]))break;c=c.parentNode}return d||b||"a"},closestPageData:function(a){return a.closest(':jqmData(role="page"), :jqmData(role="dialog")').data("page")},enhanceable:function(a){return this.haveParents(a,"enhance")},hijackable:function(a){return this.haveParents(a,"ajax")},haveParents:function(b,c){if(!a.mobile.ignoreContentEnabled)return b;var d=b.length,e=a(),f,g,h;for(var i=0;i").text(a(this).text()).html()},a.fn.jqmEnhanceable=function(){return a.mobile.enhanceable(this)},a.fn.jqmHijackable=function(){return a.mobile.hijackable(this)};var f=a.find,g=/:jqmData\(([^)]*)\)/g;a.find=function(b,c,d,e){return b=b.replace(g,"[data-"+(a.mobile.ns||"")+"$1]"),f.call(this,b,c,d,e)},a.extend(a.find,f),a.find.matches=function(b,c){return a.find(b,null,null,c)},a.find.matchesSelector=function(b,c){return a.find(c,null,null,[b]).length>0}})(a,this),function(a,b){var c=0,d=Array.prototype.slice,e=a.cleanData;a.cleanData=function(b){for(var c=0,d;(d=b[c])!=null;c++)try{a(d).triggerHandler("remove")}catch(f){}e(b)},a.widget=function(b,c,d){var e,f,g,h,i=b.split(".")[0];b=b.split(".")[1],e=i+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][e]=function(b){return!!a.data(b,e)},a[i]=a[i]||{},f=a[i][b],g=a[i][b]=function(a,b){if(!this._createWidget)return new g(a,b);arguments.length&&this._createWidget(a,b)},a.extend(g,f,{version:d.version,_proto:a.extend({},d),_childConstructors:[]}),h=new c,h.options=a.widget.extend({},h.options),a.each(d,function(b,e){a.isFunction(e)&&(d[b]=function(){var a=function(){return c.prototype[b].apply(this,arguments)},d=function(a){return c.prototype[b].apply(this,a)};return function(){var b=this._super,c=this._superApply,f;return this._super=a,this._superApply=d,f=e.apply(this,arguments),this._super=b,this._superApply=c,f}}())}),g.prototype=a.widget.extend(h,{widgetEventPrefix:b},d,{constructor:g,namespace:i,widgetName:b,widgetBaseClass:e,widgetFullName:e}),f?(a.each(f._childConstructors,function(b,c){var d=c.prototype;a.widget(d.namespace+"."+d.widgetName,g,c._proto)}),delete f._childConstructors):c._childConstructors.push(g),a.widget.bridge(b,g)},a.widget.extend=function(c){var e=d.call(arguments,1),f=0,g=e.length,h,i;for(;f",options:{disabled:!1,create:null},_createWidget:function(b,d){d=a(d||this.defaultElement||this)[0],this.element=a(d),this.uuid=c++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=a.widget.extend({},this.options,this._getCreateOptions(),b),this.bindings=a(),this.hoverable=a(),this.focusable=a(),d!==this&&(a.data(d,this.widgetName,this),a.data(d,this.widgetFullName,this),this._on({remove:"destroy"}),this.document=a(d.style?d.ownerDocument:d.document||d),this.window=a(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:a.noop,_getCreateEventData:a.noop,_create:a.noop,_init:a.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(a.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:a.noop,widget:function(){return this.element},option:function(c,d){var e=c,f,g,h;if(arguments.length===0)return a.widget.extend({},this.options);if(typeof c=="string"){e={},f=c.split("."),c=f.shift();if(f.length){g=e[c]=a.widget.extend({},this.options[c]);for(h=0;h"+""+"

"+"",fakeFixLoader:function(){var b=a("."+a.mobile.activeBtnClass).first();this.element.css({top:a.support.scrollTop&&f.scrollTop()+f.height()/2||b.length&&b.offset().top||100})},checkLoaderPosition:function(){var b=this.element.offset(),c=f.scrollTop(),d=a.mobile.getScreenHeight();if(b.topd)this.element.addClass("ui-loader-fakefix"),this.fakeFixLoader(),f.unbind("scroll",this.checkLoaderPosition).bind("scroll",this.fakeFixLoader)},resetHtml:function(){this.element.html(a(this.defaultHtml).html())},show:function(b,g,h){var i,j,k,l;this.resetHtml(),a.type(b)==="object"?(l=a.extend({},this.options,b),b=l.theme||a.mobile.loadingMessageTheme):(l=this.options,b=b||a.mobile.loadingMessageTheme||l.theme),j=g||a.mobile.loadingMessage||l.text,e.addClass("ui-loading");if(a.mobile.loadingMessage!==!1||l.html)a.mobile.loadingMessageTextVisible!==d?i=a.mobile.loadingMessageTextVisible:i=l.textVisible,this.element.attr("class",c+" ui-corner-all ui-body-"+b+" ui-loader-"+(i||g||b.text?"verbose":"default")+(l.textonly||h?" ui-loader-textonly":"")),l.html?this.element.html(l.html):this.element.find("h1").text(j),this.element.appendTo(a.mobile.pageContainer),this.checkLoaderPosition(),f.bind("scroll",a.proxy(this.checkLoaderPosition,this))},hide:function(){e.removeClass("ui-loading"),a.mobile.loadingMessage&&this.element.removeClass("ui-loader-fakefix"),a(b).unbind("scroll",a.proxy(this.fakeFixLoader,this)),a(b).unbind("scroll",a.proxy(this.checkLoaderPosition,this))}}),f.bind("pagecontainercreate",function(){a.mobile.loaderWidget=a.mobile.loaderWidget||a(a.mobile.loader.prototype.defaultHtml).loader()})}(a,this),function(a,b,c,d){function x(a){while(a&&typeof a.originalEvent!="undefined")a=a.originalEvent;return a}function y(b,c){var e=b.type,f,g,i,k,l,m,n,o,p;b=a.Event(b),b.type=c,f=b.originalEvent,g=a.event.props,e.search(/^(mouse|click)/)>-1&&(g=j);if(f)for(n=g.length,k;n;)k=g[--n],b[k]=f[k];e.search(/mouse(down|up)|click/)>-1&&!b.which&&(b.which=1);if(e.search(/^touch/)!==-1){i=x(f),e=i.touches,l=i.changedTouches,m=e&&e.length?e[0]:l&&l.length?l[0]:d;if(m)for(o=0,p=h.length;oe||Math.abs(c.pageY-n)>e,o&&!d&&H("vmousecancel",b,f),H("vmousemove",b,f),F()}function M(a){if(r)return;C();var b=z(a.target),c;H("vmouseup",a,b);if(!o){var d=H("vclick",a,b);d&&d.isDefaultPrevented()&&(c=x(a).changedTouches[0],p.push({touchID:v,x:c.clientX,y:c.clientY}),q=!0)}H("vmouseout",a,b),o=!1,F()}function N(b){var c=a.data(b,e),d;if(c)for(d in c)if(c[d])return!0;return!1}function O(){}function P(b){var c=b.substr(1);return{setup:function(d,f){N(this)||a.data(this,e,{});var g=a.data(this,e);g[b]=!0,k[b]=(k[b]||0)+1,k[b]===1&&t.bind(c,I),a(this).bind(c,O),s&&(k.touchstart=(k.touchstart||0)+1,k.touchstart===1&&t.bind("touchstart",J).bind("touchend",M).bind("touchmove",L).bind("scroll",K))},teardown:function(d,f){--k[b],k[b]||t.unbind(c,I),s&&(--k.touchstart,k.touchstart||t.unbind("touchstart",J).unbind("touchmove",L).unbind("touchend",M).unbind("scroll",K));var g=a(this),h=a.data(this,e);h&&(h[b]=!1),g.unbind(c,O),N(this)||g.removeData(e)}}}var e="virtualMouseBindings",f="virtualTouchID",g="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),h="clientX clientY pageX pageY screenX screenY".split(" "),i=a.event.mouseHooks?a.event.mouseHooks.props:[],j=a.event.props.concat(i),k={},l=0,m=0,n=0,o=!1,p=[],q=!1,r=!1,s="addEventListener"in c,t=a(c),u=1,v=0,w;a.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var Q=0;Qa.event.special.swipe.scrollSupressionThreshold&&b.preventDefault()}var e=b.originalEvent.touches?b.originalEvent.touches[0]:b,f={time:(new Date).getTime(),coords:[e.pageX,e.pageY],origin:a(b.target)},g;c.bind(i,j).one(h,function(b){c.unbind(i,j),f&&g&&g.time-f.timea.event.special.swipe.horizontalDistanceThreshold&&Math.abs(f.coords[1]-g.coords[1])g.coords[0]?"swipeleft":"swiperight"),f=g=d})})}},a.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(b,c){a.event.special[b]={setup:function(){a(this).bind(c,a.noop)}}})}(a,this),function(a,c){a.extend(a.support,{orientation:"orientation"in b&&"onorientationchange"in b})}(a),function(a){a.event.special.throttledresize={setup:function(){a(this).bind("resize",c)},teardown:function(){a(this).unbind("resize",c)}};var b=250,c=function(){f=(new Date).getTime(),g=f-d,g>=b?(d=f,a(this).trigger("throttledresize")):(e&&clearTimeout(e),e=setTimeout(c,b-g))},d=0,e,f,g}(a),function(a,b){function o(){var a=g();a!==h&&(h=a,d.trigger(e))}var d=a(b),e="orientationchange",f,g,h,i,j,k={0:!0,180:!0};if(a.support.orientation){var l=b.innerWidth||a(b).width(),m=b.innerHeight||a(b).height(),n=50;i=l>m&&l-m>n,j=k[b.orientation];if(i&&j||!i&&!j)k={"-90":!0,90:!0}}a.event.special.orientationchange=a.extend({},a.event.special.orientationchange,{setup:function(){if(a.support.orientation&&!a.event.special.orientationchange.disabled)return!1;h=g(),d.bind("throttledresize",o)},teardown:function(){if(a.support.orientation&&!a.event.special.orientationchange.disabled)return!1;d.unbind("throttledresize",o)},add:function(a){var b=a.handler;a.handler=function(a){return a.orientation=g(),b.apply(this,arguments)}}}),a.event.special.orientationchange.orientation=g=function(){var d=!0,e=c.documentElement;return a.support.orientation?d=k[b.orientation]:d=e&&e.clientWidth/e.clientHeight<1.1,d?"portrait":"landscape"},a.fn[e]=function(a){return a?this.bind(e,a):this.trigger(e)},a.attrFn&&(a.attrFn[e]=!0)}(a,this),function(a,d){var e=a(b),f=a("html");a.mobile.media=function(){var b={},d=a("
"),e=a("").append(d);return function(a){if(!(a in b)){var g=c.createElement("style"),h="@media "+a+" { #jquery-mediatest { position:absolute; } }";g.type="text/css",g.styleSheet?g.styleSheet.cssText=h:g.appendChild(c.createTextNode(h)),f.prepend(e).prepend(g),b[a]=d.css("position")==="absolute",e.add(g).remove()}return b[a]}}()}(a),function(a,d){function e(a){var b=a.charAt(0).toUpperCase()+a.substr(1),c=(a+" "+h.join(b+" ")+b).split(" ");for(var e in c)if(g[c[e]]!==d)return!0}function m(a,b,d){var e=c.createElement("div"),f=function(a){return a.charAt(0).toUpperCase()+a.substr(1)},g=function(a){return"-"+a.charAt(0).toLowerCase()+a.substr(1)+"-"},i=function(c){var d=g(c)+a+": "+b+";",h=f(c),i=h+f(a);e.setAttribute("style",d),!e.style[i]||(k=!0)},j=d?[d]:h,k;for(var l=0;l",{href:b}).appendTo("head"),g=a("").prependTo(f),h=g[0].href,c[0].href=e||location.pathname,d&&d.remove(),h.indexOf(b)===0}function p(){var a=c.createElement("x"),d=c.documentElement,e=b.getComputedStyle,f;return"pointerEvents"in a.style?(a.style.pointerEvents="auto",a.style.pointerEvents="x",d.appendChild(a),f=e&&e(a,"").pointerEvents==="auto",d.removeChild(a),!!f):!1}function q(){var a=c.createElement("div");return typeof a.getBoundingClientRect!="undefined"}var f=a("").prependTo("html"),g=f[0].style,h=["Webkit","Moz","O"],i="palmGetResource"in b,j=b.opera,k=b.operamini&&{}.toString.call(b.operamini)==="[object OperaMini]",l=b.blackberry&&!e("-webkit-transform");a.extend(a.mobile,{browser:{}}),a.mobile.browser.ie=function(){var a=3,b=c.createElement("div"),d=b.all||[];do b.innerHTML="";while(d[0]);return a>4?a:!a}(),a.extend(a.support,{cssTransitions:"WebKitTransitionEvent"in b||m("transition","height 100ms linear")&&!j,pushState:"pushState"in history&&"replaceState"in history,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!e("content"),touchOverflow:!!e("overflowScrolling"),cssTransform3d:n(),boxShadow:!!e("boxShadow")&&!l,scrollTop:("pageXOffset"in b||"scrollTop"in c.documentElement||"scrollTop"in f[0])&&!i&&!k,dynamicBaseTag:o(),cssPointerEvents:p(),boundingRect:q()}),f.remove();var r=function(){var a=b.navigator.userAgent;return a.indexOf("Nokia")>-1&&(a.indexOf("Symbian/3")>-1||a.indexOf("Series60/5")>-1)&&a.indexOf("AppleWebKit")>-1&&a.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}();a.mobile.gradeA=function(){return(a.support.mediaquery||a.mobile.browser.ie&&a.mobile.browser.ie>=7)&&(a.support.boundingRect||a.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/)!==null)},a.mobile.ajaxBlacklist=b.blackberry&&!b.WebKitPoint||k||r,r&&a(function(){a("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")}),a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")}(a),function(a,b){a.widget("mobile.page",a.mobile.widget,{options:{theme:"c",domCache:!1,keepNativeDefault:":jqmData(role='none'), :jqmData(role='nojs')"},_create:function(){var a=this;if(a._trigger("beforecreate")===!1)return!1;a.element.attr("tabindex","0").addClass("ui-page ui-body-"+a.options.theme).bind("pagebeforehide",function(){a.removeContainerBackground()}).bind("pagebeforeshow",function(){a.setContainerBackground()})},removeContainerBackground:function(){a.mobile.pageContainer.removeClass("ui-overlay-"+a.mobile.getInheritedTheme(this.element.parent()))},setContainerBackground:function(b){this.options.theme&&a.mobile.pageContainer.addClass("ui-overlay-"+(b||this.options.theme))},keepNativeSelector:function(){var b=this.options,c=b.keepNative&&a.trim(b.keepNative);return c&&b.keepNative!==b.keepNativeDefault?[b.keepNative,b.keepNativeDefault].join(", "):b.keepNativeDefault}})}(a),function(a,b,d){function k(a){return a=a||location.href,"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var e="hashchange",f=c,g,h=a.event.special,i=f.documentMode,j="on"+e in b&&(i===d||i>7);a.fn[e]=function(a){return a?this.bind(e,a):this.trigger(e)},a.fn[e].delay=50,h[e]=a.extend(h[e],{setup:function(){if(j)return!1;a(g.start)},teardown:function(){if(j)return!1;a(g.stop)}}),g=function(){function n(){var c=k(),d=m(h);c!==h?(l(h=c,d),a(b).trigger(e)):d!==h&&(location.href=location.href.replace(/#.*/,"")+d),g=setTimeout(n,a.fn[e].delay)}var c={},g,h=k(),i=function(a){return a},l=i,m=i;return c.start=function(){g||n()},c.stop=function(){g&&clearTimeout(g),g=d},a.browser.msie&&!j&&function(){var b,d;c.start=function(){b||(d=a.fn[e].src,d=d&&d+k(),b=a('