| 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 |