tchanged build path for latexpdf, changed author name - sphere - GPU-based 3D d… | |
git clone git://src.adamsgaard.dk/sphere | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit e6e80aa139d0442184d3fe2f213f3e4330843759 | |
parent 8867571c13d59a247c6d0d25952de35c6c76780e | |
Author: Anders Damsgaard <[email protected]> | |
Date: Sat, 26 Jan 2013 12:02:20 +0100 | |
changed build path for latexpdf, changed author name | |
Diffstat: | |
A doc/html/.buildinfo | 4 ++++ | |
A doc/html/_images/math/8c325612684d… | 0 | |
A doc/html/_images/math/a32f407296c4… | 0 | |
A doc/html/_images/math/f5047d1e0cbb… | 0 | |
A doc/html/_sources/dem.txt | 6 ++++++ | |
A doc/html/_sources/index.txt | 34 +++++++++++++++++++++++++++++… | |
A doc/html/_sources/introduction.txt | 76 +++++++++++++++++++++++++++++… | |
A doc/html/_sources/python_api.txt | 5 +++++ | |
A doc/html/_sources/sphere_internals… | 217 +++++++++++++++++++++++++++… | |
A doc/html/_static/ajax-loader.gif | 0 | |
A doc/html/_static/basic.css | 541 +++++++++++++++++++++++++++++… | |
A doc/html/_static/comment-bright.png | 0 | |
A doc/html/_static/comment-close.png | 0 | |
A doc/html/_static/comment.png | 0 | |
A doc/html/_static/default.css | 257 +++++++++++++++++++++++++++++… | |
A doc/html/_static/doctools.js | 247 +++++++++++++++++++++++++++++… | |
A doc/html/_static/down-pressed.png | 0 | |
A doc/html/_static/down.png | 0 | |
A doc/html/_static/file.png | 0 | |
A doc/html/_static/jquery.js | 9404 +++++++++++++++++++++++++++++… | |
A doc/html/_static/minus.png | 0 | |
A doc/html/_static/plus.png | 0 | |
A doc/html/_static/pygments.css | 63 +++++++++++++++++++++++++++++… | |
A doc/html/_static/searchtools.js | 561 +++++++++++++++++++++++++++++… | |
A doc/html/_static/sidebar.js | 151 +++++++++++++++++++++++++++++… | |
A doc/html/_static/underscore.js | 807 +++++++++++++++++++++++++++++… | |
A doc/html/_static/up-pressed.png | 0 | |
A doc/html/_static/up.png | 0 | |
A doc/html/_static/websupport.js | 808 +++++++++++++++++++++++++++++… | |
A doc/html/dem.html | 121 +++++++++++++++++++++++++++++… | |
A doc/html/genindex.html | 370 ++++++++++++++++++++++++++++++ | |
A doc/html/index.html | 146 +++++++++++++++++++++++++++++… | |
A doc/html/introduction.html | 212 ++++++++++++++++++++++++++++++ | |
A doc/html/objects.inv | 0 | |
A doc/html/py-modindex.html | 116 ++++++++++++++++++++++++++++++ | |
A doc/html/python_api.html | 365 +++++++++++++++++++++++++++++… | |
A doc/html/search.html | 107 +++++++++++++++++++++++++++++… | |
A doc/html/searchindex.js | 2 ++ | |
A doc/html/sphere_internals.html | 411 ++++++++++++++++++++++++++++++ | |
A doc/latex/Makefile | 66 +++++++++++++++++++++++++++++… | |
A doc/latex/fncychap.sty | 683 +++++++++++++++++++++++++++++… | |
A doc/latex/python.ist | 11 +++++++++++ | |
A doc/latex/sphere.aux | 124 +++++++++++++++++++++++++++++… | |
A doc/latex/sphere.idx | 36 +++++++++++++++++++++++++++++… | |
A doc/latex/sphere.ilg | 7 +++++++ | |
A doc/latex/sphere.ind | 84 +++++++++++++++++++++++++++++… | |
A doc/latex/sphere.log | 1121 +++++++++++++++++++++++++++++… | |
A doc/latex/sphere.out | 12 ++++++++++++ | |
A doc/latex/sphere.pdf | 0 | |
A doc/latex/sphere.tex | 1100 +++++++++++++++++++++++++++++… | |
A doc/latex/sphere.toc | 13 +++++++++++++ | |
A doc/latex/sphinx.sty | 478 +++++++++++++++++++++++++++++… | |
A doc/latex/sphinxhowto.cls | 92 +++++++++++++++++++++++++++++… | |
A doc/latex/sphinxmanual.cls | 133 +++++++++++++++++++++++++++++… | |
A doc/latex/tabulary.sty | 452 +++++++++++++++++++++++++++++… | |
M doc/sphinx/Makefile | 12 +++++++++--- | |
56 files changed, 19452 insertions(+), 3 deletions(-) | |
--- | |
diff --git a/doc/html/.buildinfo b/doc/html/.buildinfo | |
t@@ -0,0 +1,4 @@ | |
+# Sphinx build info version 1 | |
+# This file hashes the configuration used when building these files. When it i… | |
+config: c1c1c2f2bea01e0223aaea2391f75c23 | |
+tags: fbb0d17656682115ca4d033fb2f83ba1 | |
diff --git a/doc/html/_images/math/8c325612684d41304b9751c175df7bcc0f61f64f.png… | |
Binary files differ. | |
diff --git a/doc/html/_images/math/a32f407296c4d7fd42fe568d2ad7e8fa81f2df27.png… | |
Binary files differ. | |
diff --git a/doc/html/_images/math/f5047d1e0cbb50ec208923a22cd517c55100fa7b.png… | |
Binary files differ. | |
diff --git a/doc/html/_sources/dem.txt b/doc/html/_sources/dem.txt | |
t@@ -0,0 +1,6 @@ | |
+Discrete element method | |
+======================= | |
+The discrete element method (or distinct element method) was initially formula… | |
+ | |
+ | |
+ | |
diff --git a/doc/html/_sources/index.txt b/doc/html/_sources/index.txt | |
t@@ -0,0 +1,34 @@ | |
+.. sphere documentation master file, created by | |
+ sphinx-quickstart on Wed Nov 14 12:56:58 2012. | |
+ You can adapt this file completely to your liking, but it should at least | |
+ contain the root `toctree` directive. | |
+ | |
+Welcome to sphere's documentation! | |
+================================== | |
+This is the official documentation for the *sphere* discrete element modelling… | |
+ | |
+*sphere* is developed by Anders Damsgaard Christensen under supervision of Dav… | |
+ | |
+Contact: Anders Damsgaard Christensen, `<http://cs.au.dk/~adc>`_, `<[email protected]… | |
+ | |
+ | |
+Contents: | |
+ | |
+.. toctree:: | |
+ :maxdepth: 2 | |
+ | |
+ introduction | |
+ dem | |
+ python_api | |
+ sphere_internals | |
+ | |
+ | |
+ | |
+Indices and tables | |
+================== | |
+ | |
+.. * :ref:`modindex` | |
+ | |
+* :ref:`genindex` | |
+* :ref:`search` | |
+ | |
diff --git a/doc/html/_sources/introduction.txt b/doc/html/_sources/introductio… | |
t@@ -0,0 +1,76 @@ | |
+Introduction | |
+============ | |
+The *sphere*-software is used for three-dimensional discrete element method (D… | |
+The ultimate aim of the *sphere* software is to simulate soft-bedded subglacia… | |
+ | |
+The purpose of this documentation is to provide the user with a thorough walk-… | |
+ | |
+.. note:: Command examples in this document starting with the symbol ``$`` are… | |
+ | |
+All numerical values in this document, the source code, and the configuration … | |
+ | |
+Requirements | |
+------------ | |
+The build requirements are: | |
+ * A Nvidia CUDA-supported version of Linux or Mac OS X (see the `CUDA toolki… | |
+ * `GNU Make <https://www.gnu.org/software/make/>`_ | |
+ * The `GNU Compiler Collection <http://gcc.gnu.org/>`_ (GCC) | |
+ * The `Nvidia CUDA toolkit and SDK <https://developer.nvidia.com/cuda-downlo… | |
+ | |
+The runtime requirements are: | |
+ * A `CUDA-enabled GPU <http://www.nvidia.com/object/cuda_gpus.html>`_ with c… | |
+ * A Nvidia CUDA-enabled GPU and device driver | |
+ | |
+Optional tools, required for simulation setup and data processing: | |
+ * `Python 2.7 <http://www.python.org/getit/releases/2.7/>`_ | |
+ * `Numpy <http://numpy.scipy.org>`_ | |
+ * `Matplotlib <http://matplotlib.org>`_ | |
+ * `Imagemagick <http://www.imagemagick.org/script/index.php>`_ | |
+ * `ffmpeg <http://ffmpeg.org/>`_ | |
+ | |
+Optional tools, required for building the documentation: | |
+ * `Sphinx <http://sphinx-doc.org>`_ | |
+ | |
+ * `sphinxcontrib-programoutput <http://packages.python.org/sphinxcontrib-p… | |
+ | |
+ * `Doxygen <http://www.stack.nl/~dimitri/doxygen/>`_ | |
+ * `Breathe <http://michaeljones.github.com/breathe/>`_ | |
+ * `dvipng <http://www.nongnu.org/dvipng/>`_ | |
+ | |
+`Git <http://git-scm.com>`_ is used as the distributed version control system … | |
+ | |
+ | |
+Building *sphere* | |
+----------------- | |
+All instructions required for building *sphere* are provided in a number of ``… | |
+ | |
+ $ cd src | |
+ $ make | |
+ | |
+If successfull, the GNU Makefile will create the required data folders, object… | |
+ | |
+ $ ./sphere_* --version | |
+ | |
+The output should look similar to this: | |
+ | |
+.. program-output:: ../../sphere_linux_X86_64 --version | |
+ | |
+The documentation can be read in the `reStructuredText <http://docutils.source… | |
+ | |
+ $ cd doc/sphinx | |
+ $ make html | |
+ $ make latexpdf | |
+ | |
+To see all available output formats, execute:: | |
+ | |
+ $ make help | |
+ | |
+ | |
+Work flow | |
+--------- | |
+After compiling the *sphere* binary, the procedure of a creating and handling … | |
+ * Setup of particle assemblage, physical properties and conditions using the… | |
+ * Execution of *sphere* software, which simulates the particle behavior as a… | |
+ * Inspection, analysis, interpretation and visualization of *sphere* output … | |
+ | |
+ | |
diff --git a/doc/html/_sources/python_api.txt b/doc/html/_sources/python_api.txt | |
t@@ -0,0 +1,5 @@ | |
+Python API | |
+========== | |
+.. automodule:: sphere | |
+ :members: | |
+ | |
diff --git a/doc/html/_sources/sphere_internals.txt b/doc/html/_sources/sphere_… | |
t@@ -0,0 +1,217 @@ | |
+sphere internals | |
+================ | |
+ | |
+The *sphere* executable has the following options: | |
+ | |
+.. command-output:: ../../sphere_linux_X86_64 --help | |
+ | |
+The most common way to invoke *sphere* is however via the Python API (e.g. :py… | |
+ | |
+ | |
+ | |
+ | |
+\subsection{The *sphere* algorithm} | |
+\label{subsec:spherealgo} | |
+The *sphere*-binary is launched from the system terminal by passing the simula… | |
+#. System check, including search for NVIDIA CUDA compatible devices (\texttt{… | |
+ | |
+#. Initial data import from binary input file (\texttt{main.cpp}). | |
+ | |
+#. Allocation of memory for all host variables (particles, grid, walls, etc.) … | |
+ | |
+#. Continued import from binary input file (\texttt{main.cpp}). | |
+ | |
+#. Control handed to GPU-specific function \texttt{gpuMain(\ldots)} (\texttt{d… | |
+ | |
+#. Memory allocation of device memory (\texttt{device.cu}). | |
+ | |
+#. Transfer of data from host to device variables (\texttt{device.cu}). | |
+ | |
+#. Initialization of Thrust\footnote{\url{https://code.google.com/p/thrust/}} … | |
+ | |
+#. Calculation of GPU workload configuration (thread and block layout) (\textt… | |
+ | |
+#. Status and data written to \verb"<simulation_ID>.status.dat" and \verb"<sim… | |
+ | |
+#. Main loop (while \texttt{time.current <= time.total}) (functions called in … | |
+ | |
+ | |
+ #. \label{loopstart}CUDA thread synchronization point. | |
+ | |
+ #. \texttt{calcParticleCellID<<<,>>>(\ldots)}: Particle-grid hash value calc… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{thrust::sort\_by\_key(\ldots)}: Thrust radix sort of particle-gri… | |
+ | |
+ #. \texttt{cudaMemset(\ldots)}: Writing zero value (\texttt{0xffffffff}) to … | |
+ | |
+ #. \texttt{reorderArrays<<<,>>>(\ldots)}: Reordering of particle arrays, bas… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. Optional: \texttt{topology<<<,>>>(\ldots)}: If particle contact history i… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{interact<<<,>>>(\ldots)}: For each particle: Search of contacts i… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{integrate<<<,>>>(\ldots)}: Updating of spatial degrees of freedom… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{summation<<<,>>>(\ldots)}: Particle contributions to the net forc… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{integrateWalls<<<,>>>(\ldots)}: Updating of spatial degrees of fr… | |
+ | |
+ #. Update of timers and loop-related counters (e.g. \texttt{time.current}), … | |
+ | |
+ #. If file output interval is reached: | |
+ | |
+ \item Optional write of data to output binary (\verb"<simulation_ID>.o… | |
+ \item Update of \verb"<simulation_ID>.status#..bin" (\texttt{device.cu… | |
+ | |
+ \item Return to point \ref{loopstart}, unless \texttt{time.current >= ti… | |
+ | |
+ | |
+#. \label{loopend}Liberation of device memory (\texttt{device.cu}). | |
+ | |
+#. Control returned to \texttt{main(\ldots)}, liberation of host memory (\text… | |
+ | |
+#. End of program, return status equal to zero (0) if no problems where encoun… | |
+ | |
+ | |
+Numerical algorithm | |
+------------------- | |
+The *sphere*-binary is launched from the system terminal by passing the simula… | |
+ | |
+#. System check, including search for NVIDIA CUDA compatible devices (\texttt{… | |
+ | |
+#. Initial data import from binary input file (\texttt{main.cpp}). | |
+ | |
+#. Allocation of memory for all host variables (particles, grid, walls, etc.) … | |
+ | |
+#. Continued import from binary input file (\texttt{main.cpp}). | |
+ | |
+#. Control handed to GPU-specific function \texttt{gpuMain(\ldots)} (\texttt{d… | |
+ | |
+#. Memory allocation of device memory (\texttt{device.cu}). | |
+ | |
+#. Transfer of data from host to device variables (\texttt{device.cu}). | |
+ | |
+#. Initialization of Thrust\footnote{\url{https://code.google.com/p/thrust/}} … | |
+ | |
+#. Calculation of GPU workload configuration (thread and block layout) (\textt… | |
+ | |
+#. Status and data written to \verb"<simulation_ID>.status.dat" and \verb"<sim… | |
+ | |
+#. Main loop (while \texttt{time.current <= time.total}) (functions called in … | |
+ | |
+ | |
+ #. \label{loopstart}CUDA thread synchronization point. | |
+ | |
+ #. \texttt{calcParticleCellID<<<,>>>(\ldots)}: Particle-grid hash value calc… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{thrust::sort\_by\_key(\ldots)}: Thrust radix sort of particle-gri… | |
+ | |
+ #. \texttt{cudaMemset(\ldots)}: Writing zero value (\texttt{0xffffffff}) to … | |
+ | |
+ #. \texttt{reorderArrays<<<,>>>(\ldots)}: Reordering of particle arrays, bas… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. Optional: \texttt{topology<<<,>>>(\ldots)}: If particle contact history i… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{interact<<<,>>>(\ldots)}: For each particle: Search of contacts i… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{integrate<<<,>>>(\ldots)}: Updating of spatial degrees of freedom… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{summation<<<,>>>(\ldots)}: Particle contributions to the net forc… | |
+ | |
+ #. CUDA thread synchronization point. | |
+ | |
+ #. \texttt{integrateWalls<<<,>>>(\ldots)}: Updating of spatial degrees of fr… | |
+ | |
+ #. Update of timers and loop-related counters (e.g. \texttt{time.current}), … | |
+ | |
+ #. If file output interval is reached: | |
+ | |
+ * Optional write of data to output binary (\verb"<simulation_ID>.outpu… | |
+ * Update of \verb"<simulation_ID>.status#..bin" (\texttt{device.cu}). | |
+ | |
+ #. Return to point \ref{loopstart}, unless \texttt{time.current >= time.tota… | |
+ | |
+ | |
+#. \label{loopend}Liberation of device memory (\texttt{device.cu}). | |
+ | |
+#. Control returned to \texttt{main(\ldots)}, liberation of host memory (\text… | |
+ | |
+#. End of program, return status equal to zero (0) if no problems where encoun… | |
+ | |
+ | |
+ | |
+The length of the computational time steps (\texttt{time.dt}) is calculated vi… | |
+ | |
+.. math:: | |
+ \Delta t = 0.075 \min \left( m/\max(k_n,k_t) \right) | |
+ | |
+where :math:`m` is the particle mass, and :math:`k` are the elastic stiffnesse… | |
+The time step is set by this relationship in :py:func:`initTemporal`. | |
+This equation ensures that the elastic wave (traveling at the speed of sound) … | |
+ | |
+\subsubsection{Host and device memory types} | |
+\label{subsubsec:memorytypes} | |
+A full, listed description of the *sphere* source code variables can be found … | |
+ | |
+The floating point precision operating internally in *sphere* is defined in \t… | |
+ | |
+Three-dimensional variables (e.g. spatial vectors in `E^3`) are in global memo… | |
+ | |
+ | |
+\paragraph{Host memory} is the main random-access computer memory (RAM), i.e. … | |
+ | |
+ | |
+\paragraph{Device memory} is the main, global device memory. It resides off-ch… | |
+ | |
+\marginpar{Todo: Expand section on device memory types} | |
+ | |
+\paragraph{Constant memory} values cannot be changed after they are set, and a… | |
+ | |
+ | |
+ | |
+%\subsection{The main loop} | |
+%\label{subsec:mainloop} | |
+%The *sphere* software calculates particle movement and rotation based on the … | |
+ | |
+ | |
+\subsection{Performance} | |
+\marginpar{Todo: insert graph of performance vs. np and performance vs. `\Delt… | |
+\subsubsection{Particles and computational time} | |
+ | |
+\subsection{Compilation} | |
+\label{subsec:compilation} | |
+An important note is that the \texttt{C} examples of the NVIDIA CUDA SDK shoul… | |
+ | |
+*sphere* is supplied with several Makefiles, which automate the compilation pr… | |
+ | |
+ | |
+ | |
+ | |
+C++ reference | |
+------------- | |
+.. doxygenclass:: DEM | |
+ :members: | |
+ | |
+ | |
diff --git a/doc/html/_static/ajax-loader.gif b/doc/html/_static/ajax-loader.gif | |
Binary files differ. | |
diff --git a/doc/html/_static/basic.css b/doc/html/_static/basic.css | |
t@@ -0,0 +1,540 @@ | |
+/* | |
+ * basic.css | |
+ * ~~~~~~~~~ | |
+ * | |
+ * Sphinx stylesheet -- basic theme. | |
+ * | |
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. | |
+ * :license: BSD, see LICENSE for details. | |
+ * | |
+ */ | |
+ | |
+/* -- main layout ----------------------------------------------------------- … | |
+ | |
+div.clearer { | |
+ clear: both; | |
+} | |
+ | |
+/* -- relbar ---------------------------------------------------------------- … | |
+ | |
+div.related { | |
+ width: 100%; | |
+ font-size: 90%; | |
+} | |
+ | |
+div.related h3 { | |
+ display: none; | |
+} | |
+ | |
+div.related ul { | |
+ margin: 0; | |
+ padding: 0 0 0 10px; | |
+ list-style: none; | |
+} | |
+ | |
+div.related li { | |
+ display: inline; | |
+} | |
+ | |
+div.related li.right { | |
+ float: right; | |
+ margin-right: 5px; | |
+} | |
+ | |
+/* -- sidebar --------------------------------------------------------------- … | |
+ | |
+div.sphinxsidebarwrapper { | |
+ padding: 10px 5px 0 10px; | |
+} | |
+ | |
+div.sphinxsidebar { | |
+ float: left; | |
+ width: 230px; | |
+ margin-left: -100%; | |
+ font-size: 90%; | |
+} | |
+ | |
+div.sphinxsidebar ul { | |
+ list-style: none; | |
+} | |
+ | |
+div.sphinxsidebar ul ul, | |
+div.sphinxsidebar ul.want-points { | |
+ margin-left: 20px; | |
+ list-style: square; | |
+} | |
+ | |
+div.sphinxsidebar ul ul { | |
+ margin-top: 0; | |
+ margin-bottom: 0; | |
+} | |
+ | |
+div.sphinxsidebar form { | |
+ margin-top: 10px; | |
+} | |
+ | |
+div.sphinxsidebar input { | |
+ border: 1px solid #98dbcc; | |
+ font-family: sans-serif; | |
+ font-size: 1em; | |
+} | |
+ | |
+div.sphinxsidebar #searchbox input[type="text"] { | |
+ width: 170px; | |
+} | |
+ | |
+div.sphinxsidebar #searchbox input[type="submit"] { | |
+ width: 30px; | |
+} | |
+ | |
+img { | |
+ border: 0; | |
+} | |
+ | |
+/* -- search page ----------------------------------------------------------- … | |
+ | |
+ul.search { | |
+ margin: 10px 0 0 20px; | |
+ padding: 0; | |
+} | |
+ | |
+ul.search li { | |
+ padding: 5px 0 5px 20px; | |
+ background-image: url(file.png); | |
+ background-repeat: no-repeat; | |
+ background-position: 0 7px; | |
+} | |
+ | |
+ul.search li a { | |
+ font-weight: bold; | |
+} | |
+ | |
+ul.search li div.context { | |
+ color: #888; | |
+ margin: 2px 0 0 30px; | |
+ text-align: left; | |
+} | |
+ | |
+ul.keywordmatches li.goodmatch a { | |
+ font-weight: bold; | |
+} | |
+ | |
+/* -- index page ------------------------------------------------------------ … | |
+ | |
+table.contentstable { | |
+ width: 90%; | |
+} | |
+ | |
+table.contentstable p.biglink { | |
+ line-height: 150%; | |
+} | |
+ | |
+a.biglink { | |
+ font-size: 1.3em; | |
+} | |
+ | |
+span.linkdescr { | |
+ font-style: italic; | |
+ padding-top: 5px; | |
+ font-size: 90%; | |
+} | |
+ | |
+/* -- general index --------------------------------------------------------- … | |
+ | |
+table.indextable { | |
+ width: 100%; | |
+} | |
+ | |
+table.indextable td { | |
+ text-align: left; | |
+ vertical-align: top; | |
+} | |
+ | |
+table.indextable dl, table.indextable dd { | |
+ margin-top: 0; | |
+ margin-bottom: 0; | |
+} | |
+ | |
+table.indextable tr.pcap { | |
+ height: 10px; | |
+} | |
+ | |
+table.indextable tr.cap { | |
+ margin-top: 10px; | |
+ background-color: #f2f2f2; | |
+} | |
+ | |
+img.toggler { | |
+ margin-right: 3px; | |
+ margin-top: 3px; | |
+ cursor: pointer; | |
+} | |
+ | |
+div.modindex-jumpbox { | |
+ border-top: 1px solid #ddd; | |
+ border-bottom: 1px solid #ddd; | |
+ margin: 1em 0 1em 0; | |
+ padding: 0.4em; | |
+} | |
+ | |
+div.genindex-jumpbox { | |
+ border-top: 1px solid #ddd; | |
+ border-bottom: 1px solid #ddd; | |
+ margin: 1em 0 1em 0; | |
+ padding: 0.4em; | |
+} | |
+ | |
+/* -- general body styles --------------------------------------------------- … | |
+ | |
+a.headerlink { | |
+ visibility: hidden; | |
+} | |
+ | |
+h1:hover > a.headerlink, | |
+h2:hover > a.headerlink, | |
+h3:hover > a.headerlink, | |
+h4:hover > a.headerlink, | |
+h5:hover > a.headerlink, | |
+h6:hover > a.headerlink, | |
+dt:hover > a.headerlink { | |
+ visibility: visible; | |
+} | |
+ | |
+div.body p.caption { | |
+ text-align: inherit; | |
+} | |
+ | |
+div.body td { | |
+ text-align: left; | |
+} | |
+ | |
+.field-list ul { | |
+ padding-left: 1em; | |
+} | |
+ | |
+.first { | |
+ margin-top: 0 !important; | |
+} | |
+ | |
+p.rubric { | |
+ margin-top: 30px; | |
+ font-weight: bold; | |
+} | |
+ | |
+img.align-left, .figure.align-left, object.align-left { | |
+ clear: left; | |
+ float: left; | |
+ margin-right: 1em; | |
+} | |
+ | |
+img.align-right, .figure.align-right, object.align-right { | |
+ clear: right; | |
+ float: right; | |
+ margin-left: 1em; | |
+} | |
+ | |
+img.align-center, .figure.align-center, object.align-center { | |
+ display: block; | |
+ margin-left: auto; | |
+ margin-right: auto; | |
+} | |
+ | |
+.align-left { | |
+ text-align: left; | |
+} | |
+ | |
+.align-center { | |
+ text-align: center; | |
+} | |
+ | |
+.align-right { | |
+ text-align: right; | |
+} | |
+ | |
+/* -- sidebars -------------------------------------------------------------- … | |
+ | |
+div.sidebar { | |
+ margin: 0 0 0.5em 1em; | |
+ border: 1px solid #ddb; | |
+ padding: 7px 7px 0 7px; | |
+ background-color: #ffe; | |
+ width: 40%; | |
+ float: right; | |
+} | |
+ | |
+p.sidebar-title { | |
+ font-weight: bold; | |
+} | |
+ | |
+/* -- topics ---------------------------------------------------------------- … | |
+ | |
+div.topic { | |
+ border: 1px solid #ccc; | |
+ padding: 7px 7px 0 7px; | |
+ margin: 10px 0 10px 0; | |
+} | |
+ | |
+p.topic-title { | |
+ font-size: 1.1em; | |
+ font-weight: bold; | |
+ margin-top: 10px; | |
+} | |
+ | |
+/* -- admonitions ----------------------------------------------------------- … | |
+ | |
+div.admonition { | |
+ margin-top: 10px; | |
+ margin-bottom: 10px; | |
+ padding: 7px; | |
+} | |
+ | |
+div.admonition dt { | |
+ font-weight: bold; | |
+} | |
+ | |
+div.admonition dl { | |
+ margin-bottom: 0; | |
+} | |
+ | |
+p.admonition-title { | |
+ margin: 0px 10px 5px 0px; | |
+ font-weight: bold; | |
+} | |
+ | |
+div.body p.centered { | |
+ text-align: center; | |
+ margin-top: 25px; | |
+} | |
+ | |
+/* -- tables ---------------------------------------------------------------- … | |
+ | |
+table.docutils { | |
+ border: 0; | |
+ border-collapse: collapse; | |
+} | |
+ | |
+table.docutils td, table.docutils th { | |
+ padding: 1px 8px 1px 5px; | |
+ border-top: 0; | |
+ border-left: 0; | |
+ border-right: 0; | |
+ border-bottom: 1px solid #aaa; | |
+} | |
+ | |
+table.field-list td, table.field-list th { | |
+ border: 0 !important; | |
+} | |
+ | |
+table.footnote td, table.footnote th { | |
+ border: 0 !important; | |
+} | |
+ | |
+th { | |
+ text-align: left; | |
+ padding-right: 5px; | |
+} | |
+ | |
+table.citation { | |
+ border-left: solid 1px gray; | |
+ margin-left: 1px; | |
+} | |
+ | |
+table.citation td { | |
+ border-bottom: none; | |
+} | |
+ | |
+/* -- other body styles ----------------------------------------------------- … | |
+ | |
+ol.arabic { | |
+ list-style: decimal; | |
+} | |
+ | |
+ol.loweralpha { | |
+ list-style: lower-alpha; | |
+} | |
+ | |
+ol.upperalpha { | |
+ list-style: upper-alpha; | |
+} | |
+ | |
+ol.lowerroman { | |
+ list-style: lower-roman; | |
+} | |
+ | |
+ol.upperroman { | |
+ list-style: upper-roman; | |
+} | |
+ | |
+dl { | |
+ margin-bottom: 15px; | |
+} | |
+ | |
+dd p { | |
+ margin-top: 0px; | |
+} | |
+ | |
+dd ul, dd table { | |
+ margin-bottom: 10px; | |
+} | |
+ | |
+dd { | |
+ margin-top: 3px; | |
+ margin-bottom: 10px; | |
+ margin-left: 30px; | |
+} | |
+ | |
+dt:target, .highlighted { | |
+ background-color: #fbe54e; | |
+} | |
+ | |
+dl.glossary dt { | |
+ font-weight: bold; | |
+ font-size: 1.1em; | |
+} | |
+ | |
+.field-list ul { | |
+ margin: 0; | |
+ padding-left: 1em; | |
+} | |
+ | |
+.field-list p { | |
+ margin: 0; | |
+} | |
+ | |
+.refcount { | |
+ color: #060; | |
+} | |
+ | |
+.optional { | |
+ font-size: 1.3em; | |
+} | |
+ | |
+.versionmodified { | |
+ font-style: italic; | |
+} | |
+ | |
+.system-message { | |
+ background-color: #fda; | |
+ padding: 5px; | |
+ border: 3px solid red; | |
+} | |
+ | |
+.footnote:target { | |
+ background-color: #ffa; | |
+} | |
+ | |
+.line-block { | |
+ display: block; | |
+ margin-top: 1em; | |
+ margin-bottom: 1em; | |
+} | |
+ | |
+.line-block .line-block { | |
+ margin-top: 0; | |
+ margin-bottom: 0; | |
+ margin-left: 1.5em; | |
+} | |
+ | |
+.guilabel, .menuselection { | |
+ font-family: sans-serif; | |
+} | |
+ | |
+.accelerator { | |
+ text-decoration: underline; | |
+} | |
+ | |
+.classifier { | |
+ font-style: oblique; | |
+} | |
+ | |
+abbr, acronym { | |
+ border-bottom: dotted 1px; | |
+ cursor: help; | |
+} | |
+ | |
+/* -- code displays --------------------------------------------------------- … | |
+ | |
+pre { | |
+ overflow: auto; | |
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */ | |
+} | |
+ | |
+td.linenos pre { | |
+ padding: 5px 0px; | |
+ border: 0; | |
+ background-color: transparent; | |
+ color: #aaa; | |
+} | |
+ | |
+table.highlighttable { | |
+ margin-left: 0.5em; | |
+} | |
+ | |
+table.highlighttable td { | |
+ padding: 0 0.5em 0 0.5em; | |
+} | |
+ | |
+tt.descname { | |
+ background-color: transparent; | |
+ font-weight: bold; | |
+ font-size: 1.2em; | |
+} | |
+ | |
+tt.descclassname { | |
+ background-color: transparent; | |
+} | |
+ | |
+tt.xref, a tt { | |
+ background-color: transparent; | |
+ font-weight: bold; | |
+} | |
+ | |
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { | |
+ background-color: transparent; | |
+} | |
+ | |
+.viewcode-link { | |
+ float: right; | |
+} | |
+ | |
+.viewcode-back { | |
+ float: right; | |
+ font-family: sans-serif; | |
+} | |
+ | |
+div.viewcode-block:target { | |
+ margin: -1px -10px; | |
+ padding: 0 10px; | |
+} | |
+ | |
+/* -- math display ---------------------------------------------------------- … | |
+ | |
+img.math { | |
+ vertical-align: middle; | |
+} | |
+ | |
+div.body div.math p { | |
+ text-align: center; | |
+} | |
+ | |
+span.eqno { | |
+ float: right; | |
+} | |
+ | |
+/* -- printout stylesheet --------------------------------------------------- … | |
+ | |
+@media print { | |
+ div.document, | |
+ div.documentwrapper, | |
+ div.bodywrapper { | |
+ margin: 0 !important; | |
+ width: 100%; | |
+ } | |
+ | |
+ div.sphinxsidebar, | |
+ div.related, | |
+ div.footer, | |
+ #top-link { | |
+ display: none; | |
+ } | |
+} | |
+\ No newline at end of file | |
diff --git a/doc/html/_static/comment-bright.png b/doc/html/_static/comment-bri… | |
Binary files differ. | |
diff --git a/doc/html/_static/comment-close.png b/doc/html/_static/comment-clos… | |
Binary files differ. | |
diff --git a/doc/html/_static/comment.png b/doc/html/_static/comment.png | |
Binary files differ. | |
diff --git a/doc/html/_static/default.css b/doc/html/_static/default.css | |
t@@ -0,0 +1,256 @@ | |
+/* | |
+ * default.css_t | |
+ * ~~~~~~~~~~~~~ | |
+ * | |
+ * Sphinx stylesheet -- default theme. | |
+ * | |
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. | |
+ * :license: BSD, see LICENSE for details. | |
+ * | |
+ */ | |
+ | |
+@import url("basic.css"); | |
+ | |
+/* -- page layout ----------------------------------------------------------- … | |
+ | |
+body { | |
+ font-family: sans-serif; | |
+ font-size: 100%; | |
+ background-color: #11303d; | |
+ color: #000; | |
+ margin: 0; | |
+ padding: 0; | |
+} | |
+ | |
+div.document { | |
+ background-color: #1c4e63; | |
+} | |
+ | |
+div.documentwrapper { | |
+ float: left; | |
+ width: 100%; | |
+} | |
+ | |
+div.bodywrapper { | |
+ margin: 0 0 0 230px; | |
+} | |
+ | |
+div.body { | |
+ background-color: #ffffff; | |
+ color: #000000; | |
+ padding: 0 20px 30px 20px; | |
+} | |
+ | |
+div.footer { | |
+ color: #ffffff; | |
+ width: 100%; | |
+ padding: 9px 0 9px 0; | |
+ text-align: center; | |
+ font-size: 75%; | |
+} | |
+ | |
+div.footer a { | |
+ color: #ffffff; | |
+ text-decoration: underline; | |
+} | |
+ | |
+div.related { | |
+ background-color: #133f52; | |
+ line-height: 30px; | |
+ color: #ffffff; | |
+} | |
+ | |
+div.related a { | |
+ color: #ffffff; | |
+} | |
+ | |
+div.sphinxsidebar { | |
+} | |
+ | |
+div.sphinxsidebar h3 { | |
+ font-family: 'Trebuchet MS', sans-serif; | |
+ color: #ffffff; | |
+ font-size: 1.4em; | |
+ font-weight: normal; | |
+ margin: 0; | |
+ padding: 0; | |
+} | |
+ | |
+div.sphinxsidebar h3 a { | |
+ color: #ffffff; | |
+} | |
+ | |
+div.sphinxsidebar h4 { | |
+ font-family: 'Trebuchet MS', sans-serif; | |
+ color: #ffffff; | |
+ font-size: 1.3em; | |
+ font-weight: normal; | |
+ margin: 5px 0 0 0; | |
+ padding: 0; | |
+} | |
+ | |
+div.sphinxsidebar p { | |
+ color: #ffffff; | |
+} | |
+ | |
+div.sphinxsidebar p.topless { | |
+ margin: 5px 10px 10px 10px; | |
+} | |
+ | |
+div.sphinxsidebar ul { | |
+ margin: 10px; | |
+ padding: 0; | |
+ color: #ffffff; | |
+} | |
+ | |
+div.sphinxsidebar a { | |
+ color: #98dbcc; | |
+} | |
+ | |
+div.sphinxsidebar input { | |
+ border: 1px solid #98dbcc; | |
+ font-family: sans-serif; | |
+ font-size: 1em; | |
+} | |
+ | |
+ | |
+ | |
+/* -- hyperlink styles ------------------------------------------------------ … | |
+ | |
+a { | |
+ color: #355f7c; | |
+ text-decoration: none; | |
+} | |
+ | |
+a:visited { | |
+ color: #355f7c; | |
+ text-decoration: none; | |
+} | |
+ | |
+a:hover { | |
+ text-decoration: underline; | |
+} | |
+ | |
+ | |
+ | |
+/* -- body styles ----------------------------------------------------------- … | |
+ | |
+div.body h1, | |
+div.body h2, | |
+div.body h3, | |
+div.body h4, | |
+div.body h5, | |
+div.body h6 { | |
+ font-family: 'Trebuchet MS', sans-serif; | |
+ background-color: #f2f2f2; | |
+ font-weight: normal; | |
+ color: #20435c; | |
+ border-bottom: 1px solid #ccc; | |
+ margin: 20px -20px 10px -20px; | |
+ padding: 3px 0 3px 10px; | |
+} | |
+ | |
+div.body h1 { margin-top: 0; font-size: 200%; } | |
+div.body h2 { font-size: 160%; } | |
+div.body h3 { font-size: 140%; } | |
+div.body h4 { font-size: 120%; } | |
+div.body h5 { font-size: 110%; } | |
+div.body h6 { font-size: 100%; } | |
+ | |
+a.headerlink { | |
+ color: #c60f0f; | |
+ font-size: 0.8em; | |
+ padding: 0 4px 0 4px; | |
+ text-decoration: none; | |
+} | |
+ | |
+a.headerlink:hover { | |
+ background-color: #c60f0f; | |
+ color: white; | |
+} | |
+ | |
+div.body p, div.body dd, div.body li { | |
+ text-align: justify; | |
+ line-height: 130%; | |
+} | |
+ | |
+div.admonition p.admonition-title + p { | |
+ display: inline; | |
+} | |
+ | |
+div.admonition p { | |
+ margin-bottom: 5px; | |
+} | |
+ | |
+div.admonition pre { | |
+ margin-bottom: 5px; | |
+} | |
+ | |
+div.admonition ul, div.admonition ol { | |
+ margin-bottom: 5px; | |
+} | |
+ | |
+div.note { | |
+ background-color: #eee; | |
+ border: 1px solid #ccc; | |
+} | |
+ | |
+div.seealso { | |
+ background-color: #ffc; | |
+ border: 1px solid #ff6; | |
+} | |
+ | |
+div.topic { | |
+ background-color: #eee; | |
+} | |
+ | |
+div.warning { | |
+ background-color: #ffe4e4; | |
+ border: 1px solid #f66; | |
+} | |
+ | |
+p.admonition-title { | |
+ display: inline; | |
+} | |
+ | |
+p.admonition-title:after { | |
+ content: ":"; | |
+} | |
+ | |
+pre { | |
+ padding: 5px; | |
+ background-color: #eeffcc; | |
+ color: #333333; | |
+ line-height: 120%; | |
+ border: 1px solid #ac9; | |
+ border-left: none; | |
+ border-right: none; | |
+} | |
+ | |
+tt { | |
+ background-color: #ecf0f3; | |
+ padding: 0 1px 0 1px; | |
+ font-size: 0.95em; | |
+} | |
+ | |
+th { | |
+ background-color: #ede; | |
+} | |
+ | |
+.warning tt { | |
+ background: #efc2c2; | |
+} | |
+ | |
+.note tt { | |
+ background: #d6d6d6; | |
+} | |
+ | |
+.viewcode-back { | |
+ font-family: sans-serif; | |
+} | |
+ | |
+div.viewcode-block:target { | |
+ background-color: #f4debf; | |
+ border-top: 1px solid #ac9; | |
+ border-bottom: 1px solid #ac9; | |
+} | |
+\ No newline at end of file | |
diff --git a/doc/html/_static/doctools.js b/doc/html/_static/doctools.js | |
t@@ -0,0 +1,247 @@ | |
+/* | |
+ * doctools.js | |
+ * ~~~~~~~~~~~ | |
+ * | |
+ * Sphinx JavaScript utilities for all documentation. | |
+ * | |
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. | |
+ * :license: BSD, see LICENSE for details. | |
+ * | |
+ */ | |
+ | |
+/** | |
+ * select a different prefix for underscore | |
+ */ | |
+$u = _.noConflict(); | |
+ | |
+/** | |
+ * make the code below compatible with browsers without | |
+ * an installed firebug like debugger | |
+if (!window.console || !console.firebug) { | |
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir", | |
+ "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", | |
+ "profile", "profileEnd"]; | |
+ window.console = {}; | |
+ for (var i = 0; i < names.length; ++i) | |
+ window.console[names[i]] = function() {}; | |
+} | |
+ */ | |
+ | |
+/** | |
+ * small helper function to urldecode strings | |
+ */ | |
+jQuery.urldecode = function(x) { | |
+ return decodeURIComponent(x).replace(/\+/g, ' '); | |
+} | |
+ | |
+/** | |
+ * small helper function to urlencode strings | |
+ */ | |
+jQuery.urlencode = encodeURIComponent; | |
+ | |
+/** | |
+ * This function returns the parsed url parameters of the | |
+ * current request. Multiple values per key are supported, | |
+ * it will always return arrays of strings for the value parts. | |
+ */ | |
+jQuery.getQueryParameters = function(s) { | |
+ if (typeof s == 'undefined') | |
+ s = document.location.search; | |
+ var parts = s.substr(s.indexOf('?') + 1).split('&'); | |
+ var result = {}; | |
+ for (var i = 0; i < parts.length; i++) { | |
+ var tmp = parts[i].split('=', 2); | |
+ var key = jQuery.urldecode(tmp[0]); | |
+ var value = jQuery.urldecode(tmp[1]); | |
+ if (key in result) | |
+ result[key].push(value); | |
+ else | |
+ result[key] = [value]; | |
+ } | |
+ return result; | |
+}; | |
+ | |
+/** | |
+ * small function to check if an array contains | |
+ * a given item. | |
+ */ | |
+jQuery.contains = function(arr, item) { | |
+ for (var i = 0; i < arr.length; i++) { | |
+ if (arr[i] == item) | |
+ return true; | |
+ } | |
+ return false; | |
+}; | |
+ | |
+/** | |
+ * highlight a given string on a jquery object by wrapping it in | |
+ * span elements with the given class name. | |
+ */ | |
+jQuery.fn.highlightText = function(text, className) { | |
+ function highlight(node) { | |
+ if (node.nodeType == 3) { | |
+ var val = node.nodeValue; | |
+ var pos = val.toLowerCase().indexOf(text); | |
+ if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { | |
+ var span = document.createElement("span"); | |
+ span.className = className; | |
+ span.appendChild(document.createTextNode(val.substr(pos, text.length))… | |
+ node.parentNode.insertBefore(span, node.parentNode.insertBefore( | |
+ document.createTextNode(val.substr(pos + text.length)), | |
+ node.nextSibling)); | |
+ node.nodeValue = val.substr(0, pos); | |
+ } | |
+ } | |
+ else if (!jQuery(node).is("button, select, textarea")) { | |
+ jQuery.each(node.childNodes, function() { | |
+ highlight(this); | |
+ }); | |
+ } | |
+ } | |
+ return this.each(function() { | |
+ highlight(this); | |
+ }); | |
+}; | |
+ | |
+/** | |
+ * Small JavaScript module for the documentation. | |
+ */ | |
+var Documentation = { | |
+ | |
+ init : function() { | |
+ this.fixFirefoxAnchorBug(); | |
+ this.highlightSearchWords(); | |
+ this.initIndexTable(); | |
+ }, | |
+ | |
+ /** | |
+ * i18n support | |
+ */ | |
+ TRANSLATIONS : {}, | |
+ PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, | |
+ LOCALE : 'unknown', | |
+ | |
+ // gettext and ngettext don't access this so that the functions | |
+ // can safely bound to a different name (_ = Documentation.gettext) | |
+ gettext : function(string) { | |
+ var translated = Documentation.TRANSLATIONS[string]; | |
+ if (typeof translated == 'undefined') | |
+ return string; | |
+ return (typeof translated == 'string') ? translated : translated[0]; | |
+ }, | |
+ | |
+ ngettext : function(singular, plural, n) { | |
+ var translated = Documentation.TRANSLATIONS[singular]; | |
+ if (typeof translated == 'undefined') | |
+ return (n == 1) ? singular : plural; | |
+ return translated[Documentation.PLURALEXPR(n)]; | |
+ }, | |
+ | |
+ addTranslations : function(catalog) { | |
+ for (var key in catalog.messages) | |
+ this.TRANSLATIONS[key] = catalog.messages[key]; | |
+ this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + '… | |
+ this.LOCALE = catalog.locale; | |
+ }, | |
+ | |
+ /** | |
+ * add context elements like header anchor links | |
+ */ | |
+ addContextElements : function() { | |
+ $('div[id] > :header:first').each(function() { | |
+ $('<a class="headerlink">\u00B6</a>'). | |
+ attr('href', '#' + this.id). | |
+ attr('title', _('Permalink to this headline')). | |
+ appendTo(this); | |
+ }); | |
+ $('dt[id]').each(function() { | |
+ $('<a class="headerlink">\u00B6</a>'). | |
+ attr('href', '#' + this.id). | |
+ attr('title', _('Permalink to this definition')). | |
+ appendTo(this); | |
+ }); | |
+ }, | |
+ | |
+ /** | |
+ * workaround a firefox stupidity | |
+ */ | |
+ fixFirefoxAnchorBug : function() { | |
+ if (document.location.hash && $.browser.mozilla) | |
+ window.setTimeout(function() { | |
+ document.location.href += ''; | |
+ }, 10); | |
+ }, | |
+ | |
+ /** | |
+ * highlight the search words provided in the url in the text | |
+ */ | |
+ highlightSearchWords : function() { | |
+ var params = $.getQueryParameters(); | |
+ var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; | |
+ if (terms.length) { | |
+ var body = $('div.body'); | |
+ window.setTimeout(function() { | |
+ $.each(terms, function() { | |
+ body.highlightText(this.toLowerCase(), 'highlighted'); | |
+ }); | |
+ }, 10); | |
+ $('<p class="highlight-link"><a href="javascript:Documentation.' + | |
+ 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>') | |
+ .appendTo($('#searchbox')); | |
+ } | |
+ }, | |
+ | |
+ /** | |
+ * init the domain index toggle buttons | |
+ */ | |
+ initIndexTable : function() { | |
+ var togglers = $('img.toggler').click(function() { | |
+ var src = $(this).attr('src'); | |
+ var idnum = $(this).attr('id').substr(7); | |
+ $('tr.cg-' + idnum).toggle(); | |
+ if (src.substr(-9) == 'minus.png') | |
+ $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); | |
+ else | |
+ $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); | |
+ }).css('display', ''); | |
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { | |
+ togglers.click(); | |
+ } | |
+ }, | |
+ | |
+ /** | |
+ * helper function to hide the search marks again | |
+ */ | |
+ hideSearchWords : function() { | |
+ $('#searchbox .highlight-link').fadeOut(300); | |
+ $('span.highlighted').removeClass('highlighted'); | |
+ }, | |
+ | |
+ /** | |
+ * make the url absolute | |
+ */ | |
+ makeURL : function(relativeURL) { | |
+ return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; | |
+ }, | |
+ | |
+ /** | |
+ * get the current relative url | |
+ */ | |
+ getCurrentURL : function() { | |
+ var path = document.location.pathname; | |
+ var parts = path.split(/\//); | |
+ $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { | |
+ if (this == '..') | |
+ parts.pop(); | |
+ }); | |
+ var url = parts.join('/'); | |
+ return path.substring(url.lastIndexOf('/') + 1, path.length - 1); | |
+ } | |
+}; | |
+ | |
+// quick alias for translations | |
+_ = Documentation.gettext; | |
+ | |
+$(document).ready(function() { | |
+ Documentation.init(); | |
+}); | |
diff --git a/doc/html/_static/down-pressed.png b/doc/html/_static/down-pressed.… | |
Binary files differ. | |
diff --git a/doc/html/_static/down.png b/doc/html/_static/down.png | |
Binary files differ. | |
diff --git a/doc/html/_static/file.png b/doc/html/_static/file.png | |
Binary files differ. | |
diff --git a/doc/html/_static/jquery.js b/doc/html/_static/jquery.js | |
t@@ -0,0 +1,9404 @@ | |
+/*! | |
+ * jQuery JavaScript Library v1.7.2 | |
+ * http://jquery.com/ | |
+ * | |
+ * Copyright 2011, John Resig | |
+ * Dual licensed under the MIT or GPL Version 2 licenses. | |
+ * http://jquery.org/license | |
+ * | |
+ * Includes Sizzle.js | |
+ * http://sizzlejs.com/ | |
+ * Copyright 2011, The Dojo Foundation | |
+ * Released under the MIT, BSD, and GPL Licenses. | |
+ * | |
+ * Date: Thu Nov 15 18:28:24 BRST 2012 | |
+ */ | |
+(function( window, undefined ) { | |
+ | |
+// Use the correct document accordingly with window argument (sandbox) | |
+var document = window.document, | |
+ navigator = window.navigator, | |
+ location = window.location; | |
+var jQuery = (function() { | |
+ | |
+// Define a local copy of jQuery | |
+var jQuery = function( selector, context ) { | |
+ // The jQuery object is actually just the init constructor 'en… | |
+ return new jQuery.fn.init( selector, context, rootjQuery ); | |
+ }, | |
+ | |
+ // Map over jQuery in case of overwrite | |
+ _jQuery = window.jQuery, | |
+ | |
+ // Map over the $ in case of overwrite | |
+ _$ = window.$, | |
+ | |
+ // A central reference to the root jQuery(document) | |
+ rootjQuery, | |
+ | |
+ // A simple way to check for HTML strings or ID strings | |
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) | |
+ quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, | |
+ | |
+ // Check if a string has a non-whitespace character in it | |
+ rnotwhite = /\S/, | |
+ | |
+ // Used for trimming whitespace | |
+ trimLeft = /^\s+/, | |
+ trimRight = /\s+$/, | |
+ | |
+ // Match a standalone tag | |
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, | |
+ | |
+ // JSON RegExp | |
+ rvalidchars = /^[\],:{}\s]*$/, | |
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, | |
+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+… | |
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, | |
+ | |
+ // Useragent RegExp | |
+ rwebkit = /(webkit)[ \/]([\w.]+)/, | |
+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, | |
+ rmsie = /(msie) ([\w.]+)/, | |
+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, | |
+ | |
+ // Matches dashed string for camelizing | |
+ rdashAlpha = /-([a-z]|[0-9])/ig, | |
+ rmsPrefix = /^-ms-/, | |
+ | |
+ // Used by jQuery.camelCase as callback to replace() | |
+ fcamelCase = function( all, letter ) { | |
+ return ( letter + "" ).toUpperCase(); | |
+ }, | |
+ | |
+ // Keep a UserAgent string for use with jQuery.browser | |
+ userAgent = navigator.userAgent, | |
+ | |
+ // For matching the engine and version of the browser | |
+ browserMatch, | |
+ | |
+ // The deferred used on DOM ready | |
+ readyList, | |
+ | |
+ // The ready event handler | |
+ DOMContentLoaded, | |
+ | |
+ // Save a reference to some core methods | |
+ toString = Object.prototype.toString, | |
+ hasOwn = Object.prototype.hasOwnProperty, | |
+ push = Array.prototype.push, | |
+ slice = Array.prototype.slice, | |
+ trim = String.prototype.trim, | |
+ indexOf = Array.prototype.indexOf, | |
+ | |
+ // [[Class]] -> type pairs | |
+ class2type = {}; | |
+ | |
+jQuery.fn = jQuery.prototype = { | |
+ constructor: jQuery, | |
+ init: function( selector, context, rootjQuery ) { | |
+ var match, elem, ret, doc; | |
+ | |
+ // Handle $(""), $(null), or $(undefined) | |
+ if ( !selector ) { | |
+ return this; | |
+ } | |
+ | |
+ // Handle $(DOMElement) | |
+ if ( selector.nodeType ) { | |
+ this.context = this[0] = selector; | |
+ this.length = 1; | |
+ return this; | |
+ } | |
+ | |
+ // The body element only exists once, optimize finding it | |
+ if ( selector === "body" && !context && document.body ) { | |
+ this.context = document; | |
+ this[0] = document.body; | |
+ this.selector = selector; | |
+ this.length = 1; | |
+ return this; | |
+ } | |
+ | |
+ // Handle HTML strings | |
+ if ( typeof selector === "string" ) { | |
+ // Are we dealing with HTML string or an ID? | |
+ if ( selector.charAt(0) === "<" && selector.charAt( se… | |
+ // Assume that strings that start and end with… | |
+ match = [ null, selector, null ]; | |
+ | |
+ } else { | |
+ match = quickExpr.exec( selector ); | |
+ } | |
+ | |
+ // Verify a match, and that no context was specified f… | |
+ if ( match && (match[1] || !context) ) { | |
+ | |
+ // HANDLE: $(html) -> $(array) | |
+ if ( match[1] ) { | |
+ context = context instanceof jQuery ? … | |
+ doc = ( context ? context.ownerDocumen… | |
+ | |
+ // If a single string is passed in and… | |
+ // just do a createElement and skip th… | |
+ ret = rsingleTag.exec( selector ); | |
+ | |
+ if ( ret ) { | |
+ if ( jQuery.isPlainObject( con… | |
+ selector = [ document.… | |
+ jQuery.fn.attr.call( s… | |
+ | |
+ } else { | |
+ selector = [ doc.creat… | |
+ } | |
+ | |
+ } else { | |
+ ret = jQuery.buildFragment( [ … | |
+ selector = ( ret.cacheable ? j… | |
+ } | |
+ | |
+ return jQuery.merge( this, selector ); | |
+ | |
+ // HANDLE: $("#id") | |
+ } else { | |
+ elem = document.getElementById( match[… | |
+ | |
+ // Check parentNode to catch when Blac… | |
+ // nodes that are no longer in the doc… | |
+ if ( elem && elem.parentNode ) { | |
+ // Handle the case where IE an… | |
+ // by name instead of ID | |
+ if ( elem.id !== match[2] ) { | |
+ return rootjQuery.find… | |
+ } | |
+ | |
+ // Otherwise, we inject the el… | |
+ this.length = 1; | |
+ this[0] = elem; | |
+ } | |
+ | |
+ this.context = document; | |
+ this.selector = selector; | |
+ return this; | |
+ } | |
+ | |
+ // HANDLE: $(expr, $(...)) | |
+ } else if ( !context || context.jquery ) { | |
+ return ( context || rootjQuery ).find( selecto… | |
+ | |
+ // HANDLE: $(expr, context) | |
+ // (which is just equivalent to: $(context).find(expr) | |
+ } else { | |
+ return this.constructor( context ).find( selec… | |
+ } | |
+ | |
+ // HANDLE: $(function) | |
+ // Shortcut for document ready | |
+ } else if ( jQuery.isFunction( selector ) ) { | |
+ return rootjQuery.ready( selector ); | |
+ } | |
+ | |
+ if ( selector.selector !== undefined ) { | |
+ this.selector = selector.selector; | |
+ this.context = selector.context; | |
+ } | |
+ | |
+ return jQuery.makeArray( selector, this ); | |
+ }, | |
+ | |
+ // Start with an empty selector | |
+ selector: "", | |
+ | |
+ // The current version of jQuery being used | |
+ jquery: "1.7.2", | |
+ | |
+ // The default length of a jQuery object is 0 | |
+ length: 0, | |
+ | |
+ // The number of elements contained in the matched element set | |
+ size: function() { | |
+ return this.length; | |
+ }, | |
+ | |
+ toArray: function() { | |
+ return slice.call( this, 0 ); | |
+ }, | |
+ | |
+ // Get the Nth element in the matched element set OR | |
+ // Get the whole matched element set as a clean array | |
+ get: function( num ) { | |
+ return num == null ? | |
+ | |
+ // Return a 'clean' array | |
+ this.toArray() : | |
+ | |
+ // Return just the object | |
+ ( num < 0 ? this[ this.length + num ] : this[ num ] ); | |
+ }, | |
+ | |
+ // Take an array of elements and push it onto the stack | |
+ // (returning the new matched element set) | |
+ pushStack: function( elems, name, selector ) { | |
+ // Build a new jQuery matched element set | |
+ var ret = this.constructor(); | |
+ | |
+ if ( jQuery.isArray( elems ) ) { | |
+ push.apply( ret, elems ); | |
+ | |
+ } else { | |
+ jQuery.merge( ret, elems ); | |
+ } | |
+ | |
+ // Add the old object onto the stack (as a reference) | |
+ ret.prevObject = this; | |
+ | |
+ ret.context = this.context; | |
+ | |
+ if ( name === "find" ) { | |
+ ret.selector = this.selector + ( this.selector ? " " :… | |
+ } else if ( name ) { | |
+ ret.selector = this.selector + "." + name + "(" + sele… | |
+ } | |
+ | |
+ // Return the newly-formed element set | |
+ return ret; | |
+ }, | |
+ | |
+ // Execute a callback for every element in the matched set. | |
+ // (You can seed the arguments with an array of args, but this is | |
+ // only used internally.) | |
+ each: function( callback, args ) { | |
+ return jQuery.each( this, callback, args ); | |
+ }, | |
+ | |
+ ready: function( fn ) { | |
+ // Attach the listeners | |
+ jQuery.bindReady(); | |
+ | |
+ // Add the callback | |
+ readyList.add( fn ); | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ eq: function( i ) { | |
+ i = +i; | |
+ return i === -1 ? | |
+ this.slice( i ) : | |
+ this.slice( i, i + 1 ); | |
+ }, | |
+ | |
+ first: function() { | |
+ return this.eq( 0 ); | |
+ }, | |
+ | |
+ last: function() { | |
+ return this.eq( -1 ); | |
+ }, | |
+ | |
+ slice: function() { | |
+ return this.pushStack( slice.apply( this, arguments ), | |
+ "slice", slice.call(arguments).join(",") ); | |
+ }, | |
+ | |
+ map: function( callback ) { | |
+ return this.pushStack( jQuery.map(this, function( elem, i ) { | |
+ return callback.call( elem, i, elem ); | |
+ })); | |
+ }, | |
+ | |
+ end: function() { | |
+ return this.prevObject || this.constructor(null); | |
+ }, | |
+ | |
+ // For internal use only. | |
+ // Behaves like an Array's method, not like a jQuery method. | |
+ push: push, | |
+ sort: [].sort, | |
+ splice: [].splice | |
+}; | |
+ | |
+// Give the init function the jQuery prototype for later instantiation | |
+jQuery.fn.init.prototype = jQuery.fn; | |
+ | |
+jQuery.extend = jQuery.fn.extend = function() { | |
+ var options, name, src, copy, copyIsArray, clone, | |
+ target = arguments[0] || {}, | |
+ i = 1, | |
+ length = arguments.length, | |
+ deep = false; | |
+ | |
+ // Handle a deep copy situation | |
+ if ( typeof target === "boolean" ) { | |
+ deep = target; | |
+ target = arguments[1] || {}; | |
+ // skip the boolean and the target | |
+ i = 2; | |
+ } | |
+ | |
+ // Handle case when target is a string or something (possible in deep … | |
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) { | |
+ target = {}; | |
+ } | |
+ | |
+ // extend jQuery itself if only one argument is passed | |
+ if ( length === i ) { | |
+ target = this; | |
+ --i; | |
+ } | |
+ | |
+ for ( ; i < length; i++ ) { | |
+ // Only deal with non-null/undefined values | |
+ if ( (options = arguments[ i ]) != null ) { | |
+ // Extend the base object | |
+ for ( name in options ) { | |
+ src = target[ name ]; | |
+ copy = options[ name ]; | |
+ | |
+ // Prevent never-ending loop | |
+ if ( target === copy ) { | |
+ continue; | |
+ } | |
+ | |
+ // Recurse if we're merging plain objects or a… | |
+ if ( deep && copy && ( jQuery.isPlainObject(co… | |
+ if ( copyIsArray ) { | |
+ copyIsArray = false; | |
+ clone = src && jQuery.isArray(… | |
+ | |
+ } else { | |
+ clone = src && jQuery.isPlainO… | |
+ } | |
+ | |
+ // Never move original objects, clone … | |
+ target[ name ] = jQuery.extend( deep, … | |
+ | |
+ // Don't bring in undefined values | |
+ } else if ( copy !== undefined ) { | |
+ target[ name ] = copy; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Return the modified object | |
+ return target; | |
+}; | |
+ | |
+jQuery.extend({ | |
+ noConflict: function( deep ) { | |
+ if ( window.$ === jQuery ) { | |
+ window.$ = _$; | |
+ } | |
+ | |
+ if ( deep && window.jQuery === jQuery ) { | |
+ window.jQuery = _jQuery; | |
+ } | |
+ | |
+ return jQuery; | |
+ }, | |
+ | |
+ // Is the DOM ready to be used? Set to true once it occurs. | |
+ isReady: false, | |
+ | |
+ // A counter to track how many items to wait for before | |
+ // the ready event fires. See #6781 | |
+ readyWait: 1, | |
+ | |
+ // Hold (or release) the ready event | |
+ holdReady: function( hold ) { | |
+ if ( hold ) { | |
+ jQuery.readyWait++; | |
+ } else { | |
+ jQuery.ready( true ); | |
+ } | |
+ }, | |
+ | |
+ // Handle when the DOM is ready | |
+ ready: function( wait ) { | |
+ // Either a released hold or an DOMready/load event and not ye… | |
+ if ( (wait === true && !--jQuery.readyWait) || (wait !== true … | |
+ // Make sure body exists, at least, in case IE gets a … | |
+ if ( !document.body ) { | |
+ return setTimeout( jQuery.ready, 1 ); | |
+ } | |
+ | |
+ // Remember that the DOM is ready | |
+ jQuery.isReady = true; | |
+ | |
+ // If a normal DOM Ready event fired, decrement, and w… | |
+ if ( wait !== true && --jQuery.readyWait > 0 ) { | |
+ return; | |
+ } | |
+ | |
+ // If there are functions bound, to execute | |
+ readyList.fireWith( document, [ jQuery ] ); | |
+ | |
+ // Trigger any bound ready events | |
+ if ( jQuery.fn.trigger ) { | |
+ jQuery( document ).trigger( "ready" ).off( "re… | |
+ } | |
+ } | |
+ }, | |
+ | |
+ bindReady: function() { | |
+ if ( readyList ) { | |
+ return; | |
+ } | |
+ | |
+ readyList = jQuery.Callbacks( "once memory" ); | |
+ | |
+ // Catch cases where $(document).ready() is called after the | |
+ // browser event has already occurred. | |
+ if ( document.readyState === "complete" ) { | |
+ // Handle it asynchronously to allow scripts the oppor… | |
+ return setTimeout( jQuery.ready, 1 ); | |
+ } | |
+ | |
+ // Mozilla, Opera and webkit nightlies currently support this … | |
+ if ( document.addEventListener ) { | |
+ // Use the handy event callback | |
+ document.addEventListener( "DOMContentLoaded", DOMCont… | |
+ | |
+ // A fallback to window.onload, that will always work | |
+ window.addEventListener( "load", jQuery.ready, false ); | |
+ | |
+ // If IE event model is used | |
+ } else if ( document.attachEvent ) { | |
+ // ensure firing before onload, | |
+ // maybe late but safe also for iframes | |
+ document.attachEvent( "onreadystatechange", DOMContent… | |
+ | |
+ // A fallback to window.onload, that will always work | |
+ window.attachEvent( "onload", jQuery.ready ); | |
+ | |
+ // If IE and not a frame | |
+ // continually check to see if the document is ready | |
+ var toplevel = false; | |
+ | |
+ try { | |
+ toplevel = window.frameElement == null; | |
+ } catch(e) {} | |
+ | |
+ if ( document.documentElement.doScroll && toplevel ) { | |
+ doScrollCheck(); | |
+ } | |
+ } | |
+ }, | |
+ | |
+ // See test/unit/core.js for details concerning isFunction. | |
+ // Since version 1.3, DOM methods and functions like alert | |
+ // aren't supported. They return false on IE (#2968). | |
+ isFunction: function( obj ) { | |
+ return jQuery.type(obj) === "function"; | |
+ }, | |
+ | |
+ isArray: Array.isArray || function( obj ) { | |
+ return jQuery.type(obj) === "array"; | |
+ }, | |
+ | |
+ isWindow: function( obj ) { | |
+ return obj != null && obj == obj.window; | |
+ }, | |
+ | |
+ isNumeric: function( obj ) { | |
+ return !isNaN( parseFloat(obj) ) && isFinite( obj ); | |
+ }, | |
+ | |
+ type: function( obj ) { | |
+ return obj == null ? | |
+ String( obj ) : | |
+ class2type[ toString.call(obj) ] || "object"; | |
+ }, | |
+ | |
+ isPlainObject: function( obj ) { | |
+ // Must be an Object. | |
+ // Because of IE, we also have to check the presence of the co… | |
+ // Make sure that DOM nodes and window objects don't pass thro… | |
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || … | |
+ return false; | |
+ } | |
+ | |
+ try { | |
+ // Not own constructor property must be Object | |
+ if ( obj.constructor && | |
+ !hasOwn.call(obj, "constructor") && | |
+ !hasOwn.call(obj.constructor.prototype, "isPro… | |
+ return false; | |
+ } | |
+ } catch ( e ) { | |
+ // IE8,9 Will throw exceptions on certain host objects… | |
+ return false; | |
+ } | |
+ | |
+ // Own properties are enumerated firstly, so to speed up, | |
+ // if last one is own, then all properties are own. | |
+ | |
+ var key; | |
+ for ( key in obj ) {} | |
+ | |
+ return key === undefined || hasOwn.call( obj, key ); | |
+ }, | |
+ | |
+ isEmptyObject: function( obj ) { | |
+ for ( var name in obj ) { | |
+ return false; | |
+ } | |
+ return true; | |
+ }, | |
+ | |
+ error: function( msg ) { | |
+ throw new Error( msg ); | |
+ }, | |
+ | |
+ parseJSON: function( data ) { | |
+ if ( typeof data !== "string" || !data ) { | |
+ return null; | |
+ } | |
+ | |
+ // Make sure leading/trailing whitespace is removed (IE can't … | |
+ data = jQuery.trim( data ); | |
+ | |
+ // Attempt to parse using the native JSON parser first | |
+ if ( window.JSON && window.JSON.parse ) { | |
+ return window.JSON.parse( data ); | |
+ } | |
+ | |
+ // Make sure the incoming data is actual JSON | |
+ // Logic borrowed from http://json.org/json2.js | |
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" ) | |
+ .replace( rvalidtokens, "]" ) | |
+ .replace( rvalidbraces, "")) ) { | |
+ | |
+ return ( new Function( "return " + data ) )(); | |
+ | |
+ } | |
+ jQuery.error( "Invalid JSON: " + data ); | |
+ }, | |
+ | |
+ // Cross-browser xml parsing | |
+ parseXML: function( data ) { | |
+ if ( typeof data !== "string" || !data ) { | |
+ return null; | |
+ } | |
+ var xml, tmp; | |
+ try { | |
+ if ( window.DOMParser ) { // Standard | |
+ tmp = new DOMParser(); | |
+ xml = tmp.parseFromString( data , "text/xml" ); | |
+ } else { // IE | |
+ xml = new ActiveXObject( "Microsoft.XMLDOM" ); | |
+ xml.async = "false"; | |
+ xml.loadXML( data ); | |
+ } | |
+ } catch( e ) { | |
+ xml = undefined; | |
+ } | |
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName(… | |
+ jQuery.error( "Invalid XML: " + data ); | |
+ } | |
+ return xml; | |
+ }, | |
+ | |
+ noop: function() {}, | |
+ | |
+ // Evaluates a script in a global context | |
+ // Workarounds based on findings by Jim Driscoll | |
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javas… | |
+ globalEval: function( data ) { | |
+ if ( data && rnotwhite.test( data ) ) { | |
+ // We use execScript on Internet Explorer | |
+ // We use an anonymous function so that context is win… | |
+ // rather than jQuery in Firefox | |
+ ( window.execScript || function( data ) { | |
+ window[ "eval" ].call( window, data ); | |
+ } )( data ); | |
+ } | |
+ }, | |
+ | |
+ // Convert dashed to camelCase; used by the css and data modules | |
+ // Microsoft forgot to hump their vendor prefix (#9572) | |
+ camelCase: function( string ) { | |
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha,… | |
+ }, | |
+ | |
+ nodeName: function( elem, name ) { | |
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.t… | |
+ }, | |
+ | |
+ // args is for internal usage only | |
+ each: function( object, callback, args ) { | |
+ var name, i = 0, | |
+ length = object.length, | |
+ isObj = length === undefined || jQuery.isFunction( obj… | |
+ | |
+ if ( args ) { | |
+ if ( isObj ) { | |
+ for ( name in object ) { | |
+ if ( callback.apply( object[ name ], a… | |
+ break; | |
+ } | |
+ } | |
+ } else { | |
+ for ( ; i < length; ) { | |
+ if ( callback.apply( object[ i++ ], ar… | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ | |
+ // A special, fast, case for the most common use of each | |
+ } else { | |
+ if ( isObj ) { | |
+ for ( name in object ) { | |
+ if ( callback.call( object[ name ], na… | |
+ break; | |
+ } | |
+ } | |
+ } else { | |
+ for ( ; i < length; ) { | |
+ if ( callback.call( object[ i ], i, ob… | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ return object; | |
+ }, | |
+ | |
+ // Use native String.trim function wherever possible | |
+ trim: trim ? | |
+ function( text ) { | |
+ return text == null ? | |
+ "" : | |
+ trim.call( text ); | |
+ } : | |
+ | |
+ // Otherwise use our own trimming functionality | |
+ function( text ) { | |
+ return text == null ? | |
+ "" : | |
+ text.toString().replace( trimLeft, "" ).replac… | |
+ }, | |
+ | |
+ // results is for internal usage only | |
+ makeArray: function( array, results ) { | |
+ var ret = results || []; | |
+ | |
+ if ( array != null ) { | |
+ // The window, strings (and functions) also have 'leng… | |
+ // Tweaked logic slightly to handle Blackberry 4.7 Reg… | |
+ var type = jQuery.type( array ); | |
+ | |
+ if ( array.length == null || type === "string" || type… | |
+ push.call( ret, array ); | |
+ } else { | |
+ jQuery.merge( ret, array ); | |
+ } | |
+ } | |
+ | |
+ return ret; | |
+ }, | |
+ | |
+ inArray: function( elem, array, i ) { | |
+ var len; | |
+ | |
+ if ( array ) { | |
+ if ( indexOf ) { | |
+ return indexOf.call( array, elem, i ); | |
+ } | |
+ | |
+ len = array.length; | |
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; | |
+ | |
+ for ( ; i < len; i++ ) { | |
+ // Skip accessing in sparse arrays | |
+ if ( i in array && array[ i ] === elem ) { | |
+ return i; | |
+ } | |
+ } | |
+ } | |
+ | |
+ return -1; | |
+ }, | |
+ | |
+ merge: function( first, second ) { | |
+ var i = first.length, | |
+ j = 0; | |
+ | |
+ if ( typeof second.length === "number" ) { | |
+ for ( var l = second.length; j < l; j++ ) { | |
+ first[ i++ ] = second[ j ]; | |
+ } | |
+ | |
+ } else { | |
+ while ( second[j] !== undefined ) { | |
+ first[ i++ ] = second[ j++ ]; | |
+ } | |
+ } | |
+ | |
+ first.length = i; | |
+ | |
+ return first; | |
+ }, | |
+ | |
+ grep: function( elems, callback, inv ) { | |
+ var ret = [], retVal; | |
+ inv = !!inv; | |
+ | |
+ // Go through the array, only saving the items | |
+ // that pass the validator function | |
+ for ( var i = 0, length = elems.length; i < length; i++ ) { | |
+ retVal = !!callback( elems[ i ], i ); | |
+ if ( inv !== retVal ) { | |
+ ret.push( elems[ i ] ); | |
+ } | |
+ } | |
+ | |
+ return ret; | |
+ }, | |
+ | |
+ // arg is for internal usage only | |
+ map: function( elems, callback, arg ) { | |
+ var value, key, ret = [], | |
+ i = 0, | |
+ length = elems.length, | |
+ // jquery objects are treated as arrays | |
+ isArray = elems instanceof jQuery || length !== undefi… | |
+ | |
+ // Go through the array, translating each of the items to their | |
+ if ( isArray ) { | |
+ for ( ; i < length; i++ ) { | |
+ value = callback( elems[ i ], i, arg ); | |
+ | |
+ if ( value != null ) { | |
+ ret[ ret.length ] = value; | |
+ } | |
+ } | |
+ | |
+ // Go through every key on the object, | |
+ } else { | |
+ for ( key in elems ) { | |
+ value = callback( elems[ key ], key, arg ); | |
+ | |
+ if ( value != null ) { | |
+ ret[ ret.length ] = value; | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Flatten any nested arrays | |
+ return ret.concat.apply( [], ret ); | |
+ }, | |
+ | |
+ // A global GUID counter for objects | |
+ guid: 1, | |
+ | |
+ // Bind a function to a context, optionally partially applying any | |
+ // arguments. | |
+ proxy: function( fn, context ) { | |
+ if ( typeof context === "string" ) { | |
+ var tmp = fn[ context ]; | |
+ context = fn; | |
+ fn = tmp; | |
+ } | |
+ | |
+ // Quick check to determine if target is callable, in the spec | |
+ // this throws a TypeError, but we will just return undefined. | |
+ if ( !jQuery.isFunction( fn ) ) { | |
+ return undefined; | |
+ } | |
+ | |
+ // Simulated bind | |
+ var args = slice.call( arguments, 2 ), | |
+ proxy = function() { | |
+ return fn.apply( context, args.concat( slice.c… | |
+ }; | |
+ | |
+ // Set the guid of unique handler to the same of original hand… | |
+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; | |
+ | |
+ return proxy; | |
+ }, | |
+ | |
+ // Mutifunctional method to get and set values to a collection | |
+ // The value/s can optionally be executed if it's a function | |
+ access: function( elems, fn, key, value, chainable, emptyGet, pass ) { | |
+ var exec, | |
+ bulk = key == null, | |
+ i = 0, | |
+ length = elems.length; | |
+ | |
+ // Sets many values | |
+ if ( key && typeof key === "object" ) { | |
+ for ( i in key ) { | |
+ jQuery.access( elems, fn, i, key[i], 1, emptyG… | |
+ } | |
+ chainable = 1; | |
+ | |
+ // Sets one value | |
+ } else if ( value !== undefined ) { | |
+ // Optionally, function values get executed if exec is… | |
+ exec = pass === undefined && jQuery.isFunction( value … | |
+ | |
+ if ( bulk ) { | |
+ // Bulk operations only iterate when executing… | |
+ if ( exec ) { | |
+ exec = fn; | |
+ fn = function( elem, key, value ) { | |
+ return exec.call( jQuery( elem… | |
+ }; | |
+ | |
+ // Otherwise they run against the entire set | |
+ } else { | |
+ fn.call( elems, value ); | |
+ fn = null; | |
+ } | |
+ } | |
+ | |
+ if ( fn ) { | |
+ for (; i < length; i++ ) { | |
+ fn( elems[i], key, exec ? value.call( … | |
+ } | |
+ } | |
+ | |
+ chainable = 1; | |
+ } | |
+ | |
+ return chainable ? | |
+ elems : | |
+ | |
+ // Gets | |
+ bulk ? | |
+ fn.call( elems ) : | |
+ length ? fn( elems[0], key ) : emptyGet; | |
+ }, | |
+ | |
+ now: function() { | |
+ return ( new Date() ).getTime(); | |
+ }, | |
+ | |
+ // Use of jQuery.browser is frowned upon. | |
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser | |
+ uaMatch: function( ua ) { | |
+ ua = ua.toLowerCase(); | |
+ | |
+ var match = rwebkit.exec( ua ) || | |
+ ropera.exec( ua ) || | |
+ rmsie.exec( ua ) || | |
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || | |
+ []; | |
+ | |
+ return { browser: match[1] || "", version: match[2] || "0" }; | |
+ }, | |
+ | |
+ sub: function() { | |
+ function jQuerySub( selector, context ) { | |
+ return new jQuerySub.fn.init( selector, context ); | |
+ } | |
+ jQuery.extend( true, jQuerySub, this ); | |
+ jQuerySub.superclass = this; | |
+ jQuerySub.fn = jQuerySub.prototype = this(); | |
+ jQuerySub.fn.constructor = jQuerySub; | |
+ jQuerySub.sub = this.sub; | |
+ jQuerySub.fn.init = function init( selector, context ) { | |
+ if ( context && context instanceof jQuery && !(context… | |
+ context = jQuerySub( context ); | |
+ } | |
+ | |
+ return jQuery.fn.init.call( this, selector, context, r… | |
+ }; | |
+ jQuerySub.fn.init.prototype = jQuerySub.fn; | |
+ var rootjQuerySub = jQuerySub(document); | |
+ return jQuerySub; | |
+ }, | |
+ | |
+ browser: {} | |
+}); | |
+ | |
+// Populate the class2type map | |
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" … | |
+ class2type[ "[object " + name + "]" ] = name.toLowerCase(); | |
+}); | |
+ | |
+browserMatch = jQuery.uaMatch( userAgent ); | |
+if ( browserMatch.browser ) { | |
+ jQuery.browser[ browserMatch.browser ] = true; | |
+ jQuery.browser.version = browserMatch.version; | |
+} | |
+ | |
+// Deprecated, use jQuery.browser.webkit instead | |
+if ( jQuery.browser.webkit ) { | |
+ jQuery.browser.safari = true; | |
+} | |
+ | |
+// IE doesn't match non-breaking spaces with \s | |
+if ( rnotwhite.test( "\xA0" ) ) { | |
+ trimLeft = /^[\s\xA0]+/; | |
+ trimRight = /[\s\xA0]+$/; | |
+} | |
+ | |
+// All jQuery objects should point back to these | |
+rootjQuery = jQuery(document); | |
+ | |
+// Cleanup functions for the document ready method | |
+if ( document.addEventListener ) { | |
+ DOMContentLoaded = function() { | |
+ document.removeEventListener( "DOMContentLoaded", DOMContentLo… | |
+ jQuery.ready(); | |
+ }; | |
+ | |
+} else if ( document.attachEvent ) { | |
+ DOMContentLoaded = function() { | |
+ // Make sure body exists, at least, in case IE gets a little o… | |
+ if ( document.readyState === "complete" ) { | |
+ document.detachEvent( "onreadystatechange", DOMContent… | |
+ jQuery.ready(); | |
+ } | |
+ }; | |
+} | |
+ | |
+// The DOM ready check for Internet Explorer | |
+function doScrollCheck() { | |
+ if ( jQuery.isReady ) { | |
+ return; | |
+ } | |
+ | |
+ try { | |
+ // If IE is used, use the trick by Diego Perini | |
+ // http://javascript.nwbox.com/IEContentLoaded/ | |
+ document.documentElement.doScroll("left"); | |
+ } catch(e) { | |
+ setTimeout( doScrollCheck, 1 ); | |
+ return; | |
+ } | |
+ | |
+ // and execute any waiting functions | |
+ jQuery.ready(); | |
+} | |
+ | |
+return jQuery; | |
+ | |
+})(); | |
+ | |
+ | |
+// String to Object flags format cache | |
+var flagsCache = {}; | |
+ | |
+// Convert String-formatted flags into Object-formatted ones and store in cache | |
+function createFlags( flags ) { | |
+ var object = flagsCache[ flags ] = {}, | |
+ i, length; | |
+ flags = flags.split( /\s+/ ); | |
+ for ( i = 0, length = flags.length; i < length; i++ ) { | |
+ object[ flags[i] ] = true; | |
+ } | |
+ return object; | |
+} | |
+ | |
+/* | |
+ * Create a callback list using the following parameters: | |
+ * | |
+ * flags: an optional list of space-separated flags that will ch… | |
+ * the callback list behaves | |
+ * | |
+ * By default a callback list will act like an event callback list and can be | |
+ * "fired" multiple times. | |
+ * | |
+ * Possible flags: | |
+ * | |
+ * once: will ensure the callback list can only … | |
+ * | |
+ * memory: will keep track of previous values an… | |
+ * after the list has been fired right … | |
+ * values (like a Deferred) | |
+ * | |
+ * unique: will ensure a callback can only be ad… | |
+ * | |
+ * stopOnFalse: interrupt callings when a callback returns false | |
+ * | |
+ */ | |
+jQuery.Callbacks = function( flags ) { | |
+ | |
+ // Convert flags from String-formatted to Object-formatted | |
+ // (we check in cache first) | |
+ flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; | |
+ | |
+ var // Actual callback list | |
+ list = [], | |
+ // Stack of fire calls for repeatable lists | |
+ stack = [], | |
+ // Last fire value (for non-forgettable lists) | |
+ memory, | |
+ // Flag to know if list was already fired | |
+ fired, | |
+ // Flag to know if list is currently firing | |
+ firing, | |
+ // First callback to fire (used internally by add and fireWith) | |
+ firingStart, | |
+ // End of the loop when firing | |
+ firingLength, | |
+ // Index of currently firing callback (modified by remove if n… | |
+ firingIndex, | |
+ // Add one or several callbacks to the list | |
+ add = function( args ) { | |
+ var i, | |
+ length, | |
+ elem, | |
+ type, | |
+ actual; | |
+ for ( i = 0, length = args.length; i < length; i++ ) { | |
+ elem = args[ i ]; | |
+ type = jQuery.type( elem ); | |
+ if ( type === "array" ) { | |
+ // Inspect recursively | |
+ add( elem ); | |
+ } else if ( type === "function" ) { | |
+ // Add if not in unique mode and callb… | |
+ if ( !flags.unique || !self.has( elem … | |
+ list.push( elem ); | |
+ } | |
+ } | |
+ } | |
+ }, | |
+ // Fire callbacks | |
+ fire = function( context, args ) { | |
+ args = args || []; | |
+ memory = !flags.memory || [ context, args ]; | |
+ fired = true; | |
+ firing = true; | |
+ firingIndex = firingStart || 0; | |
+ firingStart = 0; | |
+ firingLength = list.length; | |
+ for ( ; list && firingIndex < firingLength; firingInde… | |
+ if ( list[ firingIndex ].apply( context, args … | |
+ memory = true; // Mark as halted | |
+ break; | |
+ } | |
+ } | |
+ firing = false; | |
+ if ( list ) { | |
+ if ( !flags.once ) { | |
+ if ( stack && stack.length ) { | |
+ memory = stack.shift(); | |
+ self.fireWith( memory[ 0 ], me… | |
+ } | |
+ } else if ( memory === true ) { | |
+ self.disable(); | |
+ } else { | |
+ list = []; | |
+ } | |
+ } | |
+ }, | |
+ // Actual Callbacks object | |
+ self = { | |
+ // Add a callback or a collection of callbacks to the … | |
+ add: function() { | |
+ if ( list ) { | |
+ var length = list.length; | |
+ add( arguments ); | |
+ // Do we need to add the callbacks to … | |
+ // current firing batch? | |
+ if ( firing ) { | |
+ firingLength = list.length; | |
+ // With memory, if we're not firing th… | |
+ // we should call right away, unless p… | |
+ // firing was halted (stopOnFalse) | |
+ } else if ( memory && memory !== true … | |
+ firingStart = length; | |
+ fire( memory[ 0 ], memory[ 1 ]… | |
+ } | |
+ } | |
+ return this; | |
+ }, | |
+ // Remove a callback from the list | |
+ remove: function() { | |
+ if ( list ) { | |
+ var args = arguments, | |
+ argIndex = 0, | |
+ argLength = args.length; | |
+ for ( ; argIndex < argLength ; argInde… | |
+ for ( var i = 0; i < list.leng… | |
+ if ( args[ argIndex ] … | |
+ // Handle firi… | |
+ if ( firing ) { | |
+ if ( i… | |
+ … | |
+ … | |
+ … | |
+ … | |
+ } | |
+ } | |
+ // Remove the … | |
+ list.splice( i… | |
+ // If we have … | |
+ // we only nee… | |
+ if ( flags.uni… | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ } | |
+ return this; | |
+ }, | |
+ // Control if a given callback is in the list | |
+ has: function( fn ) { | |
+ if ( list ) { | |
+ var i = 0, | |
+ length = list.length; | |
+ for ( ; i < length; i++ ) { | |
+ if ( fn === list[ i ] ) { | |
+ return true; | |
+ } | |
+ } | |
+ } | |
+ return false; | |
+ }, | |
+ // Remove all callbacks from the list | |
+ empty: function() { | |
+ list = []; | |
+ return this; | |
+ }, | |
+ // Have the list do nothing anymore | |
+ disable: function() { | |
+ list = stack = memory = undefined; | |
+ return this; | |
+ }, | |
+ // Is it disabled? | |
+ disabled: function() { | |
+ return !list; | |
+ }, | |
+ // Lock the list in its current state | |
+ lock: function() { | |
+ stack = undefined; | |
+ if ( !memory || memory === true ) { | |
+ self.disable(); | |
+ } | |
+ return this; | |
+ }, | |
+ // Is it locked? | |
+ locked: function() { | |
+ return !stack; | |
+ }, | |
+ // Call all callbacks with the given context and argum… | |
+ fireWith: function( context, args ) { | |
+ if ( stack ) { | |
+ if ( firing ) { | |
+ if ( !flags.once ) { | |
+ stack.push( [ context,… | |
+ } | |
+ } else if ( !( flags.once && memory ) … | |
+ fire( context, args ); | |
+ } | |
+ } | |
+ return this; | |
+ }, | |
+ // Call all the callbacks with the given arguments | |
+ fire: function() { | |
+ self.fireWith( this, arguments ); | |
+ return this; | |
+ }, | |
+ // To know if the callbacks have already been called a… | |
+ fired: function() { | |
+ return !!fired; | |
+ } | |
+ }; | |
+ | |
+ return self; | |
+}; | |
+ | |
+ | |
+ | |
+ | |
+var // Static reference to slice | |
+ sliceDeferred = [].slice; | |
+ | |
+jQuery.extend({ | |
+ | |
+ Deferred: function( func ) { | |
+ var doneList = jQuery.Callbacks( "once memory" ), | |
+ failList = jQuery.Callbacks( "once memory" ), | |
+ progressList = jQuery.Callbacks( "memory" ), | |
+ state = "pending", | |
+ lists = { | |
+ resolve: doneList, | |
+ reject: failList, | |
+ notify: progressList | |
+ }, | |
+ promise = { | |
+ done: doneList.add, | |
+ fail: failList.add, | |
+ progress: progressList.add, | |
+ | |
+ state: function() { | |
+ return state; | |
+ }, | |
+ | |
+ // Deprecated | |
+ isResolved: doneList.fired, | |
+ isRejected: failList.fired, | |
+ | |
+ then: function( doneCallbacks, failCallbacks, … | |
+ deferred.done( doneCallbacks ).fail( f… | |
+ return this; | |
+ }, | |
+ always: function() { | |
+ deferred.done.apply( deferred, argumen… | |
+ return this; | |
+ }, | |
+ pipe: function( fnDone, fnFail, fnProgress ) { | |
+ return jQuery.Deferred(function( newDe… | |
+ jQuery.each( { | |
+ done: [ fnDone, "resol… | |
+ fail: [ fnFail, "rejec… | |
+ progress: [ fnProgress… | |
+ }, function( handler, data ) { | |
+ var fn = data[ 0 ], | |
+ action = data[… | |
+ returned; | |
+ if ( jQuery.isFunction… | |
+ deferred[ hand… | |
+ return… | |
+ if ( r… | |
+ … | |
+ } else… | |
+ … | |
+ } | |
+ }); | |
+ } else { | |
+ deferred[ hand… | |
+ } | |
+ }); | |
+ }).promise(); | |
+ }, | |
+ // Get a promise for this deferred | |
+ // If obj is provided, the promise aspect is a… | |
+ promise: function( obj ) { | |
+ if ( obj == null ) { | |
+ obj = promise; | |
+ } else { | |
+ for ( var key in promise ) { | |
+ obj[ key ] = promise[ … | |
+ } | |
+ } | |
+ return obj; | |
+ } | |
+ }, | |
+ deferred = promise.promise({}), | |
+ key; | |
+ | |
+ for ( key in lists ) { | |
+ deferred[ key ] = lists[ key ].fire; | |
+ deferred[ key + "With" ] = lists[ key ].fireWith; | |
+ } | |
+ | |
+ // Handle state | |
+ deferred.done( function() { | |
+ state = "resolved"; | |
+ }, failList.disable, progressList.lock ).fail( function() { | |
+ state = "rejected"; | |
+ }, doneList.disable, progressList.lock ); | |
+ | |
+ // Call given func if any | |
+ if ( func ) { | |
+ func.call( deferred, deferred ); | |
+ } | |
+ | |
+ // All done! | |
+ return deferred; | |
+ }, | |
+ | |
+ // Deferred helper | |
+ when: function( firstParam ) { | |
+ var args = sliceDeferred.call( arguments, 0 ), | |
+ i = 0, | |
+ length = args.length, | |
+ pValues = new Array( length ), | |
+ count = length, | |
+ pCount = length, | |
+ deferred = length <= 1 && firstParam && jQuery.isFunct… | |
+ firstParam : | |
+ jQuery.Deferred(), | |
+ promise = deferred.promise(); | |
+ function resolveFunc( i ) { | |
+ return function( value ) { | |
+ args[ i ] = arguments.length > 1 ? sliceDeferr… | |
+ if ( !( --count ) ) { | |
+ deferred.resolveWith( deferred, args ); | |
+ } | |
+ }; | |
+ } | |
+ function progressFunc( i ) { | |
+ return function( value ) { | |
+ pValues[ i ] = arguments.length > 1 ? sliceDef… | |
+ deferred.notifyWith( promise, pValues ); | |
+ }; | |
+ } | |
+ if ( length > 1 ) { | |
+ for ( ; i < length; i++ ) { | |
+ if ( args[ i ] && args[ i ].promise && jQuery.… | |
+ args[ i ].promise().then( resolveFunc(… | |
+ } else { | |
+ --count; | |
+ } | |
+ } | |
+ if ( !count ) { | |
+ deferred.resolveWith( deferred, args ); | |
+ } | |
+ } else if ( deferred !== firstParam ) { | |
+ deferred.resolveWith( deferred, length ? [ firstParam … | |
+ } | |
+ return promise; | |
+ } | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+jQuery.support = (function() { | |
+ | |
+ var support, | |
+ all, | |
+ a, | |
+ select, | |
+ opt, | |
+ input, | |
+ fragment, | |
+ tds, | |
+ events, | |
+ eventName, | |
+ i, | |
+ isSupported, | |
+ div = document.createElement( "div" ), | |
+ documentElement = document.documentElement; | |
+ | |
+ // Preliminary tests | |
+ div.setAttribute("className", "t"); | |
+ div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;… | |
+ | |
+ all = div.getElementsByTagName( "*" ); | |
+ a = div.getElementsByTagName( "a" )[ 0 ]; | |
+ | |
+ // Can't get basic test support | |
+ if ( !all || !all.length || !a ) { | |
+ return {}; | |
+ } | |
+ | |
+ // First batch of supports tests | |
+ select = document.createElement( "select" ); | |
+ opt = select.appendChild( document.createElement("option") ); | |
+ input = div.getElementsByTagName( "input" )[ 0 ]; | |
+ | |
+ support = { | |
+ // IE strips leading whitespace when .innerHTML is used | |
+ leadingWhitespace: ( div.firstChild.nodeType === 3 ), | |
+ | |
+ // Make sure that tbody elements aren't automatically inserted | |
+ // IE will insert them into empty tables | |
+ tbody: !div.getElementsByTagName("tbody").length, | |
+ | |
+ // Make sure that link elements get serialized correctly by in… | |
+ // This requires a wrapper element in IE | |
+ htmlSerialize: !!div.getElementsByTagName("link").length, | |
+ | |
+ // Get the style information from getAttribute | |
+ // (IE uses .cssText instead) | |
+ style: /top/.test( a.getAttribute("style") ), | |
+ | |
+ // Make sure that URLs aren't manipulated | |
+ // (IE normalizes it by default) | |
+ hrefNormalized: ( a.getAttribute("href") === "/a" ), | |
+ | |
+ // Make sure that element opacity exists | |
+ // (IE uses filter instead) | |
+ // Use a regex to work around a WebKit issue. See #5145 | |
+ opacity: /^0.55/.test( a.style.opacity ), | |
+ | |
+ // Verify style float existence | |
+ // (IE uses styleFloat instead of cssFloat) | |
+ cssFloat: !!a.style.cssFloat, | |
+ | |
+ // Make sure that if no value is specified for a checkbox | |
+ // that it defaults to "on". | |
+ // (WebKit defaults to "" instead) | |
+ checkOn: ( input.value === "on" ), | |
+ | |
+ // Make sure that a selected-by-default option has a working s… | |
+ // (WebKit defaults to false instead of true, IE too, if it's … | |
+ optSelected: opt.selected, | |
+ | |
+ // Test setAttribute on camelCase class. If it works, we need … | |
+ getSetAttribute: div.className !== "t", | |
+ | |
+ // Tests for enctype support on a form(#6743) | |
+ enctype: !!document.createElement("form").enctype, | |
+ | |
+ // Makes sure cloning an html5 element does not cause problems | |
+ // Where outerHTML is undefined, this still works | |
+ html5Clone: document.createElement("nav").cloneNode( true ).ou… | |
+ | |
+ // Will be defined later | |
+ submitBubbles: true, | |
+ changeBubbles: true, | |
+ focusinBubbles: false, | |
+ deleteExpando: true, | |
+ noCloneEvent: true, | |
+ inlineBlockNeedsLayout: false, | |
+ shrinkWrapBlocks: false, | |
+ reliableMarginRight: true, | |
+ pixelMargin: true | |
+ }; | |
+ | |
+ // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel inst… | |
+ jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Com… | |
+ | |
+ // Make sure checked status is properly cloned | |
+ input.checked = true; | |
+ support.noCloneChecked = input.cloneNode( true ).checked; | |
+ | |
+ // Make sure that the options inside disabled selects aren't marked as… | |
+ // (WebKit marks them as disabled) | |
+ select.disabled = true; | |
+ support.optDisabled = !opt.disabled; | |
+ | |
+ // Test to see if it's possible to delete an expando from an element | |
+ // Fails in Internet Explorer | |
+ try { | |
+ delete div.test; | |
+ } catch( e ) { | |
+ support.deleteExpando = false; | |
+ } | |
+ | |
+ if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { | |
+ div.attachEvent( "onclick", function() { | |
+ // Cloning a node shouldn't copy over any | |
+ // bound event handlers (IE does this) | |
+ support.noCloneEvent = false; | |
+ }); | |
+ div.cloneNode( true ).fireEvent( "onclick" ); | |
+ } | |
+ | |
+ // Check if a radio maintains its value | |
+ // after being appended to the DOM | |
+ input = document.createElement("input"); | |
+ input.value = "t"; | |
+ input.setAttribute("type", "radio"); | |
+ support.radioValue = input.value === "t"; | |
+ | |
+ input.setAttribute("checked", "checked"); | |
+ | |
+ // #11217 - WebKit loses check when the name is after the checked attr… | |
+ input.setAttribute( "name", "t" ); | |
+ | |
+ div.appendChild( input ); | |
+ fragment = document.createDocumentFragment(); | |
+ fragment.appendChild( div.lastChild ); | |
+ | |
+ // WebKit doesn't clone checked state correctly in fragments | |
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).last… | |
+ | |
+ // Check if a disconnected checkbox will retain its checked | |
+ // value of true after appended to the DOM (IE6/7) | |
+ support.appendChecked = input.checked; | |
+ | |
+ fragment.removeChild( input ); | |
+ fragment.appendChild( div ); | |
+ | |
+ // Technique from Juriy Zaytsev | |
+ // http://perfectionkills.com/detecting-event-support-without-browser-… | |
+ // We only care about the case where non-standard event systems | |
+ // are used, namely in IE. Short-circuiting here helps us to | |
+ // avoid an eval call (in setAttribute) which can cause CSP | |
+ // to go haywire. See: https://developer.mozilla.org/en/Security/CSP | |
+ if ( div.attachEvent ) { | |
+ for ( i in { | |
+ submit: 1, | |
+ change: 1, | |
+ focusin: 1 | |
+ }) { | |
+ eventName = "on" + i; | |
+ isSupported = ( eventName in div ); | |
+ if ( !isSupported ) { | |
+ div.setAttribute( eventName, "return;" ); | |
+ isSupported = ( typeof div[ eventName ] === "f… | |
+ } | |
+ support[ i + "Bubbles" ] = isSupported; | |
+ } | |
+ } | |
+ | |
+ fragment.removeChild( div ); | |
+ | |
+ // Null elements to avoid leaks in IE | |
+ fragment = select = opt = div = input = null; | |
+ | |
+ // Run tests that need a body at doc ready | |
+ jQuery(function() { | |
+ var container, outer, inner, table, td, offsetSupport, | |
+ marginDiv, conMarginTop, style, html, positionTopLeftW… | |
+ paddingMarginBorderVisibility, paddingMarginBorder, | |
+ body = document.getElementsByTagName("body")[0]; | |
+ | |
+ if ( !body ) { | |
+ // Return for frameset docs that don't have a body | |
+ return; | |
+ } | |
+ | |
+ conMarginTop = 1; | |
+ paddingMarginBorder = "padding:0;margin:0;border:"; | |
+ positionTopLeftWidthHeight = "position:absolute;top:0;left:0;w… | |
+ paddingMarginBorderVisibility = paddingMarginBorder + "0;visib… | |
+ style = "style='" + positionTopLeftWidthHeight + paddingMargin… | |
+ html = "<div " + style + "display:block;'><div style='" + padd… | |
+ "<table " + style + "' cellpadding='0' cellspacing='0'… | |
+ "<tr><td></td></tr></table>"; | |
+ | |
+ container = document.createElement("div"); | |
+ container.style.cssText = paddingMarginBorderVisibility + "wid… | |
+ body.insertBefore( container, body.firstChild ); | |
+ | |
+ // Construct the test element | |
+ div = document.createElement("div"); | |
+ container.appendChild( div ); | |
+ | |
+ // Check if table cells still have offsetWidth/Height when the… | |
+ // to display:none and there are still other visible table cel… | |
+ // table row; if so, offsetWidth/Height are not reliable for u… | |
+ // determining if an element has been hidden directly using | |
+ // display:none (it is still safe to use offsets if a parent e… | |
+ // hidden; don safety goggles and see bug #4512 for more infor… | |
+ // (only IE 8 fails this test) | |
+ div.innerHTML = "<table><tr><td style='" + paddingMarginBorder… | |
+ tds = div.getElementsByTagName( "td" ); | |
+ isSupported = ( tds[ 0 ].offsetHeight === 0 ); | |
+ | |
+ tds[ 0 ].style.display = ""; | |
+ tds[ 1 ].style.display = "none"; | |
+ | |
+ // Check if empty table cells still have offsetWidth/Height | |
+ // (IE <= 8 fail this test) | |
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offs… | |
+ | |
+ // Check if div with explicit width and no margin-right incorr… | |
+ // gets computed margin-right based on width of container. For… | |
+ // info see bug #3333 | |
+ // Fails in WebKit before Feb 2011 nightlies | |
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for… | |
+ if ( window.getComputedStyle ) { | |
+ div.innerHTML = ""; | |
+ marginDiv = document.createElement( "div" ); | |
+ marginDiv.style.width = "0"; | |
+ marginDiv.style.marginRight = "0"; | |
+ div.style.width = "2px"; | |
+ div.appendChild( marginDiv ); | |
+ support.reliableMarginRight = | |
+ ( parseInt( ( window.getComputedStyle( marginD… | |
+ } | |
+ | |
+ if ( typeof div.style.zoom !== "undefined" ) { | |
+ // Check if natively block-level elements act like inl… | |
+ // elements when setting their display to 'inline' and… | |
+ // them layout | |
+ // (IE < 8 does this) | |
+ div.innerHTML = ""; | |
+ div.style.width = div.style.padding = "1px"; | |
+ div.style.border = 0; | |
+ div.style.overflow = "hidden"; | |
+ div.style.display = "inline"; | |
+ div.style.zoom = 1; | |
+ support.inlineBlockNeedsLayout = ( div.offsetWidth ===… | |
+ | |
+ // Check if elements with layout shrink-wrap their chi… | |
+ // (IE 6 does this) | |
+ div.style.display = "block"; | |
+ div.style.overflow = "visible"; | |
+ div.innerHTML = "<div style='width:5px;'></div>"; | |
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); | |
+ } | |
+ | |
+ div.style.cssText = positionTopLeftWidthHeight + paddingMargin… | |
+ div.innerHTML = html; | |
+ | |
+ outer = div.firstChild; | |
+ inner = outer.firstChild; | |
+ td = outer.nextSibling.firstChild.firstChild; | |
+ | |
+ offsetSupport = { | |
+ doesNotAddBorder: ( inner.offsetTop !== 5 ), | |
+ doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) | |
+ }; | |
+ | |
+ inner.style.position = "fixed"; | |
+ inner.style.top = "20px"; | |
+ | |
+ // safari subtracts parent border width here which is 5px | |
+ offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inne… | |
+ inner.style.position = inner.style.top = ""; | |
+ | |
+ outer.style.overflow = "hidden"; | |
+ outer.style.position = "relative"; | |
+ | |
+ offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.o… | |
+ offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offset… | |
+ | |
+ if ( window.getComputedStyle ) { | |
+ div.style.marginTop = "1%"; | |
+ support.pixelMargin = ( window.getComputedStyle( div, … | |
+ } | |
+ | |
+ if ( typeof container.style.zoom !== "undefined" ) { | |
+ container.style.zoom = 1; | |
+ } | |
+ | |
+ body.removeChild( container ); | |
+ marginDiv = div = container = null; | |
+ | |
+ jQuery.extend( support, offsetSupport ); | |
+ }); | |
+ | |
+ return support; | |
+})(); | |
+ | |
+ | |
+ | |
+ | |
+var rbrace = /^(?:\{.*\}|\[.*\])$/, | |
+ rmultiDash = /([A-Z])/g; | |
+ | |
+jQuery.extend({ | |
+ cache: {}, | |
+ | |
+ // Please use with caution | |
+ uuid: 0, | |
+ | |
+ // Unique for each copy of jQuery on the page | |
+ // Non-digits removed to match rinlinejQuery | |
+ expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/… | |
+ | |
+ // The following elements throw uncatchable exceptions if you | |
+ // attempt to add expando properties to them. | |
+ noData: { | |
+ "embed": true, | |
+ // Ban all objects except for Flash (which handle expandos) | |
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", | |
+ "applet": true | |
+ }, | |
+ | |
+ hasData: function( elem ) { | |
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : … | |
+ return !!elem && !isEmptyDataObject( elem ); | |
+ }, | |
+ | |
+ data: function( elem, name, data, pvt /* Internal Use Only */ ) { | |
+ if ( !jQuery.acceptData( elem ) ) { | |
+ return; | |
+ } | |
+ | |
+ var privateCache, thisCache, ret, | |
+ internalKey = jQuery.expando, | |
+ getByName = typeof name === "string", | |
+ | |
+ // We have to handle DOM nodes and JS objects differen… | |
+ // can't GC object references properly across the DOM-… | |
+ isNode = elem.nodeType, | |
+ | |
+ // Only DOM nodes need the global jQuery cache; JS obj… | |
+ // attached directly to the object so GC can occur aut… | |
+ cache = isNode ? jQuery.cache : elem, | |
+ | |
+ // Only defining an ID for JS objects if its cache alr… | |
+ // the code to shortcut on the same path as a DOM node… | |
+ id = isNode ? elem[ internalKey ] : elem[ internalKey … | |
+ isEvents = name === "events"; | |
+ | |
+ // Avoid doing any more work than we need to when trying to ge… | |
+ // object that has no data at all | |
+ if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].da… | |
+ return; | |
+ } | |
+ | |
+ if ( !id ) { | |
+ // Only DOM nodes need a new unique ID for each elemen… | |
+ // ends up in the global cache | |
+ if ( isNode ) { | |
+ elem[ internalKey ] = id = ++jQuery.uuid; | |
+ } else { | |
+ id = internalKey; | |
+ } | |
+ } | |
+ | |
+ if ( !cache[ id ] ) { | |
+ cache[ id ] = {}; | |
+ | |
+ // Avoids exposing jQuery metadata on plain JS objects… | |
+ // is serialized using JSON.stringify | |
+ if ( !isNode ) { | |
+ cache[ id ].toJSON = jQuery.noop; | |
+ } | |
+ } | |
+ | |
+ // An object can be passed to jQuery.data instead of a key/val… | |
+ // shallow copied over onto the existing cache | |
+ if ( typeof name === "object" || typeof name === "function" ) { | |
+ if ( pvt ) { | |
+ cache[ id ] = jQuery.extend( cache[ id ], name… | |
+ } else { | |
+ cache[ id ].data = jQuery.extend( cache[ id ].… | |
+ } | |
+ } | |
+ | |
+ privateCache = thisCache = cache[ id ]; | |
+ | |
+ // jQuery data() is stored in a separate object inside the obj… | |
+ // cache in order to avoid key collisions between internal dat… | |
+ // data. | |
+ if ( !pvt ) { | |
+ if ( !thisCache.data ) { | |
+ thisCache.data = {}; | |
+ } | |
+ | |
+ thisCache = thisCache.data; | |
+ } | |
+ | |
+ if ( data !== undefined ) { | |
+ thisCache[ jQuery.camelCase( name ) ] = data; | |
+ } | |
+ | |
+ // Users should not attempt to inspect the internal events obj… | |
+ // it is undocumented and subject to change. But does anyone l… | |
+ if ( isEvents && !thisCache[ name ] ) { | |
+ return privateCache.events; | |
+ } | |
+ | |
+ // Check for both converted-to-camel and non-converted data pr… | |
+ // If a data property was specified | |
+ if ( getByName ) { | |
+ | |
+ // First Try to find as-is property data | |
+ ret = thisCache[ name ]; | |
+ | |
+ // Test for null|undefined property data | |
+ if ( ret == null ) { | |
+ | |
+ // Try to find the camelCased property | |
+ ret = thisCache[ jQuery.camelCase( name ) ]; | |
+ } | |
+ } else { | |
+ ret = thisCache; | |
+ } | |
+ | |
+ return ret; | |
+ }, | |
+ | |
+ removeData: function( elem, name, pvt /* Internal Use Only */ ) { | |
+ if ( !jQuery.acceptData( elem ) ) { | |
+ return; | |
+ } | |
+ | |
+ var thisCache, i, l, | |
+ | |
+ // Reference to internal data cache key | |
+ internalKey = jQuery.expando, | |
+ | |
+ isNode = elem.nodeType, | |
+ | |
+ // See jQuery.data for more information | |
+ cache = isNode ? jQuery.cache : elem, | |
+ | |
+ // See jQuery.data for more information | |
+ id = isNode ? elem[ internalKey ] : internalKey; | |
+ | |
+ // If there is already no cache entry for this object, there i… | |
+ // purpose in continuing | |
+ if ( !cache[ id ] ) { | |
+ return; | |
+ } | |
+ | |
+ if ( name ) { | |
+ | |
+ thisCache = pvt ? cache[ id ] : cache[ id ].data; | |
+ | |
+ if ( thisCache ) { | |
+ | |
+ // Support array or space separated string nam… | |
+ if ( !jQuery.isArray( name ) ) { | |
+ | |
+ // try the string as a key before any … | |
+ if ( name in thisCache ) { | |
+ name = [ name ]; | |
+ } else { | |
+ | |
+ // split the camel cased versi… | |
+ name = jQuery.camelCase( name … | |
+ if ( name in thisCache ) { | |
+ name = [ name ]; | |
+ } else { | |
+ name = name.split( " "… | |
+ } | |
+ } | |
+ } | |
+ | |
+ for ( i = 0, l = name.length; i < l; i++ ) { | |
+ delete thisCache[ name[i] ]; | |
+ } | |
+ | |
+ // If there is no data left in the cache, we w… | |
+ // and let the cache object itself get destroy… | |
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmp… | |
+ return; | |
+ } | |
+ } | |
+ } | |
+ | |
+ // See jQuery.data for more information | |
+ if ( !pvt ) { | |
+ delete cache[ id ].data; | |
+ | |
+ // Don't destroy the parent cache unless the internal … | |
+ // had been the only thing left in it | |
+ if ( !isEmptyDataObject(cache[ id ]) ) { | |
+ return; | |
+ } | |
+ } | |
+ | |
+ // Browsers that fail expando deletion also refuse to delete e… | |
+ // the window, but it will allow it on all other JS objects; o… | |
+ // don't care | |
+ // Ensure that `cache` is not a window object #10080 | |
+ if ( jQuery.support.deleteExpando || !cache.setInterval ) { | |
+ delete cache[ id ]; | |
+ } else { | |
+ cache[ id ] = null; | |
+ } | |
+ | |
+ // We destroyed the cache and need to eliminate the expando on… | |
+ // false lookups in the cache for entries that no longer exist | |
+ if ( isNode ) { | |
+ // IE does not allow us to delete expando properties f… | |
+ // nor does it have a removeAttribute function on Docu… | |
+ // we must handle all of these cases | |
+ if ( jQuery.support.deleteExpando ) { | |
+ delete elem[ internalKey ]; | |
+ } else if ( elem.removeAttribute ) { | |
+ elem.removeAttribute( internalKey ); | |
+ } else { | |
+ elem[ internalKey ] = null; | |
+ } | |
+ } | |
+ }, | |
+ | |
+ // For internal use only. | |
+ _data: function( elem, name, data ) { | |
+ return jQuery.data( elem, name, data, true ); | |
+ }, | |
+ | |
+ // A method for determining if a DOM node can handle the data expando | |
+ acceptData: function( elem ) { | |
+ if ( elem.nodeName ) { | |
+ var match = jQuery.noData[ elem.nodeName.toLowerCase()… | |
+ | |
+ if ( match ) { | |
+ return !(match === true || elem.getAttribute("… | |
+ } | |
+ } | |
+ | |
+ return true; | |
+ } | |
+}); | |
+ | |
+jQuery.fn.extend({ | |
+ data: function( key, value ) { | |
+ var parts, part, attr, name, l, | |
+ elem = this[0], | |
+ i = 0, | |
+ data = null; | |
+ | |
+ // Gets all values | |
+ if ( key === undefined ) { | |
+ if ( this.length ) { | |
+ data = jQuery.data( elem ); | |
+ | |
+ if ( elem.nodeType === 1 && !jQuery._data( ele… | |
+ attr = elem.attributes; | |
+ for ( l = attr.length; i < l; i++ ) { | |
+ name = attr[i].name; | |
+ | |
+ if ( name.indexOf( "data-" ) =… | |
+ name = jQuery.camelCas… | |
+ | |
+ dataAttr( elem, name, … | |
+ } | |
+ } | |
+ jQuery._data( elem, "parsedAttrs", tru… | |
+ } | |
+ } | |
+ | |
+ return data; | |
+ } | |
+ | |
+ // Sets multiple values | |
+ if ( typeof key === "object" ) { | |
+ return this.each(function() { | |
+ jQuery.data( this, key ); | |
+ }); | |
+ } | |
+ | |
+ parts = key.split( ".", 2 ); | |
+ parts[1] = parts[1] ? "." + parts[1] : ""; | |
+ part = parts[1] + "!"; | |
+ | |
+ return jQuery.access( this, function( value ) { | |
+ | |
+ if ( value === undefined ) { | |
+ data = this.triggerHandler( "getData" + part, … | |
+ | |
+ // Try to fetch any internally stored data fir… | |
+ if ( data === undefined && elem ) { | |
+ data = jQuery.data( elem, key ); | |
+ data = dataAttr( elem, key, data ); | |
+ } | |
+ | |
+ return data === undefined && parts[1] ? | |
+ this.data( parts[0] ) : | |
+ data; | |
+ } | |
+ | |
+ parts[1] = value; | |
+ this.each(function() { | |
+ var self = jQuery( this ); | |
+ | |
+ self.triggerHandler( "setData" + part, parts ); | |
+ jQuery.data( this, key, value ); | |
+ self.triggerHandler( "changeData" + part, part… | |
+ }); | |
+ }, null, value, arguments.length > 1, null, false ); | |
+ }, | |
+ | |
+ removeData: function( key ) { | |
+ return this.each(function() { | |
+ jQuery.removeData( this, key ); | |
+ }); | |
+ } | |
+}); | |
+ | |
+function dataAttr( elem, key, data ) { | |
+ // If nothing was found internally, try to fetch any | |
+ // data from the HTML5 data-* attribute | |
+ if ( data === undefined && elem.nodeType === 1 ) { | |
+ | |
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerC… | |
+ | |
+ data = elem.getAttribute( name ); | |
+ | |
+ if ( typeof data === "string" ) { | |
+ try { | |
+ data = data === "true" ? true : | |
+ data === "false" ? false : | |
+ data === "null" ? null : | |
+ jQuery.isNumeric( data ) ? +data : | |
+ rbrace.test( data ) ? jQuery.parseJSON… | |
+ data; | |
+ } catch( e ) {} | |
+ | |
+ // Make sure we set the data so it isn't changed later | |
+ jQuery.data( elem, key, data ); | |
+ | |
+ } else { | |
+ data = undefined; | |
+ } | |
+ } | |
+ | |
+ return data; | |
+} | |
+ | |
+// checks a cache object for emptiness | |
+function isEmptyDataObject( obj ) { | |
+ for ( var name in obj ) { | |
+ | |
+ // if the public data object is empty, the private is still em… | |
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { | |
+ continue; | |
+ } | |
+ if ( name !== "toJSON" ) { | |
+ return false; | |
+ } | |
+ } | |
+ | |
+ return true; | |
+} | |
+ | |
+ | |
+ | |
+ | |
+function handleQueueMarkDefer( elem, type, src ) { | |
+ var deferDataKey = type + "defer", | |
+ queueDataKey = type + "queue", | |
+ markDataKey = type + "mark", | |
+ defer = jQuery._data( elem, deferDataKey ); | |
+ if ( defer && | |
+ ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && | |
+ ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { | |
+ // Give room for hard-coded callbacks to fire first | |
+ // and eventually mark/queue something else on the element | |
+ setTimeout( function() { | |
+ if ( !jQuery._data( elem, queueDataKey ) && | |
+ !jQuery._data( elem, markDataKey ) ) { | |
+ jQuery.removeData( elem, deferDataKey, true ); | |
+ defer.fire(); | |
+ } | |
+ }, 0 ); | |
+ } | |
+} | |
+ | |
+jQuery.extend({ | |
+ | |
+ _mark: function( elem, type ) { | |
+ if ( elem ) { | |
+ type = ( type || "fx" ) + "mark"; | |
+ jQuery._data( elem, type, (jQuery._data( elem, type ) … | |
+ } | |
+ }, | |
+ | |
+ _unmark: function( force, elem, type ) { | |
+ if ( force !== true ) { | |
+ type = elem; | |
+ elem = force; | |
+ force = false; | |
+ } | |
+ if ( elem ) { | |
+ type = type || "fx"; | |
+ var key = type + "mark", | |
+ count = force ? 0 : ( (jQuery._data( elem, key… | |
+ if ( count ) { | |
+ jQuery._data( elem, key, count ); | |
+ } else { | |
+ jQuery.removeData( elem, key, true ); | |
+ handleQueueMarkDefer( elem, type, "mark" ); | |
+ } | |
+ } | |
+ }, | |
+ | |
+ queue: function( elem, type, data ) { | |
+ var q; | |
+ if ( elem ) { | |
+ type = ( type || "fx" ) + "queue"; | |
+ q = jQuery._data( elem, type ); | |
+ | |
+ // Speed up dequeue by getting out quickly if this is … | |
+ if ( data ) { | |
+ if ( !q || jQuery.isArray(data) ) { | |
+ q = jQuery._data( elem, type, jQuery.m… | |
+ } else { | |
+ q.push( data ); | |
+ } | |
+ } | |
+ return q || []; | |
+ } | |
+ }, | |
+ | |
+ dequeue: function( elem, type ) { | |
+ type = type || "fx"; | |
+ | |
+ var queue = jQuery.queue( elem, type ), | |
+ fn = queue.shift(), | |
+ hooks = {}; | |
+ | |
+ // If the fx queue is dequeued, always remove the progress sen… | |
+ if ( fn === "inprogress" ) { | |
+ fn = queue.shift(); | |
+ } | |
+ | |
+ if ( fn ) { | |
+ // Add a progress sentinel to prevent the fx queue fro… | |
+ // automatically dequeued | |
+ if ( type === "fx" ) { | |
+ queue.unshift( "inprogress" ); | |
+ } | |
+ | |
+ jQuery._data( elem, type + ".run", hooks ); | |
+ fn.call( elem, function() { | |
+ jQuery.dequeue( elem, type ); | |
+ }, hooks ); | |
+ } | |
+ | |
+ if ( !queue.length ) { | |
+ jQuery.removeData( elem, type + "queue " + type + ".ru… | |
+ handleQueueMarkDefer( elem, type, "queue" ); | |
+ } | |
+ } | |
+}); | |
+ | |
+jQuery.fn.extend({ | |
+ queue: function( type, data ) { | |
+ var setter = 2; | |
+ | |
+ if ( typeof type !== "string" ) { | |
+ data = type; | |
+ type = "fx"; | |
+ setter--; | |
+ } | |
+ | |
+ if ( arguments.length < setter ) { | |
+ return jQuery.queue( this[0], type ); | |
+ } | |
+ | |
+ return data === undefined ? | |
+ this : | |
+ this.each(function() { | |
+ var queue = jQuery.queue( this, type, data ); | |
+ | |
+ if ( type === "fx" && queue[0] !== "inprogress… | |
+ jQuery.dequeue( this, type ); | |
+ } | |
+ }); | |
+ }, | |
+ dequeue: function( type ) { | |
+ return this.each(function() { | |
+ jQuery.dequeue( this, type ); | |
+ }); | |
+ }, | |
+ // Based off of the plugin by Clint Helfers, with permission. | |
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/ | |
+ delay: function( time, type ) { | |
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; | |
+ type = type || "fx"; | |
+ | |
+ return this.queue( type, function( next, hooks ) { | |
+ var timeout = setTimeout( next, time ); | |
+ hooks.stop = function() { | |
+ clearTimeout( timeout ); | |
+ }; | |
+ }); | |
+ }, | |
+ clearQueue: function( type ) { | |
+ return this.queue( type || "fx", [] ); | |
+ }, | |
+ // Get a promise resolved when queues of a certain type | |
+ // are emptied (fx is the type by default) | |
+ promise: function( type, object ) { | |
+ if ( typeof type !== "string" ) { | |
+ object = type; | |
+ type = undefined; | |
+ } | |
+ type = type || "fx"; | |
+ var defer = jQuery.Deferred(), | |
+ elements = this, | |
+ i = elements.length, | |
+ count = 1, | |
+ deferDataKey = type + "defer", | |
+ queueDataKey = type + "queue", | |
+ markDataKey = type + "mark", | |
+ tmp; | |
+ function resolve() { | |
+ if ( !( --count ) ) { | |
+ defer.resolveWith( elements, [ elements ] ); | |
+ } | |
+ } | |
+ while( i-- ) { | |
+ if (( tmp = jQuery.data( elements[ i ], deferDataKey, … | |
+ ( jQuery.data( elements[ i ], queueDat… | |
+ jQuery.data( elements[ i ], ma… | |
+ jQuery.data( elements[ i ], deferDataK… | |
+ count++; | |
+ tmp.add( resolve ); | |
+ } | |
+ } | |
+ resolve(); | |
+ return defer.promise( object ); | |
+ } | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+var rclass = /[\n\t\r]/g, | |
+ rspace = /\s+/, | |
+ rreturn = /\r/g, | |
+ rtype = /^(?:button|input)$/i, | |
+ rfocusable = /^(?:button|input|object|select|textarea)$/i, | |
+ rclickable = /^a(?:rea)?$/i, | |
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabl… | |
+ getSetAttribute = jQuery.support.getSetAttribute, | |
+ nodeHook, boolHook, fixSpecified; | |
+ | |
+jQuery.fn.extend({ | |
+ attr: function( name, value ) { | |
+ return jQuery.access( this, jQuery.attr, name, value, argument… | |
+ }, | |
+ | |
+ removeAttr: function( name ) { | |
+ return this.each(function() { | |
+ jQuery.removeAttr( this, name ); | |
+ }); | |
+ }, | |
+ | |
+ prop: function( name, value ) { | |
+ return jQuery.access( this, jQuery.prop, name, value, argument… | |
+ }, | |
+ | |
+ removeProp: function( name ) { | |
+ name = jQuery.propFix[ name ] || name; | |
+ return this.each(function() { | |
+ // try/catch handles cases where IE balks (such as rem… | |
+ try { | |
+ this[ name ] = undefined; | |
+ delete this[ name ]; | |
+ } catch( e ) {} | |
+ }); | |
+ }, | |
+ | |
+ addClass: function( value ) { | |
+ var classNames, i, l, elem, | |
+ setClass, c, cl; | |
+ | |
+ if ( jQuery.isFunction( value ) ) { | |
+ return this.each(function( j ) { | |
+ jQuery( this ).addClass( value.call(this, j, t… | |
+ }); | |
+ } | |
+ | |
+ if ( value && typeof value === "string" ) { | |
+ classNames = value.split( rspace ); | |
+ | |
+ for ( i = 0, l = this.length; i < l; i++ ) { | |
+ elem = this[ i ]; | |
+ | |
+ if ( elem.nodeType === 1 ) { | |
+ if ( !elem.className && classNames.len… | |
+ elem.className = value; | |
+ | |
+ } else { | |
+ setClass = " " + elem.classNam… | |
+ | |
+ for ( c = 0, cl = classNames.l… | |
+ if ( !~setClass.indexO… | |
+ setClass += cl… | |
+ } | |
+ } | |
+ elem.className = jQuery.trim( … | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ removeClass: function( value ) { | |
+ var classNames, i, l, elem, className, c, cl; | |
+ | |
+ if ( jQuery.isFunction( value ) ) { | |
+ return this.each(function( j ) { | |
+ jQuery( this ).removeClass( value.call(this, j… | |
+ }); | |
+ } | |
+ | |
+ if ( (value && typeof value === "string") || value === undefin… | |
+ classNames = ( value || "" ).split( rspace ); | |
+ | |
+ for ( i = 0, l = this.length; i < l; i++ ) { | |
+ elem = this[ i ]; | |
+ | |
+ if ( elem.nodeType === 1 && elem.className ) { | |
+ if ( value ) { | |
+ className = (" " + elem.classN… | |
+ for ( c = 0, cl = classNames.l… | |
+ className = className.… | |
+ } | |
+ elem.className = jQuery.trim( … | |
+ | |
+ } else { | |
+ elem.className = ""; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ toggleClass: function( value, stateVal ) { | |
+ var type = typeof value, | |
+ isBool = typeof stateVal === "boolean"; | |
+ | |
+ if ( jQuery.isFunction( value ) ) { | |
+ return this.each(function( i ) { | |
+ jQuery( this ).toggleClass( value.call(this, i… | |
+ }); | |
+ } | |
+ | |
+ return this.each(function() { | |
+ if ( type === "string" ) { | |
+ // toggle individual class names | |
+ var className, | |
+ i = 0, | |
+ self = jQuery( this ), | |
+ state = stateVal, | |
+ classNames = value.split( rspace ); | |
+ | |
+ while ( (className = classNames[ i++ ]) ) { | |
+ // check each className given, space s… | |
+ state = isBool ? state : !self.hasClas… | |
+ self[ state ? "addClass" : "removeClas… | |
+ } | |
+ | |
+ } else if ( type === "undefined" || type === "boolean"… | |
+ if ( this.className ) { | |
+ // store className if set | |
+ jQuery._data( this, "__className__", t… | |
+ } | |
+ | |
+ // toggle whole className | |
+ this.className = this.className || value === f… | |
+ } | |
+ }); | |
+ }, | |
+ | |
+ hasClass: function( selector ) { | |
+ var className = " " + selector + " ", | |
+ i = 0, | |
+ l = this.length; | |
+ for ( ; i < l; i++ ) { | |
+ if ( this[i].nodeType === 1 && (" " + this[i].classNam… | |
+ return true; | |
+ } | |
+ } | |
+ | |
+ return false; | |
+ }, | |
+ | |
+ val: function( value ) { | |
+ var hooks, ret, isFunction, | |
+ elem = this[0]; | |
+ | |
+ if ( !arguments.length ) { | |
+ if ( elem ) { | |
+ hooks = jQuery.valHooks[ elem.type ] || jQuery… | |
+ | |
+ if ( hooks && "get" in hooks && (ret = hooks.g… | |
+ return ret; | |
+ } | |
+ | |
+ ret = elem.value; | |
+ | |
+ return typeof ret === "string" ? | |
+ // handle most common string cases | |
+ ret.replace(rreturn, "") : | |
+ // handle cases where value is null/un… | |
+ ret == null ? "" : ret; | |
+ } | |
+ | |
+ return; | |
+ } | |
+ | |
+ isFunction = jQuery.isFunction( value ); | |
+ | |
+ return this.each(function( i ) { | |
+ var self = jQuery(this), val; | |
+ | |
+ if ( this.nodeType !== 1 ) { | |
+ return; | |
+ } | |
+ | |
+ if ( isFunction ) { | |
+ val = value.call( this, i, self.val() ); | |
+ } else { | |
+ val = value; | |
+ } | |
+ | |
+ // Treat null/undefined as ""; convert numbers to stri… | |
+ if ( val == null ) { | |
+ val = ""; | |
+ } else if ( typeof val === "number" ) { | |
+ val += ""; | |
+ } else if ( jQuery.isArray( val ) ) { | |
+ val = jQuery.map(val, function ( value ) { | |
+ return value == null ? "" : value + ""; | |
+ }); | |
+ } | |
+ | |
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHook… | |
+ | |
+ // If set returns undefined, fall back to normal setti… | |
+ if ( !hooks || !("set" in hooks) || hooks.set( this, v… | |
+ this.value = val; | |
+ } | |
+ }); | |
+ } | |
+}); | |
+ | |
+jQuery.extend({ | |
+ valHooks: { | |
+ option: { | |
+ get: function( elem ) { | |
+ // attributes.value is undefined in Blackberry… | |
+ // uses .value. See #6932 | |
+ var val = elem.attributes.value; | |
+ return !val || val.specified ? elem.value : el… | |
+ } | |
+ }, | |
+ select: { | |
+ get: function( elem ) { | |
+ var value, i, max, option, | |
+ index = elem.selectedIndex, | |
+ values = [], | |
+ options = elem.options, | |
+ one = elem.type === "select-one"; | |
+ | |
+ // Nothing was selected | |
+ if ( index < 0 ) { | |
+ return null; | |
+ } | |
+ | |
+ // Loop through all the selected options | |
+ i = one ? index : 0; | |
+ max = one ? index + 1 : options.length; | |
+ for ( ; i < max; i++ ) { | |
+ option = options[ i ]; | |
+ | |
+ // Don't return options that are disab… | |
+ if ( option.selected && (jQuery.suppor… | |
+ (!option.parentNode.di… | |
+ | |
+ // Get the specific value for … | |
+ value = jQuery( option ).val(); | |
+ | |
+ // We don't need an array for … | |
+ if ( one ) { | |
+ return value; | |
+ } | |
+ | |
+ // Multi-Selects return an arr… | |
+ values.push( value ); | |
+ } | |
+ } | |
+ | |
+ // Fixes Bug #2551 -- select.val() broken in I… | |
+ if ( one && !values.length && options.length )… | |
+ return jQuery( options[ index ] ).val(… | |
+ } | |
+ | |
+ return values; | |
+ }, | |
+ | |
+ set: function( elem, value ) { | |
+ var values = jQuery.makeArray( value ); | |
+ | |
+ jQuery(elem).find("option").each(function() { | |
+ this.selected = jQuery.inArray( jQuery… | |
+ }); | |
+ | |
+ if ( !values.length ) { | |
+ elem.selectedIndex = -1; | |
+ } | |
+ return values; | |
+ } | |
+ } | |
+ }, | |
+ | |
+ attrFn: { | |
+ val: true, | |
+ css: true, | |
+ html: true, | |
+ text: true, | |
+ data: true, | |
+ width: true, | |
+ height: true, | |
+ offset: true | |
+ }, | |
+ | |
+ attr: function( elem, name, value, pass ) { | |
+ var ret, hooks, notxml, | |
+ nType = elem.nodeType; | |
+ | |
+ // don't get/set attributes on text, comment and attribute nod… | |
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { | |
+ return; | |
+ } | |
+ | |
+ if ( pass && name in jQuery.attrFn ) { | |
+ return jQuery( elem )[ name ]( value ); | |
+ } | |
+ | |
+ // Fallback to prop when attributes are not supported | |
+ if ( typeof elem.getAttribute === "undefined" ) { | |
+ return jQuery.prop( elem, name, value ); | |
+ } | |
+ | |
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); | |
+ | |
+ // All attributes are lowercase | |
+ // Grab necessary hook if one is defined | |
+ if ( notxml ) { | |
+ name = name.toLowerCase(); | |
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( n… | |
+ } | |
+ | |
+ if ( value !== undefined ) { | |
+ | |
+ if ( value === null ) { | |
+ jQuery.removeAttr( elem, name ); | |
+ return; | |
+ | |
+ } else if ( hooks && "set" in hooks && notxml && (ret … | |
+ return ret; | |
+ | |
+ } else { | |
+ elem.setAttribute( name, "" + value ); | |
+ return value; | |
+ } | |
+ | |
+ } else if ( hooks && "get" in hooks && notxml && (ret = hooks.… | |
+ return ret; | |
+ | |
+ } else { | |
+ | |
+ ret = elem.getAttribute( name ); | |
+ | |
+ // Non-existent attributes return null, we normalize t… | |
+ return ret === null ? | |
+ undefined : | |
+ ret; | |
+ } | |
+ }, | |
+ | |
+ removeAttr: function( elem, value ) { | |
+ var propName, attrNames, name, l, isBool, | |
+ i = 0; | |
+ | |
+ if ( value && elem.nodeType === 1 ) { | |
+ attrNames = value.toLowerCase().split( rspace ); | |
+ l = attrNames.length; | |
+ | |
+ for ( ; i < l; i++ ) { | |
+ name = attrNames[ i ]; | |
+ | |
+ if ( name ) { | |
+ propName = jQuery.propFix[ name ] || n… | |
+ isBool = rboolean.test( name ); | |
+ | |
+ // See #9699 for explanation of this a… | |
+ // Do not do this for boolean attribut… | |
+ if ( !isBool ) { | |
+ jQuery.attr( elem, name, "" ); | |
+ } | |
+ elem.removeAttribute( getSetAttribute … | |
+ | |
+ // Set corresponding property to false… | |
+ if ( isBool && propName in elem ) { | |
+ elem[ propName ] = false; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ }, | |
+ | |
+ attrHooks: { | |
+ type: { | |
+ set: function( elem, value ) { | |
+ // We can't allow the type property to be chan… | |
+ if ( rtype.test( elem.nodeName ) && elem.paren… | |
+ jQuery.error( "type property can't be … | |
+ } else if ( !jQuery.support.radioValue && valu… | |
+ // Setting the type on a radio button … | |
+ // Reset value to it's default in case… | |
+ // This is for element creation | |
+ var val = elem.value; | |
+ elem.setAttribute( "type", value ); | |
+ if ( val ) { | |
+ elem.value = val; | |
+ } | |
+ return value; | |
+ } | |
+ } | |
+ }, | |
+ // Use the value property for back compat | |
+ // Use the nodeHook for button elements in IE6/7 (#1954) | |
+ value: { | |
+ get: function( elem, name ) { | |
+ if ( nodeHook && jQuery.nodeName( elem, "butto… | |
+ return nodeHook.get( elem, name ); | |
+ } | |
+ return name in elem ? | |
+ elem.value : | |
+ null; | |
+ }, | |
+ set: function( elem, value, name ) { | |
+ if ( nodeHook && jQuery.nodeName( elem, "butto… | |
+ return nodeHook.set( elem, value, name… | |
+ } | |
+ // Does not return so that setAttribute is als… | |
+ elem.value = value; | |
+ } | |
+ } | |
+ }, | |
+ | |
+ propFix: { | |
+ tabindex: "tabIndex", | |
+ readonly: "readOnly", | |
+ "for": "htmlFor", | |
+ "class": "className", | |
+ maxlength: "maxLength", | |
+ cellspacing: "cellSpacing", | |
+ cellpadding: "cellPadding", | |
+ rowspan: "rowSpan", | |
+ colspan: "colSpan", | |
+ usemap: "useMap", | |
+ frameborder: "frameBorder", | |
+ contenteditable: "contentEditable" | |
+ }, | |
+ | |
+ prop: function( elem, name, value ) { | |
+ var ret, hooks, notxml, | |
+ nType = elem.nodeType; | |
+ | |
+ // don't get/set properties on text, comment and attribute nod… | |
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { | |
+ return; | |
+ } | |
+ | |
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); | |
+ | |
+ if ( notxml ) { | |
+ // Fix name and attach hooks | |
+ name = jQuery.propFix[ name ] || name; | |
+ hooks = jQuery.propHooks[ name ]; | |
+ } | |
+ | |
+ if ( value !== undefined ) { | |
+ if ( hooks && "set" in hooks && (ret = hooks.set( elem… | |
+ return ret; | |
+ | |
+ } else { | |
+ return ( elem[ name ] = value ); | |
+ } | |
+ | |
+ } else { | |
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem… | |
+ return ret; | |
+ | |
+ } else { | |
+ return elem[ name ]; | |
+ } | |
+ } | |
+ }, | |
+ | |
+ propHooks: { | |
+ tabIndex: { | |
+ get: function( elem ) { | |
+ // elem.tabIndex doesn't always return the cor… | |
+ // http://fluidproject.org/blog/2008/01/09/get… | |
+ var attributeNode = elem.getAttributeNode("tab… | |
+ | |
+ return attributeNode && attributeNode.specifie… | |
+ parseInt( attributeNode.value, 10 ) : | |
+ rfocusable.test( elem.nodeName ) || rc… | |
+ 0 : | |
+ undefined; | |
+ } | |
+ } | |
+ } | |
+}); | |
+ | |
+// Add the tabIndex propHook to attrHooks for back-compat (different case is i… | |
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; | |
+ | |
+// Hook for boolean attributes | |
+boolHook = { | |
+ get: function( elem, name ) { | |
+ // Align boolean attributes with corresponding properties | |
+ // Fall back to attribute presence where some booleans are not… | |
+ var attrNode, | |
+ property = jQuery.prop( elem, name ); | |
+ return property === true || typeof property !== "boolean" && (… | |
+ name.toLowerCase() : | |
+ undefined; | |
+ }, | |
+ set: function( elem, value, name ) { | |
+ var propName; | |
+ if ( value === false ) { | |
+ // Remove boolean attributes when set to false | |
+ jQuery.removeAttr( elem, name ); | |
+ } else { | |
+ // value is true since we know at this point it's type… | |
+ // Set boolean attributes to the same name and set the… | |
+ propName = jQuery.propFix[ name ] || name; | |
+ if ( propName in elem ) { | |
+ // Only set the IDL specifically if it already… | |
+ elem[ propName ] = true; | |
+ } | |
+ | |
+ elem.setAttribute( name, name.toLowerCase() ); | |
+ } | |
+ return name; | |
+ } | |
+}; | |
+ | |
+// IE6/7 do not support getting/setting some attributes with get/setAttribute | |
+if ( !getSetAttribute ) { | |
+ | |
+ fixSpecified = { | |
+ name: true, | |
+ id: true, | |
+ coords: true | |
+ }; | |
+ | |
+ // Use this for any attribute in IE6/7 | |
+ // This fixes almost every IE6/7 issue | |
+ nodeHook = jQuery.valHooks.button = { | |
+ get: function( elem, name ) { | |
+ var ret; | |
+ ret = elem.getAttributeNode( name ); | |
+ return ret && ( fixSpecified[ name ] ? ret.nodeValue !… | |
+ ret.nodeValue : | |
+ undefined; | |
+ }, | |
+ set: function( elem, value, name ) { | |
+ // Set the existing or create a new attribute node | |
+ var ret = elem.getAttributeNode( name ); | |
+ if ( !ret ) { | |
+ ret = document.createAttribute( name ); | |
+ elem.setAttributeNode( ret ); | |
+ } | |
+ return ( ret.nodeValue = value + "" ); | |
+ } | |
+ }; | |
+ | |
+ // Apply the nodeHook to tabindex | |
+ jQuery.attrHooks.tabindex.set = nodeHook.set; | |
+ | |
+ // Set width and height to auto instead of 0 on empty string( Bug #815… | |
+ // This is for removals | |
+ jQuery.each([ "width", "height" ], function( i, name ) { | |
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ na… | |
+ set: function( elem, value ) { | |
+ if ( value === "" ) { | |
+ elem.setAttribute( name, "auto" ); | |
+ return value; | |
+ } | |
+ } | |
+ }); | |
+ }); | |
+ | |
+ // Set contenteditable to false on removals(#10429) | |
+ // Setting to empty string throws an error as an invalid value | |
+ jQuery.attrHooks.contenteditable = { | |
+ get: nodeHook.get, | |
+ set: function( elem, value, name ) { | |
+ if ( value === "" ) { | |
+ value = "false"; | |
+ } | |
+ nodeHook.set( elem, value, name ); | |
+ } | |
+ }; | |
+} | |
+ | |
+ | |
+// Some attributes require a special call on IE | |
+if ( !jQuery.support.hrefNormalized ) { | |
+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { | |
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ na… | |
+ get: function( elem ) { | |
+ var ret = elem.getAttribute( name, 2 ); | |
+ return ret === null ? undefined : ret; | |
+ } | |
+ }); | |
+ }); | |
+} | |
+ | |
+if ( !jQuery.support.style ) { | |
+ jQuery.attrHooks.style = { | |
+ get: function( elem ) { | |
+ // Return undefined in the case of empty string | |
+ // Normalize to lowercase since IE uppercases css prop… | |
+ return elem.style.cssText.toLowerCase() || undefined; | |
+ }, | |
+ set: function( elem, value ) { | |
+ return ( elem.style.cssText = "" + value ); | |
+ } | |
+ }; | |
+} | |
+ | |
+// Safari mis-reports the default selected property of an option | |
+// Accessing the parent's selectedIndex property fixes it | |
+if ( !jQuery.support.optSelected ) { | |
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { | |
+ get: function( elem ) { | |
+ var parent = elem.parentNode; | |
+ | |
+ if ( parent ) { | |
+ parent.selectedIndex; | |
+ | |
+ // Make sure that it also works with optgroups… | |
+ if ( parent.parentNode ) { | |
+ parent.parentNode.selectedIndex; | |
+ } | |
+ } | |
+ return null; | |
+ } | |
+ }); | |
+} | |
+ | |
+// IE6/7 call enctype encoding | |
+if ( !jQuery.support.enctype ) { | |
+ jQuery.propFix.enctype = "encoding"; | |
+} | |
+ | |
+// Radios and checkboxes getter/setter | |
+if ( !jQuery.support.checkOn ) { | |
+ jQuery.each([ "radio", "checkbox" ], function() { | |
+ jQuery.valHooks[ this ] = { | |
+ get: function( elem ) { | |
+ // Handle the case where in Webkit "" is retur… | |
+ return elem.getAttribute("value") === null ? "… | |
+ } | |
+ }; | |
+ }); | |
+} | |
+jQuery.each([ "radio", "checkbox" ], function() { | |
+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { | |
+ set: function( elem, value ) { | |
+ if ( jQuery.isArray( value ) ) { | |
+ return ( elem.checked = jQuery.inArray( jQuery… | |
+ } | |
+ } | |
+ }); | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+var rformElems = /^(?:textarea|input|select)$/i, | |
+ rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, | |
+ rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, | |
+ rkeyEvent = /^key/, | |
+ rmouseEvent = /^(?:mouse|contextmenu)|click/, | |
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, | |
+ rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, | |
+ quickParse = function( selector ) { | |
+ var quick = rquickIs.exec( selector ); | |
+ if ( quick ) { | |
+ // 0 1 2 3 | |
+ // [ _, tag, id, class ] | |
+ quick[1] = ( quick[1] || "" ).toLowerCase(); | |
+ quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick… | |
+ } | |
+ return quick; | |
+ }, | |
+ quickIs = function( elem, m ) { | |
+ var attrs = elem.attributes || {}; | |
+ return ( | |
+ (!m[1] || elem.nodeName.toLowerCase() === m[1]) && | |
+ (!m[2] || (attrs.id || {}).value === m[2]) && | |
+ (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) | |
+ ); | |
+ }, | |
+ hoverHack = function( events ) { | |
+ return jQuery.event.special.hover ? events : events.replace( r… | |
+ }; | |
+ | |
+/* | |
+ * Helper functions for managing events -- not part of the public interface. | |
+ * Props to Dean Edwards' addEvent library for many of the ideas. | |
+ */ | |
+jQuery.event = { | |
+ | |
+ add: function( elem, types, handler, data, selector ) { | |
+ | |
+ var elemData, eventHandle, events, | |
+ t, tns, type, namespaces, handleObj, | |
+ handleObjIn, quick, handlers, special; | |
+ | |
+ // Don't attach events to noData or text/comment nodes (allow … | |
+ if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !… | |
+ return; | |
+ } | |
+ | |
+ // Caller can pass in an object of custom data in lieu of the … | |
+ if ( handler.handler ) { | |
+ handleObjIn = handler; | |
+ handler = handleObjIn.handler; | |
+ selector = handleObjIn.selector; | |
+ } | |
+ | |
+ // Make sure that the handler has a unique ID, used to find/re… | |
+ if ( !handler.guid ) { | |
+ handler.guid = jQuery.guid++; | |
+ } | |
+ | |
+ // Init the element's event structure and main handler, if thi… | |
+ events = elemData.events; | |
+ if ( !events ) { | |
+ elemData.events = events = {}; | |
+ } | |
+ eventHandle = elemData.handle; | |
+ if ( !eventHandle ) { | |
+ elemData.handle = eventHandle = function( e ) { | |
+ // Discard the second event of a jQuery.event.… | |
+ // when an event is called after a page has un… | |
+ return typeof jQuery !== "undefined" && (!e ||… | |
+ jQuery.event.dispatch.apply( eventHand… | |
+ undefined; | |
+ }; | |
+ // Add elem as a property of the handle fn to prevent … | |
+ eventHandle.elem = elem; | |
+ } | |
+ | |
+ // Handle multiple events separated by a space | |
+ // jQuery(...).bind("mouseover mouseout", fn); | |
+ types = jQuery.trim( hoverHack(types) ).split( " " ); | |
+ for ( t = 0; t < types.length; t++ ) { | |
+ | |
+ tns = rtypenamespace.exec( types[t] ) || []; | |
+ type = tns[1]; | |
+ namespaces = ( tns[2] || "" ).split( "." ).sort(); | |
+ | |
+ // If event changes its type, use the special event ha… | |
+ special = jQuery.event.special[ type ] || {}; | |
+ | |
+ // If selector defined, determine special event api ty… | |
+ type = ( selector ? special.delegateType : special.bin… | |
+ | |
+ // Update special based on newly reset type | |
+ special = jQuery.event.special[ type ] || {}; | |
+ | |
+ // handleObj is passed to all event handlers | |
+ handleObj = jQuery.extend({ | |
+ type: type, | |
+ origType: tns[1], | |
+ data: data, | |
+ handler: handler, | |
+ guid: handler.guid, | |
+ selector: selector, | |
+ quick: selector && quickParse( selector ), | |
+ namespace: namespaces.join(".") | |
+ }, handleObjIn ); | |
+ | |
+ // Init the event handler queue if we're the first | |
+ handlers = events[ type ]; | |
+ if ( !handlers ) { | |
+ handlers = events[ type ] = []; | |
+ handlers.delegateCount = 0; | |
+ | |
+ // Only use addEventListener/attachEvent if th… | |
+ if ( !special.setup || special.setup.call( ele… | |
+ // Bind the global event handler to th… | |
+ if ( elem.addEventListener ) { | |
+ elem.addEventListener( type, e… | |
+ | |
+ } else if ( elem.attachEvent ) { | |
+ elem.attachEvent( "on" + type,… | |
+ } | |
+ } | |
+ } | |
+ | |
+ if ( special.add ) { | |
+ special.add.call( elem, handleObj ); | |
+ | |
+ if ( !handleObj.handler.guid ) { | |
+ handleObj.handler.guid = handler.guid; | |
+ } | |
+ } | |
+ | |
+ // Add to the element's handler list, delegates in fro… | |
+ if ( selector ) { | |
+ handlers.splice( handlers.delegateCount++, 0, … | |
+ } else { | |
+ handlers.push( handleObj ); | |
+ } | |
+ | |
+ // Keep track of which events have ever been used, for… | |
+ jQuery.event.global[ type ] = true; | |
+ } | |
+ | |
+ // Nullify elem to prevent memory leaks in IE | |
+ elem = null; | |
+ }, | |
+ | |
+ global: {}, | |
+ | |
+ // Detach an event or set of events from an element | |
+ remove: function( elem, types, handler, selector, mappedTypes ) { | |
+ | |
+ var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), | |
+ t, tns, type, origType, namespaces, origCount, | |
+ j, events, special, handle, eventType, handleObj; | |
+ | |
+ if ( !elemData || !(events = elemData.events) ) { | |
+ return; | |
+ } | |
+ | |
+ // Once for each type.namespace in types; type may be omitted | |
+ types = jQuery.trim( hoverHack( types || "" ) ).split(" "); | |
+ for ( t = 0; t < types.length; t++ ) { | |
+ tns = rtypenamespace.exec( types[t] ) || []; | |
+ type = origType = tns[1]; | |
+ namespaces = tns[2]; | |
+ | |
+ // Unbind all events (on this namespace, if provided) … | |
+ if ( !type ) { | |
+ for ( type in events ) { | |
+ jQuery.event.remove( elem, type + type… | |
+ } | |
+ continue; | |
+ } | |
+ | |
+ special = jQuery.event.special[ type ] || {}; | |
+ type = ( selector? special.delegateType : special.bind… | |
+ eventType = events[ type ] || []; | |
+ origCount = eventType.length; | |
+ namespaces = namespaces ? new RegExp("(^|\\.)" + names… | |
+ | |
+ // Remove matching events | |
+ for ( j = 0; j < eventType.length; j++ ) { | |
+ handleObj = eventType[ j ]; | |
+ | |
+ if ( ( mappedTypes || origType === handleObj.o… | |
+ ( !handler || handler.guid === handle… | |
+ ( !namespaces || namespaces.test( han… | |
+ ( !selector || selector === handleObj… | |
+ eventType.splice( j--, 1 ); | |
+ | |
+ if ( handleObj.selector ) { | |
+ eventType.delegateCount--; | |
+ } | |
+ if ( special.remove ) { | |
+ special.remove.call( elem, han… | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Remove generic event handler if we removed somethin… | |
+ // (avoids potential for endless recursion during remo… | |
+ if ( eventType.length === 0 && origCount !== eventType… | |
+ if ( !special.teardown || special.teardown.cal… | |
+ jQuery.removeEvent( elem, type, elemDa… | |
+ } | |
+ | |
+ delete events[ type ]; | |
+ } | |
+ } | |
+ | |
+ // Remove the expando if it's no longer used | |
+ if ( jQuery.isEmptyObject( events ) ) { | |
+ handle = elemData.handle; | |
+ if ( handle ) { | |
+ handle.elem = null; | |
+ } | |
+ | |
+ // removeData also checks for emptiness and clears the… | |
+ // so use it instead of delete | |
+ jQuery.removeData( elem, [ "events", "handle" ], true … | |
+ } | |
+ }, | |
+ | |
+ // Events that are safe to short-circuit if no handlers are attached. | |
+ // Native DOM events should not be added, they may have inline handler… | |
+ customEvent: { | |
+ "getData": true, | |
+ "setData": true, | |
+ "changeData": true | |
+ }, | |
+ | |
+ trigger: function( event, data, elem, onlyHandlers ) { | |
+ // Don't do events on text and comment nodes | |
+ if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { | |
+ return; | |
+ } | |
+ | |
+ // Event object or event type | |
+ var type = event.type || event, | |
+ namespaces = [], | |
+ cache, exclusive, i, cur, old, ontype, special, handle… | |
+ | |
+ // focus/blur morphs to focusin/out; ensure we're not firing t… | |
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { | |
+ return; | |
+ } | |
+ | |
+ if ( type.indexOf( "!" ) >= 0 ) { | |
+ // Exclusive events trigger only for the exact event (… | |
+ type = type.slice(0, -1); | |
+ exclusive = true; | |
+ } | |
+ | |
+ if ( type.indexOf( "." ) >= 0 ) { | |
+ // Namespaced trigger; create a regexp to match event … | |
+ namespaces = type.split("."); | |
+ type = namespaces.shift(); | |
+ namespaces.sort(); | |
+ } | |
+ | |
+ if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.ev… | |
+ // No jQuery handlers for this event type, and it can'… | |
+ return; | |
+ } | |
+ | |
+ // Caller can pass in an Event, Object, or just an event type … | |
+ event = typeof event === "object" ? | |
+ // jQuery.Event object | |
+ event[ jQuery.expando ] ? event : | |
+ // Object literal | |
+ new jQuery.Event( type, event ) : | |
+ // Just the event type (string) | |
+ new jQuery.Event( type ); | |
+ | |
+ event.type = type; | |
+ event.isTrigger = true; | |
+ event.exclusive = exclusive; | |
+ event.namespace = namespaces.join( "." ); | |
+ event.namespace_re = event.namespace? new RegExp("(^|\\.)" + n… | |
+ ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; | |
+ | |
+ // Handle a global trigger | |
+ if ( !elem ) { | |
+ | |
+ // TODO: Stop taunting the data cache; remove global e… | |
+ cache = jQuery.cache; | |
+ for ( i in cache ) { | |
+ if ( cache[ i ].events && cache[ i ].events[ t… | |
+ jQuery.event.trigger( event, data, cac… | |
+ } | |
+ } | |
+ return; | |
+ } | |
+ | |
+ // Clean up the event in case it is being reused | |
+ event.result = undefined; | |
+ if ( !event.target ) { | |
+ event.target = elem; | |
+ } | |
+ | |
+ // Clone any incoming data and prepend the event, creating the… | |
+ data = data != null ? jQuery.makeArray( data ) : []; | |
+ data.unshift( event ); | |
+ | |
+ // Allow special events to draw outside the lines | |
+ special = jQuery.event.special[ type ] || {}; | |
+ if ( special.trigger && special.trigger.apply( elem, data ) ==… | |
+ return; | |
+ } | |
+ | |
+ // Determine event propagation path in advance, per W3C events… | |
+ // Bubble up to document, then to window; watch for a global o… | |
+ eventPath = [[ elem, special.bindType || type ]]; | |
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( e… | |
+ | |
+ bubbleType = special.delegateType || type; | |
+ cur = rfocusMorph.test( bubbleType + type ) ? elem : e… | |
+ old = null; | |
+ for ( ; cur; cur = cur.parentNode ) { | |
+ eventPath.push([ cur, bubbleType ]); | |
+ old = cur; | |
+ } | |
+ | |
+ // Only add window if we got to document (e.g., not pl… | |
+ if ( old && old === elem.ownerDocument ) { | |
+ eventPath.push([ old.defaultView || old.parent… | |
+ } | |
+ } | |
+ | |
+ // Fire handlers on the event path | |
+ for ( i = 0; i < eventPath.length && !event.isPropagationStopp… | |
+ | |
+ cur = eventPath[i][0]; | |
+ event.type = eventPath[i][1]; | |
+ | |
+ handle = ( jQuery._data( cur, "events" ) || {} )[ even… | |
+ if ( handle ) { | |
+ handle.apply( cur, data ); | |
+ } | |
+ // Note that this is a bare JS function and not a jQue… | |
+ handle = ontype && cur[ ontype ]; | |
+ if ( handle && jQuery.acceptData( cur ) && handle.appl… | |
+ event.preventDefault(); | |
+ } | |
+ } | |
+ event.type = type; | |
+ | |
+ // If nobody prevented the default action, do it now | |
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) { | |
+ | |
+ if ( (!special._default || special._default.apply( ele… | |
+ !(type === "click" && jQuery.nodeName( elem, "… | |
+ | |
+ // Call a native DOM method on the target with… | |
+ // Can't use an .isFunction() check here becau… | |
+ // Don't do default actions on window, that's … | |
+ // IE<9 dies on focus/blur to hidden element (… | |
+ if ( ontype && elem[ type ] && ((type !== "foc… | |
+ | |
+ // Don't re-trigger an onFOO event whe… | |
+ old = elem[ ontype ]; | |
+ | |
+ if ( old ) { | |
+ elem[ ontype ] = null; | |
+ } | |
+ | |
+ // Prevent re-triggering of the same e… | |
+ jQuery.event.triggered = type; | |
+ elem[ type ](); | |
+ jQuery.event.triggered = undefined; | |
+ | |
+ if ( old ) { | |
+ elem[ ontype ] = old; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ return event.result; | |
+ }, | |
+ | |
+ dispatch: function( event ) { | |
+ | |
+ // Make a writable jQuery.Event from the native event object | |
+ event = jQuery.event.fix( event || window.event ); | |
+ | |
+ var handlers = ( (jQuery._data( this, "events" ) || {} )[ even… | |
+ delegateCount = handlers.delegateCount, | |
+ args = [].slice.call( arguments, 0 ), | |
+ run_all = !event.exclusive && !event.namespace, | |
+ special = jQuery.event.special[ event.type ] || {}, | |
+ handlerQueue = [], | |
+ i, j, cur, jqcur, ret, selMatch, matched, matches, han… | |
+ | |
+ // Use the fix-ed jQuery.Event rather than the (read-only) nat… | |
+ args[0] = event; | |
+ event.delegateTarget = this; | |
+ | |
+ // Call the preDispatch hook for the mapped type, and let it b… | |
+ if ( special.preDispatch && special.preDispatch.call( this, ev… | |
+ return; | |
+ } | |
+ | |
+ // Determine handlers that should run if there are delegated e… | |
+ // Avoid non-left-click bubbling in Firefox (#3861) | |
+ if ( delegateCount && !(event.button && event.type === "click"… | |
+ | |
+ // Pregenerate a single jQuery object for reuse with .… | |
+ jqcur = jQuery(this); | |
+ jqcur.context = this.ownerDocument || this; | |
+ | |
+ for ( cur = event.target; cur != this; cur = cur.paren… | |
+ | |
+ // Don't process events on disabled elements (… | |
+ if ( cur.disabled !== true ) { | |
+ selMatch = {}; | |
+ matches = []; | |
+ jqcur[0] = cur; | |
+ for ( i = 0; i < delegateCount; i++ ) { | |
+ handleObj = handlers[ i ]; | |
+ sel = handleObj.selector; | |
+ | |
+ if ( selMatch[ sel ] === undef… | |
+ selMatch[ sel ] = ( | |
+ handleObj.quic… | |
+ ); | |
+ } | |
+ if ( selMatch[ sel ] ) { | |
+ matches.push( handleOb… | |
+ } | |
+ } | |
+ if ( matches.length ) { | |
+ handlerQueue.push({ elem: cur,… | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Add the remaining (directly-bound) handlers | |
+ if ( handlers.length > delegateCount ) { | |
+ handlerQueue.push({ elem: this, matches: handlers.slic… | |
+ } | |
+ | |
+ // Run delegates first; they may want to stop propagation bene… | |
+ for ( i = 0; i < handlerQueue.length && !event.isPropagationSt… | |
+ matched = handlerQueue[ i ]; | |
+ event.currentTarget = matched.elem; | |
+ | |
+ for ( j = 0; j < matched.matches.length && !event.isIm… | |
+ handleObj = matched.matches[ j ]; | |
+ | |
+ // Triggered event must either 1) be non-exclu… | |
+ // 2) have namespace(s) a subset or equal to t… | |
+ if ( run_all || (!event.namespace && !handleOb… | |
+ | |
+ event.data = handleObj.data; | |
+ event.handleObj = handleObj; | |
+ | |
+ ret = ( (jQuery.event.special[ handleO… | |
+ .apply( matched.elem, … | |
+ | |
+ if ( ret !== undefined ) { | |
+ event.result = ret; | |
+ if ( ret === false ) { | |
+ event.preventDefault(); | |
+ event.stopPropagation(… | |
+ } | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Call the postDispatch hook for the mapped type | |
+ if ( special.postDispatch ) { | |
+ special.postDispatch.call( this, event ); | |
+ } | |
+ | |
+ return event.result; | |
+ }, | |
+ | |
+ // Includes some event props shared by KeyEvent and MouseEvent | |
+ // *** attrChange attrName relatedNode srcElement are not normalized,… | |
+ props: "attrChange attrName relatedNode srcElement altKey bubbles canc… | |
+ | |
+ fixHooks: {}, | |
+ | |
+ keyHooks: { | |
+ props: "char charCode key keyCode".split(" "), | |
+ filter: function( event, original ) { | |
+ | |
+ // Add which for key events | |
+ if ( event.which == null ) { | |
+ event.which = original.charCode != null ? orig… | |
+ } | |
+ | |
+ return event; | |
+ } | |
+ }, | |
+ | |
+ mouseHooks: { | |
+ props: "button buttons clientX clientY fromElement offsetX off… | |
+ filter: function( event, original ) { | |
+ var eventDoc, doc, body, | |
+ button = original.button, | |
+ fromElement = original.fromElement; | |
+ | |
+ // Calculate pageX/Y if missing and clientX/Y available | |
+ if ( event.pageX == null && original.clientX != null )… | |
+ eventDoc = event.target.ownerDocument || docum… | |
+ doc = eventDoc.documentElement; | |
+ body = eventDoc.body; | |
+ | |
+ event.pageX = original.clientX + ( doc && doc.… | |
+ event.pageY = original.clientY + ( doc && doc.… | |
+ } | |
+ | |
+ // Add relatedTarget, if necessary | |
+ if ( !event.relatedTarget && fromElement ) { | |
+ event.relatedTarget = fromElement === event.ta… | |
+ } | |
+ | |
+ // Add which for click: 1 === left; 2 === middle; 3 ==… | |
+ // Note: button is not normalized, so don't use it | |
+ if ( !event.which && button !== undefined ) { | |
+ event.which = ( button & 1 ? 1 : ( button & 2 … | |
+ } | |
+ | |
+ return event; | |
+ } | |
+ }, | |
+ | |
+ fix: function( event ) { | |
+ if ( event[ jQuery.expando ] ) { | |
+ return event; | |
+ } | |
+ | |
+ // Create a writable copy of the event object and normalize so… | |
+ var i, prop, | |
+ originalEvent = event, | |
+ fixHook = jQuery.event.fixHooks[ event.type ] || {}, | |
+ copy = fixHook.props ? this.props.concat( fixHook.prop… | |
+ | |
+ event = jQuery.Event( originalEvent ); | |
+ | |
+ for ( i = copy.length; i; ) { | |
+ prop = copy[ --i ]; | |
+ event[ prop ] = originalEvent[ prop ]; | |
+ } | |
+ | |
+ // Fix target property, if necessary (#1925, IE 6/7/8 & Safari… | |
+ if ( !event.target ) { | |
+ event.target = originalEvent.srcElement || document; | |
+ } | |
+ | |
+ // Target should not be a text node (#504, Safari) | |
+ if ( event.target.nodeType === 3 ) { | |
+ event.target = event.target.parentNode; | |
+ } | |
+ | |
+ // For mouse/key events; add metaKey if it's not there (#3368,… | |
+ if ( event.metaKey === undefined ) { | |
+ event.metaKey = event.ctrlKey; | |
+ } | |
+ | |
+ return fixHook.filter? fixHook.filter( event, originalEvent ) … | |
+ }, | |
+ | |
+ special: { | |
+ ready: { | |
+ // Make sure the ready event is setup | |
+ setup: jQuery.bindReady | |
+ }, | |
+ | |
+ load: { | |
+ // Prevent triggered image.load events from bubbling t… | |
+ noBubble: true | |
+ }, | |
+ | |
+ focus: { | |
+ delegateType: "focusin" | |
+ }, | |
+ blur: { | |
+ delegateType: "focusout" | |
+ }, | |
+ | |
+ beforeunload: { | |
+ setup: function( data, namespaces, eventHandle ) { | |
+ // We only want to do this special case on win… | |
+ if ( jQuery.isWindow( this ) ) { | |
+ this.onbeforeunload = eventHandle; | |
+ } | |
+ }, | |
+ | |
+ teardown: function( namespaces, eventHandle ) { | |
+ if ( this.onbeforeunload === eventHandle ) { | |
+ this.onbeforeunload = null; | |
+ } | |
+ } | |
+ } | |
+ }, | |
+ | |
+ simulate: function( type, elem, event, bubble ) { | |
+ // Piggyback on a donor event to simulate a different one. | |
+ // Fake originalEvent to avoid donor's stopPropagation, but if… | |
+ // simulated event prevents default then we do the same on the… | |
+ var e = jQuery.extend( | |
+ new jQuery.Event(), | |
+ event, | |
+ { type: type, | |
+ isSimulated: true, | |
+ originalEvent: {} | |
+ } | |
+ ); | |
+ if ( bubble ) { | |
+ jQuery.event.trigger( e, null, elem ); | |
+ } else { | |
+ jQuery.event.dispatch.call( elem, e ); | |
+ } | |
+ if ( e.isDefaultPrevented() ) { | |
+ event.preventDefault(); | |
+ } | |
+ } | |
+}; | |
+ | |
+// Some plugins are using, but it's undocumented/deprecated and will be remove… | |
+// The 1.7 special event interface should provide all the hooks needed now. | |
+jQuery.event.handle = jQuery.event.dispatch; | |
+ | |
+jQuery.removeEvent = document.removeEventListener ? | |
+ function( elem, type, handle ) { | |
+ if ( elem.removeEventListener ) { | |
+ elem.removeEventListener( type, handle, false ); | |
+ } | |
+ } : | |
+ function( elem, type, handle ) { | |
+ if ( elem.detachEvent ) { | |
+ elem.detachEvent( "on" + type, handle ); | |
+ } | |
+ }; | |
+ | |
+jQuery.Event = function( src, props ) { | |
+ // Allow instantiation without the 'new' keyword | |
+ if ( !(this instanceof jQuery.Event) ) { | |
+ return new jQuery.Event( src, props ); | |
+ } | |
+ | |
+ // Event object | |
+ if ( src && src.type ) { | |
+ this.originalEvent = src; | |
+ this.type = src.type; | |
+ | |
+ // Events bubbling up the document may have been marked as pre… | |
+ // by a handler lower down the tree; reflect the correct value. | |
+ this.isDefaultPrevented = ( src.defaultPrevented || src.return… | |
+ src.getPreventDefault && src.getPreventDefault() ) ? r… | |
+ | |
+ // Event type | |
+ } else { | |
+ this.type = src; | |
+ } | |
+ | |
+ // Put explicitly provided properties onto the event object | |
+ if ( props ) { | |
+ jQuery.extend( this, props ); | |
+ } | |
+ | |
+ // Create a timestamp if incoming event doesn't have one | |
+ this.timeStamp = src && src.timeStamp || jQuery.now(); | |
+ | |
+ // Mark it as fixed | |
+ this[ jQuery.expando ] = true; | |
+}; | |
+ | |
+function returnFalse() { | |
+ return false; | |
+} | |
+function returnTrue() { | |
+ return true; | |
+} | |
+ | |
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Languag… | |
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-bindin… | |
+jQuery.Event.prototype = { | |
+ preventDefault: function() { | |
+ this.isDefaultPrevented = returnTrue; | |
+ | |
+ var e = this.originalEvent; | |
+ if ( !e ) { | |
+ return; | |
+ } | |
+ | |
+ // if preventDefault exists run it on the original event | |
+ if ( e.preventDefault ) { | |
+ e.preventDefault(); | |
+ | |
+ // otherwise set the returnValue property of the original even… | |
+ } else { | |
+ e.returnValue = false; | |
+ } | |
+ }, | |
+ stopPropagation: function() { | |
+ this.isPropagationStopped = returnTrue; | |
+ | |
+ var e = this.originalEvent; | |
+ if ( !e ) { | |
+ return; | |
+ } | |
+ // if stopPropagation exists run it on the original event | |
+ if ( e.stopPropagation ) { | |
+ e.stopPropagation(); | |
+ } | |
+ // otherwise set the cancelBubble property of the original eve… | |
+ e.cancelBubble = true; | |
+ }, | |
+ stopImmediatePropagation: function() { | |
+ this.isImmediatePropagationStopped = returnTrue; | |
+ this.stopPropagation(); | |
+ }, | |
+ isDefaultPrevented: returnFalse, | |
+ isPropagationStopped: returnFalse, | |
+ isImmediatePropagationStopped: returnFalse | |
+}; | |
+ | |
+// Create mouseenter/leave events using mouseover/out and event-time checks | |
+jQuery.each({ | |
+ mouseenter: "mouseover", | |
+ mouseleave: "mouseout" | |
+}, function( orig, fix ) { | |
+ jQuery.event.special[ orig ] = { | |
+ delegateType: fix, | |
+ bindType: fix, | |
+ | |
+ handle: function( event ) { | |
+ var target = this, | |
+ related = event.relatedTarget, | |
+ handleObj = event.handleObj, | |
+ selector = handleObj.selector, | |
+ ret; | |
+ | |
+ // For mousenter/leave call the handler if related is … | |
+ // NB: No relatedTarget if the mouse left/entered the … | |
+ if ( !related || (related !== target && !jQuery.contai… | |
+ event.type = handleObj.origType; | |
+ ret = handleObj.handler.apply( this, arguments… | |
+ event.type = fix; | |
+ } | |
+ return ret; | |
+ } | |
+ }; | |
+}); | |
+ | |
+// IE submit delegation | |
+if ( !jQuery.support.submitBubbles ) { | |
+ | |
+ jQuery.event.special.submit = { | |
+ setup: function() { | |
+ // Only need this for delegated form submit events | |
+ if ( jQuery.nodeName( this, "form" ) ) { | |
+ return false; | |
+ } | |
+ | |
+ // Lazy-add a submit handler when a descendant form ma… | |
+ jQuery.event.add( this, "click._submit keypress._submi… | |
+ // Node name check avoids a VML-related crash … | |
+ var elem = e.target, | |
+ form = jQuery.nodeName( elem, "input" … | |
+ if ( form && !form._submit_attached ) { | |
+ jQuery.event.add( form, "submit._submi… | |
+ event._submit_bubble = true; | |
+ }); | |
+ form._submit_attached = true; | |
+ } | |
+ }); | |
+ // return undefined since we don't need an event liste… | |
+ }, | |
+ | |
+ postDispatch: function( event ) { | |
+ // If form was submitted by the user, bubble the event… | |
+ if ( event._submit_bubble ) { | |
+ delete event._submit_bubble; | |
+ if ( this.parentNode && !event.isTrigger ) { | |
+ jQuery.event.simulate( "submit", this.… | |
+ } | |
+ } | |
+ }, | |
+ | |
+ teardown: function() { | |
+ // Only need this for delegated form submit events | |
+ if ( jQuery.nodeName( this, "form" ) ) { | |
+ return false; | |
+ } | |
+ | |
+ // Remove delegated handlers; cleanData eventually rea… | |
+ jQuery.event.remove( this, "._submit" ); | |
+ } | |
+ }; | |
+} | |
+ | |
+// IE change delegation and checkbox/radio fix | |
+if ( !jQuery.support.changeBubbles ) { | |
+ | |
+ jQuery.event.special.change = { | |
+ | |
+ setup: function() { | |
+ | |
+ if ( rformElems.test( this.nodeName ) ) { | |
+ // IE doesn't fire change on a check/radio unt… | |
+ // after a propertychange. Eat the blur-change… | |
+ // This still fires onchange a second time for… | |
+ if ( this.type === "checkbox" || this.type ===… | |
+ jQuery.event.add( this, "propertychang… | |
+ if ( event.originalEvent.prope… | |
+ this._just_changed = t… | |
+ } | |
+ }); | |
+ jQuery.event.add( this, "click._change… | |
+ if ( this._just_changed && !ev… | |
+ this._just_changed = f… | |
+ jQuery.event.simulate(… | |
+ } | |
+ }); | |
+ } | |
+ return false; | |
+ } | |
+ // Delegated event; lazy-add a change handler on desce… | |
+ jQuery.event.add( this, "beforeactivate._change", func… | |
+ var elem = e.target; | |
+ | |
+ if ( rformElems.test( elem.nodeName ) && !elem… | |
+ jQuery.event.add( elem, "change._chang… | |
+ if ( this.parentNode && !event… | |
+ jQuery.event.simulate(… | |
+ } | |
+ }); | |
+ elem._change_attached = true; | |
+ } | |
+ }); | |
+ }, | |
+ | |
+ handle: function( event ) { | |
+ var elem = event.target; | |
+ | |
+ // Swallow native change events from checkbox/radio, w… | |
+ if ( this !== elem || event.isSimulated || event.isTri… | |
+ return event.handleObj.handler.apply( this, ar… | |
+ } | |
+ }, | |
+ | |
+ teardown: function() { | |
+ jQuery.event.remove( this, "._change" ); | |
+ | |
+ return rformElems.test( this.nodeName ); | |
+ } | |
+ }; | |
+} | |
+ | |
+// Create "bubbling" focus and blur events | |
+if ( !jQuery.support.focusinBubbles ) { | |
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fi… | |
+ | |
+ // Attach a single capturing handler while someone wants focus… | |
+ var attaches = 0, | |
+ handler = function( event ) { | |
+ jQuery.event.simulate( fix, event.target, jQue… | |
+ }; | |
+ | |
+ jQuery.event.special[ fix ] = { | |
+ setup: function() { | |
+ if ( attaches++ === 0 ) { | |
+ document.addEventListener( orig, handl… | |
+ } | |
+ }, | |
+ teardown: function() { | |
+ if ( --attaches === 0 ) { | |
+ document.removeEventListener( orig, ha… | |
+ } | |
+ } | |
+ }; | |
+ }); | |
+} | |
+ | |
+jQuery.fn.extend({ | |
+ | |
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { | |
+ var origFn, type; | |
+ | |
+ // Types can be a map of types/handlers | |
+ if ( typeof types === "object" ) { | |
+ // ( types-Object, selector, data ) | |
+ if ( typeof selector !== "string" ) { // && selector !… | |
+ // ( types-Object, data ) | |
+ data = data || selector; | |
+ selector = undefined; | |
+ } | |
+ for ( type in types ) { | |
+ this.on( type, selector, data, types[ type ], … | |
+ } | |
+ return this; | |
+ } | |
+ | |
+ if ( data == null && fn == null ) { | |
+ // ( types, fn ) | |
+ fn = selector; | |
+ data = selector = undefined; | |
+ } else if ( fn == null ) { | |
+ if ( typeof selector === "string" ) { | |
+ // ( types, selector, fn ) | |
+ fn = data; | |
+ data = undefined; | |
+ } else { | |
+ // ( types, data, fn ) | |
+ fn = data; | |
+ data = selector; | |
+ selector = undefined; | |
+ } | |
+ } | |
+ if ( fn === false ) { | |
+ fn = returnFalse; | |
+ } else if ( !fn ) { | |
+ return this; | |
+ } | |
+ | |
+ if ( one === 1 ) { | |
+ origFn = fn; | |
+ fn = function( event ) { | |
+ // Can use an empty set, since event contains … | |
+ jQuery().off( event ); | |
+ return origFn.apply( this, arguments ); | |
+ }; | |
+ // Use same guid so caller can remove using origFn | |
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++… | |
+ } | |
+ return this.each( function() { | |
+ jQuery.event.add( this, types, fn, data, selector ); | |
+ }); | |
+ }, | |
+ one: function( types, selector, data, fn ) { | |
+ return this.on( types, selector, data, fn, 1 ); | |
+ }, | |
+ off: function( types, selector, fn ) { | |
+ if ( types && types.preventDefault && types.handleObj ) { | |
+ // ( event ) dispatched jQuery.Event | |
+ var handleObj = types.handleObj; | |
+ jQuery( types.delegateTarget ).off( | |
+ handleObj.namespace ? handleObj.origType + "."… | |
+ handleObj.selector, | |
+ handleObj.handler | |
+ ); | |
+ return this; | |
+ } | |
+ if ( typeof types === "object" ) { | |
+ // ( types-object [, selector] ) | |
+ for ( var type in types ) { | |
+ this.off( type, selector, types[ type ] ); | |
+ } | |
+ return this; | |
+ } | |
+ if ( selector === false || typeof selector === "function" ) { | |
+ // ( types [, fn] ) | |
+ fn = selector; | |
+ selector = undefined; | |
+ } | |
+ if ( fn === false ) { | |
+ fn = returnFalse; | |
+ } | |
+ return this.each(function() { | |
+ jQuery.event.remove( this, types, fn, selector ); | |
+ }); | |
+ }, | |
+ | |
+ bind: function( types, data, fn ) { | |
+ return this.on( types, null, data, fn ); | |
+ }, | |
+ unbind: function( types, fn ) { | |
+ return this.off( types, null, fn ); | |
+ }, | |
+ | |
+ live: function( types, data, fn ) { | |
+ jQuery( this.context ).on( types, this.selector, data, fn ); | |
+ return this; | |
+ }, | |
+ die: function( types, fn ) { | |
+ jQuery( this.context ).off( types, this.selector || "**", fn ); | |
+ return this; | |
+ }, | |
+ | |
+ delegate: function( selector, types, data, fn ) { | |
+ return this.on( types, selector, data, fn ); | |
+ }, | |
+ undelegate: function( selector, types, fn ) { | |
+ // ( namespace ) or ( selector, types [, fn] ) | |
+ return arguments.length == 1? this.off( selector, "**" ) : thi… | |
+ }, | |
+ | |
+ trigger: function( type, data ) { | |
+ return this.each(function() { | |
+ jQuery.event.trigger( type, data, this ); | |
+ }); | |
+ }, | |
+ triggerHandler: function( type, data ) { | |
+ if ( this[0] ) { | |
+ return jQuery.event.trigger( type, data, this[0], true… | |
+ } | |
+ }, | |
+ | |
+ toggle: function( fn ) { | |
+ // Save reference to arguments for access in closure | |
+ var args = arguments, | |
+ guid = fn.guid || jQuery.guid++, | |
+ i = 0, | |
+ toggler = function( event ) { | |
+ // Figure out which function to execute | |
+ var lastToggle = ( jQuery._data( this, "lastTo… | |
+ jQuery._data( this, "lastToggle" + fn.guid, la… | |
+ | |
+ // Make sure that clicks stop | |
+ event.preventDefault(); | |
+ | |
+ // and execute the function | |
+ return args[ lastToggle ].apply( this, argumen… | |
+ }; | |
+ | |
+ // link all the functions, so any of them can unbind this clic… | |
+ toggler.guid = guid; | |
+ while ( i < args.length ) { | |
+ args[ i++ ].guid = guid; | |
+ } | |
+ | |
+ return this.click( toggler ); | |
+ }, | |
+ | |
+ hover: function( fnOver, fnOut ) { | |
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); | |
+ } | |
+}); | |
+ | |
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dbl… | |
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave … | |
+ "change select submit keydown keypress keyup error contextmenu").split… | |
+ | |
+ // Handle event binding | |
+ jQuery.fn[ name ] = function( data, fn ) { | |
+ if ( fn == null ) { | |
+ fn = data; | |
+ data = null; | |
+ } | |
+ | |
+ return arguments.length > 0 ? | |
+ this.on( name, null, data, fn ) : | |
+ this.trigger( name ); | |
+ }; | |
+ | |
+ if ( jQuery.attrFn ) { | |
+ jQuery.attrFn[ name ] = true; | |
+ } | |
+ | |
+ if ( rkeyEvent.test( name ) ) { | |
+ jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; | |
+ } | |
+ | |
+ if ( rmouseEvent.test( name ) ) { | |
+ jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; | |
+ } | |
+}); | |
+ | |
+ | |
+ | |
+/*! | |
+ * Sizzle CSS Selector Engine | |
+ * Copyright 2011, The Dojo Foundation | |
+ * Released under the MIT, BSD, and GPL Licenses. | |
+ * More information: http://sizzlejs.com/ | |
+ */ | |
+(function(){ | |
+ | |
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]… | |
+ expando = "sizcache" + (Math.random() + '').replace('.', ''), | |
+ done = 0, | |
+ toString = Object.prototype.toString, | |
+ hasDuplicate = false, | |
+ baseHasDuplicate = true, | |
+ rBackslash = /\\/g, | |
+ rReturn = /\r\n/g, | |
+ rNonWord = /\W/; | |
+ | |
+// Here we check if the JavaScript engine is using some sort of | |
+// optimization where it does not always call our comparision | |
+// function. If that is the case, discard the hasDuplicate value. | |
+// Thus far that includes Google Chrome. | |
+[0, 0].sort(function() { | |
+ baseHasDuplicate = false; | |
+ return 0; | |
+}); | |
+ | |
+var Sizzle = function( selector, context, results, seed ) { | |
+ results = results || []; | |
+ context = context || document; | |
+ | |
+ var origContext = context; | |
+ | |
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) { | |
+ return []; | |
+ } | |
+ | |
+ if ( !selector || typeof selector !== "string" ) { | |
+ return results; | |
+ } | |
+ | |
+ var m, set, checkSet, extra, ret, cur, pop, i, | |
+ prune = true, | |
+ contextXML = Sizzle.isXML( context ), | |
+ parts = [], | |
+ soFar = selector; | |
+ | |
+ // Reset the position of the chunker regexp (start from head) | |
+ do { | |
+ chunker.exec( "" ); | |
+ m = chunker.exec( soFar ); | |
+ | |
+ if ( m ) { | |
+ soFar = m[3]; | |
+ | |
+ parts.push( m[1] ); | |
+ | |
+ if ( m[2] ) { | |
+ extra = m[3]; | |
+ break; | |
+ } | |
+ } | |
+ } while ( m ); | |
+ | |
+ if ( parts.length > 1 && origPOS.exec( selector ) ) { | |
+ | |
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { | |
+ set = posProcess( parts[0] + parts[1], context, seed ); | |
+ | |
+ } else { | |
+ set = Expr.relative[ parts[0] ] ? | |
+ [ context ] : | |
+ Sizzle( parts.shift(), context ); | |
+ | |
+ while ( parts.length ) { | |
+ selector = parts.shift(); | |
+ | |
+ if ( Expr.relative[ selector ] ) { | |
+ selector += parts.shift(); | |
+ } | |
+ | |
+ set = posProcess( selector, set, seed ); | |
+ } | |
+ } | |
+ | |
+ } else { | |
+ // Take a shortcut and set the context if the root selector is… | |
+ // (but not if it'll be faster if the inner selector is an ID) | |
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !c… | |
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID… | |
+ | |
+ ret = Sizzle.find( parts.shift(), context, contextXML … | |
+ context = ret.expr ? | |
+ Sizzle.filter( ret.expr, ret.set )[0] : | |
+ ret.set[0]; | |
+ } | |
+ | |
+ if ( context ) { | |
+ ret = seed ? | |
+ { expr: parts.pop(), set: makeArray(seed) } : | |
+ Sizzle.find( parts.pop(), parts.length === 1 &… | |
+ | |
+ set = ret.expr ? | |
+ Sizzle.filter( ret.expr, ret.set ) : | |
+ ret.set; | |
+ | |
+ if ( parts.length > 0 ) { | |
+ checkSet = makeArray( set ); | |
+ | |
+ } else { | |
+ prune = false; | |
+ } | |
+ | |
+ while ( parts.length ) { | |
+ cur = parts.pop(); | |
+ pop = cur; | |
+ | |
+ if ( !Expr.relative[ cur ] ) { | |
+ cur = ""; | |
+ } else { | |
+ pop = parts.pop(); | |
+ } | |
+ | |
+ if ( pop == null ) { | |
+ pop = context; | |
+ } | |
+ | |
+ Expr.relative[ cur ]( checkSet, pop, contextXM… | |
+ } | |
+ | |
+ } else { | |
+ checkSet = parts = []; | |
+ } | |
+ } | |
+ | |
+ if ( !checkSet ) { | |
+ checkSet = set; | |
+ } | |
+ | |
+ if ( !checkSet ) { | |
+ Sizzle.error( cur || selector ); | |
+ } | |
+ | |
+ if ( toString.call(checkSet) === "[object Array]" ) { | |
+ if ( !prune ) { | |
+ results.push.apply( results, checkSet ); | |
+ | |
+ } else if ( context && context.nodeType === 1 ) { | |
+ for ( i = 0; checkSet[i] != null; i++ ) { | |
+ if ( checkSet[i] && (checkSet[i] === true || c… | |
+ results.push( set[i] ); | |
+ } | |
+ } | |
+ | |
+ } else { | |
+ for ( i = 0; checkSet[i] != null; i++ ) { | |
+ if ( checkSet[i] && checkSet[i].nodeType === 1… | |
+ results.push( set[i] ); | |
+ } | |
+ } | |
+ } | |
+ | |
+ } else { | |
+ makeArray( checkSet, results ); | |
+ } | |
+ | |
+ if ( extra ) { | |
+ Sizzle( extra, origContext, results, seed ); | |
+ Sizzle.uniqueSort( results ); | |
+ } | |
+ | |
+ return results; | |
+}; | |
+ | |
+Sizzle.uniqueSort = function( results ) { | |
+ if ( sortOrder ) { | |
+ hasDuplicate = baseHasDuplicate; | |
+ results.sort( sortOrder ); | |
+ | |
+ if ( hasDuplicate ) { | |
+ for ( var i = 1; i < results.length; i++ ) { | |
+ if ( results[i] === results[ i - 1 ] ) { | |
+ results.splice( i--, 1 ); | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ return results; | |
+}; | |
+ | |
+Sizzle.matches = function( expr, set ) { | |
+ return Sizzle( expr, null, null, set ); | |
+}; | |
+ | |
+Sizzle.matchesSelector = function( node, expr ) { | |
+ return Sizzle( expr, null, null, [node] ).length > 0; | |
+}; | |
+ | |
+Sizzle.find = function( expr, context, isXML ) { | |
+ var set, i, len, match, type, left; | |
+ | |
+ if ( !expr ) { | |
+ return []; | |
+ } | |
+ | |
+ for ( i = 0, len = Expr.order.length; i < len; i++ ) { | |
+ type = Expr.order[i]; | |
+ | |
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { | |
+ left = match[1]; | |
+ match.splice( 1, 1 ); | |
+ | |
+ if ( left.substr( left.length - 1 ) !== "\\" ) { | |
+ match[1] = (match[1] || "").replace( rBackslas… | |
+ set = Expr.find[ type ]( match, context, isXML… | |
+ | |
+ if ( set != null ) { | |
+ expr = expr.replace( Expr.match[ type … | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ if ( !set ) { | |
+ set = typeof context.getElementsByTagName !== "undefined" ? | |
+ context.getElementsByTagName( "*" ) : | |
+ []; | |
+ } | |
+ | |
+ return { set: set, expr: expr }; | |
+}; | |
+ | |
+Sizzle.filter = function( expr, set, inplace, not ) { | |
+ var match, anyFound, | |
+ type, found, item, filter, left, | |
+ i, pass, | |
+ old = expr, | |
+ result = [], | |
+ curLoop = set, | |
+ isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); | |
+ | |
+ while ( expr && set.length ) { | |
+ for ( type in Expr.filter ) { | |
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != … | |
+ filter = Expr.filter[ type ]; | |
+ left = match[1]; | |
+ | |
+ anyFound = false; | |
+ | |
+ match.splice(1,1); | |
+ | |
+ if ( left.substr( left.length - 1 ) === "\\" )… | |
+ continue; | |
+ } | |
+ | |
+ if ( curLoop === result ) { | |
+ result = []; | |
+ } | |
+ | |
+ if ( Expr.preFilter[ type ] ) { | |
+ match = Expr.preFilter[ type ]( match,… | |
+ | |
+ if ( !match ) { | |
+ anyFound = found = true; | |
+ | |
+ } else if ( match === true ) { | |
+ continue; | |
+ } | |
+ } | |
+ | |
+ if ( match ) { | |
+ for ( i = 0; (item = curLoop[i]) != nu… | |
+ if ( item ) { | |
+ found = filter( item, … | |
+ pass = not ^ found; | |
+ | |
+ if ( inplace && found … | |
+ if ( pass ) { | |
+ anyFou… | |
+ | |
+ } else { | |
+ curLoo… | |
+ } | |
+ | |
+ } else if ( pass ) { | |
+ result.push( i… | |
+ anyFound = tru… | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ if ( found !== undefined ) { | |
+ if ( !inplace ) { | |
+ curLoop = result; | |
+ } | |
+ | |
+ expr = expr.replace( Expr.match[ type … | |
+ | |
+ if ( !anyFound ) { | |
+ return []; | |
+ } | |
+ | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Improper expression | |
+ if ( expr === old ) { | |
+ if ( anyFound == null ) { | |
+ Sizzle.error( expr ); | |
+ | |
+ } else { | |
+ break; | |
+ } | |
+ } | |
+ | |
+ old = expr; | |
+ } | |
+ | |
+ return curLoop; | |
+}; | |
+ | |
+Sizzle.error = function( msg ) { | |
+ throw new Error( "Syntax error, unrecognized expression: " + msg ); | |
+}; | |
+ | |
+/** | |
+ * Utility function for retreiving the text value of an array of DOM nodes | |
+ * @param {Array|Element} elem | |
+ */ | |
+var getText = Sizzle.getText = function( elem ) { | |
+ var i, node, | |
+ nodeType = elem.nodeType, | |
+ ret = ""; | |
+ | |
+ if ( nodeType ) { | |
+ if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { | |
+ // Use textContent || innerText for elements | |
+ if ( typeof elem.textContent === 'string' ) { | |
+ return elem.textContent; | |
+ } else if ( typeof elem.innerText === 'string' ) { | |
+ // Replace IE's carriage returns | |
+ return elem.innerText.replace( rReturn, '' ); | |
+ } else { | |
+ // Traverse it's children | |
+ for ( elem = elem.firstChild; elem; elem = ele… | |
+ ret += getText( elem ); | |
+ } | |
+ } | |
+ } else if ( nodeType === 3 || nodeType === 4 ) { | |
+ return elem.nodeValue; | |
+ } | |
+ } else { | |
+ | |
+ // If no nodeType, this is expected to be an array | |
+ for ( i = 0; (node = elem[i]); i++ ) { | |
+ // Do not traverse comment nodes | |
+ if ( node.nodeType !== 8 ) { | |
+ ret += getText( node ); | |
+ } | |
+ } | |
+ } | |
+ return ret; | |
+}; | |
+ | |
+var Expr = Sizzle.selectors = { | |
+ order: [ "ID", "NAME", "TAG" ], | |
+ | |
+ match: { | |
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, | |
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, | |
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, | |
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:([… | |
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, | |
+ CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]… | |
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-… | |
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)… | |
+ }, | |
+ | |
+ leftMatch: {}, | |
+ | |
+ attrMap: { | |
+ "class": "className", | |
+ "for": "htmlFor" | |
+ }, | |
+ | |
+ attrHandle: { | |
+ href: function( elem ) { | |
+ return elem.getAttribute( "href" ); | |
+ }, | |
+ type: function( elem ) { | |
+ return elem.getAttribute( "type" ); | |
+ } | |
+ }, | |
+ | |
+ relative: { | |
+ "+": function(checkSet, part){ | |
+ var isPartStr = typeof part === "string", | |
+ isTag = isPartStr && !rNonWord.test( part ), | |
+ isPartStrNotTag = isPartStr && !isTag; | |
+ | |
+ if ( isTag ) { | |
+ part = part.toLowerCase(); | |
+ } | |
+ | |
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++… | |
+ if ( (elem = checkSet[i]) ) { | |
+ while ( (elem = elem.previousSibling) … | |
+ | |
+ checkSet[i] = isPartStrNotTag || elem … | |
+ elem || false : | |
+ elem === part; | |
+ } | |
+ } | |
+ | |
+ if ( isPartStrNotTag ) { | |
+ Sizzle.filter( part, checkSet, true ); | |
+ } | |
+ }, | |
+ | |
+ ">": function( checkSet, part ) { | |
+ var elem, | |
+ isPartStr = typeof part === "string", | |
+ i = 0, | |
+ l = checkSet.length; | |
+ | |
+ if ( isPartStr && !rNonWord.test( part ) ) { | |
+ part = part.toLowerCase(); | |
+ | |
+ for ( ; i < l; i++ ) { | |
+ elem = checkSet[i]; | |
+ | |
+ if ( elem ) { | |
+ var parent = elem.parentNode; | |
+ checkSet[i] = parent.nodeName.… | |
+ } | |
+ } | |
+ | |
+ } else { | |
+ for ( ; i < l; i++ ) { | |
+ elem = checkSet[i]; | |
+ | |
+ if ( elem ) { | |
+ checkSet[i] = isPartStr ? | |
+ elem.parentNode : | |
+ elem.parentNode === pa… | |
+ } | |
+ } | |
+ | |
+ if ( isPartStr ) { | |
+ Sizzle.filter( part, checkSet, true ); | |
+ } | |
+ } | |
+ }, | |
+ | |
+ "": function(checkSet, part, isXML){ | |
+ var nodeCheck, | |
+ doneName = done++, | |
+ checkFn = dirCheck; | |
+ | |
+ if ( typeof part === "string" && !rNonWord.test( part … | |
+ part = part.toLowerCase(); | |
+ nodeCheck = part; | |
+ checkFn = dirNodeCheck; | |
+ } | |
+ | |
+ checkFn( "parentNode", part, doneName, checkSet, nodeC… | |
+ }, | |
+ | |
+ "~": function( checkSet, part, isXML ) { | |
+ var nodeCheck, | |
+ doneName = done++, | |
+ checkFn = dirCheck; | |
+ | |
+ if ( typeof part === "string" && !rNonWord.test( part … | |
+ part = part.toLowerCase(); | |
+ nodeCheck = part; | |
+ checkFn = dirNodeCheck; | |
+ } | |
+ | |
+ checkFn( "previousSibling", part, doneName, checkSet, … | |
+ } | |
+ }, | |
+ | |
+ find: { | |
+ ID: function( match, context, isXML ) { | |
+ if ( typeof context.getElementById !== "undefined" && … | |
+ var m = context.getElementById(match[1]); | |
+ // Check parentNode to catch when Blackberry 4… | |
+ // nodes that are no longer in the document #6… | |
+ return m && m.parentNode ? [m] : []; | |
+ } | |
+ }, | |
+ | |
+ NAME: function( match, context ) { | |
+ if ( typeof context.getElementsByName !== "undefined" … | |
+ var ret = [], | |
+ results = context.getElementsByName( m… | |
+ | |
+ for ( var i = 0, l = results.length; i < l; i+… | |
+ if ( results[i].getAttribute("name") =… | |
+ ret.push( results[i] ); | |
+ } | |
+ } | |
+ | |
+ return ret.length === 0 ? null : ret; | |
+ } | |
+ }, | |
+ | |
+ TAG: function( match, context ) { | |
+ if ( typeof context.getElementsByTagName !== "undefine… | |
+ return context.getElementsByTagName( match[1] … | |
+ } | |
+ } | |
+ }, | |
+ preFilter: { | |
+ CLASS: function( match, curLoop, inplace, result, not, isXML )… | |
+ match = " " + match[1].replace( rBackslash, "" ) + " "; | |
+ | |
+ if ( isXML ) { | |
+ return match; | |
+ } | |
+ | |
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i+… | |
+ if ( elem ) { | |
+ if ( not ^ (elem.className && (" " + e… | |
+ if ( !inplace ) { | |
+ result.push( elem ); | |
+ } | |
+ | |
+ } else if ( inplace ) { | |
+ curLoop[i] = false; | |
+ } | |
+ } | |
+ } | |
+ | |
+ return false; | |
+ }, | |
+ | |
+ ID: function( match ) { | |
+ return match[1].replace( rBackslash, "" ); | |
+ }, | |
+ | |
+ TAG: function( match, curLoop ) { | |
+ return match[1].replace( rBackslash, "" ).toLowerCase(… | |
+ }, | |
+ | |
+ CHILD: function( match ) { | |
+ if ( match[1] === "nth" ) { | |
+ if ( !match[2] ) { | |
+ Sizzle.error( match[0] ); | |
+ } | |
+ | |
+ match[2] = match[2].replace(/^\+|\s*/g, ''); | |
+ | |
+ // parse equations like 'even', 'odd', '5', '2… | |
+ var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( | |
+ match[2] === "even" && "2n" || match[2… | |
+ !/\D/.test( match[2] ) && "0n+" + matc… | |
+ | |
+ // calculate the numbers (first)n+(last) inclu… | |
+ match[2] = (test[1] + (test[2] || 1)) - 0; | |
+ match[3] = test[3] - 0; | |
+ } | |
+ else if ( match[2] ) { | |
+ Sizzle.error( match[0] ); | |
+ } | |
+ | |
+ // TODO: Move to normal caching system | |
+ match[0] = done++; | |
+ | |
+ return match; | |
+ }, | |
+ | |
+ ATTR: function( match, curLoop, inplace, result, not, isXML ) { | |
+ var name = match[1] = match[1].replace( rBackslash, ""… | |
+ | |
+ if ( !isXML && Expr.attrMap[name] ) { | |
+ match[1] = Expr.attrMap[name]; | |
+ } | |
+ | |
+ // Handle if an un-quoted value was used | |
+ match[4] = ( match[4] || match[5] || "" ).replace( rBa… | |
+ | |
+ if ( match[2] === "~=" ) { | |
+ match[4] = " " + match[4] + " "; | |
+ } | |
+ | |
+ return match; | |
+ }, | |
+ | |
+ PSEUDO: function( match, curLoop, inplace, result, not ) { | |
+ if ( match[1] === "not" ) { | |
+ // If we're dealing with a complex expression,… | |
+ if ( ( chunker.exec(match[3]) || "" ).length >… | |
+ match[3] = Sizzle(match[3], null, null… | |
+ | |
+ } else { | |
+ var ret = Sizzle.filter(match[3], curL… | |
+ | |
+ if ( !inplace ) { | |
+ result.push.apply( result, ret… | |
+ } | |
+ | |
+ return false; | |
+ } | |
+ | |
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.ma… | |
+ return true; | |
+ } | |
+ | |
+ return match; | |
+ }, | |
+ | |
+ POS: function( match ) { | |
+ match.unshift( true ); | |
+ | |
+ return match; | |
+ } | |
+ }, | |
+ | |
+ filters: { | |
+ enabled: function( elem ) { | |
+ return elem.disabled === false && elem.type !== "hidde… | |
+ }, | |
+ | |
+ disabled: function( elem ) { | |
+ return elem.disabled === true; | |
+ }, | |
+ | |
+ checked: function( elem ) { | |
+ return elem.checked === true; | |
+ }, | |
+ | |
+ selected: function( elem ) { | |
+ // Accessing this property makes selected-by-default | |
+ // options in Safari work properly | |
+ if ( elem.parentNode ) { | |
+ elem.parentNode.selectedIndex; | |
+ } | |
+ | |
+ return elem.selected === true; | |
+ }, | |
+ | |
+ parent: function( elem ) { | |
+ return !!elem.firstChild; | |
+ }, | |
+ | |
+ empty: function( elem ) { | |
+ return !elem.firstChild; | |
+ }, | |
+ | |
+ has: function( elem, i, match ) { | |
+ return !!Sizzle( match[3], elem ).length; | |
+ }, | |
+ | |
+ header: function( elem ) { | |
+ return (/h\d/i).test( elem.nodeName ); | |
+ }, | |
+ | |
+ text: function( elem ) { | |
+ var attr = elem.getAttribute( "type" ), type = elem.ty… | |
+ // IE6 and 7 will map elem.type to 'text' for new HTML… | |
+ // use getAttribute instead to test this case | |
+ return elem.nodeName.toLowerCase() === "input" && "tex… | |
+ }, | |
+ | |
+ radio: function( elem ) { | |
+ return elem.nodeName.toLowerCase() === "input" && "rad… | |
+ }, | |
+ | |
+ checkbox: function( elem ) { | |
+ return elem.nodeName.toLowerCase() === "input" && "che… | |
+ }, | |
+ | |
+ file: function( elem ) { | |
+ return elem.nodeName.toLowerCase() === "input" && "fil… | |
+ }, | |
+ | |
+ password: function( elem ) { | |
+ return elem.nodeName.toLowerCase() === "input" && "pas… | |
+ }, | |
+ | |
+ submit: function( elem ) { | |
+ var name = elem.nodeName.toLowerCase(); | |
+ return (name === "input" || name === "button") && "sub… | |
+ }, | |
+ | |
+ image: function( elem ) { | |
+ return elem.nodeName.toLowerCase() === "input" && "ima… | |
+ }, | |
+ | |
+ reset: function( elem ) { | |
+ var name = elem.nodeName.toLowerCase(); | |
+ return (name === "input" || name === "button") && "res… | |
+ }, | |
+ | |
+ button: function( elem ) { | |
+ var name = elem.nodeName.toLowerCase(); | |
+ return name === "input" && "button" === elem.type || n… | |
+ }, | |
+ | |
+ input: function( elem ) { | |
+ return (/input|select|textarea|button/i).test( elem.no… | |
+ }, | |
+ | |
+ focus: function( elem ) { | |
+ return elem === elem.ownerDocument.activeElement; | |
+ } | |
+ }, | |
+ setFilters: { | |
+ first: function( elem, i ) { | |
+ return i === 0; | |
+ }, | |
+ | |
+ last: function( elem, i, match, array ) { | |
+ return i === array.length - 1; | |
+ }, | |
+ | |
+ even: function( elem, i ) { | |
+ return i % 2 === 0; | |
+ }, | |
+ | |
+ odd: function( elem, i ) { | |
+ return i % 2 === 1; | |
+ }, | |
+ | |
+ lt: function( elem, i, match ) { | |
+ return i < match[3] - 0; | |
+ }, | |
+ | |
+ gt: function( elem, i, match ) { | |
+ return i > match[3] - 0; | |
+ }, | |
+ | |
+ nth: function( elem, i, match ) { | |
+ return match[3] - 0 === i; | |
+ }, | |
+ | |
+ eq: function( elem, i, match ) { | |
+ return match[3] - 0 === i; | |
+ } | |
+ }, | |
+ filter: { | |
+ PSEUDO: function( elem, match, i, array ) { | |
+ var name = match[1], | |
+ filter = Expr.filters[ name ]; | |
+ | |
+ if ( filter ) { | |
+ return filter( elem, i, match, array ); | |
+ | |
+ } else if ( name === "contains" ) { | |
+ return (elem.textContent || elem.innerText || … | |
+ | |
+ } else if ( name === "not" ) { | |
+ var not = match[3]; | |
+ | |
+ for ( var j = 0, l = not.length; j < l; j++ ) { | |
+ if ( not[j] === elem ) { | |
+ return false; | |
+ } | |
+ } | |
+ | |
+ return true; | |
+ | |
+ } else { | |
+ Sizzle.error( name ); | |
+ } | |
+ }, | |
+ | |
+ CHILD: function( elem, match ) { | |
+ var first, last, | |
+ doneName, parent, cache, | |
+ count, diff, | |
+ type = match[1], | |
+ node = elem; | |
+ | |
+ switch ( type ) { | |
+ case "only": | |
+ case "first": | |
+ while ( (node = node.previousSibling) … | |
+ if ( node.nodeType === 1 ) { | |
+ return false; | |
+ } | |
+ } | |
+ | |
+ if ( type === "first" ) { | |
+ return true; | |
+ } | |
+ | |
+ node = elem; | |
+ | |
+ /* falls through */ | |
+ case "last": | |
+ while ( (node = node.nextSibling) ) { | |
+ if ( node.nodeType === 1 ) { | |
+ return false; | |
+ } | |
+ } | |
+ | |
+ return true; | |
+ | |
+ case "nth": | |
+ first = match[2]; | |
+ last = match[3]; | |
+ | |
+ if ( first === 1 && last === 0 ) { | |
+ return true; | |
+ } | |
+ | |
+ doneName = match[0]; | |
+ parent = elem.parentNode; | |
+ | |
+ if ( parent && (parent[ expando ] !== … | |
+ count = 0; | |
+ | |
+ for ( node = parent.firstChild… | |
+ if ( node.nodeType ===… | |
+ node.nodeIndex… | |
+ } | |
+ } | |
+ | |
+ parent[ expando ] = doneName; | |
+ } | |
+ | |
+ diff = elem.nodeIndex - last; | |
+ | |
+ if ( first === 0 ) { | |
+ return diff === 0; | |
+ | |
+ } else { | |
+ return ( diff % first === 0 &&… | |
+ } | |
+ } | |
+ }, | |
+ | |
+ ID: function( elem, match ) { | |
+ return elem.nodeType === 1 && elem.getAttribute("id") … | |
+ }, | |
+ | |
+ TAG: function( elem, match ) { | |
+ return (match === "*" && elem.nodeType === 1) || !!ele… | |
+ }, | |
+ | |
+ CLASS: function( elem, match ) { | |
+ return (" " + (elem.className || elem.getAttribute("cl… | |
+ .indexOf( match ) > -1; | |
+ }, | |
+ | |
+ ATTR: function( elem, match ) { | |
+ var name = match[1], | |
+ result = Sizzle.attr ? | |
+ Sizzle.attr( elem, name ) : | |
+ Expr.attrHandle[ name ] ? | |
+ Expr.attrHandle[ name ]( elem ) : | |
+ elem[ name ] != null ? | |
+ elem[ name ] : | |
+ elem.getAttribute( name ), | |
+ value = result + "", | |
+ type = match[2], | |
+ check = match[4]; | |
+ | |
+ return result == null ? | |
+ type === "!=" : | |
+ !type && Sizzle.attr ? | |
+ result != null : | |
+ type === "=" ? | |
+ value === check : | |
+ type === "*=" ? | |
+ value.indexOf(check) >= 0 : | |
+ type === "~=" ? | |
+ (" " + value + " ").indexOf(check) >= 0 : | |
+ !check ? | |
+ value && result !== false : | |
+ type === "!=" ? | |
+ value !== check : | |
+ type === "^=" ? | |
+ value.indexOf(check) === 0 : | |
+ type === "$=" ? | |
+ value.substr(value.length - check.length) === … | |
+ type === "|=" ? | |
+ value === check || value.substr(0, check.lengt… | |
+ false; | |
+ }, | |
+ | |
+ POS: function( elem, match, i, array ) { | |
+ var name = match[2], | |
+ filter = Expr.setFilters[ name ]; | |
+ | |
+ if ( filter ) { | |
+ return filter( elem, i, match, array ); | |
+ } | |
+ } | |
+ } | |
+}; | |
+ | |
+var origPOS = Expr.match.POS, | |
+ fescape = function(all, num){ | |
+ return "\\" + (num - 0 + 1); | |
+ }; | |
+ | |
+for ( var type in Expr.match ) { | |
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[… | |
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.… | |
+} | |
+// Expose origPOS | |
+// "global" as in regardless of relation to brackets/parens | |
+Expr.match.globalPOS = origPOS; | |
+ | |
+var makeArray = function( array, results ) { | |
+ array = Array.prototype.slice.call( array, 0 ); | |
+ | |
+ if ( results ) { | |
+ results.push.apply( results, array ); | |
+ return results; | |
+ } | |
+ | |
+ return array; | |
+}; | |
+ | |
+// Perform a simple check to determine if the browser is capable of | |
+// converting a NodeList to an array using builtin methods. | |
+// Also verifies that the returned array holds DOM nodes | |
+// (which is not the case in the Blackberry browser) | |
+try { | |
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0… | |
+ | |
+// Provide a fallback method if it does not work | |
+} catch( e ) { | |
+ makeArray = function( array, results ) { | |
+ var i = 0, | |
+ ret = results || []; | |
+ | |
+ if ( toString.call(array) === "[object Array]" ) { | |
+ Array.prototype.push.apply( ret, array ); | |
+ | |
+ } else { | |
+ if ( typeof array.length === "number" ) { | |
+ for ( var l = array.length; i < l; i++ ) { | |
+ ret.push( array[i] ); | |
+ } | |
+ | |
+ } else { | |
+ for ( ; array[i]; i++ ) { | |
+ ret.push( array[i] ); | |
+ } | |
+ } | |
+ } | |
+ | |
+ return ret; | |
+ }; | |
+} | |
+ | |
+var sortOrder, siblingCheck; | |
+ | |
+if ( document.documentElement.compareDocumentPosition ) { | |
+ sortOrder = function( a, b ) { | |
+ if ( a === b ) { | |
+ hasDuplicate = true; | |
+ return 0; | |
+ } | |
+ | |
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition … | |
+ return a.compareDocumentPosition ? -1 : 1; | |
+ } | |
+ | |
+ return a.compareDocumentPosition(b) & 4 ? -1 : 1; | |
+ }; | |
+ | |
+} else { | |
+ sortOrder = function( a, b ) { | |
+ // The nodes are identical, we can exit early | |
+ if ( a === b ) { | |
+ hasDuplicate = true; | |
+ return 0; | |
+ | |
+ // Fallback to using sourceIndex (in IE) if it's available on … | |
+ } else if ( a.sourceIndex && b.sourceIndex ) { | |
+ return a.sourceIndex - b.sourceIndex; | |
+ } | |
+ | |
+ var al, bl, | |
+ ap = [], | |
+ bp = [], | |
+ aup = a.parentNode, | |
+ bup = b.parentNode, | |
+ cur = aup; | |
+ | |
+ // If the nodes are siblings (or identical) we can do a quick … | |
+ if ( aup === bup ) { | |
+ return siblingCheck( a, b ); | |
+ | |
+ // If no parents were found then the nodes are disconnected | |
+ } else if ( !aup ) { | |
+ return -1; | |
+ | |
+ } else if ( !bup ) { | |
+ return 1; | |
+ } | |
+ | |
+ // Otherwise they're somewhere else in the tree so we need | |
+ // to build up a full list of the parentNodes for comparison | |
+ while ( cur ) { | |
+ ap.unshift( cur ); | |
+ cur = cur.parentNode; | |
+ } | |
+ | |
+ cur = bup; | |
+ | |
+ while ( cur ) { | |
+ bp.unshift( cur ); | |
+ cur = cur.parentNode; | |
+ } | |
+ | |
+ al = ap.length; | |
+ bl = bp.length; | |
+ | |
+ // Start walking down the tree looking for a discrepancy | |
+ for ( var i = 0; i < al && i < bl; i++ ) { | |
+ if ( ap[i] !== bp[i] ) { | |
+ return siblingCheck( ap[i], bp[i] ); | |
+ } | |
+ } | |
+ | |
+ // We ended someplace up the tree so do a sibling check | |
+ return i === al ? | |
+ siblingCheck( a, bp[i], -1 ) : | |
+ siblingCheck( ap[i], b, 1 ); | |
+ }; | |
+ | |
+ siblingCheck = function( a, b, ret ) { | |
+ if ( a === b ) { | |
+ return ret; | |
+ } | |
+ | |
+ var cur = a.nextSibling; | |
+ | |
+ while ( cur ) { | |
+ if ( cur === b ) { | |
+ return -1; | |
+ } | |
+ | |
+ cur = cur.nextSibling; | |
+ } | |
+ | |
+ return 1; | |
+ }; | |
+} | |
+ | |
+// Check to see if the browser returns elements by name when | |
+// querying by getElementById (and provide a workaround) | |
+(function(){ | |
+ // We're going to inject a fake input element with a specified name | |
+ var form = document.createElement("div"), | |
+ id = "script" + (new Date()).getTime(), | |
+ root = document.documentElement; | |
+ | |
+ form.innerHTML = "<a name='" + id + "'/>"; | |
+ | |
+ // Inject it into the root element, check its status, and remove it qu… | |
+ root.insertBefore( form, root.firstChild ); | |
+ | |
+ // The workaround has to do additional checks after a getElementById | |
+ // Which slows things down for other browsers (hence the branching) | |
+ if ( document.getElementById( id ) ) { | |
+ Expr.find.ID = function( match, context, isXML ) { | |
+ if ( typeof context.getElementById !== "undefined" && … | |
+ var m = context.getElementById(match[1]); | |
+ | |
+ return m ? | |
+ m.id === match[1] || typeof m.getAttri… | |
+ [m] : | |
+ undefined : | |
+ []; | |
+ } | |
+ }; | |
+ | |
+ Expr.filter.ID = function( elem, match ) { | |
+ var node = typeof elem.getAttributeNode !== "undefined… | |
+ | |
+ return elem.nodeType === 1 && node && node.nodeValue =… | |
+ }; | |
+ } | |
+ | |
+ root.removeChild( form ); | |
+ | |
+ // release memory in IE | |
+ root = form = null; | |
+})(); | |
+ | |
+(function(){ | |
+ // Check to see if the browser returns only elements | |
+ // when doing getElementsByTagName("*") | |
+ | |
+ // Create a fake element | |
+ var div = document.createElement("div"); | |
+ div.appendChild( document.createComment("") ); | |
+ | |
+ // Make sure no comments are found | |
+ if ( div.getElementsByTagName("*").length > 0 ) { | |
+ Expr.find.TAG = function( match, context ) { | |
+ var results = context.getElementsByTagName( match[1] ); | |
+ | |
+ // Filter out possible comments | |
+ if ( match[1] === "*" ) { | |
+ var tmp = []; | |
+ | |
+ for ( var i = 0; results[i]; i++ ) { | |
+ if ( results[i].nodeType === 1 ) { | |
+ tmp.push( results[i] ); | |
+ } | |
+ } | |
+ | |
+ results = tmp; | |
+ } | |
+ | |
+ return results; | |
+ }; | |
+ } | |
+ | |
+ // Check to see if an attribute returns normalized href attributes | |
+ div.innerHTML = "<a href='#'></a>"; | |
+ | |
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefin… | |
+ div.firstChild.getAttribute("href") !== "#" ) { | |
+ | |
+ Expr.attrHandle.href = function( elem ) { | |
+ return elem.getAttribute( "href", 2 ); | |
+ }; | |
+ } | |
+ | |
+ // release memory in IE | |
+ div = null; | |
+})(); | |
+ | |
+if ( document.querySelectorAll ) { | |
+ (function(){ | |
+ var oldSizzle = Sizzle, | |
+ div = document.createElement("div"), | |
+ id = "__sizzle__"; | |
+ | |
+ div.innerHTML = "<p class='TEST'></p>"; | |
+ | |
+ // Safari can't handle uppercase or unicode characters when | |
+ // in quirks mode. | |
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").len… | |
+ return; | |
+ } | |
+ | |
+ Sizzle = function( query, context, extra, seed ) { | |
+ context = context || document; | |
+ | |
+ // Only use querySelectorAll on non-XML documents | |
+ // (ID selectors don't work in non-HTML documents) | |
+ if ( !seed && !Sizzle.isXML(context) ) { | |
+ // See if we find a selector to speed up | |
+ var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$… | |
+ | |
+ if ( match && (context.nodeType === 1 || conte… | |
+ // Speed-up: Sizzle("TAG") | |
+ if ( match[1] ) { | |
+ return makeArray( context.getE… | |
+ | |
+ // Speed-up: Sizzle(".CLASS") | |
+ } else if ( match[2] && Expr.find.CLAS… | |
+ return makeArray( context.getE… | |
+ } | |
+ } | |
+ | |
+ if ( context.nodeType === 9 ) { | |
+ // Speed-up: Sizzle("body") | |
+ // The body element only exists once, … | |
+ if ( query === "body" && context.body … | |
+ return makeArray( [ context.bo… | |
+ | |
+ // Speed-up: Sizzle("#ID") | |
+ } else if ( match && match[3] ) { | |
+ var elem = context.getElementB… | |
+ | |
+ // Check parentNode to catch w… | |
+ // nodes that are no longer in… | |
+ if ( elem && elem.parentNode )… | |
+ // Handle the case whe… | |
+ // by name instead of … | |
+ if ( elem.id === match… | |
+ return makeArr… | |
+ } | |
+ | |
+ } else { | |
+ return makeArray( [], … | |
+ } | |
+ } | |
+ | |
+ try { | |
+ return makeArray( context.quer… | |
+ } catch(qsaError) {} | |
+ | |
+ // qSA works strangely on Element-rooted queri… | |
+ // We can work around this by specifying an ex… | |
+ // and working up from there (Thanks to Andrew… | |
+ // IE 8 doesn't work on object elements | |
+ } else if ( context.nodeType === 1 && context.… | |
+ var oldContext = context, | |
+ old = context.getAttribute( "i… | |
+ nid = old || id, | |
+ hasParent = context.parentNode, | |
+ relativeHierarchySelector = /^… | |
+ | |
+ if ( !old ) { | |
+ context.setAttribute( "id", ni… | |
+ } else { | |
+ nid = nid.replace( /'/g, "\\$&… | |
+ } | |
+ if ( relativeHierarchySelector && hasP… | |
+ context = context.parentNode; | |
+ } | |
+ | |
+ try { | |
+ if ( !relativeHierarchySelecto… | |
+ return makeArray( cont… | |
+ } | |
+ | |
+ } catch(pseudoError) { | |
+ } finally { | |
+ if ( !old ) { | |
+ oldContext.removeAttri… | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ return oldSizzle(query, context, extra, seed); | |
+ }; | |
+ | |
+ for ( var prop in oldSizzle ) { | |
+ Sizzle[ prop ] = oldSizzle[ prop ]; | |
+ } | |
+ | |
+ // release memory in IE | |
+ div = null; | |
+ })(); | |
+} | |
+ | |
+(function(){ | |
+ var html = document.documentElement, | |
+ matches = html.matchesSelector || html.mozMatchesSelector || h… | |
+ | |
+ if ( matches ) { | |
+ // Check to see if it's possible to do matchesSelector | |
+ // on a disconnected node (IE 9 fails this) | |
+ var disconnectedMatch = !matches.call( document.createElement(… | |
+ pseudoWorks = false; | |
+ | |
+ try { | |
+ // This should fail with an exception | |
+ // Gecko does not error, returns false instead | |
+ matches.call( document.documentElement, "[test!='']:si… | |
+ | |
+ } catch( pseudoError ) { | |
+ pseudoWorks = true; | |
+ } | |
+ | |
+ Sizzle.matchesSelector = function( node, expr ) { | |
+ // Make sure that attribute selectors are quoted | |
+ expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); | |
+ | |
+ if ( !Sizzle.isXML( node ) ) { | |
+ try { | |
+ if ( pseudoWorks || !Expr.match.PSEUDO… | |
+ var ret = matches.call( node, … | |
+ | |
+ // IE 9's matchesSelector retu… | |
+ if ( ret || !disconnectedMatch… | |
+ // As well, di… | |
+ // fragment in… | |
+ node.document … | |
+ return ret; | |
+ } | |
+ } | |
+ } catch(e) {} | |
+ } | |
+ | |
+ return Sizzle(expr, null, null, [node]).length > 0; | |
+ }; | |
+ } | |
+})(); | |
+ | |
+(function(){ | |
+ var div = document.createElement("div"); | |
+ | |
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>"; | |
+ | |
+ // Opera can't find a second classname (in 9.6) | |
+ // Also, make sure that getElementsByClassName actually exists | |
+ if ( !div.getElementsByClassName || div.getElementsByClassName("e").le… | |
+ return; | |
+ } | |
+ | |
+ // Safari caches class attributes, doesn't catch changes (in 3.2) | |
+ div.lastChild.className = "e"; | |
+ | |
+ if ( div.getElementsByClassName("e").length === 1 ) { | |
+ return; | |
+ } | |
+ | |
+ Expr.order.splice(1, 0, "CLASS"); | |
+ Expr.find.CLASS = function( match, context, isXML ) { | |
+ if ( typeof context.getElementsByClassName !== "undefined" && … | |
+ return context.getElementsByClassName(match[1]); | |
+ } | |
+ }; | |
+ | |
+ // release memory in IE | |
+ div = null; | |
+})(); | |
+ | |
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { | |
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) { | |
+ var elem = checkSet[i]; | |
+ | |
+ if ( elem ) { | |
+ var match = false; | |
+ | |
+ elem = elem[dir]; | |
+ | |
+ while ( elem ) { | |
+ if ( elem[ expando ] === doneName ) { | |
+ match = checkSet[elem.sizset]; | |
+ break; | |
+ } | |
+ | |
+ if ( elem.nodeType === 1 && !isXML ){ | |
+ elem[ expando ] = doneName; | |
+ elem.sizset = i; | |
+ } | |
+ | |
+ if ( elem.nodeName.toLowerCase() === cur ) { | |
+ match = elem; | |
+ break; | |
+ } | |
+ | |
+ elem = elem[dir]; | |
+ } | |
+ | |
+ checkSet[i] = match; | |
+ } | |
+ } | |
+} | |
+ | |
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { | |
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) { | |
+ var elem = checkSet[i]; | |
+ | |
+ if ( elem ) { | |
+ var match = false; | |
+ | |
+ elem = elem[dir]; | |
+ | |
+ while ( elem ) { | |
+ if ( elem[ expando ] === doneName ) { | |
+ match = checkSet[elem.sizset]; | |
+ break; | |
+ } | |
+ | |
+ if ( elem.nodeType === 1 ) { | |
+ if ( !isXML ) { | |
+ elem[ expando ] = doneName; | |
+ elem.sizset = i; | |
+ } | |
+ | |
+ if ( typeof cur !== "string" ) { | |
+ if ( elem === cur ) { | |
+ match = true; | |
+ break; | |
+ } | |
+ | |
+ } else if ( Sizzle.filter( cur, [elem]… | |
+ match = elem; | |
+ break; | |
+ } | |
+ } | |
+ | |
+ elem = elem[dir]; | |
+ } | |
+ | |
+ checkSet[i] = match; | |
+ } | |
+ } | |
+} | |
+ | |
+if ( document.documentElement.contains ) { | |
+ Sizzle.contains = function( a, b ) { | |
+ return a !== b && (a.contains ? a.contains(b) : true); | |
+ }; | |
+ | |
+} else if ( document.documentElement.compareDocumentPosition ) { | |
+ Sizzle.contains = function( a, b ) { | |
+ return !!(a.compareDocumentPosition(b) & 16); | |
+ }; | |
+ | |
+} else { | |
+ Sizzle.contains = function() { | |
+ return false; | |
+ }; | |
+} | |
+ | |
+Sizzle.isXML = function( elem ) { | |
+ // documentElement is verified for cases where it doesn't yet exist | |
+ // (such as loading iframes in IE - #4833) | |
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).document… | |
+ | |
+ return documentElement ? documentElement.nodeName !== "HTML" : false; | |
+}; | |
+ | |
+var posProcess = function( selector, context, seed ) { | |
+ var match, | |
+ tmpSet = [], | |
+ later = "", | |
+ root = context.nodeType ? [context] : context; | |
+ | |
+ // Position selectors must be done after the filter | |
+ // And so must :not(positional) so we move all PSEUDOs to the end | |
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) { | |
+ later += match[0]; | |
+ selector = selector.replace( Expr.match.PSEUDO, "" ); | |
+ } | |
+ | |
+ selector = Expr.relative[selector] ? selector + "*" : selector; | |
+ | |
+ for ( var i = 0, l = root.length; i < l; i++ ) { | |
+ Sizzle( selector, root[i], tmpSet, seed ); | |
+ } | |
+ | |
+ return Sizzle.filter( later, tmpSet ); | |
+}; | |
+ | |
+// EXPOSE | |
+// Override sizzle attribute retrieval | |
+Sizzle.attr = jQuery.attr; | |
+Sizzle.selectors.attrMap = {}; | |
+jQuery.find = Sizzle; | |
+jQuery.expr = Sizzle.selectors; | |
+jQuery.expr[":"] = jQuery.expr.filters; | |
+jQuery.unique = Sizzle.uniqueSort; | |
+jQuery.text = Sizzle.getText; | |
+jQuery.isXMLDoc = Sizzle.isXML; | |
+jQuery.contains = Sizzle.contains; | |
+ | |
+ | |
+})(); | |
+ | |
+ | |
+var runtil = /Until$/, | |
+ rparentsprev = /^(?:parents|prevUntil|prevAll)/, | |
+ // Note: This RegExp should be improved, or likely pulled from Sizzle | |
+ rmultiselector = /,/, | |
+ isSimple = /^.[^:#\[\.,]*$/, | |
+ slice = Array.prototype.slice, | |
+ POS = jQuery.expr.match.globalPOS, | |
+ // methods guaranteed to produce a unique set when starting from a uni… | |
+ guaranteedUnique = { | |
+ children: true, | |
+ contents: true, | |
+ next: true, | |
+ prev: true | |
+ }; | |
+ | |
+jQuery.fn.extend({ | |
+ find: function( selector ) { | |
+ var self = this, | |
+ i, l; | |
+ | |
+ if ( typeof selector !== "string" ) { | |
+ return jQuery( selector ).filter(function() { | |
+ for ( i = 0, l = self.length; i < l; i++ ) { | |
+ if ( jQuery.contains( self[ i ], this … | |
+ return true; | |
+ } | |
+ } | |
+ }); | |
+ } | |
+ | |
+ var ret = this.pushStack( "", "find", selector ), | |
+ length, n, r; | |
+ | |
+ for ( i = 0, l = this.length; i < l; i++ ) { | |
+ length = ret.length; | |
+ jQuery.find( selector, this[i], ret ); | |
+ | |
+ if ( i > 0 ) { | |
+ // Make sure that the results are unique | |
+ for ( n = length; n < ret.length; n++ ) { | |
+ for ( r = 0; r < length; r++ ) { | |
+ if ( ret[r] === ret[n] ) { | |
+ ret.splice(n--, 1); | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ return ret; | |
+ }, | |
+ | |
+ has: function( target ) { | |
+ var targets = jQuery( target ); | |
+ return this.filter(function() { | |
+ for ( var i = 0, l = targets.length; i < l; i++ ) { | |
+ if ( jQuery.contains( this, targets[i] ) ) { | |
+ return true; | |
+ } | |
+ } | |
+ }); | |
+ }, | |
+ | |
+ not: function( selector ) { | |
+ return this.pushStack( winnow(this, selector, false), "not", s… | |
+ }, | |
+ | |
+ filter: function( selector ) { | |
+ return this.pushStack( winnow(this, selector, true), "filter",… | |
+ }, | |
+ | |
+ is: function( selector ) { | |
+ return !!selector && ( | |
+ typeof selector === "string" ? | |
+ // If this is a positional selector, check mem… | |
+ // so $("p:first").is("p:last") won't return t… | |
+ POS.test( selector ) ? | |
+ jQuery( selector, this.context ).index… | |
+ jQuery.filter( selector, this ).length… | |
+ this.filter( selector ).length > 0 ); | |
+ }, | |
+ | |
+ closest: function( selectors, context ) { | |
+ var ret = [], i, l, cur = this[0]; | |
+ | |
+ // Array (deprecated as of jQuery 1.7) | |
+ if ( jQuery.isArray( selectors ) ) { | |
+ var level = 1; | |
+ | |
+ while ( cur && cur.ownerDocument && cur !== context ) { | |
+ for ( i = 0; i < selectors.length; i++ ) { | |
+ | |
+ if ( jQuery( cur ).is( selectors[ i ] … | |
+ ret.push({ selector: selectors… | |
+ } | |
+ } | |
+ | |
+ cur = cur.parentNode; | |
+ level++; | |
+ } | |
+ | |
+ return ret; | |
+ } | |
+ | |
+ // String | |
+ var pos = POS.test( selectors ) || typeof selectors !== "strin… | |
+ jQuery( selectors, context || this.context ) : | |
+ 0; | |
+ | |
+ for ( i = 0, l = this.length; i < l; i++ ) { | |
+ cur = this[i]; | |
+ | |
+ while ( cur ) { | |
+ if ( pos ? pos.index(cur) > -1 : jQuery.find.m… | |
+ ret.push( cur ); | |
+ break; | |
+ | |
+ } else { | |
+ cur = cur.parentNode; | |
+ if ( !cur || !cur.ownerDocument || cur… | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ ret = ret.length > 1 ? jQuery.unique( ret ) : ret; | |
+ | |
+ return this.pushStack( ret, "closest", selectors ); | |
+ }, | |
+ | |
+ // Determine the position of an element within | |
+ // the matched set of elements | |
+ index: function( elem ) { | |
+ | |
+ // No argument, return index in parent | |
+ if ( !elem ) { | |
+ return ( this[0] && this[0].parentNode ) ? this.prevAl… | |
+ } | |
+ | |
+ // index in selector | |
+ if ( typeof elem === "string" ) { | |
+ return jQuery.inArray( this[0], jQuery( elem ) ); | |
+ } | |
+ | |
+ // Locate the position of the desired element | |
+ return jQuery.inArray( | |
+ // If it receives a jQuery object, the first element i… | |
+ elem.jquery ? elem[0] : elem, this ); | |
+ }, | |
+ | |
+ add: function( selector, context ) { | |
+ var set = typeof selector === "string" ? | |
+ jQuery( selector, context ) : | |
+ jQuery.makeArray( selector && selector.nodeTyp… | |
+ all = jQuery.merge( this.get(), set ); | |
+ | |
+ return this.pushStack( isDisconnected( set[0] ) || isDisconnec… | |
+ all : | |
+ jQuery.unique( all ) ); | |
+ }, | |
+ | |
+ andSelf: function() { | |
+ return this.add( this.prevObject ); | |
+ } | |
+}); | |
+ | |
+// A painfully simple check to see if an element is disconnected | |
+// from a document (should be improved, where feasible). | |
+function isDisconnected( node ) { | |
+ return !node || !node.parentNode || node.parentNode.nodeType === 11; | |
+} | |
+ | |
+jQuery.each({ | |
+ parent: function( elem ) { | |
+ var parent = elem.parentNode; | |
+ return parent && parent.nodeType !== 11 ? parent : null; | |
+ }, | |
+ parents: function( elem ) { | |
+ return jQuery.dir( elem, "parentNode" ); | |
+ }, | |
+ parentsUntil: function( elem, i, until ) { | |
+ return jQuery.dir( elem, "parentNode", until ); | |
+ }, | |
+ next: function( elem ) { | |
+ return jQuery.nth( elem, 2, "nextSibling" ); | |
+ }, | |
+ prev: function( elem ) { | |
+ return jQuery.nth( elem, 2, "previousSibling" ); | |
+ }, | |
+ nextAll: function( elem ) { | |
+ return jQuery.dir( elem, "nextSibling" ); | |
+ }, | |
+ prevAll: function( elem ) { | |
+ return jQuery.dir( elem, "previousSibling" ); | |
+ }, | |
+ nextUntil: function( elem, i, until ) { | |
+ return jQuery.dir( elem, "nextSibling", until ); | |
+ }, | |
+ prevUntil: function( elem, i, until ) { | |
+ return jQuery.dir( elem, "previousSibling", until ); | |
+ }, | |
+ siblings: function( elem ) { | |
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, e… | |
+ }, | |
+ children: function( elem ) { | |
+ return jQuery.sibling( elem.firstChild ); | |
+ }, | |
+ contents: function( elem ) { | |
+ return jQuery.nodeName( elem, "iframe" ) ? | |
+ elem.contentDocument || elem.contentWindow.document : | |
+ jQuery.makeArray( elem.childNodes ); | |
+ } | |
+}, function( name, fn ) { | |
+ jQuery.fn[ name ] = function( until, selector ) { | |
+ var ret = jQuery.map( this, fn, until ); | |
+ | |
+ if ( !runtil.test( name ) ) { | |
+ selector = until; | |
+ } | |
+ | |
+ if ( selector && typeof selector === "string" ) { | |
+ ret = jQuery.filter( selector, ret ); | |
+ } | |
+ | |
+ ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.un… | |
+ | |
+ if ( (this.length > 1 || rmultiselector.test( selector )) && r… | |
+ ret = ret.reverse(); | |
+ } | |
+ | |
+ return this.pushStack( ret, name, slice.call( arguments ).join… | |
+ }; | |
+}); | |
+ | |
+jQuery.extend({ | |
+ filter: function( expr, elems, not ) { | |
+ if ( not ) { | |
+ expr = ":not(" + expr + ")"; | |
+ } | |
+ | |
+ return elems.length === 1 ? | |
+ jQuery.find.matchesSelector(elems[0], expr) ? [ elems[… | |
+ jQuery.find.matches(expr, elems); | |
+ }, | |
+ | |
+ dir: function( elem, dir, until ) { | |
+ var matched = [], | |
+ cur = elem[ dir ]; | |
+ | |
+ while ( cur && cur.nodeType !== 9 && (until === undefined || c… | |
+ if ( cur.nodeType === 1 ) { | |
+ matched.push( cur ); | |
+ } | |
+ cur = cur[dir]; | |
+ } | |
+ return matched; | |
+ }, | |
+ | |
+ nth: function( cur, result, dir, elem ) { | |
+ result = result || 1; | |
+ var num = 0; | |
+ | |
+ for ( ; cur; cur = cur[dir] ) { | |
+ if ( cur.nodeType === 1 && ++num === result ) { | |
+ break; | |
+ } | |
+ } | |
+ | |
+ return cur; | |
+ }, | |
+ | |
+ sibling: function( n, elem ) { | |
+ var r = []; | |
+ | |
+ for ( ; n; n = n.nextSibling ) { | |
+ if ( n.nodeType === 1 && n !== elem ) { | |
+ r.push( n ); | |
+ } | |
+ } | |
+ | |
+ return r; | |
+ } | |
+}); | |
+ | |
+// Implement the identical functionality for filter and not | |
+function winnow( elements, qualifier, keep ) { | |
+ | |
+ // Can't pass null or undefined to indexOf in Firefox 4 | |
+ // Set to 0 to skip string check | |
+ qualifier = qualifier || 0; | |
+ | |
+ if ( jQuery.isFunction( qualifier ) ) { | |
+ return jQuery.grep(elements, function( elem, i ) { | |
+ var retVal = !!qualifier.call( elem, i, elem ); | |
+ return retVal === keep; | |
+ }); | |
+ | |
+ } else if ( qualifier.nodeType ) { | |
+ return jQuery.grep(elements, function( elem, i ) { | |
+ return ( elem === qualifier ) === keep; | |
+ }); | |
+ | |
+ } else if ( typeof qualifier === "string" ) { | |
+ var filtered = jQuery.grep(elements, function( elem ) { | |
+ return elem.nodeType === 1; | |
+ }); | |
+ | |
+ if ( isSimple.test( qualifier ) ) { | |
+ return jQuery.filter(qualifier, filtered, !keep); | |
+ } else { | |
+ qualifier = jQuery.filter( qualifier, filtered ); | |
+ } | |
+ } | |
+ | |
+ return jQuery.grep(elements, function( elem, i ) { | |
+ return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; | |
+ }); | |
+} | |
+ | |
+ | |
+ | |
+ | |
+function createSafeFragment( document ) { | |
+ var list = nodeNames.split( "|" ), | |
+ safeFrag = document.createDocumentFragment(); | |
+ | |
+ if ( safeFrag.createElement ) { | |
+ while ( list.length ) { | |
+ safeFrag.createElement( | |
+ list.pop() | |
+ ); | |
+ } | |
+ } | |
+ return safeFrag; | |
+} | |
+ | |
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|fig… | |
+ "header|hgroup|mark|meter|nav|output|progress|section|summary|… | |
+ rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, | |
+ rleadingWhitespace = /^\s+/, | |
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:… | |
+ rtagName = /<([\w:]+)/, | |
+ rtbody = /<tbody/i, | |
+ rhtml = /<|&#?\w+;/, | |
+ rnoInnerhtml = /<(?:script|style)/i, | |
+ rnocache = /<(?:script|object|embed|option|style)/i, | |
+ rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), | |
+ // checked="checked" or checked | |
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, | |
+ rscriptType = /\/(java|ecma)script/i, | |
+ rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/, | |
+ wrapMap = { | |
+ option: [ 1, "<select multiple='multiple'>", "</select>" ], | |
+ legend: [ 1, "<fieldset>", "</fieldset>" ], | |
+ thead: [ 1, "<table>", "</table>" ], | |
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ], | |
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], | |
+ col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></ta… | |
+ area: [ 1, "<map>", "</map>" ], | |
+ _default: [ 0, "", "" ] | |
+ }, | |
+ safeFragment = createSafeFragment( document ); | |
+ | |
+wrapMap.optgroup = wrapMap.option; | |
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.t… | |
+wrapMap.th = wrapMap.td; | |
+ | |
+// IE can't serialize <link> and <script> tags normally | |
+if ( !jQuery.support.htmlSerialize ) { | |
+ wrapMap._default = [ 1, "div<div>", "</div>" ]; | |
+} | |
+ | |
+jQuery.fn.extend({ | |
+ text: function( value ) { | |
+ return jQuery.access( this, function( value ) { | |
+ return value === undefined ? | |
+ jQuery.text( this ) : | |
+ this.empty().append( ( this[0] && this[0].owne… | |
+ }, null, value, arguments.length ); | |
+ }, | |
+ | |
+ wrapAll: function( html ) { | |
+ if ( jQuery.isFunction( html ) ) { | |
+ return this.each(function(i) { | |
+ jQuery(this).wrapAll( html.call(this, i) ); | |
+ }); | |
+ } | |
+ | |
+ if ( this[0] ) { | |
+ // The elements to wrap the target around | |
+ var wrap = jQuery( html, this[0].ownerDocument ).eq(0)… | |
+ | |
+ if ( this[0].parentNode ) { | |
+ wrap.insertBefore( this[0] ); | |
+ } | |
+ | |
+ wrap.map(function() { | |
+ var elem = this; | |
+ | |
+ while ( elem.firstChild && elem.firstChild.nod… | |
+ elem = elem.firstChild; | |
+ } | |
+ | |
+ return elem; | |
+ }).append( this ); | |
+ } | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ wrapInner: function( html ) { | |
+ if ( jQuery.isFunction( html ) ) { | |
+ return this.each(function(i) { | |
+ jQuery(this).wrapInner( html.call(this, i) ); | |
+ }); | |
+ } | |
+ | |
+ return this.each(function() { | |
+ var self = jQuery( this ), | |
+ contents = self.contents(); | |
+ | |
+ if ( contents.length ) { | |
+ contents.wrapAll( html ); | |
+ | |
+ } else { | |
+ self.append( html ); | |
+ } | |
+ }); | |
+ }, | |
+ | |
+ wrap: function( html ) { | |
+ var isFunction = jQuery.isFunction( html ); | |
+ | |
+ return this.each(function(i) { | |
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i… | |
+ }); | |
+ }, | |
+ | |
+ unwrap: function() { | |
+ return this.parent().each(function() { | |
+ if ( !jQuery.nodeName( this, "body" ) ) { | |
+ jQuery( this ).replaceWith( this.childNodes ); | |
+ } | |
+ }).end(); | |
+ }, | |
+ | |
+ append: function() { | |
+ return this.domManip(arguments, true, function( elem ) { | |
+ if ( this.nodeType === 1 ) { | |
+ this.appendChild( elem ); | |
+ } | |
+ }); | |
+ }, | |
+ | |
+ prepend: function() { | |
+ return this.domManip(arguments, true, function( elem ) { | |
+ if ( this.nodeType === 1 ) { | |
+ this.insertBefore( elem, this.firstChild ); | |
+ } | |
+ }); | |
+ }, | |
+ | |
+ before: function() { | |
+ if ( this[0] && this[0].parentNode ) { | |
+ return this.domManip(arguments, false, function( elem … | |
+ this.parentNode.insertBefore( elem, this ); | |
+ }); | |
+ } else if ( arguments.length ) { | |
+ var set = jQuery.clean( arguments ); | |
+ set.push.apply( set, this.toArray() ); | |
+ return this.pushStack( set, "before", arguments ); | |
+ } | |
+ }, | |
+ | |
+ after: function() { | |
+ if ( this[0] && this[0].parentNode ) { | |
+ return this.domManip(arguments, false, function( elem … | |
+ this.parentNode.insertBefore( elem, this.nextS… | |
+ }); | |
+ } else if ( arguments.length ) { | |
+ var set = this.pushStack( this, "after", arguments ); | |
+ set.push.apply( set, jQuery.clean(arguments) ); | |
+ return set; | |
+ } | |
+ }, | |
+ | |
+ // keepData is for internal use only--do not document | |
+ remove: function( selector, keepData ) { | |
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { | |
+ if ( !selector || jQuery.filter( selector, [ elem ] ).… | |
+ if ( !keepData && elem.nodeType === 1 ) { | |
+ jQuery.cleanData( elem.getElementsByTa… | |
+ jQuery.cleanData( [ elem ] ); | |
+ } | |
+ | |
+ if ( elem.parentNode ) { | |
+ elem.parentNode.removeChild( elem ); | |
+ } | |
+ } | |
+ } | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ empty: function() { | |
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { | |
+ // Remove element nodes and prevent memory leaks | |
+ if ( elem.nodeType === 1 ) { | |
+ jQuery.cleanData( elem.getElementsByTagName("*… | |
+ } | |
+ | |
+ // Remove any remaining nodes | |
+ while ( elem.firstChild ) { | |
+ elem.removeChild( elem.firstChild ); | |
+ } | |
+ } | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ clone: function( dataAndEvents, deepDataAndEvents ) { | |
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents; | |
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents … | |
+ | |
+ return this.map( function () { | |
+ return jQuery.clone( this, dataAndEvents, deepDataAndE… | |
+ }); | |
+ }, | |
+ | |
+ html: function( value ) { | |
+ return jQuery.access( this, function( value ) { | |
+ var elem = this[0] || {}, | |
+ i = 0, | |
+ l = this.length; | |
+ | |
+ if ( value === undefined ) { | |
+ return elem.nodeType === 1 ? | |
+ elem.innerHTML.replace( rinlinejQuery,… | |
+ null; | |
+ } | |
+ | |
+ | |
+ if ( typeof value === "string" && !rnoInnerhtml.test( … | |
+ ( jQuery.support.leadingWhitespace || !rleadin… | |
+ !wrapMap[ ( rtagName.exec( value ) || ["", ""]… | |
+ | |
+ value = value.replace( rxhtmlTag, "<$1></$2>" … | |
+ | |
+ try { | |
+ for (; i < l; i++ ) { | |
+ // Remove element nodes and pr… | |
+ elem = this[i] || {}; | |
+ if ( elem.nodeType === 1 ) { | |
+ jQuery.cleanData( elem… | |
+ elem.innerHTML = value; | |
+ } | |
+ } | |
+ | |
+ elem = 0; | |
+ | |
+ // If using innerHTML throws an exception, use… | |
+ } catch(e) {} | |
+ } | |
+ | |
+ if ( elem ) { | |
+ this.empty().append( value ); | |
+ } | |
+ }, null, value, arguments.length ); | |
+ }, | |
+ | |
+ replaceWith: function( value ) { | |
+ if ( this[0] && this[0].parentNode ) { | |
+ // Make sure that the elements are removed from the DO… | |
+ // this can help fix replacing a parent with child ele… | |
+ if ( jQuery.isFunction( value ) ) { | |
+ return this.each(function(i) { | |
+ var self = jQuery(this), old = self.ht… | |
+ self.replaceWith( value.call( this, i,… | |
+ }); | |
+ } | |
+ | |
+ if ( typeof value !== "string" ) { | |
+ value = jQuery( value ).detach(); | |
+ } | |
+ | |
+ return this.each(function() { | |
+ var next = this.nextSibling, | |
+ parent = this.parentNode; | |
+ | |
+ jQuery( this ).remove(); | |
+ | |
+ if ( next ) { | |
+ jQuery(next).before( value ); | |
+ } else { | |
+ jQuery(parent).append( value ); | |
+ } | |
+ }); | |
+ } else { | |
+ return this.length ? | |
+ this.pushStack( jQuery(jQuery.isFunction(value… | |
+ this; | |
+ } | |
+ }, | |
+ | |
+ detach: function( selector ) { | |
+ return this.remove( selector, true ); | |
+ }, | |
+ | |
+ domManip: function( args, table, callback ) { | |
+ var results, first, fragment, parent, | |
+ value = args[0], | |
+ scripts = []; | |
+ | |
+ // We can't cloneNode fragments that contain checked, in WebKit | |
+ if ( !jQuery.support.checkClone && arguments.length === 3 && t… | |
+ return this.each(function() { | |
+ jQuery(this).domManip( args, table, callback, … | |
+ }); | |
+ } | |
+ | |
+ if ( jQuery.isFunction(value) ) { | |
+ return this.each(function(i) { | |
+ var self = jQuery(this); | |
+ args[0] = value.call(this, i, table ? self.htm… | |
+ self.domManip( args, table, callback ); | |
+ }); | |
+ } | |
+ | |
+ if ( this[0] ) { | |
+ parent = value && value.parentNode; | |
+ | |
+ // If we're in a fragment, just use that instead of bu… | |
+ if ( jQuery.support.parentNode && parent && parent.nod… | |
+ results = { fragment: parent }; | |
+ | |
+ } else { | |
+ results = jQuery.buildFragment( args, this, sc… | |
+ } | |
+ | |
+ fragment = results.fragment; | |
+ | |
+ if ( fragment.childNodes.length === 1 ) { | |
+ first = fragment = fragment.firstChild; | |
+ } else { | |
+ first = fragment.firstChild; | |
+ } | |
+ | |
+ if ( first ) { | |
+ table = table && jQuery.nodeName( first, "tr" … | |
+ | |
+ for ( var i = 0, l = this.length, lastIndex = … | |
+ callback.call( | |
+ table ? | |
+ root(this[i], first) : | |
+ this[i], | |
+ // Make sure that we do not le… | |
+ // the original fragment (whic… | |
+ // using it; in addition, use … | |
+ // item instead of first becau… | |
+ // in certain situations (Bug … | |
+ // Fragments from the fragment… | |
+ // in place. | |
+ results.cacheable || ( l > 1 &… | |
+ jQuery.clone( fragment… | |
+ fragment | |
+ ); | |
+ } | |
+ } | |
+ | |
+ if ( scripts.length ) { | |
+ jQuery.each( scripts, function( i, elem ) { | |
+ if ( elem.src ) { | |
+ jQuery.ajax({ | |
+ type: "GET", | |
+ global: false, | |
+ url: elem.src, | |
+ async: false, | |
+ dataType: "script" | |
+ }); | |
+ } else { | |
+ jQuery.globalEval( ( elem.text… | |
+ } | |
+ | |
+ if ( elem.parentNode ) { | |
+ elem.parentNode.removeChild( e… | |
+ } | |
+ }); | |
+ } | |
+ } | |
+ | |
+ return this; | |
+ } | |
+}); | |
+ | |
+function root( elem, cur ) { | |
+ return jQuery.nodeName(elem, "table") ? | |
+ (elem.getElementsByTagName("tbody")[0] || | |
+ elem.appendChild(elem.ownerDocument.createElement("tbody"))) : | |
+ elem; | |
+} | |
+ | |
+function cloneCopyEvent( src, dest ) { | |
+ | |
+ if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { | |
+ return; | |
+ } | |
+ | |
+ var type, i, l, | |
+ oldData = jQuery._data( src ), | |
+ curData = jQuery._data( dest, oldData ), | |
+ events = oldData.events; | |
+ | |
+ if ( events ) { | |
+ delete curData.handle; | |
+ curData.events = {}; | |
+ | |
+ for ( type in events ) { | |
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) { | |
+ jQuery.event.add( dest, type, events[ type ][ … | |
+ } | |
+ } | |
+ } | |
+ | |
+ // make the cloned public data object a copy from the original | |
+ if ( curData.data ) { | |
+ curData.data = jQuery.extend( {}, curData.data ); | |
+ } | |
+} | |
+ | |
+function cloneFixAttributes( src, dest ) { | |
+ var nodeName; | |
+ | |
+ // We do not need to do anything for non-Elements | |
+ if ( dest.nodeType !== 1 ) { | |
+ return; | |
+ } | |
+ | |
+ // clearAttributes removes the attributes, which we don't want, | |
+ // but also removes the attachEvent events, which we *do* want | |
+ if ( dest.clearAttributes ) { | |
+ dest.clearAttributes(); | |
+ } | |
+ | |
+ // mergeAttributes, in contrast, only merges back on the | |
+ // original attributes, not the events | |
+ if ( dest.mergeAttributes ) { | |
+ dest.mergeAttributes( src ); | |
+ } | |
+ | |
+ nodeName = dest.nodeName.toLowerCase(); | |
+ | |
+ // IE6-8 fail to clone children inside object elements that use | |
+ // the proprietary classid attribute value (rather than the type | |
+ // attribute) to identify the type of content to display | |
+ if ( nodeName === "object" ) { | |
+ dest.outerHTML = src.outerHTML; | |
+ | |
+ } else if ( nodeName === "input" && (src.type === "checkbox" || src.ty… | |
+ // IE6-8 fails to persist the checked state of a cloned checkb… | |
+ // or radio button. Worse, IE6-7 fail to give the cloned eleme… | |
+ // a checked appearance if the defaultChecked value isn't also… | |
+ if ( src.checked ) { | |
+ dest.defaultChecked = dest.checked = src.checked; | |
+ } | |
+ | |
+ // IE6-7 get confused and end up setting the value of a cloned | |
+ // checkbox/radio button to an empty string instead of "on" | |
+ if ( dest.value !== src.value ) { | |
+ dest.value = src.value; | |
+ } | |
+ | |
+ // IE6-8 fails to return the selected option to the default selected | |
+ // state when cloning options | |
+ } else if ( nodeName === "option" ) { | |
+ dest.selected = src.defaultSelected; | |
+ | |
+ // IE6-8 fails to set the defaultValue to the correct value when | |
+ // cloning other types of input fields | |
+ } else if ( nodeName === "input" || nodeName === "textarea" ) { | |
+ dest.defaultValue = src.defaultValue; | |
+ | |
+ // IE blanks contents when cloning scripts | |
+ } else if ( nodeName === "script" && dest.text !== src.text ) { | |
+ dest.text = src.text; | |
+ } | |
+ | |
+ // Event data gets referenced instead of copied if the expando | |
+ // gets copied too | |
+ dest.removeAttribute( jQuery.expando ); | |
+ | |
+ // Clear flags for bubbling special change/submit events, they must | |
+ // be reattached when the newly cloned events are first activated | |
+ dest.removeAttribute( "_submit_attached" ); | |
+ dest.removeAttribute( "_change_attached" ); | |
+} | |
+ | |
+jQuery.buildFragment = function( args, nodes, scripts ) { | |
+ var fragment, cacheable, cacheresults, doc, | |
+ first = args[ 0 ]; | |
+ | |
+ // nodes may contain either an explicit document object, | |
+ // a jQuery collection or context object. | |
+ // If nodes[0] contains a valid object to assign to doc | |
+ if ( nodes && nodes[0] ) { | |
+ doc = nodes[0].ownerDocument || nodes[0]; | |
+ } | |
+ | |
+ // Ensure that an attr object doesn't incorrectly stand in as a docume… | |
+ // Chrome and Firefox seem to allow this to occur and will throw excep… | |
+ // Fixes #8950 | |
+ if ( !doc.createDocumentFragment ) { | |
+ doc = document; | |
+ } | |
+ | |
+ // Only cache "small" (1/2 KB) HTML strings that are associated with t… | |
+ // Cloning options loses the selected state, so don't cache them | |
+ // IE 6 doesn't like it when you put <object> or <embed> elements in a… | |
+ // Also, WebKit does not clone 'checked' attributes on cloneNode, so d… | |
+ // Lastly, IE6,7,8 will not correctly reuse cached fragments that were… | |
+ if ( args.length === 1 && typeof first === "string" && first.length < … | |
+ first.charAt(0) === "<" && !rnocache.test( first ) && | |
+ (jQuery.support.checkClone || !rchecked.test( first )) && | |
+ (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) { | |
+ | |
+ cacheable = true; | |
+ | |
+ cacheresults = jQuery.fragments[ first ]; | |
+ if ( cacheresults && cacheresults !== 1 ) { | |
+ fragment = cacheresults; | |
+ } | |
+ } | |
+ | |
+ if ( !fragment ) { | |
+ fragment = doc.createDocumentFragment(); | |
+ jQuery.clean( args, doc, fragment, scripts ); | |
+ } | |
+ | |
+ if ( cacheable ) { | |
+ jQuery.fragments[ first ] = cacheresults ? fragment : 1; | |
+ } | |
+ | |
+ return { fragment: fragment, cacheable: cacheable }; | |
+}; | |
+ | |
+jQuery.fragments = {}; | |
+ | |
+jQuery.each({ | |
+ appendTo: "append", | |
+ prependTo: "prepend", | |
+ insertBefore: "before", | |
+ insertAfter: "after", | |
+ replaceAll: "replaceWith" | |
+}, function( name, original ) { | |
+ jQuery.fn[ name ] = function( selector ) { | |
+ var ret = [], | |
+ insert = jQuery( selector ), | |
+ parent = this.length === 1 && this[0].parentNode; | |
+ | |
+ if ( parent && parent.nodeType === 11 && parent.childNodes.len… | |
+ insert[ original ]( this[0] ); | |
+ return this; | |
+ | |
+ } else { | |
+ for ( var i = 0, l = insert.length; i < l; i++ ) { | |
+ var elems = ( i > 0 ? this.clone(true) : this … | |
+ jQuery( insert[i] )[ original ]( elems ); | |
+ ret = ret.concat( elems ); | |
+ } | |
+ | |
+ return this.pushStack( ret, name, insert.selector ); | |
+ } | |
+ }; | |
+}); | |
+ | |
+function getAll( elem ) { | |
+ if ( typeof elem.getElementsByTagName !== "undefined" ) { | |
+ return elem.getElementsByTagName( "*" ); | |
+ | |
+ } else if ( typeof elem.querySelectorAll !== "undefined" ) { | |
+ return elem.querySelectorAll( "*" ); | |
+ | |
+ } else { | |
+ return []; | |
+ } | |
+} | |
+ | |
+// Used in clean, fixes the defaultChecked property | |
+function fixDefaultChecked( elem ) { | |
+ if ( elem.type === "checkbox" || elem.type === "radio" ) { | |
+ elem.defaultChecked = elem.checked; | |
+ } | |
+} | |
+// Finds all inputs and passes them to fixDefaultChecked | |
+function findInputs( elem ) { | |
+ var nodeName = ( elem.nodeName || "" ).toLowerCase(); | |
+ if ( nodeName === "input" ) { | |
+ fixDefaultChecked( elem ); | |
+ // Skip scripts, get other children | |
+ } else if ( nodeName !== "script" && typeof elem.getElementsByTagName … | |
+ jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChe… | |
+ } | |
+} | |
+ | |
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js | |
+function shimCloneNode( elem ) { | |
+ var div = document.createElement( "div" ); | |
+ safeFragment.appendChild( div ); | |
+ | |
+ div.innerHTML = elem.outerHTML; | |
+ return div.firstChild; | |
+} | |
+ | |
+jQuery.extend({ | |
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) { | |
+ var srcElements, | |
+ destElements, | |
+ i, | |
+ // IE<=8 does not properly clone detached, unknown ele… | |
+ clone = jQuery.support.html5Clone || jQuery.isXMLDoc(e… | |
+ elem.cloneNode( true ) : | |
+ shimCloneNode( elem ); | |
+ | |
+ if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneC… | |
+ (elem.nodeType === 1 || elem.nodeType === 11) … | |
+ // IE copies events bound via attachEvent when using c… | |
+ // Calling detachEvent on the clone will also remove t… | |
+ // from the original. In order to get around this, we … | |
+ // proprietary methods to clear the events. Thanks to … | |
+ // guys for this hotness. | |
+ | |
+ cloneFixAttributes( elem, clone ); | |
+ | |
+ // Using Sizzle here is crazy slow, so we use getEleme… | |
+ srcElements = getAll( elem ); | |
+ destElements = getAll( clone ); | |
+ | |
+ // Weird iteration because IE will replace the length … | |
+ // with an element if you are cloning the body and one… | |
+ // elements on the page has a name or id of "length" | |
+ for ( i = 0; srcElements[i]; ++i ) { | |
+ // Ensure that the destination node is not nul… | |
+ if ( destElements[i] ) { | |
+ cloneFixAttributes( srcElements[i], de… | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Copy the events from the original to the clone | |
+ if ( dataAndEvents ) { | |
+ cloneCopyEvent( elem, clone ); | |
+ | |
+ if ( deepDataAndEvents ) { | |
+ srcElements = getAll( elem ); | |
+ destElements = getAll( clone ); | |
+ | |
+ for ( i = 0; srcElements[i]; ++i ) { | |
+ cloneCopyEvent( srcElements[i], destEl… | |
+ } | |
+ } | |
+ } | |
+ | |
+ srcElements = destElements = null; | |
+ | |
+ // Return the cloned set | |
+ return clone; | |
+ }, | |
+ | |
+ clean: function( elems, context, fragment, scripts ) { | |
+ var checkScriptType, script, j, | |
+ ret = []; | |
+ | |
+ context = context || document; | |
+ | |
+ // !context.createElement fails in IE with an error but return… | |
+ if ( typeof context.createElement === "undefined" ) { | |
+ context = context.ownerDocument || context[0] && conte… | |
+ } | |
+ | |
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { | |
+ if ( typeof elem === "number" ) { | |
+ elem += ""; | |
+ } | |
+ | |
+ if ( !elem ) { | |
+ continue; | |
+ } | |
+ | |
+ // Convert html string into DOM nodes | |
+ if ( typeof elem === "string" ) { | |
+ if ( !rhtml.test( elem ) ) { | |
+ elem = context.createTextNode( elem ); | |
+ } else { | |
+ // Fix "XHTML"-style tags in all brows… | |
+ elem = elem.replace(rxhtmlTag, "<$1></… | |
+ | |
+ // Trim whitespace, otherwise indexOf … | |
+ var tag = ( rtagName.exec( elem ) || [… | |
+ wrap = wrapMap[ tag ] || wrapM… | |
+ depth = wrap[0], | |
+ div = context.createElement("d… | |
+ safeChildNodes = safeFragment.… | |
+ remove; | |
+ | |
+ // Append wrapper element to unknown e… | |
+ if ( context === document ) { | |
+ // Use the fragment we've alre… | |
+ safeFragment.appendChild( div … | |
+ } else { | |
+ // Use a fragment created with… | |
+ createSafeFragment( context ).… | |
+ } | |
+ | |
+ // Go to html and back, then peel off … | |
+ div.innerHTML = wrap[1] + elem + wrap[… | |
+ | |
+ // Move to the right depth | |
+ while ( depth-- ) { | |
+ div = div.lastChild; | |
+ } | |
+ | |
+ // Remove IE's autoinserted <tbody> fr… | |
+ if ( !jQuery.support.tbody ) { | |
+ | |
+ // String was a <table>, *may*… | |
+ var hasBody = rtbody.test(elem… | |
+ tbody = tag === "table… | |
+ div.firstChild… | |
+ | |
+ // String was … | |
+ wrap[1] === "<… | |
+ div.ch… | |
+ []; | |
+ | |
+ for ( j = tbody.length - 1; j … | |
+ if ( jQuery.nodeName( … | |
+ tbody[ j ].par… | |
+ } | |
+ } | |
+ } | |
+ | |
+ // IE completely kills leading whitesp… | |
+ if ( !jQuery.support.leadingWhitespace… | |
+ div.insertBefore( context.crea… | |
+ } | |
+ | |
+ elem = div.childNodes; | |
+ | |
+ // Clear elements from DocumentFragmen… | |
+ // to avoid hoarding elements. Fixes #… | |
+ if ( div ) { | |
+ div.parentNode.removeChild( di… | |
+ | |
+ // Guard against -1 index exce… | |
+ if ( safeChildNodes.length > 0… | |
+ remove = safeChildNode… | |
+ | |
+ if ( remove && remove.… | |
+ remove.parentN… | |
+ } | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Resets defaultChecked for any radios and checkboxes | |
+ // about to be appended to the DOM in IE 6/7 (#8060) | |
+ var len; | |
+ if ( !jQuery.support.appendChecked ) { | |
+ if ( elem[0] && typeof (len = elem.length) ===… | |
+ for ( j = 0; j < len; j++ ) { | |
+ findInputs( elem[j] ); | |
+ } | |
+ } else { | |
+ findInputs( elem ); | |
+ } | |
+ } | |
+ | |
+ if ( elem.nodeType ) { | |
+ ret.push( elem ); | |
+ } else { | |
+ ret = jQuery.merge( ret, elem ); | |
+ } | |
+ } | |
+ | |
+ if ( fragment ) { | |
+ checkScriptType = function( elem ) { | |
+ return !elem.type || rscriptType.test( elem.ty… | |
+ }; | |
+ for ( i = 0; ret[i]; i++ ) { | |
+ script = ret[i]; | |
+ if ( scripts && jQuery.nodeName( script, "scri… | |
+ scripts.push( script.parentNode ? scri… | |
+ | |
+ } else { | |
+ if ( script.nodeType === 1 ) { | |
+ var jsTags = jQuery.grep( scri… | |
+ | |
+ ret.splice.apply( ret, [i + 1,… | |
+ } | |
+ fragment.appendChild( script ); | |
+ } | |
+ } | |
+ } | |
+ | |
+ return ret; | |
+ }, | |
+ | |
+ cleanData: function( elems ) { | |
+ var data, id, | |
+ cache = jQuery.cache, | |
+ special = jQuery.event.special, | |
+ deleteExpando = jQuery.support.deleteExpando; | |
+ | |
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { | |
+ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLo… | |
+ continue; | |
+ } | |
+ | |
+ id = elem[ jQuery.expando ]; | |
+ | |
+ if ( id ) { | |
+ data = cache[ id ]; | |
+ | |
+ if ( data && data.events ) { | |
+ for ( var type in data.events ) { | |
+ if ( special[ type ] ) { | |
+ jQuery.event.remove( e… | |
+ | |
+ // This is a shortcut to avoid… | |
+ } else { | |
+ jQuery.removeEvent( el… | |
+ } | |
+ } | |
+ | |
+ // Null the DOM reference to avoid IE6… | |
+ if ( data.handle ) { | |
+ data.handle.elem = null; | |
+ } | |
+ } | |
+ | |
+ if ( deleteExpando ) { | |
+ delete elem[ jQuery.expando ]; | |
+ | |
+ } else if ( elem.removeAttribute ) { | |
+ elem.removeAttribute( jQuery.expando ); | |
+ } | |
+ | |
+ delete cache[ id ]; | |
+ } | |
+ } | |
+ } | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+var ralpha = /alpha\([^)]*\)/i, | |
+ ropacity = /opacity=([^)]*)/, | |
+ // fixed for IE9, see #8346 | |
+ rupper = /([A-Z]|^ms)/g, | |
+ rnum = /^[\-+]?(?:\d*\.)?\d+$/i, | |
+ rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i, | |
+ rrelNum = /^([\-+])=([\-+.\de]+)/, | |
+ rmargin = /^margin/, | |
+ | |
+ cssShow = { position: "absolute", visibility: "hidden", display: "bloc… | |
+ | |
+ // order is important! | |
+ cssExpand = [ "Top", "Right", "Bottom", "Left" ], | |
+ | |
+ curCSS, | |
+ | |
+ getComputedStyle, | |
+ currentStyle; | |
+ | |
+jQuery.fn.css = function( name, value ) { | |
+ return jQuery.access( this, function( elem, name, value ) { | |
+ return value !== undefined ? | |
+ jQuery.style( elem, name, value ) : | |
+ jQuery.css( elem, name ); | |
+ }, name, value, arguments.length > 1 ); | |
+}; | |
+ | |
+jQuery.extend({ | |
+ // Add in style property hooks for overriding the default | |
+ // behavior of getting and setting a style property | |
+ cssHooks: { | |
+ opacity: { | |
+ get: function( elem, computed ) { | |
+ if ( computed ) { | |
+ // We should always get a number back … | |
+ var ret = curCSS( elem, "opacity" ); | |
+ return ret === "" ? "1" : ret; | |
+ | |
+ } else { | |
+ return elem.style.opacity; | |
+ } | |
+ } | |
+ } | |
+ }, | |
+ | |
+ // Exclude the following css properties to add px | |
+ cssNumber: { | |
+ "fillOpacity": true, | |
+ "fontWeight": true, | |
+ "lineHeight": true, | |
+ "opacity": true, | |
+ "orphans": true, | |
+ "widows": true, | |
+ "zIndex": true, | |
+ "zoom": true | |
+ }, | |
+ | |
+ // Add in properties whose names you wish to fix before | |
+ // setting or getting the value | |
+ cssProps: { | |
+ // normalize float css property | |
+ "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" | |
+ }, | |
+ | |
+ // Get and set the style property on a DOM Node | |
+ style: function( elem, name, value, extra ) { | |
+ // Don't set styles on text and comment nodes | |
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !e… | |
+ return; | |
+ } | |
+ | |
+ // Make sure that we're working with the right name | |
+ var ret, type, origName = jQuery.camelCase( name ), | |
+ style = elem.style, hooks = jQuery.cssHooks[ origName … | |
+ | |
+ name = jQuery.cssProps[ origName ] || origName; | |
+ | |
+ // Check if we're setting a value | |
+ if ( value !== undefined ) { | |
+ type = typeof value; | |
+ | |
+ // convert relative number strings (+= or -=) to relat… | |
+ if ( type === "string" && (ret = rrelNum.exec( value )… | |
+ value = ( +( ret[1] + 1) * +ret[2] ) + parseFl… | |
+ // Fixes bug #9237 | |
+ type = "number"; | |
+ } | |
+ | |
+ // Make sure that NaN and null values aren't set. See:… | |
+ if ( value == null || type === "number" && isNaN( valu… | |
+ return; | |
+ } | |
+ | |
+ // If a number was passed in, add 'px' to the (except … | |
+ if ( type === "number" && !jQuery.cssNumber[ origName … | |
+ value += "px"; | |
+ } | |
+ | |
+ // If a hook was provided, use that value, otherwise j… | |
+ if ( !hooks || !("set" in hooks) || (value = hooks.set… | |
+ // Wrapped to prevent IE from throwing errors … | |
+ // Fixes bug #5509 | |
+ try { | |
+ style[ name ] = value; | |
+ } catch(e) {} | |
+ } | |
+ | |
+ } else { | |
+ // If a hook was provided get the non-computed value f… | |
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem… | |
+ return ret; | |
+ } | |
+ | |
+ // Otherwise just get the value from the style object | |
+ return style[ name ]; | |
+ } | |
+ }, | |
+ | |
+ css: function( elem, name, extra ) { | |
+ var ret, hooks; | |
+ | |
+ // Make sure that we're working with the right name | |
+ name = jQuery.camelCase( name ); | |
+ hooks = jQuery.cssHooks[ name ]; | |
+ name = jQuery.cssProps[ name ] || name; | |
+ | |
+ // cssFloat needs a special treatment | |
+ if ( name === "cssFloat" ) { | |
+ name = "float"; | |
+ } | |
+ | |
+ // If a hook was provided get the computed value from there | |
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, … | |
+ return ret; | |
+ | |
+ // Otherwise, if a way to get the computed value exists, use t… | |
+ } else if ( curCSS ) { | |
+ return curCSS( elem, name ); | |
+ } | |
+ }, | |
+ | |
+ // A method for quickly swapping in/out CSS properties to get correct … | |
+ swap: function( elem, options, callback ) { | |
+ var old = {}, | |
+ ret, name; | |
+ | |
+ // Remember the old values, and insert the new ones | |
+ for ( name in options ) { | |
+ old[ name ] = elem.style[ name ]; | |
+ elem.style[ name ] = options[ name ]; | |
+ } | |
+ | |
+ ret = callback.call( elem ); | |
+ | |
+ // Revert the old values | |
+ for ( name in options ) { | |
+ elem.style[ name ] = old[ name ]; | |
+ } | |
+ | |
+ return ret; | |
+ } | |
+}); | |
+ | |
+// DEPRECATED in 1.3, Use jQuery.css() instead | |
+jQuery.curCSS = jQuery.css; | |
+ | |
+if ( document.defaultView && document.defaultView.getComputedStyle ) { | |
+ getComputedStyle = function( elem, name ) { | |
+ var ret, defaultView, computedStyle, width, | |
+ style = elem.style; | |
+ | |
+ name = name.replace( rupper, "-$1" ).toLowerCase(); | |
+ | |
+ if ( (defaultView = elem.ownerDocument.defaultView) && | |
+ (computedStyle = defaultView.getComputedStyle(… | |
+ | |
+ ret = computedStyle.getPropertyValue( name ); | |
+ if ( ret === "" && !jQuery.contains( elem.ownerDocumen… | |
+ ret = jQuery.style( elem, name ); | |
+ } | |
+ } | |
+ | |
+ // A tribute to the "awesome hack by Dean Edwards" | |
+ // WebKit uses "computed value (percentage if specified)" inst… | |
+ // which is against the CSSOM draft spec: http://dev.w3.org/cs… | |
+ if ( !jQuery.support.pixelMargin && computedStyle && rmargin.t… | |
+ width = style.width; | |
+ style.width = ret; | |
+ ret = computedStyle.width; | |
+ style.width = width; | |
+ } | |
+ | |
+ return ret; | |
+ }; | |
+} | |
+ | |
+if ( document.documentElement.currentStyle ) { | |
+ currentStyle = function( elem, name ) { | |
+ var left, rsLeft, uncomputed, | |
+ ret = elem.currentStyle && elem.currentStyle[ name ], | |
+ style = elem.style; | |
+ | |
+ // Avoid setting ret to empty string here | |
+ // so we don't default to auto | |
+ if ( ret == null && style && (uncomputed = style[ name ]) ) { | |
+ ret = uncomputed; | |
+ } | |
+ | |
+ // From the awesome hack by Dean Edwards | |
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-1… | |
+ | |
+ // If we're not dealing with a regular pixel number | |
+ // but a number that has a weird ending, we need to convert it… | |
+ if ( rnumnonpx.test( ret ) ) { | |
+ | |
+ // Remember the original values | |
+ left = style.left; | |
+ rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; | |
+ | |
+ // Put in the new values to get a computed value out | |
+ if ( rsLeft ) { | |
+ elem.runtimeStyle.left = elem.currentStyle.lef… | |
+ } | |
+ style.left = name === "fontSize" ? "1em" : ret; | |
+ ret = style.pixelLeft + "px"; | |
+ | |
+ // Revert the changed values | |
+ style.left = left; | |
+ if ( rsLeft ) { | |
+ elem.runtimeStyle.left = rsLeft; | |
+ } | |
+ } | |
+ | |
+ return ret === "" ? "auto" : ret; | |
+ }; | |
+} | |
+ | |
+curCSS = getComputedStyle || currentStyle; | |
+ | |
+function getWidthOrHeight( elem, name, extra ) { | |
+ | |
+ // Start with offset property | |
+ var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, | |
+ i = name === "width" ? 1 : 0, | |
+ len = 4; | |
+ | |
+ if ( val > 0 ) { | |
+ if ( extra !== "border" ) { | |
+ for ( ; i < len; i += 2 ) { | |
+ if ( !extra ) { | |
+ val -= parseFloat( jQuery.css( elem, "… | |
+ } | |
+ if ( extra === "margin" ) { | |
+ val += parseFloat( jQuery.css( elem, e… | |
+ } else { | |
+ val -= parseFloat( jQuery.css( elem, "… | |
+ } | |
+ } | |
+ } | |
+ | |
+ return val + "px"; | |
+ } | |
+ | |
+ // Fall back to computed then uncomputed css if necessary | |
+ val = curCSS( elem, name ); | |
+ if ( val < 0 || val == null ) { | |
+ val = elem.style[ name ]; | |
+ } | |
+ | |
+ // Computed unit is not pixels. Stop here and return. | |
+ if ( rnumnonpx.test(val) ) { | |
+ return val; | |
+ } | |
+ | |
+ // Normalize "", auto, and prepare for extra | |
+ val = parseFloat( val ) || 0; | |
+ | |
+ // Add padding, border, margin | |
+ if ( extra ) { | |
+ for ( ; i < len; i += 2 ) { | |
+ val += parseFloat( jQuery.css( elem, "padding" + cssEx… | |
+ if ( extra !== "padding" ) { | |
+ val += parseFloat( jQuery.css( elem, "border" … | |
+ } | |
+ if ( extra === "margin" ) { | |
+ val += parseFloat( jQuery.css( elem, extra + c… | |
+ } | |
+ } | |
+ } | |
+ | |
+ return val + "px"; | |
+} | |
+ | |
+jQuery.each([ "height", "width" ], function( i, name ) { | |
+ jQuery.cssHooks[ name ] = { | |
+ get: function( elem, computed, extra ) { | |
+ if ( computed ) { | |
+ if ( elem.offsetWidth !== 0 ) { | |
+ return getWidthOrHeight( elem, name, e… | |
+ } else { | |
+ return jQuery.swap( elem, cssShow, fun… | |
+ return getWidthOrHeight( elem,… | |
+ }); | |
+ } | |
+ } | |
+ }, | |
+ | |
+ set: function( elem, value ) { | |
+ return rnum.test( value ) ? | |
+ value + "px" : | |
+ value; | |
+ } | |
+ }; | |
+}); | |
+ | |
+if ( !jQuery.support.opacity ) { | |
+ jQuery.cssHooks.opacity = { | |
+ get: function( elem, computed ) { | |
+ // IE uses filters for opacity | |
+ return ropacity.test( (computed && elem.currentStyle ?… | |
+ ( parseFloat( RegExp.$1 ) / 100 ) + "" : | |
+ computed ? "1" : ""; | |
+ }, | |
+ | |
+ set: function( elem, value ) { | |
+ var style = elem.style, | |
+ currentStyle = elem.currentStyle, | |
+ opacity = jQuery.isNumeric( value ) ? "alpha(o… | |
+ filter = currentStyle && currentStyle.filter |… | |
+ | |
+ // IE has trouble with opacity if it does not have lay… | |
+ // Force it by setting the zoom level | |
+ style.zoom = 1; | |
+ | |
+ // if setting opacity to 1, and no other filters exist… | |
+ if ( value >= 1 && jQuery.trim( filter.replace( ralpha… | |
+ | |
+ // Setting style.filter to null, "" & " " stil… | |
+ // if "filter:" is present at all, clearType i… | |
+ // style.removeAttribute is IE Only, but so ap… | |
+ style.removeAttribute( "filter" ); | |
+ | |
+ // if there there is no filter style applied i… | |
+ if ( currentStyle && !currentStyle.filter ) { | |
+ return; | |
+ } | |
+ } | |
+ | |
+ // otherwise, set new filter values | |
+ style.filter = ralpha.test( filter ) ? | |
+ filter.replace( ralpha, opacity ) : | |
+ filter + " " + opacity; | |
+ } | |
+ }; | |
+} | |
+ | |
+jQuery(function() { | |
+ // This hook cannot be added until DOM ready because the support test | |
+ // for it is not run until after DOM ready | |
+ if ( !jQuery.support.reliableMarginRight ) { | |
+ jQuery.cssHooks.marginRight = { | |
+ get: function( elem, computed ) { | |
+ // WebKit Bug 13343 - getComputedStyle returns… | |
+ // Work around by temporarily setting element … | |
+ return jQuery.swap( elem, { "display": "inline… | |
+ if ( computed ) { | |
+ return curCSS( elem, "margin-r… | |
+ } else { | |
+ return elem.style.marginRight; | |
+ } | |
+ }); | |
+ } | |
+ }; | |
+ } | |
+}); | |
+ | |
+if ( jQuery.expr && jQuery.expr.filters ) { | |
+ jQuery.expr.filters.hidden = function( elem ) { | |
+ var width = elem.offsetWidth, | |
+ height = elem.offsetHeight; | |
+ | |
+ return ( width === 0 && height === 0 ) || (!jQuery.support.rel… | |
+ }; | |
+ | |
+ jQuery.expr.filters.visible = function( elem ) { | |
+ return !jQuery.expr.filters.hidden( elem ); | |
+ }; | |
+} | |
+ | |
+// These hooks are used by animate to expand properties | |
+jQuery.each({ | |
+ margin: "", | |
+ padding: "", | |
+ border: "Width" | |
+}, function( prefix, suffix ) { | |
+ | |
+ jQuery.cssHooks[ prefix + suffix ] = { | |
+ expand: function( value ) { | |
+ var i, | |
+ | |
+ // assumes a single number if not a string | |
+ parts = typeof value === "string" ? value.spli… | |
+ expanded = {}; | |
+ | |
+ for ( i = 0; i < 4; i++ ) { | |
+ expanded[ prefix + cssExpand[ i ] + suffix ] = | |
+ parts[ i ] || parts[ i - 2 ] || parts[… | |
+ } | |
+ | |
+ return expanded; | |
+ } | |
+ }; | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+var r20 = /%20/g, | |
+ rbracket = /\[\]$/, | |
+ rCRLF = /\r?\n/g, | |
+ rhash = /#.*$/, | |
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r charact… | |
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|nu… | |
+ // #7653, #8125, #8152: local protocol detection | |
+ rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|wi… | |
+ rnoContent = /^(?:GET|HEAD)$/, | |
+ rprotocol = /^\/\//, | |
+ rquery = /\?/, | |
+ rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, | |
+ rselectTextarea = /^(?:select|textarea)/i, | |
+ rspacesAjax = /\s+/, | |
+ rts = /([?&])_=[^&]*/, | |
+ rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, | |
+ | |
+ // Keep a copy of the old load method | |
+ _load = jQuery.fn.load, | |
+ | |
+ /* Prefilters | |
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js… | |
+ * 2) These are called: | |
+ * - BEFORE asking for a transport | |
+ * - AFTER param serialization (s.data is a string if s.processData… | |
+ * 3) key is the dataType | |
+ * 4) the catchall symbol "*" can be used | |
+ * 5) execution will start with transport dataType and THEN continue d… | |
+ */ | |
+ prefilters = {}, | |
+ | |
+ /* Transports bindings | |
+ * 1) key is the dataType | |
+ * 2) the catchall symbol "*" can be used | |
+ * 3) selection will start with transport dataType and THEN go to "*" … | |
+ */ | |
+ transports = {}, | |
+ | |
+ // Document location | |
+ ajaxLocation, | |
+ | |
+ // Document location segments | |
+ ajaxLocParts, | |
+ | |
+ // Avoid comment-prolog char sequence (#10098); must appease lint and … | |
+ allTypes = ["*/"] + ["*"]; | |
+ | |
+// #8138, IE may throw an exception when accessing | |
+// a field from window.location if document.domain has been set | |
+try { | |
+ ajaxLocation = location.href; | |
+} catch( e ) { | |
+ // Use the href attribute of an A element | |
+ // since IE will modify it given document.location | |
+ ajaxLocation = document.createElement( "a" ); | |
+ ajaxLocation.href = ""; | |
+ ajaxLocation = ajaxLocation.href; | |
+} | |
+ | |
+// Segment location into parts | |
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; | |
+ | |
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport | |
+function addToPrefiltersOrTransports( structure ) { | |
+ | |
+ // dataTypeExpression is optional and defaults to "*" | |
+ return function( dataTypeExpression, func ) { | |
+ | |
+ if ( typeof dataTypeExpression !== "string" ) { | |
+ func = dataTypeExpression; | |
+ dataTypeExpression = "*"; | |
+ } | |
+ | |
+ if ( jQuery.isFunction( func ) ) { | |
+ var dataTypes = dataTypeExpression.toLowerCase().split… | |
+ i = 0, | |
+ length = dataTypes.length, | |
+ dataType, | |
+ list, | |
+ placeBefore; | |
+ | |
+ // For each dataType in the dataTypeExpression | |
+ for ( ; i < length; i++ ) { | |
+ dataType = dataTypes[ i ]; | |
+ // We control if we're asked to add before | |
+ // any existing element | |
+ placeBefore = /^\+/.test( dataType ); | |
+ if ( placeBefore ) { | |
+ dataType = dataType.substr( 1 ) || "*"; | |
+ } | |
+ list = structure[ dataType ] = structure[ data… | |
+ // then we add to the structure accordingly | |
+ list[ placeBefore ? "unshift" : "push" ]( func… | |
+ } | |
+ } | |
+ }; | |
+} | |
+ | |
+// Base inspection function for prefilters and transports | |
+function inspectPrefiltersOrTransports( structure, options, originalOptions, j… | |
+ dataType /* internal */, inspected /* internal */ ) { | |
+ | |
+ dataType = dataType || options.dataTypes[ 0 ]; | |
+ inspected = inspected || {}; | |
+ | |
+ inspected[ dataType ] = true; | |
+ | |
+ var list = structure[ dataType ], | |
+ i = 0, | |
+ length = list ? list.length : 0, | |
+ executeOnly = ( structure === prefilters ), | |
+ selection; | |
+ | |
+ for ( ; i < length && ( executeOnly || !selection ); i++ ) { | |
+ selection = list[ i ]( options, originalOptions, jqXHR ); | |
+ // If we got redirected to another dataType | |
+ // we try there if executing only and not done already | |
+ if ( typeof selection === "string" ) { | |
+ if ( !executeOnly || inspected[ selection ] ) { | |
+ selection = undefined; | |
+ } else { | |
+ options.dataTypes.unshift( selection ); | |
+ selection = inspectPrefiltersOrTransports( | |
+ structure, options, originalOp… | |
+ } | |
+ } | |
+ } | |
+ // If we're only executing or nothing was selected | |
+ // we try the catchall dataType if not done already | |
+ if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { | |
+ selection = inspectPrefiltersOrTransports( | |
+ structure, options, originalOptions, jqXHR, "*… | |
+ } | |
+ // unnecessary when only executing (prefilters) | |
+ // but it'll be ignored by the caller in that case | |
+ return selection; | |
+} | |
+ | |
+// A special extend for ajax options | |
+// that takes "flat" options (not to be deep extended) | |
+// Fixes #9887 | |
+function ajaxExtend( target, src ) { | |
+ var key, deep, | |
+ flatOptions = jQuery.ajaxSettings.flatOptions || {}; | |
+ for ( key in src ) { | |
+ if ( src[ key ] !== undefined ) { | |
+ ( flatOptions[ key ] ? target : ( deep || ( deep = {} … | |
+ } | |
+ } | |
+ if ( deep ) { | |
+ jQuery.extend( true, target, deep ); | |
+ } | |
+} | |
+ | |
+jQuery.fn.extend({ | |
+ load: function( url, params, callback ) { | |
+ if ( typeof url !== "string" && _load ) { | |
+ return _load.apply( this, arguments ); | |
+ | |
+ // Don't do a request if no elements are being requested | |
+ } else if ( !this.length ) { | |
+ return this; | |
+ } | |
+ | |
+ var off = url.indexOf( " " ); | |
+ if ( off >= 0 ) { | |
+ var selector = url.slice( off, url.length ); | |
+ url = url.slice( 0, off ); | |
+ } | |
+ | |
+ // Default to a GET request | |
+ var type = "GET"; | |
+ | |
+ // If the second parameter was provided | |
+ if ( params ) { | |
+ // If it's a function | |
+ if ( jQuery.isFunction( params ) ) { | |
+ // We assume that it's the callback | |
+ callback = params; | |
+ params = undefined; | |
+ | |
+ // Otherwise, build a param string | |
+ } else if ( typeof params === "object" ) { | |
+ params = jQuery.param( params, jQuery.ajaxSett… | |
+ type = "POST"; | |
+ } | |
+ } | |
+ | |
+ var self = this; | |
+ | |
+ // Request the remote document | |
+ jQuery.ajax({ | |
+ url: url, | |
+ type: type, | |
+ dataType: "html", | |
+ data: params, | |
+ // Complete callback (responseText is used internally) | |
+ complete: function( jqXHR, status, responseText ) { | |
+ // Store the response as specified by the jqXH… | |
+ responseText = jqXHR.responseText; | |
+ // If successful, inject the HTML into all the… | |
+ if ( jqXHR.isResolved() ) { | |
+ // #4825: Get the actual response in c… | |
+ // a dataFilter is present in ajaxSett… | |
+ jqXHR.done(function( r ) { | |
+ responseText = r; | |
+ }); | |
+ // See if a selector was specified | |
+ self.html( selector ? | |
+ // Create a dummy div to hold … | |
+ jQuery("<div>") | |
+ // inject the contents… | |
+ // to avoid any 'Permi… | |
+ .append(responseText.r… | |
+ | |
+ // Locate the specifie… | |
+ .find(selector) : | |
+ | |
+ // If not, just inject the ful… | |
+ responseText ); | |
+ } | |
+ | |
+ if ( callback ) { | |
+ self.each( callback, [ responseText, s… | |
+ } | |
+ } | |
+ }); | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ serialize: function() { | |
+ return jQuery.param( this.serializeArray() ); | |
+ }, | |
+ | |
+ serializeArray: function() { | |
+ return this.map(function(){ | |
+ return this.elements ? jQuery.makeArray( this.elements… | |
+ }) | |
+ .filter(function(){ | |
+ return this.name && !this.disabled && | |
+ ( this.checked || rselectTextarea.test( this.n… | |
+ rinput.test( this.type ) ); | |
+ }) | |
+ .map(function( i, elem ){ | |
+ var val = jQuery( this ).val(); | |
+ | |
+ return val == null ? | |
+ null : | |
+ jQuery.isArray( val ) ? | |
+ jQuery.map( val, function( val, i ){ | |
+ return { name: elem.name, valu… | |
+ }) : | |
+ { name: elem.name, value: val.replace(… | |
+ }).get(); | |
+ } | |
+}); | |
+ | |
+// Attach a bunch of functions for handling common AJAX events | |
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".… | |
+ jQuery.fn[ o ] = function( f ){ | |
+ return this.on( o, f ); | |
+ }; | |
+}); | |
+ | |
+jQuery.each( [ "get", "post" ], function( i, method ) { | |
+ jQuery[ method ] = function( url, data, callback, type ) { | |
+ // shift arguments if data argument was omitted | |
+ if ( jQuery.isFunction( data ) ) { | |
+ type = type || callback; | |
+ callback = data; | |
+ data = undefined; | |
+ } | |
+ | |
+ return jQuery.ajax({ | |
+ type: method, | |
+ url: url, | |
+ data: data, | |
+ success: callback, | |
+ dataType: type | |
+ }); | |
+ }; | |
+}); | |
+ | |
+jQuery.extend({ | |
+ | |
+ getScript: function( url, callback ) { | |
+ return jQuery.get( url, undefined, callback, "script" ); | |
+ }, | |
+ | |
+ getJSON: function( url, data, callback ) { | |
+ return jQuery.get( url, data, callback, "json" ); | |
+ }, | |
+ | |
+ // Creates a full fledged settings object into target | |
+ // with both ajaxSettings and settings fields. | |
+ // If target is omitted, writes into ajaxSettings. | |
+ ajaxSetup: function( target, settings ) { | |
+ if ( settings ) { | |
+ // Building a settings object | |
+ ajaxExtend( target, jQuery.ajaxSettings ); | |
+ } else { | |
+ // Extending ajaxSettings | |
+ settings = target; | |
+ target = jQuery.ajaxSettings; | |
+ } | |
+ ajaxExtend( target, settings ); | |
+ return target; | |
+ }, | |
+ | |
+ ajaxSettings: { | |
+ url: ajaxLocation, | |
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), | |
+ global: true, | |
+ type: "GET", | |
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8… | |
+ processData: true, | |
+ async: true, | |
+ /* | |
+ timeout: 0, | |
+ data: null, | |
+ dataType: null, | |
+ username: null, | |
+ password: null, | |
+ cache: null, | |
+ traditional: false, | |
+ headers: {}, | |
+ */ | |
+ | |
+ accepts: { | |
+ xml: "application/xml, text/xml", | |
+ html: "text/html", | |
+ text: "text/plain", | |
+ json: "application/json, text/javascript", | |
+ "*": allTypes | |
+ }, | |
+ | |
+ contents: { | |
+ xml: /xml/, | |
+ html: /html/, | |
+ json: /json/ | |
+ }, | |
+ | |
+ responseFields: { | |
+ xml: "responseXML", | |
+ text: "responseText" | |
+ }, | |
+ | |
+ // List of data converters | |
+ // 1) key format is "source_type destination_type" (a single s… | |
+ // 2) the catchall symbol "*" can be used for source_type | |
+ converters: { | |
+ | |
+ // Convert anything to text | |
+ "* text": window.String, | |
+ | |
+ // Text to html (true = no transformation) | |
+ "text html": true, | |
+ | |
+ // Evaluate text as a json expression | |
+ "text json": jQuery.parseJSON, | |
+ | |
+ // Parse text as xml | |
+ "text xml": jQuery.parseXML | |
+ }, | |
+ | |
+ // For options that shouldn't be deep extended: | |
+ // you can add your own custom options here if | |
+ // and when you create one that shouldn't be | |
+ // deep extended (see ajaxExtend) | |
+ flatOptions: { | |
+ context: true, | |
+ url: true | |
+ } | |
+ }, | |
+ | |
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), | |
+ ajaxTransport: addToPrefiltersOrTransports( transports ), | |
+ | |
+ // Main method | |
+ ajax: function( url, options ) { | |
+ | |
+ // If url is an object, simulate pre-1.5 signature | |
+ if ( typeof url === "object" ) { | |
+ options = url; | |
+ url = undefined; | |
+ } | |
+ | |
+ // Force options to be an object | |
+ options = options || {}; | |
+ | |
+ var // Create the final options object | |
+ s = jQuery.ajaxSetup( {}, options ), | |
+ // Callbacks context | |
+ callbackContext = s.context || s, | |
+ // Context for global events | |
+ // It's the callbackContext if one was provided in the… | |
+ // and if it's a DOM node or a jQuery collection | |
+ globalEventContext = callbackContext !== s && | |
+ ( callbackContext.nodeType || callbackContext … | |
+ jQuery( callbackContext ) : jQ… | |
+ // Deferreds | |
+ deferred = jQuery.Deferred(), | |
+ completeDeferred = jQuery.Callbacks( "once memory" ), | |
+ // Status-dependent callbacks | |
+ statusCode = s.statusCode || {}, | |
+ // ifModified key | |
+ ifModifiedKey, | |
+ // Headers (they are sent all at once) | |
+ requestHeaders = {}, | |
+ requestHeadersNames = {}, | |
+ // Response headers | |
+ responseHeadersString, | |
+ responseHeaders, | |
+ // transport | |
+ transport, | |
+ // timeout handle | |
+ timeoutTimer, | |
+ // Cross-domain detection vars | |
+ parts, | |
+ // The jqXHR state | |
+ state = 0, | |
+ // To know if global events are to be dispatched | |
+ fireGlobals, | |
+ // Loop variable | |
+ i, | |
+ // Fake xhr | |
+ jqXHR = { | |
+ | |
+ readyState: 0, | |
+ | |
+ // Caches the header | |
+ setRequestHeader: function( name, value ) { | |
+ if ( !state ) { | |
+ var lname = name.toLowerCase(); | |
+ name = requestHeadersNames[ ln… | |
+ requestHeaders[ name ] = value; | |
+ } | |
+ return this; | |
+ }, | |
+ | |
+ // Raw string | |
+ getAllResponseHeaders: function() { | |
+ return state === 2 ? responseHeadersSt… | |
+ }, | |
+ | |
+ // Builds headers hashtable if needed | |
+ getResponseHeader: function( key ) { | |
+ var match; | |
+ if ( state === 2 ) { | |
+ if ( !responseHeaders ) { | |
+ responseHeaders = {}; | |
+ while( ( match = rhead… | |
+ responseHeader… | |
+ } | |
+ } | |
+ match = responseHeaders[ key.t… | |
+ } | |
+ return match === undefined ? null : ma… | |
+ }, | |
+ | |
+ // Overrides response content-type header | |
+ overrideMimeType: function( type ) { | |
+ if ( !state ) { | |
+ s.mimeType = type; | |
+ } | |
+ return this; | |
+ }, | |
+ | |
+ // Cancel the request | |
+ abort: function( statusText ) { | |
+ statusText = statusText || "abort"; | |
+ if ( transport ) { | |
+ transport.abort( statusText ); | |
+ } | |
+ done( 0, statusText ); | |
+ return this; | |
+ } | |
+ }; | |
+ | |
+ // Callback for when everything is done | |
+ // It is defined here because jslint complains if it is declar… | |
+ // at the end of the function (which would be more logical and… | |
+ function done( status, nativeStatusText, responses, headers ) { | |
+ | |
+ // Called once | |
+ if ( state === 2 ) { | |
+ return; | |
+ } | |
+ | |
+ // State is "done" now | |
+ state = 2; | |
+ | |
+ // Clear timeout if it exists | |
+ if ( timeoutTimer ) { | |
+ clearTimeout( timeoutTimer ); | |
+ } | |
+ | |
+ // Dereference transport for early garbage collection | |
+ // (no matter how long the jqXHR object will be used) | |
+ transport = undefined; | |
+ | |
+ // Cache response headers | |
+ responseHeadersString = headers || ""; | |
+ | |
+ // Set readyState | |
+ jqXHR.readyState = status > 0 ? 4 : 0; | |
+ | |
+ var isSuccess, | |
+ success, | |
+ error, | |
+ statusText = nativeStatusText, | |
+ response = responses ? ajaxHandleResponses( s,… | |
+ lastModified, | |
+ etag; | |
+ | |
+ // If successful, handle type chaining | |
+ if ( status >= 200 && status < 300 || status === 304 )… | |
+ | |
+ // Set the If-Modified-Since and/or If-None-Ma… | |
+ if ( s.ifModified ) { | |
+ | |
+ if ( ( lastModified = jqXHR.getRespons… | |
+ jQuery.lastModified[ ifModifie… | |
+ } | |
+ if ( ( etag = jqXHR.getResponseHeader(… | |
+ jQuery.etag[ ifModifiedKey ] =… | |
+ } | |
+ } | |
+ | |
+ // If not modified | |
+ if ( status === 304 ) { | |
+ | |
+ statusText = "notmodified"; | |
+ isSuccess = true; | |
+ | |
+ // If we have data | |
+ } else { | |
+ | |
+ try { | |
+ success = ajaxConvert( s, resp… | |
+ statusText = "success"; | |
+ isSuccess = true; | |
+ } catch(e) { | |
+ // We have a parsererror | |
+ statusText = "parsererror"; | |
+ error = e; | |
+ } | |
+ } | |
+ } else { | |
+ // We extract error from statusText | |
+ // then normalize statusText and status for no… | |
+ error = statusText; | |
+ if ( !statusText || status ) { | |
+ statusText = "error"; | |
+ if ( status < 0 ) { | |
+ status = 0; | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Set data for the fake xhr object | |
+ jqXHR.status = status; | |
+ jqXHR.statusText = "" + ( nativeStatusText || statusTe… | |
+ | |
+ // Success/Error | |
+ if ( isSuccess ) { | |
+ deferred.resolveWith( callbackContext, [ succe… | |
+ } else { | |
+ deferred.rejectWith( callbackContext, [ jqXHR,… | |
+ } | |
+ | |
+ // Status-dependent callbacks | |
+ jqXHR.statusCode( statusCode ); | |
+ statusCode = undefined; | |
+ | |
+ if ( fireGlobals ) { | |
+ globalEventContext.trigger( "ajax" + ( isSucce… | |
+ [ jqXHR, s, isSuccess ? succes… | |
+ } | |
+ | |
+ // Complete | |
+ completeDeferred.fireWith( callbackContext, [ jqXHR, s… | |
+ | |
+ if ( fireGlobals ) { | |
+ globalEventContext.trigger( "ajaxComplete", [ … | |
+ // Handle the global AJAX counter | |
+ if ( !( --jQuery.active ) ) { | |
+ jQuery.event.trigger( "ajaxStop" ); | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Attach deferreds | |
+ deferred.promise( jqXHR ); | |
+ jqXHR.success = jqXHR.done; | |
+ jqXHR.error = jqXHR.fail; | |
+ jqXHR.complete = completeDeferred.add; | |
+ | |
+ // Status-dependent callbacks | |
+ jqXHR.statusCode = function( map ) { | |
+ if ( map ) { | |
+ var tmp; | |
+ if ( state < 2 ) { | |
+ for ( tmp in map ) { | |
+ statusCode[ tmp ] = [ statusCo… | |
+ } | |
+ } else { | |
+ tmp = map[ jqXHR.status ]; | |
+ jqXHR.then( tmp, tmp ); | |
+ } | |
+ } | |
+ return this; | |
+ }; | |
+ | |
+ // Remove hash character (#7531: and string promotion) | |
+ // Add protocol if not provided (#5866: IE7 issue with protoco… | |
+ // We also use the url parameter if available | |
+ s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace… | |
+ | |
+ // Extract dataTypes list | |
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().s… | |
+ | |
+ // Determine if a cross-domain request is in order | |
+ if ( s.crossDomain == null ) { | |
+ parts = rurl.exec( s.url.toLowerCase() ); | |
+ s.crossDomain = !!( parts && | |
+ ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 … | |
+ ( parts[ 3 ] || ( parts[ 1 ] === "http… | |
+ ( ajaxLocParts[ 3 ] || ( ajaxL… | |
+ ); | |
+ } | |
+ | |
+ // Convert data if not already a string | |
+ if ( s.data && s.processData && typeof s.data !== "string" ) { | |
+ s.data = jQuery.param( s.data, s.traditional ); | |
+ } | |
+ | |
+ // Apply prefilters | |
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); | |
+ | |
+ // If request was aborted inside a prefilter, stop there | |
+ if ( state === 2 ) { | |
+ return false; | |
+ } | |
+ | |
+ // We can fire global events as of now if asked to | |
+ fireGlobals = s.global; | |
+ | |
+ // Uppercase the type | |
+ s.type = s.type.toUpperCase(); | |
+ | |
+ // Determine if request has content | |
+ s.hasContent = !rnoContent.test( s.type ); | |
+ | |
+ // Watch for a new set of requests | |
+ if ( fireGlobals && jQuery.active++ === 0 ) { | |
+ jQuery.event.trigger( "ajaxStart" ); | |
+ } | |
+ | |
+ // More options handling for requests with no content | |
+ if ( !s.hasContent ) { | |
+ | |
+ // If data is available, append data to url | |
+ if ( s.data ) { | |
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) … | |
+ // #9682: remove data so that it's not used in… | |
+ delete s.data; | |
+ } | |
+ | |
+ // Get ifModifiedKey before adding the anti-cache para… | |
+ ifModifiedKey = s.url; | |
+ | |
+ // Add anti-cache in url if needed | |
+ if ( s.cache === false ) { | |
+ | |
+ var ts = jQuery.now(), | |
+ // try replacing _= if it is there | |
+ ret = s.url.replace( rts, "$1_=" + ts … | |
+ | |
+ // if nothing was replaced, add timestamp to t… | |
+ s.url = ret + ( ( ret === s.url ) ? ( rquery.t… | |
+ } | |
+ } | |
+ | |
+ // Set the correct header, if data is being sent | |
+ if ( s.data && s.hasContent && s.contentType !== false || opti… | |
+ jqXHR.setRequestHeader( "Content-Type", s.contentType … | |
+ } | |
+ | |
+ // Set the If-Modified-Since and/or If-None-Match header, if i… | |
+ if ( s.ifModified ) { | |
+ ifModifiedKey = ifModifiedKey || s.url; | |
+ if ( jQuery.lastModified[ ifModifiedKey ] ) { | |
+ jqXHR.setRequestHeader( "If-Modified-Since", j… | |
+ } | |
+ if ( jQuery.etag[ ifModifiedKey ] ) { | |
+ jqXHR.setRequestHeader( "If-None-Match", jQuer… | |
+ } | |
+ } | |
+ | |
+ // Set the Accepts header for the server, depending on the dat… | |
+ jqXHR.setRequestHeader( | |
+ "Accept", | |
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? | |
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0… | |
+ s.accepts[ "*" ] | |
+ ); | |
+ | |
+ // Check for headers option | |
+ for ( i in s.headers ) { | |
+ jqXHR.setRequestHeader( i, s.headers[ i ] ); | |
+ } | |
+ | |
+ // Allow custom headers/mimetypes and early abort | |
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqX… | |
+ // Abort if not done already | |
+ jqXHR.abort(); | |
+ return false; | |
+ | |
+ } | |
+ | |
+ // Install callbacks on deferreds | |
+ for ( i in { success: 1, error: 1, complete: 1 } ) { | |
+ jqXHR[ i ]( s[ i ] ); | |
+ } | |
+ | |
+ // Get transport | |
+ transport = inspectPrefiltersOrTransports( transports, s, opti… | |
+ | |
+ // If no transport, we auto-abort | |
+ if ( !transport ) { | |
+ done( -1, "No Transport" ); | |
+ } else { | |
+ jqXHR.readyState = 1; | |
+ // Send global event | |
+ if ( fireGlobals ) { | |
+ globalEventContext.trigger( "ajaxSend", [ jqXH… | |
+ } | |
+ // Timeout | |
+ if ( s.async && s.timeout > 0 ) { | |
+ timeoutTimer = setTimeout( function(){ | |
+ jqXHR.abort( "timeout" ); | |
+ }, s.timeout ); | |
+ } | |
+ | |
+ try { | |
+ state = 1; | |
+ transport.send( requestHeaders, done ); | |
+ } catch (e) { | |
+ // Propagate exception as error if not done | |
+ if ( state < 2 ) { | |
+ done( -1, e ); | |
+ // Simply rethrow otherwise | |
+ } else { | |
+ throw e; | |
+ } | |
+ } | |
+ } | |
+ | |
+ return jqXHR; | |
+ }, | |
+ | |
+ // Serialize an array of form elements or a set of | |
+ // key/values into a query string | |
+ param: function( a, traditional ) { | |
+ var s = [], | |
+ add = function( key, value ) { | |
+ // If value is a function, invoke it and retur… | |
+ value = jQuery.isFunction( value ) ? value() :… | |
+ s[ s.length ] = encodeURIComponent( key ) + "=… | |
+ }; | |
+ | |
+ // Set traditional to true for jQuery <= 1.3.2 behavior. | |
+ if ( traditional === undefined ) { | |
+ traditional = jQuery.ajaxSettings.traditional; | |
+ } | |
+ | |
+ // If an array was passed in, assume that it is an array of fo… | |
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObjec… | |
+ // Serialize the form elements | |
+ jQuery.each( a, function() { | |
+ add( this.name, this.value ); | |
+ }); | |
+ | |
+ } else { | |
+ // If traditional, encode the "old" way (the way 1.3.2… | |
+ // did it), otherwise encode params recursively. | |
+ for ( var prefix in a ) { | |
+ buildParams( prefix, a[ prefix ], traditional,… | |
+ } | |
+ } | |
+ | |
+ // Return the resulting serialization | |
+ return s.join( "&" ).replace( r20, "+" ); | |
+ } | |
+}); | |
+ | |
+function buildParams( prefix, obj, traditional, add ) { | |
+ if ( jQuery.isArray( obj ) ) { | |
+ // Serialize array item. | |
+ jQuery.each( obj, function( i, v ) { | |
+ if ( traditional || rbracket.test( prefix ) ) { | |
+ // Treat each array item as a scalar. | |
+ add( prefix, v ); | |
+ | |
+ } else { | |
+ // If array item is non-scalar (array or objec… | |
+ // numeric index to resolve deserialization am… | |
+ // Note that rack (as of 1.0.0) can't currentl… | |
+ // nested arrays properly, and attempting to d… | |
+ // a server error. Possible fixes are to modif… | |
+ // deserialization algorithm or to provide an … | |
+ // to force array serialization to be shallow. | |
+ buildParams( prefix + "[" + ( typeof v === "ob… | |
+ } | |
+ }); | |
+ | |
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) { | |
+ // Serialize object item. | |
+ for ( var name in obj ) { | |
+ buildParams( prefix + "[" + name + "]", obj[ name ], t… | |
+ } | |
+ | |
+ } else { | |
+ // Serialize scalar item. | |
+ add( prefix, obj ); | |
+ } | |
+} | |
+ | |
+// This is still on the jQuery object... for now | |
+// Want to move this to jQuery.ajax some day | |
+jQuery.extend({ | |
+ | |
+ // Counter for holding the number of active queries | |
+ active: 0, | |
+ | |
+ // Last-Modified header cache for next request | |
+ lastModified: {}, | |
+ etag: {} | |
+ | |
+}); | |
+ | |
+/* Handles responses to an ajax request: | |
+ * - sets all responseXXX fields accordingly | |
+ * - finds the right dataType (mediates between content-type and expected data… | |
+ * - returns the corresponding response | |
+ */ | |
+function ajaxHandleResponses( s, jqXHR, responses ) { | |
+ | |
+ var contents = s.contents, | |
+ dataTypes = s.dataTypes, | |
+ responseFields = s.responseFields, | |
+ ct, | |
+ type, | |
+ finalDataType, | |
+ firstDataType; | |
+ | |
+ // Fill responseXXX fields | |
+ for ( type in responseFields ) { | |
+ if ( type in responses ) { | |
+ jqXHR[ responseFields[type] ] = responses[ type ]; | |
+ } | |
+ } | |
+ | |
+ // Remove auto dataType and get content-type in the process | |
+ while( dataTypes[ 0 ] === "*" ) { | |
+ dataTypes.shift(); | |
+ if ( ct === undefined ) { | |
+ ct = s.mimeType || jqXHR.getResponseHeader( "content-t… | |
+ } | |
+ } | |
+ | |
+ // Check if we're dealing with a known content-type | |
+ if ( ct ) { | |
+ for ( type in contents ) { | |
+ if ( contents[ type ] && contents[ type ].test( ct ) )… | |
+ dataTypes.unshift( type ); | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Check to see if we have a response for the expected dataType | |
+ if ( dataTypes[ 0 ] in responses ) { | |
+ finalDataType = dataTypes[ 0 ]; | |
+ } else { | |
+ // Try convertible dataTypes | |
+ for ( type in responses ) { | |
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dat… | |
+ finalDataType = type; | |
+ break; | |
+ } | |
+ if ( !firstDataType ) { | |
+ firstDataType = type; | |
+ } | |
+ } | |
+ // Or just use first one | |
+ finalDataType = finalDataType || firstDataType; | |
+ } | |
+ | |
+ // If we found a dataType | |
+ // We add the dataType to the list if needed | |
+ // and return the corresponding response | |
+ if ( finalDataType ) { | |
+ if ( finalDataType !== dataTypes[ 0 ] ) { | |
+ dataTypes.unshift( finalDataType ); | |
+ } | |
+ return responses[ finalDataType ]; | |
+ } | |
+} | |
+ | |
+// Chain conversions given the request and the original response | |
+function ajaxConvert( s, response ) { | |
+ | |
+ // Apply the dataFilter if provided | |
+ if ( s.dataFilter ) { | |
+ response = s.dataFilter( response, s.dataType ); | |
+ } | |
+ | |
+ var dataTypes = s.dataTypes, | |
+ converters = {}, | |
+ i, | |
+ key, | |
+ length = dataTypes.length, | |
+ tmp, | |
+ // Current and previous dataTypes | |
+ current = dataTypes[ 0 ], | |
+ prev, | |
+ // Conversion expression | |
+ conversion, | |
+ // Conversion function | |
+ conv, | |
+ // Conversion functions (transitive conversion) | |
+ conv1, | |
+ conv2; | |
+ | |
+ // For each dataType in the chain | |
+ for ( i = 1; i < length; i++ ) { | |
+ | |
+ // Create converters map | |
+ // with lowercased keys | |
+ if ( i === 1 ) { | |
+ for ( key in s.converters ) { | |
+ if ( typeof key === "string" ) { | |
+ converters[ key.toLowerCase() ] = s.co… | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Get the dataTypes | |
+ prev = current; | |
+ current = dataTypes[ i ]; | |
+ | |
+ // If current is auto dataType, update it to prev | |
+ if ( current === "*" ) { | |
+ current = prev; | |
+ // If no auto and dataTypes are actually different | |
+ } else if ( prev !== "*" && prev !== current ) { | |
+ | |
+ // Get the converter | |
+ conversion = prev + " " + current; | |
+ conv = converters[ conversion ] || converters[ "* " + … | |
+ | |
+ // If there is no direct converter, search transitively | |
+ if ( !conv ) { | |
+ conv2 = undefined; | |
+ for ( conv1 in converters ) { | |
+ tmp = conv1.split( " " ); | |
+ if ( tmp[ 0 ] === prev || tmp[ 0 ] ===… | |
+ conv2 = converters[ tmp[1] + "… | |
+ if ( conv2 ) { | |
+ conv1 = converters[ co… | |
+ if ( conv1 === true ) { | |
+ conv = conv2; | |
+ } else if ( conv2 === … | |
+ conv = conv1; | |
+ } | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ // If we found no converter, dispatch an error | |
+ if ( !( conv || conv2 ) ) { | |
+ jQuery.error( "No conversion from " + conversi… | |
+ } | |
+ // If found converter is not an equivalence | |
+ if ( conv !== true ) { | |
+ // Convert with 1 or 2 converters accordingly | |
+ response = conv ? conv( response ) : conv2( co… | |
+ } | |
+ } | |
+ } | |
+ return response; | |
+} | |
+ | |
+ | |
+ | |
+ | |
+var jsc = jQuery.now(), | |
+ jsre = /(\=)\?(&|$)|\?\?/i; | |
+ | |
+// Default jsonp settings | |
+jQuery.ajaxSetup({ | |
+ jsonp: "callback", | |
+ jsonpCallback: function() { | |
+ return jQuery.expando + "_" + ( jsc++ ); | |
+ } | |
+}); | |
+ | |
+// Detect, normalize options and install callbacks for jsonp requests | |
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { | |
+ | |
+ var inspectData = ( typeof s.data === "string" ) && /^application\/x\-… | |
+ | |
+ if ( s.dataTypes[ 0 ] === "jsonp" || | |
+ s.jsonp !== false && ( jsre.test( s.url ) || | |
+ inspectData && jsre.test( s.data ) ) ) { | |
+ | |
+ var responseContainer, | |
+ jsonpCallback = s.jsonpCallback = | |
+ jQuery.isFunction( s.jsonpCallback ) ? s.jsonp… | |
+ previous = window[ jsonpCallback ], | |
+ url = s.url, | |
+ data = s.data, | |
+ replace = "$1" + jsonpCallback + "$2"; | |
+ | |
+ if ( s.jsonp !== false ) { | |
+ url = url.replace( jsre, replace ); | |
+ if ( s.url === url ) { | |
+ if ( inspectData ) { | |
+ data = data.replace( jsre, replace ); | |
+ } | |
+ if ( s.data === data ) { | |
+ // Add callback manually | |
+ url += (/\?/.test( url ) ? "&" : "?") … | |
+ } | |
+ } | |
+ } | |
+ | |
+ s.url = url; | |
+ s.data = data; | |
+ | |
+ // Install callback | |
+ window[ jsonpCallback ] = function( response ) { | |
+ responseContainer = [ response ]; | |
+ }; | |
+ | |
+ // Clean-up function | |
+ jqXHR.always(function() { | |
+ // Set callback back to previous value | |
+ window[ jsonpCallback ] = previous; | |
+ // Call if it was a function and we have a response | |
+ if ( responseContainer && jQuery.isFunction( previous … | |
+ window[ jsonpCallback ]( responseContainer[ 0 … | |
+ } | |
+ }); | |
+ | |
+ // Use data converter to retrieve json after script execution | |
+ s.converters["script json"] = function() { | |
+ if ( !responseContainer ) { | |
+ jQuery.error( jsonpCallback + " was not called… | |
+ } | |
+ return responseContainer[ 0 ]; | |
+ }; | |
+ | |
+ // force json dataType | |
+ s.dataTypes[ 0 ] = "json"; | |
+ | |
+ // Delegate to script | |
+ return "script"; | |
+ } | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+// Install script dataType | |
+jQuery.ajaxSetup({ | |
+ accepts: { | |
+ script: "text/javascript, application/javascript, application/… | |
+ }, | |
+ contents: { | |
+ script: /javascript|ecmascript/ | |
+ }, | |
+ converters: { | |
+ "text script": function( text ) { | |
+ jQuery.globalEval( text ); | |
+ return text; | |
+ } | |
+ } | |
+}); | |
+ | |
+// Handle cache's special case and global | |
+jQuery.ajaxPrefilter( "script", function( s ) { | |
+ if ( s.cache === undefined ) { | |
+ s.cache = false; | |
+ } | |
+ if ( s.crossDomain ) { | |
+ s.type = "GET"; | |
+ s.global = false; | |
+ } | |
+}); | |
+ | |
+// Bind script tag hack transport | |
+jQuery.ajaxTransport( "script", function(s) { | |
+ | |
+ // This transport only deals with cross domain requests | |
+ if ( s.crossDomain ) { | |
+ | |
+ var script, | |
+ head = document.head || document.getElementsByTagName(… | |
+ | |
+ return { | |
+ | |
+ send: function( _, callback ) { | |
+ | |
+ script = document.createElement( "script" ); | |
+ | |
+ script.async = "async"; | |
+ | |
+ if ( s.scriptCharset ) { | |
+ script.charset = s.scriptCharset; | |
+ } | |
+ | |
+ script.src = s.url; | |
+ | |
+ // Attach handlers for all browsers | |
+ script.onload = script.onreadystatechange = fu… | |
+ | |
+ if ( isAbort || !script.readyState || … | |
+ | |
+ // Handle memory leak in IE | |
+ script.onload = script.onready… | |
+ | |
+ // Remove the script | |
+ if ( head && script.parentNode… | |
+ head.removeChild( scri… | |
+ } | |
+ | |
+ // Dereference the script | |
+ script = undefined; | |
+ | |
+ // Callback if not abort | |
+ if ( !isAbort ) { | |
+ callback( 200, "succes… | |
+ } | |
+ } | |
+ }; | |
+ // Use insertBefore instead of appendChild to… | |
+ // This arises when a base node is used (#2709… | |
+ head.insertBefore( script, head.firstChild ); | |
+ }, | |
+ | |
+ abort: function() { | |
+ if ( script ) { | |
+ script.onload( 0, 1 ); | |
+ } | |
+ } | |
+ }; | |
+ } | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+var // #5280: Internet Explorer will keep connections alive if we don't abort … | |
+ xhrOnUnloadAbort = window.ActiveXObject ? function() { | |
+ // Abort all pending requests | |
+ for ( var key in xhrCallbacks ) { | |
+ xhrCallbacks[ key ]( 0, 1 ); | |
+ } | |
+ } : false, | |
+ xhrId = 0, | |
+ xhrCallbacks; | |
+ | |
+// Functions to create xhrs | |
+function createStandardXHR() { | |
+ try { | |
+ return new window.XMLHttpRequest(); | |
+ } catch( e ) {} | |
+} | |
+ | |
+function createActiveXHR() { | |
+ try { | |
+ return new window.ActiveXObject( "Microsoft.XMLHTTP" ); | |
+ } catch( e ) {} | |
+} | |
+ | |
+// Create the request object | |
+// (This is still attached to ajaxSettings for backward compatibility) | |
+jQuery.ajaxSettings.xhr = window.ActiveXObject ? | |
+ /* Microsoft failed to properly | |
+ * implement the XMLHttpRequest in IE7 (can't request local files), | |
+ * so we use the ActiveXObject when it is available | |
+ * Additionally XMLHttpRequest can be disabled in IE7/IE8 so | |
+ * we need a fallback. | |
+ */ | |
+ function() { | |
+ return !this.isLocal && createStandardXHR() || createActiveXHR… | |
+ } : | |
+ // For all other browsers, use the standard XMLHttpRequest object | |
+ createStandardXHR; | |
+ | |
+// Determine support properties | |
+(function( xhr ) { | |
+ jQuery.extend( jQuery.support, { | |
+ ajax: !!xhr, | |
+ cors: !!xhr && ( "withCredentials" in xhr ) | |
+ }); | |
+})( jQuery.ajaxSettings.xhr() ); | |
+ | |
+// Create transport if the browser can provide an xhr | |
+if ( jQuery.support.ajax ) { | |
+ | |
+ jQuery.ajaxTransport(function( s ) { | |
+ // Cross domain only allowed if supported through XMLHttpReque… | |
+ if ( !s.crossDomain || jQuery.support.cors ) { | |
+ | |
+ var callback; | |
+ | |
+ return { | |
+ send: function( headers, complete ) { | |
+ | |
+ // Get a new xhr | |
+ var xhr = s.xhr(), | |
+ handle, | |
+ i; | |
+ | |
+ // Open the socket | |
+ // Passing null username, generates a … | |
+ if ( s.username ) { | |
+ xhr.open( s.type, s.url, s.asy… | |
+ } else { | |
+ xhr.open( s.type, s.url, s.asy… | |
+ } | |
+ | |
+ // Apply custom fields if provided | |
+ if ( s.xhrFields ) { | |
+ for ( i in s.xhrFields ) { | |
+ xhr[ i ] = s.xhrFields… | |
+ } | |
+ } | |
+ | |
+ // Override mime type if needed | |
+ if ( s.mimeType && xhr.overrideMimeTyp… | |
+ xhr.overrideMimeType( s.mimeTy… | |
+ } | |
+ | |
+ // X-Requested-With header | |
+ // For cross-domain requests, seeing a… | |
+ // akin to a jigsaw puzzle, we simply … | |
+ // (it can always be set on a per-requ… | |
+ // For same-domain requests, won't cha… | |
+ if ( !s.crossDomain && !headers["X-Req… | |
+ headers[ "X-Requested-With" ] … | |
+ } | |
+ | |
+ // Need an extra try/catch for cross d… | |
+ try { | |
+ for ( i in headers ) { | |
+ xhr.setRequestHeader( … | |
+ } | |
+ } catch( _ ) {} | |
+ | |
+ // Do send the request | |
+ // This may raise an exception which i… | |
+ // handled in jQuery.ajax (so no try/c… | |
+ xhr.send( ( s.hasContent && s.data ) |… | |
+ | |
+ // Listener | |
+ callback = function( _, isAbort ) { | |
+ | |
+ var status, | |
+ statusText, | |
+ responseHeaders, | |
+ responses, | |
+ xml; | |
+ | |
+ // Firefox throws exceptions w… | |
+ // of an xhr when a network er… | |
+ // http://helpful.knobs-dials.… | |
+ try { | |
+ | |
+ // Was never called an… | |
+ if ( callback && ( isA… | |
+ | |
+ // Only called… | |
+ callback = und… | |
+ | |
+ // Do not keep… | |
+ if ( handle ) { | |
+ xhr.on… | |
+ if ( x… | |
+ … | |
+ } | |
+ } | |
+ | |
+ // If it's an … | |
+ if ( isAbort )… | |
+ // Abo… | |
+ if ( x… | |
+ … | |
+ } | |
+ } else { | |
+ status… | |
+ respon… | |
+ respon… | |
+ xml = … | |
+ | |
+ // Con… | |
+ if ( x… | |
+ … | |
+ } | |
+ | |
+ // Whe… | |
+ // on … | |
+ try { | |
+ … | |
+ } catc… | |
+ } | |
+ | |
+ // Fir… | |
+ // sta… | |
+ try { | |
+ … | |
+ } catc… | |
+ … | |
+ … | |
+ } | |
+ | |
+ // Fil… | |
+ | |
+ // If … | |
+ // (su… | |
+ // can… | |
+ if ( !… | |
+ … | |
+ // IE … | |
+ } else… | |
+ … | |
+ } | |
+ } | |
+ } | |
+ } catch( firefoxAccessExceptio… | |
+ if ( !isAbort ) { | |
+ complete( -1, … | |
+ } | |
+ } | |
+ | |
+ // Call complete if needed | |
+ if ( responses ) { | |
+ complete( status, stat… | |
+ } | |
+ }; | |
+ | |
+ // if we're in sync mode or it's in ca… | |
+ // and has been retrieved directly (IE… | |
+ // we need to manually fire the callba… | |
+ if ( !s.async || xhr.readyState === 4 … | |
+ callback(); | |
+ } else { | |
+ handle = ++xhrId; | |
+ if ( xhrOnUnloadAbort ) { | |
+ // Create the active x… | |
+ // and attach the unlo… | |
+ if ( !xhrCallbacks ) { | |
+ xhrCallbacks =… | |
+ jQuery( window… | |
+ } | |
+ // Add to list of acti… | |
+ xhrCallbacks[ handle ]… | |
+ } | |
+ xhr.onreadystatechange = callb… | |
+ } | |
+ }, | |
+ | |
+ abort: function() { | |
+ if ( callback ) { | |
+ callback(0,1); | |
+ } | |
+ } | |
+ }; | |
+ } | |
+ }); | |
+} | |
+ | |
+ | |
+ | |
+ | |
+var elemdisplay = {}, | |
+ iframe, iframeDoc, | |
+ rfxtypes = /^(?:toggle|show|hide)$/, | |
+ rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, | |
+ timerId, | |
+ fxAttrs = [ | |
+ // height animations | |
+ [ "height", "marginTop", "marginBottom", "paddingTop", "paddin… | |
+ // width animations | |
+ [ "width", "marginLeft", "marginRight", "paddingLeft", "paddin… | |
+ // opacity animations | |
+ [ "opacity" ] | |
+ ], | |
+ fxNow; | |
+ | |
+jQuery.fn.extend({ | |
+ show: function( speed, easing, callback ) { | |
+ var elem, display; | |
+ | |
+ if ( speed || speed === 0 ) { | |
+ return this.animate( genFx("show", 3), speed, easing, … | |
+ | |
+ } else { | |
+ for ( var i = 0, j = this.length; i < j; i++ ) { | |
+ elem = this[ i ]; | |
+ | |
+ if ( elem.style ) { | |
+ display = elem.style.display; | |
+ | |
+ // Reset the inline display of this el… | |
+ // being hidden by cascaded rules or n… | |
+ if ( !jQuery._data(elem, "olddisplay")… | |
+ display = elem.style.display =… | |
+ } | |
+ | |
+ // Set elements which have been overri… | |
+ // in a stylesheet to whatever the def… | |
+ // for such an element | |
+ if ( (display === "" && jQuery.css(ele… | |
+ !jQuery.contains( elem.ownerDo… | |
+ jQuery._data( elem, "olddispla… | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Set the display of most of the elements in a second… | |
+ // to avoid the constant reflow | |
+ for ( i = 0; i < j; i++ ) { | |
+ elem = this[ i ]; | |
+ | |
+ if ( elem.style ) { | |
+ display = elem.style.display; | |
+ | |
+ if ( display === "" || display === "no… | |
+ elem.style.display = jQuery._d… | |
+ } | |
+ } | |
+ } | |
+ | |
+ return this; | |
+ } | |
+ }, | |
+ | |
+ hide: function( speed, easing, callback ) { | |
+ if ( speed || speed === 0 ) { | |
+ return this.animate( genFx("hide", 3), speed, easing, … | |
+ | |
+ } else { | |
+ var elem, display, | |
+ i = 0, | |
+ j = this.length; | |
+ | |
+ for ( ; i < j; i++ ) { | |
+ elem = this[i]; | |
+ if ( elem.style ) { | |
+ display = jQuery.css( elem, "display" … | |
+ | |
+ if ( display !== "none" && !jQuery._da… | |
+ jQuery._data( elem, "olddispla… | |
+ } | |
+ } | |
+ } | |
+ | |
+ // Set the display of the elements in a second loop | |
+ // to avoid the constant reflow | |
+ for ( i = 0; i < j; i++ ) { | |
+ if ( this[i].style ) { | |
+ this[i].style.display = "none"; | |
+ } | |
+ } | |
+ | |
+ return this; | |
+ } | |
+ }, | |
+ | |
+ // Save the old toggle function | |
+ _toggle: jQuery.fn.toggle, | |
+ | |
+ toggle: function( fn, fn2, callback ) { | |
+ var bool = typeof fn === "boolean"; | |
+ | |
+ if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { | |
+ this._toggle.apply( this, arguments ); | |
+ | |
+ } else if ( fn == null || bool ) { | |
+ this.each(function() { | |
+ var state = bool ? fn : jQuery(this).is(":hidd… | |
+ jQuery(this)[ state ? "show" : "hide" ](); | |
+ }); | |
+ | |
+ } else { | |
+ this.animate(genFx("toggle", 3), fn, fn2, callback); | |
+ } | |
+ | |
+ return this; | |
+ }, | |
+ | |
+ fadeTo: function( speed, to, easing, callback ) { | |
+ return this.filter(":hidden").css("opacity", 0).show().end() | |
+ .animate({opacity: to}, speed, easing,… | |
+ }, | |
+ | |
+ animate: function( prop, speed, easing, callback ) { | |
+ var optall = jQuery.speed( speed, easing, callback ); | |
+ | |
+ if ( jQuery.isEmptyObject( prop ) ) { | |
+ return this.each( optall.complete, [ false ] ); | |
+ } | |
+ | |
+ // Do not change referenced properties as per-property easing … | |
+ prop = jQuery.extend( {}, prop ); | |
+ | |
+ function doAnimation() { | |
+ // XXX 'this' does not always have a nodeName when run… | |
+ // test suite | |
+ | |
+ if ( optall.queue === false ) { | |
+ jQuery._mark( this ); | |
+ } | |
+ | |
+ var opt = jQuery.extend( {}, optall ), | |
+ isElement = this.nodeType === 1, | |
+ hidden = isElement && jQuery(this).is(":hidden… | |
+ name, val, p, e, hooks, replace, | |
+ parts, start, end, unit, | |
+ method; | |
+ | |
+ // will store per property easing and be used to deter… | |
+ opt.animatedProperties = {}; | |
+ | |
+ // first pass over propertys to expand / normalize | |
+ for ( p in prop ) { | |
+ name = jQuery.camelCase( p ); | |
+ if ( p !== name ) { | |
+ prop[ name ] = prop[ p ]; | |
+ delete prop[ p ]; | |
+ } | |
+ | |
+ if ( ( hooks = jQuery.cssHooks[ name ] ) && "e… | |
+ replace = hooks.expand( prop[ name ] ); | |
+ delete prop[ name ]; | |
+ | |
+ // not quite $.extend, this wont overw… | |
+ // also - reusing 'p' from above becau… | |
+ for ( p in replace ) { | |
+ if ( ! ( p in prop ) ) { | |
+ prop[ p ] = replace[ p… | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ for ( name in prop ) { | |
+ val = prop[ name ]; | |
+ // easing resolution: per property > opt.speci… | |
+ if ( jQuery.isArray( val ) ) { | |
+ opt.animatedProperties[ name ] = val[ … | |
+ val = prop[ name ] = val[ 0 ]; | |
+ } else { | |
+ opt.animatedProperties[ name ] = opt.s… | |
+ } | |
+ | |
+ if ( val === "hide" && hidden || val === "show… | |
+ return opt.complete.call( this ); | |
+ } | |
+ | |
+ if ( isElement && ( name === "height" || name … | |
+ // Make sure that nothing sneaks out | |
+ // Record all 3 overflow attributes be… | |
+ // change the overflow attribute when … | |
+ // overflowY are set to the same value | |
+ opt.overflow = [ this.style.overflow, … | |
+ | |
+ // Set display property to inline-bloc… | |
+ // animations on inline elements that … | |
+ if ( jQuery.css( this, "display" ) ===… | |
+ jQuery.css( this, "flo… | |
+ | |
+ // inline-level elements accep… | |
+ // block-level elements need t… | |
+ if ( !jQuery.support.inlineBlo… | |
+ this.style.display = "… | |
+ | |
+ } else { | |
+ this.style.zoom = 1; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ if ( opt.overflow != null ) { | |
+ this.style.overflow = "hidden"; | |
+ } | |
+ | |
+ for ( p in prop ) { | |
+ e = new jQuery.fx( this, opt, p ); | |
+ val = prop[ p ]; | |
+ | |
+ if ( rfxtypes.test( val ) ) { | |
+ | |
+ // Tracks whether to show or hide base… | |
+ // data attached to the element | |
+ method = jQuery._data( this, "toggle" … | |
+ if ( method ) { | |
+ jQuery._data( this, "toggle" +… | |
+ e[ method ](); | |
+ } else { | |
+ e[ val ](); | |
+ } | |
+ | |
+ } else { | |
+ parts = rfxnum.exec( val ); | |
+ start = e.cur(); | |
+ | |
+ if ( parts ) { | |
+ end = parseFloat( parts[2] ); | |
+ unit = parts[3] || ( jQuery.cs… | |
+ | |
+ // We need to compute starting… | |
+ if ( unit !== "px" ) { | |
+ jQuery.style( this, p,… | |
+ start = ( (end || 1) /… | |
+ jQuery.style( this, p,… | |
+ } | |
+ | |
+ // If a +=/-= token was provid… | |
+ if ( parts[1] ) { | |
+ end = ( (parts[ 1 ] ==… | |
+ } | |
+ | |
+ e.custom( start, end, unit ); | |
+ | |
+ } else { | |
+ e.custom( start, val, "" ); | |
+ } | |
+ } | |
+ } | |
+ | |
+ // For JS strict compliance | |
+ return true; | |
+ } | |
+ | |
+ return optall.queue === false ? | |
+ this.each( doAnimation ) : | |
+ this.queue( optall.queue, doAnimation ); | |
+ }, | |
+ | |
+ stop: function( type, clearQueue, gotoEnd ) { | |
+ if ( typeof type !== "string" ) { | |
+ gotoEnd = clearQueue; | |
+ clearQueue = type; | |
+ type = undefined; | |
+ } | |
+ if ( clearQueue && type !== false ) { | |
+ this.queue( type || "fx", [] ); | |
+ } | |
+ | |
+ return this.each(function() { | |
+ var index, | |
+ hadTimers = false, | |
+ timers = jQuery.timers, | |
+ data = jQuery._data( this ); | |
+ | |
+ // clear marker counters if we know they won't be | |
+ if ( !gotoEnd ) { | |
+ jQuery._unmark( true, this ); | |
+ } | |
+ | |
+ function stopQueue( elem, data, index ) { | |
+ var hooks = data[ index ]; | |
+ jQuery.removeData( elem, index, true ); | |
+ hooks.stop( gotoEnd ); | |
+ } | |
+ | |
+ if ( type == null ) { | |
+ for ( index in data ) { | |
+ if ( data[ index ] && data[ index ].st… | |
+ stopQueue( this, data, index ); | |
+ } | |
+ } | |
+ } else if ( data[ index = type + ".run" ] && data[ ind… | |
+ stopQueue( this, data, index ); | |
+ } | |
+ | |
+ for ( index = timers.length; index--; ) { | |
+ if ( timers[ index ].elem === this && (type ==… | |
+ if ( gotoEnd ) { | |
+ | |
+ // force the next step to be t… | |
+ timers[ index ]( true ); | |
+ } else { | |
+ timers[ index ].saveState(); | |
+ } | |
+ hadTimers = true; | |
+ timers.splice( index, 1 ); | |
+ } | |
+ } | |
+ | |
+ // start the next in the queue if the last step wasn't… | |
+ // timers currently will call their complete callbacks… | |
+ // but only if they were gotoEnd | |
+ if ( !( gotoEnd && hadTimers ) ) { | |
+ jQuery.dequeue( this, type ); | |
+ } | |
+ }); | |
+ } | |
+ | |
+}); | |
+ | |
+// Animations created synchronously will run synchronously | |
+function createFxNow() { | |
+ setTimeout( clearFxNow, 0 ); | |
+ return ( fxNow = jQuery.now() ); | |
+} | |
+ | |
+function clearFxNow() { | |
+ fxNow = undefined; | |
+} | |
+ | |
+// Generate parameters to create a standard animation | |
+function genFx( type, num ) { | |
+ var obj = {}; | |
+ | |
+ jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), functi… | |
+ obj[ this ] = type; | |
+ }); | |
+ | |
+ return obj; | |
+} | |
+ | |
+// Generate shortcuts for custom animations | |
+jQuery.each({ | |
+ slideDown: genFx( "show", 1 ), | |
+ slideUp: genFx( "hide", 1 ), | |
+ slideToggle: genFx( "toggle", 1 ), | |
+ fadeIn: { opacity: "show" }, | |
+ fadeOut: { opacity: "hide" }, | |
+ fadeToggle: { opacity: "toggle" } | |
+}, function( name, props ) { | |
+ jQuery.fn[ name ] = function( speed, easing, callback ) { | |
+ return this.animate( props, speed, easing, callback ); | |
+ }; | |
+}); | |
+ | |
+jQuery.extend({ | |
+ speed: function( speed, easing, fn ) { | |
+ var opt = speed && typeof speed === "object" ? jQuery.extend( … | |
+ complete: fn || !fn && easing || | |
+ jQuery.isFunction( speed ) && speed, | |
+ duration: speed, | |
+ easing: fn && easing || easing && !jQuery.isFunction( … | |
+ }; | |
+ | |
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "nu… | |
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ o… | |
+ | |
+ // normalize opt.queue - true/undefined/null -> "fx" | |
+ if ( opt.queue == null || opt.queue === true ) { | |
+ opt.queue = "fx"; | |
+ } | |
+ | |
+ // Queueing | |
+ opt.old = opt.complete; | |
+ | |
+ opt.complete = function( noUnmark ) { | |
+ if ( jQuery.isFunction( opt.old ) ) { | |
+ opt.old.call( this ); | |
+ } | |
+ | |
+ if ( opt.queue ) { | |
+ jQuery.dequeue( this, opt.queue ); | |
+ } else if ( noUnmark !== false ) { | |
+ jQuery._unmark( this ); | |
+ } | |
+ }; | |
+ | |
+ return opt; | |
+ }, | |
+ | |
+ easing: { | |
+ linear: function( p ) { | |
+ return p; | |
+ }, | |
+ swing: function( p ) { | |
+ return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5; | |
+ } | |
+ }, | |
+ | |
+ timers: [], | |
+ | |
+ fx: function( elem, options, prop ) { | |
+ this.options = options; | |
+ this.elem = elem; | |
+ this.prop = prop; | |
+ | |
+ options.orig = options.orig || {}; | |
+ } | |
+ | |
+}); | |
+ | |
+jQuery.fx.prototype = { | |
+ // Simple function for setting a style value | |
+ update: function() { | |
+ if ( this.options.step ) { | |
+ this.options.step.call( this.elem, this.now, this ); | |
+ } | |
+ | |
+ ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( th… | |
+ }, | |
+ | |
+ // Get the current size | |
+ cur: function() { | |
+ if ( this.elem[ this.prop ] != null && (!this.elem.style || th… | |
+ return this.elem[ this.prop ]; | |
+ } | |
+ | |
+ var parsed, | |
+ r = jQuery.css( this.elem, this.prop ); | |
+ // Empty strings, null, undefined and "auto" are converted to … | |
+ // complex values such as "rotate(1rad)" are returned as is, | |
+ // simple values such as "10px" are parsed to Float. | |
+ return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" … | |
+ }, | |
+ | |
+ // Start an animation from one number to another | |
+ custom: function( from, to, unit ) { | |
+ var self = this, | |
+ fx = jQuery.fx; | |
+ | |
+ this.startTime = fxNow || createFxNow(); | |
+ this.end = to; | |
+ this.now = this.start = from; | |
+ this.pos = this.state = 0; | |
+ this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop… | |
+ | |
+ function t( gotoEnd ) { | |
+ return self.step( gotoEnd ); | |
+ } | |
+ | |
+ t.queue = this.options.queue; | |
+ t.elem = this.elem; | |
+ t.saveState = function() { | |
+ if ( jQuery._data( self.elem, "fxshow" + self.prop ) =… | |
+ if ( self.options.hide ) { | |
+ jQuery._data( self.elem, "fxshow" + se… | |
+ } else if ( self.options.show ) { | |
+ jQuery._data( self.elem, "fxshow" + se… | |
+ } | |
+ } | |
+ }; | |
+ | |
+ if ( t() && jQuery.timers.push(t) && !timerId ) { | |
+ timerId = setInterval( fx.tick, fx.interval ); | |
+ } | |
+ }, | |
+ | |
+ // Simple 'show' function | |
+ show: function() { | |
+ var dataShow = jQuery._data( this.elem, "fxshow" + this.prop ); | |
+ | |
+ // Remember where we started, so that we can go back to it lat… | |
+ this.options.orig[ this.prop ] = dataShow || jQuery.style( thi… | |
+ this.options.show = true; | |
+ | |
+ // Begin the animation | |
+ // Make sure that we start at a small width/height to avoid an… | |
+ if ( dataShow !== undefined ) { | |
+ // This show is picking up where a previous hide or sh… | |
+ this.custom( this.cur(), dataShow ); | |
+ } else { | |
+ this.custom( this.prop === "width" || this.prop === "h… | |
+ } | |
+ | |
+ // Start by showing the element | |
+ jQuery( this.elem ).show(); | |
+ }, | |
+ | |
+ // Simple 'hide' function | |
+ hide: function() { | |
+ // Remember where we started, so that we can go back to it lat… | |
+ this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxs… | |
+ this.options.hide = true; | |
+ | |
+ // Begin the animation | |
+ this.custom( this.cur(), 0 ); | |
+ }, | |
+ | |
+ // Each step of an animation | |
+ step: function( gotoEnd ) { | |
+ var p, n, complete, | |
+ t = fxNow || createFxNow(), | |
+ done = true, | |
+ elem = this.elem, | |
+ options = this.options; | |
+ | |
+ if ( gotoEnd || t >= options.duration + this.startTime ) { | |
+ this.now = this.end; | |
+ this.pos = this.state = 1; | |
+ this.update(); | |
+ | |
+ options.animatedProperties[ this.prop ] = true; | |
+ | |
+ for ( p in options.animatedProperties ) { | |
+ if ( options.animatedProperties[ p ] !== true … | |
+ done = false; | |
+ } | |
+ } | |
+ | |
+ if ( done ) { | |
+ // Reset the overflow | |
+ if ( options.overflow != null && !jQuery.suppo… | |
+ | |
+ jQuery.each( [ "", "X", "Y" ], functio… | |
+ elem.style[ "overflow" + value… | |
+ }); | |
+ } | |
+ | |
+ // Hide the element if the "hide" operation wa… | |
+ if ( options.hide ) { | |
+ jQuery( elem ).hide(); | |
+ } | |
+ | |
+ // Reset the properties, if the item has been … | |
+ if ( options.hide || options.show ) { | |
+ for ( p in options.animatedProperties … | |
+ jQuery.style( elem, p, options… | |
+ jQuery.removeData( elem, "fxsh… | |
+ // Toggle data is no longer ne… | |
+ jQuery.removeData( elem, "togg… | |
+ } | |
+ } | |
+ | |
+ // Execute the complete function | |
+ // in the event that the complete function thr… | |
+ // we must ensure it won't be called twice. #5… | |
+ | |
+ complete = options.complete; | |
+ if ( complete ) { | |
+ | |
+ options.complete = false; | |
+ complete.call( elem ); | |
+ } | |
+ } | |
+ | |
+ return false; | |
+ | |
+ } else { | |
+ // classical easing cannot be used with an Infinity du… | |
+ if ( options.duration == Infinity ) { | |
+ this.now = t; | |
+ } else { | |
+ n = t - this.startTime; | |
+ this.state = n / options.duration; | |
+ | |
+ // Perform the easing function, defaults to sw… | |
+ this.pos = jQuery.easing[ options.animatedProp… | |
+ this.now = this.start + ( (this.end - this.sta… | |
+ } | |
+ // Perform the next step of the animation | |
+ this.update(); | |
+ } | |
+ | |
+ return true; | |
+ } | |
+}; | |
+ | |
+jQuery.extend( jQuery.fx, { | |
+ tick: function() { | |
+ var timer, | |
+ timers = jQuery.timers, | |
+ i = 0; | |
+ | |
+ for ( ; i < timers.length; i++ ) { | |
+ timer = timers[ i ]; | |
+ // Checks the timer has not already been removed | |
+ if ( !timer() && timers[ i ] === timer ) { | |
+ timers.splice( i--, 1 ); | |
+ } | |
+ } | |
+ | |
+ if ( !timers.length ) { | |
+ jQuery.fx.stop(); | |
+ } | |
+ }, | |
+ | |
+ interval: 13, | |
+ | |
+ stop: function() { | |
+ clearInterval( timerId ); | |
+ timerId = null; | |
+ }, | |
+ | |
+ speeds: { | |
+ slow: 600, | |
+ fast: 200, | |
+ // Default speed | |
+ _default: 400 | |
+ }, | |
+ | |
+ step: { | |
+ opacity: function( fx ) { | |
+ jQuery.style( fx.elem, "opacity", fx.now ); | |
+ }, | |
+ | |
+ _default: function( fx ) { | |
+ if ( fx.elem.style && fx.elem.style[ fx.prop ] != null… | |
+ fx.elem.style[ fx.prop ] = fx.now + fx.unit; | |
+ } else { | |
+ fx.elem[ fx.prop ] = fx.now; | |
+ } | |
+ } | |
+ } | |
+}); | |
+ | |
+// Ensure props that can't be negative don't go there on undershoot easing | |
+jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) { | |
+ // exclude marginTop, marginLeft, marginBottom and marginRight from th… | |
+ if ( prop.indexOf( "margin" ) ) { | |
+ jQuery.fx.step[ prop ] = function( fx ) { | |
+ jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.… | |
+ }; | |
+ } | |
+}); | |
+ | |
+if ( jQuery.expr && jQuery.expr.filters ) { | |
+ jQuery.expr.filters.animated = function( elem ) { | |
+ return jQuery.grep(jQuery.timers, function( fn ) { | |
+ return elem === fn.elem; | |
+ }).length; | |
+ }; | |
+} | |
+ | |
+// Try to restore the default display value of an element | |
+function defaultDisplay( nodeName ) { | |
+ | |
+ if ( !elemdisplay[ nodeName ] ) { | |
+ | |
+ var body = document.body, | |
+ elem = jQuery( "<" + nodeName + ">" ).appendTo( body ), | |
+ display = elem.css( "display" ); | |
+ elem.remove(); | |
+ | |
+ // If the simple way fails, | |
+ // get element's real default display by attaching it to a tem… | |
+ if ( display === "none" || display === "" ) { | |
+ // No iframe to use yet, so create it | |
+ if ( !iframe ) { | |
+ iframe = document.createElement( "iframe" ); | |
+ iframe.frameBorder = iframe.width = iframe.hei… | |
+ } | |
+ | |
+ body.appendChild( iframe ); | |
+ | |
+ // Create a cacheable copy of the iframe document on f… | |
+ // IE and Opera will allow us to reuse the iframeDoc w… | |
+ // document to it; WebKit & Firefox won't allow reusin… | |
+ if ( !iframeDoc || !iframe.createElement ) { | |
+ iframeDoc = ( iframe.contentWindow || iframe.c… | |
+ iframeDoc.write( ( jQuery.support.boxModel ? "… | |
+ iframeDoc.close(); | |
+ } | |
+ | |
+ elem = iframeDoc.createElement( nodeName ); | |
+ | |
+ iframeDoc.body.appendChild( elem ); | |
+ | |
+ display = jQuery.css( elem, "display" ); | |
+ body.removeChild( iframe ); | |
+ } | |
+ | |
+ // Store the correct default display | |
+ elemdisplay[ nodeName ] = display; | |
+ } | |
+ | |
+ return elemdisplay[ nodeName ]; | |
+} | |
+ | |
+ | |
+ | |
+ | |
+var getOffset, | |
+ rtable = /^t(?:able|d|h)$/i, | |
+ rroot = /^(?:body|html)$/i; | |
+ | |
+if ( "getBoundingClientRect" in document.documentElement ) { | |
+ getOffset = function( elem, doc, docElem, box ) { | |
+ try { | |
+ box = elem.getBoundingClientRect(); | |
+ } catch(e) {} | |
+ | |
+ // Make sure we're not dealing with a disconnected DOM node | |
+ if ( !box || !jQuery.contains( docElem, elem ) ) { | |
+ return box ? { top: box.top, left: box.left } : { top:… | |
+ } | |
+ | |
+ var body = doc.body, | |
+ win = getWindow( doc ), | |
+ clientTop = docElem.clientTop || body.clientTop || … | |
+ clientLeft = docElem.clientLeft || body.clientLeft || … | |
+ scrollTop = win.pageYOffset || jQuery.support.boxMode… | |
+ scrollLeft = win.pageXOffset || jQuery.support.boxMode… | |
+ top = box.top + scrollTop - clientTop, | |
+ left = box.left + scrollLeft - clientLeft; | |
+ | |
+ return { top: top, left: left }; | |
+ }; | |
+ | |
+} else { | |
+ getOffset = function( elem, doc, docElem ) { | |
+ var computedStyle, | |
+ offsetParent = elem.offsetParent, | |
+ prevOffsetParent = elem, | |
+ body = doc.body, | |
+ defaultView = doc.defaultView, | |
+ prevComputedStyle = defaultView ? defaultView.getCompu… | |
+ top = elem.offsetTop, | |
+ left = elem.offsetLeft; | |
+ | |
+ while ( (elem = elem.parentNode) && elem !== body && elem !== … | |
+ if ( jQuery.support.fixedPosition && prevComputedStyle… | |
+ break; | |
+ } | |
+ | |
+ computedStyle = defaultView ? defaultView.getComputedS… | |
+ top -= elem.scrollTop; | |
+ left -= elem.scrollLeft; | |
+ | |
+ if ( elem === offsetParent ) { | |
+ top += elem.offsetTop; | |
+ left += elem.offsetLeft; | |
+ | |
+ if ( jQuery.support.doesNotAddBorder && !(jQue… | |
+ top += parseFloat( computedStyle.bord… | |
+ left += parseFloat( computedStyle.bord… | |
+ } | |
+ | |
+ prevOffsetParent = offsetParent; | |
+ offsetParent = elem.offsetParent; | |
+ } | |
+ | |
+ if ( jQuery.support.subtractsBorderForOverflowNotVisib… | |
+ top += parseFloat( computedStyle.borderTopWid… | |
+ left += parseFloat( computedStyle.borderLeftWi… | |
+ } | |
+ | |
+ prevComputedStyle = computedStyle; | |
+ } | |
+ | |
+ if ( prevComputedStyle.position === "relative" || prevComputed… | |
+ top += body.offsetTop; | |
+ left += body.offsetLeft; | |
+ } | |
+ | |
+ if ( jQuery.support.fixedPosition && prevComputedStyle.positio… | |
+ top += Math.max( docElem.scrollTop, body.scrollTop ); | |
+ left += Math.max( docElem.scrollLeft, body.scrollLeft … | |
+ } | |
+ | |
+ return { top: top, left: left }; | |
+ }; | |
+} | |
+ | |
+jQuery.fn.offset = function( options ) { | |
+ if ( arguments.length ) { | |
+ return options === undefined ? | |
+ this : | |
+ this.each(function( i ) { | |
+ jQuery.offset.setOffset( this, options, i ); | |
+ }); | |
+ } | |
+ | |
+ var elem = this[0], | |
+ doc = elem && elem.ownerDocument; | |
+ | |
+ if ( !doc ) { | |
+ return null; | |
+ } | |
+ | |
+ if ( elem === doc.body ) { | |
+ return jQuery.offset.bodyOffset( elem ); | |
+ } | |
+ | |
+ return getOffset( elem, doc, doc.documentElement ); | |
+}; | |
+ | |
+jQuery.offset = { | |
+ | |
+ bodyOffset: function( body ) { | |
+ var top = body.offsetTop, | |
+ left = body.offsetLeft; | |
+ | |
+ if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { | |
+ top += parseFloat( jQuery.css(body, "marginTop") ) ||… | |
+ left += parseFloat( jQuery.css(body, "marginLeft") ) |… | |
+ } | |
+ | |
+ return { top: top, left: left }; | |
+ }, | |
+ | |
+ setOffset: function( elem, options, i ) { | |
+ var position = jQuery.css( elem, "position" ); | |
+ | |
+ // set position first, in-case top/left are set even on static… | |
+ if ( position === "static" ) { | |
+ elem.style.position = "relative"; | |
+ } | |
+ | |
+ var curElem = jQuery( elem ), | |
+ curOffset = curElem.offset(), | |
+ curCSSTop = jQuery.css( elem, "top" ), | |
+ curCSSLeft = jQuery.css( elem, "left" ), | |
+ calculatePosition = ( position === "absolute" || posit… | |
+ props = {}, curPosition = {}, curTop, curLeft; | |
+ | |
+ // need to be able to calculate position if either top or left… | |
+ if ( calculatePosition ) { | |
+ curPosition = curElem.position(); | |
+ curTop = curPosition.top; | |
+ curLeft = curPosition.left; | |
+ } else { | |
+ curTop = parseFloat( curCSSTop ) || 0; | |
+ curLeft = parseFloat( curCSSLeft ) || 0; | |
+ } | |
+ | |
+ if ( jQuery.isFunction( options ) ) { | |
+ options = options.call( elem, i, curOffset ); | |
+ } | |
+ | |
+ if ( options.top != null ) { | |
+ props.top = ( options.top - curOffset.top ) + curTop; | |
+ } | |
+ if ( options.left != null ) { | |
+ props.left = ( options.left - curOffset.left ) + curLe… | |
+ } | |
+ | |
+ if ( "using" in options ) { | |
+ options.using.call( elem, props ); | |
+ } else { | |
+ curElem.css( props ); | |
+ } | |
+ } | |
+}; | |
+ | |
+ | |
+jQuery.fn.extend({ | |
+ | |
+ position: function() { | |
+ if ( !this[0] ) { | |
+ return null; | |
+ } | |
+ | |
+ var elem = this[0], | |
+ | |
+ // Get *real* offsetParent | |
+ offsetParent = this.offsetParent(), | |
+ | |
+ // Get correct offsets | |
+ offset = this.offset(), | |
+ parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0… | |
+ | |
+ // Subtract element margins | |
+ // note: when an element has margin: auto the offsetLeft and m… | |
+ // are the same in Safari causing offset.left to incorrectly b… | |
+ offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || … | |
+ offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) ||… | |
+ | |
+ // Add offsetParent borders | |
+ parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "… | |
+ parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "… | |
+ | |
+ // Subtract the two offsets | |
+ return { | |
+ top: offset.top - parentOffset.top, | |
+ left: offset.left - parentOffset.left | |
+ }; | |
+ }, | |
+ | |
+ offsetParent: function() { | |
+ return this.map(function() { | |
+ var offsetParent = this.offsetParent || document.body; | |
+ while ( offsetParent && (!rroot.test(offsetParent.node… | |
+ offsetParent = offsetParent.offsetParent; | |
+ } | |
+ return offsetParent; | |
+ }); | |
+ } | |
+}); | |
+ | |
+ | |
+// Create scrollLeft and scrollTop methods | |
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( … | |
+ var top = /Y/.test( prop ); | |
+ | |
+ jQuery.fn[ method ] = function( val ) { | |
+ return jQuery.access( this, function( elem, method, val ) { | |
+ var win = getWindow( elem ); | |
+ | |
+ if ( val === undefined ) { | |
+ return win ? (prop in win) ? win[ prop ] : | |
+ jQuery.support.boxModel && win.documen… | |
+ win.document.body[ method ] : | |
+ elem[ method ]; | |
+ } | |
+ | |
+ if ( win ) { | |
+ win.scrollTo( | |
+ !top ? val : jQuery( win ).scrollLeft(… | |
+ top ? val : jQuery( win ).scrollTop() | |
+ ); | |
+ | |
+ } else { | |
+ elem[ method ] = val; | |
+ } | |
+ }, method, val, arguments.length, null ); | |
+ }; | |
+}); | |
+ | |
+function getWindow( elem ) { | |
+ return jQuery.isWindow( elem ) ? | |
+ elem : | |
+ elem.nodeType === 9 ? | |
+ elem.defaultView || elem.parentWindow : | |
+ false; | |
+} | |
+ | |
+ | |
+ | |
+ | |
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth m… | |
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { | |
+ var clientProp = "client" + name, | |
+ scrollProp = "scroll" + name, | |
+ offsetProp = "offset" + name; | |
+ | |
+ // innerHeight and innerWidth | |
+ jQuery.fn[ "inner" + name ] = function() { | |
+ var elem = this[0]; | |
+ return elem ? | |
+ elem.style ? | |
+ parseFloat( jQuery.css( elem, type, "padding" ) ) : | |
+ this[ type ]() : | |
+ null; | |
+ }; | |
+ | |
+ // outerHeight and outerWidth | |
+ jQuery.fn[ "outer" + name ] = function( margin ) { | |
+ var elem = this[0]; | |
+ return elem ? | |
+ elem.style ? | |
+ parseFloat( jQuery.css( elem, type, margin ? "margin" … | |
+ this[ type ]() : | |
+ null; | |
+ }; | |
+ | |
+ jQuery.fn[ type ] = function( value ) { | |
+ return jQuery.access( this, function( elem, type, value ) { | |
+ var doc, docElemProp, orig, ret; | |
+ | |
+ if ( jQuery.isWindow( elem ) ) { | |
+ // 3rd condition allows Nokia support, as it s… | |
+ doc = elem.document; | |
+ docElemProp = doc.documentElement[ clientProp … | |
+ return jQuery.support.boxModel && docElemProp … | |
+ doc.body && doc.body[ clientProp ] || … | |
+ } | |
+ | |
+ // Get document width or height | |
+ if ( elem.nodeType === 9 ) { | |
+ // Either scroll[Width/Height] or offset[Width… | |
+ doc = elem.documentElement; | |
+ | |
+ // when a window > document, IE6 reports a off… | |
+ // so we can't use max, as it'll choose the in… | |
+ // instead we use the correct client[Width/Hei… | |
+ // support:IE6 | |
+ if ( doc[ clientProp ] >= doc[ scrollProp ] ) { | |
+ return doc[ clientProp ]; | |
+ } | |
+ | |
+ return Math.max( | |
+ elem.body[ scrollProp ], doc[ scrollPr… | |
+ elem.body[ offsetProp ], doc[ offsetPr… | |
+ ); | |
+ } | |
+ | |
+ // Get width or height on the element | |
+ if ( value === undefined ) { | |
+ orig = jQuery.css( elem, type ); | |
+ ret = parseFloat( orig ); | |
+ return jQuery.isNumeric( ret ) ? ret : orig; | |
+ } | |
+ | |
+ // Set the width or height on the element | |
+ jQuery( elem ).css( type, value ); | |
+ }, type, value, arguments.length, null ); | |
+ }; | |
+}); | |
+ | |
+ | |
+ | |
+ | |
+// Expose jQuery to the global object | |
+window.jQuery = window.$ = jQuery; | |
+ | |
+// Expose jQuery as an AMD module, but only for AMD loaders that | |
+// understand the issues with loading multiple versions of jQuery | |
+// in a page that all might call define(). The loader will indicate | |
+// they have special allowances for multiple jQuery versions by | |
+// specifying define.amd.jQuery = true. Register as a named module, | |
+// since jQuery can be concatenated with other files that may use define, | |
+// but not use a proper concatenation script that understands anonymous | |
+// AMD modules. A named AMD is safest and most robust way to register. | |
+// Lowercase jquery is used because AMD module names are derived from | |
+// file names, and jQuery is normally delivered in a lowercase file name. | |
+// Do this after creating the global so that if an AMD module wants to call | |
+// noConflict to hide this version of jQuery, it will work. | |
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) { | |
+ define( "jquery", [], function () { return jQuery; } ); | |
+} | |
+ | |
+ | |
+ | |
+})( window ); | |
diff --git a/doc/html/_static/minus.png b/doc/html/_static/minus.png | |
Binary files differ. | |
diff --git a/doc/html/_static/plus.png b/doc/html/_static/plus.png | |
Binary files differ. | |
diff --git a/doc/html/_static/pygments.css b/doc/html/_static/pygments.css | |
t@@ -0,0 +1,62 @@ | |
+.highlight .hll { background-color: #ffffcc } | |
+.highlight { background: #eeffcc; } | |
+.highlight .c { color: #408090; font-style: italic } /* Comment */ | |
+.highlight .err { border: 1px solid #FF0000 } /* Error */ | |
+.highlight .k { color: #007020; font-weight: bold } /* Keyword */ | |
+.highlight .o { color: #666666 } /* Operator */ | |
+.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ | |
+.highlight .cp { color: #007020 } /* Comment.Preproc */ | |
+.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ | |
+.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Specia… | |
+.highlight .gd { color: #A00000 } /* Generic.Deleted */ | |
+.highlight .ge { font-style: italic } /* Generic.Emph */ | |
+.highlight .gr { color: #FF0000 } /* Generic.Error */ | |
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ | |
+.highlight .gi { color: #00A000 } /* Generic.Inserted */ | |
+.highlight .go { color: #303030 } /* Generic.Output */ | |
+.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ | |
+.highlight .gs { font-weight: bold } /* Generic.Strong */ | |
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ | |
+.highlight .gt { color: #0040D0 } /* Generic.Traceback */ | |
+.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ | |
+.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ | |
+.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ | |
+.highlight .kp { color: #007020 } /* Keyword.Pseudo */ | |
+.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ | |
+.highlight .kt { color: #902000 } /* Keyword.Type */ | |
+.highlight .m { color: #208050 } /* Literal.Number */ | |
+.highlight .s { color: #4070a0 } /* Literal.String */ | |
+.highlight .na { color: #4070a0 } /* Name.Attribute */ | |
+.highlight .nb { color: #007020 } /* Name.Builtin */ | |
+.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ | |
+.highlight .no { color: #60add5 } /* Name.Constant */ | |
+.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ | |
+.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ | |
+.highlight .ne { color: #007020 } /* Name.Exception */ | |
+.highlight .nf { color: #06287e } /* Name.Function */ | |
+.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ | |
+.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ | |
+.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ | |
+.highlight .nv { color: #bb60d5 } /* Name.Variable */ | |
+.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ | |
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */ | |
+.highlight .mf { color: #208050 } /* Literal.Number.Float */ | |
+.highlight .mh { color: #208050 } /* Literal.Number.Hex */ | |
+.highlight .mi { color: #208050 } /* Literal.Number.Integer */ | |
+.highlight .mo { color: #208050 } /* Literal.Number.Oct */ | |
+.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ | |
+.highlight .sc { color: #4070a0 } /* Literal.String.Char */ | |
+.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ | |
+.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ | |
+.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape … | |
+.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ | |
+.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interp… | |
+.highlight .sx { color: #c65d09 } /* Literal.String.Other */ | |
+.highlight .sr { color: #235388 } /* Literal.String.Regex */ | |
+.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ | |
+.highlight .ss { color: #517918 } /* Literal.String.Symbol */ | |
+.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ | |
+.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ | |
+.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ | |
+.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ | |
+.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ | |
+\ No newline at end of file | |
diff --git a/doc/html/_static/searchtools.js b/doc/html/_static/searchtools.js | |
t@@ -0,0 +1,560 @@ | |
+/* | |
+ * searchtools.js_t | |
+ * ~~~~~~~~~~~~~~~~ | |
+ * | |
+ * Sphinx JavaScript utilties for the full-text search. | |
+ * | |
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. | |
+ * :license: BSD, see LICENSE for details. | |
+ * | |
+ */ | |
+ | |
+/** | |
+ * helper function to return a node containing the | |
+ * search summary for a given text. keywords is a list | |
+ * of stemmed words, hlwords is the list of normal, unstemmed | |
+ * words. the first one is used to find the occurance, the | |
+ * latter for highlighting it. | |
+ */ | |
+ | |
+jQuery.makeSearchSummary = function(text, keywords, hlwords) { | |
+ var textLower = text.toLowerCase(); | |
+ var start = 0; | |
+ $.each(keywords, function() { | |
+ var i = textLower.indexOf(this.toLowerCase()); | |
+ if (i > -1) | |
+ start = i; | |
+ }); | |
+ start = Math.max(start - 120, 0); | |
+ var excerpt = ((start > 0) ? '...' : '') + | |
+ $.trim(text.substr(start, 240)) + | |
+ ((start + 240 - text.length) ? '...' : ''); | |
+ var rv = $('<div class="context"></div>').text(excerpt); | |
+ $.each(hlwords, function() { | |
+ rv = rv.highlightText(this, 'highlighted'); | |
+ }); | |
+ return rv; | |
+} | |
+ | |
+ | |
+/** | |
+ * Porter Stemmer | |
+ */ | |
+var Stemmer = function() { | |
+ | |
+ var step2list = { | |
+ ational: 'ate', | |
+ tional: 'tion', | |
+ enci: 'ence', | |
+ anci: 'ance', | |
+ izer: 'ize', | |
+ bli: 'ble', | |
+ alli: 'al', | |
+ entli: 'ent', | |
+ eli: 'e', | |
+ ousli: 'ous', | |
+ ization: 'ize', | |
+ ation: 'ate', | |
+ ator: 'ate', | |
+ alism: 'al', | |
+ iveness: 'ive', | |
+ fulness: 'ful', | |
+ ousness: 'ous', | |
+ aliti: 'al', | |
+ iviti: 'ive', | |
+ biliti: 'ble', | |
+ logi: 'log' | |
+ }; | |
+ | |
+ var step3list = { | |
+ icate: 'ic', | |
+ ative: '', | |
+ alize: 'al', | |
+ iciti: 'ic', | |
+ ical: 'ic', | |
+ ful: '', | |
+ ness: '' | |
+ }; | |
+ | |
+ var c = "[^aeiou]"; // consonant | |
+ var v = "[aeiouy]"; // vowel | |
+ var C = c + "[^aeiouy]*"; // consonant sequence | |
+ var V = v + "[aeiou]*"; // vowel sequence | |
+ | |
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 | |
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 | |
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 | |
+ var s_v = "^(" + C + ")?" + v; // vowel in stem | |
+ | |
+ this.stemWord = function (w) { | |
+ var stem; | |
+ var suffix; | |
+ var firstch; | |
+ var origword = w; | |
+ | |
+ if (w.length < 3) | |
+ return w; | |
+ | |
+ var re; | |
+ var re2; | |
+ var re3; | |
+ var re4; | |
+ | |
+ firstch = w.substr(0,1); | |
+ if (firstch == "y") | |
+ w = firstch.toUpperCase() + w.substr(1); | |
+ | |
+ // Step 1a | |
+ re = /^(.+?)(ss|i)es$/; | |
+ re2 = /^(.+?)([^s])s$/; | |
+ | |
+ if (re.test(w)) | |
+ w = w.replace(re,"$1$2"); | |
+ else if (re2.test(w)) | |
+ w = w.replace(re2,"$1$2"); | |
+ | |
+ // Step 1b | |
+ re = /^(.+?)eed$/; | |
+ re2 = /^(.+?)(ed|ing)$/; | |
+ if (re.test(w)) { | |
+ var fp = re.exec(w); | |
+ re = new RegExp(mgr0); | |
+ if (re.test(fp[1])) { | |
+ re = /.$/; | |
+ w = w.replace(re,""); | |
+ } | |
+ } | |
+ else if (re2.test(w)) { | |
+ var fp = re2.exec(w); | |
+ stem = fp[1]; | |
+ re2 = new RegExp(s_v); | |
+ if (re2.test(stem)) { | |
+ w = stem; | |
+ re2 = /(at|bl|iz)$/; | |
+ re3 = new RegExp("([^aeiouylsz])\\1$"); | |
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); | |
+ if (re2.test(w)) | |
+ w = w + "e"; | |
+ else if (re3.test(w)) { | |
+ re = /.$/; | |
+ w = w.replace(re,""); | |
+ } | |
+ else if (re4.test(w)) | |
+ w = w + "e"; | |
+ } | |
+ } | |
+ | |
+ // Step 1c | |
+ re = /^(.+?)y$/; | |
+ if (re.test(w)) { | |
+ var fp = re.exec(w); | |
+ stem = fp[1]; | |
+ re = new RegExp(s_v); | |
+ if (re.test(stem)) | |
+ w = stem + "i"; | |
+ } | |
+ | |
+ // Step 2 | |
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|izatio… | |
+ if (re.test(w)) { | |
+ var fp = re.exec(w); | |
+ stem = fp[1]; | |
+ suffix = fp[2]; | |
+ re = new RegExp(mgr0); | |
+ if (re.test(stem)) | |
+ w = stem + step2list[suffix]; | |
+ } | |
+ | |
+ // Step 3 | |
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; | |
+ if (re.test(w)) { | |
+ var fp = re.exec(w); | |
+ stem = fp[1]; | |
+ suffix = fp[2]; | |
+ re = new RegExp(mgr0); | |
+ if (re.test(stem)) | |
+ w = stem + step3list[suffix]; | |
+ } | |
+ | |
+ // Step 4 | |
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|it… | |
+ re2 = /^(.+?)(s|t)(ion)$/; | |
+ if (re.test(w)) { | |
+ var fp = re.exec(w); | |
+ stem = fp[1]; | |
+ re = new RegExp(mgr1); | |
+ if (re.test(stem)) | |
+ w = stem; | |
+ } | |
+ else if (re2.test(w)) { | |
+ var fp = re2.exec(w); | |
+ stem = fp[1] + fp[2]; | |
+ re2 = new RegExp(mgr1); | |
+ if (re2.test(stem)) | |
+ w = stem; | |
+ } | |
+ | |
+ // Step 5 | |
+ re = /^(.+?)e$/; | |
+ if (re.test(w)) { | |
+ var fp = re.exec(w); | |
+ stem = fp[1]; | |
+ re = new RegExp(mgr1); | |
+ re2 = new RegExp(meq1); | |
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); | |
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) | |
+ w = stem; | |
+ } | |
+ re = /ll$/; | |
+ re2 = new RegExp(mgr1); | |
+ if (re.test(w) && re2.test(w)) { | |
+ re = /.$/; | |
+ w = w.replace(re,""); | |
+ } | |
+ | |
+ // and turn initial Y back to y | |
+ if (firstch == "y") | |
+ w = firstch.toLowerCase() + w.substr(1); | |
+ return w; | |
+ } | |
+} | |
+ | |
+ | |
+/** | |
+ * Search Module | |
+ */ | |
+var Search = { | |
+ | |
+ _index : null, | |
+ _queued_query : null, | |
+ _pulse_status : -1, | |
+ | |
+ init : function() { | |
+ var params = $.getQueryParameters(); | |
+ if (params.q) { | |
+ var query = params.q[0]; | |
+ $('input[name="q"]')[0].value = query; | |
+ this.performSearch(query); | |
+ } | |
+ }, | |
+ | |
+ loadIndex : function(url) { | |
+ $.ajax({type: "GET", url: url, data: null, success: null, | |
+ dataType: "script", cache: true}); | |
+ }, | |
+ | |
+ setIndex : function(index) { | |
+ var q; | |
+ this._index = index; | |
+ if ((q = this._queued_query) !== null) { | |
+ this._queued_query = null; | |
+ Search.query(q); | |
+ } | |
+ }, | |
+ | |
+ hasIndex : function() { | |
+ return this._index !== null; | |
+ }, | |
+ | |
+ deferQuery : function(query) { | |
+ this._queued_query = query; | |
+ }, | |
+ | |
+ stopPulse : function() { | |
+ this._pulse_status = 0; | |
+ }, | |
+ | |
+ startPulse : function() { | |
+ if (this._pulse_status >= 0) | |
+ return; | |
+ function pulse() { | |
+ Search._pulse_status = (Search._pulse_status + 1) % 4; | |
+ var dotString = ''; | |
+ for (var i = 0; i < Search._pulse_status; i++) | |
+ dotString += '.'; | |
+ Search.dots.text(dotString); | |
+ if (Search._pulse_status > -1) | |
+ window.setTimeout(pulse, 500); | |
+ }; | |
+ pulse(); | |
+ }, | |
+ | |
+ /** | |
+ * perform a search for something | |
+ */ | |
+ performSearch : function(query) { | |
+ // create the required interface elements | |
+ this.out = $('#search-results'); | |
+ this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out); | |
+ this.dots = $('<span></span>').appendTo(this.title); | |
+ this.status = $('<p style="display: none"></p>').appendTo(this.out); | |
+ this.output = $('<ul class="search"/>').appendTo(this.out); | |
+ | |
+ $('#search-progress').text(_('Preparing search...')); | |
+ this.startPulse(); | |
+ | |
+ // index already loaded, the browser was quick! | |
+ if (this.hasIndex()) | |
+ this.query(query); | |
+ else | |
+ this.deferQuery(query); | |
+ }, | |
+ | |
+ query : function(query) { | |
+ var stopwords = ["and","then","into","it","as","are","in","if","for","no",… | |
+ | |
+ // Stem the searchterms and add them to the correct list | |
+ var stemmer = new Stemmer(); | |
+ var searchterms = []; | |
+ var excluded = []; | |
+ var hlterms = []; | |
+ var tmp = query.split(/\s+/); | |
+ var objectterms = []; | |
+ for (var i = 0; i < tmp.length; i++) { | |
+ if (tmp[i] != "") { | |
+ objectterms.push(tmp[i].toLowerCase()); | |
+ } | |
+ | |
+ if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) || | |
+ tmp[i] == "") { | |
+ // skip this "word" | |
+ continue; | |
+ } | |
+ // stem the word | |
+ var word = stemmer.stemWord(tmp[i]).toLowerCase(); | |
+ // select the correct list | |
+ if (word[0] == '-') { | |
+ var toAppend = excluded; | |
+ word = word.substr(1); | |
+ } | |
+ else { | |
+ var toAppend = searchterms; | |
+ hlterms.push(tmp[i].toLowerCase()); | |
+ } | |
+ // only add if not already in the list | |
+ if (!$.contains(toAppend, word)) | |
+ toAppend.push(word); | |
+ }; | |
+ var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" ")); | |
+ | |
+ // console.debug('SEARCH: searching for:'); | |
+ // console.info('required: ', searchterms); | |
+ // console.info('excluded: ', excluded); | |
+ | |
+ // prepare search | |
+ var filenames = this._index.filenames; | |
+ var titles = this._index.titles; | |
+ var terms = this._index.terms; | |
+ var fileMap = {}; | |
+ var files = null; | |
+ // different result priorities | |
+ var importantResults = []; | |
+ var objectResults = []; | |
+ var regularResults = []; | |
+ var unimportantResults = []; | |
+ $('#search-progress').empty(); | |
+ | |
+ // lookup as object | |
+ for (var i = 0; i < objectterms.length; i++) { | |
+ var others = [].concat(objectterms.slice(0,i), | |
+ objectterms.slice(i+1, objectterms.length)) | |
+ var results = this.performObjectSearch(objectterms[i], others); | |
+ // Assume first word is most likely to be the object, | |
+ // other words more likely to be in description. | |
+ // Therefore put matches for earlier words first. | |
+ // (Results are eventually used in reverse order). | |
+ objectResults = results[0].concat(objectResults); | |
+ importantResults = results[1].concat(importantResults); | |
+ unimportantResults = results[2].concat(unimportantResults); | |
+ } | |
+ | |
+ // perform the search on the required terms | |
+ for (var i = 0; i < searchterms.length; i++) { | |
+ var word = searchterms[i]; | |
+ // no match but word was a required one | |
+ if ((files = terms[word]) == null) | |
+ break; | |
+ if (files.length == undefined) { | |
+ files = [files]; | |
+ } | |
+ // create the mapping | |
+ for (var j = 0; j < files.length; j++) { | |
+ var file = files[j]; | |
+ if (file in fileMap) | |
+ fileMap[file].push(word); | |
+ else | |
+ fileMap[file] = [word]; | |
+ } | |
+ } | |
+ | |
+ // now check if the files don't contain excluded terms | |
+ for (var file in fileMap) { | |
+ var valid = true; | |
+ | |
+ // check if all requirements are matched | |
+ if (fileMap[file].length != searchterms.length) | |
+ continue; | |
+ | |
+ // ensure that none of the excluded terms is in the | |
+ // search result. | |
+ for (var i = 0; i < excluded.length; i++) { | |
+ if (terms[excluded[i]] == file || | |
+ $.contains(terms[excluded[i]] || [], file)) { | |
+ valid = false; | |
+ break; | |
+ } | |
+ } | |
+ | |
+ // if we have still a valid result we can add it | |
+ // to the result list | |
+ if (valid) | |
+ regularResults.push([filenames[file], titles[file], '', null]); | |
+ } | |
+ | |
+ // delete unused variables in order to not waste | |
+ // memory until list is retrieved completely | |
+ delete filenames, titles, terms; | |
+ | |
+ // now sort the regular results descending by title | |
+ regularResults.sort(function(a, b) { | |
+ var left = a[1].toLowerCase(); | |
+ var right = b[1].toLowerCase(); | |
+ return (left > right) ? -1 : ((left < right) ? 1 : 0); | |
+ }); | |
+ | |
+ // combine all results | |
+ var results = unimportantResults.concat(regularResults) | |
+ .concat(objectResults).concat(importantResults); | |
+ | |
+ // print the results | |
+ var resultCount = results.length; | |
+ function displayNextItem() { | |
+ // results left, load the summary and display it | |
+ if (results.length) { | |
+ var item = results.pop(); | |
+ var listItem = $('<li style="display:none"></li>'); | |
+ if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') { | |
+ // dirhtml builder | |
+ var dirname = item[0] + '/'; | |
+ if (dirname.match(/\/index\/$/)) { | |
+ dirname = dirname.substring(0, dirname.length-6); | |
+ } else if (dirname == 'index/') { | |
+ dirname = ''; | |
+ } | |
+ listItem.append($('<a/>').attr('href', | |
+ DOCUMENTATION_OPTIONS.URL_ROOT + dirname + | |
+ highlightstring + item[2]).html(item[1])); | |
+ } else { | |
+ // normal html builders | |
+ listItem.append($('<a/>').attr('href', | |
+ item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX + | |
+ highlightstring + item[2]).html(item[1])); | |
+ } | |
+ if (item[3]) { | |
+ listItem.append($('<span> (' + item[3] + ')</span>')); | |
+ Search.output.append(listItem); | |
+ listItem.slideDown(5, function() { | |
+ displayNextItem(); | |
+ }); | |
+ } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { | |
+ $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + | |
+ item[0] + '.txt', function(data) { | |
+ if (data != '') { | |
+ listItem.append($.makeSearchSummary(data, searchterms, hlterms)); | |
+ Search.output.append(listItem); | |
+ } | |
+ listItem.slideDown(5, function() { | |
+ displayNextItem(); | |
+ }); | |
+ }, "text"); | |
+ } else { | |
+ // no source available, just display title | |
+ Search.output.append(listItem); | |
+ listItem.slideDown(5, function() { | |
+ displayNextItem(); | |
+ }); | |
+ } | |
+ } | |
+ // search finished, update title and status message | |
+ else { | |
+ Search.stopPulse(); | |
+ Search.title.text(_('Search Results')); | |
+ if (!resultCount) | |
+ Search.status.text(_('Your search did not match any documents. Pleas… | |
+ else | |
+ Search.status.text(_('Search finished, found %s page(s) matching t… | |
+ Search.status.fadeIn(500); | |
+ } | |
+ } | |
+ displayNextItem(); | |
+ }, | |
+ | |
+ performObjectSearch : function(object, otherterms) { | |
+ var filenames = this._index.filenames; | |
+ var objects = this._index.objects; | |
+ var objnames = this._index.objnames; | |
+ var titles = this._index.titles; | |
+ | |
+ var importantResults = []; | |
+ var objectResults = []; | |
+ var unimportantResults = []; | |
+ | |
+ for (var prefix in objects) { | |
+ for (var name in objects[prefix]) { | |
+ var fullname = (prefix ? prefix + '.' : '') + name; | |
+ if (fullname.toLowerCase().indexOf(object) > -1) { | |
+ var match = objects[prefix][name]; | |
+ var objname = objnames[match[1]][2]; | |
+ var title = titles[match[0]]; | |
+ // If more than one term searched for, we require other words to be | |
+ // found in the name/title/description | |
+ if (otherterms.length > 0) { | |
+ var haystack = (prefix + ' ' + name + ' ' + | |
+ objname + ' ' + title).toLowerCase(); | |
+ var allfound = true; | |
+ for (var i = 0; i < otherterms.length; i++) { | |
+ if (haystack.indexOf(otherterms[i]) == -1) { | |
+ allfound = false; | |
+ break; | |
+ } | |
+ } | |
+ if (!allfound) { | |
+ continue; | |
+ } | |
+ } | |
+ var descr = objname + _(', in ') + title; | |
+ anchor = match[3]; | |
+ if (anchor == '') | |
+ anchor = fullname; | |
+ else if (anchor == '-') | |
+ anchor = objnames[match[1]][1] + '-' + fullname; | |
+ result = [filenames[match[0]], fullname, '#'+anchor, descr]; | |
+ switch (match[2]) { | |
+ case 1: objectResults.push(result); break; | |
+ case 0: importantResults.push(result); break; | |
+ case 2: unimportantResults.push(result); break; | |
+ } | |
+ } | |
+ } | |
+ } | |
+ | |
+ // sort results descending | |
+ objectResults.sort(function(a, b) { | |
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); | |
+ }); | |
+ | |
+ importantResults.sort(function(a, b) { | |
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); | |
+ }); | |
+ | |
+ unimportantResults.sort(function(a, b) { | |
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); | |
+ }); | |
+ | |
+ return [importantResults, objectResults, unimportantResults] | |
+ } | |
+} | |
+ | |
+$(document).ready(function() { | |
+ Search.init(); | |
+}); | |
+\ No newline at end of file | |
diff --git a/doc/html/_static/sidebar.js b/doc/html/_static/sidebar.js | |
t@@ -0,0 +1,151 @@ | |
+/* | |
+ * sidebar.js | |
+ * ~~~~~~~~~~ | |
+ * | |
+ * This script makes the Sphinx sidebar collapsible. | |
+ * | |
+ * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds | |
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton | |
+ * used to collapse and expand the sidebar. | |
+ * | |
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden | |
+ * and the width of the sidebar and the margin-left of the document | |
+ * are decreased. When the sidebar is expanded the opposite happens. | |
+ * This script saves a per-browser/per-session cookie used to | |
+ * remember the position of the sidebar among the pages. | |
+ * Once the browser is closed the cookie is deleted and the position | |
+ * reset to the default (expanded). | |
+ * | |
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. | |
+ * :license: BSD, see LICENSE for details. | |
+ * | |
+ */ | |
+ | |
+$(function() { | |
+ // global elements used by the functions. | |
+ // the 'sidebarbutton' element is defined as global after its | |
+ // creation, in the add_sidebar_button function | |
+ var bodywrapper = $('.bodywrapper'); | |
+ var sidebar = $('.sphinxsidebar'); | |
+ var sidebarwrapper = $('.sphinxsidebarwrapper'); | |
+ | |
+ // for some reason, the document has no sidebar; do not run into errors | |
+ if (!sidebar.length) return; | |
+ | |
+ // original margin-left of the bodywrapper and width of the sidebar | |
+ // with the sidebar expanded | |
+ var bw_margin_expanded = bodywrapper.css('margin-left'); | |
+ var ssb_width_expanded = sidebar.width(); | |
+ | |
+ // margin-left of the bodywrapper and width of the sidebar | |
+ // with the sidebar collapsed | |
+ var bw_margin_collapsed = '.8em'; | |
+ var ssb_width_collapsed = '.8em'; | |
+ | |
+ // colors used by the current theme | |
+ var dark_color = $('.related').css('background-color'); | |
+ var light_color = $('.document').css('background-color'); | |
+ | |
+ function sidebar_is_collapsed() { | |
+ return sidebarwrapper.is(':not(:visible)'); | |
+ } | |
+ | |
+ function toggle_sidebar() { | |
+ if (sidebar_is_collapsed()) | |
+ expand_sidebar(); | |
+ else | |
+ collapse_sidebar(); | |
+ } | |
+ | |
+ function collapse_sidebar() { | |
+ sidebarwrapper.hide(); | |
+ sidebar.css('width', ssb_width_collapsed); | |
+ bodywrapper.css('margin-left', bw_margin_collapsed); | |
+ sidebarbutton.css({ | |
+ 'margin-left': '0', | |
+ 'height': bodywrapper.height() | |
+ }); | |
+ sidebarbutton.find('span').text('»'); | |
+ sidebarbutton.attr('title', _('Expand sidebar')); | |
+ document.cookie = 'sidebar=collapsed'; | |
+ } | |
+ | |
+ function expand_sidebar() { | |
+ bodywrapper.css('margin-left', bw_margin_expanded); | |
+ sidebar.css('width', ssb_width_expanded); | |
+ sidebarwrapper.show(); | |
+ sidebarbutton.css({ | |
+ 'margin-left': ssb_width_expanded-12, | |
+ 'height': bodywrapper.height() | |
+ }); | |
+ sidebarbutton.find('span').text('«'); | |
+ sidebarbutton.attr('title', _('Collapse sidebar')); | |
+ document.cookie = 'sidebar=expanded'; | |
+ } | |
+ | |
+ function add_sidebar_button() { | |
+ sidebarwrapper.css({ | |
+ 'float': 'left', | |
+ 'margin-right': '0', | |
+ 'width': ssb_width_expanded - 28 | |
+ }); | |
+ // create the button | |
+ sidebar.append( | |
+ '<div id="sidebarbutton"><span>«</span></div>' | |
+ ); | |
+ var sidebarbutton = $('#sidebarbutton'); | |
+ light_color = sidebarbutton.css('background-color'); | |
+ // find the height of the viewport to center the '<<' in the page | |
+ var viewport_height; | |
+ if (window.innerHeight) | |
+ viewport_height = window.innerHeight; | |
+ else | |
+ viewport_height = $(window).height(); | |
+ sidebarbutton.find('span').css({ | |
+ 'display': 'block', | |
+ 'margin-top': (viewport_height - sidebar.position().top - 20) / 2 | |
+ }); | |
+ | |
+ sidebarbutton.click(toggle_sidebar); | |
+ sidebarbutton.attr('title', _('Collapse sidebar')); | |
+ sidebarbutton.css({ | |
+ 'color': '#FFFFFF', | |
+ 'border-left': '1px solid ' + dark_color, | |
+ 'font-size': '1.2em', | |
+ 'cursor': 'pointer', | |
+ 'height': bodywrapper.height(), | |
+ 'padding-top': '1px', | |
+ 'margin-left': ssb_width_expanded - 12 | |
+ }); | |
+ | |
+ sidebarbutton.hover( | |
+ function () { | |
+ $(this).css('background-color', dark_color); | |
+ }, | |
+ function () { | |
+ $(this).css('background-color', light_color); | |
+ } | |
+ ); | |
+ } | |
+ | |
+ function set_position_from_cookie() { | |
+ if (!document.cookie) | |
+ return; | |
+ var items = document.cookie.split(';'); | |
+ for(var k=0; k<items.length; k++) { | |
+ var key_val = items[k].split('='); | |
+ var key = key_val[0]; | |
+ if (key == 'sidebar') { | |
+ var value = key_val[1]; | |
+ if ((value == 'collapsed') && (!sidebar_is_collapsed())) | |
+ collapse_sidebar(); | |
+ else if ((value == 'expanded') && (sidebar_is_collapsed())) | |
+ expand_sidebar(); | |
+ } | |
+ } | |
+ } | |
+ | |
+ add_sidebar_button(); | |
+ var sidebarbutton = $('#sidebarbutton'); | |
+ set_position_from_cookie(); | |
+}); | |
diff --git a/doc/html/_static/underscore.js b/doc/html/_static/underscore.js | |
t@@ -0,0 +1,807 @@ | |
+// Underscore.js 1.1.6 | |
+// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. | |
+// Underscore is freely distributable under the MIT license. | |
+// Portions of Underscore are inspired or borrowed from Prototype, | |
+// Oliver Steele's Functional, and John Resig's Micro-Templating. | |
+// For all details and documentation: | |
+// http://documentcloud.github.com/underscore | |
+ | |
+(function() { | |
+ | |
+ // Baseline setup | |
+ // -------------- | |
+ | |
+ // Establish the root object, `window` in the browser, or `global` on the se… | |
+ var root = this; | |
+ | |
+ // Save the previous value of the `_` variable. | |
+ var previousUnderscore = root._; | |
+ | |
+ // Establish the object that gets returned to break out of a loop iteration. | |
+ var breaker = {}; | |
+ | |
+ // Save bytes in the minified (but not gzipped) version: | |
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = F… | |
+ | |
+ // Create quick reference variables for speed access to core prototypes. | |
+ var slice = ArrayProto.slice, | |
+ unshift = ArrayProto.unshift, | |
+ toString = ObjProto.toString, | |
+ hasOwnProperty = ObjProto.hasOwnProperty; | |
+ | |
+ // All **ECMAScript 5** native function implementations that we hope to use | |
+ // are declared here. | |
+ var | |
+ nativeForEach = ArrayProto.forEach, | |
+ nativeMap = ArrayProto.map, | |
+ nativeReduce = ArrayProto.reduce, | |
+ nativeReduceRight = ArrayProto.reduceRight, | |
+ nativeFilter = ArrayProto.filter, | |
+ nativeEvery = ArrayProto.every, | |
+ nativeSome = ArrayProto.some, | |
+ nativeIndexOf = ArrayProto.indexOf, | |
+ nativeLastIndexOf = ArrayProto.lastIndexOf, | |
+ nativeIsArray = Array.isArray, | |
+ nativeKeys = Object.keys, | |
+ nativeBind = FuncProto.bind; | |
+ | |
+ // Create a safe reference to the Underscore object for use below. | |
+ var _ = function(obj) { return new wrapper(obj); }; | |
+ | |
+ // Export the Underscore object for **CommonJS**, with backwards-compatibili… | |
+ // for the old `require()` API. If we're not in CommonJS, add `_` to the | |
+ // global object. | |
+ if (typeof module !== 'undefined' && module.exports) { | |
+ module.exports = _; | |
+ _._ = _; | |
+ } else { | |
+ root._ = _; | |
+ } | |
+ | |
+ // Current version. | |
+ _.VERSION = '1.1.6'; | |
+ | |
+ // Collection Functions | |
+ // -------------------- | |
+ | |
+ // The cornerstone, an `each` implementation, aka `forEach`. | |
+ // Handles objects implementing `forEach`, arrays, and raw objects. | |
+ // Delegates to **ECMAScript 5**'s native `forEach` if available. | |
+ var each = _.each = _.forEach = function(obj, iterator, context) { | |
+ if (obj == null) return; | |
+ if (nativeForEach && obj.forEach === nativeForEach) { | |
+ obj.forEach(iterator, context); | |
+ } else if (_.isNumber(obj.length)) { | |
+ for (var i = 0, l = obj.length; i < l; i++) { | |
+ if (iterator.call(context, obj[i], i, obj) === breaker) return; | |
+ } | |
+ } else { | |
+ for (var key in obj) { | |
+ if (hasOwnProperty.call(obj, key)) { | |
+ if (iterator.call(context, obj[key], key, obj) === breaker) return; | |
+ } | |
+ } | |
+ } | |
+ }; | |
+ | |
+ // Return the results of applying the iterator to each element. | |
+ // Delegates to **ECMAScript 5**'s native `map` if available. | |
+ _.map = function(obj, iterator, context) { | |
+ var results = []; | |
+ if (obj == null) return results; | |
+ if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); | |
+ each(obj, function(value, index, list) { | |
+ results[results.length] = iterator.call(context, value, index, list); | |
+ }); | |
+ return results; | |
+ }; | |
+ | |
+ // **Reduce** builds up a single result from a list of values, aka `inject`, | |
+ // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. | |
+ _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { | |
+ var initial = memo !== void 0; | |
+ if (obj == null) obj = []; | |
+ if (nativeReduce && obj.reduce === nativeReduce) { | |
+ if (context) iterator = _.bind(iterator, context); | |
+ return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); | |
+ } | |
+ each(obj, function(value, index, list) { | |
+ if (!initial && index === 0) { | |
+ memo = value; | |
+ initial = true; | |
+ } else { | |
+ memo = iterator.call(context, memo, value, index, list); | |
+ } | |
+ }); | |
+ if (!initial) throw new TypeError("Reduce of empty array with no initial v… | |
+ return memo; | |
+ }; | |
+ | |
+ // The right-associative version of reduce, also known as `foldr`. | |
+ // Delegates to **ECMAScript 5**'s native `reduceRight` if available. | |
+ _.reduceRight = _.foldr = function(obj, iterator, memo, context) { | |
+ if (obj == null) obj = []; | |
+ if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { | |
+ if (context) iterator = _.bind(iterator, context); | |
+ return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRig… | |
+ } | |
+ var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse(); | |
+ return _.reduce(reversed, iterator, memo, context); | |
+ }; | |
+ | |
+ // Return the first value which passes a truth test. Aliased as `detect`. | |
+ _.find = _.detect = function(obj, iterator, context) { | |
+ var result; | |
+ any(obj, function(value, index, list) { | |
+ if (iterator.call(context, value, index, list)) { | |
+ result = value; | |
+ return true; | |
+ } | |
+ }); | |
+ return result; | |
+ }; | |
+ | |
+ // Return all the elements that pass a truth test. | |
+ // Delegates to **ECMAScript 5**'s native `filter` if available. | |
+ // Aliased as `select`. | |
+ _.filter = _.select = function(obj, iterator, context) { | |
+ var results = []; | |
+ if (obj == null) return results; | |
+ if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterato… | |
+ each(obj, function(value, index, list) { | |
+ if (iterator.call(context, value, index, list)) results[results.length] … | |
+ }); | |
+ return results; | |
+ }; | |
+ | |
+ // Return all the elements for which a truth test fails. | |
+ _.reject = function(obj, iterator, context) { | |
+ var results = []; | |
+ if (obj == null) return results; | |
+ each(obj, function(value, index, list) { | |
+ if (!iterator.call(context, value, index, list)) results[results.length]… | |
+ }); | |
+ return results; | |
+ }; | |
+ | |
+ // Determine whether all of the elements match a truth test. | |
+ // Delegates to **ECMAScript 5**'s native `every` if available. | |
+ // Aliased as `all`. | |
+ _.every = _.all = function(obj, iterator, context) { | |
+ var result = true; | |
+ if (obj == null) return result; | |
+ if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, c… | |
+ each(obj, function(value, index, list) { | |
+ if (!(result = result && iterator.call(context, value, index, list))) re… | |
+ }); | |
+ return result; | |
+ }; | |
+ | |
+ // Determine if at least one element in the object matches a truth test. | |
+ // Delegates to **ECMAScript 5**'s native `some` if available. | |
+ // Aliased as `any`. | |
+ var any = _.some = _.any = function(obj, iterator, context) { | |
+ iterator || (iterator = _.identity); | |
+ var result = false; | |
+ if (obj == null) return result; | |
+ if (nativeSome && obj.some === nativeSome) return obj.some(iterator, conte… | |
+ each(obj, function(value, index, list) { | |
+ if (result = iterator.call(context, value, index, list)) return breaker; | |
+ }); | |
+ return result; | |
+ }; | |
+ | |
+ // Determine if a given value is included in the array or object using `===`. | |
+ // Aliased as `contains`. | |
+ _.include = _.contains = function(obj, target) { | |
+ var found = false; | |
+ if (obj == null) return found; | |
+ if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(tar… | |
+ any(obj, function(value) { | |
+ if (found = value === target) return true; | |
+ }); | |
+ return found; | |
+ }; | |
+ | |
+ // Invoke a method (with arguments) on every item in a collection. | |
+ _.invoke = function(obj, method) { | |
+ var args = slice.call(arguments, 2); | |
+ return _.map(obj, function(value) { | |
+ return (method.call ? method || value : value[method]).apply(value, args… | |
+ }); | |
+ }; | |
+ | |
+ // Convenience version of a common use case of `map`: fetching a property. | |
+ _.pluck = function(obj, key) { | |
+ return _.map(obj, function(value){ return value[key]; }); | |
+ }; | |
+ | |
+ // Return the maximum element or (element-based computation). | |
+ _.max = function(obj, iterator, context) { | |
+ if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj); | |
+ var result = {computed : -Infinity}; | |
+ each(obj, function(value, index, list) { | |
+ var computed = iterator ? iterator.call(context, value, index, list) : v… | |
+ computed >= result.computed && (result = {value : value, computed : comp… | |
+ }); | |
+ return result.value; | |
+ }; | |
+ | |
+ // Return the minimum element (or element-based computation). | |
+ _.min = function(obj, iterator, context) { | |
+ if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj); | |
+ var result = {computed : Infinity}; | |
+ each(obj, function(value, index, list) { | |
+ var computed = iterator ? iterator.call(context, value, index, list) : v… | |
+ computed < result.computed && (result = {value : value, computed : compu… | |
+ }); | |
+ return result.value; | |
+ }; | |
+ | |
+ // Sort the object's values by a criterion produced by an iterator. | |
+ _.sortBy = function(obj, iterator, context) { | |
+ return _.pluck(_.map(obj, function(value, index, list) { | |
+ return { | |
+ value : value, | |
+ criteria : iterator.call(context, value, index, list) | |
+ }; | |
+ }).sort(function(left, right) { | |
+ var a = left.criteria, b = right.criteria; | |
+ return a < b ? -1 : a > b ? 1 : 0; | |
+ }), 'value'); | |
+ }; | |
+ | |
+ // Use a comparator function to figure out at what index an object should | |
+ // be inserted so as to maintain order. Uses binary search. | |
+ _.sortedIndex = function(array, obj, iterator) { | |
+ iterator || (iterator = _.identity); | |
+ var low = 0, high = array.length; | |
+ while (low < high) { | |
+ var mid = (low + high) >> 1; | |
+ iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid; | |
+ } | |
+ return low; | |
+ }; | |
+ | |
+ // Safely convert anything iterable into a real, live array. | |
+ _.toArray = function(iterable) { | |
+ if (!iterable) return []; | |
+ if (iterable.toArray) return iterable.toArray(); | |
+ if (_.isArray(iterable)) return iterable; | |
+ if (_.isArguments(iterable)) return slice.call(iterable); | |
+ return _.values(iterable); | |
+ }; | |
+ | |
+ // Return the number of elements in an object. | |
+ _.size = function(obj) { | |
+ return _.toArray(obj).length; | |
+ }; | |
+ | |
+ // Array Functions | |
+ // --------------- | |
+ | |
+ // Get the first element of an array. Passing **n** will return the first N | |
+ // values in the array. Aliased as `head`. The **guard** check allows it to … | |
+ // with `_.map`. | |
+ _.first = _.head = function(array, n, guard) { | |
+ return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; | |
+ }; | |
+ | |
+ // Returns everything but the first entry of the array. Aliased as `tail`. | |
+ // Especially useful on the arguments object. Passing an **index** will retu… | |
+ // the rest of the values in the array from that index onward. The **guard** | |
+ // check allows it to work with `_.map`. | |
+ _.rest = _.tail = function(array, index, guard) { | |
+ return slice.call(array, (index == null) || guard ? 1 : index); | |
+ }; | |
+ | |
+ // Get the last element of an array. | |
+ _.last = function(array) { | |
+ return array[array.length - 1]; | |
+ }; | |
+ | |
+ // Trim out all falsy values from an array. | |
+ _.compact = function(array) { | |
+ return _.filter(array, function(value){ return !!value; }); | |
+ }; | |
+ | |
+ // Return a completely flattened version of an array. | |
+ _.flatten = function(array) { | |
+ return _.reduce(array, function(memo, value) { | |
+ if (_.isArray(value)) return memo.concat(_.flatten(value)); | |
+ memo[memo.length] = value; | |
+ return memo; | |
+ }, []); | |
+ }; | |
+ | |
+ // Return a version of the array that does not contain the specified value(s… | |
+ _.without = function(array) { | |
+ var values = slice.call(arguments, 1); | |
+ return _.filter(array, function(value){ return !_.include(values, value); … | |
+ }; | |
+ | |
+ // Produce a duplicate-free version of the array. If the array has already | |
+ // been sorted, you have the option of using a faster algorithm. | |
+ // Aliased as `unique`. | |
+ _.uniq = _.unique = function(array, isSorted) { | |
+ return _.reduce(array, function(memo, el, i) { | |
+ if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo,… | |
+ return memo; | |
+ }, []); | |
+ }; | |
+ | |
+ // Produce an array that contains every item shared between all the | |
+ // passed-in arrays. | |
+ _.intersect = function(array) { | |
+ var rest = slice.call(arguments, 1); | |
+ return _.filter(_.uniq(array), function(item) { | |
+ return _.every(rest, function(other) { | |
+ return _.indexOf(other, item) >= 0; | |
+ }); | |
+ }); | |
+ }; | |
+ | |
+ // Zip together multiple lists into a single array -- elements that share | |
+ // an index go together. | |
+ _.zip = function() { | |
+ var args = slice.call(arguments); | |
+ var length = _.max(_.pluck(args, 'length')); | |
+ var results = new Array(length); | |
+ for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i); | |
+ return results; | |
+ }; | |
+ | |
+ // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE… | |
+ // we need this function. Return the position of the first occurrence of an | |
+ // item in an array, or -1 if the item is not included in the array. | |
+ // Delegates to **ECMAScript 5**'s native `indexOf` if available. | |
+ // If the array is large and already in sort order, pass `true` | |
+ // for **isSorted** to use binary search. | |
+ _.indexOf = function(array, item, isSorted) { | |
+ if (array == null) return -1; | |
+ var i, l; | |
+ if (isSorted) { | |
+ i = _.sortedIndex(array, item); | |
+ return array[i] === item ? i : -1; | |
+ } | |
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf… | |
+ for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i; | |
+ return -1; | |
+ }; | |
+ | |
+ | |
+ // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. | |
+ _.lastIndexOf = function(array, item) { | |
+ if (array == null) return -1; | |
+ if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return a… | |
+ var i = array.length; | |
+ while (i--) if (array[i] === item) return i; | |
+ return -1; | |
+ }; | |
+ | |
+ // Generate an integer Array containing an arithmetic progression. A port of | |
+ // the native Python `range()` function. See | |
+ // [the Python documentation](http://docs.python.org/library/functions.html#… | |
+ _.range = function(start, stop, step) { | |
+ if (arguments.length <= 1) { | |
+ stop = start || 0; | |
+ start = 0; | |
+ } | |
+ step = arguments[2] || 1; | |
+ | |
+ var len = Math.max(Math.ceil((stop - start) / step), 0); | |
+ var idx = 0; | |
+ var range = new Array(len); | |
+ | |
+ while(idx < len) { | |
+ range[idx++] = start; | |
+ start += step; | |
+ } | |
+ | |
+ return range; | |
+ }; | |
+ | |
+ // Function (ahem) Functions | |
+ // ------------------ | |
+ | |
+ // Create a function bound to a given object (assigning `this`, and argument… | |
+ // optionally). Binding with arguments is also known as `curry`. | |
+ // Delegates to **ECMAScript 5**'s native `Function.bind` if available. | |
+ // We check for `func.bind` first, to fail fast when `func` is undefined. | |
+ _.bind = function(func, obj) { | |
+ if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, … | |
+ var args = slice.call(arguments, 2); | |
+ return function() { | |
+ return func.apply(obj, args.concat(slice.call(arguments))); | |
+ }; | |
+ }; | |
+ | |
+ // Bind all of an object's methods to that object. Useful for ensuring that | |
+ // all callbacks defined on an object belong to it. | |
+ _.bindAll = function(obj) { | |
+ var funcs = slice.call(arguments, 1); | |
+ if (funcs.length == 0) funcs = _.functions(obj); | |
+ each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); | |
+ return obj; | |
+ }; | |
+ | |
+ // Memoize an expensive function by storing its results. | |
+ _.memoize = function(func, hasher) { | |
+ var memo = {}; | |
+ hasher || (hasher = _.identity); | |
+ return function() { | |
+ var key = hasher.apply(this, arguments); | |
+ return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.ap… | |
+ }; | |
+ }; | |
+ | |
+ // Delays a function for the given number of milliseconds, and then calls | |
+ // it with the arguments supplied. | |
+ _.delay = function(func, wait) { | |
+ var args = slice.call(arguments, 2); | |
+ return setTimeout(function(){ return func.apply(func, args); }, wait); | |
+ }; | |
+ | |
+ // Defers a function, scheduling it to run after the current call stack has | |
+ // cleared. | |
+ _.defer = function(func) { | |
+ return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); | |
+ }; | |
+ | |
+ // Internal function used to implement `_.throttle` and `_.debounce`. | |
+ var limit = function(func, wait, debounce) { | |
+ var timeout; | |
+ return function() { | |
+ var context = this, args = arguments; | |
+ var throttler = function() { | |
+ timeout = null; | |
+ func.apply(context, args); | |
+ }; | |
+ if (debounce) clearTimeout(timeout); | |
+ if (debounce || !timeout) timeout = setTimeout(throttler, wait); | |
+ }; | |
+ }; | |
+ | |
+ // Returns a function, that, when invoked, will only be triggered at most on… | |
+ // during a given window of time. | |
+ _.throttle = function(func, wait) { | |
+ return limit(func, wait, false); | |
+ }; | |
+ | |
+ // Returns a function, that, as long as it continues to be invoked, will not | |
+ // be triggered. The function will be called after it stops being called for | |
+ // N milliseconds. | |
+ _.debounce = function(func, wait) { | |
+ return limit(func, wait, true); | |
+ }; | |
+ | |
+ // Returns a function that will be executed at most one time, no matter how | |
+ // often you call it. Useful for lazy initialization. | |
+ _.once = function(func) { | |
+ var ran = false, memo; | |
+ return function() { | |
+ if (ran) return memo; | |
+ ran = true; | |
+ return memo = func.apply(this, arguments); | |
+ }; | |
+ }; | |
+ | |
+ // Returns the first function passed as an argument to the second, | |
+ // allowing you to adjust arguments, run code before and after, and | |
+ // conditionally execute the original function. | |
+ _.wrap = function(func, wrapper) { | |
+ return function() { | |
+ var args = [func].concat(slice.call(arguments)); | |
+ return wrapper.apply(this, args); | |
+ }; | |
+ }; | |
+ | |
+ // Returns a function that is the composition of a list of functions, each | |
+ // consuming the return value of the function that follows. | |
+ _.compose = function() { | |
+ var funcs = slice.call(arguments); | |
+ return function() { | |
+ var args = slice.call(arguments); | |
+ for (var i=funcs.length-1; i >= 0; i--) { | |
+ args = [funcs[i].apply(this, args)]; | |
+ } | |
+ return args[0]; | |
+ }; | |
+ }; | |
+ | |
+ // Returns a function that will only be executed after being called N times. | |
+ _.after = function(times, func) { | |
+ return function() { | |
+ if (--times < 1) { return func.apply(this, arguments); } | |
+ }; | |
+ }; | |
+ | |
+ | |
+ // Object Functions | |
+ // ---------------- | |
+ | |
+ // Retrieve the names of an object's properties. | |
+ // Delegates to **ECMAScript 5**'s native `Object.keys` | |
+ _.keys = nativeKeys || function(obj) { | |
+ if (obj !== Object(obj)) throw new TypeError('Invalid object'); | |
+ var keys = []; | |
+ for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] … | |
+ return keys; | |
+ }; | |
+ | |
+ // Retrieve the values of an object's properties. | |
+ _.values = function(obj) { | |
+ return _.map(obj, _.identity); | |
+ }; | |
+ | |
+ // Return a sorted list of the function names available on the object. | |
+ // Aliased as `methods` | |
+ _.functions = _.methods = function(obj) { | |
+ return _.filter(_.keys(obj), function(key){ return _.isFunction(obj[key]);… | |
+ }; | |
+ | |
+ // Extend a given object with all the properties in passed-in object(s). | |
+ _.extend = function(obj) { | |
+ each(slice.call(arguments, 1), function(source) { | |
+ for (var prop in source) { | |
+ if (source[prop] !== void 0) obj[prop] = source[prop]; | |
+ } | |
+ }); | |
+ return obj; | |
+ }; | |
+ | |
+ // Fill in a given object with default properties. | |
+ _.defaults = function(obj) { | |
+ each(slice.call(arguments, 1), function(source) { | |
+ for (var prop in source) { | |
+ if (obj[prop] == null) obj[prop] = source[prop]; | |
+ } | |
+ }); | |
+ return obj; | |
+ }; | |
+ | |
+ // Create a (shallow-cloned) duplicate of an object. | |
+ _.clone = function(obj) { | |
+ return _.isArray(obj) ? obj.slice() : _.extend({}, obj); | |
+ }; | |
+ | |
+ // Invokes interceptor with the obj, and then returns obj. | |
+ // The primary purpose of this method is to "tap into" a method chain, in | |
+ // order to perform operations on intermediate results within the chain. | |
+ _.tap = function(obj, interceptor) { | |
+ interceptor(obj); | |
+ return obj; | |
+ }; | |
+ | |
+ // Perform a deep comparison to check if two objects are equal. | |
+ _.isEqual = function(a, b) { | |
+ // Check object identity. | |
+ if (a === b) return true; | |
+ // Different types? | |
+ var atype = typeof(a), btype = typeof(b); | |
+ if (atype != btype) return false; | |
+ // Basic equality test (watch out for coercions). | |
+ if (a == b) return true; | |
+ // One is falsy and the other truthy. | |
+ if ((!a && b) || (a && !b)) return false; | |
+ // Unwrap any wrapped objects. | |
+ if (a._chain) a = a._wrapped; | |
+ if (b._chain) b = b._wrapped; | |
+ // One of them implements an isEqual()? | |
+ if (a.isEqual) return a.isEqual(b); | |
+ // Check dates' integer values. | |
+ if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime(); | |
+ // Both are NaN? | |
+ if (_.isNaN(a) && _.isNaN(b)) return false; | |
+ // Compare regular expressions. | |
+ if (_.isRegExp(a) && _.isRegExp(b)) | |
+ return a.source === b.source && | |
+ a.global === b.global && | |
+ a.ignoreCase === b.ignoreCase && | |
+ a.multiline === b.multiline; | |
+ // If a is not an object by this point, we can't handle it. | |
+ if (atype !== 'object') return false; | |
+ // Check for different array lengths before comparing contents. | |
+ if (a.length && (a.length !== b.length)) return false; | |
+ // Nothing else worked, deep compare the contents. | |
+ var aKeys = _.keys(a), bKeys = _.keys(b); | |
+ // Different object sizes? | |
+ if (aKeys.length != bKeys.length) return false; | |
+ // Recursive comparison of contents. | |
+ for (var key in a) if (!(key in b) || !_.isEqual(a[key], b[key])) return f… | |
+ return true; | |
+ }; | |
+ | |
+ // Is a given array or object empty? | |
+ _.isEmpty = function(obj) { | |
+ if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; | |
+ for (var key in obj) if (hasOwnProperty.call(obj, key)) return false; | |
+ return true; | |
+ }; | |
+ | |
+ // Is a given value a DOM element? | |
+ _.isElement = function(obj) { | |
+ return !!(obj && obj.nodeType == 1); | |
+ }; | |
+ | |
+ // Is a given value an array? | |
+ // Delegates to ECMA5's native Array.isArray | |
+ _.isArray = nativeIsArray || function(obj) { | |
+ return toString.call(obj) === '[object Array]'; | |
+ }; | |
+ | |
+ // Is a given variable an arguments object? | |
+ _.isArguments = function(obj) { | |
+ return !!(obj && hasOwnProperty.call(obj, 'callee')); | |
+ }; | |
+ | |
+ // Is a given value a function? | |
+ _.isFunction = function(obj) { | |
+ return !!(obj && obj.constructor && obj.call && obj.apply); | |
+ }; | |
+ | |
+ // Is a given value a string? | |
+ _.isString = function(obj) { | |
+ return !!(obj === '' || (obj && obj.charCodeAt && obj.substr)); | |
+ }; | |
+ | |
+ // Is a given value a number? | |
+ _.isNumber = function(obj) { | |
+ return !!(obj === 0 || (obj && obj.toExponential && obj.toFixed)); | |
+ }; | |
+ | |
+ // Is the given value `NaN`? `NaN` happens to be the only value in JavaScript | |
+ // that does not equal itself. | |
+ _.isNaN = function(obj) { | |
+ return obj !== obj; | |
+ }; | |
+ | |
+ // Is a given value a boolean? | |
+ _.isBoolean = function(obj) { | |
+ return obj === true || obj === false; | |
+ }; | |
+ | |
+ // Is a given value a date? | |
+ _.isDate = function(obj) { | |
+ return !!(obj && obj.getTimezoneOffset && obj.setUTCFullYear); | |
+ }; | |
+ | |
+ // Is the given value a regular expression? | |
+ _.isRegExp = function(obj) { | |
+ return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase… | |
+ }; | |
+ | |
+ // Is a given value equal to null? | |
+ _.isNull = function(obj) { | |
+ return obj === null; | |
+ }; | |
+ | |
+ // Is a given variable undefined? | |
+ _.isUndefined = function(obj) { | |
+ return obj === void 0; | |
+ }; | |
+ | |
+ // Utility Functions | |
+ // ----------------- | |
+ | |
+ // Run Underscore.js in *noConflict* mode, returning the `_` variable to its | |
+ // previous owner. Returns a reference to the Underscore object. | |
+ _.noConflict = function() { | |
+ root._ = previousUnderscore; | |
+ return this; | |
+ }; | |
+ | |
+ // Keep the identity function around for default iterators. | |
+ _.identity = function(value) { | |
+ return value; | |
+ }; | |
+ | |
+ // Run a function **n** times. | |
+ _.times = function (n, iterator, context) { | |
+ for (var i = 0; i < n; i++) iterator.call(context, i); | |
+ }; | |
+ | |
+ // Add your own custom functions to the Underscore object, ensuring that | |
+ // they're correctly added to the OOP wrapper as well. | |
+ _.mixin = function(obj) { | |
+ each(_.functions(obj), function(name){ | |
+ addToWrapper(name, _[name] = obj[name]); | |
+ }); | |
+ }; | |
+ | |
+ // Generate a unique integer id (unique within the entire client session). | |
+ // Useful for temporary DOM ids. | |
+ var idCounter = 0; | |
+ _.uniqueId = function(prefix) { | |
+ var id = idCounter++; | |
+ return prefix ? prefix + id : id; | |
+ }; | |
+ | |
+ // By default, Underscore uses ERB-style template delimiters, change the | |
+ // following template settings to use alternative delimiters. | |
+ _.templateSettings = { | |
+ evaluate : /<%([\s\S]+?)%>/g, | |
+ interpolate : /<%=([\s\S]+?)%>/g | |
+ }; | |
+ | |
+ // JavaScript micro-templating, similar to John Resig's implementation. | |
+ // Underscore templating handles arbitrary delimiters, preserves whitespace, | |
+ // and correctly escapes quotes within interpolated code. | |
+ _.template = function(str, data) { | |
+ var c = _.templateSettings; | |
+ var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + | |
+ 'with(obj||{}){__p.push(\'' + | |
+ str.replace(/\\/g, '\\\\') | |
+ .replace(/'/g, "\\'") | |
+ .replace(c.interpolate, function(match, code) { | |
+ return "'," + code.replace(/\\'/g, "'") + ",'"; | |
+ }) | |
+ .replace(c.evaluate || null, function(match, code) { | |
+ return "');" + code.replace(/\\'/g, "'") | |
+ .replace(/[\r\n\t]/g, ' ') + "__p.push('"; | |
+ }) | |
+ .replace(/\r/g, '\\r') | |
+ .replace(/\n/g, '\\n') | |
+ .replace(/\t/g, '\\t') | |
+ + "');}return __p.join('');"; | |
+ var func = new Function('obj', tmpl); | |
+ return data ? func(data) : func; | |
+ }; | |
+ | |
+ // The OOP Wrapper | |
+ // --------------- | |
+ | |
+ // If Underscore is called as a function, it returns a wrapped object that | |
+ // can be used OO-style. This wrapper holds altered versions of all the | |
+ // underscore functions. Wrapped objects may be chained. | |
+ var wrapper = function(obj) { this._wrapped = obj; }; | |
+ | |
+ // Expose `wrapper.prototype` as `_.prototype` | |
+ _.prototype = wrapper.prototype; | |
+ | |
+ // Helper function to continue chaining intermediate results. | |
+ var result = function(obj, chain) { | |
+ return chain ? _(obj).chain() : obj; | |
+ }; | |
+ | |
+ // A method to easily add functions to the OOP wrapper. | |
+ var addToWrapper = function(name, func) { | |
+ wrapper.prototype[name] = function() { | |
+ var args = slice.call(arguments); | |
+ unshift.call(args, this._wrapped); | |
+ return result(func.apply(_, args), this._chain); | |
+ }; | |
+ }; | |
+ | |
+ // Add all of the Underscore functions to the wrapper object. | |
+ _.mixin(_); | |
+ | |
+ // Add all mutator Array functions to the wrapper. | |
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], funct… | |
+ var method = ArrayProto[name]; | |
+ wrapper.prototype[name] = function() { | |
+ method.apply(this._wrapped, arguments); | |
+ return result(this._wrapped, this._chain); | |
+ }; | |
+ }); | |
+ | |
+ // Add all accessor Array functions to the wrapper. | |
+ each(['concat', 'join', 'slice'], function(name) { | |
+ var method = ArrayProto[name]; | |
+ wrapper.prototype[name] = function() { | |
+ return result(method.apply(this._wrapped, arguments), this._chain); | |
+ }; | |
+ }); | |
+ | |
+ // Start chaining a wrapped Underscore object. | |
+ wrapper.prototype.chain = function() { | |
+ this._chain = true; | |
+ return this; | |
+ }; | |
+ | |
+ // Extracts the result from a wrapped and chained object. | |
+ wrapper.prototype.value = function() { | |
+ return this._wrapped; | |
+ }; | |
+ | |
+})(); | |
diff --git a/doc/html/_static/up-pressed.png b/doc/html/_static/up-pressed.png | |
Binary files differ. | |
diff --git a/doc/html/_static/up.png b/doc/html/_static/up.png | |
Binary files differ. | |
diff --git a/doc/html/_static/websupport.js b/doc/html/_static/websupport.js | |
t@@ -0,0 +1,808 @@ | |
+/* | |
+ * websupport.js | |
+ * ~~~~~~~~~~~~~ | |
+ * | |
+ * sphinx.websupport utilties for all documentation. | |
+ * | |
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. | |
+ * :license: BSD, see LICENSE for details. | |
+ * | |
+ */ | |
+ | |
+(function($) { | |
+ $.fn.autogrow = function() { | |
+ return this.each(function() { | |
+ var textarea = this; | |
+ | |
+ $.fn.autogrow.resize(textarea); | |
+ | |
+ $(textarea) | |
+ .focus(function() { | |
+ textarea.interval = setInterval(function() { | |
+ $.fn.autogrow.resize(textarea); | |
+ }, 500); | |
+ }) | |
+ .blur(function() { | |
+ clearInterval(textarea.interval); | |
+ }); | |
+ }); | |
+ }; | |
+ | |
+ $.fn.autogrow.resize = function(textarea) { | |
+ var lineHeight = parseInt($(textarea).css('line-height'), 10); | |
+ var lines = textarea.value.split('\n'); | |
+ var columns = textarea.cols; | |
+ var lineCount = 0; | |
+ $.each(lines, function() { | |
+ lineCount += Math.ceil(this.length / columns) || 1; | |
+ }); | |
+ var height = lineHeight * (lineCount + 1); | |
+ $(textarea).css('height', height); | |
+ }; | |
+})(jQuery); | |
+ | |
+(function($) { | |
+ var comp, by; | |
+ | |
+ function init() { | |
+ initEvents(); | |
+ initComparator(); | |
+ } | |
+ | |
+ function initEvents() { | |
+ $('a.comment-close').live("click", function(event) { | |
+ event.preventDefault(); | |
+ hide($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.vote').live("click", function(event) { | |
+ event.preventDefault(); | |
+ handleVote($(this)); | |
+ }); | |
+ $('a.reply').live("click", function(event) { | |
+ event.preventDefault(); | |
+ openReply($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.close-reply').live("click", function(event) { | |
+ event.preventDefault(); | |
+ closeReply($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.sort-option').live("click", function(event) { | |
+ event.preventDefault(); | |
+ handleReSort($(this)); | |
+ }); | |
+ $('a.show-proposal').live("click", function(event) { | |
+ event.preventDefault(); | |
+ showProposal($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.hide-proposal').live("click", function(event) { | |
+ event.preventDefault(); | |
+ hideProposal($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.show-propose-change').live("click", function(event) { | |
+ event.preventDefault(); | |
+ showProposeChange($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.hide-propose-change').live("click", function(event) { | |
+ event.preventDefault(); | |
+ hideProposeChange($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.accept-comment').live("click", function(event) { | |
+ event.preventDefault(); | |
+ acceptComment($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.delete-comment').live("click", function(event) { | |
+ event.preventDefault(); | |
+ deleteComment($(this).attr('id').substring(2)); | |
+ }); | |
+ $('a.comment-markup').live("click", function(event) { | |
+ event.preventDefault(); | |
+ toggleCommentMarkupBox($(this).attr('id').substring(2)); | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Set comp, which is a comparator function used for sorting and | |
+ * inserting comments into the list. | |
+ */ | |
+ function setComparator() { | |
+ // If the first three letters are "asc", sort in ascending order | |
+ // and remove the prefix. | |
+ if (by.substring(0,3) == 'asc') { | |
+ var i = by.substring(3); | |
+ comp = function(a, b) { return a[i] - b[i]; }; | |
+ } else { | |
+ // Otherwise sort in descending order. | |
+ comp = function(a, b) { return b[by] - a[by]; }; | |
+ } | |
+ | |
+ // Reset link styles and format the selected sort option. | |
+ $('a.sel').attr('href', '#').removeClass('sel'); | |
+ $('a.by' + by).removeAttr('href').addClass('sel'); | |
+ } | |
+ | |
+ /** | |
+ * Create a comp function. If the user has preferences stored in | |
+ * the sortBy cookie, use those, otherwise use the default. | |
+ */ | |
+ function initComparator() { | |
+ by = 'rating'; // Default to sort by rating. | |
+ // If the sortBy cookie is set, use that instead. | |
+ if (document.cookie.length > 0) { | |
+ var start = document.cookie.indexOf('sortBy='); | |
+ if (start != -1) { | |
+ start = start + 7; | |
+ var end = document.cookie.indexOf(";", start); | |
+ if (end == -1) { | |
+ end = document.cookie.length; | |
+ by = unescape(document.cookie.substring(start, end)); | |
+ } | |
+ } | |
+ } | |
+ setComparator(); | |
+ } | |
+ | |
+ /** | |
+ * Show a comment div. | |
+ */ | |
+ function show(id) { | |
+ $('#ao' + id).hide(); | |
+ $('#ah' + id).show(); | |
+ var context = $.extend({id: id}, opts); | |
+ var popup = $(renderTemplate(popupTemplate, context)).hide(); | |
+ popup.find('textarea[name="proposal"]').hide(); | |
+ popup.find('a.by' + by).addClass('sel'); | |
+ var form = popup.find('#cf' + id); | |
+ form.submit(function(event) { | |
+ event.preventDefault(); | |
+ addComment(form); | |
+ }); | |
+ $('#s' + id).after(popup); | |
+ popup.slideDown('fast', function() { | |
+ getComments(id); | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Hide a comment div. | |
+ */ | |
+ function hide(id) { | |
+ $('#ah' + id).hide(); | |
+ $('#ao' + id).show(); | |
+ var div = $('#sc' + id); | |
+ div.slideUp('fast', function() { | |
+ div.remove(); | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Perform an ajax request to get comments for a node | |
+ * and insert the comments into the comments tree. | |
+ */ | |
+ function getComments(id) { | |
+ $.ajax({ | |
+ type: 'GET', | |
+ url: opts.getCommentsURL, | |
+ data: {node: id}, | |
+ success: function(data, textStatus, request) { | |
+ var ul = $('#cl' + id); | |
+ var speed = 100; | |
+ $('#cf' + id) | |
+ .find('textarea[name="proposal"]') | |
+ .data('source', data.source); | |
+ | |
+ if (data.comments.length === 0) { | |
+ ul.html('<li>No comments yet.</li>'); | |
+ ul.data('empty', true); | |
+ } else { | |
+ // If there are comments, sort them and put them in the list. | |
+ var comments = sortComments(data.comments); | |
+ speed = data.comments.length * 100; | |
+ appendComments(comments, ul); | |
+ ul.data('empty', false); | |
+ } | |
+ $('#cn' + id).slideUp(speed + 200); | |
+ ul.slideDown(speed); | |
+ }, | |
+ error: function(request, textStatus, error) { | |
+ showError('Oops, there was a problem retrieving the comments.'); | |
+ }, | |
+ dataType: 'json' | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Add a comment via ajax and insert the comment into the comment tree. | |
+ */ | |
+ function addComment(form) { | |
+ var node_id = form.find('input[name="node"]').val(); | |
+ var parent_id = form.find('input[name="parent"]').val(); | |
+ var text = form.find('textarea[name="comment"]').val(); | |
+ var proposal = form.find('textarea[name="proposal"]').val(); | |
+ | |
+ if (text == '') { | |
+ showError('Please enter a comment.'); | |
+ return; | |
+ } | |
+ | |
+ // Disable the form that is being submitted. | |
+ form.find('textarea,input').attr('disabled', 'disabled'); | |
+ | |
+ // Send the comment to the server. | |
+ $.ajax({ | |
+ type: "POST", | |
+ url: opts.addCommentURL, | |
+ dataType: 'json', | |
+ data: { | |
+ node: node_id, | |
+ parent: parent_id, | |
+ text: text, | |
+ proposal: proposal | |
+ }, | |
+ success: function(data, textStatus, error) { | |
+ // Reset the form. | |
+ if (node_id) { | |
+ hideProposeChange(node_id); | |
+ } | |
+ form.find('textarea') | |
+ .val('') | |
+ .add(form.find('input')) | |
+ .removeAttr('disabled'); | |
+ var ul = $('#cl' + (node_id || parent_id)); | |
+ if (ul.data('empty')) { | |
+ $(ul).empty(); | |
+ ul.data('empty', false); | |
+ } | |
+ insertComment(data.comment); | |
+ var ao = $('#ao' + node_id); | |
+ ao.find('img').attr({'src': opts.commentBrightImage}); | |
+ if (node_id) { | |
+ // if this was a "root" comment, remove the commenting box | |
+ // (the user can get it back by reopening the comment popup) | |
+ $('#ca' + node_id).slideUp(); | |
+ } | |
+ }, | |
+ error: function(request, textStatus, error) { | |
+ form.find('textarea,input').removeAttr('disabled'); | |
+ showError('Oops, there was a problem adding the comment.'); | |
+ } | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Recursively append comments to the main comment list and children | |
+ * lists, creating the comment tree. | |
+ */ | |
+ function appendComments(comments, ul) { | |
+ $.each(comments, function() { | |
+ var div = createCommentDiv(this); | |
+ ul.append($(document.createElement('li')).html(div)); | |
+ appendComments(this.children, div.find('ul.comment-children')); | |
+ // To avoid stagnating data, don't store the comments children in data. | |
+ this.children = null; | |
+ div.data('comment', this); | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * After adding a new comment, it must be inserted in the correct | |
+ * location in the comment tree. | |
+ */ | |
+ function insertComment(comment) { | |
+ var div = createCommentDiv(comment); | |
+ | |
+ // To avoid stagnating data, don't store the comments children in data. | |
+ comment.children = null; | |
+ div.data('comment', comment); | |
+ | |
+ var ul = $('#cl' + (comment.node || comment.parent)); | |
+ var siblings = getChildren(ul); | |
+ | |
+ var li = $(document.createElement('li')); | |
+ li.hide(); | |
+ | |
+ // Determine where in the parents children list to insert this comment. | |
+ for(i=0; i < siblings.length; i++) { | |
+ if (comp(comment, siblings[i]) <= 0) { | |
+ $('#cd' + siblings[i].id) | |
+ .parent() | |
+ .before(li.html(div)); | |
+ li.slideDown('fast'); | |
+ return; | |
+ } | |
+ } | |
+ | |
+ // If we get here, this comment rates lower than all the others, | |
+ // or it is the only comment in the list. | |
+ ul.append(li.html(div)); | |
+ li.slideDown('fast'); | |
+ } | |
+ | |
+ function acceptComment(id) { | |
+ $.ajax({ | |
+ type: 'POST', | |
+ url: opts.acceptCommentURL, | |
+ data: {id: id}, | |
+ success: function(data, textStatus, request) { | |
+ $('#cm' + id).fadeOut('fast'); | |
+ $('#cd' + id).removeClass('moderate'); | |
+ }, | |
+ error: function(request, textStatus, error) { | |
+ showError('Oops, there was a problem accepting the comment.'); | |
+ } | |
+ }); | |
+ } | |
+ | |
+ function deleteComment(id) { | |
+ $.ajax({ | |
+ type: 'POST', | |
+ url: opts.deleteCommentURL, | |
+ data: {id: id}, | |
+ success: function(data, textStatus, request) { | |
+ var div = $('#cd' + id); | |
+ if (data == 'delete') { | |
+ // Moderator mode: remove the comment and all children immediately | |
+ div.slideUp('fast', function() { | |
+ div.remove(); | |
+ }); | |
+ return; | |
+ } | |
+ // User mode: only mark the comment as deleted | |
+ div | |
+ .find('span.user-id:first') | |
+ .text('[deleted]').end() | |
+ .find('div.comment-text:first') | |
+ .text('[deleted]').end() | |
+ .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + | |
+ ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) | |
+ .remove(); | |
+ var comment = div.data('comment'); | |
+ comment.username = '[deleted]'; | |
+ comment.text = '[deleted]'; | |
+ div.data('comment', comment); | |
+ }, | |
+ error: function(request, textStatus, error) { | |
+ showError('Oops, there was a problem deleting the comment.'); | |
+ } | |
+ }); | |
+ } | |
+ | |
+ function showProposal(id) { | |
+ $('#sp' + id).hide(); | |
+ $('#hp' + id).show(); | |
+ $('#pr' + id).slideDown('fast'); | |
+ } | |
+ | |
+ function hideProposal(id) { | |
+ $('#hp' + id).hide(); | |
+ $('#sp' + id).show(); | |
+ $('#pr' + id).slideUp('fast'); | |
+ } | |
+ | |
+ function showProposeChange(id) { | |
+ $('#pc' + id).hide(); | |
+ $('#hc' + id).show(); | |
+ var textarea = $('#pt' + id); | |
+ textarea.val(textarea.data('source')); | |
+ $.fn.autogrow.resize(textarea[0]); | |
+ textarea.slideDown('fast'); | |
+ } | |
+ | |
+ function hideProposeChange(id) { | |
+ $('#hc' + id).hide(); | |
+ $('#pc' + id).show(); | |
+ var textarea = $('#pt' + id); | |
+ textarea.val('').removeAttr('disabled'); | |
+ textarea.slideUp('fast'); | |
+ } | |
+ | |
+ function toggleCommentMarkupBox(id) { | |
+ $('#mb' + id).toggle(); | |
+ } | |
+ | |
+ /** Handle when the user clicks on a sort by link. */ | |
+ function handleReSort(link) { | |
+ var classes = link.attr('class').split(/\s+/); | |
+ for (var i=0; i<classes.length; i++) { | |
+ if (classes[i] != 'sort-option') { | |
+ by = classes[i].substring(2); | |
+ } | |
+ } | |
+ setComparator(); | |
+ // Save/update the sortBy cookie. | |
+ var expiration = new Date(); | |
+ expiration.setDate(expiration.getDate() + 365); | |
+ document.cookie= 'sortBy=' + escape(by) + | |
+ ';expires=' + expiration.toUTCString(); | |
+ $('ul.comment-ul').each(function(index, ul) { | |
+ var comments = getChildren($(ul), true); | |
+ comments = sortComments(comments); | |
+ appendComments(comments, $(ul).empty()); | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Function to process a vote when a user clicks an arrow. | |
+ */ | |
+ function handleVote(link) { | |
+ if (!opts.voting) { | |
+ showError("You'll need to login to vote."); | |
+ return; | |
+ } | |
+ | |
+ var id = link.attr('id'); | |
+ if (!id) { | |
+ // Didn't click on one of the voting arrows. | |
+ return; | |
+ } | |
+ // If it is an unvote, the new vote value is 0, | |
+ // Otherwise it's 1 for an upvote, or -1 for a downvote. | |
+ var value = 0; | |
+ if (id.charAt(1) != 'u') { | |
+ value = id.charAt(0) == 'u' ? 1 : -1; | |
+ } | |
+ // The data to be sent to the server. | |
+ var d = { | |
+ comment_id: id.substring(2), | |
+ value: value | |
+ }; | |
+ | |
+ // Swap the vote and unvote links. | |
+ link.hide(); | |
+ $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id) | |
+ .show(); | |
+ | |
+ // The div the comment is displayed in. | |
+ var div = $('div#cd' + d.comment_id); | |
+ var data = div.data('comment'); | |
+ | |
+ // If this is not an unvote, and the other vote arrow has | |
+ // already been pressed, unpress it. | |
+ if ((d.value !== 0) && (data.vote === d.value * -1)) { | |
+ $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide(); | |
+ $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show(); | |
+ } | |
+ | |
+ // Update the comments rating in the local data. | |
+ data.rating += (data.vote === 0) ? d.value : (d.value - data.vote); | |
+ data.vote = d.value; | |
+ div.data('comment', data); | |
+ | |
+ // Change the rating text. | |
+ div.find('.rating:first') | |
+ .text(data.rating + ' point' + (data.rating == 1 ? '' : 's')); | |
+ | |
+ // Send the vote information to the server. | |
+ $.ajax({ | |
+ type: "POST", | |
+ url: opts.processVoteURL, | |
+ data: d, | |
+ error: function(request, textStatus, error) { | |
+ showError('Oops, there was a problem casting that vote.'); | |
+ } | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Open a reply form used to reply to an existing comment. | |
+ */ | |
+ function openReply(id) { | |
+ // Swap out the reply link for the hide link | |
+ $('#rl' + id).hide(); | |
+ $('#cr' + id).show(); | |
+ | |
+ // Add the reply li to the children ul. | |
+ var div = $(renderTemplate(replyTemplate, {id: id})).hide(); | |
+ $('#cl' + id) | |
+ .prepend(div) | |
+ // Setup the submit handler for the reply form. | |
+ .find('#rf' + id) | |
+ .submit(function(event) { | |
+ event.preventDefault(); | |
+ addComment($('#rf' + id)); | |
+ closeReply(id); | |
+ }) | |
+ .find('input[type=button]') | |
+ .click(function() { | |
+ closeReply(id); | |
+ }); | |
+ div.slideDown('fast', function() { | |
+ $('#rf' + id).find('textarea').focus(); | |
+ }); | |
+ } | |
+ | |
+ /** | |
+ * Close the reply form opened with openReply. | |
+ */ | |
+ function closeReply(id) { | |
+ // Remove the reply div from the DOM. | |
+ $('#rd' + id).slideUp('fast', function() { | |
+ $(this).remove(); | |
+ }); | |
+ | |
+ // Swap out the hide link for the reply link | |
+ $('#cr' + id).hide(); | |
+ $('#rl' + id).show(); | |
+ } | |
+ | |
+ /** | |
+ * Recursively sort a tree of comments using the comp comparator. | |
+ */ | |
+ function sortComments(comments) { | |
+ comments.sort(comp); | |
+ $.each(comments, function() { | |
+ this.children = sortComments(this.children); | |
+ }); | |
+ return comments; | |
+ } | |
+ | |
+ /** | |
+ * Get the children comments from a ul. If recursive is true, | |
+ * recursively include childrens' children. | |
+ */ | |
+ function getChildren(ul, recursive) { | |
+ var children = []; | |
+ ul.children().children("[id^='cd']") | |
+ .each(function() { | |
+ var comment = $(this).data('comment'); | |
+ if (recursive) | |
+ comment.children = getChildren($(this).find('#cl' + comment.id), tru… | |
+ children.push(comment); | |
+ }); | |
+ return children; | |
+ } | |
+ | |
+ /** Create a div to display a comment in. */ | |
+ function createCommentDiv(comment) { | |
+ if (!comment.displayed && !opts.moderator) { | |
+ return $('<div class="moderate">Thank you! Your comment will show up ' | |
+ + 'once it is has been approved by a moderator.</div>'); | |
+ } | |
+ // Prettify the comment rating. | |
+ comment.pretty_rating = comment.rating + ' point' + | |
+ (comment.rating == 1 ? '' : 's'); | |
+ // Make a class (for displaying not yet moderated comments differently) | |
+ comment.css_class = comment.displayed ? '' : ' moderate'; | |
+ // Create a div for this comment. | |
+ var context = $.extend({}, opts, comment); | |
+ var div = $(renderTemplate(commentTemplate, context)); | |
+ | |
+ // If the user has voted on this comment, highlight the correct arrow. | |
+ if (comment.vote) { | |
+ var direction = (comment.vote == 1) ? 'u' : 'd'; | |
+ div.find('#' + direction + 'v' + comment.id).hide(); | |
+ div.find('#' + direction + 'u' + comment.id).show(); | |
+ } | |
+ | |
+ if (opts.moderator || comment.text != '[deleted]') { | |
+ div.find('a.reply').show(); | |
+ if (comment.proposal_diff) | |
+ div.find('#sp' + comment.id).show(); | |
+ if (opts.moderator && !comment.displayed) | |
+ div.find('#cm' + comment.id).show(); | |
+ if (opts.moderator || (opts.username == comment.username)) | |
+ div.find('#dc' + comment.id).show(); | |
+ } | |
+ return div; | |
+ } | |
+ | |
+ /** | |
+ * A simple template renderer. Placeholders such as <%id%> are replaced | |
+ * by context['id'] with items being escaped. Placeholders such as <#id#> | |
+ * are not escaped. | |
+ */ | |
+ function renderTemplate(template, context) { | |
+ var esc = $(document.createElement('div')); | |
+ | |
+ function handle(ph, escape) { | |
+ var cur = context; | |
+ $.each(ph.split('.'), function() { | |
+ cur = cur[this]; | |
+ }); | |
+ return escape ? esc.text(cur || "").html() : cur; | |
+ } | |
+ | |
+ return template.replace(/<([%#])([\w\.]*)\1>/g, function() { | |
+ return handle(arguments[2], arguments[1] == '%' ? true : false); | |
+ }); | |
+ } | |
+ | |
+ /** Flash an error message briefly. */ | |
+ function showError(message) { | |
+ $(document.createElement('div')).attr({'class': 'popup-error'}) | |
+ .append($(document.createElement('div')) | |
+ .attr({'class': 'error-message'}).text(message)) | |
+ .appendTo('body') | |
+ .fadeIn("slow") | |
+ .delay(2000) | |
+ .fadeOut("slow"); | |
+ } | |
+ | |
+ /** Add a link the user uses to open the comments popup. */ | |
+ $.fn.comment = function() { | |
+ return this.each(function() { | |
+ var id = $(this).attr('id').substring(1); | |
+ var count = COMMENT_METADATA[id]; | |
+ var title = count + ' comment' + (count == 1 ? '' : 's'); | |
+ var image = count > 0 ? opts.commentBrightImage : opts.commentImage; | |
+ var addcls = count == 0 ? ' nocomment' : ''; | |
+ $(this) | |
+ .append( | |
+ $(document.createElement('a')).attr({ | |
+ href: '#', | |
+ 'class': 'sphinx-comment-open' + addcls, | |
+ id: 'ao' + id | |
+ }) | |
+ .append($(document.createElement('img')).attr({ | |
+ src: image, | |
+ alt: 'comment', | |
+ title: title | |
+ })) | |
+ .click(function(event) { | |
+ event.preventDefault(); | |
+ show($(this).attr('id').substring(2)); | |
+ }) | |
+ ) | |
+ .append( | |
+ $(document.createElement('a')).attr({ | |
+ href: '#', | |
+ 'class': 'sphinx-comment-close hidden', | |
+ id: 'ah' + id | |
+ }) | |
+ .append($(document.createElement('img')).attr({ | |
+ src: opts.closeCommentImage, | |
+ alt: 'close', | |
+ title: 'close' | |
+ })) | |
+ .click(function(event) { | |
+ event.preventDefault(); | |
+ hide($(this).attr('id').substring(2)); | |
+ }) | |
+ ); | |
+ }); | |
+ }; | |
+ | |
+ var opts = { | |
+ processVoteURL: '/_process_vote', | |
+ addCommentURL: '/_add_comment', | |
+ getCommentsURL: '/_get_comments', | |
+ acceptCommentURL: '/_accept_comment', | |
+ deleteCommentURL: '/_delete_comment', | |
+ commentImage: '/static/_static/comment.png', | |
+ closeCommentImage: '/static/_static/comment-close.png', | |
+ loadingImage: '/static/_static/ajax-loader.gif', | |
+ commentBrightImage: '/static/_static/comment-bright.png', | |
+ upArrow: '/static/_static/up.png', | |
+ downArrow: '/static/_static/down.png', | |
+ upArrowPressed: '/static/_static/up-pressed.png', | |
+ downArrowPressed: '/static/_static/down-pressed.png', | |
+ voting: false, | |
+ moderator: false | |
+ }; | |
+ | |
+ if (typeof COMMENT_OPTIONS != "undefined") { | |
+ opts = jQuery.extend(opts, COMMENT_OPTIONS); | |
+ } | |
+ | |
+ var popupTemplate = '\ | |
+ <div class="sphinx-comments" id="sc<%id%>">\ | |
+ <p class="sort-options">\ | |
+ Sort by:\ | |
+ <a href="#" class="sort-option byrating">best rated</a>\ | |
+ <a href="#" class="sort-option byascage">newest</a>\ | |
+ <a href="#" class="sort-option byage">oldest</a>\ | |
+ </p>\ | |
+ <div class="comment-header">Comments</div>\ | |
+ <div class="comment-loading" id="cn<%id%>">\ | |
+ loading comments... <img src="<%loadingImage%>" alt="" /></div>\ | |
+ <ul id="cl<%id%>" class="comment-ul"></ul>\ | |
+ <div id="ca<%id%>">\ | |
+ <p class="add-a-comment">Add a comment\ | |
+ (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\ | |
+ <div class="comment-markup-box" id="mb<%id%>">\ | |
+ reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \ | |
+ <tt>``code``</tt>, \ | |
+ code blocks: <tt>::</tt> and an indented block after blank line</div>\ | |
+ <form method="post" id="cf<%id%>" class="comment-form" action="">\ | |
+ <textarea name="comment" cols="80"></textarea>\ | |
+ <p class="propose-button">\ | |
+ <a href="#" id="pc<%id%>" class="show-propose-change">\ | |
+ Propose a change ▹\ | |
+ </a>\ | |
+ <a href="#" id="hc<%id%>" class="hide-propose-change">\ | |
+ Propose a change ▿\ | |
+ </a>\ | |
+ </p>\ | |
+ <textarea name="proposal" id="pt<%id%>" cols="80"\ | |
+ spellcheck="false"></textarea>\ | |
+ <input type="submit" value="Add comment" />\ | |
+ <input type="hidden" name="node" value="<%id%>" />\ | |
+ <input type="hidden" name="parent" value="" />\ | |
+ </form>\ | |
+ </div>\ | |
+ </div>'; | |
+ | |
+ var commentTemplate = '\ | |
+ <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\ | |
+ <div class="vote">\ | |
+ <div class="arrow">\ | |
+ <a href="#" id="uv<%id%>" class="vote" title="vote up">\ | |
+ <img src="<%upArrow%>" />\ | |
+ </a>\ | |
+ <a href="#" id="uu<%id%>" class="un vote" title="vote up">\ | |
+ <img src="<%upArrowPressed%>" />\ | |
+ </a>\ | |
+ </div>\ | |
+ <div class="arrow">\ | |
+ <a href="#" id="dv<%id%>" class="vote" title="vote down">\ | |
+ <img src="<%downArrow%>" id="da<%id%>" />\ | |
+ </a>\ | |
+ <a href="#" id="du<%id%>" class="un vote" title="vote down">\ | |
+ <img src="<%downArrowPressed%>" />\ | |
+ </a>\ | |
+ </div>\ | |
+ </div>\ | |
+ <div class="comment-content">\ | |
+ <p class="tagline comment">\ | |
+ <span class="user-id"><%username%></span>\ | |
+ <span class="rating"><%pretty_rating%></span>\ | |
+ <span class="delta"><%time.delta%></span>\ | |
+ </p>\ | |
+ <div class="comment-text comment"><#text#></div>\ | |
+ <p class="comment-opts comment">\ | |
+ <a href="#" class="reply hidden" id="rl<%id%>">reply ▹</a>\ | |
+ <a href="#" class="close-reply" id="cr<%id%>">reply ▿</a>\ | |
+ <a href="#" id="sp<%id%>" class="show-proposal">proposal ▹</a>\ | |
+ <a href="#" id="hp<%id%>" class="hide-proposal">proposal ▿</a>\ | |
+ <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\ | |
+ <span id="cm<%id%>" class="moderation hidden">\ | |
+ <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\ | |
+ </span>\ | |
+ </p>\ | |
+ <pre class="proposal" id="pr<%id%>">\ | |
+<#proposal_diff#>\ | |
+ </pre>\ | |
+ <ul class="comment-children" id="cl<%id%>"></ul>\ | |
+ </div>\ | |
+ <div class="clearleft"></div>\ | |
+ </div>\ | |
+ </div>'; | |
+ | |
+ var replyTemplate = '\ | |
+ <li>\ | |
+ <div class="reply-div" id="rd<%id%>">\ | |
+ <form id="rf<%id%>">\ | |
+ <textarea name="comment" cols="80"></textarea>\ | |
+ <input type="submit" value="Add reply" />\ | |
+ <input type="button" value="Cancel" />\ | |
+ <input type="hidden" name="parent" value="<%id%>" />\ | |
+ <input type="hidden" name="node" value="" />\ | |
+ </form>\ | |
+ </div>\ | |
+ </li>'; | |
+ | |
+ $(document).ready(function() { | |
+ init(); | |
+ }); | |
+})(jQuery); | |
+ | |
+$(document).ready(function() { | |
+ // add comment anchors for all paragraphs that are commentable | |
+ $('.sphinx-has-comment').comment(); | |
+ | |
+ // highlight search words in search results | |
+ $("div.context").each(function() { | |
+ var params = $.getQueryParameters(); | |
+ var terms = (params.q) ? params.q[0].split(/\s+/) : []; | |
+ var result = $(this); | |
+ $.each(terms, function() { | |
+ result.highlightText(this.toLowerCase(), 'highlighted'); | |
+ }); | |
+ }); | |
+ | |
+ // directly open comment window if requested | |
+ var anchor = document.location.hash; | |
+ if (anchor.substring(0, 9) == '#comment-') { | |
+ $('#ao' + anchor.substring(9)).click(); | |
+ document.location.hash = '#s' + anchor.substring(9); | |
+ } | |
+}); | |
diff --git a/doc/html/dem.html b/doc/html/dem.html | |
t@@ -0,0 +1,120 @@ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>Discrete element method — sphere 0.35 documentation</title> | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="index.html" /> | |
+ <link rel="next" title="Python API" href="python_api.html" /> | |
+ <link rel="prev" title="Introduction" href="introduction.html" /> | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="python_api.html" title="Python API" | |
+ accesskey="N">next</a> |</li> | |
+ <li class="right" > | |
+ <a href="introduction.html" title="Introduction" | |
+ accesskey="P">previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ <div class="section" id="discrete-element-method"> | |
+<h1>Discrete element method<a class="headerlink" href="#discrete-element-metho… | |
+<p>The discrete element method (or distinct element method) was initially form… | |
+</div> | |
+ | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+ <h4>Previous topic</h4> | |
+ <p class="topless"><a href="introduction.html" | |
+ title="previous chapter">Introduction</a></p> | |
+ <h4>Next topic</h4> | |
+ <p class="topless"><a href="python_api.html" | |
+ title="next chapter">Python API</a></p> | |
+ <h3>This Page</h3> | |
+ <ul class="this-page-menu"> | |
+ <li><a href="_sources/dem.txt" | |
+ rel="nofollow">Show Source</a></li> | |
+ </ul> | |
+<div id="searchbox" style="display: none"> | |
+ <h3>Quick search</h3> | |
+ <form class="search" action="search.html" method="get"> | |
+ <input type="text" name="q" /> | |
+ <input type="submit" value="Go" /> | |
+ <input type="hidden" name="check_keywords" value="yes" /> | |
+ <input type="hidden" name="area" value="default" /> | |
+ </form> | |
+ <p class="searchtip" style="font-size: 90%"> | |
+ Enter search terms or a module, class or function name. | |
+ </p> | |
+</div> | |
+<script type="text/javascript">$('#searchbox').show(0);</script> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="python_api.html" title="Python API" | |
+ >next</a> |</li> | |
+ <li class="right" > | |
+ <a href="introduction.html" title="Introduction" | |
+ >previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/html/genindex.html b/doc/html/genindex.html | |
t@@ -0,0 +1,369 @@ | |
+ | |
+ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>Index — sphere 0.35 documentation</title> | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="index.html" /> | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="#" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ | |
+<h1 id="index">Index</h1> | |
+ | |
+<div class="genindex-jumpbox"> | |
+ <a href="#A"><strong>A</strong></a> | |
+ | <a href="#B"><strong>B</strong></a> | |
+ | <a href="#C"><strong>C</strong></a> | |
+ | <a href="#D"><strong>D</strong></a> | |
+ | <a href="#E"><strong>E</strong></a> | |
+ | <a href="#G"><strong>G</strong></a> | |
+ | <a href="#I"><strong>I</strong></a> | |
+ | <a href="#P"><strong>P</strong></a> | |
+ | <a href="#R"><strong>R</strong></a> | |
+ | <a href="#S"><strong>S</strong></a> | |
+ | <a href="#T"><strong>T</strong></a> | |
+ | <a href="#U"><strong>U</strong></a> | |
+ | <a href="#V"><strong>V</strong></a> | |
+ | <a href="#W"><strong>W</strong></a> | |
+ | <a href="#Z"><strong>Z</strong></a> | |
+ | |
+</div> | |
+<h2 id="A">A</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.adjustUpperWall">adjustUpperWa… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="B">B</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.bond">bond() (sphere.Spherebin… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.bulkPorosity">bulkPorosity() (… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="C">C</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.consolidate">consolidate() (sp… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.convert">convert() (in module sphere)</a> | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="D">D</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.defaultParams">defaultParams()… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="E">E</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.energy">energy() (sphere.Spher… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="G">G</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.generateRadii">generateRadii()… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="I">I</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.initGrid">initGrid() (sphere.S… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.initGridAndWorldsize">initGrid… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.initGridPos">initGridPos() (sp… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.initRandomGridPos">initRandomG… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.initRandomPos">initRandomPos()… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.initTemporal">initTemporal() (… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="P">P</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.porosity">porosity() (sphere.S… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="R">R</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.readbin">readbin() (sphere.Sph… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.render">render() (in module sphere)</a> | |
+ </dt> | |
+ | |
+ <dd><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.render">(sphere.Spherebin meth… | |
+ </dt> | |
+ | |
+ </dl></dd> | |
+ </dl></td> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.run">run() (in module sphere)</a> | |
+ </dt> | |
+ | |
+ <dd><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.run">(sphere.Spherebin method)… | |
+ </dt> | |
+ | |
+ </dl></dd> | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="S">S</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.shear">shear() (sphere.Sphereb… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.shearstrain">shearstrain() (sp… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.shearvel">shearvel() (sphere.S… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#module-sphere">sphere (module)</a> | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin">Spherebin (class in sphere)</… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.status">status() (in module sphere)</a> | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="T">T</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.thinsection_x1x3">thinsection_… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.thinsectionVideo">thinsectionVideo() (in… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.torqueScript">torqueScript() (… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="U">U</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.uniaxialStrainRate">uniaxialSt… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="V">V</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.V_sphere">V_sphere() (in module sphere)<… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.video">video() (in module sphere)</a> | |
+ </dt> | |
+ | |
+ </dl></td> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.visualize">visualize() (in module sphere… | |
+ </dt> | |
+ | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.voidRatio">voidRatio() (sphere… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="W">W</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.writebin">writebin() (sphere.S… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+<h2 id="Z">Z</h2> | |
+<table style="width: 100%" class="indextable genindextable"><tr> | |
+ <td style="width: 33%" valign="top"><dl> | |
+ | |
+ <dt><a href="python_api.html#sphere.Spherebin.zeroKinematics">zeroKinematics… | |
+ </dt> | |
+ | |
+ </dl></td> | |
+</tr></table> | |
+ | |
+ | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+ | |
+ | |
+ | |
+<div id="searchbox" style="display: none"> | |
+ <h3>Quick search</h3> | |
+ <form class="search" action="search.html" method="get"> | |
+ <input type="text" name="q" /> | |
+ <input type="submit" value="Go" /> | |
+ <input type="hidden" name="check_keywords" value="yes" /> | |
+ <input type="hidden" name="area" value="default" /> | |
+ </form> | |
+ <p class="searchtip" style="font-size: 90%"> | |
+ Enter search terms or a module, class or function name. | |
+ </p> | |
+</div> | |
+<script type="text/javascript">$('#searchbox').show(0);</script> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="#" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/html/index.html b/doc/html/index.html | |
t@@ -0,0 +1,145 @@ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>Welcome to sphere’s documentation! — sphere 0.35 documentat… | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="#" /> | |
+ <link rel="next" title="Introduction" href="introduction.html" /> | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="introduction.html" title="Introduction" | |
+ accesskey="N">next</a> |</li> | |
+ <li><a href="#">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ <div class="section" id="welcome-to-sphere-s-documentation"> | |
+<h1>Welcome to sphere’s documentation!<a class="headerlink" href="#welco… | |
+<p>This is the official documentation for the <em>sphere</em> discrete element… | |
+<p><em>sphere</em> is developed by Anders Damsgaard Christensen under supervis… | |
+<p>Contact: Anders Damsgaard Christensen, <a class="reference external" href="… | |
+<p>Contents:</p> | |
+<div class="toctree-wrapper compound"> | |
+<ul> | |
+<li class="toctree-l1"><a class="reference internal" href="introduction.html">… | |
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#r… | |
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#b… | |
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#w… | |
+</ul> | |
+</li> | |
+<li class="toctree-l1"><a class="reference internal" href="dem.html">Discrete … | |
+<li class="toctree-l1"><a class="reference internal" href="python_api.html">Py… | |
+<li class="toctree-l1"><a class="reference internal" href="sphere_internals.ht… | |
+<li class="toctree-l2"><a class="reference internal" href="sphere_internals.ht… | |
+<li class="toctree-l2"><a class="reference internal" href="sphere_internals.ht… | |
+</ul> | |
+</li> | |
+</ul> | |
+</div> | |
+</div> | |
+<div class="section" id="indices-and-tables"> | |
+<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="… | |
+<ul class="simple"> | |
+<li><a class="reference internal" href="genindex.html"><em>Index</em></a></li> | |
+<li><a class="reference internal" href="search.html"><em>Search Page</em></a><… | |
+</ul> | |
+</div> | |
+ | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+ <h3><a href="#">Table Of Contents</a></h3> | |
+ <ul> | |
+<li><a class="reference internal" href="#">Welcome to sphere’s documenta… | |
+</ul> | |
+</li> | |
+<li><a class="reference internal" href="#indices-and-tables">Indices and table… | |
+</ul> | |
+ | |
+ <h4>Next topic</h4> | |
+ <p class="topless"><a href="introduction.html" | |
+ title="next chapter">Introduction</a></p> | |
+ <h3>This Page</h3> | |
+ <ul class="this-page-menu"> | |
+ <li><a href="_sources/index.txt" | |
+ rel="nofollow">Show Source</a></li> | |
+ </ul> | |
+<div id="searchbox" style="display: none"> | |
+ <h3>Quick search</h3> | |
+ <form class="search" action="search.html" method="get"> | |
+ <input type="text" name="q" /> | |
+ <input type="submit" value="Go" /> | |
+ <input type="hidden" name="check_keywords" value="yes" /> | |
+ <input type="hidden" name="area" value="default" /> | |
+ </form> | |
+ <p class="searchtip" style="font-size: 90%"> | |
+ Enter search terms or a module, class or function name. | |
+ </p> | |
+</div> | |
+<script type="text/javascript">$('#searchbox').show(0);</script> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="introduction.html" title="Introduction" | |
+ >next</a> |</li> | |
+ <li><a href="#">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/html/introduction.html b/doc/html/introduction.html | |
t@@ -0,0 +1,211 @@ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>Introduction — sphere 0.35 documentation</title> | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="index.html" /> | |
+ <link rel="next" title="Discrete element method" href="dem.html" /> | |
+ <link rel="prev" title="Welcome to sphere’s documentation!" href="index.… | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="dem.html" title="Discrete element method" | |
+ accesskey="N">next</a> |</li> | |
+ <li class="right" > | |
+ <a href="index.html" title="Welcome to sphere’s documentation!" | |
+ accesskey="P">previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ <div class="section" id="introduction"> | |
+<h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to… | |
+<p>The <em>sphere</em>-software is used for three-dimensional discrete element… | |
+The ultimate aim of the <em>sphere</em> software is to simulate soft-bedded su… | |
+<p>The purpose of this documentation is to provide the user with a thorough wa… | |
+<div class="admonition note"> | |
+<p class="first admonition-title">Note</p> | |
+<p class="last">Command examples in this document starting with the symbol <tt… | |
+</div> | |
+<p>All numerical values in this document, the source code, and the configurati… | |
+<div class="section" id="requirements"> | |
+<h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to… | |
+<dl class="docutils"> | |
+<dt>The build requirements are:</dt> | |
+<dd><ul class="first last simple"> | |
+<li>A Nvidia CUDA-supported version of Linux or Mac OS X (see the <a class="re… | |
+<li><a class="reference external" href="https://www.gnu.org/software/make/">GN… | |
+<li>The <a class="reference external" href="http://gcc.gnu.org/">GNU Compiler … | |
+<li>The <a class="reference external" href="https://developer.nvidia.com/cuda-… | |
+</ul> | |
+</dd> | |
+<dt>The runtime requirements are:</dt> | |
+<dd><ul class="first last simple"> | |
+<li>A <a class="reference external" href="http://www.nvidia.com/object/cuda_gp… | |
+<li>A Nvidia CUDA-enabled GPU and device driver</li> | |
+</ul> | |
+</dd> | |
+<dt>Optional tools, required for simulation setup and data processing:</dt> | |
+<dd><ul class="first last simple"> | |
+<li><a class="reference external" href="http://www.python.org/getit/releases/2… | |
+<li><a class="reference external" href="http://numpy.scipy.org">Numpy</a></li> | |
+<li><a class="reference external" href="http://matplotlib.org">Matplotlib</a><… | |
+<li><a class="reference external" href="http://www.imagemagick.org/script/inde… | |
+<li><a class="reference external" href="http://ffmpeg.org/">ffmpeg</a></li> | |
+</ul> | |
+</dd> | |
+<dt>Optional tools, required for building the documentation:</dt> | |
+<dd><ul class="first last simple"> | |
+<li><a class="reference external" href="http://sphinx-doc.org">Sphinx</a><ul> | |
+<li><a class="reference external" href="http://packages.python.org/sphinxcontr… | |
+</ul> | |
+</li> | |
+<li><a class="reference external" href="http://www.stack.nl/~dimitri/doxygen/"… | |
+<li><a class="reference external" href="http://michaeljones.github.com/breathe… | |
+<li><a class="reference external" href="http://www.nongnu.org/dvipng/">dvipng<… | |
+</ul> | |
+</dd> | |
+</dl> | |
+<p><a class="reference external" href="http://git-scm.com">Git</a> is used as … | |
+</div> | |
+<div class="section" id="building-sphere"> | |
+<h2>Building <em>sphere</em><a class="headerlink" href="#building-sphere" titl… | |
+<p>All instructions required for building <em>sphere</em> are provided in a nu… | |
+<div class="highlight-python"><pre>$ cd src | |
+$ make</pre> | |
+</div> | |
+<p>If successfull, the GNU Makefile will create the required data folders, obj… | |
+<div class="highlight-python"><pre>$ ./sphere_* --version</pre> | |
+</div> | |
+<p>The output should look similar to this:</p> | |
+<div class="system-message"> | |
+<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">… | |
+Command u’../../sphere_linux_X86_64 –version’ failed: [Errno… | |
+<p>The documentation can be read in the <a class="reference external" href="ht… | |
+<div class="highlight-python"><pre>$ cd doc/sphinx | |
+$ make html | |
+$ make latexpdf</pre> | |
+</div> | |
+<p>To see all available output formats, execute:</p> | |
+<div class="highlight-python"><pre>$ make help</pre> | |
+</div> | |
+</div> | |
+<div class="section" id="work-flow"> | |
+<h2>Work flow<a class="headerlink" href="#work-flow" title="Permalink to this … | |
+<dl class="docutils"> | |
+<dt>After compiling the <em>sphere</em> binary, the procedure of a creating an… | |
+<dd><ul class="first last simple"> | |
+<li>Setup of particle assemblage, physical properties and conditions using the… | |
+<li>Execution of <em>sphere</em> software, which simulates the particle behavi… | |
+<li>Inspection, analysis, interpretation and visualization of <em>sphere</em> … | |
+</ul> | |
+</dd> | |
+</dl> | |
+</div> | |
+</div> | |
+ | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+ <h3><a href="index.html">Table Of Contents</a></h3> | |
+ <ul> | |
+<li><a class="reference internal" href="#">Introduction</a><ul> | |
+<li><a class="reference internal" href="#requirements">Requirements</a></li> | |
+<li><a class="reference internal" href="#building-sphere">Building <em>sphere<… | |
+<li><a class="reference internal" href="#work-flow">Work flow</a></li> | |
+</ul> | |
+</li> | |
+</ul> | |
+ | |
+ <h4>Previous topic</h4> | |
+ <p class="topless"><a href="index.html" | |
+ title="previous chapter">Welcome to sphere’s doc… | |
+ <h4>Next topic</h4> | |
+ <p class="topless"><a href="dem.html" | |
+ title="next chapter">Discrete element method</a></p> | |
+ <h3>This Page</h3> | |
+ <ul class="this-page-menu"> | |
+ <li><a href="_sources/introduction.txt" | |
+ rel="nofollow">Show Source</a></li> | |
+ </ul> | |
+<div id="searchbox" style="display: none"> | |
+ <h3>Quick search</h3> | |
+ <form class="search" action="search.html" method="get"> | |
+ <input type="text" name="q" /> | |
+ <input type="submit" value="Go" /> | |
+ <input type="hidden" name="check_keywords" value="yes" /> | |
+ <input type="hidden" name="area" value="default" /> | |
+ </form> | |
+ <p class="searchtip" style="font-size: 90%"> | |
+ Enter search terms or a module, class or function name. | |
+ </p> | |
+</div> | |
+<script type="text/javascript">$('#searchbox').show(0);</script> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="dem.html" title="Discrete element method" | |
+ >next</a> |</li> | |
+ <li class="right" > | |
+ <a href="index.html" title="Welcome to sphere’s documentation!" | |
+ >previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/html/objects.inv b/doc/html/objects.inv | |
Binary files differ. | |
diff --git a/doc/html/py-modindex.html b/doc/html/py-modindex.html | |
t@@ -0,0 +1,115 @@ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>Python Module Index — sphere 0.35 documentation</title> | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="index.html" /> | |
+ | |
+ | |
+ <script type="text/javascript"> | |
+ DOCUMENTATION_OPTIONS.COLLAPSE_INDEX = true; | |
+ </script> | |
+ | |
+ | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="#" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ | |
+ <h1>Python Module Index</h1> | |
+ | |
+ <div class="modindex-jumpbox"> | |
+ <a href="#cap-s"><strong>s</strong></a> | |
+ </div> | |
+ | |
+ <table class="indextable modindextable" cellspacing="0" cellpadding="2"> | |
+ <tr class="pcap"><td></td><td> </td><td></td></tr> | |
+ <tr class="cap" id="cap-s"><td></td><td> | |
+ <strong>s</strong></td><td></td></tr> | |
+ <tr> | |
+ <td></td> | |
+ <td> | |
+ <a href="python_api.html#module-sphere"><tt class="xref">sphere</tt></a… | |
+ <em></em></td></tr> | |
+ </table> | |
+ | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+<div id="searchbox" style="display: none"> | |
+ <h3>Quick search</h3> | |
+ <form class="search" action="search.html" method="get"> | |
+ <input type="text" name="q" /> | |
+ <input type="submit" value="Go" /> | |
+ <input type="hidden" name="check_keywords" value="yes" /> | |
+ <input type="hidden" name="area" value="default" /> | |
+ </form> | |
+ <p class="searchtip" style="font-size: 90%"> | |
+ Enter search terms or a module, class or function name. | |
+ </p> | |
+</div> | |
+<script type="text/javascript">$('#searchbox').show(0);</script> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="#" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/html/python_api.html b/doc/html/python_api.html | |
t@@ -0,0 +1,364 @@ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>Python API — sphere 0.35 documentation</title> | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="index.html" /> | |
+ <link rel="next" title="sphere internals" href="sphere_internals.html" /> | |
+ <link rel="prev" title="Discrete element method" href="dem.html" /> | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="sphere_internals.html" title="sphere internals" | |
+ accesskey="N">next</a> |</li> | |
+ <li class="right" > | |
+ <a href="dem.html" title="Discrete element method" | |
+ accesskey="P">previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ <div class="section" id="module-sphere"> | |
+<span id="python-api"></span><h1>Python API<a class="headerlink" href="#module… | |
+<dl class="class"> | |
+<dt id="sphere.Spherebin"> | |
+<em class="property">class </em><tt class="descclassname">sphere.</tt><tt clas… | |
+<dd><p>Class containing all data SPHERE data.</p> | |
+<p>Contains functions for reading and writing binaries, as well as simulation | |
+setup and data analysis.</p> | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.adjustUpperWall"> | |
+<tt class="descname">adjustUpperWall</tt><big>(</big><em>z_adjust=1.1</em><big… | |
+<dd><p>Adjust grid and dynamic upper wall to max. particle height</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.bond"> | |
+<tt class="descname">bond</tt><big>(</big><em>i</em>, <em>j</em><big>)</big><a… | |
+<dd><p>Create a bond between particles i and j</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.bulkPorosity"> | |
+<tt class="descname">bulkPorosity</tt><big>(</big><big>)</big><a class="header… | |
+<dd><p>Calculate and return the bulk porosity</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.consolidate"> | |
+<tt class="descname">consolidate</tt><big>(</big><em>deviatoric_stress=10000.0… | |
+<dd><p>Setup consolidation experiment. Specify the upper wall | |
+deviatoric stress in Pascal, default value is 10 kPa.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.defaultParams"> | |
+<tt class="descname">defaultParams</tt><big>(</big><em>mu_s=0.4</em>, <em>mu_d… | |
+<dd><p>Initialize particle parameters to default values. | |
+Radii must be set prior to calling this function.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.energy"> | |
+<tt class="descname">energy</tt><big>(</big><em>method</em><big>)</big><a clas… | |
+<dd><p>Calculate the sum of the energy components of all particles.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.generateRadii"> | |
+<tt class="descname">generateRadii</tt><big>(</big><em>psd='logn'</em>, <em>ra… | |
+<dd><p>Draw random particle radii from the selected probability distribution. | |
+Specify mean radius and variance. The variance should be kept at a | |
+very low value.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.initGrid"> | |
+<tt class="descname">initGrid</tt><big>(</big><big>)</big><a class="headerlink… | |
+<dd><p>Initialize grid suitable for the particle positions set previously. | |
+The margin parameter adjusts the distance (in no. of max. radii) | |
+from the particle boundaries.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.initGridAndWorldsize"> | |
+<tt class="descname">initGridAndWorldsize</tt><big>(</big><em>g=array([ 0.</em… | |
+<dd><p>Initialize grid suitable for the particle positions set previously. | |
+The margin parameter adjusts the distance (in no. of max. radii) | |
+from the particle boundaries.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.initGridPos"> | |
+<tt class="descname">initGridPos</tt><big>(</big><em>g=array([ 0.</em>, <em>0.… | |
+<dd><p>Initialize particle positions in loose, cubic configuration. | |
+Radii must be set beforehand. | |
+xynum is the number of rows in both x- and y- directions.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.initRandomGridPos"> | |
+<tt class="descname">initRandomGridPos</tt><big>(</big><em>g=array([ 0.</em>, … | |
+<dd><p>Initialize particle positions in loose, cubic configuration. | |
+Radii must be set beforehand. | |
+xynum is the number of rows in both x- and y- directions.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.initRandomPos"> | |
+<tt class="descname">initRandomPos</tt><big>(</big><em>g=array([ 0.</em>, <em>… | |
+<dd><p>Initialize particle positions in loose, cubic configuration. | |
+Radii must be set beforehand. | |
+xynum is the number of rows in both x- and y- directions.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.initTemporal"> | |
+<tt class="descname">initTemporal</tt><big>(</big><em>total</em>, <em>current=… | |
+<dd><p>Set temporal parameters for the simulation. | |
+Particle radii and physical parameters need to be set | |
+prior to these.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.porosity"> | |
+<tt class="descname">porosity</tt><big>(</big><em>slices=10</em>, <em>verbose=… | |
+<dd><p>Calculate the porosity as a function of depth, by averaging values | |
+in horizontal slabs. | |
+Returns porosity values and depth</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.readbin"> | |
+<tt class="descname">readbin</tt><big>(</big><em>targetbin</em>, <em>verbose=T… | |
+<dd><p>Reads a target SPHERE binary file</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.render"> | |
+<tt class="descname">render</tt><big>(</big><em>method='pres'</em>, <em>max_va… | |
+<dd><p>Render all output files that belong to the simulation, determined by si… | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.run"> | |
+<tt class="descname">run</tt><big>(</big><em>verbose=True</em>, <em>hideinputf… | |
+<dd><p>Execute sphere with target project</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.shear"> | |
+<tt class="descname">shear</tt><big>(</big><em>shear_strain_rate=1</em>, <em>p… | |
+<dd><p>Setup shear experiment. Specify the upper wall | |
+deviatoric stress in Pascal, default value is 10 kPa. | |
+The shear strain rate is the shear length divided by the | |
+initial height per second.</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.shearstrain"> | |
+<tt class="descname">shearstrain</tt><big>(</big><big>)</big><a class="headerl… | |
+<dd><p>Calculates and returns the shear strain (gamma) value of the experiment… | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.shearvel"> | |
+<tt class="descname">shearvel</tt><big>(</big><big>)</big><a class="headerlink… | |
+<dd><p>Calculates and returns the shear velocity (gamma_dot) of the experiment… | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.thinsection_x1x3"> | |
+<tt class="descname">thinsection_x1x3</tt><big>(</big><em>x2='center'</em>, <e… | |
+<dd><p>Produce a 2D image of particles on a x1,x3 plane, intersecting the seco… | |
+Output is saved as ‘<sid>-ts-x1x3.txt’ in the current folder… | |
+<p>An upper limit to the pressure color bar range can be set by the cbmax para… | |
+<dl class="docutils"> | |
+<dt>The data can be plotted in gnuplot with:</dt> | |
+<dd>gnuplot> set size ratio -1 | |
+gnuplot> set palette defined (0 “blue”, 0.5 “gray”,… | |
+gnuplot> plot ‘<sid>-ts-x1x3.txt’ with circles palette fs… | |
+</dl> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.torqueScript"> | |
+<tt class="descname">torqueScript</tt><big>(</big><em>email='adc@geo.au.dk… | |
+<dd><p>Create job script for the Torque queue manager for the binary</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.uniaxialStrainRate"> | |
+<tt class="descname">uniaxialStrainRate</tt><big>(</big><em>wvel=-0.001</em>, … | |
+<dd><p>Setup consolidation experiment. Specify the upper wall | |
+velocity in m/s, default value is -0.001 m/s (i.e. downwards).</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.voidRatio"> | |
+<tt class="descname">voidRatio</tt><big>(</big><big>)</big><a class="headerlin… | |
+<dd><p>Returns the current void ratio</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.writebin"> | |
+<tt class="descname">writebin</tt><big>(</big><em>folder='../input/'</em>, <em… | |
+<dd><p>Writes to a target SPHERE binary file</p> | |
+</dd></dl> | |
+ | |
+<dl class="method"> | |
+<dt id="sphere.Spherebin.zeroKinematics"> | |
+<tt class="descname">zeroKinematics</tt><big>(</big><big>)</big><a class="head… | |
+<dd><p>Zero kinematics of particles</p> | |
+</dd></dl> | |
+ | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.V_sphere"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">V_sphere</tt><big>(… | |
+<dd><p>Returns the volume of a sphere with radius r</p> | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.convert"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">convert</tt><big>(<… | |
+<dd><p>Converts all PPM images in img_out to graphicsformat, using ImageMagick… | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.render"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">render</tt><big>(</… | |
+<dd><p>Render target binary using the sphere raytracer.</p> | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.run"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">run</tt><big>(</big… | |
+<dd><p>Execute sphere with target binary as input</p> | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.status"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">status</tt><big>(</… | |
+<dd><p>Check the status.dat file for the target project, | |
+and return the last file numer.</p> | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.thinsectionVideo"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">thinsectionVideo</t… | |
+<dd><p>Use ffmpeg to combine thin section images to animation. | |
+This function will start off by rendering the images.</p> | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.video"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">video</tt><big>(</b… | |
+<dd><p>Use ffmpeg to combine images to animation. All images should be rendere… | |
+</dd></dl> | |
+ | |
+<dl class="function"> | |
+<dt id="sphere.visualize"> | |
+<tt class="descclassname">sphere.</tt><tt class="descname">visualize</tt><big>… | |
+<dd><p>Visualize output from the target project, | |
+where the temporal progress is of interest.</p> | |
+</dd></dl> | |
+ | |
+</div> | |
+ | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+ <h4>Previous topic</h4> | |
+ <p class="topless"><a href="dem.html" | |
+ title="previous chapter">Discrete element method</a></… | |
+ <h4>Next topic</h4> | |
+ <p class="topless"><a href="sphere_internals.html" | |
+ title="next chapter">sphere internals</a></p> | |
+ <h3>This Page</h3> | |
+ <ul class="this-page-menu"> | |
+ <li><a href="_sources/python_api.txt" | |
+ rel="nofollow">Show Source</a></li> | |
+ </ul> | |
+<div id="searchbox" style="display: none"> | |
+ <h3>Quick search</h3> | |
+ <form class="search" action="search.html" method="get"> | |
+ <input type="text" name="q" /> | |
+ <input type="submit" value="Go" /> | |
+ <input type="hidden" name="check_keywords" value="yes" /> | |
+ <input type="hidden" name="area" value="default" /> | |
+ </form> | |
+ <p class="searchtip" style="font-size: 90%"> | |
+ Enter search terms or a module, class or function name. | |
+ </p> | |
+</div> | |
+<script type="text/javascript">$('#searchbox').show(0);</script> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="sphere_internals.html" title="sphere internals" | |
+ >next</a> |</li> | |
+ <li class="right" > | |
+ <a href="dem.html" title="Discrete element method" | |
+ >previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/html/search.html b/doc/html/search.html | |
t@@ -0,0 +1,106 @@ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>Search — sphere 0.35 documentation</title> | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <script type="text/javascript" src="_static/searchtools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="index.html" /> | |
+ <script type="text/javascript"> | |
+ jQuery(function() { Search.loadIndex("searchindex.js"); }); | |
+ </script> | |
+ | |
+ | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ <h1 id="search-documentation">Search</h1> | |
+ <div id="fallback" class="admonition warning"> | |
+ <script type="text/javascript">$('#fallback').hide();</script> | |
+ <p> | |
+ Please activate JavaScript to enable the search | |
+ functionality. | |
+ </p> | |
+ </div> | |
+ <p> | |
+ From here you can search these documents. Enter your search | |
+ words into the box below and click "search". Note that the search | |
+ function will automatically search for all of the words. Pages | |
+ containing fewer words won't appear in the result list. | |
+ </p> | |
+ <form action="" method="get"> | |
+ <input type="text" name="q" value="" /> | |
+ <input type="submit" value="search" /> | |
+ <span id="search-progress" style="padding-left: 10px"></span> | |
+ </form> | |
+ | |
+ <div id="search-results"> | |
+ | |
+ </div> | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js | |
t@@ -0,0 +1 @@ | |
+Search.setIndex({objects:{"":{sphere:[4,0,1,""]},sphere:{status:[4,2,1,""],con… | |
+\ No newline at end of file | |
diff --git a/doc/html/sphere_internals.html b/doc/html/sphere_internals.html | |
t@@ -0,0 +1,410 @@ | |
+ | |
+ | |
+<!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> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
+ | |
+ <title>sphere internals — sphere 0.35 documentation</title> | |
+ | |
+ <link rel="stylesheet" href="_static/default.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> | |
+ <link rel="stylesheet" href="_static/breathe.css" type="text/css" /> | |
+ | |
+ <script type="text/javascript"> | |
+ var DOCUMENTATION_OPTIONS = { | |
+ URL_ROOT: '', | |
+ VERSION: '0.35', | |
+ COLLAPSE_INDEX: false, | |
+ FILE_SUFFIX: '.html', | |
+ HAS_SOURCE: true | |
+ }; | |
+ </script> | |
+ <script type="text/javascript" src="_static/jquery.js"></script> | |
+ <script type="text/javascript" src="_static/underscore.js"></script> | |
+ <script type="text/javascript" src="_static/doctools.js"></script> | |
+ <link rel="top" title="sphere 0.35 documentation" href="index.html" /> | |
+ <link rel="prev" title="Python API" href="python_api.html" /> | |
+ </head> | |
+ <body> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ accesskey="I">index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="python_api.html" title="Python API" | |
+ accesskey="P">previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ | |
+ <div class="document"> | |
+ <div class="documentwrapper"> | |
+ <div class="bodywrapper"> | |
+ <div class="body"> | |
+ | |
+ <div class="section" id="sphere-internals"> | |
+<h1>sphere internals<a class="headerlink" href="#sphere-internals" title="Perm… | |
+<p>The <em>sphere</em> executable has the following options:</p> | |
+<div class="system-message"> | |
+<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">… | |
+Command u’../../sphere_linux_X86_64 –help’ failed: [Errno 2]… | |
+<p>The most common way to invoke <em>sphere</em> is however via the Python API… | |
+<p>subsection{The <em>sphere</em> algorithm} | |
+label{subsec:spherealgo} | |
+The <em>sphere</em>-binary is launched from the system terminal by passing the… | |
+#. System check, including search for NVIDIA CUDA compatible devices (texttt{m… | |
+<ol class="arabic simple"> | |
+<li>Initial data import from binary input file (texttt{main.cpp}).</li> | |
+<li>Allocation of memory for all host variables (particles, grid, walls, etc.)… | |
+<li>Continued import from binary input file (texttt{main.cpp}).</li> | |
+<li>Control handed to GPU-specific function texttt{gpuMain(ldots)} (texttt{dev… | |
+<li>Memory allocation of device memory (texttt{device.cu}).</li> | |
+<li>Transfer of data from host to device variables (texttt{device.cu}).</li> | |
+<li>Initialization of Thrustfootnote{url{<a class="reference external" href="h… | |
+<li>Calculation of GPU workload configuration (thread and block layout) (textt… | |
+<li>Status and data written to verb”<simulation_ID>.status.datR… | |
+<li>Main loop (while texttt{time.current <= time.total}) (functions called … | |
+</ol> | |
+<blockquote> | |
+<div><ol class="arabic"> | |
+<li><p class="first">label{loopstart}CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{calcParticleCellID<<<,>>>(ldots)… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{thrust::sort_by_key(ldots)}: Thrust radix sort of … | |
+</li> | |
+<li><p class="first">texttt{cudaMemset(ldots)}: Writing zero value (texttt{0xf… | |
+</li> | |
+<li><p class="first">texttt{reorderArrays<<<,>>>(ldots)}: Re… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">Optional: texttt{topology<<<,>>>(ldots)… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{interact<<<,>>>(ldots)}: For eac… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{integrate<<<,>>>(ldots)}: Updati… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{summation<<<,>>>(ldots)}: Partic… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{integrateWalls<<<,>>>(ldots)}: U… | |
+</li> | |
+<li><p class="first">Update of timers and loop-related counters (e.g. texttt{t… | |
+</li> | |
+<li><p class="first">If file output interval is reached:</p> | |
+<blockquote> | |
+<div><blockquote> | |
+<div><p>item Optional write of data to output binary (verb”<simulatio… | |
+item Update of verb”<simulation_ID>.status#..bin” (texttt{de… | |
+</div></blockquote> | |
+<p>item Return to point ref{loopstart}, unless texttt{time.current >= time.… | |
+</div></blockquote> | |
+</li> | |
+</ol> | |
+</div></blockquote> | |
+<ol class="arabic simple"> | |
+<li>label{loopend}Liberation of device memory (texttt{device.cu}).</li> | |
+<li>Control returned to texttt{main(ldots)}, liberation of host memory (texttt… | |
+<li>End of program, return status equal to zero (0) if no problems where encou… | |
+</ol> | |
+<div class="section" id="numerical-algorithm"> | |
+<h2>Numerical algorithm<a class="headerlink" href="#numerical-algorithm" title… | |
+<p>The <em>sphere</em>-binary is launched from the system terminal by passing … | |
+<ol class="arabic simple"> | |
+<li>System check, including search for NVIDIA CUDA compatible devices (texttt{… | |
+<li>Initial data import from binary input file (texttt{main.cpp}).</li> | |
+<li>Allocation of memory for all host variables (particles, grid, walls, etc.)… | |
+<li>Continued import from binary input file (texttt{main.cpp}).</li> | |
+<li>Control handed to GPU-specific function texttt{gpuMain(ldots)} (texttt{dev… | |
+<li>Memory allocation of device memory (texttt{device.cu}).</li> | |
+<li>Transfer of data from host to device variables (texttt{device.cu}).</li> | |
+<li>Initialization of Thrustfootnote{url{<a class="reference external" href="h… | |
+<li>Calculation of GPU workload configuration (thread and block layout) (textt… | |
+<li>Status and data written to verb”<simulation_ID>.status.datR… | |
+<li>Main loop (while texttt{time.current <= time.total}) (functions called … | |
+</ol> | |
+<blockquote> | |
+<div><ol class="arabic"> | |
+<li><p class="first">label{loopstart}CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{calcParticleCellID<<<,>>>(ldots)… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{thrust::sort_by_key(ldots)}: Thrust radix sort of … | |
+</li> | |
+<li><p class="first">texttt{cudaMemset(ldots)}: Writing zero value (texttt{0xf… | |
+</li> | |
+<li><p class="first">texttt{reorderArrays<<<,>>>(ldots)}: Re… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">Optional: texttt{topology<<<,>>>(ldots)… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{interact<<<,>>>(ldots)}: For eac… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{integrate<<<,>>>(ldots)}: Updati… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{summation<<<,>>>(ldots)}: Partic… | |
+</li> | |
+<li><p class="first">CUDA thread synchronization point.</p> | |
+</li> | |
+<li><p class="first">texttt{integrateWalls<<<,>>>(ldots)}: U… | |
+</li> | |
+<li><p class="first">Update of timers and loop-related counters (e.g. texttt{t… | |
+</li> | |
+<li><p class="first">If file output interval is reached:</p> | |
+<blockquote> | |
+<div><ul class="simple"> | |
+<li>Optional write of data to output binary (verb”<simulation_ID>.… | |
+<li>Update of verb”<simulation_ID>.status#..bin” (texttt{dev… | |
+</ul> | |
+</div></blockquote> | |
+</li> | |
+<li><p class="first">Return to point ref{loopstart}, unless texttt{time.curren… | |
+</li> | |
+</ol> | |
+</div></blockquote> | |
+<ol class="arabic simple"> | |
+<li>label{loopend}Liberation of device memory (texttt{device.cu}).</li> | |
+<li>Control returned to texttt{main(ldots)}, liberation of host memory (texttt… | |
+<li>End of program, return status equal to zero (0) if no problems where encou… | |
+</ol> | |
+<p>The length of the computational time steps (texttt{time.dt}) is calculated … | |
+<div class="math"> | |
+<p><img src="_images/math/a32f407296c4d7fd42fe568d2ad7e8fa81f2df27.png" alt="\… | |
+</div><p>where <img class="math" src="_images/math/f5047d1e0cbb50ec208923a22cd… | |
+The time step is set by this relationship in <tt class="xref py py-func docuti… | |
+This equation ensures that the elastic wave (traveling at the speed of sound) … | |
+<p>subsubsection{Host and device memory types} | |
+label{subsubsec:memorytypes} | |
+A full, listed description of the <em>sphere</em> source code variables can be… | |
+<p>The floating point precision operating internally in <em>sphere</em> is def… | |
+<p>Three-dimensional variables (e.g. spatial vectors in <cite>E^3</cite>) are … | |
+<p>paragraph{Host memory} is the main random-access computer memory (RAM), i.e… | |
+<p>paragraph{Device memory} is the main, global device memory. It resides off-… | |
+<p>marginpar{Todo: Expand section on device memory types}</p> | |
+<p>paragraph{Constant memory} values cannot be changed after they are set, and… | |
+<p>%subsection{The main loop} | |
+%label{subsec:mainloop} | |
+%The <em>sphere</em> software calculates particle movement and rotation based … | |
+<p>subsection{Performance} | |
+marginpar{Todo: insert graph of performance vs. np and performance vs. <cite>D… | |
+subsubsection{Particles and computational time}</p> | |
+<p>subsection{Compilation} | |
+label{subsec:compilation} | |
+An important note is that the texttt{C} examples of the NVIDIA CUDA SDK should… | |
+<p><em>sphere</em> is supplied with several Makefiles, which automate the comp… | |
+</div> | |
+<div class="section" id="c-reference"> | |
+<h2>C++ reference<a class="headerlink" href="#c-reference" title="Permalink to… | |
+<div class="line-block"> | |
+<div class="line"><em>class</em> <strong>DEM</strong></div> | |
+</div> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+<em>Public Functions</em><blockquote> | |
+<div><p id=""><span id="project0classDEM_1a3cd6355aefc172c712f1c91f4ffc36f2"><… | |
+<div class="line"> <strong>DEM</strong>(std::string inputbin, const int verbos… | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1aa3066aa501f982c2df51f58fb5a91148"></span… | |
+<div class="line"> <strong>~DEM</strong>(void)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1ac32ef9094b25ee9c35e30f4488491fe2"></span… | |
+<div class="line">void <strong>readbin</strong>(const char * target)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1a242634f10a9bc1f19e4eb46b7168f288"></span… | |
+<div class="line">void <strong>writebin</strong>(const char * target)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1a101aafa4f3197948fafbb1500e58f0f5"></span… | |
+<div class="line">void <strong>checkValues</strong>(void)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1ae2a1e6696686617f9cbe05b1a264212d"></span… | |
+<div class="line">void <strong>reportValues</strong>(void)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1a870787f68a947706aac1960e5cc1eda8"></span… | |
+<div class="line">void <strong>startTime</strong>(void)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1ab28a7813c5848d3b27e6f1ed5196d649"></span… | |
+<div class="line">void <strong>render</strong>(const int method = 1, const flo… | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1a5abc32b3691e7336e80cfab162d0a237"></span… | |
+<div class="line">void <strong>writePPM</strong>(const char * target)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1ad4e191a3aa8491ae04f1897ff1f24bde"></span… | |
+<div class="line">void <strong>porosity</strong>(const int z_slices = 10)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1ad686ac121d845e804515bcf7209b9f71"></span… | |
+<div class="line">Float3 <strong>minPos</strong>(void)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1ab6c76ee881de3d710fe1fdcb3ca46dfc"></span… | |
+<div class="line">Float3 <strong>maxPos</strong>(void)</div> | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1a9fa9b39cf7f038cc961337f9d4e162e5"></span… | |
+<div class="line">void <strong>findOverlaps</strong>(std::vector< std::vect… | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+<p id=""><span id="project0classDEM_1a0cb0fcf60594f664a9e593917c623767"></span… | |
+<div class="line">void <strong>forcechains</strong>(const std::string format =… | |
+</div> | |
+</p> | |
+<blockquote> | |
+<div><p></p> | |
+<p></p> | |
+</div></blockquote> | |
+</div></blockquote> | |
+</div></blockquote> | |
+</div> | |
+</div> | |
+ | |
+ | |
+ </div> | |
+ </div> | |
+ </div> | |
+ <div class="sphinxsidebar"> | |
+ <div class="sphinxsidebarwrapper"> | |
+ <h3><a href="index.html">Table Of Contents</a></h3> | |
+ <ul> | |
+<li><a class="reference internal" href="#">sphere internals</a><ul> | |
+<li><a class="reference internal" href="#numerical-algorithm">Numerical algori… | |
+<li><a class="reference internal" href="#c-reference">C++ reference</a></li> | |
+</ul> | |
+</li> | |
+</ul> | |
+ | |
+ <h4>Previous topic</h4> | |
+ <p class="topless"><a href="python_api.html" | |
+ title="previous chapter">Python API</a></p> | |
+ <h3>This Page</h3> | |
+ <ul class="this-page-menu"> | |
+ <li><a href="_sources/sphere_internals.txt" | |
+ rel="nofollow">Show Source</a></li> | |
+ </ul> | |
+<div id="searchbox" style="display: none"> | |
+ <h3>Quick search</h3> | |
+ <form class="search" action="search.html" method="get"> | |
+ <input type="text" name="q" /> | |
+ <input type="submit" value="Go" /> | |
+ <input type="hidden" name="check_keywords" value="yes" /> | |
+ <input type="hidden" name="area" value="default" /> | |
+ </form> | |
+ <p class="searchtip" style="font-size: 90%"> | |
+ Enter search terms or a module, class or function name. | |
+ </p> | |
+</div> | |
+<script type="text/javascript">$('#searchbox').show(0);</script> | |
+ </div> | |
+ </div> | |
+ <div class="clearer"></div> | |
+ </div> | |
+ <div class="related"> | |
+ <h3>Navigation</h3> | |
+ <ul> | |
+ <li class="right" style="margin-right: 10px"> | |
+ <a href="genindex.html" title="General Index" | |
+ >index</a></li> | |
+ <li class="right" > | |
+ <a href="py-modindex.html" title="Python Module Index" | |
+ >modules</a> |</li> | |
+ <li class="right" > | |
+ <a href="python_api.html" title="Python API" | |
+ >previous</a> |</li> | |
+ <li><a href="index.html">sphere 0.35 documentation</a> »</li> | |
+ </ul> | |
+ </div> | |
+ <div class="footer"> | |
+ © Copyright 2012, Anders Damsgaard. | |
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. | |
+ </div> | |
+ </body> | |
+</html> | |
+\ No newline at end of file | |
diff --git a/doc/latex/Makefile b/doc/latex/Makefile | |
t@@ -0,0 +1,66 @@ | |
+# Makefile for Sphinx LaTeX output | |
+ | |
+ALLDOCS = $(basename $(wildcard *.tex)) | |
+ALLPDF = $(addsuffix .pdf,$(ALLDOCS)) | |
+ALLDVI = $(addsuffix .dvi,$(ALLDOCS)) | |
+ | |
+# Prefix for archive names | |
+ARCHIVEPRREFIX = | |
+# Additional LaTeX options | |
+LATEXOPTS = | |
+ | |
+all: $(ALLPDF) | |
+all-pdf: $(ALLPDF) | |
+all-dvi: $(ALLDVI) | |
+all-ps: all-dvi | |
+ for f in *.dvi; do dvips $$f; done | |
+ | |
+all-pdf-ja: | |
+ for f in *.pdf *.png *.gif *.jpg *.jpeg; do ebb $$f; done | |
+ for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done | |
+ for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done | |
+ for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done | |
+ for f in *.idx; do mendex -U -f -d "`basename $$f .idx`.dic" -s python… | |
+ for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done | |
+ for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done | |
+ for f in *.dvi; do dvipdfmx $$f; done | |
+ | |
+zip: all-$(FMT) | |
+ mkdir $(ARCHIVEPREFIX)docs-$(FMT) | |
+ cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) | |
+ zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FM… | |
+ rm -r $(ARCHIVEPREFIX)docs-$(FMT) | |
+ | |
+tar: all-$(FMT) | |
+ mkdir $(ARCHIVEPREFIX)docs-$(FMT) | |
+ cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) | |
+ tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT) | |
+ rm -r $(ARCHIVEPREFIX)docs-$(FMT) | |
+ | |
+bz2: tar | |
+ bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar | |
+ | |
+# The number of LaTeX runs is quite conservative, but I don't expect it | |
+# to get run often, so the little extra time won't hurt. | |
+%.dvi: %.tex | |
+ latex $(LATEXOPTS) '$<' | |
+ latex $(LATEXOPTS) '$<' | |
+ latex $(LATEXOPTS) '$<' | |
+ -makeindex -s python.ist '$(basename $<).idx' | |
+ latex $(LATEXOPTS) '$<' | |
+ latex $(LATEXOPTS) '$<' | |
+ | |
+%.pdf: %.tex | |
+ pdflatex $(LATEXOPTS) '$<' | |
+ pdflatex $(LATEXOPTS) '$<' | |
+ pdflatex $(LATEXOPTS) '$<' | |
+ -makeindex -s python.ist '$(basename $<).idx' | |
+ pdflatex $(LATEXOPTS) '$<' | |
+ pdflatex $(LATEXOPTS) '$<' | |
+ | |
+clean: | |
+ rm -f *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla | |
+ | |
+.PHONY: all all-pdf all-dvi all-ps clean | |
+.PHONY: all-pdf-ja | |
+ | |
diff --git a/doc/latex/fncychap.sty b/doc/latex/fncychap.sty | |
t@@ -0,0 +1,683 @@ | |
+%%% Copyright Ulf A. Lindgren | |
+%%% | |
+%%% Note Premission is granted to modify this file under | |
+%%% the condition that it is saved using another | |
+%%% file and package name. | |
+%%% | |
+%%% Revision 1.1 (1997) | |
+%%% | |
+%%% Jan. 8th Modified package name base date option | |
+%%% Jan. 22th Modified FmN and FmTi for error in book.cls | |
+%%% \MakeUppercase{#}->{\MakeUppercase#} | |
+%%% Apr. 6th Modified Lenny option to prevent undesired | |
+%%% skip of line. | |
+%%% Nov. 8th Fixed \@chapapp for AMS | |
+%%% | |
+%%% Revision 1.2 (1998) | |
+%%% | |
+%%% Feb. 11th Fixed appendix problem related to Bjarne | |
+%%% Aug. 11th Fixed problem related to 11pt and 12pt | |
+%%% suggested by Tomas Lundberg. THANKS! | |
+%%% | |
+%%% Revision 1.3 (2004) | |
+%%% Sep. 20th problem with frontmatter, mainmatter and | |
+%%% backmatter, pointed out by Lapo Mori | |
+%%% | |
+%%% Revision 1.31 (2004) | |
+%%% Sep. 21th problem with the Rejne definition streched text | |
+%%% caused ugly gaps in the vrule aligned with the title | |
+%%% text. Kindly pointed out to me by Hendri Adriaens | |
+%%% | |
+%%% Revision 1.32 (2005) | |
+%%% Jun. 23th compatibility problem with the KOMA class 'scrbook.c… | |
+%%% a remedy is a redefinition of '\@schapter' in | |
+%%% line with that used in KOMA. The problem was pointed | |
+%%% out to me by Mikkel Holm Olsen | |
+%%% | |
+%%% Revision 1.33 (2005) | |
+%%% Aug. 9th misspelled ``TWELV'' corrected, the error was pointed | |
+%%% out to me by George Pearson | |
+%%% | |
+%%% Revision 1.34 (2007) | |
+%%% Added an alternative to Lenny provided by Peter | |
+%%% Osborne (2005-11-28) | |
+%%% Corrected front, main and back matter, based on input | |
+%%% from Bas van Gils (2006-04-24) | |
+%%% Jul. 30th Added Bjornstrup option provided by Jean-Marc | |
+%%% Francois (2007-01-05). | |
+%%% Reverted to \MakeUppercase{#} see rev 1.1, solved | |
+%%% problem with MakeUppercase and MakeLowercase pointed | |
+%%% out by Marco Feuerstein (2007-06-06) | |
+ | |
+ | |
+%%% Last modified Jul. 2007 | |
+ | |
+\NeedsTeXFormat{LaTeX2e}[1995/12/01] | |
+\ProvidesPackage{fncychap} | |
+ [2007/07/30 v1.34 | |
+ LaTeX package (Revised chapters)] | |
+ | |
+%%%% For conditional inclusion of color | |
+\newif\ifusecolor | |
+\usecolorfalse | |
+ | |
+ | |
+ | |
+%%%% DEFINITION OF Chapapp variables | |
+\newcommand{\CNV}{\huge\bfseries} | |
+\newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}} | |
+ | |
+ | |
+%%%% DEFINITION OF TheChapter variables | |
+\newcommand{\CNoV}{\huge\bfseries} | |
+\newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}} | |
+ | |
+\newif\ifUCN | |
+\UCNfalse | |
+\newif\ifLCN | |
+\LCNfalse | |
+\def\ChNameLowerCase{\LCNtrue\UCNfalse} | |
+\def\ChNameUpperCase{\UCNtrue\LCNfalse} | |
+\def\ChNameAsIs{\UCNfalse\LCNfalse} | |
+ | |
+%%%%% Fix for AMSBook 971008 | |
+ | |
+\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{} | |
+ | |
+ | |
+%%%%% Fix for Bjarne and appendix 980211 | |
+ | |
+\newif\ifinapp | |
+\inappfalse | |
+\renewcommand\appendix{\par | |
+ \setcounter{chapter}{0}% | |
+ \setcounter{section}{0}% | |
+ \inapptrue% | |
+ \renewcommand\@chapapp{\appendixname}% | |
+ \renewcommand\thechapter{\@Alph\c@chapter}} | |
+ | |
+%%%%% Fix for frontmatter, mainmatter, and backmatter 040920 | |
+ | |
+\@ifundefined{@mainmatter}{\newif\if@mainmatter \@mainmattertrue}{} | |
+ | |
+%%%%% | |
+ | |
+ | |
+ | |
+\newcommand{\FmN}[1]{% | |
+\ifUCN | |
+ {\MakeUppercase{#1}}\LCNfalse | |
+\else | |
+ \ifLCN | |
+ {\MakeLowercase{#1}}\UCNfalse | |
+ \else #1 | |
+ \fi | |
+\fi} | |
+ | |
+ | |
+%%%% DEFINITION OF Title variables | |
+\newcommand{\CTV}{\Huge\bfseries} | |
+\newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}} | |
+ | |
+%%%% DEFINITION OF the basic rule width | |
+\newlength{\RW} | |
+\setlength{\RW}{1pt} | |
+\newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}} | |
+ | |
+\newif\ifUCT | |
+\UCTfalse | |
+\newif\ifLCT | |
+\LCTfalse | |
+\def\ChTitleLowerCase{\LCTtrue\UCTfalse} | |
+\def\ChTitleUpperCase{\UCTtrue\LCTfalse} | |
+\def\ChTitleAsIs{\UCTfalse\LCTfalse} | |
+\newcommand{\FmTi}[1]{% | |
+\ifUCT | |
+ {\MakeUppercase{#1}}\LCTfalse | |
+\else | |
+ \ifLCT | |
+ {\MakeLowercase{#1}}\UCTfalse | |
+ \else {#1} | |
+ \fi | |
+\fi} | |
+ | |
+ | |
+ | |
+\newlength{\mylen} | |
+\newlength{\myhi} | |
+\newlength{\px} | |
+\newlength{\py} | |
+\newlength{\pyy} | |
+\newlength{\pxx} | |
+ | |
+ | |
+\def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@} | |
+ | |
+\newcommand{\DOCH}{% | |
+ \CNV\FmN{\@chapapp}\space \CNoV\thechapter | |
+ \par\nobreak | |
+ \vskip 20\p@ | |
+ } | |
+\newcommand{\DOTI}[1]{% | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@ | |
+ } | |
+\newcommand{\DOTIS}[1]{% | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@ | |
+ } | |
+ | |
+%%%%%% SONNY DEF | |
+ | |
+\DeclareOption{Sonny}{% | |
+ \ChNameVar{\Large\sf} | |
+ \ChNumVar{\Huge} | |
+ \ChTitleVar{\Large\sf} | |
+ \ChRuleWidth{0.5pt} | |
+ \ChNameUpperCase | |
+ \renewcommand{\DOCH}{% | |
+ \raggedleft | |
+ \CNV\FmN{\@chapapp}\space \CNoV\thechapter | |
+ \par\nobreak | |
+ \vskip 40\p@} | |
+ \renewcommand{\DOTI}[1]{% | |
+ \CTV\raggedleft\mghrulefill{\RW}\par\nobreak | |
+ \vskip 5\p@ | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \mghrulefill{\RW}\par\nobreak | |
+ \vskip 40\p@} | |
+ \renewcommand{\DOTIS}[1]{% | |
+ \CTV\raggedleft\mghrulefill{\RW}\par\nobreak | |
+ \vskip 5\p@ | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \mghrulefill{\RW}\par\nobreak | |
+ \vskip 40\p@} | |
+} | |
+ | |
+%%%%%% LENNY DEF | |
+ | |
+\DeclareOption{Lenny}{% | |
+ | |
+ \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont} | |
+ \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont} | |
+ \ChTitleVar{\Huge\bfseries\rm} | |
+ \ChRuleWidth{1pt} | |
+ \renewcommand{\DOCH}{% | |
+ \settowidth{\px}{\CNV\FmN{\@chapapp}} | |
+ \addtolength{\px}{2pt} | |
+ \settoheight{\py}{\CNV\FmN{\@chapapp}} | |
+ \addtolength{\py}{1pt} | |
+ | |
+ \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter} | |
+ \addtolength{\mylen}{1pt} | |
+ \settowidth{\pxx}{\CNoV\thechapter} | |
+ \addtolength{\pxx}{-1pt} | |
+ | |
+ \settoheight{\pyy}{\CNoV\thechapter} | |
+ \addtolength{\pyy}{-2pt} | |
+ \setlength{\myhi}{\pyy} | |
+ \addtolength{\myhi}{-1\py} | |
+ \par | |
+ \parbox[b]{\textwidth}{% | |
+ \rule[\py]{\RW}{\myhi}% | |
+ \hskip -\RW% | |
+ \rule[\pyy]{\px}{\RW}% | |
+ \hskip -\px% | |
+ \raggedright% | |
+ \CNV\FmN{\@chapapp}\space\CNoV\thechapter% | |
+ \hskip1pt% | |
+ \mghrulefill{\RW}% | |
+ \rule{\RW}{\pyy}\par\nobreak% | |
+ \vskip -\baselineskip% | |
+ \vskip -\pyy% | |
+ \hskip \mylen% | |
+ \mghrulefill{\RW}\par\nobreak% | |
+ \vskip \pyy}% | |
+ \vskip 20\p@} | |
+ | |
+ | |
+ \renewcommand{\DOTI}[1]{% | |
+ \raggedright | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@} | |
+ | |
+ \renewcommand{\DOTIS}[1]{% | |
+ \raggedright | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@} | |
+ } | |
+ | |
+%%%%%% Peter Osbornes' version of LENNY DEF | |
+ | |
+\DeclareOption{PetersLenny}{% | |
+ | |
+% five new lengths | |
+\newlength{\bl} % bottom left : orig \space | |
+\setlength{\bl}{6pt} | |
+\newcommand{\BL}[1]{\setlength{\bl}{#1}} | |
+\newlength{\br} % bottom right : orig 1pt | |
+\setlength{\br}{1pt} | |
+\newcommand{\BR}[1]{\setlength{\br}{#1}} | |
+\newlength{\tl} % top left : orig 2pt | |
+\setlength{\tl}{2pt} | |
+\newcommand{\TL}[1]{\setlength{\tl}{#1}} | |
+\newlength{\trr} % top right :orig 1pt | |
+\setlength{\trr}{1pt} | |
+\newcommand{\TR}[1]{\setlength{\trr}{#1}} | |
+\newlength{\blrule} % top right :orig 1pt | |
+\setlength{\trr}{0pt} | |
+\newcommand{\BLrule}[1]{\setlength{\blrule}{#1}} | |
+ | |
+ | |
+ \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont} | |
+ \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont} | |
+ \ChTitleVar{\Huge\bfseries\rm} | |
+ \ChRuleWidth{1pt} | |
+\renewcommand{\DOCH}{% | |
+ | |
+ | |
+%%%%%%% tweaks for 1--9 and A--Z | |
+\ifcase\c@chapter\relax% | |
+\or\BL{-3pt}\TL{-4pt}\BR{0pt}\TR{-6pt}%1 | |
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%2 | |
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%3 | |
+\or\BL{0pt}\TL{5pt}\BR{2pt}\TR{-4pt}%4 | |
+\or\BL{0pt}\TL{3pt}\BR{2pt}\TR{-4pt}%5 | |
+\or\BL{-1pt}\TL{0pt}\BR{2pt}\TR{-2pt}%6 | |
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%7 | |
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%8 | |
+\or\BL{0pt}\TL{-3pt}\BR{-4pt}\TR{-2pt}%9 | |
+\or\BL{-3pt}\TL{-3pt}\BR{2pt}\TR{-7pt}%10 | |
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%11 | |
+\or\BL{-6pt}\TL{-6pt}\BR{2pt}\TR{-7pt}%12 | |
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%13 | |
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%14 | |
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%15 | |
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%16 | |
+\or\BL{-5pt}\TL{-3pt}\BR{-8pt}\TR{-6pt}%17 | |
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%18 | |
+\or\BL{-3pt}\TL{-3pt}\BR{-6pt}\TR{-9pt}%19 | |
+\or\BL{0pt}\TL{0pt}\BR{0pt}\TR{-5pt}%20 | |
+\fi | |
+ | |
+\ifinapp\ifcase\c@chapter\relax% | |
+\or\BL{0pt}\TL{14pt}\BR{5pt}\TR{-19pt}%A | |
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}%B | |
+\or\BL{-3pt}\TL{-2pt}\BR{1pt}\TR{-6pt}\BLrule{0pt}%C | |
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}\BLrule{0pt}%D | |
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-3pt}%E | |
+\or\BL{0pt}\TL{-5pt}\BR{-10pt}\TR{-1pt}%F | |
+\or\BL{-3pt}\TL{0pt}\BR{0pt}\TR{-7pt}%G | |
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%H | |
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%I | |
+\or\BL{2pt}\TL{0pt}\BR{-3pt}\TR{1pt}%J | |
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%K | |
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-19pt}%L | |
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%M | |
+\or\BL{0pt}\TL{-5pt}\BR{-2pt}\TR{-1pt}%N | |
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%O | |
+\or\BL{0pt}\TL{-5pt}\BR{-9pt}\TR{-3pt}%P | |
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%Q | |
+\or\BL{0pt}\TL{-5pt}\BR{4pt}\TR{-8pt}%R | |
+\or\BL{-2pt}\TL{-2pt}\BR{-2pt}\TR{-7pt}%S | |
+\or\BL{-3pt}\TL{0pt}\BR{-5pt}\TR{4pt}\BLrule{8pt}%T | |
+\or\BL{-7pt}\TL{-11pt}\BR{-5pt}\TR{-7pt}\BLrule{0pt}%U | |
+\or\BL{-14pt}\TL{-5pt}\BR{-14pt}\TR{-1pt}\BLrule{14pt}%V | |
+\or\BL{-10pt}\TL{-9pt}\BR{-13pt}\TR{-3pt}\BLrule{7pt}%W | |
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%X | |
+\or\BL{-6pt}\TL{-4pt}\BR{-7pt}\TR{1pt}\BLrule{7pt}%Y | |
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%Z | |
+\fi\fi | |
+%%%%%%% | |
+ \settowidth{\px}{\CNV\FmN{\@chapapp}} | |
+ \addtolength{\px}{\tl} %MOD change 2pt to \tl | |
+ \settoheight{\py}{\CNV\FmN{\@chapapp}} | |
+ \addtolength{\py}{1pt} | |
+ | |
+ \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter} | |
+ \addtolength{\mylen}{\trr}% MOD change 1pt to \tr | |
+ \settowidth{\pxx}{\CNoV\thechapter} | |
+ \addtolength{\pxx}{-1pt} | |
+ | |
+ \settoheight{\pyy}{\CNoV\thechapter} | |
+ \addtolength{\pyy}{-2pt} | |
+ \setlength{\myhi}{\pyy} | |
+ \addtolength{\myhi}{-1\py} | |
+ \par | |
+ \parbox[b]{\textwidth}{% | |
+ \rule[\py]{\RW}{\myhi}% | |
+ \hskip -\RW% | |
+ \rule[\pyy]{\px}{\RW}% | |
+ \hskip -\px% | |
+ \raggedright% | |
+ \CNV\FmN{\@chapapp}\rule{\blrule}{\RW}\hskip\bl\CNoV\thechapter%MOD | |
+% \CNV\FmN{\@chapapp}\space\CNoV\thechapter %ORIGINAL | |
+ \hskip\br% %MOD 1pt to \br | |
+ \mghrulefill{\RW}% | |
+ \rule{\RW}{\pyy}\par\nobreak% | |
+ \vskip -\baselineskip% | |
+ \vskip -\pyy% | |
+ \hskip \mylen% | |
+ \mghrulefill{\RW}\par\nobreak% | |
+ \vskip \pyy}% | |
+ \vskip 20\p@} | |
+ | |
+ | |
+ \renewcommand{\DOTI}[1]{% | |
+ \raggedright | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@} | |
+ | |
+ \renewcommand{\DOTIS}[1]{% | |
+ \raggedright | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@} | |
+ } | |
+ | |
+ | |
+% | |
+ | |
+ | |
+%%%%%% BJORNSTRUP DEF | |
+ | |
+\DeclareOption{Bjornstrup}{% | |
+ \usecolortrue | |
+ % pzc (Zapf Chancelery) is nice. ppl (Palatino) is cool too. | |
+ \ChNumVar{\fontsize{76}{80}\usefont{OT1}{pzc}{m}{n}\selectfont} | |
+ \ChTitleVar{\raggedleft\Large\sffamily\bfseries} | |
+ | |
+ \setlength{\myhi}{10pt} % Space between grey box border and text | |
+ \setlength{\mylen}{\textwidth} | |
+ \addtolength{\mylen}{-2\myhi} | |
+ \renewcommand{\DOCH}{% | |
+ \settowidth{\py}{\CNoV\thechapter} | |
+ \addtolength{\py}{-10pt} % Amount of space by which the | |
+% % number is shifted right | |
+ \fboxsep=0pt% | |
+ \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}% | |
+ \kern-\py\raise20pt% | |
+ \hbox{\color[gray]{.5}\CNoV\thechapter}\\% | |
+ } | |
+ | |
+ \renewcommand{\DOTI}[1]{% | |
+ \nointerlineskip\raggedright% | |
+ \fboxsep=\myhi% | |
+ \vskip-1ex% | |
+ \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak% | |
+ \vskip 40\p@% | |
+ } | |
+ | |
+ \renewcommand{\DOTIS}[1]{% | |
+ \fboxsep=0pt | |
+ \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}\\% | |
+ \nointerlineskip\raggedright% | |
+ \fboxsep=\myhi% | |
+ \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak% | |
+ \vskip 40\p@% | |
+ } | |
+} | |
+ | |
+ | |
+%%%%%%% GLENN DEF | |
+ | |
+ | |
+\DeclareOption{Glenn}{% | |
+ \ChNameVar{\bfseries\Large\sf} | |
+ \ChNumVar{\Huge} | |
+ \ChTitleVar{\bfseries\Large\rm} | |
+ \ChRuleWidth{1pt} | |
+ \ChNameUpperCase | |
+ \ChTitleUpperCase | |
+ \renewcommand{\DOCH}{% | |
+ \settoheight{\myhi}{\CTV\FmTi{Test}} | |
+ \setlength{\py}{\baselineskip} | |
+ \addtolength{\py}{\RW} | |
+ \addtolength{\py}{\myhi} | |
+ \setlength{\pyy}{\py} | |
+ \addtolength{\pyy}{-1\RW} | |
+ | |
+ \raggedright | |
+ \CNV\FmN{\@chapapp}\space\CNoV\thechapter | |
+ \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak} | |
+ | |
+ \renewcommand{\DOTI}[1]{% | |
+ \addtolength{\pyy}{-4pt} | |
+ \settoheight{\myhi}{\CTV\FmTi{#1}} | |
+ \addtolength{\myhi}{\py} | |
+ \addtolength{\myhi}{-1\RW} | |
+ \vskip -1\pyy | |
+ \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt | |
+ \raggedleft\CTV\FmTi{#1}\par\nobreak | |
+ \vskip 80\p@} | |
+ | |
+\newlength{\backskip} | |
+ \renewcommand{\DOTIS}[1]{% | |
+% \setlength{\py}{10pt} | |
+% \setlength{\pyy}{\py} | |
+% \addtolength{\pyy}{\RW} | |
+% \setlength{\myhi}{\baselineskip} | |
+% \addtolength{\myhi}{\pyy} | |
+% \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak | |
+% \addtolength{}{} | |
+%\vskip -1\baselineskip | |
+% \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt | |
+% \raggedleft\CTV\FmTi{#1}\par\nobreak | |
+% \vskip 60\p@} | |
+%% Fix suggested by Tomas Lundberg | |
+ \setlength{\py}{25pt} % eller vad man vill | |
+ \setlength{\pyy}{\py} | |
+ \setlength{\backskip}{\py} | |
+ \addtolength{\backskip}{2pt} | |
+ \addtolength{\pyy}{\RW} | |
+ \setlength{\myhi}{\baselineskip} | |
+ \addtolength{\myhi}{\pyy} | |
+ \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak | |
+ \vskip -1\backskip | |
+ \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 3pt % | |
+ \raggedleft\CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@} | |
+ } | |
+ | |
+%%%%%%% CONNY DEF | |
+ | |
+\DeclareOption{Conny}{% | |
+ \ChNameUpperCase | |
+ \ChTitleUpperCase | |
+ \ChNameVar{\centering\Huge\rm\bfseries} | |
+ \ChNumVar{\Huge} | |
+ \ChTitleVar{\centering\Huge\rm} | |
+ \ChRuleWidth{2pt} | |
+ | |
+ \renewcommand{\DOCH}{% | |
+ \mghrulefill{3\RW}\par\nobreak | |
+ \vskip -0.5\baselineskip | |
+ \mghrulefill{\RW}\par\nobreak | |
+ \CNV\FmN{\@chapapp}\space \CNoV\thechapter | |
+ \par\nobreak | |
+ \vskip -0.5\baselineskip | |
+ } | |
+ \renewcommand{\DOTI}[1]{% | |
+ \mghrulefill{\RW}\par\nobreak | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 60\p@ | |
+ } | |
+ \renewcommand{\DOTIS}[1]{% | |
+ \mghrulefill{\RW}\par\nobreak | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 60\p@ | |
+ } | |
+ } | |
+ | |
+%%%%%%% REJNE DEF | |
+ | |
+\DeclareOption{Rejne}{% | |
+ | |
+ \ChNameUpperCase | |
+ \ChTitleUpperCase | |
+ \ChNameVar{\centering\Large\rm} | |
+ \ChNumVar{\Huge} | |
+ \ChTitleVar{\centering\Huge\rm} | |
+ \ChRuleWidth{1pt} | |
+ \renewcommand{\DOCH}{% | |
+ \settoheight{\py}{\CNoV\thechapter} | |
+ \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31 | |
+ \addtolength{\py}{-1pt} | |
+ \CNV\FmN{\@chapapp}\par\nobreak | |
+ \vskip 20\p@ | |
+ \setlength{\myhi}{2\baselineskip} | |
+ \setlength{\px}{\myhi} | |
+ \addtolength{\px}{-1\RW} | |
+ \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip | |
+ 10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip 10pt\mghrulefill{\RW}\rule[… | |
+ \vskip -3\p@% Added -2pt vskip to correct for streched text v1.31 | |
+ } | |
+ \renewcommand{\DOTI}[1]{% | |
+ \setlength{\mylen}{\textwidth} | |
+ \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31 | |
+ \addtolength{\mylen}{-2\RW} | |
+ {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule width\RW}\par\nobre… | |
+ \vskip -3pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselin… | |
+ \vskip 60\p@% Added -2pt in vskip to correct for streched text v1.31 | |
+ } | |
+ \renewcommand{\DOTIS}[1]{% | |
+ \setlength{\py}{\fboxrule} | |
+ \setlength{\fboxrule}{\RW} | |
+ \setlength{\mylen}{\textwidth} | |
+ \addtolength{\mylen}{-2\RW} | |
+ \fbox{\parbox{\mylen}{\vskip 2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip… | |
+ \setlength{\fboxrule}{\py} | |
+ \vskip 60\p@ | |
+ } | |
+ } | |
+ | |
+ | |
+%%%%%%% BJARNE DEF | |
+ | |
+\DeclareOption{Bjarne}{% | |
+ \ChNameUpperCase | |
+ \ChTitleUpperCase | |
+ \ChNameVar{\raggedleft\normalsize\rm} | |
+ \ChNumVar{\raggedleft \bfseries\Large} | |
+ \ChTitleVar{\raggedleft \Large\rm} | |
+ \ChRuleWidth{1pt} | |
+ | |
+ | |
+%% Note thechapter -> c@chapter fix appendix bug | |
+%% Fixed misspelled 12 | |
+ | |
+ \newcounter{AlphaCnt} | |
+ \newcounter{AlphaDecCnt} | |
+ \newcommand{\AlphaNo}{% | |
+ \ifcase\number\theAlphaCnt | |
+ \ifnum\c@chapter=0 | |
+ ZERO\else{}\fi | |
+ \or ONE\or TWO\or THREE\or FOUR\or FIVE | |
+ \or SIX\or SEVEN\or EIGHT\or NINE\or TEN | |
+ \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN | |
+ \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi | |
+} | |
+ | |
+ \newcommand{\AlphaDecNo}{% | |
+ \setcounter{AlphaDecCnt}{0} | |
+ \@whilenum\number\theAlphaCnt>0\do | |
+ {\addtocounter{AlphaCnt}{-10} | |
+ \addtocounter{AlphaDecCnt}{1}} | |
+ \ifnum\number\theAlphaCnt=0 | |
+ \else | |
+ \addtocounter{AlphaDecCnt}{-1} | |
+ \addtocounter{AlphaCnt}{10} | |
+ \fi | |
+ | |
+ | |
+ \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or | |
+ FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi | |
+ } | |
+ \newcommand{\TheAlphaChapter}{% | |
+ | |
+ \ifinapp | |
+ \thechapter | |
+ \else | |
+ \setcounter{AlphaCnt}{\c@chapter} | |
+ \ifnum\c@chapter<20 | |
+ \AlphaNo | |
+ \else | |
+ \AlphaDecNo\AlphaNo | |
+ \fi | |
+ \fi | |
+ } | |
+ \renewcommand{\DOCH}{% | |
+ \mghrulefill{\RW}\par\nobreak | |
+ \CNV\FmN{\@chapapp}\par\nobreak | |
+ \CNoV\TheAlphaChapter\par\nobreak | |
+ \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak | |
+ \vskip 20\p@ | |
+ } | |
+ \renewcommand{\DOTI}[1]{% | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@ | |
+ } | |
+ \renewcommand{\DOTIS}[1]{% | |
+ \CTV\FmTi{#1}\par\nobreak | |
+ \vskip 40\p@ | |
+ } | |
+} | |
+ | |
+\DeclareOption*{% | |
+ \PackageWarning{fancychapter}{unknown style option} | |
+ } | |
+ | |
+\ProcessOptions* \relax | |
+ | |
+\ifusecolor | |
+ \RequirePackage{color} | |
+\fi | |
+\def\@makechapterhead#1{% | |
+ \vspace*{50\p@}% | |
+ {\parindent \z@ \raggedright \normalfont | |
+ \ifnum \c@secnumdepth >\m@ne | |
+ \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 0409… | |
+ \DOCH | |
+ \fi | |
+ \fi | |
+ \interlinepenalty\@M | |
+ \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 060424 | |
+ \DOTI{#1}% | |
+ \else% | |
+ \DOTIS{#1}% | |
+ \fi | |
+ }} | |
+ | |
+ | |
+%%% Begin: To avoid problem with scrbook.cls (fncychap version 1.32) | |
+ | |
+%%OUT: | |
+%\def\@schapter#1{\if@twocolumn | |
+% \@topnewpage[\@makeschapterhead{#1}]% | |
+% \else | |
+% \@makeschapterhead{#1}% | |
+% \@afterheading | |
+% \fi} | |
+ | |
+%%IN: | |
+\def\@schapter#1{% | |
+\if@twocolumn% | |
+ \@makeschapterhead{#1}% | |
+\else% | |
+ \@makeschapterhead{#1}% | |
+ \@afterheading% | |
+\fi} | |
+ | |
+%%% End: To avoid problem with scrbook.cls (fncychap version 1.32) | |
+ | |
+\def\@makeschapterhead#1{% | |
+ \vspace*{50\p@}% | |
+ {\parindent \z@ \raggedright | |
+ \normalfont | |
+ \interlinepenalty\@M | |
+ \DOTIS{#1} | |
+ \vskip 40\p@ | |
+ }} | |
+ | |
+\endinput | |
+ | |
+ | |
diff --git a/doc/latex/python.ist b/doc/latex/python.ist | |
t@@ -0,0 +1,11 @@ | |
+line_max 100 | |
+headings_flag 1 | |
+heading_prefix " \\bigletter " | |
+ | |
+preamble "\\begin{theindex} | |
+\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}} | |
+ | |
+" | |
+ | |
+symhead_positive "{Symbols}" | |
+numhead_positive "{Numbers}" | |
diff --git a/doc/latex/sphere.aux b/doc/latex/sphere.aux | |
t@@ -0,0 +1,124 @@ | |
+\relax | |
+\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} | |
+\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined | |
+\global\let\oldcontentsline\contentsline | |
+\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} | |
+\global\let\oldnewlabel\newlabel | |
+\gdef\newlabel#1#2{\newlabelxx{#1}#2} | |
+\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} | |
+\AtEndDocument{\ifx\hyper@anchor\@undefined | |
+\let\contentsline\oldcontentsline | |
+\let\newlabel\oldnewlabel | |
+\fi} | |
+\fi} | |
+\global\let\hyper@last\relax | |
+\gdef\HyperFirstAtBeginDocument#1{#1} | |
+\providecommand\HyField@AuxAddToFields[1]{} | |
+\select@language{english} | |
+\@writefile{toc}{\select@language{english}} | |
+\@writefile{lof}{\select@language{english}} | |
+\@writefile{lot}{\select@language{english}} | |
+\newlabel{index::doc}{{}{1}{\relax }{section*.2}{}} | |
+\@writefile{toc}{\contentsline {chapter}{\numberline {1}Introduction}{3}{chapt… | |
+\@writefile{lof}{\addvspace {10\p@ }} | |
+\@writefile{lot}{\addvspace {10\p@ }} | |
+\newlabel{introduction:welcome-to-sphere-s-documentation}{{1}{3}{Introduction\… | |
+\newlabel{introduction:introduction}{{1}{3}{Introduction\relax }{chapter.1}{}} | |
+\newlabel{introduction::doc}{{1}{3}{Introduction\relax }{chapter.1}{}} | |
+\@writefile{toc}{\contentsline {section}{\numberline {1.1}Requirements}{3}{sec… | |
+\newlabel{introduction:requirements}{{1.1}{3}{Requirements\relax }{section.1.1… | |
+\@writefile{toc}{\contentsline {section}{\numberline {1.2}Building \emph {sph… | |
+\newlabel{introduction:building-sphere}{{1.2}{4}{Building \emph {sphere}\relax… | |
+\@writefile{toc}{\contentsline {section}{\numberline {1.3}Work flow}{4}{sectio… | |
+\newlabel{introduction:work-flow}{{1.3}{4}{Work flow\relax }{section.1.3}{}} | |
+\@writefile{toc}{\contentsline {chapter}{\numberline {2}Discrete element metho… | |
+\@writefile{lof}{\addvspace {10\p@ }} | |
+\@writefile{lot}{\addvspace {10\p@ }} | |
+\newlabel{dem::doc}{{2}{7}{Discrete element method\relax }{chapter.2}{}} | |
+\newlabel{dem:discrete-element-method}{{2}{7}{Discrete element method\relax }{… | |
+\@writefile{toc}{\contentsline {chapter}{\numberline {3}Python API}{9}{chapter… | |
+\@writefile{lof}{\addvspace {10\p@ }} | |
+\@writefile{lot}{\addvspace {10\p@ }} | |
+\newlabel{python_api:module-sphere}{{3}{9}{Python API\relax }{chapter.3}{}} | |
+\newlabel{python_api::doc}{{3}{9}{Python API\relax }{chapter.3}{}} | |
+\newlabel{python_api:python-api}{{3}{9}{Python API\relax }{chapter.3}{}} | |
+\newlabel{python_api:sphere.Spherebin}{{3}{9}{Python API\relax }{section*.3}{}} | |
+\newlabel{python_api:sphere.Spherebin.adjustUpperWall}{{3}{9}{Python API\relax… | |
+\newlabel{python_api:sphere.Spherebin.bond}{{3}{9}{Python API\relax }{section*… | |
+\newlabel{python_api:sphere.Spherebin.bulkPorosity}{{3}{9}{Python API\relax }{… | |
+\newlabel{python_api:sphere.Spherebin.consolidate}{{3}{9}{Python API\relax }{s… | |
+\newlabel{python_api:sphere.Spherebin.defaultParams}{{3}{9}{Python API\relax }… | |
+\newlabel{python_api:sphere.Spherebin.energy}{{3}{9}{Python API\relax }{sectio… | |
+\newlabel{python_api:sphere.Spherebin.generateRadii}{{3}{9}{Python API\relax }… | |
+\newlabel{python_api:sphere.Spherebin.initGrid}{{3}{9}{Python API\relax }{sect… | |
+\newlabel{python_api:sphere.Spherebin.initGridAndWorldsize}{{3}{9}{Python API\… | |
+\newlabel{python_api:sphere.Spherebin.initGridPos}{{3}{9}{Python API\relax }{s… | |
+\newlabel{python_api:sphere.Spherebin.initRandomGridPos}{{3}{9}{Python API\rel… | |
+\newlabel{python_api:sphere.Spherebin.initRandomPos}{{3}{9}{Python API\relax }… | |
+\newlabel{python_api:sphere.Spherebin.initTemporal}{{3}{10}{Python API\relax }… | |
+\newlabel{python_api:sphere.Spherebin.porosity}{{3}{10}{Python API\relax }{sec… | |
+\newlabel{python_api:sphere.Spherebin.readbin}{{3}{10}{Python API\relax }{sect… | |
+\newlabel{python_api:sphere.Spherebin.render}{{3}{10}{Python API\relax }{secti… | |
+\newlabel{python_api:sphere.Spherebin.run}{{3}{10}{Python API\relax }{section*… | |
+\newlabel{python_api:sphere.Spherebin.shear}{{3}{10}{Python API\relax }{sectio… | |
+\newlabel{python_api:sphere.Spherebin.shearstrain}{{3}{10}{Python API\relax }{… | |
+\newlabel{python_api:sphere.Spherebin.shearvel}{{3}{10}{Python API\relax }{sec… | |
+\newlabel{python_api:sphere.Spherebin.thinsection_x1x3}{{3}{10}{Python API\rel… | |
+\newlabel{python_api:sphere.Spherebin.torqueScript}{{3}{10}{Python API\relax }… | |
+\newlabel{python_api:sphere.Spherebin.uniaxialStrainRate}{{3}{10}{Python API\r… | |
+\newlabel{python_api:sphere.Spherebin.voidRatio}{{3}{10}{Python API\relax }{se… | |
+\newlabel{python_api:sphere.Spherebin.writebin}{{3}{10}{Python API\relax }{sec… | |
+\newlabel{python_api:sphere.Spherebin.zeroKinematics}{{3}{10}{Python API\relax… | |
+\newlabel{python_api:sphere.V_sphere}{{3}{10}{Python API\relax }{section*.30}{… | |
+\newlabel{python_api:sphere.convert}{{3}{10}{Python API\relax }{section*.31}{}} | |
+\newlabel{python_api:sphere.render}{{3}{11}{Python API\relax }{section*.32}{}} | |
+\newlabel{python_api:sphere.run}{{3}{11}{Python API\relax }{section*.33}{}} | |
+\newlabel{python_api:sphere.status}{{3}{11}{Python API\relax }{section*.34}{}} | |
+\newlabel{python_api:sphere.thinsectionVideo}{{3}{11}{Python API\relax }{secti… | |
+\newlabel{python_api:sphere.video}{{3}{11}{Python API\relax }{section*.36}{}} | |
+\newlabel{python_api:sphere.visualize}{{3}{11}{Python API\relax }{section*.37}… | |
+\@writefile{toc}{\contentsline {chapter}{\numberline {4}sphere internals}{13}{… | |
+\@writefile{lof}{\addvspace {10\p@ }} | |
+\@writefile{lot}{\addvspace {10\p@ }} | |
+\newlabel{sphere_internals:sphere-internals}{{4}{13}{sphere internals\relax }{… | |
+\newlabel{sphere_internals::doc}{{4}{13}{sphere internals\relax }{chapter.4}{}} | |
+\@writefile{toc}{\contentsline {section}{\numberline {4.1}Numerical algorithm}… | |
+\newlabel{sphere_internals:numerical-algorithm}{{4.1}{14}{Numerical algorithm\… | |
+\@writefile{toc}{\contentsline {section}{\numberline {4.2}C++ reference}{16}{s… | |
+\newlabel{sphere_internals:c-reference}{{4.2}{16}{C++ reference\relax }{sectio… | |
+\newlabel{sphere_internals:project0classDEM}{{4.2}{16}{C++ reference\relax }{s… | |
+\newlabel{sphere_internals:project0classDEM}{{4.2}{16}{C++ reference\relax }{s… | |
+\newlabel{sphere_internals:project0classDEM_1a3cd6355aefc172c712f1c91f4ffc36f2… | |
+\newlabel{sphere_internals:project0classDEM_1a3cd6355aefc172c712f1c91f4ffc36f2… | |
+\newlabel{sphere_internals:project0classDEM_1aa3066aa501f982c2df51f58fb5a91148… | |
+\newlabel{sphere_internals:project0classDEM_1aa3066aa501f982c2df51f58fb5a91148… | |
+\newlabel{sphere_internals:project0classDEM_1ac32ef9094b25ee9c35e30f4488491fe2… | |
+\newlabel{sphere_internals:project0classDEM_1ac32ef9094b25ee9c35e30f4488491fe2… | |
+\newlabel{sphere_internals:project0classDEM_1a242634f10a9bc1f19e4eb46b7168f288… | |
+\newlabel{sphere_internals:project0classDEM_1a242634f10a9bc1f19e4eb46b7168f288… | |
+\newlabel{sphere_internals:project0classDEM_1a101aafa4f3197948fafbb1500e58f0f5… | |
+\newlabel{sphere_internals:project0classDEM_1a101aafa4f3197948fafbb1500e58f0f5… | |
+\newlabel{sphere_internals:project0classDEM_1ae2a1e6696686617f9cbe05b1a264212d… | |
+\newlabel{sphere_internals:project0classDEM_1ae2a1e6696686617f9cbe05b1a264212d… | |
+\newlabel{sphere_internals:project0classDEM_1a870787f68a947706aac1960e5cc1eda8… | |
+\newlabel{sphere_internals:project0classDEM_1a870787f68a947706aac1960e5cc1eda8… | |
+\newlabel{sphere_internals:project0classDEM_1ab28a7813c5848d3b27e6f1ed5196d649… | |
+\newlabel{sphere_internals:project0classDEM_1ab28a7813c5848d3b27e6f1ed5196d649… | |
+\newlabel{sphere_internals:project0classDEM_1a5abc32b3691e7336e80cfab162d0a237… | |
+\newlabel{sphere_internals:project0classDEM_1a5abc32b3691e7336e80cfab162d0a237… | |
+\newlabel{sphere_internals:project0classDEM_1ad4e191a3aa8491ae04f1897ff1f24bde… | |
+\newlabel{sphere_internals:project0classDEM_1ad4e191a3aa8491ae04f1897ff1f24bde… | |
+\newlabel{sphere_internals:project0classDEM_1ad686ac121d845e804515bcf7209b9f71… | |
+\newlabel{sphere_internals:project0classDEM_1ad686ac121d845e804515bcf7209b9f71… | |
+\newlabel{sphere_internals:project0classDEM_1ab6c76ee881de3d710fe1fdcb3ca46dfc… | |
+\newlabel{sphere_internals:project0classDEM_1ab6c76ee881de3d710fe1fdcb3ca46dfc… | |
+\newlabel{sphere_internals:project0classDEM_1a9fa9b39cf7f038cc961337f9d4e162e5… | |
+\newlabel{sphere_internals:project0classDEM_1a9fa9b39cf7f038cc961337f9d4e162e5… | |
+\newlabel{sphere_internals:project0classDEM_1a0cb0fcf60594f664a9e593917c623767… | |
+\newlabel{sphere_internals:project0classDEM_1a0cb0fcf60594f664a9e593917c623767… | |
+\@writefile{toc}{\contentsline {chapter}{\numberline {5}Indices and tables}{19… | |
+\@writefile{lof}{\addvspace {10\p@ }} | |
+\@writefile{lot}{\addvspace {10\p@ }} | |
+\newlabel{index:indices-and-tables}{{5}{19}{Indices and tables\relax }{chapter… | |
+\@writefile{toc}{\contentsline {chapter}{Python Module Index}{21}{section*.68}} | |
+\@writefile{toc}{\contentsline {chapter}{Index}{23}{section*.69}} | |
diff --git a/doc/latex/sphere.idx b/doc/latex/sphere.idx | |
t@@ -0,0 +1,36 @@ | |
+\indexentry{sphere (module)|hyperpage}{9} | |
+\indexentry{Spherebin (class in sphere)|hyperpage}{9} | |
+\indexentry{adjustUpperWall() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{bond() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{bulkPorosity() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{consolidate() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{defaultParams() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{energy() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{generateRadii() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{initGrid() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{initGridAndWorldsize() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{initGridPos() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{initRandomGridPos() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{initRandomPos() (sphere.Spherebin method)|hyperpage}{9} | |
+\indexentry{initTemporal() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{porosity() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{readbin() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{render() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{run() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{shear() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{shearstrain() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{shearvel() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{thinsection\_x1x3() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{torqueScript() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{uniaxialStrainRate() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{voidRatio() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{writebin() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{zeroKinematics() (sphere.Spherebin method)|hyperpage}{10} | |
+\indexentry{V\_sphere() (in module sphere)|hyperpage}{10} | |
+\indexentry{convert() (in module sphere)|hyperpage}{10} | |
+\indexentry{render() (in module sphere)|hyperpage}{11} | |
+\indexentry{run() (in module sphere)|hyperpage}{11} | |
+\indexentry{status() (in module sphere)|hyperpage}{11} | |
+\indexentry{thinsectionVideo() (in module sphere)|hyperpage}{11} | |
+\indexentry{video() (in module sphere)|hyperpage}{11} | |
+\indexentry{visualize() (in module sphere)|hyperpage}{11} | |
diff --git a/doc/latex/sphere.ilg b/doc/latex/sphere.ilg | |
t@@ -0,0 +1,7 @@ | |
+This is makeindex, version 2.15 [TeX Live 2012] (kpathsea + Thai support). | |
+Scanning style file ./python.ist......done (6 attributes redefined, 0 ignored). | |
+Scanning input file sphere.idx....done (36 entries accepted, 0 rejected). | |
+Sorting entries....done (182 comparisons). | |
+Generating output file sphere.ind....done (84 lines written, 0 warnings). | |
+Output written in sphere.ind. | |
+Transcript written in sphere.ilg. | |
diff --git a/doc/latex/sphere.ind b/doc/latex/sphere.ind | |
t@@ -0,0 +1,84 @@ | |
+\begin{theindex} | |
+\def\bigletter#1{{\Large\sffamily#1}\nopagebreak\vspace{1mm}} | |
+ | |
+ \bigletter A | |
+ \item adjustUpperWall() (sphere.Spherebin method), \hyperpage{9} | |
+ | |
+ \indexspace | |
+ \bigletter B | |
+ \item bond() (sphere.Spherebin method), \hyperpage{9} | |
+ \item bulkPorosity() (sphere.Spherebin method), \hyperpage{9} | |
+ | |
+ \indexspace | |
+ \bigletter C | |
+ \item consolidate() (sphere.Spherebin method), \hyperpage{9} | |
+ \item convert() (in module sphere), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter D | |
+ \item defaultParams() (sphere.Spherebin method), \hyperpage{9} | |
+ | |
+ \indexspace | |
+ \bigletter E | |
+ \item energy() (sphere.Spherebin method), \hyperpage{9} | |
+ | |
+ \indexspace | |
+ \bigletter G | |
+ \item generateRadii() (sphere.Spherebin method), \hyperpage{9} | |
+ | |
+ \indexspace | |
+ \bigletter I | |
+ \item initGrid() (sphere.Spherebin method), \hyperpage{9} | |
+ \item initGridAndWorldsize() (sphere.Spherebin method), \hyperpage{9} | |
+ \item initGridPos() (sphere.Spherebin method), \hyperpage{9} | |
+ \item initRandomGridPos() (sphere.Spherebin method), \hyperpage{9} | |
+ \item initRandomPos() (sphere.Spherebin method), \hyperpage{9} | |
+ \item initTemporal() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter P | |
+ \item porosity() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter R | |
+ \item readbin() (sphere.Spherebin method), \hyperpage{10} | |
+ \item render() (in module sphere), \hyperpage{11} | |
+ \item render() (sphere.Spherebin method), \hyperpage{10} | |
+ \item run() (in module sphere), \hyperpage{11} | |
+ \item run() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter S | |
+ \item shear() (sphere.Spherebin method), \hyperpage{10} | |
+ \item shearstrain() (sphere.Spherebin method), \hyperpage{10} | |
+ \item shearvel() (sphere.Spherebin method), \hyperpage{10} | |
+ \item sphere (module), \hyperpage{9} | |
+ \item Spherebin (class in sphere), \hyperpage{9} | |
+ \item status() (in module sphere), \hyperpage{11} | |
+ | |
+ \indexspace | |
+ \bigletter T | |
+ \item thinsection\_x1x3() (sphere.Spherebin method), \hyperpage{10} | |
+ \item thinsectionVideo() (in module sphere), \hyperpage{11} | |
+ \item torqueScript() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter U | |
+ \item uniaxialStrainRate() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter V | |
+ \item V\_sphere() (in module sphere), \hyperpage{10} | |
+ \item video() (in module sphere), \hyperpage{11} | |
+ \item visualize() (in module sphere), \hyperpage{11} | |
+ \item voidRatio() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter W | |
+ \item writebin() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+ \indexspace | |
+ \bigletter Z | |
+ \item zeroKinematics() (sphere.Spherebin method), \hyperpage{10} | |
+ | |
+\end{theindex} | |
diff --git a/doc/latex/sphere.log b/doc/latex/sphere.log | |
t@@ -0,0 +1,1121 @@ | |
+This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian) (format=p… | |
+entering extended mode | |
+ restricted \write18 enabled. | |
+ %&-line parsing enabled. | |
+**sphere.tex | |
+(./sphere.tex | |
+LaTeX2e <2011/06/27> | |
+Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, lo | |
+aded. | |
+(./sphinxmanual.cls | |
+Document Class: sphinxmanual 2009/06/02 Document class (Sphinx manual) | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/report.cls | |
+Document Class: report 2007/10/19 v1.4h Standard LaTeX document class | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo | |
+File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option) | |
+) | |
+\c@part=\count79 | |
+\c@chapter=\count80 | |
+\c@section=\count81 | |
+\c@subsection=\count82 | |
+\c@subsubsection=\count83 | |
+\c@paragraph=\count84 | |
+\c@subparagraph=\count85 | |
+\c@figure=\count86 | |
+\c@table=\count87 | |
+\abovecaptionskip=\skip41 | |
+\belowcaptionskip=\skip42 | |
+\bibindent=\dimen102 | |
+)) | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty | |
+Package: inputenc 2008/03/30 v1.1d Input encoding file | |
+\inpenc@prehook=\toks14 | |
+\inpenc@posthook=\toks15 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def | |
+File: utf8.def 2008/04/05 v1.1m UTF-8 support for inputenc | |
+Now handling font encoding OML ... | |
+... no UTF-8 mapping file for font encoding OML | |
+Now handling font encoding T1 ... | |
+... processing UTF-8 mapping file for font encoding T1 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu | |
+File: t1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc | |
+ defining Unicode char U+00A1 (decimal 161) | |
+ defining Unicode char U+00A3 (decimal 163) | |
+ defining Unicode char U+00AB (decimal 171) | |
+ defining Unicode char U+00BB (decimal 187) | |
+ defining Unicode char U+00BF (decimal 191) | |
+ defining Unicode char U+00C0 (decimal 192) | |
+ defining Unicode char U+00C1 (decimal 193) | |
+ defining Unicode char U+00C2 (decimal 194) | |
+ defining Unicode char U+00C3 (decimal 195) | |
+ defining Unicode char U+00C4 (decimal 196) | |
+ defining Unicode char U+00C5 (decimal 197) | |
+ defining Unicode char U+00C6 (decimal 198) | |
+ defining Unicode char U+00C7 (decimal 199) | |
+ defining Unicode char U+00C8 (decimal 200) | |
+ defining Unicode char U+00C9 (decimal 201) | |
+ defining Unicode char U+00CA (decimal 202) | |
+ defining Unicode char U+00CB (decimal 203) | |
+ defining Unicode char U+00CC (decimal 204) | |
+ defining Unicode char U+00CD (decimal 205) | |
+ defining Unicode char U+00CE (decimal 206) | |
+ defining Unicode char U+00CF (decimal 207) | |
+ defining Unicode char U+00D0 (decimal 208) | |
+ defining Unicode char U+00D1 (decimal 209) | |
+ defining Unicode char U+00D2 (decimal 210) | |
+ defining Unicode char U+00D3 (decimal 211) | |
+ defining Unicode char U+00D4 (decimal 212) | |
+ defining Unicode char U+00D5 (decimal 213) | |
+ defining Unicode char U+00D6 (decimal 214) | |
+ defining Unicode char U+00D8 (decimal 216) | |
+ defining Unicode char U+00D9 (decimal 217) | |
+ defining Unicode char U+00DA (decimal 218) | |
+ defining Unicode char U+00DB (decimal 219) | |
+ defining Unicode char U+00DC (decimal 220) | |
+ defining Unicode char U+00DD (decimal 221) | |
+ defining Unicode char U+00DE (decimal 222) | |
+ defining Unicode char U+00DF (decimal 223) | |
+ defining Unicode char U+00E0 (decimal 224) | |
+ defining Unicode char U+00E1 (decimal 225) | |
+ defining Unicode char U+00E2 (decimal 226) | |
+ defining Unicode char U+00E3 (decimal 227) | |
+ defining Unicode char U+00E4 (decimal 228) | |
+ defining Unicode char U+00E5 (decimal 229) | |
+ defining Unicode char U+00E6 (decimal 230) | |
+ defining Unicode char U+00E7 (decimal 231) | |
+ defining Unicode char U+00E8 (decimal 232) | |
+ defining Unicode char U+00E9 (decimal 233) | |
+ defining Unicode char U+00EA (decimal 234) | |
+ defining Unicode char U+00EB (decimal 235) | |
+ defining Unicode char U+00EC (decimal 236) | |
+ defining Unicode char U+00ED (decimal 237) | |
+ defining Unicode char U+00EE (decimal 238) | |
+ defining Unicode char U+00EF (decimal 239) | |
+ defining Unicode char U+00F0 (decimal 240) | |
+ defining Unicode char U+00F1 (decimal 241) | |
+ defining Unicode char U+00F2 (decimal 242) | |
+ defining Unicode char U+00F3 (decimal 243) | |
+ defining Unicode char U+00F4 (decimal 244) | |
+ defining Unicode char U+00F5 (decimal 245) | |
+ defining Unicode char U+00F6 (decimal 246) | |
+ defining Unicode char U+00F8 (decimal 248) | |
+ defining Unicode char U+00F9 (decimal 249) | |
+ defining Unicode char U+00FA (decimal 250) | |
+ defining Unicode char U+00FB (decimal 251) | |
+ defining Unicode char U+00FC (decimal 252) | |
+ defining Unicode char U+00FD (decimal 253) | |
+ defining Unicode char U+00FE (decimal 254) | |
+ defining Unicode char U+00FF (decimal 255) | |
+ defining Unicode char U+0102 (decimal 258) | |
+ defining Unicode char U+0103 (decimal 259) | |
+ defining Unicode char U+0104 (decimal 260) | |
+ defining Unicode char U+0105 (decimal 261) | |
+ defining Unicode char U+0106 (decimal 262) | |
+ defining Unicode char U+0107 (decimal 263) | |
+ defining Unicode char U+010C (decimal 268) | |
+ defining Unicode char U+010D (decimal 269) | |
+ defining Unicode char U+010E (decimal 270) | |
+ defining Unicode char U+010F (decimal 271) | |
+ defining Unicode char U+0110 (decimal 272) | |
+ defining Unicode char U+0111 (decimal 273) | |
+ defining Unicode char U+0118 (decimal 280) | |
+ defining Unicode char U+0119 (decimal 281) | |
+ defining Unicode char U+011A (decimal 282) | |
+ defining Unicode char U+011B (decimal 283) | |
+ defining Unicode char U+011E (decimal 286) | |
+ defining Unicode char U+011F (decimal 287) | |
+ defining Unicode char U+0130 (decimal 304) | |
+ defining Unicode char U+0131 (decimal 305) | |
+ defining Unicode char U+0132 (decimal 306) | |
+ defining Unicode char U+0133 (decimal 307) | |
+ defining Unicode char U+0139 (decimal 313) | |
+ defining Unicode char U+013A (decimal 314) | |
+ defining Unicode char U+013D (decimal 317) | |
+ defining Unicode char U+013E (decimal 318) | |
+ defining Unicode char U+0141 (decimal 321) | |
+ defining Unicode char U+0142 (decimal 322) | |
+ defining Unicode char U+0143 (decimal 323) | |
+ defining Unicode char U+0144 (decimal 324) | |
+ defining Unicode char U+0147 (decimal 327) | |
+ defining Unicode char U+0148 (decimal 328) | |
+ defining Unicode char U+014A (decimal 330) | |
+ defining Unicode char U+014B (decimal 331) | |
+ defining Unicode char U+0150 (decimal 336) | |
+ defining Unicode char U+0151 (decimal 337) | |
+ defining Unicode char U+0152 (decimal 338) | |
+ defining Unicode char U+0153 (decimal 339) | |
+ defining Unicode char U+0154 (decimal 340) | |
+ defining Unicode char U+0155 (decimal 341) | |
+ defining Unicode char U+0158 (decimal 344) | |
+ defining Unicode char U+0159 (decimal 345) | |
+ defining Unicode char U+015A (decimal 346) | |
+ defining Unicode char U+015B (decimal 347) | |
+ defining Unicode char U+015E (decimal 350) | |
+ defining Unicode char U+015F (decimal 351) | |
+ defining Unicode char U+0160 (decimal 352) | |
+ defining Unicode char U+0161 (decimal 353) | |
+ defining Unicode char U+0162 (decimal 354) | |
+ defining Unicode char U+0163 (decimal 355) | |
+ defining Unicode char U+0164 (decimal 356) | |
+ defining Unicode char U+0165 (decimal 357) | |
+ defining Unicode char U+016E (decimal 366) | |
+ defining Unicode char U+016F (decimal 367) | |
+ defining Unicode char U+0170 (decimal 368) | |
+ defining Unicode char U+0171 (decimal 369) | |
+ defining Unicode char U+0178 (decimal 376) | |
+ defining Unicode char U+0179 (decimal 377) | |
+ defining Unicode char U+017A (decimal 378) | |
+ defining Unicode char U+017B (decimal 379) | |
+ defining Unicode char U+017C (decimal 380) | |
+ defining Unicode char U+017D (decimal 381) | |
+ defining Unicode char U+017E (decimal 382) | |
+ defining Unicode char U+200C (decimal 8204) | |
+ defining Unicode char U+2013 (decimal 8211) | |
+ defining Unicode char U+2014 (decimal 8212) | |
+ defining Unicode char U+2018 (decimal 8216) | |
+ defining Unicode char U+2019 (decimal 8217) | |
+ defining Unicode char U+201A (decimal 8218) | |
+ defining Unicode char U+201C (decimal 8220) | |
+ defining Unicode char U+201D (decimal 8221) | |
+ defining Unicode char U+201E (decimal 8222) | |
+ defining Unicode char U+2030 (decimal 8240) | |
+ defining Unicode char U+2031 (decimal 8241) | |
+ defining Unicode char U+2039 (decimal 8249) | |
+ defining Unicode char U+203A (decimal 8250) | |
+ defining Unicode char U+2423 (decimal 9251) | |
+) | |
+Now handling font encoding OT1 ... | |
+... processing UTF-8 mapping file for font encoding OT1 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu | |
+File: ot1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc | |
+ defining Unicode char U+00A1 (decimal 161) | |
+ defining Unicode char U+00A3 (decimal 163) | |
+ defining Unicode char U+00B8 (decimal 184) | |
+ defining Unicode char U+00BF (decimal 191) | |
+ defining Unicode char U+00C5 (decimal 197) | |
+ defining Unicode char U+00C6 (decimal 198) | |
+ defining Unicode char U+00D8 (decimal 216) | |
+ defining Unicode char U+00DF (decimal 223) | |
+ defining Unicode char U+00E6 (decimal 230) | |
+ defining Unicode char U+00EC (decimal 236) | |
+ defining Unicode char U+00ED (decimal 237) | |
+ defining Unicode char U+00EE (decimal 238) | |
+ defining Unicode char U+00EF (decimal 239) | |
+ defining Unicode char U+00F8 (decimal 248) | |
+ defining Unicode char U+0131 (decimal 305) | |
+ defining Unicode char U+0141 (decimal 321) | |
+ defining Unicode char U+0142 (decimal 322) | |
+ defining Unicode char U+0152 (decimal 338) | |
+ defining Unicode char U+0153 (decimal 339) | |
+ defining Unicode char U+2013 (decimal 8211) | |
+ defining Unicode char U+2014 (decimal 8212) | |
+ defining Unicode char U+2018 (decimal 8216) | |
+ defining Unicode char U+2019 (decimal 8217) | |
+ defining Unicode char U+201C (decimal 8220) | |
+ defining Unicode char U+201D (decimal 8221) | |
+) | |
+Now handling font encoding OMS ... | |
+... processing UTF-8 mapping file for font encoding OMS | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu | |
+File: omsenc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc | |
+ defining Unicode char U+00A7 (decimal 167) | |
+ defining Unicode char U+00B6 (decimal 182) | |
+ defining Unicode char U+00B7 (decimal 183) | |
+ defining Unicode char U+2020 (decimal 8224) | |
+ defining Unicode char U+2021 (decimal 8225) | |
+ defining Unicode char U+2022 (decimal 8226) | |
+) | |
+Now handling font encoding OMX ... | |
+... no UTF-8 mapping file for font encoding OMX | |
+Now handling font encoding U ... | |
+... no UTF-8 mapping file for font encoding U | |
+ defining Unicode char U+00A9 (decimal 169) | |
+ defining Unicode char U+00AA (decimal 170) | |
+ defining Unicode char U+00AE (decimal 174) | |
+ defining Unicode char U+00BA (decimal 186) | |
+ defining Unicode char U+02C6 (decimal 710) | |
+ defining Unicode char U+02DC (decimal 732) | |
+ defining Unicode char U+200C (decimal 8204) | |
+ defining Unicode char U+2026 (decimal 8230) | |
+ defining Unicode char U+2122 (decimal 8482) | |
+ defining Unicode char U+2423 (decimal 9251) | |
+)) | |
+ defining Unicode char U+00A0 (decimal 160) | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty | |
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def | |
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file | |
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43. | |
+)) | |
+(/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty | |
+Package: babel 2008/07/08 v3.8m The Babel package | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/generic/babel/english.ldf | |
+Language: english 2005/03/30 v3.3o English support from the babel system | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/generic/babel/babel.def | |
+File: babel.def 2008/07/08 v3.8m Babel common definitions | |
+\babel@savecnt=\count88 | |
+\U@D=\dimen103 | |
+) | |
+\l@british = a dialect from \language\l@english | |
+\l@UKenglish = a dialect from \language\l@english | |
+\l@canadian = a dialect from \language\l@american | |
+\l@australian = a dialect from \language\l@british | |
+\l@newzealand = a dialect from \language\l@british | |
+)) | |
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty | |
+Package: times 2005/04/12 PSNFSS-v9.2a (SPQR) | |
+) (./fncychap.sty | |
+Package: fncychap 2007/07/30 v1.34 LaTeX package (Revised chapters) | |
+\RW=\skip43 | |
+\mylen=\skip44 | |
+\myhi=\skip45 | |
+\px=\skip46 | |
+\py=\skip47 | |
+\pyy=\skip48 | |
+\pxx=\skip49 | |
+\c@AlphaCnt=\count89 | |
+\c@AlphaDecCnt=\count90 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty | |
+Package: longtable 2004/02/01 v4.11 Multi-page Table package (DPC) | |
+\LTleft=\skip50 | |
+\LTright=\skip51 | |
+\LTpre=\skip52 | |
+\LTpost=\skip53 | |
+\LTchunksize=\count91 | |
+\LTcapwidth=\dimen104 | |
+\LT@head=\box26 | |
+\LT@firsthead=\box27 | |
+\LT@foot=\box28 | |
+\LT@lastfoot=\box29 | |
+\LT@cols=\count92 | |
+\LT@rows=\count93 | |
+\c@LT@tables=\count94 | |
+\c@LT@chunks=\count95 | |
+\LT@p@ftn=\toks16 | |
+) (./sphinx.sty | |
+Package: sphinx 2010/01/15 LaTeX package (Sphinx markup) | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty | |
+Package: textcomp 2005/09/27 v1.99g Standard LaTeX package | |
+Package textcomp Info: Sub-encoding information: | |
+(textcomp) 5 = only ISO-Adobe without \textcurrency | |
+(textcomp) 4 = 5 + \texteuro | |
+(textcomp) 3 = 4 + \textohm | |
+(textcomp) 2 = 3 + \textestimated + \textcurrency | |
+(textcomp) 1 = TS1 - \textcircled - \t | |
+(textcomp) 0 = TS1 (full) | |
+(textcomp) Font families with sub-encoding setting implement | |
+(textcomp) only a restricted character set as indicated. | |
+(textcomp) Family '?' is the default used for unknown fonts. | |
+(textcomp) See the documentation for details. | |
+Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 71. | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def | |
+File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file | |
+Now handling font encoding TS1 ... | |
+... processing UTF-8 mapping file for font encoding TS1 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.dfu | |
+File: ts1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc | |
+ defining Unicode char U+00A2 (decimal 162) | |
+ defining Unicode char U+00A3 (decimal 163) | |
+ defining Unicode char U+00A4 (decimal 164) | |
+ defining Unicode char U+00A5 (decimal 165) | |
+ defining Unicode char U+00A6 (decimal 166) | |
+ defining Unicode char U+00A7 (decimal 167) | |
+ defining Unicode char U+00A8 (decimal 168) | |
+ defining Unicode char U+00A9 (decimal 169) | |
+ defining Unicode char U+00AA (decimal 170) | |
+ defining Unicode char U+00AC (decimal 172) | |
+ defining Unicode char U+00AE (decimal 174) | |
+ defining Unicode char U+00AF (decimal 175) | |
+ defining Unicode char U+00B0 (decimal 176) | |
+ defining Unicode char U+00B1 (decimal 177) | |
+ defining Unicode char U+00B2 (decimal 178) | |
+ defining Unicode char U+00B3 (decimal 179) | |
+ defining Unicode char U+00B4 (decimal 180) | |
+ defining Unicode char U+00B5 (decimal 181) | |
+ defining Unicode char U+00B6 (decimal 182) | |
+ defining Unicode char U+00B7 (decimal 183) | |
+ defining Unicode char U+00B9 (decimal 185) | |
+ defining Unicode char U+00BA (decimal 186) | |
+ defining Unicode char U+00BC (decimal 188) | |
+ defining Unicode char U+00BD (decimal 189) | |
+ defining Unicode char U+00BE (decimal 190) | |
+ defining Unicode char U+00D7 (decimal 215) | |
+ defining Unicode char U+00F7 (decimal 247) | |
+ defining Unicode char U+0192 (decimal 402) | |
+ defining Unicode char U+02C7 (decimal 711) | |
+ defining Unicode char U+02D8 (decimal 728) | |
+ defining Unicode char U+02DD (decimal 733) | |
+ defining Unicode char U+0E3F (decimal 3647) | |
+ defining Unicode char U+2016 (decimal 8214) | |
+ defining Unicode char U+2020 (decimal 8224) | |
+ defining Unicode char U+2021 (decimal 8225) | |
+ defining Unicode char U+2022 (decimal 8226) | |
+ defining Unicode char U+2030 (decimal 8240) | |
+ defining Unicode char U+2031 (decimal 8241) | |
+ defining Unicode char U+203B (decimal 8251) | |
+ defining Unicode char U+203D (decimal 8253) | |
+ defining Unicode char U+2044 (decimal 8260) | |
+ defining Unicode char U+204E (decimal 8270) | |
+ defining Unicode char U+2052 (decimal 8274) | |
+ defining Unicode char U+20A1 (decimal 8353) | |
+ defining Unicode char U+20A4 (decimal 8356) | |
+ defining Unicode char U+20A6 (decimal 8358) | |
+ defining Unicode char U+20A9 (decimal 8361) | |
+ defining Unicode char U+20AB (decimal 8363) | |
+ defining Unicode char U+20AC (decimal 8364) | |
+ defining Unicode char U+20B1 (decimal 8369) | |
+ defining Unicode char U+2103 (decimal 8451) | |
+ defining Unicode char U+2116 (decimal 8470) | |
+ defining Unicode char U+2117 (decimal 8471) | |
+ defining Unicode char U+211E (decimal 8478) | |
+ defining Unicode char U+2120 (decimal 8480) | |
+ defining Unicode char U+2122 (decimal 8482) | |
+ defining Unicode char U+2126 (decimal 8486) | |
+ defining Unicode char U+2127 (decimal 8487) | |
+ defining Unicode char U+212E (decimal 8494) | |
+ defining Unicode char U+2190 (decimal 8592) | |
+ defining Unicode char U+2191 (decimal 8593) | |
+ defining Unicode char U+2192 (decimal 8594) | |
+ defining Unicode char U+2193 (decimal 8595) | |
+ defining Unicode char U+2329 (decimal 9001) | |
+ defining Unicode char U+232A (decimal 9002) | |
+ defining Unicode char U+2422 (decimal 9250) | |
+ defining Unicode char U+25E6 (decimal 9702) | |
+ defining Unicode char U+25EF (decimal 9711) | |
+ defining Unicode char U+266A (decimal 9834) | |
+)) | |
+LaTeX Info: Redefining \oldstylenums on input line 266. | |
+Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 281. | |
+Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 282. | |
+Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 283. | |
+Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 284. | |
+Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 285. | |
+Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 286. | |
+Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 287. | |
+Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 288. | |
+Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 289. | |
+Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 290. | |
+Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 291. | |
+Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 292. | |
+Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 293. | |
+Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 294. | |
+Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 295. | |
+Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 296. | |
+Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 297. | |
+Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 298. | |
+Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 299. | |
+Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 300. | |
+Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 301. | |
+Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 302. | |
+Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 303. | |
+Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 304. | |
+ | |
+Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 305. | |
+Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 306. | |
+Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 307. | |
+Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 308. | |
+Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 309. | |
+Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 310. | |
+Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 311. | |
+Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 312. | |
+Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 313. | |
+Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 314. | |
+Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 315. | |
+Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 316. | |
+Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 317. | |
+Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 318. | |
+Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 319. | |
+Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 320. | |
+Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 321. | |
+Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 322. | |
+Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 323. | |
+Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 324. | |
+Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 325. | |
+Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 326. | |
+Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 327. | |
+Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 328. | |
+Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 329. | |
+Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 330. | |
+Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 331. | |
+Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 332. | |
+Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 333. | |
+Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 334. | |
+Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 335. | |
+Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 336. | |
+Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 337. | |
+Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 338. | |
+Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 339. | |
+Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 340. | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty | |
+\fancy@headwidth=\skip54 | |
+\f@ncyO@elh=\skip55 | |
+\f@ncyO@erh=\skip56 | |
+\f@ncyO@olh=\skip57 | |
+\f@ncyO@orh=\skip58 | |
+\f@ncyO@elf=\skip59 | |
+\f@ncyO@erf=\skip60 | |
+\f@ncyO@olf=\skip61 | |
+\f@ncyO@orf=\skip62 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/fancybox/fancybox.sty | |
+Package: fancybox 2010/05/15 1.4 | |
+ | |
+Style option: `fancybox' v1.4 <2010/05/15> (tvz) | |
+\@fancybox=\box30 | |
+\shadowsize=\dimen105 | |
+\@Sbox=\box31 | |
+\do@VerbBox=\toks17 | |
+\the@fancyput=\toks18 | |
+\this@fancyput=\toks19 | |
+\EndVerbatimTokens=\toks20 | |
+\Verbatim@Outfile=\write3 | |
+\Verbatim@Infile=\read1 | |
+) (/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty | |
+Package: titlesec 2011/12/15 v2.10.0 Sectioning titles | |
+\ttl@box=\box32 | |
+\beforetitleunit=\skip63 | |
+\aftertitleunit=\skip64 | |
+\ttl@plus=\dimen106 | |
+\ttl@minus=\dimen107 | |
+\ttl@toksa=\toks21 | |
+\titlewidth=\dimen108 | |
+\titlewidthlast=\dimen109 | |
+\titlewidthfirst=\dimen110 | |
+) | |
+(./tabulary.sty | |
+Package: tabulary 2007/10/02 v0.9 tabulary package (DPC) | |
+ (/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty | |
+Package: array 2008/09/09 v2.4c Tabular extension package (FMi) | |
+\col@sep=\dimen111 | |
+\extrarowheight=\dimen112 | |
+\NC@list=\toks22 | |
+\extratabsurround=\skip65 | |
+\backup@length=\skip66 | |
+) | |
+\TY@count=\count96 | |
+\TY@linewidth=\dimen113 | |
+\tymin=\dimen114 | |
+\tymax=\dimen115 | |
+\TY@tablewidth=\dimen116 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty | |
+Package: amsmath 2000/07/18 v2.13 AMS math features | |
+\@mathmargin=\skip67 | |
+ | |
+For additional information on amsmath, use the `?' option. | |
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty | |
+Package: amstext 2000/06/29 v2.01 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty | |
+File: amsgen.sty 1999/11/30 v2.0 | |
+\@emptytoks=\toks23 | |
+\ex@=\dimen117 | |
+)) | |
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty | |
+Package: amsbsy 1999/11/29 v1.2d | |
+\pmbraise@=\dimen118 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty | |
+Package: amsopn 1999/12/14 v2.01 operator names | |
+) | |
+\inf@bad=\count97 | |
+LaTeX Info: Redefining \frac on input line 211. | |
+\uproot@=\count98 | |
+\leftroot@=\count99 | |
+LaTeX Info: Redefining \overline on input line 307. | |
+\classnum@=\count100 | |
+\DOTSCASE@=\count101 | |
+LaTeX Info: Redefining \ldots on input line 379. | |
+LaTeX Info: Redefining \dots on input line 382. | |
+LaTeX Info: Redefining \cdots on input line 467. | |
+\Mathstrutbox@=\box33 | |
+\strutbox@=\box34 | |
+\big@size=\dimen119 | |
+LaTeX Font Info: Redeclaring font encoding OML on input line 567. | |
+LaTeX Font Info: Redeclaring font encoding OMS on input line 568. | |
+\macc@depth=\count102 | |
+\c@MaxMatrixCols=\count103 | |
+\dotsspace@=\muskip10 | |
+\c@parentequation=\count104 | |
+\dspbrk@lvl=\count105 | |
+\tag@help=\toks24 | |
+\row@=\count106 | |
+\column@=\count107 | |
+\maxfields@=\count108 | |
+\andhelp@=\toks25 | |
+\eqnshift@=\dimen120 | |
+\alignsep@=\dimen121 | |
+\tagshift@=\dimen122 | |
+\tagwidth@=\dimen123 | |
+\totwidth@=\dimen124 | |
+\lineht@=\dimen125 | |
+\@envbody=\toks26 | |
+\multlinegap=\skip68 | |
+\multlinetaggap=\skip69 | |
+\mathdisplay@stack=\toks27 | |
+LaTeX Info: Redefining \[ on input line 2666. | |
+LaTeX Info: Redefining \] on input line 2667. | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty | |
+Package: makeidx 2000/03/29 v1.0m Standard LaTeX package | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty | |
+Package: framed 2011/10/22 v 0.96: framed or shaded text with page breaks | |
+\OuterFrameSep=\skip70 | |
+\fb@frw=\dimen126 | |
+\fb@frh=\dimen127 | |
+\FrameRule=\dimen128 | |
+\FrameSep=\dimen129 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty | |
+Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty | |
+Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg | |
+File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive | |
+) | |
+Package color Info: Driver file: pdftex.def on input line 130. | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def | |
+File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty | |
+Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty | |
+Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) | |
+) | |
+\Gread@gobject=\count109 | |
+)) | |
+(/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty | |
+Package: fancyvrb 2008/02/07 | |
+ | |
+Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix | |
+<2008/02/07> (tvz) (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty | |
+Package: keyval 1999/03/16 v1.13 key=value parser (DPC) | |
+\KV@toks@=\toks28 | |
+) | |
+\FV@CodeLineNo=\count110 | |
+\FV@InFile=\read2 | |
+\FV@TabBox=\box35 | |
+\c@FancyVerbLine=\count111 | |
+\FV@StepNumber=\count112 | |
+\FV@OutFile=\write4 | |
+) (/usr/share/texlive/texmf-dist/tex/latex/threeparttable/threeparttable.sty | |
+Package: threeparttable 2003/06/13 v 3.0 | |
+\@tempboxb=\box36 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/mdwtools/footnote.sty | |
+Package: footnote 1997/01/28 1.13 Save footnotes around boxes | |
+\fn@notes=\box37 | |
+\fn@width=\dimen130 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty | |
+\wrapoverhang=\dimen131 | |
+\WF@size=\dimen132 | |
+\c@WF@wrappedlines=\count113 | |
+\WF@box=\box38 | |
+\WF@everypar=\toks29 | |
+Package: wrapfig 2003/01/31 v 3.6 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty | |
+Package: parskip 2001/04/09 non-zero parskip adjustments | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty | |
+Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty | |
+Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR) | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty | |
+Package: trig 1999/03/16 v1.09 sin cos tan (DPC) | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg | |
+File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live | |
+) | |
+Package graphics Info: Driver file: pdftex.def on input line 91. | |
+) | |
+\Gin@req@height=\dimen133 | |
+\Gin@req@width=\dimen134 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/plain/misc/pdfcolor.tex) | |
+\distancetoright=\skip71 | |
+\py@argswidth=\skip72 | |
+\py@noticelength=\skip73 | |
+\lineblockindentation=\skip74 | |
+\image@box=\box39 | |
+\image@width=\dimen135 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty | |
+Package: hyperref 2012/05/13 v6.82q Hypertext links for LaTeX | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty | |
+Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) | |
+ | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty | |
+Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) | |
+Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) | |
+Package hobsub Info: Skipping package `infwarerr' (already loaded). | |
+Package hobsub Info: Skipping package `ltxcmds' (already loaded). | |
+Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) | |
+Package ifluatex Info: LuaTeX not detected. | |
+Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) | |
+Package ifvtex Info: VTeX not detected. | |
+Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) | |
+Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) | |
+Package ifpdf Info: pdfTeX in PDF mode is detected. | |
+Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) | |
+Package etexcmds Info: Could not find \expanded. | |
+(etexcmds) That can mean that you are not using pdfTeX 1.50 or | |
+(etexcmds) that some package has redefined \expanded. | |
+(etexcmds) In the latter case, load this package earlier. | |
+Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) | |
+Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) | |
+Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO | |
+) | |
+Package pdftexcmds Info: LuaTeX not detected. | |
+Package pdftexcmds Info: \pdf@primitive is available. | |
+Package pdftexcmds Info: \pdf@ifprimitive is available. | |
+Package pdftexcmds Info: \pdfdraftmode found. | |
+Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) | |
+Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO | |
+) | |
+Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) | |
+Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) | |
+) | |
+Package hobsub Info: Skipping package `hobsub' (already loaded). | |
+Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) | |
+Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) | |
+Package: xcolor-patch 2011/01/30 xcolor patch | |
+Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) | |
+Package atveryend Info: \enddocument detected (standard20110627). | |
+Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) | |
+Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) | |
+Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty | |
+Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty | |
+Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) | |
+) | |
+\@linkdim=\dimen136 | |
+\Hy@linkcounter=\count114 | |
+\Hy@pagecounter=\count115 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def | |
+File: pd1enc.def 2012/05/13 v6.82q Hyperref: PDFDocEncoding definition (HO) | |
+Now handling font encoding PD1 ... | |
+... no UTF-8 mapping file for font encoding PD1 | |
+) | |
+\Hy@SavedSpaceFactor=\count116 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg | |
+File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive | |
+) | |
+Package hyperref Info: Option `colorlinks' set `true' on input line 3941. | |
+Package hyperref Info: Option `breaklinks' set `true' on input line 3941. | |
+Package hyperref Info: Hyper figures OFF on input line 4062. | |
+Package hyperref Info: Link nesting OFF on input line 4067. | |
+Package hyperref Info: Hyper index ON on input line 4070. | |
+Package hyperref Info: Plain pages OFF on input line 4077. | |
+Package hyperref Info: Backreferencing OFF on input line 4082. | |
+Package hyperref Info: Implicit mode ON; LaTeX internals redefined. | |
+Package hyperref Info: Bookmarks ON on input line 4300. | |
+\c@Hy@tempcnt=\count117 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty | |
+\Urlmuskip=\muskip11 | |
+Package: url 2006/04/12 ver 3.3 Verb mode for urls, etc. | |
+) | |
+LaTeX Info: Redefining \url on input line 4653. | |
+\Fld@menulength=\count118 | |
+\Field@Width=\dimen137 | |
+\Fld@charsize=\dimen138 | |
+Package hyperref Info: Hyper figures OFF on input line 5773. | |
+Package hyperref Info: Link nesting OFF on input line 5778. | |
+Package hyperref Info: Hyper index ON on input line 5781. | |
+Package hyperref Info: backreferencing OFF on input line 5788. | |
+Package hyperref Info: Link coloring ON on input line 5791. | |
+Package hyperref Info: Link coloring with OCG OFF on input line 5798. | |
+Package hyperref Info: PDF/A mode OFF on input line 5803. | |
+LaTeX Info: Redefining \ref on input line 5843. | |
+LaTeX Info: Redefining \pageref on input line 5847. | |
+\Hy@abspage=\count119 | |
+\c@Item=\count120 | |
+\c@Hfootnote=\count121 | |
+) | |
+ | |
+Package hyperref Message: Driver (autodetected): hpdftex. | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def | |
+File: hpdftex.def 2012/05/13 v6.82q Hyperref driver for pdfTeX | |
+\Fld@listcount=\count122 | |
+\c@bookmark@seq@number=\count123 | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty | |
+Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) | |
+Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 | |
+82. | |
+) | |
+\Hy@SectionHShift=\skip75 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty | |
+Package: hypcap 2011/02/16 v1.11 Adjusting the anchors of captions (HO) | |
+) | |
+\DUlineblockindent=\skip76 | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/latex/multirow/multirow.sty | |
+\bigstrutjot=\dimen139 | |
+) | |
+\@indexfile=\write5 | |
+\openout5 = `sphere.idx'. | |
+ | |
+ | |
+Writing index file sphere.idx | |
+(./sphere.aux | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1a3cd6355aefc172c712f1c | |
+91f4ffc36f2' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1aa3066aa501f982c2df51f | |
+58fb5a91148' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1ac32ef9094b25ee9c35e30 | |
+f4488491fe2' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1a242634f10a9bc1f19e4eb | |
+46b7168f288' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1a101aafa4f3197948fafbb | |
+1500e58f0f5' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1ae2a1e6696686617f9cbe0 | |
+5b1a264212d' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1a870787f68a947706aac19 | |
+60e5cc1eda8' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1ab28a7813c5848d3b27e6f | |
+1ed5196d649' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1a5abc32b3691e7336e80cf | |
+ab162d0a237' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1ad4e191a3aa8491ae04f18 | |
+97ff1f24bde' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1ad686ac121d845e804515b | |
+cf7209b9f71' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1ab6c76ee881de3d710fe1f | |
+dcb3ca46dfc' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1a9fa9b39cf7f038cc96133 | |
+7f9d4e162e5' multiply defined. | |
+ | |
+ | |
+LaTeX Warning: Label `sphere_internals:project0classDEM_1a0cb0fcf60594f664a9e59 | |
+3917c623767' multiply defined. | |
+ | |
+) | |
+\openout1 = `sphere.aux'. | |
+ | |
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 113. | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 113. | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 113. | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 113. | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 113. | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 113. | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 113. | |
+LaTeX Font Info: Try loading font information for TS1+cmr on input line 113. | |
+ | |
+ (/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd | |
+File: ts1cmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions | |
+) | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 113. | |
+LaTeX Font Info: ... okay on input line 113. | |
+LaTeX Font Info: Try loading font information for T1+ptm on input line 113. | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd | |
+File: t1ptm.fd 2001/06/04 font definitions for T1/ptm. | |
+) | |
+(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii | |
+[Loading MPS to PDF converter (version 2006.09.02).] | |
+\scratchcounter=\count124 | |
+\scratchdimen=\dimen140 | |
+\scratchbox=\box40 | |
+\nofMPsegments=\count125 | |
+\nofMParguments=\count126 | |
+\everyMPshowfont=\toks30 | |
+\MPscratchCnt=\count127 | |
+\MPscratchDim=\dimen141 | |
+\MPnumerator=\count128 | |
+\makeMPintoPDFobject=\count129 | |
+\everyMPtoPDFconversion=\toks31 | |
+) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty | |
+Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty | |
+Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO) | |
+) | |
+Package grfext Info: Graphics extension search list: | |
+(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE | |
+G,.JBIG2,.JB2,.eps] | |
+(grfext) \AppendGraphicsExtensions on input line 452. | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg | |
+File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv | |
+e | |
+)) | |
+\AtBeginShipoutBox=\box41 | |
+Package hyperref Info: Link coloring ON on input line 113. | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty | |
+Package: nameref 2010/04/30 v2.40 Cross-referencing by name of section | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty | |
+Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO) | |
+) | |
+\c@section@level=\count130 | |
+) | |
+LaTeX Info: Redefining \ref on input line 113. | |
+LaTeX Info: Redefining \pageref on input line 113. | |
+LaTeX Info: Redefining \nameref on input line 113. | |
+ | |
+(./sphere.out) (./sphere.out) | |
+\@outlinefile=\write6 | |
+\openout6 = `sphere.out'. | |
+ | |
+ | |
+Underfull \hbox (badness 10000) in paragraph at lines 116--116 | |
+ | |
+ [] | |
+ | |
+LaTeX Font Info: Try loading font information for T1+phv on input line 116. | |
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1phv.fd | |
+File: t1phv.fd 2001/06/04 scalable font definitions for T1/phv. | |
+) | |
+LaTeX Font Info: Font shape `T1/phv/bx/n' in size <24.88> not available | |
+(Font) Font shape `T1/phv/b/n' tried instead on input line 116. | |
+LaTeX Font Info: Font shape `T1/phv/m/it' in size <17.28> not available | |
+(Font) Font shape `T1/phv/m/sl' tried instead on input line 116. | |
+LaTeX Font Info: Font shape `T1/phv/bx/it' in size <17.28> not available | |
+(Font) Font shape `T1/phv/b/it' tried instead on input line 116. | |
+LaTeX Font Info: Font shape `T1/phv/b/it' in size <17.28> not available | |
+(Font) Font shape `T1/phv/b/sl' tried instead on input line 116. | |
+LaTeX Font Info: Font shape `T1/phv/bx/n' in size <17.28> not available | |
+(Font) Font shape `T1/phv/b/n' tried instead on input line 116. | |
+ [1 | |
+ | |
+{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2 | |
+ | |
+] (./sphere.toc | |
+LaTeX Font Info: Font shape `T1/ptm/bx/n' in size <10> not available | |
+(Font) Font shape `T1/ptm/b/n' tried instead on input line 2. | |
+) | |
+\tf@toc=\write7 | |
+\openout7 = `sphere.toc'. | |
+ | |
+ | |
+Adding blank page after the table of contents. | |
+LaTeX Font Info: Font shape `T1/phv/bx/n' in size <10> not available | |
+(Font) Font shape `T1/phv/b/n' tried instead on input line 116. | |
+pdfTeX warning (ext4): destination with the same identifier (name{page.i}) has | |
+been already used, duplicate ignored | |
+<to be read again> | |
+ \relax | |
+l.116 \tableofcontents | |
+ [1 | |
+ | |
+]pdfTeX warning (ext4): destination with the same identifier (name{page.ii}) ha | |
+s been already used, duplicate ignored | |
+<to be read again> | |
+ \relax | |
+l.116 \tableofcontents | |
+ [2] [1 | |
+ | |
+] [2 | |
+ | |
+] | |
+Chapter 1. | |
+LaTeX Font Info: Font shape `T1/phv/bx/n' in size <14.4> not available | |
+(Font) Font shape `T1/phv/b/n' tried instead on input line 129. | |
+LaTeX Font Info: Try loading font information for T1+pcr on input line 137. | |
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd | |
+File: t1pcr.fd 2001/06/04 font definitions for T1/pcr. | |
+) | |
+LaTeX Font Info: Try loading font information for TS1+ptm on input line 146. | |
+ | |
+ | |
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1ptm.fd | |
+File: ts1ptm.fd 2001/06/04 font definitions for TS1/ptm. | |
+) [3] | |
+LaTeX Font Info: Font shape `T1/phv/bx/it' in size <14.4> not available | |
+(Font) Font shape `T1/phv/b/it' tried instead on input line 212. | |
+LaTeX Font Info: Font shape `T1/phv/b/it' in size <14.4> not available | |
+(Font) Font shape `T1/phv/b/sl' tried instead on input line 212. | |
+LaTeX Font Info: Font shape `T1/ptm/bx/it' in size <10> not available | |
+(Font) Font shape `T1/ptm/b/it' tried instead on input line 249. | |
+ | |
+Overfull \hbox (100.74922pt too wide) in paragraph at lines 249--249 | |
+[] | |
+ [] | |
+ | |
+ | |
+Underfull \hbox (badness 10000) in paragraph at lines 249--249 | |
+ | |
+ [] | |
+ | |
+[4] [5] [6 | |
+ | |
+] | |
+Chapter 2. | |
+[7] [8 | |
+ | |
+] | |
+Chapter 3. | |
+LaTeX Font Info: Font shape `T1/pcr/bx/n' in size <10> not available | |
+(Font) Font shape `T1/pcr/b/n' tried instead on input line 273. | |
+ | |
+Underfull \hbox (badness 10000) in paragraph at lines 314--314 | |
+[]\T1/ptm/m/it/10 mu_s=0.4\T1/ptm/m/n/10 , \T1/ptm/m/it/10 mu_d=0.4\T1/ptm/m/n/ | |
+10 , \T1/ptm/m/it/10 mu_r=0.0\T1/ptm/m/n/10 , \T1/ptm/m/it/10 rho=2600\T1/ptm/m | |
+/n/10 , \T1/ptm/m/it/10 k_n=1160000000.0\T1/ptm/m/n/10 , | |
+ [] | |
+ | |
+ | |
+Underfull \hbox (badness 10000) in paragraph at lines 314--314 | |
+\T1/ptm/m/it/10 k_t=1160000000.0\T1/ptm/m/n/10 , \T1/ptm/m/it/10 k_r=0\T1/ptm/m | |
+/n/10 , \T1/ptm/m/it/10 gamma_n=0\T1/ptm/m/n/10 , \T1/ptm/m/it/10 gamma_t=0\T1/ | |
+ptm/m/n/10 , \T1/ptm/m/it/10 gamma_r=0\T1/ptm/m/n/10 , | |
+ [] | |
+ | |
+[9] [10] [11] [12 | |
+ | |
+] | |
+Chapter 4. | |
+ | |
+Underfull \hbox (badness 10000) in paragraph at lines 623--624 | |
+[]\T1/ptm/m/n/10 Initialization of Thrust-foot-note{url{[][]https://code.google | |
+.com/p/thrust/[][]}} radix sort con-fig-u-ra-tion | |
+ [] | |
+ | |
+[13] | |
+Underfull \hbox (badness 10000) in paragraph at lines 692--694 | |
+\T1/ptm/m/n/10 (texttt{file_io.cpp}). item Up-date of verb''<simulation_ID>.sta | |
+tus#..bin'' | |
+ [] | |
+ | |
+ | |
+Underfull \hbox (badness 10000) in paragraph at lines 739--740 | |
+[]\T1/ptm/m/n/10 Initialization of Thrust-foot-note{url{[][]https://code.google | |
+.com/p/thrust/[][]}} radix sort con-fig-u-ra-tion | |
+ [] | |
+ | |
+[14] [15] | |
+Underfull \hbox (badness 5077) in paragraph at lines 838--841 | |
+[]\T1/ptm/m/n/10 subsubsection{Host and de-vice mem-ory types} la-bel{subsubsec | |
+:memorytypes} A full, listed de-scrip-tion | |
+ [] | |
+ | |
+ | |
+Underfull \hbox (badness 6961) in paragraph at lines 838--841 | |
+\T1/ptm/m/n/10 of the \T1/ptm/m/it/10 sphere \T1/ptm/m/n/10 source code vari-ab | |
+les can be found in ap-pendix ref{apx:SourceCodeVariables}, page | |
+ [] | |
+ | |
+[16] [17] [18] | |
+Chapter 5. | |
+[19 | |
+ | |
+] [20 | |
+ | |
+] [21 | |
+ | |
+ | |
+] (./sphere.ind [22 | |
+ | |
+ | |
+] [23 | |
+ | |
+]) | |
+Package atveryend Info: Empty hook `BeforeClearDocument' on input line 1100. | |
+Package atveryend Info: Empty hook `AfterLastShipout' on input line 1100. | |
+ (./sphere.aux) | |
+Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 1100. | |
+Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 1100. | |
+ | |
+Package rerunfilecheck Info: File `sphere.out' has not changed. | |
+(rerunfilecheck) Checksum: F0E69FFF2D4D8EE67B756397404F5D9E;653. | |
+ | |
+ | |
+LaTeX Warning: There were multiply-defined labels. | |
+ | |
+Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 1100. | |
+ ) | |
+Here is how much of TeX's memory you used: | |
+ 9004 strings out of 495059 | |
+ 125176 string characters out of 3182030 | |
+ 222940 words of memory out of 3000000 | |
+ 11835 multiletter control sequences out of 15000+200000 | |
+ 57989 words of font info for 65 fonts, out of 3000000 for 9000 | |
+ 15 hyphenation exceptions out of 8191 | |
+ 36i,15n,45p,844b,484s stack positions out of 5000i,500n,10000p,200000b,50000s | |
+{/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc}</usr/share/texliv | |
+e/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texlive/texm | |
+f-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texlive/texmf-dist/ | |
+fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texlive/texmf-dist/fonts/t | |
+ype1/urw/courier/ucrb8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/cour | |
+ier/ucrr8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvb8a.p | |
+fb></usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvbo8a.pfb></usr/sh | |
+are/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvr8a.pfb></usr/share/texlive/ | |
+texmf-dist/fonts/type1/urw/times/utmb8a.pfb></usr/share/texlive/texmf-dist/font | |
+s/type1/urw/times/utmbi8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/ti | |
+mes/utmr8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmri8a.pfb | |
+> | |
+Output written on sphere.pdf (27 pages, 174541 bytes). | |
+PDF statistics: | |
+ 461 PDF objects out of 1000 (max. 8388607) | |
+ 415 compressed objects within 5 object streams | |
+ 169 named destinations out of 1000 (max. 500000) | |
+ 97 words of extra memory for PDF output out of 10000 (max. 10000000) | |
+ | |
diff --git a/doc/latex/sphere.out b/doc/latex/sphere.out | |
t@@ -0,0 +1,12 @@ | |
+\BOOKMARK [0][-]{chapter.1}{Introduction}{}% 1 | |
+\BOOKMARK [1][-]{section.1.1}{Requirements}{chapter.1}% 2 | |
+\BOOKMARK [1][-]{section.1.2}{Building sphere}{chapter.1}% 3 | |
+\BOOKMARK [1][-]{section.1.3}{Work flow}{chapter.1}% 4 | |
+\BOOKMARK [0][-]{chapter.2}{Discrete element method}{}% 5 | |
+\BOOKMARK [0][-]{chapter.3}{Python API}{}% 6 | |
+\BOOKMARK [0][-]{chapter.4}{sphere internals}{}% 7 | |
+\BOOKMARK [1][-]{section.4.1}{Numerical algorithm}{chapter.4}% 8 | |
+\BOOKMARK [1][-]{section.4.2}{C++ reference}{chapter.4}% 9 | |
+\BOOKMARK [0][-]{chapter.5}{Indices and tables}{}% 10 | |
+\BOOKMARK [0][-]{section*.68}{Python Module Index}{}% 11 | |
+\BOOKMARK [0][-]{section*.69}{Index}{}% 12 | |
diff --git a/doc/latex/sphere.pdf b/doc/latex/sphere.pdf | |
Binary files differ. | |
diff --git a/doc/latex/sphere.tex b/doc/latex/sphere.tex | |
t@@ -0,0 +1,1100 @@ | |
+% Generated by Sphinx. | |
+\def\sphinxdocclass{report} | |
+\documentclass[letterpaper,10pt,english]{sphinxmanual} | |
+\usepackage[utf8]{inputenc} | |
+\DeclareUnicodeCharacter{00A0}{\nobreakspace} | |
+\usepackage[T1]{fontenc} | |
+\usepackage{babel} | |
+\usepackage{times} | |
+\usepackage[Bjarne]{fncychap} | |
+\usepackage{longtable} | |
+\usepackage{sphinx} | |
+\usepackage{multirow} | |
+ | |
+ | |
+\title{sphere Documentation} | |
+\date{January 26, 2013} | |
+\release{0.35} | |
+\author{Anders Damsgaard} | |
+\newcommand{\sphinxlogo}{} | |
+\renewcommand{\releasename}{Release} | |
+\makeindex | |
+ | |
+\makeatletter | |
+\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax% | |
+ \let\PYG@ul=\relax \let\PYG@tc=\relax% | |
+ \let\PYG@bc=\relax \let\PYG@ff=\relax} | |
+\def\PYG@tok#1{\csname PYG@tok@#1\endcsname} | |
+\def\PYG@toks#1+{\ifx\relax#1\empty\else% | |
+ \PYG@tok{#1}\expandafter\PYG@toks\fi} | |
+\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{% | |
+ \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}} | |
+\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}} | |
+ | |
+\expandafter\def\csname PYG@tok@gd\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@gu\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@gt\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@gs\endcsname{\let\PYG@bf=\textbf} | |
+\expandafter\def\csname PYG@tok@gr\endcsname{\def\PYG@tc##1{\textcolor[rgb]{1.… | |
+\expandafter\def\csname PYG@tok@cm\endcsname{\let\PYG@it=\textit\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@vg\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@m\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.1… | |
+\expandafter\def\csname PYG@tok@mh\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@cs\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@ge\endcsname{\let\PYG@it=\textit} | |
+\expandafter\def\csname PYG@tok@vc\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@il\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@go\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@cp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@gi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@gh\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@ni\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@nl\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@nn\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@no\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@nc\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@nd\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@ne\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@nf\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@si\endcsname{\let\PYG@it=\textit\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@s2\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@vi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@nt\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@nv\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@s1\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@gp\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@sh\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@ow\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@sx\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@bp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@c1\endcsname{\let\PYG@it=\textit\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@kc\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@c\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{… | |
+\expandafter\def\csname PYG@tok@mf\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@err\endcsname{\def\PYG@bc##1{\setlength{\fboxs… | |
+\expandafter\def\csname PYG@tok@kd\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@ss\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@sr\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@mo\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@mi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@kn\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@o\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.4… | |
+\expandafter\def\csname PYG@tok@kr\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@s\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.2… | |
+\expandafter\def\csname PYG@tok@kp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@w\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.7… | |
+\expandafter\def\csname PYG@tok@kt\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@sc\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@sb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.… | |
+\expandafter\def\csname PYG@tok@k\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{… | |
+\expandafter\def\csname PYG@tok@se\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1… | |
+\expandafter\def\csname PYG@tok@sd\endcsname{\let\PYG@it=\textit\def\PYG@tc##1… | |
+ | |
+\def\PYGZbs{\char`\\} | |
+\def\PYGZus{\char`\_} | |
+\def\PYGZob{\char`\{} | |
+\def\PYGZcb{\char`\}} | |
+\def\PYGZca{\char`\^} | |
+\def\PYGZam{\char`\&} | |
+\def\PYGZlt{\char`\<} | |
+\def\PYGZgt{\char`\>} | |
+\def\PYGZsh{\char`\#} | |
+\def\PYGZpc{\char`\%} | |
+\def\PYGZdl{\char`\$} | |
+\def\PYGZti{\char`\~} | |
+% for compatibility with earlier versions | |
+\def\PYGZat{@} | |
+\def\PYGZlb{[} | |
+\def\PYGZrb{]} | |
+\makeatother | |
+ | |
+\begin{document} | |
+ | |
+\maketitle | |
+\tableofcontents | |
+\phantomsection\label{index::doc} | |
+ | |
+ | |
+This is the official documentation for the \emph{sphere} discrete element mode… | |
+ | |
+\emph{sphere} is developed by Anders Damsgaard Christensen under supervision o… | |
+ | |
+Contact: Anders Damsgaard Christensen, \href{http://cs.au.dk/~adc}{http://cs.a… | |
+ | |
+Contents: | |
+ | |
+ | |
+\chapter{Introduction} | |
+\label{introduction:welcome-to-sphere-s-documentation}\label{introduction:intr… | |
+The \emph{sphere}-software is used for three-dimensional discrete element meth… | |
+The ultimate aim of the \emph{sphere} software is to simulate soft-bedded subg… | |
+ | |
+The purpose of this documentation is to provide the user with a thorough walk-… | |
+ | |
+\begin{notice}{note}{Note:} | |
+Command examples in this document starting with the symbol \code{\$} are meant… | |
+\end{notice} | |
+ | |
+All numerical values in this document, the source code, and the configuration … | |
+ | |
+ | |
+\section{Requirements} | |
+\label{introduction:requirements}\begin{description} | |
+\item[{The build requirements are:}] \leavevmode\begin{itemize} | |
+\item {} | |
+A Nvidia CUDA-supported version of Linux or Mac OS X (see the \href{http://doc… | |
+ | |
+\item {} | |
+\href{https://www.gnu.org/software/make/}{GNU Make} | |
+ | |
+\item {} | |
+The \href{http://gcc.gnu.org/}{GNU Compiler Collection} (GCC) | |
+ | |
+\item {} | |
+The \href{https://developer.nvidia.com/cuda-downloads}{Nvidia CUDA toolkit and… | |
+ | |
+\end{itemize} | |
+ | |
+\item[{The runtime requirements are:}] \leavevmode\begin{itemize} | |
+\item {} | |
+A \href{http://www.nvidia.com/object/cuda\_gpus.html}{CUDA-enabled GPU} with c… | |
+ | |
+\item {} | |
+A Nvidia CUDA-enabled GPU and device driver | |
+ | |
+\end{itemize} | |
+ | |
+\item[{Optional tools, required for simulation setup and data processing:}] \l… | |
+\item {} | |
+\href{http://www.python.org/getit/releases/2.7/}{Python 2.7} | |
+ | |
+\item {} | |
+\href{http://numpy.scipy.org}{Numpy} | |
+ | |
+\item {} | |
+\href{http://matplotlib.org}{Matplotlib} | |
+ | |
+\item {} | |
+\href{http://www.imagemagick.org/script/index.php}{Imagemagick} | |
+ | |
+\item {} | |
+\href{http://ffmpeg.org/}{ffmpeg} | |
+ | |
+\end{itemize} | |
+ | |
+\item[{Optional tools, required for building the documentation:}] \leavevmode\… | |
+\item {} | |
+\href{http://sphinx-doc.org}{Sphinx} | |
+\begin{itemize} | |
+\item {} | |
+\href{http://packages.python.org/sphinxcontrib-programoutput/}{sphinxcontrib-p… | |
+ | |
+\end{itemize} | |
+ | |
+\item {} | |
+\href{http://www.stack.nl/~dimitri/doxygen/}{Doxygen} | |
+ | |
+\item {} | |
+\href{http://michaeljones.github.com/breathe/}{Breathe} | |
+ | |
+\item {} | |
+\href{http://www.nongnu.org/dvipng/}{dvipng} | |
+ | |
+\end{itemize} | |
+ | |
+\end{description} | |
+ | |
+\href{http://git-scm.com}{Git} is used as the distributed version control syst… | |
+ | |
+ | |
+\section{Building \emph{sphere}} | |
+\label{introduction:building-sphere} | |
+All instructions required for building \emph{sphere} are provided in a number … | |
+ | |
+\begin{Verbatim}[commandchars=\\\{\}] | |
+\$ cd src | |
+\$ make | |
+\end{Verbatim} | |
+ | |
+If successfull, the GNU Makefile will create the required data folders, object… | |
+ | |
+\begin{Verbatim}[commandchars=\\\{\}] | |
+\$ ./sphere\_* --version | |
+\end{Verbatim} | |
+ | |
+The output should look similar to this: | |
+ | |
+Command u'../../sphere\_linux\_X86\_64 --version' failed: {[}Errno 2{]} No suc… | |
+ | |
+ | |
+The documentation can be read in the \href{http://docutils.sourceforge.net/doc… | |
+ | |
+\begin{Verbatim}[commandchars=\\\{\}] | |
+\$ cd doc/sphinx | |
+\$ make html | |
+\$ make latexpdf | |
+\end{Verbatim} | |
+ | |
+To see all available output formats, execute: | |
+ | |
+\begin{Verbatim}[commandchars=\\\{\}] | |
+\$ make help | |
+\end{Verbatim} | |
+ | |
+ | |
+\section{Work flow} | |
+\label{introduction:work-flow}\begin{description} | |
+\item[{After compiling the \emph{sphere} binary, the procedure of a creating a… | |
+\item {} | |
+Setup of particle assemblage, physical properties and conditions using the Pyt… | |
+ | |
+\item {} | |
+Execution of \emph{sphere} software, which simulates the particle behavior as … | |
+ | |
+\item {} | |
+Inspection, analysis, interpretation and visualization of \emph{sphere} output… | |
+ | |
+\end{itemize} | |
+ | |
+\end{description} | |
+ | |
+ | |
+\chapter{Discrete element method} | |
+\label{dem::doc}\label{dem:discrete-element-method} | |
+The discrete element method (or distinct element method) was initially formula… | |
+ | |
+ | |
+\chapter{Python API} | |
+\label{python_api:module-sphere}\label{python_api::doc}\label{python_api:pytho… | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin}\pysiglinewithargsret{\stron… | |
+Class containing all data SPHERE data. | |
+ | |
+Contains functions for reading and writing binaries, as well as simulation | |
+setup and data analysis. | |
+\index{adjustUpperWall() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.adjustUpperWall}\pysiglinewi… | |
+Adjust grid and dynamic upper wall to max. particle height | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{bond() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.bond}\pysiglinewithargsret{\… | |
+Create a bond between particles i and j | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{bulkPorosity() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.bulkPorosity}\pysiglinewitha… | |
+Calculate and return the bulk porosity | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{consolidate() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.consolidate}\pysiglinewithar… | |
+Setup consolidation experiment. Specify the upper wall | |
+deviatoric stress in Pascal, default value is 10 kPa. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{defaultParams() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.defaultParams}\pysiglinewith… | |
+Initialize particle parameters to default values. | |
+Radii must be set prior to calling this function. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{energy() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.energy}\pysiglinewithargsret… | |
+Calculate the sum of the energy components of all particles. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{generateRadii() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.generateRadii}\pysiglinewith… | |
+Draw random particle radii from the selected probability distribution. | |
+Specify mean radius and variance. The variance should be kept at a | |
+very low value. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{initGrid() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.initGrid}\pysiglinewithargsr… | |
+Initialize grid suitable for the particle positions set previously. | |
+The margin parameter adjusts the distance (in no. of max. radii) | |
+from the particle boundaries. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{initGridAndWorldsize() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.initGridAndWorldsize}\pysigl… | |
+Initialize grid suitable for the particle positions set previously. | |
+The margin parameter adjusts the distance (in no. of max. radii) | |
+from the particle boundaries. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{initGridPos() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.initGridPos}\pysiglinewithar… | |
+Initialize particle positions in loose, cubic configuration. | |
+Radii must be set beforehand. | |
+xynum is the number of rows in both x- and y- directions. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{initRandomGridPos() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.initRandomGridPos}\pysigline… | |
+Initialize particle positions in loose, cubic configuration. | |
+Radii must be set beforehand. | |
+xynum is the number of rows in both x- and y- directions. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{initRandomPos() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.initRandomPos}\pysiglinewith… | |
+Initialize particle positions in loose, cubic configuration. | |
+Radii must be set beforehand. | |
+xynum is the number of rows in both x- and y- directions. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{initTemporal() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.initTemporal}\pysiglinewitha… | |
+Set temporal parameters for the simulation. | |
+Particle radii and physical parameters need to be set | |
+prior to these. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{porosity() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.porosity}\pysiglinewithargsr… | |
+Calculate the porosity as a function of depth, by averaging values | |
+in horizontal slabs. | |
+Returns porosity values and depth | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{readbin() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.readbin}\pysiglinewithargsre… | |
+Reads a target SPHERE binary file | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{render() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.render}\pysiglinewithargsret… | |
+Render all output files that belong to the simulation, determined by sid. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{run() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.run}\pysiglinewithargsret{\b… | |
+Execute sphere with target project | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{shear() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.shear}\pysiglinewithargsret{… | |
+Setup shear experiment. Specify the upper wall | |
+deviatoric stress in Pascal, default value is 10 kPa. | |
+The shear strain rate is the shear length divided by the | |
+initial height per second. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{shearstrain() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.shearstrain}\pysiglinewithar… | |
+Calculates and returns the shear strain (gamma) value of the experiment | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{shearvel() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.shearvel}\pysiglinewithargsr… | |
+Calculates and returns the shear velocity (gamma\_dot) of the experiment | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{thinsection\_x1x3() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.thinsection_x1x3}\pysiglinew… | |
+Produce a 2D image of particles on a x1,x3 plane, intersecting the second axis… | |
+Output is saved as `\textless{}sid\textgreater{}-ts-x1x3.txt' in the current f… | |
+ | |
+An upper limit to the pressure color bar range can be set by the cbmax paramet… | |
+\begin{description} | |
+\item[{The data can be plotted in gnuplot with:}] \leavevmode | |
+gnuplot\textgreater{} set size ratio -1 | |
+gnuplot\textgreater{} set palette defined (0 ``blue'', 0.5 ``gray'', 1 ``red'') | |
+gnuplot\textgreater{} plot `\textless{}sid\textgreater{}-ts-x1x3.txt' with cir… | |
+ | |
+\end{description} | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{torqueScript() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.torqueScript}\pysiglinewitha… | |
+Create job script for the Torque queue manager for the binary | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{uniaxialStrainRate() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.uniaxialStrainRate}\pysiglin… | |
+Setup consolidation experiment. Specify the upper wall | |
+velocity in m/s, default value is -0.001 m/s (i.e. downwards). | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{voidRatio() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.voidRatio}\pysiglinewithargs… | |
+Returns the current void ratio | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{writebin() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.writebin}\pysiglinewithargsr… | |
+Writes to a target SPHERE binary file | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{zeroKinematics() (sphere.Spherebin method)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.Spherebin.zeroKinematics}\pysiglinewit… | |
+Zero kinematics of particles | |
+ | |
+\end{fulllineitems} | |
+ | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{V\_sphere() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.V_sphere}\pysiglinewithargsret{\code{s… | |
+Returns the volume of a sphere with radius r | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{convert() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.convert}\pysiglinewithargsret{\code{sp… | |
+Converts all PPM images in img\_out to graphicsformat, using ImageMagick | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{render() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.render}\pysiglinewithargsret{\code{sph… | |
+Render target binary using the sphere raytracer. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{run() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.run}\pysiglinewithargsret{\code{sphere… | |
+Execute sphere with target binary as input | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{status() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.status}\pysiglinewithargsret{\code{sph… | |
+Check the status.dat file for the target project, | |
+and return the last file numer. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{thinsectionVideo() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.thinsectionVideo}\pysiglinewithargsret… | |
+Use ffmpeg to combine thin section images to animation. | |
+This function will start off by rendering the images. | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{video() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.video}\pysiglinewithargsret{\code{sphe… | |
+Use ffmpeg to combine images to animation. All images should be rendered befor… | |
+ | |
+\end{fulllineitems} | |
+ | |
+\index{visualize() (in module sphere)} | |
+ | |
+\begin{fulllineitems} | |
+\phantomsection\label{python_api:sphere.visualize}\pysiglinewithargsret{\code{… | |
+Visualize output from the target project, | |
+where the temporal progress is of interest. | |
+ | |
+\end{fulllineitems} | |
+ | |
+ | |
+ | |
+\chapter{sphere internals} | |
+\label{sphere_internals:sphere-internals}\label{sphere_internals::doc} | |
+The \emph{sphere} executable has the following options: | |
+ | |
+Command u'../../sphere\_linux\_X86\_64 --help' failed: {[}Errno 2{]} No such f… | |
+ | |
+ | |
+The most common way to invoke \emph{sphere} is however via the Python API (e.g… | |
+ | |
+subsection\{The \emph{sphere} algorithm\} | |
+label\{subsec:spherealgo\} | |
+The \emph{sphere}-binary is launched from the system terminal by passing the s… | |
+\#. System check, including search for NVIDIA CUDA compatible devices (texttt\… | |
+\begin{enumerate} | |
+\item {} | |
+Initial data import from binary input file (texttt\{main.cpp\}). | |
+ | |
+\item {} | |
+Allocation of memory for all host variables (particles, grid, walls, etc.) (te… | |
+ | |
+\item {} | |
+Continued import from binary input file (texttt\{main.cpp\}). | |
+ | |
+\item {} | |
+Control handed to GPU-specific function texttt\{gpuMain(ldots)\} (texttt\{devi… | |
+ | |
+\item {} | |
+Memory allocation of device memory (texttt\{device.cu\}). | |
+ | |
+\item {} | |
+Transfer of data from host to device variables (texttt\{device.cu\}). | |
+ | |
+\item {} | |
+Initialization of Thrustfootnote\{url\{\href{https://code.google.com/p/thrust/… | |
+ | |
+\item {} | |
+Calculation of GPU workload configuration (thread and block layout) (texttt\{d… | |
+ | |
+\item {} | |
+Status and data written to verb''\textless{}simulation\_ID\textgreater{}.statu… | |
+ | |
+\item {} | |
+Main loop (while texttt\{time.current \textless{}= time.total\}) (functions ca… | |
+ | |
+\end{enumerate} | |
+\begin{enumerate} | |
+\item {} | |
+label\{loopstart\}CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{calcParticleCellID\textless{}\textless{}\textless{},\textgreater{}\tex… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{thrust::sort\_by\_key(ldots)\}: Thrust radix sort of particle-grid has… | |
+ | |
+\item {} | |
+texttt\{cudaMemset(ldots)\}: Writing zero value (texttt\{0xffffffff\}) to empt… | |
+ | |
+\item {} | |
+texttt\{reorderArrays\textless{}\textless{}\textless{},\textgreater{}\textgrea… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+Optional: texttt\{topology\textless{}\textless{}\textless{},\textgreater{}\tex… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{interact\textless{}\textless{}\textless{},\textgreater{}\textgreater{}… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{integrate\textless{}\textless{}\textless{},\textgreater{}\textgreater{… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{summation\textless{}\textless{}\textless{},\textgreater{}\textgreater{… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{integrateWalls\textless{}\textless{}\textless{},\textgreater{}\textgre… | |
+ | |
+\item {} | |
+Update of timers and loop-related counters (e.g. texttt\{time.current\}), (tex… | |
+ | |
+\item {} | |
+If file output interval is reached: | |
+\begin{quote} | |
+\begin{quote} | |
+ | |
+item Optional write of data to output binary (verb''\textless{}simulation\_ID\… | |
+item Update of verb''\textless{}simulation\_ID\textgreater{}.status\#..bin'' (… | |
+\end{quote} | |
+ | |
+item Return to point ref\{loopstart\}, unless texttt\{time.current \textgreate… | |
+\end{quote} | |
+ | |
+\end{enumerate} | |
+\begin{enumerate} | |
+\item {} | |
+label\{loopend\}Liberation of device memory (texttt\{device.cu\}). | |
+ | |
+\item {} | |
+Control returned to texttt\{main(ldots)\}, liberation of host memory (texttt\{… | |
+ | |
+\item {} | |
+End of program, return status equal to zero (0) if no problems where encounter… | |
+ | |
+\end{enumerate} | |
+ | |
+ | |
+\section{Numerical algorithm} | |
+\label{sphere_internals:numerical-algorithm} | |
+The \emph{sphere}-binary is launched from the system terminal by passing the s… | |
+\begin{enumerate} | |
+\item {} | |
+System check, including search for NVIDIA CUDA compatible devices (texttt\{mai… | |
+ | |
+\item {} | |
+Initial data import from binary input file (texttt\{main.cpp\}). | |
+ | |
+\item {} | |
+Allocation of memory for all host variables (particles, grid, walls, etc.) (te… | |
+ | |
+\item {} | |
+Continued import from binary input file (texttt\{main.cpp\}). | |
+ | |
+\item {} | |
+Control handed to GPU-specific function texttt\{gpuMain(ldots)\} (texttt\{devi… | |
+ | |
+\item {} | |
+Memory allocation of device memory (texttt\{device.cu\}). | |
+ | |
+\item {} | |
+Transfer of data from host to device variables (texttt\{device.cu\}). | |
+ | |
+\item {} | |
+Initialization of Thrustfootnote\{url\{\href{https://code.google.com/p/thrust/… | |
+ | |
+\item {} | |
+Calculation of GPU workload configuration (thread and block layout) (texttt\{d… | |
+ | |
+\item {} | |
+Status and data written to verb''\textless{}simulation\_ID\textgreater{}.statu… | |
+ | |
+\item {} | |
+Main loop (while texttt\{time.current \textless{}= time.total\}) (functions ca… | |
+ | |
+\end{enumerate} | |
+\begin{enumerate} | |
+\item {} | |
+label\{loopstart\}CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{calcParticleCellID\textless{}\textless{}\textless{},\textgreater{}\tex… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{thrust::sort\_by\_key(ldots)\}: Thrust radix sort of particle-grid has… | |
+ | |
+\item {} | |
+texttt\{cudaMemset(ldots)\}: Writing zero value (texttt\{0xffffffff\}) to empt… | |
+ | |
+\item {} | |
+texttt\{reorderArrays\textless{}\textless{}\textless{},\textgreater{}\textgrea… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+Optional: texttt\{topology\textless{}\textless{}\textless{},\textgreater{}\tex… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{interact\textless{}\textless{}\textless{},\textgreater{}\textgreater{}… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{integrate\textless{}\textless{}\textless{},\textgreater{}\textgreater{… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{summation\textless{}\textless{}\textless{},\textgreater{}\textgreater{… | |
+ | |
+\item {} | |
+CUDA thread synchronization point. | |
+ | |
+\item {} | |
+texttt\{integrateWalls\textless{}\textless{}\textless{},\textgreater{}\textgre… | |
+ | |
+\item {} | |
+Update of timers and loop-related counters (e.g. texttt\{time.current\}), (tex… | |
+ | |
+\item {} | |
+If file output interval is reached: | |
+\begin{itemize} | |
+\item {} | |
+Optional write of data to output binary (verb''\textless{}simulation\_ID\textg… | |
+ | |
+\item {} | |
+Update of verb''\textless{}simulation\_ID\textgreater{}.status\#..bin'' (textt… | |
+ | |
+\end{itemize} | |
+ | |
+\item {} | |
+Return to point ref\{loopstart\}, unless texttt\{time.current \textgreater{}= … | |
+ | |
+\end{enumerate} | |
+\begin{enumerate} | |
+\item {} | |
+label\{loopend\}Liberation of device memory (texttt\{device.cu\}). | |
+ | |
+\item {} | |
+Control returned to texttt\{main(ldots)\}, liberation of host memory (texttt\{… | |
+ | |
+\item {} | |
+End of program, return status equal to zero (0) if no problems where encounter… | |
+ | |
+\end{enumerate} | |
+ | |
+The length of the computational time steps (texttt\{time.dt\}) is calculated v… | |
+\begin{gather} | |
+\begin{split}\Delta t = 0.075 \min \left( m/\max(k_n,k_t) \right)\end{split}\n… | |
+\end{gather} | |
+where $m$ is the particle mass, and $k$ are the elastic stiffnesses. | |
+The time step is set by this relationship in \code{initTemporal()}. | |
+This equation ensures that the elastic wave (traveling at the speed of sound) … | |
+ | |
+subsubsection\{Host and device memory types\} | |
+label\{subsubsec:memorytypes\} | |
+A full, listed description of the \emph{sphere} source code variables can be f… | |
+ | |
+The floating point precision operating internally in \emph{sphere} is defined … | |
+ | |
+Three-dimensional variables (e.g. spatial vectors in \emph{E\textasciicircum{}… | |
+ | |
+paragraph\{Host memory\} is the main random-access computer memory (RAM), i.e.… | |
+ | |
+paragraph\{Device memory\} is the main, global device memory. It resides off-c… | |
+ | |
+marginpar\{Todo: Expand section on device memory types\} | |
+ | |
+paragraph\{Constant memory\} values cannot be changed after they are set, and … | |
+ | |
+\%subsection\{The main loop\} | |
+\%label\{subsec:mainloop\} | |
+\%The \emph{sphere} software calculates particle movement and rotation based o… | |
+ | |
+subsection\{Performance\} | |
+marginpar\{Todo: insert graph of performance vs. np and performance vs. \emph{… | |
+subsubsection\{Particles and computational time\} | |
+ | |
+subsection\{Compilation\} | |
+label\{subsec:compilation\} | |
+An important note is that the texttt\{C\} examples of the NVIDIA CUDA SDK shou… | |
+ | |
+\emph{sphere} is supplied with several Makefiles, which automate the compilati… | |
+ | |
+ | |
+\section{C++ reference} | |
+\label{sphere_internals:c-reference}\phantomsection\label{sphere_internals:pro… | |
+\begin{DUlineblock}{0em} | |
+\item[] \emph{class} \textbf{DEM} | |
+\end{DUlineblock} | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+\emph{Public Functions}\begin{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1a3cd6355aefc172c712f1… | |
+\begin{DUlineblock}{0em} | |
+\item[] \textbf{DEM}(std::string inputbin, const int verbosity = 1, const int… | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1aa3066aa501f982c2df51… | |
+\begin{DUlineblock}{0em} | |
+\item[] \textbf{\textasciitilde{}DEM}(void) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1ac32ef9094b25ee9c35e3… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{readbin}(const char * target) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1a242634f10a9bc1f19e4e… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{writebin}(const char * target) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1a101aafa4f3197948fafb… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{checkValues}(void) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1ae2a1e6696686617f9cbe… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{reportValues}(void) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1a870787f68a947706aac1… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{startTime}(void) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1ab28a7813c5848d3b27e6… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{render}(const int method = 1, const float maxval = 1.0e3f… | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1a5abc32b3691e7336e80c… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{writePPM}(const char * target) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1ad4e191a3aa8491ae04f1… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{porosity}(const int z\_slices = 10) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1ad686ac121d845e804515… | |
+\begin{DUlineblock}{0em} | |
+\item[] Float3 \textbf{minPos}(void) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1ab6c76ee881de3d710fe1… | |
+\begin{DUlineblock}{0em} | |
+\item[] Float3 \textbf{maxPos}(void) | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1a9fa9b39cf7f038cc9613… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{findOverlaps}(std::vector\textless{} std::vector\textless… | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+ | |
+\phantomsection\label{sphere_internals:project0classDEM_1a0cb0fcf60594f664a9e5… | |
+\begin{DUlineblock}{0em} | |
+\item[] void \textbf{forcechains}(const std::string format = ``interactive'', … | |
+\end{DUlineblock} | |
+ | |
+\begin{quote} | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+\end{quote} | |
+\end{quote} | |
+\end{quote} | |
+ | |
+ | |
+\chapter{Indices and tables} | |
+\label{index:indices-and-tables}\begin{itemize} | |
+\item {} | |
+\emph{genindex} | |
+ | |
+\item {} | |
+\emph{search} | |
+ | |
+\end{itemize} | |
+ | |
+ | |
+\renewcommand{\indexname}{Python Module Index} | |
+\begin{theindex} | |
+\def\bigletter#1{{\Large\sffamily#1}\nopagebreak\vspace{1mm}} | |
+\bigletter{s} | |
+\item {\texttt{sphere}}, \pageref{python_api:module-sphere} | |
+\end{theindex} | |
+ | |
+\renewcommand{\indexname}{Index} | |
+\printindex | |
+\end{document} | |
diff --git a/doc/latex/sphere.toc b/doc/latex/sphere.toc | |
t@@ -0,0 +1,13 @@ | |
+\select@language {english} | |
+\contentsline {chapter}{\numberline {1}Introduction}{3}{chapter.1} | |
+\contentsline {section}{\numberline {1.1}Requirements}{3}{section.1.1} | |
+\contentsline {section}{\numberline {1.2}Building \emph {sphere}}{4}{section.1… | |
+\contentsline {section}{\numberline {1.3}Work flow}{4}{section.1.3} | |
+\contentsline {chapter}{\numberline {2}Discrete element method}{7}{chapter.2} | |
+\contentsline {chapter}{\numberline {3}Python API}{9}{chapter.3} | |
+\contentsline {chapter}{\numberline {4}sphere internals}{13}{chapter.4} | |
+\contentsline {section}{\numberline {4.1}Numerical algorithm}{14}{section.4.1} | |
+\contentsline {section}{\numberline {4.2}C++ reference}{16}{section.4.2} | |
+\contentsline {chapter}{\numberline {5}Indices and tables}{19}{chapter.5} | |
+\contentsline {chapter}{Python Module Index}{21}{section*.68} | |
+\contentsline {chapter}{Index}{23}{section*.69} | |
diff --git a/doc/latex/sphinx.sty b/doc/latex/sphinx.sty | |
t@@ -0,0 +1,478 @@ | |
+% | |
+% sphinx.sty | |
+% | |
+% Adapted from the old python.sty, mostly written by Fred Drake, | |
+% by Georg Brandl. | |
+% | |
+ | |
+\NeedsTeXFormat{LaTeX2e}[1995/12/01] | |
+\ProvidesPackage{sphinx}[2010/01/15 LaTeX package (Sphinx markup)] | |
+ | |
+\RequirePackage{textcomp} | |
+\RequirePackage{fancyhdr} | |
+\RequirePackage{fancybox} | |
+\RequirePackage{titlesec} | |
+\RequirePackage{tabulary} | |
+\RequirePackage{amsmath} % for \text | |
+\RequirePackage{makeidx} | |
+\RequirePackage{framed} | |
+\RequirePackage{ifthen} | |
+\RequirePackage{color} | |
+% For highlighted code. | |
+\RequirePackage{fancyvrb} | |
+% For table captions. | |
+\RequirePackage{threeparttable} | |
+% Handle footnotes in tables. | |
+\RequirePackage{footnote} | |
+\makesavenoteenv{tabulary} | |
+% For floating figures in the text. | |
+\RequirePackage{wrapfig} | |
+% Separate paragraphs by space by default. | |
+\RequirePackage{parskip} | |
+ | |
+% Redefine these colors to your liking in the preamble. | |
+\definecolor{TitleColor}{rgb}{0.126,0.263,0.361} | |
+\definecolor{InnerLinkColor}{rgb}{0.208,0.374,0.486} | |
+\definecolor{OuterLinkColor}{rgb}{0.216,0.439,0.388} | |
+% Redefine these colors to something not white if you want to have colored | |
+% background and border for code examples. | |
+\definecolor{VerbatimColor}{rgb}{1,1,1} | |
+\definecolor{VerbatimBorderColor}{rgb}{1,1,1} | |
+ | |
+% Uncomment these two lines to ignore the paper size and make the page | |
+% size more like a typical published manual. | |
+%\renewcommand{\paperheight}{9in} | |
+%\renewcommand{\paperwidth}{8.5in} % typical squarish manual | |
+%\renewcommand{\paperwidth}{7in} % O'Reilly ``Programmming Python'' | |
+ | |
+% For graphicx, check if we are compiling under latex or pdflatex. | |
+\ifx\pdftexversion\undefined | |
+ \usepackage{graphicx} | |
+\else | |
+ \usepackage[pdftex]{graphicx} | |
+\fi | |
+ | |
+% for PDF output, use colors and maximal compression | |
+\newif\ifsphinxpdfoutput\sphinxpdfoutputfalse | |
+\ifx\pdfoutput\undefined\else\ifcase\pdfoutput | |
+ \let\py@NormalColor\relax | |
+ \let\py@TitleColor\relax | |
+\else | |
+ \sphinxpdfoutputtrue | |
+ \input{pdfcolor} | |
+ \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}} | |
+ \def\py@TitleColor{\color{TitleColor}} | |
+ \pdfcompresslevel=9 | |
+\fi\fi | |
+ | |
+% XeLaTeX can do colors, too | |
+\ifx\XeTeXrevision\undefined\else | |
+ \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}} | |
+ \def\py@TitleColor{\color{TitleColor}} | |
+\fi | |
+ | |
+% Increase printable page size (copied from fullpage.sty) | |
+\topmargin 0pt | |
+\advance \topmargin by -\headheight | |
+\advance \topmargin by -\headsep | |
+ | |
+% attempt to work a little better for A4 users | |
+\textheight \paperheight | |
+\advance\textheight by -2in | |
+ | |
+\oddsidemargin 0pt | |
+\evensidemargin 0pt | |
+%\evensidemargin -.25in % for ``manual size'' documents | |
+\marginparwidth 0.5in | |
+ | |
+\textwidth \paperwidth | |
+\advance\textwidth by -2in | |
+ | |
+ | |
+% Style parameters and macros used by most documents here | |
+\raggedbottom | |
+\sloppy | |
+\hbadness = 5000 % don't print trivial gripes | |
+ | |
+\pagestyle{empty} % start this way; change for | |
+\pagenumbering{roman} % ToC & chapters | |
+ | |
+% Use this to set the font family for headers and other decor: | |
+\newcommand{\py@HeaderFamily}{\sffamily\bfseries} | |
+ | |
+% Redefine the 'normal' header/footer style when using "fancyhdr" package: | |
+\@ifundefined{fancyhf}{}{ | |
+ % Use \pagestyle{normal} as the primary pagestyle for text. | |
+ \fancypagestyle{normal}{ | |
+ \fancyhf{} | |
+ \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} | |
+ \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} | |
+ \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} | |
+ \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}} | |
+ \renewcommand{\headrulewidth}{0.4pt} | |
+ \renewcommand{\footrulewidth}{0.4pt} | |
+ } | |
+ % Update the plain style so we get the page number & footer line, | |
+ % but not a chapter or section title. This is to keep the first | |
+ % page of a chapter and the blank page between chapters `clean.' | |
+ \fancypagestyle{plain}{ | |
+ \fancyhf{} | |
+ \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} | |
+ \renewcommand{\headrulewidth}{0pt} | |
+ \renewcommand{\footrulewidth}{0.4pt} | |
+ } | |
+} | |
+ | |
+% Some custom font markup commands. | |
+% | |
+\newcommand{\strong}[1]{{\bf #1}} | |
+\newcommand{\code}[1]{\texttt{#1}} | |
+\newcommand{\bfcode}[1]{\code{\bfseries#1}} | |
+\newcommand{\email}[1]{\textsf{#1}} | |
+ | |
+% Redefine the Verbatim environment to allow border and background colors. | |
+% The original environment is still used for verbatims within tables. | |
+\let\OriginalVerbatim=\Verbatim | |
+\let\endOriginalVerbatim=\endVerbatim | |
+ | |
+% Play with vspace to be able to keep the indentation. | |
+\newlength\distancetoright | |
+\def\mycolorbox#1{% | |
+ \setlength\distancetoright{\linewidth}% | |
+ \advance\distancetoright -\@totalleftmargin % | |
+ \fcolorbox{VerbatimBorderColor}{VerbatimColor}{% | |
+ \begin{minipage}{\distancetoright}% | |
+ #1 | |
+ \end{minipage}% | |
+ }% | |
+} | |
+\def\FrameCommand{\mycolorbox} | |
+ | |
+\renewcommand{\Verbatim}[1][1]{% | |
+ % list starts new par, but we don't want it to be set apart vertically | |
+ \bgroup\parskip=0pt% | |
+ \smallskip% | |
+ % The list environement is needed to control perfectly the vertical | |
+ % space. | |
+ \list{}{% | |
+ \setlength\parskip{0pt}% | |
+ \setlength\itemsep{0ex}% | |
+ \setlength\topsep{0ex}% | |
+ \setlength\partopsep{0pt}% | |
+ \setlength\leftmargin{0pt}% | |
+ }% | |
+ \item\MakeFramed {\FrameRestore}% | |
+ \small% | |
+ \OriginalVerbatim[#1]% | |
+} | |
+\renewcommand{\endVerbatim}{% | |
+ \endOriginalVerbatim% | |
+ \endMakeFramed% | |
+ \endlist% | |
+ % close group to restore \parskip | |
+ \egroup% | |
+} | |
+ | |
+ | |
+% \moduleauthor{name}{email} | |
+\newcommand{\moduleauthor}[2]{} | |
+ | |
+% \sectionauthor{name}{email} | |
+\newcommand{\sectionauthor}[2]{} | |
+ | |
+% Augment the sectioning commands used to get our own font family in place, | |
+% and reset some internal data items: | |
+\titleformat{\section}{\Large\py@HeaderFamily}% | |
+ {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}{\py@NormalColor} | |
+\titleformat{\subsection}{\large\py@HeaderFamily}% | |
+ {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalCo… | |
+\titleformat{\subsubsection}{\py@HeaderFamily}% | |
+ {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@Norma… | |
+\titleformat{\paragraph}{\small\py@HeaderFamily}% | |
+ {\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor} | |
+ | |
+% {fulllineitems} is the main environment for object descriptions. | |
+% | |
+\newcommand{\py@itemnewline}[1]{% | |
+ \@tempdima\linewidth% | |
+ \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}% | |
+} | |
+ | |
+\newenvironment{fulllineitems}{ | |
+ \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt | |
+ \rightmargin 0pt \topsep -\parskip \partopsep \parskip | |
+ \itemsep -\parsep | |
+ \let\makelabel=\py@itemnewline} | |
+}{\end{list}} | |
+ | |
+% \optional is used for ``[, arg]``, i.e. desc_optional nodes. | |
+\newcommand{\optional}[1]{% | |
+ {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} | |
+ | |
+\newlength{\py@argswidth} | |
+\newcommand{\py@sigparams}[2]{% | |
+ \parbox[t]{\py@argswidth}{#1\code{)}#2}} | |
+\newcommand{\pysigline}[1]{\item[#1]\nopagebreak} | |
+\newcommand{\pysiglinewithargsret}[3]{% | |
+ \settowidth{\py@argswidth}{#1\code{(}}% | |
+ \addtolength{\py@argswidth}{-2\py@argswidth}% | |
+ \addtolength{\py@argswidth}{\linewidth}% | |
+ \item[#1\code{(}\py@sigparams{#2}{#3}]} | |
+ | |
+% Production lists | |
+% | |
+\newenvironment{productionlist}{ | |
+% \def\optional##1{{\Large[}##1{\Large]}} | |
+ \def\production##1##2{\\\code{##1}&::=&\code{##2}} | |
+ \def\productioncont##1{\\& &\code{##1}} | |
+ \parindent=2em | |
+ \indent | |
+ \begin{tabular}{lcl} | |
+}{% | |
+ \end{tabular} | |
+} | |
+ | |
+% Notices / Admonitions | |
+% | |
+\newlength{\py@noticelength} | |
+ | |
+\newcommand{\py@heavybox}{ | |
+ \setlength{\fboxrule}{1pt} | |
+ \setlength{\fboxsep}{6pt} | |
+ \setlength{\py@noticelength}{\linewidth} | |
+ \addtolength{\py@noticelength}{-2\fboxsep} | |
+ \addtolength{\py@noticelength}{-2\fboxrule} | |
+ %\setlength{\shadowsize}{3pt} | |
+ \Sbox | |
+ \minipage{\py@noticelength} | |
+} | |
+\newcommand{\py@endheavybox}{ | |
+ \endminipage | |
+ \endSbox | |
+ \fbox{\TheSbox} | |
+} | |
+ | |
+\newcommand{\py@lightbox}{{% | |
+ \setlength\parskip{0pt}\par | |
+ \rule[0ex]{\linewidth}{0.5pt}% | |
+ \par\vspace{-0.5ex}% | |
+ }} | |
+\newcommand{\py@endlightbox}{{% | |
+ \setlength{\parskip}{0pt}% | |
+ \par\rule[0.5ex]{\linewidth}{0.5pt}% | |
+ \par\vspace{-0.5ex}% | |
+ }} | |
+ | |
+% Some are quite plain: | |
+\newcommand{\py@noticestart@note}{\py@lightbox} | |
+\newcommand{\py@noticeend@note}{\py@endlightbox} | |
+\newcommand{\py@noticestart@hint}{\py@lightbox} | |
+\newcommand{\py@noticeend@hint}{\py@endlightbox} | |
+\newcommand{\py@noticestart@important}{\py@lightbox} | |
+\newcommand{\py@noticeend@important}{\py@endlightbox} | |
+\newcommand{\py@noticestart@tip}{\py@lightbox} | |
+\newcommand{\py@noticeend@tip}{\py@endlightbox} | |
+ | |
+% Others gets more visible distinction: | |
+\newcommand{\py@noticestart@warning}{\py@heavybox} | |
+\newcommand{\py@noticeend@warning}{\py@endheavybox} | |
+\newcommand{\py@noticestart@caution}{\py@heavybox} | |
+\newcommand{\py@noticeend@caution}{\py@endheavybox} | |
+\newcommand{\py@noticestart@attention}{\py@heavybox} | |
+\newcommand{\py@noticeend@attention}{\py@endheavybox} | |
+\newcommand{\py@noticestart@danger}{\py@heavybox} | |
+\newcommand{\py@noticeend@danger}{\py@endheavybox} | |
+\newcommand{\py@noticestart@error}{\py@heavybox} | |
+\newcommand{\py@noticeend@error}{\py@endheavybox} | |
+ | |
+\newenvironment{notice}[2]{ | |
+ \def\py@noticetype{#1} | |
+ \csname py@noticestart@#1\endcsname | |
+ \strong{#2} | |
+}{\csname py@noticeend@\py@noticetype\endcsname} | |
+ | |
+% Allow the release number to be specified independently of the | |
+% \date{}. This allows the date to reflect the document's date and | |
+% release to specify the release that is documented. | |
+% | |
+\newcommand{\py@release}{} | |
+\newcommand{\version}{} | |
+\newcommand{\shortversion}{} | |
+\newcommand{\releaseinfo}{} | |
+\newcommand{\releasename}{Release} | |
+\newcommand{\release}[1]{% | |
+ \renewcommand{\py@release}{\releasename\space\version}% | |
+ \renewcommand{\version}{#1}} | |
+\newcommand{\setshortversion}[1]{% | |
+ \renewcommand{\shortversion}{#1}} | |
+\newcommand{\setreleaseinfo}[1]{% | |
+ \renewcommand{\releaseinfo}{#1}} | |
+ | |
+% Allow specification of the author's address separately from the | |
+% author's name. This can be used to format them differently, which | |
+% is a good thing. | |
+% | |
+\newcommand{\py@authoraddress}{} | |
+\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}} | |
+ | |
+% This sets up the fancy chapter headings that make the documents look | |
+% at least a little better than the usual LaTeX output. | |
+% | |
+\@ifundefined{ChTitleVar}{}{ | |
+ \ChNameVar{\raggedleft\normalsize\py@HeaderFamily} | |
+ \ChNumVar{\raggedleft \bfseries\Large\py@HeaderFamily} | |
+ \ChTitleVar{\raggedleft \rm\Huge\py@HeaderFamily} | |
+ % This creates chapter heads without the leading \vspace*{}: | |
+ \def\@makechapterhead#1{% | |
+ {\parindent \z@ \raggedright \normalfont | |
+ \ifnum \c@secnumdepth >\m@ne | |
+ \DOCH | |
+ \fi | |
+ \interlinepenalty\@M | |
+ \DOTI{#1} | |
+ } | |
+ } | |
+} | |
+ | |
+% Redefine description environment so that it is usable inside fulllineitems. | |
+% | |
+\renewcommand{\description}{% | |
+ \list{}{\labelwidth\z@% | |
+ \itemindent-\leftmargin% | |
+ \labelsep5pt% | |
+ \let\makelabel=\descriptionlabel}} | |
+ | |
+% Definition lists; requested by AMK for HOWTO documents. Probably useful | |
+% elsewhere as well, so keep in in the general style support. | |
+% | |
+\newenvironment{definitions}{% | |
+ \begin{description}% | |
+ \def\term##1{\item[##1]\mbox{}\\*[0mm]} | |
+}{% | |
+ \end{description}% | |
+} | |
+ | |
+% Tell TeX about pathological hyphenation cases: | |
+\hyphenation{Base-HTTP-Re-quest-Hand-ler} | |
+ | |
+ | |
+% The following is stuff copied from docutils' latex writer. | |
+% | |
+\newcommand{\optionlistlabel}[1]{\bf #1 \hfill} | |
+\newenvironment{optionlist}[1] | |
+{\begin{list}{} | |
+ {\setlength{\labelwidth}{#1} | |
+ \setlength{\rightmargin}{1cm} | |
+ \setlength{\leftmargin}{\rightmargin} | |
+ \addtolength{\leftmargin}{\labelwidth} | |
+ \addtolength{\leftmargin}{\labelsep} | |
+ \renewcommand{\makelabel}{\optionlistlabel}} | |
+}{\end{list}} | |
+ | |
+\newlength{\lineblockindentation} | |
+\setlength{\lineblockindentation}{2.5em} | |
+\newenvironment{lineblock}[1] | |
+{\begin{list}{} | |
+ {\setlength{\partopsep}{\parskip} | |
+ \addtolength{\partopsep}{\baselineskip} | |
+ \topsep0pt\itemsep0.15\baselineskip\parsep0pt | |
+ \leftmargin#1} | |
+ \raggedright} | |
+{\end{list}} | |
+ | |
+% Redefine includgraphics for avoiding images larger than the screen size | |
+% If the size is not specified. | |
+\let\py@Oldincludegraphics\includegraphics | |
+ | |
+\newbox\image@box% | |
+\newdimen\image@width% | |
+\renewcommand\includegraphics[2][\@empty]{% | |
+ \ifx#1\@empty% | |
+ \setbox\image@box=\hbox{\py@Oldincludegraphics{#2}}% | |
+ \image@width\wd\image@box% | |
+ \ifdim \image@width>\linewidth% | |
+ \setbox\image@box=\hbox{\py@Oldincludegraphics[width=\linewidth]{#2}}% | |
+ \box\image@box% | |
+ \else% | |
+ \py@Oldincludegraphics{#2}% | |
+ \fi% | |
+ \else% | |
+ \py@Oldincludegraphics[#1]{#2}% | |
+ \fi% | |
+} | |
+ | |
+ | |
+% Fix the index environment to add an entry to the Table of | |
+% Contents; this is much nicer than just having to jump to the end of the book | |
+% and flip around, especially with multiple indexes. | |
+% | |
+% A similiar fix must be done to the bibliography environment, although | |
+% dependant on document class. In particular, the '\addcontentsline' command | |
+% should use 'chapter' for a report and 'section' for an article. | |
+% See sphinxmanual.cls and sphinxhowto.cls for specific fixes. | |
+% | |
+\let\py@OldTheindex=\theindex | |
+\renewcommand{\theindex}{ | |
+ \cleardoublepage | |
+ \phantomsection | |
+ \py@OldTheindex | |
+ \addcontentsline{toc}{chapter}{\indexname} | |
+} | |
+ | |
+% Include hyperref last. | |
+\RequirePackage[colorlinks,breaklinks, | |
+ linkcolor=InnerLinkColor,filecolor=OuterLinkColor, | |
+ menucolor=OuterLinkColor,urlcolor=OuterLinkColor, | |
+ citecolor=InnerLinkColor]{hyperref} | |
+% Fix anchor placement for figures with captions. | |
+% (Note: we don't use a package option here; instead, we give an explicit | |
+% \capstart for figures that actually have a caption.) | |
+\RequirePackage{hypcap} | |
+ | |
+% From docutils.writers.latex2e | |
+\providecommand{\DUspan}[2]{% | |
+ {% group ("span") to limit the scope of styling commands | |
+ \@for\node@class@name:=#1\do{% | |
+ \ifcsname docutilsrole\node@class@name\endcsname% | |
+ \csname docutilsrole\node@class@name\endcsname% | |
+ \fi% | |
+ }% | |
+ {#2}% node content | |
+ }% close "span" | |
+} | |
+ | |
+\providecommand*{\DUprovidelength}[2]{ | |
+ \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} | |
+} | |
+ | |
+\DUprovidelength{\DUlineblockindent}{2.5em} | |
+\ifthenelse{\isundefined{\DUlineblock}}{ | |
+ \newenvironment{DUlineblock}[1]{% | |
+ \list{}{\setlength{\partopsep}{\parskip} | |
+ \addtolength{\partopsep}{\baselineskip} | |
+ \setlength{\topsep}{0pt} | |
+ \setlength{\itemsep}{0.15\baselineskip} | |
+ \setlength{\parsep}{0pt} | |
+ \setlength{\leftmargin}{#1}} | |
+ \raggedright | |
+ } | |
+ {\endlist} | |
+}{} | |
+ | |
+ | |
+% From footmisc.sty: allows footnotes in titles | |
+\let\FN@sf@@footnote\footnote | |
+\def\footnote{\ifx\protect\@typeset@protect | |
+ \expandafter\FN@sf@@footnote | |
+ \else | |
+ \expandafter\FN@sf@gobble@opt | |
+ \fi | |
+} | |
+\edef\FN@sf@gobble@opt{\noexpand\protect | |
+ \expandafter\noexpand\csname FN@sf@gobble@opt \endcsname} | |
+\expandafter\def\csname FN@sf@gobble@opt \endcsname{% | |
+ \@ifnextchar[%] | |
+ \FN@sf@gobble@twobracket | |
+ \@gobble | |
+} | |
+\def\FN@sf@gobble@twobracket[#1]#2{} | |
diff --git a/doc/latex/sphinxhowto.cls b/doc/latex/sphinxhowto.cls | |
t@@ -0,0 +1,92 @@ | |
+% | |
+% sphinxhowto.cls for Sphinx (http://sphinx.pocoo.org/) | |
+% | |
+ | |
+\NeedsTeXFormat{LaTeX2e}[1995/12/01] | |
+\ProvidesClass{sphinxhowto}[2009/06/02 Document class (Sphinx HOWTO)] | |
+ | |
+% 'oneside' option overriding the 'twoside' default | |
+\newif\if@oneside | |
+\DeclareOption{oneside}{\@onesidetrue} | |
+% Pass remaining document options to the parent class. | |
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} | |
+\ProcessOptions\relax | |
+ | |
+% Default to two-side document | |
+\if@oneside | |
+% nothing to do (oneside is the default) | |
+\else | |
+\PassOptionsToClass{twoside}{\sphinxdocclass} | |
+\fi | |
+ | |
+\LoadClass{\sphinxdocclass} | |
+ | |
+% Set some sane defaults for section numbering depth and TOC depth. You can | |
+% reset these counters in your preamble. | |
+% | |
+\setcounter{secnumdepth}{2} | |
+ | |
+% Change the title page to look a bit better, and fit in with the fncychap | |
+% ``Bjarne'' style a bit better. | |
+% | |
+\renewcommand{\maketitle}{ | |
+ \rule{\textwidth}{1pt} | |
+ \ifsphinxpdfoutput | |
+ \begingroup | |
+ % These \defs are required to deal with multi-line authors; it | |
+ % changes \\ to ', ' (comma-space), making it pass muster for | |
+ % generating document info in the PDF file. | |
+ \def\\{, } | |
+ \def\and{and } | |
+ \pdfinfo{ | |
+ /Author (\@author) | |
+ /Title (\@title) | |
+ } | |
+ \endgroup | |
+ \fi | |
+ \begin{flushright} | |
+ \sphinxlogo% | |
+ {\rm\Huge\py@HeaderFamily \@title} \par | |
+ {\em\large\py@HeaderFamily \py@release\releaseinfo} \par | |
+ \vspace{25pt} | |
+ {\Large\py@HeaderFamily | |
+ \begin{tabular}[t]{c} | |
+ \@author | |
+ \end{tabular}} \par | |
+ \vspace{25pt} | |
+ \@date \par | |
+ \py@authoraddress \par | |
+ \end{flushright} | |
+ \@thanks | |
+ \setcounter{footnote}{0} | |
+ \let\thanks\relax\let\maketitle\relax | |
+ %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} | |
+} | |
+ | |
+\let\py@OldTableofcontents=\tableofcontents | |
+\renewcommand{\tableofcontents}{ | |
+ \begingroup | |
+ \parskip = 0mm | |
+ \py@OldTableofcontents | |
+ \endgroup | |
+ \rule{\textwidth}{1pt} | |
+ \vspace{12pt} | |
+} | |
+ | |
+\@ifundefined{fancyhf}{ | |
+ \pagestyle{plain}}{ | |
+ \pagestyle{normal}} % start this way; change for | |
+\pagenumbering{arabic} % ToC & chapters | |
+ | |
+\thispagestyle{empty} | |
+ | |
+% Fix the bibliography environment to add an entry to the Table of | |
+% Contents. | |
+% For an article document class this environment is a section, | |
+% so no page break before it. | |
+\let\py@OldThebibliography=\thebibliography | |
+\renewcommand{\thebibliography}[1]{ | |
+ \phantomsection | |
+ \py@OldThebibliography{1} | |
+ \addcontentsline{toc}{section}{\bibname} | |
+} | |
diff --git a/doc/latex/sphinxmanual.cls b/doc/latex/sphinxmanual.cls | |
t@@ -0,0 +1,133 @@ | |
+% | |
+% sphinxmanual.cls for Sphinx (http://sphinx.pocoo.org/) | |
+% | |
+ | |
+\NeedsTeXFormat{LaTeX2e}[1995/12/01] | |
+\ProvidesClass{sphinxmanual}[2009/06/02 Document class (Sphinx manual)] | |
+ | |
+% chapters starting at odd pages (overridden by 'openany' document option) | |
+\PassOptionsToClass{openright}{\sphinxdocclass} | |
+ | |
+% 'oneside' option overriding the 'twoside' default | |
+\newif\if@oneside | |
+\DeclareOption{oneside}{\@onesidetrue} | |
+% Pass remaining document options to the parent class. | |
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} | |
+\ProcessOptions\relax | |
+ | |
+% Defaults two-side document | |
+\if@oneside | |
+% nothing to do (oneside is the default) | |
+\else | |
+\PassOptionsToClass{twoside}{\sphinxdocclass} | |
+\fi | |
+ | |
+\LoadClass{\sphinxdocclass} | |
+ | |
+% Set some sane defaults for section numbering depth and TOC depth. You can | |
+% reset these counters in your preamble. | |
+% | |
+\setcounter{secnumdepth}{2} | |
+\setcounter{tocdepth}{1} | |
+ | |
+% Change the title page to look a bit better, and fit in with the fncychap | |
+% ``Bjarne'' style a bit better. | |
+% | |
+\renewcommand{\maketitle}{% | |
+ \begin{titlepage}% | |
+ \let\footnotesize\small | |
+ \let\footnoterule\relax | |
+ \rule{\textwidth}{1pt}% | |
+ \ifsphinxpdfoutput | |
+ \begingroup | |
+ % These \defs are required to deal with multi-line authors; it | |
+ % changes \\ to ', ' (comma-space), making it pass muster for | |
+ % generating document info in the PDF file. | |
+ \def\\{, } | |
+ \def\and{and } | |
+ \pdfinfo{ | |
+ /Author (\@author) | |
+ /Title (\@title) | |
+ } | |
+ \endgroup | |
+ \fi | |
+ \begin{flushright}% | |
+ \sphinxlogo% | |
+ {\rm\Huge\py@HeaderFamily \@title \par}% | |
+ {\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par} | |
+ \vfill | |
+ {\LARGE\py@HeaderFamily | |
+ \begin{tabular}[t]{c} | |
+ \@author | |
+ \end{tabular} | |
+ \par} | |
+ \vfill\vfill | |
+ {\large | |
+ \@date \par | |
+ \vfill | |
+ \py@authoraddress \par | |
+ }% | |
+ \end{flushright}%\par | |
+ \@thanks | |
+ \end{titlepage}% | |
+ \cleardoublepage% | |
+ \setcounter{footnote}{0}% | |
+ \let\thanks\relax\let\maketitle\relax | |
+ %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} | |
+} | |
+ | |
+ | |
+% Catch the end of the {abstract} environment, but here make sure the abstract | |
+% is followed by a blank page if the 'openright' option is used. | |
+% | |
+\let\py@OldEndAbstract=\endabstract | |
+\renewcommand{\endabstract}{ | |
+ \if@openright | |
+ \ifodd\value{page} | |
+ \typeout{Adding blank page after the abstract.} | |
+ \vfil\pagebreak | |
+ \fi | |
+ \fi | |
+ \py@OldEndAbstract | |
+} | |
+ | |
+% This wraps the \tableofcontents macro with all the magic to get the spacing | |
+% right and have the right number of pages if the 'openright' option has been | |
+% used. This eliminates a fair amount of crud in the individual document file… | |
+% | |
+\let\py@OldTableofcontents=\tableofcontents | |
+\renewcommand{\tableofcontents}{% | |
+ \setcounter{page}{1}% | |
+ \pagebreak% | |
+ \pagestyle{plain}% | |
+ {% | |
+ \parskip = 0mm% | |
+ \py@OldTableofcontents% | |
+ \if@openright% | |
+ \ifodd\value{page}% | |
+ \typeout{Adding blank page after the table of contents.}% | |
+ \pagebreak\hspace{0pt}% | |
+ \fi% | |
+ \fi% | |
+ \cleardoublepage% | |
+ }% | |
+ \pagenumbering{arabic}% | |
+ \@ifundefined{fancyhf}{}{\pagestyle{normal}}% | |
+} | |
+ | |
+% This is needed to get the width of the section # area wide enough in the | |
+% library reference. Doing it here keeps it the same for all the manuals. | |
+% | |
+\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}} | |
+\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}} | |
+ | |
+% Fix the bibliography environment to add an entry to the Table of | |
+% Contents. | |
+% For a report document class this environment is a chapter. | |
+\let\py@OldThebibliography=\thebibliography | |
+\renewcommand{\thebibliography}[1]{ | |
+ \cleardoublepage | |
+ \phantomsection | |
+ \py@OldThebibliography{1} | |
+ \addcontentsline{toc}{chapter}{\bibname} | |
+} | |
diff --git a/doc/latex/tabulary.sty b/doc/latex/tabulary.sty | |
t@@ -0,0 +1,452 @@ | |
+%% | |
+%% This is file `tabulary.sty', | |
+%% generated with the docstrip utility. | |
+%% | |
+%% The original source files were: | |
+%% | |
+%% tabulary.dtx (with options: `package') | |
+%% DRAFT VERSION | |
+%% | |
+%% File `tabulary.dtx'. | |
+%% Copyright (C) 1995 1996 2003 David Carlisle | |
+%% This file may be distributed under the terms of the LPPL. | |
+%% See 00readme.txt for details. | |
+%% | |
+\NeedsTeXFormat{LaTeX2e} | |
+\ProvidesPackage{tabulary} | |
+ [2007/10/02 v0.9 tabulary package (DPC)] | |
+\RequirePackage{array} | |
+\catcode`\Z=14 | |
+\DeclareOption{debugshow}{\catcode`\Z=9\relax} | |
+\ProcessOptions | |
+\def\arraybackslash{\let\\=\@arraycr} | |
+\def\@finalstrut#1{% | |
+ \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1} | |
+\newcount\TY@count | |
+\def\tabulary{% | |
+ \let\TY@final\tabular | |
+ \let\endTY@final\endtabular | |
+ \TY@tabular} | |
+\def\TY@tabular#1{% | |
+ \edef\TY@{\@currenvir}% | |
+ {\ifnum0=`}\fi | |
+ \@ovxx\TY@linewidth | |
+ \@ovyy\TY@tablewidth | |
+ \count@\z@ | |
+ \@tempswatrue | |
+ \@whilesw\if@tempswa\fi{% | |
+ \advance\count@\@ne | |
+ \expandafter\ifx\csname TY@F\the\count@\endcsname\relax | |
+ \@tempswafalse | |
+ \else | |
+ \expandafter\let\csname TY@SF\the\count@\expandafter\endcsname | |
+ \csname TY@F\the\count@\endcsname | |
+ \global\expandafter\let\csname TY@F\the\count@\endcsname\relax | |
+ \expandafter\let\csname TY@S\the\count@\expandafter\endcsname | |
+ \csname TY@\the\count@\endcsname | |
+ \fi}% | |
+ \global\TY@count\@ne | |
+ \TY@width\xdef{0pt}% | |
+ \global\TY@tablewidth\z@ | |
+ \global\TY@linewidth#1\relax | |
+Z\message{^^J^^JTable^^J% | |
+Z Target Width: \the\TY@linewidth^^J% | |
+Z \string\tabcolsep: \the\tabcolsep\space | |
+Z \string\arrayrulewidth: \the\arrayrulewidth\space | |
+Z \string\doublerulesep: \the\doublerulesep^^J% | |
+Z \string\tymin: \the\tymin\space | |
+Z \string\tymax: \the\tymax^^J}% | |
+ \let\@classz\TY@classz | |
+ \let\verb\TX@verb | |
+ \toks@{}\TY@get@body} | |
+\let\TY@@mkpream\@mkpream | |
+\def\TY@mkpream{% | |
+ \def\@addamp{% | |
+ \if@firstamp \@firstampfalse \else | |
+ \global\advance\TY@count\@ne | |
+ \edef\@preamble{\@preamble &}\fi | |
+ \TY@width\xdef{0pt}}% | |
+ \def\@acol{% | |
+ \TY@subwidth\col@sep | |
+ \@addtopreamble{\hskip\col@sep}}% | |
+ \let\@arrayrule\TY@arrayrule | |
+ \let\@classvi\TY@classvi | |
+ \def\@classv{\save@decl | |
+ \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@ | |
+ \sbox\z@{\d@llarbegin\@nextchar\d@llarend}% | |
+ \TY@subwidth{\wd\z@}% | |
+ \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}% | |
+ \prepnext@tok}% | |
+ \global\let\@mkpream\TY@@mkpream | |
+ \TY@@mkpream} | |
+\def\TY@arrayrule{% | |
+ \TY@subwidth\arrayrulewidth | |
+ \@addtopreamble \vline} | |
+\def\TY@classvi{\ifcase \@lastchclass | |
+ \@acol \or | |
+ \TY@subwidth\doublerulesep | |
+ \@addtopreamble{\hskip \doublerulesep}\or | |
+ \@acol \or | |
+ \@classvii | |
+ \fi} | |
+\def\TY@tab{% | |
+ \setbox\z@\hbox\bgroup | |
+ \let\[$\let\]$% | |
+ \let\equation$\let\endequation$% | |
+ \col@sep\tabcolsep | |
+ \let\d@llarbegin\begingroup\let\d@llarend\endgroup | |
+ \let\@mkpream\TY@mkpream | |
+ \def\multicolumn##1##2##3{\multispan##1\relax}% | |
+ \CT@start\TY@tabarray} | |
+\def\TY@tabarray{\@ifnextchar[{\TY@array}{\@array[t]}} | |
+\def\TY@array[#1]{\@array[t]} | |
+\def\TY@width#1{% | |
+ \expandafter#1\csname TY@\the\TY@count\endcsname} | |
+\def\TY@subwidth#1{% | |
+ \TY@width\dimen@ | |
+ \advance\dimen@-#1\relax | |
+ \TY@width\xdef{\the\dimen@}% | |
+ \global\advance\TY@linewidth-#1\relax} | |
+\def\endtabulary{% | |
+ \gdef\@halignto{}% | |
+ \let\TY@footnote\footnote% | |
+ \def\footnote{}% prevent footnotes from doing anything | |
+ \expandafter\TY@tab\the\toks@ | |
+ \crcr\omit | |
+ {\xdef\TY@save@row{}% | |
+ \loop | |
+ \advance\TY@count\m@ne | |
+ \ifnum\TY@count>\z@ | |
+ \xdef\TY@save@row{\TY@save@row&\omit}% | |
+ \repeat}\TY@save@row | |
+ \endarray\global\setbox1=\lastbox\setbox0=\vbox{\unvbox1 | |
+ \unskip\global\setbox1=\lastbox}\egroup | |
+ \dimen@\TY@linewidth | |
+ \divide\dimen@\TY@count | |
+ \ifdim\dimen@<\tymin | |
+ \TY@warn{tymin too large (\the\tymin), resetting to \the\dimen@}% | |
+ \tymin\dimen@ | |
+ \fi | |
+ \setbox\tw@=\hbox{\unhbox\@ne | |
+ \loop | |
+\@tempdima=\lastskip | |
+\ifdim\@tempdima>\z@ | |
+Z \message{ecs=\the\@tempdima^^J}% | |
+ \global\advance\TY@linewidth-\@tempdima | |
+\fi | |
+ \unskip | |
+ \setbox\tw@=\lastbox | |
+ \ifhbox\tw@ | |
+Z \message{Col \the\TY@count: Initial=\the\wd\tw@\space}% | |
+ \ifdim\wd\tw@>\tymax | |
+ \wd\tw@\tymax | |
+Z \message{> max\space}% | |
+Z \else | |
+Z \message{ \@spaces\space}% | |
+ \fi | |
+ \TY@width\dimen@ | |
+Z \message{\the\dimen@\space}% | |
+ \advance\dimen@\wd\tw@ | |
+Z \message{Final=\the\dimen@\space}% | |
+ \TY@width\xdef{\the\dimen@}% | |
+ \ifdim\dimen@<\tymin | |
+Z \message{< tymin}% | |
+ \global\advance\TY@linewidth-\dimen@ | |
+ \expandafter\xdef\csname TY@F\the\TY@count\endcsname | |
+ {\the\dimen@}% | |
+ \else | |
+ \expandafter\ifx\csname TY@F\the\TY@count\endcsname\z@ | |
+Z \message{***}% | |
+ \global\advance\TY@linewidth-\dimen@ | |
+ \expandafter\xdef\csname TY@F\the\TY@count\endcsname | |
+ {\the\dimen@}% | |
+ \else | |
+Z \message{> tymin}% | |
+ \global\advance\TY@tablewidth\dimen@ | |
+ \global\expandafter\let\csname TY@F\the\TY@count\endcsname | |
+ \maxdimen | |
+ \fi\fi | |
+ \advance\TY@count\m@ne | |
+ \repeat}% | |
+ \TY@checkmin | |
+ \TY@checkmin | |
+ \TY@checkmin | |
+ \TY@checkmin | |
+ \TY@count\z@ | |
+ \let\TY@box\TY@box@v | |
+ \let\footnote\TY@footnote % restore footnotes | |
+ {\expandafter\TY@final\the\toks@\endTY@final}% | |
+ \count@\z@ | |
+ \@tempswatrue | |
+ \@whilesw\if@tempswa\fi{% | |
+ \advance\count@\@ne | |
+ \expandafter\ifx\csname TY@SF\the\count@\endcsname\relax | |
+ \@tempswafalse | |
+ \else | |
+ \global\expandafter\let\csname TY@F\the\count@\expandafter\endcsname | |
+ \csname TY@SF\the\count@\endcsname | |
+ \global\expandafter\let\csname TY@\the\count@\expandafter\endcsname | |
+ \csname TY@S\the\count@\endcsname | |
+ \fi}% | |
+ \TY@linewidth\@ovxx | |
+ \TY@tablewidth\@ovyy | |
+ \ifnum0=`{\fi}} | |
+\def\TY@checkmin{% | |
+ \let\TY@checkmin\relax | |
+\ifdim\TY@tablewidth>\z@ | |
+ \Gscale@div\TY@ratio\TY@linewidth\TY@tablewidth | |
+ \ifdim\TY@tablewidth <\linewidth | |
+ \def\TY@ratio{1}% | |
+ \fi | |
+\else | |
+ \TY@warn{No suitable columns!}% | |
+ \def\TY@ratio{1}% | |
+\fi | |
+\count@\z@ | |
+Z \message{^^JLine Width: \the\TY@linewidth, | |
+Z Natural Width: \the\TY@tablewidth, | |
+Z Ratio: \TY@ratio^^J}% | |
+\@tempdima\z@ | |
+\loop | |
+\ifnum\count@<\TY@count | |
+\advance\count@\@ne | |
+ \ifdim\csname TY@F\the\count@\endcsname>\tymin | |
+ \dimen@\csname TY@\the\count@\endcsname | |
+ \dimen@\TY@ratio\dimen@ | |
+ \ifdim\dimen@<\tymin | |
+Z \message{Column \the\count@\space ->}% | |
+ \global\expandafter\let\csname TY@F\the\count@\endcsname\tymin | |
+ \global\advance\TY@linewidth-\tymin | |
+ \global\advance\TY@tablewidth-\csname TY@\the\count@\endcsname | |
+ \let\TY@checkmin\TY@@checkmin | |
+ \else | |
+ \expandafter\xdef\csname TY@F\the\count@\endcsname{\the\dimen@}% | |
+ \advance\@tempdima\csname TY@F\the\count@\endcsname | |
+ \fi | |
+ \fi | |
+Z \dimen@\csname TY@F\the\count@\endcsname\message{\the\dimen@, }% | |
+\repeat | |
+Z \message{^^JTotal:\the\@tempdima^^J}% | |
+} | |
+\let\TY@@checkmin\TY@checkmin | |
+\newdimen\TY@linewidth | |
+\def\tyformat{\everypar{{\nobreak\hskip\z@skip}}} | |
+\newdimen\tymin | |
+\tymin=10pt | |
+\newdimen\tymax | |
+\tymax=2\textwidth | |
+\def\@testpach{\@chclass | |
+ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else | |
+ \ifnum \@lastchclass=7 5 \else | |
+ \ifnum \@lastchclass=8 \tw@ \else | |
+ \ifnum \@lastchclass=9 \thr@@ | |
+ \else \z@ | |
+ \ifnum \@lastchclass = 10 \else | |
+ \edef\@nextchar{\expandafter\string\@nextchar}% | |
+ \@chnum | |
+ \if \@nextchar c\z@ \else | |
+ \if \@nextchar l\@ne \else | |
+ \if \@nextchar r\tw@ \else | |
+ \if \@nextchar C7 \else | |
+ \if \@nextchar L8 \else | |
+ \if \@nextchar R9 \else | |
+ \if \@nextchar J10 \else | |
+ \z@ \@chclass | |
+ \if\@nextchar |\@ne \else | |
+ \if \@nextchar !6 \else | |
+ \if \@nextchar @7 \else | |
+ \if \@nextchar <8 \else | |
+ \if \@nextchar >9 \else | |
+ 10 | |
+ \@chnum | |
+ \if \@nextchar m\thr@@\else | |
+ \if \@nextchar p4 \else | |
+ \if \@nextchar b5 \else | |
+ \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi\fi \fi \fi\fi \fi | |
+ \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi} | |
+\def\TY@classz{% | |
+ \@classx | |
+ \@tempcnta\count@ | |
+ \ifx\TY@box\TY@box@v | |
+ \global\advance\TY@count\@ne | |
+ \fi | |
+ \let\centering c% | |
+ \let\raggedright\noindent | |
+ \let\raggedleft\indent | |
+ \let\arraybackslash\relax | |
+ \prepnext@tok | |
+ \ifnum\@chnum<4 | |
+ \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ | |
+ \fi | |
+ \ifnum\@chnum=6 | |
+ \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ | |
+ \fi | |
+ \@addtopreamble{% | |
+ \ifcase\@chnum | |
+ \hfil \d@llarbegin\insert@column\d@llarend \hfil \or | |
+ \kern\z@ | |
+ \d@llarbegin \insert@column \d@llarend \hfil \or | |
+ \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or | |
+ $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or | |
+ \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or | |
+ \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or | |
+ \d@llarbegin \insert@column \d@llarend \or% dubious "s" case | |
+ \TY@box\centering\or | |
+ \TY@box\raggedright\or | |
+ \TY@box\raggedleft\or | |
+ \TY@box\relax | |
+ \fi}\prepnext@tok} | |
+\def\TY@box#1{% | |
+ \ifx\centering#1% | |
+ \hfil \d@llarbegin\insert@column\d@llarend \hfil \else | |
+ \ifx\raggedright#1% | |
+ \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | |
+ \d@llarbegin \insert@column \d@llarend \hfil \else | |
+ \ifx\raggedleft#1% | |
+ \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \else | |
+ \ifx\relax#1% | |
+ \d@llarbegin \insert@column \d@llarend | |
+ \fi \fi \fi \fi} | |
+\def\TY@box@v#1{% | |
+ \vtop \@startpbox{\csname TY@F\the\TY@count\endcsname}% | |
+ #1\arraybackslash\tyformat | |
+ \insert@column\@endpbox} | |
+\newdimen\TY@tablewidth | |
+\def\Gscale@div#1#2#3{% | |
+ \setlength\dimen@{#3}% | |
+ \ifdim\dimen@=\z@ | |
+ \PackageError{graphics}{Division by 0}\@eha | |
+ \dimen@#2% | |
+ \fi | |
+ \edef\@tempd{\the\dimen@}% | |
+ \setlength\dimen@{#2}% | |
+ \count@65536\relax | |
+ \ifdim\dimen@<\z@ | |
+ \dimen@-\dimen@ | |
+ \count@-\count@ | |
+ \fi | |
+ \loop | |
+ \ifdim\dimen@<8192\p@ | |
+ \dimen@\tw@\dimen@ | |
+ \divide\count@\tw@ | |
+ \repeat | |
+ \dimen@ii=\@tempd\relax | |
+ \divide\dimen@ii\count@ | |
+ \divide\dimen@\dimen@ii | |
+ \edef#1{\strip@pt\dimen@}} | |
+\long\def\TY@get@body#1\end | |
+ {\toks@\expandafter{\the\toks@#1}\TY@find@end} | |
+\def\TY@find@end#1{% | |
+ \def\@tempa{#1}% | |
+ \ifx\@tempa\TY@\def\@tempa{\end{#1}}\expandafter\@tempa | |
+ \else\toks@\expandafter | |
+ {\the\toks@\end{#1}}\expandafter\TY@get@body\fi} | |
+\def\TY@warn{% | |
+ \PackageWarning{tabulary}} | |
+\catcode`\Z=11 | |
+\AtBeginDocument{ | |
+\@ifpackageloaded{colortbl}{% | |
+\expandafter\def\expandafter\@mkpream\expandafter#\expandafter1% | |
+ \expandafter{% | |
+ \expandafter\let\expandafter\CT@setup\expandafter\relax | |
+ \expandafter\let\expandafter\CT@color\expandafter\relax | |
+ \expandafter\let\expandafter\CT@do@color\expandafter\relax | |
+ \expandafter\let\expandafter\color\expandafter\relax | |
+ \expandafter\let\expandafter\CT@column@color\expandafter\relax | |
+ \expandafter\let\expandafter\CT@row@color\expandafter\relax | |
+ \@mkpream{#1}} | |
+\let\TY@@mkpream\@mkpream | |
+\def\TY@classz{% | |
+ \@classx | |
+ \@tempcnta\count@ | |
+ \ifx\TY@box\TY@box@v | |
+ \global\advance\TY@count\@ne | |
+ \fi | |
+ \let\centering c% | |
+ \let\raggedright\noindent | |
+ \let\raggedleft\indent | |
+ \let\arraybackslash\relax | |
+ \prepnext@tok | |
+\expandafter\CT@extract\the\toks\@tempcnta\columncolor!\@nil | |
+ \ifnum\@chnum<4 | |
+ \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ | |
+ \fi | |
+ \ifnum\@chnum=6 | |
+ \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ | |
+ \fi | |
+ \@addtopreamble{% | |
+ \setbox\z@\hbox\bgroup\bgroup | |
+ \ifcase\@chnum | |
+ \hskip\stretch{.5}\kern\z@ | |
+ \d@llarbegin\insert@column\d@llarend\hskip\stretch{.5}\or | |
+ \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<< | |
+ \d@llarbegin \insert@column \d@llarend \hfill \or | |
+ \hfill\kern\z@ \d@llarbegin \insert@column \d@llarend \or | |
+ $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or | |
+ \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or | |
+ \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or | |
+ \d@llarbegin \insert@column \d@llarend \or% dubious s case | |
+ \TY@box\centering\or | |
+ \TY@box\raggedright\or | |
+ \TY@box\raggedleft\or | |
+ \TY@box\relax | |
+ \fi | |
+ \egroup\egroup | |
+\begingroup | |
+ \CT@setup | |
+ \CT@column@color | |
+ \CT@row@color | |
+ \CT@do@color | |
+\endgroup | |
+ \@tempdima\ht\z@ | |
+ \advance\@tempdima\minrowclearance | |
+ \vrule\@height\@tempdima\@width\z@ | |
+\unhbox\z@ | |
+}\prepnext@tok}% | |
+ \def\TY@arrayrule{% | |
+ \TY@subwidth\arrayrulewidth | |
+ \@addtopreamble{{\CT@arc@\vline}}}% | |
+ \def\TY@classvi{\ifcase \@lastchclass | |
+ \@acol \or | |
+ \TY@subwidth\doublerulesep | |
+ \ifx\CT@drsc@\relax | |
+ \@addtopreamble{\hskip\doublerulesep}% | |
+ \else | |
+ \@addtopreamble{{\CT@drsc@\vrule\@width\doublerulesep}}% | |
+ \fi\or | |
+ \@acol \or | |
+ \@classvii | |
+ \fi}% | |
+}{% | |
+\let\CT@start\relax | |
+} | |
+} | |
+{\uccode`\*=`\ % | |
+\uppercase{\gdef\TX@verb{% | |
+ \leavevmode\null\TX@vwarn | |
+ {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces | |
+ \@ifstar{\let~*\TX@vb}{\TX@vb}}}} | |
+\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}% | |
+ \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!} | |
+\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= } | |
+\begingroup | |
+\catcode`\*=\catcode`\# | |
+\catcode`\#=12 | |
+\gdef\TX@vfirst{% | |
+ \if\@tempa#% | |
+ \def\@tempb{\TX@v@#}% | |
+ \else | |
+ \let\@tempb\TX@v@ | |
+ \if\@tempa\space~\else\@tempa\fi | |
+ \fi | |
+ \@tempb} | |
+\gdef\TX@v@*1 *2{% | |
+ \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2} | |
+\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2} | |
+\endgroup | |
+\def\TX@vwarn{% | |
+ \@warning{\noexpand\verb may be unreliable inside tabularx/y}% | |
+ \global\let\TX@vwarn\@empty} | |
+\endinput | |
+%% | |
+%% End of file `tabulary.sty'. | |
diff --git a/doc/sphinx/Makefile b/doc/sphinx/Makefile | |
t@@ -17,7 +17,7 @@ I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . | |
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp… | |
-default: html | |
+default: html latexpdf | |
help: | |
@echo "Please use \`make <target>' where <target> is one of" | |
t@@ -109,11 +109,17 @@ latex: doxygen-xml | |
@echo "Run \`make' in that directory to run these through (pdf)latex" \ | |
"(use \`make latexpdf' here to do that automatically)." | |
+#latexpdf: doxygen-xml | |
+# $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex | |
+# @echo "Running LaTeX files through pdflatex..." | |
+# $(MAKE) -C $(BUILDDIR)/latex all-pdf | |
+# @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." | |
+ | |
latexpdf: doxygen-xml | |
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex | |
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/pdf | |
@echo "Running LaTeX files through pdflatex..." | |
$(MAKE) -C $(BUILDDIR)/latex all-pdf | |
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." | |
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/pdf." | |
text: | |
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text |