From e8646ede1d65752933f11b9195bdf7de87d28380 Mon Sep 17 00:00:00 2001 From: Dave Page Date: Wed, 6 Aug 2008 14:06:38 +0100 Subject: [PATCH] Initial import of pgRemote sources --- LICENCE | 339 +++++++++++++++++++++++++++++++++++ README | 66 +++++++ config.php | 24 +++ connections.php | 93 ++++++++++ css/iui-ext.css | 60 +++++++ global.php | 25 +++ gucs.php | 62 +++++++ images/connections.png | Bin 0 -> 4920 bytes images/edb.png | Bin 0 -> 451 bytes images/enterprisedb.png | Bin 0 -> 1438 bytes images/gucs.png | Bin 0 -> 4810 bytes images/info.png | Bin 0 -> 4311 bytes images/locks.png | Bin 0 -> 1839 bytes images/pg.png | Bin 0 -> 1603 bytes images/transactions.png | Bin 0 -> 2472 bytes index.php | 102 +++++++++++ info.php | 72 ++++++++ iui/backButton.png | Bin 0 -> 816 bytes iui/blueButton.png | Bin 0 -> 517 bytes iui/cancel.png | Bin 0 -> 362 bytes iui/grayButton.png | Bin 0 -> 943 bytes iui/iui.css | 372 ++++++++++++++++++++++++++++++++++++++ iui/iui.js | 383 ++++++++++++++++++++++++++++++++++++++++ iui/iuix.css | 1 + iui/iuix.js | 1 + iui/listArrow.png | Bin 0 -> 259 bytes iui/listArrowSel.png | Bin 0 -> 308 bytes iui/listGroup.png | Bin 0 -> 2867 bytes iui/loading.gif | Bin 0 -> 1435 bytes iui/pinstripes.png | Bin 0 -> 117 bytes iui/selection.png | Bin 0 -> 159 bytes iui/thumb.png | Bin 0 -> 2835 bytes iui/toggle.png | Bin 0 -> 2815 bytes iui/toggleOn.png | Bin 0 -> 163 bytes iui/toolButton.png | Bin 0 -> 531 bytes iui/toolbar.png | Bin 0 -> 171 bytes iui/whiteButton.png | Bin 0 -> 978 bytes locks.php | 131 ++++++++++++++ misc.php | 39 ++++ server.php | 39 ++++ transactions.php | 85 +++++++++ 41 files changed, 1894 insertions(+) create mode 100644 LICENCE create mode 100644 README create mode 100644 config.php create mode 100644 connections.php create mode 100644 css/iui-ext.css create mode 100644 global.php create mode 100644 gucs.php create mode 100644 images/connections.png create mode 100644 images/edb.png create mode 100755 images/enterprisedb.png create mode 100644 images/gucs.png create mode 100644 images/info.png create mode 100644 images/locks.png create mode 100644 images/pg.png create mode 100644 images/transactions.png create mode 100644 index.php create mode 100644 info.php create mode 100644 iui/backButton.png create mode 100644 iui/blueButton.png create mode 100644 iui/cancel.png create mode 100644 iui/grayButton.png create mode 100644 iui/iui.css create mode 100644 iui/iui.js create mode 100644 iui/iuix.css create mode 100644 iui/iuix.js create mode 100644 iui/listArrow.png create mode 100644 iui/listArrowSel.png create mode 100644 iui/listGroup.png create mode 100644 iui/loading.gif create mode 100644 iui/pinstripes.png create mode 100644 iui/selection.png create mode 100644 iui/thumb.png create mode 100644 iui/toggle.png create mode 100644 iui/toggleOn.png create mode 100644 iui/toolButton.png create mode 100644 iui/toolbar.png create mode 100644 iui/whiteButton.png create mode 100644 locks.php create mode 100644 misc.php create mode 100644 server.php create mode 100644 transactions.php diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/LICENCE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README b/README new file mode 100644 index 0000000..4de125b --- /dev/null +++ b/README @@ -0,0 +1,66 @@ +pgRemote +======== + +pgRemote is a remote monitoring web application designed for monitoring your +PostgreSQL and EnterpriseDB Postgres Plus servers from your Apple iPhone. It +makes use of the iui iPhone/iPod Touch user interface library to provide a +familiar and easy-to-use user interface. + +v8.2 and above of PostgreSQL, Postgres Plus and Postgres Plus Advanced Server +can be monitored. + +pgRemote is released under the GNU General Public License v2.0. + +Installation +------------ + +You will need a webserver with PHP 5.0 or above, with PostgreSQL support +enabled. To install pgRemote, simply unpack the downloaded archive into +a directory accessible from the webserver. You may wish to rename the top +level directory to make the URL more convenient, or if installing on a +dedicated vhost, remove it from the path altogether. + +Configuration +------------- + +Edit the config.php file and add the servers you wish to monitor, per the +examples included. Custom icons for your servers may be added to the images +directory and used with your servers if desired. Icons should be 32x32 pixels +or less. + +Security +-------- + +pgRemote will always connect to your servers using the credentials supplied in +the connection strings in the config.php file. The user account used must have +superuser privileges for correct operation. + +To secure pgRemote, it is recommended that the software is installed on an SSL +secured webserver. Access control may be implemented using any of the methods +your server offers for securing a directory. With an Apache server, the most +straightforward method is to place a .htaccess file in the root directory of +the pgRemote software, referencing a password file stored outside of the web +directory. + +A simple example of a .htaccess file looks may be: + +AuthUserFile /path/to/pgremote.htpasswd +AuthGroupFile /dev/null +AuthName "pgRemote" +AuthType Basic +require valid-user + +The password file may be created using the htpasswd utility, e.g: + +% htpasswd -c /path/to/pgremote.htpasswd dave + +This will create a new user called 'dave' and prompt for the password to set. +Additional users may be added with the same command, omitting the -c option. + +Support +------- + +If you require any support for pgRemote, please visit the EnterpriseDB forums +at http://forums.enterprisedb.com/ + + diff --git a/config.php b/config.php new file mode 100644 index 0000000..080ce03 --- /dev/null +++ b/config.php @@ -0,0 +1,24 @@ + diff --git a/connections.php b/connections.php new file mode 100644 index 0000000..1746f75 --- /dev/null +++ b/connections.php @@ -0,0 +1,93 @@ +PID: " . www_clean($row['procpid']) . " Source: " . www_clean($row['client_addr']) . ":" . www_clean($row['client_port']) . "
User: " . www_clean($row['usename']) . " DB: " . www_clean($row['datname']) . "
\n"; + + $divs .= "
\n"; + $divs .= "
$message2
\n"; + $divs .= "

Process ID

" . www_clean($row['procpid']) . "
\n"; + $divs .= "

Source address

" . www_clean($row['client_addr']) . "
\n"; + $divs .= "

Source port

" . www_clean($row['port']) . "
\n"; + $divs .= "

Database

" . www_clean($row['datname']) . "
\n"; + $divs .= "

Username

" . www_clean($row['usename']) . "
\n"; + $divs .= "

Connection start

" . www_clean($row['backend_start']) . "
\n"; + + if (array_key_exists("xact_start", $row)) + $divs .= "

Transaction start

" . www_clean($row['xact_start']) . "
\n"; + + $divs .= "

Query start

" . www_clean($row['query_start']) . "
\n"; + $divs .= "

Current query

" . www_clean($row['current_query']) . "
\n"; + $divs .= "
\n"; +} + +pg_free_result($res); + + +// Output just the HTML snippet to be loaded via AJAX +$text = << +
  • $message
  • + $list + + +$divs +EOT; + +echo $text; +exit(); + +?> diff --git a/css/iui-ext.css b/css/iui-ext.css new file mode 100644 index 0000000..8cc867f --- /dev/null +++ b/css/iui-ext.css @@ -0,0 +1,60 @@ +/* Override the left-hand position of the H2 header */ +h2 { + margin-left: 0px !important; +} + +/* A box for displaying values */ +.valueBox { + position: relative; + margin: 0 0 10px 0; + padding: 7px 10px 7px 10px; + background: #FFFFFF; + -webkit-border-radius: 10px; + border: 1px solid #999999; + font-size: 14px; + color: #336699; +} + +/* Smaller li's for double-lined display */ +li.double { + font-size: 14px !important; + font-weight: normal !important; +} + +/* Notes for li's */ +span.note { + font-size: 14px !important; + font-weight: normal !important; + color: gray !important; +} + +/* Colored values */ +.coloredValue { + color: #333399; +} + +/* A group header on a dialogue */ +.dialogHeader { + position: relative; + display: block; + width: 100%; + top: -10px; + margin-bottom: -2px; + margin-left: -10px; + border-top: 1px solid #7d7d7d; + border-bottom: 1px solid #999999; + padding-right: 10px; + padding-left: 10px; + background: url(../iui/listGroup.png) repeat-x; + font-size: 17px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0; + color: #FFFFFF; +} + +/* li image */ +.menuImage { + margin-top: -4px; + padding-right: 5px; + float: left; +} diff --git a/global.php b/global.php new file mode 100644 index 0000000..beaccbd --- /dev/null +++ b/global.php @@ -0,0 +1,25 @@ +EnterpriseDB UK Ltd."; +$APP_VERSION = "1.0"; +$APP_NAME = "pgRemote"; + +?> diff --git a/gucs.php b/gucs.php new file mode 100644 index 0000000..6c5acc3 --- /dev/null +++ b/gucs.php @@ -0,0 +1,62 @@ +" . $guc_name . "
    " . $guc_value . "
    "; +} + +pg_free_result($res); + +$message = "Server: " . $servers[$server]["description"]; + +// Echo the HTML snippet +$text = << +
    $message
    +$gucs + +EOT; + +echo $text; +exit(); + +?> diff --git a/images/connections.png b/images/connections.png new file mode 100644 index 0000000000000000000000000000000000000000..ae430272a871b6a3bd19df3b3b978b5d0e356a59 GIT binary patch literal 4920 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 tJOCc8^eP^$;fd4 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 literal 0 HcmV?d00001 diff --git a/images/info.png b/images/info.png new file mode 100644 index 0000000000000000000000000000000000000000..24eeec7f1035990c826121407ec5e69825d07e41 GIT binary patch literal 4311 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 literal 0 HcmV?d00001 diff --git a/images/pg.png b/images/pg.png new file mode 100644 index 0000000000000000000000000000000000000000..23aa96173aa60ee3773d07c6ebd9bbd709c4e870 GIT binary patch literal 1603 zcmV-J2E6%+P)F)9p5)%9S`^w77e0+S(+2kxNEZ*MU{QUg>{{FtczJ#N^ zvc=U-PEN%)9v*XZbBv6PBO@ai z7#OCert9tQ>FVp2mX@5HoPeOZf1tWDGBRpvYNDc|^z`(%x3{mu)ZygiZf|KVZ zdYren%GmMo@f;i+)uCA`u;OUE~z)N|a=TGoVCiV!P1ef!?efN z=IZU(*w{u!M&IY|LUNf;e4tQ$p=D)d`1ttf?eWgqwIBJvZ@9>7DzAGy$RaI4BiK)xj<5GU2$jHd5 zs;XXIUcJuSWQ?oY6J!MCAR4Hy`yr zF)(QP8mWswz=6`M5XOR|WiNr$)mS$@Nrs1y9z*4yJl!Ay1J9(N14)@9PA?el7~O>m z-s==WfLr%ufaLuL+ZkMLc0hzC7m6T*Q@4PGX#Q=6i}Rr(b_Y=uOy<4;bj(~|hKpOF zB9|`jyAml1IaWFWui9r;s z-UuW%Z3eTqtP~O1x=p06e>(%i+Jw~z6GTMTgV}2|Hi#^15n0*f$-uD0bty!_vgIIh z1%$J5mB{MaHM~F@7#QZ6rGmxgF8~q?Cqfh~>S?Xam~Oim6r1uo)4^gjML?o`2Gr9t zXU)!-lRX!tKt&ItYf_MiNJsT#sDj)nQUjLdjnHjshR;aM7>`JBWfvmB2tx#V9^Q zurnPTot#}<-Q2l7JiWXj3VfV>nf&}Ep$VVCT+qVOib>PjhTj%yg1VYL112yqG-5M` zC@?WKW55Qqbz~t5boKPHDo{~_W)cleEvyO@6qUg8$||Z1*nyNZC_jkE%E{wUASfgZ z%noAW5|TI+aBy;Q^YHTV3ozgUj7-cdtZeLXJ^)NR?6?%nnN$D(002ovPDHLkV1oJO BNe}=4 literal 0 HcmV?d00001 diff --git a/images/transactions.png b/images/transactions.png new file mode 100644 index 0000000000000000000000000000000000000000..4deef006b2a6a88355470732b41c1dded4dc3011 GIT binary patch literal 2472 zcmV;Z30L-sP)UFWod3@ataDmXlZjGX>DO= zWgvH9b0A}KWnpw>WFU2OX>MmAM`>+vE+9u~ZEzrIb0B7NWo009Z)S9NVRB_43Sn~~ zWMyV)Ze?U3VtF8RXk{Qqa%E*8Q*UN;cVTj6AVzO>Ze(F}X>V>IVQyp~X>%Z9c4293 zVPb4$3TAI|AY^ZMZftL1WFTR5AZT=Sa5^t9cXxL#XK8J4E^l&YMp_mN000PQNkl1P1rIKme>@y*-{HtG)bv@1&%$vj6l$J@<^?Ve|)#%gy zAfd;JB2$zqHSup^$G`RUWy#joR_~6l-Rx3ti!`=?j@IA+@*C+y(qoz$w%mg zzE%}E-jq$x48!p0a@E`<5i$%wFh+YAr5&FD90Sm~_^Jg9Z@Xn_cIAq1%9(UVrV?Z1 z*v{9~Fp7xGn9{v#U-sGc8|Q{$)M+`+e%JN-`_B$rnx@=9DO=v$Jo$z~q1gD)558OK z-M4$#w5<5$U%0e$*38c1s~&o?C6kJ;9?TWD2qFABa4UeubSk;{zPpyox81t*OsJ9o(mMy`ZD^?*ghOqs;ZQ|}VkMgeemiv#N9^3|?SyR>3pPM-? z{_q2@&Y0Y& zB{LZamu`IZWwO7g7r%IFEfVQQIJFXnPV7Tzq#yZw9@$J9ZC!I%&-<^3W@SX#-*ec! ze#tFDQ`8zbDu8f;!1sLL6M^Rm+pY=MtbtiZ6{^l9S<@+FDx->`QB_g^LBS&yIyPa7 zLiQZ!#p6#r0TQ}6-MbyEV;qrPf@PGjY3pw6Iq(nC*pLucFPPm)&%Ayi}^f^ISzyVi^!=3V<#l&;lSWIArjEcyAWe5=4;;B880601_()ewe3{oO5h@)bX5(S*x0+Rdp?^ z;+m%68Z{#<6iR}*t`~)21m6#YuBU{MB*J+ZMIq;kriQUt98@BhF|`G6Y~6`s)rL=W zgq)xun*q3wyYF3vSJ(eZqin=ZC6g{#5Kt0&$&f^ZaPAwChy*8G1X36Tl3`l%_FYH( zQ~kq)o$NmsHfGb5v49VrJL@HDRa22-uHgcN!v0>=Oq4mNDr zi772jXviecHhmg?`Sh>J4M`OrCMC43CFe4jM2z;L(;wbsGmDu za)K~&PxK9kG&fpMM++rMkEv8)l3Fv2RK=(yEz?NUj9ToOKfEAUjVhgc$#lu87Rct; zUdN6-2Qa0%0Si8VF_M!ykW>UNo_Psc+d9PVT{~epzR{FPzz>|r@eLe1d5*lW;RE&f z>EWPiScm!s^R=OovH&0m0M?jEGfh)6o$VL3WYWo5P1*G9uJ+cMCkOL09((N3=FFtF zlN)SfKruC6$pMT|=T%nY__4) z!k4d{hnHUKMihk@$Q2NUA<-0%^c*WlmgCz)BgLmmRck+hQk{TPx1W!9U_1d)AKdkV zYI|$b;Gv@@Zkc!4eBCOZl{anti*(PoSCU0vT1+;)^gJkIkYp7^^5J_GESleipRap| zFqwtLlJR=EYHbT6UI0)5V2@MJ>o~X&fe1ikn08)f^l10ay^D73JDON_{X%*F!CrFt zl~bXNF4RH_vSs?X8W6hH{0qK^X0_U2jAP6am!g_J0I?Jb{Uw zjTp0ubCHiCe#G;G`L6G)b7!R0zrFoea?ky1@Wz{OqA|tr`}Mo9`{3zHHWlCKdBM9S z!#Zj^UQP%U08{~t6`vS~CB|}op}tT8zyN3f(f}?8@YD9zZ0f<4OPjOVCbs60-*L{l zlhosz4Aa^sNm8D3QFHyET({krkatWJOD^ER*n0_pTyLq;0OkOAP$Fa&AxP_S^$p(- zp9{js0U=%#@frZLUU1epvK9Tr(qq?o4C<@68NVjFjfy^Zb;*vKT@#c*Y|{i`;Tu% m$server) { + if (array_key_exists("description", $server) && array_key_exists("connstr", $server)) { + + // Get the image if there is one + if (array_key_exists("icon", $server) && $server["icon"] != "") + $icon = ""; + + // Connect the database + $db = @pg_connect($server["connstr"]); + + // Can we connect? + if ($db === false) { + $svrlist .= "
  • " . $icon . "" . $server["description"] . "
    Failed to connect
  • \n"; + } else { + // Valid server version? + $res = @pg_query($db, "SHOW server_version_num;"); + if (@pg_fetch_result($res, 0, 0) < 80200) { + $svrlist .= "
  • " . $icon . "" . $server["description"] . "
    Server version is less than 8.2
  • \n"; + } else { + // Have we got superuser privs? + @pg_free_result($res); + $res = @pg_query($db, "SELECT usesuper FROM pg_shadow WHERE usename = current_user;"); + if (pg_fetch_result($res, 0, 0) != "t") { + $svrlist .= "
  • " . $icon . "" . $server["description"] . "
    The connecting user is not a superuser
  • \n"; + } else { + // Looks good - let's go! + $svrlist .= "
  • " . $icon . "" . $server["description"] . "
  • \n"; + } + } + pg_free_result($res); + } + $svrcount++; + } +} + +if ($svrlist == "") + www_error("No servers configured", "No configured servers could be found. Please edit the config.php file.", "servers"); + +// Set the message for the top of the page +$message = "Servers: $svrcount configured"; + +// Echo the main HTML body. Everything else is loaded a snippet at a time, via AJAX +$text = << + + + +$APP_NAME v$APP_VERSION + + + + + + + +
    +

    + +
    + +
      +
    • $message
    • +$svrlist +
    • About
    • +
    + +
    +

    $APP_NAME v$APP_VERSION

    +

    $APP_NAME is a remote monitoring interface for your Postgres and Postgres Plus servers.

    +

    For support, please visit the EnterpriseDB forums.

    +

    $APP_NAME is released under the GNU General Public Licence.

    +

    $APP_COPYRIGHT

    +

     

    +
    EnterpriseDB Logo
    +
    + + + +EOT; + +echo $text; +exit(); + +?> diff --git a/info.php b/info.php new file mode 100644 index 0000000..ce87a89 --- /dev/null +++ b/info.php @@ -0,0 +1,72 @@ + +
    $message
    +

    Server version

    $version
    +

    Server host

    $host
    +

    Server port

    $port
    +

    Active connections

    $connections
    +

    Current database

    $database
    +

    Current username

    $username
    +

    Current backend PID

    $pid
    + +EOT; + +echo $text; +exit(); + +?> diff --git a/iui/backButton.png b/iui/backButton.png new file mode 100644 index 0000000000000000000000000000000000000000..e27ea8cdf9a4f3b35c78f6bb0a407a4047e72e12 GIT binary patch literal 816 zcmV-01JC@4P)bjHXOOu;C=bm%!b8qQKFBYiNkNO|%7ySIJu2Y@Z0Ra$@|h{{KDF!wUiay4ePIl$1|oy7p)(1ow7 zpJZTzo@Ujo_5>tq2Mlrozr48EHFO7XNgA_29ANiNAo}}5{S52Sbo1IDYVdhwS+_Wy zoKFX!%mpCCX3~4hOG}-xdkE2FW}D0a0cPL4n(>DQ$e1)=fCCL&TtG%ONRX*&K$Hs1 z^0Wo3~(tBk?t!FTGG|Z4oXdx zId|<57s|Dp6h>m#K}vyEsFVO0D?%#V(Rz3m{w?xMP4Uv?Xp}Cb@AZxCtZ0}cc6*JNbM-_bh@vw>o;~9>&@|ZG&9()b uZiGWt*08@evNu^#lbM`SC`$WRfB^uXx!j#d-gDys00006a2G$37eJC1 zL6jIkkr_sy8b+TQNTnJ{ryEPG98R(wN1Gi_wH;8m9Z|X-OQs%7s2)_n9#p{}Rl^@v z#UEG3Aw!5EM2R9qhayFZB464gM~)*%kR)Q>CrXbeWZx)Cjwn*4DpRK}PK_>U;4fOR zFlyj4ZQwa@;X!xfLwMsxdgDlGuSsvbO@HK6gymI&z*vXoS%~IaiRNI9=VXuQXOie{ zi?eTqv2l&Fa)_mKiKTOkymODWb&jxhkFa)+v3i!di=fGsp0SywyPT-NrL)GTwa4zB zu!H~r0J=#;K~xyijmXy$!9W;>;SV7zS{9M$y@u#r5MA#7g3PRw{bw9_&fXWkf9`}J z1UhHm$9o*K`Xixl1;=mfRA;%_3Y(>)9#FT}61$1aVkKFm!Dj@AF(nLS9U==pBsfww zkwRiXBoOZsal{%#3|fuQz{&)Jk|Pu-Ch=p0=?EiFM-h38D55||>5ox0_qa}&ZhXto+2n%b?bJ&~1lBv41sCu<^TcbQd%6WH^KYEFCb>M6lGmB5Yk=QN{x?{B^{XMUP{gvn9ib>3s1 zH?T*~9Jgun6TdTj{!@8wKFcS3#uNS_qcgE!iy1C(p6~dcyy%V`I28q33JVB*RL#r1M2rxNM@=b3by}%6L@3@8Q0(;Sjy)I%7R94p3rUrL+5@vYP9ueYhGNu!f<0K{ z6jZFp!Ms?N02!A_izYnYs}jO#5=IGxf>i&EI&r&A$;Ao;v{Q&GzhTh211rL@0i)f{HoZbRpr95k0S}e8R{OJAhV^m zVT~$T*zmi;G~u6yM`To3i(J}zY2;8J+w=0jrP6Hlo2*N(m38k%-Zx1Wb%chJ@D#tXX2=Gj8NT9dY=dKxAd2~TYrWSK?vHPKQnOR$Xu2W z@F?C`kpoFcLh3r{rh6<8&6e4_FzVbJ4v);cu+VsUvlbeh)3e&tvP2q>->GC8B#}LN z%8uzS4Z0iK+Y>EUv$=F_r`(+jHR@W%5@W` *:not(.toolbar) { + display: none; + position: absolute; + margin: 0; + padding: 0; + left: 0; + top: 45px; + width: 100%; + min-height: 372px; +} + +body[orient="landscape"] > *:not(.toolbar) { + min-height: 268px; +} + +body > *[selected="true"] { + display: block; +} + +a[selected], a:active { + background-color: #194fdb !important; + background-image: url(listArrowSel.png), url(selection.png) !important; + background-repeat: no-repeat, repeat-x; + background-position: right center, left top; + color: #FFFFFF !important; +} + +a[selected="progress"] { + background-image: url(loading.gif), url(selection.png) !important; +} + +/************************************************************************************************/ + +body > .toolbar { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + border-bottom: 1px solid #2d3642; + border-top: 1px solid #6d84a2; + padding: 10px; + height: 45px; + background: url(toolbar.png) #6d84a2 repeat-x; +} + +.toolbar > h1 { + position: absolute; + overflow: hidden; + left: 50%; + margin: 1px 0 0 -75px; + height: 45px; + font-size: 20px; + width: 150px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + color: #FFFFFF; +} + +body[orient="landscape"] > .toolbar > h1 { + margin-left: -125px; + width: 250px; +} + +.button { + position: absolute; + overflow: hidden; + top: 8px; + right: 6px; + margin: 0; + border-width: 0 5px; + padding: 0 3px; + width: auto; + height: 30px; + line-height: 30px; + font-family: inherit; + font-size: 12px; + font-weight: bold; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; + text-overflow: ellipsis; + text-decoration: none; + white-space: nowrap; + background: none; + -webkit-border-image: url(toolButton.png) 0 5 0 5; +} + +.blueButton { + -webkit-border-image: url(blueButton.png) 0 5 0 5; + border-width: 0 5px; +} + +.leftButton { + left: 6px; + right: auto; +} + +#backButton { + display: none; + left: 6px; + right: auto; + padding: 0; + max-width: 55px; + border-width: 0 8px 0 14px; + -webkit-border-image: url(backButton.png) 0 8 0 14; +} + +.whiteButton, +.grayButton { + display: block; + border-width: 0 12px; + padding: 10px; + text-align: center; + font-size: 20px; + font-weight: bold; + text-decoration: inherit; + color: inherit; +} + +.whiteButton { + -webkit-border-image: url(whiteButton.png) 0 12 0 12; + text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; +} + +.grayButton { + -webkit-border-image: url(grayButton.png) 0 12 0 12; + color: #FFFFFF; +} + +/************************************************************************************************/ + +body > ul > li { + position: relative; + margin: 0; + border-bottom: 1px solid #E0E0E0; + padding: 8px 0 8px 10px; + font-size: 20px; + font-weight: bold; + list-style: none; +} + +body > ul > li.group { + position: relative; + top: -1px; + margin-bottom: -2px; + border-top: 1px solid #7d7d7d; + border-bottom: 1px solid #999999; + padding: 1px 10px; + background: url(listGroup.png) repeat-x; + font-size: 17px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0; + color: #FFFFFF; +} + +body > ul > li.group:first-child { + top: 0; + border-top: none; +} + +body > ul > li > a { + display: block; + margin: -8px 0 -8px -10px; + padding: 8px 32px 8px 10px; + text-decoration: none; + color: inherit; + background: url(listArrow.png) no-repeat right center; +} + +a[target="_replace"] { + box-sizing: border-box; + -webkit-box-sizing: border-box; + padding-top: 25px; + padding-bottom: 25px; + font-size: 18px; + color: cornflowerblue; + background-color: #FFFFFF; + background-image: none; +} + +/************************************************************************************************/ + +body > .dialog { + top: 0; + width: 100%; + min-height: 417px; + z-index: 2; + background: rgba(0, 0, 0, 0.8); + padding: 0; + text-align: right; +} + +.dialog > fieldset { + box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + margin: 0; + border: none; + border-top: 1px solid #6d84a2; + padding: 10px 6px; + background: url(toolbar.png) #7388a5 repeat-x; +} + +.dialog > fieldset > h1 { + margin: 0 10px 0 10px; + padding: 0; + font-size: 20px; + font-weight: bold; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; + text-align: center; +} + +.dialog > fieldset > label { + position: absolute; + margin: 16px 0 0 6px; + font-size: 14px; + color: #999999; +} + +input { + box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + margin: 8px 0 0 0; + padding: 6px 6px 6px 44px; + font-size: 16px; + font-weight: normal; +} + +/************************************************************************************************/ + +body > .panel { + box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 10px; + background: #c8c8c8 url(pinstripes.png); +} + +.panel > fieldset { + position: relative; + margin: 0 0 20px 0; + padding: 0; + background: #FFFFFF; + -webkit-border-radius: 10px; + border: 1px solid #999999; + text-align: right; + font-size: 16px; +} + +.row { + position: relative; + min-height: 42px; + border-bottom: 1px solid #999999; + -webkit-border-radius: 0; + text-align: right; +} + +fieldset > .row:last-child { + border-bottom: none !important; +} + +.row > input { + box-sizing: border-box; + -webkit-box-sizing: border-box; + margin: 0; + border: none; + padding: 12px 10px 0 110px; + height: 42px; + background: none; +} + +.row > label { + position: absolute; + margin: 0 0 0 14px; + line-height: 42px; + font-weight: bold; +} + +.row > .toggle { + position: absolute; + top: 6px; + right: 6px; + width: 100px; + height: 28px; +} + +.toggle { + border: 1px solid #888888; + -webkit-border-radius: 6px; + background: #FFFFFF url(toggle.png) repeat-x; + font-size: 19px; + font-weight: bold; + line-height: 30px; +} + +.toggle[toggled="true"] { + border: 1px solid #143fae; + background: #194fdb url(toggleOn.png) repeat-x; +} + +.toggleOn { + display: none; + position: absolute; + width: 60px; + text-align: center; + left: 0; + top: 0; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; +} + +.toggleOff { + position: absolute; + width: 60px; + text-align: center; + right: 0; + top: 0; + color: #666666; +} + +.toggle[toggled="true"] > .toggleOn { + display: block; +} + +.toggle[toggled="true"] > .toggleOff { + display: none; +} + +.thumb { + position: absolute; + top: -1px; + left: -1px; + width: 40px; + height: 28px; + border: 1px solid #888888; + -webkit-border-radius: 6px; + background: #ffffff url(thumb.png) repeat-x; +} + +.toggle[toggled="true"] > .thumb { + left: auto; + right: -1px; +} + +.panel > h2 { + margin: 0 0 8px 14px; + font-size: inherit; + font-weight: bold; + color: #4d4d70; + text-shadow: rgba(255, 255, 255, 0.75) 2px 2px 0; +} + +/************************************************************************************************/ + +#preloader { + display: none; + background-image: url(loading.gif), url(selection.png), + url(blueButton.png), url(listArrowSel.png), url(listGroup.png); +} diff --git a/iui/iui.js b/iui/iui.js new file mode 100644 index 0000000..27de428 --- /dev/null +++ b/iui/iui.js @@ -0,0 +1,383 @@ +/* + Copyright (c) 2007, iUI Project Members + See LICENSE.txt for licensing terms + */ + + +(function() { + +var slideSpeed = 20; +var slideInterval = 0; + +var currentPage = null; +var currentDialog = null; +var currentWidth = 0; +var currentHash = location.hash; +var hashPrefix = "#_"; +var pageHistory = []; +var newPageCount = 0; +var checkTimer; + +// ************************************************************************************************* + +window.iui = +{ + showPage: function(page, backwards) + { + if (page) + { + if (currentDialog) + { + currentDialog.removeAttribute("selected"); + currentDialog = null; + } + + if (hasClass(page, "dialog")) + showDialog(page); + else + { + var fromPage = currentPage; + currentPage = page; + + if (fromPage) + setTimeout(slidePages, 0, fromPage, page, backwards); + else + updatePage(page, fromPage); + } + } + }, + + showPageById: function(pageId) + { + var page = $(pageId); + if (page) + { + var index = pageHistory.indexOf(pageId); + var backwards = index != -1; + if (backwards) + pageHistory.splice(index, pageHistory.length); + + iui.showPage(page, backwards); + } + }, + + showPageByHref: function(href, args, method, replace, cb) + { + var req = new XMLHttpRequest(); + req.onerror = function() + { + if (cb) + cb(false); + }; + + req.onreadystatechange = function() + { + if (req.readyState == 4) + { + if (replace) + replaceElementWithSource(replace, req.responseText); + else + { + var frag = document.createElement("div"); + frag.innerHTML = req.responseText; + iui.insertPages(frag.childNodes); + } + if (cb) + setTimeout(cb, 1000, true); + } + }; + + if (args) + { + req.open(method || "GET", href, true); + req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + req.setRequestHeader("Content-Length", args.length); + req.send(args.join("&")); + } + else + { + req.open(method || "GET", href, true); + req.send(null); + } + }, + + insertPages: function(nodes) + { + var targetPage; + for (var i = 0; i < nodes.length; ++i) + { + var child = nodes[i]; + if (child.nodeType == 1) + { + if (!child.id) + child.id = "__" + (++newPageCount) + "__"; + + var clone = $(child.id); + if (clone) + clone.parentNode.replaceChild(child, clone); + else + document.body.appendChild(child); + + if (child.getAttribute("selected") == "true" || !targetPage) + targetPage = child; + + --i; + } + } + + if (targetPage) + iui.showPage(targetPage); + }, + + getSelectedPage: function() + { + for (var child = document.body.firstChild; child; child = child.nextSibling) + { + if (child.nodeType == 1 && child.getAttribute("selected") == "true") + return child; + } + } +}; + +// ************************************************************************************************* + +addEventListener("load", function(event) +{ + var page = iui.getSelectedPage(); + if (page) + iui.showPage(page); + + setTimeout(preloadImages, 0); + setTimeout(checkOrientAndLocation, 0); + checkTimer = setInterval(checkOrientAndLocation, 300); +}, false); + +addEventListener("click", function(event) +{ + var link = findParent(event.target, "a"); + if (link) + { + function unselect() { link.removeAttribute("selected"); } + + if (link.href && link.hash && link.hash != "#") + { + link.setAttribute("selected", "true"); + iui.showPage($(link.hash.substr(1))); + setTimeout(unselect, 500); + } + else if (link == $("backButton")) + history.back(); + else if (link.getAttribute("type") == "submit") + submitForm(findParent(link, "form")); + else if (link.getAttribute("type") == "cancel") + cancelDialog(findParent(link, "form")); + else if (link.target == "_replace") + { + link.setAttribute("selected", "progress"); + iui.showPageByHref(link.href, null, null, link, unselect); + } + else if (!link.target) + { + link.setAttribute("selected", "progress"); + iui.showPageByHref(link.href, null, null, null, unselect); + } + else + return; + + event.preventDefault(); + } +}, true); + +addEventListener("click", function(event) +{ + var div = findParent(event.target, "div"); + if (div && hasClass(div, "toggle")) + { + div.setAttribute("toggled", div.getAttribute("toggled") != "true"); + event.preventDefault(); + } +}, true); + +function checkOrientAndLocation() +{ + if (window.innerWidth != currentWidth) + { + currentWidth = window.innerWidth; + var orient = currentWidth == 320 ? "profile" : "landscape"; + document.body.setAttribute("orient", orient); + setTimeout(scrollTo, 100, 0, 1); + } + + if (location.hash != currentHash) + { + var pageId = location.hash.substr(hashPrefix.length) + iui.showPageById(pageId); + } +} + +function showDialog(page) +{ + currentDialog = page; + page.setAttribute("selected", "true"); + + if (hasClass(page, "dialog") && !page.target) + showForm(page); +} + +function showForm(form) +{ + form.onsubmit = function(event) + { + event.preventDefault(); + submitForm(form); + }; + + form.onclick = function(event) + { + if (event.target == form && hasClass(form, "dialog")) + cancelDialog(form); + }; +} + +function cancelDialog(form) +{ + form.removeAttribute("selected"); +} + +function updatePage(page, fromPage) +{ + if (!page.id) + page.id = "__" + (++newPageCount) + "__"; + + location.href = currentHash = hashPrefix + page.id; + pageHistory.push(page.id); + + var pageTitle = $("pageTitle"); + if (page.title) + pageTitle.innerHTML = page.title; + + if (page.localName.toLowerCase() == "form" && !page.target) + showForm(page); + + var backButton = $("backButton"); + if (backButton) + { + var prevPage = $(pageHistory[pageHistory.length-2]); + if (prevPage && !page.getAttribute("hideBackButton")) + { + backButton.style.display = "inline"; + backButton.innerHTML = prevPage.title ? prevPage.title : "Back"; + } + else + backButton.style.display = "none"; + } +} + +function slidePages(fromPage, toPage, backwards) +{ + var axis = (backwards ? fromPage : toPage).getAttribute("axis"); + if (axis == "y") + (backwards ? fromPage : toPage).style.top = "100%"; + else + toPage.style.left = "100%"; + + toPage.setAttribute("selected", "true"); + scrollTo(0, 1); + clearInterval(checkTimer); + + var percent = 100; + slide(); + var timer = setInterval(slide, slideInterval); + + function slide() + { + percent -= slideSpeed; + if (percent <= 0) + { + percent = 0; + if (!hasClass(toPage, "dialog")) + fromPage.removeAttribute("selected"); + clearInterval(timer); + checkTimer = setInterval(checkOrientAndLocation, 300); + setTimeout(updatePage, 0, toPage, fromPage); + } + + if (axis == "y") + { + backwards + ? fromPage.style.top = (100-percent) + "%" + : toPage.style.top = percent + "%"; + } + else + { + fromPage.style.left = (backwards ? (100-percent) : (percent-100)) + "%"; + toPage.style.left = (backwards ? -percent : percent) + "%"; + } + } +} + +function preloadImages() +{ + var preloader = document.createElement("div"); + preloader.id = "preloader"; + document.body.appendChild(preloader); +} + +function submitForm(form) +{ + iui.showPageByHref(form.action || "POST", encodeForm(form), form.method); +} + +function encodeForm(form) +{ + function encode(inputs) + { + for (var i = 0; i < inputs.length; ++i) + { + if (inputs[i].name) + args.push(inputs[i].name + "=" + escape(inputs[i].value)); + } + } + + var args = []; + encode(form.getElementsByTagName("input")); + encode(form.getElementsByTagName("select")); + return args; +} + +function findParent(node, localName) +{ + while (node && (node.nodeType != 1 || node.localName.toLowerCase() != localName)) + node = node.parentNode; + return node; +} + +function hasClass(self, name) +{ + var re = new RegExp("(^|\\s)"+name+"($|\\s)"); + return re.exec(self.getAttribute("class")) != null; +} + +function replaceElementWithSource(replace, source) +{ + var page = replace.parentNode; + var parent = replace; + while (page.parentNode != document.body) + { + page = page.parentNode; + parent = parent.parentNode; + } + + var frag = document.createElement(parent.localName); + frag.innerHTML = source; + + page.removeChild(parent); + + while (frag.firstChild) + page.appendChild(frag.firstChild); +} + +function $(id) { return document.getElementById(id); } +function ddd() { console.log.apply(console, arguments); } + +})(); diff --git a/iui/iuix.css b/iui/iuix.css new file mode 100644 index 0000000..1a19690 --- /dev/null +++ b/iui/iuix.css @@ -0,0 +1 @@ +body{margin:0;font-family:Helvetica;background:#FFF;color:#000;overflow-x:hidden;-webkit-user-select:none;-webkit-text-size-adjust:none;}body>*:not(.toolbar){display:none;position:absolute;margin:0;padding:0;left:0;top:45px;width:100%;min-height:372px;}body[orient="landscape"]>*:not(.toolbar){min-height:268px;}body>*[selected="true"]{display:block;}a[selected],a:active{background-color:#194fdb!important;background-image:url(listArrowSel.png),url(selection.png)!important;background-repeat:no-repeat,repeat-x;background-position:right center,left top;color:#FFF!important;}a[selected="progress"]{background-image:url(loading.gif),url(selection.png)!important;}body>.toolbar{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-bottom:1px solid #2d3642;border-top:1px solid #6d84a2;padding:10px;height:45px;background:url(toolbar.png) #6d84a2 repeat-x;}.toolbar>h1{position:absolute;overflow:hidden;left:50%;margin:1px 0 0 -75px;height:45px;font-size:20px;width:150px;font-weight:bold;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;text-align:center;text-overflow:ellipsis;white-space:nowrap;color:#FFF;}body[orient="landscape"]>.toolbar>h1{margin-left:-125px;width:250px;}.button{position:absolute;overflow:hidden;top:8px;right:6px;margin:0;border-width:0 5px;padding:0 3px;width:auto;height:30px;line-height:30px;font-family:inherit;font-size:12px;font-weight:bold;color:#FFF;text-shadow:rgba(0,0,0,0.6) 0 -1px 0;text-overflow:ellipsis;text-decoration:none;white-space:nowrap;background:none;-webkit-border-image:url(toolButton.png) 0 5 0 5;}.blueButton{-webkit-border-image:url(blueButton.png) 0 5 0 5;border-width:0 5px;}.leftButton{left:6px;right:auto;}#backButton{display:none;left:6px;right:auto;padding:0;max-width:55px;border-width:0 8px 0 14px;-webkit-border-image:url(backButton.png) 0 8 0 14;}.whiteButton,.grayButton{display:block;border-width:0 12px;padding:10px;text-align:center;font-size:20px;font-weight:bold;text-decoration:inherit;color:inherit;}.whiteButton{-webkit-border-image:url(whiteButton.png) 0 12 0 12;text-shadow:rgba(255,255,255,0.7) 0 1px 0;}.grayButton{-webkit-border-image:url(grayButton.png) 0 12 0 12;color:#FFF;}body>ul>li{position:relative;margin:0;border-bottom:1px solid #E0E0E0;padding:8px 0 8px 10px;font-size:20px;font-weight:bold;list-style:none;}body>ul>li.group{position:relative;top:-1px;margin-bottom:-2px;border-top:1px solid #7d7d7d;border-bottom:1px solid #999;padding:1px 10px;background:url(listGroup.png) repeat-x;font-size:17px;font-weight:bold;text-shadow:rgba(0,0,0,0.4) 0 1px 0;color:#FFF;}body>ul>li.group:first-child{top:0;border-top:none;}body>ul>li>a{display:block;margin:-8px 0 -8px -10px;padding:8px 32px 8px 10px;text-decoration:none;color:inherit;background:url(listArrow.png) no-repeat right center;}a[target="_replace"]{box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:25px;padding-bottom:25px;font-size:18px;color:cornflowerblue;background-color:#FFF;background-image:none;}body>.dialog{top:0;width:100%;min-height:417px;z-index:2;background:rgba(0,0,0,0.8);padding:0;text-align:right;}.dialog>fieldset{box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:0;border:none;border-top:1px solid #6d84a2;padding:10px 6px;background:url(toolbar.png) #7388a5 repeat-x;}.dialog>fieldset>h1{margin:0 10px 0 10px;padding:0;font-size:20px;font-weight:bold;color:#FFF;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;text-align:center;}.dialog>fieldset>label{position:absolute;margin:16px 0 0 6px;font-size:14px;color:#999;}input{box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:8px 0 0 0;padding:6px 6px 6px 44px;font-size:16px;font-weight:normal;}body>.panel{box-sizing:border-box;-webkit-box-sizing:border-box;padding:10px;background:#c8c8c8 url(pinstripes.png);}.panel>fieldset{position:relative;margin:0 0 20px 0;padding:0;background:#FFF;-webkit-border-radius:10px;border:1px solid #999;text-align:right;font-size:16px;}.row{position:relative;min-height:42px;border-bottom:1px solid #999;-webkit-border-radius:0;text-align:right;}fieldset>.row:last-child{border-bottom:none!important;}.row>input{box-sizing:border-box;-webkit-box-sizing:border-box;margin:0;border:none;padding:12px 10px 0 110px;height:42px;background:none;}.row>label{position:absolute;margin:0 0 0 14px;line-height:42px;font-weight:bold;}.row>.toggle{position:absolute;top:6px;right:6px;width:100px;height:28px;}.toggle{border:1px solid #888;-webkit-border-radius:6px;background:#FFF url(toggle.png) repeat-x;font-size:19px;font-weight:bold;line-height:30px;}.toggle[toggled="true"]{border:1px solid #143fae;background:#194fdb url(toggleOn.png) repeat-x;}.toggleOn{display:none;position:absolute;width:60px;text-align:center;left:0;top:0;color:#FFF;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;}.toggleOff{position:absolute;width:60px;text-align:center;right:0;top:0;color:#666;}.toggle[toggled="true"]>.toggleOn{display:block;}.toggle[toggled="true"]>.toggleOff{display:none;}.thumb{position:absolute;top:-1px;left:-1px;width:40px;height:28px;border:1px solid #888;-webkit-border-radius:6px;background:#fff url(thumb.png) repeat-x;}.toggle[toggled="true"]>.thumb{left:auto;right:-1px;}.panel>h2{margin:0 0 8px 14px;font-size:inherit;font-weight:bold;color:#4d4d70;text-shadow:rgba(255,255,255,0.75) 2px 2px 0;}#preloader{display:none;background-image:url(loading.gif),url(selection.png),url(blueButton.png),url(listArrowSel.png),url(listGroup.png);} \ No newline at end of file diff --git a/iui/iuix.js b/iui/iuix.js new file mode 100644 index 0000000..3b2b37f --- /dev/null +++ b/iui/iuix.js @@ -0,0 +1 @@ +(function(){var _1=20;var _2=0;var _3=null;var _4=null;var _5=0;var _6=location.hash;var _7="#_";var _8=[];var _9=0;var _a;window.iui={showPage:function(_b,_c){if(_b){if(_4){_4.removeAttribute("selected");_4=null;}if(hasClass(_b,"dialog")){showDialog(_b);}else{var _d=_3;_3=_b;if(_d){setTimeout(slidePages,0,_d,_b,_c);}else{updatePage(_b,_d);}}}},showPageById:function(_e){var _f=$(_e);if(_f){var _10=_8.indexOf(_e);var _11=_10!=-1;if(_11){_8.splice(_10,_8.length);}iui.showPage(_f,_11);}},showPageByHref:function(_12,_13,_14,_15,cb){var req=new XMLHttpRequest();req.onerror=function(){if(cb){cb(false);}};req.onreadystatechange=function(){if(req.readyState==4){if(_15){replaceElementWithSource(_15,req.responseText);}else{var _18=document.createElement("div");_18.innerHTML=req.responseText;iui.insertPages(_18.childNodes);}if(cb){setTimeout(cb,1000,true);}}};if(_13){req.open(_14||"GET",_12,true);req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");req.setRequestHeader("Content-Length",_13.length);req.send(_13.join("&"));}else{req.open(_14||"GET",_12,true);req.send(null);}},insertPages:function(_19){var _1a;for(var i=0;i<_19.length;++i){var _1c=_19[i];if(_1c.nodeType==1){if(!_1c.id){_1c.id="__"+(++_9)+"__";}var _1d=$(_1c.id);if(_1d){_1d.parentNode.replaceChild(_1c,_1d);}else{document.body.appendChild(_1c);}if(_1c.getAttribute("selected")=="true"||!_1a){_1a=_1c;}--i;}}if(_1a){iui.showPage(_1a);}},getSelectedPage:function(){for(var _1e=document.body.firstChild;_1e;_1e=_1e.nextSibling){if(_1e.nodeType==1&&_1e.getAttribute("selected")=="true"){return _1e;}}}};addEventListener("load",function(_1f){var _20=iui.getSelectedPage();if(_20){iui.showPage(_20);}setTimeout(preloadImages,0);setTimeout(checkOrientAndLocation,0);_a=setInterval(checkOrientAndLocation,300);},false);addEventListener("click",function(_21){var _22=findParent(_21.target,"a");if(_22){function unselect(){_22.removeAttribute("selected");}if(_22.href&&_22.hash&&_22.hash!="#"){_22.setAttribute("selected","true");iui.showPage($(_22.hash.substr(1)));setTimeout(unselect,500);}else{if(_22==$("backButton")){history.back();}else{if(_22.getAttribute("type")=="submit"){submitForm(findParent(_22,"form"));}else{if(_22.getAttribute("type")=="cancel"){cancelDialog(findParent(_22,"form"));}else{if(_22.target=="_replace"){_22.setAttribute("selected","progress");iui.showPageByHref(_22.href,null,null,_22,unselect);}else{if(!_22.target){_22.setAttribute("selected","progress");iui.showPageByHref(_22.href,null,null,null,unselect);}else{return;}}}}}}_21.preventDefault();}},true);addEventListener("click",function(_23){var div=findParent(_23.target,"div");if(div&&hasClass(div,"toggle")){div.setAttribute("toggled",div.getAttribute("toggled")!="true");_23.preventDefault();}},true);function checkOrientAndLocation(){if(window.innerWidth!=_5){_5=window.innerWidth;var _25=_5==320?"profile":"landscape";document.body.setAttribute("orient",_25);setTimeout(scrollTo,100,0,1);}if(location.hash!=_6){var _26=location.hash.substr(_7.length);iui.showPageById(_26);}}function showDialog(_27){_4=_27;_27.setAttribute("selected","true");if(hasClass(_27,"dialog")&&!_27.target){showForm(_27);}}function showForm(_28){_28.onsubmit=function(_29){_29.preventDefault();submitForm(_28);};_28.onclick=function(_2a){if(_2a.target==_28&&hasClass(_28,"dialog")){cancelDialog(_28);}};}function cancelDialog(_2b){_2b.removeAttribute("selected");}function updatePage(_2c,_2d){if(!_2c.id){_2c.id="__"+(++_9)+"__";}location.href=_6=_7+_2c.id;_8.push(_2c.id);var _2e=$("pageTitle");if(_2c.title){_2e.innerHTML=_2c.title;}if(_2c.localName.toLowerCase()=="form"&&!_2c.target){showForm(_2c);}var _2f=$("backButton");if(_2f){var _30=$(_8[_8.length-2]);if(_30&&!_2c.getAttribute("hideBackButton")){_2f.style.display="inline";_2f.innerHTML=_30.title?_30.title:"Back";}else{_2f.style.display="none";}}}function slidePages(_31,_32,_33){var _34=(_33?_31:_32).getAttribute("axis");if(_34=="y"){(_33?_31:_32).style.top="100%";}else{_32.style.left="100%";}_32.setAttribute("selected","true");scrollTo(0,1);clearInterval(_a);var _35=100;slide();var _36=setInterval(slide,_2);function slide(){_35-=_1;if(_35<=0){_35=0;if(!hasClass(_32,"dialog")){_31.removeAttribute("selected");}clearInterval(_36);_a=setInterval(checkOrientAndLocation,300);setTimeout(updatePage,0,_32,_31);}if(_34=="y"){_33?_31.style.top=(100-_35)+"%":_32.style.top=_35+"%";}else{_31.style.left=(_33?(100-_35):(_35-100))+"%";_32.style.left=(_33?-_35:_35)+"%";}}}function preloadImages(){var _37=document.createElement("div");_37.id="preloader";document.body.appendChild(_37);}function submitForm(_38){iui.showPageByHref(_38.action||"POST",encodeForm(_38),_38.method);}function encodeForm(_39){function encode(_3a){for(var i=0;i<_3a.length;++i){if(_3a[i].name){args.push(_3a[i].name+"="+escape(_3a[i].value));}}}var _3c=[];encode(_39.getElementsByTagName("input"));encode(_39.getElementsByTagName("select"));return _3c;}function findParent(_3d,_3e){while(_3d&&(_3d.nodeType!=1||_3d.localName.toLowerCase()!=_3e)){_3d=_3d.parentNode;}return _3d;}function hasClass(_3f,_40){var re=new RegExp("(^|\\s)"+_40+"($|\\s)");return re.exec(_3f.getAttribute("class"))!=null;}function replaceElementWithSource(_42,_43){var _44=_42.parentNode;var _45=_42;while(_44.parentNode!=document.body){_44=_44.parentNode;_45=_45.parentNode;}var _46=document.createElement(_45.localName);_46.innerHTML=_43;_44.removeChild(_45);while(_46.firstChild){_44.appendChild(_46.firstChild);}}function $(id){return document.getElementById(id);}function ddd(){console.log.apply(console,arguments);}})(); \ No newline at end of file diff --git a/iui/listArrow.png b/iui/listArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6421a16762c0f843bf342a1d01090ce8b77256fa GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoN!3HEN%BSrG36!`-lmzFem6RtIr7}3CCgZF_RMP;g_&g!eAw8+>M~{e^us?&19oxF zesu1f-zQziO$!7&@4IwANODeU)>*x*Rn^qtPS=tAh0|PL2=Z@Q!F+ZRSJaYqUMAhQ zG`Dhu3(aFX@_xb(O9venU+*Q2KNu!0^l!Yucs8g@r!jItQ`$kM_RelF{r G5}E+j-eN=m literal 0 HcmV?d00001 diff --git a/iui/listArrowSel.png b/iui/listArrowSel.png new file mode 100644 index 0000000000000000000000000000000000000000..86832ebc7b961840d95938a98a0905cb09bc84a9 GIT binary patch literal 308 zcmV-40n7f0P)P000yS1^@s6cz2e)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy)=5M`RCwBA)X8|lKx@FnKnE~PEy?ia z{SU&_wuA-Qf@~i?82A5-t)CgG?h{sKgqa}A(mbi>Be*4#H+^E9wf!?(BG-?47NNum z$fCJBQ7uY#r`#fp)HPuPszn6>lv{)~2`@YFmEq&pe{g=312+RdH`9NrSt2ID{C|Ft z2*^+{|J8@T42gYjK$bF6#S)kWa-u9K7Cd_Whmk75MJo&7mM}9h{O?H-qKO4?OaA_2 zV60jA9&9+ZEdT*VKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00019Nkl zCjY=i7V9oLHAd}acT3oj)KbHCm(8mkPDu2;o^i>?_7x^ixw#O)RJ+hp(Kxs+)tAi39 za;jZxp54$8HAJBiUK>rCWijd-DIDhAwEt7^~-0}%C6b<+tBH~2-*)}A8^?ECDXvxQbA5DuV zJ)NXk+a}SbQ#{AR`iT3rD=P!HiLeDQvAJUPN;c4BiN!y5stQl?m~6>0UB%z1BeK{e zU3r1X=8n!JMHf>MA$H}11wJyohno*fGO-YGcTBuuvM#jiP=bcax*I)71_CmRX0SOn zI-1G*a~j+*uv*3B@JaDRnizu@e?W#XGlRHtCPR*7Umb?eKnWHUb5V;Uj8=-Azq7T% zi_xpo*zRakWZ$WXQ;MS7uAI54C?Rp2wYb1D$?(FX0tO}7Q%sEw7QQ^(OTKQblv$u~ zB=JMR4Gwiig^w%VIq-cg;NWLybKB9#u*?O;yUf6J2}&rDA5LCZNiI73x8V4hgSiT2 z6@62@e81{&q^eB5yhhsTh>V@;yo();8d)uqCnUCo%xy87p8MfJAwz@9B8R1-7Mu)8 z1_3r1i`lj*6$nh=W^lVu$I~Qz{jfq0ifypm7!CB?oW&9MuFp!5z7`|9yk*McQol!u zvr`Sbr)Ws7k*Vm@)R$j6QG-jJw`J2eNdtp*iHr;{e7Txh)EE>h*t(7`{1CvyCv^0( zo5Gc>_Alb-WeSL_OtK7Q7f(IKdl@3W!G2jAW(#RHc*FD*#te{9~? z?$B`JhnW2FMGYH6oBF4#6c*TV^d}vB5GY|%x58Rl|sI%aUEiXevud?ZKCqKVvP5$7W!A>HrElaOmP+;?T zxNb$|4hgpIzDEu=MpIpresys1cRXUcK4GtlgxjI2j87_jhaPUM(-Fu&H7Bq3fmfNa Is33zi04%B!Q2+n{ literal 0 HcmV?d00001 diff --git a/iui/pinstripes.png b/iui/pinstripes.png new file mode 100644 index 0000000000000000000000000000000000000000..c99777512fb135af7dcdf4130e5770072cb39241 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)O!2~4dW-8AFQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jio`u#978H@CD~Lx<6>s|lboE)9K^uL#$fKtT%LaBX8=$M NgQu&X%Q~loCIB>$9?k#& literal 0 HcmV?d00001 diff --git a/iui/selection.png b/iui/selection.png new file mode 100644 index 0000000000000000000000000000000000000000..537e3f0b13ea422a5ac5487317872414d51574c1 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiX1&%978x{Sr2X$Jj5WtvT?p{@1r}0Gc6VGKL6Qv;l%Dc zTgw%X}gxBOXmxAbz1ds%&OUSwBY#<9&n!x%hW{an^L HB{Ts5+CMp^ literal 0 HcmV?d00001 diff --git a/iui/thumb.png b/iui/thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..cefa8fc5e9db724b96d36a8df814ecdf85d05582 GIT binary patch literal 2835 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 literal 0 HcmV?d00001 diff --git a/iui/toggle.png b/iui/toggle.png new file mode 100644 index 0000000000000000000000000000000000000000..3b62ebf26eaf8b21e341d413a6bd7cebcf5e7075 GIT binary patch literal 2815 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 literal 0 HcmV?d00001 diff --git a/iui/whiteButton.png b/iui/whiteButton.png new file mode 100644 index 0000000000000000000000000000000000000000..5514b270053a41039e9e96ef8591796521ee0312 GIT binary patch literal 978 zcmV;@11}R*8aG1*L?d1O->_T@+D~u1Y}!yL0VI=|WL) zUB!jV?nDqFVEqcjNU7Q;7-O1A(q?8dlX-96yZ5-5q-Ly5=jDGlkNe*5{m(h~zIU$B ztvpZh0>hld-kwYNkqy3Ko}K-V%D(G)Z`(9CN35XDjL&xuH$Mh_XF(}UB(Tw%lJL(m|<1LC)=R9eoc+{eJ zNQwFm3ZOo%tAYib`a=Ya6#-N=4JiO(J0G^!!{zGLYx*)_QJi=^gsb6jQm_J=B!6wD zD%0-bC{8`;0(Q9FGD%w0qhLC5rQirtj;nGAUq!X!Dqd2rt6&lNPuJ>g7pqvn zrLC}dJQx&>lhnC-)EE`H)reg0T)izKV$|3W#Z{x-uG+(BCOFiFCeuK~FK_qmdcCS1 z>8qPuMY7^&mwW$}US2j%`m-B`MG8c7zyGk_Te#n^&tIcWp2Z*u%VSYOaGhsH3-(@~ zmGI-aXiXaBcJ0@|xe~1jq8+&sKXGKh9t>WX-&ip>B{%Tf)t#qUx1u_4ei+87UrHDfl6dXpw%k7!k~_oku06C3S8F^@(Qf&-L}LBUh<3`S518 zHslKoXby|rLrF-aMbk8j+ef37#cK7AgI*>xK3*KI+wDGQqnw)Edn!H~2Jv7#l+-p> zSL68q&WJ!JQ!W>a*5>p3XLojzq*mM7in|*4KU7;ZTp6~iyZ`_I07*qoM6N<$f;?{4 AHUIzs literal 0 HcmV?d00001 diff --git a/locks.php b/locks.php new file mode 100644 index 0000000..ba3e8ef --- /dev/null +++ b/locks.php @@ -0,0 +1,131 @@ += 80300) +{ + $sql = <<Class: " . www_clean($row['class']) . "
    Mode: " . www_clean($row['mode']) . "
    DB: " . www_clean($row['dbname']) . "
    \n"; + + $divs .= "
    \n"; + $divs .= "
    $message2
    \n"; + $divs .= "

    PID

    " . www_clean($row['pid']) . "
    \n"; + $divs .= "

    Database

    " . www_clean($row['dbname']) . "
    \n"; + $divs .= "

    Class

    " . www_clean($row['class']) . "
    \n"; + $divs .= "

    Username

    " . www_clean($row['user']) . "
    \n"; + if ($version >= 80300) + $divs .= "

    Virtual XID

    " . www_clean($row['virtualxid']) . "
    \n"; + $divs .= "

    Transaction

    " . www_clean($row['transaction']) . "
    \n"; + $divs .= "

    Mode

    " . www_clean($row['mode']) . "
    \n"; + $divs .= "

    Granted?

    " . ($row['granted'] == "t" ? "Yes" : "No") . "
    \n"; + $divs .= "

    Query

    " . www_clean($row['current_query']) . "
    \n"; + $divs .= "

    Query start

    " . www_clean($row['query_start']) . "
    \n"; + $divs .= "
    \n"; +} + +pg_free_result($res); + + +// Output just the HTML snippet to be loaded via AJAX +$text = << +
  • $message
  • + $list + + +$divs +EOT; + +echo $text; +exit(); + +?> diff --git a/misc.php b/misc.php new file mode 100644 index 0000000..0f5d776 --- /dev/null +++ b/misc.php @@ -0,0 +1,39 @@ + +

    An error has occured in $APP_NAME:

    +

    $message

    +

    $detail

    +

    For support, please visit the EnterpriseDB forums.

    + +EOT; + + echo $text; + exit(); +} + +// Return a clean value for display, or a no-break space to maintain box size etc. +function www_clean($text) +{ + if ($text == "") + return " "; + else + return htmlspecialchars($text); +} + +?> + diff --git a/server.php b/server.php new file mode 100644 index 0000000..7321f12 --- /dev/null +++ b/server.php @@ -0,0 +1,39 @@ + +
  • Server: $description
  • +
  • Info
  • +
  • GUCs
  • +
  • Connections
  • +
  • Locks
  • +
  • Prepared transactions
  • + +EOT; + +echo $text; +exit(); + +?> diff --git a/transactions.php b/transactions.php new file mode 100644 index 0000000..cb6fa2e --- /dev/null +++ b/transactions.php @@ -0,0 +1,85 @@ +XID: " . www_clean($row['transaction']) . "
    User: " . www_clean($row['owner']) . " DB: " . www_clean($row['database']) . "
    \n"; + + $divs .= "
    \n"; + $divs .= "
    $message2
    \n"; + $divs .= "

    XID

    " . www_clean($row['transaction']) . "
    \n"; + $divs .= "

    Global ID

    " . www_clean($row['gid']) . "
    \n"; + $divs .= "

    Time

    " . www_clean($row['prepared']) . "
    \n"; + $divs .= "

    Owner

    " . www_clean($row['owner']) . "
    \n"; + $divs .= "

    Database

    " . www_clean($row['database']) . "
    \n"; + $divs .= "
    \n"; +} + +pg_free_result($res); + + +// Output just the HTML snippet to be loaded via AJAX +$text = << +
  • $message
  • + $list + + +$divs +EOT; + +echo $text; +exit(); + +?> -- 2.39.5