phpTrackme 1.0
This commit is contained in:
parent
eeabf5e5a5
commit
2c15d1d234
339
LICENSE
Normal file
339
LICENSE
Normal file
@ -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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
32
README
Executable file
32
README
Executable file
@ -0,0 +1,32 @@
|
||||
This is a simple web viewer for GPS tracks uploaded with mobile client.
|
||||
It is designed to work with Android version of great app TrackMe (http://www.luisespinosa.com/trackme_eng.html),
|
||||
but it should be easy to adjust it for other clients.
|
||||
Interface "look and feel" is based on TrackMe Display (http://forum.xda-developers.com/showthread.php?t=477394).
|
||||
It currently uses Google Maps API, but work on OpenStreetMap is in progress.
|
||||
|
||||
Live demo:
|
||||
- http://flaa.fabiszewski.net/phptrackme/
|
||||
|
||||
Requirements:
|
||||
- php 5
|
||||
- mysql
|
||||
- browser with javascript enabled, cookies for authentication
|
||||
|
||||
Features:
|
||||
- simple
|
||||
- allows live tracking
|
||||
- track statistics
|
||||
- altitudes graph
|
||||
- multiple users
|
||||
- user authentication
|
||||
- Google Maps API v3
|
||||
- ajax
|
||||
- server based configuration
|
||||
|
||||
Todo
|
||||
- OpenStreetMap API
|
||||
- client based configuration
|
||||
- write opensource client?
|
||||
|
||||
License
|
||||
- GPL
|
117
auth.php
Executable file
117
auth.php
Executable file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
require_once("config.php");
|
||||
require_once("lang.php");
|
||||
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
|
||||
if ($mysqli->connect_errno) {
|
||||
printf("Connect failed: %s\n", $mysqli->connect_error);
|
||||
exit();
|
||||
}
|
||||
$auth = NULL;
|
||||
if ($require_authentication) {
|
||||
/* authentication */
|
||||
session_name('trackme');
|
||||
session_start();
|
||||
$sid = session_id();
|
||||
|
||||
$auth = (isset($_SESSION['auth']) ? $_SESSION['auth'] : "");
|
||||
$user = (isset($_REQUEST['user']) ? $_REQUEST['user'] : "");
|
||||
$pass = (isset($_REQUEST['pass']) ? md5($salt.$_REQUEST['pass']) : "");
|
||||
@$ssl = ($_SERVER['HTTPS'] == "" ? "http" : "https");
|
||||
$auth_error = (isset($_REQUEST['auth_error']) ? $_REQUEST['auth_error'] : 0);
|
||||
|
||||
// not authenticated and username not submited
|
||||
// load form
|
||||
if ((!$auth) && (!$user)){
|
||||
print
|
||||
'<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>'.$lang_title.'</title>
|
||||
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
|
||||
<link rel="stylesheet" type="text/css" href="main.css">
|
||||
<script type="text/javascript">
|
||||
function focus() {
|
||||
document.forms[0].elements[0].focus();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="focus()">
|
||||
<div id="login">
|
||||
<div id="title">'.$lang_title.'</div>
|
||||
<div id="subtitle">'.$lang_private.'</div>
|
||||
<form action="index.php" method="post">
|
||||
'.$lang_username.':<br />
|
||||
<input type="text" name="user"><br />
|
||||
'.$lang_password.':<br />
|
||||
<input type="password" name="pass"><br />
|
||||
<br />
|
||||
<input type="submit" value="'.$lang_login.'">
|
||||
</form>
|
||||
<div id="error">'.(($auth_error==1) ? $lang_authfail : "").'</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>';
|
||||
$mysqli->close();
|
||||
exit;
|
||||
}
|
||||
|
||||
// username submited
|
||||
if ((!$auth) && ($user)){
|
||||
$query = $mysqli->prepare("SELECT ID,username,password FROM users WHERE username=? LIMIT 1");
|
||||
$query->bind_param('s', $user);
|
||||
$query->execute();
|
||||
$query->bind_result($rec_ID, $rec_user, $rec_pass);
|
||||
$query->fetch();
|
||||
$query->free_result();
|
||||
//correct pass
|
||||
if (($user==$rec_user) && ($pass==$rec_pass)) {
|
||||
// login successful
|
||||
//delete old session
|
||||
$_SESSION = NULL;
|
||||
session_destroy();
|
||||
// start new session
|
||||
session_name('trackme');
|
||||
session_start();
|
||||
$_SESSION['auth'] = $rec_ID;
|
||||
|
||||
$url = str_replace("//", "/", $_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME'])."/index.php");
|
||||
header("Location: $ssl://$url");
|
||||
exit;
|
||||
} else {
|
||||
// unsuccessful
|
||||
$error = "?auth_error=1";
|
||||
// destroy session
|
||||
$_SESSION = NULL;
|
||||
if (isset($_COOKIE[session_name('trackme')])) {
|
||||
setcookie(session_name('trackme'),'',time()-42000,'/');
|
||||
}
|
||||
session_destroy();
|
||||
$mysqli->close();
|
||||
$url = str_replace("//", "/", $_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME'])."/index.php");
|
||||
header("Location: $ssl://$url$error");
|
||||
exit;
|
||||
}
|
||||
}
|
||||
/* end of authentication */
|
||||
}
|
||||
?>
|
51
config.php
Executable file
51
config.php
Executable file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
$version = "1.0";
|
||||
// map drawing framework
|
||||
// (gmaps = google maps, osm = openstreetmap (not supported yet))
|
||||
$mapapi = "gmaps";
|
||||
// you may add your google maps api key
|
||||
// this is not obligatory by now
|
||||
//$gkey =
|
||||
|
||||
// db
|
||||
$dbhost = ""; // mysql host, eg. localhost
|
||||
$dbuser = ""; // database user
|
||||
$dbpass = ""; // database pass
|
||||
$dbname = ""; // database name
|
||||
$salt = ""; // fill in random string here, it will increase security of password hashes
|
||||
|
||||
// other
|
||||
// require login/password authentication
|
||||
// (0 = no, 1 = yes)
|
||||
$require_authentication = 0;
|
||||
// allow automatic registration of new users
|
||||
// (0 = no, 1 = yes)
|
||||
$allow_registration = 0;
|
||||
// Default interval in seconds for live auto reload
|
||||
$interval = 10;
|
||||
// Default language
|
||||
// (en, pl)
|
||||
$lang = "en";
|
||||
// units
|
||||
// (metric, imperial)
|
||||
$units = "metric";
|
||||
|
||||
?>
|
221
download.php
Executable file
221
download.php
Executable file
@ -0,0 +1,221 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
require_once("auth.php");
|
||||
$type = (isset($_REQUEST["type"]) ? $_REQUEST["type"] : "kml");
|
||||
$userid = ((isset($_REQUEST["userid"]) && is_numeric($_REQUEST["userid"])) ? $_REQUEST["userid"] : 0);
|
||||
$trackid = ((isset($_REQUEST["trackid"]) && is_numeric($_REQUEST["trackid"])) ? $_REQUEST["trackid"] : 0);
|
||||
|
||||
if ($units=="imperial") {
|
||||
$factor_kmh = 0.62; //to mph
|
||||
$unit_kmh = "mph";
|
||||
$factor_m = 3.28; // to feet
|
||||
$unit_m = "ft";
|
||||
$factor_km = 0.62; // to miles
|
||||
$unit_km = "mi";
|
||||
}
|
||||
else {
|
||||
$factor_kmh = 1;
|
||||
$unit_kmh = "km/h";
|
||||
$factor_m = 1;
|
||||
$unit_m = "m";
|
||||
$factor_km = 1;
|
||||
$unit_km = "km";
|
||||
}
|
||||
|
||||
function haversine_distance($lat1, $lon1, $lat2, $lon2) {
|
||||
$lat1 = deg2rad($lat1);
|
||||
$lon1 = deg2rad($lon1);
|
||||
$lat2 = deg2rad($lat2);
|
||||
$lon2 = deg2rad($lon2);
|
||||
$latD = $lat2 - $lat1;
|
||||
$lonD = $lon2 - $lon1;
|
||||
$angle = 2*asin(sqrt(pow(sin($latD/2),2)+cos($lat1)*cos($lat2)*pow(sin($lonD/2),2)));
|
||||
return $angle * 6371000;
|
||||
}
|
||||
function addStyle($xml,$name,$url) {
|
||||
$xml->startElement("Style");
|
||||
$xml->writeAttribute("id", $name."Style");
|
||||
$xml->startElement("IconStyle");
|
||||
$xml->writeAttribute("id", $name."Icon");
|
||||
$xml->startElement("Icon");
|
||||
$xml->writeElement("href", $url);
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
}
|
||||
function toHMS($s) {
|
||||
$d = floor($s/86400);
|
||||
$h = floor(($s%86400)/3600);
|
||||
$m = floor((($s%86400)%3600)/60);
|
||||
$s = (($s%86400)%3600)%60;
|
||||
return (($d>0)?($d." d "):"").(substr("00".$h,-2)).":".(substr("00".$m,-2)).":".(substr("00".$s,-2));
|
||||
}
|
||||
|
||||
if ($trackid>0 && $userid>0) {
|
||||
$query = $mysqli->prepare("SELECT positions.ID,Latitude,Longitude,Altitude,Speed,Angle,DateOccurred,username,Name FROM positions LEFT JOIN users ON (positions.FK_Users_ID=users.ID) LEFT JOIN trips ON (positions.FK_Trips_ID=trips.ID) WHERE positions.FK_Users_ID=? AND positions.FK_Trips_ID=? ORDER BY positions.DateOccurred");
|
||||
$query->bind_param("ii", $userid, $trackid);
|
||||
$query->execute();
|
||||
$query->store_result();
|
||||
$query->bind_result($positionid,$latitude,$longitude,$altitude,$speed,$angle,$dateoccured,$username,$trackname);
|
||||
$query->fetch(); // take just one row to get trackname etc
|
||||
$query->data_seek(0); // and reset result set
|
||||
switch ($type) {
|
||||
case "kml":
|
||||
default:
|
||||
header("Content-type: application/vnd.google-earth.kml+xml");
|
||||
header("Content-Disposition: attachment; filename=\"track$trackid.kml\"");
|
||||
$xml = new XMLWriter();
|
||||
$xml->openURI("php://output");
|
||||
$xml->startDocument("1.0");
|
||||
$xml->startElement("kml");
|
||||
$xml->writeAttribute("xmlns", "http://earth.google.com/kml/2.1");
|
||||
$xml->setIndent(true);
|
||||
$xml->startElement("Document");
|
||||
$xml->writeElement("name", $trackname);
|
||||
// line style
|
||||
$xml->startElement("Style");
|
||||
$xml->writeAttribute("id", "lineStyle");
|
||||
$xml->startElement("LineStyle");
|
||||
$xml->writeElement("color","7f0000ff");
|
||||
$xml->writeElement("width","4");
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
// marker styles
|
||||
addStyle($xml,"red","http://maps.google.com/mapfiles/markerA.png");
|
||||
addStyle($xml,"green","http://maps.google.com/mapfiles/marker_greenB.png");
|
||||
addStyle($xml,"gray","http://labs.google.com/ridefinder/images/mm_20_gray.png");
|
||||
$style = "#redStyle"; // for first element
|
||||
$i = 0;
|
||||
$totalMeters = 0;
|
||||
$totalSeconds = 0;
|
||||
while ($query->fetch()) {
|
||||
$distance = (isset($prev_latitude))?haversine_distance($prev_latitude,$prev_longitude,$latitude,$longitude):0;
|
||||
$prev_latitude = $latitude;
|
||||
$prev_longitude = $longitude;
|
||||
$seconds = (isset($prev_dateoccured))?(strtotime($dateoccured)-strtotime($prev_dateoccured)):0;
|
||||
$prev_dateoccured = $dateoccured;
|
||||
$totalMeters += $distance;
|
||||
$totalSeconds += $seconds;
|
||||
|
||||
if(++$i == $query->num_rows) { $style = "#greenStyle"; } // last element
|
||||
$xml->startElement("Placemark");
|
||||
$xml->writeAttribute("id", $positionid);
|
||||
//$xml->writeElement("name", $i);
|
||||
$description =
|
||||
"<div style=\"font-weight: bolder;padding-bottom: 10px;border-bottom: 1px solid gray;\">".$lang_user.": ".strtoupper($username)."<br />".$lang_track.": ".strtoupper($trackname).
|
||||
"</div>".
|
||||
"<div>".
|
||||
"<div style=\"padding-top: 10px;\"><b>".$lang_time.":</b> ".$dateoccured."<br />".
|
||||
(($speed)?"<b>".$lang_speed.":</b> ".round($speed*3.6,2*$factor_kmh)." ".$unit_kmh."<br />":"").
|
||||
(($altitude != null)?"<b>".$lang_altitude.":</b> ".round($altitude*$factor_m)." ".$unit_m."<br />":"").
|
||||
"<b>".$lang_ttime.":</b> ".toHMS($totalSeconds)."<br />".
|
||||
"<b>".$lang_aspeed.":</b> ".(($totalSeconds!=0)?round($totalMeters/$totalSeconds*3.6*$factor_kmh,2):0)." ".$unit_kmh."<br />".
|
||||
"<b>".$lang_tdistance.":</b> ".round($totalMeters/1000*$factor_km,2)." ".$unit_km."<br />"."</div>".
|
||||
"<div style=\"font-size: smaller;padding-top: 10px;\">".$lang_point." ".$i." ".$lang_of." ".($query->num_rows-1)."</div>".
|
||||
"</div>";
|
||||
$xml->startElement("description");
|
||||
$xml->writeCData($description);
|
||||
$xml->endElement();
|
||||
$xml->writeElement("styleUrl", $style);
|
||||
$xml->startElement("Point");
|
||||
$coordinate[$i] = $longitude.",".$latitude.(($altitude) ? ",".$altitude : "");
|
||||
$xml->writeElement("coordinates", $coordinate[$i]);
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
$style = "#grayStyle"; // other elements
|
||||
}
|
||||
$coordinates = implode("\n",$coordinate);
|
||||
$xml->startElement("Placemark");
|
||||
$xml->writeElement("styleUrl", "#lineStyle");
|
||||
$xml->startElement("LineString");
|
||||
$xml->writeElement("coordinates", $coordinates);
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
|
||||
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
$xml->endDocument();
|
||||
$xml->flush();
|
||||
|
||||
break;
|
||||
|
||||
case "gpx":
|
||||
header("Content-type: application/application/gpx+xm");
|
||||
header("Content-Disposition: attachment; filename=\"track$trackid.gpx\"");
|
||||
$xml = new XMLWriter();
|
||||
$xml->openURI("php://output");
|
||||
$xml->startDocument("1.0");
|
||||
$xml->startElement("gpx");
|
||||
$xml->writeAttribute("xmlns", "http://www.topografix.com/GPX/1/1");
|
||||
$xml->writeAttribute("xmlns:gpxdata", "http://www.cluetrust.com/XML/GPXDATA/1/0");
|
||||
$xml->writeAttribute("creator", "phpTrackme");
|
||||
$xml->writeAttribute("version", "1.1");
|
||||
$xml->startElement("metadata");
|
||||
$xml->writeElement("name", $trackname);
|
||||
$xml->writeElement("time", str_replace(" ","T",$dateoccured));
|
||||
$xml->endElement();
|
||||
$xml->startElement("trk");
|
||||
$xml->writeElement("name", $trackname);
|
||||
$xml->startElement("trkseg");
|
||||
$i = 0;
|
||||
$totalMeters = 0;
|
||||
$totalSeconds = 0;
|
||||
while ($query->fetch()) {
|
||||
$distance = (isset($prev_latitude))?haversine_distance($prev_latitude,$prev_longitude,$latitude,$longitude):0;
|
||||
$prev_latitude = $latitude;
|
||||
$prev_longitude = $longitude;
|
||||
$seconds = (isset($prev_dateoccured))?(strtotime($dateoccured)-strtotime($prev_dateoccured)):0;
|
||||
$prev_dateoccured = $dateoccured;
|
||||
$totalMeters += $distance;
|
||||
$totalSeconds += $seconds;
|
||||
$xml->startElement("trkpt");
|
||||
$xml->writeAttribute("lat", $latitude);
|
||||
$xml->writeAttribute("lon", $longitude);
|
||||
if($altitude) { $xml->writeElement("ele", $altitude); }
|
||||
$xml->writeElement("time", str_replace(" ","T",$dateoccured));
|
||||
$xml->writeElement("name", ++$i);
|
||||
$xml->startElement("desc");
|
||||
$description =
|
||||
$lang_user.": ".strtoupper($username)." ".$lang_track.": ".strtoupper($trackname).
|
||||
" ".$lang_time.": ".$dateoccured.
|
||||
(($speed)?" ".$lang_speed.": ".round($speed*3.6,2*$factor_kmh)." ".$unit_kmh:"").
|
||||
(($altitude != null)?" ".$lang_altitude.": ".round($altitude*$factor_m)." ".$unit_m:"").
|
||||
" ".$lang_ttime.": ".toHMS($totalSeconds)."".
|
||||
" ".$lang_aspeed.": ".(($totalSeconds!=0)?round($totalMeters/$totalSeconds*3.6*$factor_kmh,2):0)." ".$unit_kmh.
|
||||
" ".$lang_tdistance.": ".round($totalMeters/1000*$factor_km,2)." ".$unit_km.
|
||||
" ".$lang_point." ".$i." ".$lang_of." ".($query->num_rows-1);
|
||||
$xml->writeCData($description);
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
}
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
$xml->endElement();
|
||||
$xml->endDocument();
|
||||
$xml->flush();
|
||||
|
||||
break;
|
||||
}
|
||||
$query->free_result();
|
||||
$query->close();
|
||||
}
|
||||
$mysqli->close();
|
||||
?>
|
26
export.php
Executable file
26
export.php
Executable file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
// FIXME
|
||||
// Do we really need this?
|
||||
// It is easier to export from web interface.
|
||||
// If needed it may be easily adjusted from download.php
|
||||
echo "<Result>0</Result>";
|
||||
exit();
|
||||
?>
|
87
getpositions.php
Executable file
87
getpositions.php
Executable file
@ -0,0 +1,87 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
require_once("auth.php");
|
||||
|
||||
$userid = ((isset($_REQUEST["userid"]) && is_numeric($_REQUEST["userid"])) ? $_REQUEST["userid"] : 0);
|
||||
$trackid = ((isset($_REQUEST["trackid"]) && is_numeric($_REQUEST["trackid"])) ? $_REQUEST["trackid"] : 0);
|
||||
|
||||
function haversine_distance($lat1, $lon1, $lat2, $lon2) {
|
||||
$lat1 = deg2rad($lat1);
|
||||
$lon1 = deg2rad($lon1);
|
||||
$lat2 = deg2rad($lat2);
|
||||
$lon2 = deg2rad($lon2);
|
||||
$latD = $lat2 - $lat1;
|
||||
$lonD = $lon2 - $lon1;
|
||||
$angle = 2*asin(sqrt(pow(sin($latD/2),2)+cos($lat1)*cos($lat2)*pow(sin($lonD/2),2)));
|
||||
return $angle * 6371000;
|
||||
}
|
||||
|
||||
if ($userid) {
|
||||
if ($trackid) {
|
||||
// get all track data
|
||||
$query = $mysqli->prepare("SELECT positions.ID,Latitude,Longitude,Altitude,Speed,Angle,DateOccurred,username,trips.Name,trips.ID FROM positions LEFT JOIN users ON (positions.FK_Users_ID=users.ID) LEFT JOIN trips ON (positions.FK_Trips_ID=trips.ID) WHERE positions.FK_Users_ID=? AND positions.FK_Trips_ID=? ORDER BY positions.DateOccurred");
|
||||
$query->bind_param('ii', $userid, $trackid);
|
||||
}
|
||||
else {
|
||||
// get data only for latest point
|
||||
$query = $mysqli->prepare("SELECT positions.ID,Latitude,Longitude,Altitude,Speed,Angle,DateOccurred,username,trips.Name,trips.ID FROM positions LEFT JOIN users ON (positions.FK_Users_ID=users.ID) LEFT JOIN trips ON (positions.FK_Trips_ID=trips.ID) WHERE positions.FK_Users_ID=? ORDER BY positions.DateOccurred DESC LIMIT 1");
|
||||
$query->bind_param('i', $userid);
|
||||
}
|
||||
$query->execute();
|
||||
$query->bind_result($positionid,$latitude,$longitude,$altitude,$speed,$angle,$dateoccured,$username,$trackname,$trackid);
|
||||
|
||||
header("Content-type: text/xml");
|
||||
$xml = new XMLWriter();
|
||||
$xml->openURI("php://output");
|
||||
$xml->startDocument("1.0");
|
||||
$xml->setIndent(true);
|
||||
$xml->startElement('root');
|
||||
|
||||
while ($query->fetch()) {
|
||||
$xml->startElement("position");
|
||||
$xml->writeAttribute("id", $positionid);
|
||||
$xml->writeElement("latitude", $latitude);
|
||||
$xml->writeElement("longitude", $longitude);
|
||||
$xml->writeElement("altitude", ($altitude)?round($altitude):$altitude);
|
||||
$xml->writeElement("speed", $speed);
|
||||
$xml->writeElement("angle", $angle);
|
||||
$xml->writeElement("dateoccured", $dateoccured);
|
||||
$xml->writeElement("username", $username);
|
||||
$xml->writeElement("trackid", $trackid);
|
||||
$xml->writeElement("trackname", $trackname);
|
||||
$distance = (isset($prev_latitude))?haversine_distance($prev_latitude,$prev_longitude,$latitude,$longitude):0;
|
||||
$prev_latitude = $latitude;
|
||||
$prev_longitude = $longitude;
|
||||
$xml->writeElement("distance", round($distance));
|
||||
$seconds = (isset($prev_dateoccured))?(strtotime($dateoccured)-strtotime($prev_dateoccured)):0;
|
||||
$prev_dateoccured = $dateoccured;
|
||||
$xml->writeElement("seconds", $seconds);
|
||||
$xml->endElement();
|
||||
}
|
||||
|
||||
$xml->endElement();
|
||||
$xml->endDocument();
|
||||
$xml->flush();
|
||||
|
||||
$query->free_result();
|
||||
}
|
||||
|
||||
$mysqli->close();
|
||||
?>
|
52
gettrips.php
Executable file
52
gettrips.php
Executable file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
require_once("auth.php");
|
||||
|
||||
$userid = ((isset($_REQUEST["userid"]) && is_numeric($_REQUEST["userid"])) ? $_REQUEST["userid"] : 0);
|
||||
|
||||
if ($userid) {
|
||||
$query = $mysqli->prepare("SELECT ID,Name FROM trips WHERE FK_Users_ID=? ORDER BY ID DESC");
|
||||
$query->bind_param('i', $userid);
|
||||
$query->execute();
|
||||
$query->bind_result($trackid,$trackname);
|
||||
|
||||
header("Content-type: text/xml");
|
||||
$xml = new XMLWriter();
|
||||
$xml->openURI("php://output");
|
||||
$xml->startDocument("1.0");
|
||||
$xml->setIndent(true);
|
||||
$xml->startElement('root');
|
||||
|
||||
while ($query->fetch()) {
|
||||
$xml->startElement("trip");
|
||||
$xml->writeElement("trackid", $trackid);
|
||||
$xml->writeElement("trackname", $trackname);
|
||||
$xml->endElement();
|
||||
}
|
||||
|
||||
$xml->endElement();
|
||||
$xml->endDocument();
|
||||
$xml->flush();
|
||||
|
||||
$query->free_result();
|
||||
}
|
||||
|
||||
$mysqli->close();
|
||||
?>
|
186
index.php
Executable file
186
index.php
Executable file
@ -0,0 +1,186 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
require_once("auth.php");
|
||||
|
||||
if ($auth) {
|
||||
// get username
|
||||
$query = "SELECT username FROM users WHERE ID='$auth' LIMIT 1";
|
||||
$result = $mysqli->query($query);
|
||||
$row = $result->fetch_assoc();
|
||||
$user = $row["username"];
|
||||
|
||||
// users
|
||||
$user_form = '<u>'.$lang_user.'</u><br />'.$user.' (<a href="logout.php">'.$lang_logout.'</a>)';
|
||||
}
|
||||
else {
|
||||
// free access
|
||||
// prepare user select form
|
||||
$user_form = '
|
||||
<u>'.$lang_user.'</u><br />
|
||||
<form>
|
||||
<select name="user" onchange="selectUser(this)">
|
||||
<option value=\"0\">'.$lang_suser.'</option>';
|
||||
$query = "SELECT ID,username FROM users ORDER BY username";
|
||||
$result = $mysqli->query($query);
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$user_form .= sprintf("<option value=\"%s\">%s</option>\n", $row["ID"], $row["username"]);
|
||||
}
|
||||
$user_form .= '
|
||||
</select>
|
||||
</form>
|
||||
';
|
||||
}
|
||||
|
||||
|
||||
// prepare track select form
|
||||
$track_form = '
|
||||
<u>'.$lang_track.'</u><br />
|
||||
<form>
|
||||
<select name="track" onchange="selectTrack(this)">';
|
||||
$query = "SELECT * FROM trips WHERE FK_Users_ID='$auth' ORDER BY ID DESC";
|
||||
$result = $mysqli->query($query);
|
||||
$trackid = "";
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
if ($trackid == "") { $trackid = $row["ID"]; } // get first row
|
||||
$track_form .= sprintf("<option value=\"%s\">%s</option>\n", $row["ID"], $row["Name"]);
|
||||
}
|
||||
$track_form .= '
|
||||
</select>
|
||||
<input id="latest" type="checkbox" onchange="toggleLatest();"> '.$lang_latest.'<br />
|
||||
</form>
|
||||
';
|
||||
|
||||
print
|
||||
'<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>'.$lang_title.'</title>
|
||||
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
|
||||
<link rel="stylesheet" type="text/css" href="main.css">
|
||||
<script>
|
||||
var interval = '.$interval.';
|
||||
var userid = '.(($auth)?$auth:-1).';
|
||||
var trackid = '.(($trackid)?$trackid:-1).';
|
||||
var lang_user = "'.$lang_user.'";
|
||||
var lang_time = "'.$lang_time.'";
|
||||
var lang_speed = "'.$lang_speed.'";
|
||||
var lang_altitude = "'.$lang_altitude.'";
|
||||
var lang_ttime = "'.$lang_ttime.'";
|
||||
var lang_aspeed = "'.$lang_aspeed.'";
|
||||
var lang_tdistance = "'.$lang_tdistance.'";
|
||||
var lang_point = "'.$lang_point.'";
|
||||
var lang_of = "'.$lang_of.'";
|
||||
var lang_summary = "'.$lang_summary.'";
|
||||
var lang_latest = "'.$lang_latest.'";
|
||||
var lang_track = "'.$lang_track.'";
|
||||
var lang_newinterval = "'.$lang_newinterval.'";
|
||||
var units = "'.$units.'";
|
||||
</script>
|
||||
<script type="text/javascript" src="main.js">
|
||||
</script>
|
||||
';
|
||||
if ($mapapi == "gmaps") {
|
||||
print
|
||||
' <script type="text/javascript"
|
||||
src="https://maps.googleapis.com/maps/api/js?'.(isset($gkey)?'key='.$gkey.'&':'').'sensor=false">
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
var map;
|
||||
var polies = new Array();
|
||||
var markers = new Array();
|
||||
var popups = new Array();
|
||||
google.maps.visualRefresh = true;
|
||||
var polyOptions = {
|
||||
strokeColor: \'#FF0000\',
|
||||
strokeOpacity: 1.0,
|
||||
strokeWeight: 2
|
||||
}
|
||||
var mapOptions = {
|
||||
center: new google.maps.LatLng(52.23, 21.01),
|
||||
zoom: 8,
|
||||
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
||||
scaleControl: true
|
||||
};
|
||||
function init() {
|
||||
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
|
||||
}
|
||||
</script>
|
||||
';
|
||||
}
|
||||
else {
|
||||
print
|
||||
' <script type="text/javascript"
|
||||
src="http://openlayers.org/api/OpenLayers.js">
|
||||
</script>
|
||||
<script>
|
||||
function init() {
|
||||
map = new OpenLayers.Map("map-canvas");
|
||||
map.addLayer(new OpenLayers.Layer.OSM());
|
||||
var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984
|
||||
var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
|
||||
var position = new OpenLayers.LonLat(21.01,52.23).transform(fromProjection, toProjection);
|
||||
var zoom = 8;
|
||||
map.setCenter(position, zoom);
|
||||
}
|
||||
</script>
|
||||
';
|
||||
}
|
||||
print '
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
|
||||
<script type="text/javascript">
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<body onload="init();loadTrack(userid,trackid,1);">
|
||||
<div id="menu">
|
||||
<div id="menu-content">
|
||||
<div id="user">
|
||||
'.$user_form.'
|
||||
</div>
|
||||
<div id="trip">
|
||||
'.$track_form.'
|
||||
<input id="latest" type="checkbox" onchange="autoReload();"> '.$lang_autoreload.' (<a href="javascript:void(0);" onclick="setTime()"><span id="auto">'.$interval.'</span></a> s)<br />
|
||||
<a href="javascript:void(0);" onclick="loadTrack(userid,trackid,0)">'.$lang_reload.'</a><br />
|
||||
</div>
|
||||
<div id="summary"></div>
|
||||
<div id="other">
|
||||
<a href="javascript:void(0);" onclick="toggleChart();">'.$lang_chart.'</a><br />
|
||||
</div>
|
||||
<div id="export">
|
||||
<u>'.$lang_download.'</u><br />
|
||||
<a href="javascript:void(0);" onclick="load(\'kml\',userid,trackid)">kml</a><br />
|
||||
<a href="javascript:void(0);" onclick="load(\'gpx\',userid,trackid)">gpx</a><br />
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">phpTrackme '.$version.'</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div id="map-canvas"></div>
|
||||
<div id="bottom">
|
||||
<div id="chart"></div>
|
||||
<div id="close"><a href="javascript:void(0);" onclick="toggleChart(0);">'.$lang_close.'</a></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>';
|
||||
$mysqli->close();
|
||||
?>
|
82
lang.php
Executable file
82
lang.php
Executable file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
switch($lang) {
|
||||
default:
|
||||
case "en":
|
||||
$lang_title = "fabiszewski.net • geolocation";
|
||||
$lang_private = "You need login and password to access this page.";
|
||||
$lang_authfail = "Wrong username or password";
|
||||
$lang_user = "User";
|
||||
$lang_track = "Track";
|
||||
$lang_latest = "latest position";
|
||||
$lang_autoreload = "autoreload";
|
||||
$lang_reload = "Reload now";
|
||||
$lang_download = "Download data";
|
||||
$lang_chart = "Altitudes chart";
|
||||
$lang_close = "close";
|
||||
$lang_time = "Time";
|
||||
$lang_speed = "Speed";
|
||||
$lang_altitude = "Altitude";
|
||||
$lang_ttime = "Total time";
|
||||
$lang_aspeed = "Average speed";
|
||||
$lang_tdistance = "Total dist.";
|
||||
$lang_point = "Point"; //Point x of y
|
||||
$lang_of = "of";
|
||||
$lang_summary = "Trip summary";
|
||||
$lang_suser = "select user";
|
||||
$lang_logout = "log out";
|
||||
$lang_login = "Log in";
|
||||
$lang_username = "Username";
|
||||
$lang_password = "Password";
|
||||
$lang_language = "Language";
|
||||
$lang_newinterval = "Enter new interval value (seconds)";
|
||||
break;
|
||||
|
||||
case "pl":
|
||||
$lang_title = "fabiszewski.net • geolocation";
|
||||
$lang_private = "Aby się zalogować musisz podać login i hasło";
|
||||
$lang_authfail = "błędny login lub hasło";
|
||||
$lang_user = "Użytkownik";
|
||||
$lang_track = "Trasa";
|
||||
$lang_latest = "ostatnia pozycja";
|
||||
$lang_autoreload = "odświeżaj";
|
||||
$lang_reload = "Odśwież teraz";
|
||||
$lang_download = "Pobierz dane";
|
||||
$lang_chart = "Wykres przewyższeń";
|
||||
$lang_close = "zamknij";
|
||||
$lang_time = "Czas";
|
||||
$lang_speed = "Prędkość";
|
||||
$lang_altitude = "Wysokość";
|
||||
$lang_ttime = "Czas podróży";
|
||||
$lang_aspeed = "Średnia prędkość";
|
||||
$lang_tdistance = "Odległość";
|
||||
$lang_suser = "wybierz login";
|
||||
$lang_point = "Punkt";
|
||||
$lang_of = "z";
|
||||
$lang_summary = "Podsumowanie";
|
||||
$lang_logout = "wyloguj";
|
||||
$lang_login = "zaloguj";
|
||||
$lang_username = "Login";
|
||||
$lang_password = "Hasło";
|
||||
$lang_language = "Język";
|
||||
$lang_newinterval = "Podaj częstotliwość odświeżania (w sekundach)";
|
||||
break;
|
||||
}
|
||||
?>
|
30
logout.php
Executable file
30
logout.php
Executable file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
session_name('trackme');
|
||||
session_start();
|
||||
$_SESSION = NULL;
|
||||
if (isset($_COOKIE[session_name('trackme')])) {
|
||||
setcookie(session_name('trackme'),'',time()-42000,'/');
|
||||
}
|
||||
session_destroy();
|
||||
@$ssl = ($_SERVER['HTTPS'] == "" ? "http" : "https");
|
||||
$url = str_replace("//", "/", $_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME'])."/index.php");
|
||||
header("Location: $ssl://$url");
|
||||
?>
|
152
main.css
Executable file
152
main.css
Executable file
@ -0,0 +1,152 @@
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
html {
|
||||
height: 100%;
|
||||
}
|
||||
body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #666;
|
||||
}
|
||||
a {
|
||||
color: #bce;
|
||||
text-decoration: none;
|
||||
}
|
||||
:link, :visited {
|
||||
color: #bce;
|
||||
}
|
||||
select {
|
||||
width: 150px;
|
||||
/*font-size: 0.6em;*/
|
||||
font-weight: normal;
|
||||
padding-top: 0.2em;
|
||||
}
|
||||
input {
|
||||
width: 150px;
|
||||
text-align: center;
|
||||
border: 1px solid black;
|
||||
}
|
||||
input[type = "submit"] {
|
||||
background-color: black;
|
||||
color: white;
|
||||
border: 1px solid white;
|
||||
}
|
||||
input[type = "checkbox"] {
|
||||
width: auto;
|
||||
}
|
||||
#main {
|
||||
height: 100%;
|
||||
margin-right: 165px;
|
||||
}
|
||||
#map-canvas {
|
||||
height: 100%;
|
||||
}
|
||||
#menu {
|
||||
font-family: Verdana, sans-serif;
|
||||
font-size: 0.6em;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
float: right;
|
||||
width: 165px;
|
||||
height: 100%;
|
||||
background-color: #666;
|
||||
}
|
||||
#menu-content {
|
||||
padding: 10px;
|
||||
}
|
||||
#footer {
|
||||
position: fixed;
|
||||
bottom:0;
|
||||
padding: 10px;
|
||||
background-color: #666;
|
||||
color: lightgray;
|
||||
}
|
||||
#user, #trip, #summary, #export, #other {
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
#login {
|
||||
font-family: Verdana, sans-serif;
|
||||
position: relative;
|
||||
top: 10%;
|
||||
background-color: #444;
|
||||
width: 30%;
|
||||
min-width: 200px;
|
||||
margin: auto;
|
||||
padding: 30px;
|
||||
font-size: 0.8em;
|
||||
text-align: center;
|
||||
color: white;
|
||||
}
|
||||
#title {
|
||||
font-size: 1.3em;
|
||||
padding-bottom: 0.5em;
|
||||
padding-top: 0.6em;
|
||||
}
|
||||
#subtitle {
|
||||
padding-bottom: 2em;
|
||||
}
|
||||
#error {
|
||||
padding-top: 1.2em;
|
||||
color: yellow;
|
||||
}
|
||||
#popup {
|
||||
width:350px;
|
||||
height:150px;
|
||||
}
|
||||
#pheader {
|
||||
font-weight: bolder;
|
||||
padding-bottom: 5px;
|
||||
border-bottom: 1px solid gray;
|
||||
}
|
||||
#pleft,#pright {
|
||||
float:left;
|
||||
padding-top: 5px;
|
||||
}
|
||||
#pleft {
|
||||
padding-right: 20px;
|
||||
}
|
||||
#pfooter {
|
||||
clear: both;
|
||||
font-size: smaller;
|
||||
padding-top: 20px;
|
||||
}
|
||||
#bottom {
|
||||
display: none;
|
||||
}
|
||||
#chart {
|
||||
position: fixed;
|
||||
bottom: 0; left:0; right: 0;
|
||||
height: 200px;
|
||||
margin-right: 165px;
|
||||
background-color: white;
|
||||
opacity: 0.8;
|
||||
}
|
||||
#close {
|
||||
position: absolute;
|
||||
bottom: 175px;
|
||||
right: 175px;
|
||||
z-index: 100;
|
||||
font-family: Verdana, sans-serif;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
#close a, #close:link, #close:visited {
|
||||
color: #5070af;
|
||||
}
|
412
main.js
Executable file
412
main.js
Executable file
@ -0,0 +1,412 @@
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
// google maps
|
||||
function displayTrack(xml,update) {
|
||||
altitudes.length = 0;
|
||||
var totalMeters = 0;
|
||||
var totalSeconds = 0;
|
||||
// init polyline
|
||||
var poly = new google.maps.Polyline(polyOptions);
|
||||
poly.setMap(map);
|
||||
var path = poly.getPath();
|
||||
var latlngbounds = new google.maps.LatLngBounds( );
|
||||
var positions = xml.getElementsByTagName('position');
|
||||
var posLen = positions.length;
|
||||
for (var i=0; i<posLen; i++) {
|
||||
var p = parsePosition(positions[i]);
|
||||
totalMeters += p.distance;
|
||||
totalSeconds += p.seconds;
|
||||
p['totalMeters'] = totalMeters;
|
||||
p['totalSeconds'] = totalSeconds;
|
||||
p['coordinates'] = new google.maps.LatLng(p.latitude,p.longitude);
|
||||
// set marker
|
||||
setMarker(p,i,posLen);
|
||||
// update polyline
|
||||
path.push(p.coordinates);
|
||||
latlngbounds.extend(p.coordinates);
|
||||
// save altitudes for chart
|
||||
altitudes[i] = p.altitude;
|
||||
}
|
||||
if (update) {
|
||||
map.fitBounds(latlngbounds);
|
||||
if (i==1) {
|
||||
// only one point, zoom out
|
||||
zListener =
|
||||
google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) {
|
||||
if (this.getZoom()){
|
||||
this.setZoom(15);
|
||||
}
|
||||
});
|
||||
setTimeout(function(){google.maps.event.removeListener(zListener)}, 2000);
|
||||
}
|
||||
}
|
||||
latestTime = p.dateoccured;
|
||||
polies.push(poly);
|
||||
|
||||
updateSummary(p.dateoccured,totalMeters,totalSeconds);
|
||||
if (p.tid!=trackid) {
|
||||
trackid=p.tid;
|
||||
setTrack(trackid);
|
||||
}
|
||||
if (document.getElementById('bottom').style.display=='block') {
|
||||
// update altitudes chart
|
||||
chart.clearChart();
|
||||
displayChart();
|
||||
}
|
||||
}
|
||||
|
||||
function clearMap(){
|
||||
if (polies){
|
||||
for (var i=0; i<polies.length; i++){
|
||||
polies[i].setMap(null);
|
||||
}
|
||||
}
|
||||
if (markers){
|
||||
for (var i=0; i<markers.length; i++){
|
||||
google.maps.event.removeListener(popups[i].listener);
|
||||
popups[i].setMap(null);
|
||||
markers[i].setMap(null);
|
||||
}
|
||||
}
|
||||
markers.length = 0;
|
||||
polies.length = 0;
|
||||
popups.lentgth = 0;
|
||||
}
|
||||
|
||||
var popup;
|
||||
function setMarker(p,i,posLen) {
|
||||
// marker
|
||||
var marker = new google.maps.Marker( {
|
||||
map: map,
|
||||
position: p.coordinates,
|
||||
title: p.dateoccured
|
||||
});
|
||||
if (latest==1) { marker.setIcon('http://maps.google.com/mapfiles/dd-end.png') }
|
||||
else if (i==0) { marker.setIcon('http://maps.google.com/mapfiles/marker_greenA.png') }
|
||||
else if (i==posLen-1) { marker.setIcon('http://maps.google.com/mapfiles/markerB.png') }
|
||||
else { marker.setIcon('http://labs.google.com/ridefinder/images/mm_20_gray.png') }
|
||||
// popup
|
||||
var content = '<div id="popup">'+
|
||||
'<div id="pheader">'+lang_user+': '+p.username.toUpperCase()+'<br />'+lang_track+': '+p.trackname.toUpperCase()+
|
||||
'</div>'+
|
||||
'<div id="pbody">'+
|
||||
'<div id="pleft"><b>'+lang_time+':</b> '+p.dateoccured+'<br />'+
|
||||
((p.speed != null)?'<b>'+lang_speed+':</b> '+(p.speed.toKmH()*factor_kmh)+' '+unit_kmh+'<br />':'')+
|
||||
((p.altitude != null)?'<b>'+lang_altitude+':</b> '+(p.altitude*factor_m).toFixed()+' '+unit_m+'<br />':'')+'</div>'+
|
||||
((latest==0)?
|
||||
('<div id="pright"><b>'+lang_ttime+':</b> '+p.totalSeconds.toHMS()+'<br />'+
|
||||
'<b>'+lang_aspeed+':</b> '+((p.totalSeconds>0)?((p.totalMeters/p.totalSeconds).toKmH()*factor_kmh).toFixed():0)+' '+unit_kmh+'<br />'+
|
||||
'<b>'+lang_tdistance+':</b> '+(p.totalMeters.toKm()*factor_km).toFixed(2)+' '+unit_km+'<br />'+'</div>'):'')+
|
||||
'<div id="pfooter">'+lang_point+' '+(i+1)+' '+lang_of+' '+(posLen)+'</div>'+
|
||||
'</div></div>';
|
||||
popup = new google.maps.InfoWindow();
|
||||
popup.listener = google.maps.event.addListener(marker, 'click', (function(marker,content) {
|
||||
return function() {
|
||||
popup.setContent(content);
|
||||
popup.open(map, marker);
|
||||
if (document.getElementById('bottom').style.display=='block') {
|
||||
chart.setSelection([{row:i,column:null}]);
|
||||
}
|
||||
}
|
||||
})(marker,content));
|
||||
markers.push(marker);
|
||||
popups.push(popup);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// openstreetmaps
|
||||
// TODO
|
||||
|
||||
|
||||
// general stuff
|
||||
if (units=='imperial') {
|
||||
factor_kmh = 0.62; //to mph
|
||||
unit_kmh = 'mph';
|
||||
factor_m = 3.28; // to feet
|
||||
unit_m = 'ft';
|
||||
factor_km = 0.62; // to miles
|
||||
unit_km = 'mi';
|
||||
}
|
||||
else {
|
||||
factor_kmh = 1;
|
||||
unit_kmh = 'km/h';
|
||||
factor_m = 1;
|
||||
unit_m = 'm';
|
||||
factor_km = 1;
|
||||
unit_km = 'km';
|
||||
}
|
||||
var latest = 0;
|
||||
var latestTime = 0;
|
||||
var live = 0;
|
||||
var chart;
|
||||
var altitudes = new Array();
|
||||
var altTimeout;
|
||||
function displayChart() {
|
||||
if (chart) { google.visualization.events.removeAllListeners(chart); }
|
||||
var data = new google.visualization.DataTable();
|
||||
data.addColumn('number', 'id');
|
||||
data.addColumn('number', 'altitude');
|
||||
var altLen = altitudes.length;
|
||||
for (var i=0; i<altLen; i++) {
|
||||
data.addRow([(i+1),Math.round((altitudes[i]*factor_m))]);
|
||||
}
|
||||
|
||||
var options = {
|
||||
title: lang_altitude+' ('+unit_m+')',
|
||||
hAxis: { textPosition: 'none' },
|
||||
legend: { position: 'none' }
|
||||
};
|
||||
|
||||
chart = new google.visualization.LineChart(document.getElementById('chart'));
|
||||
chart.draw(data, options);
|
||||
|
||||
google.visualization.events.addListener(chart, 'select', function() {
|
||||
if (popup) {popup.close(); clearTimeout(altTimeout);}
|
||||
var selection = chart.getSelection()[0];
|
||||
if (selection) {
|
||||
var id = selection.row;
|
||||
var contentString = '<div style="width:40px; height:20px;padding:10px">'+Math.round(altitudes[id]*factor_m)+' '+unit_m+'</div>';
|
||||
popup = new google.maps.InfoWindow({
|
||||
content: contentString
|
||||
});
|
||||
popup.open(map,markers[id]);
|
||||
altTimeout = setTimeout(function() { if (popup) {popup.close();} },2000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function toggleChart(i) {
|
||||
var altLen = altitudes.length;
|
||||
if (altLen<=1) { return; }
|
||||
var e = document.getElementById('bottom');
|
||||
if (arguments.length < 1) {
|
||||
if (e.style.display == 'block') { i = 0 }
|
||||
else { i = 1; }
|
||||
}
|
||||
if (i==0) {
|
||||
chart.clearChart();
|
||||
e.style.display = 'none';
|
||||
}
|
||||
else {
|
||||
e.style.display = 'block';
|
||||
displayChart();
|
||||
}
|
||||
}
|
||||
|
||||
function getXHR() {
|
||||
var xmlhttp = null;
|
||||
if (window.XMLHttpRequest) {
|
||||
xmlhttp=new XMLHttpRequest();
|
||||
}
|
||||
else {
|
||||
xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
|
||||
}
|
||||
return xmlhttp;
|
||||
}
|
||||
|
||||
function loadTrack(userid,trackid,update) {
|
||||
if (latest==1) { trackid=0; }
|
||||
var xhr = getXHR();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState==4 && xhr.status==200) {
|
||||
var xml = xhr.responseXML;
|
||||
var positions = xml.getElementsByTagName('position');
|
||||
if (positions.length>0) {
|
||||
clearMap();
|
||||
displayTrack(xml,update);
|
||||
}
|
||||
xhr = null;
|
||||
}
|
||||
}
|
||||
xhr.open('GET','getpositions.php?trackid='+trackid+'&userid='+userid,true);
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
function parsePosition(p) {
|
||||
// read data
|
||||
var latitude = getNode(p,'latitude');
|
||||
var longitude = getNode(p,'longitude');
|
||||
var altitude = getNode(p,'altitude'); // may be null
|
||||
if (altitude != null) { altitude = parseInt(altitude); }
|
||||
var speed = getNode(p,'speed'); // may be null
|
||||
if (speed != null) { speed = parseInt(speed); }
|
||||
var angle = getNode(p,'angle'); // may be null
|
||||
if (angle != null) { angle = parseInt(angle); }
|
||||
var username = getNode(p,'username');
|
||||
var trackname = getNode(p,'trackname');
|
||||
var tid = getNode(p,'trackid');
|
||||
var dateoccured = getNode(p,'dateoccured');
|
||||
var distance = parseInt(getNode(p,'distance'));
|
||||
var seconds = parseInt(getNode(p,'seconds'));
|
||||
return {
|
||||
'latitude': latitude,
|
||||
'longitude': longitude,
|
||||
'altitude': altitude,
|
||||
'speed': speed,
|
||||
'angle': angle,
|
||||
'username': username,
|
||||
'trackname': trackname,
|
||||
'tid': tid,
|
||||
'dateoccured': dateoccured,
|
||||
'distance': distance,
|
||||
'seconds': seconds
|
||||
};
|
||||
}
|
||||
|
||||
function load(type,userid,trackid) {
|
||||
var url = 'download.php?type='+type+'&userid='+userid+'&trackid='+trackid;
|
||||
window.location.assign(url);
|
||||
}
|
||||
|
||||
function updateSummary(l,d,s) {
|
||||
var t = document.getElementById('summary');
|
||||
if (latest==0){
|
||||
t.innerHTML = '<u>'+lang_summary+'</u><br />'+
|
||||
lang_tdistance+': '+(d.toKm()*factor_km).toFixed(2)+' '+unit_km+'<br />'+
|
||||
lang_ttime+': '+s.toHMS();
|
||||
}
|
||||
else {
|
||||
t.innerHTML = '<u>'+lang_latest+':</u><br />'+l;
|
||||
}
|
||||
}
|
||||
|
||||
function getNode(p,name) {
|
||||
return ((p.getElementsByTagName(name)[0].childNodes[0]) ? p.getElementsByTagName(name)[0].childNodes[0].nodeValue : null);
|
||||
}
|
||||
|
||||
|
||||
// seconds to (d) H:M:S
|
||||
Number.prototype.toHMS = function(){
|
||||
var s = this;
|
||||
var d = Math.floor(s / 86400);
|
||||
var h = Math.floor((s % 86400) / 3600);
|
||||
var m = Math.floor(((s % 86400) % 3600) / 60);
|
||||
s = ((s % 86400) % 3600) % 60;
|
||||
|
||||
return ((d>0)?(d + ' d '):'') + (('00'+h).slice(-2)) + ':' + (('00'+m).slice(-2)) + ':' + (('00'+s).slice(-2)) + '';
|
||||
}
|
||||
// meters to km
|
||||
Number.prototype.toKm = function() {
|
||||
return Math.round(this/10)/100;
|
||||
}
|
||||
// m/s to km/h
|
||||
Number.prototype.toKmH = function() {
|
||||
return Math.round(this*3600/10)/100;
|
||||
}
|
||||
|
||||
// negate value
|
||||
function toggleLatest() {
|
||||
if (latest==0) {
|
||||
latest = 1;
|
||||
loadTrack(userid,0,1);
|
||||
}
|
||||
else {
|
||||
latest = 0;
|
||||
loadTrack(userid,trackid,1);
|
||||
}
|
||||
}
|
||||
|
||||
function setTrack(t) {
|
||||
document.getElementsByName('track')[0].value = t;
|
||||
}
|
||||
|
||||
function selectTrack(f) {
|
||||
trackid=f.options[f.selectedIndex].value;
|
||||
document.getElementById('latest').checked = false;
|
||||
if (latest==1) { toggleLatest(); }
|
||||
loadTrack(userid,trackid,1);
|
||||
}
|
||||
|
||||
function selectUser(f) {
|
||||
userid=f.options[f.selectedIndex].value;
|
||||
if (f.options[0].disabled==false) {
|
||||
f.options[0].disabled = true;
|
||||
}
|
||||
document.getElementById('latest').checked = false;
|
||||
if (latest==1) { toggleLatest(); }
|
||||
getTrips(userid);
|
||||
}
|
||||
|
||||
function getTrips(userid) {
|
||||
var xhr = getXHR();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState==4 && xhr.status==200) {
|
||||
var xml = xhr.responseXML;
|
||||
var trips = xml.getElementsByTagName('trip');
|
||||
if (trips.length>0) {
|
||||
fillOptions(xml);
|
||||
}
|
||||
xhr = null;
|
||||
}
|
||||
}
|
||||
xhr.open('GET','gettrips.php?userid='+userid,true);
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
function fillOptions(xml) {
|
||||
var trackSelect = document.getElementsByName('track')[0];
|
||||
clearOptions(trackSelect);
|
||||
var trips = xml.getElementsByTagName('trip');
|
||||
var trpLen = trips.length;
|
||||
for (var i=0; i<trpLen; i++) {
|
||||
var trackid = getNode(trips[i],'trackid');
|
||||
var trackname = getNode(trips[i],'trackname');
|
||||
var option = document.createElement("option");
|
||||
option.value = trackid;
|
||||
option.innerHTML = trackname;
|
||||
trackSelect.appendChild(option);
|
||||
}
|
||||
var defaultTrack = getNode(trips[0],'trackid');
|
||||
loadTrack(userid,defaultTrack,1);
|
||||
}
|
||||
|
||||
function clearOptions(el){
|
||||
if (el.options) {
|
||||
while (el.options.length) {
|
||||
el.remove(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var auto;
|
||||
function autoReload() {
|
||||
if (live==0) {
|
||||
live = 1;
|
||||
auto = setInterval(function() { loadTrack(userid,trackid,0); },interval*1000);
|
||||
}
|
||||
else {
|
||||
live = 0;
|
||||
clearInterval(auto);
|
||||
}
|
||||
}
|
||||
|
||||
function setTime() {
|
||||
var i = parseInt(prompt(lang_newinterval));
|
||||
if (!isNaN(i) && i!=interval) {
|
||||
interval = i;
|
||||
document.getElementById('auto').innerHTML = interval;
|
||||
// if live tracking on, reload with new interval
|
||||
if (live==1) {
|
||||
live = 0;
|
||||
clearInterval(auto);
|
||||
autoReload();
|
||||
}
|
||||
}
|
||||
}
|
268
requests.php
Executable file
268
requests.php
Executable file
@ -0,0 +1,268 @@
|
||||
<?php
|
||||
/* phpTrackme
|
||||
*
|
||||
* Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Library 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 Library General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
// TrackMe API
|
||||
// http://forum.xda-developers.com/showpost.php?p=3250539&postcount=2
|
||||
|
||||
require_once("config.php");
|
||||
$user = (isset($_REQUEST['u']) ? $_REQUEST['u'] : "");
|
||||
$pass = (isset($_REQUEST['p']) ? md5($salt.$_REQUEST['p']) : "");
|
||||
$requireddb = (isset($_REQUEST['db']) ? $_REQUEST['db'] : 0);
|
||||
$tripname = (isset($_REQUEST['tn']) ? $_REQUEST['tn'] : "");
|
||||
$action = (isset($_REQUEST['a']) ? $_REQUEST['a'] : "");
|
||||
|
||||
// FIXME what is it for?
|
||||
if ($requireddb<8) {
|
||||
//Result:5 Incompatible database.
|
||||
quit(5);
|
||||
}
|
||||
|
||||
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
|
||||
if ($mysqli->connect_errno) {
|
||||
//Result:4 Unable to connect database.
|
||||
quit(4);
|
||||
}
|
||||
|
||||
if ((!$user) || (!$pass)){
|
||||
//Result:3 User or password not specified.
|
||||
quit(3);
|
||||
}
|
||||
|
||||
$query = $mysqli->prepare("SELECT ID,username,password FROM users WHERE username=? LIMIT 1");
|
||||
$query->bind_param('s', $user);
|
||||
$query->execute();
|
||||
$query->store_result();
|
||||
$query->bind_result($userid, $rec_user, $rec_pass);
|
||||
$query->fetch();
|
||||
$num = $query->num_rows;
|
||||
$query->free_result();
|
||||
$query->close();
|
||||
if ($num) {
|
||||
if (($user==$rec_user) && ($pass!=$rec_pass)) {
|
||||
//Result:1 User correct, invalid password.
|
||||
quit(1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ($allow_registration) {
|
||||
// User unknown, let's create it
|
||||
$query = $mysqli->prepare("INSERT INTO users (username,password) VALUES (?,?)");
|
||||
$query->bind_param('ss', $user, $pass);
|
||||
$query->execute();
|
||||
$userid = $mysqli->insert_id;
|
||||
$query->close();
|
||||
if (!$userid) {
|
||||
//Result:2 User did not exist but after being created couldn't be found.
|
||||
// Or rather something went wrong while updating database
|
||||
quit(2);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// User unknown, we don't allow autoregistration
|
||||
// Let's use this one:
|
||||
//Result:1 User correct, invalid password.
|
||||
quit(1);
|
||||
}
|
||||
}
|
||||
|
||||
switch($action) {
|
||||
// action: noop
|
||||
case "noop":
|
||||
// test
|
||||
quit(0);
|
||||
break;
|
||||
|
||||
// action: deletetrip
|
||||
case "deletetrip":
|
||||
if ($tripname) {
|
||||
$sql = "DELETE FROM positions LEFT JOIN trips ON positions.FK_Trips_ID=trips.ID "
|
||||
."WHERE positions.FK_Users_ID=? AND trips.Name=?";
|
||||
$query = $mysqli->prepare($sql);
|
||||
if ($query) {
|
||||
$query->bind_param('is', $userid, $tripname);
|
||||
$query->execute();
|
||||
$query->close();
|
||||
}
|
||||
$sql = "DELETE FROM trips WHERE FK_Users_ID=? AND Name=?";
|
||||
$query = $mysqli->prepare($sql);
|
||||
$query->bind_param('is', $userid, $tripname);
|
||||
$query->execute();
|
||||
$rows = $mysqli->affected_rows;
|
||||
$query->close();
|
||||
if ($rows) {
|
||||
quit(0);
|
||||
}
|
||||
else {
|
||||
//Result:7 Trip not found
|
||||
quit(7);
|
||||
}
|
||||
}
|
||||
else {
|
||||
//Result:6 Trip not specified.
|
||||
quit(6);
|
||||
}
|
||||
break;
|
||||
|
||||
// action: addtrip
|
||||
case "addtrip":
|
||||
if ($tripname) {
|
||||
$sql = "INSERT INTO trips (FK_Users_ID,Name) VALUES (?,?)";
|
||||
$query = $mysqli->prepare($sql);
|
||||
$query->bind_param('is', $userid, $tripname);
|
||||
$query->execute();
|
||||
$query->close();
|
||||
}
|
||||
else {
|
||||
//Result:6 Trip not specified.
|
||||
quit(6);
|
||||
}
|
||||
break;
|
||||
|
||||
// action: gettriplist
|
||||
case "gettriplist":
|
||||
$sql = "SELECT a1.Name,(SELECT MIN(a2.DateOccurred) FROM positions a2 "
|
||||
."WHERE a2.FK_Trips_ID=a1.ID) AS startdate "
|
||||
."FROM trips a1 WHERE a1.FK_Users_ID=? ORDER BY Name";
|
||||
$query = $mysqli->prepare($sql);
|
||||
$query->bind_param('i', $userid);
|
||||
$query->execute();
|
||||
$query->store_result();
|
||||
$query->bind_result($tripname,$startdate);
|
||||
$num = $query->num_rows;
|
||||
$triplist = array();
|
||||
if ($num) {
|
||||
while ($query->fetch()) {
|
||||
$triplist[] = $tripname."|".$startdate;
|
||||
}
|
||||
}
|
||||
$query->free_result();
|
||||
$query->close();
|
||||
$param = implode("\n",$triplist);
|
||||
quit(0,$param);
|
||||
break;
|
||||
|
||||
// action: upload
|
||||
case "upload":
|
||||
$lat = isset($_REQUEST["lat"]) ? $_REQUEST["lat"] : NULL;
|
||||
$long = isset($_REQUEST["long"]) ? $_REQUEST["long"] : NULL;
|
||||
$dateoccurred = isset($_REQUEST["do"]) ? $_REQUEST["do"] : NULL;
|
||||
$altitude = isset($_REQUEST["alt"]) ? $_REQUEST["alt"] : NULL;
|
||||
$angle = isset($_REQUEST["ang"]) ? $_REQUEST["ang"] : NULL;
|
||||
$speed = isset($_REQUEST["sp"]) ? $_REQUEST["sp"] : NULL;
|
||||
$iconname = isset($_REQUEST["iconname"]) ? $_REQUEST["iconname"] : NULL;
|
||||
$comments = isset($_REQUEST["comments"]) ? $_REQUEST["comments"] : NULL;
|
||||
$imageurl = isset($_REQUEST["imageurl"]) ? $_REQUEST["imageurl"] : NULL;
|
||||
$cellid = isset($_REQUEST["cid"]) ? $_REQUEST["cid"] : NULL;
|
||||
$signalstrength = isset($_REQUEST["ss"]) ? $_REQUEST["ss"] : NULL;
|
||||
$signalstrengthmax = isset($_REQUEST["ssmax"]) ? $_REQUEST["ssmax"] : NULL;
|
||||
$signalstrengthmin = isset($_REQUEST["ssmin"]) ? $_REQUEST["ssmin"] : NULL;
|
||||
$batterystatus = isset($_REQUEST["bs"]) ? $_REQUEST["bs"] : NULL;
|
||||
$uploadss = isset($_REQUEST["upss"]) ? $_REQUEST["upss"] : NULL; // FIXME is it needed?
|
||||
$iconid = NULL;
|
||||
if ($iconname) {
|
||||
$sql = "SELECT ID FROM icons WHERE Name=? LIMIT 1";
|
||||
$query = $mysqli->prepare($sql);
|
||||
$query->bind_param('s', $iconname);
|
||||
$query->execute();
|
||||
$query->store_result();
|
||||
$query->bind_result($id);
|
||||
$query->fetch();
|
||||
$num = $query->num_rows;
|
||||
$query->free_result();
|
||||
$query->close();
|
||||
if ($num) {
|
||||
$iconid = $id;
|
||||
}
|
||||
}
|
||||
$tripid = NULL; // FIXME: not sure what trips with null id are
|
||||
if ($tripname) {
|
||||
// get tripid
|
||||
$query = $mysqli->prepare("SELECT ID FROM trips WHERE FK_Users_ID=? AND Name=? LIMIT 1");
|
||||
$query->bind_param('is', $userid, $tripname);
|
||||
$query->execute();
|
||||
$query->store_result();
|
||||
$query->bind_result($tripid);
|
||||
$query->fetch();
|
||||
$num = $query->num_rows;
|
||||
$query->free_result();
|
||||
$query->close();
|
||||
if (!$num) {
|
||||
// create trip
|
||||
$query = $mysqli->prepare("INSERT INTO trips (FK_Users_ID,Name) VALUES (?,?)");
|
||||
$query->bind_param('is', $userid, $tripname);
|
||||
$query->execute();
|
||||
$tripid = $mysqli->insert_id;
|
||||
$query->close();
|
||||
if (!$tripid) {
|
||||
//Result:6 Trip didn't exist and system was unable to create it.
|
||||
quit(6);
|
||||
}
|
||||
}
|
||||
}
|
||||
$sql = "INSERT INTO positions "
|
||||
."(FK_Users_ID,FK_Trips_ID,Latitude,Longitude,DateOccurred,FK_Icons_ID,"
|
||||
."Speed,Altitude,Comments,ImageURL,Angle,SignalStrength,SignalStrengthMax,"
|
||||
."SignalStrengthMin,BatteryStatus) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||||
$query = $mysqli->prepare($sql);
|
||||
$query->bind_param('iiddsiddssdiiii',
|
||||
$userid,$tripid,$lat,$long,$dateoccurred,$iconid,
|
||||
$speed,$altitude,$comments,$imageurl,$angle,$signalstrength,$signalstrengthmax,
|
||||
$signalstrengthmin,$batterystatus);
|
||||
$query->execute();
|
||||
$query->close();
|
||||
if ($mysqli->errno) {
|
||||
//Result:7|SQLERROR Insert statement failed.
|
||||
quit(7,$mysqli->error);
|
||||
}
|
||||
//FIXME Are cellids used in Android client?
|
||||
$upcellext = isset($_REQUEST["upcellext"]) ? $_REQUEST["upcellext"] : NULL;
|
||||
if ($upcellext==1 && $cellid) {
|
||||
$sql = "INSERT INTO cellids (CellID,Latitude,Longitude,SignalStrength,SignalStrengthMax,SignalStrengthMin) "
|
||||
."VALUES (?,?,?,?,?,?)";
|
||||
$query = $mysqli->prepare($sql);
|
||||
$query->bind_param('sddiii',$cellid,$lat,$long,$signalstrength,$signalstrengthmax,$signalstrengthmin);
|
||||
$query->execute();
|
||||
$query->close();
|
||||
if ($mysqli->errno) {
|
||||
//Result:7|SQLERROR Insert statement failed.
|
||||
quit(7,$mysqli->error);
|
||||
}
|
||||
}
|
||||
quit(0);
|
||||
break;
|
||||
|
||||
// action: geticonlist
|
||||
// action: renametrip
|
||||
// action: findclosestbuddy
|
||||
// action: delete
|
||||
// action: sendemail
|
||||
// action: updateimageurl
|
||||
// action: findclosestpositionbytime
|
||||
// action: findclosestpositionbyposition
|
||||
// action: gettripinfo
|
||||
// action: gettriphighlights
|
||||
}
|
||||
|
||||
function quit($errno,$param=""){
|
||||
print "Result:".$errno.(($param)?"|$param":"");
|
||||
exit();
|
||||
}
|
||||
|
||||
$mysqli->close();
|
||||
?>
|
128
trackme.sql
Executable file
128
trackme.sql
Executable file
@ -0,0 +1,128 @@
|
||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||
SET time_zone = "+00:00";
|
||||
CREATE DATABASE IF NOT EXISTS `trackme` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
|
||||
USE `trackme`;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `cellids` (
|
||||
`ID` int(11) NOT NULL auto_increment,
|
||||
`CellID` varchar(255) NOT NULL,
|
||||
`Latitude` double NOT NULL,
|
||||
`Longitude` double NOT NULL,
|
||||
`DateAdded` timestamp NOT NULL default CURRENT_TIMESTAMP,
|
||||
`SignalStrength` int(11) default NULL,
|
||||
`SignalStrengthMax` int(11) default NULL,
|
||||
`SignalStrengthMin` int(11) default NULL,
|
||||
PRIMARY KEY (`ID`),
|
||||
KEY `Index_CellID` (`CellID`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `icons` (
|
||||
`ID` int(11) NOT NULL auto_increment,
|
||||
`Name` varchar(255) NOT NULL,
|
||||
`URL` varchar(512) NOT NULL,
|
||||
PRIMARY KEY (`ID`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `positions` (
|
||||
`ID` int(11) NOT NULL auto_increment,
|
||||
`FK_Users_ID` int(11) NOT NULL,
|
||||
`FK_Trips_ID` int(11) default NULL,
|
||||
`FK_Icons_ID` int(11) default NULL,
|
||||
`Latitude` double NOT NULL,
|
||||
`Longitude` double NOT NULL,
|
||||
`Altitude` double default '0',
|
||||
`Speed` double default '0',
|
||||
`Angle` double default NULL,
|
||||
`DateAdded` timestamp NOT NULL default CURRENT_TIMESTAMP,
|
||||
`DateOccurred` timestamp NULL default '0000-00-00 00:00:00',
|
||||
`Comments` varchar(255) default NULL,
|
||||
`ImageURL` varchar(255) default NULL,
|
||||
`SignalStrength` int(11) default NULL,
|
||||
`SignalStrengthMax` int(11) default NULL,
|
||||
`SignalStrengthMin` int(11) default NULL,
|
||||
`BatteryStatus` tinyint(4) default NULL,
|
||||
PRIMARY KEY (`ID`),
|
||||
KEY `Index_FK_Trips_ID` (`FK_Trips_ID`),
|
||||
KEY `Index_FK_Users_ID` (`FK_Users_ID`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `trips` (
|
||||
`ID` int(11) NOT NULL auto_increment,
|
||||
`FK_Users_ID` int(11) NOT NULL,
|
||||
`Name` varchar(255) NOT NULL,
|
||||
`Comments` varchar(1024) default NULL,
|
||||
PRIMARY KEY (`ID`),
|
||||
UNIQUE KEY `Index_FK_Users_ID_Name` (`FK_Users_ID`,`Name`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `users` (
|
||||
`ID` int(11) NOT NULL auto_increment,
|
||||
`username` varchar(15) NOT NULL,
|
||||
`password` varchar(50) NOT NULL default '',
|
||||
PRIMARY KEY (`ID`),
|
||||
UNIQUE KEY `Index_username` (`username`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
INSERT INTO `icons` VALUES (1, 'Snack', 'http://maps.google.com/mapfiles/ms/micons/snack_bar.png');
|
||||
INSERT INTO `icons` VALUES (2, 'Hiking', 'http://maps.google.com/mapfiles/ms/micons/hiker.png');
|
||||
INSERT INTO `icons` VALUES (3, 'Lodging', 'http://maps.google.com/mapfiles/ms/micons/lodging.png');
|
||||
INSERT INTO `icons` VALUES (4, 'Restaurant', 'http://maps.google.com/mapfiles/ms/micons/restaurant.png');
|
||||
INSERT INTO `icons` VALUES (5, 'POI', 'http://maps.google.com/mapfiles/ms/micons/POI.png');
|
||||
INSERT INTO `icons` VALUES (6, 'Arts', 'http://maps.google.com/mapfiles/ms/micons/arts.png');
|
||||
INSERT INTO `icons` VALUES (7, 'Bar', 'http://maps.google.com/mapfiles/ms/micons/bar.png');
|
||||
INSERT INTO `icons` VALUES (8, 'Blue-dot', 'http://maps.google.com/mapfiles/ms/micons/blue-dot.png');
|
||||
INSERT INTO `icons` VALUES (9, 'Bus', 'http://maps.google.com/mapfiles/ms/micons/bus.png');
|
||||
INSERT INTO `icons` VALUES (10, 'Taxi', 'http://maps.google.com/mapfiles/ms/micons/cabs.png');
|
||||
INSERT INTO `icons` VALUES (11, 'Camera', 'http://maps.google.com/mapfiles/ms/micons/camera.png');
|
||||
INSERT INTO `icons` VALUES (12, 'Camping', 'http://maps.google.com/mapfiles/ms/micons/campground.png');
|
||||
INSERT INTO `icons` VALUES (13, 'Caution', 'http://maps.google.com/mapfiles/ms/micons/caution.png');
|
||||
INSERT INTO `icons` VALUES (14, 'Coffee House', 'http://maps.google.com/mapfiles/ms/micons/coffeehouse.png');
|
||||
INSERT INTO `icons` VALUES (15, 'Store', 'http://maps.google.com/mapfiles/ms/micons/convienancestore.png');
|
||||
INSERT INTO `icons` VALUES (16, 'Cycling', 'http://maps.google.com/mapfiles/ms/micons/cycling.png');
|
||||
INSERT INTO `icons` VALUES (17, 'Dollar', 'http://maps.google.com/mapfiles/ms/micons/dollar.png');
|
||||
INSERT INTO `icons` VALUES (18, 'Drinking water', 'http://maps.google.com/mapfiles/ms/micons/drinking_water.png');
|
||||
INSERT INTO `icons` VALUES (19, 'Electronics', 'http://maps.google.com/mapfiles/ms/micons/electronics.png');
|
||||
INSERT INTO `icons` VALUES (20, 'Falling Rocks', 'http://maps.google.com/mapfiles/ms/micons/fallingrocks.png');
|
||||
INSERT INTO `icons` VALUES (21, 'Ferry', 'http://maps.google.com/mapfiles/ms/micons/ferry.png');
|
||||
INSERT INTO `icons` VALUES (22, 'Fire Dept.', 'http://maps.google.com/mapfiles/ms/micons/firedept.png');
|
||||
INSERT INTO `icons` VALUES (23, 'Fishing', 'http://maps.google.com/mapfiles/ms/micons/fishing.png');
|
||||
INSERT INTO `icons` VALUES (24, 'Flag', 'http://maps.google.com/mapfiles/ms/micons/flag.png');
|
||||
INSERT INTO `icons` VALUES (25, 'Gas', 'http://maps.google.com/mapfiles/ms/micons/gas.png');
|
||||
INSERT INTO `icons` VALUES (26, 'Grocery Store', 'http://maps.google.com/mapfiles/ms/micons/grocerystore.png');
|
||||
INSERT INTO `icons` VALUES (27, 'Helicopter', 'http://maps.google.com/mapfiles/ms/micons/helicopter.png');
|
||||
INSERT INTO `icons` VALUES (28, 'Horseback riding', 'http://maps.google.com/mapfiles/ms/micons/horsebackriding.png');
|
||||
INSERT INTO `icons` VALUES (29, 'Hospital', 'http://maps.google.com/mapfiles/ms/micons/hospitals.png');
|
||||
INSERT INTO `icons` VALUES (30, 'Hot springs', 'http://maps.google.com/mapfiles/ms/micons/hotsprings.png');
|
||||
INSERT INTO `icons` VALUES (31, 'Info', 'http://maps.google.com/mapfiles/ms/micons/info.png');
|
||||
INSERT INTO `icons` VALUES (32, 'Info 2', 'http://maps.google.com/mapfiles/ms/micons/info_circle.png');
|
||||
INSERT INTO `icons` VALUES (33, 'Man', 'http://maps.google.com/mapfiles/ms/micons/man.png');
|
||||
INSERT INTO `icons` VALUES (34, 'Marina', 'http://maps.google.com/mapfiles/ms/micons/marina.png');
|
||||
INSERT INTO `icons` VALUES (35, 'Mechanic', 'http://maps.google.com/mapfiles/ms/micons/mechanic.png');
|
||||
INSERT INTO `icons` VALUES (36, 'Motorcycling', 'http://maps.google.com/mapfiles/ms/micons/motorcycling.png');
|
||||
INSERT INTO `icons` VALUES (37, 'Parking', 'http://maps.google.com/mapfiles/ms/micons/parkinglot.png');
|
||||
INSERT INTO `icons` VALUES (38, 'Partly Cloudy', 'http://maps.google.com/mapfiles/ms/micons/partly_cloudy.png');
|
||||
INSERT INTO `icons` VALUES (39, 'Phone', 'http://maps.google.com/mapfiles/ms/micons/phone.png');
|
||||
INSERT INTO `icons` VALUES (40, 'Picnic', 'http://maps.google.com/mapfiles/ms/micons/picnic.png');
|
||||
INSERT INTO `icons` VALUES (41, 'Plane', 'http://maps.google.com/mapfiles/ms/micons/plane.png');
|
||||
INSERT INTO `icons` VALUES (42, 'Police', 'http://maps.google.com/mapfiles/ms/micons/police.png');
|
||||
INSERT INTO `icons` VALUES (43, 'Post Office', 'http://maps.google.com/mapfiles/ms/micons/postoffice-us.png');
|
||||
INSERT INTO `icons` VALUES (44, 'Question mark', 'http://maps.google.com/mapfiles/ms/micons/question.png');
|
||||
INSERT INTO `icons` VALUES (45, 'Rail', 'http://maps.google.com/mapfiles/ms/micons/rail.png');
|
||||
INSERT INTO `icons` VALUES (46, 'Rainy', 'http://maps.google.com/mapfiles/ms/micons/rainy.png');
|
||||
INSERT INTO `icons` VALUES (47, 'Ranger Station', 'http://maps.google.com/mapfiles/ms/micons/rangerstation.png');
|
||||
INSERT INTO `icons` VALUES (48, 'Recycle', 'http://maps.google.com/mapfiles/ms/micons/recycle.png');
|
||||
INSERT INTO `icons` VALUES (49, 'Snow', 'http://maps.google.com/mapfiles/ms/micons/snowflake_simple.png');
|
||||
INSERT INTO `icons` VALUES (50, 'Sport', 'http://maps.google.com/mapfiles/ms/micons/sportvenue.png');
|
||||
INSERT INTO `icons` VALUES (51, 'Subway', 'http://maps.google.com/mapfiles/ms/micons/subway.png');
|
||||
INSERT INTO `icons` VALUES (52, 'Sunny', 'http://maps.google.com/mapfiles/ms/micons/sunny.png');
|
||||
INSERT INTO `icons` VALUES (53, 'Swimming', 'http://maps.google.com/mapfiles/ms/micons/swimming.png');
|
||||
INSERT INTO `icons` VALUES (54, 'Toilets', 'http://maps.google.com/mapfiles/ms/micons/toilets.png');
|
||||
INSERT INTO `icons` VALUES (55, 'Trail', 'http://maps.google.com/mapfiles/ms/micons/trail.png');
|
||||
INSERT INTO `icons` VALUES (56, 'Tree', 'http://maps.google.com/mapfiles/ms/micons/tree.png');
|
||||
INSERT INTO `icons` VALUES (57, 'Truck', 'http://maps.google.com/mapfiles/ms/micons/truck.png');
|
||||
INSERT INTO `icons` VALUES (58, 'Volcano', 'http://maps.google.com/mapfiles/ms/micons/volcano.png');
|
||||
INSERT INTO `icons` VALUES (59, 'Water', 'http://maps.google.com/mapfiles/ms/micons/water.png');
|
||||
INSERT INTO `icons` VALUES (60, 'Waterfalls', 'http://maps.google.com/mapfiles/ms/micons/waterfalls.png');
|
||||
INSERT INTO `icons` VALUES (61, 'Wheel Chair', 'http://maps.google.com/mapfiles/ms/micons/wheel_chair_accessible.png');
|
||||
INSERT INTO `icons` VALUES (62, 'Woman', 'http://maps.google.com/mapfiles/ms/micons/woman.png');
|
||||
INSERT INTO `icons` VALUES (63, 'Monster gate', 'http://img.gamespot.com/gamespot/shared/user/emblem_e3monster_s.jpg');
|
Loading…
x
Reference in New Issue
Block a user