1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-23 19:25:54 +01:00

Created web pages

This commit is contained in:
Martin Tůma 2017-06-22 01:07:39 +02:00
commit 25753e76b6
38 changed files with 1635 additions and 0 deletions

61
css/gallery.css Normal file
View File

@ -0,0 +1,61 @@
ul.rig {
list-style: none;
font-size: 0px;
margin-left: -2.5%; /* should match li left margin */
}
ul.rig li {
display: inline-block;
padding: 10px;
margin: 0 0 2.5% 2.5%;
background: #fff;
border: 1px solid #ddd;
font-size: 16px;
font-size: 1rem;
vertical-align: top;
box-shadow: 0 0 5px #ddd;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
ul.rig li img {
max-width: 100%;
height: auto;
margin: 0 0 10px;
}
ul.rig li h3 {
margin: 0 0 5px;
}
ul.rig li p {
font-size: .9em;
line-height: 1.5em;
color: #999;
}
/* class for 2 columns */
ul.rig.columns-2 li {
width: 47.5%; /* this value + 2.5 should = 50% */
}
/* class for 3 columns */
ul.rig.columns-3 li {
width: 30.83%; /* this value + 2.5 should = 33% */
}
/* class for 4 columns */
ul.rig.columns-4 li {
width: 22.5%; /* this value + 2.5 should = 25% */
}
@media (max-width: 480px) {
ul.grid-nav li {
display: block;
margin: 0 0 5px;
}
ul.grid-nav li a {
display: block;
}
ul.rig {
margin-left: 0;
}
ul.rig li {
width: 100% !important; /* over-ride all li styles */
margin: 0 0 20px;
}
}

8
css/ie6.css Normal file
View File

@ -0,0 +1,8 @@
#prev {
background-image:none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='css/images/prev.png', sizingMethod='image');
}
#next {
background-image:none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='css/images/next.png', sizingMethod='image');
}

BIN
css/images/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

BIN
css/images/formats.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
css/images/gpxsee.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
css/images/maps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
css/images/next.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
css/images/prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
css/images/preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
css/images/shell-b.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
css/images/shell-t.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

283
css/style.css Normal file
View File

@ -0,0 +1,283 @@
* {
margin:0;
padding:0;
outline:0;
}
body {
font-size:14px;
line-height:18px;
font-family:Arial, sans-serif;
color:#3d3d3d;
background:#333;
}
a {
color:#0252aa;
text-decoration:none;
cursor:pointer;
}
a:hover {
color:#000;
}
a img {
border:0;
}
input, textarea, select {
font-family:Arial, Helvetica, sans-serif;
font-size:14px;
border:0;
}
textarea {
overflow:hidden;
}
.cl {
display:block;
height:0;
font-size:0;
line-height:0;
text-indent:-4000px;
clear:both;
}
.notext {
font-size:0;
line-height:0;
text-indent:-4000px;
}
.left, .alignleft {
float:left;
display:inline;
}
.right, .alignright {
float:right;
display:inline;
}
.last {
margin-right:0 !important;
}
.shell {
width:980px;
background:#fff url(images/shell-t.gif) no-repeat 0 top;
margin:16px auto 0;
}
.shell-b {
background:url(images/shell-b.gif) no-repeat 0 bottom;
}
img.logo {
float:left;
margin: 17px 5px 10px 10px;
}
h1.logo {
float:left;
display:inline;
margin:39px 0 0 0;
}
h1.logo a {
font-size:38px;
font-weight:normal;
color:#000;
}
h1.logo a span {
color:#ed1c24;
}
#navigation {
float:left;
display:inline;
margin:42px 0 0 90px;
}
#navigation ul {
list-style-type:none;
}
#navigation ul li {
float:left;
display:inline;
margin-right:60px;
}
#navigation ul li a {
font-size:15px;
text-transform:uppercase;
color:#000;
}
#navigation ul li a:hover, #navigation ul li a.active {
font-weight:bold;
color:#ed1c24;
text-decoration:none;
}
#slider {
position:relative;
width:980px;
height:350px;
background-color:#000;
margin-top:10px;
}
.slider-content {
position:relative;
width:825px;
height:350px;
margin:0 0 0 81px;
overflow:hidden;
}
.slider-content ul {
list-style-type:none;
position:relative;
overflow:hidden;
}
.slider-content ul li, .jcarousel-clip {
position:relative;
width:825px;
height:400px;
}
.slider-content ul li .left-side {
float:left;
display:inline;
width:250px;
padding-top:25px;
}
.slider-content ul li .right-side {
float:left;
display:inline;
width:500px;
padding-top:67px;
margin-left:53px;
}
.slider-content ul li .right-side p {
line-height:19px;
color:#808080;
}
.slider-content ul li .buttons {
margin-top:35px;
}
.slider-content ul li .buttons a {
color:#FFFFFF;
padding:8px 12px;
font-size:15px;
line-height:25px;
border-radius:0.25em;
cursor:pointer;
margin-right: 5px;
}
.slider-content ul li .buttons .download-btn {
background-color: #279f43;
border: 1px solid #279f43;
}
.slider-content ul li .buttons .github-btn {
background-color: #3665af;
border: 1px solid #3665af;
}
#prev, #next {
position:absolute;
top:146px;
width:18px;
height:27px;
display:block;
background:url(images/prev.png) no-repeat 0 0;
font-size:0;
line-height:0;
text-indent:-4000px;
}
#prev {
left:33px;
}
#next {
right:33px;
background:url(images/next.png) no-repeat 0 0;
}
#main {
padding:29px 20px 18px 32px;
height:100%;
}
#content {
float:left;
display:inline;
width:660px;
margin-bottom:38px;
}
#sidebar {
float:right;
display:inline;
width:243px;
}
#content h2 {
font-size:22px;
line-height:22px;
color:#ed1c24;
margin:15px 0 15px 0;
}
#content h3 {
margin-bottom:8px;
margin-top:8px;
}
#content ul {
margin-left:30px;
}
#content p {
margin: .5em 0 .5em 0
}
#content pre {
font-size: 10pt;
text-align: left;
background-color: #F0F0F0;
border: 1px solid #ADADAD;
padding: .5em;
}
.latest-news {
}
.latest-news h3 {
font-size:18px;
color:#000;
font-weight:normal;
margin-bottom:21px;
}
.latest-news .news-item {
margin-bottom:20px;
}
.latest-news .news-item .date {
font-size:10px;
line-height:12px;
color:#fd3801;
margin-bottom:2px;
}
.latest-news .news-item h4 {
font-size:12px;
}
.latest-news ul {
margin-left:20px;
font-size:12px;
}
.footer {
font-size:10px;
padding-top:15px;
}
.footer .shell {
background:none;
margin:0 auto;
padding:0 30px;
}
.footer, .footer a {
color:#858585;
text-decoration:none;
}
.footer p {
margin:0;
padding:0;
line-height:normal;
}
.footer .lf {
float:left;
}
.footer .rf {
float:right;
}
.gallery-top {
height:10px;
}
.gallery-bottom {
height:50px;
}
.gallery-main {
background-color:#000000;
padding:20px 0;
}
#gallery {
margin: 0 50px 0 50px;
}

125
gallery.html Normal file
View File

@ -0,0 +1,125 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GPXSee</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
<link rel="icon" type="image/png" href="css/images/favicon.png"/>
<link rel="stylesheet" href="css/style.css" type="text/css" media="all"/>
<link rel="stylesheet" href="css/gallery.css" type="text/css"/>
<!--[if IE 6]><link rel="stylesheet" href="css/ie6.css" type="text/css" media="all" /><![endif]-->
</head>
<body>
<!-- START PAGE SOURCE -->
<div class="shell">
<div class="shell-b">
<div id="header">
<img src="css/images/gpxsee.png" alt="" class="logo"/><h1 class="logo"><a href="#">GPXSee</a></h1>
<div id="navigation">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="gallery.html" class="active">Screenshots</a></li>
<li><a href="index.html#maps">Maps</a></li>
<li><a href="index.html#download">Download</a></li>
</ul>
</div>
<div class="cl">&nbsp;</div>
</div>
<div class="gallery-top">
</div>
<div class="gallery-main">
<div id="gallery">
<ul class="rig columns-4">
<li>
<a href="gallery/win7-2.png">
<img src="gallery/win7-2_prev.png" width="200" height="271" alt="" />
</a>
<h3>Windows 7</h3>
<p>GPXSee on Windows 7</p>
</li><li>
<a href="gallery/zimni.png">
<img src="gallery/zimni_prev.png" width="200" height="276" alt=""/>
</a>
<h3>Windows 10</h3>
<p>GPXSee on Windows 10</p>
</li><li>
<a href="gallery/mac.png">
<img src="gallery/mac_prev.png" width="200" height="280" alt=""/>
</a>
<h3>Mac OS&nbsp;X</h3>
<p>GPXSee on OS&nbsp;X</p>
</li><li>
<a href="gallery/lin1.png">
<img src="gallery/lin1_prev.png" width="200" height="275" alt=""/>
</a>
<h3>Linux</h3>
<p>GPXSee on Linux</p>
</li><li>
<a href="gallery/multi.png">
<img src="gallery/multi_prev.png" width="200" height="258" alt=""/>
</a>
<h3>Multiple tracks</h3>
<p>GPXSee with multiple tracks loaded</p>
</li><li>
<a href="gallery/multi2.png">
<img src="gallery/multi2_prev.png" width="200" height="258" alt=""/>
</a>
<h3>Multiple tracks</h3>
<p>GPXSee with multiple tracks loaded</p>
</li><li>
<a href="gallery/poi.png">
<img src="gallery/poi_prev.png" width="200" height="258" alt=""/>
</a>
<h3>POI</h3>
<p>GPXSee showing a POI file on Windows 10</p>
</li><li>
<a href="gallery/lin2.png">
<img src="gallery/lin2_prev.png" width="200" height="276" alt=""/>
</a>
<h3>POI</h3>
<p>GPXSee showing a POI file on Linux</p>
</li><li>
<a href="gallery/settings_mac.png">
<img src="gallery/settings_mac_prev.png" width="200" height="154" alt=""/>
</a>
<h3>Appearance settings</h3>
<p>Appearance settings on OS&nbsp;X</p>
</li><li>
<a href="gallery/settings_win.png">
<img src="gallery/settings_win_prev.png" width="200" height="148" alt=""/>
</a>
<h3>Data settings</h3>
<p>Data settings on Windows 7</p>
</li><li>
<a href="gallery/pdf_export.png">
<img src="gallery/pdf_export_prev.png" width="200" height="264" alt=""/>
</a>
<h3>PDF export</h3>
<p>PDF export dialogue on Linux</p>
</li>
</ul>
</div>
</div>
<div class="gallery-bottom">
</div>
</div>
</div>
<div class="footer">
<div class="shell">
<p class="lf">Copyright &copy; 2017 <a href="#">Martin Tůma</a> - All Rights Reserved</p>
<p class="rf">Design by <a href="http://www.websitecsstemplates.com/" target="_blank">WebsiteCSSTemplates</a></p>
<div style="clear:both;"></div>
</div>
</div>
<!-- END PAGE SOURCE -->
</body>
</html>

BIN
gallery/lin1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 KiB

BIN
gallery/lin1_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
gallery/lin2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 KiB

BIN
gallery/lin2_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

BIN
gallery/mac.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

BIN
gallery/mac_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
gallery/multi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

BIN
gallery/multi2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

BIN
gallery/multi2_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
gallery/multi_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
gallery/pdf_export.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
gallery/pdf_export_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
gallery/poi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 KiB

BIN
gallery/poi_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
gallery/settings_mac.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
gallery/settings_win.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
gallery/win7-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

BIN
gallery/win7-2_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
gallery/zimni.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

BIN
gallery/zimni_prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

217
index.html Normal file
View File

@ -0,0 +1,217 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GPXSee</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/png" href="css/images/favicon.png"/>
<link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.jcarousel.js" ></script>
<script type="text/javascript" src="js/js-func.js"></script>
<!--[if IE 6]><link rel="stylesheet" href="css/ie6.css" type="text/css" media="all" /><![endif]-->
</head>
<body>
<!-- START PAGE SOURCE -->
<div class="shell">
<div class="shell-b">
<div id="header">
<img src="css/images/gpxsee.png" alt="" class="logo"/><h1 class="logo"><a href="#">GPXSee</a></h1>
<div id="navigation">
<ul>
<li><a href="index.html" class="active">Home</a></li>
<li><a href="gallery.html">Screenshots</a></li>
<li><a href="index.html#maps">Maps</a></li>
<li><a href="index.html#download">Download</a></li>
</ul>
</div>
<div class="cl">&nbsp;</div>
</div>
<div id="slider"> <a href="#" id="prev">prev</a>
<div class="slider-content">
<ul>
<li>
<div class="left-side"> <img src="css/images/preview.png" alt="" /> </div>
<div class="right-side">
<p>GPXSee has a clean and effective GUI layout that does not waste your screen space
with unnecessary elements.</p>
<div class="buttons">
<a href="https://sourceforge.net/projects/gpxsee/files/latest/download" class="download-btn">Download GPXSee</a>
<a href="https://github.com/tumic0/GPXSee" class="github-btn">View on GitHub</a>
</div>
</div>
<div class="cl">&nbsp;</div>
</li>
<li>
<div class="left-side"> <img src="css/images/formats.png" alt="" /> </div>
<div class="right-side">
<p>GPXSee supports all main GPS log file formats, namely GPX, TCX, KML, FIT, IGC and NMEA.</p>
<div class="buttons">
<a href="https://sourceforge.net/projects/gpxsee/files/latest/download" class="download-btn">Download GPXSee</a>
<a href="https://github.com/tumic0/GPXSee" class="github-btn">View on GitHub</a>
</div>
</div>
<div class="cl">&nbsp;</div>
</li>
<li>
<div class="left-side"> <img src="css/images/maps.png" alt="" /> </div>
<div class="right-side">
<p>GPXSee supports a large variety of online maps as well as various offline map formats.</p>
<div class="buttons">
<a href="https://sourceforge.net/projects/gpxsee/files/latest/download" class="download-btn">Download GPXSee</a>
<a href="https://github.com/tumic0/GPXSee" class="github-btn">View on GitHub</a>
</div>
</div>
<div class="cl">&nbsp;</div>
</li>
</ul>
</div>
<a href="#" id="next">next</a> </div>
<div id="main">
<div id="content">
<h2>What is GPXSee?</h2>
<p>GPXSee is a desktop GPS log file viewer and analyzer that supports
GPX, TCX, KML, FIT, IGC and NMEA files.</p>
<h3>Key features</h3>
<ul>
<li>User-definable online maps.</li>
<li>Offline maps (OziExplorer maps and TrekBuddy maps/atlases).</li>
<li>Elevation, speed, heart rate, cadence, power and temperature graphs.</li>
<li>Support for multiple tracks in one view.</li>
<li>Support for POI files.</li>
<li>Print/export to PDF.</li>
<li>Full-screen mode.</li>
<li>Native GUI (Qt) for <b>Windows</b>, <b>Mac OS X</b> and <b>Linux</b>.</li>
<li>Opens GPX, TCX, FIT, KML, IGC, NMEA and Garmin CSV files.</li>
<li>Open-source software (GPLv3).</li>
</ul>
<a name="maps"></a>
<h2>Maps</h2>
<h3>Online maps</h3>
<p>GPXSee supports most <a href="https://en.wikipedia.org/wiki/Web_Mercator">Web Mercator</a>
based online maps out there, but the list of maps distributed with the official
packages is limited to those that are "freely distributable". You may however
easily override the default map list with your own list either by editing the
global map list file:</p>
<pre>
C:\Program Files\GPXSee\maps.txt # Windows
/usr/share/gpxsee/maps.txt # Linux
/Applications/GPXSee.app/Contents/Resources/maps.txt # OS X
</pre>
<p>or by overriding it with a user map list file:</p>
<pre>
%HOMEPATH%\GPXSee\maps.txt # Windows
$HOME/.gpxsee/maps.txt # OS X &amp; Linux
</pre>
<p>The file format is one map entry per line, consisting of the map name and
tiles URL delimited by a TAB character. The tile X and Y coordinates are
replaced with <code>$x</code> and <code>$y</code> in the URL and the zoom
level is replaced with <code>$z</code>. An example map file could look like:</p>
<pre>
Map1 http://tile.server.com/map/$z/$x/$y.png
Map2 http://mapserver.org/map/$z-$x-$y
</pre>
<h3>Offline maps</h3>
<p>OziExplorer maps and TrekBuddy maps/atlases are supported by GPXSee. You may
easily create offline atlases from online map services by using
<a href="http://mobac.sourceforge.net/">Mobile Atlas Creator (MOBAC)</a>.</p>
<p>Offline maps are loaded on program startup from the <code>maps</code>
directory in the same locations as the <code>maps.txt</code> file. The expected
structure is one map/atlas in a separate subdirectory. Supported map formats are
OziExplorer maps and TrekBuddy maps/atlases (tared and non-tared).
Supported map projections are Web Mercator, Transverse Mercator, UTM,
Lambert Conformal Conic, Albers Equal Area and Latitude/Longitude. For list of
supported datums see the <code>datums.csv</code> and <code>ellipsoids.csv</code>
configuration files (can be modified or overriden by user files like the map
list/map dir).</p>
<h2>POI files</h2>
<p>All of the supported formats with waypoints capability - GPX, KML, TCX, NMEA
and <a href="http://www.poi-factory.com/garmin-csv-file-format">Garmin CSV</a>
- can be loaded either as data files or as POI files. When a file is opened as
a POI file, only waypoints reasonable near the tracks/waypoints of the loaded
data files are displayed.</p>
<p>To make GPXSee load a POI file automatically on startup, add the file to the
<code>POI</code> directory in one of the configuration paths.</p>
<h2>Download</h2>
<a name="download"></a>
<ul>
<li><a href="https://sourceforge.net/projects/gpxsee/files/Source/">Sources</a></li>
<li><a href="https://sourceforge.net/projects/gpxsee/files/Windows/">Windows installer</a></li>
<li><a href="https://sourceforge.net/projects/gpxsee/files/Mac%20OS%20X/">Mac OS X bundle</a></li>
<li><a href="https://software.opensuse.org/download.html?project=home%3Atumic%3AGPXSee&amp;package=gpxsee">
Linux repos/packages</a></li>
</ul>
</div>
<div id="sidebar">
<div class="latest-news">
<h3>Releases</h3>
<div class="news-item">
<p class="date">May 25 2017</p>
<h4>Version 4.8</h4>
<ul>
<li>Added data filtering settings.</li>
<li>Fixed broken units handling in track info tooltips.</li>
</ul>
</div>
<div class="news-item">
<p class="date">May 9 2017</p>
<h4>Version 4.7</h4>
<ul>
<li>Fixed broken offline maps on southern hemisphere.</li>
<li>Fixed broken UTM zone setup on some offline maps.</li>
<li>Added support for OZF3 files.</li>
<li>Added support for Albers Equal-Area projection.</li>
<li>Added support for offline maps with projections defined as
British, Irish and Swedish grid and NZTM2000.</li>
</ul>
</div>
<div class="news-item">
<p class="date">May 1 2017</p>
<h4>Version 4.6</h4>
<ul>
<li>Fixed broken PDF export/printing (broken map scale/waypoints size).</li>
<li>Improved path projection performance when an atlas is used.</li>
</ul>
</div>
<div class="news-item">
<p class="date">April 23 2017</p>
<h4>Version 4.5</h4>
<ul>
<li>Added support for "runtime" loading of offline maps.</li>
<li>Fixed atlas zoom fitting.</li>
<li>Fixed various minor offline map loading issues.</li>
</ul>
</div>
</div>
<a href="https://build.opensuse.org/package/view_file/home:tumic:GPXSee/gpxsee/gpxsee.changes">Full changelog</a>
</div>
<div class="cl">&nbsp;</div>
</div>
</div>
</div>
<div class="footer">
<div class="shell">
<p class="lf">Copyright &copy; 2017 <a href="#">Martin Tůma</a> - All Rights Reserved</p>
<p class="rf">Design by <a href="http://www.websitecsstemplates.com/" target="_blank">WebsiteCSSTemplates</a></p>
<div style="clear:both;"></div>
</div>
</div>
<!-- END PAGE SOURCE -->
</body>
</html>

902
js/jquery.jcarousel.js Normal file
View File

@ -0,0 +1,902 @@
/*!
* jCarousel - Riding carousels with jQuery
* http://sorgalla.com/jcarousel/
*
* Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* Built on top of the jQuery library
* http://jquery.com
*
* Inspired by the "Carousel Component" by Bill Scott
* http://billwscott.com/carousel/
*/
(function($) {
/**
* Creates a carousel for all matched elements.
*
* @example $("#mycarousel").jcarousel();
* @before <ul id="mycarousel" class="jcarousel-skin-name"><li>First item</li><li>Second item</li></ul>
* @result
*
* <div class="jcarousel-skin-name">
* <div class="jcarousel-container">
* <div class="jcarousel-clip">
* <ul class="jcarousel-list">
* <li class="jcarousel-item-1">First item</li>
* <li class="jcarousel-item-2">Second item</li>
* </ul>
* </div>
* <div disabled="disabled" class="jcarousel-prev jcarousel-prev-disabled"></div>
* <div class="jcarousel-next"></div>
* </div>
* </div>
*
* @method jcarousel
* @return jQuery
* @param o {Hash|String} A set of key/value pairs to set as configuration properties or a method name to call on a formerly created instance.
*/
$.fn.jcarousel = function(o) {
if (typeof o == 'string') {
var instance = $(this).data('jcarousel'), args = Array.prototype.slice.call(arguments, 1);
return instance[o].apply(instance, args);
} else
return this.each(function() {
$(this).data('jcarousel', new $jc(this, o));
});
};
// Default configuration properties.
var defaults = {
vertical: false,
rtl: false,
start: 1,
offset: 1,
size: null,
scroll: 3,
visible: null,
animation: 'normal',
easing: 'swing',
auto: 0,
wrap: null,
initCallback: null,
reloadCallback: null,
itemLoadCallback: null,
itemFirstInCallback: null,
itemFirstOutCallback: null,
itemLastInCallback: null,
itemLastOutCallback: null,
itemVisibleInCallback: null,
itemVisibleOutCallback: null,
buttonNextHTML: '<div></div>',
buttonPrevHTML: '<div></div>',
buttonNextEvent: 'click',
buttonPrevEvent: 'click',
buttonNextCallback: null,
buttonPrevCallback: null,
itemFallbackDimension: null
}, windowLoaded = false;
$(window).bind('load.jcarousel', function() { windowLoaded = true; })
/**
* The jCarousel object.
*
* @constructor
* @class jcarousel
* @param e {HTMLElement} The element to create the carousel for.
* @param o {Object} A set of key/value pairs to set as configuration properties.
* @cat Plugins/jCarousel
*/
$.jcarousel = function(e, o) {
this.options = $.extend({}, defaults, o || {});
this.locked = false;
this.container = null;
this.clip = null;
this.list = null;
this.buttonNext = null;
this.buttonPrev = null;
// Only set if not explicitly passed as option
if (!o || o.rtl === undefined)
this.options.rtl = ($(e).attr('dir') || $('html').attr('dir') || '').toLowerCase() == 'rtl';
this.wh = !this.options.vertical ? 'width' : 'height';
this.lt = !this.options.vertical ? (this.options.rtl ? 'right' : 'left') : 'top';
// Extract skin class
var skin = '', split = e.className.split(' ');
for (var i = 0; i < split.length; i++) {
if (split[i].indexOf('jcarousel-skin') != -1) {
$(e).removeClass(split[i]);
skin = split[i];
break;
}
}
if (e.nodeName.toUpperCase() == 'UL' || e.nodeName.toUpperCase() == 'OL') {
this.list = $(e);
this.container = this.list.parent();
if (this.container.hasClass('jcarousel-clip')) {
if (!this.container.parent().hasClass('jcarousel-container'))
this.container = this.container.wrap('<div></div>');
this.container = this.container.parent();
} else if (!this.container.hasClass('jcarousel-container'))
this.container = this.list.wrap('<div></div>').parent();
} else {
this.container = $(e);
this.list = this.container.find('ul,ol').eq(0);
}
if (skin != '' && this.container.parent()[0].className.indexOf('jcarousel-skin') == -1)
this.container.wrap('<div class=" '+ skin + '"></div>');
this.clip = this.list.parent();
if (!this.clip.length || !this.clip.hasClass('jcarousel-clip'))
this.clip = this.list.wrap('<div></div>').parent();
this.buttonNext = $('.jcarousel-next', this.container);
if (this.buttonNext.size() == 0 && this.options.buttonNextHTML != null)
this.buttonNext = this.clip.after(this.options.buttonNextHTML).next();
this.buttonNext.addClass(this.className('jcarousel-next'));
this.buttonPrev = $('.jcarousel-prev', this.container);
if (this.buttonPrev.size() == 0 && this.options.buttonPrevHTML != null)
this.buttonPrev = this.clip.after(this.options.buttonPrevHTML).next();
this.buttonPrev.addClass(this.className('jcarousel-prev'));
this.clip.addClass(this.className('jcarousel-clip')).css({
overflow: 'hidden',
position: 'relative'
});
this.list.addClass(this.className('jcarousel-list')).css({
overflow: 'hidden',
position: 'relative',
top: 0,
margin: 0,
padding: 0
}).css((this.options.rtl ? 'right' : 'left'), 0);
this.container.addClass(this.className('jcarousel-container')).css({
position: 'relative'
});
if (!this.options.vertical && this.options.rtl)
this.container.addClass('jcarousel-direction-rtl').attr('dir', 'rtl');
var di = this.options.visible != null ? Math.ceil(this.clipping() / this.options.visible) : null;
var li = this.list.children('li');
var self = this;
if (li.size() > 0) {
var wh = 0, i = this.options.offset;
li.each(function() {
self.format(this, i++);
wh += self.dimension(this, di);
});
this.list.css(this.wh, (wh + 100) + 'px');
// Only set if not explicitly passed as option
if (!o || o.size === undefined)
this.options.size = li.size();
}
// For whatever reason, .show() does not work in Safari...
this.container.css('display', 'block');
this.buttonNext.css('display', 'block');
this.buttonPrev.css('display', 'block');
this.funcNext = function() { self.next(); };
this.funcPrev = function() { self.prev(); };
this.funcResize = function() { self.reload(); };
if (this.options.initCallback != null)
this.options.initCallback(this, 'init');
this.setup();
};
// Create shortcut for internal use
var $jc = $.jcarousel;
$jc.fn = $jc.prototype = {
jcarousel: '0.2.5'
};
$jc.fn.extend = $jc.extend = $.extend;
$jc.fn.extend({
/**
* Setups the carousel.
*
* @method setup
* @return undefined
*/
setup: function() {
this.first = null;
this.last = null;
this.prevFirst = null;
this.prevLast = null;
this.animating = false;
this.timer = null;
this.tail = null;
this.inTail = false;
if (this.locked)
return;
this.list.css(this.lt, this.pos(this.options.offset) + 'px');
var p = this.pos(this.options.start);
this.prevFirst = this.prevLast = null;
this.animate(p, false);
$(window).unbind('resize.jcarousel', this.funcResize).bind('resize.jcarousel', this.funcResize);
},
/**
* Clears the list and resets the carousel.
*
* @method reset
* @return undefined
*/
reset: function() {
this.list.empty();
this.list.css(this.lt, '0px');
this.list.css(this.wh, '10px');
if (this.options.initCallback != null)
this.options.initCallback(this, 'reset');
this.setup();
},
/**
* Reloads the carousel and adjusts positions.
*
* @method reload
* @return undefined
*/
reload: function() {
if (this.tail != null && this.inTail)
this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + this.tail);
this.tail = null;
this.inTail = false;
if (this.options.reloadCallback != null)
this.options.reloadCallback(this);
if (this.options.visible != null) {
var self = this;
var di = Math.ceil(this.clipping() / this.options.visible), wh = 0, lt = 0;
this.list.children('li').each(function(i) {
wh += self.dimension(this, di);
if (i + 1 < self.first)
lt = wh;
});
this.list.css(this.wh, wh + 'px');
this.list.css(this.lt, -lt + 'px');
}
this.scroll(this.first, false);
},
/**
* Locks the carousel.
*
* @method lock
* @return undefined
*/
lock: function() {
this.locked = true;
this.buttons();
},
/**
* Unlocks the carousel.
*
* @method unlock
* @return undefined
*/
unlock: function() {
this.locked = false;
this.buttons();
},
/**
* Sets the size of the carousel.
*
* @method size
* @return undefined
* @param s {Number} The size of the carousel.
*/
size: function(s) {
if (s != undefined) {
this.options.size = s;
if (!this.locked)
this.buttons();
}
return this.options.size;
},
/**
* Checks whether a list element exists for the given index (or index range).
*
* @method get
* @return bool
* @param i {Number} The index of the (first) element.
* @param i2 {Number} The index of the last element.
*/
has: function(i, i2) {
if (i2 == undefined || !i2)
i2 = i;
if (this.options.size !== null && i2 > this.options.size)
i2 = this.options.size;
for (var j = i; j <= i2; j++) {
var e = this.get(j);
if (!e.length || e.hasClass('jcarousel-item-placeholder'))
return false;
}
return true;
},
/**
* Returns a jQuery object with list element for the given index.
*
* @method get
* @return jQuery
* @param i {Number} The index of the element.
*/
get: function(i) {
return $('.jcarousel-item-' + i, this.list);
},
/**
* Adds an element for the given index to the list.
* If the element already exists, it updates the inner html.
* Returns the created element as jQuery object.
*
* @method add
* @return jQuery
* @param i {Number} The index of the element.
* @param s {String} The innerHTML of the element.
*/
add: function(i, s) {
var e = this.get(i), old = 0, n = $(s);
if (e.length == 0) {
var c, e = this.create(i), j = $jc.intval(i);
while (c = this.get(--j)) {
if (j <= 0 || c.length) {
j <= 0 ? this.list.prepend(e) : c.after(e);
break;
}
}
} else
old = this.dimension(e);
if (n.get(0).nodeName.toUpperCase() == 'LI') {
e.replaceWith(n);
e = n;
} else
e.empty().append(s);
this.format(e.removeClass(this.className('jcarousel-item-placeholder')), i);
var di = this.options.visible != null ? Math.ceil(this.clipping() / this.options.visible) : null;
var wh = this.dimension(e, di) - old;
if (i > 0 && i < this.first)
this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - wh + 'px');
this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) + wh + 'px');
return e;
},
/**
* Removes an element for the given index from the list.
*
* @method remove
* @return undefined
* @param i {Number} The index of the element.
*/
remove: function(i) {
var e = this.get(i);
// Check if item exists and is not currently visible
if (!e.length || (i >= this.first && i <= this.last))
return;
var d = this.dimension(e);
if (i < this.first)
this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + d + 'px');
e.remove();
this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) - d + 'px');
},
/**
* Moves the carousel forwards.
*
* @method next
* @return undefined
*/
next: function() {
this.stopAuto();
if (this.tail != null && !this.inTail)
this.scrollTail(false);
else
this.scroll(((this.options.wrap == 'both' || this.options.wrap == 'last') && this.options.size != null && this.last == this.options.size) ? 1 : this.first + this.options.scroll);
},
/**
* Moves the carousel backwards.
*
* @method prev
* @return undefined
*/
prev: function() {
this.stopAuto();
if (this.tail != null && this.inTail)
this.scrollTail(true);
else
this.scroll(((this.options.wrap == 'both' || this.options.wrap == 'first') && this.options.size != null && this.first == 1) ? this.options.size : this.first - this.options.scroll);
},
/**
* Scrolls the tail of the carousel.
*
* @method scrollTail
* @return undefined
* @param b {Boolean} Whether scroll the tail back or forward.
*/
scrollTail: function(b) {
if (this.locked || this.animating || !this.tail)
return;
var pos = $jc.intval(this.list.css(this.lt));
!b ? pos -= this.tail : pos += this.tail;
this.inTail = !b;
// Save for callbacks
this.prevFirst = this.first;
this.prevLast = this.last;
this.animate(pos);
},
/**
* Scrolls the carousel to a certain position.
*
* @method scroll
* @return undefined
* @param i {Number} The index of the element to scoll to.
* @param a {Boolean} Flag indicating whether to perform animation.
*/
scroll: function(i, a) {
if (this.locked || this.animating)
return;
this.animate(this.pos(i), a);
},
/**
* Prepares the carousel and return the position for a certian index.
*
* @method pos
* @return {Number}
* @param i {Number} The index of the element to scoll to.
*/
pos: function(i) {
var pos = $jc.intval(this.list.css(this.lt));
if (this.locked || this.animating)
return pos;
if (this.options.wrap != 'circular')
i = i < 1 ? 1 : (this.options.size && i > this.options.size ? this.options.size : i);
var back = this.first > i;
// Create placeholders, new list width/height
// and new list position
var f = this.options.wrap != 'circular' && this.first <= 1 ? 1 : this.first;
var c = back ? this.get(f) : this.get(this.last);
var j = back ? f : f - 1;
var e = null, l = 0, p = false, d = 0, g;
while (back ? --j >= i : ++j < i) {
e = this.get(j);
p = !e.length;
if (e.length == 0) {
e = this.create(j).addClass(this.className('jcarousel-item-placeholder'));
c[back ? 'before' : 'after' ](e);
if (this.first != null && this.options.wrap == 'circular' && this.options.size !== null && (j <= 0 || j > this.options.size)) {
g = this.get(this.index(j));
if (g.length)
e = this.add(j, g.clone(true));
}
}
c = e;
d = this.dimension(e);
if (p)
l += d;
if (this.first != null && (this.options.wrap == 'circular' || (j >= 1 && (this.options.size == null || j <= this.options.size))))
pos = back ? pos + d : pos - d;
}
// Calculate visible items
var clipping = this.clipping();
var cache = [];
var visible = 0, j = i, v = 0;
var c = this.get(i - 1);
while (++visible) {
e = this.get(j);
p = !e.length;
if (e.length == 0) {
e = this.create(j).addClass(this.className('jcarousel-item-placeholder'));
// This should only happen on a next scroll
c.length == 0 ? this.list.prepend(e) : c[back ? 'before' : 'after' ](e);
if (this.first != null && this.options.wrap == 'circular' && this.options.size !== null && (j <= 0 || j > this.options.size)) {
g = this.get(this.index(j));
if (g.length)
e = this.add(j, g.clone(true));
}
}
c = e;
var d = this.dimension(e);
if (d == 0) {
throw new Error('jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...');
}
if (this.options.wrap != 'circular' && this.options.size !== null && j > this.options.size)
cache.push(e);
else if (p)
l += d;
v += d;
if (v >= clipping)
break;
j++;
}
// Remove out-of-range placeholders
for (var x = 0; x < cache.length; x++)
cache[x].remove();
// Resize list
if (l > 0) {
this.list.css(this.wh, this.dimension(this.list) + l + 'px');
if (back) {
pos -= l;
this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - l + 'px');
}
}
// Calculate first and last item
var last = i + visible - 1;
if (this.options.wrap != 'circular' && this.options.size && last > this.options.size)
last = this.options.size;
if (j > last) {
visible = 0, j = last, v = 0;
while (++visible) {
var e = this.get(j--);
if (!e.length)
break;
v += this.dimension(e);
if (v >= clipping)
break;
}
}
var first = last - visible + 1;
if (this.options.wrap != 'circular' && first < 1)
first = 1;
if (this.inTail && back) {
pos += this.tail;
this.inTail = false;
}
this.tail = null;
if (this.options.wrap != 'circular' && last == this.options.size && (last - visible + 1) >= 1) {
var m = $jc.margin(this.get(last), !this.options.vertical ? 'marginRight' : 'marginBottom');
if ((v - m) > clipping)
this.tail = v - clipping - m;
}
// Adjust position
while (i-- > first)
pos += this.dimension(this.get(i));
// Save visible item range
this.prevFirst = this.first;
this.prevLast = this.last;
this.first = first;
this.last = last;
return pos;
},
/**
* Animates the carousel to a certain position.
*
* @method animate
* @return undefined
* @param p {Number} Position to scroll to.
* @param a {Boolean} Flag indicating whether to perform animation.
*/
animate: function(p, a) {
if (this.locked || this.animating)
return;
this.animating = true;
var self = this;
var scrolled = function() {
self.animating = false;
if (p == 0)
self.list.css(self.lt, 0);
if (self.options.wrap == 'circular' || self.options.wrap == 'both' || self.options.wrap == 'last' || self.options.size == null || self.last < self.options.size)
self.startAuto();
self.buttons();
self.notify('onAfterAnimation');
// This function removes items which are appended automatically for circulation.
// This prevents the list from growing infinitely.
if (self.options.wrap == 'circular' && self.options.size !== null)
for (var i = self.prevFirst; i <= self.prevLast; i++)
if (i !== null && !(i >= self.first && i <= self.last) && (i < 1 || i > self.options.size))
self.remove(i);
};
this.notify('onBeforeAnimation');
// Animate
if (!this.options.animation || a == false) {
this.list.css(this.lt, p + 'px');
scrolled();
} else {
var o = !this.options.vertical ? (this.options.rtl ? {'right': p} : {'left': p}) : {'top': p};
this.list.animate(o, this.options.animation, this.options.easing, scrolled);
}
},
/**
* Starts autoscrolling.
*
* @method auto
* @return undefined
* @param s {Number} Seconds to periodically autoscroll the content.
*/
startAuto: function(s) {
if (s != undefined)
this.options.auto = s;
if (this.options.auto == 0)
return this.stopAuto();
if (this.timer != null)
return;
var self = this;
this.timer = setTimeout(function() { self.next(); }, this.options.auto * 1000);
},
/**
* Stops autoscrolling.
*
* @method stopAuto
* @return undefined
*/
stopAuto: function() {
if (this.timer == null)
return;
clearTimeout(this.timer);
this.timer = null;
},
/**
* Sets the states of the prev/next buttons.
*
* @method buttons
* @return undefined
*/
buttons: function(n, p) {
if (n == undefined || n == null) {
var n = !this.locked && this.options.size !== 0 && ((this.options.wrap && this.options.wrap != 'first') || this.options.size == null || this.last < this.options.size);
if (!this.locked && (!this.options.wrap || this.options.wrap == 'first') && this.options.size != null && this.last >= this.options.size)
n = this.tail != null && !this.inTail;
}
if (p == undefined || p == null) {
var p = !this.locked && this.options.size !== 0 && ((this.options.wrap && this.options.wrap != 'last') || this.first > 1);
if (!this.locked && (!this.options.wrap || this.options.wrap == 'last') && this.options.size != null && this.first == 1)
p = this.tail != null && this.inTail;
}
var self = this;
this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent + '.jcarousel', this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);
this.buttonPrev[p ? 'bind' : 'unbind'](this.options.buttonPrevEvent + '.jcarousel', this.funcPrev)[p ? 'removeClass' : 'addClass'](this.className('jcarousel-prev-disabled')).attr('disabled', p ? false : true);
if (this.options.buttonNextCallback != null && this.buttonNext.data('jcarouselstate') != n) {
this.buttonNext.each(function() { self.options.buttonNextCallback(self, this, n); }).data('jcarouselstate', n);
}
if (this.options.buttonPrevCallback != null && (this.buttonPrev.data('jcarouselstate') != p)) {
this.buttonPrev.each(function() { self.options.buttonPrevCallback(self, this, p); }).data('jcarouselstate', p);
}
},
/**
* Notify callback of a specified event.
*
* @method notify
* @return undefined
* @param evt {String} The event name
*/
notify: function(evt) {
var state = this.prevFirst == null ? 'init' : (this.prevFirst < this.first ? 'next' : 'prev');
// Load items
this.callback('itemLoadCallback', evt, state);
if (this.prevFirst !== this.first) {
this.callback('itemFirstInCallback', evt, state, this.first);
this.callback('itemFirstOutCallback', evt, state, this.prevFirst);
}
if (this.prevLast !== this.last) {
this.callback('itemLastInCallback', evt, state, this.last);
this.callback('itemLastOutCallback', evt, state, this.prevLast);
}
this.callback('itemVisibleInCallback', evt, state, this.first, this.last, this.prevFirst, this.prevLast);
this.callback('itemVisibleOutCallback', evt, state, this.prevFirst, this.prevLast, this.first, this.last);
},
callback: function(cb, evt, state, i1, i2, i3, i4) {
if (this.options[cb] == undefined || (typeof this.options[cb] != 'object' && evt != 'onAfterAnimation'))
return;
var callback = typeof this.options[cb] == 'object' ? this.options[cb][evt] : this.options[cb];
if (!$.isFunction(callback))
return;
var self = this;
if (i1 === undefined)
callback(self, state, evt);
else if (i2 === undefined)
this.get(i1).each(function() { callback(self, this, i1, state, evt); });
else {
for (var i = i1; i <= i2; i++)
if (i !== null && !(i >= i3 && i <= i4))
this.get(i).each(function() { callback(self, this, i, state, evt); });
}
},
create: function(i) {
return this.format('<li></li>', i);
},
format: function(e, i) {
var e = $(e), split = e.get(0).className.split(' ');
for (var j = 0; j < split.length; j++) {
if (split[j].indexOf('jcarousel-') != -1) {
e.removeClass(split[j]);
}
}
e.addClass(this.className('jcarousel-item')).addClass(this.className('jcarousel-item-' + i)).css({
'float': (this.options.rtl ? 'right' : 'left'),
'list-style': 'none'
}).attr('jcarouselindex', i);
return e;
},
className: function(c) {
return c + ' ' + c + (!this.options.vertical ? '-horizontal' : '-vertical');
},
dimension: function(e, d) {
var el = e.jquery != undefined ? e[0] : e;
var old = !this.options.vertical ?
(el.offsetWidth || $jc.intval(this.options.itemFallbackDimension)) + $jc.margin(el, 'marginLeft') + $jc.margin(el, 'marginRight') :
(el.offsetHeight || $jc.intval(this.options.itemFallbackDimension)) + $jc.margin(el, 'marginTop') + $jc.margin(el, 'marginBottom');
if (d == undefined || old == d)
return old;
var w = !this.options.vertical ?
d - $jc.margin(el, 'marginLeft') - $jc.margin(el, 'marginRight') :
d - $jc.margin(el, 'marginTop') - $jc.margin(el, 'marginBottom');
$(el).css(this.wh, w + 'px');
return this.dimension(el);
},
clipping: function() {
return !this.options.vertical ?
this.clip[0].offsetWidth - $jc.intval(this.clip.css('borderLeftWidth')) - $jc.intval(this.clip.css('borderRightWidth')) :
this.clip[0].offsetHeight - $jc.intval(this.clip.css('borderTopWidth')) - $jc.intval(this.clip.css('borderBottomWidth'));
},
index: function(i, s) {
if (s == undefined)
s = this.options.size;
return Math.round((((i-1) / s) - Math.floor((i-1) / s)) * s) + 1;
}
});
$jc.extend({
/**
* Gets/Sets the global default configuration properties.
*
* @method defaults
* @return {Object}
* @param d {Object} A set of key/value pairs to set as configuration properties.
*/
defaults: function(d) {
return $.extend(defaults, d || {});
},
margin: function(e, p) {
if (!e)
return 0;
var el = e.jquery != undefined ? e[0] : e;
return $jc.intval($.css(el, p));
},
intval: function(v) {
v = parseInt(v);
return isNaN(v) ? 0 : v;
}
});
})(jQuery);

39
js/js-func.js Normal file
View File

@ -0,0 +1,39 @@
function mycarousel_initCallback(carousel) {
$('#next').bind('click', function() {
carousel.next();
return false;
});
$('#prev').bind('click', function() {
carousel.prev();
return false;
});
};
$(function(){
$('.slider-content ul').jcarousel({
auto: 0,
wrap: "circular",
scroll: 1,
visible: 1,
initCallback: mycarousel_initCallback,
buttonNextHTML: null,
buttonPrevHTML: null
});
$('.blink').
focus(function() {
if(this.title==this.value) {
this.value = '';
}
}).
blur(function(){
if(this.value=='') {
this.value = this.title;
}
});
});